minor refactoring

This commit is contained in:
Nikolay Korolev 2021-01-07 16:33:42 +03:00
parent 0845abf640
commit db1bdfd62d
12 changed files with 233 additions and 198 deletions

View File

@ -12,6 +12,7 @@
#include "Physical.h" #include "Physical.h"
#include "ColStore.h" #include "ColStore.h"
#include "VarConsole.h" #include "VarConsole.h"
#include "Pools.h"
CPool<ColDef,ColDef> *CColStore::ms_pColPool; CPool<ColDef,ColDef> *CColStore::ms_pColPool;
#ifndef MASTER #ifndef MASTER
@ -184,7 +185,18 @@ CColStore::LoadCollision(const CVector2D &pos)
wantThisOne = true; wantThisOne = true;
}else{ }else{
for (int j = 0; j < MAX_CLEANUP; j++) { for (int j = 0; j < MAX_CLEANUP; j++) {
CPhysical* pEntity = CTheScripts::MissionCleanup.DoesThisEntityWaitForCollision(j); CPhysical* pEntity = nil;
cleanup_entity_struct* pCleanup = &CTheScripts::MissionCleanUp.m_sEntities[i];
if (pCleanup->type == CLEANUP_CAR) {
pEntity = CPools::GetVehiclePool()->GetAt(pCleanup->id);
if (!pEntity || pEntity->GetStatus() == STATUS_WRECKED)
continue;
}
else if (pCleanup->type == CLEANUP_CHAR) {
pEntity = CPools::GetPedPool()->GetAt(pCleanup->id);
if (!pEntity || ((CPed*)pEntity)->DyingOrDead())
continue;
}
if (pEntity && !pEntity->bDontLoadCollision && !pEntity->bIsFrozen) { if (pEntity && !pEntity->bDontLoadCollision && !pEntity->bIsFrozen) {
if (GetBoundingBox(i).IsPointInside(pEntity->GetPosition(), -80.0f)) if (GetBoundingBox(i).IsPointInside(pEntity->GetPosition(), -80.0f))
wantThisOne = true; wantThisOne = true;

View File

@ -93,6 +93,7 @@ VALIDATE_SIZE(CStoredCar, 0x28);
class CGarage class CGarage
{ {
public:
uint8 m_eGarageType; uint8 m_eGarageType;
uint8 m_eGarageState; uint8 m_eGarageState;
uint8 m_nMaxStoredCars; uint8 m_nMaxStoredCars;
@ -189,9 +190,6 @@ class CGarage
int32 FindMaxNumStoredCarsForGarage() { return Min(NUM_GARAGE_STORED_CARS, m_nMaxStoredCars); } int32 FindMaxNumStoredCarsForGarage() { return Min(NUM_GARAGE_STORED_CARS, m_nMaxStoredCars); }
friend class CGarages;
friend class cAudioManager;
friend class CCamera;
}; };
class CGarages class CGarages
@ -199,6 +197,7 @@ class CGarages
enum { enum {
MESSAGE_LENGTH = 8, MESSAGE_LENGTH = 8,
}; };
public:
static int32 BankVansCollected; static int32 BankVansCollected;
static bool BombsAreFree; static bool BombsAreFree;
static bool RespraysAreFree; static bool RespraysAreFree;
@ -218,7 +217,6 @@ class CGarages
static CStoredCar aCarsInSafeHouses[TOTAL_HIDEOUT_GARAGES][NUM_GARAGE_STORED_CARS]; static CStoredCar aCarsInSafeHouses[TOTAL_HIDEOUT_GARAGES][NUM_GARAGE_STORED_CARS];
static bool bCamShouldBeOutisde; static bool bCamShouldBeOutisde;
public:
static void Init(void); static void Init(void);
#ifndef PS2 #ifndef PS2
static void Shutdown(void); static void Shutdown(void);
@ -259,7 +257,6 @@ public:
static void SetFreeResprays(bool bValue) { RespraysAreFree = bValue; } static void SetFreeResprays(bool bValue) { RespraysAreFree = bValue; }
static void SetMaxNumStoredCarsForGarage(int16 garage, uint8 num) { aGarages[garage].m_nMaxStoredCars = num; } static void SetMaxNumStoredCarsForGarage(int16 garage, uint8 num) { aGarages[garage].m_nMaxStoredCars = num; }
private:
static bool IsCarSprayable(CVehicle*); static bool IsCarSprayable(CVehicle*);
static float FindDoorHeightForMI(int32); static float FindDoorHeightForMI(int32);
static void CloseHideOutGaragesBeforeSave(void); static void CloseHideOutGaragesBeforeSave(void);
@ -296,7 +293,4 @@ private:
} }
static bool IsThisGarageTypeSafehouse(uint8 type) { return FindSafeHouseIndexForGarageType(type) >= 0; } static bool IsThisGarageTypeSafehouse(uint8 type) { return FindSafeHouseIndexForGarageType(type) >= 0; }
friend class cAudioManager;
friend class CReplay;
friend class CGarage;
}; };

View File

@ -85,7 +85,7 @@ uint16 CTheScripts::NumScriptDebugLines;
uint16 CTheScripts::NumberOfIntroRectanglesThisFrame; uint16 CTheScripts::NumberOfIntroRectanglesThisFrame;
uint16 CTheScripts::NumberOfIntroTextLinesThisFrame; uint16 CTheScripts::NumberOfIntroTextLinesThisFrame;
uint8 CTheScripts::UseTextCommands; uint8 CTheScripts::UseTextCommands;
CMissionCleanup CTheScripts::MissionCleanup; CMissionCleanup CTheScripts::MissionCleanUp;
CUpsideDownCarCheck CTheScripts::UpsideDownCars; CUpsideDownCarCheck CTheScripts::UpsideDownCars;
CStuckCarCheck CTheScripts::StuckCars; CStuckCarCheck CTheScripts::StuckCars;
uint16 CTheScripts::CommandsExecuted; uint16 CTheScripts::CommandsExecuted;
@ -1711,23 +1711,38 @@ void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type)
switch (m_sEntities[i].type) { switch (m_sEntities[i].type) {
case CLEANUP_CAR: case CLEANUP_CAR:
{ {
CVehicle* v = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id);
if (v) if (pVehicle) {
PossiblyWakeThisEntity(v); if (pVehicle->bIsStaticWaitingForCollision) {
pVehicle->bIsStaticWaitingForCollision = false;
if (!pVehicle->GetIsStatic())
pVehicle->AddToMovingList();
}
}
break; break;
} }
case CLEANUP_CHAR: case CLEANUP_CHAR:
{ {
CPed* p = CPools::GetPedPool()->GetAt(m_sEntities[i].id); CPed* pPed = CPools::GetPedPool()->GetAt(m_sEntities[i].id);
if (p) if (pPed) {
PossiblyWakeThisEntity(p); if (pPed->bIsStaticWaitingForCollision) {
pPed->bIsStaticWaitingForCollision = false;
if (!pPed->GetIsStatic())
pPed->AddToMovingList();
}
}
break; break;
} }
case CLEANUP_OBJECT: case CLEANUP_OBJECT:
{ {
CObject* o = CPools::GetObjectPool()->GetAt(m_sEntities[i].id); CObject* pObject = CPools::GetObjectPool()->GetAt(m_sEntities[i].id);
if (o) if (pObject) {
PossiblyWakeThisEntity(o); if (pObject->bIsStaticWaitingForCollision) {
pObject->bIsStaticWaitingForCollision = false;
if (!pObject->GetIsStatic())
pObject->AddToMovingList();
}
}
break; break;
} }
default: default:
@ -1746,23 +1761,44 @@ void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects()
switch (m_sEntities[i].type) { switch (m_sEntities[i].type) {
case CLEANUP_CAR: case CLEANUP_CAR:
{ {
CVehicle* v = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id);
if (v) if (pVehicle) {
PossiblyWakeThisEntity(v, true); if (pVehicle->bIsStaticWaitingForCollision) {
if (CColStore::HasCollisionLoaded(pVehicle->GetPosition())) {
pVehicle->bIsStaticWaitingForCollision = false;
if (!pVehicle->GetIsStatic())
pVehicle->AddToMovingList();
}
}
}
break; break;
} }
case CLEANUP_CHAR: case CLEANUP_CHAR:
{ {
CPed* p = CPools::GetPedPool()->GetAt(m_sEntities[i].id); CPed* pPed = CPools::GetPedPool()->GetAt(m_sEntities[i].id);
if (p) if (pPed) {
PossiblyWakeThisEntity(p, true); if (pPed->bIsStaticWaitingForCollision) {
if (CColStore::HasCollisionLoaded(pPed->GetPosition())) {
pPed->bIsStaticWaitingForCollision = false;
if (!pPed->GetIsStatic())
pPed->AddToMovingList();
}
}
}
break; break;
} }
case CLEANUP_OBJECT: case CLEANUP_OBJECT:
{ {
CObject* o = CPools::GetObjectPool()->GetAt(m_sEntities[i].id); CObject* pObject = CPools::GetObjectPool()->GetAt(m_sEntities[i].id);
if (o) if (pObject) {
PossiblyWakeThisEntity(o, true); if (pObject->bIsStaticWaitingForCollision) {
if (CColStore::HasCollisionLoaded(pObject->GetPosition())) {
pObject->bIsStaticWaitingForCollision = false;
if (!pObject->GetIsStatic())
pObject->AddToMovingList();
}
}
}
break; break;
} }
default: default:
@ -1771,21 +1807,6 @@ void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects()
} }
} }
CPhysical* CMissionCleanup::DoesThisEntityWaitForCollision(int i)
{
if (m_sEntities[i].type == CLEANUP_CAR) {
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id);
if (pVehicle && pVehicle->GetStatus() != STATUS_WRECKED)
return pVehicle;
}
else if (m_sEntities[i].type == CLEANUP_CHAR) {
CPed* pPed = CPools::GetPedPool()->GetAt(m_sEntities[i].id);
if (pPed && !pPed->DyingOrDead())
return pPed;
}
return nil;
}
void CMissionCleanup::Process() void CMissionCleanup::Process()
{ {
CPopulation::m_AllRandomPedsThisType = -1; CPopulation::m_AllRandomPedsThisType = -1;
@ -1878,10 +1899,16 @@ void CUpsideDownCarCheck::Init()
bool CUpsideDownCarCheck::IsCarUpsideDown(int32 id) bool CUpsideDownCarCheck::IsCarUpsideDown(int32 id)
{ {
CVehicle* v = CPools::GetVehiclePool()->GetAt(id); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(id);
return v->GetUp().z <= -0.97f && return IsCarUpsideDown(pVehicle);
v->GetMoveSpeed().Magnitude() < 0.01f && }
v->GetTurnSpeed().Magnitude() < 0.02f;
bool CUpsideDownCarCheck::IsCarUpsideDown(CVehicle* pVehicle)
{
assert(pVehicle);
return pVehicle->GetUp().z <= UPSIDEDOWN_UP_THRESHOLD &&
pVehicle->GetMoveSpeed().Magnitude() < UPSIDEDOWN_MOVE_SPEED_THRESHOLD &&
pVehicle->GetTurnSpeed().Magnitude() < UPSIDEDOWN_TURN_SPEED_THRESHOLD;
} }
void CUpsideDownCarCheck::UpdateTimers() void CUpsideDownCarCheck::UpdateTimers()
@ -1904,7 +1931,7 @@ void CUpsideDownCarCheck::UpdateTimers()
bool CUpsideDownCarCheck::AreAnyCarsUpsideDown() bool CUpsideDownCarCheck::AreAnyCarsUpsideDown()
{ {
for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){ for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){
if (m_sCars[i].m_nVehicleIndex >= 0 && m_sCars[i].m_nUpsideDownTimer > 1000) if (m_sCars[i].m_nVehicleIndex >= 0 && m_sCars[i].m_nUpsideDownTimer > UPSIDEDOWN_TIMER_THRESHOLD)
return true; return true;
} }
return false; return false;
@ -1915,8 +1942,10 @@ void CUpsideDownCarCheck::AddCarToCheck(int32 id)
uint16 index = 0; uint16 index = 0;
while (index < MAX_UPSIDEDOWN_CAR_CHECKS && m_sCars[index].m_nVehicleIndex >= 0) while (index < MAX_UPSIDEDOWN_CAR_CHECKS && m_sCars[index].m_nVehicleIndex >= 0)
index++; index++;
#ifdef FIX_BUGS
if (index >= MAX_UPSIDEDOWN_CAR_CHECKS) if (index >= MAX_UPSIDEDOWN_CAR_CHECKS)
return; return;
#endif
m_sCars[index].m_nVehicleIndex = id; m_sCars[index].m_nVehicleIndex = id;
m_sCars[index].m_nUpsideDownTimer = 0; m_sCars[index].m_nUpsideDownTimer = 0;
} }
@ -1935,7 +1964,7 @@ bool CUpsideDownCarCheck::HasCarBeenUpsideDownForAWhile(int32 id)
{ {
for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){ for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){
if (m_sCars[i].m_nVehicleIndex == id) if (m_sCars[i].m_nVehicleIndex == id)
return m_sCars[i].m_nUpsideDownTimer > 1000; return m_sCars[i].m_nUpsideDownTimer > UPSIDEDOWN_TIMER_THRESHOLD;
} }
return false; return false;
} }
@ -1985,7 +2014,10 @@ void CStuckCarCheck::AddCarToCheck(int32 id, float radius, uint32 time)
int index = 0; int index = 0;
while (index < MAX_STUCK_CAR_CHECKS && m_sCars[index].m_nVehicleIndex >= 0) while (index < MAX_STUCK_CAR_CHECKS && m_sCars[index].m_nVehicleIndex >= 0)
index++; index++;
/* Would be nice to return if index >= MAX_STUCK_CAR_CHECKS... */ #ifdef FIX_BUGS
if (index >= MAX_STUCK_CAR_CHECKS)
return;
#endif
m_sCars[index].m_nVehicleIndex = id; m_sCars[index].m_nVehicleIndex = id;
m_sCars[index].m_vecPos = pv->GetPosition(); m_sCars[index].m_vecPos = pv->GetPosition();
m_sCars[index].m_nLastCheck = CTimer::GetTimeInMilliseconds(); m_sCars[index].m_nLastCheck = CTimer::GetTimeInMilliseconds();
@ -2217,7 +2249,7 @@ void CTheScripts::Init()
ScriptsArray[i].Init(); ScriptsArray[i].Init();
ScriptsArray[i].AddScriptToList(&pIdleScripts); ScriptsArray[i].AddScriptToList(&pIdleScripts);
} }
MissionCleanup.Init(); MissionCleanUp.Init();
UpsideDownCars.Init(); UpsideDownCars.Init();
StuckCars.Init(); StuckCars.Init();
CFileMgr::SetDir("data"); CFileMgr::SetDir("data");
@ -2345,7 +2377,7 @@ void CTheScripts::Process()
float timeStep = CTimer::GetTimeStepInMilliseconds(); float timeStep = CTimer::GetTimeStepInMilliseconds();
UpsideDownCars.UpdateTimers(); UpsideDownCars.UpdateTimers();
StuckCars.Process(); StuckCars.Process();
MissionCleanup.CheckIfCollisionHasLoadedForMissionObjects(); MissionCleanUp.CheckIfCollisionHasLoadedForMissionObjects();
DrawScriptSpheres(); DrawScriptSpheres();
if (FailCurrentMission) if (FailCurrentMission)
--FailCurrentMission; --FailCurrentMission;
@ -3669,7 +3701,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped); ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped);
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
return 0; return 0;
} }
case COMMAND_DELETE_CHAR: case COMMAND_DELETE_CHAR:
@ -3678,7 +3710,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]);
CTheScripts::RemoveThisPed(ped); CTheScripts::RemoveThisPed(ped);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
return 0; return 0;
} }
case COMMAND_CHAR_WANDER_DIR: case COMMAND_CHAR_WANDER_DIR:
@ -3899,7 +3931,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
ScriptParams[0] = handle; ScriptParams[0] = handle;
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(handle, CLEANUP_CAR); CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR);
return 0; return 0;
} }
case COMMAND_DELETE_CAR: case COMMAND_DELETE_CAR:
@ -3912,7 +3944,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
delete car; delete car;
} }
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR); CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR);
return 0; return 0;
} }
case COMMAND_CAR_GOTO_COORDINATES: case COMMAND_CAR_GOTO_COORDINATES:
@ -4227,7 +4259,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
{ {
if (!m_bIsMissionScript) if (!m_bIsMissionScript)
return 0; return 0;
CTheScripts::MissionCleanup.Process(); CTheScripts::MissionCleanUp.Process();
return 0; return 0;
} }
case COMMAND_STORE_CAR_CHAR_IS_IN: case COMMAND_STORE_CAR_CHAR_IS_IN:
@ -4250,7 +4282,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
pOld->bIsLocked = false; pOld->bIsLocked = false;
CCarCtrl::NumRandomCars++; CCarCtrl::NumRandomCars++;
CCarCtrl::NumMissionCars--; CCarCtrl::NumMissionCars--;
CTheScripts::MissionCleanup.RemoveEntityFromList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR); CTheScripts::MissionCleanUp.RemoveEntityFromList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
} }
} }
@ -4261,14 +4293,14 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
CCarCtrl::NumMissionCars++; CCarCtrl::NumMissionCars++;
CCarCtrl::NumRandomCars--; CCarCtrl::NumRandomCars--;
CTheScripts::StoreVehicleWasRandom = true; CTheScripts::StoreVehicleWasRandom = true;
CTheScripts::MissionCleanup.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR); CTheScripts::MissionCleanUp.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
break; break;
case PARKED_VEHICLE: case PARKED_VEHICLE:
pCurrent->VehicleCreatedBy = MISSION_VEHICLE; pCurrent->VehicleCreatedBy = MISSION_VEHICLE;
CCarCtrl::NumMissionCars++; CCarCtrl::NumMissionCars++;
CCarCtrl::NumParkedCars--; CCarCtrl::NumParkedCars--;
CTheScripts::StoreVehicleWasRandom = true; CTheScripts::StoreVehicleWasRandom = true;
CTheScripts::MissionCleanup.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR); CTheScripts::MissionCleanUp.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
break; break;
case MISSION_VEHICLE: case MISSION_VEHICLE:
case PERMANENT_VEHICLE: case PERMANENT_VEHICLE:
@ -4301,7 +4333,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
pOld->bIsLocked = false; pOld->bIsLocked = false;
CCarCtrl::NumRandomCars++; CCarCtrl::NumRandomCars++;
CCarCtrl::NumMissionCars--; CCarCtrl::NumMissionCars--;
CTheScripts::MissionCleanup.RemoveEntityFromList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR); CTheScripts::MissionCleanUp.RemoveEntityFromList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
} }
} }
@ -4312,14 +4344,14 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
CCarCtrl::NumMissionCars++; CCarCtrl::NumMissionCars++;
CCarCtrl::NumRandomCars--; CCarCtrl::NumRandomCars--;
CTheScripts::StoreVehicleWasRandom = true; CTheScripts::StoreVehicleWasRandom = true;
CTheScripts::MissionCleanup.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR); CTheScripts::MissionCleanUp.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
break; break;
case PARKED_VEHICLE: case PARKED_VEHICLE:
pCurrent->VehicleCreatedBy = MISSION_VEHICLE; pCurrent->VehicleCreatedBy = MISSION_VEHICLE;
CCarCtrl::NumMissionCars++; CCarCtrl::NumMissionCars++;
CCarCtrl::NumParkedCars--; CCarCtrl::NumParkedCars--;
CTheScripts::StoreVehicleWasRandom = true; CTheScripts::StoreVehicleWasRandom = true;
CTheScripts::MissionCleanup.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR); CTheScripts::MissionCleanUp.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
break; break;
case MISSION_VEHICLE: case MISSION_VEHICLE:
case PERMANENT_VEHICLE: case PERMANENT_VEHICLE:
@ -4468,7 +4500,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj); ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj);
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT); CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT);
return 0; return 0;
} }
case COMMAND_DELETE_OBJECT: case COMMAND_DELETE_OBJECT:
@ -4481,7 +4513,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
delete pObj; delete pObj;
} }
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT); CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT);
return 0; return 0;
} }
case COMMAND_ADD_SCORE: case COMMAND_ADD_SCORE:
@ -4697,7 +4729,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed);
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
return 0; return 0;
} }
case COMMAND_WARP_PLAYER_FROM_CAR_TO_COORD: case COMMAND_WARP_PLAYER_FROM_CAR_TO_COORD:
@ -4747,81 +4779,6 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
return -1; return -1;
} }
void CRunningScript::Save(uint8*& buf)
{
#ifdef COMPATIBLE_SAVES
SkipSaveBuf(buf, 8);
for (int i = 0; i < 8; i++)
WriteSaveBuf<char>(buf, m_abScriptName[i]);
WriteSaveBuf<uint32>(buf, m_nIp);
#ifdef CHECK_STRUCT_SIZES
static_assert(MAX_STACK_DEPTH == 6, "Compatibility loss: MAX_STACK_DEPTH != 6");
#endif
for (int i = 0; i < MAX_STACK_DEPTH; i++)
WriteSaveBuf<uint32>(buf, m_anStack[i]);
WriteSaveBuf<uint16>(buf, m_nStackPointer);
SkipSaveBuf(buf, 2);
#ifdef CHECK_STRUCT_SIZES
static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18");
#endif
for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++)
WriteSaveBuf<int32>(buf, m_anLocalVariables[i]);
WriteSaveBuf<bool>(buf, m_bIsActive);
WriteSaveBuf<bool>(buf, m_bCondResult);
WriteSaveBuf<bool>(buf, m_bIsMissionScript);
WriteSaveBuf<bool>(buf, m_bSkipWakeTime);
WriteSaveBuf<uint32>(buf, m_nWakeTime);
WriteSaveBuf<uint16>(buf, m_nAndOrState);
WriteSaveBuf<bool>(buf, m_bNotFlag);
WriteSaveBuf<bool>(buf, m_bDeatharrestEnabled);
WriteSaveBuf<bool>(buf, m_bDeatharrestExecuted);
WriteSaveBuf<bool>(buf, m_bMissionFlag);
SkipSaveBuf(buf, 2);
#else
WriteSaveBuf(buf, *this);
#endif
}
void CRunningScript::Load(uint8*& buf)
{
#ifdef COMPATIBLE_SAVES
SkipSaveBuf(buf, 8);
for (int i = 0; i < 8; i++)
m_abScriptName[i] = ReadSaveBuf<char>(buf);
m_nIp = ReadSaveBuf<uint32>(buf);
#ifdef CHECK_STRUCT_SIZES
static_assert(MAX_STACK_DEPTH == 6, "Compatibility loss: MAX_STACK_DEPTH != 6");
#endif
for (int i = 0; i < MAX_STACK_DEPTH; i++)
m_anStack[i] = ReadSaveBuf<uint32>(buf);
m_nStackPointer = ReadSaveBuf<uint16>(buf);
SkipSaveBuf(buf, 2);
#ifdef CHECK_STRUCT_SIZES
static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18");
#endif
for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++)
m_anLocalVariables[i] = ReadSaveBuf<int32>(buf);
m_bIsActive = ReadSaveBuf<bool>(buf);
m_bCondResult = ReadSaveBuf<bool>(buf);
m_bIsMissionScript = ReadSaveBuf<bool>(buf);
m_bSkipWakeTime = ReadSaveBuf<bool>(buf);
m_nWakeTime = ReadSaveBuf<uint32>(buf);
m_nAndOrState = ReadSaveBuf<uint16>(buf);
m_bNotFlag = ReadSaveBuf<bool>(buf);
m_bDeatharrestEnabled = ReadSaveBuf<bool>(buf);
m_bDeatharrestExecuted = ReadSaveBuf<bool>(buf);
m_bMissionFlag = ReadSaveBuf<bool>(buf);
SkipSaveBuf(buf, 2);
#else
CRunningScript* n = next;
CRunningScript* p = prev;
*this = ReadSaveBuf<CRunningScript>(buf);
next = n;
prev = p;
#endif
}
#ifdef MISSION_REPLAY #ifdef MISSION_REPLAY
bool CRunningScript::CanAllowMissionReplay() bool CRunningScript::CanAllowMissionReplay()
@ -4856,7 +4813,7 @@ void RetryMission(int type, int unk)
else if (type == 2) { else if (type == 2) {
doingMissionRetry = false; doingMissionRetry = false;
AllowMissionReplay = 6; AllowMissionReplay = 6;
CTheScripts::MissionCleanup.Process(); CTheScripts::MissionCleanUp.Process();
} }
} }

View File

@ -21,26 +21,31 @@ extern int32 ScriptParams[32];
void FlushLog(); void FlushLog();
#define script_assert(_Expression) FlushLog(); assert(_Expression); #define script_assert(_Expression) FlushLog(); assert(_Expression);
#define PICKUP_PLACEMENT_OFFSET 0.5f #define PICKUP_PLACEMENT_OFFSET (0.5f)
#define PED_FIND_Z_OFFSET 5.0f #define PED_FIND_Z_OFFSET (5.0f)
#define COP_PED_FIND_Z_OFFSET 10.0f #define COP_PED_FIND_Z_OFFSET (10.0f)
#define SPHERE_MARKER_R 252 #define UPSIDEDOWN_UP_THRESHOLD (-0.97f)
#define SPHERE_MARKER_G 138 #define UPSIDEDOWN_MOVE_SPEED_THRESHOLD (0.01f)
#define SPHERE_MARKER_B 242 #define UPSIDEDOWN_TURN_SPEED_THRESHOLD (0.02f)
#define SPHERE_MARKER_A 228 #define UPSIDEDOWN_TIMER_THRESHOLD (1000)
#define SPHERE_MARKER_R (252)
#define SPHERE_MARKER_G (138)
#define SPHERE_MARKER_B (242)
#define SPHERE_MARKER_A (228)
#define SPHERE_MARKER_PULSE_PERIOD 2048 #define SPHERE_MARKER_PULSE_PERIOD 2048
#define SPHERE_MARKER_PULSE_FRACTION 0.1f #define SPHERE_MARKER_PULSE_FRACTION 0.1f
#ifdef USE_PRECISE_MEASUREMENT_CONVERTION #ifdef USE_PRECISE_MEASUREMENT_CONVERTION
#define METERS_IN_FOOT 0.3048f #define METERS_IN_FOOT (0.3048f)
#define FEET_IN_METER 3.28084f #define FEET_IN_METER (3.28084f)
#else #else
#define METERS_IN_FOOT 0.3f #define METERS_IN_FOOT (0.3f)
#define FEET_IN_METER 3.33f #define FEET_IN_METER (3.33f)
#endif #endif
#define KEY_LENGTH_IN_SCRIPT 8 #define KEY_LENGTH_IN_SCRIPT (8)
//#define GTA_SCRIPT_COLLECTIVE //#define GTA_SCRIPT_COLLECTIVE
@ -96,7 +101,7 @@ struct intro_text_line
m_bBackground = false; m_bBackground = false;
m_bBackgroundOnly = false; m_bBackgroundOnly = false;
m_fWrapX = 182.0f; m_fWrapX = 182.0f;
m_fCenterSize = 640.0f; m_fCenterSize = DEFAULT_SCREEN_WIDTH;
m_sBackgroundColor = CRGBA(128, 128, 128, 128); m_sBackgroundColor = CRGBA(128, 128, 128, 128);
m_bTextProportional = true; m_bTextProportional = true;
m_bTextBeforeFade = false; m_bTextBeforeFade = false;
@ -149,10 +154,10 @@ enum {
class CMissionCleanup class CMissionCleanup
{ {
public:
cleanup_entity_struct m_sEntities[MAX_CLEANUP]; cleanup_entity_struct m_sEntities[MAX_CLEANUP];
uint8 m_nCount; uint8 m_nCount;
public:
CMissionCleanup(); CMissionCleanup();
void Init(); void Init();
@ -161,10 +166,9 @@ public:
void RemoveEntityFromList(int32, uint8); void RemoveEntityFromList(int32, uint8);
void Process(); void Process();
void CheckIfCollisionHasLoadedForMissionObjects(); void CheckIfCollisionHasLoadedForMissionObjects();
CPhysical* DoesThisEntityWaitForCollision(int i);
}; };
struct CUpsideDownCarCheckEntry struct upsidedown_car_data
{ {
int32 m_nVehicleIndex; int32 m_nVehicleIndex;
uint32 m_nUpsideDownTimer; uint32 m_nUpsideDownTimer;
@ -172,11 +176,12 @@ struct CUpsideDownCarCheckEntry
class CUpsideDownCarCheck class CUpsideDownCarCheck
{ {
CUpsideDownCarCheckEntry m_sCars[MAX_UPSIDEDOWN_CAR_CHECKS]; upsidedown_car_data m_sCars[MAX_UPSIDEDOWN_CAR_CHECKS];
public: public:
void Init(); void Init();
bool IsCarUpsideDown(int32); bool IsCarUpsideDown(int32);
bool IsCarUpsideDown(CVehicle*);
void UpdateTimers(); void UpdateTimers();
bool AreAnyCarsUpsideDown(); bool AreAnyCarsUpsideDown();
void AddCarToCheck(int32); void AddCarToCheck(int32);
@ -194,7 +199,7 @@ struct stuck_car_data
bool m_bStuck; bool m_bStuck;
stuck_car_data() { } stuck_car_data() { }
inline void Reset(); void Reset();
}; };
class CStuckCarCheck class CStuckCarCheck
@ -273,6 +278,7 @@ enum {
class CTheScripts class CTheScripts
{ {
public:
static uint8 ScriptSpace[SIZE_SCRIPT_SPACE]; static uint8 ScriptSpace[SIZE_SCRIPT_SPACE];
static CRunningScript ScriptsArray[MAX_NUM_SCRIPTS]; static CRunningScript ScriptsArray[MAX_NUM_SCRIPTS];
static intro_text_line IntroTextLines[MAX_NUM_INTRO_TEXT_LINES]; static intro_text_line IntroTextLines[MAX_NUM_INTRO_TEXT_LINES];
@ -286,7 +292,7 @@ class CTheScripts
static CStoredLine aStoredLines[MAX_NUM_STORED_LINES]; static CStoredLine aStoredLines[MAX_NUM_STORED_LINES];
static bool DbgFlag; static bool DbgFlag;
static uint32 OnAMissionFlag; static uint32 OnAMissionFlag;
static CMissionCleanup MissionCleanup; static CMissionCleanup MissionCleanUp;
static CStuckCarCheck StuckCars; static CStuckCarCheck StuckCars;
static CUpsideDownCarCheck UpsideDownCars; static CUpsideDownCarCheck UpsideDownCars;
static int32 StoreVehicleIndex; static int32 StoreVehicleIndex;
@ -319,11 +325,10 @@ class CTheScripts
static int16 CardStack[CARDS_IN_STACK]; static int16 CardStack[CARDS_IN_STACK];
static int16 CardStackPosition; static int16 CardStackPosition;
#endif #endif
public:
static bool bPlayerIsInTheStatium; static bool bPlayerIsInTheStatium;
static uint8 RiotIntensity; static uint8 RiotIntensity;
static bool bPlayerHasMetDebbieHarry; static bool bPlayerHasMetDebbieHarry;
public:
static void Init(); static void Init();
static void Process(); static void Process();
@ -377,8 +382,6 @@ public:
return Read4BytesFromScript(&tmp); return Read4BytesFromScript(&tmp);
} }
private:
static CRunningScript* StartNewScript(uint32); static CRunningScript* StartNewScript(uint32);
static void CleanUpThisVehicle(CVehicle*); static void CleanUpThisVehicle(CVehicle*);
@ -436,18 +439,11 @@ public:
static void SetObjectiveForAllPedsInCollective(int, eObjective); static void SetObjectiveForAllPedsInCollective(int, eObjective);
#endif #endif
friend class CRunningScript;
friend class CHud;
friend void CMissionCleanup::Process();
friend class CColStore;
#ifdef FIX_BUGS
friend void RetryMission(int, int);
#endif
}; };
enum { enum {
MAX_STACK_DEPTH = 6, // 4 PS2 MAX_STACK_DEPTH = 6,
NUM_LOCAL_VARS = 16, NUM_LOCAL_VARS = 16,
NUM_TIMERS = 2 NUM_TIMERS = 2
}; };
@ -474,6 +470,7 @@ class CRunningScript
ORS_8 ORS_8
}; };
public:
CRunningScript* next; CRunningScript* next;
CRunningScript* prev; CRunningScript* prev;
char m_abScriptName[8]; char m_abScriptName[8];
@ -512,7 +509,6 @@ public:
static const uint32 nSaveStructSize; static const uint32 nSaveStructSize;
private:
void CollectParameters(uint32*, int16); void CollectParameters(uint32*, int16);
int32 CollectNextParameterWithoutIncreasingPC(uint32); int32 CollectNextParameterWithoutIncreasingPC(uint32);
int32* GetPointerToScriptVariable(uint32*, int16); int32* GetPointerToScriptVariable(uint32*, int16);
@ -580,7 +576,6 @@ private:
static bool ThisIsAValidRandomCop(int32 mi, bool cop, bool swat, bool fbi, bool army, bool miami); static bool ThisIsAValidRandomCop(int32 mi, bool cop, bool swat, bool fbi, bool army, bool miami);
friend class CTheScripts;
}; };
#ifdef USE_DEBUG_SCRIPT_LOADER #ifdef USE_DEBUG_SCRIPT_LOADER

View File

@ -1048,7 +1048,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
CTheScripts::CleanUpThisPed(pPed); CTheScripts::CleanUpThisPed(pPed);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
return 0; return 0;
} }
case COMMAND_MARK_CAR_AS_NO_LONGER_NEEDED: case COMMAND_MARK_CAR_AS_NO_LONGER_NEEDED:
@ -1057,7 +1057,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
CTheScripts::CleanUpThisVehicle(pVehicle); CTheScripts::CleanUpThisVehicle(pVehicle);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR); CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR);
return 0; return 0;
} }
case COMMAND_MARK_OBJECT_AS_NO_LONGER_NEEDED: case COMMAND_MARK_OBJECT_AS_NO_LONGER_NEEDED:
@ -1066,7 +1066,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
CTheScripts::CleanUpThisObject(pObject); CTheScripts::CleanUpThisObject(pObject);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT); CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT);
return 0; return 0;
} }
case COMMAND_DONT_REMOVE_CHAR: case COMMAND_DONT_REMOVE_CHAR:
@ -1074,7 +1074,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
script_assert(pPed); script_assert(pPed);
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
return 0; return 0;
} }
case COMMAND_DONT_REMOVE_CAR: case COMMAND_DONT_REMOVE_CAR:
@ -1082,7 +1082,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
script_assert(pVehicle); script_assert(pVehicle);
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR); CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR);
return 0; return 0;
} }
case COMMAND_DONT_REMOVE_OBJECT: case COMMAND_DONT_REMOVE_OBJECT:
@ -1090,7 +1090,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
script_assert(pObject); script_assert(pObject);
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT); CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT);
return 0; return 0;
} }
case COMMAND_CREATE_CHAR_AS_PASSENGER: case COMMAND_CREATE_CHAR_AS_PASSENGER:
@ -1157,7 +1157,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed);
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
return 0; return 0;
} }
case COMMAND_SET_CHAR_OBJ_KILL_CHAR_ON_FOOT: case COMMAND_SET_CHAR_OBJ_KILL_CHAR_ON_FOOT:

View File

@ -325,11 +325,11 @@ int8 CRunningScript::ProcessCommands500To599(int32 command)
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
UpdateCompareFlag(CGarages::HasCarBeenDroppedOffYet(ScriptParams[0])); UpdateCompareFlag(CGarages::HasCarBeenDroppedOffYet(ScriptParams[0]));
return 0; return 0;
/*
case COMMAND_SET_FREE_BOMBS: case COMMAND_SET_FREE_BOMBS:
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
CGarages::SetFreeBombs(ScriptParams[0] != 0); CGarages::SetFreeBombs(ScriptParams[0] != 0);
return 0; return 0;
#ifdef GTA_PS2
case COMMAND_SET_POWERPOINT: case COMMAND_SET_POWERPOINT:
{ {
CollectParameters(&m_nIp, 7); CollectParameters(&m_nIp, 7);
@ -363,8 +363,6 @@ int8 CRunningScript::ProcessCommands500To599(int32 command)
return 0; return 0;
} }
#endif // GTA_PS2
/*
case COMMAND_SET_ALL_TAXI_LIGHTS: case COMMAND_SET_ALL_TAXI_LIGHTS:
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
CAutomobile::SetAllTaxiLights(ScriptParams[0] != 0); CAutomobile::SetAllTaxiLights(ScriptParams[0] != 0);
@ -1279,7 +1277,7 @@ int8 CRunningScript::ProcessCommands600To699(int32 command)
ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj); ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj);
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT); CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT);
return 0; return 0;
} }
/* /*
@ -1834,7 +1832,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
pPed->bRespondsToThreats = false; pPed->bRespondsToThreats = false;
++CPopulation::ms_nTotalMissionPeds; ++CPopulation::ms_nTotalMissionPeds;
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
} }
ScriptParams[0] = ped_handle; ScriptParams[0] = ped_handle;
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
@ -1889,7 +1887,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
pPed->bRespondsToThreats = false; pPed->bRespondsToThreats = false;
++CPopulation::ms_nTotalMissionPeds; ++CPopulation::ms_nTotalMissionPeds;
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
} }
ScriptParams[0] = ped_handle; ScriptParams[0] = ped_handle;
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);

View File

@ -155,7 +155,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
++CCarCtrl::NumMissionCars; ++CCarCtrl::NumMissionCars;
--CCarCtrl::NumRandomCars; --CCarCtrl::NumRandomCars;
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(handle, CLEANUP_CAR); CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR);
} }
ScriptParams[0] = handle; ScriptParams[0] = handle;
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
@ -188,7 +188,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
++CCarCtrl::NumMissionCars; ++CCarCtrl::NumMissionCars;
--CCarCtrl::NumRandomCars; --CCarCtrl::NumRandomCars;
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(handle, CLEANUP_CAR); CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR);
} }
ScriptParams[0] = handle; ScriptParams[0] = handle;
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
@ -609,7 +609,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
} }
} }
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
return 0; return 0;
} }
case COMMAND_SET_CHAR_STAY_IN_SAME_PLACE: case COMMAND_SET_CHAR_STAY_IN_SAME_PLACE:
@ -1056,7 +1056,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped); ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped);
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
return 0; return 0;
} }
case COMMAND_SET_CHAR_OBJ_STEAL_ANY_CAR: case COMMAND_SET_CHAR_OBJ_STEAL_ANY_CAR:

View File

@ -2251,6 +2251,80 @@ VALIDATESAVEBUF(size)
#undef SCRIPT_DATA_SIZE #undef SCRIPT_DATA_SIZE
void CRunningScript::Save(uint8*& buf)
{
#ifdef COMPATIBLE_SAVES
SkipSaveBuf(buf, 8);
for (int i = 0; i < 8; i++)
WriteSaveBuf<char>(buf, m_abScriptName[i]);
WriteSaveBuf<uint32>(buf, m_nIp);
#ifdef CHECK_STRUCT_SIZES
static_assert(MAX_STACK_DEPTH == 6, "Compatibility loss: MAX_STACK_DEPTH != 6");
#endif
for (int i = 0; i < MAX_STACK_DEPTH; i++)
WriteSaveBuf<uint32>(buf, m_anStack[i]);
WriteSaveBuf<uint16>(buf, m_nStackPointer);
SkipSaveBuf(buf, 2);
#ifdef CHECK_STRUCT_SIZES
static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18");
#endif
for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++)
WriteSaveBuf<int32>(buf, m_anLocalVariables[i]);
WriteSaveBuf<bool>(buf, m_bIsActive);
WriteSaveBuf<bool>(buf, m_bCondResult);
WriteSaveBuf<bool>(buf, m_bIsMissionScript);
WriteSaveBuf<bool>(buf, m_bSkipWakeTime);
WriteSaveBuf<uint32>(buf, m_nWakeTime);
WriteSaveBuf<uint16>(buf, m_nAndOrState);
WriteSaveBuf<bool>(buf, m_bNotFlag);
WriteSaveBuf<bool>(buf, m_bDeatharrestEnabled);
WriteSaveBuf<bool>(buf, m_bDeatharrestExecuted);
WriteSaveBuf<bool>(buf, m_bMissionFlag);
SkipSaveBuf(buf, 2);
#else
WriteSaveBuf(buf, *this);
#endif
}
void CRunningScript::Load(uint8*& buf)
{
#ifdef COMPATIBLE_SAVES
SkipSaveBuf(buf, 8);
for (int i = 0; i < 8; i++)
m_abScriptName[i] = ReadSaveBuf<char>(buf);
m_nIp = ReadSaveBuf<uint32>(buf);
#ifdef CHECK_STRUCT_SIZES
static_assert(MAX_STACK_DEPTH == 6, "Compatibility loss: MAX_STACK_DEPTH != 6");
#endif
for (int i = 0; i < MAX_STACK_DEPTH; i++)
m_anStack[i] = ReadSaveBuf<uint32>(buf);
m_nStackPointer = ReadSaveBuf<uint16>(buf);
SkipSaveBuf(buf, 2);
#ifdef CHECK_STRUCT_SIZES
static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18");
#endif
for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++)
m_anLocalVariables[i] = ReadSaveBuf<int32>(buf);
m_bIsActive = ReadSaveBuf<bool>(buf);
m_bCondResult = ReadSaveBuf<bool>(buf);
m_bIsMissionScript = ReadSaveBuf<bool>(buf);
m_bSkipWakeTime = ReadSaveBuf<bool>(buf);
m_nWakeTime = ReadSaveBuf<uint32>(buf);
m_nAndOrState = ReadSaveBuf<uint16>(buf);
m_bNotFlag = ReadSaveBuf<bool>(buf);
m_bDeatharrestEnabled = ReadSaveBuf<bool>(buf);
m_bDeatharrestExecuted = ReadSaveBuf<bool>(buf);
m_bMissionFlag = ReadSaveBuf<bool>(buf);
SkipSaveBuf(buf, 2);
#else
CRunningScript* n = next;
CRunningScript* p = prev;
*this = ReadSaveBuf<CRunningScript>(buf);
next = n;
prev = p;
#endif
}
void CTheScripts::ClearSpaceForMissionEntity(const CVector& pos, CEntity* pEntity) void CTheScripts::ClearSpaceForMissionEntity(const CVector& pos, CEntity* pEntity)
{ {
static CColPoint aTempColPoints[MAX_COLLISION_POINTS]; static CColPoint aTempColPoints[MAX_COLLISION_POINTS];

View File

@ -703,7 +703,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
ScriptParams[0] = CPools::GetVehiclePool()->GetIndex(pVehicle); ScriptParams[0] = CPools::GetVehiclePool()->GetIndex(pVehicle);
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CAR); CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CAR);
return 0; return 0;
} }
case COMMAND_START_BOAT_FOAM_ANIMATION: case COMMAND_START_BOAT_FOAM_ANIMATION:
@ -1272,7 +1272,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
pPed->bRespondsToThreats = false; pPed->bRespondsToThreats = false;
++CPopulation::ms_nTotalMissionPeds; ++CPopulation::ms_nTotalMissionPeds;
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
} }
ScriptParams[0] = ped_handle; ScriptParams[0] = ped_handle;
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
@ -1320,7 +1320,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
pPed->bRespondsToThreats = false; pPed->bRespondsToThreats = false;
++CPopulation::ms_nTotalMissionPeds; ++CPopulation::ms_nTotalMissionPeds;
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
} }
ScriptParams[0] = ped_handle; ScriptParams[0] = ped_handle;
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);

View File

@ -1201,7 +1201,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed);
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
return 0; return 0;
} }
case COMMAND_CREATE_RANDOM_CHAR_AS_PASSENGER: case COMMAND_CREATE_RANDOM_CHAR_AS_PASSENGER:
@ -1231,7 +1231,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed);
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
return 0; return 0;
} }
case COMMAND_SET_CHAR_IGNORE_THREATS_BEHIND_OBJECTS: case COMMAND_SET_CHAR_IGNORE_THREATS_BEHIND_OBJECTS:

View File

@ -283,7 +283,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
pPed->bRespondsToThreats = false; pPed->bRespondsToThreats = false;
++CPopulation::ms_nTotalMissionPeds; ++CPopulation::ms_nTotalMissionPeds;
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR); CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
} }
ScriptParams[0] = ped_handle; ScriptParams[0] = ped_handle;
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);

View File

@ -338,6 +338,11 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually
#define USE_BASIC_SCRIPT_DEBUG_OUTPUT #define USE_BASIC_SCRIPT_DEBUG_OUTPUT
#endif #endif
#ifdef MASTER
#undef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
#undef USE_BASIC_SCRIPT_DEBUG_OUTPUT
#endif
// Replay // Replay
//#define DONT_FIX_REPLAY_BUGS // keeps various bugs in CReplay, some of which are fairly cool! //#define DONT_FIX_REPLAY_BUGS // keeps various bugs in CReplay, some of which are fairly cool!
//#define USE_BETA_REPLAY_MODE // adds another replay mode, a few seconds slomo (caution: buggy!) //#define USE_BETA_REPLAY_MODE // adds another replay mode, a few seconds slomo (caution: buggy!)