Compare commits

..
Author SHA1 Message Date
Mike Klaas 6efe7ed869 Implement sfall HOOK_ONGAMEMODECHANGE
Pretty straight forward one
2026-03-19 23:08:19 -07:00
6 changed files with 61 additions and 4 deletions
+34 -1
View File
@@ -1,6 +1,11 @@
#include "../sfall/sfall.h"
#include "../sfall/dik.h"
#include "../sfall/define_lite.h"
#include "../test_utils.h"
variable last_game_mode;
variable gamemodechange_assertions_enabled := false;
variable gamemodechange_reported := false;
procedure test_with_args(variable arg1) begin
display_msg("test_w_arg" + arg1);
@@ -64,6 +69,31 @@ procedure keypress_handler begin
end
end
procedure gamemodechange_handler begin
variable
event_type := get_sfall_arg_at(0),
previous_mode := get_sfall_arg_at(1),
current_mode := get_game_mode;
display_msg(string_format("gamemodechange event=%d prev=%d cur=%d", event_type, previous_mode, current_mode));
if (not gamemodechange_assertions_enabled) then begin
last_game_mode := current_mode;
return;
end
call assertTrue("gamemodechange event_type is 0 or 1", event_type == 0 or event_type == 1);
call assertEquals("gamemodechange previous mode", previous_mode, last_game_mode);
if (event_type == 0) then
call assertNotEquals("gamemodechange mode changed", current_mode, previous_mode);
else if (not gamemodechange_reported) then begin
gamemodechange_reported := true;
call report_test_results("hook_gamemodechange");
end
last_game_mode := current_mode;
end
procedure start begin
//call test_with_args(777);
display_msg("start hook test");
@@ -74,14 +104,17 @@ procedure start begin
add_obj_to_inven(dude_obj, create_object_sid(76, 0, 0, -1));
add_obj_to_inven(dude_obj, create_object_sid(85, 0, 0, -1));
last_game_mode := get_game_mode;
gamemodechange_assertions_enabled := true;
register_hook_proc(HOOK_KEYPRESS, keypress_handler);
register_hook_proc(HOOK_TOHIT, tohit_handler);
register_hook_proc(HOOK_USEOBJ, useobj_handler);
register_hook_proc(HOOK_USEOBJON, useobjon_handler);
register_hook_proc(HOOK_GAMEMODECHANGE, gamemodechange_handler);
end
procedure map_enter_p_proc begin
display_msg("Map Enter hook test");
end
+10
View File
@@ -462,6 +462,8 @@ void gameExit()
{
debugPrint("\nGame Exit\n");
sfallOnGameModeChange(1, GameMode::getCurrentGameMode());
// SFALL
scriptHooksExit();
sfall_gl_scr_exit();
@@ -1624,12 +1626,20 @@ int GameMode::currentGameMode = 0;
void GameMode::enterGameMode(int gameMode)
{
int previousGameMode = currentGameMode;
currentGameMode |= gameMode;
if (currentGameMode != previousGameMode) {
sfallOnGameModeChange(0, previousGameMode);
}
}
void GameMode::exitGameMode(int gameMode)
{
int previousGameMode = currentGameMode;
currentGameMode &= ~gameMode;
if (currentGameMode != previousGameMode) {
sfallOnGameModeChange(0, previousGameMode);
}
}
bool GameMode::isInGameMode(int gameMode)
+3 -2
View File
@@ -2,6 +2,7 @@
#include "display_monitor.h"
#include "sfall_config.h"
#include "sfall_script_hooks.h"
#include "worldmap.h"
namespace fallout {
@@ -53,9 +54,9 @@ void sfallOnAfterNewGame()
return;
}
void sfallOnGameModeChange()
void sfallOnGameModeChange(int exit, int previousGameMode)
{
return;
scriptHooks_GameModeChange(exit, previousGameMode);
}
void sfallOnBeforeGameClose()
+1 -1
View File
@@ -11,7 +11,7 @@ void sfallOnGameReset();
void sfallOnBeforeGameStart();
void sfallOnAfterGameStarted();
void sfallOnAfterNewGame();
void sfallOnGameModeChange();
void sfallOnGameModeChange(int exit, int previousGameMode);
void sfallOnBeforeGameClose();
void sfallOnCombatStart();
void sfallOnCombatEnd();
+12
View File
@@ -150,6 +150,18 @@ void scriptHooksExit()
scriptHooksClear();
}
/*
Runs once every time when the game mode was changed, like opening/closing the inventory, character screen, pipboy, etc.
int arg0 - event type: 1 - when the player exits the game, 0 - otherwise
int arg1 - the previous game mode
*/
void scriptHooks_GameModeChange(int exit, int previousGameMode)
{
ScriptHookCall hook(HOOK_GAMEMODECHANGE, 0);
hook.addArg(exit).addArg(previousGameMode).call();
}
/*
Runs when Fallout is calculating the chances of an attack striking a target.
Runs after the hit chance is fully calculated normally, including applying the 95% cap.
+1
View File
@@ -210,6 +210,7 @@ bool scriptHooksInit();
void scriptHooksReset();
void scriptHooksExit();
void scriptHooks_GameModeChange(int exit, int previousGameMode);
int scriptHooks_ToHit(Object* attacker, Object* defender, int tile, int hitMode, int hitLocation, int hitChance, int hitChanceUncapped, bool useDistance);
int scriptHooks_UseObj(Object* user, Object* objUsed);
int scriptHooks_UseObjOn(Object* user, Object* target, Object* objUsed);