diff --git a/assets/xml/objects/object_boj.xml b/assets/xml/objects/object_boj.xml
index cfb10e97a..20c661bb5 100644
--- a/assets/xml/objects/object_boj.xml
+++ b/assets/xml/objects/object_boj.xml
@@ -87,8 +87,8 @@
-
-
-
+
+
+
diff --git a/include/z64player.h b/include/z64player.h
index 6cf7296b8..2f101b558 100644
--- a/include/z64player.h
+++ b/include/z64player.h
@@ -76,7 +76,7 @@ typedef enum {
/* 2 */ PLAYER_ENV_TIMER_UNDERWATER_FLOOR,
/* 3 */ PLAYER_ENV_TIMER_SWIMMING,
/* 4 */ PLAYER_ENV_TIMER_UNDERWATER_FREE
-} PlayerEnvTimer;
+} PlayerEnvTimerType;
typedef enum PlayerActionParam {
/* -1 */ PLAYER_AP_MINUS1 = -1,
diff --git a/include/z64save.h b/include/z64save.h
index b557f4306..f5b3bb93c 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -2,6 +2,7 @@
#define Z64SAVE_H
#include "ultra64.h"
+#include "z64item.h"
#include "z64math.h"
#include "z64item.h"
#include "os.h"
diff --git a/spec b/spec
index 8cfc30556..c894dabef 100644
--- a/spec
+++ b/spec
@@ -4567,8 +4567,7 @@ beginseg
name "ovl_En_Nimotsu"
compress
include "build/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.o"
- include "build/data/ovl_En_Nimotsu/ovl_En_Nimotsu.data.o"
- include "build/data/ovl_En_Nimotsu/ovl_En_Nimotsu.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Nimotsu/ovl_En_Nimotsu_reloc.o"
endseg
beginseg
@@ -5097,8 +5096,7 @@ beginseg
name "ovl_Obj_Swprize"
compress
include "build/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.o"
- include "build/data/ovl_Obj_Swprize/ovl_Obj_Swprize.data.o"
- include "build/data/ovl_Obj_Swprize/ovl_Obj_Swprize.reloc.o"
+ include "build/src/overlays/actors/ovl_Obj_Swprize/ovl_Obj_Swprize_reloc.o"
endseg
beginseg
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index 0b9ccf1ae..8d2c3a075 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -192,7 +192,7 @@ s16 sExtraItemBases[] = {
s16 sEnvTimerType = PLAYER_ENV_TIMER_NONE;
s16 sEnvTimerActive = false;
-s16 sPostmanBunnyHoodState = 0;
+s16 sPostmanBunnyHoodState = POSTMAN_MINIGAME_BUNNY_HOOD_OFF;
OSTime sTimerPausedOsTime = 0;
OSTime sBottleTimerPausedOsTime = 0;
OSTime D_801BF8F8[] = {
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index 8c1617ccf..5d018a995 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -894,12 +894,12 @@ void func_80144A94(SramContext* sramCtx) {
gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.permanentSceneFlags[i].collectible;
}
- for (i = 0; i < ARRAY_COUNT(gSaveContext.timerStates); i++) {
+ for (i = 0; i < TIMER_ID_MAX; i++) {
gSaveContext.timerStates[i] = TIMER_STATE_OFF;
gSaveContext.timerCurTimes[i] = SECONDS_TO_TIMER(0);
gSaveContext.timerTimeLimits[i] = SECONDS_TO_TIMER(0);
gSaveContext.timerStartOsTimes[i] = 0;
- gSaveContext.timerStopTimes[i] = 0;
+ gSaveContext.timerStopTimes[i] = SECONDS_TO_TIMER(0);
gSaveContext.timerPausedOsTimes[i] = 0;
}
@@ -969,12 +969,12 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.permanentSceneFlags[i].collectible;
}
- for (i = 0; i < ARRAY_COUNT(gSaveContext.timerStates); i++) {
+ for (i = 0; i < TIMER_ID_MAX; i++) {
gSaveContext.timerStates[i] = TIMER_STATE_OFF;
gSaveContext.timerCurTimes[i] = SECONDS_TO_TIMER(0);
gSaveContext.timerTimeLimits[i] = SECONDS_TO_TIMER(0);
gSaveContext.timerStartOsTimes[i] = 0;
- gSaveContext.timerStopTimes[i] = 0;
+ gSaveContext.timerStopTimes[i] = SECONDS_TO_TIMER(0);
gSaveContext.timerPausedOsTimes[i] = 0;
}
diff --git a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
index 1066162eb..b90cc04bb 100644
--- a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
+++ b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
@@ -502,6 +502,7 @@ void EnMttag_Init(Actor* thisx, PlayState* play) {
void EnMttag_Destroy(Actor* thisx, PlayState* play) {
EnMttag* this = THIS;
+
if (gSaveContext.timerStates[TIMER_ID_MINIGAME_2] != TIMER_STATE_6) {
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_STOP;
}
@@ -509,5 +510,6 @@ void EnMttag_Destroy(Actor* thisx, PlayState* play) {
void EnMttag_Update(Actor* thisx, PlayState* play) {
EnMttag* this = THIS;
+
this->actionFunc(this, play);
}
diff --git a/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c b/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
index 966f3671b..11872a0a1 100644
--- a/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
+++ b/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
@@ -5,6 +5,7 @@
*/
#include "z_en_nimotsu.h"
+#include "assets/objects/object_boj/object_boj.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -15,7 +16,8 @@ void EnNimotsu_Destroy(Actor* thisx, PlayState* play);
void EnNimotsu_Update(Actor* thisx, PlayState* play);
void EnNimotsu_Draw(Actor* thisx, PlayState* play);
-#if 0
+void EnNimotsu_UpdateCollision(EnNimotsu* this, PlayState* play);
+
const ActorInit En_Nimotsu_InitVars = {
ACTOR_EN_NIMOTSU,
ACTORCAT_PROP,
@@ -28,25 +30,93 @@ const ActorInit En_Nimotsu_InitVars = {
(ActorFunc)EnNimotsu_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80BE1FB0 = {
- { COLTYPE_NONE, AT_NONE, AC_NONE, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_2, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK4, { 0x00000000, 0x00, 0x00 }, { 0x00000000, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_NONE,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_2,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK4,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x00000000, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_ON,
+ },
{ 10, 30, 0, { 0, 0, 0 } },
};
-#endif
+void EnNimotsu_UpdateCollision(EnNimotsu* this, PlayState* play) {
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 0.0f, 4);
+}
-extern ColliderCylinderInit D_80BE1FB0;
+void EnNimotsu_Init(Actor* thisx, PlayState* play) {
+ EnNimotsu* this = THIS;
-extern UNK_TYPE D_06013380;
+ Collider_InitCylinder(play, &this->collider);
+ Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Nimotsu/func_80BE1C80.s")
+ this->timer = 10;
+ this->actor.gravity = -0.5f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Nimotsu/EnNimotsu_Init.s")
+ Actor_SetScale(&this->actor, 0.01f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Nimotsu/EnNimotsu_Destroy.s")
+void EnNimotsu_Destroy(Actor* thisx, PlayState* play) {
+ EnNimotsu* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Nimotsu/EnNimotsu_Update.s")
+ Collider_DestroyCylinder(play, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Nimotsu/EnNimotsu_Draw.s")
+void EnNimotsu_Update(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnNimotsu* this = THIS;
+ Vec3f dustPosition;
+
+ Actor_MoveWithGravity(&this->actor);
+
+ if (!(this->dustDone & 1) && (this->actor.bgCheckFlags & 1)) {
+ if (DECR(this->timer) == 0) {
+ this->dustDone |= 1;
+ }
+
+ if ((play->state.frames % 3) == 0) {
+ dustPosition.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(15.0f);
+ dustPosition.y = this->actor.world.pos.y;
+ dustPosition.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(15.0f);
+ Actor_SpawnFloorDustRing(play, &this->actor, &dustPosition, 20.0f, 0, 2.0f, 0, 0, 0);
+ }
+ }
+
+ EnNimotsu_UpdateCollision(this, play);
+}
+
+void EnNimotsu_Draw(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnNimotsu* this = THIS;
+ Vec3f position;
+ Vec3f scale;
+
+ OPEN_DISPS(play->state.gfxCtx);
+ func_8012C28C(play->state.gfxCtx);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, &gBombShopBagDL);
+ func_8012C2DC(play->state.gfxCtx);
+
+ position.x = this->actor.world.pos.x + 7.0f;
+ position.y = this->actor.world.pos.y;
+ position.z = this->actor.world.pos.z + 2.0f;
+
+ scale.x = 0.2f;
+ scale.y = 0.2f;
+ scale.z = 0.2f;
+
+ func_800BC620(&position, &scale, 255, play);
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.h b/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.h
index 634697736..e839c9393 100644
--- a/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.h
+++ b/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.h
@@ -7,7 +7,10 @@ struct EnNimotsu;
typedef struct EnNimotsu {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x98];
+ /* 0x144 */ UNK_TYPE1 unk_144[0x48];
+ /* 0x18C */ ColliderCylinder collider;
+ /* 0x1D8 */ u16 dustDone;
+ /* 0x1DA */ s16 timer;
} EnNimotsu; // size = 0x1DC
extern const ActorInit En_Nimotsu_InitVars;
diff --git a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
index 10cdec079..fbacce266 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
@@ -1542,7 +1542,7 @@ void EnSuttari_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
} else {
func_8012C28C(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
- gSPDisplayList(POLY_OPA_DISP++, object_boj_DL_013380);
+ gSPDisplayList(POLY_OPA_DISP++, gBombShopBagDL);
CLOSE_DISPS(play->state.gfxCtx);
}
}
diff --git a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
index 852316b9b..b59a2ba33 100644
--- a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
+++ b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
@@ -154,7 +154,7 @@ static s32 sSwampTargetActorListLengths[] = {
};
static Vec3f sSwampPlayerPos = { 0.0f, 10.0f, 140.0f };
-static Vec3f sTownFierceDietyPlayerPos = { -20.0f, 20.0f, 198.0f };
+static Vec3f sTownFierceDeityPlayerPos = { -20.0f, 20.0f, 198.0f };
static Vec3f sTownPlayerPos = { -20.0f, 40.0f, 175.0f };
/**
@@ -1156,7 +1156,7 @@ void EnSyatekiMan_Swamp_AddBonusPoints(EnSyatekiMan* this, PlayState* play) {
this->actionFunc = EnSyatekiMan_Swamp_EndGame;
sBonusTimer = 0;
} else if (sBonusTimer > 10) {
- gSaveContext.timerStopTimes[TIMER_ID_MINIGAME_1] += 100;
+ gSaveContext.timerStopTimes[TIMER_ID_MINIGAME_1] += SECONDS_TO_TIMER(1);
play->interfaceCtx.unk_25C += 10;
this->score += 10;
Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
@@ -1171,7 +1171,7 @@ void EnSyatekiMan_Town_MovePlayerAndSayHighScore(EnSyatekiMan* this, PlayState*
Vec3f targetPlayerPos;
if (gSaveContext.save.playerForm == PLAYER_FORM_FIERCE_DEITY) {
- targetPlayerPos = sTownFierceDietyPlayerPos;
+ targetPlayerPos = sTownFierceDeityPlayerPos;
} else {
targetPlayerPos = sTownPlayerPos;
}
@@ -1198,7 +1198,7 @@ void EnSyatekiMan_Town_StartGame(EnSyatekiMan* this, PlayState* play) {
if (sGameStartTimer == 30) {
if (player->transformation == PLAYER_FORM_FIERCE_DEITY) {
- player->actor.world.pos = sTownFierceDietyPlayerPos;
+ player->actor.world.pos = sTownFierceDeityPlayerPos;
} else {
player->actor.world.pos = sTownPlayerPos;
}
diff --git a/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c b/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c
index b287539b7..0ce2f38a1 100644
--- a/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c
+++ b/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c
@@ -45,7 +45,7 @@ void ObjRoomtimer_Init(Actor* thisx, PlayState* play) {
void ObjRoomtimer_Destroy(Actor* thisx, PlayState* play) {
ObjRoomtimer* this = THIS;
- if (this->actor.params != 0x1FF && gSaveContext.timerStates[TIMER_ID_MINIGAME_2] >= TIMER_STATE_START) {
+ if ((this->actor.params != 0x1FF) && (gSaveContext.timerStates[TIMER_ID_MINIGAME_2] >= TIMER_STATE_START)) {
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_STOP;
}
}
@@ -66,7 +66,7 @@ void func_80973D3C(ObjRoomtimer* this, PlayState* play) {
}
ActorCutscene_SetIntentToPlay(this->actor.cutscene);
this->actionFunc = func_80973DE0;
- } else if (this->actor.params != 0x1FF && gSaveContext.timerStates[TIMER_ID_MINIGAME_2] == TIMER_STATE_OFF) {
+ } else if ((this->actor.params != 0x1FF) && (gSaveContext.timerStates[TIMER_ID_MINIGAME_2] == TIMER_STATE_OFF)) {
play_sound(NA_SE_OC_ABYSS);
func_80169EFC(&play->state);
Actor_MarkForDeath(&this->actor);
diff --git a/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c b/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c
index 4472c4fc3..6a50a018f 100644
--- a/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c
+++ b/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c
@@ -14,12 +14,15 @@ void ObjSwprize_Init(Actor* thisx, PlayState* play);
void ObjSwprize_Destroy(Actor* thisx, PlayState* play);
void ObjSwprize_Update(Actor* thisx, PlayState* play);
+void ObjSwprize_DoNothing(ObjSwprize* this, PlayState* play);
void func_80C25654(ObjSwprize* this, PlayState* play);
+void func_80C25640(ObjSwprize* this);
+void func_80C25698(ObjSwprize* this);
void func_80C256AC(ObjSwprize* this, PlayState* play);
+void func_80C25710(ObjSwprize* this);
void func_80C2572C(ObjSwprize* this, PlayState* play);
-void func_80C25794(ObjSwprize* this, PlayState* play);
+void ObjSwprize_SetupDoNothing(ObjSwprize* this);
-#if 0
const ActorInit Obj_Swprize_InitVars = {
ACTOR_OBJ_SWPRIZE,
ACTORCAT_PROP,
@@ -32,30 +35,113 @@ const ActorInit Obj_Swprize_InitVars = {
(ActorFunc)NULL,
};
-#endif
+s16 D_80C257F0[] = { 2, 0x14, 1, 8 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25360.s")
+s16 D_80C257F8[] = { -0x888, 0, 0x888 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C253D0.s")
+void func_80C25360(ObjSwprize* this, Vec3f* vec) {
+ Matrix_Push();
+ Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_NEW);
+ Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
+ Matrix_MultVecY(1.0f, vec);
+ Matrix_Pop();
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/ObjSwprize_Init.s")
+void func_80C253D0(ObjSwprize* this, PlayState* play) {
+ Actor* thisx = &this->actor;
+ s32 i;
+ Actor* collectible;
+ Vec3f sp78;
+ s32 type = OBJ_SWPRIZE_GET_TYPE(thisx);
+ s32 temp_s0 = D_80C257F0[type];
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/ObjSwprize_Destroy.s")
+ func_80C25360(this, &sp78);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25640.s")
+ if (type == 2) {
+ for (i = 0; i < 3; i++) {
+ collectible = Item_DropCollectible(play, &thisx->world.pos, temp_s0);
+ if (collectible != NULL) {
+ if (sp78.y < 0.98f) {
+ collectible->velocity.y = (sp78.y + 1.0f) * 4.0f;
+ collectible->speedXZ = (2.0f * (1.0f - fabsf(sp78.y))) + 2.0f;
+ collectible->world.rot.y = Math_FAtan2F(sp78.z, sp78.x) + D_80C257F8[i];
+ } else {
+ collectible->world.rot.y = i * (0x10000 / 3);
+ }
+ }
+ }
+ } else {
+ collectible = Item_DropCollectible(play, &thisx->world.pos, temp_s0);
+ if ((collectible != NULL) && (sp78.y < 0.98f)) {
+ collectible->velocity.y = (sp78.y + 1.0f) * 4.0f;
+ collectible->speedXZ = (2.0f * (1.0f - fabsf(sp78.y))) + 2.0f;
+ collectible->world.rot.y = Math_FAtan2F(sp78.z, sp78.x);
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25654.s")
+void ObjSwprize_Init(Actor* thisx, PlayState* play) {
+ ObjSwprize* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25698.s")
+ if (Flags_GetSwitch(play, OBJ_SWPRIZE_GET_SWITCH_FLAG(&this->actor))) {
+ ObjSwprize_SetupDoNothing(this);
+ } else {
+ func_80C25640(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C256AC.s")
+void ObjSwprize_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25710.s")
+void func_80C25640(ObjSwprize* this) {
+ this->actionFunc = func_80C25654;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C2572C.s")
+void func_80C25654(ObjSwprize* this, PlayState* play) {
+ if (Flags_GetSwitch(play, OBJ_SWPRIZE_GET_SWITCH_FLAG(&this->actor))) {
+ func_80C25698(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25780.s")
+void func_80C25698(ObjSwprize* this) {
+ this->actionFunc = func_80C256AC;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25794.s")
+void func_80C256AC(ObjSwprize* this, PlayState* play) {
+ if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ func_80C253D0(this, play);
+ func_80C25710(this);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/ObjSwprize_Update.s")
+void func_80C25710(ObjSwprize* this) {
+ this->timer = 40;
+ this->actionFunc = func_80C2572C;
+}
+
+void func_80C2572C(ObjSwprize* this, PlayState* play) {
+ if (this->timer > 0) {
+ this->timer--;
+ if (this->timer == 0) {
+ ActorCutscene_Stop(this->actor.cutscene);
+ ObjSwprize_SetupDoNothing(this);
+ }
+ }
+}
+
+void ObjSwprize_SetupDoNothing(ObjSwprize* this) {
+ this->actionFunc = ObjSwprize_DoNothing;
+}
+
+void ObjSwprize_DoNothing(ObjSwprize* this, PlayState* play) {
+}
+
+void ObjSwprize_Update(Actor* thisx, PlayState* play) {
+ ObjSwprize* this = THIS;
+
+ this->actionFunc(this, play);
+}
diff --git a/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.h b/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.h
index 29654f992..5b7cd2e09 100644
--- a/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.h
+++ b/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.h
@@ -3,6 +3,9 @@
#include "global.h"
+#define OBJ_SWPRIZE_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
+#define OBJ_SWPRIZE_GET_TYPE(thisx) (((thisx)->params >> 8) & 3)
+
struct ObjSwprize;
typedef void (*ObjSwprizeActionFunc)(struct ObjSwprize*, PlayState*);
@@ -10,7 +13,7 @@ typedef void (*ObjSwprizeActionFunc)(struct ObjSwprize*, PlayState*);
typedef struct ObjSwprize {
/* 0x000 */ Actor actor;
/* 0x144 */ ObjSwprizeActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x4];
+ /* 0x148 */ s16 timer;
} ObjSwprize; // size = 0x14C
extern const ActorInit Obj_Swprize_InitVars;
diff --git a/src/overlays/gamestates/ovl_select/z_select.c b/src/overlays/gamestates/ovl_select/z_select.c
index 93b873de5..5d418c0fc 100644
--- a/src/overlays/gamestates/ovl_select/z_select.c
+++ b/src/overlays/gamestates/ovl_select/z_select.c
@@ -507,12 +507,12 @@ void MapSelect_UpdateMenu(MapSelectState* this) {
if (this->verticalInputAccumulator == 0) {
if (CHECK_BTN_ALL(controller1->press.button, BTN_A) || CHECK_BTN_ALL(controller1->press.button, BTN_START)) {
- for (i = 0; i < ARRAY_COUNT(gSaveContext.timerPausedOsTimes); i++) {
+ for (i = 0; i < TIMER_ID_MAX; i++) {
gSaveContext.timerStates[i] = TIMER_STATE_OFF;
- gSaveContext.timerCurTimes[i] = 0;
+ gSaveContext.timerCurTimes[i] = SECONDS_TO_TIMER(0);
gSaveContext.timerTimeLimits[i] = SECONDS_TO_TIMER(0);
gSaveContext.timerStartOsTimes[i] = 0;
- gSaveContext.timerStopTimes[i] = 0;
+ gSaveContext.timerStopTimes[i] = SECONDS_TO_TIMER(0);
gSaveContext.timerPausedOsTimes[i] = 0;
}
gSaveContext.minigameState = 0;
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index f34d83fc9..9a930c6a8 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -16061,7 +16061,7 @@
0x80BE16B4:("EnTab_PostLimbDraw",),
0x80BE1704:("EnTab_TransformLimbDraw",),
0x80BE1810:("EnTab_Draw",),
- 0x80BE1C80:("func_80BE1C80",),
+ 0x80BE1C80:("EnNimotsu_UpdateCollision",),
0x80BE1CEC:("EnNimotsu_Init",),
0x80BE1D5C:("EnNimotsu_Destroy",),
0x80BE1D88:("EnNimotsu_Update",),
@@ -17125,8 +17125,8 @@
0x80C256AC:("func_80C256AC",),
0x80C25710:("func_80C25710",),
0x80C2572C:("func_80C2572C",),
- 0x80C25780:("func_80C25780",),
- 0x80C25794:("func_80C25794",),
+ 0x80C25780:("ObjSwprize_SetupDoNothing",),
+ 0x80C25794:("ObjSwprize_DoNothing",),
0x80C257A4:("ObjSwprize_Update",),
0x80C258A0:("func_80C258A0",),
0x80C2590C:("func_80C2590C",),
diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt
index 5b14feed5..958b202c9 100644
--- a/tools/disasm/variables.txt
+++ b/tools/disasm/variables.txt
@@ -9920,7 +9920,7 @@
0x809C9464:("sSwampTargetActorLists","UNK_PTR","",0x4),
0x809C946C:("sSwampTargetActorListLengths","UNK_TYPE1","",0x1),
0x809C9474:("sSwampPlayerPos","UNK_TYPE4","",0x4),
- 0x809C9480:("sTownFierceDietyPlayerPos","UNK_TYPE4","",0x4),
+ 0x809C9480:("sTownFierceDeityPlayerPos","UNK_TYPE4","",0x4),
0x809C948C:("sTownPlayerPos","UNK_TYPE4","",0x4),
0x809C9498:("sGameStartTimer","s16","",0x2),
0x809C949C:("sHasSpawnedGuaysForThisWave","UNK_TYPE2","",0x2),
diff --git a/tools/namefixer.py b/tools/namefixer.py
index 4a3d87608..3d6d08783 100755
--- a/tools/namefixer.py
+++ b/tools/namefixer.py
@@ -483,6 +483,9 @@ wordReplace = {
"func_80169E6C": "Play_SetupRespawnPoint",
"func_8016A0AC": "Play_IsUnderwater",
"func_801690CC": "Play_InCsMode",
+ "func_8010E9F0": "Interface_StartTimer",
+ "func_8010EA9C": "Interface_StartPostmanTimer",
+ "func_80121F94": "Interface_Destroy",
"Interface_ChangeAlpha": "Interface_SetHudVisibility",
"func_80112B40": "Interface_LoadItemIconImpl",
"func_80112BE4": "Interface_LoadItemIcon",
@@ -702,6 +705,7 @@ wordReplace = {
"player->unk_394": "player->csMode",
"player->swordQuads": "player->meleeWeaponQuads",
"player->blureEffectIndex": "player->meleeWeaponEffectIndex",
+ "player->unk_AD8": "player->underwaterTimer",
"player->swordAnimation": "player->meleeWeaponAnimation",
"player->swordState": "player->meleeWeaponState",
"player->swordInfo": "player->meleeWeaponInfo",
@@ -731,6 +735,15 @@ wordReplace = {
"play->actorCtx.unk4": "play->actorCtx.lensMaskSize",
"play->nextEntranceIndex": "play->nextEntrance",
+ "gSaveContext.unk_3DC8": "gSaveContext.timerOsTime",
+ "gSaveContext.unk_3DD0": "gSaveContext.timerStates",
+ "gSaveContext.unk_3DD7": "gSaveContext.timerDirections",
+ "gSaveContext.unk_3DE0": "gSaveContext.timerCurTimes",
+ "gSaveContext.unk_3E18": "gSaveContext.timerTimeLimits",
+ "gSaveContext.unk_3E50": "gSaveContext.timerStartOsTimes",
+ "gSaveContext.unk_3E88": "gSaveContext.timerStopTimes",
+ "gSaveContext.unk_3EC0": "gSaveContext.timerPausedOsTimes",
+
"play->sceneLoadFlag": "play->transitionTrigger",
"play->unk_18B4A": "play->transitionMode",
"play->unk_1887F": "play->transitionType",
diff --git a/undefined_syms.txt b/undefined_syms.txt
index 658dd5f05..aae06790f 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -1223,10 +1223,6 @@ D_06008C40 = 0x06008C40;
D_060001E4 = 0x060001E4;
D_06001EE8 = 0x06001EE8;
-// ovl_En_Nimotsu
-
-D_06013380 = 0x06013380;
-
// ovl_En_Nwc
D_060000E8 = 0x060000E8;