mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Fully implemented the new ai_check_drugs function
Added an additional 'Healing Item' flag to ext flags for item protos. Added new EngineTweaks files and TweaksFile option. Internal fix for HOOK_REMOVEINVENOBJ.
This commit is contained in:
@@ -0,0 +1,13 @@
|
|||||||
|
;Game engine tweaks
|
||||||
|
|
||||||
|
[Main]
|
||||||
|
|
||||||
|
|
||||||
|
[Items]
|
||||||
|
;Override the PIDs of the standard healing drugs that AI will use in combat
|
||||||
|
;Set to -1 if you don't want AI to identify this item as a healing drug
|
||||||
|
;Note: Starting from sfall 4.3.1/3.8.31, you can set a new flag (FlagsExt: 0x04000000)
|
||||||
|
;in the proto for other items, so AI will use them for healing in combat as well
|
||||||
|
STIMPAK=40
|
||||||
|
SUPER_STIMPAK=144
|
||||||
|
HEALING_POWDER=237
|
||||||
+7
-2
@@ -444,7 +444,7 @@ NPCsTryToSpendExtraAP=0
|
|||||||
;Note that enabling this option can affect the weapon of choice for some NPCs
|
;Note that enabling this option can affect the weapon of choice for some NPCs
|
||||||
AIBestWeaponFix=1
|
AIBestWeaponFix=1
|
||||||
|
|
||||||
;Set to 1 to fix NPCs not taking chem_primary_desire in AI.txt as drug use preference when using drugs in their inventory
|
;Set to 1 to fix NPCs not taking chem_primary_desire in AI.txt as a preference list when using drugs in their inventory
|
||||||
;Set to 2 to allow NPCs to use only the drugs listed in chem_primary_desire and healing drugs (stimpaks and healing powder)
|
;Set to 2 to allow NPCs to use only the drugs listed in chem_primary_desire and healing drugs (stimpaks and healing powder)
|
||||||
;Note: chem_primary_desire w/o fixes prevents the specified item PID from being consumed if all three values in the list are the same PID
|
;Note: chem_primary_desire w/o fixes prevents the specified item PID from being consumed if all three values in the list are the same PID
|
||||||
;chem_primary_desire also works as a priority list of drug items the NPC will try to pick up in combat when they are on the ground
|
;chem_primary_desire also works as a priority list of drug items the NPC will try to pick up in combat when they are on the ground
|
||||||
@@ -782,7 +782,8 @@ CreditsAtBottom=0
|
|||||||
;Point the next line to an ini file containing the replacement skill data
|
;Point the next line to an ini file containing the replacement skill data
|
||||||
;SkillsFile=sfall\Skills.ini
|
;SkillsFile=sfall\Skills.ini
|
||||||
|
|
||||||
;To add additional perks to the game, uncomment the next line and set it to point to a file containing perk information
|
;To add additional perks to the game, uncomment the next line and point to a file containing perk information
|
||||||
|
;See the Perks.ini in the modders pack for an example file
|
||||||
;PerksFile=sfall\Perks.ini
|
;PerksFile=sfall\Perks.ini
|
||||||
|
|
||||||
;To add additional books to the game, uncomment the next line and point to a file containing book information
|
;To add additional books to the game, uncomment the next line and point to a file containing book information
|
||||||
@@ -792,6 +793,10 @@ CreditsAtBottom=0
|
|||||||
;Point to an ini file containing elevator data
|
;Point to an ini file containing elevator data
|
||||||
;ElevatorsFile=sfall\Elevators.ini
|
;ElevatorsFile=sfall\Elevators.ini
|
||||||
|
|
||||||
|
;Allows you to change some engine parameters for the game mechanics
|
||||||
|
;See the Tweaks.ini in the modders pack for an example file
|
||||||
|
;TweaksFile=sfall\Tweaks.ini
|
||||||
|
|
||||||
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||||
[Debugging]
|
[Debugging]
|
||||||
;Extra sfall configuration settings that can be used by modders
|
;Extra sfall configuration settings that can be used by modders
|
||||||
|
|||||||
+15
-13
@@ -103,28 +103,30 @@ static void __declspec(naked) ai_try_attack_hook_runFix() {
|
|||||||
static void __declspec(naked) combat_ai_hack() {
|
static void __declspec(naked) combat_ai_hack() {
|
||||||
static const DWORD combat_ai_hack_Ret = 0x42B204;
|
static const DWORD combat_ai_hack_Ret = 0x42B204;
|
||||||
__asm {
|
__asm {
|
||||||
mov edx, [ebx + 0x10]; // cap.min_hp
|
mov edx, [ebx + 0x10]; // cap.min_hp
|
||||||
cmp eax, edx;
|
cmp eax, edx;
|
||||||
jl tryHeal; // curr_hp < min_hp
|
jl tryHeal; // curr_hp < min_hp
|
||||||
end:
|
end:
|
||||||
add esp, 4;
|
add esp, 4;
|
||||||
jmp combat_ai_hack_Ret;
|
jmp combat_ai_hack_Ret; // jump to call ai_check_drugs_
|
||||||
tryHeal:
|
tryHeal:
|
||||||
mov eax, esi;
|
push ecx;
|
||||||
call ai_check_drugs_;
|
push esi; // mov eax, esi;
|
||||||
cmp [esi + health], edx; // edx - minimum hp, below which NPC will run away
|
call sfgame_ai_check_drugs; // call ai_check_drugs_;
|
||||||
|
pop ecx;
|
||||||
|
cmp [esi + health], edx; // edx - minimum hp, below which NPC will run away
|
||||||
jge end;
|
jge end;
|
||||||
retn; // flee
|
retn; // flee
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __declspec(naked) ai_check_drugs_hook() {
|
/*static void __declspec(naked) ai_check_drugs_hook() {
|
||||||
__asm {
|
__asm {
|
||||||
call stat_level_; // current hp
|
call stat_level_; // current hp
|
||||||
mov edx, dword ptr [esp + 0x34 - 0x1C + 4]; // ai cap
|
mov edx, dword ptr [esp + 0x34 - 0x1C + 4]; // ai cap
|
||||||
mov edx, [edx + 0x10]; // min_hp
|
mov edx, [edx + 0x10]; // min_hp
|
||||||
cmp eax, edx; // curr_hp < cap.min_hp
|
cmp eax, edx; // curr_hp < cap.min_hp
|
||||||
cmovl edi, edx;
|
cmovl edi, edx; // min_hp <- cap.min_hp
|
||||||
retn;
|
retn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -163,7 +165,7 @@ dontUse:
|
|||||||
xor eax, eax;
|
xor eax, eax;
|
||||||
retn;
|
retn;
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -657,12 +659,12 @@ void AI_Init() {
|
|||||||
// Fix to allow fleeing NPC to use drugs
|
// Fix to allow fleeing NPC to use drugs
|
||||||
MakeCall(0x42B1DC, combat_ai_hack);
|
MakeCall(0x42B1DC, combat_ai_hack);
|
||||||
// Fix for AI not checking minimum hp properly for using stimpaks (prevents premature fleeing)
|
// Fix for AI not checking minimum hp properly for using stimpaks (prevents premature fleeing)
|
||||||
HookCall(0x428579, ai_check_drugs_hook);
|
//HookCall(0x428579, ai_check_drugs_hook);
|
||||||
|
|
||||||
// Fix to prevent the use of healing drugs when not necessary
|
// Fix to prevent the use of healing drugs when not necessary
|
||||||
HookCall(0x4287D7, ai_check_drugs_hook_healing);
|
//HookCall(0x4287D7, ai_check_drugs_hook_healing);
|
||||||
SafeWrite8(0x4285A8, 2); // set noInvenItem = 2
|
//SafeWrite8(0x4285A8, 2); // set noInvenItem = 2
|
||||||
SafeWrite8(0x4287A0, 0x8C); // jnz > jl (noInvenItem < 1)
|
//SafeWrite8(0x4287A0, 0x8C); // jnz > jl (noInvenItem < 1)
|
||||||
|
|
||||||
// Fix for NPC stuck in fleeing mode when the hit chance of a target was too low
|
// Fix for NPC stuck in fleeing mode when the hit chance of a target was too low
|
||||||
HookCall(0x42B1E3, combat_ai_hook_FleeFix);
|
HookCall(0x42B1E3, combat_ai_hook_FleeFix);
|
||||||
|
|||||||
+16
-16
@@ -2012,7 +2012,7 @@ skip:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static DWORD firstItemDrug = -1;
|
/*static DWORD firstItemDrug = -1;
|
||||||
|
|
||||||
// when there are no more items in the inventory
|
// when there are no more items in the inventory
|
||||||
static void __declspec(naked) ai_check_drugs_hack_break() {
|
static void __declspec(naked) ai_check_drugs_hack_break() {
|
||||||
@@ -2061,7 +2061,7 @@ skip:
|
|||||||
add esp, 4;
|
add esp, 4;
|
||||||
jmp ai_check_drugs_hack_Loop; // goto begin loop, search next item
|
jmp ai_check_drugs_hack_Loop; // goto begin loop, search next item
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
static void __declspec(naked) cai_cap_save_hook() {
|
static void __declspec(naked) cai_cap_save_hook() {
|
||||||
__asm {
|
__asm {
|
||||||
@@ -3628,20 +3628,20 @@ void BugFixes_Init()
|
|||||||
// Display a pop-up message box about death from radiation
|
// Display a pop-up message box about death from radiation
|
||||||
HookCall(0x42D733, process_rads_hook_msg);
|
HookCall(0x42D733, process_rads_hook_msg);
|
||||||
|
|
||||||
int drugUsePerfFix = GetConfigInt("Misc", "AIDrugUsePerfFix", 0);
|
//int drugUsePerfFix = GetConfigInt("Misc", "AIDrugUsePerfFix", 0);
|
||||||
if (drugUsePerfFix > 0) {
|
//if (drugUsePerfFix > 0) {
|
||||||
dlog("Applying AI drug use preference fix.", DL_FIX);
|
// dlog("Applying AI drug use preference fix.", DL_FIX);
|
||||||
if (drugUsePerfFix == 1) {
|
// if (drugUsePerfFix == 1) {
|
||||||
// Fix for AI not taking chem_primary_desire in AI.txt as a preference list when using drugs in the inventory
|
// // Fix for AI not taking chem_primary_desire in AI.txt as a preference list when using drugs in the inventory
|
||||||
MakeCall(0x42869D, ai_check_drugs_hack_break);
|
// MakeCall(0x42869D, ai_check_drugs_hack_break);
|
||||||
MakeCall(0x4286AB, ai_check_drugs_hack_check, 1);
|
// MakeCall(0x4286AB, ai_check_drugs_hack_check, 1);
|
||||||
MakeCall(0x4286C7, ai_check_drugs_hack_use);
|
// MakeCall(0x4286C7, ai_check_drugs_hack_use);
|
||||||
}
|
// }
|
||||||
// Fix to allow using only the drugs listed in chem_primary_desire and healing drugs (stimpaks and healing powder)
|
// // Fix to allow using only the drugs listed in chem_primary_desire and healing drugs (stimpaks and healing powder)
|
||||||
SafeWrite8(0x4286B1, CODETYPE_JumpZ); // jnz > jz (ai_check_drugs_)
|
// SafeWrite8(0x4286B1, CODETYPE_JumpZ); // jnz > jz (ai_check_drugs_)
|
||||||
SafeWrite8(0x4286C5, CODETYPE_JumpNZ); // jz > jnz (ai_check_drugs_)
|
// SafeWrite8(0x4286C5, CODETYPE_JumpNZ); // jz > jnz (ai_check_drugs_)
|
||||||
dlogr(" Done", DL_FIX);
|
// dlogr(" Done", DL_FIX);
|
||||||
}
|
//}
|
||||||
|
|
||||||
// Fix for chem_primary_desire values in party member AI packets not being saved correctly
|
// Fix for chem_primary_desire values in party member AI packets not being saved correctly
|
||||||
HookCall(0x42803E, cai_cap_save_hook);
|
HookCall(0x42803E, cai_cap_save_hook);
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* sfall
|
||||||
|
* Copyright (C) 2008-2021 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.h"
|
||||||
|
|
||||||
|
#include "ReplacementFuncs.h"
|
||||||
|
|
||||||
|
void EngineTweaks_Init() {
|
||||||
|
std::string tweaksFile = GetConfigString("Misc", "TweaksFile", "", MAX_PATH);
|
||||||
|
if (!tweaksFile.empty()) {
|
||||||
|
const char* cTweaksFile = tweaksFile.insert(0, ".\\").c_str();
|
||||||
|
|
||||||
|
sfgame_SetHealingPID(0, IniGetInt("Items", "STIMPAK", PID_STIMPAK, cTweaksFile));
|
||||||
|
sfgame_SetHealingPID(1, IniGetInt("Items", "SUPER_STIMPAK", PID_SUPER_STIMPAK, cTweaksFile));
|
||||||
|
sfgame_SetHealingPID(2, IniGetInt("Items", "HEALING_POWDER", PID_HEALING_POWDER, cTweaksFile));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EngineTweaks_Exit() {
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* sfall
|
||||||
|
* Copyright (C) 2008-2021 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
|
||||||
|
|
||||||
|
void EngineTweaks_Init();
|
||||||
|
void EngineTweaks_Exit();
|
||||||
+40
-11
@@ -620,18 +620,47 @@ defaultHandler:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
static void RemoveInvenObjHook_Script(TGameObj* source, TGameObj* item, long count, long rmType) {
|
||||||
|
BeginHook();
|
||||||
|
argCount = 5;
|
||||||
|
|
||||||
|
args[0] = (DWORD)source;
|
||||||
|
args[1] = (DWORD)item;
|
||||||
|
args[2] = count;
|
||||||
|
args[3] = rmType; // RMOBJ_*
|
||||||
|
args[4] = 0; // target only from item_move_func_
|
||||||
|
|
||||||
|
RunHookScript(HOOK_REMOVEINVENOBJ);
|
||||||
|
EndHook();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveInvenObjHook_Invoke(TGameObj* source, TGameObj* item, long count, long rmType) {
|
||||||
|
if (HookHasScript(HOOK_REMOVEINVENOBJ)) RemoveInvenObjHook_Script(source, item, count, rmType);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
static long rmObjType = -1;
|
||||||
|
|
||||||
|
void __stdcall SetRemoveObjectType(long rmType) {
|
||||||
|
rmObjType = rmType;
|
||||||
|
}
|
||||||
|
|
||||||
static void __declspec(naked) RemoveObjHook() {
|
static void __declspec(naked) RemoveObjHook() {
|
||||||
static const DWORD RemoveObjHookRet = 0x477497;
|
static const DWORD RemoveObjHookRet = 0x477497;
|
||||||
__asm {
|
__asm {
|
||||||
mov ecx, [esp + 8]; // call addr
|
mov ecx, [esp + 8]; // call addr
|
||||||
|
cmp rmObjType, -1;
|
||||||
|
cmovne ecx, rmObjType;
|
||||||
|
mov rmObjType, -1;
|
||||||
HookBegin;
|
HookBegin;
|
||||||
mov args[0], eax; // source
|
mov args[0], eax; // source
|
||||||
mov args[4], edx; // item
|
mov args[4], edx; // item
|
||||||
mov args[8], ebx; // count
|
mov args[8], ebx; // count
|
||||||
mov args[12], ecx; // called func
|
mov args[12], ecx; // RMOBJ_* (called func)
|
||||||
xor esi, esi;
|
xor esi, esi;
|
||||||
xor ecx, 0x47761D; // from item_move_func_
|
xor ecx, 0x47761D; // from item_move_func_
|
||||||
cmovz esi, ebp; // target
|
cmovz esi, ebp; // target
|
||||||
mov args[16], esi;
|
mov args[16], esi;
|
||||||
push edi;
|
push edi;
|
||||||
push ebp;
|
push ebp;
|
||||||
@@ -1893,9 +1922,9 @@ void HookScripts_Init() {
|
|||||||
HookCalls(UseObjOnHook, useObjOnHkAddr);
|
HookCalls(UseObjOnHook, useObjOnHkAddr);
|
||||||
// the following hooks allows to catch drug use of AI and from action cursor
|
// the following hooks allows to catch drug use of AI and from action cursor
|
||||||
const DWORD drugUseObjOnHkAddr[] = {
|
const DWORD drugUseObjOnHkAddr[] = {
|
||||||
0x4285DF, // ai_check_drugs
|
//0x4285DF, // ai_check_drugs
|
||||||
0x4286F8, // ai_check_drugs
|
//0x4286F8, // ai_check_drugs
|
||||||
0x4287F8, // ai_check_drugs
|
//0x4287F8, // ai_check_drugs
|
||||||
0x473573 // inven_action_cursor
|
0x473573 // inven_action_cursor
|
||||||
};
|
};
|
||||||
HookCalls(Drug_UseObjOnHook, drugUseObjOnHkAddr);
|
HookCalls(Drug_UseObjOnHook, drugUseObjOnHkAddr);
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ int __fastcall AmmoCostHook_Script(DWORD hookType, TGameObj* weapon, DWORD &roun
|
|||||||
void InvenUnwield_HookDrop();
|
void InvenUnwield_HookDrop();
|
||||||
void InvenUnwield_HookMove();
|
void InvenUnwield_HookMove();
|
||||||
|
|
||||||
|
void __stdcall SetRemoveObjectType(long rmType);
|
||||||
|
|
||||||
void __stdcall AdjustFidHook(DWORD vanillaFid);
|
void __stdcall AdjustFidHook(DWORD vanillaFid);
|
||||||
|
|
||||||
long __stdcall CalcApCostHook_Invoke(TGameObj* source, long hitMode, long isCalled, long cost, TGameObj* weapon);
|
long __stdcall CalcApCostHook_Invoke(TGameObj* source, long hitMode, long isCalled, long cost, TGameObj* weapon);
|
||||||
|
|||||||
+4
-2
@@ -304,8 +304,10 @@ static void __declspec(naked) gdControlUpdateInfo_hack() {
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static char superStimMsg[128];
|
static char superStimMsg[128];
|
||||||
|
static const long SUPER_STIMPAK = 1;
|
||||||
|
|
||||||
static int __fastcall SuperStimFix(TGameObj* item, TGameObj* target) {
|
static int __fastcall SuperStimFix(TGameObj* item, TGameObj* target) {
|
||||||
if (item->protoId != PID_SUPER_STIMPAK || !target || target->IsNotCritter()) {
|
if (item->protoId != sfgame_GetHealingPID(SUPER_STIMPAK) || !target || target->IsNotCritter()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -671,7 +673,7 @@ void Inventory_Init() {
|
|||||||
SafeWrite32(0x472632, widthWeight);
|
SafeWrite32(0x472632, widthWeight);
|
||||||
|
|
||||||
if (GetConfigInt("Misc", "SuperStimExploitFix", 0)) {
|
if (GetConfigInt("Misc", "SuperStimExploitFix", 0)) {
|
||||||
Translate_Get("sfall", "SuperStimExploitMsg", "You cannot use a super stim on someone who is not injured!", superStimMsg);
|
Translate_Get("sfall", "SuperStimExploitMsg", "You cannot use this item on someone who is not injured!", superStimMsg);
|
||||||
MakeCall(0x49C3D9, protinst_use_item_on_hack);
|
MakeCall(0x49C3D9, protinst_use_item_on_hack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+17
-12
@@ -84,8 +84,8 @@ void __stdcall sfgame_ai_check_drugs(TGameObj* source) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sfgame_IsHealingItem(itemFind) && !fo_item_remove_mult(source, itemFind, 1)) { // HOOK_REMOVEINVENOBJ
|
if (sfgame_IsHealingItem(itemFind) && !sfgame_item_remove_mult(source, itemFind, 1, 0x4286F0)) { // HOOK_REMOVEINVENOBJ
|
||||||
if (!sfgame_UseDrugItemFunc(source, itemFind)) { // HOOK_USEOBJON
|
if (!sfgame_UseDrugItemFunc(source, itemFind)) { // HOOK_USEOBJON
|
||||||
drugWasUsed = true;
|
drugWasUsed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,8 +134,8 @@ void __stdcall sfgame_ai_check_drugs(TGameObj* source) {
|
|||||||
// if the preference counter is less than 3, then AI can use the drug
|
// if the preference counter is less than 3, then AI can use the drug
|
||||||
if (counter < 3) {
|
if (counter < 3) {
|
||||||
// if the item is NOT a healing drug
|
// if the item is NOT a healing drug
|
||||||
if (!sfgame_IsHealingItem(item) && !fo_item_remove_mult(source, item, 1)) { // HOOK_REMOVEINVENOBJ
|
if (!sfgame_IsHealingItem(item) && !sfgame_item_remove_mult(source, item, 1, 0x4286F0)) { // HOOK_REMOVEINVENOBJ
|
||||||
if (!sfgame_UseDrugItemFunc(source, item)) { // HOOK_USEOBJON
|
if (!sfgame_UseDrugItemFunc(source, item)) { // HOOK_USEOBJON
|
||||||
drugWasUsed = true;
|
drugWasUsed = true;
|
||||||
usedCount++;
|
usedCount++;
|
||||||
}
|
}
|
||||||
@@ -170,8 +170,8 @@ void __stdcall sfgame_ai_check_drugs(TGameObj* source) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastItem && !fo_item_remove_mult(source, lastItem, 1)) { // HOOK_REMOVEINVENOBJ
|
if (lastItem && !sfgame_item_remove_mult(source, lastItem, 1, 0x4286F0)) { // HOOK_REMOVEINVENOBJ
|
||||||
if (!sfgame_UseDrugItemFunc(source, lastItem)) lastItem = nullptr; // HOOK_USEOBJON
|
if (!sfgame_UseDrugItemFunc(source, lastItem)) lastItem = nullptr; // HOOK_USEOBJON
|
||||||
|
|
||||||
source->critter.decreaseAP(aiUseItemAPCost);
|
source->critter.decreaseAP(aiUseItemAPCost);
|
||||||
}
|
}
|
||||||
@@ -340,6 +340,11 @@ long __stdcall sfgame_item_d_take_drug(TGameObj* source, TGameObj* item) {
|
|||||||
return -1; // cancel the drug use
|
return -1; // cancel the drug use
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long __stdcall sfgame_item_remove_mult(TGameObj* source, TGameObj* item, long count, long rmType) {
|
||||||
|
SetRemoveObjectType(rmType);
|
||||||
|
return fo_item_remove_mult(source, item, count);
|
||||||
|
}
|
||||||
|
|
||||||
long __stdcall sfgame_item_count(TGameObj* who, TGameObj* item) {
|
long __stdcall sfgame_item_count(TGameObj* who, TGameObj* item) {
|
||||||
for (int i = 0; i < who->invenSize; i++) {
|
for (int i = 0; i < who->invenSize; i++) {
|
||||||
TGameObj::InvenItem* tableItem = &who->invenTable[i];
|
TGameObj::InvenItem* tableItem = &who->invenTable[i];
|
||||||
@@ -887,15 +892,15 @@ static void __declspec(naked) tile_num_beyond_hack() {
|
|||||||
|
|
||||||
void InitReplacementHacks() {
|
void InitReplacementHacks() {
|
||||||
// Replace ai_check_drugs_ function for code fixes and checking healing items
|
// Replace ai_check_drugs_ function for code fixes and checking healing items
|
||||||
//MakeJump(ai_check_drugs_, ai_check_drugs_hack); // 0x428480
|
MakeJump(ai_check_drugs_, ai_check_drugs_hack); // 0x428480
|
||||||
|
|
||||||
// Change ai_can_use_drug_ function code to check healing items
|
// Change ai_can_use_drug_ function code to check healing items
|
||||||
//MakeCall(0x429BDE, ai_can_use_drug_hack, 6);
|
MakeCall(0x429BDE, ai_can_use_drug_hack, 6);
|
||||||
//SafeWrite8(0x429BE9, CODETYPE_JumpNZ); // jz > jnz
|
SafeWrite8(0x429BE9, CODETYPE_JumpNZ); // jz > jnz
|
||||||
//SafeWrite8(0x429BF1, CODETYPE_JumpShort); // jnz > jmp
|
SafeWrite8(0x429BF1, CODETYPE_JumpShort); // jnz > jmp
|
||||||
|
|
||||||
//drugUsePerfFixMode = GetConfigInt("Misc", "AIDrugUsePerfFix", 0);
|
drugUsePerfFixMode = GetConfigInt("Misc", "AIDrugUsePerfFix", 0);
|
||||||
//if (drugUsePerfFixMode > 0) dlogr("Applying AI drug use preference fix.", DL_FIX);
|
if (drugUsePerfFixMode > 0) dlogr("Applying AI drug use preference fix.", DL_FIX);
|
||||||
|
|
||||||
// Replace adjust_fid_ function
|
// Replace adjust_fid_ function
|
||||||
MakeJump(adjust_fid_, adjust_fid_hack); // 0x4716E8
|
MakeJump(adjust_fid_, adjust_fid_hack); // 0x4716E8
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ bool __stdcall sfgame_UseDrugItemFunc(TGameObj* source, TGameObj* item);
|
|||||||
// Implementation of item_d_take_ engine function with the HOOK_USEOBJON hook
|
// Implementation of item_d_take_ engine function with the HOOK_USEOBJON hook
|
||||||
long __stdcall sfgame_item_d_take_drug(TGameObj* source, TGameObj* item);
|
long __stdcall sfgame_item_d_take_drug(TGameObj* source, TGameObj* item);
|
||||||
|
|
||||||
|
long __stdcall sfgame_item_remove_mult(TGameObj* source, TGameObj* item, long count, long rmType);
|
||||||
|
|
||||||
long __stdcall sfgame_item_count(TGameObj* who, TGameObj* item);
|
long __stdcall sfgame_item_count(TGameObj* who, TGameObj* item);
|
||||||
|
|
||||||
long __stdcall sfgame_item_weapon_range(TGameObj* source, TGameObj* weapon, long hitMode);
|
long __stdcall sfgame_item_weapon_range(TGameObj* source, TGameObj* weapon, long hitMode);
|
||||||
|
|||||||
@@ -220,6 +220,7 @@
|
|||||||
<ClInclude Include="DebugEditor.h" />
|
<ClInclude Include="DebugEditor.h" />
|
||||||
<ClInclude Include="Define.h" />
|
<ClInclude Include="Define.h" />
|
||||||
<ClInclude Include="Elevators.h" />
|
<ClInclude Include="Elevators.h" />
|
||||||
|
<ClInclude Include="EngineTweaks.h" />
|
||||||
<ClInclude Include="Explosions.h" />
|
<ClInclude Include="Explosions.h" />
|
||||||
<ClInclude Include="FalloutEngine.h" />
|
<ClInclude Include="FalloutEngine.h" />
|
||||||
<ClInclude Include="FalloutFuncOffs_def.h" />
|
<ClInclude Include="FalloutFuncOffs_def.h" />
|
||||||
@@ -304,6 +305,7 @@
|
|||||||
<ClCompile Include="Credits.cpp" />
|
<ClCompile Include="Credits.cpp" />
|
||||||
<ClCompile Include="Criticals.cpp" />
|
<ClCompile Include="Criticals.cpp" />
|
||||||
<ClCompile Include="ddraw.cpp" />
|
<ClCompile Include="ddraw.cpp" />
|
||||||
|
<ClCompile Include="EngineTweaks.cpp" />
|
||||||
<ClCompile Include="Graphics.cpp" />
|
<ClCompile Include="Graphics.cpp" />
|
||||||
<ClCompile Include="DebugEditor.cpp" />
|
<ClCompile Include="DebugEditor.cpp" />
|
||||||
<ClCompile Include="IniReader.cpp" />
|
<ClCompile Include="IniReader.cpp" />
|
||||||
|
|||||||
@@ -262,6 +262,9 @@
|
|||||||
<ClInclude Include="stdafx.h">
|
<ClInclude Include="stdafx.h">
|
||||||
<Filter>Headers</Filter>
|
<Filter>Headers</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="EngineTweaks.h">
|
||||||
|
<Filter>Headers</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="Console.cpp">
|
<ClCompile Include="Console.cpp">
|
||||||
@@ -439,6 +442,9 @@
|
|||||||
<ClCompile Include="stdafx.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="EngineTweaks.cpp">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="exports.def" />
|
<None Include="exports.def" />
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
#include "DamageMod.h"
|
#include "DamageMod.h"
|
||||||
#include "DebugEditor.h"
|
#include "DebugEditor.h"
|
||||||
#include "Elevators.h"
|
#include "Elevators.h"
|
||||||
|
#include "EngineTweaks.h"
|
||||||
#include "Explosions.h"
|
#include "Explosions.h"
|
||||||
#include "ExtraSaveSlots.h"
|
#include "ExtraSaveSlots.h"
|
||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
@@ -111,6 +112,9 @@ static void InitModules() {
|
|||||||
dlogr("Running LoadGameHook_Init().", DL_INIT);
|
dlogr("Running LoadGameHook_Init().", DL_INIT);
|
||||||
LoadGameHook_Init();
|
LoadGameHook_Init();
|
||||||
|
|
||||||
|
dlogr("Running EngineTweaks_Init().", DL_INIT);
|
||||||
|
EngineTweaks_Init();
|
||||||
|
|
||||||
dlogr("Running Books_Init().", DL_INIT);
|
dlogr("Running Books_Init().", DL_INIT);
|
||||||
Books_Init();
|
Books_Init();
|
||||||
|
|
||||||
@@ -237,6 +241,7 @@ static void InitModules() {
|
|||||||
|
|
||||||
static void __stdcall OnExit() {
|
static void __stdcall OnExit() {
|
||||||
Graphics_Exit();
|
Graphics_Exit();
|
||||||
|
EngineTweaks_Exit();
|
||||||
Books_Exit();
|
Books_Exit();
|
||||||
Movies_Exit();
|
Movies_Exit();
|
||||||
Interface_Exit();
|
Interface_Exit();
|
||||||
|
|||||||
Reference in New Issue
Block a user