Fixed the previous commit (conflict with INVENWIELD hook)

Moved some option codes from MiscPatches.cpp to other modules.

Removed CorpseLineOfFireFix from ddraw.ini (always enabled).
This commit is contained in:
NovaRain
2019-10-31 11:28:05 +08:00
parent c348925c95
commit 521b6c7e08
9 changed files with 142 additions and 148 deletions
-3
View File
@@ -384,9 +384,6 @@ AlwaysReloadMsgs=0
;Set to 1 to force the player to play the idle animation when reloading their weapon
PlayIdleAnimOnReload=0
;Set to 1 to prevent corpses from blocking line of fire
CorpseLineOfFireFix=1
;Changes the timer (in days) for deleting corpses on a map after you leave (valid range: 0..13)
;The corpses of critters with 'Ages' flag or on maps with 'dead_bodies_age=No' set in maps.txt will not disappear
;Default is 6. Set to 0 for a 12-hour timer
+3 -1
View File
@@ -61,6 +61,8 @@ static std::vector<HackPair> hackAddr = {
// module: ExtraSave
//{0x47B923, 6},
// module: Inventory
// module: Interface
{0x460BB6, 4},
// module: LoadOrder
{0x43FA9F, 4}, {0x44EB5B, 4}, {0x48152E, 4},
//{0x480A95, 5}, (it in movies.cpp)
@@ -105,7 +107,7 @@ static std::vector<HackPair> hackAddr = {
{0x4C2D9B, 4}, {0x499FDE, 4},
{0x49952C, 1}, {0x497557, 1}, {0x42E587, 1}, {0x42E588, 4}, {0x499FD4, 2}, {0x499E93, 2},
// module: MiscPatches
{0x460BB6, 4}, {0x41276A, 1}, {0x480AAA, 4}, {0x444BA5, 4}, {0x444BCA, 4},
{0x41276A, 1}, {0x480AAA, 4}, {0x444BA5, 4}, {0x444BCA, 4},
};
//static std::vector<long> jumpAddr = {
+52 -4
View File
@@ -387,6 +387,15 @@ static void __declspec(naked) queue_clear_type_mem_free_hook() {
}
}
static void __declspec(naked) partyMemberCopyLevelInfo_hack() {
__asm {
mov eax, esi; // source
xor ecx, ecx; // animation
mov ebx, 1; // right slot
retn;
}
}
static void __declspec(naked) partyMemberCopyLevelInfo_hook_stat_level() {
__asm {
nextArmor:
@@ -2415,10 +2424,41 @@ end:
}
}
static void __declspec(naked) partyMemberCopyLevelInfo_hook_wield() {
static const DWORD CorpseShotBlockFix_continue_loop[] = {0x48B99B, 0x48BA0B};
static void __declspec(naked) obj_shoot_blocking_at_hack0() {
__asm {
inc ebx; // slot
jmp fo::funcoffs::invenWieldFunc_;
mov edx, eax;
mov eax, [eax];
call fo::funcoffs::critter_is_dead_; // found some object, check if it's a dead critter
test eax, eax;
jz endLoop; // if not, allow breaking the loop (will return this object)
mov eax, edx;
jmp CorpseShotBlockFix_continue_loop[0]; // otherwise continue searching
endLoop:
mov eax, [edx];
pop ebp;
pop edi;
pop esi;
pop ecx;
retn;
}
}
// same logic as above, for different loop
static void __declspec(naked) obj_shoot_blocking_at_hack1() {
__asm {
mov eax, [edx];
call fo::funcoffs::critter_is_dead_;
test eax, eax;
jz endLoop;
jmp CorpseShotBlockFix_continue_loop[1];
endLoop:
mov eax, [edx];
pop ebp;
pop edi;
pop esi;
pop ecx;
retn;
}
}
@@ -3052,8 +3092,16 @@ void BugFixes::init()
HookCall(0x458CDB, op_critter_rm_trait_hook);
HookCall(0x458B3D, op_critter_add_trait_hook);
// Fix to prevent corpses from blocking line of fire
//if (GetConfigInt("Misc", "CorpseLineOfFireFix", 1)) {
dlog("Applying fix for corpses blocking line of fire.", DL_INIT);
MakeJump(0x48B994, obj_shoot_blocking_at_hack0);
MakeJump(0x48BA04, obj_shoot_blocking_at_hack1);
dlogr(" Done", DL_INIT);
//}
// Fix for party member's equipped weapon being placed in the incorrect item slot after leveling up
HookCall(0x495FDF, partyMemberCopyLevelInfo_hook_wield);
MakeCall(0x495FD9, partyMemberCopyLevelInfo_hack, 1);
}
}
+2 -2
View File
@@ -336,7 +336,7 @@ static void __declspec(naked) win_debug_hook() {
}
}
void DebugModePatch() {
static void DebugModePatch() {
DWORD dbgMode = iniGetInt("Debugging", "DebugMode", 0, ::sfall::ddrawIni);
if (dbgMode) {
dlog("Applying debugmode patch.", DL_INIT);
@@ -369,7 +369,7 @@ void DebugModePatch() {
}
}
void DontDeleteProtosPatch() {
static void DontDeleteProtosPatch() {
if (iniGetInt("Debugging", "DontDeleteProtos", 0, ::sfall::ddrawIni)) {
dlog("Applying permanent protos patch.", DL_INIT);
SafeWrite8(0x48007E, 0xEB);
+41
View File
@@ -476,12 +476,53 @@ static void WorldMapInterfacePatch() {
SafeWrite8(0x4C5289, 12);
}
static void __declspec(naked) intface_rotate_numbers_hack() {
__asm {
push edi;
push ebp;
sub esp, 0x54;
mov edi, 0x460BA6;
// ebx - old value, ecx - new value
cmp ebx, ecx;
je end;
mov ebx, ecx;
jg decrease;
dec ebx;
end:
jmp edi;
decrease:
test ecx, ecx;
jl negative;
inc ebx;
jmp edi;
negative:
xor ebx, ebx;
jmp edi;
}
}
static void SpeedInterfaceCounterAnimsPatch() {
switch (GetConfigInt("Misc", "SpeedInterfaceCounterAnims", 0)) {
case 1:
dlog("Applying SpeedInterfaceCounterAnims patch.", DL_INIT);
MakeJump(0x460BA1, intface_rotate_numbers_hack);
dlogr(" Done", DL_INIT);
break;
case 2:
dlog("Applying SpeedInterfaceCounterAnims patch (Instant).", DL_INIT);
SafeWrite32(0x460BB6, 0xDB319090); // xor ebx, ebx
dlogr(" Done", DL_INIT);
break;
}
}
void Interface::init() {
if (GetConfigInt("Interface", "ActionPointsBar", 0)) {
ActionPointsBarPatch();
}
WorldMapInterfacePatch();
SpeedInterfaceCounterAnimsPatch();
}
void Interface::exit() {
+2 -2
View File
@@ -77,7 +77,7 @@ void Karma::DisplayKarma(int value) {
fo::func::display_print(buf);
}
void ApplyDisplayKarmaChangesPatch() {
static void ApplyDisplayKarmaChangesPatch() {
displayKarmaChanges = GetConfigInt("Misc", "DisplayKarmaChanges", 0) != 0;
if (displayKarmaChanges) {
dlog("Applying display karma changes patch.", DL_INIT);
@@ -88,7 +88,7 @@ void ApplyDisplayKarmaChangesPatch() {
}
}
void ApplyKarmaFRMsPatch() {
static void ApplyKarmaFRMsPatch() {
auto karmaFrmList = GetConfigList("Misc", "KarmaFRMs", "", 512);
size_t countFrm = karmaFrmList.size();
if (countFrm) {
+10
View File
@@ -227,6 +227,15 @@ static void GetExtraPatches() {
}
}
static void MultiPatchesPatch() {
//if (GetConfigInt("Misc", "MultiPatches", 0)) {
dlog("Applying load multiple patches patch.", DL_INIT);
SafeWrite8(0x444354, 0x90); // Change step from 2 to 1
SafeWrite8(0x44435C, 0xC4); // Disable check
dlogr(" Done", DL_INIT);
//}
}
////////////////////////////// SAVE PARTY MEMBER PROTOTYPES //////////////////////////////
static void __fastcall AddSavPrototype(long pid) {
@@ -370,6 +379,7 @@ void LoadOrder::init() {
patchFiles.push_back("sfall.dat");
GetExtraPatches();
MultiPatchesPatch();
if (GetConfigInt("Misc", "DataLoadOrderPatch", 1)) {
dlog("Applying data load order patch.", DL_INIT);
+1 -105
View File
@@ -71,31 +71,6 @@ c15:
}
}
static void __declspec(naked) intface_rotate_numbers_hack() {
__asm {
push edi
push ebp
sub esp, 0x54
// ebx=old value, ecx=new value
cmp ebx, ecx
je end
mov ebx, ecx
jg decrease
dec ebx
jmp end
decrease:
test ecx, ecx
jl negative
inc ebx
jmp end
negative:
xor ebx, ebx
end:
push 0x460BA6
retn
}
}
static void __declspec(naked) register_object_take_out_hack() {
__asm {
push ecx
@@ -165,48 +140,6 @@ static void __declspec(naked) ReloadHook() {
}
}
static const DWORD CorpseHitFix2_continue_loop1 = 0x48B99B;
static void __declspec(naked) CorpseHitFix2() {
__asm {
push eax;
mov eax, [eax];
call fo::funcoffs::critter_is_dead_; // found some object, check if it's a dead critter
test eax, eax;
pop eax;
jz really_end; // if not, allow breaking the loop (will return this object)
jmp CorpseHitFix2_continue_loop1; // otherwise continue searching
really_end:
mov eax, [eax];
pop ebp;
pop edi;
pop esi;
pop ecx;
retn;
}
}
static const DWORD CorpseHitFix2_continue_loop2 = 0x48BA0B;
// same logic as above, for different loop
static void __declspec(naked) CorpseHitFix2b() {
__asm {
mov eax, [edx];
call fo::funcoffs::critter_is_dead_;
test eax, eax;
jz really_end;
jmp CorpseHitFix2_continue_loop2;
really_end:
mov eax, [edx];
pop ebp;
pop edi;
pop esi;
pop ecx;
retn;
}
}
static const DWORD ScannerHookRet = 0x41BC1D;
static const DWORD ScannerHookFail = 0x41BC65;
static void __declspec(naked) ScannerAutomapHook() {
@@ -386,21 +319,6 @@ void SkilldexImagesPatch() {
dlogr(" Done", DL_INIT);
}
void SpeedInterfaceCounterAnimsPatch() {
switch (GetConfigInt("Misc", "SpeedInterfaceCounterAnims", 0)) {
case 1:
dlog("Applying SpeedInterfaceCounterAnims patch.", DL_INIT);
MakeJump(0x460BA1, intface_rotate_numbers_hack);
dlogr(" Done", DL_INIT);
break;
case 2:
dlog("Applying SpeedInterfaceCounterAnims patch. (Instant)", DL_INIT);
SafeWrite32(0x460BB6, 0x90DB3190); // xor ebx, ebx
dlogr(" Done", DL_INIT);
break;
}
}
void ScienceOnCrittersPatch() {
switch (GetConfigInt("Misc", "ScienceOnCritters", 0)) {
case 1:
@@ -465,15 +383,6 @@ void DontTurnOffSneakIfYouRunPatch() {
}
}
void MultiPatchesPatch() {
//if (GetConfigInt("Misc", "MultiPatches", 0)) {
dlog("Applying load multiple patches patch.", DL_INIT);
SafeWrite8(0x444354, 0x90); // Change step from 2 to 1
SafeWrite8(0x44435C, 0xC4); // Disable check
dlogr(" Done", DL_INIT);
//}
}
void PlayIdleAnimOnReloadPatch() {
if (GetConfigInt("Misc", "PlayIdleAnimOnReload", 0)) {
dlog("Applying idle anim on reload patch.", DL_INIT);
@@ -482,15 +391,6 @@ void PlayIdleAnimOnReloadPatch() {
}
}
void CorpseLineOfFireFix() {
if (GetConfigInt("Misc", "CorpseLineOfFireFix", 1)) {
dlog("Applying corpse line of fire patch.", DL_INIT);
MakeJump(0x48B994, CorpseHitFix2);
MakeJump(0x48BA04, CorpseHitFix2b);
dlogr(" Done", DL_INIT);
}
}
void MotionScannerFlagsPatch() {
DWORD flags;
if (flags = GetConfigInt("Misc", "MotionScannerFlags", 1)) {
@@ -597,8 +497,7 @@ void PipboyAvailableAtStartPatch() {
switch (GetConfigInt("Misc", "PipBoyAvailableAtGameStart", 0)) {
case 1:
LoadGameHook::OnBeforeGameStart() += []() {
// PipBoy aquiring video
fo::var::gmovie_played_list[3] = true;
fo::var::gmovie_played_list[3] = true; // PipBoy aquiring video
};
break;
case 2:
@@ -763,14 +662,11 @@ void MiscPatches::init() {
F1EngineBehaviorPatch();
DialogueFix();
AdditionalWeaponAnimsPatch();
MultiPatchesPatch();
AlwaysReloadMsgs();
PlayIdleAnimOnReloadPatch();
CorpseLineOfFireFix();
SkilldexImagesPatch();
SpeedInterfaceCounterAnimsPatch();
ScienceOnCrittersPatch();
InventoryCharacterRotationSpeedPatch();