summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFire_Head <Fire-Head@users.noreply.github.com>2019-06-17 12:37:59 +0200
committerGitHub <noreply@github.com>2019-06-17 12:37:59 +0200
commit0bb8bf9d1505792a0fd4f9872fd57fca8f197d13 (patch)
treecc2c85e0ccf486546de22074639d0e8fbe032f65
parentMerge pull request #7 from GTAmodding/master (diff)
parentMerge pull request #20 from gennariarmando/master (diff)
downloadre3-0bb8bf9d1505792a0fd4f9872fd57fca8f197d13.tar
re3-0bb8bf9d1505792a0fd4f9872fd57fca8f197d13.tar.gz
re3-0bb8bf9d1505792a0fd4f9872fd57fca8f197d13.tar.bz2
re3-0bb8bf9d1505792a0fd4f9872fd57fca8f197d13.tar.lz
re3-0bb8bf9d1505792a0fd4f9872fd57fca8f197d13.tar.xz
re3-0bb8bf9d1505792a0fd4f9872fd57fca8f197d13.tar.zst
re3-0bb8bf9d1505792a0fd4f9872fd57fca8f197d13.zip
-rw-r--r--.appveyor.yml7
-rw-r--r--README.md54
-rw-r--r--premake5.lua25
-rw-r--r--src/Camera.cpp12
-rw-r--r--src/Camera.h3
-rw-r--r--src/Clock.cpp2
-rw-r--r--src/ControllerConfig.cpp10
-rw-r--r--src/ControllerConfig.h16
-rw-r--r--src/CullZones.cpp23
-rw-r--r--src/CullZones.h1
-rw-r--r--src/Frontend.cpp49
-rw-r--r--src/Frontend.h96
-rw-r--r--src/Game.cpp6
-rw-r--r--src/Game.h6
-rw-r--r--src/General.h2
-rw-r--r--src/Messages.cpp9
-rw-r--r--src/Messages.h38
-rw-r--r--src/PCSave.cpp2
-rw-r--r--src/PCSave.h2
-rw-r--r--src/Pad.cpp232
-rw-r--r--src/Pad.h368
-rw-r--r--src/PedStat.h17
-rw-r--r--src/Radar.cpp43
-rw-r--r--src/Radar.h10
-rw-r--r--src/RwHelper.h3
-rw-r--r--src/Stats.cpp3
-rw-r--r--src/Stats.h3
-rw-r--r--src/Timer.cpp36
-rw-r--r--src/Timer.h11
-rw-r--r--src/TxdStore.cpp51
-rw-r--r--src/TxdStore.h11
-rw-r--r--src/Wanted.cpp3
-rw-r--r--src/Wanted.h85
-rw-r--r--src/World.cpp5
-rw-r--r--src/World.h5
-rw-r--r--src/audio/AudioScriptObject.cpp4
-rw-r--r--src/audio/AudioScriptObject.h2
-rw-r--r--src/audio/DMAudio.cpp10
-rw-r--r--src/audio/DMAudio.h187
-rw-r--r--src/audio/MusicManager.cpp136
-rw-r--r--src/audio/MusicManager.h267
-rw-r--r--src/audio/SampleManager.cpp9
-rw-r--r--src/audio/SampleManager.h11
-rw-r--r--src/common.h47
-rw-r--r--src/control/Darkel.cpp7
-rw-r--r--src/control/Darkel.h4
-rw-r--r--src/control/Garages.cpp64
-rw-r--r--src/control/Garages.h18
-rw-r--r--src/control/Population.cpp2
-rw-r--r--src/control/Population.h2
-rw-r--r--src/control/Record.cpp4
-rw-r--r--src/control/Record.h4
-rw-r--r--src/control/Replay.cpp2
-rw-r--r--src/control/Replay.h7
-rw-r--r--src/control/Script.cpp3
-rw-r--r--src/control/Script.h35
-rw-r--r--src/entities/Ped.cpp242
-rw-r--r--src/entities/Ped.h92
-rw-r--r--src/entities/PedIK.cpp7
-rw-r--r--src/entities/PedIK.h33
-rw-r--r--src/entities/PlayerInfo.cpp3
-rw-r--r--src/entities/PlayerInfo.h74
-rw-r--r--src/entities/PlayerPed.h36
-rw-r--r--src/entities/Vehicle.cpp10
-rw-r--r--src/entities/Vehicle.h10
-rw-r--r--src/main.cpp36
-rw-r--r--src/modelinfo/ModelIndices.h122
-rw-r--r--src/modelinfo/PedModelInfo.h3
-rw-r--r--src/render/Draw.cpp18
-rw-r--r--src/render/Draw.h7
-rw-r--r--src/render/Hud.cpp1280
-rw-r--r--src/render/Hud.h89
-rw-r--r--src/render/Particle.cpp206
-rw-r--r--src/render/Particle.h54
-rw-r--r--src/render/ParticleMgr.cpp20
-rw-r--r--src/render/ParticleMgr.h64
-rw-r--r--src/render/VisibilityPlugins.cpp8
-rw-r--r--src/render/VisibilityPlugins.h1
-rw-r--r--src/skel/events.cpp18
-rw-r--r--src/skel/win/win.cpp46
80 files changed, 3839 insertions, 714 deletions
diff --git a/.appveyor.yml b/.appveyor.yml
index 6e9b3867..d3f57374 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -1,5 +1,7 @@
image: Visual Studio 2017
-configuration: ReleaseCI
+configuration:
+ - DebugCI
+ - ReleaseCI
platform:
- Win32
environment:
@@ -14,4 +16,5 @@ build:
project: c:\projects\re3\build\re3.sln
verbosity: minimal
artifacts:
- - path: bin/ReleaseCI/re3.dll
+ path: bin/%CONFIGURATION%/re3.dll
+
diff --git a/README.md b/README.md
index 19a9ae08..d2dcb4ac 100644
--- a/README.md
+++ b/README.md
@@ -4,8 +4,12 @@ The aim of this project is to reverse GTA III for PC by replacing
parts of the game [one by one](https://en.wikipedia.org/wiki/Ship_of_Theseus)
such that we have a working game at all times.
-Apparently you can download a binary of the latest version
-[here](https://ci.appveyor.com/api/projects/aap/re3/artifacts/bin%2FReleaseCI%2Fre3.dll?branch=master).
+Apparently you can download a binary of the latest version here:
+[Debug](https://ci.appveyor.com/api/projects/aap/re3/artifacts/bin/DebugCI/re3.dll?branch=master&job=Configuration%3A+DebugCI),
+[Release](https://ci.appveyor.com/api/projects/aap/re3/artifacts/bin/ReleaseCI/re3.dll?branch=master&job=Configuration%3A+ReleaseCI).
+
+Build status:
+[![Build status](https://ci.appveyor.com/api/projects/status/hyiwgegks122h8jg?svg=true)](https://ci.appveyor.com/project/aap/re3/branch/master)
Re3 starts the script main_freeroam.scm by default. Make sure you copy it to your data directory.
@@ -20,6 +24,7 @@ to reverse at the time, calling the original functions is acceptable.
This is a list of some things that have been reversed to some non-trivial extent.
Not everything is listed, check the code.
+(TODO: keep this list at least a bit up to date...)
```
CPool
@@ -48,6 +53,11 @@ CPathFind
CCam
CParticle
CParticleMgr
+CPointLights
+CCoronas
+CAntennas
+CClouds
+CHud
```
# Low hanging fruit
@@ -75,9 +85,12 @@ functionname(args)
if(a == b){
s1;
s2;
+ }else{
+ s3;
+ s4;
}
if(x != y)
- s3;
+ s5;
}
type functionname(args)
@@ -85,9 +98,12 @@ type functionname(args)
if (a == b) {
s1;
s2;
+ } else {
+ s3;
+ s4;
}
if (x != y)
- s3;
+ s5;
}
```
@@ -101,14 +117,31 @@ type functionname ( args )
s1;
s2;
}
- if ( x != y )
+ else
{
s3;
+ s4;
+ }
+ if ( x != y )
+ {
+ s5;
}
}
```
-Indentation is done with TABS.
+i.e.
+
+* Put the brace on the same line as control statements
+
+* Put the brace on the next line after function definitions and structs/classes
+
+* Put an `else` on the same line with the braces
+
+* Don't put braces around single statements
+
+* Put the function return type on a separate line
+
+* Indent with TABS
As for the less cosmetic choices, here are some guidelines how the code should look:
@@ -128,6 +161,8 @@ since `4` will be used in other places and you can't easily see where else the e
* don't even think about using win32 types (`BYTE`, `WORD`, &c.) unless you're writing win32 specific code
+ * declare pointers like `int *ptr;`, not `int* ptr;`
+
* As for variable names, the original gta source code was not written in a uniform style,
but here are some observations:
@@ -142,3 +177,10 @@ but here are some observations:
* do *not* use `dw` for `DWORD` or so, we're not programming win32
* Generally, try to make the code look as if R* could have written it
+
+# Environment Variables
+Here you can find a list of variables that you might need to set in windows:
+```
+"GTA_III_RE_DIR" * path to "gta3_re" game folder usually where this plugin run.
+"GTA_III_DIR)" * path to "GTAIII" game folder.
+```
diff --git a/premake5.lua b/premake5.lua
index 68a08a1a..cbd4c7f9 100644
--- a/premake5.lua
+++ b/premake5.lua
@@ -1,5 +1,5 @@
workspace "re3"
- configurations { "ReleaseCI", "Release", "ReleaseFH", "Debug" }
+ configurations { "DebugCI", "ReleaseCI", "Release", "ReleaseFH", "Debug" }
location "build"
files { "src/*.*" }
@@ -42,9 +42,9 @@ project "re3"
defines { "DEBUG" }
staticruntime "on"
symbols "On"
- debugdir "C:/Users/aap/games/gta3_re"
- debugcommand "C:/Users/aap/games/gta3_re/gta3.exe"
- postbuildcommands "copy /y \"$(TargetPath)\" \"C:\\Users\\aap\\games\\gta3_re\\plugins\\re3.dll\""
+ debugdir "$(GTA_III_RE_DIR)"
+ debugcommand "$(GTA_III_RE_DIR)/gta3.exe"
+ postbuildcommands "copy /y \"$(TargetPath)\" \"$(GTA_III_RE_DIR)\\plugins\\re3.dll\""
filter "configurations:Release"
defines { "NDEBUG" }
@@ -52,22 +52,21 @@ project "re3"
staticruntime "on"
debugdir "C:/Users/aap/games/gta3_re"
debugcommand "C:/Users/aap/games/gta3_re/gta3.exe"
- postbuildcommands "copy /y \"$(TargetPath)\" \"C:\\Users\\aap\\games\\gta3_re\\plugins\\re3.dll\""
+ postbuildcommands "copy /y \"$(TargetPath)\" \"$(GTA_III_RE_DIR)\\plugins\\re3.dll\""
filter "configurations:ReleaseFH"
defines { "NDEBUG" }
symbols "Full"
optimize "off"
staticruntime "on"
- debugdir "F:/Rockstar Games/GTAIII"
- debugcommand "F:/Rockstar Games/GTAIII/gta3.exe"
+ debugdir "$(GTA_III_DIR)"
+ debugcommand "$(GTA_III_DIR)/gta3.exe"
targetextension ".asi"
- targetdir "F:/Rockstar Games/GTAIII/scripts"
+ targetdir "$(GTA_III_DIR)/scripts"
+ filter "configurations:DebugCI"
+ defines { "DEBUG" }
+ symbols "On"
+ staticruntime "on"
filter "configurations:ReleaseCI"
defines { "NDEBUG" }
optimize "On"
staticruntime "on"
- filter "configurations:DebugCI"
- defines { "DEBUG" }
- staticruntime "on"
- symbols "On"
-
diff --git a/src/Camera.cpp b/src/Camera.cpp
index 6054f1fc..1b4b1db6 100644
--- a/src/Camera.cpp
+++ b/src/Camera.cpp
@@ -14,8 +14,7 @@
const float DefaultFOV = 80.0f; // actually 70.0f
CCamera &TheCamera = *(CCamera*)0x6FACF8;
-
-WRAPPER Bool CCam::Using3rdPersonMouseCam() { EAXJMP(0x457460); }
+bool &CCamera::m_bUseMouse3rdPerson = *(bool *)0x5F03D8;
WRAPPER void CCamera::DrawBordersForWideScreen(void) { EAXJMP(0x46B430); }
@@ -1250,6 +1249,15 @@ CCam::FixCamWhenObscuredByVehicle(const CVector &TargetCoors)
Source.z += HeightFixerCarsObscuring;
}
+bool CCam::Using3rdPersonMouseCam()
+{
+ return CCamera::m_bUseMouse3rdPerson &&
+ (Mode == MODE_FOLLOWPED ||
+ TheCamera.m_bPlayerIsInGarage &&
+ FindPlayerPed() && FindPlayerPed()->m_nPedState != PED_DRIVING &&
+ Mode != MODE_TOPDOWN1 && this->CamTargetEntity == FindPlayerPed());
+}
+
STARTPATCHES
InjectHook(0x42C760, &CCamera::IsSphereVisible, PATCH_JUMP);
InjectHook(0x46FD00, &CCamera::SetFadeColour, PATCH_JUMP);
diff --git a/src/Camera.h b/src/Camera.h
index 73fce616..1f9a287c 100644
--- a/src/Camera.h
+++ b/src/Camera.h
@@ -161,7 +161,6 @@ struct CCam
CPed *m_pLastPedLookedAt;// So interpolation works
bool m_bFirstPersonRunAboutActive;
- Bool Using3rdPersonMouseCam();
void GetVectorsReadyForRW(void);
CVector DoAverageOnVector(const CVector &vec);
@@ -172,6 +171,7 @@ struct CCam
bool FixCamIfObscured(CVector &TargetCoors, float TargetHeight, float TargetOrientation);
void Cam_On_A_String_Unobscured(const CVector &TargetCoors, float BaseDist);
void FixCamWhenObscuredByVehicle(const CVector &TargetCoors);
+ bool Using3rdPersonMouseCam();
void Process_Debug(float *vec, float a, float b, float c);
void Process_FollowPed(const CVector &CameraTarget, float TargetOrientation, float, float);
@@ -439,6 +439,7 @@ int m_iModeObbeCamIsInForCar;
uint32 m_uiFadeTimeStarted;
uint32 m_uiFadeTimeStartedMusic;
+ static bool &m_bUseMouse3rdPerson;
CMatrix &GetCameraMatrix(void) { return m_cameraMatrix; }
CVector &GetGameCamPosition(void) { return m_vecGameCamPos; }
diff --git a/src/Clock.cpp b/src/Clock.cpp
index dd7b99fe..707b0e57 100644
--- a/src/Clock.cpp
+++ b/src/Clock.cpp
@@ -6,7 +6,7 @@
#include "Stats.h"
_TODO("gbFastTime");
-Bool &gbFastTime = *(Bool*)0x95CDBB;
+bool &gbFastTime = *(bool*)0x95CDBB;
uint8 &CClock::ms_nGameClockHours = *(uint8*)0x95CDA6;
uint8 &CClock::ms_nGameClockMinutes = *(uint8*)0x95CDC8;
diff --git a/src/ControllerConfig.cpp b/src/ControllerConfig.cpp
index cd38049e..a401e093 100644
--- a/src/ControllerConfig.cpp
+++ b/src/ControllerConfig.cpp
@@ -16,19 +16,19 @@ WRAPPER void CControllerConfigManager::AffectControllerStateOn_ButtonUp(int butt
WRAPPER void CControllerConfigManager::MakeControllerActionsBlank() { EAXJMP(0x58B7A0); }
WRAPPER void CControllerConfigManager::InitDefaultControlConfiguration() { EAXJMP(0x58B930); }
WRAPPER void CControllerConfigManager::InitDefaultControlConfigMouse(CMouseControllerState const &mousestate) { EAXJMP(0x58BD00); }
-WRAPPER Int32 CControllerConfigManager::GetJoyButtonJustDown() { EAXJMP(0x58B7D0); }
+WRAPPER int32 CControllerConfigManager::GetJoyButtonJustDown() { EAXJMP(0x58B7D0); }
WRAPPER void CControllerConfigManager::InitDefaultControlConfigJoyPad(unsigned int buttons) { EAXJMP(0x58BD90); }
WRAPPER void CControllerConfigManager::ClearSimButtonPressCheckers() { EAXJMP(0x58D220); }
WRAPPER void CControllerConfigManager::AffectPadFromKeyBoard() { EAXJMP(0x58D0C0); }
WRAPPER void CControllerConfigManager::AffectPadFromMouse() { EAXJMP(0x58D1A0); }
-void CControllerConfigManager::LoadSettings(Int32 file)
+void CControllerConfigManager::LoadSettings(int32 file)
{
- Bool bValid = true;
+ bool bValid = true;
if ( file )
{
- Char buff[29];
+ char buff[29];
CFileMgr::Read(file, buff, sizeof(buff));
if ( !strncmp(buff, "THIS FILE IS NOT VALID YET", sizeof(buff) - 3) )
@@ -45,7 +45,7 @@ void CControllerConfigManager::LoadSettings(Int32 file)
{
for ( int j = 0; j < 41; j++ )
{
- CFileMgr::Read(file, (Char *)&ControlsManager.m_aSettings[j][i], sizeof(tControllerConfigBind));
+ CFileMgr::Read(file, (char *)&ControlsManager.m_aSettings[j][i], sizeof(tControllerConfigBind));
}
}
}
diff --git a/src/ControllerConfig.h b/src/ControllerConfig.h
index 01d34b3c..00cab82e 100644
--- a/src/ControllerConfig.h
+++ b/src/ControllerConfig.h
@@ -19,19 +19,19 @@ public:
struct tControllerConfigBind
{
RsKeyCodes m_Key;
- Int32 m_ContSetOrder;
+ int32 m_ContSetOrder;
};
- Bool field_0;
+ bool field_0;
char _pad0[3];
DIJOYSTATE2 m_OldState;
DIJOYSTATE2 m_NewState;
- WChar m_aActionNames[41][40];
- Bool m_aButtonStates[17];
+ wchar m_aActionNames[41][40];
+ bool m_aButtonStates[17];
char _pad1[3];
tControllerConfigBind m_aSettings[41][4];
- UInt8 m_aSimCheckers[4][4];
- Bool m_bMouseAssociated;
+ uint8 m_aSimCheckers[4][4];
+ bool m_bMouseAssociated;
char _pad2[3];
void UpdateJoyButtonState(int padnumber);
@@ -40,8 +40,8 @@ public:
void UpdateJoyInConfigMenus_ButtonUp(int button, int padnumber);
void AffectControllerStateOn_ButtonUp(int button, int padnumber);
- Int32 GetJoyButtonJustDown();
- void LoadSettings(Int32 file);
+ int32 GetJoyButtonJustDown();
+ void LoadSettings(int32 file);
void MakeControllerActionsBlank();
void InitDefaultControlConfiguration();
void InitDefaultControlConfigMouse(CMouseControllerState const &mousestate);
diff --git a/src/CullZones.cpp b/src/CullZones.cpp
index dc30790b..76052351 100644
--- a/src/CullZones.cpp
+++ b/src/CullZones.cpp
@@ -6,6 +6,7 @@
#include "Timer.h"
#include "Camera.h"
#include "World.h"
+#include "FileMgr.h"
#include "CullZones.h"
int32 &CCullZones::NumCullZones = *(int*)0x8F2564;
@@ -46,6 +47,27 @@ CCullZones::Init(void)
}
void
+CCullZones::ResolveVisibilities(void)
+{
+ int fd;
+
+ CFileMgr::SetDir("");
+ fd = CFileMgr::OpenFile("DATA\\cullzone.dat", "rb");
+ if(fd > 0){
+ CFileMgr::Read(fd, (char*)&NumCullZones, 4);
+ CFileMgr::Read(fd, (char*)aZones, NUMCULLZONES*sizeof(CCullZone));
+ CFileMgr::Read(fd, (char*)&NumAttributeZones, 4);
+ CFileMgr::Read(fd, (char*)aAttributeZones, NUMATTRIBZONES*sizeof(CAttributeZone));
+ CFileMgr::Read(fd, (char*)aIndices, NUMZONEINDICES*2);
+ CFileMgr::Read(fd, (char*)aPointersToBigBuildingsForBuildings, NUMBUILDINGS*2);
+ CFileMgr::Read(fd, (char*)aPointersToBigBuildingsForTreadables, NUMTREADABLES*2);
+ CFileMgr::CloseFile(fd);
+ }else{
+ // TODO: implement code from mobile to generate data here
+ }
+}
+
+void
CCullZones::Update(void)
{
bool invisible;
@@ -311,6 +333,7 @@ CCullZone::DoStuffEnteringZone_OneTreadable(uint16 i)
STARTPATCHES
InjectHook(0x524BC0, &CCullZones::Init, PATCH_JUMP);
+ InjectHook(0x524EC0, &CCullZones::ResolveVisibilities, PATCH_JUMP);
InjectHook(0x524F80, &CCullZones::Update, PATCH_JUMP);
InjectHook(0x525370, &CCullZones::AddCullZone, PATCH_JUMP);
InjectHook(0x5250D0, &CCullZones::ForceCullZoneCoors, PATCH_JUMP);
diff --git a/src/CullZones.h b/src/CullZones.h
index 4641f6ad..5b04b4f9 100644
--- a/src/CullZones.h
+++ b/src/CullZones.h
@@ -71,6 +71,7 @@ public:
static bool &bCullZonesDisabled;
static void Init(void);
+ static void ResolveVisibilities(void);
static void Update(void);
static void ForceCullZoneCoors(CVector coors);
static int32 FindCullZoneForCoors(CVector coors);
diff --git a/src/Frontend.cpp b/src/Frontend.cpp
index 35e48065..b8ee10f4 100644
--- a/src/Frontend.cpp
+++ b/src/Frontend.cpp
@@ -2,15 +2,30 @@
#include "patcher.h"
#include "Frontend.h"
-int &CMenuManager::OS_Language = *(int*)0x5F2F78;
-int &CMenuManager::m_PrefsBrightness = *(int*)0x5F2E50;
-int &CMenuManager::m_PrefsLanguage = *(int*)0x941238;
-bool &CMenuManager::m_PrefsUseWideScreen = *(bool*)0x95CD23;
-Bool &CMenuManager::m_PrefsVsync = *(Bool*)0x5F2E58;
-Bool &CMenuManager::m_PrefsAllowNastyGame = *(Bool*)0x5F2E64;
-Bool &CMenuManager::m_bStartUpFrontEndRequested = *(Bool*)0x95CCF4;
-Bool &CMenuManager::m_PrefsFrameLimiter = *(Bool*)0x5F2E60;
-Bool &CMenuManager::m_PrefsUseVibration = *(Bool*)0x95CD92;
+int32 &CMenuManager::OS_Language = *(int32*)0x5F2F78;
+int8 &CMenuManager::m_PrefsUseVibration = *(int8*)0x95CD92;
+int8 &CMenuManager::m_DisplayControllerOnFoot = *(int8*)0x95CD8D;
+int8 &CMenuManager::m_PrefsVsync = *(int8*)0x5F2E58;
+int8 &CMenuManager::m_PrefsVsyncDisp = *(int8*)0x5F2E5C;
+int8 &CMenuManager::m_PrefsFrameLimiter = *(int8*)0x5F2E60;
+int8 &CMenuManager::BlurOn = *(int8*)0x95CDAD;
+int8 &CMenuManager::m_PrefsShowSubtitles = *(int8*)0x5F2E54;
+int8 &CMenuManager::m_PrefsSpeakers = *(int8*)0x95CD7E;
+int8 &CMenuManager::m_ControlMethod = *(int8*)0x8F5F7C;
+int8 &CMenuManager::m_PrefsDMA = *(int8*)0x5F2F74;
+int8 &CMenuManager::m_PrefsLanguage = *(int8*)0x941238;
+
+bool &CMenuManager::m_PrefsAllowNastyGame = *(bool*)0x5F2E64;
+bool &CMenuManager::m_bStartUpFrontEndRequested = *(bool*)0x95CCF4;
+
+int8 &CMenuManager::m_PrefsUseWideScreen = *(int8*)0x95CD23;
+int8 &CMenuManager::m_PrefsRadioStation = *(int8*)0x95CDA4;
+int8 &CMenuManager::m_bDisableMouseSteering = *(int8*)0x60252C;
+int32 &CMenuManager::m_PrefsBrightness = *(int32*)0x5F2E50;
+float &CMenuManager::m_PrefsLOD = *(float*)0x8F42C4;
+int8 &CMenuManager::m_bFrontEnd_ReloadObrTxtGxt = *(int8*)0x628CFC;
+int32 &CMenuManager::m_PrefsMusicVolume = *(int32*)0x5F2E4C;
+int32 &CMenuManager::m_PrefsSfxVolume = *(int32*)0x5F2E48;
CMenuManager &FrontEndMenuManager = *(CMenuManager*)0x8F59D8;
@@ -20,3 +35,19 @@ WRAPPER void CMenuManager::UnloadTextures(void) { EAXJMP(0x47A440); }
WRAPPER void CMenuManager::LoadAllTextures(void) { EAXJMP(0x47A230); }
WRAPPER void CMenuManager::LoadSettings(void) { EAXJMP(0x488EE0); }
WRAPPER void CMenuManager::WaitForUserCD(void) { EAXJMP(0x48ADD0); }
+
+int CMenuManager::FadeIn(int alpha) {
+ if (m_nCurrScreen == MENU_LOADING_IN_PROGRESS ||
+ m_nCurrScreen == MENU_SAVING_IN_PROGRESS ||
+ m_nCurrScreen == MENU_DELETING)
+ return alpha;
+
+ if (m_nMenuFadeAlpha >= alpha)
+ return alpha;
+
+ return m_nMenuFadeAlpha;
+}
+
+STARTPATCHES
+ InjectHook(0x48AC60, &CMenuManager::FadeIn, PATCH_JUMP);
+ENDPATCHES \ No newline at end of file
diff --git a/src/Frontend.h b/src/Frontend.h
index 65b8c29a..2e95d582 100644
--- a/src/Frontend.h
+++ b/src/Frontend.h
@@ -10,6 +10,68 @@ enum {
LANGUAGE_SPANISH,
};
+enum eMenuScreen {
+ MENU_NONE = 0,
+ MENU_STATS = 1,
+ MENU_NEW_GAME = 2,
+ MENU_BRIEFS = 3,
+ MENU_CONTROLLER_SETTINGS = 4,
+ MENU_SOUND_SETTINGS = 5,
+ MENU_GRAPHICS_SETTINGS = 6,
+ MENU_LANGUAGE_SETTINGS = 7,
+ MENU_CHOOSE_LOAD_SLOT = 8,
+ MENU_CHOOSE_DELETE_SLOT = 9,
+ MENU_NEW_GAME_RELOAD = 10,
+ MENU_LOAD_SLOT_CONFIRM = 11,
+ MENU_DELETE_SLOT_CONFIRM = 12,
+ MENU_13 = 13,
+ MENU_LOADING_IN_PROGRESS = 14,
+ MENU_DELETING_IN_PROGRESS = 15,
+ MENU_16 = 16,
+ MENU_DELETE_FAILED = 17,
+ MENU_DEBUG_MENU = 18,
+ MENU_MEMORY_CARD_1 = 19,
+ MENU_MEMORY_CARD_2 = 20,
+ MENU_MULTIPLAYER_MAIN = 21,
+ MENU_SAVE_FAILED_1 = 22,
+ MENU_SAVE_FAILED_2 = 23,
+ MENU_SAVE = 24,
+ MENU_NO_MEMORY_CARD = 25,
+ MENU_CHOOSE_SAVE_SLOT = 26,
+ MENU_SAVE_OVERWRITE_CONFIRM = 27,
+ MENU_MULTIPLAYER_MAP = 28,
+ MENU_MULTIPLAYER_CONNECTION = 29,
+ MENU_MULTIPLAYER_FIND_GAME = 30,
+ MENU_MULTIPLAYER_MODE = 31,
+ MENU_MULTIPLAYER_CREATE = 32,
+ MENU_MULTIPLAYER_START = 33,
+ MENU_SKIN_SELECT_OLD = 34,
+ MENU_CONTROLLER_PC = 35,
+ MENU_CONTROLLER_PC_OLD1 = 36,
+ MENU_CONTROLLER_PC_OLD2 = 37,
+ MENU_CONTROLLER_PC_OLD3 = 38,
+ MENU_CONTROLLER_PC_OLD4 = 39,
+ MENU_CONTROLLER_DEBUG = 40,
+ MENU_OPTIONS = 41,
+ MENU_EXIT = 42,
+ MENU_SAVING_IN_PROGRESS = 43,
+ MENU_SAVE_SUCCESSFUL = 44,
+ MENU_DELETING = 45,
+ MENU_DELETE_SUCCESS = 46,
+ MENU_SAVE_FAILED = 47,
+ MENU_LOAD_FAILED = 48,
+ MENU_LOAD_FAILED_2 = 49,
+ MENU_FILTER_GAME = 50,
+ MENU_START_MENU = 51,
+ MENU_PAUSE_MENU = 52,
+ MENU_CHOOSE_MODE = 53,
+ MENU_SKIN_SELECT = 54,
+ MENU_KEYBOARD_CONTROLS = 55,
+ MENU_MOUSE_CONTROLS = 56,
+ MENU_57 = 57,
+ MENU_58 = 58,
+};
+
struct tSkinInfo
{
int field_0;
@@ -83,15 +145,29 @@ public:
int m_nCurrSaveSlot;
int m_nScreenChangeDelayTimer;
- static int &OS_Language;
- static int &m_PrefsBrightness;
- static int &m_PrefsLanguage;
- static bool &m_PrefsUseWideScreen;
- static Bool &m_PrefsVsync;
- static Bool &m_PrefsAllowNastyGame;
- static Bool &m_bStartUpFrontEndRequested;
- static Bool &m_PrefsFrameLimiter;
- static Bool &m_PrefsUseVibration;
+ static int32 &OS_Language;
+ static int8 &m_PrefsUseVibration;
+ static int8 &m_DisplayControllerOnFoot;
+ static int8 &m_PrefsUseWideScreen;
+ static int8 &m_PrefsRadioStation;
+ static int8 &m_PrefsVsync;
+ static int8 &m_PrefsVsyncDisp;
+ static int8 &m_PrefsFrameLimiter;
+ static int8 &BlurOn;
+ static int8 &m_PrefsShowSubtitles;
+ static int8 &m_PrefsSpeakers;
+ static int8 &m_ControlMethod;
+ static int8 &m_PrefsDMA;
+ static int8 &m_PrefsLanguage;
+ static int8 &m_bDisableMouseSteering;
+ static int32 &m_PrefsBrightness;
+ static float &m_PrefsLOD;
+ static int8 &m_bFrontEnd_ReloadObrTxtGxt;
+ static int32 &m_PrefsMusicVolume;
+ static int32 &m_PrefsSfxVolume;
+
+ static bool &m_PrefsAllowNastyGame;
+ static bool &m_bStartUpFrontEndRequested;
void Process(void);
void DrawFrontEnd(void);
@@ -99,7 +175,9 @@ public:
void LoadAllTextures(void);
void LoadSettings(void);
void WaitForUserCD(void);
+ int FadeIn(int alpha);
};
+
static_assert(sizeof(CMenuManager) == 0x564, "CMenuManager: error");
extern CMenuManager &FrontEndMenuManager;
diff --git a/src/Game.cpp b/src/Game.cpp
index 9da2dab7..5073eed1 100644
--- a/src/Game.cpp
+++ b/src/Game.cpp
@@ -11,11 +11,11 @@ bool &CGame::noProstitutes = *(bool*)0x95CDCF;
bool &CGame::playingIntro = *(bool*)0x95CDC2;
WRAPPER void CGame::Process(void) { EAXJMP(0x48C850); }
-WRAPPER Bool CGame::InitialiseOnceBeforeRW(void) { EAXJMP(0x48BB80); }
-WRAPPER Bool CGame::InitialiseRenderWare(void) { EAXJMP(0x48BBA0); }
+WRAPPER bool CGame::InitialiseOnceBeforeRW(void) { EAXJMP(0x48BB80); }
+WRAPPER bool CGame::InitialiseRenderWare(void) { EAXJMP(0x48BBA0); }
WRAPPER void CGame::ShutdownRenderWare(void) { EAXJMP(0x48BCB0); }
WRAPPER void CGame::FinalShutdown(void) { EAXJMP(0x48BEC0); }
WRAPPER void CGame::ShutDown(void) { EAXJMP(0x48C3A0); }
WRAPPER void CGame::ShutDownForRestart(void) { EAXJMP(0x48C6B0); }
WRAPPER void CGame::InitialiseWhenRestarting(void) { EAXJMP(0x48C740); }
-WRAPPER Bool CGame::InitialiseOnceAfterRW(void) { EAXJMP(0x48BD50); }
+WRAPPER bool CGame::InitialiseOnceAfterRW(void) { EAXJMP(0x48BD50); }
diff --git a/src/Game.h b/src/Game.h
index 279c3807..ab881484 100644
--- a/src/Game.h
+++ b/src/Game.h
@@ -20,12 +20,12 @@ public:
static bool &playingIntro;
static void Process(void);
- static Bool InitialiseOnceBeforeRW(void);
- static Bool InitialiseRenderWare(void);
+ static bool InitialiseOnceBeforeRW(void);
+ static bool InitialiseRenderWare(void);
static void ShutdownRenderWare(void);
static void FinalShutdown(void);
static void ShutDown(void);
static void ShutDownForRestart(void);
static void InitialiseWhenRestarting(void);
- static Bool InitialiseOnceAfterRW(void);
+ static bool InitialiseOnceAfterRW(void);
};
diff --git a/src/General.h b/src/General.h
index f957ab2f..41bdf5d7 100644
--- a/src/General.h
+++ b/src/General.h
@@ -47,6 +47,6 @@ public:
static float GetRandomNumberInRange(float low, float high)
{ return low + (high - low)*(GetRandomNumber()/float(MYRAND_MAX + 1)); }
- static Int32 GetRandomNumberInRange(Int32 low, Int32 high)
+ static int32 GetRandomNumberInRange(int32 low, int32 high)
{ return low + (high - low)*(GetRandomNumber()/float(MYRAND_MAX + 1)); }
};
diff --git a/src/Messages.cpp b/src/Messages.cpp
index e29300f4..7fc23593 100644
--- a/src/Messages.cpp
+++ b/src/Messages.cpp
@@ -4,3 +4,12 @@
WRAPPER void CMessages::Display(void) { EAXJMP(0x529800); }
WRAPPER void CMessages::ClearAllMessagesDisplayedByGame(void) { EAXJMP(0x52B670); }
+WRAPPER int CMessages::WideStringCopy(wchar* dst, wchar* src, unsigned short size) { EAXJMP(0x5294B0); }
+WRAPPER char CMessages::WideStringCompare(wchar* str1, wchar* str2, unsigned short size) { EAXJMP(0x529510); }
+WRAPPER void CMessages::InsertNumberInString(wchar* src, int n1, int n2, int n3, int n4, int n5, int n6, wchar* dst) { EAXJMP(0x52A1A0); }
+WRAPPER void CMessages::InsertPlayerControlKeysInString(wchar* src) { EAXJMP(0x52A490); }
+WRAPPER int CMessages::GetWideStringLength(wchar* src) { EAXJMP(0x529490); }
+
+tPreviousBrief *CMessages::PreviousBriefs = (tPreviousBrief *)0x713C08;
+tMessage *CMessages::BriefMessages = (tMessage *)0x8786E0;
+tBigMessage *CMessages::BIGMessages = (tBigMessage *)0x773628;
diff --git a/src/Messages.h b/src/Messages.h
index 711427f1..69cf117c 100644
--- a/src/Messages.h
+++ b/src/Messages.h
@@ -1,8 +1,44 @@
#pragma once
-class CMessages
+struct tMessage
{
+ wchar *m_pText;
+ uint16 m_nFlag;
+private:
+ int8 _pad6[2];
+public:
+ uint32 m_nTime;
+ uint32 m_nStartTime;
+ int32 m_nNumber[6];
+ wchar *m_pString;
+};
+
+struct tBigMessage
+{
+ tMessage m_Current;
+ tMessage m_Stack[3];
+};
+
+struct tPreviousBrief
+{
+ wchar *m_pText;
+ int32 m_nNumber[6];
+ wchar *m_pString;
+};
+
+class CMessages
+{
+public:
+ static tPreviousBrief *PreviousBriefs;
+ static tMessage *BriefMessages;
+ static tBigMessage *BIGMessages;
+
public:
static void Display(void);
static void ClearAllMessagesDisplayedByGame(void);
+ static int WideStringCopy(wchar* dst, wchar* src, unsigned short size);
+ static char WideStringCompare(wchar* str1, wchar* str2, unsigned short size);
+ static void InsertNumberInString(wchar* src, int n1, int n2, int n3, int n4, int n5, int n6, wchar* dst);
+ static void InsertPlayerControlKeysInString(wchar* src);
+ static int GetWideStringLength(wchar *src);
};
diff --git a/src/PCSave.cpp b/src/PCSave.cpp
index 8ca48437..2d49b23f 100644
--- a/src/PCSave.cpp
+++ b/src/PCSave.cpp
@@ -3,5 +3,5 @@
#include "Frontend.h"
#include "PCSave.h"
-WRAPPER void C_PcSave::SetSaveDirectory(const Char *path) { EAXJMP(0x591EA0); }
+WRAPPER void C_PcSave::SetSaveDirectory(const char *path) { EAXJMP(0x591EA0); }
diff --git a/src/PCSave.h b/src/PCSave.h
index c653fab0..324a3421 100644
--- a/src/PCSave.h
+++ b/src/PCSave.h
@@ -3,5 +3,5 @@
class C_PcSave
{
public:
- static void SetSaveDirectory(const Char *path);
+ static void SetSaveDirectory(const char *path);
}; \ No newline at end of file
diff --git a/src/Pad.cpp b/src/Pad.cpp
index a9f67b5e..ab00e88f 100644
--- a/src/Pad.cpp
+++ b/src/Pad.cpp
@@ -28,22 +28,22 @@
CPad *Pads = (CPad*)0x6F0360; // [2]
CMousePointerStateHelper &MousePointerStateHelper = *(CMousePointerStateHelper*)0x95CC8C;
-Bool &CPad::bDisplayNoControllerMessage = *(Bool *)0x95CD52;
-Bool &CPad::bObsoleteControllerMessage = *(Bool *)0x95CDB8;
-Bool &CPad::m_bMapPadOneToPadTwo = *(Bool *)0x95CD48;
+bool &CPad::bDisplayNoControllerMessage = *(bool *)0x95CD52;
+bool &CPad::bObsoleteControllerMessage = *(bool *)0x95CDB8;
+bool &CPad::m_bMapPadOneToPadTwo = *(bool *)0x95CD48;
CKeyboardState &CPad::OldKeyState = *(CKeyboardState*)0x6F1E70;
CKeyboardState &CPad::NewKeyState = *(CKeyboardState*)0x6E60D0;
CKeyboardState &CPad::TempKeyState = *(CKeyboardState*)0x774DE8;
-Char CPad::KeyBoardCheatString[18];
+char CPad::KeyBoardCheatString[18];
CMouseControllerState &CPad::OldMouseControllerState = *(CMouseControllerState*)0x8472A0;
CMouseControllerState &CPad::NewMouseControllerState = *(CMouseControllerState*)0x8809F0;
CMouseControllerState &CPad::PCTempMouseControllerState = *(CMouseControllerState*)0x6F1E60;
_TODO("gbFastTime");
-extern Bool &gbFastTime;
+extern bool &gbFastTime;
WRAPPER void WeaponCheat() { EAXJMP(0x490D90); }
WRAPPER void HealthCheat() { EAXJMP(0x490E70); }
@@ -84,10 +84,10 @@ CControllerState::Clear(void)
void CKeyboardState::Clear()
{
- for ( Int32 i = 0; i < 12; i++ )
+ for ( int32 i = 0; i < 12; i++ )
F[i] = 0;
- for ( Int32 i = 0; i < 256; i++ )
+ for ( int32 i = 0; i < 256; i++ )
VK_KEYS[i] = 0;
ESC = INS = DEL = HOME = END = PGUP = PGDN = 0;
@@ -111,7 +111,7 @@ void CKeyboardState::Clear()
LWIN = RWIN = APPS = 0;
}
-void CPad::Clear(Bool bResetPlayerControls)
+void CPad::Clear(bool bResetPlayerControls)
{
NewState.Clear();
OldState.Clear();
@@ -138,12 +138,12 @@ void CPad::Clear(Bool bResetPlayerControls)
bApplyBrakes = false;
- for ( Int32 i = 0; i < _TODOCONST(5); i++ )
+ for ( int32 i = 0; i < _TODOCONST(5); i++ )
bHornHistory[i] = false;
iCurrHornHistory = 0;
- for ( Int32 i = 0; i < _TODOCONST(12); i++ )
+ for ( int32 i = 0; i < _TODOCONST(12); i++ )
_unk[i] = ' ';
LastTimeTouched = CTimer::GetTimeInMilliseconds();
@@ -235,8 +235,8 @@ void CPad::UpdateMouse()
if ( PSGLOBAL(mouse) != NULL && SUCCEEDED(_InputGetMouseState(&state)) )
{
- Int32 signX = 1;
- Int32 signy = 1;
+ int32 signX = 1;
+ int32 signy = 1;
if ( !FrontEndMenuManager.m_bMenuActive )
{
@@ -248,8 +248,8 @@ void CPad::UpdateMouse()
PCTempMouseControllerState.Clear();
- PCTempMouseControllerState.x = (Float)(signX * state.lX);
- PCTempMouseControllerState.y = (Float)(signy * state.lY);
+ PCTempMouseControllerState.x = (float)(signX * state.lX);
+ PCTempMouseControllerState.y = (float)(signy * state.lY);
PCTempMouseControllerState.LMB = state.rgbButtons[0] & 128;
PCTempMouseControllerState.RMB = state.rgbButtons[1] & 128;
PCTempMouseControllerState.MMB = state.rgbButtons[2] & 128;
@@ -329,7 +329,7 @@ CControllerState CPad::ReconcileTwoControllersInput(CControllerState const &Stat
#undef _FIX_RECON_DIR
}
-void CPad::StartShake(Int16 nDur, UInt8 nFreq)
+void CPad::StartShake(int16 nDur, uint8 nFreq)
{
if ( !CMenuManager::m_PrefsUseVibration )
return;
@@ -351,7 +351,7 @@ void CPad::StartShake(Int16 nDur, UInt8 nFreq)
}
}
-void CPad::StartShake_Distance(Int16 nDur, UInt8 nFreq, Float fX, Float fY, Float fZ)
+void CPad::StartShake_Distance(int16 nDur, uint8 nFreq, float fX, float fY, float fZ)
{
if ( !CMenuManager::m_PrefsUseVibration )
return;
@@ -359,7 +359,7 @@ void CPad::StartShake_Distance(Int16 nDur, UInt8 nFreq, Float fX, Float fY, Floa
if ( CCutsceneMgr::IsRunning() || CGame::playingIntro )
return;
- Float fDist = ( TheCamera.GetPosition() - CVector(fX, fY, fZ) ).Magnitude();
+ float fDist = ( TheCamera.GetPosition() - CVector(fX, fY, fZ) ).Magnitude();
if ( fDist < 70.0f )
{
@@ -378,7 +378,7 @@ void CPad::StartShake_Distance(Int16 nDur, UInt8 nFreq, Float fX, Float fY, Floa
}
}
-void CPad::StartShake_Train(Float fX, Float fY)
+void CPad::StartShake_Train(float fX, float fY)
{
if ( !CMenuManager::m_PrefsUseVibration )
return;
@@ -389,11 +389,11 @@ void CPad::StartShake_Train(Float fX, Float fY)
if (FindPlayerVehicle() != NULL && FindPlayerVehicle()->IsTrain() )
return;
- Float fDist = ( TheCamera.GetPosition() - CVector(fX, fY, 0.0f) ).Magnitude2D();
+ float fDist = ( TheCamera.GetPosition() - CVector(fX, fY, 0.0f) ).Magnitude2D();
if ( fDist < 70.0f )
{
- Int32 freq = (Int32)((70.0f - fDist) * 70.0f / 70.0f + 30.0f);
+ int32 freq = (int32)((70.0f - fDist) * 70.0f / 70.0f + 30.0f);
if ( ShakeDur < 100 )
{
@@ -403,9 +403,9 @@ void CPad::StartShake_Train(Float fX, Float fY)
}
}
-void CPad::AddToPCCheatString(Char c)
+void CPad::AddToPCCheatString(char c)
{
- for ( Int32 i = ARRAY_SIZE(KeyBoardCheatString); i >= 0; i-- )
+ for ( int32 i = ARRAY_SIZE(KeyBoardCheatString); i >= 0; i-- )
KeyBoardCheatString[i + 1] = KeyBoardCheatString[i];
KeyBoardCheatString[0] = c;
@@ -515,7 +515,7 @@ void CPad::AddToPCCheatString(Char c)
void CPad::UpdatePads(void)
{
- Bool bUpdate = true;
+ bool bUpdate = true;
GetPad(0)->UpdateMouse();
CapturePad(0);
@@ -545,7 +545,7 @@ void CPad::ProcessPCSpecificStuff(void)
;
}
-void CPad::Update(Int16 unk)
+void CPad::Update(int16 unk)
{
OldState = NewState;
@@ -573,7 +573,7 @@ void CPad::DoCheats(void)
GetPad(0)->DoCheats(0);
}
-void CPad::DoCheats(Int16 unk)
+void CPad::DoCheats(int16 unk)
{
#ifdef PS2
if ( GetTriangleJustDown() )
@@ -619,17 +619,17 @@ void CPad::StopPadsShaking(void)
GetPad(0)->StopShaking(0);
}
-void CPad::StopShaking(Int16 unk)
+void CPad::StopShaking(int16 unk)
{
;
}
-CPad *CPad::GetPad(Int32 pad)
+CPad *CPad::GetPad(int32 pad)
{
return &Pads[pad];
}
-Int16 CPad::GetSteeringLeftRight(void)
+int16 CPad::GetSteeringLeftRight(void)
{
if ( DisablePlayerControls )
return 0;
@@ -639,8 +639,8 @@ Int16 CPad::GetSteeringLeftRight(void)
case 0:
case 2:
{
- Int16 axis = NewState.LeftStickX;
- Int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
+ int16 axis = NewState.LeftStickX;
+ int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
if ( abs(axis) > abs(dpad) )
return axis;
@@ -662,7 +662,7 @@ Int16 CPad::GetSteeringLeftRight(void)
return 0;
}
-Int16 CPad::GetSteeringUpDown(void)
+int16 CPad::GetSteeringUpDown(void)
{
if ( DisablePlayerControls )
return 0;
@@ -672,8 +672,8 @@ Int16 CPad::GetSteeringUpDown(void)
case 0:
case 2:
{
- Int16 axis = NewState.LeftStickY;
- Int16 dpad = (NewState.DPadUp - NewState.DPadDown) / 2;
+ int16 axis = NewState.LeftStickY;
+ int16 dpad = (NewState.DPadUp - NewState.DPadDown) / 2;
if ( abs(axis) > abs(dpad) )
return axis;
@@ -695,7 +695,7 @@ Int16 CPad::GetSteeringUpDown(void)
return 0;
}
-Int16 CPad::GetCarGunUpDown(void)
+int16 CPad::GetCarGunUpDown(void)
{
if ( DisablePlayerControls )
return 0;
@@ -722,7 +722,7 @@ Int16 CPad::GetCarGunUpDown(void)
return 0;
}
-Int16 CPad::GetCarGunLeftRight(void)
+int16 CPad::GetCarGunLeftRight(void)
{
if ( DisablePlayerControls )
return 0;
@@ -749,7 +749,7 @@ Int16 CPad::GetCarGunLeftRight(void)
return 0;
}
-Int16 CPad::GetPedWalkLeftRight(void)
+int16 CPad::GetPedWalkLeftRight(void)
{
if ( DisablePlayerControls )
return 0;
@@ -759,8 +759,8 @@ Int16 CPad::GetPedWalkLeftRight(void)
case 0:
case 2:
{
- Int16 axis = NewState.LeftStickX;
- Int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
+ int16 axis = NewState.LeftStickX;
+ int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
if ( abs(axis) > abs(dpad) )
return axis;
@@ -783,7 +783,7 @@ Int16 CPad::GetPedWalkLeftRight(void)
}
-Int16 CPad::GetPedWalkUpDown(void)
+int16 CPad::GetPedWalkUpDown(void)
{
if ( DisablePlayerControls )
return 0;
@@ -793,8 +793,8 @@ Int16 CPad::GetPedWalkUpDown(void)
case 0:
case 2:
{
- Int16 axis = NewState.LeftStickY;
- Int16 dpad = (NewState.DPadDown - NewState.DPadUp) / 2;
+ int16 axis = NewState.LeftStickY;
+ int16 dpad = (NewState.DPadDown - NewState.DPadUp) / 2;
if ( abs(axis) > abs(dpad) )
return axis;
@@ -816,15 +816,15 @@ Int16 CPad::GetPedWalkUpDown(void)
return 0;
}
-Int16 CPad::GetAnalogueUpDown(void)
+int16 CPad::GetAnalogueUpDown(void)
{
switch ( Mode )
{
case 0:
case 2:
{
- Int16 axis = NewState.LeftStickY;
- Int16 dpad = (NewState.DPadDown - NewState.DPadUp) / 2;
+ int16 axis = NewState.LeftStickY;
+ int16 dpad = (NewState.DPadDown - NewState.DPadUp) / 2;
if ( abs(axis) > abs(dpad) )
return axis;
@@ -846,7 +846,7 @@ Int16 CPad::GetAnalogueUpDown(void)
return 0;
}
-Bool CPad::GetLookLeft(void)
+bool CPad::GetLookLeft(void)
{
if ( DisablePlayerControls )
return false;
@@ -854,7 +854,7 @@ Bool CPad::GetLookLeft(void)
return !!(NewState.LeftShoulder2 && !NewState.RightShoulder2);
}
-Bool CPad::GetLookRight(void)
+bool CPad::GetLookRight(void)
{
if ( DisablePlayerControls )
return false;
@@ -863,7 +863,7 @@ Bool CPad::GetLookRight(void)
}
-Bool CPad::GetLookBehindForCar(void)
+bool CPad::GetLookBehindForCar(void)
{
if ( DisablePlayerControls )
return false;
@@ -871,7 +871,7 @@ Bool CPad::GetLookBehindForCar(void)
return !!(NewState.RightShoulder2 && NewState.LeftShoulder2);
}
-Bool CPad::GetLookBehindForPed(void)
+bool CPad::GetLookBehindForPed(void)
{
if ( DisablePlayerControls )
return false;
@@ -879,7 +879,7 @@ Bool CPad::GetLookBehindForPed(void)
return !!NewState.RightShock;
}
-Bool CPad::GetHorn(void)
+bool CPad::GetHorn(void)
{
if ( DisablePlayerControls )
return false;
@@ -918,7 +918,7 @@ Bool CPad::GetHorn(void)
return false;
}
-Bool CPad::HornJustDown(void)
+bool CPad::HornJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -958,7 +958,7 @@ Bool CPad::HornJustDown(void)
}
-Bool CPad::GetCarGunFired(void)
+bool CPad::GetCarGunFired(void)
{
if ( DisablePlayerControls )
return false;
@@ -985,7 +985,7 @@ Bool CPad::GetCarGunFired(void)
return false;
}
-Bool CPad::CarGunJustDown(void)
+bool CPad::CarGunJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -1012,7 +1012,7 @@ Bool CPad::CarGunJustDown(void)
return false;
}
-Int16 CPad::GetHandBrake(void)
+int16 CPad::GetHandBrake(void)
{
if ( DisablePlayerControls )
return 0;
@@ -1045,7 +1045,7 @@ Int16 CPad::GetHandBrake(void)
return 0;
}
-Int16 CPad::GetBrake(void)
+int16 CPad::GetBrake(void)
{
if ( DisablePlayerControls )
return 0;
@@ -1069,7 +1069,7 @@ Int16 CPad::GetBrake(void)
case 3:
{
- Int16 axis = 2 * NewState.RightStickY;
+ int16 axis = 2 * NewState.RightStickY;
if ( axis < 0 )
return 0;
@@ -1083,7 +1083,7 @@ Int16 CPad::GetBrake(void)
return 0;
}
-Bool CPad::GetExitVehicle(void)
+bool CPad::GetExitVehicle(void)
{
if ( DisablePlayerControls )
return false;
@@ -1110,7 +1110,7 @@ Bool CPad::GetExitVehicle(void)
return false;
}
-Bool CPad::ExitVehicleJustDown(void)
+bool CPad::ExitVehicleJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -1137,7 +1137,7 @@ Bool CPad::ExitVehicleJustDown(void)
return false;
}
-Int32 CPad::GetWeapon(void)
+int32 CPad::GetWeapon(void)
{
if ( DisablePlayerControls )
return false;
@@ -1170,7 +1170,7 @@ Int32 CPad::GetWeapon(void)
return false;
}
-Bool CPad::WeaponJustDown(void)
+bool CPad::WeaponJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -1203,7 +1203,7 @@ Bool CPad::WeaponJustDown(void)
return false;
}
-Int16 CPad::GetAccelerate(void)
+int16 CPad::GetAccelerate(void)
{
if ( DisablePlayerControls )
return 0;
@@ -1227,7 +1227,7 @@ Int16 CPad::GetAccelerate(void)
case 3:
{
- Int16 axis = -2 * NewState.RightStickY;
+ int16 axis = -2 * NewState.RightStickY;
if ( axis < 0 )
return 0;
@@ -1241,7 +1241,7 @@ Int16 CPad::GetAccelerate(void)
return 0;
}
-Bool CPad::CycleCameraModeUpJustDown(void)
+bool CPad::CycleCameraModeUpJustDown(void)
{
switch ( Mode )
{
@@ -1265,7 +1265,7 @@ Bool CPad::CycleCameraModeUpJustDown(void)
return false;
}
-Bool CPad::CycleCameraModeDownJustDown(void)
+bool CPad::CycleCameraModeDownJustDown(void)
{
switch ( Mode )
{
@@ -1289,7 +1289,7 @@ Bool CPad::CycleCameraModeDownJustDown(void)
return false;
}
-Bool CPad::ChangeStationJustDown(void)
+bool CPad::ChangeStationJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -1329,7 +1329,7 @@ Bool CPad::ChangeStationJustDown(void)
}
-Bool CPad::CycleWeaponLeftJustDown(void)
+bool CPad::CycleWeaponLeftJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -1337,7 +1337,7 @@ Bool CPad::CycleWeaponLeftJustDown(void)
return !!(NewState.LeftShoulder2 && !OldState.LeftShoulder2);
}
-Bool CPad::CycleWeaponRightJustDown(void)
+bool CPad::CycleWeaponRightJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -1345,7 +1345,7 @@ Bool CPad::CycleWeaponRightJustDown(void)
return !!(NewState.RightShoulder2 && !OldState.RightShoulder2);
}
-Bool CPad::GetTarget(void)
+bool CPad::GetTarget(void)
{
if ( DisablePlayerControls )
return false;
@@ -1372,7 +1372,7 @@ Bool CPad::GetTarget(void)
return false;
}
-Bool CPad::TargetJustDown(void)
+bool CPad::TargetJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -1399,7 +1399,7 @@ Bool CPad::TargetJustDown(void)
return false;
}
-Bool CPad::JumpJustDown(void)
+bool CPad::JumpJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -1407,7 +1407,7 @@ Bool CPad::JumpJustDown(void)
return !!(NewState.Square && !OldState.Square);
}
-Bool CPad::GetSprint(void)
+bool CPad::GetSprint(void)
{
if ( DisablePlayerControls )
return false;
@@ -1434,7 +1434,7 @@ Bool CPad::GetSprint(void)
return false;
}
-Bool CPad::ShiftTargetLeftJustDown(void)
+bool CPad::ShiftTargetLeftJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -1442,7 +1442,7 @@ Bool CPad::ShiftTargetLeftJustDown(void)
return !!(NewState.LeftShoulder2 && !OldState.LeftShoulder2);
}
-Bool CPad::ShiftTargetRightJustDown(void)
+bool CPad::ShiftTargetRightJustDown(void)
{
if ( DisablePlayerControls )
return false;
@@ -1450,11 +1450,11 @@ Bool CPad::ShiftTargetRightJustDown(void)
return !!(NewState.RightShoulder2 && !OldState.RightShoulder2);
}
-Bool CPad::GetAnaloguePadUp(void)
+bool CPad::GetAnaloguePadUp(void)
{
- static Int16 oldfStickY = 0;
+ static int16 oldfStickY = 0;
- Int16 Y = CPad::GetPad(0)->GetAnalogueUpDown();
+ int16 Y = CPad::GetPad(0)->GetAnalogueUpDown();
if ( Y < 0 && oldfStickY >= 0 )
{
@@ -1468,11 +1468,11 @@ Bool CPad::GetAnaloguePadUp(void)
}
}
-Bool CPad::GetAnaloguePadDown(void)
+bool CPad::GetAnaloguePadDown(void)
{
- static Int16 oldfStickY = 0;
+ static int16 oldfStickY = 0;
- Int16 Y = CPad::GetPad(0)->GetAnalogueUpDown();
+ int16 Y = CPad::GetPad(0)->GetAnalogueUpDown();
if ( Y > 0 && oldfStickY <= 0 )
{
@@ -1486,11 +1486,11 @@ Bool CPad::GetAnaloguePadDown(void)
}
}
-Bool CPad::GetAnaloguePadLeft(void)
+bool CPad::GetAnaloguePadLeft(void)
{
- static Int16 oldfStickX = 0;
+ static int16 oldfStickX = 0;
- Int16 X = CPad::GetPad(0)->GetPedWalkLeftRight();
+ int16 X = CPad::GetPad(0)->GetPedWalkLeftRight();
if ( X < 0 && oldfStickX >= 0 )
{
@@ -1504,11 +1504,11 @@ Bool CPad::GetAnaloguePadLeft(void)
}
}
-Bool CPad::GetAnaloguePadRight(void)
+bool CPad::GetAnaloguePadRight(void)
{
- static Int16 oldfStickX = 0;
+ static int16 oldfStickX = 0;
- Int16 X = CPad::GetPad(0)->GetPedWalkLeftRight();
+ int16 X = CPad::GetPad(0)->GetPedWalkLeftRight();
if ( X > 0 && oldfStickX <= 0 )
{
@@ -1522,11 +1522,11 @@ Bool CPad::GetAnaloguePadRight(void)
}
}
-Bool CPad::GetAnaloguePadLeftJustUp(void)
+bool CPad::GetAnaloguePadLeftJustUp(void)
{
- static Int16 oldfStickX = 0;
+ static int16 oldfStickX = 0;
- Int16 X = GetPad(0)->GetPedWalkLeftRight();
+ int16 X = GetPad(0)->GetPedWalkLeftRight();
if ( X == 0 && oldfStickX < 0 )
{
@@ -1542,11 +1542,11 @@ Bool CPad::GetAnaloguePadLeftJustUp(void)
}
}
-Bool CPad::GetAnaloguePadRightJustUp(void)
+bool CPad::GetAnaloguePadRightJustUp(void)
{
- static Int16 oldfStickX = 0;
+ static int16 oldfStickX = 0;
- Int16 X = GetPad(0)->GetPedWalkLeftRight();
+ int16 X = GetPad(0)->GetPedWalkLeftRight();
if ( X == 0 && oldfStickX > 0 )
{
@@ -1562,7 +1562,7 @@ Bool CPad::GetAnaloguePadRightJustUp(void)
}
}
-Bool CPad::ForceCameraBehindPlayer(void)
+bool CPad::ForceCameraBehindPlayer(void)
{
if ( DisablePlayerControls )
return false;
@@ -1595,7 +1595,7 @@ Bool CPad::ForceCameraBehindPlayer(void)
return false;
}
-Bool CPad::SniperZoomIn(void)
+bool CPad::SniperZoomIn(void)
{
if ( DisablePlayerControls )
return false;
@@ -1622,7 +1622,7 @@ Bool CPad::SniperZoomIn(void)
return false;
}
-Bool CPad::SniperZoomOut(void)
+bool CPad::SniperZoomOut(void)
{
if ( DisablePlayerControls )
return false;
@@ -1650,10 +1650,10 @@ Bool CPad::SniperZoomOut(void)
}
-Int16 CPad::SniperModeLookLeftRight(void)
+int16 CPad::SniperModeLookLeftRight(void)
{
- Int16 axis = NewState.LeftStickX;
- Int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
+ int16 axis = NewState.LeftStickX;
+ int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
if ( abs(axis) > abs(dpad) )
return axis;
@@ -1661,10 +1661,10 @@ Int16 CPad::SniperModeLookLeftRight(void)
return dpad;
}
-Int16 CPad::SniperModeLookUpDown(void)
+int16 CPad::SniperModeLookUpDown(void)
{
- Int16 axis = NewState.LeftStickY;
- Int16 dpad = (NewState.DPadUp - NewState.DPadDown) / 2;
+ int16 axis = NewState.LeftStickY;
+ int16 dpad = (NewState.DPadUp - NewState.DPadDown) / 2;
if ( abs(axis) > abs(dpad) )
return axis;
@@ -1672,31 +1672,31 @@ Int16 CPad::SniperModeLookUpDown(void)
return dpad;
}
-Int16 CPad::LookAroundLeftRight(void)
+int16 CPad::LookAroundLeftRight(void)
{
- Float axis = GetPad(0)->NewState.RightStickX;
+ float axis = GetPad(0)->NewState.RightStickX;
if ( fabs(axis) > 85 && !GetLookBehindForPed() )
- return (Int16) ( (axis + ( axis > 0 ) ? -85 : 85)
+ return (int16) ( (axis + ( axis > 0 ) ? -85 : 85)
* (127.0f / 32.0f) ); // 3.96875f
else if ( TheCamera.Cams[0].Using3rdPersonMouseCam() && fabs(axis) > 10 )
- return (Int16) ( (axis + ( axis > 0 ) ? -10 : 10)
+ return (int16) ( (axis + ( axis > 0 ) ? -10 : 10)
* (127.0f / 64.0f) ); // 1.984375f
return 0;
}
-Int16 CPad::LookAroundUpDown(void)
+int16 CPad::LookAroundUpDown(void)
{
- Int16 axis = GetPad(0)->NewState.RightStickY;
+ int16 axis = GetPad(0)->NewState.RightStickY;
if ( abs(axis) > 85 && !GetLookBehindForPed() )
- return (Int16) ( (axis + ( axis > 0 ) ? -85 : 85)
+ return (int16) ( (axis + ( axis > 0 ) ? -85 : 85)
* (127.0f / 32.0f) ); // 3.96875f
else if ( TheCamera.Cams[0].Using3rdPersonMouseCam() && abs(axis) > 40 )
- return (Int16) ( (axis + ( axis > 0 ) ? -40 : 40)
+ return (int16) ( (axis + ( axis > 0 ) ? -40 : 40)
* (127.0f / 64.0f) ); // 1.984375f
return 0;
@@ -1750,7 +1750,7 @@ void CPad::PrintErrorMessage(void)
void LittleTest(void)
{
- static Int32 Cunt = 0;
+ static int32 Cunt = 0;
Cunt++; // ???
}
@@ -1775,12 +1775,12 @@ void CPad::ResetCheats(void)
CTimer::SetTimeScale(1.0f);
}
-Char *CPad::EditString(Char *pStr, Int32 nSize)
+char *CPad::EditString(char *pStr, int32 nSize)
{
- Int32 pos = strlen(pStr);
+ int32 pos = strlen(pStr);
// letters
- for ( Int32 i = 0; i < ('Z' - 'A' + 1); i++ )
+ for ( int32 i = 0; i < ('Z' - 'A' + 1); i++ )
{
if ( GetPad(0)->GetCharJustDown(i + 'A') && pos < nSize - 1 )
{
@@ -1796,7 +1796,7 @@ Char *CPad::EditString(Char *pStr, Int32 nSize)
}
// numbers
- for ( Int32 i = 0; i < ('0' - '9' + 1); i++ )
+ for ( int32 i = 0; i < ('0' - '9' + 1); i++ )
{
if ( GetPad(0)->GetCharJustDown(i + '0') && pos < nSize - 1 )
{
@@ -1827,17 +1827,17 @@ Char *CPad::EditString(Char *pStr, Int32 nSize)
return pStr;
}
-Int32 *CPad::EditCodesForControls(Int32 *pRsKeys, Int32 nSize)
+int32 *CPad::EditCodesForControls(int32 *pRsKeys, int32 nSize)
{
*pRsKeys = rsNULL;
- for ( Int32 i = 0; i < 255; i++ )
+ for ( int32 i = 0; i < 255; i++ )
{
if ( GetPad(0)->GetCharJustDown(i) )
*pRsKeys = i;
}
- for ( Int32 i = 0; i < 255; i++ )
+ for ( int32 i = 0; i < 12; i++ )
{
if ( GetPad(0)->GetFJustDown(i) )
*pRsKeys = i + rsF1;
@@ -1996,7 +1996,7 @@ STARTPATCHES
InjectHook(0x492C60, &CPad::ProcessPCSpecificStuff, PATCH_JUMP);
InjectHook(0x492C70, &CPad::Update, PATCH_JUMP);
InjectHook(0x492F00, (void (*)())CPad::DoCheats, PATCH_JUMP);
- InjectHook(0x492F20, (void (CPad::*)(Int16))&CPad::DoCheats, PATCH_JUMP);
+ InjectHook(0x492F20, (void (CPad::*)(int16))&CPad::DoCheats, PATCH_JUMP);
InjectHook(0x492F30, CPad::StopPadsShaking, PATCH_JUMP);
InjectHook(0x492F50, &CPad::StopShaking, PATCH_JUMP);
InjectHook(0x492F60, CPad::GetPad, PATCH_JUMP);
diff --git a/src/Pad.h b/src/Pad.h
index 446007c2..9180be26 100644
--- a/src/Pad.h
+++ b/src/Pad.h
@@ -78,16 +78,16 @@ class CMouseControllerState
public:
//uint32 btns; // bit 0-2 button 1-3
- Bool LMB;
- Bool RMB;
- Bool MMB;
- Bool WHEELUP;
- Bool WHEELDN;
- Bool MXB1;
- Bool MXB2;
+ bool LMB;
+ bool RMB;
+ bool MMB;
+ bool WHEELUP;
+ bool WHEELDN;
+ bool MXB1;
+ bool MXB2;
char _pad0;
- Float x, y;
+ float x, y;
CMouseControllerState();
void Clear();
@@ -98,8 +98,8 @@ VALIDATE_SIZE(CMouseControllerState, 0x10);
class CMousePointerStateHelper
{
public:
- Bool bInvertHorizontally;
- Bool bInvertVertically;
+ bool bInvertHorizontally;
+ bool bInvertVertically;
CMouseControllerState GetMouseSetUp();
};
@@ -112,52 +112,52 @@ extern CMousePointerStateHelper &MousePointerStateHelper;
class CKeyboardState
{
public:
- Int16 F[12];
- Int16 VK_KEYS[256];
- Int16 ESC;
- Int16 INS;
- Int16 DEL;
- Int16 HOME;
- Int16 END;
- Int16 PGUP;
- Int16 PGDN;
- Int16 UP;
- Int16 DOWN;
- Int16 LEFT;
- Int16 RIGHT;
- Int16 SCROLLLOCK;
- Int16 PAUSE;
- Int16 NUMLOCK;
- Int16 DIV;
- Int16 MUL;
- Int16 SUB;
- Int16 ADD;
- Int16 ENTER;
- Int16 DECIMAL;
- Int16 NUM1;
- Int16 NUM2;
- Int16 NUM3;
- Int16 NUM4;
- Int16 NUM5;
- Int16 NUM6;
- Int16 NUM7;
- Int16 NUM8;
- Int16 NUM9;
- Int16 NUM0;
- Int16 BACKSP;
- Int16 TAB;
- Int16 CAPSLOCK;
- Int16 EXTENTER;
- Int16 LSHIFT;
- Int16 RSHIFT;
- Int16 SHIFT;
- Int16 LCTRL;
- Int16 RCTRL;
- Int16 LALT;
- Int16 RALT;
- Int16 LWIN;
- Int16 RWIN;
- Int16 APPS;
+ int16 F[12];
+ int16 VK_KEYS[256];
+ int16 ESC;
+ int16 INS;
+ int16 DEL;
+ int16 HOME;
+ int16 END;
+ int16 PGUP;
+ int16 PGDN;
+ int16 UP;
+ int16 DOWN;
+ int16 LEFT;
+ int16 RIGHT;
+ int16 SCROLLLOCK;
+ int16 PAUSE;
+ int16 NUMLOCK;
+ int16 DIV;
+ int16 MUL;
+ int16 SUB;
+ int16 ADD;
+ int16 ENTER;
+ int16 DECIMAL;
+ int16 NUM1;
+ int16 NUM2;
+ int16 NUM3;
+ int16 NUM4;
+ int16 NUM5;
+ int16 NUM6;
+ int16 NUM7;
+ int16 NUM8;
+ int16 NUM9;
+ int16 NUM0;
+ int16 BACKSP;
+ int16 TAB;
+ int16 CAPSLOCK;
+ int16 EXTENTER;
+ int16 LSHIFT;
+ int16 RSHIFT;
+ int16 SHIFT;
+ int16 LCTRL;
+ int16 RCTRL;
+ int16 LALT;
+ int16 RALT;
+ int16 LWIN;
+ int16 RWIN;
+ int16 APPS;
void Clear();
};
@@ -185,12 +185,12 @@ public:
int16 Phase;
int16 Mode;
int16 ShakeDur;
- UInt8 ShakeFreq;
+ uint8 ShakeFreq;
int8 bHornHistory[5];
- UInt8 iCurrHornHistory;
- Bool DisablePlayerControls;
+ uint8 iCurrHornHistory;
+ bool DisablePlayerControls;
int8 bApplyBrakes;
- Char _unk[12]; //int32 unk[3];
+ char _unk[12]; //int32 unk[3];
char _pad0[3];
int32 LastTimeTouched;
int32 AverageWeapon;
@@ -199,14 +199,14 @@ public:
CPad() { }
~CPad() { }
- static Bool &bDisplayNoControllerMessage;
- static Bool &bObsoleteControllerMessage;
- static Bool &m_bMapPadOneToPadTwo;
+ static bool &bDisplayNoControllerMessage;
+ static bool &bObsoleteControllerMessage;
+ static bool &m_bMapPadOneToPadTwo;
static CKeyboardState &OldKeyState;
static CKeyboardState &NewKeyState;
static CKeyboardState &TempKeyState;
- static Char KeyBoardCheatString[18];
+ static char KeyBoardCheatString[18];
static CMouseControllerState &OldMouseControllerState;
static CMouseControllerState &NewMouseControllerState;
static CMouseControllerState &PCTempMouseControllerState;
@@ -214,150 +214,150 @@ public:
- void Clear(Bool bResetPlayerControls);
+ void Clear(bool bResetPlayerControls);
void ClearMouseHistory();
void UpdateMouse();
CControllerState ReconcileTwoControllersInput(CControllerState const &State1, CControllerState const &State2);
- void StartShake(Int16 nDur, UInt8 nFreq);
- void StartShake_Distance(Int16 nDur, UInt8 nFreq, Float fX, Float fY, Float fz);
- void StartShake_Train(Float fX, Float fY);
- void AddToPCCheatString(Char c);
+ void StartShake(int16 nDur, uint8 nFreq);
+ void StartShake_Distance(int16 nDur, uint8 nFreq, float fX, float fY, float fz);
+ void StartShake_Train(float fX, float fY);
+ void AddToPCCheatString(char c);
static void UpdatePads(void);
void ProcessPCSpecificStuff(void);
- void Update(Int16 unk);
+ void Update(int16 unk);
static void DoCheats(void);
- void DoCheats(Int16 unk);
+ void DoCheats(int16 unk);
static void StopPadsShaking(void);
- void StopShaking(Int16 unk);
+ void StopShaking(int16 unk);
- static CPad *GetPad(Int32 pad);
+ static CPad *GetPad(int32 pad);
- Int16 GetSteeringLeftRight(void);
- Int16 GetSteeringUpDown(void);
- Int16 GetCarGunUpDown(void);
- Int16 GetCarGunLeftRight(void);
- Int16 GetPedWalkLeftRight(void);
- Int16 GetPedWalkUpDown(void);
- Int16 GetAnalogueUpDown(void);
- Bool GetLookLeft(void);
- Bool GetLookRight(void);
- Bool GetLookBehindForCar(void);
- Bool GetLookBehindForPed(void);
- Bool GetHorn(void);
- Bool HornJustDown(void);
- Bool GetCarGunFired(void);
- Bool CarGunJustDown(void);
- Int16 GetHandBrake(void);
- Int16 GetBrake(void);
- Bool GetExitVehicle(void);
- Bool ExitVehicleJustDown(void);
- Int32 GetWeapon(void);
- Bool WeaponJustDown(void);
- Int16 GetAccelerate(void);
- Bool CycleCameraModeUpJustDown(void);
- Bool CycleCameraModeDownJustDown(void);
- Bool ChangeStationJustDown(void);
- Bool CycleWeaponLeftJustDown(void);
- Bool CycleWeaponRightJustDown(void);
- Bool GetTarget(void);
- Bool TargetJustDown(void);
- Bool JumpJustDown(void);
- Bool GetSprint(void);
- Bool ShiftTargetLeftJustDown(void);
- Bool ShiftTargetRightJustDown(void);
- Bool GetAnaloguePadUp(void);
- Bool GetAnaloguePadDown(void);
- Bool GetAnaloguePadLeft(void);
- Bool GetAnaloguePadRight(void);
- Bool GetAnaloguePadLeftJustUp(void);
- Bool GetAnaloguePadRightJustUp(void);
- Bool ForceCameraBehindPlayer(void);
- Bool SniperZoomIn(void);
- Bool SniperZoomOut(void);
- Int16 SniperModeLookLeftRight(void);
- Int16 SniperModeLookUpDown(void);
- Int16 LookAroundLeftRight(void);
- Int16 LookAroundUpDown(void);
+ int16 GetSteeringLeftRight(void);
+ int16 GetSteeringUpDown(void);
+ int16 GetCarGunUpDown(void);
+ int16 GetCarGunLeftRight(void);
+ int16 GetPedWalkLeftRight(void);
+ int16 GetPedWalkUpDown(void);
+ int16 GetAnalogueUpDown(void);
+ bool GetLookLeft(void);
+ bool GetLookRight(void);
+ bool GetLookBehindForCar(void);
+ bool GetLookBehindForPed(void);
+ bool GetHorn(void);
+ bool HornJustDown(void);
+ bool GetCarGunFired(void);
+ bool CarGunJustDown(void);
+ int16 GetHandBrake(void);
+ int16 GetBrake(void);
+ bool GetExitVehicle(void);
+ bool ExitVehicleJustDown(void);
+ int32 GetWeapon(void);
+ bool WeaponJustDown(void);
+ int16 GetAccelerate(void);
+ bool CycleCameraModeUpJustDown(void);
+ bool CycleCameraModeDownJustDown(void);
+ bool ChangeStationJustDown(void);
+ bool CycleWeaponLeftJustDown(void);
+ bool CycleWeaponRightJustDown(void);
+ bool GetTarget(void);
+ bool TargetJustDown(void);
+ bool JumpJustDown(void);
+ bool GetSprint(void);
+ bool ShiftTargetLeftJustDown(void);
+ bool ShiftTargetRightJustDown(void);
+ bool GetAnaloguePadUp(void);
+ bool GetAnaloguePadDown(void);
+ bool GetAnaloguePadLeft(void);
+ bool GetAnaloguePadRight(void);
+ bool GetAnaloguePadLeftJustUp(void);
+ bool GetAnaloguePadRightJustUp(void);
+ bool ForceCameraBehindPlayer(void);
+ bool SniperZoomIn(void);
+ bool SniperZoomOut(void);
+ int16 SniperModeLookLeftRight(void);
+ int16 SniperModeLookUpDown(void);
+ int16 LookAroundLeftRight(void);
+ int16 LookAroundUpDown(void);
void ResetAverageWeapon(void);
static void PrintErrorMessage(void);
static void ResetCheats(void);
- static Char *EditString(Char *pStr, Int32 nSize);
- static Int32 *EditCodesForControls(Int32 *pRsKeys, Int32 nSize);
+ static char *EditString(char *pStr, int32 nSize);
+ static int32 *EditCodesForControls(int32 *pRsKeys, int32 nSize);
// mouse
- inline Bool GetLeftMouseJustDown() { return !!(NewMouseControllerState.LMB && !OldMouseControllerState.LMB); }
+ inline bool GetLeftMouseJustDown() { return !!(NewMouseControllerState.LMB && !OldMouseControllerState.LMB); }
// keyboard
- inline Bool GetCharJustDown(Char c) { return !!(NewKeyState.VK_KEYS[c] && !OldKeyState.VK_KEYS[c]); }
- inline Bool GetFJustDown(Int32 n) { return !!(NewKeyState.F[n] && !OldKeyState.F[n]); }
- inline Bool GetEscapeJustDown() { return !!(NewKeyState.ESC && !OldKeyState.ESC); }
- inline Bool GetInsertJustDown() { return !!(NewKeyState.INS && !OldKeyState.INS); }
- inline Bool GetDeleteJustDown() { return !!(NewKeyState.DEL && !OldKeyState.DEL); }
- inline Bool GetHomeJustDown() { return !!(NewKeyState.HOME && !OldKeyState.HOME); }
- inline Bool GetEndJustDown() { return !!(NewKeyState.END && !OldKeyState.END); }
- inline Bool GetPageUpJustDown() { return !!(NewKeyState.PGUP && !OldKeyState.PGUP); }
- inline Bool GetPageDownJustDown() { return !!(NewKeyState.PGDN && !OldKeyState.PGDN); }
- inline Bool GetUpJustDown() { return !!(NewKeyState.UP && !OldKeyState.UP); }
- inline Bool GetDownJustDown() { return !!(NewKeyState.DOWN && !OldKeyState.DOWN); }
- inline Bool GetLeftJustDown() { return !!(NewKeyState.LEFT && !OldKeyState.LEFT); }
- inline Bool GetRightJustDown() { return !!(NewKeyState.RIGHT && !OldKeyState.RIGHT); }
- inline Bool GetScrollLockJustDown() { return !!(NewKeyState.SCROLLLOCK && !OldKeyState.SCROLLLOCK); }
- inline Bool GetPauseJustDown() { return !!(NewKeyState.PAUSE && !OldKeyState.PAUSE); }
- inline Bool GetNumLockJustDown() { return !!(NewKeyState.NUMLOCK && !OldKeyState.NUMLOCK); }
- inline Bool GetDivideJustDown() { return !!(NewKeyState.DIV && !OldKeyState.DIV); }
- inline Bool GetTimesJustDown() { return !!(NewKeyState.MUL && !OldKeyState.MUL); }
- inline Bool GetMinusJustDown() { return !!(NewKeyState.SUB && !OldKeyState.SUB); }
- inline Bool GetPlusJustDown() { return !!(NewKeyState.ADD && !OldKeyState.ADD); }
- inline Bool GetPadEnterJustDown() { return !!(NewKeyState.ENTER && !OldKeyState.ENTER); } // GetEnterJustDown
- inline Bool GetPadDelJustDown() { return !!(NewKeyState.DECIMAL && !OldKeyState.DECIMAL); }
- inline Bool GetPad1JustDown() { return !!(NewKeyState.NUM1 && !OldKeyState.NUM1); }
- inline Bool GetPad2JustDown() { return !!(NewKeyState.NUM2 && !OldKeyState.NUM2); }
- inline Bool GetPad3JustDown() { return !!(NewKeyState.NUM3 && !OldKeyState.NUM3); }
- inline Bool GetPad4JustDown() { return !!(NewKeyState.NUM4 && !OldKeyState.NUM4); }
- inline Bool GetPad5JustDown() { return !!(NewKeyState.NUM5 && !OldKeyState.NUM5); }
- inline Bool GetPad6JustDown() { return !!(NewKeyState.NUM6 && !OldKeyState.NUM6); }
- inline Bool GetPad7JustDown() { return !!(NewKeyState.NUM7 && !OldKeyState.NUM7); }
- inline Bool GetPad8JustDown() { return !!(NewKeyState.NUM8 && !OldKeyState.NUM8); }
- inline Bool GetPad9JustDown() { return !!(NewKeyState.NUM9 && !OldKeyState.NUM9); }
- inline Bool GetPad0JustDown() { return !!(NewKeyState.NUM0 && !OldKeyState.NUM0); }
- inline Bool GetBackspaceJustDown() { return !!(NewKeyState.BACKSP && !OldKeyState.BACKSP); }
- inline Bool GetTabJustDown() { return !!(NewKeyState.TAB && !OldKeyState.TAB); }
- inline Bool GetCapsLockJustDown() { return !!(NewKeyState.CAPSLOCK && !OldKeyState.CAPSLOCK); }
- inline Bool GetEnterJustDown() { return !!(NewKeyState.EXTENTER && !OldKeyState.EXTENTER); }
- inline Bool GetLeftShiftJustDown() { return !!(NewKeyState.LSHIFT && !OldKeyState.LSHIFT); }
- inline Bool GetShiftJustDown() { return !!(NewKeyState.SHIFT && !OldKeyState.SHIFT); }
- inline Bool GetRightShiftJustDown() { return !!(NewKeyState.RSHIFT && !OldKeyState.RSHIFT); }
- inline Bool GetLeftCtrlJustDown() { return !!(NewKeyState.LCTRL && !OldKeyState.LCTRL); }
- inline Bool GetRightCtrlJustDown() { return !!(NewKeyState.RCTRL && !OldKeyState.RCTRL); }
- inline Bool GetLeftAltJustDown() { return !!(NewKeyState.LALT && !OldKeyState.LALT); }
- inline Bool GetRightAltJustDown() { return !!(NewKeyState.RALT && !OldKeyState.RALT); }
- inline Bool GetLeftWinJustDown() { return !!(NewKeyState.LWIN && !OldKeyState.LWIN); }
- inline Bool GetRightWinJustDown() { return !!(NewKeyState.RWIN && !OldKeyState.RWIN); }
- inline Bool GetAppsJustDown() { return !!(NewKeyState.APPS && !OldKeyState.APPS); }
+ inline bool GetCharJustDown(char c) { return !!(NewKeyState.VK_KEYS[c] && !OldKeyState.VK_KEYS[c]); }
+ inline bool GetFJustDown(int32 n) { return !!(NewKeyState.F[n] && !OldKeyState.F[n]); }
+ inline bool GetEscapeJustDown() { return !!(NewKeyState.ESC && !OldKeyState.ESC); }
+ inline bool GetInsertJustDown() { return !!(NewKeyState.INS && !OldKeyState.INS); }
+ inline bool GetDeleteJustDown() { return !!(NewKeyState.DEL && !OldKeyState.DEL); }
+ inline bool GetHomeJustDown() { return !!(NewKeyState.HOME && !OldKeyState.HOME); }
+ inline bool GetEndJustDown() { return !!(NewKeyState.END && !OldKeyState.END); }
+ inline bool GetPageUpJustDown() { return !!(NewKeyState.PGUP && !OldKeyState.PGUP); }
+ inline bool GetPageDownJustDown() { return !!(NewKeyState.PGDN && !OldKeyState.PGDN); }
+ inline bool GetUpJustDown() { return !!(NewKeyState.UP && !OldKeyState.UP); }
+ inline bool GetDownJustDown() { return !!(NewKeyState.DOWN && !OldKeyState.DOWN); }
+ inline bool GetLeftJustDown() { return !!(NewKeyState.LEFT && !OldKeyState.LEFT); }
+ inline bool GetRightJustDown() { return !!(NewKeyState.RIGHT && !OldKeyState.RIGHT); }
+ inline bool GetScrollLockJustDown() { return !!(NewKeyState.SCROLLLOCK && !OldKeyState.SCROLLLOCK); }
+ inline bool GetPauseJustDown() { return !!(NewKeyState.PAUSE && !OldKeyState.PAUSE); }
+ inline bool GetNumLockJustDown() { return !!(NewKeyState.NUMLOCK && !OldKeyState.NUMLOCK); }
+ inline bool GetDivideJustDown() { return !!(NewKeyState.DIV && !OldKeyState.DIV); }
+ inline bool GetTimesJustDown() { return !!(NewKeyState.MUL && !OldKeyState.MUL); }
+ inline bool GetMinusJustDown() { return !!(NewKeyState.SUB && !OldKeyState.SUB); }
+ inline bool GetPlusJustDown() { return !!(NewKeyState.ADD && !OldKeyState.ADD); }
+ inline bool GetPadEnterJustDown() { return !!(NewKeyState.ENTER && !OldKeyState.ENTER); } // GetEnterJustDown
+ inline bool GetPadDelJustDown() { return !!(NewKeyState.DECIMAL && !OldKeyState.DECIMAL); }
+ inline bool GetPad1JustDown() { return !!(NewKeyState.NUM1 && !OldKeyState.NUM1); }
+ inline bool GetPad2JustDown() { return !!(NewKeyState.NUM2 && !OldKeyState.NUM2); }
+ inline bool GetPad3JustDown() { return !!(NewKeyState.NUM3 && !OldKeyState.NUM3); }
+ inline bool GetPad4JustDown() { return !!(NewKeyState.NUM4 && !OldKeyState.NUM4); }
+ inline bool GetPad5JustDown() { return !!(NewKeyState.NUM5 && !OldKeyState.NUM5); }
+ inline bool GetPad6JustDown() { return !!(NewKeyState.NUM6 && !OldKeyState.NUM6); }
+ inline bool GetPad7JustDown() { return !!(NewKeyState.NUM7 && !OldKeyState.NUM7); }
+ inline bool GetPad8JustDown() { return !!(NewKeyState.NUM8 && !OldKeyState.NUM8); }
+ inline bool GetPad9JustDown() { return !!(NewKeyState.NUM9 && !OldKeyState.NUM9); }
+ inline bool GetPad0JustDown() { return !!(NewKeyState.NUM0 && !OldKeyState.NUM0); }
+ inline bool GetBackspaceJustDown() { return !!(NewKeyState.BACKSP && !OldKeyState.BACKSP); }
+ inline bool GetTabJustDown() { return !!(NewKeyState.TAB && !OldKeyState.TAB); }
+ inline bool GetCapsLockJustDown() { return !!(NewKeyState.CAPSLOCK && !OldKeyState.CAPSLOCK); }
+ inline bool GetEnterJustDown() { return !!(NewKeyState.EXTENTER && !OldKeyState.EXTENTER); }
+ inline bool GetLeftShiftJustDown() { return !!(NewKeyState.LSHIFT && !OldKeyState.LSHIFT); }
+ inline bool GetShiftJustDown() { return !!(NewKeyState.SHIFT && !OldKeyState.SHIFT); }
+ inline bool GetRightShiftJustDown() { return !!(NewKeyState.RSHIFT && !OldKeyState.RSHIFT); }
+ inline bool GetLeftCtrlJustDown() { return !!(NewKeyState.LCTRL && !OldKeyState.LCTRL); }
+ inline bool GetRightCtrlJustDown() { return !!(NewKeyState.RCTRL && !OldKeyState.RCTRL); }
+ inline bool GetLeftAltJustDown() { return !!(NewKeyState.LALT && !OldKeyState.LALT); }
+ inline bool GetRightAltJustDown() { return !!(NewKeyState.RALT && !OldKeyState.RALT); }
+ inline bool GetLeftWinJustDown() { return !!(NewKeyState.LWIN && !OldKeyState.LWIN); }
+ inline bool GetRightWinJustDown() { return !!(NewKeyState.RWIN && !OldKeyState.RWIN); }
+ inline bool GetAppsJustDown() { return !!(NewKeyState.APPS && !OldKeyState.APPS); }
// pad
- inline Bool GetTriangleJustDown() { return !!(NewState.Triangle && !OldState.Triangle); }
- inline Bool GetCircleJustDown() { return !!(NewState.Circle && !OldState.Circle); }
- inline Bool GetCrossJustDown() { return !!(NewState.Cross && !OldState.Cross); }
- inline Bool GetSquareJustDown() { return !!(NewState.Square && !OldState.Square); }
- inline Bool GetDPadUpJustDown() { return !!(NewState.DPadUp && !OldState.DPadUp); }
- inline Bool GetDPadDownJustDown() { return !!(NewState.DPadDown && !OldState.DPadDown); }
- inline Bool GetDPadLeftJustDown() { return !!(NewState.DPadLeft && !OldState.DPadLeft); }
- inline Bool GetDPadRightJustDown() { return !!(NewState.DPadRight && !OldState.DPadRight); }
- inline Bool GetLeftShoulder1JustDown() { return !!(NewState.LeftShoulder1 && !OldState.LeftShoulder1); }
- inline Bool GetLeftShoulder2JustDown() { return !!(NewState.LeftShoulder2 && !OldState.LeftShoulder2); }
- inline Bool GetRightShoulder1JustDown() { return !!(NewState.RightShoulder1 && !OldState.RightShoulder1); }
- inline Bool GetRightShoulder2JustDown() { return !!(NewState.RightShoulder2 && !OldState.RightShoulder2); }
+ inline bool GetTriangleJustDown() { return !!(NewState.Triangle && !OldState.Triangle); }
+ inline bool GetCircleJustDown() { return !!(NewState.Circle && !OldState.Circle); }
+ inline bool GetCrossJustDown() { return !!(NewState.Cross && !OldState.Cross); }
+ inline bool GetSquareJustDown() { return !!(NewState.Square && !OldState.Square); }
+ inline bool GetDPadUpJustDown() { return !!(NewState.DPadUp && !OldState.DPadUp); }
+ inline bool GetDPadDownJustDown() { return !!(NewState.DPadDown && !OldState.DPadDown); }
+ inline bool GetDPadLeftJustDown() { return !!(NewState.DPadLeft && !OldState.DPadLeft); }
+ inline bool GetDPadRightJustDown() { return !!(NewState.DPadRight && !OldState.DPadRight); }
+ inline bool GetLeftShoulder1JustDown() { return !!(NewState.LeftShoulder1 && !OldState.LeftShoulder1); }
+ inline bool GetLeftShoulder2JustDown() { return !!(NewState.LeftShoulder2 && !OldState.LeftShoulder2); }
+ inline bool GetRightShoulder1JustDown() { return !!(NewState.RightShoulder1 && !OldState.RightShoulder1); }
+ inline bool GetRightShoulder2JustDown() { return !!(NewState.RightShoulder2 && !OldState.RightShoulder2); }
- inline Int32 GetLeftShoulder1(void) { return NewState.LeftShoulder1; }
- inline Int32 GetLeftShoulder2(void) { return NewState.LeftShoulder2; }
- inline Int32 GetRightShoulder1(void) { return NewState.RightShoulder1; }
- inline Int32 GetRightShoulder2(void) { return NewState.RightShoulder2; }
+ inline int32 GetLeftShoulder1(void) { return NewState.LeftShoulder1; }
+ inline int32 GetLeftShoulder2(void) { return NewState.LeftShoulder2; }
+ inline int32 GetRightShoulder1(void) { return NewState.RightShoulder1; }
+ inline int32 GetRightShoulder2(void) { return NewState.RightShoulder2; }
};
VALIDATE_SIZE(CPad, 0xFC);
diff --git a/src/PedStat.h b/src/PedStat.h
new file mode 100644
index 00000000..3045e494
--- /dev/null
+++ b/src/PedStat.h
@@ -0,0 +1,17 @@
+#pragma once
+
+struct PedStat
+{
+ uint32 m_id;
+ char m_name[24];
+ int32 m_fleeDistance;
+ int32 m_headingChangeRate;
+ int8 m_fear;
+ int8 m_temper;
+ int8 m_lawfulness;
+ int8 m_sexiness;
+ int32 m_attackStrength;
+ int32 m_defendWeakness;
+ int16 m_flags;
+};
+static_assert(sizeof(PedStat) == 0x34, "PedStat: error");
diff --git a/src/Radar.cpp b/src/Radar.cpp
index a84d5b91..93097e8f 100644
--- a/src/Radar.cpp
+++ b/src/Radar.cpp
@@ -1,5 +1,48 @@
#include "common.h"
#include "patcher.h"
#include "Radar.h"
+#include "Camera.h"
+#include "Hud.h"
+#include "World.h"
+#include "Frontend.h"
WRAPPER void CRadar::ClearBlipForEntity(eBlipType type, int32 id) { EAXJMP(0x4A56C0); }
+WRAPPER void CRadar::Draw3dMarkers() { EAXJMP(0x4A4C70); }
+//WRAPPER void CRadar::DrawMap () { EAXJMP(0x4A4200); }
+WRAPPER void CRadar::DrawBlips() { EAXJMP(0x4A42F0); }
+WRAPPER void CRadar::DrawRadarMap() { EAXJMP(0x4A6C20); }
+
+float &CRadar::m_RadarRange = *(float*)0x8E281C;
+CVector2D &CRadar::vec2DRadarOrigin = *(CVector2D*)0x6299B8;
+
+void CRadar::DrawMap()
+{
+ if (!TheCamera.m_WideScreenOn && CHud::m_Wants_To_Draw_Hud) {
+ if (FindPlayerVehicle()) {
+ if (FindPlayerVehicle()->GetSpeed().Magnitude() > 0.3f) {
+ if (FindPlayerVehicle()->GetSpeed().Magnitude() > 0.9f)
+ CRadar::m_RadarRange = 350.0f;
+ else
+ CRadar::m_RadarRange = (FindPlayerVehicle()->GetSpeed().Magnitude() + 0.3f) * 200.0f;
+ }
+ else
+ CRadar::m_RadarRange = 120.0f;
+ }
+ else
+ CRadar::m_RadarRange = 120.0f;
+
+ vec2DRadarOrigin.x = FindPlayerCentreOfWorld_NoSniperShift().x;
+ vec2DRadarOrigin.y = FindPlayerCentreOfWorld_NoSniperShift().y;
+ CRadar::DrawRadarMap();
+ }
+}
+
+void CRadar::TransformRadarPointToScreenSpace(CVector2D *out, CVector2D *in)
+{
+ out->x = in->x * HUD_STRETCH_X(47.0f) + HUD_STRETCH_X(47.0f + 20.0f);
+ out->y = (HUD_STRETCH_Y(76.0f)) * 0.5f + SCREEN_HEIGHT - (HUD_STRETCH_Y(123.0f)) - in->y * (HUD_STRETCH_Y(76.0f)) * 0.5f;
+}
+
+STARTPATCHES
+ InjectHook(0x4A5040, CRadar::TransformRadarPointToScreenSpace, PATCH_JUMP);
+ENDPATCHES
diff --git a/src/Radar.h b/src/Radar.h
index 123cffb1..52d8a883 100644
--- a/src/Radar.h
+++ b/src/Radar.h
@@ -1,4 +1,5 @@
#pragma once
+#include "Sprite2d.h"
enum eBlipType
{
@@ -13,5 +14,14 @@ enum eBlipType
class CRadar
{
public:
+ static float &m_RadarRange;
+ static CVector2D &vec2DRadarOrigin;
+
+public:
static void ClearBlipForEntity(eBlipType type, int32 id);
+ static void Draw3dMarkers();
+ static void DrawMap();
+ static void TransformRadarPointToScreenSpace(CVector2D * out, CVector2D * in);
+ static void DrawBlips();
+ static void DrawRadarMap();
};
diff --git a/src/RwHelper.h b/src/RwHelper.h
index b65a53ad..2dbfd3ce 100644
--- a/src/RwHelper.h
+++ b/src/RwHelper.h
@@ -6,6 +6,9 @@ RwObject *GetFirstObject(RwFrame *frame);
RpAtomic *GetFirstAtomic(RpClump *clump);
RwTexDictionary *RwTexDictionaryGtaStreamRead(RwStream *stream);
+RwTexDictionary *RwTexDictionaryGtaStreamRead1(RwStream *stream);
+RwTexDictionary *RwTexDictionaryGtaStreamRead2(RwStream *stream, RwTexDictionary *texDict);
+
bool RpClumpGtaStreamRead1(RwStream *stream);
RpClump *RpClumpGtaStreamRead2(RwStream *stream);
void RpClumpGtaCancelStream(void);
diff --git a/src/Stats.cpp b/src/Stats.cpp
index d7816f36..5256b0cf 100644
--- a/src/Stats.cpp
+++ b/src/Stats.cpp
@@ -1,4 +1,5 @@
#include "common.h"
#include "Stats.h"
-Int32 &CStats::DaysPassed = *(Int32*)0x8F2BB8; \ No newline at end of file
+int32 &CStats::DaysPassed = *(int32*)0x8F2BB8;
+int32 &CStats::HeadShots = *(int32*)0x8F647C; \ No newline at end of file
diff --git a/src/Stats.h b/src/Stats.h
index b82497b5..4508e8a8 100644
--- a/src/Stats.h
+++ b/src/Stats.h
@@ -3,5 +3,6 @@
class CStats
{
public:
- static Int32 &DaysPassed;
+ static int32 &DaysPassed;
+ static int32 &HeadShots;
}; \ No newline at end of file
diff --git a/src/Timer.cpp b/src/Timer.cpp
index 3a49d9df..62f1ed55 100644
--- a/src/Timer.cpp
+++ b/src/Timer.cpp
@@ -17,13 +17,13 @@ bool &CTimer::m_UserPause = *(bool*)0x95CD7C;
bool &CTimer::m_CodePause = *(bool*)0x95CDB1;
//UInt32 oldPcTimer;
-UInt32 &oldPcTimer = *(UInt32*)0x9434F4;
+uint32 &oldPcTimer = *(uint32*)0x9434F4;
//UInt32 suspendPcTimer;
-UInt32 &suspendPcTimer = *(UInt32*)0x62A308;
+uint32 &suspendPcTimer = *(uint32*)0x62A308;
//UInt32 _nCyclesPerMS = 1;
-UInt32 &_nCyclesPerMS = *(UInt32*)0x5F7610;
+uint32 &_nCyclesPerMS = *(uint32*)0x5F7610;
//LARGE_INTEGER _oldPerfCounter;
LARGE_INTEGER &_oldPerfCounter = *(LARGE_INTEGER*)0x62A310;
@@ -32,7 +32,7 @@ LARGE_INTEGER &_oldPerfCounter = *(LARGE_INTEGER*)0x62A310;
LARGE_INTEGER &perfSuspendCounter = *(LARGE_INTEGER*)0x62A318;
//UInt32 suspendDepth;
-UInt32 &suspendDepth = *(UInt32*)0x62A320;
+uint32 &suspendDepth = *(uint32*)0x62A320;
void CTimer::Initialise(void)
{
@@ -51,7 +51,7 @@ void CTimer::Initialise(void)
if ( QueryPerformanceFrequency(&perfFreq) )
{
OutputDebugString("Performance counter available\n");
- _nCyclesPerMS = UInt32(perfFreq.QuadPart / 1000);
+ _nCyclesPerMS = uint32(perfFreq.QuadPart / 1000);
QueryPerformanceCounter(&_oldPerfCounter);
}
else
@@ -82,18 +82,18 @@ void CTimer::Update(void)
{
m_snPreviousTimeInMilliseconds = m_snTimeInMilliseconds;
- if ( (Double)_nCyclesPerMS != 0.0 )
+ if ( (double)_nCyclesPerMS != 0.0 )
{
LARGE_INTEGER pc;
QueryPerformanceCounter(&pc);
- Int32 updInCycles = (pc.LowPart - _oldPerfCounter.LowPart) & 0x7FFFFFFF;
+ int32 updInCycles = (pc.LowPart - _oldPerfCounter.LowPart) & 0x7FFFFFFF;
_oldPerfCounter = pc;
- Double updInCyclesScaled = (Double)updInCycles * ms_fTimeScale;
+ double updInCyclesScaled = (double)updInCycles * ms_fTimeScale;
- Double upd = updInCyclesScaled / (Double)_nCyclesPerMS;
+ double upd = updInCyclesScaled / (double)_nCyclesPerMS;
m_snTimeInMillisecondsPauseMode = (Int64)(m_snTimeInMillisecondsPauseMode + upd);
@@ -103,16 +103,16 @@ void CTimer::Update(void)
{
m_snTimeInMilliseconds = (Int64)(m_snTimeInMilliseconds + upd);
m_snTimeInMillisecondsNonClipped = (Int64)(m_snTimeInMillisecondsNonClipped + upd);
- ms_fTimeStep = updInCyclesScaled / (Double)_nCyclesPerMS / 20.0;
+ ms_fTimeStep = updInCyclesScaled / (double)_nCyclesPerMS / 20.0;
}
}
else
{
- UInt32 timer = RsTimer();
+ uint32 timer = RsTimer();
- UInt32 updInMs = timer - oldPcTimer;
+ uint32 updInMs = timer - oldPcTimer;
- Double upd = (Double)updInMs * ms_fTimeScale;
+ double upd = (double)updInMs * ms_fTimeScale;
oldPcTimer = timer;
@@ -156,7 +156,7 @@ void CTimer::Suspend(void)
if ( ++suspendDepth > 1 )
return;
- if ( (Double)_nCyclesPerMS != 0.0 )
+ if ( (double)_nCyclesPerMS != 0.0 )
QueryPerformanceCounter(&perfSuspendCounter);
else
suspendPcTimer = RsTimer();
@@ -167,7 +167,7 @@ void CTimer::Resume(void)
if ( --suspendDepth != 0 )
return;
- if ( (Double)_nCyclesPerMS != 0.0 )
+ if ( (double)_nCyclesPerMS != 0.0 )
{
LARGE_INTEGER pc;
QueryPerformanceCounter(&pc);
@@ -178,7 +178,7 @@ void CTimer::Resume(void)
oldPcTimer += RsTimer() - suspendPcTimer;
}
-UInt32 CTimer::GetCyclesPerMillisecond(void)
+uint32 CTimer::GetCyclesPerMillisecond(void)
{
if (_nCyclesPerMS != 0)
return _nCyclesPerMS;
@@ -186,7 +186,7 @@ UInt32 CTimer::GetCyclesPerMillisecond(void)
return 1;
}
-UInt32 CTimer::GetCurrentTimeInCycles(void)
+uint32 CTimer::GetCurrentTimeInCycles(void)
{
if ( _nCyclesPerMS != 0 )
{
@@ -198,7 +198,7 @@ UInt32 CTimer::GetCurrentTimeInCycles(void)
return RsTimer() - oldPcTimer;
}
-Bool CTimer::GetIsSlowMotionActive(void)
+bool CTimer::GetIsSlowMotionActive(void)
{
return ms_fTimeScale < 1.0f;
}
diff --git a/src/Timer.h b/src/Timer.h
index fa93a65e..10bb5d84 100644
--- a/src/Timer.h
+++ b/src/Timer.h
@@ -19,17 +19,18 @@ public:
static uint32 GetFrameCounter(void) { return m_FrameCounter; }
static uint32 GetTimeInMilliseconds(void) { return m_snTimeInMilliseconds; }
- static inline Bool GetIsPaused() { return m_UserPause || m_CodePause; }
- static inline void SetTimeScale(Float ts) { ms_fTimeScale = ts; }
+ static inline bool GetIsPaused() { return m_UserPause || m_CodePause; }
+ static inline bool GetIsUserPaused() { return m_UserPause; }
+ static inline void SetTimeScale(float ts) { ms_fTimeScale = ts; }
static void Initialise(void);
static void Shutdown(void);
static void Update(void);
static void Suspend(void);
static void Resume(void);
- static UInt32 GetCyclesPerMillisecond(void);
- static UInt32 GetCurrentTimeInCycles(void);
- static Bool GetIsSlowMotionActive(void);
+ static uint32 GetCyclesPerMillisecond(void);
+ static uint32 GetCurrentTimeInCycles(void);
+ static bool GetIsSlowMotionActive(void);
static void Stop(void);
static void StartUserPause(void);
static void EndUserPause(void);
diff --git a/src/TxdStore.cpp b/src/TxdStore.cpp
index 10d6e1f5..6ff7e852 100644
--- a/src/TxdStore.cpp
+++ b/src/TxdStore.cpp
@@ -22,6 +22,18 @@ CTxdStore::Shutdown(void)
delete ms_pTxdPool;
}
+void
+CTxdStore::GameShutdown(void)
+{
+ int i;
+
+ for(i = 0; i < TXDSTORESIZE; i++){
+ TxdDef *def = GetSlot(i);
+ if(def && GetNumRefs(i) == 0)
+ RemoveTxdSlot(i);
+ }
+}
+
int
CTxdStore::AddTxdSlot(const char *name)
{
@@ -89,6 +101,12 @@ CTxdStore::Create(int slot)
GetSlot(slot)->texDict = RwTexDictionaryCreate();
}
+int
+CTxdStore::GetNumRefs(int slot)
+{
+ return GetSlot(slot)->refCount;
+}
+
void
CTxdStore::AddRef(int slot)
{
@@ -137,6 +155,27 @@ CTxdStore::LoadTxd(int slot, const char *filename)
return ret;
}
+bool
+CTxdStore::StartLoadTxd(int slot, RwStream *stream)
+{
+ TxdDef *def = GetSlot(slot);
+ if(RwStreamFindChunk(stream, rwID_TEXDICTIONARY, nil, nil)){
+ def->texDict = RwTexDictionaryGtaStreamRead1(stream);
+ return def->texDict != nil;
+ }else{
+ printf("Failed to load TXD\n");
+ return nil;
+ }
+}
+
+bool
+CTxdStore::FinishLoadTxd(int slot, RwStream *stream)
+{
+ TxdDef *def = GetSlot(slot);
+ def->texDict = RwTexDictionaryGtaStreamRead2(stream, def->texDict);
+ return def->texDict != nil;
+}
+
void
CTxdStore::RemoveTxd(int slot)
{
@@ -146,15 +185,10 @@ CTxdStore::RemoveTxd(int slot)
def->texDict = nil;
}
-//bool
-//CTxdStore::isTxdLoaded(int slot)
-//{
-// return GetSlot(slot)->texDict != nil;
-//}
-
STARTPATCHES
InjectHook(0x527440, CTxdStore::Initialize, PATCH_JUMP);
InjectHook(0x527470, CTxdStore::Shutdown, PATCH_JUMP);
+ InjectHook(0x527490, CTxdStore::GameShutdown, PATCH_JUMP);
InjectHook(0x5274E0, CTxdStore::AddTxdSlot, PATCH_JUMP);
InjectHook(0x5275D0, CTxdStore::FindTxdSlot, PATCH_JUMP);
InjectHook(0x527590, CTxdStore::GetTxdName, PATCH_JUMP);
@@ -162,8 +196,13 @@ STARTPATCHES
InjectHook(0x527910, CTxdStore::PopCurrentTxd, PATCH_JUMP);
InjectHook(0x5278C0, CTxdStore::SetCurrentTxd, PATCH_JUMP);
InjectHook(0x527830, CTxdStore::Create, PATCH_JUMP);
+ InjectHook(0x527A00, CTxdStore::GetNumRefs, PATCH_JUMP);
InjectHook(0x527930, CTxdStore::AddRef, PATCH_JUMP);
InjectHook(0x527970, CTxdStore::RemoveRef, PATCH_JUMP);
InjectHook(0x5279C0, CTxdStore::RemoveRefWithoutDelete, PATCH_JUMP);
+ InjectHook(0x527700, (bool (*)(int, RwStream*))CTxdStore::LoadTxd, PATCH_JUMP);
+ InjectHook(0x5276B0, (bool (*)(int, const char*))CTxdStore::LoadTxd, PATCH_JUMP);
+ InjectHook(0x527770, CTxdStore::StartLoadTxd, PATCH_JUMP);
+ InjectHook(0x5277E0, CTxdStore::FinishLoadTxd, PATCH_JUMP);
InjectHook(0x527870, CTxdStore::RemoveTxd, PATCH_JUMP);
ENDPATCHES
diff --git a/src/TxdStore.h b/src/TxdStore.h
index a9526cf2..a9e57d31 100644
--- a/src/TxdStore.h
+++ b/src/TxdStore.h
@@ -15,6 +15,7 @@ class CTxdStore
public:
static void Initialize(void);
static void Shutdown(void);
+ static void GameShutdown(void);
static int AddTxdSlot(const char *name);
static void RemoveTxdSlot(int slot);
static int FindTxdSlot(const char *name);
@@ -23,13 +24,21 @@ public:
static void PopCurrentTxd(void);
static void SetCurrentTxd(int slot);
static void Create(int slot);
+ static int GetNumRefs(int slot);
static void AddRef(int slot);
static void RemoveRef(int slot);
static void RemoveRefWithoutDelete(int slot);
static bool LoadTxd(int slot, RwStream *stream);
static bool LoadTxd(int slot, const char *filename);
+ static bool StartLoadTxd(int slot, RwStream *stream);
+ static bool FinishLoadTxd(int slot, RwStream *stream);
static void RemoveTxd(int slot);
- static TxdDef *GetSlot(int slot) { return ms_pTxdPool->GetSlot(slot); }
+ static TxdDef *GetSlot(int slot) {
+ assert(slot >= 0);
+ assert(ms_pTxdPool);
+ assert(slot < ms_pTxdPool->GetSize());
+ return ms_pTxdPool->GetSlot(slot);
+ }
static bool isTxdLoaded(int slot);
};
diff --git a/src/Wanted.cpp b/src/Wanted.cpp
new file mode 100644
index 00000000..36bc4f03
--- /dev/null
+++ b/src/Wanted.cpp
@@ -0,0 +1,3 @@
+#include "common.h"
+#include "patcher.h"
+#include "Wanted.h"
diff --git a/src/Wanted.h b/src/Wanted.h
new file mode 100644
index 00000000..60af7d8b
--- /dev/null
+++ b/src/Wanted.h
@@ -0,0 +1,85 @@
+#pragma once
+#include "Entity.h"
+#include "math/Vector.h"
+
+enum eCrimeType
+{
+ CRIME_NONE,
+ CRIME_SHOT_FIRED,
+ CRIME_PED_FIGHT,
+ CRIME_COP_FIGHT,
+ CRIME_DAMAGED_PED,
+ CRIME_DAMAGED_COP,
+ CRIME_CAR_THEFT,
+ CRIME_CRIME7,
+ CRIME_COP_EVASIVE_DIVE,
+ CRIME_COP_EVASIVE_DIVE2,
+ CRIME_PED_RUN_OVER,
+ CRIME_COP_RUN_OVER,
+ CRIME_DESTROYED_HELI,
+ CRIME_PED_BURNED,
+ CRIME_COP_BURNED,
+ CRIME_VEHICLE_BURNED,
+ CRIME_DESTROYED_CESSNA,
+};
+
+enum eCopType
+{
+ COP_STREET = 0,
+ COP_FBI = 1,
+ COP_SWAT = 2,
+ COP_ARMY = 3,
+};
+
+class CCrime {
+public:
+ eCrimeType m_eCrimeType;
+ CEntity *m_pVictim;
+ int32 m_nCrimeTime;
+ CVector m_vecCrimePos;
+ int8 m_bReported;
+ int8 m_bMultiplier;
+ int8 pad_20[2];
+};
+
+class CCopPed {
+public:
+ int16 m_wRoadblockNode;
+ int8 field_1342;
+ int8 field_1343;
+ float m_fDistanceToTarget;
+ int8 m_bIsInPursuit;
+ int8 m_bIsDisabledCop;
+ int8 field_1350;
+ int8 field_1351;
+ int8 m_bZoneDisabledButClose;
+ int8 m_bZoneDisabled;
+ int8 field_1354;
+ int8 field_1355;
+ int32 field_1356;
+ eCopType m_nCopType;
+ int8 field_1364;
+ int8 field_1365;
+ int8 field_1366;
+ int8 field_1367;
+};
+
+class CWanted {
+public:
+ int32 m_nChaos;
+ int32 m_nLastUpdateTime;
+ int32 m_nLastWantedLevelChange;
+ float m_fCrimeSensitivity;
+ uint8 m_bCurrentCops;
+ uint8 m_bMaxCops;
+ uint8 m_bMaximumLawEnforcerVehicles;
+ int8 field_19;
+ int16 m_wRoadblockDensity;
+ uint8 m_bFlags;
+ int8 field_23;
+ int32 m_nWantedLevel;
+ CCrime m_sCrimes[16];
+ CCopPed *m_pCops[10];
+};
+
+static_assert(sizeof(CWanted) == 0x204, "CWanted: error");
diff --git a/src/World.cpp b/src/World.cpp
index 7e408091..1d45dcc8 100644
--- a/src/World.cpp
+++ b/src/World.cpp
@@ -12,6 +12,8 @@ CPtrList &CWorld::ms_listMovingEntityPtrs = *(CPtrList*)0x8F433C;
CSector (*CWorld::ms_aSectors)[NUMSECTORS_X] = (CSector (*)[NUMSECTORS_Y])0x665608;
uint16 &CWorld::ms_nCurrentScanCode = *(uint16*)0x95CC64;
+uint8 &CWorld::PlayerInFocus = *(uint8 *)0x95CD61;
+CPlayerInfo *CWorld::Players = (CPlayerInfo *)0x9412F0;
bool &CWorld::bNoMoreCollisionTorque = *(bool*)0x95CDCC;
CEntity *&CWorld::pIgnoreEntity = *(CEntity**)0x8F6494;
bool &CWorld::bIncludeDeadPeds = *(bool*)0x95CD8F;
@@ -588,3 +590,6 @@ WRAPPER CPed *FindPlayerPed(void) { EAXJMP(0x4A1150); }
WRAPPER CVector &FindPlayerCoors(CVector &v) { EAXJMP(0x4A1030); }
WRAPPER CVehicle *FindPlayerVehicle(void) { EAXJMP(0x4A10C0); }
WRAPPER CVehicle *FindPlayerTrain(void) { EAXJMP(0x4A1120); }
+WRAPPER CVector FindPlayerSpeed(void) { EAXJMP(0x4A1090); }
+WRAPPER CVector FindPlayerCentreOfWorld_NoSniperShift(void) { EAXJMP(0x4A11C0); }
+
diff --git a/src/World.h b/src/World.h
index 2440906c..77e0fd99 100644
--- a/src/World.h
+++ b/src/World.h
@@ -2,6 +2,7 @@
#include "Game.h"
#include "Lists.h"
+#include "PlayerInfo.h"
/* Sectors span from -2000 to 2000 in x and y.
* With 100x100 sectors, each is 40x40 units. */
@@ -45,6 +46,8 @@ class CWorld
static uint16 &ms_nCurrentScanCode;
public:
+ static uint8 &PlayerInFocus;
+ static CPlayerInfo *Players;
static CEntity *&pIgnoreEntity;
static bool &bIncludeDeadPeds;
static bool &bNoMoreCollisionTorque;
@@ -95,3 +98,5 @@ CPed *FindPlayerPed(void);
CVector &FindPlayerCoors(CVector &v);
CVehicle *FindPlayerVehicle(void);
CVehicle *FindPlayerTrain(void);
+CVector FindPlayerSpeed(void);
+CVector FindPlayerCentreOfWorld_NoSniperShift(void); \ No newline at end of file
diff --git a/src/audio/AudioScriptObject.cpp b/src/audio/AudioScriptObject.cpp
index 7cb81f7a..a8c645d4 100644
--- a/src/audio/AudioScriptObject.cpp
+++ b/src/audio/AudioScriptObject.cpp
@@ -1,7 +1,7 @@
#include "common.h"
#include "AudioScriptObject.h"
-void PlayOneShotScriptObject(UInt8 id, CVector const &pos)
+void PlayOneShotScriptObject(uint8 id, CVector const &pos)
{
- ((void (__cdecl *)(UInt8, CVector const &))0x57C5F0)(id, pos);
+ ((void (__cdecl *)(uint8, CVector const &))0x57C5F0)(id, pos);
} \ No newline at end of file
diff --git a/src/audio/AudioScriptObject.h b/src/audio/AudioScriptObject.h
index a30af679..c325ce27 100644
--- a/src/audio/AudioScriptObject.h
+++ b/src/audio/AudioScriptObject.h
@@ -128,4 +128,4 @@ enum /*eSounds*/
_SOUND_BULLET_SHELL_HIT_GROUND_2 = 123,
};
-extern void PlayOneShotScriptObject(UInt8 id, CVector const &pos); \ No newline at end of file
+extern void PlayOneShotScriptObject(uint8 id, CVector const &pos); \ No newline at end of file
diff --git a/src/audio/DMAudio.cpp b/src/audio/DMAudio.cpp
index dcfdc81b..7f74fd8a 100644
--- a/src/audio/DMAudio.cpp
+++ b/src/audio/DMAudio.cpp
@@ -10,10 +10,10 @@ WRAPPER void cDMAudio::ReacquireDigitalHandle(void) { EAXJMP(0x57CA30); }
WRAPPER void cDMAudio::Service(void) { EAXJMP(0x57C7A0); }
WRAPPER void cDMAudio::ReportCollision(CEntity *A, CEntity *B, uint8 surfA, uint8 surfB, float impulse, float speed) { EAXJMP(0x57CBE0); }
-WRAPPER void cDMAudio::ResetTimers(UInt32 timerval) { EAXJMP(0x57CCD0); }
-WRAPPER Bool cDMAudio::IsAudioInitialised() { EAXJMP(0x57CAB0); }
-WRAPPER Char cDMAudio::GetCDAudioDriveLetter() { EAXJMP(0x57CA90); }
-WRAPPER Bool cDMAudio::CheckForAnAudioFileOnCD() { EAXJMP(0x57CA70); }
-WRAPPER void cDMAudio::ChangeMusicMode(UInt8 mode) { EAXJMP(0x57CCF0); }
+WRAPPER void cDMAudio::ResetTimers(uint32 timerval) { EAXJMP(0x57CCD0); }
+WRAPPER bool cDMAudio::IsAudioInitialised() { EAXJMP(0x57CAB0); }
+WRAPPER char cDMAudio::GetCDAudioDriveLetter() { EAXJMP(0x57CA90); }
+WRAPPER bool cDMAudio::CheckForAnAudioFileOnCD() { EAXJMP(0x57CA70); }
+WRAPPER void cDMAudio::ChangeMusicMode(uint8 mode) { EAXJMP(0x57CCF0); }
WRAPPER void cDMAudio::PlayFrontEndSound(uint32, uint32) { EAXJMP(0x57CC20); }
diff --git a/src/audio/DMAudio.h b/src/audio/DMAudio.h
index 91a3ff0f..9006d248 100644
--- a/src/audio/DMAudio.h
+++ b/src/audio/DMAudio.h
@@ -1,5 +1,177 @@
#pragma once
+enum eSound
+{
+ SOUND_CAR_DOOR_CLOSE_BONNET = 0,
+ SOUND_CAR_DOOR_CLOSE_BUMPER = 1,
+ SOUND_CAR_DOOR_CLOSE_FRONT_LEFT = 2,
+ SOUND_CAR_DOOR_CLOSE_FRONT_RIGHT = 3,
+ SOUND_CAR_DOOR_CLOSE_BACK_LEFT = 4,
+ SOUND_CAR_DOOR_CLOSE_BACK_RIGHT = 5,
+ SOUND_CAR_DOOR_OPEN_BONNET = 6,
+ SOUND_CAR_DOOR_OPEN_BUMPER = 7,
+ SOUND_CAR_DOOR_OPEN_FRONT_LEFT = 8,
+ SOUND_CAR_DOOR_OPEN_FRONT_RIGHT = 9,
+ SOUND_CAR_DOOR_OPEN_BACK_LEFT = 10,
+ SOUND_CAR_DOOR_OPEN_BACK_RIGHT = 11,
+ SOUND_CAR_WINDSHIELD_CRACK = 12,
+ SOUND_CAR_JUMP = 13,
+ SOUND_E = 14,
+ SOUND_F = 15,
+ SOUND_CAR_ENGINE_START = 16,
+ SOUND_CAR_LIGHT_BREAK = 17,
+ SOUND_CAR_HYDRALIC_1 = 18,
+ SOUND_CAR_HYDRALIC_2 = 19,
+ SOUND_CAR_HYDRALIC_3 = 20,
+ SOUND_CAR_JERK = 21,
+ SOUND_CAR_SPLASH = 22,
+ SOUND_17 = 23,
+ SOUND_18 = 24,
+ SOUND_19 = 25,
+ SOUND_CAR_TANK_TURRET_ROTATE = 26,
+ SOUND_CAR_BOMB_TICK = 27,
+ SOUND_PLANE_ON_GROUND = 28,
+ SOUND_STEP_START = 29,
+ SOUND_STEP_END = 30,
+ SOUND_FALL_LAND = 31,
+ SOUND_FALL_COLLAPSE = 32,
+ SOUND_21 = 33,
+ SOUND_22 = 34,
+ SOUND_23 = 35,
+ SOUND_24 = 36,
+ SOUND_25 = 37,
+ SOUND_26 = 38,
+ SOUND_WEAPON_PUNCH_ATTACK = 39,
+ SOUND_28 = 40,
+ SOUND_29 = 41,
+ SOUND_2A = 42,
+ SOUND_2B = 43,
+ SOUND_2C = 44,
+ SOUND_2D = 45,
+ SOUND_WEAPON_BAT_ATTACK = 46,
+ SOUND_WEAPON_SHOT_FIRED = 47,
+ SOUND_WEAPON_RELOAD = 48,
+ SOUND_31 = 49,
+ SOUND_32 = 50,
+ SOUND_33 = 51,
+ SOUND_WEAPON_FLAMETHROWER_FIRE = 52,
+ SOUND_WEAPON_SNIPER_SHOT_NO_ZOOM = 53,
+ SOUND_WEAPON_ROCKET_SHOT_NO_ZOOM = 54,
+ SOUND_WEAPON_HIT_PED = 55,
+ SOUND_WEAPON_HIT_VEHICLE = 56,
+ SOUND_GARAGE_NO_MONEY = 57,
+ SOUND_GARAGE_BAD_VEHICLE = 58,
+ SOUND_GARAGE_OPENING = 59,
+ SOUND_3C = 60,
+ SOUND_GARAGE_BOMB1_SET = 61,
+ SOUND_GARAGE_BOMB2_SET = 62,
+ SOUND_GARAGE_BOMB3_SET = 63,
+ SOUND_40 = 64,
+ SOUND_41 = 65,
+ SOUND_GARAGE_VEHICLE_DECLINED = 66,
+ SOUND_GARAGE_VEHICLE_ACCEPTED = 67,
+ SOUND_GARAGE_DOOR_CLOSED = 68,
+ SOUND_GARAGE_DOOR_OPENED = 69,
+ SOUND_CRANE_PICKUP = 70,
+ SOUND_PICKUP_WEAPON_BOUGHT = 71,
+ SOUND_PICKUP_WEAPON = 72,
+ SOUND_PICKUP_HEALTH = 73,
+ SOUND_4A = 74,
+ SOUND_4B = 75,
+ SOUND_PICKUP_ADRENALINE = 76,
+ SOUND_PICKUP_ARMOUR = 77,
+ SOUND_PICKUP_BONUS = 78,
+ SOUND_PICKUP_MONEY = 79,
+ SOUND_PICKUP_HIDDEN_PACKAGE = 80,
+ SOUND_PICKUP_PACMAN_PILL = 81,
+ SOUND_PICKUP_PACMAN_PACKAGE = 82,
+ SOUND_PICKUP_FLOAT_PACKAGE = 83,
+ SOUND_BOMB_TIMED_ACTIVATED = 84,
+ SOUND_55 = 85,
+ SOUND_BOMB_ONIGNITION_ACTIVATED = 86,
+ SOUND_BOMB_TICK = 87,
+ SOUND_RAMPAGE_START = 88,
+ SOUND_RAMPAGE_ONGOING = 89,
+ SOUND_RAMPAGE_PASSED = 90,
+ SOUND_RAMPAGE_FAILED = 91,
+ SOUND_RAMPAGE_KILL = 92,
+ SOUND_RAMPAGE_CAR_BLOWN = 93,
+ _SOUND_EVIDENCE_PICKUP = 94,
+ _SOUND_UNLOAD_GOLD = 95,
+ SOUND_PAGER = 96,
+ SOUND_PED_DEATH = 97,
+ SOUND_PED_DAMAGE = 98,
+ SOUND_PED_63 = 99,
+ SOUND_PED_LAND = 100,
+ SOUND_PED_BULLET_HIT = 101,
+ SOUND_PED_BOMBER = 102,
+ SOUND_PED_BURNING = 103,
+ SOUND_PED_ARREST_FBI = 104,
+ SOUND_PED_ARREST_SWAT = 105,
+ SOUND_PED_ARREST_COP = 106,
+ SOUND_PED_HELI_PLAYER_FOUND = 107,
+ SOUND_PED_HANDS_UP = 108,
+ SOUND_PED_HANDS_COWER = 109,
+ SOUND_PED_FLEE_SPRINT = 110,
+ SOUND_PED_CAR_JACKING = 111,
+ SOUND_PED_MUGGING = 112,
+ SOUND_PED_CAR_JACKED = 113,
+ SOUND_PED_ROBBED = 114,
+ SOUND_PED_TAXI_WAIT = 115,
+ SOUND_PED_ATTACK = 116,
+ SOUND_PED_DEFEND = 117,
+ SOUND_PED_PURSUIT_ARMY = 118,
+ SOUND_PED_PURSUIT_FBI = 119,
+ SOUND_PED_PURSUIT_SWAT = 120,
+ SOUND_PED_PURSUIT_COP = 121,
+ SOUND_PED_HEALING = 122,
+ SOUND_PED_7B = 123,
+ SOUND_PED_LEAVE_VEHICLE = 124,
+ SOUND_PED_EVADE = 125,
+ SOUND_PED_FLEE_RUN = 126,
+ SOUND_PED_CAR_COLLISION = 127,
+ SOUND_PED_SOLICIT = 128,
+ SOUND_PED_EXTINGUISHING_FIRE = 129,
+ SOUND_PED_WAIT_DOUBLEBACK = 130,
+ SOUND_PED_CHAT_SEXY = 131,
+ SOUND_PED_CHAT_EVENT = 132,
+ SOUND_PED_CHAT = 133,
+ SOUND_PED_BODYCAST_HIT = 134,
+ SOUND_PED_TAXI_CALL = 135,
+ SOUND_INJURED_PED_MALE_OUCH = 136,
+ SOUND_INJURED_PED_FEMALE = 137,
+ SOUND_8A = 138,
+ _SOUND_RACE_START_3 = 139,
+ _SOUND_RACE_START_2 = 140,
+ _SOUND_RACE_START_1 = 141,
+ _SOUND_RACE_START_GO = 142,
+ SOUND_SPLASH = 143,
+ SOUND_WATER_FALL = 144,
+ SOUND_SPLATTER = 145,
+ SOUND_CAR_PED_COLLISION = 146,
+ SOUND_CLOCK_TICK = 147,
+ _SOUND_PART_MISSION_COMPLETE = 148,
+ SOUND_FRONTEND_MENU_STARTING = 149,
+ SOUND_FRONTEND_MENU_COMPLETED = 150,
+ SOUND_FRONTEND_MENU_DENIED = 151,
+ SOUND_FRONTEND_MENU_SUCCESS = 152,
+ SOUND_FRONTEND_EXIT = 153,
+ SOUND_9A = 154,
+ SOUND_9B = 155,
+ SOUND_FRONTEND_AUDIO_TEST = 156,
+ SOUND_FRONTEND_FAIL = 157,
+ SOUND_FRONTEND_NO_RADIO = 158,
+ SOUND_FRONTEND_RADIO_CHANGE = 159,
+ SOUND_A0 = 160,
+ SOUND_AMMUNATION_WELCOME_1 = 161,
+ SOUND_AMMUNATION_WELCOME_2 = 162,
+ SOUND_AMMUNATION_WELCOME_3 = 163,
+ SOUND_LIGHTNING = 164,
+ SOUND_A5 = 165,
+ SOUND_TOTAL_SOUNDS = 166,
+ SOUND_TOTAL_PED_SOUNDS = 167,
+};
+
class CEntity;
class cDMAudio
@@ -9,13 +181,12 @@ public:
void ReleaseDigitalHandle(void);
void ReacquireDigitalHandle(void);
void Service(void);
- void ReportCollision(CEntity* A, CEntity* B, uint8 surfA, uint8 surfB,
- float impulse, float speed);
- void ResetTimers(UInt32 timerval);
- Bool IsAudioInitialised(void);
- Char GetCDAudioDriveLetter(void);
- Bool CheckForAnAudioFileOnCD(void);
- void ChangeMusicMode(UInt8 mode);
+ void ReportCollision(CEntity* A, CEntity* B, uint8 surfA, uint8 surfB, float impulse, float speed);
+ void ResetTimers(uint32 timerval);
+ bool IsAudioInitialised(void);
+ char GetCDAudioDriveLetter(void);
+ bool CheckForAnAudioFileOnCD(void);
+ void ChangeMusicMode(uint8 mode);
void PlayFrontEndSound(uint32, uint32);
};
-extern cDMAudio& DMAudio;
+extern cDMAudio &DMAudio;
diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp
index 0e6870de..881f6407 100644
--- a/src/audio/MusicManager.cpp
+++ b/src/audio/MusicManager.cpp
@@ -1,7 +1,141 @@
#include "common.h"
#include "patcher.h"
#include "MusicManager.h"
+#include "Font.h"
+#include "Hud.h"
+#include "Text.h"
+#include "Timer.h"
+#include "Camera.h"
+#include "World.h"
+#include "ModelIndices.h"
+#include "SampleManager.h"
cMusicManager &MusicManager = *(cMusicManager*)0x8F3964;
+int &gNumRetunePresses = *(int*)0x650B80;
+int &gRetuneCounter = *(int*)0x650B84;
-WRAPPER void cMusicManager::DisplayRadioStationName(void) { EAXJMP(0x57E6D0); }
+//WRAPPER void cMusicManager::DisplayRadioStationName(void) { EAXJMP(0x57E6D0); }
+
+bool cMusicManager::PlayerInCar()
+{
+ if (!FindPlayerVehicle())
+ return false;
+ else {
+ int32 State = CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_nPedState;
+
+ if (State == PED_DRAG_FROM_CAR || State == PED_EXIT_CAR || State == PED_ARRESTED)
+ return false;
+
+ switch (FindPlayerVehicle()->m_modelIndex) {
+ case MI_FIRETRUCK:
+ case MI_AMBULAN:
+ case MI_MRWHOOP:
+ case MI_PREDATOR:
+ case MI_TRAIN:
+ case MI_SPEEDER:
+ case MI_REEFER:
+ case MI_GHOST:
+ return false;
+ default:
+ return true;
+ }
+ }
+}
+
+void cMusicManager::DisplayRadioStationName()
+{
+ wchar *RadioName = nullptr;
+ uint32 RadioStation = gNumRetunePresses + MusicManager.m_nCurrentStreamedSound;
+
+ switch (RadioStation) {
+ case HEAD_RADIO:
+ RadioName = TheText.Get("FEA_FM0");
+ break;
+ case DOUBLE_CLEF:
+ RadioName = TheText.Get("FEA_FM1");
+ break;
+ case JAH_RADIO:
+ RadioName = TheText.Get("FEA_FM2");
+ break;
+ case RISE_FM:
+ RadioName = TheText.Get("FEA_FM3");
+ break;
+ case LIPS_106:
+ RadioName = TheText.Get("FEA_FM4");
+ break;
+ case GAME_FM:
+ RadioName = TheText.Get("FEA_FM5");
+ break;
+ case MSX_FM:
+ RadioName = TheText.Get("FEA_FM6");
+ break;
+ case FLASHBACK:
+ RadioName = TheText.Get("FEA_FM7");
+ break;
+ case CHATTERBOX:
+ RadioName = TheText.Get("FEA_FM8");
+ break;
+ case USERTRACK:
+ RadioName = TheText.Get("FEA_FM9");
+ break;
+ default:
+ RadioName = nullptr;
+ break;
+ }
+
+ CFont::SetJustifyOff();
+ CFont::SetBackgroundOff();
+ CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
+ CFont::SetPropOn();
+ CFont::SetFontStyle(FONT_HEADING);
+ CFont::SetCentreOn();
+ CFont::SetCentreSize(HUD_STRETCH_X(640.0f));;
+
+ static int32 nTime = 0;
+ if (!CTimer::GetIsPaused() && !TheCamera.m_WideScreenOn && MusicManager.PlayerInCar()) {
+ if (gNumRetunePresses || (MusicManager.m_bPlayerInCar && !MusicManager.m_bPreviousPlayerInCar))
+ nTime = CTimer::GetTimeInMilliseconds() + 2000;
+
+ if (CTimer::GetTimeInMilliseconds() < nTime) {
+ if (RadioStation) {
+ if (MusicManager.m_nCurrentStreamedSound == STREAMED_SOUND_WATER_AMBIENT ||
+ MusicManager.m_nCurrentStreamedSound == STREAMED_SOUND_RADIO_POLICE ||
+ MusicManager.m_nCurrentStreamedSound == STREAMED_SOUND_WATER_AMBIENT ||
+ MusicManager.m_nCurrentStreamedSound == STREAMED_SOUND_CITY_AMBIENT)
+ RadioStation = RADIO_OFF;
+ else {
+ if (RadioStation > HEAD_RADIO) {
+ if (cSampleManager.IsMP3RadioChannelAvailable()) {
+ if (RadioStation > USERTRACK) {
+ RadioStation = RADIO_OFF;
+ return;
+ }
+ }
+ else {
+ if (RadioStation > CHATTERBOX) {
+ RadioStation = RADIO_OFF;
+ return;
+ }
+ }
+ }
+ else
+ RadioStation = RADIO_OFF;
+ }
+ }
+
+ if (RadioName) {
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+
+ CFont::PrintString(SCREEN_WIDTH / 2, HUD_STRETCH_Y(23.0f), RadioName);
+
+ if (gNumRetunePresses)
+ CFont::SetColor(CRGBA(102, 133, 143, 255));
+ else
+ CFont::SetColor(CRGBA(147, 196, 211, 255));
+
+ CFont::PrintString(SCREEN_WIDTH / 2, HUD_STRETCH_Y(22.0f), RadioName);
+ CFont::DrawFonts();
+ }
+ }
+ }
+}
diff --git a/src/audio/MusicManager.h b/src/audio/MusicManager.h
index 42cc879d..644c3df3 100644
--- a/src/audio/MusicManager.h
+++ b/src/audio/MusicManager.h
@@ -1,8 +1,273 @@
#pragma once
+enum eRadioStation
+{
+ HEAD_RADIO,
+ DOUBLE_CLEF,
+ JAH_RADIO,
+ RISE_FM,
+ LIPS_106,
+ GAME_FM,
+ MSX_FM,
+ FLASHBACK,
+ CHATTERBOX,
+ USERTRACK,
+ POLICE_RADIO,
+ RADIO_OFF,
+};
+
+enum eStreamedSounds
+{
+ STREAMED_SOUND_RADIO_HEAD = 0,
+ STREAMED_SOUND_RADIO_CLASSIC = 1,
+ STREAMED_SOUND_RADIO_KJAH = 2,
+ STREAMED_SOUND_RADIO_RISE = 3,
+ STREAMED_SOUND_RADIO_LIPS = 4,
+ STREAMED_SOUND_RADIO_GAME = 5,
+ STREAMED_SOUND_RADIO_MSX = 6,
+ STREAMED_SOUND_RADIO_FLASH = 7,
+ STREAMED_SOUND_RADIO_CHAT = 8,
+ STREAMED_SOUND_RADIO_MP3_PLAYER = 9,
+ STREAMED_SOUND_RADIO_POLICE = 10,
+ STREAMED_SOUND_CITY_AMBIENT = 11,
+ STREAMED_SOUND_WATER_AMBIENT = 12,
+ STREAMED_SOUND_ANNOUNCE_COMMERCIAL_OPEN = 13,
+ STREAMED_SOUND_ANNOUNCE_SUBURBAN_OPEN = 14,
+ STREAMED_SOUND_NEWS_INTRO = 15,
+ STREAMED_SOUND_BANK_INTRO = 16,
+ STREAMED_SOUND_CUTSCENE_LUIGI1_LG = 17,
+ STREAMED_SOUND_CUTSCENE_LUIGI2_DSB = 18,
+ STREAMED_SOUND_CUTSCENE_LUIGI3_DM = 19,
+ STREAMED_SOUND_CUTSCENE_LUIGI4_PAP = 20,
+ STREAMED_SOUND_CUTSCENE_LUIGI5_TFB = 21,
+ STREAMED_SOUND_CUTSCENE_JOEY0_DM2 = 22,
+ STREAMED_SOUND_CUTSCENE_JOEY1_LFL = 23,
+ STREAMED_SOUND_CUTSCENE_JOEY2_KCL = 24,
+ STREAMED_SOUND_CUTSCENE_JOEY3_VH = 25,
+ STREAMED_SOUND_CUTSCENE_JOEY4_ETH = 26,
+ STREAMED_SOUND_CUTSCENE_JOEY5_DST = 27,
+ STREAMED_SOUND_CUTSCENE_JOEY6_TBJ = 28,
+ STREAMED_SOUND_CUTSCENE_TONI1_TOL = 29,
+ STREAMED_SOUND_CUTSCENE_TONI2_TPU = 30,
+ STREAMED_SOUND_CUTSCENE_TONI3_MAS = 31,
+ STREAMED_SOUND_CUTSCENE_TONI4_TAT = 32,
+ STREAMED_SOUND_CUTSCENE_TONI5_BF = 33,
+ STREAMED_SOUND_CUTSCENE_SAL0_MAS = 34,
+ STREAMED_SOUND_CUTSCENE_SAL1_PF = 35,
+ STREAMED_SOUND_CUTSCENE_SAL2_CTG = 36,
+ STREAMED_SOUND_CUTSCENE_SAL3_RTC = 37,
+ STREAMED_SOUND_CUTSCENE_SAL5_LRQ = 38,
+ STREAMED_SOUND_CUTSCENE_SAL4_BDBA = 39,
+ STREAMED_SOUND_CUTSCENE_SAL4_BDBB = 40,
+ STREAMED_SOUND_CUTSCENE_SAL2_CTG2 = 41,
+ STREAMED_SOUND_CUTSCENE_SAL4_BDBD = 42,
+ STREAMED_SOUND_CUTSCENE_SAL5_LRQB = 43,
+ STREAMED_SOUND_CUTSCENE_SAL5_LRQC = 44,
+ STREAMED_SOUND_CUTSCENE_ASUKA_1_SSO = 45,
+ STREAMED_SOUND_CUTSCENE_ASUKA_2_PP = 46,
+ STREAMED_SOUND_CUTSCENE_ASUKA_3_SS = 47,
+ STREAMED_SOUND_CUTSCENE_ASUKA_4_PDR = 48,
+ STREAMED_SOUND_CUTSCENE_ASUKA_5_K2FT = 49,
+ STREAMED_SOUND_CUTSCENE_KENJI1_KBO = 50,
+ STREAMED_SOUND_CUTSCENE_KENJI2_GIS = 51,
+ STREAMED_SOUND_CUTSCENE_KENJI3_DS = 52,
+ STREAMED_SOUND_CUTSCENE_KENJI4_SHI = 53,
+ STREAMED_SOUND_CUTSCENE_KENJI5_SD = 54,
+ STREAMED_SOUND_CUTSCENE_RAY0_PDR2 = 55,
+ STREAMED_SOUND_CUTSCENE_RAY1_SW = 56,
+ STREAMED_SOUND_CUTSCENE_RAY2_AP = 57,
+ STREAMED_SOUND_CUTSCENE_RAY3_ED = 58,
+ STREAMED_SOUND_CUTSCENE_RAY4_GF = 59,
+ STREAMED_SOUND_CUTSCENE_RAY5_PB = 60,
+ STREAMED_SOUND_CUTSCENE_RAY6_MM = 61,
+ STREAMED_SOUND_CUTSCENE_DONALD1_STOG = 62,
+ STREAMED_SOUND_CUTSCENE_DONALD2_KK = 63,
+ STREAMED_SOUND_CUTSCENE_DONALD3_ADO = 64,
+ STREAMED_SOUND_CUTSCENE_DONALD5_ES = 65,
+ STREAMED_SOUND_CUTSCENE_DONALD7_MLD = 66,
+ STREAMED_SOUND_CUTSCENE_DONALD4_GTA = 67,
+ STREAMED_SOUND_CUTSCENE_DONALD4_GTA2 = 68,
+ STREAMED_SOUND_CUTSCENE_DONALD6_STS = 69,
+ STREAMED_SOUND_CUTSCENE_ASUKA6_BAIT = 70,
+ STREAMED_SOUND_CUTSCENE_ASUKA7_ETG = 71,
+ STREAMED_SOUND_CUTSCENE_ASUKA8_PS = 72,
+ STREAMED_SOUND_CUTSCENE_ASUKA9_ASD = 73,
+ STREAMED_SOUND_CUTSCENE_KENJI4_SHI2 = 74,
+ STREAMED_SOUND_CUTSCENE_CATALINA1_TEX = 75,
+ STREAMED_SOUND_CUTSCENE_ELBURRO1_PH1 = 76,
+ STREAMED_SOUND_CUTSCENE_ELBURRO2_PH2 = 77,
+ STREAMED_SOUND_CUTSCENE_ELBURRO3_PH3 = 78,
+ STREAMED_SOUND_CUTSCENE_ELBURRO4_PH4 = 79,
+ STREAMED_SOUND_CUTSCENE_YARDIE_PH1 = 80,
+ STREAMED_SOUND_CUTSCENE_YARDIE_PH2 = 81,
+ STREAMED_SOUND_CUTSCENE_YARDIE_PH3 = 82,
+ STREAMED_SOUND_CUTSCENE_YARDIE_PH4 = 83,
+ STREAMED_SOUND_CUTSCENE_HOODS_PH1 = 84,
+ STREAMED_SOUND_CUTSCENE_HOODS_PH2 = 85,
+ STREAMED_SOUND_CUTSCENE_HOODS_PH3 = 86,
+ STREAMED_SOUND_CUTSCENE_HOODS_PH4 = 87,
+ STREAMED_SOUND_CUTSCENE_HOODS_PH5 = 88,
+ STREAMED_SOUND_CUTSCENE_MARTY_PH1 = 89,
+ STREAMED_SOUND_CUTSCENE_MARTY_PH2 = 90,
+ STREAMED_SOUND_CUTSCENE_MARTY_PH3 = 91,
+ STREAMED_SOUND_CUTSCENE_MARTY_PH4 = 92,
+ STREAMED_SOUND_MISSION_COMPLETED = 93,
+ STREAMED_SOUND_GAME_COMPLETED = 94,
+ STREAMED_SOUND_MISSION_LIB_A1 = 95,
+ STREAMED_SOUND_MISSION_LIB_A2 = 96,
+ STREAMED_SOUND_MISSION_LIB_A = 97,
+ STREAMED_SOUND_MISSION_LIB_B = 98,
+ STREAMED_SOUND_MISSION_LIB_C = 99,
+ STREAMED_SOUND_MISSION_LIB_D = 100,
+ STREAMED_SOUND_MISSION_L2_A = 101,
+ STREAMED_SOUND_MISSION_J4T_1 = 102,
+ STREAMED_SOUND_MISSION_J4T_2 = 103,
+ STREAMED_SOUND_MISSION_J4T_3 = 104,
+ STREAMED_SOUND_MISSION_J4T_4 = 105,
+ STREAMED_SOUND_MISSION_J4_A = 106,
+ STREAMED_SOUND_MISSION_J4_B = 107,
+ STREAMED_SOUND_MISSION_J4_C = 108,
+ STREAMED_SOUND_MISSION_J4_D = 109,
+ STREAMED_SOUND_MISSION_J4_E = 110,
+ STREAMED_SOUND_MISSION_J4_F = 111,
+ STREAMED_SOUND_MISSION_J6_1 = 112,
+ STREAMED_SOUND_MISSION_J6_A = 113,
+ STREAMED_SOUND_MISSION_J6_B = 114,
+ STREAMED_SOUND_MISSION_J6_C = 115,
+ STREAMED_SOUND_MISSION_J6_D = 116,
+ STREAMED_SOUND_MISSION_T4_A = 117,
+ STREAMED_SOUND_MISSION_S1_A = 118,
+ STREAMED_SOUND_MISSION_S1_A1 = 119,
+ STREAMED_SOUND_MISSION_S1_B = 120,
+ STREAMED_SOUND_MISSION_S1_C = 121,
+ STREAMED_SOUND_MISSION_S1_C1 = 122,
+ STREAMED_SOUND_MISSION_S1_D = 123,
+ STREAMED_SOUND_MISSION_S1_E = 124,
+ STREAMED_SOUND_MISSION_S1_F = 125,
+ STREAMED_SOUND_MISSION_S1_G = 126,
+ STREAMED_SOUND_MISSION_S1_H = 127,
+ STREAMED_SOUND_MISSION_S1_I = 128,
+ STREAMED_SOUND_MISSION_S1_J = 129,
+ STREAMED_SOUND_MISSION_S1_K = 130,
+ STREAMED_SOUND_MISSION_S1_L = 131,
+ STREAMED_SOUND_MISSION_S3_A = 132,
+ STREAMED_SOUND_MISSION_S3_B = 133,
+ STREAMED_SOUND_MISSION_EL3_A = 134,
+ STREAMED_SOUND_MISSION_MF1_A = 135,
+ STREAMED_SOUND_MISSION_MF2_A = 136,
+ STREAMED_SOUND_MISSION_MF3_A = 137,
+ STREAMED_SOUND_MISSION_MF3_B = 138,
+ STREAMED_SOUND_MISSION_MF3_B1 = 139,
+ STREAMED_SOUND_MISSION_MF3_C = 140,
+ STREAMED_SOUND_MISSION_MF4_A = 141,
+ STREAMED_SOUND_MISSION_MF4_B = 142,
+ STREAMED_SOUND_MISSION_MF4_C = 143,
+ STREAMED_SOUND_MISSION_A1_A = 144,
+ STREAMED_SOUND_MISSION_A3_A = 145,
+ STREAMED_SOUND_MISSION_A5_A = 146,
+ STREAMED_SOUND_MISSION_A4_A = 147,
+ STREAMED_SOUND_MISSION_A4_B = 148,
+ STREAMED_SOUND_MISSION_A4_C = 149,
+ STREAMED_SOUND_MISSION_A4_D = 150,
+ STREAMED_SOUND_MISSION_K1_A = 151,
+ STREAMED_SOUND_MISSION_K3_A = 152,
+ STREAMED_SOUND_MISSION_R1_A = 153,
+ STREAMED_SOUND_MISSION_R2_A = 154,
+ STREAMED_SOUND_MISSION_R2_B = 155,
+ STREAMED_SOUND_MISSION_R2_C = 156,
+ STREAMED_SOUND_MISSION_R2_D = 157,
+ STREAMED_SOUND_MISSION_R2_E = 158,
+ STREAMED_SOUND_MISSION_R2_F = 159,
+ STREAMED_SOUND_MISSION_R2_G = 160,
+ STREAMED_SOUND_MISSION_R2_H = 161,
+ STREAMED_SOUND_MISSION_R5_A = 162,
+ STREAMED_SOUND_MISSION_R6_A = 163,
+ STREAMED_SOUND_MISSION_R6_A1 = 164,
+ STREAMED_SOUND_MISSION_R6_B = 165,
+ STREAMED_SOUND_MISSION_LO2_A = 166,
+ STREAMED_SOUND_MISSION_LO6_A = 167,
+ STREAMED_SOUND_MISSION_YD2_A = 168,
+ STREAMED_SOUND_MISSION_YD2_B = 169,
+ STREAMED_SOUND_MISSION_YD2_C = 170,
+ STREAMED_SOUND_MISSION_YD2_C1 = 171,
+ STREAMED_SOUND_MISSION_YD2_D = 172,
+ STREAMED_SOUND_MISSION_YD2_E = 173,
+ STREAMED_SOUND_MISSION_YD2_F = 174,
+ STREAMED_SOUND_MISSION_YD2_G = 175,
+ STREAMED_SOUND_MISSION_YD2_H = 176,
+ STREAMED_SOUND_MISSION_YD2_ASS = 177,
+ STREAMED_SOUND_MISSION_YD2_OK = 178,
+ STREAMED_SOUND_MISSION_H5_A = 179,
+ STREAMED_SOUND_MISSION_H5_B = 180,
+ STREAMED_SOUND_MISSION_H5_C = 181,
+ STREAMED_SOUND_MISSION_AMMU_A = 182,
+ STREAMED_SOUND_MISSION_AMMU_B = 183,
+ STREAMED_SOUND_MISSION_AMMU_C = 184,
+ STREAMED_SOUND_MISSION_DOOR_1 = 185,
+ STREAMED_SOUND_MISSION_DOOR_2 = 186,
+ STREAMED_SOUND_MISSION_DOOR_3 = 187,
+ STREAMED_SOUND_MISSION_DOOR_4 = 188,
+ STREAMED_SOUND_MISSION_DOOR_5 = 189,
+ STREAMED_SOUND_MISSION_DOOR_6 = 190,
+ STREAMED_SOUND_MISSION_T3_A = 191,
+ STREAMED_SOUND_MISSION_T3_B = 192,
+ STREAMED_SOUND_MISSION_T3_C = 193,
+ STREAMED_SOUND_MISSION_K1_B = 194,
+ STREAMED_SOUND_MISSION_CAT1 = 195,
+ TOTAL_STREAMED_SOUNDS = 196,
+ NO_STREAMED_SOUND = 197,
+};
+
+class tMP3Sample
+{
+public:
+ uint32 m_nLength;
+ uint32 m_nPosition;
+ uint32 m_nLastPosCheckTimer;
+};
+
class cMusicManager
{
public:
- void DisplayRadioStationName(void);
+ bool m_bIsInitialised;
+ uint8 field_1;
+ uint8 m_nMusicMode;
+ uint8 m_nCurrentStreamedSound;
+ uint8 m_nPreviousStreamedSound;
+ uint8 field_5;
+ uint8 field_6;
+ uint8 field_7;
+ bool m_bAnnouncement;
+ bool m_bPreviousPlayerInCar;
+ bool m_bPlayerInCar;
+ bool m_bAnnouncementInProgress;
+ tMP3Sample m_asMP3Samples[196];
+ uint8 field_2364;
+ uint8 field_2365;
+ uint8 field_2366;
+ uint8 field_2367;
+ uint32 field_2368;
+ uint32 field_2372;
+ uint32 field_2376;
+ uint8 field_2380;
+ uint8 field_2381;
+ uint8 field_2382;
+ bool m_bRadioSetByScript;
+ uint8 m_nRadioStation;
+ uint8 field_2385;
+ uint8 field_2386;
+ uint8 field_2387;
+ uint32 m_nRadioPosition;
+ bool m_bRadioInCar;
+ uint8 field_2393;
+ uint8 field_2394;
+ uint8 field_2395;
+
+public:
+ bool PlayerInCar();
+ void DisplayRadioStationName();
};
+
+static_assert(sizeof(cMusicManager) == 0x95C, "cMusicManager: error");
+
extern cMusicManager &MusicManager;
diff --git a/src/audio/SampleManager.cpp b/src/audio/SampleManager.cpp
new file mode 100644
index 00000000..2319baec
--- /dev/null
+++ b/src/audio/SampleManager.cpp
@@ -0,0 +1,9 @@
+#include "common.h"
+#include "SampleManager.h"
+
+CSampleManager &cSampleManager = *(CSampleManager *)0x7341E0;
+uint32 &CSampleManager::nNumOfMp3Files = *(uint32*)0x95CC00;
+
+bool CSampleManager::IsMP3RadioChannelAvailable() {
+ return nNumOfMp3Files != 0;
+}
diff --git a/src/audio/SampleManager.h b/src/audio/SampleManager.h
new file mode 100644
index 00000000..b8bd2011
--- /dev/null
+++ b/src/audio/SampleManager.h
@@ -0,0 +1,11 @@
+#pragma once
+
+class CSampleManager {
+public:
+ static uint32 &nNumOfMp3Files;
+
+public:
+ bool IsMP3RadioChannelAvailable();
+};
+
+extern CSampleManager &cSampleManager; \ No newline at end of file
diff --git a/src/common.h b/src/common.h
index 4187e0c3..ee6ceadd 100644
--- a/src/common.h
+++ b/src/common.h
@@ -31,22 +31,17 @@
#undef near
#endif
-typedef uint8_t uint8, UInt8;
-typedef int8_t int8, Int8;
-typedef uint16_t uint16, UInt16;
-typedef int16_t int16, Int16;
-typedef uint32_t uint32, UInt32;
-typedef int32_t int32, Int32;
+typedef uint8_t uint8;
+typedef int8_t int8;
+typedef uint16_t uint16;
+typedef int16_t int16;
+typedef uint32_t uint32;
+typedef int32_t int32;
typedef uintptr_t uintptr;
-typedef uint64_t uint64, UInt64;
-typedef int64_t int64, Int64;
+typedef uint64_t uint64;
+typedef int64_t int64;
// hardcode ucs-2
-typedef uint16_t wchar, WChar;
-
-typedef float Float;
-typedef double Double;
-typedef bool Bool;
-typedef char Char;
+typedef uint16_t wchar;
#define nil NULL
@@ -59,18 +54,27 @@ extern void **rwengine;
#define RwEngineInstance (*rwengine)
#include "skel\skeleton.h"
+#include "Draw.h"
+
+#define SCREEN_ASPECT_RATIO (CDraw::GetAspectRatio())
#define SCREENW (RsGlobal.maximumWidth)
#define SCREENH (RsGlobal.maximumHeight)
#define DEFAULT_SCREEN_WIDTH (640)
#define DEFAULT_SCREEN_HEIGHT (448)
-#define SCREEN_WIDTH Float(RsGlobal.width)
-#define SCREEN_HEIGHT Float(RsGlobal.height)
-#define SCREEN_STRETCH_X(a) Float((a) * (SCREEN_WIDTH / Float(DEFAULT_SCREEN_WIDTH)))
-#define SCREEN_STRETCH_Y(a) Float((a) * (SCREEN_HEIGHT / Float(DEFAULT_SCREEN_HEIGHT)))
-#define SCREEN_FROM_RIGHT(a) Float(SCREEN_WIDTH - SCREEN_STRETCH_X(a))
-#define SCREEN_FROM_BOTTOM(a) Float(SCREEN_HEIGHT - SCREEN_STRETCH_Y(a))
+#define SCREEN_WIDTH float(RsGlobal.width)
+#define SCREEN_HEIGHT float(RsGlobal.height)
+#define SCREEN_STRETCH_X(a) float((a) * (SCREEN_WIDTH / float(DEFAULT_SCREEN_WIDTH)))
+#define SCREEN_STRETCH_X_AR(a) float((a) * (SCREEN_WIDTH / float(DEFAULT_SCREEN_WIDTH)) * (4.0/3.0f)/SCREEN_ASPECT_RATIO)
+#define SCREEN_STRETCH_Y(a) float((a) * (SCREEN_HEIGHT / float(DEFAULT_SCREEN_HEIGHT)))
+#define SCREEN_FROM_RIGHT(a) float(SCREEN_WIDTH - SCREEN_STRETCH_X(a))
+#define SCREEN_FROM_BOTTOM(a) float(SCREEN_HEIGHT - SCREEN_STRETCH_Y(a))
+
+#define HUD_STRETCH_X SCREEN_STRETCH_X_AR
+#define HUD_STRETCH_Y SCREEN_STRETCH_Y
+#define HUD_FROM_RIGHT(a) (SCREEN_WIDTH - HUD_STRETCH_X(a))
+#define HUD_FROM_BOTTOM(a) (SCREEN_HEIGHT - HUD_STRETCH_Y(a))
struct GlobalScene
{
@@ -134,6 +138,7 @@ void mysrand(unsigned int seed);
extern uint8 work_buff[55000];
extern char gString[256];
+extern wchar *gUString;
void re3_debug(char *format, ...);
void re3_trace(const char *filename, unsigned int lineno, const char *func, char *format, ...);
@@ -154,6 +159,6 @@ void re3_assert(const char *expr, const char *filename, unsigned int lineno, con
#define VALIDATE_SIZE(struc, size) static_assert(sizeof(struc) == size, "Invalid structure size of " #struc)
#define VALIDATE_OFFSET(struc, member, offset) static_assert(offsetof(struc, member) == offset, "The offset of " #member " in " #struc " is not " #offset "...")
-#define PERCENT(x, p) ((Float(x) * (Float(p) / 100.0f)))
+#define PERCENT(x, p) ((float(x) * (float(p) / 100.0f)))
#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
#define BIT(num) (1<<(num))
diff --git a/src/control/Darkel.cpp b/src/control/Darkel.cpp
index 95f3e176..aece455d 100644
--- a/src/control/Darkel.cpp
+++ b/src/control/Darkel.cpp
@@ -3,3 +3,10 @@
#include "Darkel.h"
WRAPPER void CDarkel::DrawMessages(void) { EAXJMP(0x420920); }
+
+bool CDarkel::Status = *(bool*)0x95CCB4;
+
+bool CDarkel::FrenzyOnGoing()
+{
+ return Status;
+} \ No newline at end of file
diff --git a/src/control/Darkel.h b/src/control/Darkel.h
index 41cc69f8..ed78d4e1 100644
--- a/src/control/Darkel.h
+++ b/src/control/Darkel.h
@@ -2,6 +2,10 @@
class CDarkel
{
+private:
+ static bool Status;
+
public:
static void DrawMessages(void);
+ static bool FrenzyOnGoing();
};
diff --git a/src/control/Garages.cpp b/src/control/Garages.cpp
index effc13d8..2994eb49 100644
--- a/src/control/Garages.cpp
+++ b/src/control/Garages.cpp
@@ -2,8 +2,29 @@
#include "patcher.h"
#include "ModelIndices.h"
#include "Garages.h"
+#include "Timer.h"
+#include "Font.h"
+#include "Messages.h"
+#include "Text.h"
-WRAPPER void CGarages::PrintMessages(void) { EAXJMP(0x426310); }
+//WRAPPER void CGarages::PrintMessages(void) { EAXJMP(0x426310); }
+
+int32 &CGarages::BankVansCollected = *(int32 *)0x8F1B34;
+bool &CGarages::BombsAreFree = *(bool *)0x95CD7A;
+bool &CGarages::RespraysAreFree = *(bool *)0x95CD1D;
+int32 &CGarages::CarsCollected = *(int32 *)0x880E18;
+int32 &CGarages::CarTypesCollected = *(int32 *)0x8E286C;
+int32 &CGarages::CrushedCarId = *(int32 *)0x943060;
+uint32 &CGarages::LastTimeHelpMessage = *(uint32 *)0x8F1B58;
+int32 &CGarages::MessageNumberInString = *(int32 *)0x885BA8;
+const char *CGarages::MessageIDString = (const char *)0x878358;
+int32 &CGarages::MessageNumberInString2 = *(int32 *)0x8E2C14;
+uint32 &CGarages::MessageStartTime = *(uint32 *)0x8F2530;
+uint32 &CGarages::MessageEndTime = *(uint32 *)0x8F597C;
+uint32 &CGarages::NumGarages = *(uint32 *)0x8F29F4;
+bool &CGarages::PlayerInGarage = *(bool *)0x95CD83;
+int32 &CGarages::PoliceCarsCollected = *(int32 *)0x941444;
+uint32 &CGarages::GarageToBeTidied = *(uint32 *)0x623570;
bool
CGarages::IsModelIndexADoor(uint32 id)
@@ -42,3 +63,44 @@ CGarages::IsModelIndexADoor(uint32 id)
id == MI_CRUSHERBODY ||
id == MI_CRUSHERLID;
}
+
+void CGarages::PrintMessages()
+{
+ if (CTimer::GetTimeInMilliseconds() > CGarages::MessageStartTime && CTimer::GetTimeInMilliseconds() < CGarages::MessageEndTime) {
+ CFont::SetScale(HUD_STRETCH_X(1.2f / 2), HUD_STRETCH_Y(1.5f / 2)); // BUG: game doesn't use macro here.
+ CFont::SetPropOn();
+ CFont::SetJustifyOff();
+ CFont::SetBackgroundOff();
+ CFont::SetCentreSize(HUD_FROM_RIGHT(50.0f));
+ CFont::SetCentreOn();
+ CFont::SetFontStyle(FONT_BANK);
+
+ if (CGarages::MessageNumberInString2 < 0) {
+ if (CGarages::MessageNumberInString < 0) {
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString((SCREEN_WIDTH/ 2) + HUD_STRETCH_X(2.0f), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f), TheText.Get(CGarages::MessageIDString));
+
+ CFont::SetColor(CRGBA(89, 115, 150, 255));
+ CFont::PrintString((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f), TheText.Get(CGarages::MessageIDString));
+ }
+ else {
+ CMessages::InsertNumberInString(TheText.Get(CGarages::MessageIDString), CGarages::MessageNumberInString, -1, -1, -1, -1, -1, gUString);
+
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString((SCREEN_WIDTH / 2) + HUD_STRETCH_X(2.0f), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f + 2.0 - 40.0f), gUString);
+
+ CFont::SetColor(CRGBA(89, 115, 150, 255));
+ CFont::PrintString((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f - 40.0f), gUString);
+ }
+ }
+ else {
+ CMessages::InsertNumberInString(TheText.Get(CGarages::MessageIDString), CGarages::MessageNumberInString2, -1, -1, -1, -1, -1, gUString);
+
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString((SCREEN_WIDTH / 2) + HUD_STRETCH_X(2.0f), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f + 2.0 - 40.0f), gUString);
+
+ CFont::SetColor(CRGBA(89, 115, 150, 255));
+ CFont::PrintString((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f - 40.0f), gUString);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/control/Garages.h b/src/control/Garages.h
index 87cf47fa..f018401c 100644
--- a/src/control/Garages.h
+++ b/src/control/Garages.h
@@ -3,6 +3,24 @@
class CGarages
{
public:
+ static int32 &BankVansCollected;
+ static bool &BombsAreFree;
+ static bool &RespraysAreFree;
+ static int32 &CarsCollected;
+ static int32 &CarTypesCollected;
+ static int32 &CrushedCarId;
+ static uint32 &LastTimeHelpMessage;
+ static int32 &MessageNumberInString;
+ static const char *MessageIDString;
+ static int32 &MessageNumberInString2;
+ static uint32 &MessageStartTime;
+ static uint32 &MessageEndTime;
+ static uint32 &NumGarages;
+ static bool &PlayerInGarage;
+ static int32 &PoliceCarsCollected;
+ static uint32 &GarageToBeTidied;
+
+public:
static bool IsModelIndexADoor(uint32 id);
static void PrintMessages(void);
};
diff --git a/src/control/Population.cpp b/src/control/Population.cpp
index 3626381d..9327452b 100644
--- a/src/control/Population.cpp
+++ b/src/control/Population.cpp
@@ -1,4 +1,4 @@
#include "common.h"
#include "Population.h"
-Bool &CPopulation::ms_bGivePedsWeapons = *(Bool*)0x95CCF6; \ No newline at end of file
+bool &CPopulation::ms_bGivePedsWeapons = *(bool*)0x95CCF6; \ No newline at end of file
diff --git a/src/control/Population.h b/src/control/Population.h
index e01d2712..ce27657a 100644
--- a/src/control/Population.h
+++ b/src/control/Population.h
@@ -3,5 +3,5 @@
class CPopulation
{
public:
- static Bool &ms_bGivePedsWeapons;
+ static bool &ms_bGivePedsWeapons;
}; \ No newline at end of file
diff --git a/src/control/Record.cpp b/src/control/Record.cpp
index 8949da5e..4cc2dccd 100644
--- a/src/control/Record.cpp
+++ b/src/control/Record.cpp
@@ -1,6 +1,6 @@
#include "common.h"
#include "Record.h"
-UInt16 &CRecordDataForGame::RecordingState = *(UInt16*)0x95CC24;
+uint16 &CRecordDataForGame::RecordingState = *(uint16*)0x95CC24;
-UInt8 &CRecordDataForChase::Status = *(UInt8*)0x95CDCE;
+uint8 &CRecordDataForChase::Status = *(uint8*)0x95CDCE;
diff --git a/src/control/Record.h b/src/control/Record.h
index 97a9663d..2b904d1d 100644
--- a/src/control/Record.h
+++ b/src/control/Record.h
@@ -3,11 +3,11 @@
class CRecordDataForGame
{
public:
- static UInt16 &RecordingState;
+ static uint16 &RecordingState;
};
class CRecordDataForChase
{
public:
- static UInt8 &Status;
+ static uint8 &Status;
};
diff --git a/src/control/Replay.cpp b/src/control/Replay.cpp
index b1bdc1bf..80edf097 100644
--- a/src/control/Replay.cpp
+++ b/src/control/Replay.cpp
@@ -3,6 +3,6 @@
#include "Replay.h"
uint8 &CReplay::Mode = *(uint8*)0x95CD5B;
-Bool &CReplay::bPlayingBackFromFile = *(Bool*)0x95CD58;
+bool &CReplay::bPlayingBackFromFile = *(bool*)0x95CD58;
WRAPPER void CReplay::Display(void) { EAXJMP(0x595EE0); }
diff --git a/src/control/Replay.h b/src/control/Replay.h
index 331cc44f..70835596 100644
--- a/src/control/Replay.h
+++ b/src/control/Replay.h
@@ -3,11 +3,12 @@
class CReplay
{
public:
- static void Display(void);
enum {
- MODE_1
+ MODE_1 = 1
};
static uint8 &Mode;
- static Bool &bPlayingBackFromFile;
+ static bool &bPlayingBackFromFile;
+
+ static void Display(void);
};
diff --git a/src/control/Script.cpp b/src/control/Script.cpp
index 71fc7bcd..7cea978f 100644
--- a/src/control/Script.cpp
+++ b/src/control/Script.cpp
@@ -4,3 +4,6 @@
#include "Script.h"
uint8 *CTheScripts::ScriptSpace = (uint8*)0x74B248;
+CTextLine* CTheScripts::IntroTextLines = (CTextLine*)0x70EA74;
+CScriptRectangle* CTheScripts::IntroRectangles = (CScriptRectangle*)0x72D109;
+CSprite2d* CTheScripts::ScriptSprites = (CSprite2d*)0x72B090;
diff --git a/src/control/Script.h b/src/control/Script.h
index 6f329e1f..cdc33e97 100644
--- a/src/control/Script.h
+++ b/src/control/Script.h
@@ -1,7 +1,42 @@
#pragma once
+#include "Sprite2d.h"
+
+struct CScriptRectangle
+{
+ bool m_bIsUsed;
+ bool m_bIsAntialiased;
+ uint16 m_wTextureId;
+ CRect m_sRect;
+ CRGBA m_sColor;
+};
+
+struct CTextLine
+{
+ float m_fScaleX;
+ float m_fScaleY;
+ CRGBA m_sColor;
+ bool m_bJustify;
+ bool m_bCentered;
+ bool m_bBackground;
+ bool m_bBackgroundOnly;
+ float m_fWrapX;
+ float m_fCenterSize;
+ CRGBA m_sBackgroundColor;
+ bool m_bTextProportional;
+ int32 field_29;
+ bool m_bRightJustify;
+ int32 field_31;
+ int32 m_nFont;
+ float field_36;
+ float field_40;
+ wchar m_awText[500];
+};
class CTheScripts
{
public:
static uint8 *ScriptSpace;//[160*1024]
+ static CTextLine* IntroTextLines;
+ static CScriptRectangle* IntroRectangles;
+ static CSprite2d* ScriptSprites;
};
diff --git a/src/entities/Ped.cpp b/src/entities/Ped.cpp
index 55e33a2d..ccb07d46 100644
--- a/src/entities/Ped.cpp
+++ b/src/entities/Ped.cpp
@@ -1,16 +1,24 @@
#include "common.h"
#include "patcher.h"
-#include "Ped.h"
#include "Pools.h"
+#include "Particle.h"
+#include "Stats.h"
+#include "World.h"
+#include "PedStat.h"
+#include "DMaudio.h"
+#include "Ped.h"
+
+bool &CPed::bNastyLimbsCheat = *(bool*)0x95CD44;
+bool &CPed::bPedCheat2 = *(bool*)0x95CD5A;
+bool &CPed::bPedCheat3 = *(bool*)0x95CD59;
-Bool &CPed::bNastyLimbsCheat = *(Bool*)0x95CD44;
-Bool &CPed::bPedCheat2 = *(Bool*)0x95CD5A;
-Bool &CPed::bPedCheat3 = *(Bool*)0x95CD59;
-
void *CPed::operator new(size_t sz) { return CPools::GetPedPool()->New(); }
void CPed::operator delete(void *p, size_t sz) { CPools::GetPedPool()->Delete((CPed*)p); }
WRAPPER void CPed::KillPedWithCar(CVehicle *veh, float impulse) { EAXJMP(0x4EC430); }
+WRAPPER void CPed::Say(uint16 audio) { EAXJMP(0x4E5A10); }
+WRAPPER void CPed::SetDie(AnimationId anim, float arg1, float arg2) { EAXJMP(0x4D37D0); }
+WRAPPER void CPed::SpawnFlyingComponent(int, int8) { EAXJMP(0x4EB060); }
static char ObjectiveText[34][28] = {
"No Obj",
@@ -175,3 +183,227 @@ CPed::UseGroundColModel(void)
m_nPedState == PED_DIE ||
m_nPedState == PED_DEAD;
}
+
+void
+CPed::AddWeaponModel(int id)
+{
+ RpAtomic* atm;
+
+ if (id != -1) {
+ atm = (RpAtomic*)CModelInfo::GetModelInfo(id)->CreateInstance();
+ RwFrameDestroy(RpAtomicGetFrame(atm));
+ RpAtomicSetFrame(atm, GetNodeFrame(PED_HANDR));
+ RpClumpAddAtomic((RpClump*)m_rwObject, atm);
+ m_wepModelID = id;
+ }
+}
+
+void
+CPed::AimGun()
+{
+ RwV3d pos;
+ CVector vector;
+
+ if (m_pSeekTarget) {
+ if (m_pSeekTarget->m_status == STATUS_PHYSICS) {
+ m_pSeekTarget->m_pedIK.GetComponentPosition(&pos, 1);
+ vector.x = pos.x;
+ vector.y = pos.y;
+ vector.z = pos.z;
+ } else {
+ vector = *(m_pSeekTarget->GetPosition());
+ }
+ CPed::Say(SOUND_PED_ATTACK);
+
+ m_ped_flagB2 = m_pedIK.PointGunAtPosition(&vector);
+ if (m_pPedFight != m_pSeekTarget) {
+ CPed::SetLookFlag(m_pSeekTarget, 1);
+ }
+
+ } else {
+ if (CPed::IsPlayer()) {
+ m_ped_flagB2 = m_pedIK.PointGunInDirection(m_fLookDirection, ((CPlayerPed*)this)->m_fFPSMoveHeading);
+ } else {
+ m_ped_flagB2 = m_pedIK.PointGunInDirection(m_fLookDirection, 0.0f);
+ }
+ }
+}
+
+
+// After I finished this I realized it's only for SCM opcode...
+void
+CPed::ApplyHeadShot(eWeaponType weaponType, CVector pos, bool evenOnPlayer)
+{
+ CVector pos2 = CVector(
+ pos.x,
+ pos.y,
+ pos.z + 0.1f
+ );
+
+ if (!CPed::IsPlayer() || evenOnPlayer) {
+ ++CStats::HeadShots;
+
+ // BUG: This condition will always return true.
+ if (m_nPedState != PED_PASSENGER || m_nPedState != PED_TAXI_PASSENGER) {
+ CPed::SetDie(ANIM_KO_SHOT_FRONT1, 4.0f, 0.0f);
+ }
+
+ m_ped_flagC20 = 1;
+ m_nPedStateTimer = CTimer::GetTimeInMilliseconds() + 150;
+
+ CParticle::AddParticle(PARTICLE_TEST, pos2,
+ CVector(0.0f, 0.0f, 0.0f), nil, 0.2f, 0, 0, 0, 0);
+
+ if (CEntity::GetIsOnScreen()) {
+ for(int i=0; i < 32; i++) {
+ CParticle::AddParticle(PARTICLE_BLOOD_SMALL,
+ pos2, CVector(0.0f, 0.0f, 0.03f),
+ nil, 0.0f, 0, 0, 0, 0);
+ }
+
+ for (int i = 0; i < 16; i++) {
+ CParticle::AddParticle(PARTICLE_DEBRIS2,
+ pos2,
+ CVector(0.0f, 0.0f, 0.01f),
+ nil, 0.0f, 0, 0, 0, 0);
+ }
+ }
+ }
+}
+
+void
+CPed::RemoveBodyPart(PedNode nodeId, int8 unk)
+{
+ RwFrame *frame;
+ RwFrame *fp;
+ RwV3d zero;
+
+ frame = GetNodeFrame(nodeId);
+ if (frame) {
+ if (CGame::nastyGame) {
+ if (nodeId != PED_HEAD)
+ CPed::SpawnFlyingComponent(nodeId, unk);
+
+ RecurseFrameChildrenVisibilityCB(frame, 0);
+ zero.x = 0.0f;
+ zero.z = 0.0f;
+ zero.y = 0.0f;
+ for (fp = RwFrameGetParent(frame); fp; fp = RwFrameGetParent(frame))
+ RwV3dTransformPoints(&zero, &zero, 1, &fp->modelling);
+
+ if (CEntity::GetIsOnScreen()) {
+ CParticle::AddParticle(PARTICLE_TEST, zero,
+ CVector(0.0f, 0.0f, 0.0f),
+ nil, 0.2f, 0, 0, 0, 0);
+
+ for (int i = 0; i < 16; i++) {
+ CParticle::AddParticle(PARTICLE_BLOOD_SMALL,
+ zero,
+ CVector(0.0f, 0.0f, 0.03f),
+ nil, 0.0f, 0, 0, 0, 0);
+ }
+ }
+ m_ped_flagC20 = 1;
+ m_bodyPartBleeding = nodeId;
+ }
+ } else {
+ printf("Trying to remove ped component");
+ }
+}
+
+RwObject*
+CPed::SetPedAtomicVisibilityCB(RwObject *object, void *data)
+{
+ if (data == 0)
+ RpAtomicSetFlags(object, 0);
+ return object;
+}
+
+RwFrame*
+CPed::RecurseFrameChildrenVisibilityCB(RwFrame *frame, void *data)
+{
+ RwFrameForAllObjects(frame, SetPedAtomicVisibilityCB, data);
+ RwFrameForAllChildren(frame, RecurseFrameChildrenVisibilityCB, 0);
+ return frame;
+}
+
+void
+CPed::SetLookFlag(CPed *to, bool set)
+{
+ if (m_lookTimer < CTimer::GetTimeInMilliseconds()) {
+ m_ped_flagA10 = 1;
+ m_ped_flagA40 = 0;
+ m_pPedFight = to;
+ m_pPedFight->RegisterReference((CEntity**)&m_pPedFight);
+ m_fLookDirection = 999999.0f;
+ m_lookTimer = 0;
+ m_ped_flagA20_look = set;
+ if (m_nPedState != PED_DRIVING) {
+ m_pedIK.m_flags &= ~CPedIK::FLAG_4;
+ }
+ }
+}
+
+void
+CPed::SetLookFlag(float angle, bool set)
+{
+ if (m_lookTimer < CTimer::GetTimeInMilliseconds()) {
+ m_ped_flagA10 = 1;
+ m_ped_flagA40 = 0;
+ m_pPedFight = 0;
+ m_fLookDirection = angle;
+ m_lookTimer = 0;
+ m_ped_flagA20_look = set;
+ if (m_nPedState != PED_DRIVING) {
+ m_pedIK.m_flags &= ~CPedIK::FLAG_4;
+ }
+ }
+}
+
+void
+CPed::SetLookTimer(int time)
+{
+ if (CTimer::GetTimeInMilliseconds() > m_lookTimer) {
+ m_lookTimer = CTimer::GetTimeInMilliseconds() + time;
+ }
+}
+
+bool
+CPed::OurPedCanSeeThisOne(CEntity* who)
+{
+ float xDiff;
+ float yDiff;
+ float distance;
+ CColPoint colpoint;
+ CEntity* ent;
+ CVector ourPos;
+ CVector itsPos;
+
+ ourPos = this->GetPosition();
+ itsPos = who->GetPosition();
+
+ xDiff = itsPos.x - ourPos.x;
+ yDiff = itsPos.y - ourPos.y;
+
+ if ((yDiff * this->GetUp().y) + (xDiff * this->GetUp().x) < 0.0f)
+ return 0;
+
+ distance = sqrt(yDiff * yDiff + xDiff * xDiff);
+
+ if (distance < 40.0f)
+ return 0;
+
+ ourPos.z += 1.0f;
+ return !CWorld::ProcessLineOfSight(ourPos, itsPos, colpoint, ent, 1, 0, 0, 0, 0, 0, 0);
+}
+
+STARTPATCHES
+ InjectHook(0x4CF8F0, &CPed::AddWeaponModel, PATCH_JUMP);
+ InjectHook(0x4C6AA0, &CPed::AimGun, PATCH_JUMP);
+ InjectHook(0x4EB470, &CPed::ApplyHeadShot, PATCH_JUMP);
+ InjectHook(0x4EAEE0, &CPed::RemoveBodyPart, PATCH_JUMP);
+ InjectHook(0x4C6460, (void (CPed::*)(CPed*, bool)) &CPed::SetLookFlag, PATCH_JUMP);
+ InjectHook(0x4C63E0, (void (CPed::*)(float, bool)) &CPed::SetLookFlag, PATCH_JUMP);
+ InjectHook(0x4D12E0, &CPed::SetLookTimer, PATCH_JUMP);
+ InjectHook(0x4C5700, &CPed::OurPedCanSeeThisOne, PATCH_JUMP);
+ENDPATCHES
diff --git a/src/entities/Ped.h b/src/entities/Ped.h
index adf24c88..0b0a5562 100644
--- a/src/entities/Ped.h
+++ b/src/entities/Ped.h
@@ -2,6 +2,12 @@
#include "Physical.h"
#include "Weapon.h"
+#include "PedIK.h"
+#include "AnimManager.h"
+#include "AnimBlendClumpData.h"
+
+struct PedStat;
+struct CPathNode;
enum {
PED_MAX_WEAPONS = 13
@@ -92,7 +98,7 @@ public:
uint8 m_ped_flagA4 : 1;
uint8 m_ped_flagA8 : 1;
uint8 m_ped_flagA10 : 1;
- uint8 m_ped_flagA20 : 1;
+ uint8 m_ped_flagA20_look : 1;
uint8 m_ped_flagA40 : 1;
uint8 m_ped_flagA80 : 1;
uint8 m_ped_flagB1 : 1;
@@ -159,39 +165,99 @@ public:
uint8 m_ped_flagI20 : 1;
uint8 m_ped_flagI40 : 1;
uint8 m_ped_flagI80 : 1;
- uint8 stuff1[199];
+ uint8 stuff10[15];
+ int32 m_field_16C;
+ uint8 stuff12[44];
+ int32 m_pEventEntity;
+ float m_fAngleToEvent;
+ AnimBlendFrameData *m_pFrames[PED_NODE_MAX];
+ int32 m_animGroup;
+ int32 m_pVehicleAnim;
+ CVector2D m_vecAnimMoveDelta;
+ CVector m_vecOffsetSeek;
+ CPedIK m_pedIK;
+ uint8 stuff1[8];
+ uint32 m_nPedStateTimer;
int32 m_nPedState;
int32 m_nLastPedState;
int32 m_nMoveState;
- uint8 stuff2[188];
+ int32 m_nStoredActionState;
+ int32 m_nPrevActionState;
+ int32 m_nWaitState;
+ int32 m_nWaitTimer;
+private:
+ uint32 stuff0[28];
+public:
+ uint16 m_nPathNodes;
+ uint8 m_nCurPathNode;
+ int8 m_nPathState;
+private:
+ int8 _pad2B5[3];
+public:
+ CPathNode *m_pNextPathNode;
+ CPathNode *m_pLastPathNode;
+ float m_fHealth;
+ float m_fArmour;
+ uint8 stuff2[34];
CEntity *m_pCurrentPhysSurface;
CVector m_vecOffsetFromPhysSurface;
CEntity *m_pCurSurface;
- uint8 stuff3[16];
+ uint8 stuff3[12];
+ CPed* m_pSeekTarget;
CVehicle *m_pMyVehicle;
bool bInVehicle;
uint8 stuff4[23];
int32 m_nPedType;
-
- uint8 stuff5[28];
+ PedStat *m_pedStats;
+ uint8 stuff5[24];
CEntity *m_pCollidingEntity;
uint8 stuff6[12];
CWeapon m_weapons[PED_MAX_WEAPONS];
int32 stuff7;
uint8 m_currentWeapon;
- uint8 stuff[163];
+ uint8 stuff[3];
+ int32 m_pPointGunAt;
+ CVector m_vecHitLastPos;
+ uint8 stuff8[12];
+ CPed *m_pPedFight;
+ float m_fLookDirection;
+ int32 m_wepModelID;
+ uint32 m_leaveCarTimer;
+ uint32 m_getUpTimer;
+ uint32 m_lookTimer;
+ uint8 stuff9[34];
+ uint8 m_bodyPartBleeding;
+ uint8 m_field_4F3;
+ CPed *m_nearPeds[10];
+ uint8 stuff11[32];
static void *operator new(size_t);
static void operator delete(void*, size_t);
+ // TODO: enum!
bool IsPlayer(void) { return m_nPedType == 0 || m_nPedType== 1 || m_nPedType == 2 || m_nPedType == 3; }
bool UseGroundColModel(void);
+ void AddWeaponModel(int id);
+ void AimGun();
void KillPedWithCar(CVehicle *veh, float impulse);
+ void Say(uint16 audio);
+ void SetLookFlag(CPed *to, bool set);
+ void SetLookFlag(float angle, bool set);
+ void SetLookTimer(int time);
+ void SetDie(AnimationId anim, float arg1, float arg2);
+ void ApplyHeadShot(eWeaponType weaponType, CVector pos, bool evenOnPlayer);
+ void RemoveBodyPart(PedNode nodeId, int8 unknown);
+ void SpawnFlyingComponent(int, int8 unknown);
+ bool OurPedCanSeeThisOne(CEntity* who);
+ static RwObject *SetPedAtomicVisibilityCB(RwObject *object, void *data);
+ static RwFrame *RecurseFrameChildrenVisibilityCB(RwFrame *frame, void *data);
+
CWeapon *GetWeapon(void) { return &m_weapons[m_currentWeapon]; }
-
- static Bool &bNastyLimbsCheat;
- static Bool &bPedCheat2;
- static Bool &bPedCheat3;
+ RwFrame *GetNodeFrame(int nodeId) { return m_pFrames[nodeId]->frame; }
+
+ static bool &bNastyLimbsCheat;
+ static bool &bPedCheat2;
+ static bool &bPedCheat3;
};
static_assert(offsetof(CPed, m_nPedState) == 0x224, "CPed: error");
static_assert(offsetof(CPed, m_pCurSurface) == 0x2FC, "CPed: error");
@@ -200,4 +266,8 @@ static_assert(offsetof(CPed, m_nPedType) == 0x32C, "CPed: error");
static_assert(offsetof(CPed, m_pCollidingEntity) == 0x34C, "CPed: error");
static_assert(offsetof(CPed, m_weapons) == 0x35C, "CPed: error");
static_assert(offsetof(CPed, m_currentWeapon) == 0x498, "CPed: error");
+static_assert(offsetof(CPed, m_lookTimer) == 0x4CC, "CPed: error");
+static_assert(offsetof(CPed, m_bodyPartBleeding) == 0x4F2, "CPed: error");
+static_assert(offsetof(CPed, m_field_16C) == 0x16C, "CPed: error");
+static_assert(offsetof(CPed, m_pEventEntity) == 0x19C, "CPed: error");
static_assert(sizeof(CPed) == 0x53C, "CPed: error");
diff --git a/src/entities/PedIK.cpp b/src/entities/PedIK.cpp
new file mode 100644
index 00000000..f262fab5
--- /dev/null
+++ b/src/entities/PedIK.cpp
@@ -0,0 +1,7 @@
+#include "common.h"
+#include "patcher.h"
+#include "Ped.h"
+
+WRAPPER void CPedIK::GetComponentPosition(RwV3d* pos, int id) { EAXJMP(0x4ED0F0); }
+WRAPPER bool CPedIK::PointGunInDirection(float phi, float theta) { EAXJMP(0x4ED9B0); }
+WRAPPER bool CPedIK::PointGunAtPosition(CVector* position) { EAXJMP(0x4ED920); } \ No newline at end of file
diff --git a/src/entities/PedIK.h b/src/entities/PedIK.h
new file mode 100644
index 00000000..67aaa469
--- /dev/null
+++ b/src/entities/PedIK.h
@@ -0,0 +1,33 @@
+#pragma once
+#include "common.h"
+
+struct LimbOrientation
+{
+ float phi;
+ float theta;
+};
+
+class CPed;
+
+class CPedIK
+{
+public:
+ // TODO
+ enum {
+ FLAG_1,
+ FLAG_2,
+ FLAG_4,
+ };
+
+ CPed* m_ped;
+ LimbOrientation m_headOrient;
+ LimbOrientation m_torsoOrient;
+ LimbOrientation m_upperArmOrient;
+ LimbOrientation m_lowerArmOrient;
+ int32 m_flags;
+
+ void GetComponentPosition(RwV3d* pos, int id);
+ bool PointGunInDirection(float phi, float theta);
+ bool PointGunAtPosition(CVector* position);
+};
+static_assert(sizeof(CPedIK) == 0x28, "CPedIK: error");
diff --git a/src/entities/PlayerInfo.cpp b/src/entities/PlayerInfo.cpp
new file mode 100644
index 00000000..796481a4
--- /dev/null
+++ b/src/entities/PlayerInfo.cpp
@@ -0,0 +1,3 @@
+#include "common.h"
+#include "patcher.h"
+#include "PlayerInfo.h"
diff --git a/src/entities/PlayerInfo.h b/src/entities/PlayerInfo.h
new file mode 100644
index 00000000..abda1b23
--- /dev/null
+++ b/src/entities/PlayerInfo.h
@@ -0,0 +1,74 @@
+#pragma once
+#include "Automobile.h"
+#include "PlayerPed.h"
+
+enum eWastedBustedState
+{
+ WBSTATE_PLAYING,
+ WBSTATE_WASTED,
+ WBSTATE_BUSTED,
+ WBSTATE_FAILED_CRITICAL_MISSION,
+};
+
+struct CCivilianPed
+{
+
+};
+
+class CPlayerInfo
+{
+public:
+ CPlayerPed *m_pPed;
+ CVehicle *m_pRemoteVehicle;
+ CColModel m_ColModel;
+ CVehicle *m_pVehicleEx;
+ char m_aszPlayerName[70];
+private:
+ int8 _pad0[2];
+public:
+ int32 m_nMoney;
+ int32 m_nVisibleMoney;
+ int32 m_nCollectedPackages;
+ int32 m_nTotalPackages;
+ int32 field_188;
+ int32 m_nSwitchTaxiTime;
+ bool m_bSwitchTaxi;
+ int8 field_197;
+ int8 field_198;
+ int8 field_199;
+ int32 m_nNextSexFrequencyUpdateTime;
+ int32 m_nNextSexMoneyUpdateTime;
+ int32 m_nSexFrequency;
+ CCivilianPed *m_pHooker;
+ int8 m_bWBState; // eWastedBustedState
+ int8 field_217;
+ int8 field_218;
+ int8 field_219;
+ int32 m_nWBTime;
+ bool m_bInRemoteMode;
+ int8 field_225;
+ int8 field_226;
+ int8 field_227;
+ int32 m_nTimeLostRemoteCar;
+ int32 m_nTimeLastHealthLoss;
+ int32 m_nTimeLastArmourLoss;
+ int32 field_240;
+ int32 m_nUpsideDownCounter;
+ int32 field_248;
+ int16 m_nTrafficMultiplier;
+ int8 field_254;
+ int8 field_255;
+ float m_fRoadDensity;
+ int32 m_nPreviousTimeRewardedForExplosion;
+ int32 m_nExplosionsSinceLastReward;
+ int32 field_268;
+ int32 field_272;
+ bool m_bInfiniteSprint;
+ bool m_bFastReload;
+ bool m_bGetOutOfJailFree;
+ bool m_bGetOutOfHospitalFree;
+ uint8 m_aSkinName[32];
+ RwTexture *m_pSkinTexture;
+};
+
+static_assert(sizeof(CPlayerInfo) == 0x13C, "CPlayerPed: error");
diff --git a/src/entities/PlayerPed.h b/src/entities/PlayerPed.h
index 35128f46..a41135e9 100644
--- a/src/entities/PlayerPed.h
+++ b/src/entities/PlayerPed.h
@@ -1,11 +1,43 @@
#pragma once
#include "Ped.h"
+#include "Wanted.h"
class CPlayerPed : public CPed
{
public:
- // 0x53C
- uint8 stuff[180];
+ CWanted *m_pWanted;
+ CCopPed *m_pArrestingCop;
+ float m_fMoveSpeed;
+ float m_fCurrentStamina;
+ float m_fMaxStamina;
+ float m_fStaminaProgress;
+ bool m_bWeaponSlot;
+ bool m_bSpeedTimerFlag;
+ bool m_bShouldEvade;
+ int8 field_1367;
+ int32 m_nSpeedTimer;
+ int32 m_nShotDelay;
+ float field_1376;
+ int8 field_1380;
+ int8 field_1381;
+ int8 field_1382;
+ int8 field_1383;
+ CEntity *m_pEvadingFrom;
+ int32 m_nTargettableObjects[4];
+ bool m_bAdrenalineActive;
+ bool m_bHasLockOnTarget;
+ int8 field_1406;
+ int8 field_1407;
+ bool m_bAdrenalineTime;
+ bool m_bCanBeDamaged;
+ int8 field_1413;
+ int8 field_1414;
+ int8 field_1415;
+ CVector field_1416[6];
+ int32 field_1488[6];
+ float field_1512;
+ float m_fFPSMoveHeading;
};
+
static_assert(sizeof(CPlayerPed) == 0x5F0, "CPlayerPed: error");
diff --git a/src/entities/Vehicle.cpp b/src/entities/Vehicle.cpp
index ebd7ae68..bac05f7b 100644
--- a/src/entities/Vehicle.cpp
+++ b/src/entities/Vehicle.cpp
@@ -3,11 +3,11 @@
#include "Vehicle.h"
#include "Pools.h"
-Bool &CVehicle::bWheelsOnlyCheat = *(Bool *)0x95CD78;
-Bool &CVehicle::bAllDodosCheat = *(Bool *)0x95CD75;
-Bool &CVehicle::bCheat3 = *(Bool *)0x95CD66;
-Bool &CVehicle::bCheat4 = *(Bool *)0x95CD65;
-Bool &CVehicle::bCheat5 = *(Bool *)0x95CD64;
+bool &CVehicle::bWheelsOnlyCheat = *(bool *)0x95CD78;
+bool &CVehicle::bAllDodosCheat = *(bool *)0x95CD75;
+bool &CVehicle::bCheat3 = *(bool *)0x95CD66;
+bool &CVehicle::bCheat4 = *(bool *)0x95CD65;
+bool &CVehicle::bCheat5 = *(bool *)0x95CD64;
void *CVehicle::operator new(size_t sz) { return CPools::GetVehiclePool()->New(); }
void CVehicle::operator delete(void *p, size_t sz) { CPools::GetVehiclePool()->Delete((CVehicle*)p); }
diff --git a/src/entities/Vehicle.h b/src/entities/Vehicle.h
index 00126c31..e5d1cfb3 100644
--- a/src/entities/Vehicle.h
+++ b/src/entities/Vehicle.h
@@ -63,11 +63,11 @@ uint8 m_extra2;
bool IsHeli(void) { return m_vehType == VEHICLE_TYPE_HELI; }
bool IsPlane(void) { return m_vehType == VEHICLE_TYPE_PLANE; }
- static Bool &bWheelsOnlyCheat;
- static Bool &bAllDodosCheat;
- static Bool &bCheat3;
- static Bool &bCheat4;
- static Bool &bCheat5;
+ static bool &bWheelsOnlyCheat;
+ static bool &bAllDodosCheat;
+ static bool &bCheat3;
+ static bool &bCheat4;
+ static bool &bCheat5;
};
static_assert(sizeof(CVehicle) == 0x288, "CVehicle: error");
static_assert(offsetof(CVehicle, m_pCurSurface) == 0x1E0, "CVehicle: error");
diff --git a/src/main.cpp b/src/main.cpp
index 9b8fc145..655cc106 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -57,6 +57,7 @@
uint8 work_buff[55000];
char gString[256];
+wchar *gUString = (wchar*)0x74B018;
bool &b_FoundRecentSavedGameWantToLoad = *(bool*)0x95CDA8;
@@ -140,8 +141,8 @@ Idle(void *arg)
Render2dStuff();
}else{
float viewWindow = tan(DEGTORAD(CDraw::GetFOV() * 0.5f));
- // ASPECT
- CameraSize(Scene.camera, nil, viewWindow, 4.0f/3.0f);
+ CDraw::CalculateAspectRatio();
+ CameraSize(Scene.camera, nil, viewWindow, SCREEN_ASPECT_RATIO);
CVisibilityPlugins::SetRenderWareCamera(Scene.camera);
RwCameraClear(Scene.camera, &gColourTop, rwCAMERACLEARZ);
if(!RsCameraBeginUpdate(Scene.camera))
@@ -172,8 +173,8 @@ FrontendIdle(void)
return;
float viewWindow = tan(DEGTORAD(CDraw::GetFOV() * 0.5f));
- // ASPECT
- CameraSize(Scene.camera, nil, viewWindow, 4.0f/3.0f);
+ CDraw::CalculateAspectRatio();
+ CameraSize(Scene.camera, nil, viewWindow, SCREEN_ASPECT_RATIO);
CVisibilityPlugins::SetRenderWareCamera(Scene.camera);
RwCameraClear(Scene.camera, &gColourTop, rwCAMERACLEARZ);
if(!RsCameraBeginUpdate(Scene.camera))
@@ -194,9 +195,8 @@ DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomR
CRGBA BottomColor(BottomRed, BottomGreen, BottomBlue, Alpha);
float viewWindow = tan(DEGTORAD(CDraw::GetFOV() * 0.5f));
- // ASPECT
- float aspectRatio = CMenuManager::m_PrefsUseWideScreen ? 16.0f/9.0f : 4.0f/3.0f;
- CameraSize(Scene.camera, nil, viewWindow, aspectRatio);
+ CDraw::CalculateAspectRatio();
+ CameraSize(Scene.camera, nil, viewWindow, SCREEN_ASPECT_RATIO);
CVisibilityPlugins::SetRenderWareCamera(Scene.camera);
RwCameraClear(Scene.camera, &gColourTop, rwCAMERACLEARZ);
@@ -215,9 +215,8 @@ bool
DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha)
{
float viewWindow = tan(DEGTORAD(CDraw::GetFOV() * 0.5f));
- // ASPECT
- float aspectRatio = CMenuManager::m_PrefsUseWideScreen ? 16.0f/9.0f : 4.0f/3.0f;
- CameraSize(Scene.camera, nil, viewWindow, aspectRatio);
+ CDraw::CalculateAspectRatio();
+ CameraSize(Scene.camera, nil, viewWindow, SCREEN_ASPECT_RATIO);
CVisibilityPlugins::SetRenderWareCamera(Scene.camera);
RwCameraClear(Scene.camera, &gColourTop, rwCAMERACLEARZ);
@@ -324,15 +323,16 @@ Render2dStuff(void)
CRGBA black(0, 0, 0, 255);
// top and bottom strips
- if(weaponType == WEAPONTYPE_ROCKETLAUNCHER){
- CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW, SCREENH/2 - SCREEN_STRETCH_Y(180)), black);
- CSprite2d::DrawRect(CRect(0.0f, SCREENH/2 + SCREEN_STRETCH_Y(170), SCREENW, SCREENH), black);
- }else{
- CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW, SCREENH/2 - SCREEN_STRETCH_Y(210)), black);
- CSprite2d::DrawRect(CRect(0.0f, SCREENH/2 + SCREEN_STRETCH_Y(210), SCREENW, SCREENH), black);
+ if (weaponType == WEAPONTYPE_ROCKETLAUNCHER) {
+ CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW, SCREENH / 2 - HUD_STRETCH_Y(180)), black);
+ CSprite2d::DrawRect(CRect(0.0f, SCREENH / 2 + HUD_STRETCH_Y(170), SCREENW, SCREENH), black);
+ }
+ else {
+ CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW, SCREENH / 2 - HUD_STRETCH_Y(210)), black);
+ CSprite2d::DrawRect(CRect(0.0f, SCREENH / 2 + HUD_STRETCH_Y(210), SCREENW, SCREENH), black);
}
- CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW/2 - SCREEN_STRETCH_X(210), SCREENH), black);
- CSprite2d::DrawRect(CRect(SCREENW/2 + SCREEN_STRETCH_X(210), 0.0f, SCREENW, SCREENH), black);
+ CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW / 2 - HUD_STRETCH_X(210), SCREENH), black);
+ CSprite2d::DrawRect(CRect(SCREENW / 2 + HUD_STRETCH_X(210), 0.0f, SCREENW, SCREENH), black);
}
MusicManager.DisplayRadioStationName();
diff --git a/src/modelinfo/ModelIndices.h b/src/modelinfo/ModelIndices.h
index bbf1a58b..7567c0db 100644
--- a/src/modelinfo/ModelIndices.h
+++ b/src/modelinfo/ModelIndices.h
@@ -202,16 +202,118 @@ enum
MI_FEMALE03,
MI_FATFEMALE01,
MI_FATFEMALE02,
-
- MI_FIRETRUCK = 97,
- MI_PREDATOR = 120,
- MI_RHINO = 122,
- MI_TRAIN = 124,
- MI_COACH = 127,
- MI_RCBANDIT = 131,
- MI_SPEEDER = 142,
- MI_REEFER = 143,
- MI_GHOST = 150,
+ MI_PROSTITUTE,
+ MI_PROSTITUTE2,
+ MI_P_MAN1,
+ MI_P_MAN2,
+ MI_P_WOM1,
+ MI_P_WOM2,
+ MI_CT_MAN1,
+ MI_CT_MAN2,
+ MI_CT_WOM1,
+ MI_CT_WOM2,
+ MI_LI_MAN1,
+ MI_LI_MAN2,
+ MI_LI_WOM1,
+ MI_LI_WOM2,
+ MI_DOCKER1,
+ MI_DOCKER2,
+ MI_SCUM_MAN,
+ MI_SCUM_WOM,
+ MI_WORKER1,
+ MI_WORKER2,
+ MI_B_MAN1,
+ MI_B_MAN2,
+ MI_B_MAN3,
+ MI_B_WOM1,
+ MI_B_WOM2,
+ MI_B_WOM3,
+ MI_MOD_MAN,
+ MI_MOD_WOM,
+ MI_ST_MAN,
+ MI_ST_WOM,
+ MI_FAN_MAN1,
+ MI_FAN_MAN2,
+ MI_FAN_WOM,
+ MI_HOS_MAN,
+ MI_HOS_WOM,
+ MI_CONST1,
+ MI_CONST2,
+ MI_SHOPPER1,
+ MI_SHOPPER2,
+ MI_SHOPPER3,
+ MI_STUD_MAN,
+ MI_STUD_WOM,
+ MI_CAS_MAN,
+ MI_CAS_WOM,
+ MI_BUSKER1,
+ MI_BUSKER2,
+ MI_BUSKER3,
+ MI_BUSKER4,
+ MI_PED87,
+ MI_PED88,
+ MI_PED89,
+ MI_LANDSTAL,
+ MI_IDAHO,
+ MI_STINGER,
+ MI_LINERUN,
+ MI_PEREN,
+ MI_SENTINEL,
+ MI_PATRIOT,
+ MI_FIRETRUCK,
+ MI_TRASH,
+ MI_STRETCH,
+ MI_MANANA,
+ MI_INFERNUS,
+ MI_BLISTA,
+ MI_PONY,
+ MI_MULE,
+ MI_CHEETAH,
+ MI_AMBULAN,
+ MI_FBICAR,
+ MI_MOONBEAM,
+ MI_ESPERANT,
+ MI_TAXI,
+ MI_KURUMA,
+ MI_BOBCAT,
+ MI_MRWHOOP,
+ MI_BFINJECT,
+ MI_CORPSE,
+ MI_POLICE,
+ MI_ENFORCER,
+ MI_SECURICA,
+ MI_BANSHEE,
+ MI_PREDATOR,
+ MI_BUS,
+ MI_RHINO,
+ MI_BARRACKS,
+ MI_TRAIN,
+ MI_CHOPPER,
+ MI_DODO,
+ MI_COACH,
+ MI_CABBIE,
+ MI_STALLION,
+ MI_RUMPO,
+ MI_RCBANDIT,
+ MI_BELLYUP,
+ MI_MRWONGS,
+ MI_MAFIA,
+ MI_YARDIE,
+ MI_YAKUZA,
+ MI_DIABLOS,
+ MI_COLUMB ,
+ MI_HOODS,
+ MI_AIRTRAIN,
+ MI_DEADDODO,
+ MI_SPEEDER,
+ MI_REEFER,
+ MI_PANLANT,
+ MI_FLATBED,
+ MI_YANKEE,
+ MI_ESCAPE,
+ MI_BORGNINE,
+ MI_TOYZ,
+ MI_GHOST,
MI_CAR_DOOR = 190,
MI_CAR_BUMPER,
diff --git a/src/modelinfo/PedModelInfo.h b/src/modelinfo/PedModelInfo.h
index e917b6b2..95d49090 100644
--- a/src/modelinfo/PedModelInfo.h
+++ b/src/modelinfo/PedModelInfo.h
@@ -15,8 +15,7 @@ enum PedNode {
PED_FOOTL,
PED_FOOTR,
PED_LOWERLEGR,
- // This is not valid apparently
- PED_LOWERLEGL,
+ PED_NODE_MAX// Not valid: PED_LOWERLEGL
};
class CPedModelInfo : public CClumpModelInfo
diff --git a/src/render/Draw.cpp b/src/render/Draw.cpp
index 7c5a48ad..b411176f 100644
--- a/src/render/Draw.cpp
+++ b/src/render/Draw.cpp
@@ -1,6 +1,10 @@
#include "common.h"
#include "patcher.h"
#include "Draw.h"
+#include "Frontend.h"
+#include "Camera.h"
+
+float CDraw::ms_fAspectRatio;
float &CDraw::ms_fNearClipZ = *(float*)0x8E2DC4;
float &CDraw::ms_fFarClipZ = *(float*)0x9434F0;
@@ -11,6 +15,17 @@ uint8 &CDraw::FadeRed = *(uint8*)0x95CD90;
uint8 &CDraw::FadeGreen = *(uint8*)0x95CD71;
uint8 &CDraw::FadeBlue = *(uint8*)0x95CD53;
+void
+CDraw::CalculateAspectRatio()
+{
+ if(FrontEndMenuManager.m_PrefsUseWideScreen)
+ ms_fAspectRatio = 16.0f/9.0f;
+ else if(TheCamera.m_WideScreenOn)
+ ms_fAspectRatio = 1.25f;
+ else
+ ms_fAspectRatio = 4.0f/3.0f;
+}
+
static float hFov2vFov(float hfov)
{
float w = SCREENW;
@@ -36,4 +51,7 @@ CDraw::SetFOV(float fov)
STARTPATCHES
InjectHook(0x4FE7B0, CDraw::SetFOV, PATCH_JUMP);
+
+ Nop(0x46B618, 2);
+ Patch<float>(0x5F0A64, 1.3333334f);
ENDPATCHES
diff --git a/src/render/Draw.h b/src/render/Draw.h
index 408c41b0..6dd42121 100644
--- a/src/render/Draw.h
+++ b/src/render/Draw.h
@@ -6,6 +6,8 @@ private:
static float &ms_fNearClipZ;
static float &ms_fFarClipZ;
static float &ms_fFOV;
+ static float ms_fAspectRatio;
+
public:
static uint8 &FadeValue;
static uint8 &FadeRed;
@@ -16,6 +18,11 @@ public:
static float GetNearClipZ(void) { return ms_fNearClipZ; }
static void SetFarClipZ(float farclip) { ms_fFarClipZ = farclip; }
static float GetFarClipZ(void) { return ms_fFarClipZ; }
+
static void SetFOV(float fov);
static float GetFOV(void) { return ms_fFOV; }
+
+ static void CalculateAspectRatio();
+ static float GetAspectRatio(void) { return ms_fAspectRatio; }
+
};
diff --git a/src/render/Hud.cpp b/src/render/Hud.cpp
index 0de5f5b0..bd8cee51 100644
--- a/src/render/Hud.cpp
+++ b/src/render/Hud.cpp
@@ -1,8 +1,1284 @@
#include "common.h"
#include "patcher.h"
+#include "Camera.h"
+#include "DMAudio.h"
+#include "Clock.h"
+#include "Darkel.h"
#include "Hud.h"
+#include "Messages.h"
+#include "Frontend.h"
+#include "Font.h"
+#include "Pad.h"
+#include "Radar.h"
+#include "Replay.h"
+#include "Sprite.h"
+#include "Sprite2d.h"
+#include "Text.h"
+#include "Timer.h"
+#include "Script.h"
+#include "TxdStore.h"
+#include "User.h"
+#include "World.h"
+//WRAPPER void CHud::Draw(void) { EAXJMP(0x5052A0); }
+//WRAPPER void CHud::DrawAfterFade(void) { EAXJMP(0x509030); }
+WRAPPER void CHud::ReInitialise(void) { EAXJMP(0x504CC0); }
+WRAPPER void CHud::GetRidOfAllHudMessages(void) { EAXJMP(0x504F90); }
+WRAPPER void CHud::SetHelpMessage(wchar *message, bool quick) { EAXJMP(0x5051E0); }
+WRAPPER void CHud::SetMessage(wchar *message) { EAXJMP(0x50A210); }
+WRAPPER void CHud::SetBigMessage(wchar *message, int16 style) { EAXJMP(0x50A250); }
+WRAPPER void CHud::SetPagerMessage(wchar *message) { EAXJMP(0x50A320); }
+
+wchar *CHud::m_HelpMessage = (wchar*)0x86B888;
+wchar *CHud::m_LastHelpMessage = (wchar*)0x6E8F28;
+int32 &CHud::m_HelpMessageState = *(int32*)0x880E1C;
+int32 &CHud::m_HelpMessageTimer = *(int32*)0x880FA4;
+int32 &CHud::m_HelpMessageFadeTimer = *(int32*)0x8F6258;
+wchar *CHud::m_HelpMessageToPrint = (wchar*)0x664480;
+float &CHud::m_HelpMessageDisplayTime = *(float*)0x8E2C28;
+float &CHud::m_fTextBoxNumLines = *(float*)0x8E2C28;
+float &CHud::m_fHelpMessageTime = *(float *)0x8E2C28;
+bool &CHud::m_bHelpMessageQuick = *(bool *)0x95CCF7;
+int32 CHud::m_ZoneState = *(int32*)0x8F29AC;
+int32 CHud::m_ZoneFadeTimer;
+int32 CHud::m_ZoneNameTimer = *(int32*)0x8F1A50;
+wchar *&CHud::m_pZoneName = *(wchar **)0x8E2C2C;
+wchar *CHud::m_pLastZoneName = (wchar*)0x8F432C;
+wchar *CHud::m_ZoneToPrint;
+int32 CHud::m_VehicleState = *(int32*)0x940560;
+int32 CHud::m_VehicleFadeTimer;
+int32 CHud::m_VehicleNameTimer = *(int32*)0x8F2A14;
+wchar *&CHud::m_pVehicleName = *(wchar **)0x942FB4;
+wchar *CHud::m_pLastVehicleName = *(wchar **)0x8E2DD8;
+wchar *CHud::m_pVehicleNameToPrint;
+wchar *CHud::m_Message = (wchar*)0x72E318;
+wchar *CHud::m_PagerMessage = (wchar*)0x878840;
bool &CHud::m_Wants_To_Draw_Hud = *(bool*)0x95CD89;
+bool &CHud::m_Wants_To_Draw_3dMarkers = *(bool*)0x95CD62;
+wchar(*CHud::m_BigMessage)[128] = (wchar(*)[128])0x664CE0;
+float *CHud::BigMessageInUse = (float*)0x862140;
+float *CHud::BigMessageAlpha = (float*)0x862108;
+float *CHud::BigMessageX = (float*)0x773248;
+
+float &CHud::OddJob2OffTimer = *(float*)0x942FA0;
+int8 &CHud::CounterOnLastFrame = *(int8*)0x95CD67;
+float &CHud::OddJob2XOffset = *(float*)0x8F1B5C;
+int16 &CHud::CounterFlashTimer = *(int16*)0x95CC20;
+int16 &CHud::OddJob2Timer = *(int16*)0x95CC52;
+int8 &CHud::TimerOnLastFrame = *(int8*)0x95CDA7;
+int16 &CHud::OddJob2On = *(int16*)0x95CC78;
+int16 &CHud::TimerFlashTimer = *(int16*)0x95CC6C;
+int16 &CHud::PagerSoundPlayed = *(int16*)0x95CC4A;
+int32 &CHud::SpriteBrightness = *(int32*)0x95CC54;
+float &CHud::PagerXOffset = *(float*)0x941590;
+int32 CHud::m_ItemToFlash = *(int32*)0x95CC82;
+int16 &CHud::PagerTimer = *(int16*)0x95CC3A;
+int16 &CHud::PagerOn = *(int16*)0x95CCA0;
+
+CSprite2d *CHud::Sprites = (CSprite2d*)0x95CB9C;
+char *WeaponFilenames[] = {
+ "fist",
+ "fistm",
+ "bat",
+ "batm",
+ "pistol",
+ "pistolm",
+ "uzi",
+ "uzim",
+ "shotgun",
+ "shotgunm",
+ "ak47",
+ "ak47m",
+ "m16",
+ "m16m",
+ "sniper",
+ "sniperm",
+ "rocket",
+ "rocketm",
+ "flame",
+ "flamem",
+ "molotov",
+ "molotovm",
+ "grenade",
+ "grenadem",
+ "detonator",
+ "detonator_mask",
+ "",
+ "",
+ "",
+ "",
+ "radardisc",
+ "radardiscm",
+ "pager",
+ "pagerm",
+ "",
+ "",
+ "",
+ "",
+ "bleeder",
+ "",
+ "sitesniper",
+ "sitesniperm",
+ "siteM16",
+ "siteM16m",
+ "siterocket",
+ "siterocketm"
+};
+
+RwTexture *&gpSniperSightTex = *(RwTexture**)0x8F5834;
+RwTexture *&gpRocketSightTex = *(RwTexture**)0x8E2C20;
+
+void CHud::Initialise()
+{
+ ReInitialise();
+
+ int HudTXD = CTxdStore::AddTxdSlot("hud");
+ CTxdStore::LoadTxd(HudTXD, "MODELS/HUD.TXD");
+ CTxdStore::AddRef(HudTXD);
+ CTxdStore::PopCurrentTxd();
+ CTxdStore::SetCurrentTxd(HudTXD);
+
+ for (int i = 0; i < ARRAY_SIZE(WeaponFilenames) / 2; i++) {
+ Sprites[i].SetTexture(WeaponFilenames[i * 2]);
+ }
+
+ gpSniperSightTex = RwTextureRead("sitesniper", 0);
+ gpRocketSightTex = RwTextureRead("siterocket", 0);
+
+ CTxdStore::PopCurrentTxd();
+}
+
+void CHud::Shutdown()
+{
+ for (int i = 0; i < ARRAY_SIZE(WeaponFilenames) / 2; ++i) {
+ Sprites[i].Delete();
+ }
+
+ RwTextureDestroy(gpSniperSightTex);
+ gpSniperSightTex = 0;
+
+ RwTextureDestroy(gpRocketSightTex);
+ gpRocketSightTex = 0;
+
+ int HudTXD = CTxdStore::FindTxdSlot("hud");
+ CTxdStore::RemoveTxdSlot(HudTXD);
+}
+
+void CHud::SetVehicleName(wchar *name)
+{
+ m_pVehicleName = name;
+}
+
+void CHud::SetZoneName(wchar *name)
+{
+ m_pZoneName = name;
+}
+
+void CHud::Draw()
+{
+ RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE);
+ RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
+ RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
+ RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
+ RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void*)rwTEXTUREADDRESSMIRROR);
+ RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void*)FALSE);
+ RwRenderStateSet(rwRENDERSTATESHADEMODE, (void*)rwSHADEMODEFLAT);
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
+
+ if (CReplay::Mode != 1) {
+ if (m_Wants_To_Draw_Hud && !TheCamera.m_WideScreenOn) {
+ bool Mode_RunAround = 0;
+ bool Mode_FirstPerson = 0;
+
+ int32 WeaponType = CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_weapons[CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_currentWeapon].m_eWeaponType;
+ int32 Mode = TheCamera.Cams[TheCamera.ActiveCam].Mode;
+
+ if (Mode == CCam::CamMode::MODE_SNIPER || Mode == CCam::CamMode::MODE_ROCKET || Mode == CCam::CamMode::MODE_M16FIRSTPERSON_34 || Mode == CCam::CamMode::MODE_EDITOR)
+ Mode_FirstPerson = 1;
+ if (Mode == CCam::CamMode::MODE_FIRSTPERSONPEDONPC_41 || Mode == CCam::CamMode::MODE_SNIPER_RUN_AROUND)
+ Mode_RunAround = 1;
+
+ /*
+ Draw Crosshairs
+ */
+ if (TheCamera.Cams->Using3rdPersonMouseCam() && (!CPad::GetPad(0)->GetLookBehindForPed() || TheCamera.m_bPlayerIsInGarage) || Mode == 40) {
+ if (CWorld::Players[CWorld::PlayerInFocus].m_pPed) {
+ int32 State = CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_nPedState;
+ if (State != PED_ENTER_CAR && State != PED_CARJACK) {
+ if ((WeaponType >= WEAPONTYPE_COLT45 && WeaponType <= WEAPONTYPE_M16) || WeaponType == WEAPONTYPE_FLAMETHROWER)
+ Mode_RunAround = 1;
+ }
+ }
+ }
+
+ if (Mode_FirstPerson || Mode_RunAround) {
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void *)rwFILTERLINEAR);
+
+ int32 SpriteBrightLikeADiamond = CHud::SpriteBrightness + 1;
+ if (SpriteBrightLikeADiamond > 30)
+ SpriteBrightLikeADiamond = 30;
+
+ CHud::SpriteBrightness = SpriteBrightLikeADiamond;
+
+ RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
+
+ float fStep = sin((CTimer::GetTimeInMilliseconds() & 1023) * 0.0061328127);
+ float fMultBright = CHud::SpriteBrightness * 0.03f * (0.25f * fStep + 0.75f);
+ CRect rect;
+
+ float fWidescreenOffset[2] = { 0.0f, 0.0f };
+
+ if (CMenuManager::m_PrefsUseWideScreen) {
+ fWidescreenOffset[0] = 0.0f;
+ fWidescreenOffset[1] = HUD_STRETCH_Y(18.0f);
+ }
+
+ if (Mode_RunAround && TheCamera.Cams->Using3rdPersonMouseCam()) {
+ float f3rdX = SCREENW * TheCamera.m_f3rdPersonCHairMultX + fWidescreenOffset[0];
+ float f3rdY = SCREENH * TheCamera.m_f3rdPersonCHairMultY - fWidescreenOffset[1];
+
+ if (CWorld::Players[CWorld::PlayerInFocus].m_pPed && WeaponType == WEAPONTYPE_M16) {
+ rect.left = f3rdX - HUD_STRETCH_X(32.0f * 0.6f);
+ rect.top = f3rdY - HUD_STRETCH_Y(32.0f * 0.6f);
+ rect.right = f3rdX + HUD_STRETCH_X(32.0f * 0.6f);
+ rect.bottom = f3rdY + HUD_STRETCH_Y(32.0f * 0.6f);
+
+ CHud::Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
+ }
+ else {
+ rect.left = f3rdX - HUD_STRETCH_X(32.0f * 0.4f);
+ rect.top = f3rdY - HUD_STRETCH_Y(32.0f * 0.4f);
+ rect.right = f3rdX + HUD_STRETCH_X(32.0f * 0.4f);
+ rect.bottom = f3rdY + HUD_STRETCH_Y(32.0f * 0.4f);
+
+ CHud::Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
+ }
+ }
+ else {
+ if (Mode != CCam::CamMode::MODE_M16FIRSTPERSON_34 && Mode != CCam::CamMode::MODE_FIRSTPERSONPEDONPC_41 && Mode != CCam::CamMode::MODE_EDITOR) {
+ if (Mode == CCam::CamMode::MODE_ROCKET_RUN_AROUND) {
+ rect.left = (SCREEN_WIDTH / 2) - HUD_STRETCH_X(32.0f * 0.7f);
+ rect.top = (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(32.0f * 0.7f);
+ rect.right = (SCREEN_WIDTH / 2) + HUD_STRETCH_X(32.0f * 0.7f);
+ rect.bottom = (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(32.0f * 0.7f);
+
+ CHud::Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
+ }
+ else if (Mode != CCam::CamMode::MODE_ROCKET && Mode != CCam::CamMode::MODE_SNIPER_RUN_AROUND) {
+ rect.left = (SCREEN_WIDTH / 2) - HUD_STRETCH_X(210.0f);
+ rect.top = (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(210.0f);
+ rect.right = SCREEN_WIDTH / 2;
+ rect.bottom = SCREEN_HEIGHT / 2;
+ CHud::Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
+
+ rect.right = (SCREEN_WIDTH / 2);
+ rect.top = (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(210.0f);
+ rect.left = HUD_STRETCH_X(210.0f) + (SCREEN_WIDTH / 2);
+ rect.bottom = SCREEN_HEIGHT / 2;
+ CHud::Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
+
+ rect.left = (SCREEN_WIDTH / 2) - HUD_STRETCH_X(210.0f);
+ rect.bottom = (SCREEN_HEIGHT / 2);
+ rect.right = (SCREEN_WIDTH / 2);
+ rect.top = HUD_STRETCH_Y(210.0f) + (SCREEN_HEIGHT / 2);
+ CHud::Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
+
+ rect.right = (SCREEN_WIDTH / 2);
+ rect.bottom = (SCREEN_HEIGHT / 2);
+ rect.left = HUD_STRETCH_X(210.0f) + (SCREEN_WIDTH / 2);
+ rect.top = HUD_STRETCH_Y(210.0f) + (SCREEN_HEIGHT / 2);
+ CHud::Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
+ }
+ else {
+ RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE);
+ RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDONE);
+ RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDONE);
+ RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
+ RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
+ RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpRocketSightTex->raster);
+
+ CSprite::RenderOneXLUSprite(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, 1.0f, HUD_STRETCH_X(40.0f), HUD_STRETCH_Y(40.0f), (100.0f * fMultBright), (200.0f * fMultBright), (100.0f * fMultBright), 255, 1.0f, 255);
+ }
+ }
+ else {
+ rect.left = (SCREEN_WIDTH / 2) - HUD_STRETCH_X(32.0f);
+ rect.top = (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(32.0f);
+ rect.right = (SCREEN_WIDTH / 2) + HUD_STRETCH_X(32.0f);
+ rect.bottom = (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(32.0f);
+ CHud::Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
+ }
+ }
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void *)rwFILTERLINEAR);
+ RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
+ RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
+ }
+ else {
+ CHud::SpriteBrightness = 0;
+ }
+
+ /*
+ DrawMoneyCounter
+ */
+ wchar sPrint[16];
+ wchar sPrintIcon[16];
+ char sTemp[16];
+
+ sprintf(sTemp, "$%08d", CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
+ AsciiToUnicode(sTemp, sPrint);
+
+ CFont::SetPropOff();
+ CFont::SetBackgroundOff();
+ CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
+ CFont::SetCentreOff();
+ CFont::SetRightJustifyOn();
+ CFont::SetRightJustifyWrap(0.0f);
+ CFont::SetBackGroundOnlyTextOff();
+ CFont::SetFontStyle(FONT_HEADING);
+ CFont::SetPropOff();
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+
+ CFont::PrintString(HUD_FROM_RIGHT(110.0f - 2.0f), HUD_STRETCH_Y(43.0f + 2.0f), sPrint);
+
+ CFont::SetColor(CRGBA(89, 115, 150, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(110.0f), HUD_STRETCH_Y(43.0f), sPrint);
+
+ /*
+ DrawClock
+ */
+ sprintf(sTemp, "%02d:%02d", CClock::GetHours(), CClock::GetMinutes());
+ AsciiToUnicode(sTemp, sPrint);
+
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+
+ CFont::PrintString(HUD_FROM_RIGHT(111.0f - 2.0f), HUD_STRETCH_Y(22.0f + 2.0f), sPrint);
+
+ CFont::SetColor(CRGBA(194, 165, 120, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(111.0f), HUD_STRETCH_Y(22.0f), sPrint);
+
+ /*
+ DrawAmmo
+ */
+ int32 AmmoInClip = CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_weapons[CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_currentWeapon].m_nAmmoInClip;
+ int32 TotalAmmo = CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_weapons[CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_currentWeapon].m_nAmmoTotal;
+
+ if (AmmoInClip <= 1 || AmmoInClip >= 1000) {
+ sprintf(sTemp, "%d", TotalAmmo);
+ }
+ else {
+ if (WeaponType == WEAPONTYPE_FLAMETHROWER) {
+ int tot_min_clip_div_10 = (TotalAmmo - AmmoInClip) / 10;
+ if (tot_min_clip_div_10 > 9999)
+ tot_min_clip_div_10 = 9999;
+
+ sprintf(sTemp, "%d-%d", tot_min_clip_div_10, AmmoInClip / 10);
+ }
+ else {
+ if (AmmoInClip > 9999)
+ AmmoInClip = 9999;
+ sprintf(sTemp, "%d-%d", (TotalAmmo - AmmoInClip), AmmoInClip);
+ }
+ }
+
+ AsciiToUnicode(sTemp, sPrint);
+
+ CFont::SetBackgroundOff();
+ CFont::SetScale(HUD_STRETCH_X(0.4f), HUD_STRETCH_Y(0.6f));
+ CFont::SetJustifyOff();
+ CFont::SetCentreOn();
+ CFont::SetCentreSize(HUD_STRETCH_X(640.0f));
+ CFont::SetPropOn();
+ CFont::SetFontStyle(FONT_BANK);
+
+ if (!CDarkel::FrenzyOnGoing()) {
+ if (WeaponType) {
+ if (WeaponType != 1) {
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(66.0f), HUD_STRETCH_Y(73.0f), sPrint);
+ }
+ }
+ }
+
+ /*
+ DrawWeaponIcon
+ */
+ CHud::Sprites[WeaponType].Draw(
+ CRect(HUD_FROM_RIGHT(99.0f), HUD_STRETCH_Y(27.0f), HUD_FROM_RIGHT(35.0f), HUD_STRETCH_Y(91.0f)),
+ CRGBA(255, 255, 255, 255),
+ 0.015f,
+ 0.015f,
+ 1.0f,
+ 0.0f,
+ 0.015f,
+ 1.0f,
+ 1.0f,
+ 1.0f);
+
+ /*
+ DrawHealth
+ */
+ CFont::SetBackgroundOff();
+ CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
+ CFont::SetJustifyOff();
+ CFont::SetCentreOff();
+ CFont::SetRightJustifyWrap(0.0f);
+ CFont::SetRightJustifyOn();
+ CFont::SetPropOff();
+ CFont::SetFontStyle(FONT_HEADING);
+
+ if (CHud::m_ItemToFlash == ITEM_HEALTH && CTimer::GetFrameCounter() & 8
+ || CHud::m_ItemToFlash != ITEM_HEALTH
+ || CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fHealth < 10
+ && CTimer::GetFrameCounter() & 8) {
+ if (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fHealth >= 10
+ || CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fHealth < 10 && CTimer::GetFrameCounter() & 8) {
+
+ AsciiToUnicode("[", sPrintIcon);
+ sprintf(sTemp, "%03d", (int32)CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fHealth);
+ AsciiToUnicode(sTemp, sPrint);
+
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(110.0f - 2.0f), HUD_STRETCH_Y(65.0f + 2.0f), sPrint);
+
+ if (!CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastHealthLoss || CTimer::GetTimeInMilliseconds() > CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastHealthLoss + 2000 || CTimer::GetFrameCounter() & 4) {
+ CFont::PrintString(HUD_FROM_RIGHT(164.0f - 2.0f), HUD_STRETCH_Y(65.0f + 2.0f), sPrintIcon);
+ }
+ CFont::SetColor(CRGBA(186, 101, 50, 255));
+
+ CFont::PrintString(HUD_FROM_RIGHT(110.0f), HUD_STRETCH_Y(65.0f), sPrint);
+
+ if (!CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastHealthLoss || CTimer::GetTimeInMilliseconds() > CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastHealthLoss + 2000 || CTimer::GetFrameCounter() & 4) {
+ CFont::PrintString(HUD_FROM_RIGHT(164.0f), HUD_STRETCH_Y(65.0f), sPrintIcon);
+ }
+ }
+ }
+
+ /*
+ DrawArmour
+ */
+ if (CHud::m_ItemToFlash == ITEM_ARMOUR && CTimer::GetFrameCounter() & 8 || CHud::m_ItemToFlash != ITEM_ARMOUR) {
+ CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
+ if (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fArmour > 1.0f) {
+ AsciiToUnicode("[", sPrintIcon);
+ sprintf(sTemp, "%03d", (int32)CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fArmour);
+ AsciiToUnicode(sTemp, sPrint);
+
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(182.0f - 2.0f), HUD_STRETCH_Y(65.0f + 2.0f), sPrint);
+
+ if (!CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastArmourLoss || CTimer::GetTimeInMilliseconds() > CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastArmourLoss + 2000 || CTimer::GetFrameCounter() & 4) {
+ CFont::PrintString(HUD_FROM_RIGHT(234.0f - 2.0f), HUD_STRETCH_Y(65.0f + 2.0f), sPrintIcon);
+ }
+
+ CFont::SetColor(CRGBA(124, 140, 95, 255));
+
+ CFont::PrintString(HUD_FROM_RIGHT(182.0f), HUD_STRETCH_Y(65.0f), sPrint);
+
+ if (!CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastArmourLoss || CTimer::GetTimeInMilliseconds() > CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastArmourLoss + 2000 || CTimer::GetFrameCounter() & 1) {
+ CFont::PrintString(HUD_FROM_RIGHT(234.0f), HUD_STRETCH_Y(65.0f), sPrintIcon);
+ }
+ }
+ }
+
+ /*
+ DrawWantedLevel
+ */
+ CFont::SetBackgroundOff();
+ CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
+ CFont::SetJustifyOff();
+ CFont::SetCentreOff();
+ CFont::SetRightJustifyOff();
+ CFont::SetPropOn();
+ CFont::SetFontStyle(FONT_HEADING);
+
+ AsciiToUnicode("]", sPrintIcon);
+
+ for (int i = 0; i < 6; i++) {
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString(2.0f + HUD_FROM_RIGHT(60.0f - 2.0f + 23.0f * i), HUD_STRETCH_Y(87.0f + 2.0f), sPrintIcon);
+ if (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_pWanted->m_nWantedLevel > i
+ && (CTimer::GetTimeInMilliseconds() > CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_pWanted->m_nLastWantedLevelChange
+ + 2000 || CTimer::GetFrameCounter() & 4)) {
+
+ CFont::SetColor(CRGBA(193, 164, 120, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(60.0f + 23.0f * i), HUD_STRETCH_Y(87.0f), sPrintIcon);
+ }
+ }
+
+ /*
+ DrawZoneName
+ */
+ if (CHud::m_pZoneName) {
+ float fZoneAlpha = 0.0f;
+
+ if (CHud::m_pZoneName != CHud::m_pLastZoneName) {
+ switch (CHud::m_ZoneState) {
+ case 0:
+ CHud::m_ZoneState = 2;
+ CHud::m_ZoneToPrint = CHud::m_pZoneName;
+ CHud::m_ZoneNameTimer = 0;
+ CHud::m_ZoneFadeTimer = 0;
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ CHud::m_ZoneNameTimer = 0;
+ CHud::m_ZoneState = 4;
+ break;
+ default:
+ break;
+ }
+ CHud::m_pLastZoneName = CHud::m_pZoneName;
+ }
+
+ if (CHud::m_ZoneState) {
+ switch (CHud::m_ZoneState) {
+ case 1:
+ if (CHud::m_ZoneNameTimer > 10000) {
+ CHud::m_ZoneFadeTimer = 1000;
+ CHud::m_ZoneState = 3;
+ }
+ fZoneAlpha = 255.0f;
+ break;
+ case 2:
+ CHud::m_ZoneFadeTimer += (CTimer::GetTimeStep() * 0.02f * 1000.0f);
+ if (CHud::m_ZoneFadeTimer > 1000) {
+ CHud::m_ZoneState = 1;
+ CHud::m_ZoneFadeTimer = 1000;
+ }
+ fZoneAlpha = CHud::m_ZoneFadeTimer * 0.001f * 255.0f;
+ break;
+ case 3:
+ CHud::m_ZoneFadeTimer += (CTimer::GetTimeStep() * 0.02f * -1000.0f);
+ if (CHud::m_ZoneFadeTimer < 0) {
+ CHud::m_ZoneState = 0;
+ CHud::m_ZoneFadeTimer = 0;
+ }
+ fZoneAlpha = CHud::m_ZoneFadeTimer * 0.001f * 255.0f;
+ break;
+ case 4:
+ CHud::m_ZoneFadeTimer += (CTimer::GetTimeStep() * 0.02f * -1000.0f);
+ if (CHud::m_ZoneFadeTimer < 0) {
+ CHud::m_ZoneFadeTimer = 0;
+ CHud::m_ZoneToPrint = CHud::m_pLastZoneName;
+ CHud::m_ZoneNameTimer = 0;
+ CHud::m_ZoneState = 2;
+ }
+ fZoneAlpha = CHud::m_ZoneFadeTimer * 0.001f * 255.0f;
+ break;
+ default:
+ break;
+
+ }
+ if (!CHud::m_Message[0]) {
+ CHud::m_ZoneNameTimer += (CTimer::GetTimeStep() * 0.02f * 1000.0f);
+ CFont::SetJustifyOff();
+ CFont::SetPropOn();
+ CFont::SetBackgroundOff();
+
+ if (CMenuManager::m_PrefsLanguage == 4)
+ CFont::SetScale(HUD_STRETCH_X(1.2f * 0.8f), HUD_STRETCH_Y(1.2f));
+ else
+ CFont::SetScale(HUD_STRETCH_X(1.2f), HUD_STRETCH_Y(1.2f));
+
+ CFont::SetRightJustifyOn();
+ CFont::SetRightJustifyWrap(0.0f);
+ CFont::SetBackGroundOnlyTextOff();
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetColor(CRGBA(0, 0, 0, fZoneAlpha));
+ CFont::PrintString(HUD_FROM_RIGHT(32.0f - 1.0f), HUD_FROM_BOTTOM(30.0f - 1.0f), CHud::m_ZoneToPrint);
+
+ CFont::SetColor(CRGBA(152, 154, 82, fZoneAlpha));
+ CFont::PrintString(HUD_FROM_RIGHT(32.0f), HUD_FROM_BOTTOM(30.0f), CHud::m_ZoneToPrint);
+ }
+ }
+ }
+ else {
+ CHud::m_pLastZoneName = 0;
+ CHud::m_ZoneState = 0;
+ CHud::m_ZoneFadeTimer = 0;
+ CHud::m_ZoneNameTimer = 0;
+ }
+
+ /*
+ DrawVehicleName
+ */
+ if (CHud::m_pVehicleName) {
+ float fVehicleAlpha = 0.0f;
+
+ if (CHud::m_pVehicleName != CHud::m_pLastVehicleName) {
+ switch (CHud::m_VehicleState) {
+ case 0:
+ CHud::m_VehicleState = 2;
+ CHud::m_pVehicleNameToPrint = CHud::m_pVehicleName;
+ CHud::m_VehicleNameTimer = 0;
+ CHud::m_VehicleFadeTimer = 0;
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ CHud::m_VehicleNameTimer = 0;
+ CHud::m_VehicleState = 4;
+ break;
+ default:
+ break;
+ }
+ CHud::m_pLastVehicleName = CHud::m_pVehicleName;
+ }
+
+ if (CHud::m_VehicleState) {
+ switch (CHud::m_VehicleState) {
+ case 1:
+ if (CHud::m_VehicleNameTimer > 10000) {
+ CHud::m_VehicleFadeTimer = 1000;
+ CHud::m_VehicleState = 3;
+ }
+ fVehicleAlpha = 255.0f;
+ break;
+ case 2:
+ CHud::m_VehicleFadeTimer += (CTimer::GetTimeStep() * 0.02f * 1000.0f);
+ if (CHud::m_VehicleFadeTimer > 1000) {
+ CHud::m_VehicleState = 1;
+ CHud::m_VehicleFadeTimer = 1000;
+ }
+ fVehicleAlpha = CHud::m_VehicleFadeTimer * 0.001f * 255.0f;
+ break;
+ case 3:
+ CHud::m_VehicleFadeTimer += (CTimer::GetTimeStep() * 0.02f * -1000.0f);
+ if (CHud::m_VehicleFadeTimer < 0) {
+ CHud::m_VehicleState = 0;
+ CHud::m_VehicleFadeTimer = 0;
+ }
+ fVehicleAlpha = CHud::m_VehicleFadeTimer * 0.001f * 255.0f;
+ break;
+ case 4:
+ CHud::m_VehicleFadeTimer += (CTimer::GetTimeStep() * 0.02f * -1000.0f);
+ if (CHud::m_VehicleFadeTimer < 0) {
+ CHud::m_VehicleFadeTimer = 0;
+ CHud::m_pVehicleNameToPrint = CHud::m_pLastVehicleName;
+ CHud::m_VehicleNameTimer = 0;
+ CHud::m_VehicleState = 2;
+ }
+ fVehicleAlpha = CHud::m_VehicleFadeTimer * 0.001f * 255.0f;
+ break;
+ default:
+ break;
+ }
+
+ if (!CHud::m_Message[0]) {
+ CHud::m_VehicleNameTimer += (CTimer::GetTimeStep() * 0.02f * 1000.0f);
+ CFont::SetJustifyOff();
+ CFont::SetPropOn();
+ CFont::SetBackgroundOff();
+
+ if (CMenuManager::m_PrefsLanguage != 3 && CMenuManager::m_PrefsLanguage != 4)
+ CFont::SetScale(HUD_STRETCH_X(1.2f), HUD_STRETCH_Y(1.2f));
+ else
+ CFont::SetScale(HUD_STRETCH_X(1.2f * 0.85f), HUD_STRETCH_Y(1.2f));
+
+ CFont::SetRightJustifyOn();
+ CFont::SetRightJustifyWrap(0.0f);
+ CFont::SetBackGroundOnlyTextOff();
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetColor(CRGBA(0, 0, 0, fVehicleAlpha));
+ CFont::PrintString(HUD_FROM_RIGHT(32.0f - 1.0f), HUD_FROM_BOTTOM(55.0f - 1.0f), CHud::m_pVehicleNameToPrint);
+
+ CFont::SetColor(CRGBA(194, 165, 120, fVehicleAlpha));
+ CFont::PrintString(HUD_FROM_RIGHT(32.0f), HUD_FROM_BOTTOM(55.0f), CHud::m_pVehicleNameToPrint);
+ }
+ }
+ }
+ else {
+ CHud::m_pLastVehicleName = 0;
+ CHud::m_VehicleState = 0;
+ CHud::m_VehicleFadeTimer = 0;
+ CHud::m_VehicleNameTimer = 0;
+ }
+
+ /*
+ DrawOnScreenTimer
+ */
+ wchar sTimer[16];
+ if (!CUserDisplay::OnscnTimer.m_sEntries[0].m_bTimerProcessed)
+ TimerOnLastFrame = 0;
+ if (!CUserDisplay::OnscnTimer.m_sEntries[0].m_bCounterProcessed)
+ CounterOnLastFrame = 0;
+
+ if (CUserDisplay::OnscnTimer.m_bProcessed == 1) {
+ if (CUserDisplay::OnscnTimer.m_sEntries[0].m_bTimerProcessed == 1) {
+ if (!TimerOnLastFrame)
+ TimerFlashTimer = 1;
+
+ TimerOnLastFrame = 1;
+
+ if (TimerFlashTimer) {
+ if (++TimerFlashTimer > 50)
+ TimerFlashTimer = 0;
+ }
+
+ if (CTimer::GetFrameCounter() & 4 || !TimerFlashTimer) {
+ AsciiToUnicode(CUserDisplay::OnscnTimer.m_sEntries[0].m_bTimerBuffer, sTimer);
+ CFont::SetPropOn();
+ CFont::SetBackgroundOff();
+ CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
+ CFont::SetRightJustifyOn();
+ CFont::SetRightJustifyWrap(0.0f);
+ CFont::SetFontStyle(FONT_HEADING);
+ CFont::SetPropOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(27.0f - 2.0f), HUD_STRETCH_Y(110.0f + 2.0f), sTimer);
+
+ CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
+ CFont::SetColor(CRGBA(186, 101, 50, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(27.0f), HUD_STRETCH_Y(110.0f), sTimer);
+
+ if (CUserDisplay::OnscnTimer.m_sEntries[0].m_aTimerText[0]) {
+ CFont::SetPropOn();
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
+ CFont::PrintString(HUD_FROM_RIGHT(27.0f + 78.0f), HUD_STRETCH_Y(110.0f + 2.0f), TheText.Get(CUserDisplay::OnscnTimer.m_sEntries[0].m_aTimerText));
+
+ CFont::SetColor(CRGBA(186, 101, 50, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(27.0f + 80.0f), HUD_STRETCH_Y(110.0f), TheText.Get(CUserDisplay::OnscnTimer.m_sEntries[0].m_aTimerText));
+ }
+ }
+ }
+ if (CUserDisplay::OnscnTimer.m_sEntries[0].m_bCounterProcessed == 1) {
+ if (!CounterOnLastFrame)
+ CounterFlashTimer = 1;
+
+ CounterOnLastFrame = 1;
+
+ if (CounterFlashTimer) {
+ if (++CounterFlashTimer > 50)
+ CounterFlashTimer = 0;
+ }
+
+ if (CTimer::GetFrameCounter() & 4 || !CounterFlashTimer) {
+ if (CUserDisplay::OnscnTimer.m_sEntries[0].m_nType) {
+ CSprite2d::DrawRect(CRect(HUD_FROM_RIGHT(127.0f - 4.0f), HUD_STRETCH_Y(132.0 + 8.0f), HUD_FROM_RIGHT(23.0f), HUD_STRETCH_Y(11.0f + 132.0f + 8.0f)), CRGBA(0, 106, 164, 80));
+ CSprite2d::DrawRect(CRect(HUD_FROM_RIGHT(127.0f + 4.0f), HUD_STRETCH_Y(132.0 + 8.0f), HUD_FROM_RIGHT(atoi(CUserDisplay::OnscnTimer.m_sEntries[0].m_bCounterBuffer) + 27.0f + 100.0f + 4.0f), HUD_STRETCH_Y(11.0f + 132.0f + 8.0f)), CRGBA(0, 106, 164, 255));
+ }
+ else {
+ AsciiToUnicode(CUserDisplay::OnscnTimer.m_sEntries[0].m_bCounterBuffer, sTimer);
+
+ CFont::SetPropOn();
+ CFont::SetBackgroundOff();
+ CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
+ CFont::SetCentreOff();
+ CFont::SetRightJustifyOn();
+ CFont::SetRightJustifyWrap(0.0f);
+ CFont::SetFontStyle(FONT_HEADING);
+ CFont::SetColor(CRGBA(244, 20, 20, 255));
+ CFont::SetWrapx(HUD_STRETCH_X(640.0f));
+ CFont::SetPropOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(27.0f - 2.0f), HUD_STRETCH_Y(132.0f + 2.0f), sTimer);
+
+ CFont::SetColor(CRGBA(0, 106, 164, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(27.0f), HUD_STRETCH_Y(132.0f), sTimer);
+ }
+
+ if (CUserDisplay::OnscnTimer.m_sEntries[0].m_aCounterText[0]) {
+ CFont::SetPropOn();
+ CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
+
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(27.0f + 59.0f), HUD_STRETCH_Y(132.0f + 2.0f), TheText.Get(CUserDisplay::OnscnTimer.m_sEntries[0].m_aCounterText));
+
+ CFont::SetColor(CRGBA(0, 106, 164, 255));
+ CFont::PrintString(HUD_FROM_RIGHT(27.0f + 61.0f), HUD_STRETCH_Y(132.0f), TheText.Get(CUserDisplay::OnscnTimer.m_sEntries[0].m_aCounterText));
+ }
+ }
+ }
+ }
+
+ /*
+ DrawPager
+ */
+ if (!m_PagerMessage[0]) {
+ if (PagerOn == 1) {
+ PagerSoundPlayed = false;
+ PagerOn = 2;
+ }
+ }
+ if (m_PagerMessage[0] || PagerOn == 2) {
+ if (!PagerOn) {
+ PagerOn = 1;
+ PagerXOffset = 150.0f;
+ }
+ if (PagerOn == 1) {
+ if (PagerXOffset > 0.0f) {
+ float fStep = PagerXOffset * 0.05f;
+ if (fStep > 10.0f)
+ fStep = 10.0f;
+ PagerXOffset -= fStep * CTimer::GetTimeStep();
+ }
+ if (!PagerSoundPlayed) {
+ DMAudio.PlayFrontEndSound(96, 0);
+ PagerSoundPlayed = 1;
+ }
+ }
+ else if (PagerOn == 2) {
+ float fStep = PagerXOffset * 0.05f;
+ if (fStep < 2.0f)
+ fStep = 2.0f;
+ PagerXOffset += fStep * CTimer::GetTimeStep();
+ if (PagerXOffset > 150.0f) {
+ PagerXOffset = 150.0;
+ PagerOn = 0;
+ }
+ }
+
+ CHud::Sprites[HUD_PAGER].Draw(CRect(HUD_STRETCH_X(26.0f - PagerXOffset), HUD_STRETCH_Y(27.0f), HUD_STRETCH_X(160.0 + 26.0f - PagerXOffset), HUD_STRETCH_Y(80.0f + 27.0f)), CRGBA(255, 255, 255, 255));
+
+ CFont::SetBackgroundOff();
+ CFont::SetScale(HUD_STRETCH_X(0.84f), HUD_STRETCH_Y(1.0f));
+ CFont::SetColor(CRGBA(32, 162, 66, 205));
+ CFont::SetRightJustifyOff();
+ CFont::SetBackgroundOff();
+ CFont::SetCentreOff();
+ CFont::SetJustifyOff();
+ CFont::SetPropOff();
+ CFont::SetFontStyle(FONT_PAGER);
+ CFont::PrintString(HUD_STRETCH_X(52.0f - PagerXOffset), HUD_STRETCH_Y(54.0f), CHud::m_PagerMessage);
+ }
+
+ /*
+ DrawRadar
+ */
+ if (CHud::m_ItemToFlash == ITEM_RADAR && CTimer::GetFrameCounter() & 8 || CHud::m_ItemToFlash != ITEM_RADAR) {
+ CRadar::DrawMap();
+ CHud::Sprites[HUD_RADARDISC].Draw(CRect(HUD_STRETCH_X(16.0f), HUD_FROM_BOTTOM(123.0f + 4.0f), HUD_STRETCH_X(94.0f + 20.0f + 5.0f), HUD_FROM_BOTTOM(-76.0f + 123.0f - 6.0f)), CRGBA(0, 0, 0, 255));
+ CRadar::DrawBlips();
+ }
+ }
+
+ /*
+ Draw3dMarkers
+ */
+ if (CHud::m_Wants_To_Draw_3dMarkers && !TheCamera.m_WideScreenOn && !CHud::m_BigMessage[0][0] && !CHud::m_BigMessage[2][0]) {
+ CRadar::Draw3dMarkers();
+ }
+
+ /*
+ DrawScriptText
+ */
+ if (!CTimer::GetIsUserPaused()) {
+ CTextLine* IntroText = CTheScripts::IntroTextLines;
+
+ for (int i = 0; i < 2; i++) {
+ if (CTheScripts::IntroTextLines[i].m_awText[0] && CTheScripts::IntroTextLines[i].field_29) {
+ CFont::SetScale(HUD_STRETCH_X(CTheScripts::IntroTextLines[i].m_fScaleX), HUD_STRETCH_Y(CTheScripts::IntroTextLines[i].m_fScaleY * 0.5f));
+ CFont::SetColor(CTheScripts::IntroTextLines[i].m_sColor);
+
+ if (CTheScripts::IntroTextLines[i].m_bJustify)
+ CFont::SetJustifyOn();
+ else
+ CFont::SetJustifyOff();
+
+ if (CTheScripts::IntroTextLines[i].m_bRightJustify)
+ CFont::SetRightJustifyOn();
+ else
+ CFont::SetRightJustifyOff();
+
+ if (CTheScripts::IntroTextLines[i].m_bCentered)
+ CFont::SetCentreOn();
+ else
+ CFont::SetCentreOff();
+
+ CFont::SetWrapx(HUD_STRETCH_X(CTheScripts::IntroTextLines[i].m_fWrapX));
+ CFont::SetCentreSize(HUD_STRETCH_X(CTheScripts::IntroTextLines[i].m_fCenterSize));
+
+ if (CTheScripts::IntroTextLines[i].m_bBackground)
+ CFont::SetBackgroundOn();
+ else
+ CFont::SetBackgroundOff();
+
+ CFont::SetBackgroundColor(CTheScripts::IntroTextLines[i].m_sBackgroundColor);
+
+ if (CTheScripts::IntroTextLines[i].m_bBackgroundOnly)
+ CFont::SetBackGroundOnlyTextOn();
+ else
+ CFont::SetBackGroundOnlyTextOff();
+
+ if (CTheScripts::IntroTextLines[i].m_bTextProportional)
+ CFont::SetPropOn();
+ else
+ CFont::SetPropOff();
+
+ CFont::SetFontStyle(CTheScripts::IntroTextLines[i].m_nFont);
+ CFont::PrintString(HUD_STRETCH_X(640.0f - CTheScripts::IntroTextLines[i].field_36), HUD_STRETCH_Y(448.0f - CTheScripts::IntroTextLines[i].field_40), IntroText->m_awText);
+ }
+ }
+
+ CScriptRectangle* IntroRect = CTheScripts::IntroRectangles;
+
+ for (int i = 0; i < 16; i++) {
+ if (CTheScripts::IntroRectangles[i].m_bIsUsed && CTheScripts::IntroRectangles[i].m_bIsAntialiased) {
+ if (CTheScripts::IntroRectangles[i].m_wTextureId >= 0) {
+ CRect rect = {
+ CTheScripts::IntroRectangles[i].m_sRect.left,
+ CTheScripts::IntroRectangles[i].m_sRect.bottom,
+ CTheScripts::IntroRectangles[i].m_sRect.right,
+ CTheScripts::IntroRectangles[i].m_sRect.bottom };
+
+ CTheScripts::ScriptSprites[CTheScripts::IntroRectangles[i].m_wTextureId].Draw(rect, IntroRect->m_sColor);
+ }
+ else {
+ CRect rect = {
+ CTheScripts::IntroRectangles[i].m_sRect.left,
+ CTheScripts::IntroRectangles[i].m_sRect.bottom,
+ CTheScripts::IntroRectangles[i].m_sRect.right,
+ CTheScripts::IntroRectangles[i].m_sRect.bottom };
+
+ CSprite2d::DrawRect(rect, IntroRect->m_sColor);
+ }
+ }
+ }
+
+ /*
+ DrawSubtitles
+ */
+ if (CHud::m_Message[0] && !CHud::m_BigMessage[2][0] && (FrontEndMenuManager.m_PrefsShowSubtitles == 1 || !TheCamera.m_WideScreenOn)) {
+ CFont::SetJustifyOff();
+ CFont::SetBackgroundOff();
+ CFont::SetBackgroundColor(CRGBA(0, 0, 0, 128));
+ CFont::SetScale(HUD_STRETCH_X(0.48f), HUD_STRETCH_Y(1.120f));
+ CFont::SetCentreOn();
+ CFont::SetPropOn();
+ CFont::SetFontStyle(FONT_BANK);
+
+ if (TheCamera.m_WideScreenOn)
+ CFont::SetCentreSize(HUD_FROM_RIGHT(120.0f));
+ else
+ CFont::SetCentreSize(HUD_FROM_RIGHT(280.0f));
+
+ CFont::SetDropShadowPosition(1);
+ CFont::SetDropColor(CRGBA(0, 0, 0, 255));
+ CFont::SetColor(CRGBA(235, 235, 235, 255));
+ CFont::PrintString(SCREEN_WIDTH / 2, HUD_FROM_BOTTOM(64.0f), CHud::m_Message);
+ CFont::SetDropShadowPosition(0);
+ }
+
+ /*
+ DrawBigMessage
+ */
+ // MissionCompleteFailedText
+ if (CHud::m_BigMessage[0][0]) {
+ if (BigMessageInUse[0] == 0.0f) {
+ CFont::SetJustifyOff();
+ CFont::SetBackgroundOff();
+ CFont::SetBackGroundOnlyTextOff();
+ CFont::SetScale(HUD_STRETCH_X(1.8f), HUD_STRETCH_Y(1.8f));
+ CFont::SetPropOn();
+ CFont::SetCentreOn();
+ CFont::SetCentreSize(HUD_STRETCH_X(615.0f));
+ CFont::SetColor(CRGBA(255, 255, 0, 255));
+ CFont::SetFontStyle(FONT_HEADING);
+
+ if (BigMessageX[0] >= (SCREENW - 20)) {
+ BigMessageAlpha[0] += (CTimer::GetTimeStep() * 0.02f * -255.0f);
+
+ if (BigMessageAlpha[0] <= 0.0f) {
+ BigMessageAlpha[0] = 0.0f;
+ BigMessageInUse[0] = 1.0f;
+ }
+ }
+ else {
+ BigMessageX[0] += (CTimer::GetTimeStep() * 0.02f * 255.0f);
+ BigMessageAlpha[0] += (CTimer::GetTimeStep() * 0.02f * 255.0f);
+
+ if (BigMessageAlpha[0] >= 255.0f)
+ BigMessageAlpha[0] = 255.0f;
+ }
+
+ CFont::SetColor(CRGBA(0, 0, 0, BigMessageAlpha[0]));
+ CFont::PrintString(SCREEN_WIDTH / 2, (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(20.0f - 2.0f), m_BigMessage[0]);
+
+ CFont::SetColor(CRGBA(85, 119, 133, BigMessageAlpha[0]));
+ CFont::PrintString(SCREEN_WIDTH / 2, (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(20.0f), m_BigMessage[0]);
+ }
+ else {
+ BigMessageAlpha[0] = 0.0;
+ BigMessageX[0] = -60.0;
+ BigMessageInUse[0] = 1.0;
+ }
+ }
+ else {
+ BigMessageInUse[0] = 0.0;
+ }
+
+ // WastedBustedText
+ if (CHud::m_BigMessage[2][0]) {
+ if (BigMessageInUse[2] == 0.0f) {
+ BigMessageAlpha[2] += (CTimer::GetTimeStep() * 0.02f * 1000.0f) * 0.4f;
+
+ if (BigMessageAlpha[2] > 255.0f)
+ BigMessageAlpha[2] = 255.0;
+
+ CFont::SetBackgroundOff();
+
+ if (CGame::frenchGame || CGame::germanGame)
+ CFont::SetScale(HUD_STRETCH_X(1.4f), HUD_STRETCH_Y(1.4f));
+ else
+ CFont::SetScale(HUD_STRETCH_X(2.0f), HUD_STRETCH_Y(2.0f));
+
+ CFont::SetPropOn();
+ CFont::SetRightJustifyOn();
+ CFont::SetFontStyle(FONT_HEADING);
+ CFont::SetColor(CRGBA(0, 0, 0, 0.75f * BigMessageAlpha[2]));
+
+ CFont::PrintString(HUD_FROM_RIGHT(20.0f + 4.0f), HUD_FROM_BOTTOM(78.0f), CHud::m_BigMessage[2]);
+
+ CFont::SetColor(CRGBA(170, 123, 87, BigMessageAlpha[2]));
+ CFont::PrintString(HUD_FROM_RIGHT(20.0f), HUD_FROM_BOTTOM(82.0f), CHud::m_BigMessage[2]);
+ }
+ else {
+ BigMessageAlpha[2] = 0.0;
+ BigMessageInUse[2] = 1.0;
+ }
+ }
+ else {
+ BigMessageInUse[2] = 0.0;
+ }
+ }
+ }
+}
+
+void CHud::DrawAfterFade()
+{
+ if (CTimer::GetIsUserPaused() || CReplay::Mode == 1)
+ return;
+
+ if (m_HelpMessage[0]) {
+ if (!CMessages::WideStringCompare(m_HelpMessage, m_LastHelpMessage, 256)) {
+ switch (m_HelpMessageState) {
+ case 0:
+ m_HelpMessageFadeTimer = 0;
+ m_HelpMessageState = 2;
+ m_HelpMessageTimer = 0;
+ CMessages::WideStringCopy(m_HelpMessageToPrint, m_HelpMessage, 256);
+ m_HelpMessageDisplayTime = CMessages::GetWideStringLength(m_HelpMessage) * 0.05f + 3.0f;
+
+ if (TheCamera.m_ScreenReductionPercentage == 0.0f)
+ DMAudio.PlayFrontEndSound(SOUND_A0, 0);
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ m_HelpMessageTimer = 5;
+ m_HelpMessageState = 4;
+ break;
+ default:
+ break;
+ }
+ CMessages::WideStringCopy(m_LastHelpMessage, m_HelpMessage, 256);
+ }
+
+ float fAlpha = 255.0f;
+
+ if (m_HelpMessageState) {
+ switch (m_HelpMessageState) {
+ case 1:
+ fAlpha = 255.0f;
+ m_HelpMessageFadeTimer = 600;
+ if (m_HelpMessageTimer > m_fHelpMessageTime * 1000 || m_bHelpMessageQuick && m_HelpMessageTimer > 1500) {
+ m_HelpMessageFadeTimer = 600;
+ m_HelpMessageState = 3;
+ }
+ break;
+ case 2:
+ m_HelpMessageFadeTimer += 2 * (CTimer::GetTimeStep() * 0.02f * 1000.0f);
+ if (m_HelpMessageFadeTimer > 0) {
+ m_HelpMessageState = 1;
+ m_HelpMessageFadeTimer = 0;
+ }
+ fAlpha = m_HelpMessageFadeTimer * 0.001f * 255.0f;
+ break;
+ case 3:
+ m_HelpMessageFadeTimer -= 2 * (CTimer::GetTimeStep() * 0.02f * 1000.0f);
+ if (m_HelpMessageFadeTimer >= 0) {
+ m_HelpMessageState = 0;
+ m_HelpMessageFadeTimer = 0;
+ }
+ fAlpha = m_HelpMessageFadeTimer * 0.001f * 255.0f;
+ break;
+ case 4:
+ m_HelpMessageFadeTimer -= 2 * (CTimer::GetTimeStep() * 0.02f * 1000.0f);
+ if (m_HelpMessageFadeTimer >= 0) {
+ m_HelpMessageState = 2;
+ m_HelpMessageFadeTimer = 0;
+ CMessages::WideStringCopy(m_HelpMessageToPrint, m_LastHelpMessage, 400);
+ }
+ fAlpha = m_HelpMessageFadeTimer * 0.001f * 255.0f;
+ break;
+ default:
+ break;
+ }
+
+ m_HelpMessageTimer += (CTimer::GetTimeStep() * 0.02f * 1000.0f);
+
+ CFont::SetAlphaFade(fAlpha);
+ CFont::SetCentreOff();
+ CFont::SetPropOn();
+
+ if (CGame::germanGame)
+ CFont::SetScale(HUD_STRETCH_X(0.52f * 0.85f), HUD_STRETCH_Y(1.1f * 0.85f));
+ else
+ CFont::SetScale(HUD_STRETCH_X(0.52f), HUD_STRETCH_Y(1.1f));
+
+ CFont::SetColor(CRGBA(175, 175, 175, 255));
+ CFont::SetJustifyOff();
+ CFont::SetWrapx(HUD_STRETCH_X(200.0f + 26.0f - 4.0f));
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOn();
+ CFont::SetBackGroundOnlyTextOff();
+ CRGBA BackColor = { 0, 0, 0, (uint8)(0.9f * fAlpha) };
+ CFont::SetBackgroundColor(BackColor);
+ CFont::SetColor(CRGBA(175, 175, 175, 255));
+ CFont::PrintString(HUD_STRETCH_X(26.0f), HUD_STRETCH_Y(28.0f + (150.0f - PagerXOffset) * 0.6f), CHud::m_HelpMessageToPrint);
+ CFont::SetAlphaFade(255.0f);
+ CFont::DrawFonts();
+ }
+ }
+ else
+ m_HelpMessageState = 0;
+
+ /*
+ DrawBigMessage2
+ */
+ // Oddjob
+ if (m_BigMessage[4][0]) {
+ CFont::SetJustifyOff();
+ CFont::SetBackgroundOff();
+ CFont::SetScale(HUD_STRETCH_X(1.2f), HUD_STRETCH_Y(1.5f));
+ CFont::SetCentreOn();
+ CFont::SetPropOn();
+ CFont::SetCentreSize(HUD_STRETCH_X(600.0f));
+ CFont::SetFontStyle(FONT_BANK);
+
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::PrintString(HUD_STRETCH_X(2.0f) + (SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(84.0f), m_BigMessage[4]);
+
+ CFont::SetColor(CRGBA(89, 115, 150, 255));
+ CFont::PrintString((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(84.0f), m_BigMessage[4]);
+ }
+
+ // Oddjob result
+ if (OddJob2OffTimer > 0)
+ OddJob2OffTimer = OddJob2OffTimer - (CTimer::GetTimeStep() * 0.02f * 1000.0f);
+
+ static float fStep;
+ if (!m_BigMessage[1][0] && m_BigMessage[4][0] && m_BigMessage[5][0] && OddJob2OffTimer <= 0.0f) {
+ switch (OddJob2On) {
+ case 0:
+ OddJob2On = 1;
+ OddJob2XOffset = 380.0;
+ break;
+ case 1:
+ if (OddJob2XOffset <= 2.0f) {
+ OddJob2Timer = 0;
+ OddJob2On = 2;
+ }
+ else {
+ fStep = 40.0;
+ if ((OddJob2XOffset * 0.16667) <= 40.0)
+ fStep = OddJob2XOffset * 0.16667;
+ OddJob2XOffset = OddJob2XOffset - fStep;
+ }
+ break;
+ case 2:
+ OddJob2Timer += (20.0 * CTimer::GetTimeStep());
+ if (OddJob2Timer > 1500) {
+ OddJob2On = 3;
+ }
+ break;
+ case 3:
+ fStep = 30.0;
+ if ((OddJob2XOffset * 0.2) >= 30.0)
+ fStep = OddJob2XOffset * 0.2;
+
+ OddJob2XOffset = OddJob2XOffset - fStep;
+
+ if (OddJob2XOffset < -380.0) {
+ OddJob2OffTimer = 5000.0;
+ OddJob2On = 0;
+ }
+ break;
+ default:
+ break;
+ }
+
+ CFont::SetJustifyOff();
+ CFont::SetBackgroundOff();
+ CFont::SetScale(HUD_STRETCH_X(1.0f), HUD_STRETCH_Y(1.2f));
+ CFont::SetCentreOn();
+ CFont::SetPropOn();
+ CFont::SetCentreSize(HUD_FROM_RIGHT(20.0f));
+ CFont::SetColor(CRGBA(0, 0, 0, 255));
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::PrintString(HUD_STRETCH_X(2.0f) + (SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(20.0f + 2.0f), m_BigMessage[5]);
+
+ CFont::SetColor(CRGBA(156, 91, 40, 255));
+ CFont::PrintString((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(20.0f + 2.0f), m_BigMessage[5]);
+ }
+
+ /*
+ DrawMissionTitle
+ */
+ if (m_BigMessage[1][0]) {
+ if (BigMessageInUse[1] == 0.0f) {
+ CFont::SetJustifyOff();
+ CFont::SetBackgroundOff();
+
+ if (CGame::frenchGame || CMenuManager::m_PrefsLanguage == 4)
+ CFont::SetScale(HUD_STRETCH_X(0.884f), HUD_STRETCH_Y(1.36f));
+ else
+ CFont::SetScale(HUD_STRETCH_X(1.04f), HUD_STRETCH_Y(1.6f));
+
+ CFont::SetPropOn();
+ CFont::SetRightJustifyWrap(-500);
+ CFont::SetRightJustifyOn();
+ CFont::SetFontStyle(FONT_HEADING);
+ if (BigMessageX[1] >= (SCREENW - 20)) {
+ BigMessageAlpha[1] += (CTimer::GetTimeStep() * 0.02f * -255.0f);
+
+ if (BigMessageAlpha[1] <= 0.0f) {
+ BigMessageAlpha[1] = 0.0f;
+ BigMessageInUse[1] = 1.0f;
+ }
+ }
+ else {
+ BigMessageX[1] += (CTimer::GetTimeStep() * 0.02f * 255.0f);
+ BigMessageAlpha[1] += (CTimer::GetTimeStep() * 0.02f * 255.0f);
+
+ if (BigMessageAlpha[1] >= 255.0f)
+ BigMessageAlpha[1] = 255.0f;
+ }
+ CFont::SetColor(CRGBA(40, 40, 40, BigMessageAlpha[1]));
+ CFont::PrintString(HUD_FROM_RIGHT(20.0f - 2.0f), HUD_FROM_BOTTOM(120.0f), m_BigMessage[1]);
+
+ CFont::SetColor(CRGBA(220, 172, 2, BigMessageAlpha[1]));
+ CFont::PrintString(HUD_FROM_RIGHT(20.0f), HUD_FROM_BOTTOM(120.0f), m_BigMessage[1]);
+ }
+ else {
+ BigMessageAlpha[1] = 0.0f;
+ BigMessageX[1] = -60.0f;
+ BigMessageInUse[1] = 1.0f;
+ }
+ }
+ else {
+ BigMessageInUse[1] = 0.0f;
+ }
+}
-WRAPPER void CHud::Draw(void) { EAXJMP(0x5052A0); }
-WRAPPER void CHud::DrawAfterFade(void) { EAXJMP(0x509030); }
+STARTPATCHES
+ InjectHook(0x48BC9A, &CHud::Initialise, PATCH_CALL);
+ InjectHook(0x48C4F1, &CHud::ReInitialise, PATCH_CALL);
+ InjectHook(0x48BCBC, &CHud::Shutdown, PATCH_CALL);
+ENDPATCHES
diff --git a/src/render/Hud.h b/src/render/Hud.h
index 242acea8..c4c43e30 100644
--- a/src/render/Hud.h
+++ b/src/render/Hud.h
@@ -1,10 +1,95 @@
#pragma once
+#include "Sprite2d.h"
+
+enum eItems
+{
+ ITEM_ARMOUR = 3,
+ ITEM_HEALTH = 4,
+ ITEM_RADAR = 8
+};
+
+enum eSprites
+{
+ HUD_FIST,
+ HUD_BAT,
+ HUD_PISTOL,
+ HUD_UZI,
+ HUD_SHOTGUN,
+ HUD_AK47,
+ HUD_M16,
+ HUD_SNIPER,
+ HUD_ROCKET,
+ HUD_FLAME,
+ HUD_MOLOTOV,
+ HUD_GRENADE,
+ HUD_DETONATOR,
+ HUD_RADARDISC = 15,
+ HUD_PAGER = 16,
+ HUD_SITESNIPER = 20,
+ HUD_SITEM16 = 21
+};
class CHud
{
public:
- static void Draw(void);
- static void DrawAfterFade(void);
+ static CSprite2d *Sprites;
+ static wchar *m_HelpMessage;
+ static wchar *m_LastHelpMessage;
+ static int32 &m_HelpMessageState;
+ static int32 &m_HelpMessageTimer;
+ static int32 &m_HelpMessageFadeTimer;
+ static wchar *m_HelpMessageToPrint;
+ static float &m_HelpMessageDisplayTime;
+ static float &m_fTextBoxNumLines;
+ static float &m_fHelpMessageTime;
+ static bool &m_bHelpMessageQuick;
+ static int32 m_ZoneState;
+ static int32 m_ZoneFadeTimer;
+ static int32 m_ZoneNameTimer;
+ static wchar *&m_pZoneName;
+ static wchar *m_pLastZoneName;
+ static wchar *m_ZoneToPrint;
+ static wchar *&m_pVehicleName;
+ static wchar *m_pLastVehicleName;
+ static wchar *m_pVehicleNameToPrint;
+ static int32 m_VehicleState;
+ static int32 m_VehicleFadeTimer;
+ static int32 m_VehicleNameTimer;
+ static wchar *m_Message;
+ static wchar *m_PagerMessage;
static bool &m_Wants_To_Draw_Hud;
+ static bool &m_Wants_To_Draw_3dMarkers;
+ static wchar(*m_BigMessage)[128];
+ static float *BigMessageInUse;
+ static float *BigMessageAlpha;
+ static float *BigMessageX;
+ static float &OddJob2OffTimer;
+ static int8 &CounterOnLastFrame;
+ static float &OddJob2XOffset;
+ static int16 &CounterFlashTimer;
+ static int16 &OddJob2Timer;
+ static int8 &TimerOnLastFrame;
+ static int16 &OddJob2On;
+ static int16 &TimerFlashTimer;
+ static int16 &PagerSoundPlayed;
+ static int32 &SpriteBrightness;
+ static float &PagerXOffset;
+ static int32 m_ItemToFlash;
+ static int16 &PagerTimer;
+ static int16 &PagerOn;
+
+public:
+ static void Initialise();
+ static void Shutdown();
+ static void ReInitialise();
+ static void GetRidOfAllHudMessages();
+ static void SetZoneName(wchar *name);
+ static void SetHelpMessage(wchar *message, bool quick);
+ static void SetVehicleName(wchar *name);
+ static void Draw();
+ static void DrawAfterFade();
+ static void SetMessage(wchar *message);
+ static void SetBigMessage(wchar *message, int16 style);
+ static void SetPagerMessage(wchar *message);
};
diff --git a/src/render/Particle.cpp b/src/render/Particle.cpp
index b7c14f1b..1ff3bced 100644
--- a/src/render/Particle.cpp
+++ b/src/render/Particle.cpp
@@ -44,7 +44,7 @@
-const Char SmokeFiles[][6+1] =
+const char SmokeFiles[][6+1] =
{
"smoke1",
"smoke2",
@@ -54,7 +54,7 @@ const Char SmokeFiles[][6+1] =
};
-const Char Smoke2Files[][9+1] =
+const char Smoke2Files[][9+1] =
{
"smokeII_1",
"smokeII_2",
@@ -63,7 +63,7 @@ const Char Smoke2Files[][9+1] =
"smokeII_5"
};
-const Char RubberFiles[][7+1] =
+const char RubberFiles[][7+1] =
{
"rubber1",
"rubber2",
@@ -72,7 +72,7 @@ const Char RubberFiles[][7+1] =
"rubber5"
};
-const Char RainSplashFiles[][7+1] =
+const char RainSplashFiles[][7+1] =
{
"splash1",
"splash2",
@@ -81,14 +81,14 @@ const Char RainSplashFiles[][7+1] =
"splash5"
};
-const Char WatersprayFiles[][11+1] =
+const char WatersprayFiles[][11+1] =
{
"waterspray1",
"waterspray2",
"waterspray3"
};
-const Char ExplosionMediumFiles[][7+1] =
+const char ExplosionMediumFiles[][7+1] =
{
"explo01",
"explo02",
@@ -98,7 +98,7 @@ const Char ExplosionMediumFiles[][7+1] =
"explo06"
};
-const Char GunFlashFiles[][9+1] =
+const char GunFlashFiles[][9+1] =
{
"gunflash1",
"gunflash2",
@@ -106,7 +106,7 @@ const Char GunFlashFiles[][9+1] =
"gunflash4"
};
-const Char RaindropFiles[][9+1] =
+const char RaindropFiles[][9+1] =
{
"raindrop1",
"raindrop2",
@@ -114,13 +114,13 @@ const Char RaindropFiles[][9+1] =
"raindrop4"
};
-const Char RainSplashupFiles[][10+1] =
+const char RainSplashupFiles[][10+1] =
{
"splash_up1",
"splash_up2"
};
-const Char BirdfrontFiles[][8+1] =
+const char BirdfrontFiles[][8+1] =
{
"birdf_01",
"birdf_02",
@@ -128,7 +128,7 @@ const Char BirdfrontFiles[][8+1] =
"birdf_04"
};
-const Char CardebrisFiles[][12+1] =
+const char CardebrisFiles[][12+1] =
{
"cardebris_01",
"cardebris_02",
@@ -136,7 +136,7 @@ const Char CardebrisFiles[][12+1] =
"cardebris_04"
};
-const Char CarsplashFiles[][12+1] =
+const char CarsplashFiles[][12+1] =
{
"carsplash_01",
"carsplash_02",
@@ -210,7 +210,7 @@ RwTexture * (&gpRainDropTex)[MAX_RAINDROP_FILES] = *(RwTexture * (*)[MAX_RA
RwRaster *gpRainDropRaster[MAX_RAINDROP_FILES];
//Float CParticle::ms_afRandTable[CParticle::RAND_TABLE_SIZE]; //
-Float (&CParticle::ms_afRandTable)[CParticle::RAND_TABLE_SIZE] = *(Float (*)[CParticle::RAND_TABLE_SIZE])*(int *)0x6E98C8;
+float (&CParticle::ms_afRandTable)[CParticle::RAND_TABLE_SIZE] = *(float (*)[CParticle::RAND_TABLE_SIZE])*(int *)0x6E98C8;
CParticle *CParticle::m_pUnusedListHead;
@@ -218,13 +218,13 @@ CParticle *CParticle::m_pUnusedListHead;
//Float CParticle::m_SinTable[CParticle::SIN_COS_TABLE_SIZE]; //
//Float CParticle::m_CosTable[CParticle::SIN_COS_TABLE_SIZE]; /
-Float (&CParticle::m_SinTable)[CParticle::SIN_COS_TABLE_SIZE] = *(Float (*)[CParticle::SIN_COS_TABLE_SIZE])*(int *)0x877358;
-Float (&CParticle::m_CosTable)[CParticle::SIN_COS_TABLE_SIZE] = *(Float (*)[CParticle::SIN_COS_TABLE_SIZE])*(int *)0x70DA18;
+float (&CParticle::m_SinTable)[CParticle::SIN_COS_TABLE_SIZE] = *(float (*)[CParticle::SIN_COS_TABLE_SIZE])*(int *)0x877358;
+float (&CParticle::m_CosTable)[CParticle::SIN_COS_TABLE_SIZE] = *(float (*)[CParticle::SIN_COS_TABLE_SIZE])*(int *)0x70DA18;
-Int32 Randomizer;
+int32 Randomizer;
-Int32 nParticleCreationInterval = 1;
-Float fParticleScaleLimit = 0.5f;
+int32 nParticleCreationInterval = 1;
+float fParticleScaleLimit = 0.5f;
@@ -241,7 +241,7 @@ void CParticle::ReloadConfig()
m_pUnusedListHead = gParticleArray;
- for ( Int32 i = 0; i < MAX_PARTICLES_ON_SCREEN; i++ )
+ for ( int32 i = 0; i < MAX_PARTICLES_ON_SCREEN; i++ )
{
if ( i == MAX_PARTICLES_ON_SCREEN - 1 )
gParticleArray[i].m_pNext = NULL;
@@ -292,93 +292,93 @@ void CParticle::Initialise()
CParticleObject::Initialise();
- Float randVal = -1.0f;
- for ( Int32 i = 0; i < RAND_TABLE_SIZE; i++ )
+ float randVal = -1.0f;
+ for ( int32 i = 0; i < RAND_TABLE_SIZE; i++ )
{
ms_afRandTable[i] = randVal;
randVal += 0.1f;
}
- for ( Int32 i = 0; i < SIN_COS_TABLE_SIZE; i++ )
+ for ( int32 i = 0; i < SIN_COS_TABLE_SIZE; i++ )
{
- Float angle = DEGTORAD(Float(i) * Float(360.0f / SIN_COS_TABLE_SIZE));
+ float angle = DEGTORAD(float(i) * float(360.0f / SIN_COS_TABLE_SIZE));
m_SinTable[i] = sin(angle);
m_CosTable[i] = cos(angle);
}
- Int32 slot = CTxdStore::FindTxdSlot("particle");
+ int32 slot = CTxdStore::FindTxdSlot("particle");
CTxdStore::PushCurrentTxd();
CTxdStore::SetCurrentTxd(slot);
- for ( Int32 i = 0; i < MAX_SMOKE_FILES; i++ )
+ for ( int32 i = 0; i < MAX_SMOKE_FILES; i++ )
{
gpSmokeTex[i] = RwTextureRead(SmokeFiles[i], NULL);
gpSmokeRaster[i] = RwTextureGetRaster(gpSmokeTex[i]);
}
- for ( Int32 i = 0; i < MAX_SMOKE2_FILES; i++ )
+ for ( int32 i = 0; i < MAX_SMOKE2_FILES; i++ )
{
gpSmoke2Tex[i] = RwTextureRead(Smoke2Files[i], NULL);
gpSmoke2Raster[i] = RwTextureGetRaster(gpSmoke2Tex[i]);
}
- for ( Int32 i = 0; i < MAX_RUBBER_FILES; i++ )
+ for ( int32 i = 0; i < MAX_RUBBER_FILES; i++ )
{
gpRubberTex[i] = RwTextureRead(RubberFiles[i], NULL);
gpRubberRaster[i] = RwTextureGetRaster(gpRubberTex[i]);
}
- for ( Int32 i = 0; i < MAX_RAINSPLASH_FILES; i++ )
+ for ( int32 i = 0; i < MAX_RAINSPLASH_FILES; i++ )
{
gpRainSplashTex[i] = RwTextureRead(RainSplashFiles[i], NULL);
gpRainSplashRaster[i] = RwTextureGetRaster(gpRainSplashTex[i]);
}
- for ( Int32 i = 0; i < MAX_WATERSPRAY_FILES; i++ )
+ for ( int32 i = 0; i < MAX_WATERSPRAY_FILES; i++ )
{
gpWatersprayTex[i] = RwTextureRead(WatersprayFiles[i], NULL);
gpWatersprayRaster[i] = RwTextureGetRaster(gpWatersprayTex[i]);
}
- for ( Int32 i = 0; i < MAX_EXPLOSIONMEDIUM_FILES; i++ )
+ for ( int32 i = 0; i < MAX_EXPLOSIONMEDIUM_FILES; i++ )
{
gpExplosionMediumTex[i] = RwTextureRead(ExplosionMediumFiles[i], NULL);
gpExplosionMediumRaster[i] = RwTextureGetRaster(gpExplosionMediumTex[i]);
}
- for ( Int32 i = 0; i < MAX_GUNFLASH_FILES; i++ )
+ for ( int32 i = 0; i < MAX_GUNFLASH_FILES; i++ )
{
gpGunFlashTex[i] = RwTextureRead(GunFlashFiles[i], NULL);
gpGunFlashRaster[i] = RwTextureGetRaster(gpGunFlashTex[i]);
}
- for ( Int32 i = 0; i < MAX_RAINDROP_FILES; i++ )
+ for ( int32 i = 0; i < MAX_RAINDROP_FILES; i++ )
{
gpRainDropTex[i] = RwTextureRead(RaindropFiles[i], NULL);
gpRainDropRaster[i] = RwTextureGetRaster(gpRainDropTex[i]);
}
- for ( Int32 i = 0; i < MAX_RAINSPLASHUP_FILES; i++ )
+ for ( int32 i = 0; i < MAX_RAINSPLASHUP_FILES; i++ )
{
gpRainSplashupTex[i] = RwTextureRead(RainSplashupFiles[i], NULL);
gpRainSplashupRaster[i] = RwTextureGetRaster(gpRainSplashupTex[i]);
}
- for ( Int32 i = 0; i < MAX_BIRDFRONT_FILES; i++ )
+ for ( int32 i = 0; i < MAX_BIRDFRONT_FILES; i++ )
{
gpBirdfrontTex[i] = RwTextureRead(BirdfrontFiles[i], NULL);
gpBirdfrontRaster[i] = RwTextureGetRaster(gpBirdfrontTex[i]);
}
- for ( Int32 i = 0; i < MAX_CARDEBRIS_FILES; i++ )
+ for ( int32 i = 0; i < MAX_CARDEBRIS_FILES; i++ )
{
gpCarDebrisTex[i] = RwTextureRead(CardebrisFiles[i], NULL);
gpCarDebrisRaster[i] = RwTextureGetRaster(gpCarDebrisTex[i]);
}
- for ( Int32 i = 0; i < MAX_CARSPLASH_FILES; i++ )
+ for ( int32 i = 0; i < MAX_CARSPLASH_FILES; i++ )
{
gpCarSplashTex[i] = RwTextureRead(CarsplashFiles[i], NULL);
gpCarSplashRaster[i] = RwTextureGetRaster(gpCarSplashTex[i]);
@@ -429,7 +429,7 @@ void CParticle::Initialise()
CTxdStore::PopCurrentTxd();
- for ( Int32 i = 0; i < MAX_PARTICLES; i++ )
+ for ( int32 i = 0; i < MAX_PARTICLES; i++ )
{
tParticleSystemData *entry = &mod_ParticleSystemManager.m_aParticles[i];
@@ -584,7 +584,7 @@ void CParticle::Shutdown()
{
debug("Shutting down CParticle...");
- for ( Int32 i = 0; i < MAX_SMOKE_FILES; i++ )
+ for ( int32 i = 0; i < MAX_SMOKE_FILES; i++ )
{
RwTextureDestroy(gpSmokeTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -592,7 +592,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_SMOKE2_FILES; i++ )
+ for ( int32 i = 0; i < MAX_SMOKE2_FILES; i++ )
{
RwTextureDestroy(gpSmoke2Tex[i]);
#ifdef GTA3_1_1_PATCH
@@ -600,7 +600,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_RUBBER_FILES; i++ )
+ for ( int32 i = 0; i < MAX_RUBBER_FILES; i++ )
{
RwTextureDestroy(gpRubberTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -608,7 +608,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_RAINSPLASH_FILES; i++ )
+ for ( int32 i = 0; i < MAX_RAINSPLASH_FILES; i++ )
{
RwTextureDestroy(gpRainSplashTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -616,7 +616,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_WATERSPRAY_FILES; i++ )
+ for ( int32 i = 0; i < MAX_WATERSPRAY_FILES; i++ )
{
RwTextureDestroy(gpWatersprayTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -624,7 +624,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_EXPLOSIONMEDIUM_FILES; i++ )
+ for ( int32 i = 0; i < MAX_EXPLOSIONMEDIUM_FILES; i++ )
{
RwTextureDestroy(gpExplosionMediumTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -632,7 +632,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_GUNFLASH_FILES; i++ )
+ for ( int32 i = 0; i < MAX_GUNFLASH_FILES; i++ )
{
RwTextureDestroy(gpGunFlashTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -640,7 +640,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_RAINDROP_FILES; i++ )
+ for ( int32 i = 0; i < MAX_RAINDROP_FILES; i++ )
{
RwTextureDestroy(gpRainDropTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -648,7 +648,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_RAINSPLASHUP_FILES; i++ )
+ for ( int32 i = 0; i < MAX_RAINSPLASHUP_FILES; i++ )
{
RwTextureDestroy(gpRainSplashupTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -656,7 +656,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_BIRDFRONT_FILES; i++ )
+ for ( int32 i = 0; i < MAX_BIRDFRONT_FILES; i++ )
{
RwTextureDestroy(gpBirdfrontTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -664,7 +664,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_CARDEBRIS_FILES; i++ )
+ for ( int32 i = 0; i < MAX_CARDEBRIS_FILES; i++ )
{
RwTextureDestroy(gpCarDebrisTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -672,7 +672,7 @@ void CParticle::Shutdown()
#endif
}
- for ( Int32 i = 0; i < MAX_CARSPLASH_FILES; i++ )
+ for ( int32 i = 0; i < MAX_CARSPLASH_FILES; i++ )
{
RwTextureDestroy(gpCarSplashTex[i]);
#ifdef GTA3_1_1_PATCH
@@ -750,7 +750,7 @@ void CParticle::Shutdown()
gpPointlightTex = NULL;
#endif
- Int32 slot;
+ int32 slot;
slot = CTxdStore::FindTxdSlot("particle");
CTxdStore::RemoveTxdSlot(slot);
@@ -758,13 +758,13 @@ void CParticle::Shutdown()
debug("CParticle shut down");
}
-CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVector const &vecDir, CEntity *pEntity, Float fSize, Int32 nRotationSpeed, Int32 nRotation, Int32 nCurFrame, Int32 nLifeSpan)
+CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVector const &vecDir, CEntity *pEntity, float fSize, int32 nRotationSpeed, int32 nRotation, int32 nCurFrame, int32 nLifeSpan)
{
CRGBA color(0, 0, 0, 0);
return AddParticle(type, vecPos, vecDir, pEntity, fSize, color, nRotationSpeed, nRotation, nCurFrame, nLifeSpan);
}
-CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVector const &vecDir, CEntity *pEntity, Float fSize, RwRGBA const &color, Int32 nRotationSpeed, Int32 nRotation, Int32 nCurFrame, Int32 nLifeSpan)
+CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVector const &vecDir, CEntity *pEntity, float fSize, RwRGBA const &color, int32 nRotationSpeed, int32 nRotation, int32 nCurFrame, int32 nLifeSpan)
{
if ( CTimer::GetIsPaused() )
return NULL;
@@ -833,8 +833,8 @@ CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVe
if ( psystem->m_InitialColorVariation != 0 )
{
- Int32 ColorVariation = CGeneral::GetRandomNumberInRange(-psystem->m_InitialColorVariation, psystem->m_InitialColorVariation);
- //Float ColorVariation = CGeneral::GetRandomNumberInRange((Float)-psystem->m_InitialColorVariation, (Float)psystem->m_InitialColorVariation);
+ int32 ColorVariation = CGeneral::GetRandomNumberInRange(-psystem->m_InitialColorVariation, psystem->m_InitialColorVariation);
+ //Float ColorVariation = CGeneral::GetRandomNumberInRange((float)-psystem->m_InitialColorVariation, (float)psystem->m_InitialColorVariation);
pParticle->m_Color.red = clamp(pParticle->m_Color.red +
PERCENT(pParticle->m_Color.red, ColorVariation),
@@ -893,18 +893,18 @@ CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVe
if ( psystem->m_nLifeSpanErrorShape != 0 )
{
- Float randVal = ms_afRandTable[CGeneral::GetRandomNumber() % RAND_TABLE_SIZE];
+ float randVal = ms_afRandTable[CGeneral::GetRandomNumber() % RAND_TABLE_SIZE];
if ( randVal > 0.0f )
- pParticle->m_nTimeWhenWillBeDestroyed += Int32(Float(psystem->m_nLifeSpan) * randVal * Float(psystem->m_nLifeSpanErrorShape));
+ pParticle->m_nTimeWhenWillBeDestroyed += int32(float(psystem->m_nLifeSpan) * randVal * float(psystem->m_nLifeSpanErrorShape));
else
- pParticle->m_nTimeWhenWillBeDestroyed += Int32(Float(psystem->m_nLifeSpan) * randVal / Float(psystem->m_nLifeSpanErrorShape));
+ pParticle->m_nTimeWhenWillBeDestroyed += int32(float(psystem->m_nLifeSpan) * randVal / float(psystem->m_nLifeSpanErrorShape));
}
if ( psystem->Flags & ZCHECK_FIRST )
{
- static Bool bValidGroundFound = false;
+ static bool bValidGroundFound = false;
static CVector LastTestCoors;
- static Float LastTestGroundZ;
+ static float LastTestGroundZ;
if ( bValidGroundFound
&& vecPos.x == LastTestCoors.x
@@ -939,11 +939,11 @@ CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVe
if ( psystem->Flags & ZCHECK_BUMP )
{
- static Float Z_Ground = 0.0f;
+ static float Z_Ground = 0.0f;
if ( psystem->Flags & ZCHECK_BUMP_FIRST )
{
- Bool bZFound = false;
+ bool bZFound = false;
Z_Ground = CWorld::FindGroundZFor3DCoord(vecPos.x, vecPos.y, vecPos.z, (bool *)&bZFound);
@@ -1000,21 +1000,21 @@ void CParticle::Update()
CRGBA color(0, 0, 0, 0);
- Float fFricDeccel50 = pow(0.50f, CTimer::GetTimeStep());
- Float fFricDeccel80 = pow(0.80f, CTimer::GetTimeStep());
- Float fFricDeccel90 = pow(0.90f, CTimer::GetTimeStep());
- Float fFricDeccel95 = pow(0.95f, CTimer::GetTimeStep());
- Float fFricDeccel96 = pow(0.96f, CTimer::GetTimeStep());
- Float fFricDeccel99 = pow(0.99f, CTimer::GetTimeStep());
+ float fFricDeccel50 = pow(0.50f, CTimer::GetTimeStep());
+ float fFricDeccel80 = pow(0.80f, CTimer::GetTimeStep());
+ float fFricDeccel90 = pow(0.90f, CTimer::GetTimeStep());
+ float fFricDeccel95 = pow(0.95f, CTimer::GetTimeStep());
+ float fFricDeccel96 = pow(0.96f, CTimer::GetTimeStep());
+ float fFricDeccel99 = pow(0.99f, CTimer::GetTimeStep());
CParticleObject::UpdateAll();
- for ( Int32 i = 0; i < MAX_PARTICLES; i++ )
+ for ( int32 i = 0; i < MAX_PARTICLES; i++ )
{
tParticleSystemData *psystem = &mod_ParticleSystemManager.m_aParticles[i];
CParticle *particle = psystem->m_pParticles;
CParticle *prevParticle = NULL;
- Bool bRemoveParticle;
+ bool bRemoveParticle;
if ( particle == NULL )
continue;
@@ -1035,18 +1035,18 @@ void CParticle::Update()
{
if ( particle->m_nTimeWhenColorWillBeChanged > CTimer::GetTimeInMilliseconds() )
{
- Float colorMul = 1.0f - Float(particle->m_nTimeWhenColorWillBeChanged - CTimer::GetTimeInMilliseconds()) / Float(psystem->m_ColorFadeTime);
+ float colorMul = 1.0f - float(particle->m_nTimeWhenColorWillBeChanged - CTimer::GetTimeInMilliseconds()) / float(psystem->m_ColorFadeTime);
particle->m_Color.red = clamp(
- psystem->m_RenderColouring.red + Int32(Float(psystem->m_FadeDestinationColor.red - psystem->m_RenderColouring.red) * colorMul),
+ psystem->m_RenderColouring.red + int32(float(psystem->m_FadeDestinationColor.red - psystem->m_RenderColouring.red) * colorMul),
0, 255);
particle->m_Color.green = clamp(
- psystem->m_RenderColouring.green + Int32(Float(psystem->m_FadeDestinationColor.green - psystem->m_RenderColouring.green) * colorMul),
+ psystem->m_RenderColouring.green + int32(float(psystem->m_FadeDestinationColor.green - psystem->m_RenderColouring.green) * colorMul),
0, 255);
particle->m_Color.blue = clamp(
- psystem->m_RenderColouring.blue + Int32(Float(psystem->m_FadeDestinationColor.blue - psystem->m_RenderColouring.blue) * colorMul),
+ psystem->m_RenderColouring.blue + int32(float(psystem->m_FadeDestinationColor.blue - psystem->m_RenderColouring.blue) * colorMul),
0, 255);
}
else
@@ -1063,7 +1063,7 @@ void CParticle::Update()
}
}
- Float size = particle->m_fSize + particle->m_fExpansionRate;
+ float size = particle->m_fSize + particle->m_fExpansionRate;
if ( size < 0.0f )
{
@@ -1147,7 +1147,7 @@ void CParticle::Update()
{
bRemoveParticle = true;
- Int32 randVal = Int32(CGeneral::GetRandomNumber());
+ int32 randVal = int32(CGeneral::GetRandomNumber());
if ( randVal & 1 )
{
@@ -1188,11 +1188,11 @@ void CParticle::Update()
vecPosn.z += 1.0f;
Randomizer++;
- Int32 randVal = Int32(Randomizer & 7);
+ int32 randVal = int32(Randomizer & 7);
if ( randVal == 5 )
{
- Int32 randTime = Int32(CGeneral::GetRandomNumber());
+ int32 randTime = int32(CGeneral::GetRandomNumber());
CShadows::AddPermanentShadow(1, gpBloodPoolTex, &vecPosn,
0.1f, 0.0f, 0.0f, -0.1f,
@@ -1202,7 +1202,7 @@ void CParticle::Update()
}
else if ( randVal == 2 )
{
- Int32 randTime = Int32(CGeneral::GetRandomNumber());
+ int32 randTime = int32(CGeneral::GetRandomNumber());
CShadows::AddPermanentShadow(1, gpBloodPoolTex, &vecPosn,
0.2f, 0.0f, 0.0f, -0.2f,
@@ -1414,12 +1414,12 @@ void CParticle::Update()
if ( particle->m_fCurrentZRadius != 0.0f )
{
- Int32 nSinCosIndex = particle->m_nCurrentZRotation % (SIN_COS_TABLE_SIZE - 1);
+ int32 nSinCosIndex = particle->m_nCurrentZRotation % (SIN_COS_TABLE_SIZE - 1);
- Float fX = (m_CosTable[nSinCosIndex] - m_SinTable[nSinCosIndex])
+ float fX = (m_CosTable[nSinCosIndex] - m_SinTable[nSinCosIndex])
* particle->m_fCurrentZRadius;
- Float fY = (m_SinTable[nSinCosIndex] + m_CosTable[nSinCosIndex])
+ float fY = (m_SinTable[nSinCosIndex] + m_CosTable[nSinCosIndex])
* particle->m_fCurrentZRadius;
moveStep -= particle->m_vecParticleMovementOffset;
@@ -1446,15 +1446,15 @@ void CParticle::Render()
CSprite::InitSpriteBuffer2D();
- UInt32 flags = DRAW_OPAQUE;
+ uint32 flags = DRAW_OPAQUE;
RwRaster *prevFrame = NULL;
- for ( Int32 i = 0; i < MAX_PARTICLES; i++ )
+ for ( int32 i = 0; i < MAX_PARTICLES; i++ )
{
tParticleSystemData *psystem = &mod_ParticleSystemManager.m_aParticles[i];
- Bool particleBanned = false;
+ bool particleBanned = false;
CParticle *particle = psystem->m_pParticles;
@@ -1513,7 +1513,7 @@ void CParticle::Render()
while ( particle != NULL )
{
- Bool canDraw = true;
+ bool canDraw = true;
if ( particle->m_nAlpha == 0 )
canDraw = false;
@@ -1540,7 +1540,7 @@ void CParticle::Render()
particle->m_fSize * 63.0f,
particle->m_Color,
particle->m_nColorIntensity,
- (Float)particle->m_nRotation,
+ (float)particle->m_nRotation,
particle->m_nAlpha);
}
else
@@ -1561,8 +1561,8 @@ void CParticle::Render()
if ( canDraw )
{
CVector coors;
- Float w;
- Float h;
+ float w;
+ float h;
if ( CSprite::CalcScreenCoors(particle->m_vecPosition, coors, &w, &h, true) )
{
@@ -1578,13 +1578,13 @@ void CParticle::Render()
particle->m_Color.blue,
particle->m_nColorIntensity,
1.0f / coors.z,
- Float(particle->m_nRotation),
+ float(particle->m_nRotation),
particle->m_nAlpha);
}
else if ( psystem->Flags & SCREEN_TRAIL )
{
- Float fRotation;
- Float fTrailLength;
+ float fRotation;
+ float fTrailLength;
if ( particle->m_vecScreenPosition.x == 0.0f )
{
@@ -1599,12 +1599,12 @@ void CParticle::Render()
coors.y - particle->m_vecScreenPosition.y
);
- Float fDist = vecDist.Magnitude();
+ float fDist = vecDist.Magnitude();
fTrailLength = fDist;
//Float fRot = atan2( vecDist.x / fDist, sqrtf(1.0f - vecDist.x / fDist * (vecDist.x / fDist)) );
- Float fRot = asinf(vecDist.x / fDist);
+ float fRot = asinf(vecDist.x / fDist);
fRotation = fRot;
@@ -1616,9 +1616,9 @@ void CParticle::Render()
if ( fRotation < 0.0f )
fRotation += 360.0f;
- Float fSpeed = particle->m_vecVelocity.Magnitude();
+ float fSpeed = particle->m_vecVelocity.Magnitude();
- Float fNewTrailLength = fSpeed * CTimer::GetTimeStep() * w * 2.0f;
+ float fNewTrailLength = fSpeed * CTimer::GetTimeStep() * w * 2.0f;
if ( fDist > fNewTrailLength )
fTrailLength = fNewTrailLength;
@@ -1640,8 +1640,8 @@ void CParticle::Render()
else if ( psystem->Flags & SPEED_TRAIL )
{
CVector vecPrevPos = particle->m_vecPosition - particle->m_vecVelocity;
- Float fRotation;
- Float fTrailLength;
+ float fRotation;
+ float fTrailLength;
if ( CSprite::CalcScreenCoors(vecPrevPos, particle->m_vecScreenPosition, &fTrailLength, &fRotation, true) )
{
@@ -1651,12 +1651,12 @@ void CParticle::Render()
coors.y - particle->m_vecScreenPosition.y
);
- Float fDist = vecDist.Magnitude();
+ float fDist = vecDist.Magnitude();
fTrailLength = fDist;
//Float fRot = atan2(vecDist.x / fDist, sqrt(1.0f - vecDist.x / fDist * (vecDist.x / fDist)));
- Float fRot = asinf(vecDist.x / fDist);
+ float fRot = asinf(vecDist.x / fDist);
fRotation = fRot;
@@ -1687,7 +1687,7 @@ void CParticle::Render()
}
else if ( psystem->Flags & VERT_TRAIL )
{
- Float fTrailLength = fabsf(particle->m_vecVelocity.z * 10.0f);
+ float fTrailLength = fabsf(particle->m_vecVelocity.z * 10.0f);
CSprite::RenderBufferedOneXLUSprite(coors.x, coors.y, coors.z,
particle->m_fSize * w,
@@ -1772,7 +1772,7 @@ void CParticle::RemoveParticle(CParticle *pParticle, CParticle *pPrevParticle, t
m_pUnusedListHead = pParticle;
}
-void CParticle::AddJetExplosion(CVector const &vecPos, Float fPower, Float fSize)
+void CParticle::AddJetExplosion(CVector const &vecPos, float fPower, float fSize)
{
CRGBA color(240, 240, 240, 255);
@@ -1790,7 +1790,7 @@ void CParticle::AddJetExplosion(CVector const &vecPos, Float fPower, Float fSize
CVector vecStepPos = vecPos;
- for ( Int32 i = 0; i < Int32(fPower * 4.0f); i++ )
+ for ( int32 i = 0; i < int32(fPower * 4.0f); i++ )
{
AddParticle(PARTICLE_EXPLOSION_MFAST,
vecStepPos,
@@ -1837,7 +1837,7 @@ void CParticle::AddYardieDoorSmoke(CVector const &vecPos, CMatrix const &matMatr
CVector vecBasePos = matMatrix * (invMat * vecPos + CVector(0.0f, -1.0f, 0.5f));
- for ( Int32 i = 0; i < 5; i++ )
+ for ( int32 i = 0; i < 5; i++ )
{
CVector pos = vecBasePos;
diff --git a/src/render/Particle.h b/src/render/Particle.h
index 68e01879..5db91727 100644
--- a/src/render/Particle.h
+++ b/src/render/Particle.h
@@ -16,25 +16,25 @@ public:
CVector m_vecPosition;
CVector m_vecVelocity;
CVector m_vecScreenPosition;
- UInt32 m_nTimeWhenWillBeDestroyed;
- UInt32 m_nTimeWhenColorWillBeChanged;
- Float m_fZGround;
+ uint32 m_nTimeWhenWillBeDestroyed;
+ uint32 m_nTimeWhenColorWillBeChanged;
+ float m_fZGround;
CVector m_vecParticleMovementOffset;
- Int16 m_nCurrentZRotation;
- UInt16 m_nZRotationTimer;
- Float m_fCurrentZRadius;
- UInt16 m_nZRadiusTimer;
+ int16 m_nCurrentZRotation;
+ uint16 m_nZRotationTimer;
+ float m_fCurrentZRadius;
+ uint16 m_nZRadiusTimer;
char _pad0[2];
- Float m_fSize;
- Float m_fExpansionRate;
- UInt16 m_nFadeToBlackTimer;
- UInt16 m_nFadeAlphaTimer;
- UInt8 m_nColorIntensity;
- UInt8 m_nAlpha;
- UInt16 m_nCurrentFrame;
- Int16 m_nAnimationSpeedTimer;
- Int16 m_nRotationStep;
- Int16 m_nRotation;
+ float m_fSize;
+ float m_fExpansionRate;
+ uint16 m_nFadeToBlackTimer;
+ uint16 m_nFadeAlphaTimer;
+ uint8 m_nColorIntensity;
+ uint8 m_nAlpha;
+ uint16 m_nCurrentFrame;
+ int16 m_nAnimationSpeedTimer;
+ int16 m_nRotationStep;
+ int16 m_nRotation;
RwRGBA m_Color;
char _pad1[2];
CParticle *m_pNext;
@@ -49,24 +49,24 @@ public:
;
}
- //static Float ms_afRandTable[RAND_TABLE_SIZE];
- static Float (&ms_afRandTable)[RAND_TABLE_SIZE];
+ //static float ms_afRandTable[RAND_TABLE_SIZE];
+ static float (&ms_afRandTable)[RAND_TABLE_SIZE];
static CParticle *m_pUnusedListHead;
/*
- static Float m_SinTable[SIN_COS_TABLE_SIZE];
- static Float m_CosTable[SIN_COS_TABLE_SIZE];
+ static float m_SinTable[SIN_COS_TABLE_SIZE];
+ static float m_CosTable[SIN_COS_TABLE_SIZE];
*/
- static Float (&m_SinTable)[SIN_COS_TABLE_SIZE];
- static Float (&m_CosTable)[SIN_COS_TABLE_SIZE];
+ static float (&m_SinTable)[SIN_COS_TABLE_SIZE];
+ static float (&m_CosTable)[SIN_COS_TABLE_SIZE];
static void ReloadConfig();
static void Initialise();
static void Shutdown();
- static CParticle *AddParticle(tParticleType type, CVector const &vecPos, CVector const &vecDir, CEntity *pEntity = NULL, Float fSize = 0.0f, Int32 nRotationSpeed = 0, Int32 nRotation = 0, Int32 nCurFrame = 0, Int32 nLifeSpan = 0);
- static CParticle *AddParticle(tParticleType type, CVector const &vecPos, CVector const &vecDir, CEntity *pEntity, Float fSize, RwRGBA const &color, Int32 nRotationSpeed = 0, Int32 nRotation = 0, Int32 nCurFrame = 0, Int32 nLifeSpan = 0);
+ static CParticle *AddParticle(tParticleType type, CVector const &vecPos, CVector const &vecDir, CEntity *pEntity = NULL, float fSize = 0.0f, int32 nRotationSpeed = 0, int32 nRotation = 0, int32 nCurFrame = 0, int32 nLifeSpan = 0);
+ static CParticle *AddParticle(tParticleType type, CVector const &vecPos, CVector const &vecDir, CEntity *pEntity, float fSize, RwRGBA const &color, int32 nRotationSpeed = 0, int32 nRotation = 0, int32 nCurFrame = 0, int32 nLifeSpan = 0);
static void Update();
static void Render();
@@ -74,7 +74,7 @@ public:
static void RemovePSystem(tParticleType type);
static void RemoveParticle(CParticle *pParticle, CParticle *pPrevParticle, tParticleSystemData *pPSystemData);
- static inline void _Next(CParticle *&pParticle, CParticle *&pPrevParticle, tParticleSystemData *pPSystemData, Bool bRemoveParticle)
+ static inline void _Next(CParticle *&pParticle, CParticle *&pPrevParticle, tParticleSystemData *pPSystemData, bool bRemoveParticle)
{
if ( bRemoveParticle )
{
@@ -92,7 +92,7 @@ public:
}
}
- static void AddJetExplosion(CVector const &vecPos, Float fPower, Float fSize);
+ static void AddJetExplosion(CVector const &vecPos, float fPower, float fSize);
static void AddYardieDoorSmoke(CVector const &vecPos, CMatrix const &matMatrix);
};
diff --git a/src/render/ParticleMgr.cpp b/src/render/ParticleMgr.cpp
index 9757a6ca..15370b47 100644
--- a/src/render/ParticleMgr.cpp
+++ b/src/render/ParticleMgr.cpp
@@ -5,7 +5,7 @@
cParticleSystemMgr mod_ParticleSystemManager;
-const Char *ParticleFilename = "PARTICLE.CFG";
+const char *ParticleFilename = "PARTICLE.CFG";
//cParticleSystemMgr::cParticleSystemMgr()
void cParticleSystemMgr::ctor()
@@ -17,7 +17,7 @@ void cParticleSystemMgr::Initialise()
{
LoadParticleData();
- for ( Int32 i = 0; i < MAX_PARTICLES; i++ )
+ for ( int32 i = 0; i < MAX_PARTICLES; i++ )
m_aParticles[i].m_pParticles = NULL;
}
@@ -28,13 +28,13 @@ void cParticleSystemMgr::LoadParticleData()
CFileMgr::SetDir("");
tParticleSystemData *entry = NULL;
- Int32 type = PARTICLE_FIRST;
+ int32 type = PARTICLE_FIRST;
- Char *lineStart = (Char *)work_buff;
- Char *lineEnd = lineStart + 1;
+ char *lineStart = (char *)work_buff;
+ char *lineEnd = lineStart + 1;
- Char line[500];
- Char delims[4];
+ char line[500];
+ char delims[4];
while ( true )
{
@@ -44,7 +44,7 @@ void cParticleSystemMgr::LoadParticleData()
while ( *lineEnd != '\n' )
++lineEnd;
- Int32 lineLength = lineEnd - lineStart;
+ int32 lineLength = lineEnd - lineStart;
ASSERT(lineLength < 500);
@@ -57,11 +57,11 @@ void cParticleSystemMgr::LoadParticleData()
if ( *line != ';' )
{
- Int32 param = CFG_PARAM_FIRST;
+ int32 param = CFG_PARAM_FIRST;
strcpy(delims, " \t");
- Char *value = strtok(line, delims);
+ char *value = strtok(line, delims);
ASSERT(value != NULL);
diff --git a/src/render/ParticleMgr.h b/src/render/ParticleMgr.h
index a2dcbdb5..5e8da1e4 100644
--- a/src/render/ParticleMgr.h
+++ b/src/render/ParticleMgr.h
@@ -100,42 +100,42 @@ enum
struct tParticleSystemData
{
tParticleType m_Type;
- Char m_aName[20];
- Float m_fCreateRange;
- Float m_fDefaultInitialRadius;
- Float m_fExpansionRate;
- UInt16 m_nZRotationInitialAngle;
- Int16 m_nZRotationAngleChangeAmount;
- UInt16 m_nZRotationChangeTime;
- UInt16 m_nZRadiusChangeTime;
- Float m_fInitialZRadius;
- Float m_fZRadiusChangeAmount;
- UInt16 m_nFadeToBlackTime;
- Int16 m_nFadeToBlackAmount;
- UInt8 m_nFadeToBlackInitialIntensity;
- UInt8 m_nFadeAlphaInitialIntensity;
- UInt16 m_nFadeAlphaTime;
- Int16 m_nFadeAlphaAmount;
- UInt16 m_nStartAnimationFrame;
- UInt16 m_nFinalAnimationFrame;
- UInt16 m_nAnimationSpeed;
- UInt16 m_nRotationSpeed;
+ char m_aName[20];
+ float m_fCreateRange;
+ float m_fDefaultInitialRadius;
+ float m_fExpansionRate;
+ uint16 m_nZRotationInitialAngle;
+ int16 m_nZRotationAngleChangeAmount;
+ uint16 m_nZRotationChangeTime;
+ uint16 m_nZRadiusChangeTime;
+ float m_fInitialZRadius;
+ float m_fZRadiusChangeAmount;
+ uint16 m_nFadeToBlackTime;
+ int16 m_nFadeToBlackAmount;
+ uint8 m_nFadeToBlackInitialIntensity;
+ uint8 m_nFadeAlphaInitialIntensity;
+ uint16 m_nFadeAlphaTime;
+ int16 m_nFadeAlphaAmount;
+ uint16 m_nStartAnimationFrame;
+ uint16 m_nFinalAnimationFrame;
+ uint16 m_nAnimationSpeed;
+ uint16 m_nRotationSpeed;
char _pad1[2];
- Float m_fGravitationalAcceleration;
- Int32 m_nFrictionDecceleration;
- Int32 m_nLifeSpan;
- Float m_fPositionRandomError;
- Float m_fVelocityRandomError;
- Float m_fExpansionRateError;
- Int32 m_nRotationRateError;
- UInt32 m_nLifeSpanErrorShape;
- Float m_fTrailLengthMultiplier;
- UInt32 Flags;
+ float m_fGravitationalAcceleration;
+ int32 m_nFrictionDecceleration;
+ int32 m_nLifeSpan;
+ float m_fPositionRandomError;
+ float m_fVelocityRandomError;
+ float m_fExpansionRateError;
+ int32 m_nRotationRateError;
+ uint32 m_nLifeSpanErrorShape;
+ float m_fTrailLengthMultiplier;
+ uint32 Flags;
RwRGBA m_RenderColouring;
- UInt8 m_InitialColorVariation;
+ uint8 m_InitialColorVariation;
RwRGBA m_FadeDestinationColor;
char _pad2[3];
- UInt32 m_ColorFadeTime;
+ uint32 m_ColorFadeTime;
RwRaster **m_ppRaster;
CParticle *m_pParticles;
diff --git a/src/render/VisibilityPlugins.cpp b/src/render/VisibilityPlugins.cpp
index 5608c933..316a397c 100644
--- a/src/render/VisibilityPlugins.cpp
+++ b/src/render/VisibilityPlugins.cpp
@@ -49,6 +49,13 @@ CVisibilityPlugins::Initialise(void)
}
void
+CVisibilityPlugins::Shutdown(void)
+{
+ m_alphaList.Shutdown();
+ m_alphaEntityList.Shutdown();
+}
+
+void
CVisibilityPlugins::InitAlphaEntityList(void)
{
m_alphaEntityList.Clear();
@@ -822,6 +829,7 @@ CVisibilityPlugins::GetClumpAlpha(RpClump *clump)
STARTPATCHES
InjectHook(0x527E50, CVisibilityPlugins::Initialise, PATCH_JUMP);
+ InjectHook(0x527EA0, CVisibilityPlugins::Shutdown, PATCH_JUMP);
InjectHook(0x528F90, CVisibilityPlugins::InitAlphaEntityList, PATCH_JUMP);
InjectHook(0x528FF0, CVisibilityPlugins::InsertEntityIntoSortedList, PATCH_JUMP);
InjectHook(0x528F80, CVisibilityPlugins::InitAlphaAtomicList, PATCH_JUMP);
diff --git a/src/render/VisibilityPlugins.h b/src/render/VisibilityPlugins.h
index 89222dce..65d2675a 100644
--- a/src/render/VisibilityPlugins.h
+++ b/src/render/VisibilityPlugins.h
@@ -35,6 +35,7 @@ public:
static float &ms_pedFadeDist;
static void Initialise(void);
+ static void Shutdown(void);
static void InitAlphaEntityList(void);
static bool InsertEntityIntoSortedList(CEntity *e, float dist);
static void InitAlphaAtomicList(void);
diff --git a/src/skel/events.cpp b/src/skel/events.cpp
index 46488a04..877b969e 100644
--- a/src/skel/events.cpp
+++ b/src/skel/events.cpp
@@ -726,8 +726,8 @@ KeyboardHandler(RsEvent event, void *param)
static RsEventStatus
HandlePadButtonDown(RsPadButtonStatus *padButtonStatus)
{
- Bool bPadTwo = false;
- Int32 padNumber = padButtonStatus->padID;
+ bool bPadTwo = false;
+ int32 padNumber = padButtonStatus->padID;
CPad *pad = CPad::GetPad(padNumber);
@@ -739,7 +739,7 @@ HandlePadButtonDown(RsPadButtonStatus *padButtonStatus)
ControlsManager.UpdateJoyButtonState(padNumber);
- for ( Int32 i = 0; i < _TODOCONST(16); i++ )
+ for ( int32 i = 0; i < _TODOCONST(16); i++ )
{
RsPadButtons btn = rsPADNULL;
if ( ControlsManager.m_aButtonStates[i] == TRUE )
@@ -761,8 +761,8 @@ HandlePadButtonDown(RsPadButtonStatus *padButtonStatus)
static RsEventStatus
HandlePadButtonUp(RsPadButtonStatus *padButtonStatus)
{
- Bool bPadTwo = false;
- Int32 padNumber = padButtonStatus->padID;
+ bool bPadTwo = false;
+ int32 padNumber = padButtonStatus->padID;
CPad *pad = CPad::GetPad(padNumber);
@@ -772,14 +772,14 @@ HandlePadButtonUp(RsPadButtonStatus *padButtonStatus)
if ( padNumber == 1 )
bPadTwo = true;
- Bool bCam = false;
- Int16 mode = TheCamera.Cams[TheCamera.ActiveCam].Mode;
+ bool bCam = false;
+ int16 mode = TheCamera.Cams[TheCamera.ActiveCam].Mode;
if ( mode == CCam::MODE_FLYBY || mode == CCam::MODE_FIXED )
- Bool bCam = true;
+ bool bCam = true;
ControlsManager.UpdateJoyButtonState(padNumber);
- for ( Int32 i = 1; i < _TODOCONST(16); i++ )
+ for ( int32 i = 1; i < _TODOCONST(16); i++ )
{
RsPadButtons btn = rsPADNULL;
if ( ControlsManager.m_aButtonStates[i] == FALSE )
diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp
index 81fe109b..e1090f72 100644
--- a/src/skel/win/win.cpp
+++ b/src/skel/win/win.cpp
@@ -113,9 +113,9 @@ DWORD _dwMemAvailVideo;
DWORD &_dwOperatingSystemVersion = *(DWORD*)0x70F290;
RwUInt32 &gGameState = *(RwUInt32*)0x8F5838;
-WRAPPER Bool InitialiseGame(void) { EAXJMP(0x48E7E0); }
+WRAPPER bool InitialiseGame(void) { EAXJMP(0x48E7E0); }
-WRAPPER const Char *GetLevelSplashScreen(Int32 number) { EAXJMP(0x48D750); }
+WRAPPER const char *GetLevelSplashScreen(int32 number) { EAXJMP(0x48D750); }
//
void LoadingScreen(char const *msg1, char const *msg2, char const *screen);
@@ -130,12 +130,12 @@ enum eJoypadState
struct tJoy
{
eJoypadState m_State;
- Bool m_bInitialised;
- Bool m_bHasAxisZ;
- Bool m_bHasAxisR;
+ bool m_bInitialised;
+ bool m_bHasAxisZ;
+ bool m_bHasAxisR;
char _pad0;
- Int32 m_nVendorID;
- Int32 m_nProductID;
+ int32 m_nVendorID;
+ int32 m_nProductID;
};
class CJoySticks
@@ -1210,7 +1210,7 @@ MainWndProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME)pDev;
if ( pVol->dbcv_flags & DBTF_MEDIA )
{
- Char c = DMAudio.GetCDAudioDriveLetter();
+ char c = DMAudio.GetCDAudioDriveLetter();
if ( c >= 'A' && pVol->dbcv_unitmask & (1 << (c - 'A')) )
{
@@ -1578,7 +1578,7 @@ void InitialiseLanguage()
|| subLayout == SUBLANG_ENGLISH_AUS )
CGame::noProstitutes = true;
- Int32 lang;
+ int32 lang;
switch ( primSystemLCID )
{
@@ -1910,7 +1910,7 @@ _WinMain(HINSTANCE instance,
{
CFileMgr::SetDirMyDocuments();
- Int32 gta3set = CFileMgr::OpenFile("gta3.set", "r");
+ int32 gta3set = CFileMgr::OpenFile("gta3.set", "r");
if ( gta3set )
{
@@ -2112,10 +2112,10 @@ _WinMain(HINSTANCE instance,
case GS_PLAYING_GAME:
{
- Float ms = (Float)CTimer::GetCurrentTimeInCycles() / (Float)CTimer::GetCyclesPerMillisecond();
+ float ms = (float)CTimer::GetCurrentTimeInCycles() / (float)CTimer::GetCyclesPerMillisecond();
if ( RwInitialised )
{
- if (!CMenuManager::m_PrefsFrameLimiter || (1000.0f / (Float)RsGlobal.maxFPS) < ms)
+ if (!CMenuManager::m_PrefsFrameLimiter || (1000.0f / (float)RsGlobal.maxFPS) < ms)
RsEventHandler(rsIDLE, (void *)TRUE);
}
break;
@@ -2335,16 +2335,16 @@ HRESULT CapturePad(RwInt32 padID)
RsPadEventHandler(rsPADBUTTONUP, (void *)&bs);
- Bool deviceAvailable = pPad != NULL;
+ bool deviceAvailable = pPad != NULL;
if ( deviceAvailable )
{
- leftStickPos.x = (Float)js.lX / (Float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2);
- leftStickPos.y = (Float)js.lY / (Float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2);
+ leftStickPos.x = (float)js.lX / (float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2);
+ leftStickPos.y = (float)js.lY / (float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2);
if (LOWORD(js.rgdwPOV[0]) != -1)
{
- Float angle = DEGTORAD((Float)js.rgdwPOV[0] / 100.0f);
+ float angle = DEGTORAD((float)js.rgdwPOV[0] / 100.0f);
leftStickPos.x = sin(angle);
leftStickPos.y = -cos(angle);
@@ -2352,8 +2352,8 @@ HRESULT CapturePad(RwInt32 padID)
if ( AllValidWinJoys.m_aJoys[bs.padID].m_bHasAxisR && AllValidWinJoys.m_aJoys[bs.padID].m_bHasAxisZ )
{
- rightStickPos.x = (Float)js.lZ / (Float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2);
- rightStickPos.y = (Float)js.lRz / (Float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2);
+ rightStickPos.x = (float)js.lZ / (float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2);
+ rightStickPos.y = (float)js.lRz / (float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2);
}
}
@@ -2372,16 +2372,16 @@ HRESULT CapturePad(RwInt32 padID)
CPad *pad = CPad::GetPad(bs.padID);
if ( fabs(leftStickPos.x) > 0.3f )
- pad->PCTempJoyState.LeftStickX = (Int32)(leftStickPos.x * 128.0f);
+ pad->PCTempJoyState.LeftStickX = (int32)(leftStickPos.x * 128.0f);
if ( fabs(leftStickPos.y) > 0.3f )
- pad->PCTempJoyState.LeftStickY = (Int32)(leftStickPos.y * 128.0f);
+ pad->PCTempJoyState.LeftStickY = (int32)(leftStickPos.y * 128.0f);
if ( fabs(rightStickPos.x) > 0.3f )
- pad->PCTempJoyState.RightStickX = (Int32)(rightStickPos.x * 128.0f);
+ pad->PCTempJoyState.RightStickX = (int32)(rightStickPos.x * 128.0f);
if ( fabs(rightStickPos.y) > 0.3f )
- pad->PCTempJoyState.RightStickY = (Int32)(rightStickPos.y * 128.0f);
+ pad->PCTempJoyState.RightStickY = (int32)(rightStickPos.y * 128.0f);
}
return S_OK;
@@ -2392,7 +2392,7 @@ void _InputInitialiseJoys()
DIPROPDWORD prop;
DIDEVCAPS devCaps;
- for ( Int32 i = 0; i < _TODOCONST(2); i++ )
+ for ( int32 i = 0; i < _TODOCONST(2); i++ )
AllValidWinJoys.ClearJoyInfo(i);
_InputAddJoys();