Changed the behavior of ObjCanSeeObj_ShootThru_Fix

* now the critter can only see through objects in front of it.
This commit is contained in:
NovaRain
2020-08-08 11:50:12 +08:00
parent 37b4a18770
commit d2b1cdec46
4 changed files with 30 additions and 13 deletions
+1 -1
View File
@@ -577,7 +577,7 @@ InventoryApCost=4
QuickPocketsApCostReduction=2 QuickPocketsApCostReduction=2
;Set to 1 to fix obj_can_see_obj script function to allow critters to see through other critters and objects with 'ShootThru' flag set ;Set to 1 to fix obj_can_see_obj script function to allow critters to see through other critters and objects with 'ShootThru' flag set
;Note that enabling this option can cause unexpected NPC behavior in some situations, e.g. able to attack or enter into a dialogue with the player behind some objects ;Note that enabling this option can cause unexpected NPC behavior in some cases, e.g. initiating combat or dialogue when the player is hiding behind some obstacles
ObjCanSeeObj_ShootThru_Fix=0 ObjCanSeeObj_ShootThru_Fix=0
;Set to 1 to fix the broken obj_can_hear_obj script function ;Set to 1 to fix the broken obj_can_hear_obj script function
+3 -3
View File
@@ -273,9 +273,9 @@
set_self(0) set_self(0)
// returns the corrected tile distance between two objects to the distance variable (return value >= 9996 is an error when getting the distance) // returns the corrected tile distance between two objects to the distance variable (return value >= 9996 is an error when getting the distance)
#define distance_objs(distance, obj1, obj2) distance := tile_distance_objs(obj1, obj2) - 1; \ #define distance_objs(distance, obj1, obj2) distance := tile_distance_objs(obj1, obj2) - 1; \
if (get_flags(obj1) bwand FLAG_MULTIHEX) distance--; \ if (get_flags(obj1) bwand FLAG_MULTIHEX) then distance--; \
if (get_flags(obj2) bwand FLAG_MULTIHEX) distance-- if (get_flags(obj2) bwand FLAG_MULTIHEX) then distance--
/* sfall metalure3 function macros */ /* sfall metalure3 function macros */
+2 -1
View File
@@ -14,7 +14,8 @@ static std::vector<long> excludeWarning = {
}; };
static std::vector<long> excludeConflict = { static std::vector<long> excludeConflict = {
0x42A0F8, // bugfixes.cpp 0x42A0F8, // bugfixes.cpp
0x461495, // BarBoxes.cpp
}; };
struct HackPair { struct HackPair {
+24 -8
View File
@@ -135,17 +135,28 @@ static void __declspec(naked) op_obj_can_see_obj_hook() {
using namespace fo; using namespace fo;
using namespace Fields; using namespace Fields;
__asm { __asm {
mov edi, [esp + 4]; // buf **ret_objStruct mov edi, [esp + 4]; // buf **ret_objStruct
push fo::funcoffs::obj_shoot_blocking_at_; // check hex objects func pointer test ebp, ebp;
push 0x20; // flags, 0x20 = check ShootThru jz onlyOnce;
xor ebp, ebp;
push edx;
mov edx, [edi - 8]; // target
push eax; // source
call fo::funcoffs::can_see_;
test eax, eax;
pop eax;
pop edx;
jz normal;
onlyOnce:
push fo::funcoffs::obj_shoot_blocking_at_; // check hex objects func pointer
push 0x20; // flags, 0x20 = check ShootThru
push edi; push edi;
call fo::funcoffs::make_straight_path_func_; call fo::funcoffs::make_straight_path_func_;
// fix: see through critters // see through critter
mov edx, [esp + 4]; mov ebx, [edi];
mov ebx, [edx];
test ebx, ebx; test ebx, ebx;
jz skip; jz skip;
cmp ebx, [edx - 8]; // target cmp ebx, [edi - 8]; // target
jne noTarget; jne noTarget;
skip: skip:
retn 8; retn 8;
@@ -156,9 +167,14 @@ noTarget:
je isCritter; je isCritter;
retn 8; retn 8;
isCritter: isCritter:
mov [edx - 4], ebx; // replace source mov [edi - 4], ebx; // replace source
mov dword ptr [esp], 0x456BAB; // continue mov dword ptr [esp], 0x456BAB; // continue
retn 8; retn 8;
normal: // vanilla behavior
push 0x10;
push edi;
call fo::funcoffs::make_straight_path_;
retn 8;
} }
} }