From a7079d6ea2bb1a057d6c73bfa821e86a832cbb85 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 30 Mar 2024 16:02:35 +0000 Subject: [PATCH] Add FINISH script calling type to ACS Called at the end of a successful P_DoPlayerExit --- src/acs/interface.cpp | 23 +++++++++++++++++++++++ src/acs/interface.h | 16 ++++++++++++++++ src/acs/thread.hpp | 1 + src/p_user.c | 3 +++ 4 files changed, 43 insertions(+) diff --git a/src/acs/interface.cpp b/src/acs/interface.cpp index c010bc6c6..e5d6e196a 100644 --- a/src/acs/interface.cpp +++ b/src/acs/interface.cpp @@ -244,6 +244,29 @@ void ACS_RunPlayerEnterScript(player_t *player) map->scriptStartTypeForced(ACS_ST_ENTER, scriptInfo); } +/*-------------------------------------------------- + void ACS_RunPlayerFinishScript(player_t *player) + + See header file for description. +--------------------------------------------------*/ +void ACS_RunPlayerFinishScript(player_t *player) +{ + Environment *env = &ACSEnv; + + ACSVM::GlobalScope *const global = env->getGlobalScope(0); + ACSVM::HubScope *const hub = global->getHubScope(0); + ACSVM::MapScope *const map = hub->getMapScope(0); + + ACSVM::MapScope::ScriptStartInfo scriptInfo; + ThreadInfo info; + + P_SetTarget(&info.mo, player->mo); + + scriptInfo.info = &info; + + map->scriptStartTypeForced(ACS_ST_FINISH, scriptInfo); +} + /*-------------------------------------------------- void ACS_RunLapScript(mobj_t *mo, line_t *line) diff --git a/src/acs/interface.h b/src/acs/interface.h index 0b9881950..cbb8ab809 100644 --- a/src/acs/interface.h +++ b/src/acs/interface.h @@ -139,6 +139,22 @@ void ACS_RunPlayerDeathScript(player_t *player); void ACS_RunPlayerEnterScript(player_t *player); +/*-------------------------------------------------- + void ACS_RunPlayerFinishScript(player_t *player); + + Runs the map's special script for a player + finishing (P_DoPlayerExit). + + Input Arguments:- + player: The player to run the script for. + + Return:- + None +--------------------------------------------------*/ + +void ACS_RunPlayerFinishScript(player_t *player); + + /*-------------------------------------------------- void ACS_RunLapScript(mobj_t *mo, line_t *line); diff --git a/src/acs/thread.hpp b/src/acs/thread.hpp index faa345c15..f8338239c 100644 --- a/src/acs/thread.hpp +++ b/src/acs/thread.hpp @@ -43,6 +43,7 @@ enum acs_scriptType_e ACS_ST_UFO = 8, // UFO: Runs when the UFO Catcher is destroyed in a Special Stage. ACS_ST_EMERALD = 9, // EMERALD: Runs when the Chaos Emerald is collected in a Special Stage. ACS_ST_GAMEOVER = 10, // GAMEOVER: Runs when the level ends due to a losing condition and no player has an extra life. + ACS_ST_FINISH = 11, // FINISH: Runs when a player finishes }; // diff --git a/src/p_user.c b/src/p_user.c index 1c55f0236..d251100d3 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -71,6 +71,7 @@ #include "k_credits.h" #include "k_hud.h" // K_AddMessage #include "m_easing.h" +#include "acs/interface.h" #ifdef HWRENDER #include "hardware/hw_light.h" @@ -1342,6 +1343,8 @@ void P_DoPlayerExit(player_t *player, pflags_t flags) demo.savebutton = leveltime; } } + + ACS_RunPlayerFinishScript(player); } //