From 048999d74a7f07cb82a40262a1a0cf2b81250abf Mon Sep 17 00:00:00 2001 From: Silent Date: Sun, 14 Sep 2014 20:02:57 +0200 Subject: [PATCH] Additional compatibility code for widescreen fixes --- IIIFix/SilentPatchIII.cpp | 53 ++++++++++++++++++--------------- SilentPatch/MemoryMgr.h | 62 +++++++++++++++++++++++++++++++++++++++ VCFix/SilentPatchVC.cpp | 32 +++++++++++--------- 3 files changed, 110 insertions(+), 37 deletions(-) diff --git a/IIIFix/SilentPatchIII.cpp b/IIIFix/SilentPatchIII.cpp index 3209bc0..32ce5e4 100644 --- a/IIIFix/SilentPatchIII.cpp +++ b/IIIFix/SilentPatchIII.cpp @@ -37,31 +37,44 @@ static void (*PrintString)(float,float,const wchar_t*); static bool* bWantsToDrawHud; static bool* bCamCheck; static RsGlobalType* RsGlobal; -static const float* ResolutionWidthMult; -static const float* ResolutionHeightMult; static const void* SubtitlesShadowFix_JumpBack; +inline float GetWidthMult() +{ + static const float& ResolutionWidthMult = **AddressByVersion(0x57E956, 0x57ECA6, 0x57EBA6); + return ResolutionWidthMult; +} + +inline float GetHeightMult() +{ + static const float& ResolutionHeightMult = **AddressByVersion(0x57E940, 0x57EC90, 0x57EB90); + return ResolutionHeightMult; +} + void ShowRadarTrace(float fX, float fY, unsigned int nScale, BYTE r, BYTE g, BYTE b, BYTE a) { if ( *bWantsToDrawHud == true && !*bCamCheck ) { - DrawRect(CRect( fX - ((nScale+1.0f) * *ResolutionWidthMult * RsGlobal->MaximumWidth), - fY + ((nScale+1.0f) * *ResolutionHeightMult * RsGlobal->MaximumHeight), - fX + ((nScale+1.0f) * *ResolutionWidthMult * RsGlobal->MaximumWidth), - fY - ((nScale+1.0f) * *ResolutionHeightMult * RsGlobal->MaximumHeight)), + float fWidthMult = GetWidthMult(); + float fHeightMult = GetHeightMult(); + + DrawRect(CRect( fX - ((nScale+1.0f) * fWidthMult * RsGlobal->MaximumWidth), + fY + ((nScale+1.0f) * fHeightMult * RsGlobal->MaximumHeight), + fX + ((nScale+1.0f) * fWidthMult * RsGlobal->MaximumWidth), + fY - ((nScale+1.0f) * fHeightMult * RsGlobal->MaximumHeight)), CRGBA(0, 0, 0, a)); - DrawRect(CRect( fX - (nScale * *ResolutionWidthMult * RsGlobal->MaximumWidth), - fY + (nScale * *ResolutionHeightMult * RsGlobal->MaximumHeight), - fX + (nScale * *ResolutionWidthMult * RsGlobal->MaximumWidth), - fY - (nScale * *ResolutionHeightMult * RsGlobal->MaximumHeight)), + DrawRect(CRect( fX - (nScale * fWidthMult * RsGlobal->MaximumWidth), + fY + (nScale * fHeightMult * RsGlobal->MaximumHeight), + fX + (nScale * fWidthMult * RsGlobal->MaximumWidth), + fY - (nScale * fHeightMult * RsGlobal->MaximumHeight)), CRGBA(r, g, b, a)); } } void SetScaleProperly(float fX, float fY) { - SetScale(fX * *ResolutionWidthMult * RsGlobal->MaximumWidth, fY * *ResolutionHeightMult * RsGlobal->MaximumHeight); + SetScale(fX * GetWidthMult() * RsGlobal->MaximumWidth, fY * GetHeightMult() * RsGlobal->MaximumHeight); } void PurpleNinesGlitchFix() @@ -117,8 +130,8 @@ static float fShadowXSize, fShadowYSize; void __stdcall Recalculate(signed int nShadow) { - fShadowXSize = nShadow * *ResolutionWidthMult * RsGlobal->MaximumWidth; - fShadowYSize = nShadow * *ResolutionHeightMult * RsGlobal->MaximumHeight; + fShadowXSize = nShadow * GetWidthMult() * RsGlobal->MaximumWidth; + fShadowYSize = nShadow * GetHeightMult() * RsGlobal->MaximumHeight; } template @@ -126,7 +139,7 @@ void AlteredPrintString(float fX, float fY, const wchar_t* pText) { float fMarginX = **reinterpret_cast(pFltX); float fMarginY = **reinterpret_cast(pFltY); - PrintString(fX - fMarginX + (fMarginX * *ResolutionWidthMult * RsGlobal->MaximumWidth), fY - fMarginY + (fMarginY * *ResolutionHeightMult * RsGlobal->MaximumHeight), pText); + PrintString(fX - fMarginX + (fMarginX * GetWidthMult() * RsGlobal->MaximumWidth), fY - fMarginY + (fMarginY * GetHeightMult() * RsGlobal->MaximumHeight), pText); } template @@ -134,21 +147,21 @@ void AlteredPrintStringMinus(float fX, float fY, const wchar_t* pText) { float fMarginX = **reinterpret_cast(pFltX); float fMarginY = **reinterpret_cast(pFltY); - PrintString(fX + fMarginX - (fMarginX * *ResolutionWidthMult * RsGlobal->MaximumWidth), fY + fMarginY - (fMarginY * *ResolutionHeightMult * RsGlobal->MaximumHeight), pText); + PrintString(fX + fMarginX - (fMarginX * GetWidthMult() * RsGlobal->MaximumWidth), fY + fMarginY - (fMarginY * GetHeightMult() * RsGlobal->MaximumHeight), pText); } template void AlteredPrintStringXOnly(float fX, float fY, const wchar_t* pText) { float fMarginX = **reinterpret_cast(pFltX); - PrintString(fX - fMarginX + (fMarginX * *ResolutionWidthMult * RsGlobal->MaximumWidth), fY, pText); + PrintString(fX - fMarginX + (fMarginX * GetWidthMult() * RsGlobal->MaximumWidth), fY, pText); } template void AlteredPrintStringYOnly(float fX, float fY, const wchar_t* pText) { float fMarginY = **reinterpret_cast(pFltY); - PrintString(fX, fY - fMarginY + (fMarginY * *ResolutionHeightMult * RsGlobal->MaximumHeight), pText); + PrintString(fX, fY - fMarginY + (fMarginY * GetHeightMult() * RsGlobal->MaximumHeight), pText); } float FixedRefValue() @@ -182,8 +195,6 @@ void Patch_III_10() bWantsToDrawHud = *(bool**)0x4A5877; bCamCheck = *(bool**)0x4A588C; RsGlobal = *(RsGlobalType**)0x584C42; - ResolutionWidthMult = *(float**)0x57E956; - ResolutionHeightMult = *(float**)0x57E940; HeadlightsFix_JumpBack = (void*)0x5382F2; SubtitlesShadowFix_JumpBack = (void*)0x500D32; @@ -295,8 +306,6 @@ void Patch_III_11() bWantsToDrawHud = *(bool**)0x4A5967; bCamCheck = *(bool**)0x4A597C; RsGlobal = *(RsGlobalType**)0x584F82; - ResolutionWidthMult = *(float**)0x57ECA6; - ResolutionHeightMult = *(float**)0x57EC90; HeadlightsFix_JumpBack = (void*)0x538532; SubtitlesShadowFix_JumpBack = (void*)0x500E12; @@ -402,8 +411,6 @@ void Patch_III_Steam() bWantsToDrawHud = *(bool**)0x4A58F7; bCamCheck = *(bool**)0x4A590C; RsGlobal = *(RsGlobalType**)0x584E72; - ResolutionWidthMult = *(float**)0x57EBA6; - ResolutionHeightMult = *(float**)0x57EB90; SubtitlesShadowFix_JumpBack = (void*)0x500DA2; CTimer::ms_fTimeScale = *(float**)0x43F73F; diff --git a/SilentPatch/MemoryMgr.h b/SilentPatch/MemoryMgr.h index 9d032f1..ba694bf 100644 --- a/SilentPatch/MemoryMgr.h +++ b/SilentPatch/MemoryMgr.h @@ -35,6 +35,66 @@ inline void* GetDummy() return &dwDummy; } +#if defined SILENTPATCH_III_VER + +// This function initially detects III version then chooses the address basing on game version +template +inline T AddressByVersion(DWORD address10, DWORD address11, DWORD addressSteam) +{ + signed char* bVer = GetVer(); + + if ( *bVer == -1 ) + { + if (*(DWORD*)0x5C1E70 == 0x53E58955) *bVer = 0; + else if (*(DWORD*)0x5C2130 == 0x53E58955) *bVer = 1; + else if (*(DWORD*)0x5C6FD0 == 0x53E58955) *bVer = 2; + } + + switch ( *bVer ) + { + case 1: + assert(address11); + return (T)address11; + case 2: + assert(addressSteam); + return (T)addressSteam; + default: + assert(address10); + return (T)address10; + } +} + +#elif defined SILENTPATCH_VC_VER + +// This function initially detects VC version then chooses the address basing on game version +template +inline T AddressByVersion(DWORD address10, DWORD address11, DWORD addressSteam) +{ + signed char* bVer = GetVer(); + + if ( *bVer == -1 ) + { + if (*(DWORD*)0x667BF0 == 0x53E58955) *bVer = 0; + else if (*(DWORD*)0x667C40 == 0x53E58955) *bVer = 1; + else if (*(DWORD*)0x666BA0 == 0x53E58955) *bVer = 2; + } + + switch ( *bVer ) + { + case 1: + assert(address11); + return (T)address11; + case 2: + assert(addressSteam); + return (T)addressSteam; + default: + assert(address10); + return (T)address10; + } +} + +#else + // This function initially detects SA version then chooses the address basing on game version template inline T AddressByVersion(DWORD address10, DWORD address11, DWORD addressSteam) @@ -180,6 +240,8 @@ inline T AddressByRegion_11(DWORD address11) return (T)address11; } +#endif + namespace Memory { template diff --git a/VCFix/SilentPatchVC.cpp b/VCFix/SilentPatchVC.cpp index 9b9f988..0b27b21 100644 --- a/VCFix/SilentPatchVC.cpp +++ b/VCFix/SilentPatchVC.cpp @@ -24,10 +24,20 @@ void (__stdcall *AudioResetTimers)(unsigned int); static void (*PrintString)(float,float,const wchar_t*); static RsGlobalType* RsGlobal; -static const float* ResolutionWidthMult; -static const float* ResolutionHeightMult; static const void* SubtitlesShadowFix_JumpBack; +inline float GetWidthMult() +{ + static const float& ResolutionWidthMult = **AddressByVersion(0x5FA15E, 0x5FA17E, 0x5F9DBE); + return ResolutionWidthMult; +} + +inline float GetHeightMult() +{ + static const float& ResolutionHeightMult = **AddressByVersion(0x5FA148, 0x5FA168, 0x5F9DA8); + return ResolutionHeightMult; +} + void __declspec(naked) RosiesAudioFix() { @@ -41,8 +51,8 @@ void __declspec(naked) RosiesAudioFix() void __stdcall Recalculate(float& fX, float& fY, signed int nShadow) { - fX = nShadow * *ResolutionWidthMult * RsGlobal->MaximumWidth; - fY = nShadow * *ResolutionHeightMult * RsGlobal->MaximumHeight; + fX = nShadow * GetWidthMult() * RsGlobal->MaximumWidth; + fY = nShadow * GetHeightMult() * RsGlobal->MaximumHeight; } template @@ -50,7 +60,7 @@ void AlteredPrintString(float fX, float fY, const wchar_t* pText) { float fMarginX = **reinterpret_cast(pFltX); float fMarginY = **reinterpret_cast(pFltY); - PrintString(fX - fMarginX + (fMarginX * *ResolutionWidthMult * RsGlobal->MaximumWidth), fY - fMarginY + (fMarginY * *ResolutionHeightMult * RsGlobal->MaximumHeight), pText); + PrintString(fX - fMarginX + (fMarginX * GetWidthMult() * RsGlobal->MaximumWidth), fY - fMarginY + (fMarginY * GetHeightMult() * RsGlobal->MaximumHeight), pText); } template @@ -58,21 +68,21 @@ void AlteredPrintStringMinus(float fX, float fY, const wchar_t* pText) { float fMarginX = **reinterpret_cast(pFltX); float fMarginY = **reinterpret_cast(pFltY); - PrintString(fX + fMarginX - (fMarginX * *ResolutionWidthMult * RsGlobal->MaximumWidth), fY + fMarginY - (fMarginY * *ResolutionHeightMult * RsGlobal->MaximumHeight), pText); + PrintString(fX + fMarginX - (fMarginX * GetWidthMult() * RsGlobal->MaximumWidth), fY + fMarginY - (fMarginY * GetHeightMult() * RsGlobal->MaximumHeight), pText); } template void AlteredPrintStringXOnly(float fX, float fY, const wchar_t* pText) { float fMarginX = **reinterpret_cast(pFltX); - PrintString(fX - fMarginX + (fMarginX * *ResolutionWidthMult * RsGlobal->MaximumWidth), fY, pText); + PrintString(fX - fMarginX + (fMarginX * GetWidthMult() * RsGlobal->MaximumWidth), fY, pText); } template void AlteredPrintStringYOnly(float fX, float fY, const wchar_t* pText) { float fMarginY = **reinterpret_cast(pFltY); - PrintString(fX, fY - fMarginY + (fMarginY * *ResolutionHeightMult * RsGlobal->MaximumHeight), pText); + PrintString(fX, fY - fMarginY + (fMarginY * GetHeightMult() * RsGlobal->MaximumHeight), pText); } float FixedRefValue() @@ -106,8 +116,6 @@ void Patch_VC_10() bSnapShotActive = *(bool**)0x4D1239; RsGlobal = *(RsGlobalType**)0x602D32; - ResolutionWidthMult = *(float**)0x5FA15E; - ResolutionHeightMult = *(float**)0x5FA148; RosieAudioFix_JumpBack = (void*)0x42BFFE; SubtitlesShadowFix_JumpBack = (void*)0x551701; @@ -166,8 +174,6 @@ void Patch_VC_11() bSnapShotActive = *(bool**)0x4D1259; RsGlobal = *(RsGlobalType**)0x602D12; - ResolutionWidthMult = *(float**)0x5FA17E; - ResolutionHeightMult = *(float**)0x5FA168; RosieAudioFix_JumpBack = (void*)0x42BFFE; SubtitlesShadowFix_JumpBack = (void*)0x551721; @@ -226,8 +232,6 @@ void Patch_VC_Steam() bSnapShotActive = *(bool**)0x4D10F9; RsGlobal = *(RsGlobalType**)0x602952; - ResolutionWidthMult = *(float**)0x5F9DBE; - ResolutionHeightMult = *(float**)0x5F9DA8; RosieAudioFix_JumpBack = (void*)0x42BFCE; SubtitlesShadowFix_JumpBack = (void*)0x5515F1;