From d479a7db37ae300590b2d30246e957db41eae74b Mon Sep 17 00:00:00 2001 From: Archez Date: Sun, 28 Jan 2024 21:02:21 -0500 Subject: [PATCH] Add ActorResetFunc for variable cleanup (#98) * add actor reset func handling * reset func for day transitions * reset func for deku playground * reset func for dog race * reset func for grass * reset func for goron shrine chandelier * reset func for lost woods intro sparkles * reset func for deku palace patrol guards * reset func for dampe * reset func for beaver race rings * reset func for butler race doors * reset funcs for deep sea python * reset func for dogs * reset func for deku curse mad scrubs * reset func for keaton grass * reset func for marine lab fish * reset func for shooting gallery scrubs * reset func for Stone Tower FloorSwitch * reset func for ice platforms * reset func for punchable pillar * reset func for blue warps * reset func for odolwa * reset func for twinmold * reset func for gyorg * reset func for wart * reset func for igos window * reset func for majora * reset func for snow head central pillar --- mm/include/z64actor.h | 7 +++++ mm/src/code/z_actor.c | 31 ++++++++++++++----- .../ovl_Bg_Crace_Movebg/z_bg_crace_movebg.c | 7 +++++ .../ovl_Bg_F40_Switch/z_bg_f40_switch.c | 6 ++++ .../ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c | 13 +++++++- .../actors/ovl_Bg_Icefloe/z_bg_icefloe.c | 10 ++++++ .../ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c | 6 ++++ .../ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.c | 6 ++++ .../overlays/actors/ovl_Boss_01/z_boss_01.c | 13 ++++++++ .../overlays/actors/ovl_Boss_02/z_boss_02.c | 17 ++++++++++ .../overlays/actors/ovl_Boss_03/z_boss_03.c | 11 +++++++ .../overlays/actors/ovl_Boss_04/z_boss_04.c | 6 ++++ .../overlays/actors/ovl_Boss_06/z_boss_06.c | 9 ++++++ .../overlays/actors/ovl_Boss_07/z_boss_07.c | 25 +++++++++++++++ .../actors/ovl_Demo_Kankyo/z_demo_kankyo.c | 7 +++++ .../actors/ovl_Door_Warp1/z_door_warp1.c | 7 +++++ mm/src/overlays/actors/ovl_En_Dg/z_en_dg.c | 7 +++++ mm/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c | 6 ++++ .../actors/ovl_En_Dragon/z_en_dragon.c | 6 ++++ .../overlays/actors/ovl_En_Fish2/z_en_fish2.c | 11 +++++++ .../overlays/actors/ovl_En_Kusa2/z_en_kusa2.c | 7 +++++ .../actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c | 28 ++++++++++++++--- .../actors/ovl_En_Look_Nuts/z_en_look_nuts.c | 6 ++++ .../actors/ovl_En_Racedog/z_en_racedog.c | 8 +++++ .../z_en_syateki_dekunuts.c | 13 +++++++- .../overlays/actors/ovl_En_Test4/z_en_test4.c | 6 ++++ mm/src/overlays/actors/ovl_En_Tk/z_en_tk.c | 6 ++++ .../overlays/actors/ovl_En_Twig/z_en_twig.c | 6 ++++ .../overlays/actors/ovl_Obj_Chan/z_obj_chan.c | 6 ++++ .../ovl_Obj_Grass_Unit/z_obj_grass_unit.c | 9 ++++++ 30 files changed, 293 insertions(+), 13 deletions(-) diff --git a/mm/include/z64actor.h b/mm/include/z64actor.h index a388b6c48..5e70de775 100644 --- a/mm/include/z64actor.h +++ b/mm/include/z64actor.h @@ -27,6 +27,10 @@ typedef void (*ActorFunc)(struct Actor* this, struct PlayState* play); typedef u16 (*NpcGetTextIdFunc)(struct PlayState*, struct Actor*); typedef s16 (*NpcUpdateTalkStateFunc)(struct PlayState*, struct Actor*); +// #region 2S2H [Port] Reset func used for cleaning up static variables +typedef void (*ActorResetFunc)(void); +// #endregion + typedef struct PosRot { /* 0x00 */ Vec3f pos; /* 0x0C */ Vec3s rot; @@ -47,6 +51,9 @@ typedef struct ActorInit { /* 0x14 */ ActorFunc destroy; /* 0x18 */ ActorFunc update; /* 0x1C */ ActorFunc draw; + // #region 2S2H [Port] + /* */ ActorResetFunc reset; + // #endregion } ActorInit; // size = 0x20 typedef enum AllocType { diff --git a/mm/src/code/z_actor.c b/mm/src/code/z_actor.c index 32327a172..872199eb5 100644 --- a/mm/src/code/z_actor.c +++ b/mm/src/code/z_actor.c @@ -3254,6 +3254,14 @@ Actor* Actor_RemoveFromCategory(PlayState* play, ActorContext* actorCtx, Actor* void Actor_FreeOverlay(ActorOverlay* entry) { if (entry->numLoaded == 0) { + // #region 2S2H [Port] Added reset function is called when loaded count is 0 + // to clean up static variables + if (entry->initInfo->reset != NULL) { + entry->initInfo->reset(); + } + // #endregion + + // 2S2H [Port] ramAddr will always be NULL for the port, so this block will never run void* ramAddr = entry->loadedRamAddr; if (ramAddr != NULL) { @@ -3282,6 +3290,7 @@ ActorInit* Actor_LoadOverlay(ActorContext* actorCtx, s16 index) { overlaySize = (uintptr_t)overlayEntry->vramEnd - (uintptr_t)overlayEntry->vramStart; + // 2S2H [Port] vramStart will always be NULL in the port, so the else block is never run if (overlayEntry->vramStart == NULL) { actorInit = overlayEntry->initInfo; } else { @@ -3348,7 +3357,12 @@ Actor* Actor_SpawnAsChildAndCutscene(ActorContext* actorCtx, PlayState* play, s1 } overlayEntry = &gActorOverlayTable[index]; - if (overlayEntry->vramStart != NULL) { + // #region 2S2H [Port] Our actors are always loaded and have no vramStart + // but we want to simulate them being unloaded to execute our actor reset funcs + // for static variable cleanup + // if (overlayEntry->vramStart != NULL) { + if (true) { + // #endregion overlayEntry->numLoaded++; } @@ -3499,12 +3513,15 @@ Actor* Actor_Delete(ActorContext* actorCtx, Actor* actor, PlayState* play) { newHead = Actor_RemoveFromCategory(play, actorCtx, actor); ZeldaArena_Free(actor); - // BENTODO shouldn't need this check - if (overlayEntry != NULL) { - if (overlayEntry->vramStart != NULL) { - overlayEntry->numLoaded--; - Actor_FreeOverlay(overlayEntry); - } + + // #region 2S2H [Port] Our actors are always loaded and have no vramStart + // but we want to simulate them being unloaded to execute our actor reset funcs + // for static variable cleanup + // if (overlayEntry->vramStart != NULL) { + if (true) { + // #endregion + overlayEntry->numLoaded--; + Actor_FreeOverlay(overlayEntry); } return newHead; diff --git a/mm/src/overlays/actors/ovl_Bg_Crace_Movebg/z_bg_crace_movebg.c b/mm/src/overlays/actors/ovl_Bg_Crace_Movebg/z_bg_crace_movebg.c index 1a7382761..d103676ac 100644 --- a/mm/src/overlays/actors/ovl_Bg_Crace_Movebg/z_bg_crace_movebg.c +++ b/mm/src/overlays/actors/ovl_Bg_Crace_Movebg/z_bg_crace_movebg.c @@ -15,6 +15,7 @@ void BgCraceMovebg_Init(Actor* thisx, PlayState* play); void BgCraceMovebg_Destroy(Actor* thisx, PlayState* play); void BgCraceMovebg_Update(Actor* thisx, PlayState* play); void BgCraceMovebg_Draw(Actor* thisx, PlayState* play); +void BgCraceMovebg_Reset(void); s32 BgCraceMovebg_GetRaceStatus(PlayState* play); void BgCraceMovebg_OpeningDoor_SetupIdle(BgCraceMovebg* this, PlayState* play); @@ -51,6 +52,7 @@ ActorInit Bg_Crace_Movebg_InitVars = { /**/ BgCraceMovebg_Destroy, /**/ BgCraceMovebg_Update, /**/ BgCraceMovebg_Draw, + /**/ BgCraceMovebg_Reset, }; static u8 sHasInitializedIsLoaded = 0; @@ -353,3 +355,8 @@ void BgCraceMovebg_ClosingDoor_DoNothing(BgCraceMovebg* this, PlayState* play) { void BgCraceMovebg_Draw(Actor* thisx, PlayState* play) { Gfx_DrawDListOpa(play, gDekuShrineSlidingDoorDL); } + +void BgCraceMovebg_Reset(void) { + sHasInitializedIsLoaded = false; + sLoadedDoorCount = 0; +} diff --git a/mm/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c b/mm/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c index 513205f5f..0b13027f5 100644 --- a/mm/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c +++ b/mm/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c @@ -16,6 +16,7 @@ void BgF40Switch_Init(Actor* thisx, PlayState* play); void BgF40Switch_Destroy(Actor* thisx, PlayState* play); void BgF40Switch_Update(Actor* thisx, PlayState* play); void BgF40Switch_Draw(Actor* thisx, PlayState* play); +void BgF40Switch_Reset(void); void BgF40Switch_CheckAll(BgF40Switch* this, PlayState* play); void BgF40Switch_Unpress(BgF40Switch* this, PlayState* play); @@ -34,6 +35,7 @@ ActorInit Bg_F40_Switch_InitVars = { /**/ BgF40Switch_Destroy, /**/ BgF40Switch_Update, /**/ BgF40Switch_Draw, + /**/ BgF40Switch_Reset, }; s32 sBgF40SwitchGlobalsInitialized = false; @@ -192,3 +194,7 @@ void BgF40Switch_Draw(Actor* thisx, PlayState* play) { Gfx_DrawDListOpa(play, gStoneTowerFloorSwitchDL); Gfx_DrawDListOpa(play, gStoneTowerFloorSwitchOutlineDL); } + +void BgF40Switch_Reset(void) { + sBgF40SwitchGlobalsInitialized = false; +} diff --git a/mm/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c b/mm/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c index 01d09277d..0971a1124 100644 --- a/mm/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c +++ b/mm/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c @@ -18,6 +18,7 @@ void BgHakuginPost_Init(Actor* thisx, PlayState* play); void BgHakuginPost_Destroy(Actor* thisx, PlayState* play); void BgHakuginPost_Update(Actor* thisx, PlayState* play); +void BgHakuginPost_Reset(void); void func_80A9CA94(BgHakuginPost* this); void func_80A9CAA8(BgHakuginPost* this, PlayState* play); @@ -50,6 +51,7 @@ ActorInit Bg_Hakugin_Post_InitVars = { /**/ BgHakuginPost_Destroy, /**/ BgHakuginPost_Update, /**/ NULL, + /**/ BgHakuginPost_Reset, }; typedef struct { @@ -688,8 +690,13 @@ void func_80A9C854(BgHakuginPost* this, PlayState* play) { } } +// #region 2S2H [Port] +// Moved static vars out of function scope so they can be cleared in actor reset +static s32 D_80A9D8FC = 1; + void BgHakuginPost_Init(Actor* thisx, PlayState* play) { - static s32 D_80A9D8FC = 1; + // static s32 D_80A9D8FC = 1; + // #endregion BgHakuginPost* this = THIS; if (D_80A9D8FC != 0) { @@ -1048,3 +1055,7 @@ void func_80A9D61C(Actor* thisx, PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } + +void BgHakuginPost_Reset(void) { + D_80A9D8FC = 1; +} diff --git a/mm/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c b/mm/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c index 40a8c3ca2..5634b7ac7 100644 --- a/mm/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c +++ b/mm/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c @@ -15,6 +15,7 @@ void BgIcefloe_Init(Actor* thisx, PlayState* play); void BgIcefloe_Destroy(Actor* thisx, PlayState* play); void BgIcefloe_Update(Actor* thisx, PlayState* play); void BgIcefloe_Draw(Actor* thisx, PlayState* play); +void BgIcefloe_Reset(void); void func_80AC4A80(BgIcefloe* this, PlayState* play); void BgIcefloe_Grow(BgIcefloe* this, PlayState* play); @@ -33,6 +34,7 @@ ActorInit Bg_Icefloe_InitVars = { /**/ BgIcefloe_Destroy, /**/ BgIcefloe_Update, /**/ BgIcefloe_Draw, + /**/ BgIcefloe_Reset, }; static BgIcefloe* sSpawnedInstances[] = { NULL, NULL, NULL }; @@ -175,3 +177,11 @@ void BgIcefloe_Draw(Actor* thisx, PlayState* play) { Gfx_DrawDListOpa(play, gIcefloeIcePlatformDL); } + +void BgIcefloe_Reset(void) { + numberSpawned = 0; + + for (int i = 0; i < ARRAY_COUNT(sSpawnedInstances); i++) { + sSpawnedInstances[i] = NULL; + } +} diff --git a/mm/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c b/mm/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c index c07278e19..69878566f 100644 --- a/mm/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c +++ b/mm/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c @@ -16,6 +16,7 @@ void BgIkanaDharma_Init(Actor* thisx, PlayState* play2); void BgIkanaDharma_Destroy(Actor* thisx, PlayState* play); void BgIkanaDharma_Update(Actor* thisx, PlayState* play); void BgIkanaDharma_Draw(Actor* thisx, PlayState* play); +void BgIkanaDharma_Reset(void); void BgIkanaDharma_SetupWaitForHit(BgIkanaDharma* this); void BgIkanaDharma_WaitForHit(BgIkanaDharma* this, PlayState* play); @@ -34,6 +35,7 @@ ActorInit Bg_Ikana_Dharma_InitVars = { /**/ BgIkanaDharma_Destroy, /**/ BgIkanaDharma_Update, /**/ BgIkanaDharma_Draw, + /**/ BgIkanaDharma_Reset, }; static ColliderCylinderInit sCylinderInit = { @@ -262,3 +264,7 @@ void BgIkanaDharma_Draw(Actor* thisx, PlayState* play) { Gfx_DrawDListOpa(play, gStoneTowerTemplePunchablePillarDL); } + +void BgIkanaDharma_Reset(void) { + sFirstHitBgIkanaDharma = NULL; +} diff --git a/mm/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.c b/mm/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.c index e57334605..f7e79cba0 100644 --- a/mm/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.c +++ b/mm/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.c @@ -22,6 +22,7 @@ void BgSinkaiKabe_Init(Actor* thisx, PlayState* play); void BgSinkaiKabe_Destroy(Actor* thisx, PlayState* play); void BgSinkaiKabe_Update(Actor* thisx, PlayState* play); +void BgSinkaiKabe_Reset(void); void BgSinkaiKabe_WaitForPlayer(BgSinkaiKabe* this, PlayState* play); @@ -35,6 +36,7 @@ ActorInit Bg_Sinkai_Kabe_InitVars = { /**/ BgSinkaiKabe_Destroy, /**/ BgSinkaiKabe_Update, /**/ NULL, + /**/ BgSinkaiKabe_Reset, }; static s32 sCurrentPythonIndex = 0; @@ -150,3 +152,7 @@ void BgSinkaiKabe_Update(Actor* thisx, PlayState* play) { this->actionFunc(this, play); } + +void BgSinkaiKabe_Reset(void) { + sCurrentPythonIndex = 0; +} diff --git a/mm/src/overlays/actors/ovl_Boss_01/z_boss_01.c b/mm/src/overlays/actors/ovl_Boss_01/z_boss_01.c index 3674a227b..2970e0c4e 100644 --- a/mm/src/overlays/actors/ovl_Boss_01/z_boss_01.c +++ b/mm/src/overlays/actors/ovl_Boss_01/z_boss_01.c @@ -49,6 +49,7 @@ void Boss01_Init(Actor* thisx, PlayState* play); void Boss01_Destroy(Actor* thisx, PlayState* play); void Boss01_Update(Actor* thisx, PlayState* play2); void Boss01_Draw(Actor* thisx, PlayState* play); +void Boss01_Reset(void); void Boss01_SetupIntroCutscene(Boss01* this, PlayState* play); void Boss01_IntroCutscene(Boss01* this, PlayState* play); @@ -646,6 +647,7 @@ ActorInit Boss_01_InitVars = { /**/ Boss01_Destroy, /**/ Boss01_Update, /**/ Boss01_Draw, + /**/ Boss01_Reset, }; static Color_RGBA8 sDustPrimColor = { 60, 50, 20, 255 }; @@ -3588,3 +3590,14 @@ void Boss01_DrawEffects(PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } + +void Boss01_Reset(void) { + sOdolwaBugCount = 0; + sOdolwa = NULL; + sMothSwarm = NULL; + sOdolwaMusicStartTimer = 0; + + for (int i = 0; i < ODOLWA_EFFECT_COUNT; i++) { + sOdolwaEffects[i].type = ODOLWA_EFFECT_NONE; + } +} diff --git a/mm/src/overlays/actors/ovl_Boss_02/z_boss_02.c b/mm/src/overlays/actors/ovl_Boss_02/z_boss_02.c index 691931fce..8bde2289b 100644 --- a/mm/src/overlays/actors/ovl_Boss_02/z_boss_02.c +++ b/mm/src/overlays/actors/ovl_Boss_02/z_boss_02.c @@ -20,6 +20,7 @@ void Boss02_Init(Actor* thisx, PlayState* play); void Boss02_Destroy(Actor* thisx, PlayState* play); void Boss02_Twinmold_Update(Actor* thisx, PlayState* play); void Boss02_Twinmold_Draw(Actor* thisx, PlayState* play2); +void Boss02_Reset(void); void func_809DAA74(Boss02* this, PlayState* play); void func_809DAA98(Boss02* this, PlayState* play); @@ -153,6 +154,7 @@ ActorInit Boss_02_InitVars = { /**/ Boss02_Destroy, /**/ Boss02_Twinmold_Update, /**/ Boss02_Twinmold_Draw, + /**/ Boss02_Reset, }; /** @@ -2327,3 +2329,18 @@ void func_809DEAC4(Boss02* this, PlayState* play) { ShrinkWindow_Letterbox_SetSizeTarget(27); } } + +void Boss02_Reset(void) { + sCanSkipMaskOnCs = false; + sCanSkipMaskOffCs = false; + sIsInGiantMode = false; + sRedTwinmold = NULL; + sBlueTwinmold = NULL; + sTwinmoldStatic = NULL; + sTwinmoldMusicStartTimer = 0; + sBlueWarp = NULL; + + for (int i = 0; i < TWINMOLD_EFFECT_COUNT; i++) { + sTwinmoldEffects[i].type = TWINMOLD_EFFECT_NONE; + } +} diff --git a/mm/src/overlays/actors/ovl_Boss_03/z_boss_03.c b/mm/src/overlays/actors/ovl_Boss_03/z_boss_03.c index ba994a3bf..df29ec0e3 100644 --- a/mm/src/overlays/actors/ovl_Boss_03/z_boss_03.c +++ b/mm/src/overlays/actors/ovl_Boss_03/z_boss_03.c @@ -2646,3 +2646,14 @@ void Boss03_SeaweedDraw(Actor* thisx, PlayState* play) { } /* End of Seaweed section */ + +void Boss03_Reset(void) { + D_809E9840 = 0; + D_809E9841 = 0; + D_809E9842 = 0; + sGyorgBossInstance = NULL; + + for (int i = 0; i < GYORG_EFFECT_COUNT; i++) { + sGyorgEffects[i].type = GYORG_EFFECT_NONE; + } +} diff --git a/mm/src/overlays/actors/ovl_Boss_04/z_boss_04.c b/mm/src/overlays/actors/ovl_Boss_04/z_boss_04.c index 1e9736b5f..54b60746e 100644 --- a/mm/src/overlays/actors/ovl_Boss_04/z_boss_04.c +++ b/mm/src/overlays/actors/ovl_Boss_04/z_boss_04.c @@ -16,6 +16,7 @@ void Boss04_Init(Actor* thisx, PlayState* play2); void Boss04_Destroy(Actor* thisx, PlayState* play); void Boss04_Update(Actor* thisx, PlayState* play2); void Boss04_Draw(Actor* thisx, PlayState* play); +void Boss04_Reset(void); void func_809EC544(Boss04* this); void func_809EC568(Boss04* this, PlayState* play); @@ -73,6 +74,7 @@ ActorInit Boss_04_InitVars = { /**/ Boss04_Destroy, /**/ Boss04_Update, /**/ Boss04_Draw, + /**/ Boss04_Reset, }; static ColliderJntSphElementInit sJntSphElementsInit1[1] = { @@ -849,3 +851,7 @@ void Boss04_Draw(Actor* thisx, PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } + +void Boss04_Reset(void) { + D_809EE4D0 = 0; +} diff --git a/mm/src/overlays/actors/ovl_Boss_06/z_boss_06.c b/mm/src/overlays/actors/ovl_Boss_06/z_boss_06.c index 6e64373ec..45babf636 100644 --- a/mm/src/overlays/actors/ovl_Boss_06/z_boss_06.c +++ b/mm/src/overlays/actors/ovl_Boss_06/z_boss_06.c @@ -21,6 +21,7 @@ void Boss06_Init(Actor* thisx, PlayState* play); void Boss06_Destroy(Actor* thisx, PlayState* play); void Boss06_Update(Actor* thisx, PlayState* play); void Boss06_Draw(Actor* thisx, PlayState* play2); +void Boss06_Reset(void); void func_809F24A8(Boss06* this); void func_809F24C8(Boss06* this, PlayState* play); @@ -82,6 +83,7 @@ ActorInit Boss_06_InitVars = { /**/ Boss06_Destroy, /**/ Boss06_Update, /**/ Boss06_Draw, + /**/ Boss06_Reset, }; static ColliderCylinderInit sCylinderInit = { @@ -655,3 +657,10 @@ void Boss06_Draw(Actor* thisx, PlayState* play2) { CLOSE_DISPS(play->state.gfxCtx); } + +void Boss06_Reset(void) { + D_809F4970 = NULL; + D_809F4974 = 0; + D_809F4978 = 0; + D_809F497C = 0; +} diff --git a/mm/src/overlays/actors/ovl_Boss_07/z_boss_07.c b/mm/src/overlays/actors/ovl_Boss_07/z_boss_07.c index 4be78b02a..7ce386e51 100644 --- a/mm/src/overlays/actors/ovl_Boss_07/z_boss_07.c +++ b/mm/src/overlays/actors/ovl_Boss_07/z_boss_07.c @@ -252,6 +252,7 @@ void Boss07_Mask_ClearBeam(Boss07* this); void Boss07_Init(Actor* thisx, PlayState* play2); void Boss07_Destroy(Actor* thisx, PlayState* play2); +void Boss07_Reset(void); void Boss07_Wrath_Update(Actor* thisx, PlayState* play2); void Boss07_Static_Update(Actor* thisx, PlayState* play2); @@ -384,6 +385,7 @@ ActorInit Boss_07_InitVars = { (ActorFunc)Boss07_Destroy, (ActorFunc)Boss07_Wrath_Update, (ActorFunc)Boss07_Wrath_Draw, + /**/ Boss07_Reset, }; #include "z_boss_07_colchk.inc" @@ -6068,3 +6070,26 @@ void Boss07_Static_DrawEffects(PlayState* play) { } CLOSE_DISPS(gfxCtx); } + +void Boss07_Reset(void) { + sHeartbeatTimer = 0; + sWhipSegCount = 0; + sMajorasWrath = NULL; + sMajoraStatic = NULL; + sMajorasMask = NULL; + + for (int i = 0; i < REMAINS_COUNT; i++) { + sBossRemains[i] = NULL; + } + + sKillProjectiles = 0; + sMusicStartTimer = 0; + + for (int i = 0; i < EFFECT_COUNT; i++) { + sEffects[i].type = MAJORAS_EFFECT_NONE; + } + + sSeed0 = 0; + sSeed1 = 0; + sSeed2 = 0; +} diff --git a/mm/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c b/mm/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c index cbd37c138..98170cf72 100644 --- a/mm/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c +++ b/mm/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c @@ -17,6 +17,7 @@ void DemoKankyo_Init(Actor* thisx, PlayState* play); void DemoKankyo_Destroy(Actor* thisx, PlayState* play); void DemoKankyo_Update(Actor* thisx, PlayState* play); void DemoKankyo_Draw(Actor* thisx, PlayState* play); +void DemoKankyo_Reset(void); void DemoKakyo_MoonSparklesActionFunc(DemoKankyo* this, PlayState* play); @@ -33,6 +34,7 @@ ActorInit Demo_Kankyo_InitVars = { /**/ DemoKankyo_Destroy, /**/ DemoKankyo_Update, /**/ DemoKankyo_Draw, + /**/ DemoKankyo_Reset, }; static s32 sObjectBubbleId = OBJECT_BUBBLE | 0x10000; @@ -681,3 +683,8 @@ void DemoKankyo_Draw(Actor* thisx, PlayState* play) { break; } } + +void DemoKankyo_Reset(void) { + sLostWoodsSparklesMutex = false; + sLostWoodsSkyFishParticleNum = 0; +} diff --git a/mm/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/mm/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 938f41edb..9cf16722f 100644 --- a/mm/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/mm/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -16,6 +16,7 @@ void DoorWarp1_Init(Actor* thisx, PlayState* play); void DoorWarp1_Destroy(Actor* thisx, PlayState* play); void DoorWarp1_Update(Actor* thisx, PlayState* play); void DoorWarp1_Draw(Actor* thisx, PlayState* play); +void DoorWarp1_Reset(void); void DoorWarp1_SetupAction(DoorWarp1* this, DoorWarp1ActionFunc actionFunc); void func_808B8924(DoorWarp1* this, PlayState* play); @@ -60,6 +61,7 @@ ActorInit Door_Warp1_InitVars = { /**/ DoorWarp1_Destroy, /**/ DoorWarp1_Update, /**/ DoorWarp1_Draw, + /**/ DoorWarp1_Reset, }; static InitChainEntry sInitChain[] = { @@ -1154,3 +1156,8 @@ void func_808BB8D4(DoorWarp1* this, PlayState* play, s32 arg2) { EffectSsKirakira_SpawnDispersed(play, &pos, &sVelocity, &sAccel, &primColor, &envColor, scale, life); } } + +void DoorWarp1_Reset(void) { + D_808BC000 = 0; + D_808BC004 = 0; +} diff --git a/mm/src/overlays/actors/ovl_En_Dg/z_en_dg.c b/mm/src/overlays/actors/ovl_En_Dg/z_en_dg.c index 82cf4fc3f..8d25205f5 100644 --- a/mm/src/overlays/actors/ovl_En_Dg/z_en_dg.c +++ b/mm/src/overlays/actors/ovl_En_Dg/z_en_dg.c @@ -15,6 +15,7 @@ void EnDg_Init(Actor* thisx, PlayState* play); void EnDg_Destroy(Actor* thisx, PlayState* play); void EnDg_Update(Actor* thisx, PlayState* play); void EnDg_Draw(Actor* thisx, PlayState* play); +void EnDg_Reset(void); void EnDg_IdleMove(EnDg* this, PlayState* play); void EnDg_IdleBark(EnDg* this, PlayState* play); @@ -47,6 +48,7 @@ ActorInit En_Dg_InitVars = { /**/ EnDg_Destroy, /**/ EnDg_Update, /**/ EnDg_Draw, + /**/ EnDg_Reset, }; #define DOG_FLAG_NONE 0 @@ -1437,3 +1439,8 @@ void EnDg_Draw(Actor* thisx, PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } + +void EnDg_Reset(void) { + sIsAnyDogHeld = false; + sBremenMaskFollowerIndex = ENDG_INDEX_NO_BREMEN_MASK_FOLLOWER; +} diff --git a/mm/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c b/mm/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c index bf4167335..3e088f085 100644 --- a/mm/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c +++ b/mm/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c @@ -13,6 +13,7 @@ void EnDnk_Init(Actor* thisx, PlayState* play); void EnDnk_Destroy(Actor* thisx, PlayState* play); void EnDnk_Update(Actor* thisx, PlayState* play); +void EnDnk_Reset(void); void EnDnk_HandleCutscene(EnDnk* this, PlayState* play); void EnDnk_DoNothing(EnDnk* this, PlayState* play); @@ -31,6 +32,7 @@ ActorInit En_Dnk_InitVars = { /**/ EnDnk_Destroy, /**/ EnDnk_Update, /**/ NULL, + /**/ EnDnk_Reset, }; static ColliderCylinderInit sCylinderInit = { @@ -500,3 +502,7 @@ void func_80A52134(EnDnk* this, PlayState* play) { func_80A52074(this, play); } } + +void EnDnk_Reset(void) { + D_80A521A0 = 0; +} diff --git a/mm/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c b/mm/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c index 5ec892f13..084d15282 100644 --- a/mm/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c +++ b/mm/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c @@ -15,6 +15,7 @@ void EnDragon_Init(Actor* thisx, PlayState* play); void EnDragon_Destroy(Actor* thisx, PlayState* play); void EnDragon_Update(Actor* thisx, PlayState* play); void EnDragon_Draw(Actor* thisx, PlayState* play); +void EnDragon_Reset(void); void EnDragon_SetupRetreatOrIdle(EnDragon* this); void EnDragon_RetreatOrIdle(EnDragon* this, PlayState* play); @@ -54,6 +55,7 @@ ActorInit En_Dragon_InitVars = { /**/ EnDragon_Destroy, /**/ EnDragon_Update, /**/ EnDragon_Draw, + /**/ EnDragon_Reset, }; typedef enum { @@ -848,3 +850,7 @@ void EnDragon_Draw(Actor* thisx, PlayState* play) { SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, EnDragon_OverrideLimbDraw, EnDragon_PostLimbDraw, &this->actor); } + +void EnDragon_Reset(void) { + sNumPythonsDead = 0; +} diff --git a/mm/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c b/mm/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c index aceda34c4..4ff0b449c 100644 --- a/mm/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c +++ b/mm/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c @@ -17,6 +17,7 @@ void EnFish2_Init(Actor* thisx, PlayState* play); void EnFish2_Destroy(Actor* thisx, PlayState* play); void EnFish2_Update(Actor* thisx, PlayState* play2); void EnFish2_Draw(Actor* thisx, PlayState* play); +void EnFish2_Reset(void); void func_80B28B5C(EnFish2* this); void func_80B28C14(EnFish2* this, PlayState* play); @@ -58,6 +59,7 @@ ActorInit En_Fish2_InitVars = { /**/ EnFish2_Destroy, /**/ EnFish2_Update, /**/ EnFish2_Draw, + /**/ EnFish2_Reset, }; static ColliderJntSphElementInit sJntSphElementsInit[2] = { @@ -1195,3 +1197,12 @@ void func_80B2B180(EnFish2* this, PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } + +void EnFish2_Reset(void) { + D_80B2B2E0 = 0; + D_80B2B2E4 = 0; + D_80B2B2E8 = false; + D_80B2B2EC = 0; + D_80B2B2F0 = 0; + D_80B2B2F4 = NULL; +} diff --git a/mm/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c b/mm/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c index 4052459c8..b09cc23fa 100644 --- a/mm/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c +++ b/mm/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c @@ -18,6 +18,7 @@ void EnKusa2_Init(Actor* thisx, PlayState* play); void EnKusa2_Destroy(Actor* thisx, PlayState* play); void EnKusa2_Update(Actor* thisx, PlayState* play); void EnKusa2_Draw(Actor* thisx, PlayState* play); +void EnKusa2_Reset(void); void func_80A5C70C(EnKusa2UnkBssSubStruct* arg0); void func_80A5CF44(EnKusa2* this); @@ -65,6 +66,7 @@ ActorInit En_Kusa2_InitVars = { /**/ EnKusa2_Destroy, /**/ EnKusa2_Update, /**/ EnKusa2_Draw, + /**/ EnKusa2_Reset, }; static ColliderCylinderInit sCylinderInit = { @@ -1387,3 +1389,8 @@ void func_80A5EA48(Actor* thisx, PlayState* play) { func_80A5E80C(play, this->unk_1CF); } } + +void EnKusa2_Reset(void) { + D_80A5EAEC = 1; + D_80A5EAF0 = 0; +} diff --git a/mm/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c b/mm/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c index 88c259312..d6f1a7fa0 100644 --- a/mm/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c +++ b/mm/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c @@ -15,6 +15,7 @@ void EnLiftNuts_Init(Actor* thisx, PlayState* play); void EnLiftNuts_Destroy(Actor* thisx, PlayState* play); void EnLiftNuts_Update(Actor* thisx, PlayState* play); void EnLiftNuts_Draw(Actor* thisx, PlayState* play); +void EnLiftNuts_Reset(void); void EnLiftNuts_HandleConversation5(EnLiftNuts* this, PlayState* play); @@ -59,6 +60,7 @@ ActorInit En_Lift_Nuts_InitVars = { /**/ EnLiftNuts_Destroy, /**/ EnLiftNuts_Update, /**/ EnLiftNuts_Draw, + /**/ EnLiftNuts_Reset, }; typedef enum { @@ -133,9 +135,18 @@ static ColliderCylinderInit sCylinderInit = { static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE }; +// #region 2S2H [Port] +// Moved static vars out of function scope so they can be cleared in actor reset +static s16 sMinigameScore = 0; +static s32 sAddedSharedMemory = false; +static s16 sFreedSharedMemory = false; +static s32 sIsAutotalkOn = false; +// #endregion + void EnLiftNuts_AddSharedMemoryEntry(EnLiftNuts* this, PlayState* play) { - static s16 sMinigameScore = 0; - static s32 sAddedSharedMemory = false; + // 2S2H [Port] Moved to file level scope + // static s16 sMinigameScore = 0; + // static s32 sAddedSharedMemory = false; if (!sAddedSharedMemory) { Actor_AddSharedMemoryEntry(play, ACTOR_EN_GAMELUPY, &sMinigameScore, sizeof(s16)); @@ -145,7 +156,8 @@ void EnLiftNuts_AddSharedMemoryEntry(EnLiftNuts* this, PlayState* play) { } void EnLiftNuts_FreeSharedMemoryEntry(EnLiftNuts* this, PlayState* play) { - static s16 sFreedSharedMemory = false; + // 2S2H [Port] Moved to file level scope + // static s16 sFreedSharedMemory = false; if (!sFreedSharedMemory) { Actor_FreeSharedMemoryEntry(play, ACTOR_EN_GAMELUPY); @@ -160,7 +172,8 @@ typedef enum { } EnLiftNutsAutotalkMode; s32 EnLiftNuts_Autotalk(EnLiftNuts* this, EnLiftNutsAutotalkMode mode) { - static s32 sIsAutotalkOn = false; + // 2S2H [Port] Moved to file level scope + // static s32 sIsAutotalkOn = false; switch (mode) { case ENLIFTNUTS_AUTOTALK_MODE_CHECK_OFF: @@ -1109,3 +1122,10 @@ void EnLiftNuts_Draw(Actor* thisx, PlayState* play) { SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, EnLiftNuts_OverrideLimbDraw, EnLiftNuts_PostLimbDraw, thisx); } + +void EnLiftNuts_Reset(void) { + sMinigameScore = 0; + sAddedSharedMemory = false; + sFreedSharedMemory = false; + sIsAutotalkOn = false; +} diff --git a/mm/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c b/mm/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c index 68945dd24..97103237c 100644 --- a/mm/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c +++ b/mm/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c @@ -15,6 +15,7 @@ void EnLookNuts_Init(Actor* thisx, PlayState* play); void EnLookNuts_Destroy(Actor* thisx, PlayState* play); void EnLookNuts_Update(Actor* thisx, PlayState* play); void EnLookNuts_Draw(Actor* thisx, PlayState* play); +void EnLookNuts_Reset(void); void EnLookNuts_SetupPatrol(EnLookNuts* this); void EnLookNuts_Patrol(EnLookNuts* this, PlayState* play); @@ -34,6 +35,7 @@ ActorInit En_Look_Nuts_InitVars = { /**/ EnLookNuts_Destroy, /**/ EnLookNuts_Update, /**/ EnLookNuts_Draw, + /**/ EnLookNuts_Reset, }; static ColliderCylinderInit sCylinderInit = { @@ -404,3 +406,7 @@ void EnLookNuts_Draw(Actor* thisx, PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } + +void EnLookNuts_Reset(void) { + D_80A6862C = 0; +} diff --git a/mm/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c b/mm/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c index 2466fa751..2035b1705 100644 --- a/mm/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c +++ b/mm/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c @@ -20,6 +20,7 @@ void EnRacedog_Init(Actor* thisx, PlayState* play); void EnRacedog_Destroy(Actor* thisx, PlayState* play); void EnRacedog_Update(Actor* thisx, PlayState* play); void EnRacedog_Draw(Actor* thisx, PlayState* play); +void EnRacedog_Reset(void); void EnRacedog_RaceStart(EnRacedog* this, PlayState* play); void EnRacedog_Race(EnRacedog* this, PlayState* play); @@ -831,3 +832,10 @@ void EnRacedog_Draw(Actor* thisx, PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } + +void EnRacedog_Reset(void) { + sNumberOfDogsFinished = 0; + sFirstPlaceIndex = -1; + sSprintTimer = 0; + sFurthestPoint = -1; +} diff --git a/mm/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c b/mm/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c index 6582d8b62..c4ed69ffb 100644 --- a/mm/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c +++ b/mm/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c @@ -16,6 +16,7 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2); void EnSyatekiDekunuts_Destroy(Actor* thisx, PlayState* play); void EnSyatekiDekunuts_Update(Actor* thisx, PlayState* play); void EnSyatekiDekunuts_Draw(Actor* thisx, PlayState* play); +void EnSyatekiDekunuts_Reset(void); void EnSyatekiDekunuts_SetupWaitForSignal(EnSyatekiDekunuts* this); void EnSyatekiDekunuts_WaitForSignal(EnSyatekiDekunuts* this, PlayState* play); @@ -49,6 +50,7 @@ ActorInit En_Syateki_Dekunuts_InitVars = { /**/ EnSyatekiDekunuts_Destroy, /**/ EnSyatekiDekunuts_Update, /**/ EnSyatekiDekunuts_Draw, + /**/ EnSyatekiDekunuts_Reset, }; static ColliderCylinderInit sCylinderInit = { @@ -99,8 +101,13 @@ static InitChainEntry sInitChain[] = { ICHAIN_F32(targetArrowOffset, 2600, ICHAIN_STOP), }; +// #region 2S2H [Port] +// Moved static vars out of function scope so they can be cleared in actor reset +static s32 sDrawFlowers = true; // This makes it so only one EnSyatekiDekunuts draws all the flowers. + void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) { - static s32 sDrawFlowers = true; // This makes it so only one EnSyatekiDekunuts draws all the flowers. + // static s32 sDrawFlowers = true; // This makes it so only one EnSyatekiDekunuts draws all the flowers. + // #endregion EnSyatekiDekunuts* this = THIS; PlayState* play = play2; s32 pathType; @@ -485,3 +492,7 @@ void EnSyatekiDekunuts_Draw(Actor* thisx, PlayState* play) { } } } + +void EnSyatekiDekunuts_Reset(void) { + sDrawFlowers = true; +} diff --git a/mm/src/overlays/actors/ovl_En_Test4/z_en_test4.c b/mm/src/overlays/actors/ovl_En_Test4/z_en_test4.c index e23507ded..5900c4a9c 100644 --- a/mm/src/overlays/actors/ovl_En_Test4/z_en_test4.c +++ b/mm/src/overlays/actors/ovl_En_Test4/z_en_test4.c @@ -16,6 +16,7 @@ void EnTest4_Init(Actor* thisx, PlayState* play); void EnTest4_Destroy(Actor* thisx, PlayState* play); void EnTest4_Update(Actor* thisx, PlayState* play); +void EnTest4_Reset(void); void func_80A42AB8(EnTest4* this, PlayState* play); void func_80A42F20(EnTest4* this, PlayState* play); @@ -30,6 +31,7 @@ ActorInit En_Test4_InitVars = { (ActorFunc)EnTest4_Destroy, (ActorFunc)EnTest4_Update, (ActorFunc)NULL, // Interface_DrawClock + /**/ EnTest4_Reset, }; typedef enum { @@ -586,3 +588,7 @@ void EnTest4_Update(Actor* thisx, PlayState* play) { EnTest4_SetSkyboxNumStars(this, play); } } + +void EnTest4_Reset(void) { + sIsLoaded = false; +} diff --git a/mm/src/overlays/actors/ovl_En_Tk/z_en_tk.c b/mm/src/overlays/actors/ovl_En_Tk/z_en_tk.c index bedd5369d..312752827 100644 --- a/mm/src/overlays/actors/ovl_En_Tk/z_en_tk.c +++ b/mm/src/overlays/actors/ovl_En_Tk/z_en_tk.c @@ -17,6 +17,7 @@ void EnTk_Init(Actor* thisx, PlayState* play); void EnTk_Destroy(Actor* thisx, PlayState* play); void EnTk_Update(Actor* thisx, PlayState* play); void EnTk_Draw(Actor* thisx, PlayState* play); +void EnTk_Reset(void); void func_80AECA3C(EnTk* this, PlayState* play); void func_80AECA90(EnTk* this, PlayState* play); @@ -79,6 +80,7 @@ ActorInit En_Tk_InitVars = { /**/ EnTk_Destroy, /**/ EnTk_Update, /**/ EnTk_Draw, + /**/ EnTk_Reset, }; static ColliderCylinderInit sCylinderInit = { @@ -1394,3 +1396,7 @@ void EnTk_Draw(Actor* thisx, PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } + +void EnTk_Reset(void) { + D_80AF0050 = 0; +} diff --git a/mm/src/overlays/actors/ovl_En_Twig/z_en_twig.c b/mm/src/overlays/actors/ovl_En_Twig/z_en_twig.c index d6dd30c07..02ee0dda7 100644 --- a/mm/src/overlays/actors/ovl_En_Twig/z_en_twig.c +++ b/mm/src/overlays/actors/ovl_En_Twig/z_en_twig.c @@ -14,6 +14,7 @@ void EnTwig_Init(Actor* thisx, PlayState* play2); void EnTwig_Destroy(Actor* thisx, PlayState* play2); void EnTwig_Update(Actor* thisx, PlayState* play2); void EnTwig_Draw(Actor* thisx, PlayState* play); +void EnTwig_Reset(void); void func_80AC0A54(EnTwig* this, PlayState* play); void func_80AC0A6C(EnTwig* this, PlayState* play); @@ -34,6 +35,7 @@ ActorInit En_Twig_InitVars = { /**/ EnTwig_Destroy, /**/ EnTwig_Update, /**/ EnTwig_Draw, + /**/ EnTwig_Reset, }; s32 sCurrentRing; @@ -246,3 +248,7 @@ void EnTwig_Draw(Actor* thisx, PlayState* play) { break; } } + +void EnTwig_Reset(void) { + sRingsHaveSpawned = false; +} diff --git a/mm/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c b/mm/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c index b632b0fa8..99b0d2ace 100644 --- a/mm/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c +++ b/mm/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c @@ -24,6 +24,7 @@ void ObjChan_Init(Actor* thisx, PlayState* play); void ObjChan_Destroy(Actor* thisx, PlayState* play); void ObjChan_Update(Actor* thisx, PlayState* play); void ObjChan_Draw(Actor* thisx, PlayState* play); +void ObjChan_Reset(void); void ObjChan_ChandelierAction(ObjChan* this, PlayState* play); void ObjChan_PotAction(ObjChan* this, PlayState* play); @@ -38,6 +39,7 @@ ActorInit Obj_Chan_InitVars = { /**/ ObjChan_Destroy, /**/ ObjChan_Update, /**/ ObjChan_Draw, + /**/ ObjChan_Reset, }; static ColliderCylinderInit sObjChanCylinderInit = { @@ -442,3 +444,7 @@ void ObjChan_DrawFire(ObjChan* this, PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } + +void ObjChan_Reset(void) { + sObjChanLoaded = false; +} diff --git a/mm/src/overlays/actors/ovl_Obj_Grass_Unit/z_obj_grass_unit.c b/mm/src/overlays/actors/ovl_Obj_Grass_Unit/z_obj_grass_unit.c index 4b6d995ac..c18884b56 100644 --- a/mm/src/overlays/actors/ovl_Obj_Grass_Unit/z_obj_grass_unit.c +++ b/mm/src/overlays/actors/ovl_Obj_Grass_Unit/z_obj_grass_unit.c @@ -20,6 +20,7 @@ #define THIS ((ObjGrassUnit*)thisx) void ObjGrassUnit_Init(Actor* this, PlayState* play2); +void ObjGrassUnit_Reset(void); ActorInit Obj_Grass_Unit_InitVars = { /**/ ACTOR_OBJ_GRASS_UNIT, @@ -31,6 +32,7 @@ ActorInit Obj_Grass_Unit_InitVars = { /**/ Actor_Noop, /**/ Actor_Noop, /**/ NULL, + /**/ ObjGrassUnit_Reset, }; // Neat circular pattern with a single bush in the center @@ -172,3 +174,10 @@ void ObjGrassUnit_Init(Actor* this, PlayState* play2) { } Actor_Kill(this); } + +void ObjGrassUnit_Reset(void) { + sGrassManager = NULL; + sGrassCarry0 = NULL; + sGrassCarry1 = NULL; + sInitialized = false; +}