From a19fa8764f63b4521873bbee8d2549c23d4be70a Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 14 Apr 2020 13:08:03 +0300 Subject: [PATCH] CarGen, Cranes, Gangs: cleanup, fixes, r* visioned placement --- src/{control => peds}/Gangs.cpp | 2 - src/{control => peds}/Gangs.h | 0 src/save/GenericGameStorage.cpp | 2 +- src/{control => vehicles}/CarGen.cpp | 86 +++++-------------------- src/{control => vehicles}/CarGen.h | 12 ++-- src/{control => vehicles}/Cranes.cpp | 94 +++++++++++++--------------- src/{control => vehicles}/Cranes.h | 9 ++- 7 files changed, 69 insertions(+), 136 deletions(-) rename src/{control => peds}/Gangs.cpp (94%) rename src/{control => peds}/Gangs.h (100%) rename src/{control => vehicles}/CarGen.cpp (75%) rename src/{control => vehicles}/CarGen.h (83%) rename src/{control => vehicles}/Cranes.cpp (90%) rename src/{control => vehicles}/Cranes.h (93%) diff --git a/src/control/Gangs.cpp b/src/peds/Gangs.cpp similarity index 94% rename from src/control/Gangs.cpp rename to src/peds/Gangs.cpp index 57d9c67e..c67fe599 100644 --- a/src/control/Gangs.cpp +++ b/src/peds/Gangs.cpp @@ -4,7 +4,6 @@ #include "Gangs.h" #include "Weapon.h" -//CGangInfo(&CGangs::Gang)[NUM_GANGS] = *(CGangInfo(*)[NUM_GANGS])*(uintptr*)0x6EDF78; CGangInfo CGangs::Gang[NUM_GANGS]; CGangInfo::CGangInfo() : @@ -70,7 +69,6 @@ void CGangs::LoadAllGangData(uint8 *buf, uint32 size) Initialise(); INITSAVEBUF - // original: SkipSaveBuf(buf, SAVE_HEADER_SIZE); CheckSaveHeader(buf, 'G','N','G','\0', size - SAVE_HEADER_SIZE); for (int i = 0; i < NUM_GANGS; i++) diff --git a/src/control/Gangs.h b/src/peds/Gangs.h similarity index 100% rename from src/control/Gangs.h rename to src/peds/Gangs.h diff --git a/src/save/GenericGameStorage.cpp b/src/save/GenericGameStorage.cpp index 4cfa75b3..0ec0b117 100644 --- a/src/save/GenericGameStorage.cpp +++ b/src/save/GenericGameStorage.cpp @@ -283,7 +283,7 @@ GenericLoad() LoadSaveDataBlock(); ReadDataFromBlock("Loading Paths \n", ThePaths.Load); LoadSaveDataBlock(); - ReadDataFromBlock("Loading Cranes \n", CranesLoad); + ReadDataFromBlock("Loading Cranes \n", CCranes::Load); LoadSaveDataBlock(); ReadDataFromBlock("Loading Pickups \n", CPickups::Load); LoadSaveDataBlock(); diff --git a/src/control/CarGen.cpp b/src/vehicles/CarGen.cpp similarity index 75% rename from src/control/CarGen.cpp rename to src/vehicles/CarGen.cpp index 721ac35a..43f77fb7 100644 --- a/src/control/CarGen.cpp +++ b/src/vehicles/CarGen.cpp @@ -14,11 +14,11 @@ #include "Vehicle.h" #include "World.h" -uint8 &CTheCarGenerators::ProcessCounter = *(uint8*)0x95CDAF; -uint32 &CTheCarGenerators::NumOfCarGenerators = *(uint32*)0x8E2C1C; -CCarGenerator (&CTheCarGenerators::CarGeneratorArray)[NUM_CARGENS] = *(CCarGenerator(*)[NUM_CARGENS])*(uintptr*)0x87CB18; -uint8 &CTheCarGenerators::GenerateEvenIfPlayerIsCloseCounter = *(uint8*)0x95CDC6; -uint32 &CTheCarGenerators::CurrentActiveCount = *(uint32*)0x8F2C5C; +uint8 CTheCarGenerators::ProcessCounter; +uint32 CTheCarGenerators::NumOfCarGenerators; +CCarGenerator CTheCarGenerators::CarGeneratorArray[NUM_CARGENS]; +uint8 CTheCarGenerators::GenerateEvenIfPlayerIsCloseCounter; +uint32 CTheCarGenerators::CurrentActiveCount; void CCarGenerator::SwitchOff() { @@ -187,59 +187,6 @@ bool CCarGenerator::CheckIfWithinRangeOfAnyPlayer() return DotProduct2D(direction, FindPlayerSpeed()) <= 0; } -void CCarGenerator::Save(uint8 *&buffer) -{ - WriteSaveBuf(buffer, m_nModelIndex); - WriteSaveBuf(buffer, m_vecPos); - WriteSaveBuf(buffer, m_fAngle); - WriteSaveBuf(buffer, m_nColor1); - WriteSaveBuf(buffer, m_nColor2); - WriteSaveBuf(buffer, m_bForceSpawn); - WriteSaveBuf(buffer, m_nAlarm); - WriteSaveBuf(buffer, m_nDoorlock); - WriteSaveBuf(buffer, (uint8)0); - WriteSaveBuf(buffer, m_nMinDelay); - WriteSaveBuf(buffer, m_nMaxDelay); - WriteSaveBuf(buffer, m_nTimer); - WriteSaveBuf(buffer, m_nVehicleHandle); - WriteSaveBuf(buffer, m_nUsesRemaining); - WriteSaveBuf(buffer, m_bIsBlocking); - WriteSaveBuf(buffer, (uint8)0); - WriteSaveBuf(buffer, m_vecInf); - WriteSaveBuf(buffer, m_vecSup); - WriteSaveBuf(buffer, m_fSize); - - // or - //WriteSaveBuf(buffer, *this); - -} - -void CCarGenerator::Load(uint8 *&buffer) -{ - m_nModelIndex = ReadSaveBuf(buffer); - m_vecPos = ReadSaveBuf(buffer); - m_fAngle = ReadSaveBuf(buffer); - m_nColor1 = ReadSaveBuf(buffer); - m_nColor2 = ReadSaveBuf(buffer); - m_bForceSpawn = ReadSaveBuf(buffer); - m_nAlarm = ReadSaveBuf(buffer); - m_nDoorlock = ReadSaveBuf(buffer); - ReadSaveBuf(buffer); - m_nMinDelay = ReadSaveBuf(buffer); - m_nMaxDelay = ReadSaveBuf(buffer); - m_nTimer = ReadSaveBuf(buffer); - m_nVehicleHandle = ReadSaveBuf(buffer); - m_nUsesRemaining = ReadSaveBuf(buffer); - m_bIsBlocking = ReadSaveBuf(buffer); - ReadSaveBuf(buffer); - m_vecInf = ReadSaveBuf(buffer); - m_vecSup = ReadSaveBuf(buffer); - m_fSize = ReadSaveBuf(buffer); - - // or - //*this = ReadSaveBuf(buffer); -} - void CTheCarGenerators::Process() { if (FindPlayerTrain() || CCutsceneMgr::IsCutsceneProcessing()) @@ -268,39 +215,38 @@ void CTheCarGenerators::Init() void CTheCarGenerators::SaveAllCarGenerators(uint8 *buffer, uint32 *size) { - *size = 20 + sizeof(CarGeneratorArray) + SAVE_HEADER_SIZE; + const uint32 nGeneralDataSize = sizeof(NumOfCarGenerators) + sizeof(CurrentActiveCount) + sizeof(ProcessCounter) + sizeof(GenerateEvenIfPlayerIsCloseCounter) + sizeof(int16); + *size = sizeof(int) + nGeneralDataSize + sizeof(CarGeneratorArray) + SAVE_HEADER_SIZE; INITSAVEBUF WriteSaveHeader(buffer, 'C','G','N','\0', *size - SAVE_HEADER_SIZE); - WriteSaveBuf(buffer, 12); /* what is this? */ + WriteSaveBuf(buffer, nGeneralDataSize); WriteSaveBuf(buffer, NumOfCarGenerators); WriteSaveBuf(buffer, CurrentActiveCount); WriteSaveBuf(buffer, ProcessCounter); WriteSaveBuf(buffer, GenerateEvenIfPlayerIsCloseCounter); - WriteSaveBuf(buffer, (int16)0); + WriteSaveBuf(buffer, (int16)0); // alignment WriteSaveBuf(buffer, sizeof(CarGeneratorArray)); - for (int i = 0; i < NUM_CARGENS; i++){ - CarGeneratorArray[i].Save(buffer); - } + for (int i = 0; i < NUM_CARGENS; i++) + WriteSaveBuf(buffer, CarGeneratorArray[i]); VALIDATESAVEBUF(*size) } void CTheCarGenerators::LoadAllCarGenerators(uint8* buffer, uint32 size) { + const int32 nGeneralDataSize = sizeof(NumOfCarGenerators) + sizeof(CurrentActiveCount) + sizeof(ProcessCounter) + sizeof(GenerateEvenIfPlayerIsCloseCounter) + sizeof(int16); Init(); INITSAVEBUF - assert(size == 20 + sizeof(CarGeneratorArray) + SAVE_HEADER_SIZE); CheckSaveHeader(buffer, 'C','G','N','\0', size - SAVE_HEADER_SIZE); - ReadSaveBuf(buffer); + assert(ReadSaveBuf(buffer) == nGeneralDataSize); NumOfCarGenerators = ReadSaveBuf(buffer); CurrentActiveCount = ReadSaveBuf(buffer); ProcessCounter = ReadSaveBuf(buffer); GenerateEvenIfPlayerIsCloseCounter = ReadSaveBuf(buffer); - ReadSaveBuf(buffer); + ReadSaveBuf(buffer); // alignment assert(ReadSaveBuf(buffer) == sizeof(CarGeneratorArray)); - for (int i = 0; i < NUM_CARGENS; i++) { - CarGeneratorArray[i].Load(buffer); - } + for (int i = 0; i < NUM_CARGENS; i++) + CarGeneratorArray[i] = ReadSaveBuf(buffer); VALIDATESAVEBUF(size) } diff --git a/src/control/CarGen.h b/src/vehicles/CarGen.h similarity index 83% rename from src/control/CarGen.h rename to src/vehicles/CarGen.h index 75acdd56..9d645318 100644 --- a/src/control/CarGen.h +++ b/src/vehicles/CarGen.h @@ -34,19 +34,17 @@ public: void Setup(float x, float y, float z, float angle, int32 mi, int16 color1, int16 color2, uint8 force, uint8 alarm, uint8 lock, uint16 min_delay, uint16 max_delay); bool CheckForBlockage(); bool CheckIfWithinRangeOfAnyPlayer(); - void Save(uint8*&); - void Load(uint8*&); void SetUsesRemaining(uint16 uses) { m_nUsesRemaining = uses; } }; class CTheCarGenerators { public: - static uint8 &ProcessCounter; - static uint32 &NumOfCarGenerators; - static CCarGenerator (&CarGeneratorArray)[NUM_CARGENS]; - static uint8 &GenerateEvenIfPlayerIsCloseCounter; - static uint32 &CurrentActiveCount; + static uint8 ProcessCounter; + static uint32 NumOfCarGenerators; + static CCarGenerator CarGeneratorArray[NUM_CARGENS]; + static uint8 GenerateEvenIfPlayerIsCloseCounter; + static uint32 CurrentActiveCount; static void Process(); static int32 CreateCarGenerator(float x, float y, float z, float angle, int32 mi, int16 color1, int16 color2, uint8 force, uint8 alarm, uint8 lock, uint16 min_delay, uint16 max_delay); diff --git a/src/control/Cranes.cpp b/src/vehicles/Cranes.cpp similarity index 90% rename from src/control/Cranes.cpp rename to src/vehicles/Cranes.cpp index 33385dae..dbc3c340 100644 --- a/src/control/Cranes.cpp +++ b/src/vehicles/Cranes.cpp @@ -38,9 +38,9 @@ uint32 TimerForCamInterpolation; -uint32& CCranes::CarsCollectedMilitaryCrane = *(uint32*)0x8F6248; -int32& CCranes::NumCranes = *(int32*)0x8E28AC; -CCrane(&CCranes::aCranes)[NUM_CRANES] = *(CCrane(*)[NUM_CRANES])*(uintptr*)0x6FA4E0; +uint32 CCranes::CarsCollectedMilitaryCrane; +int32 CCranes::NumCranes; +CCrane CCranes::aCranes[NUM_CRANES]; void CCranes::InitCranes(void) { @@ -466,13 +466,13 @@ bool CCrane::DoesCranePickUpThisCarType(uint32 mi) bool CCranes::DoesMilitaryCraneHaveThisOneAlready(uint32 mi) { switch (mi) { - case MI_FIRETRUCK: return (CCranes::CarsCollectedMilitaryCrane & 1); - case MI_AMBULAN: return (CCranes::CarsCollectedMilitaryCrane & 2); - case MI_ENFORCER: return (CCranes::CarsCollectedMilitaryCrane & 4); - case MI_FBICAR: return (CCranes::CarsCollectedMilitaryCrane & 8); - case MI_RHINO: return (CCranes::CarsCollectedMilitaryCrane & 0x10); - case MI_BARRACKS: return (CCranes::CarsCollectedMilitaryCrane & 0x20); - case MI_POLICE: return (CCranes::CarsCollectedMilitaryCrane & 0x40); + case MI_FIRETRUCK: return (CarsCollectedMilitaryCrane & 1); + case MI_AMBULAN: return (CarsCollectedMilitaryCrane & 2); + case MI_ENFORCER: return (CarsCollectedMilitaryCrane & 4); + case MI_FBICAR: return (CarsCollectedMilitaryCrane & 8); + case MI_RHINO: return (CarsCollectedMilitaryCrane & 0x10); + case MI_BARRACKS: return (CarsCollectedMilitaryCrane & 0x20); + case MI_POLICE: return (CarsCollectedMilitaryCrane & 0x40); default: break; } return false; @@ -481,20 +481,20 @@ bool CCranes::DoesMilitaryCraneHaveThisOneAlready(uint32 mi) void CCranes::RegisterCarForMilitaryCrane(uint32 mi) { switch (mi) { - case MI_FIRETRUCK: CCranes::CarsCollectedMilitaryCrane |= 1; break; - case MI_AMBULAN: CCranes::CarsCollectedMilitaryCrane |= 2; break; - case MI_ENFORCER: CCranes::CarsCollectedMilitaryCrane |= 4; break; - case MI_FBICAR: CCranes::CarsCollectedMilitaryCrane |= 8; break; - case MI_RHINO: CCranes::CarsCollectedMilitaryCrane |= 0x10; break; - case MI_BARRACKS: CCranes::CarsCollectedMilitaryCrane |= 0x20; break; - case MI_POLICE: CCranes::CarsCollectedMilitaryCrane |= 0x40; break; + case MI_FIRETRUCK: CarsCollectedMilitaryCrane |= 1; break; + case MI_AMBULAN: CarsCollectedMilitaryCrane |= 2; break; + case MI_ENFORCER: CarsCollectedMilitaryCrane |= 4; break; + case MI_FBICAR: CarsCollectedMilitaryCrane |= 8; break; + case MI_RHINO: CarsCollectedMilitaryCrane |= 0x10; break; + case MI_BARRACKS: CarsCollectedMilitaryCrane |= 0x20; break; + case MI_POLICE: CarsCollectedMilitaryCrane |= 0x40; break; default: break; } } bool CCranes::HaveAllCarsBeenCollectedByMilitaryCrane() { - return (CCranes::CarsCollectedMilitaryCrane & 0x7F) == 0x7F; + return (CarsCollectedMilitaryCrane & 0x7F) == 0x7F; } bool CCrane::GoTowardsTarget(float fAngleToTarget, float fDistanceToTarget, float fTargetHeight, float fSpeedMultiplier) @@ -509,8 +509,7 @@ bool CCrane::GoTowardsTarget(float fAngleToTarget, float fDistanceToTarget, floa if (Abs(fHookAngleDelta) < fHookAngleChangeThisFrame) { m_fHookAngle = fAngleToTarget; bAngleMovementFinished = true; - } - else { + } else { if (fHookAngleDelta < 0.0f) { m_fHookAngle -= fHookAngleChangeThisFrame; if (m_fHookAngle < 0.0f) @@ -528,8 +527,7 @@ bool CCrane::GoTowardsTarget(float fAngleToTarget, float fDistanceToTarget, floa if (Abs(fHookOffsetDelta) < fHookOffsetChangeThisFrame) { m_fHookOffset = fDistanceToTarget; bOffsetMovementFinished = true; - } - else { + } else { if (fHookOffsetDelta < 0.0f) m_fHookOffset -= fHookOffsetChangeThisFrame; else @@ -541,8 +539,7 @@ bool CCrane::GoTowardsTarget(float fAngleToTarget, float fDistanceToTarget, floa if (Abs(fHookHeightDelta) < fHookHeightChangeThisFrame) { m_fHookHeight = fTargetHeight; bHeightMovementFinished = true; - } - else { + } else { if (fHookHeightDelta < 0.0f) m_fHookHeight -= fHookHeightChangeThisFrame; else @@ -560,8 +557,7 @@ bool CCrane::GoTowardsHeightTarget(float fTargetHeight, float fSpeedMultiplier) if (Abs(fHookHeightDelta) < fHookHeightChangeThisFrame) { m_fHookHeight = fTargetHeight; bHeightMovementFinished = true; - } - else { + } else { if (fHookHeightDelta < 0.0f) m_fHookHeight -= fHookHeightChangeThisFrame; else @@ -587,7 +583,7 @@ void CCrane::CalcHookCoordinates(float* pX, float* pY, float* pZ) void CCrane::SetHookMatrix() { - if (!m_pHook) + if (m_pHook == nil) return; m_pHook->GetPosition() = m_vecHookCurPos; CVector up(m_vecHookInitPos.x - m_vecHookCurPos.x, m_vecHookInitPos.y - m_vecHookCurPos.y, 20.0f); @@ -632,48 +628,44 @@ void CCranes::Save(uint8* buf, uint32* size) { INITSAVEBUF - *size = 2 * sizeof(uint32) + NUM_CRANES * sizeof(CCrane); + *size = 2 * sizeof(uint32) + sizeof(aCranes); WriteSaveBuf(buf, NumCranes); WriteSaveBuf(buf, CarsCollectedMilitaryCrane); for (int i = 0; i < NUM_CRANES; i++) { - CCrane* pCrane = WriteSaveBuf(buf, aCranes[i]); - if (pCrane->m_pCraneEntity) - pCrane->m_pCraneEntity = (CBuilding*)(CPools::GetBuildingPool()->GetJustIndex((CBuilding*)pCrane->m_pCraneEntity) + 1); - if (pCrane->m_pHook) - pCrane->m_pHook = (CObject*)(CPools::GetObjectPool()->GetJustIndex((CObject*)pCrane->m_pHook) + 1); - if (pCrane->m_pVehiclePickedUp) - pCrane->m_pVehiclePickedUp = (CVehicle*)(CPools::GetVehiclePool()->GetJustIndex((CVehicle*)pCrane->m_pVehiclePickedUp) + 1); + CCrane *pCrane = WriteSaveBuf(buf, aCranes[i]); + if (pCrane->m_pCraneEntity != nil) + pCrane->m_pCraneEntity = (CBuilding*)(CPools::GetBuildingPool()->GetJustIndex(pCrane->m_pCraneEntity) + 1); + if (pCrane->m_pHook != nil) + pCrane->m_pHook = (CObject*)(CPools::GetObjectPool()->GetJustIndex(pCrane->m_pHook) + 1); + if (pCrane->m_pVehiclePickedUp != nil) + pCrane->m_pVehiclePickedUp = (CVehicle*)(CPools::GetVehiclePool()->GetJustIndex(pCrane->m_pVehiclePickedUp) + 1); } VALIDATESAVEBUF(*size); } -void CranesLoad(uint8* buf, uint32 size) +void CCranes::Load(uint8* buf, uint32 size) { INITSAVEBUF - CCranes::NumCranes = ReadSaveBuf(buf); - CCranes::CarsCollectedMilitaryCrane = ReadSaveBuf(buf); + NumCranes = ReadSaveBuf(buf); + CarsCollectedMilitaryCrane = ReadSaveBuf(buf); for (int i = 0; i < NUM_CRANES; i++) - CCranes::aCranes[i] = ReadSaveBuf(buf); + aCranes[i] = ReadSaveBuf(buf); for (int i = 0; i < NUM_CRANES; i++) { - CCrane* pCrane = &CCranes::aCranes[i]; - if (pCrane->m_pCraneEntity) + CCrane *pCrane = &aCranes[i]; + if (pCrane->m_pCraneEntity != nil) pCrane->m_pCraneEntity = CPools::GetBuildingPool()->GetSlot((uint32)pCrane->m_pCraneEntity - 1); - if (pCrane->m_pHook) + if (pCrane->m_pHook != nil) pCrane->m_pHook = CPools::GetObjectPool()->GetSlot((uint32)pCrane->m_pHook - 1); - if (pCrane->m_pVehiclePickedUp) - pCrane->m_pVehiclePickedUp = CPools::GetVehiclePool()->GetSlot((uint32)pCrane->m_pVehiclePickedUp + 1); + if (pCrane->m_pVehiclePickedUp != nil) + pCrane->m_pVehiclePickedUp = CPools::GetVehiclePool()->GetSlot((uint32)pCrane->m_pVehiclePickedUp - 1); } for (int i = 0; i < NUM_CRANES; i++) { - CCranes::aCranes[i].m_nAudioEntity = DMAudio.CreateEntity(AUDIOTYPE_CRANE, &CCranes::aCranes[i]); - if (CCranes::aCranes[i].m_nAudioEntity) - DMAudio.SetEntityStatus(CCranes::aCranes[i].m_nAudioEntity, 1); + aCranes[i].m_nAudioEntity = DMAudio.CreateEntity(AUDIOTYPE_CRANE, &aCranes[i]); + if (aCranes[i].m_nAudioEntity != 0) + DMAudio.SetEntityStatus(aCranes[i].m_nAudioEntity, 1); } VALIDATESAVEBUF(size); } - -STARTPATCHES - InjectHook(0x5454D0, CranesLoad, PATCH_JUMP); // GenericLoad -ENDPATCHES diff --git a/src/control/Cranes.h b/src/vehicles/Cranes.h similarity index 93% rename from src/control/Cranes.h rename to src/vehicles/Cranes.h index d9817282..c0502638 100644 --- a/src/control/Cranes.h +++ b/src/vehicles/Cranes.h @@ -89,10 +89,9 @@ public: static bool IsThisCarBeingCarriedByAnyCrane(CVehicle* pVehicle); static bool IsThisCarBeingTargettedByAnyCrane(CVehicle* pVehicle); static void Save(uint8* buf, uint32* size); + static void Load(uint8* buf, uint32 size); // on mobile it's CranesLoad outside of the class - static uint32& CarsCollectedMilitaryCrane; - static int32& NumCranes; - static CCrane(&aCranes)[NUM_CRANES]; + static uint32 CarsCollectedMilitaryCrane; + static int32 NumCranes; + static CCrane aCranes[NUM_CRANES]; }; - -void CranesLoad(uint8*, uint32); // is this really outside CCranes?