mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Added new HOOK_EXPLOSIVETIMER (#175)
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
Example implementation of the algorithm of the game engine setting the timer of explosives.
|
||||
*/
|
||||
|
||||
#include "..\..\scripting_docs\headers\define_lite.h"
|
||||
|
||||
procedure start;
|
||||
|
||||
procedure start begin
|
||||
if (init_hook == 0) then begin
|
||||
variable
|
||||
time := get_sfall_arg,
|
||||
result := ROLL_CRITICAL_FAILURE;
|
||||
|
||||
if has_trait(TRAIT_PERK, dude_obj, PERK_demolition_expert_perk) then
|
||||
result := ROLL_SUCCESS;
|
||||
else begin
|
||||
result := roll_vs_skill(dude_obj, SKILL_TRAPS, 0);
|
||||
end
|
||||
|
||||
if (result) then begin
|
||||
if (result == ROLL_FAILURE) then
|
||||
time /= 2;
|
||||
else begin // success or critical success
|
||||
result := ROLL_SUCCESS;
|
||||
end
|
||||
end else begin // critical failure
|
||||
time := 0;
|
||||
result := ROLL_FAILURE;
|
||||
end
|
||||
|
||||
set_sfall_return(time);
|
||||
set_sfall_return(result); // failure/success
|
||||
end
|
||||
end
|
||||
@@ -53,6 +53,7 @@
|
||||
#define HOOK_RESTTIMER (30)
|
||||
#define HOOK_GAMEMODECHANGE (31)
|
||||
#define HOOK_USEANIMOBJ (32)
|
||||
#define HOOK_EXPLOSIVETIMER (33)
|
||||
|
||||
//Valid arguments to list_begin
|
||||
#define LIST_CRITTERS (0)
|
||||
|
||||
@@ -77,6 +77,7 @@ static HooksInjectInfo injectHooks[] = {
|
||||
{HOOK_RESTTIMER, Inject_RestTimerHook, false},
|
||||
{HOOK_GAMEMODECHANGE, nullptr, true}, // always embedded to the engine
|
||||
{HOOK_USEANIMOBJ, Inject_UseAnimateObjHook, false},
|
||||
{HOOK_EXPLOSIVETIMER, Inject_ExplosiveTimerHook, false},
|
||||
};
|
||||
|
||||
bool HookScripts::injectAllHooks;
|
||||
|
||||
@@ -59,6 +59,7 @@ enum HookType
|
||||
HOOK_RESTTIMER = 30,
|
||||
HOOK_GAMEMODECHANGE = 31,
|
||||
HOOK_USEANIMOBJ = 32,
|
||||
HOOK_EXPLOSIVETIMER = 33,
|
||||
HOOK_COUNT
|
||||
};
|
||||
|
||||
|
||||
@@ -281,6 +281,55 @@ skip:
|
||||
}
|
||||
}
|
||||
|
||||
static int __fastcall ExplosiveTimerHook_Script(DWORD type, DWORD item, DWORD time) {
|
||||
|
||||
BeginHook();
|
||||
argCount = 3;
|
||||
|
||||
args[0] = time;
|
||||
args[1] = item;
|
||||
args[2] = (type == 11) ? fo::ROLL_FAILURE : fo::ROLL_SUCCESS;
|
||||
|
||||
RunHookScript(HOOK_EXPLOSIVETIMER);
|
||||
EndHook();
|
||||
|
||||
int result = 0;
|
||||
if (cRet > 0 && rets[0] >= 0) {
|
||||
if (rets[0] > 18000) rets[0] = 18000; // max 30 minutes
|
||||
if (cRet < 2) {
|
||||
result--; // use vanilla type
|
||||
} else {
|
||||
result++; // use returned type
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static void _declspec(naked) ExplosiveTimerHook() {
|
||||
__asm {
|
||||
push eax;
|
||||
push edx;
|
||||
push ecx;
|
||||
//-------
|
||||
push edi; // time in ticks
|
||||
call ExplosiveTimerHook_Script; // ecx - type, edx - item
|
||||
cmp eax, 0;
|
||||
pop ecx;
|
||||
pop edx;
|
||||
pop eax;
|
||||
jz end;
|
||||
mov eax, rets[0]; // time in ticks
|
||||
jl end;
|
||||
mov ecx, 8; // type SUCCESS
|
||||
cmp rets[4], 1;
|
||||
jg end;
|
||||
add ecx, 3; // type FAILURE (11)
|
||||
end:
|
||||
call fo::funcoffs::queue_add_;
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
void Inject_BarterPriceHook() {
|
||||
HookCalls(BarterPriceHook, {
|
||||
0x474D4C,
|
||||
@@ -323,6 +372,10 @@ void Inject_RestTimerHook() {
|
||||
MakeCalls(RestTimerEscapeHook, { 0x499B63, 0x499CA1 });
|
||||
}
|
||||
|
||||
void Inject_ExplosiveTimerHook() {
|
||||
HookCall(0x49BDC4, ExplosiveTimerHook);
|
||||
}
|
||||
|
||||
void InitMiscHookScripts() {
|
||||
|
||||
LoadHookScript("hs_barterprice", HOOK_BARTERPRICE);
|
||||
@@ -332,6 +385,7 @@ void InitMiscHookScripts() {
|
||||
LoadHookScript("hs_cartravel", HOOK_CARTRAVEL);
|
||||
LoadHookScript("hs_setglobalvar", HOOK_SETGLOBALVAR);
|
||||
LoadHookScript("hs_resttimer", HOOK_RESTTIMER);
|
||||
LoadHookScript("hs_explosivetimer", HOOK_EXPLOSIVETIMER);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -11,5 +11,5 @@ namespace sfall
|
||||
void Inject_CarTravelHook();
|
||||
void Inject_SetGlobalVarHook();
|
||||
void Inject_RestTimerHook();
|
||||
|
||||
void Inject_ExplosiveTimerHook();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user