summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/ControllerConfig.cpp10
-rw-r--r--src/core/EventList.cpp23
-rw-r--r--src/core/EventList.h2
-rw-r--r--src/core/Fire.cpp422
-rw-r--r--src/core/Fire.h37
-rw-r--r--src/core/Frontend.cpp268
-rw-r--r--src/core/Frontend.h12
-rw-r--r--src/core/Timer.h13
-rw-r--r--src/core/config.h7
9 files changed, 633 insertions, 161 deletions
diff --git a/src/core/ControllerConfig.cpp b/src/core/ControllerConfig.cpp
index 92c51182..541257c6 100644
--- a/src/core/ControllerConfig.cpp
+++ b/src/core/ControllerConfig.cpp
@@ -417,6 +417,11 @@ void CControllerConfigManager::UpdateJoyInConfigMenus_ButtonDown(int32 button, i
case 13:
pad->PCTempJoyState.DPadUp = 255;
break;
+#ifdef REGISTER_START_BUTTON
+ case 12:
+ pad->PCTempJoyState.Start = 255;
+ break;
+#endif
case 11:
pad->PCTempJoyState.RightShock = 255;
break;
@@ -839,6 +844,11 @@ void CControllerConfigManager::UpdateJoyInConfigMenus_ButtonUp(int32 button, int
case 13:
pad->PCTempJoyState.DPadUp = 0;
break;
+#ifdef REGISTER_START_BUTTON
+ case 12:
+ pad->PCTempJoyState.Start = 0;
+ break;
+#endif
case 11:
pad->PCTempJoyState.RightShock = 0;
break;
diff --git a/src/core/EventList.cpp b/src/core/EventList.cpp
index caf0cb3f..4364359a 100644
--- a/src/core/EventList.cpp
+++ b/src/core/EventList.cpp
@@ -5,10 +5,13 @@
#include "World.h"
#include "Wanted.h"
#include "EventList.h"
+#include "Messages.h"
+#include "Text.h"
+#include "main.h"
int32 CEventList::ms_nFirstFreeSlotIndex;
-//CEvent gaEvent[NUMEVENTS];
-CEvent *gaEvent = (CEvent*)0x6EF830;
+CEvent gaEvent[NUMEVENTS];
+//CEvent *gaEvent = (CEvent*)0x6EF830;
enum
{
@@ -207,8 +210,20 @@ CEventList::ReportCrimeForEvent(eEventType type, int32 crimeId, bool copsDontCar
default: crime = CRIME_NONE; break;
}
- if(crime == CRIME_NONE)
- return;
+#ifdef VC_PED_PORTS
+ if (crime == CRIME_HIT_PED && ((CPed*)crimeId)->IsPointerValid() &&
+ FindPlayerPed()->m_pWanted->m_nWantedLevel == 0 && ((CPed*)crimeId)->m_ped_flagE2) {
+
+ if(!((CPed*)crimeId)->DyingOrDead()) {
+ sprintf(gString, "$50 Good Citizen Bonus!");
+ AsciiToUnicode(gString, gUString);
+ CMessages::AddBigMessage(gUString, 5000, 0);
+ CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 50;
+ }
+ } else
+#endif
+ if(crime == CRIME_NONE)
+ return;
CVector playerPedCoors = FindPlayerPed()->GetPosition();
CVector playerCoors = FindPlayerCoors();
diff --git a/src/core/EventList.h b/src/core/EventList.h
index 2799fca4..1c03c9d6 100644
--- a/src/core/EventList.h
+++ b/src/core/EventList.h
@@ -63,4 +63,4 @@ public:
static void ReportCrimeForEvent(eEventType type, int32, bool);
};
-extern CEvent *gaEvent; \ No newline at end of file
+extern CEvent gaEvent[NUMEVENTS]; \ No newline at end of file
diff --git a/src/core/Fire.cpp b/src/core/Fire.cpp
index f83ad2c8..c98c808d 100644
--- a/src/core/Fire.cpp
+++ b/src/core/Fire.cpp
@@ -1,19 +1,289 @@
#include "common.h"
#include "patcher.h"
+#include "Vector.h"
+#include "PlayerPed.h"
+#include "Entity.h"
+#include "PointLights.h"
+#include "Particle.h"
+#include "Timer.h"
+#include "Vehicle.h"
+#include "Shadows.h"
+#include "Automobile.h"
+#include "World.h"
+#include "General.h"
+#include "EventList.h"
+#include "DamageManager.h"
+#include "Ped.h"
#include "Fire.h"
CFireManager &gFireManager = *(CFireManager*)0x8F31D0;
-WRAPPER void CFire::Extinguish(void) { EAXJMP(0x479D40); }
-WRAPPER void CFireManager::Update(void) { EAXJMP(0x479310); }
-WRAPPER CFire* CFireManager::FindFurthestFire_NeverMindFireMen(CVector coors, float, float) { EAXJMP(0x479430); }
+CFire::CFire()
+{
+ m_bIsOngoing = false;
+ m_bIsScriptFire = false;
+ m_bPropagationFlag = true;
+ m_bAudioSet = true;
+ m_vecPos = CVector(0.0f, 0.0f, 0.0f);
+ m_pEntity = nil;
+ m_pSource = nil;
+ m_nFiremenPuttingOut = 0;
+ m_nExtinguishTime = 0;
+ m_nStartTime = 0;
+ field_20 = 1;
+ m_nNextTimeToAddFlames = 0;
+ m_fStrength = 0.8f;
+}
-uint32 CFireManager::GetTotalActiveFires() const
+CFire::~CFire() {}
+
+void
+CFire::ProcessFire(void)
{
- return m_nTotalFires;
+ float fDamagePlayer;
+ float fDamagePeds;
+ float fDamageVehicle;
+ int8 nRandNumber;
+ float fGreen;
+ float fRed;
+ CVector lightpos;
+ CVector firePos;
+ CPed *ped = (CPed *)m_pEntity;
+ CVehicle *veh = (CVehicle*)m_pEntity;
+
+ if (m_pEntity) {
+ m_vecPos = m_pEntity->GetPosition();
+
+ if (((CPed *)m_pEntity)->IsPed()) {
+ if (ped->m_pFire != this) {
+ Extinguish();
+ return;
+ }
+ if (ped->m_nMoveState != PEDMOVE_RUN)
+ m_vecPos.z -= 1.0f;
+ if (ped->bInVehicle && ped->m_pMyVehicle) {
+ if (ped->m_pMyVehicle->IsCar())
+ ped->m_pMyVehicle->m_fHealth = 75.0f;
+ } else if (m_pEntity == (CPed *)FindPlayerPed()) {
+ fDamagePlayer = 1.2f * CTimer::GetTimeStep();
+
+ ((CPlayerPed *)m_pEntity)->InflictDamage(
+ (CPlayerPed *)m_pSource, WEAPONTYPE_FLAMETHROWER,
+ fDamagePlayer, PEDPIECE_TORSO, 0);
+ } else {
+ fDamagePeds = 1.2f * CTimer::GetTimeStep();
+
+ if (((CPlayerPed *)m_pEntity)->InflictDamage(
+ (CPlayerPed *)m_pSource, WEAPONTYPE_FLAMETHROWER,
+ fDamagePeds, PEDPIECE_TORSO, 0)) {
+ m_pEntity->bRenderScorched = true;
+ }
+ }
+ } else if (m_pEntity->IsVehicle()) {
+ if (veh->m_pCarFire != this) {
+ Extinguish();
+ return;
+ }
+ if (!m_bIsScriptFire) {
+ fDamageVehicle = 1.2f * CTimer::GetTimeStep();
+ veh->InflictDamage((CVehicle *)m_pSource, WEAPONTYPE_FLAMETHROWER, fDamageVehicle);
+ }
+ }
+ }
+ if (!FindPlayerVehicle() && !FindPlayerPed()->m_pFire && !(FindPlayerPed()->bFireProof)
+ && ((FindPlayerPed()->GetPosition() - m_vecPos).MagnitudeSqr() < 2.0f)) {
+ FindPlayerPed()->DoStuffToGoOnFire();
+ gFireManager.StartFire(FindPlayerPed(), m_pSource, 0.8f, 1);
+ }
+ if (CTimer::GetTimeInMilliseconds() > m_nNextTimeToAddFlames) {
+ m_nNextTimeToAddFlames = CTimer::GetTimeInMilliseconds() + 80;
+ firePos = m_vecPos;
+
+ if (veh && veh->IsVehicle() && veh->IsCar()) {
+ CVehicleModelInfo *mi = ((CVehicleModelInfo*)CModelInfo::GetModelInfo(veh->GetModelIndex()));
+ CVector ModelInfo = mi->m_positions[CAR_POS_HEADLIGHTS];
+ ModelInfo = m_pEntity->GetMatrix() * ModelInfo;
+
+ firePos.x = ModelInfo.x;
+ firePos.y = ModelInfo.y;
+ firePos.z = ModelInfo.z + 0.15f;
+ }
+
+ CParticle::AddParticle(PARTICLE_CARFLAME, firePos,
+ CVector(0.0f, 0.0f, CGeneral::GetRandomNumberInRange(0.0125f, 0.1f) * m_fStrength),
+ 0, m_fStrength, 0, 0, 0, 0);
+
+ rand(); rand(); rand(); /* unsure why these three rands are called */
+
+ CParticle::AddParticle(PARTICLE_CARFLAME_SMOKE, firePos,
+ CVector(0.0f, 0.0f, 0.0f), 0, 0.0f, 0, 0, 0, 0);
+ }
+ if (CTimer::GetTimeInMilliseconds() < m_nExtinguishTime || m_bIsScriptFire) {
+ if (CTimer::GetTimeInMilliseconds() > m_nStartTime)
+ m_nStartTime = CTimer::GetTimeInMilliseconds() + 400;
+
+ nRandNumber = CGeneral::GetRandomNumber() & 127;
+ lightpos.x = m_vecPos.x;
+ lightpos.y = m_vecPos.y;
+ lightpos.z = m_vecPos.z + 5.0f;
+
+ if (!m_pEntity) {
+ CShadows::StoreStaticShadow((uint32)this, SHADOWTYPE_ADDITIVE, gpShadowExplosionTex, &lightpos,
+ 7.0f, 0.0f, 0.0f, -7.0f, 0, nRandNumber / 2, nRandNumber / 2,
+ 0, 10.0f, 1.0f, 40.0f, 0, 0.0f);
+ }
+ fGreen = nRandNumber / 128;
+ fRed = nRandNumber / 128;
+
+ CPointLights::AddLight(0, m_vecPos, CVector(0.0f, 0.0f, 0.0f),
+ 12.0f, fRed, fGreen, 0, 0, 0);
+ } else {
+ Extinguish();
+ }
}
-CFire* CFireManager::FindNearestFire(CVector vecPos, float* pDistance)
+void
+CFire::ReportThisFire(void)
+{
+ gFireManager.m_nTotalFires++;
+ CEventList::RegisterEvent(EVENT_FIRE, m_vecPos, 1000);
+}
+
+void
+CFire::Extinguish(void)
+{
+ if (m_bIsOngoing) {
+ if (!m_bIsScriptFire)
+ gFireManager.m_nTotalFires--;
+
+ m_nExtinguishTime = 0;
+ m_bIsOngoing = false;
+
+ if (m_pEntity) {
+ if (m_pEntity->IsPed()) {
+ ((CPed *)m_pEntity)->RestorePreviousState();
+ ((CPed *)m_pEntity)->m_pFire = nil;
+ } else if (m_pEntity->IsVehicle()) {
+ ((CVehicle *)m_pEntity)->m_pCarFire = nil;
+ }
+ m_pEntity = nil;
+ }
+ }
+}
+
+void
+CFireManager::StartFire(CVector pos, float size, bool propagation)
+{
+ CFire *fire = GetNextFreeFire();
+
+ if (fire) {
+ fire->m_bIsOngoing = true;
+ fire->m_bIsScriptFire = false;
+ fire->m_bPropagationFlag = propagation;
+ fire->m_bAudioSet = true;
+ fire->m_vecPos = pos;
+ fire->m_nExtinguishTime = CTimer::GetTimeInMilliseconds() + 10000;
+ fire->m_nStartTime = CTimer::GetTimeInMilliseconds() + 400;
+ fire->m_pEntity = nil;
+ fire->m_pSource = nil;
+ fire->m_nNextTimeToAddFlames = 0;
+ fire->ReportThisFire();
+ fire->m_fStrength = size;
+ }
+}
+
+CFire *
+CFireManager::StartFire(CEntity *entityOnFire, CEntity *fleeFrom, float strength, bool propagation)
+{
+ CPed *ped = (CPed *)entityOnFire;
+ CVehicle *veh = (CVehicle *)entityOnFire;
+
+ if (entityOnFire->IsPed()) {
+ if (ped->m_pFire)
+ return nil;
+ if (!ped->IsPedInControl())
+ return nil;
+ } else if (entityOnFire->IsVehicle()) {
+ if (veh->m_pCarFire)
+ return nil;
+ if (veh->IsCar() && ((CAutomobile *)veh)->Damage.GetEngineStatus() >= 225)
+ return nil;
+ }
+ CFire *fire = GetNextFreeFire();
+
+ if (fire) {
+ if (entityOnFire->IsPed()) {
+ ped->m_pFire = fire;
+ if (ped != FindPlayerPed()) {
+ if (fleeFrom) {
+ ped->SetFlee(fleeFrom, 10000);
+ } else {
+ CVector2D pos = entityOnFire->GetPosition();
+ ped->SetFlee(pos, 10000);
+ ped->m_fleeFrom = nil;
+ }
+ ped->bDrawLast = false;
+ ped->SetMoveState(PEDMOVE_SPRINT);
+ ped->SetMoveAnim();
+ ped->m_nPedState = PED_ON_FIRE;
+ }
+ if (fleeFrom) {
+ if (ped->m_nPedType == PEDTYPE_COP) {
+ CEventList::RegisterEvent(EVENT_COP_SET_ON_FIRE, EVENT_ENTITY_PED,
+ entityOnFire, (CPed *)fleeFrom, 10000);
+ } else {
+ CEventList::RegisterEvent(EVENT_PED_SET_ON_FIRE, EVENT_ENTITY_PED,
+ entityOnFire, (CPed *)fleeFrom, 10000);
+ }
+ }
+ } else {
+ if (entityOnFire->IsVehicle()) {
+ veh->m_pCarFire = fire;
+ if (fleeFrom) {
+ CEventList::RegisterEvent(EVENT_CAR_SET_ON_FIRE, EVENT_ENTITY_VEHICLE,
+ entityOnFire, (CPed *)fleeFrom, 10000);
+ }
+ }
+ }
+
+ fire->m_bIsOngoing = true;
+ fire->m_bIsScriptFire = false;
+ fire->m_vecPos = entityOnFire->GetPosition();
+
+ if (entityOnFire && entityOnFire->IsPed() && ped->IsPlayer()) {
+ fire->m_nExtinguishTime = CTimer::GetTimeInMilliseconds() + 3333;
+ } else if (entityOnFire->IsVehicle()) {
+ fire->m_nExtinguishTime = CTimer::GetTimeInMilliseconds() + CGeneral::GetRandomNumberInRange(4000, 5000);
+ } else {
+ fire->m_nExtinguishTime = CTimer::GetTimeInMilliseconds() + CGeneral::GetRandomNumberInRange(10000, 11000);
+ }
+ fire->m_nStartTime = CTimer::GetTimeInMilliseconds() + 400;
+ fire->m_pEntity = entityOnFire;
+
+ entityOnFire->RegisterReference(&fire->m_pEntity);
+ fire->m_pSource = fleeFrom;
+
+ if (fleeFrom)
+ fleeFrom->RegisterReference(&fire->m_pSource);
+ fire->ReportThisFire();
+ fire->m_nNextTimeToAddFlames = 0;
+ fire->m_fStrength = strength;
+ fire->m_bPropagationFlag = propagation;
+ fire->m_bAudioSet = true;
+ }
+ return fire;
+}
+
+void
+CFireManager::Update(void)
+{
+ for (int i = 0; i < NUM_FIRES; i++) {
+ if (m_aFires[i].m_bIsOngoing)
+ m_aFires[i].ProcessFire();
+ }
+}
+
+CFire* CFireManager::FindNearestFire(CVector vecPos, float *pDistance)
{
for (int i = 0; i < MAX_FIREMEN_ATTENDING; i++) {
int fireId = -1;
@@ -38,6 +308,44 @@ CFire* CFireManager::FindNearestFire(CVector vecPos, float* pDistance)
return nil;
}
+CFire *
+CFireManager::FindFurthestFire_NeverMindFireMen(CVector coords, float minRange, float maxRange)
+{
+ int furthestFire = -1;
+ float lastFireDist = 0.0f;
+ float fireDist;
+
+ for (int i = 0; i < NUM_FIRES; i++) {
+ if (m_aFires[i].m_bIsOngoing && !m_aFires[i].m_bIsScriptFire) {
+ fireDist = (m_aFires[i].m_vecPos - coords).Magnitude2D();
+ if (fireDist > minRange && fireDist < maxRange && fireDist > lastFireDist) {
+ lastFireDist = fireDist;
+ furthestFire = i;
+ }
+ }
+ }
+ if (furthestFire == -1)
+ return nil;
+ else
+ return &m_aFires[furthestFire];
+}
+
+CFire *
+CFireManager::GetNextFreeFire(void)
+{
+ for (int i = 0; i < NUM_FIRES; i++) {
+ if (!m_aFires[i].m_bIsOngoing && !m_aFires[i].m_bIsScriptFire)
+ return &m_aFires[i];
+ }
+ return nil;
+}
+
+uint32
+CFireManager::GetTotalActiveFires(void) const
+{
+ return m_nTotalFires;
+}
+
void
CFireManager::ExtinguishPoint(CVector point, float range)
{
@@ -49,16 +357,100 @@ CFireManager::ExtinguishPoint(CVector point, float range)
}
}
-WRAPPER void CFireManager::StartFire(CEntity *entityOnFire, CEntity *culprit, float, uint32) { EAXJMP(0x479590); }
-WRAPPER void CFireManager::StartFire(CVector, float, uint8) { EAXJMP(0x479500); }
-WRAPPER int32 CFireManager::StartScriptFire(const CVector& pos, CEntity* culprit, float, uint8) { EAXJMP(0x479E60); }
-WRAPPER bool CFireManager::IsScriptFireExtinguish(int16) { EAXJMP(0x479FC0); }
-WRAPPER void CFireManager::RemoveScriptFire(int16) { EAXJMP(0x479FE0); }
-WRAPPER void CFireManager::RemoveAllScriptFires(void) { EAXJMP(0x47A000); }
-WRAPPER void CFireManager::SetScriptFireAudio(int16, bool) { EAXJMP(0x47A040); }
+int32
+CFireManager::StartScriptFire(const CVector &pos, CEntity *target, float strength, bool propagation)
+{
+ CFire *fire;
+ CPed *ped = (CPed *)target;
+ CVehicle *veh = (CVehicle *)target;
+
+ if (target) {
+ if (target->IsPed()) {
+ if (ped->m_pFire)
+ ped->m_pFire->Extinguish();
+ } else if (target->IsVehicle()) {
+ if (veh->m_pCarFire)
+ veh->m_pCarFire->Extinguish();
+ if (veh->IsCar() && ((CAutomobile *)veh)->Damage.GetEngineStatus() >= 225) {
+ ((CAutomobile *)veh)->Damage.SetEngineStatus(215);
+ }
+ }
+ }
+
+ fire = GetNextFreeFire();
+ fire->m_bIsOngoing = true;
+ fire->m_bIsScriptFire = true;
+ fire->m_bPropagationFlag = propagation;
+ fire->m_bAudioSet = true;
+ fire->m_vecPos = pos;
+ fire->m_nStartTime = CTimer::GetTimeInMilliseconds() + 400;
+ fire->m_pEntity = target;
+
+ if (target)
+ target->RegisterReference(&fire->m_pEntity);
+ fire->m_pSource = nil;
+ fire->m_nNextTimeToAddFlames = 0;
+ fire->m_fStrength = strength;
+ if (target) {
+ if (target->IsPed()) {
+ ped->m_pFire = fire;
+ if (target != (CVehicle *)FindPlayerPed()) {
+ CVector2D pos = target->GetPosition();
+ ped->SetFlee(pos, 10000);
+ ped->SetMoveAnim();
+ ped->m_nPedState = PED_ON_FIRE;
+ }
+ } else if (target->IsVehicle()) {
+ veh->m_pCarFire = fire;
+ }
+ }
+ return fire - m_aFires;
+}
+
+bool
+CFireManager::IsScriptFireExtinguish(int16 index)
+{
+ return !m_aFires[index].m_bIsOngoing;
+}
+
+void
+CFireManager::RemoveAllScriptFires(void)
+{
+ for (int i = 0; i < NUM_FIRES; i++) {
+ if (m_aFires[i].m_bIsScriptFire) {
+ m_aFires[i].Extinguish();
+ m_aFires[i].m_bIsScriptFire = false;
+ }
+ }
+}
+
+void
+CFireManager::RemoveScriptFire(int16 index)
+{
+ m_aFires[index].Extinguish();
+ m_aFires[index].m_bIsScriptFire = false;
+}
+
+void
+CFireManager::SetScriptFireAudio(int16 index, bool state)
+{
+ m_aFires[index].m_bAudioSet = state;
+}
STARTPATCHES
- InjectHook(0x479DB0, &CFireManager::ExtinguishPoint, PATCH_JUMP);
+ InjectHook(0x4798D0, &CFire::ProcessFire, PATCH_JUMP);
+ InjectHook(0x4798B0, &CFire::ReportThisFire, PATCH_JUMP);
+ InjectHook(0x479D40, &CFire::Extinguish, PATCH_JUMP);
+ InjectHook(0x479500, (void(CFireManager::*)(CVector pos, float size, bool propagation))&CFireManager::StartFire, PATCH_JUMP);
+ InjectHook(0x479590, (CFire *(CFireManager::*)(CEntity *, CEntity *, float, bool))&CFireManager::StartFire, PATCH_JUMP);
+ InjectHook(0x479310, &CFireManager::Update, PATCH_JUMP);
+ InjectHook(0x479430, &CFireManager::FindFurthestFire_NeverMindFireMen, PATCH_JUMP);
InjectHook(0x479340, &CFireManager::FindNearestFire, PATCH_JUMP);
+ InjectHook(0x4792E0, &CFireManager::GetNextFreeFire, PATCH_JUMP);
+ InjectHook(0x479DB0, &CFireManager::ExtinguishPoint, PATCH_JUMP);
+ InjectHook(0x479E60, &CFireManager::StartScriptFire, PATCH_JUMP);
+ InjectHook(0x479FC0, &CFireManager::IsScriptFireExtinguish, PATCH_JUMP);
+ InjectHook(0x47A000, &CFireManager::RemoveAllScriptFires, PATCH_JUMP);
+ InjectHook(0x479FE0, &CFireManager::RemoveScriptFire, PATCH_JUMP);
+ InjectHook(0x47A040, &CFireManager::SetScriptFireAudio, PATCH_JUMP);
ENDPATCHES
-
diff --git a/src/core/Fire.h b/src/core/Fire.h
index 624bf608..a4599d11 100644
--- a/src/core/Fire.h
+++ b/src/core/Fire.h
@@ -7,18 +7,22 @@ class CFire
public:
bool m_bIsOngoing;
bool m_bIsScriptFire;
- bool m_bPropogationFlag;
+ bool m_bPropagationFlag;
bool m_bAudioSet;
CVector m_vecPos;
CEntity *m_pEntity;
CEntity *m_pSource;
- int m_nExtinguishTime;
- int m_nStartTime;
- int field_20;
- int field_24;
+ uint32 m_nExtinguishTime;
+ uint32 m_nStartTime;
+ int32 field_20;
+ uint32 m_nNextTimeToAddFlames;
uint32 m_nFiremenPuttingOut;
- float field_2C;
+ float m_fStrength;
+ CFire();
+ ~CFire();
+ void ProcessFire(void);
+ void ReportThisFire(void);
void Extinguish(void);
};
@@ -27,20 +31,21 @@ class CFireManager
enum {
MAX_FIREMEN_ATTENDING = 2,
};
- uint32 m_nTotalFires;
public:
+ uint32 m_nTotalFires;
CFire m_aFires[NUM_FIRES];
- void StartFire(CEntity *entityOnFire, CEntity *culprit, float, uint32);
- void StartFire(CVector, float, uint8);
+ void StartFire(CVector pos, float size, bool propagation);
+ CFire *StartFire(CEntity *entityOnFire, CEntity *fleeFrom, float strength, bool propagation);
void Update(void);
- CFire *FindFurthestFire_NeverMindFireMen(CVector coors, float, float);
- CFire *FindNearestFire(CVector, float*);
+ CFire *FindFurthestFire_NeverMindFireMen(CVector coords, float minRange, float maxRange);
+ CFire *FindNearestFire(CVector vecPos, float *pDistance);
+ CFire *GetNextFreeFire(void);
uint32 GetTotalActiveFires() const;
- void ExtinguishPoint(CVector, float);
- int32 StartScriptFire(const CVector& pos, CEntity* culprit, float, uint8);
- bool IsScriptFireExtinguish(int16);
- void RemoveScriptFire(int16);
+ void ExtinguishPoint(CVector point, float range);
+ int32 StartScriptFire(const CVector &pos, CEntity *target, float strength, bool propagation);
+ bool IsScriptFireExtinguish(int16 index);
void RemoveAllScriptFires(void);
- void SetScriptFireAudio(int16, bool);
+ void RemoveScriptFire(int16 index);
+ void SetScriptFireAudio(int16 index, bool state);
};
extern CFireManager &gFireManager;
diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp
index 4c2f3afa..aff8a3ec 100644
--- a/src/core/Frontend.cpp
+++ b/src/core/Frontend.cpp
@@ -181,6 +181,7 @@ ScaleAndCenterX(float x)
#endif
#define isPlainTextScreen(screen) (screen == MENUPAGE_BRIEFS || screen == MENUPAGE_STATS)
+
#ifdef PS2_LIKE_MENU
#define ChangeScreen(screen, option, updateDelay, withReverseAlpha) \
do { \
@@ -235,67 +236,100 @@ ScaleAndCenterX(float x)
m_nHoverOption = HOVEROPTION_NOT_HOVERING; \
} while(0)
-#define ScrollUpListByOne() \
- do { \
- if (m_nSelectedListRow == m_nFirstVisibleRowOnList) { \
- if (m_nFirstVisibleRowOnList > 0) { \
- m_nSelectedListRow--; \
- m_nFirstVisibleRowOnList--; \
- m_nCurListItemY -= LIST_HEIGHT / m_nTotalListRow; \
- } \
- } else { \
- m_nSelectedListRow--; \
- } \
- } while(0)
+// --- Functions not in the game/inlined starts
-#define ScrollDownListByOne() \
- do { \
- if (m_nSelectedListRow == m_nFirstVisibleRowOnList + MAX_VISIBLE_LIST_ROW - 1) { \
- if (m_nFirstVisibleRowOnList < m_nTotalListRow - MAX_VISIBLE_LIST_ROW) { \
- m_nSelectedListRow++; \
- m_nFirstVisibleRowOnList++; \
- m_nCurListItemY += LIST_HEIGHT / m_nTotalListRow; \
- } \
- } else { \
- if (m_nSelectedListRow < m_nTotalListRow - 1) { \
- m_nSelectedListRow++; \
- } \
- } \
- } while(0)
+inline void
+CMenuManager::ScrollUpListByOne()
+{
+ if (m_nSelectedListRow == m_nFirstVisibleRowOnList) {
+ if (m_nFirstVisibleRowOnList > 0) {
+ m_nSelectedListRow--;
+ m_nFirstVisibleRowOnList--;
+ m_nCurListItemY -= LIST_HEIGHT / m_nTotalListRow;
+ }
+ } else {
+ m_nSelectedListRow--;
+ }
+}
-#define PageUpList(playSoundOnSuccess) \
- do { \
- if (m_nTotalListRow > MAX_VISIBLE_LIST_ROW) { \
- if (m_nFirstVisibleRowOnList > 0) { \
- if(playSoundOnSuccess) \
- DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0); \
- \
- m_nFirstVisibleRowOnList = max(0, m_nFirstVisibleRowOnList - MAX_VISIBLE_LIST_ROW); \
- m_nSelectedListRow = min(m_nSelectedListRow, m_nFirstVisibleRowOnList + MAX_VISIBLE_LIST_ROW - 1); \
- } else { \
- m_nFirstVisibleRowOnList = 0; \
- m_nSelectedListRow = 0; \
- } \
- m_nCurListItemY = (LIST_HEIGHT / m_nTotalListRow) * m_nFirstVisibleRowOnList; \
- } \
- } while(0)
+inline void
+CMenuManager::ScrollDownListByOne()
+{
+ if (m_nSelectedListRow == m_nFirstVisibleRowOnList + MAX_VISIBLE_LIST_ROW - 1) {
+ if (m_nFirstVisibleRowOnList < m_nTotalListRow - MAX_VISIBLE_LIST_ROW) {
+ m_nSelectedListRow++;
+ m_nFirstVisibleRowOnList++;
+ m_nCurListItemY += LIST_HEIGHT / m_nTotalListRow;
+ }
+ } else {
+ if (m_nSelectedListRow < m_nTotalListRow - 1) {
+ m_nSelectedListRow++;
+ }
+ }
+}
-#define PageDownList(playSoundOnSuccess) \
- do { \
- if (m_nTotalListRow > MAX_VISIBLE_LIST_ROW) { \
- if (m_nFirstVisibleRowOnList < m_nTotalListRow - MAX_VISIBLE_LIST_ROW) { \
- if(playSoundOnSuccess) \
- DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0); \
- \
- m_nFirstVisibleRowOnList = min(m_nFirstVisibleRowOnList + MAX_VISIBLE_LIST_ROW, m_nTotalListRow - MAX_VISIBLE_LIST_ROW); \
- m_nSelectedListRow = max(m_nSelectedListRow, m_nFirstVisibleRowOnList); \
- } else { \
- m_nFirstVisibleRowOnList = m_nTotalListRow - MAX_VISIBLE_LIST_ROW; \
- m_nSelectedListRow = m_nTotalListRow - 1; \
- } \
- m_nCurListItemY = (LIST_HEIGHT / m_nTotalListRow) * m_nFirstVisibleRowOnList; \
- } \
- } while(0)
+inline void
+CMenuManager::PageUpList(bool playSoundOnSuccess)
+{
+ if (m_nTotalListRow > MAX_VISIBLE_LIST_ROW) {
+ if (m_nFirstVisibleRowOnList > 0) {
+ if(playSoundOnSuccess)
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
+
+ m_nFirstVisibleRowOnList = max(0, m_nFirstVisibleRowOnList - MAX_VISIBLE_LIST_ROW);
+ m_nSelectedListRow = min(m_nSelectedListRow, m_nFirstVisibleRowOnList + MAX_VISIBLE_LIST_ROW - 1);
+ } else {
+ m_nFirstVisibleRowOnList = 0;
+ m_nSelectedListRow = 0;
+ }
+ m_nCurListItemY = (LIST_HEIGHT / m_nTotalListRow) * m_nFirstVisibleRowOnList;
+ }
+}
+
+inline void
+CMenuManager::PageDownList(bool playSoundOnSuccess)
+{
+ if (m_nTotalListRow > MAX_VISIBLE_LIST_ROW) {
+ if (m_nFirstVisibleRowOnList < m_nTotalListRow - MAX_VISIBLE_LIST_ROW) {
+ if(playSoundOnSuccess)
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
+
+ m_nFirstVisibleRowOnList = min(m_nFirstVisibleRowOnList + MAX_VISIBLE_LIST_ROW, m_nTotalListRow - MAX_VISIBLE_LIST_ROW);
+ m_nSelectedListRow = max(m_nSelectedListRow, m_nFirstVisibleRowOnList);
+ } else {
+ m_nFirstVisibleRowOnList = m_nTotalListRow - MAX_VISIBLE_LIST_ROW;
+ m_nSelectedListRow = m_nTotalListRow - 1;
+ }
+ m_nCurListItemY = (LIST_HEIGHT / m_nTotalListRow) * m_nFirstVisibleRowOnList;
+ }
+}
+
+inline void
+CMenuManager::ThingsToDoBeforeLeavingPage()
+{
+ if ((m_nCurrScreen == MENUPAGE_SKIN_SELECT) && strcmp(m_aSkinName, m_PrefsSkinFile) != 0) {
+ CWorld::Players[0].SetPlayerSkin(m_PrefsSkinFile);
+ } else if (m_nCurrScreen == MENUPAGE_SOUND_SETTINGS) {
+ if (m_nPrefsAudio3DProviderIndex != -1)
+ m_nPrefsAudio3DProviderIndex = DMAudio.GetCurrent3DProviderIndex();
+#ifdef TIDY_UP_PBP
+ DMAudio.StopFrontEndTrack();
+ OutputDebugString("FRONTEND AUDIO TRACK STOPPED");
+#endif
+ } else if (m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) {
+ m_nDisplayVideoMode = m_nPrefsVideoMode;
+ }
+
+ if (m_nCurrScreen == MENUPAGE_SKIN_SELECT) {
+ CPlayerSkin::EndFrontendSkinEdit();
+ }
+
+ if ((m_nCurrScreen == MENUPAGE_SKIN_SELECT) || (m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS)) {
+ m_nTotalListRow = 0;
+ }
+}
+
+// ------ Functions not in the game/inlined ends
void
CMenuManager::BuildStatLine(char *text, void *stat, uint8 aFloat, void *stat2)
@@ -1173,7 +1207,6 @@ void CMenuManager::DrawFrontEnd()
bbNames[5] = { "FESZ_QU",MENUPAGE_EXIT };
bbTabCount = 6;
}
- m_nCurrScreen = MENUPAGE_NEW_GAME;
} else {
if (bbTabCount != 8) {
bbNames[0] = { "FEB_STA",MENUPAGE_STATS };
@@ -1186,8 +1219,8 @@ void CMenuManager::DrawFrontEnd()
bbNames[7] = { "FESZ_QU",MENUPAGE_EXIT };
bbTabCount = 8;
}
- m_nCurrScreen = MENUPAGE_STATS;
}
+ m_nCurrScreen = bbNames[0].screenId;
bottomBarActive = true;
curBottomBarOption = 0;
}
@@ -1285,7 +1318,6 @@ void CMenuManager::DrawFrontEndNormal()
eFrontendSprites currentSprite;
switch (m_nCurrScreen) {
case MENUPAGE_STATS:
- case MENUPAGE_NEW_GAME:
case MENUPAGE_START_MENU:
case MENUPAGE_PAUSE_MENU:
case MENUPAGE_EXIT:
@@ -1315,7 +1347,7 @@ void CMenuManager::DrawFrontEndNormal()
currentSprite = FE_ICONCONTROLS;
break;
default:
- /* actually MENUPAGE_NEW_GAME too*/
+ /*case MENUPAGE_NEW_GAME: */
/*case MENUPAGE_BRIEFS: */
currentSprite = FE_ICONBRIEF;
break;
@@ -1324,16 +1356,16 @@ void CMenuManager::DrawFrontEndNormal()
m_aFrontEndSprites[currentSprite].Draw(CRect(MENU_X_LEFT_ALIGNED(50.0f), MENU_Y(50.0f), MENU_X_RIGHT_ALIGNED(50.0f), SCREEN_SCALE_FROM_BOTTOM(95.0f)), CRGBA(255, 255, 255, m_nMenuFadeAlpha > 255 ? 255 : m_nMenuFadeAlpha));
if (m_nMenuFadeAlpha < 255) {
- static int LastFade = 0;
+ static uint32 LastFade = 0;
if (m_nMenuFadeAlpha <= 0 && reverseAlpha) {
reverseAlpha = false;
ChangeScreen(pendingScreen, pendingOption, true, false);
- } else if(CTimer::GetTimeInMillisecondsPauseMode() - LastFade > 10){
+ } else {
if (!reverseAlpha)
- m_nMenuFadeAlpha += 20;
+ m_nMenuFadeAlpha += min((CTimer::GetTimeInMillisecondsPauseMode() - LastFade) / 33.0f, 1.0f) * 20.0f;
else
- m_nMenuFadeAlpha = max(m_nMenuFadeAlpha - 30, 0);
+ m_nMenuFadeAlpha = max(0, m_nMenuFadeAlpha - min((CTimer::GetTimeInMillisecondsPauseMode() - LastFade) / 33.0f, 1.0f) * 30.0f);
LastFade = CTimer::GetTimeInMillisecondsPauseMode();
}
@@ -1537,12 +1569,18 @@ void CMenuManager::DrawFrontEndNormal()
}
if (m_nMenuFadeAlpha < 255) {
- static int LastFade = 0;
+ static uint32 LastFade = 0;
+ // Famous transparent menu bug. 33.0f = 1000.f/30.f (original frame limiter fps)
+#ifdef FIX_BUGS
+ m_nMenuFadeAlpha += min((CTimer::GetTimeInMillisecondsPauseMode() - LastFade) / 33.0f, 1.0f) * 20.0f;
+ LastFade = CTimer::GetTimeInMillisecondsPauseMode();
+#else
if(CTimer::GetTimeInMillisecondsPauseMode() - LastFade > 10){
m_nMenuFadeAlpha += 20;
LastFade = CTimer::GetTimeInMillisecondsPauseMode();
}
+#endif
if (m_nMenuFadeAlpha > 255){
m_aMenuSprites[currentSprite].Draw(CRect(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT), CRGBA(255, 255, 255, 255));
@@ -1950,7 +1988,7 @@ WRAPPER void CMenuManager::Process(void) { EAXJMP(0x485100); }
#else
void CMenuManager::Process(void)
{
- m_bMenuNotProcessed = false;
+ m_bMenuStateChanged = false;
if (!m_bSaveMenuActive && TheCamera.GetScreenFadeStatus() != FADE_0)
return;
@@ -2701,6 +2739,8 @@ CMenuManager::ProcessButtonPresses(void)
if (CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetCrossJustDown()) {
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
bottomBarActive = false;
+
+ // If there's a menu change with fade ongoing, finish it now
if (reverseAlpha)
m_nMenuFadeAlpha = 0;
return;
@@ -3116,51 +3156,43 @@ CMenuManager::ProcessButtonPresses(void)
if (goBack) {
CMenuManager::ResetHelperText();
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_EXIT, 0);
- if (m_nCurrScreen == MENUPAGE_PAUSE_MENU && !m_bGameNotLoaded && !m_bMenuNotProcessed){
- if (CMenuManager::m_PrefsVsyncDisp != CMenuManager::m_PrefsVsync) {
- CMenuManager::m_PrefsVsync = CMenuManager::m_PrefsVsyncDisp;
- }
- CMenuManager::RequestFrontEndShutDown();
- } else if (m_nCurrScreen == MENUPAGE_CHOOSE_SAVE_SLOT
-#ifdef PS2_SAVE_DIALOG
- || m_nCurrScreen == MENUPAGE_SAVE
-#endif
- ) {
- CMenuManager::RequestFrontEndShutDown();
- } else if (m_nCurrScreen == MENUPAGE_SOUND_SETTINGS) {
- DMAudio.StopFrontEndTrack();
- OutputDebugString("FRONTEND AUDIO TRACK STOPPED");
- }
-
- int oldScreen = !m_bGameNotLoaded ? aScreens[m_nCurrScreen].m_PreviousPage[1] : aScreens[m_nCurrScreen].m_PreviousPage[0];
- int oldOption = !m_bGameNotLoaded ? aScreens[m_nCurrScreen].m_ParentEntry[1] : aScreens[m_nCurrScreen].m_ParentEntry[0];
-
#ifdef PS2_LIKE_MENU
- if (bottomBarActive){
- bottomBarActive = false;
- if (!m_bGameNotLoaded) {
+ if (m_nCurrScreen == MENUPAGE_PAUSE_MENU || bottomBarActive) {
+#else
+ if (m_nCurrScreen == MENUPAGE_PAUSE_MENU) {
+#endif
+ if (!m_bGameNotLoaded && !m_bMenuStateChanged) {
if (CMenuManager::m_PrefsVsyncDisp != CMenuManager::m_PrefsVsync) {
CMenuManager::m_PrefsVsync = CMenuManager::m_PrefsVsyncDisp;
}
CMenuManager::RequestFrontEndShutDown();
}
+
+ // We're already resuming, we don't need further processing.
+#if defined(FIX_BUGS) || defined(PS2_LIKE_MENU)
return;
+#endif
+ }
+#ifdef PS2_LIKE_MENU
+ else if (m_nCurrScreen == MENUPAGE_CHOOSE_SAVE_SLOT || m_nCurrScreen == MENUPAGE_SAVE) {
+#else
+ else if (m_nCurrScreen == MENUPAGE_CHOOSE_SAVE_SLOT) {
+#endif
+ CMenuManager::RequestFrontEndShutDown();
+ }
+ // It's now in ThingsToDoBeforeLeavingPage()
+#ifndef TIDY_UP_PBP
+ else if (m_nCurrScreen == MENUPAGE_SOUND_SETTINGS) {
+ DMAudio.StopFrontEndTrack();
+ OutputDebugString("FRONTEND AUDIO TRACK STOPPED");
}
#endif
+ int oldScreen = !m_bGameNotLoaded ? aScreens[m_nCurrScreen].m_PreviousPage[1] : aScreens[m_nCurrScreen].m_PreviousPage[0];
+ int oldOption = !m_bGameNotLoaded ? aScreens[m_nCurrScreen].m_ParentEntry[1] : aScreens[m_nCurrScreen].m_ParentEntry[0];
+
if (oldScreen != -1) {
- if ((m_nCurrScreen == MENUPAGE_SKIN_SELECT) && strcmp(m_aSkinName, m_PrefsSkinFile) != 0) {
- CWorld::Players[0].SetPlayerSkin(m_PrefsSkinFile);
- }
- if ((m_nCurrScreen == MENUPAGE_SOUND_SETTINGS) && (m_nPrefsAudio3DProviderIndex != -1)) {
- m_nPrefsAudio3DProviderIndex = DMAudio.GetCurrent3DProviderIndex();
- }
- if (m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) {
- m_nDisplayVideoMode = m_nPrefsVideoMode;
- }
- if (m_nCurrScreen == MENUPAGE_SKIN_SELECT) {
- CPlayerSkin::EndFrontendSkinEdit();
- }
+ ThingsToDoBeforeLeavingPage();
#ifdef PS2_LIKE_MENU
if (!bottomBarActive &&
@@ -3168,10 +3200,8 @@ CMenuManager::ProcessButtonPresses(void)
bottomBarActive = true;
} else
#endif
+ {
ChangeScreen(oldScreen, oldOption, true, true);
-
- if ((m_nPrevScreen == MENUPAGE_SKIN_SELECT) || (m_nPrevScreen == MENUPAGE_KEYBOARD_CONTROLS)) {
- m_nTotalListRow = 0;
}
// We will go back for sure at this point, why process other things?!
@@ -3512,11 +3542,16 @@ WRAPPER void CMenuManager::SwitchMenuOnAndOff() { EAXJMP(0x488790); }
#else
void CMenuManager::SwitchMenuOnAndOff()
{
- if (!!(CPad::GetPad(0)->NewState.Start && !CPad::GetPad(0)->OldState.Start)
- || m_bShutDownFrontEndRequested || m_bStartUpFrontEndRequested) {
+ bool menuWasActive = !!m_bMenuActive;
- if (!m_bMenuActive)
- m_bMenuActive = true;
+ // Reminder: You need REGISTER_START_BUTTON defined to make it work.
+ if (CPad::GetPad(0)->GetStartJustDown()
+#ifdef FIX_BUGS
+ && !m_bGameNotLoaded
+#endif
+ || m_bShutDownFrontEndRequested || m_bStartUpFrontEndRequested) {
+
+ m_bMenuActive = !m_bMenuActive;
if (m_bShutDownFrontEndRequested)
m_bMenuActive = false;
@@ -3525,8 +3560,13 @@ void CMenuManager::SwitchMenuOnAndOff()
if (m_bMenuActive) {
CTimer::StartUserPause();
- }
- else {
+ } else {
+#ifdef PS2_LIKE_MENU
+ bottomBarActive = false;
+#endif
+#ifdef FIX_BUGS
+ ThingsToDoBeforeLeavingPage();
+#endif
ShutdownJustMenu();
SaveSettings();
m_bStartUpFrontEndRequested = false;
@@ -3553,7 +3593,7 @@ void CMenuManager::SwitchMenuOnAndOff()
PcSaveHelper.PopulateSlotInfo();
m_nCurrOption = 0;
}
-/* // Unused?
+/* // PS2 leftover?
if (m_nCurrScreen != MENUPAGE_SOUND_SETTINGS && gMusicPlaying)
{
DMAudio.StopFrontEndTrack();
@@ -3561,8 +3601,8 @@ void CMenuManager::SwitchMenuOnAndOff()
gMusicPlaying = 0;
}
*/
- if (!m_bMenuActive)
- m_bMenuNotProcessed = true;
+ if (m_bMenuActive != menuWasActive)
+ m_bMenuStateChanged = true;
m_bStartUpFrontEndRequested = false;
m_bShutDownFrontEndRequested = false;
diff --git a/src/core/Frontend.h b/src/core/Frontend.h
index 6d7327d3..3dbed164 100644
--- a/src/core/Frontend.h
+++ b/src/core/Frontend.h
@@ -403,7 +403,7 @@ public:
int32 m_nHelperTextMsgId;
bool m_bLanguageLoaded;
bool m_bMenuActive;
- bool m_bMenuNotProcessed;
+ bool m_bMenuStateChanged;
bool m_bWaitingForNewKeyBind;
bool m_bStartGameLoading;
bool m_bFirstTime;
@@ -540,8 +540,14 @@ public:
void WaitForUserCD();
void PrintController();
- // New content:
- uint8 GetNumberOfMenuOptions();
+ // New (not in function or inlined in the game)
+ void ThingsToDoBeforeLeavingPage();
+ void ScrollUpListByOne();
+ void ScrollDownListByOne();
+ void PageUpList(bool);
+ void PageDownList(bool);
+
+ // uint8 GetNumberOfMenuOptions();
};
static_assert(sizeof(CMenuManager) == 0x564, "CMenuManager: error");
diff --git a/src/core/Timer.h b/src/core/Timer.h
index 89c4a430..ef525be7 100644
--- a/src/core/Timer.h
+++ b/src/core/Timer.h
@@ -2,7 +2,7 @@
class CTimer
{
-public:
+
static uint32 &m_snTimeInMilliseconds;
static uint32 &m_snTimeInMillisecondsPauseMode;
static uint32 &m_snTimeInMillisecondsNonClipped;
@@ -11,19 +11,20 @@ public:
static float &ms_fTimeScale;
static float &ms_fTimeStep;
static float &ms_fTimeStepNonClipped;
+public:
static bool &m_UserPause;
static bool &m_CodePause;
- static float GetTimeStep(void) { return ms_fTimeStep; }
+ static const float &GetTimeStep(void) { return ms_fTimeStep; }
static void SetTimeStep(float ts) { ms_fTimeStep = ts; }
static float GetTimeStepInSeconds() { return ms_fTimeStep / 50.0f; }
static float GetTimeStepInMilliseconds() { return ms_fTimeStep / 50.0f * 1000.0f; }
- static float GetTimeStepNonClipped(void) { return ms_fTimeStepNonClipped; }
+ static const float &GetTimeStepNonClipped(void) { return ms_fTimeStepNonClipped; }
static float GetTimeStepNonClippedInSeconds(void) { return ms_fTimeStepNonClipped / 50.0f; }
static void SetTimeStepNonClipped(float ts) { ms_fTimeStepNonClipped = ts; }
- static uint32 GetFrameCounter(void) { return m_FrameCounter; }
+ static const uint32 &GetFrameCounter(void) { return m_FrameCounter; }
static void SetFrameCounter(uint32 fc) { m_FrameCounter = fc; }
- static uint32 GetTimeInMilliseconds(void) { return m_snTimeInMilliseconds; }
+ static const uint32 &GetTimeInMilliseconds(void) { return m_snTimeInMilliseconds; }
static void SetTimeInMilliseconds(uint32 t) { m_snTimeInMilliseconds = t; }
static uint32 GetTimeInMillisecondsNonClipped(void) { return m_snTimeInMillisecondsNonClipped; }
static void SetTimeInMillisecondsNonClipped(uint32 t) { m_snTimeInMillisecondsNonClipped = t; }
@@ -31,7 +32,7 @@ public:
static void SetTimeInMillisecondsPauseMode(uint32 t) { m_snTimeInMillisecondsPauseMode = t; }
static uint32 GetPreviousTimeInMilliseconds(void) { return m_snPreviousTimeInMilliseconds; }
static void SetPreviousTimeInMilliseconds(uint32 t) { m_snPreviousTimeInMilliseconds = t; }
- static float GetTimeScale(void) { return ms_fTimeScale; }
+ static const float &GetTimeScale(void) { return ms_fTimeScale; }
static void SetTimeScale(float ts) { ms_fTimeScale = ts; }
static bool GetIsPaused() { return m_UserPause || m_CodePause; }
diff --git a/src/core/config.h b/src/core/config.h
index eb8d41c7..8b7b5a18 100644
--- a/src/core/config.h
+++ b/src/core/config.h
@@ -101,6 +101,8 @@ enum Config {
NUMPEDGROUPS = 31,
NUMMODELSPERPEDGROUP = 8,
+ NUMROADBLOCKS = 600,
+
NUMVISIBLEENTITIES = 2000,
NUMINVISIBLEENTITIES = 150,
@@ -169,10 +171,11 @@ enum Config {
#endif
#define FIX_BUGS // fixes bugs that we've came across during reversing, TODO: use this more
-#define TOGGLEABLE_BETA_FEATURES // toggleable from debug menu. doesn't have too many things
+#define TOGGLEABLE_BETA_FEATURES // toggleable from debug menu. not too many things
// Pad
#define KANGAROO_CHEAT
+#define REGISTER_START_BUTTON // currently only in menu sadly. resumes the game
// Hud, frontend and radar
#define ASPECT_RATIO_SCALE // Not just makes everything scale with aspect ratio, also adds support for all aspect ratios
@@ -199,7 +202,7 @@ enum Config {
// Peds
#define ANIMATE_PED_COL_MODEL
#define VC_PED_PORTS // various ports from VC's CPed, mostly subtle
-#define NEW_WALK_AROUND_ALGORITHM // to make walking around vehicles/objects less awkward
+// #define NEW_WALK_AROUND_ALGORITHM // to make walking around vehicles/objects less awkward
#define CANCELLABLE_CAR_ENTER
#define IMPROVED_CAMERA // Better Debug cam, and maybe more in the future