Moved the Combat Block patch from AI.cpp to new CombatBlocked.cpp

Added filter folders for the project files.

Updated credits.

Correction on ddraw.ini.
This commit is contained in:
NovaRain
2020-01-10 10:42:06 +08:00
parent fece180f0b
commit 9dea6911a6
11 changed files with 235 additions and 163 deletions
+2 -2
View File
@@ -124,12 +124,12 @@ WorldMapTravelMarkers=0
;Uncomment these lines to change the appearance of the markers
;The color index in Fallout default palette (valid range: 1..255; default is 134)
;TravelMarkerColor=134
;The lengh of the dots in pixels (valid range: 1..10)
;The length of the dots in pixels (valid range: 1..10)
;TravelMarkerLength=2
;The spacing between the dots in pixels (valid range: 1..10)
;TravelMarkerSpaces=2
;Set to 1 to display terrain types when moving the cursor over the green triangle on the world map
;Set to 1 to display terrain types when hovering the cursor over the player's marker on the world map
WorldMapTerrainInfo=0
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+5 -58
View File
@@ -30,8 +30,6 @@ namespace sfall
using namespace fo;
using namespace Fields;
typedef std::unordered_map<fo::GameObject*, fo::GameObject*>::const_iterator iter;
static std::unordered_map<fo::GameObject*, fo::GameObject*> targets;
static std::unordered_map<fo::GameObject*, fo::GameObject*> sources;
@@ -193,75 +191,24 @@ static void __fastcall CombatAttackHook(fo::GameObject* source, fo::GameObject*
static void __declspec(naked) combat_attack_hook() {
__asm {
push eax;
push ecx;
push edx;
push eax;
mov ecx, eax; // source
call CombatAttackHook; // edx - target
pop edx;
pop ecx;
pop eax;
pop edx;
pop ecx;
jmp fo::funcoffs::combat_attack_;
}
}
static DWORD combatDisabled;
void __stdcall AIBlockCombat(DWORD i) {
combatDisabled = i ? 1 : 0;
}
static std::string combatBlockedMessage;
static void _stdcall CombatBlocked() {
fo::func::display_print(combatBlockedMessage.c_str());
}
static const DWORD BlockCombatHook1Ret1 = 0x45F6B4;
static const DWORD BlockCombatHook1Ret2 = 0x45F6D7;
static void __declspec(naked) BlockCombatHook1() {
__asm {
mov eax, combatDisabled;
test eax, eax;
jz end;
call CombatBlocked;
jmp BlockCombatHook1Ret2;
end:
mov eax, 0x14;
jmp BlockCombatHook1Ret1;
}
}
static void __declspec(naked) BlockCombatHook2() {
__asm {
mov eax, dword ptr ds:[FO_VAR_intfaceEnabled];
test eax, eax;
jz end;
mov eax, combatDisabled;
test eax, eax;
jz succeed;
push ecx;
push edx;
call CombatBlocked;
pop edx;
pop ecx;
xor eax, eax;
retn;
succeed:
inc eax;
end:
retn;
}
}
void AI::init() {
HookCalls(combat_attack_hook, {
0x426A95, // combat_attack_this_
0x42A796 // ai_attack_
});
MakeJump(0x45F6AF, BlockCombatHook1); // intface_use_item_
HookCall(0x4432A6, BlockCombatHook2); // game_handle_input_
combatBlockedMessage = Translate("sfall", "BlockedCombat", "You cannot enter combat at this time.");
RetryCombatMinAP = GetConfigInt("Misc", "NPCsTryToSpendExtraAP", 0);
if (RetryCombatMinAP > 0) {
dlog("Applying retry combat patch.", DL_INIT);
@@ -289,12 +236,12 @@ void AI::init() {
}
fo::GameObject* _stdcall AIGetLastAttacker(fo::GameObject* target) {
iter itr = sources.find(target);
const auto itr = sources.find(target);
return (itr != sources.end()) ? itr->second : 0;
}
fo::GameObject* _stdcall AIGetLastTarget(fo::GameObject* source) {
iter itr = targets.find(source);
const auto itr = targets.find(source);
return (itr != targets.end()) ? itr->second : 0;
}
+1 -3
View File
@@ -22,7 +22,7 @@
#include "Module.h"
namespace sfall
namespace sfall
{
class AI : public Module {
@@ -38,6 +38,4 @@ void _stdcall AICombatEnd();
fo::GameObject* _stdcall AIGetLastAttacker(fo::GameObject* target);
fo::GameObject* _stdcall AIGetLastTarget(fo::GameObject* source);
void _stdcall AIBlockCombat(DWORD i);
}
+3
View File
@@ -25,6 +25,8 @@
#include "LoadGameHook.h"
#include "Objects.h"
#include "SubModules\CombatBlock.h"
#include "Combat.h"
namespace sfall
@@ -480,6 +482,7 @@ static void Combat_OnGameLoad() {
}
void Combat::init() {
CombatBlockedInit();
CombatProcFix();
MakeCall(0x424B76, compute_damage_hack, 2); // KnockbackMod
+1
View File
@@ -70,6 +70,7 @@ static const char* ExtraLines[] = {
"Continuum",
"Drobovik",
"Burn",
"Lexx",
"Anyone who has used sfall in their own mods",
"The bug reporters and feature requesters",
"",
+3 -1
View File
@@ -35,6 +35,8 @@
#include "..\Arrays.h"
#include "..\OpcodeContext.h"
#include "..\..\SubModules\CombatBlock.h"
#include "Misc.h"
namespace sfall
@@ -928,7 +930,7 @@ void __declspec(naked) op_block_combat() {
mov esi, ecx;
_GET_ARG_INT(end);
push eax;
call AIBlockCombat;
call SetBlockCombat;
end:
mov ecx, esi;
retn;
+5 -3
View File
@@ -39,11 +39,13 @@ static bool FalloutStringCompare(const char* str1, const char* str2, long codePa
while (true) {
unsigned char c1 = *str1;
unsigned char c2 = *str2;
if (c1 == 0 && c2 == 0) return true; // end - strings are equal
if (c1 == 0 || c2 == 0) return false; // strings are not equal
str1++;
str2++;
if (c1 == c2) continue;
if (codePage == 866) {
// replace Russian 'x' to English (Fallout specific)
if (c1 == 229) c1 -= 229 - 'x';
@@ -60,16 +62,16 @@ static bool FalloutStringCompare(const char* str1, const char* str2, long codePa
// 128 - 255 (international/extended)
switch (codePage) {
case 866:
if (c1 != 149 && c2 != 149) { // code used for the 'bullet' character in Fallout font
if (c1 != 149 && c2 != 149) { // code used for the 'bullet' character in Fallout font (the Russian letter 'X' uses Latin letter)
// upper to lower case
if (c1 >= 0x80 && c1 <= 0x9F) {
if (c1 >= 128 && c1 <= 159) {
c1 |= 32;
} else if (c1 >= 224 && c1 <= 239) {
c1 -= 48; // shift lower range
} else if (c1 == 240) {
c1++;
}
if (c2 >= 0x80 && c2 <= 0x9F) {
if (c2 >= 128 && c2 <= 159) {
c2 |= 32;
} else if (c2 >= 224 && c2 <= 239) {
c2 -= 48; // shift lower range
+74
View File
@@ -0,0 +1,74 @@
/*
* sfall
* Copyright (C) 2008-2020 The sfall team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "..\..\main.h"
#include "..\..\FalloutEngine\Fallout2.h"
#include "CombatBlock.h"
namespace sfall
{
static bool combatDisabled;
static std::string combatBlockedMessage;
static void __stdcall CombatBlocked() {
fo::func::display_print(combatBlockedMessage.c_str());
}
static const DWORD BlockCombatHook1Ret1 = 0x45F6AF;
static const DWORD BlockCombatHook1Ret2 = 0x45F6D7;
static void __declspec(naked) intface_use_item_hook() {
__asm {
cmp combatDisabled, 0;
jne block;
jmp BlockCombatHook1Ret1;
block:
call CombatBlocked;
jmp BlockCombatHook1Ret2;
}
}
static void __declspec(naked) game_handle_input_hook() {
__asm {
mov eax, dword ptr ds:[FO_VAR_intfaceEnabled];
test eax, eax;
jz end;
cmp combatDisabled, 0; // eax = 1
je end; // no blocked
push edx;
call CombatBlocked;
pop edx;
xor eax, eax;
end:
retn;
}
}
void __stdcall SetBlockCombat(long toggle) {
combatDisabled = toggle != 0;
}
void CombatBlockedInit() {
HookCall(0x45F626, intface_use_item_hook); // jnz hook
HookCall(0x4432A6, game_handle_input_hook);
combatBlockedMessage = Translate("sfall", "BlockedCombat", "You cannot enter combat at this time.");
}
}
+28
View File
@@ -0,0 +1,28 @@
/*
* sfall
* Copyright (C) 2008-2020 The sfall team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
namespace sfall
{
void CombatBlockedInit();
void __stdcall SetBlockCombat(long toggle);
}
+2
View File
@@ -313,6 +313,7 @@
<ClInclude Include="Modules\Objects.h" />
<ClInclude Include="Modules\PlayerModel.h" />
<ClInclude Include="Modules\SpeedPatch.h" />
<ClInclude Include="Modules\SubModules\CombatBlock.h" />
<ClInclude Include="Modules\Worldmap.h" />
<ClInclude Include="Modules\ScriptExtender.h" />
<ClInclude Include="Modules\BarBoxes.h" />
@@ -405,6 +406,7 @@
<ClCompile Include="Modules\Objects.cpp" />
<ClCompile Include="Modules\PlayerModel.cpp" />
<ClCompile Include="Modules\SpeedPatch.cpp" />
<ClCompile Include="Modules\SubModules\CombatBlock.cpp" />
<ClCompile Include="Modules\Worldmap.cpp" />
<ClCompile Include="Modules\ScriptExtender.cpp" />
<ClCompile Include="Modules\BarBoxes.cpp" />
+111 -96
View File
@@ -16,6 +16,15 @@
<Filter Include="Modules\HookScripts">
<UniqueIdentifier>{1e66856c-4830-4ca0-a998-15b697208223}</UniqueIdentifier>
</Filter>
<Filter Include="Modules\SubModules">
<UniqueIdentifier>{023f674e-f534-4889-af91-c5f1ef3a8913}</UniqueIdentifier>
</Filter>
<Filter Include="Modules\Features">
<UniqueIdentifier>{f35af494-a226-4c24-9ac2-9876f46b7a6b}</UniqueIdentifier>
</Filter>
<Filter Include="Modules\SimplePatches">
<UniqueIdentifier>{66d430dc-ddd0-41e3-a13d-bf1d5a1a1064}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="main.h" />
@@ -31,15 +40,6 @@
<ClInclude Include="Modules\Books.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\BurstMods.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Console.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Credits.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Criticals.h">
<Filter>Modules</Filter>
</ClInclude>
@@ -55,24 +55,15 @@
<ClInclude Include="Modules\FileSystem.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\HeroAppearance.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\HookScripts.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Inventory.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\KillCounter.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\LoadGameHook.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\MainMenu.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Message.h">
<Filter>Modules</Filter>
</ClInclude>
@@ -82,21 +73,9 @@
<ClInclude Include="Modules\Perks.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Premade.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\QuestList.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Reputations.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Stats.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Tiles.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="resource.h" />
<ClInclude Include="Logging.h" />
<ClInclude Include="SafeWrite.h" />
@@ -109,9 +88,6 @@
<ClInclude Include="Modules\Skills.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Sound.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\ScriptExtender.h">
<Filter>Modules</Filter>
</ClInclude>
@@ -192,30 +168,15 @@
<ClInclude Include="SimplePatch.h" />
<ClInclude Include="ModuleManager.h" />
<ClInclude Include="Delegate.h" />
<ClInclude Include="Modules\Karma.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\LoadOrder.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\SpeedPatch.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Worldmap.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\BugFixes.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\TalkingHeads.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\PlayerModel.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\ExtraSaveSlots.h">
<Filter>Modules</Filter>
</ClInclude>
<ClInclude Include="Modules\Input.h">
<Filter>Modules</Filter>
</ClInclude>
@@ -286,6 +247,57 @@
</ClInclude>
<ClInclude Include="CRC.h" />
<ClInclude Include="CheckAddress.h" />
<ClInclude Include="Modules\SubModules\CombatBlock.h">
<Filter>Modules\SubModules</Filter>
</ClInclude>
<ClInclude Include="Modules\PlayerModel.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\Premade.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\Reputations.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\Tiles.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\SpeedPatch.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\Sound.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\BurstMods.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\Console.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\Credits.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\Karma.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\KillCounter.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\MainMenu.h">
<Filter>Modules\SimplePatches</Filter>
</ClInclude>
<ClInclude Include="Modules\HeroAppearance.h">
<Filter>Modules\Features</Filter>
</ClInclude>
<ClInclude Include="Modules\ExtraSaveSlots.h">
<Filter>Modules\Features</Filter>
</ClInclude>
<ClInclude Include="Modules\QuestList.h">
<Filter>Modules\Features</Filter>
</ClInclude>
<ClInclude Include="Modules\TalkingHeads.h">
<Filter>Modules\Features</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
@@ -301,15 +313,6 @@
<ClCompile Include="Modules\Books.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\BurstMods.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Console.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Credits.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Criticals.cpp">
<Filter>Modules</Filter>
</ClCompile>
@@ -325,24 +328,15 @@
<ClCompile Include="Modules\FileSystem.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\HeroAppearance.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\HookScripts.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Inventory.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\KillCounter.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\LoadGameHook.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\MainMenu.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Message.cpp">
<Filter>Modules</Filter>
</ClCompile>
@@ -352,21 +346,9 @@
<ClCompile Include="Modules\Perks.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Premade.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\QuestList.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Reputations.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Stats.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Tiles.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="ddraw.cpp" />
<ClCompile Include="Logging.cpp" />
<ClCompile Include="SafeWrite.cpp" />
@@ -379,9 +361,6 @@
<ClCompile Include="Modules\Skills.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Sound.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\ScriptExtender.cpp">
<Filter>Modules</Filter>
</ClCompile>
@@ -447,30 +426,15 @@
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="ModuleManager.cpp" />
<ClCompile Include="Modules\Karma.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\LoadOrder.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\SpeedPatch.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Worldmap.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\BugFixes.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\TalkingHeads.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\PlayerModel.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\ExtraSaveSlots.cpp">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="Modules\Input.cpp">
<Filter>Modules</Filter>
</ClCompile>
@@ -532,6 +496,57 @@
</ClCompile>
<ClCompile Include="CRC.cpp" />
<ClCompile Include="CheckAddress.cpp" />
<ClCompile Include="Modules\PlayerModel.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\Premade.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\Reputations.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\Tiles.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\SpeedPatch.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\Sound.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\BurstMods.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\Console.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\Credits.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\Karma.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\KillCounter.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\MainMenu.cpp">
<Filter>Modules\SimplePatches</Filter>
</ClCompile>
<ClCompile Include="Modules\HeroAppearance.cpp">
<Filter>Modules\Features</Filter>
</ClCompile>
<ClCompile Include="Modules\ExtraSaveSlots.cpp">
<Filter>Modules\Features</Filter>
</ClCompile>
<ClCompile Include="Modules\QuestList.cpp">
<Filter>Modules\Features</Filter>
</ClCompile>
<ClCompile Include="Modules\TalkingHeads.cpp">
<Filter>Modules\Features</Filter>
</ClCompile>
<ClCompile Include="Modules\SubModules\CombatBlock.cpp">
<Filter>Modules\SubModules</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="version.rc" />