Tweaked/fixed reg_anim_callback function

This commit is contained in:
NovaRain
2019-11-15 09:57:31 +08:00
parent 9904423641
commit 996dd293c0
7 changed files with 47 additions and 27 deletions
+1 -1
View File
@@ -219,7 +219,7 @@ Some additional reg_anim_* functions were introduced. They all work in the same
- makes object change its direction to face given tile num or target object.
> void reg_anim_callback(procedure proc)
- registers the given procedure and executes it after previously registered animations are finished.
- adds the given procedure to an animation sequence-list and executes it in the registered sequence.
> int/array metarule2_explosions(int arg1, int arg2, int arg3)
was made as a dirty easy hack to allow dynamically change some explosion parameters (ranged attack). All changed parameters are reset to vanilla state automatically after each attack action. Following macros are available in sfall.h:
+1 -1
View File
@@ -183,7 +183,7 @@ void RegisterHook(fo::Program* script, int id, int procNum, bool specReg) {
}
if (procNum == 0) return; // prevent registration to first location in procedure when reusing "unregister" method
ScriptProgram *prog = GetGlobalScriptProgram(script);
ScriptProgram *prog = ScriptExtender::GetGlobalScriptProgram(script);
if (prog) {
dlog_f("Global script: %08x registered as hook ID %d\n", DL_HOOK, script, id);
HookScript hook;
+1 -1
View File
@@ -48,7 +48,7 @@ bool LoadHookScript(const char* name, int id) {
hook.callback = -1;
hook.isGlobalScript = false;
hooks[id].push_back(hook);
AddProgramToMap(prog);
ScriptExtender::AddProgramToMap(prog);
} else {
dlogr(" Error!", DL_HOOK);
}
+23 -13
View File
@@ -122,11 +122,17 @@ bool alwaysFindScripts;
fo::ScriptInstance overrideScriptStruct = {0};
static const DWORD scr_ptr_back = fo::funcoffs::scr_ptr_ + 5;
static const DWORD scr_find_sid_from_program = fo::funcoffs::scr_find_sid_from_program_ + 5;
static const DWORD scr_find_obj_from_program = fo::funcoffs::scr_find_obj_from_program_ + 7;
long ScriptExtender::GetScriptReturnValue() {
return overrideScriptStruct.returnValue;
}
static DWORD _stdcall FindSid(fo::Program* script) {
long ScriptExtender::GetResetScriptReturnValue() {
long val = GetScriptReturnValue();
overrideScriptStruct.returnValue = 0;
return val;
}
static DWORD __stdcall FindSid(fo::Program* script) {
std::unordered_map<fo::Program*, SelfOverrideObj>::iterator overrideIt = selfOverrideMap.find(script);
if (overrideIt != selfOverrideMap.end()) {
DWORD scriptId = overrideIt->second.object->scriptId; // script
@@ -147,12 +153,18 @@ static DWORD _stdcall FindSid(fo::Program* script) {
} else {
overrideScriptStruct.fixedParam = 0;
}
overrideScriptStruct.targetObject = overrideScriptStruct.selfObject = 0;
overrideScriptStruct.targetObject = 0;
overrideScriptStruct.selfObject = 0;
overrideScriptStruct.returnValue = 0;
return -2; // override struct
}
return -1; // change nothing
}
static const DWORD scr_ptr_back = fo::funcoffs::scr_ptr_ + 5;
static const DWORD scr_find_sid_from_program = fo::funcoffs::scr_find_sid_from_program_ + 5;
//static const DWORD scr_find_obj_from_program = fo::funcoffs::scr_find_obj_from_program_ + 7;
static void __declspec(naked) FindSidHack() {
__asm {
push eax;
@@ -439,11 +451,11 @@ void InitScriptProgram(ScriptProgram &prog) {
}
}
void AddProgramToMap(ScriptProgram &prog) {
void ScriptExtender::AddProgramToMap(ScriptProgram &prog) {
sfallProgsMap[prog.ptr] = prog;
}
ScriptProgram* GetGlobalScriptProgram(fo::Program* scriptPtr) {
ScriptProgram* ScriptExtender::GetGlobalScriptProgram(fo::Program* scriptPtr) {
SfallProgsMap::iterator it = sfallProgsMap.find(scriptPtr);
return (it == sfallProgsMap.end()) ? nullptr : &it->second ; // prog
}
@@ -469,7 +481,7 @@ static void LoadGlobalScriptsList() {
GlobalScript gscript = GlobalScript(prog);
gscript.startProc = prog.procLookup[fo::ScriptProc::start]; // get 'start' procedure position
globalScripts.push_back(gscript);
AddProgramToMap(prog);
ScriptExtender::AddProgramToMap(prog);
// initialize script (start proc will be executed for the first time) -- this needs to be after script is added to "globalScripts" array
InitScriptProgram(prog);
} else {
@@ -559,19 +571,17 @@ void RunScriptProc(ScriptProgram* prog, const char* procName) {
void RunScriptProc(ScriptProgram* prog, long procId) {
if (procId > 0 && procId < fo::ScriptProc::count) {
fo::Program* sptr = prog->ptr;
int procNum = prog->procLookup[procId];
if (procNum != -1) {
fo::func::executeProcedure(sptr, procNum);
fo::func::executeProcedure(prog->ptr, procNum);
}
}
}
int RunScriptStartProc(ScriptProgram* prog) {
fo::Program* sptr = prog->ptr;
int procNum = prog->procLookup[fo::ScriptProc::start];
if (procNum != -1) {
fo::func::executeProcedure(sptr, procNum);
fo::func::executeProcedure(prog->ptr, procNum);
}
return procNum;
}
@@ -651,7 +661,7 @@ static long HandleTimedEventScripts() {
}
if (wereRunning) {
for (auto _it = timerEventScripts.cbegin(); _it != timerIt; _it++) {
fo::func::dev_printf("\n[TimedEventScripts] delete events: %d", _it->time);
fo::func::dev_printf("\n[TimedEventScripts] delete event: %d", _it->time);
}
timerEventScripts.erase(timerEventScripts.cbegin(), timerIt);
}
+12 -9
View File
@@ -27,6 +27,12 @@
namespace sfall
{
typedef struct {
fo::Program* ptr = nullptr;
int procLookup[fo::ScriptProc::count];
char initialized;
} ScriptProgram;
class ScriptExtender : public Module {
public:
const char* name() { return "ScriptExtender"; }
@@ -34,6 +40,12 @@ public:
static std::string iniConfigFolder;
static long GetScriptReturnValue();
static long GetResetScriptReturnValue();
static void AddProgramToMap(ScriptProgram &prog);
static ScriptProgram* GetGlobalScriptProgram(fo::Program* scriptPtr);
static void AddTimerEventScripts(fo::Program* script, long time, long param);
static void RemoveTimerEventScripts(fo::Program* script, long param);
static void RemoveTimerEventScripts(fo::Program* script);
@@ -50,12 +62,6 @@ struct GlobalVar {
};
#pragma pack(pop)
typedef struct {
fo::Program* ptr = nullptr;
int procLookup[fo::ScriptProc::count];
char initialized;
} ScriptProgram;
void __fastcall SetGlobalScriptRepeat(fo::Program* script, int frames);
void __fastcall SetGlobalScriptType(fo::Program* script, int type);
bool _stdcall IsGameScript(const char* filename);
@@ -97,9 +103,6 @@ void RunScriptProc(ScriptProgram* prog, long procId);
int RunScriptStartProc(ScriptProgram* prog);
void AddProgramToMap(ScriptProgram &prog);
ScriptProgram* GetGlobalScriptProgram(fo::Program* scriptPtr);
// variables
extern DWORD isGlobalScriptLoading;
extern DWORD availableGlobalScriptTypes;
+9 -1
View File
@@ -19,6 +19,7 @@
#include "..\..\..\FalloutEngine\Fallout2.h"
#include "..\..\..\SafeWrite.h"
#include "..\..\Explosions.h"
#include "..\..\ScriptExtender.h"
#include "..\OpcodeContext.h"
#include "Anims.h"
@@ -116,11 +117,18 @@ void sf_reg_anim_turn_towards(OpcodeContext& ctx) {
}
}
static void __declspec(naked) ExecuteCallback() {
__asm {
call fo::funcoffs::executeProcedure_;
jmp ScriptExtender::GetResetScriptReturnValue;
}
}
void sf_reg_anim_callback(OpcodeContext& ctx) {
fo::func::register_object_call(
reinterpret_cast<long*>(ctx.program()),
reinterpret_cast<long*>(ctx.arg(0).rawValue()), // callback procedure
reinterpret_cast<void*>(fo::funcoffs::executeProcedure_),
reinterpret_cast<void*>(ExecuteCallback),
-1
);
}
-1
View File
@@ -36,7 +36,6 @@ void sf_reg_anim_light(OpcodeContext&);
void sf_reg_anim_change_fid(OpcodeContext&);
void sf_reg_anim_take_out(OpcodeContext&);
void sf_reg_anim_turn_towards(OpcodeContext&);
void sf_reg_anim_callback(OpcodeContext&);
void sf_explosions_metarule(OpcodeContext&);