Skip to content

Commit

Permalink
SA: Fix an incompatibility between wshps.asi, making credits huge
Browse files Browse the repository at this point in the history
Fixes #75
  • Loading branch information
CookiePLMonster committed Nov 25, 2024
1 parent d191bdf commit 50c3a47
Showing 1 changed file with 65 additions and 58 deletions.
123 changes: 65 additions & 58 deletions SilentPatchSA/SilentPatchSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4652,7 +4652,6 @@ BOOL InjectDelayedPatches_10()

// Fix some big messages staying on screen longer at high resolutions due to a cut sliding text feature
// Also since we're touching it, optionally allow to re-enable this feature.

if (const int INIoption = GetPrivateProfileIntW(L"SilentPatch", L"SlidingMissionTitleText", -1, wcModulePath); INIoption != -1)
{
using namespace SlidingTextsScalingFixes;
Expand Down Expand Up @@ -4748,6 +4747,31 @@ BOOL InjectDelayedPatches_10()
}


// Fix credits not scaling to resolution
// Moved here for compatibility with wshps.asi
if (MemEquals(0x5A8679, {0xD8, 0xC1, 0xD8, 0x05}) && MemEquals(0x5A8679+8, {0xD8, 0x64, 0x24, 0x18, 0xD9, 0x54, 0x24, 0x14})) // Verify wshps.asi isn't already patching the credits
{
using namespace CreditsScalingFixes;

std::array<uintptr_t, 2> creditPrintString = { 0x5A8707, 0x5A8785 };

HookEach_PrintString(creditPrintString, InterceptCall);
InterceptCall(0x5A86C0, orgSetScale, SetScale_ScaleToRes);

// Fix the credits cutting off on the bottom early, they don't do that in III
// but it regressed in VC and SA
static const float topMargin = 1.0f;
static const float bottomMargin = -(**(float**)(0x5A869A + 2));

Patch(0x5A8689 + 2, &topMargin);
Patch(0x5A869A + 2, &bottomMargin);

// As we now scale everything on PrintString time, the resolution height checks need to be unscaled.
Patch(0x5A8660 + 2, &FIXED_RES_HEIGHT_SCALE);
Patch(0x5AF8C9 + 2, &FIXED_RES_HEIGHT_SCALE);
}


#ifndef NDEBUG
if ( const int QPCDays = GetPrivateProfileIntW(L"Debug", L"AddDaysToQPC", 0, wcModulePath); QPCDays != 0 )
{
Expand Down Expand Up @@ -5289,6 +5313,46 @@ BOOL InjectDelayedPatches_NewBinaries()
TXN_CATCH();


// Fix credits not scaling to resolution
// Moved here for compatibility with wshps.asi
try
{
using namespace CreditsScalingFixes;

// Verify wshps.asi isn't already patching the credits
(void)get_pattern("DE C2 D9 45 18 DE EA", 1);

std::array<void*, 2> creditPrintString = {
get_pattern("E8 ? ? ? ? 83 C4 0C 80 7D 1C 00"),
get_pattern("D9 1C 24 E8 ? ? ? ? DD 05 ? ? ? ? 83 C4 0C 5E", 3),
};

auto setScale = get_pattern("D9 1C 24 E8 ? ? ? ? 83 C4 08 68 FF 00 00 00 6A 00 6A 00 6A 00", 3);

// Fix the credits cutting off on the bottom early, they don't do that in III
// but it regressed in VC and SA
auto positionOffset = get_pattern("DE C2 D9 45 18 DE EA D9 C9 D9 5D 14 D9 05", 12 + 2);

// As we now scale everything on PrintString time, the resolution height checks need to be unscaled.
void* resHeightScales[] = {
get_pattern("DB 05 ? ? ? ? 57 8B 7D 14", 2),
get_pattern("A1 ? ? ? ? 03 45 FC 89 45 F4", 1)
};

static const float topMargin = 1.0f;
Patch(positionOffset, &topMargin);

HookEach_PrintString(creditPrintString, InterceptCall);
InterceptCall(setScale, orgSetScale, SetScale_ScaleToRes);

for (void* addr : resHeightScales)
{
Patch(addr, &FIXED_RES_HEIGHT_SCALE);
}
}
TXN_CATCH();


return FALSE;
}
return TRUE;
Expand Down Expand Up @@ -6356,29 +6420,6 @@ void Patch_SA_10(HINSTANCE hInstance)
}


// Fix credits not scaling to resolution
{
using namespace CreditsScalingFixes;

std::array<uintptr_t, 2> creditPrintString = { 0x5A8707, 0x5A8785 };

HookEach_PrintString(creditPrintString, InterceptCall);
InterceptCall(0x5A86C0, orgSetScale, SetScale_ScaleToRes);

// Fix the credits cutting off on the bottom early, they don't do that in III
// but it regressed in VC and SA
static const float topMargin = 1.0f;
static const float bottomMargin = -(**(float**)(0x5A869A + 2));

Patch(0x5A8689 + 2, &topMargin);
Patch(0x5A869A + 2, &bottomMargin);

// As we now scale everything on PrintString time, the resolution height checks need to be unscaled.
Patch(0x5A8660 + 2, &FIXED_RES_HEIGHT_SCALE);
Patch(0x5AF8C9 + 2, &FIXED_RES_HEIGHT_SCALE);
}


// Fix some big messages staying on screen longer at high resolutions due to a cut sliding text feature
// Also since we're touching it, optionally allow to re-enable this feature.
{
Expand Down Expand Up @@ -8509,40 +8550,6 @@ void Patch_SA_NewBinaries_Common(HINSTANCE hInstance)
TXN_CATCH();


// Fix credits not scaling to resolution
{
using namespace CreditsScalingFixes;

std::array<void*, 2> creditPrintString = {
get_pattern("E8 ? ? ? ? 83 C4 0C 80 7D 1C 00"),
get_pattern("D9 1C 24 E8 ? ? ? ? DD 05 ? ? ? ? 83 C4 0C 5E", 3),
};

auto setScale = get_pattern("D9 1C 24 E8 ? ? ? ? 83 C4 08 68 FF 00 00 00 6A 00 6A 00 6A 00", 3);

// Fix the credits cutting off on the bottom early, they don't do that in III
// but it regressed in VC and SA
auto positionOffset = get_pattern("DE C2 D9 45 18 DE EA D9 C9 D9 5D 14 D9 05", 12 + 2);

// As we now scale everything on PrintString time, the resolution height checks need to be unscaled.
void* resHeightScales[] = {
get_pattern("DB 05 ? ? ? ? 57 8B 7D 14", 2),
get_pattern("A1 ? ? ? ? 03 45 FC 89 45 F4", 1)
};

static const float topMargin = 1.0f;
Patch(positionOffset, &topMargin);

HookEach_PrintString(creditPrintString, InterceptCall);
InterceptCall(setScale, orgSetScale, SetScale_ScaleToRes);

for (void* addr : resHeightScales)
{
Patch(addr, &FIXED_RES_HEIGHT_SCALE);
}
}


// Fix some big messages staying on screen longer at high resolutions due to a cut sliding text feature
// Also since we're touching it, optionally allow to re-enable this feature.
try
Expand Down

0 comments on commit 50c3a47

Please sign in to comment.