From e7128baef0515042dc11c0693a601d7279f8438d Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 28 Mar 2023 18:07:22 -0400 Subject: [PATCH] Add UFO script type --- src/acs/interface.cpp | 25 ++++++++++++++++++++++++- src/acs/interface.h | 10 ++++++++++ src/acs/thread.hpp | 3 ++- src/k_objects.h | 1 + src/objects/ufo.c | 28 +++++++++++++++++++++++++++- src/p_inter.c | 13 +++---------- 6 files changed, 67 insertions(+), 13 deletions(-) diff --git a/src/acs/interface.cpp b/src/acs/interface.cpp index 61b880961..8010a4e4c 100644 --- a/src/acs/interface.cpp +++ b/src/acs/interface.cpp @@ -271,6 +271,29 @@ void ACS_RunOvertimeScript(void) map->scriptStartType(ACS_ST_OVERTIME, {}); } +/*-------------------------------------------------- + void ACS_RunCatcherScript(mobj_t *mo) + + See header file for description. +--------------------------------------------------*/ +void ACS_RunCatcherScript(mobj_t *mo) +{ + 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, mo); + + scriptInfo.info = &info; + + map->scriptStartType(ACS_ST_UFO, scriptInfo); +} + /*-------------------------------------------------- void ACS_RunEmeraldScript(mobj_t *mo) @@ -291,7 +314,7 @@ void ACS_RunEmeraldScript(mobj_t *mo) scriptInfo.info = &info; - map->scriptStartTypeForced(ACS_ST_EMERALD, scriptInfo); + map->scriptStartType(ACS_ST_EMERALD, scriptInfo); } /*-------------------------------------------------- diff --git a/src/acs/interface.h b/src/acs/interface.h index 7c535ac3d..aa2714c46 100644 --- a/src/acs/interface.h +++ b/src/acs/interface.h @@ -155,6 +155,16 @@ void ACS_RunPositionScript(void); void ACS_RunOvertimeScript(void); +/*-------------------------------------------------- + void ACS_RunCatcherScript(mobj_t *mo); + + Runs the map's special script for when the + Special Stage UFO Catcher is destroyed. +--------------------------------------------------*/ + +void ACS_RunCatcherScript(mobj_t *mo); + + /*-------------------------------------------------- void ACS_RunEmeraldScript(mobj_t *mo); diff --git a/src/acs/thread.hpp b/src/acs/thread.hpp index 5535ac556..b13c0e4f8 100644 --- a/src/acs/thread.hpp +++ b/src/acs/thread.hpp @@ -41,7 +41,8 @@ enum acs_scriptType_e ACS_ST_LAP = 5, // LAP: Runs when a player's lap increases from crossing the finish line. ACS_ST_POSITION = 6, // POSITION: Runs when the POSITION period ends. ACS_ST_OVERTIME = 7, // OVERTIME: Runs when Overtime starts in timed game modes. - ACS_ST_EMERALD = 8, // EMERALD: Runs when the Chaos Emerald is collected in a Special Stage. + 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. }; // diff --git a/src/k_objects.h b/src/k_objects.h index 1578d8177..a46c3513f 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -72,6 +72,7 @@ waypoint_t *K_GetSpecialUFOWaypoint(mobj_t *ufo); void Obj_SpecialUFOThinker(mobj_t *ufo); boolean Obj_SpecialUFODamage(mobj_t *ufo, mobj_t *inflictor, mobj_t *source, UINT8 damageType); void Obj_PlayerUFOCollide(mobj_t *ufo, mobj_t *other); +boolean Obj_UFOEmeraldCollect(mobj_t *ufo, mobj_t *toucher); void Obj_UFOPieceThink(mobj_t *piece); void Obj_UFOPieceDead(mobj_t *piece); void Obj_UFOPieceRemoved(mobj_t *piece); diff --git a/src/objects/ufo.c b/src/objects/ufo.c index 268ea8f00..a632986d0 100644 --- a/src/objects/ufo.c +++ b/src/objects/ufo.c @@ -698,7 +698,7 @@ boolean Obj_SpecialUFODamage(mobj_t *ufo, mobj_t *inflictor, mobj_t *source, UIN ufo->flags = (ufo->flags & ~MF_SHOOTABLE) | (MF_SPECIAL|MF_PICKUPFROMBELOW); ufo->shadowscale = FRACUNIT/3; - ACS_RunEmeraldScript(source); + ACS_RunCatcherScript(source); S_StopSound(ufo); S_StartSound(ufo, sfx_clawk2); @@ -757,6 +757,32 @@ void Obj_PlayerUFOCollide(mobj_t *ufo, mobj_t *other) K_KartBouncing(other, ufo); } +boolean Obj_UFOEmeraldCollect(mobj_t *ufo, mobj_t *toucher) +{ + if (toucher->player != NULL) + { + if (P_CanPickupItem(toucher->player, 0) == false) + { + return false; + } + } + + if (ufo_collectdelay(ufo) > 0) + { + return false; + } + + if (toucher->hitlag > 0) + { + return false; + } + + ACS_RunEmeraldScript(toucher); + + CONS_Printf("You win!\n"); + return true; +} + void Obj_UFOPieceThink(mobj_t *piece) { mobj_t *ufo = ufo_piece_owner(piece); diff --git a/src/p_inter.c b/src/p_inter.c index 0a37235db..dbb18b571 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -391,18 +391,11 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) K_CheckEmeralds(player); break; case MT_SPECIAL_UFO: - if (!P_CanPickupItem(player, 0)) + if (Obj_UFOEmeraldCollect(special, toucher) == false) + { return; + } - if (special->threshold > 0) - return; - - if (toucher->hitlag > 0) - return; - - P_LinedefExecute(LE_BOSSDEAD, toucher, NULL); - - CONS_Printf("You win!\n"); break; /* case MT_EERIEFOG: