diff --git a/README.md b/README.md index 03431ef7..d2dcb4ac 100644 --- a/README.md +++ b/README.md @@ -177,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 49d0d502..cbd4c7f9 100644 --- a/premake5.lua +++ b/premake5.lua @@ -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,16 +52,16 @@ 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" diff --git a/src/Camera.cpp b/src/Camera.cpp index 7bd4aac9..1b4b1db6 100644 --- a/src/Camera.cpp +++ b/src/Camera.cpp @@ -1249,7 +1249,8 @@ CCam::FixCamWhenObscuredByVehicle(const CVector &TargetCoors) Source.z += HeightFixerCarsObscuring; } -bool CCam::Using3rdPersonMouseCam() { +bool CCam::Using3rdPersonMouseCam() +{ return CCamera::m_bUseMouse3rdPerson && (Mode == MODE_FOLLOWPED || TheCamera.m_bPlayerIsInGarage && diff --git a/src/Frontend.cpp b/src/Frontend.cpp index 5613a2eb..b8ee10f4 100644 --- a/src/Frontend.cpp +++ b/src/Frontend.cpp @@ -37,15 +37,15 @@ WRAPPER void CMenuManager::LoadSettings(void) { EAXJMP(0x488EE0); } WRAPPER void CMenuManager::WaitForUserCD(void) { EAXJMP(0x48ADD0); } int CMenuManager::FadeIn(int alpha) { - if (FrontEndMenuManager.m_nCurrScreen == MENU_LOADING_IN_PROGRESS || - FrontEndMenuManager.m_nCurrScreen == MENU_SAVING_IN_PROGRESS || - FrontEndMenuManager.m_nCurrScreen == MENU_DELETING) + if (m_nCurrScreen == MENU_LOADING_IN_PROGRESS || + m_nCurrScreen == MENU_SAVING_IN_PROGRESS || + m_nCurrScreen == MENU_DELETING) return alpha; - if (FrontEndMenuManager.m_nMenuFadeAlpha >= alpha) + if (m_nMenuFadeAlpha >= alpha) return alpha; - return FrontEndMenuManager.m_nMenuFadeAlpha; + return m_nMenuFadeAlpha; } STARTPATCHES diff --git a/src/Radar.cpp b/src/Radar.cpp index 1c0b0d65..93097e8f 100644 --- a/src/Radar.cpp +++ b/src/Radar.cpp @@ -15,7 +15,8 @@ WRAPPER void CRadar::DrawRadarMap() { EAXJMP(0x4A6C20); } float &CRadar::m_RadarRange = *(float*)0x8E281C; CVector2D &CRadar::vec2DRadarOrigin = *(CVector2D*)0x6299B8; -void CRadar::DrawMap() { +void CRadar::DrawMap() +{ if (!TheCamera.m_WideScreenOn && CHud::m_Wants_To_Draw_Hud) { if (FindPlayerVehicle()) { if (FindPlayerVehicle()->GetSpeed().Magnitude() > 0.3f) { @@ -24,24 +25,24 @@ void CRadar::DrawMap() { else CRadar::m_RadarRange = (FindPlayerVehicle()->GetSpeed().Magnitude() + 0.3f) * 200.0f; } - else { + else CRadar::m_RadarRange = 120.0f; - } } - else { + 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) { +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; + 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 \ No newline at end of file +ENDPATCHES diff --git a/src/Wanted.h b/src/Wanted.h index f7ea66f3..60af7d8b 100644 --- a/src/Wanted.h +++ b/src/Wanted.h @@ -2,7 +2,8 @@ #include "Entity.h" #include "math/Vector.h" -enum eCrimeType { +enum eCrimeType +{ CRIME_NONE, CRIME_SHOT_FIRED, CRIME_PED_FIGHT, @@ -22,7 +23,8 @@ enum eCrimeType { CRIME_DESTROYED_CESSNA, }; -enum eCopType { +enum eCopType +{ COP_STREET = 0, COP_FBI = 1, COP_SWAT = 2, diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp index d3f14b0a..881f6407 100644 --- a/src/audio/MusicManager.cpp +++ b/src/audio/MusicManager.cpp @@ -16,7 +16,8 @@ int &gRetuneCounter = *(int*)0x650B84; //WRAPPER void cMusicManager::DisplayRadioStationName(void) { EAXJMP(0x57E6D0); } -bool cMusicManager::PlayerInCar() { +bool cMusicManager::PlayerInCar() +{ if (!FindPlayerVehicle()) return false; else { @@ -25,7 +26,6 @@ bool cMusicManager::PlayerInCar() { if (State == PED_DRAG_FROM_CAR || State == PED_EXIT_CAR || State == PED_ARRESTED) return false; - int16 Model = FindPlayerVehicle()->m_modelIndex; switch (FindPlayerVehicle()->m_modelIndex) { case MI_FIRETRUCK: case MI_AMBULAN: @@ -42,8 +42,9 @@ bool cMusicManager::PlayerInCar() { } } -void cMusicManager::DisplayRadioStationName() { - wchar* RadioName = nullptr; +void cMusicManager::DisplayRadioStationName() +{ + wchar *RadioName = nullptr; uint32 RadioStation = gNumRetunePresses + MusicManager.m_nCurrentStreamedSound; switch (RadioStation) { @@ -84,11 +85,11 @@ void cMusicManager::DisplayRadioStationName() { CFont::SetJustifyOff(); CFont::SetBackgroundOff(); - CFont::SetScale(SCREEN_STRETCH_X(0.8f), SCREEN_STRETCH_Y(1.35f)); + CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f)); CFont::SetPropOn(); CFont::SetFontStyle(FONT_HEADING); CFont::SetCentreOn(); - CFont::SetCentreSize(SCREEN_STRETCH_X(640.0f));; + CFont::SetCentreSize(HUD_STRETCH_X(640.0f));; static int32 nTime = 0; if (!CTimer::GetIsPaused() && !TheCamera.m_WideScreenOn && MusicManager.PlayerInCar()) { @@ -105,33 +106,36 @@ void cMusicManager::DisplayRadioStationName() { else { if (RadioStation > HEAD_RADIO) { if (cSampleManager.IsMP3RadioChannelAvailable()) { - if (RadioStation > USERTRACK) + if (RadioStation > USERTRACK) { RadioStation = RADIO_OFF; + return; + } } else { - if (RadioStation > CHATTERBOX) + if (RadioStation > CHATTERBOX) { RadioStation = RADIO_OFF; + return; + } } } - else { + else RadioStation = RADIO_OFF; - } } } if (RadioName) { CFont::SetColor(CRGBA(0, 0, 0, 255)); - CFont::PrintString(SCREEN_WIDTH / 2, SCREEN_STRETCH_Y(23.0f), RadioName); + 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, SCREEN_STRETCH_Y(22.0f), RadioName); + CFont::PrintString(SCREEN_WIDTH / 2, HUD_STRETCH_Y(22.0f), RadioName); CFont::DrawFonts(); } } } -} \ No newline at end of file +} diff --git a/src/audio/MusicManager.h b/src/audio/MusicManager.h index 48df60ba..644c3df3 100644 --- a/src/audio/MusicManager.h +++ b/src/audio/MusicManager.h @@ -1,6 +1,7 @@ #pragma once -enum eRadioStation { +enum eRadioStation +{ HEAD_RADIO, DOUBLE_CLEF, JAH_RADIO, @@ -15,7 +16,8 @@ enum eRadioStation { RADIO_OFF, }; -enum eStreamedSounds { +enum eStreamedSounds +{ STREAMED_SOUND_RADIO_HEAD = 0, STREAMED_SOUND_RADIO_CLASSIC = 1, STREAMED_SOUND_RADIO_KJAH = 2, @@ -216,7 +218,8 @@ enum eStreamedSounds { NO_STREAMED_SOUND = 197, }; -class tMP3Sample { +class tMP3Sample +{ public: uint32 m_nLength; uint32 m_nPosition; diff --git a/src/common.h b/src/common.h index 7d7e223c..ee6ceadd 100644 --- a/src/common.h +++ b/src/common.h @@ -138,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, ...); diff --git a/src/control/Darkel.cpp b/src/control/Darkel.cpp index e2d9fd72..aece455d 100644 --- a/src/control/Darkel.cpp +++ b/src/control/Darkel.cpp @@ -6,6 +6,7 @@ WRAPPER void CDarkel::DrawMessages(void) { EAXJMP(0x420920); } bool CDarkel::Status = *(bool*)0x95CCB4; -bool CDarkel::FrenzyOnGoing() { +bool CDarkel::FrenzyOnGoing() +{ return Status; } \ No newline at end of file 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 @@ -2,6 +2,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/entities/PlayerInfo.h b/src/entities/PlayerInfo.h index bcbaf4ac..abda1b23 100644 --- a/src/entities/PlayerInfo.h +++ b/src/entities/PlayerInfo.h @@ -2,18 +2,21 @@ #include "Automobile.h" #include "PlayerPed.h" -enum eWastedBustedState { - WBSTATE_PLAYING = 0x0, - WBSTATE_WASTED = 0x1, - WBSTATE_BUSTED = 0x2, - WBSTATE_FAILED_CRITICAL_MISSION = 0x3, +enum eWastedBustedState +{ + WBSTATE_PLAYING, + WBSTATE_WASTED, + WBSTATE_BUSTED, + WBSTATE_FAILED_CRITICAL_MISSION, }; -struct CCivilianPed { +struct CCivilianPed +{ }; -class CPlayerInfo { +class CPlayerInfo +{ public: CPlayerPed *m_pPed; CVehicle *m_pRemoteVehicle; diff --git a/src/entities/PlayerPed.h b/src/entities/PlayerPed.h index ee4f57b3..a41135e9 100644 --- a/src/entities/PlayerPed.h +++ b/src/entities/PlayerPed.h @@ -3,7 +3,8 @@ #include "Ped.h" #include "Wanted.h" -class CPlayerPed : public CPed { +class CPlayerPed : public CPed +{ public: CWanted *m_pWanted; CCopPed *m_pArrestingCop; diff --git a/src/main.cpp b/src/main.cpp index 976de407..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; @@ -322,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); } - 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); + 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 - 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/render/Hud.cpp b/src/render/Hud.cpp index d9c86209..bd8cee51 100644 --- a/src/render/Hud.cpp +++ b/src/render/Hud.cpp @@ -24,10 +24,10 @@ //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); } +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; @@ -42,17 +42,17 @@ 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; +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; +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; @@ -82,7 +82,7 @@ char *WeaponFilenames[] = { "bat", "batm", "pistol", - "pistolm", + "pistolm", "uzi", "uzim", "shotgun", @@ -100,14 +100,14 @@ char *WeaponFilenames[] = { "molotov", "molotovm", "grenade", - "grenadem", + "grenadem", "detonator", "detonator_mask", "", "", "", "", - "radardisc", + "radardisc", "radardiscm", "pager", "pagerm", @@ -122,13 +122,14 @@ char *WeaponFilenames[] = { "siteM16", "siteM16m", "siterocket", - "siterocketm" + "siterocketm" }; -RwTexture* gpSniperSightTex = (RwTexture*)0x8F5834; -RwTexture* gpRocketSightTex = (RwTexture*)0x8E2C20; +RwTexture *&gpSniperSightTex = *(RwTexture**)0x8F5834; +RwTexture *&gpRocketSightTex = *(RwTexture**)0x8E2C20; -void CHud::Initialise() { +void CHud::Initialise() +{ ReInitialise(); int HudTXD = CTxdStore::AddTxdSlot("hud"); @@ -147,8 +148,9 @@ void CHud::Initialise() { CTxdStore::PopCurrentTxd(); } -void CHud::Shutdown() { - for (int i = 0; i < 23; ++i) { +void CHud::Shutdown() +{ + for (int i = 0; i < ARRAY_SIZE(WeaponFilenames) / 2; ++i) { Sprites[i].Delete(); } @@ -162,15 +164,18 @@ void CHud::Shutdown() { CTxdStore::RemoveTxdSlot(HudTXD); } -void CHud::SetVehicleName(wchar* name) { +void CHud::SetVehicleName(wchar *name) +{ m_pVehicleName = name; } -void CHud::SetZoneName(wchar* name) { +void CHud::SetZoneName(wchar *name) +{ m_pZoneName = name; } -void CHud::Draw() { +void CHud::Draw() +{ RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); @@ -218,7 +223,7 @@ void CHud::Draw() { RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); float fStep = sin((CTimer::GetTimeInMilliseconds() & 1023) * 0.0061328127); - float fMultBright = CHud::SpriteBrightness * 0.033333335f * (0.25f * fStep + 0.75f); + float fMultBright = CHud::SpriteBrightness * 0.03f * (0.25f * fStep + 0.75f); CRect rect; float fWidescreenOffset[2] = { 0.0f, 0.0f }; @@ -420,8 +425,8 @@ void CHud::Draw() { CFont::SetPropOff(); CFont::SetFontStyle(FONT_HEADING); - if (CHud::m_ItemToFlash == 4 && CTimer::GetFrameCounter() & 8 - || CHud::m_ItemToFlash != 4 + 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 @@ -450,7 +455,7 @@ void CHud::Draw() { /* DrawArmour */ - if (CHud::m_ItemToFlash == 3 && CTimer::GetFrameCounter() & 8 || CHud::m_ItemToFlash != 3) { + 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); @@ -488,7 +493,7 @@ void CHud::Draw() { AsciiToUnicode("]", sPrintIcon); for (int i = 0; i < 6; i++) { - CFont::SetColor(CRGBA(0, 0, 0, 255)); + 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 @@ -574,7 +579,7 @@ void CHud::Draw() { 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::SetScale(HUD_STRETCH_X(1.2f), HUD_STRETCH_Y(1.2f)); CFont::SetRightJustifyOn(); CFont::SetRightJustifyWrap(0.0f); @@ -845,7 +850,7 @@ void CHud::Draw() { /* DrawRadar */ - if (CHud::m_ItemToFlash == 8 && CTimer::GetFrameCounter() & 8 || CHud::m_ItemToFlash != 8) { + 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(); @@ -863,87 +868,77 @@ void CHud::Draw() { DrawScriptText */ if (!CTimer::GetIsUserPaused()) { - uint16 CounterA = 0; - uint16 CounterB = 0; CTextLine* IntroText = CTheScripts::IntroTextLines; - do { - if (CTheScripts::IntroTextLines[CounterB].m_awText[0] && CTheScripts::IntroTextLines[CounterB].field_29) { - CFont::SetScale(HUD_STRETCH_X(CTheScripts::IntroTextLines[CounterB].m_fScaleX), HUD_STRETCH_Y(CTheScripts::IntroTextLines[CounterB].m_fScaleY * 0.5f)); - CFont::SetColor(CTheScripts::IntroTextLines[CounterB].m_sColor); + 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[CounterB].m_bJustify) + if (CTheScripts::IntroTextLines[i].m_bJustify) CFont::SetJustifyOn(); else CFont::SetJustifyOff(); - if (CTheScripts::IntroTextLines[CounterB].m_bRightJustify) + if (CTheScripts::IntroTextLines[i].m_bRightJustify) CFont::SetRightJustifyOn(); else CFont::SetRightJustifyOff(); - if (CTheScripts::IntroTextLines[CounterB].m_bCentered) + if (CTheScripts::IntroTextLines[i].m_bCentered) CFont::SetCentreOn(); else CFont::SetCentreOff(); - CFont::SetWrapx(HUD_STRETCH_X(CTheScripts::IntroTextLines[CounterB].m_fWrapX)); - CFont::SetCentreSize(HUD_STRETCH_X(CTheScripts::IntroTextLines[CounterB].m_fCenterSize)); + CFont::SetWrapx(HUD_STRETCH_X(CTheScripts::IntroTextLines[i].m_fWrapX)); + CFont::SetCentreSize(HUD_STRETCH_X(CTheScripts::IntroTextLines[i].m_fCenterSize)); - if (CTheScripts::IntroTextLines[CounterB].m_bBackground) + if (CTheScripts::IntroTextLines[i].m_bBackground) CFont::SetBackgroundOn(); else CFont::SetBackgroundOff(); - CFont::SetBackgroundColor(CTheScripts::IntroTextLines[CounterB].m_sBackgroundColor); + CFont::SetBackgroundColor(CTheScripts::IntroTextLines[i].m_sBackgroundColor); - if (CTheScripts::IntroTextLines[CounterB].m_bBackgroundOnly) + if (CTheScripts::IntroTextLines[i].m_bBackgroundOnly) CFont::SetBackGroundOnlyTextOn(); else CFont::SetBackGroundOnlyTextOff(); - if (CTheScripts::IntroTextLines[CounterB].m_bTextProportional) + if (CTheScripts::IntroTextLines[i].m_bTextProportional) CFont::SetPropOn(); else CFont::SetPropOff(); - CFont::SetFontStyle(CTheScripts::IntroTextLines[CounterB].m_nFont); - CFont::PrintString(HUD_STRETCH_X(640.0f - CTheScripts::IntroTextLines[CounterB].field_36), HUD_STRETCH_Y(448.0f - CTheScripts::IntroTextLines[CounterB].field_40), IntroText->m_awText); + 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); } - ++CounterA; - ++CounterB; - ++IntroText; - } while (CounterA < 2); + } - uint16 CounterC = 0; - uint16 CounterD = 0; CScriptRectangle* IntroRect = CTheScripts::IntroRectangles; - do { - if (CTheScripts::IntroRectangles[CounterD].m_bIsUsed && CTheScripts::IntroRectangles[CounterD].m_bIsAntialiased) { - if (CTheScripts::IntroRectangles[CounterD].m_wTextureId >= 0) { + 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[CounterD].m_sRect.left, - CTheScripts::IntroRectangles[CounterD].m_sRect.bottom, - CTheScripts::IntroRectangles[CounterD].m_sRect.right, - CTheScripts::IntroRectangles[CounterD].m_sRect.bottom }; + 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[CounterD].m_wTextureId].Draw(rect, IntroRect->m_sColor); + CTheScripts::ScriptSprites[CTheScripts::IntroRectangles[i].m_wTextureId].Draw(rect, IntroRect->m_sColor); } else { CRect rect = { - CTheScripts::IntroRectangles[CounterD].m_sRect.left, - CTheScripts::IntroRectangles[CounterD].m_sRect.bottom, - CTheScripts::IntroRectangles[CounterD].m_sRect.right, - CTheScripts::IntroRectangles[CounterD].m_sRect.bottom }; + 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); } } - ++CounterC; - ++CounterD; - ++IntroRect; - } while (CounterC < 16); + } /* DrawSubtitles @@ -972,8 +967,9 @@ void CHud::Draw() { /* DrawBigMessage */ + // MissionCompleteFailedText if (CHud::m_BigMessage[0][0]) { - if (0.0f == BigMessageInUse[0]) { + if (BigMessageInUse[0] == 0.0f) { CFont::SetJustifyOff(); CFont::SetBackgroundOff(); CFont::SetBackGroundOnlyTextOff(); @@ -983,28 +979,23 @@ void CHud::Draw() { CFont::SetCentreSize(HUD_STRETCH_X(615.0f)); CFont::SetColor(CRGBA(255, 255, 0, 255)); CFont::SetFontStyle(FONT_HEADING); - if ((SCREENW - 20) <= BigMessageX[0]) { - BigMessageInUse[0] = BigMessageInUse[0] + CTimer::GetTimeStep(); - if (BigMessageInUse[0] >= 120.0f) { - BigMessageInUse[0] = 120.0; - BigMessageAlpha[0] = BigMessageAlpha[0] - (CTimer::GetTimeStep() * 0.02f * 1000.0f) * 0.30000001f; - } + + if (BigMessageX[0] >= (SCREENW - 20)) { + BigMessageAlpha[0] += (CTimer::GetTimeStep() * 0.02f * -255.0f); + if (BigMessageAlpha[0] <= 0.0f) { - CHud::m_BigMessage[0][0] = 0; - BigMessageAlpha[0] = 0.0; + BigMessageAlpha[0] = 0.0f; + BigMessageInUse[0] = 1.0f; } } else { - float fStep = (CTimer::GetTimeStep() - * 0.02f - * 1000.0f) - * 0.30000001f; - BigMessageX[0] = BigMessageX[0] + fStep; - BigMessageAlpha[0] = BigMessageAlpha[0] + fStep; + BigMessageX[0] += (CTimer::GetTimeStep() * 0.02f * 255.0f); + BigMessageAlpha[0] += (CTimer::GetTimeStep() * 0.02f * 255.0f); - if (BigMessageAlpha[0] > 255.0f) - BigMessageAlpha[0] = 255.0; + 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]); @@ -1023,14 +1014,12 @@ void CHud::Draw() { // WastedBustedText if (CHud::m_BigMessage[2][0]) { - if (0 == BigMessageInUse[2]) { - BigMessageAlpha[2] = (CTimer::GetTimeStep() - * 0.02f - * 1000.0f) - * 0.40000001 - + BigMessageAlpha[2]; + 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) @@ -1060,7 +1049,8 @@ void CHud::Draw() { } } -void CHud::DrawAfterFade() { +void CHud::DrawAfterFade() +{ if (CTimer::GetIsUserPaused() || CReplay::Mode == 1) return; @@ -1179,7 +1169,6 @@ void CHud::DrawAfterFade() { 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); @@ -1256,23 +1245,20 @@ void CHud::DrawAfterFade() { CFont::SetRightJustifyWrap(-500); CFont::SetRightJustifyOn(); CFont::SetFontStyle(FONT_HEADING); - if ((SCREENW - 20) <= BigMessageX[1]) { - BigMessageInUse[1] = BigMessageInUse[1] + CTimer::GetTimeStep(); - if (BigMessageInUse[1] >= 120.0f) { - BigMessageInUse[1] = 120.0; - BigMessageAlpha[1] = BigMessageAlpha[1] - (CTimer::GetTimeStep() * 0.02f * 1000.0f) * 0.3f; - } - if (BigMessageAlpha[1] <= 0) { - m_BigMessage[1][0] = 0; - BigMessageAlpha[1] = 0.0; + 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 { - float fStep = (CTimer::GetTimeStep() * 0.02f * 1000.0f) * 0.3f; - BigMessageX[1] = BigMessageX[1] + fStep; - BigMessageAlpha[1] = BigMessageAlpha[1] + fStep; - if (BigMessageAlpha[1] > 255.0f) - BigMessageAlpha[1] = 255.0; + 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]); @@ -1281,13 +1267,13 @@ void CHud::DrawAfterFade() { CFont::PrintString(HUD_FROM_RIGHT(20.0f), HUD_FROM_BOTTOM(120.0f), m_BigMessage[1]); } else { - BigMessageAlpha[1] = 0.0; - BigMessageX[1] = -60.0; - BigMessageInUse[1] = 1.0; + BigMessageAlpha[1] = 0.0f; + BigMessageX[1] = -60.0f; + BigMessageInUse[1] = 1.0f; } } else { - BigMessageInUse[1] = 0.0; + BigMessageInUse[1] = 0.0f; } } diff --git a/src/render/Hud.h b/src/render/Hud.h index 7c06f9e5..c4c43e30 100644 --- a/src/render/Hud.h +++ b/src/render/Hud.h @@ -1,7 +1,15 @@ #pragma once #include "Sprite2d.h" -enum eSprites { +enum eItems +{ + ITEM_ARMOUR = 3, + ITEM_HEALTH = 4, + ITEM_RADAR = 8 +}; + +enum eSprites +{ HUD_FIST, HUD_BAT, HUD_PISTOL, @@ -21,7 +29,8 @@ enum eSprites { HUD_SITEM16 = 21 }; -class CHud { +class CHud +{ public: static CSprite2d *Sprites; @@ -38,23 +47,23 @@ public: 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 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 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 *BigMessageInUse; + static float *BigMessageAlpha; + static float *BigMessageX; static float &OddJob2OffTimer; static int8 &CounterOnLastFrame; static float &OddJob2XOffset; @@ -75,12 +84,12 @@ public: 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 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); -}; \ No newline at end of file + static void SetMessage(wchar *message); + static void SetBigMessage(wchar *message, int16 style); + static void SetPagerMessage(wchar *message); +};