summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorengineer124 <47598039+engineer124@users.noreply.github.com>2022-11-16 13:41:27 -0500
committerGitHub <noreply@github.com>2022-11-16 13:41:27 -0500
commit40639e698d0b4681d088194dc72a6a3b910e7d13 (patch)
tree1aead54c3761e76cbc41f1b432a7c40e04ca599b /src/code
parentcc2409606eb8b7fbbaa57c071a7d7039fb265f94 (diff)
Document Timers (#1412)
* Document Timers, First Draft * some progress * more timer docs * cleanup * small cleanup * more cleanup * comments * more cleanup * extra comment * more docs * brackets * PR Suggestions * cleanup, missed some * more suggestions * more PR Suggestions * small change * environmental
Diffstat (limited to 'src/code')
-rw-r--r--src/code/z_construct.c37
-rw-r--r--src/code/z_game_over.c6
-rw-r--r--src/code/z_message_PAL.c4
-rw-r--r--src/code/z_parameter.c555
-rw-r--r--src/code/z_player_lib.c56
5 files changed, 356 insertions, 302 deletions
diff --git a/src/code/z_construct.c b/src/code/z_construct.c
index 90a31872b..7748c0fba 100644
--- a/src/code/z_construct.c
+++ b/src/code/z_construct.c
@@ -8,7 +8,7 @@ void Interface_Init(PlayState* play) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
u32 parameterSize;
u16 doActionOffset;
- u8 temp;
+ u8 timerId;
gSaveContext.sunsSongState = SUNSSONG_INACTIVE;
gSaveContext.unk_13E8 = gSaveContext.unk_13EA = 0;
@@ -109,39 +109,42 @@ void Interface_Init(PlayState* play) {
0x1000, "../z_construct.c", 219);
}
- osSyncPrintf("EVENT=%d\n", ((void)0, gSaveContext.timer1State));
+ osSyncPrintf("EVENT=%d\n", ((void)0, gSaveContext.timerState));
- if ((gSaveContext.timer1State == 4) || (gSaveContext.timer1State == 8) || (gSaveContext.timer2State == 4) ||
- (gSaveContext.timer2State == 10)) {
+ if ((gSaveContext.timerState == TIMER_STATE_ENV_HAZARD_TICK) ||
+ (gSaveContext.timerState == TIMER_STATE_DOWN_TICK) ||
+ (gSaveContext.subTimerState == SUBTIMER_STATE_DOWN_TICK) ||
+ (gSaveContext.subTimerState == SUBTIMER_STATE_UP_TICK)) {
osSyncPrintf("restart_flag=%d\n", ((void)0, gSaveContext.respawnFlag));
if ((gSaveContext.respawnFlag == -1) || (gSaveContext.respawnFlag == 1)) {
- if (gSaveContext.timer1State == 4) {
- gSaveContext.timer1State = 1;
- gSaveContext.timerX[0] = 140;
- gSaveContext.timerY[0] = 80;
+ if (gSaveContext.timerState == TIMER_STATE_ENV_HAZARD_TICK) {
+ gSaveContext.timerState = TIMER_STATE_ENV_HAZARD_INIT;
+ gSaveContext.timerX[TIMER_ID_MAIN] = 140;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 80;
}
}
- if ((gSaveContext.timer1State == 4) || (gSaveContext.timer1State == 8)) {
- temp = 0;
+ if ((gSaveContext.timerState == TIMER_STATE_ENV_HAZARD_TICK) ||
+ (gSaveContext.timerState == TIMER_STATE_DOWN_TICK)) {
+ timerId = TIMER_ID_MAIN;
} else {
- temp = 1;
+ timerId = TIMER_ID_SUB;
}
- gSaveContext.timerX[temp] = 26;
+ gSaveContext.timerX[timerId] = 26;
if (gSaveContext.healthCapacity > 0xA0) {
- gSaveContext.timerY[temp] = 54;
+ gSaveContext.timerY[timerId] = 54; // two rows of hearts
} else {
- gSaveContext.timerY[temp] = 46;
+ gSaveContext.timerY[timerId] = 46; // one row of hearts
}
}
- if ((gSaveContext.timer1State >= 11) && (gSaveContext.timer1State < 16)) {
- gSaveContext.timer1State = 0;
+ if ((gSaveContext.timerState >= TIMER_STATE_UP_INIT) && (gSaveContext.timerState <= TIMER_STATE_UP_FREEZE)) {
+ gSaveContext.timerState = TIMER_STATE_OFF;
// "Timer Stop!!!!!!!!!!!!!!!!!!!!!!"
- osSyncPrintf("タイマー停止!!!!!!!!!!!!!!!!!!!!! = %d\n", gSaveContext.timer1State);
+ osSyncPrintf("タイマー停止!!!!!!!!!!!!!!!!!!!!! = %d\n", gSaveContext.timerState);
}
osSyncPrintf("PARAMETER領域=%x\n", parameterSize + 0x5300); // "Parameter Area = %x"
diff --git a/src/code/z_game_over.c b/src/code/z_game_over.c
index 733888f5e..e4731ed34 100644
--- a/src/code/z_game_over.c
+++ b/src/code/z_game_over.c
@@ -28,9 +28,9 @@ void GameOver_Update(PlayState* play) {
case GAMEOVER_DEATH_START:
Message_CloseTextbox(play);
- gSaveContext.timer1State = 0;
- gSaveContext.timer2State = 0;
- CLEAR_EVENTINF(EVENTINF_10);
+ gSaveContext.timerState = TIMER_STATE_OFF;
+ gSaveContext.subTimerState = SUBTIMER_STATE_OFF;
+ CLEAR_EVENTINF(EVENTINF_MARATHON_ACTIVE);
// search inventory for spoiling items and revert if necessary
for (i = 0; i < ARRAY_COUNT(gSpoilingItems); i++) {
diff --git a/src/code/z_message_PAL.c b/src/code/z_message_PAL.c
index 640e4c90b..189ab1eee 100644
--- a/src/code/z_message_PAL.c
+++ b/src/code/z_message_PAL.c
@@ -1283,9 +1283,9 @@ void Message_Decode(PlayState* play) {
osSyncPrintf("\nEVENTタイマー = ");
digits[0] = digits[1] = digits[2] = 0;
if (curChar == MESSAGE_RACE_TIME) {
- digits[3] = gSaveContext.timer1Value;
+ digits[3] = gSaveContext.timerSeconds;
} else {
- digits[3] = gSaveContext.timer2Value;
+ digits[3] = gSaveContext.subTimerSeconds;
}
while (digits[3] >= 60) {
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index 1d4e90a90..f23bc9348 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -154,8 +154,8 @@ static s16 sExtraItemBases[] = {
ITEM_DEKU_NUT, // ITEM_DEKU_NUT_UPGRADE_40
};
-static s16 D_80125A58 = 0;
-static s16 D_80125A5C = false;
+static s16 sEnvHazard = PLAYER_ENV_HAZARD_NONE;
+static s16 sEnvHazardActive = false;
static Gfx sSetupDL_80125A60[] = {
gsDPPipeSync(),
@@ -722,7 +722,8 @@ void func_80083108(PlayState* play) {
Interface_ChangeAlpha(50);
}
} else if (msgCtx->msgMode == MSGMODE_NONE) {
- if ((func_8008F2F8(play) >= 2) && (func_8008F2F8(play) < 5)) {
+ if ((Player_GetEnvironmentalHazard(play) >= PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) &&
+ (Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE)) {
if (gSaveContext.buttonStatus[0] != BTN_DISABLED) {
sp28 = true;
}
@@ -730,7 +731,7 @@ void func_80083108(PlayState* play) {
gSaveContext.buttonStatus[0] = BTN_DISABLED;
for (i = 1; i < 4; i++) {
- if (func_8008F2F8(play) == 2) {
+ if (Player_GetEnvironmentalHazard(play) == PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) {
if ((gSaveContext.equips.buttonItems[i] != ITEM_HOOKSHOT) &&
(gSaveContext.equips.buttonItems[i] != ITEM_LONGSHOT)) {
if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
@@ -2523,7 +2524,9 @@ void Magic_Update(PlayState* play) {
if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) && (msgCtx->msgMode == MSGMODE_NONE) &&
(play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
(play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play)) {
- if ((gSaveContext.magic == 0) || ((func_8008F2F8(play) >= 2) && (func_8008F2F8(play) < 5)) ||
+ if ((gSaveContext.magic == 0) ||
+ ((Player_GetEnvironmentalHazard(play) >= PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) &&
+ (Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE)) ||
((gSaveContext.equips.buttonItems[1] != ITEM_LENS_OF_TRUTH) &&
(gSaveContext.equips.buttonItems[2] != ITEM_LENS_OF_TRUTH) &&
(gSaveContext.equips.buttonItems[3] != ITEM_LENS_OF_TRUTH)) ||
@@ -2672,39 +2675,47 @@ void Magic_DrawMeter(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_parameter.c", 2731);
}
-void func_80088AA0(s16 arg0) {
- gSaveContext.timerX[1] = 140;
- gSaveContext.timerY[1] = 80;
- D_80125A5C = false;
- gSaveContext.timer2Value = arg0;
+void Interface_SetSubTimer(s16 seconds) {
+ gSaveContext.timerX[TIMER_ID_SUB] = 140;
+ gSaveContext.timerY[TIMER_ID_SUB] = 80;
+ sEnvHazardActive = false;
+ gSaveContext.subTimerSeconds = seconds;
- if (arg0 != 0) {
- gSaveContext.timer2State = 1;
+ if (seconds != 0) {
+ // count down
+ gSaveContext.subTimerState = SUBTIMER_STATE_DOWN_INIT;
} else {
- gSaveContext.timer2State = 7;
+ // count up
+ gSaveContext.subTimerState = SUBTIMER_STATE_UP_INIT;
}
}
-void func_80088AF0(PlayState* play) {
- if (gSaveContext.timer2State != 0) {
- if (GET_EVENTINF(EVENTINF_10)) {
- gSaveContext.timer2Value = 239;
+/**
+ * Set the subTimer to 1 second left
+ */
+void Interface_SetSubTimerToFinalSecond(PlayState* play) {
+ if (gSaveContext.subTimerState != SUBTIMER_STATE_OFF) {
+ if (GET_EVENTINF(EVENTINF_MARATHON_ACTIVE)) {
+ // The running-man race counts up and finished at MARATHON_TIME_LIMIT
+ gSaveContext.subTimerSeconds = MARATHON_TIME_LIMIT - 1;
} else {
- gSaveContext.timer2Value = 1;
+ gSaveContext.subTimerSeconds = 1;
}
}
}
-void func_80088B34(s16 arg0) {
- gSaveContext.timerX[0] = 140;
- gSaveContext.timerY[0] = 80;
- D_80125A5C = false;
- gSaveContext.timer1Value = arg0;
+void Interface_SetTimer(s16 seconds) {
+ gSaveContext.timerX[TIMER_ID_MAIN] = 140;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 80;
+ sEnvHazardActive = false;
+ gSaveContext.timerSeconds = seconds;
- if (arg0 != 0) {
- gSaveContext.timer1State = 5;
+ if (seconds != 0) {
+ // count down
+ gSaveContext.timerState = TIMER_STATE_DOWN_INIT;
} else {
- gSaveContext.timer1State = 11;
+ // count up
+ gSaveContext.timerState = TIMER_STATE_UP_INIT;
}
}
@@ -2802,7 +2813,8 @@ void Interface_DrawItemButtons(PlayState* play) {
if ((gSaveContext.unk_13EA == 1) || (gSaveContext.unk_13EA == 2) || (gSaveContext.unk_13EA == 5)) {
temp = 0;
- } else if ((player->stateFlags1 & PLAYER_STATE1_21) || (func_8008F2F8(play) == 4) ||
+ } else if ((player->stateFlags1 & PLAYER_STATE1_21) ||
+ (Player_GetEnvironmentalHazard(play) == PLAYER_ENV_HAZARD_UNDERWATER_FREE) ||
(player->stateFlags2 & PLAYER_STATE2_CRAWLING)) {
temp = 70;
} else {
@@ -3062,7 +3074,7 @@ void Interface_Draw(PlayState* play) {
static s16 magicArrowEffectsG[] = { 0, 100, 255 };
static s16 magicArrowEffectsB[] = { 0, 255, 100 };
static s16 timerDigitLeftPos[] = { 16, 25, 34, 42, 51 };
- static s16 digitWidth[] = { 9, 9, 8, 9, 9 };
+ static s16 sDigitWidths[] = { 9, 9, 8, 9, 9 };
// unused, most likely colors
static s16 D_80125B1C[][3] = {
{ 0, 150, 0 }, { 100, 255, 0 }, { 255, 255, 255 }, { 0, 0, 0 }, { 255, 255, 255 },
@@ -3072,11 +3084,11 @@ void Interface_Draw(PlayState* play) {
static s16 spoilingItemEntrances[] = { ENTR_SPOT10_2, ENTR_SPOT07_3, ENTR_SPOT07_3 };
static f32 D_80125B54[] = { -40.0f, -35.0f }; // unused
static s16 D_80125B5C[] = { 91, 91 }; // unused
- static s16 D_8015FFE0;
- static s16 D_8015FFE2;
- static s16 D_8015FFE4;
- static s16 D_8015FFE6;
- static s16 timerDigits[5];
+ static s16 sTimerNextSecondTimer;
+ static s16 sTimerStateTimer;
+ static s16 sSubTimerNextSecondTimer;
+ static s16 sSubTimerStateTimer;
+ static s16 sTimerDigits[5];
InterfaceContext* interfaceCtx = &play->interfaceCtx;
PauseContext* pauseCtx = &play->pauseCtx;
MessageContext* msgCtx = &play->msgCtx;
@@ -3086,7 +3098,7 @@ void Interface_Draw(PlayState* play) {
s16 svar3;
s16 svar4;
s16 svar5;
- s16 svar6;
+ s16 timerId;
OPEN_DISPS(play->state.gfxCtx, "../z_parameter.c", 3405);
@@ -3417,7 +3429,7 @@ void Interface_Draw(PlayState* play) {
if (sHBAScoreDigits[svar1] != 0 || (svar2 != 0) || (svar1 >= 3)) {
OVERLAY_DISP = Gfx_TextureI8(
OVERLAY_DISP, ((u8*)gCounterDigit0Tex + (8 * 16 * sHBAScoreDigits[svar1])), 8, 16, svar5,
- (ZREG(15) - 2), digitWidth[0], VREG(42), VREG(43) << 1, VREG(43) << 1);
+ (ZREG(15) - 2), sDigitWidths[0], VREG(42), VREG(43) << 1, VREG(43) << 1);
svar5 += 9;
svar2++;
}
@@ -3428,13 +3440,14 @@ void Interface_Draw(PlayState* play) {
}
}
- if ((gSaveContext.timer2State == 5) && (Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT)) {
+ if ((gSaveContext.subTimerState == SUBTIMER_STATE_RESPAWN) &&
+ (Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT)) {
// Trade quest timer reached 0
- D_8015FFE6 = 40;
+ sSubTimerStateTimer = 40;
gSaveContext.cutsceneIndex = 0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
- gSaveContext.timer2State = 0;
+ gSaveContext.subTimerState = SUBTIMER_STATE_OFF;
if ((gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KOKIRI) &&
(gSaveContext.equips.buttonItems[0] != ITEM_SWORD_MASTER) &&
@@ -3472,112 +3485,123 @@ void Interface_Draw(PlayState* play) {
!(player->stateFlags2 & PLAYER_STATE2_24) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
(play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play) && (gSaveContext.minigameState != 1) &&
(play->shootingGalleryStatus <= 1) && !((play->sceneId == SCENE_BOWLING) && Flags_GetSwitch(play, 0x38))) {
- svar6 = 0;
- switch (gSaveContext.timer1State) {
- case 1:
- D_8015FFE2 = 20;
- D_8015FFE0 = 20;
- gSaveContext.timer1Value = gSaveContext.health >> 1;
- gSaveContext.timer1State = 2;
+
+ timerId = TIMER_ID_MAIN;
+
+ switch (gSaveContext.timerState) {
+ case TIMER_STATE_ENV_HAZARD_INIT:
+ sTimerStateTimer = 20;
+ sTimerNextSecondTimer = 20;
+ gSaveContext.timerSeconds = gSaveContext.health >> 1;
+ gSaveContext.timerState = TIMER_STATE_ENV_HAZARD_PREVIEW;
break;
- case 2:
- D_8015FFE2--;
- if (D_8015FFE2 == 0) {
- D_8015FFE2 = 20;
- gSaveContext.timer1State = 3;
+
+ case TIMER_STATE_ENV_HAZARD_PREVIEW:
+ sTimerStateTimer--;
+ if (sTimerStateTimer == 0) {
+ sTimerStateTimer = 20;
+ gSaveContext.timerState = TIMER_STATE_ENV_HAZARD_MOVE;
}
break;
- case 5:
- case 11:
- D_8015FFE2 = 20;
- D_8015FFE0 = 20;
- if (gSaveContext.timer1State == 5) {
- gSaveContext.timer1State = 6;
+
+ case TIMER_STATE_DOWN_INIT:
+ case TIMER_STATE_UP_INIT:
+ sTimerStateTimer = 20;
+ sTimerNextSecondTimer = 20;
+ if (gSaveContext.timerState == TIMER_STATE_DOWN_INIT) {
+ gSaveContext.timerState = TIMER_STATE_DOWN_PREVIEW;
} else {
- gSaveContext.timer1State = 12;
+ gSaveContext.timerState = TIMER_STATE_UP_PREVIEW;
}
break;
- case 6:
- case 12:
- D_8015FFE2--;
- if (D_8015FFE2 == 0) {
- D_8015FFE2 = 20;
- if (gSaveContext.timer1State == 6) {
- gSaveContext.timer1State = 7;
+
+ case TIMER_STATE_DOWN_PREVIEW:
+ case TIMER_STATE_UP_PREVIEW:
+ sTimerStateTimer--;
+ if (sTimerStateTimer == 0) {
+ sTimerStateTimer = 20;
+ if (gSaveContext.timerState == TIMER_STATE_DOWN_PREVIEW) {
+ gSaveContext.timerState = TIMER_STATE_DOWN_MOVE;
} else {
- gSaveContext.timer1State = 13;
+ gSaveContext.timerState = TIMER_STATE_UP_MOVE;
}
}
break;
- case 3:
- case 7:
- svar1 = (gSaveContext.timerX[0] - 26) / D_8015FFE2;
- gSaveContext.timerX[0] -= svar1;
+
+ case TIMER_STATE_ENV_HAZARD_MOVE:
+ case TIMER_STATE_DOWN_MOVE:
+ svar1 = (gSaveContext.timerX[TIMER_ID_MAIN] - 26) / sTimerStateTimer;
+ gSaveContext.timerX[TIMER_ID_MAIN] -= svar1;
if (gSaveContext.healthCapacity > 0xA0) {
- svar1 = (gSaveContext.timerY[0] - 54) / D_8015FFE2;
+ svar1 = (gSaveContext.timerY[TIMER_ID_MAIN] - 54) / sTimerStateTimer; // two rows of hearts
} else {
- svar1 = (gSaveContext.timerY[0] - 46) / D_8015FFE2;
+ svar1 = (gSaveContext.timerY[TIMER_ID_MAIN] - 46) / sTimerStateTimer; // one row of hearts
}
- gSaveContext.timerY[0] -= svar1;
+ gSaveContext.timerY[TIMER_ID_MAIN] -= svar1;
- D_8015FFE2--;
- if (D_8015FFE2 == 0) {
- D_8015FFE2 = 20;
- gSaveContext.timerX[0] = 26;
+ sTimerStateTimer--;
+ if (sTimerStateTimer == 0) {
+ sTimerStateTimer = 20;
+ gSaveContext.timerX[TIMER_ID_MAIN] = 26;
if (gSaveContext.healthCapacity > 0xA0) {
- gSaveContext.timerY[0] = 54;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 54; // two rows of hearts
} else {
- gSaveContext.timerY[0] = 46;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 46; // one row of hearts
}
- if (gSaveContext.timer1State == 3) {
- gSaveContext.timer1State = 4;
+ if (gSaveContext.timerState == TIMER_STATE_ENV_HAZARD_MOVE) {
+ gSaveContext.timerState = TIMER_STATE_ENV_HAZARD_TICK;
} else {
- gSaveContext.timer1State = 8;
+ gSaveContext.timerState = TIMER_STATE_DOWN_TICK;
}
}
FALLTHROUGH;
- case 4:
- case 8:
- if ((gSaveContext.timer1State == 4) || (gSaveContext.timer1State == 8)) {
+ case TIMER_STATE_ENV_HAZARD_TICK:
+ case TIMER_STATE_DOWN_TICK:
+ if ((gSaveContext.timerState == TIMER_STATE_ENV_HAZARD_TICK) ||
+ (gSaveContext.timerState == TIMER_STATE_DOWN_TICK)) {
if (gSaveContext.healthCapacity > 0xA0) {
- gSaveContext.timerY[0] = 54;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 54; // two rows of hearts
} else {
- gSaveContext.timerY[0] = 46;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 46; // one row of hearts
}
}
- if ((gSaveContext.timer1State >= 3) && (msgCtx->msgLength == 0)) {
- D_8015FFE0--;
- if (D_8015FFE0 == 0) {
- if (gSaveContext.timer1Value != 0) {
- gSaveContext.timer1Value--;
+ if ((gSaveContext.timerState >= TIMER_STATE_ENV_HAZARD_MOVE) && (msgCtx->msgLength == 0)) {
+ sTimerNextSecondTimer--;
+ if (sTimerNextSecondTimer == 0) {
+ if (gSaveContext.timerSeconds != 0) {
+ gSaveContext.timerSeconds--;
}
- D_8015FFE0 = 20;
+ sTimerNextSecondTimer = 20;
- if (gSaveContext.timer1Value == 0) {
- gSaveContext.timer1State = 10;
- if (D_80125A5C) {
+ if (gSaveContext.timerSeconds == 0) {
+ // Out of time
+ gSaveContext.timerState = TIMER_STATE_STOP;
+ if (sEnvHazardActive) {
gSaveContext.health = 0;
play->damagePlayer(play, -(gSaveContext.health + 2));
}
- D_80125A5C = false;
- } else if (gSaveContext.timer1Value > 60) {
- if (timerDigits[4] == 1) {
+ sEnvHazardActive = false;
+ } else if (gSaveContext.timerSeconds > 60) {
+ // Beep at "xx:x1" (every 10 seconds)
+ if (sTimerDigits[4] == 1) {
Audio_PlaySfxGeneral(NA_SE_SY_MESSAGE_WOMAN, &gSfxDefaultPos, 4,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultReverb);
}
- } else if (gSaveContext.timer1Value >= 11) {
- if (timerDigits[4] & 1) {
+ } else if (gSaveContext.timerSeconds > 10) {
+ // Beep on alternating seconds
+ if ((sTimerDigits[4] % 2) != 0) {
Audio_PlaySfxGeneral(NA_SE_SY_WARNING_COUNT_N, &gSfxDefaultPos, 4,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultReverb);
}
} else {
+ // Beep every second
Audio_PlaySfxGeneral(NA_SE_SY_WARNING_COUNT_E, &gSfxDefaultPos, 4,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultReverb);
@@ -3585,48 +3609,49 @@ void Interface_Draw(PlayState* play) {
}
}
break;
- case 13:
- svar1 = (gSaveContext.timerX[0] - 26) / D_8015FFE2;
- gSaveContext.timerX[0] -= svar1;
+
+ case TIMER_STATE_UP_MOVE:
+ svar1 = (gSaveContext.timerX[TIMER_ID_MAIN] - 26) / sTimerStateTimer;
+ gSaveContext.timerX[TIMER_ID_MAIN] -= svar1;
if (gSaveContext.healthCapacity > 0xA0) {
- svar1 = (gSaveContext.timerY[0] - 54) / D_8015FFE2;
+ svar1 = (gSaveContext.timerY[TIMER_ID_MAIN] - 54) / sTimerStateTimer; // two rows of hearts
} else {
- svar1 = (gSaveContext.timerY[0] - 46) / D_8015FFE2;
+ svar1 = (gSaveContext.timerY[TIMER_ID_MAIN] - 46) / sTimerStateTimer; // one row of hearts
}
- gSaveContext.timerY[0] -= svar1;
+ gSaveContext.timerY[TIMER_ID_MAIN] -= svar1;
- D_8015FFE2--;
- if (D_8015FFE2 == 0) {
- D_8015FFE2 = 20;
- gSaveContext.timerX[0] = 26;
+ sTimerStateTimer--;
+ if (sTimerStateTimer == 0) {
+ sTimerStateTimer = 20;
+ gSaveContext.timerX[TIMER_ID_MAIN] = 26;
if (gSaveContext.healthCapacity > 0xA0) {
- gSaveContext.timerY[0] = 54;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 54; // two rows of hearts
} else {
- gSaveContext.timerY[0] = 46;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 46; // one row of hearts
}
- gSaveContext.timer1State = 14;
+ gSaveContext.timerState = TIMER_STATE_UP_TICK;
}
FALLTHROUGH;
- case 14:
- if (gSaveContext.timer1State == 14) {
+ case TIMER_STATE_UP_TICK:
+ if (gSaveContext.timerState == TIMER_STATE_UP_TICK) {
if (gSaveContext.healthCapacity > 0xA0) {
- gSaveContext.timerY[0] = 54;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 54; // two rows of hearts
} else {
- gSaveContext.timerY[0] = 46;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 46; // one row of hearts
}
}
- if (gSaveContext.timer1State >= 3) {
- D_8015FFE0--;
- if (D_8015FFE0 == 0) {
- gSaveContext.timer1Value++;
- D_8015FFE0 = 20;
+ if (gSaveContext.timerState >= TIMER_STATE_ENV_HAZARD_MOVE) {
+ sTimerNextSecondTimer--;
+ if (sTimerNextSecondTimer == 0) {
+ gSaveContext.timerSeconds++;
+ sTimerNextSecondTimer = 20;
- if (gSaveContext.timer1Value == 3599) {
- D_8015FFE2 = 40;
- gSaveContext.timer1State = 15;
+ if (gSaveContext.timerSeconds == 3599) { // 59 minutes, 59 seconds
+ sTimerStateTimer = 40;
+ gSaveContext.timerState = TIMER_STATE_UP_FREEZE;
} else {
Audio_PlaySfxGeneral(NA_SE_SY_WARNING_COUNT_N, &gSfxDefaultPos, 4,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale,
@@ -3635,146 +3660,163 @@ void Interface_Draw(PlayState* play) {
}
}
break;
- case 10:
- if (gSaveContext.timer2State != 0) {
- D_8015FFE6 = 20;
- D_8015FFE4 = 20;
- gSaveContext.timerX[1] = 140;
- gSaveContext.timerY[1] = 80;
-
- if (gSaveContext.timer2State < 7) {
- gSaveContext.timer2State = 2;
+
+ case TIMER_STATE_STOP:
+ if (gSaveContext.subTimerState != SUBTIMER_STATE_OFF) {
+ sSubTimerStateTimer = 20;
+ sSubTimerNextSecondTimer = 20;
+ gSaveContext.timerX[TIMER_ID_SUB] = 140;
+ gSaveContext.timerY[TIMER_ID_SUB] = 80;
+
+ if (gSaveContext.subTimerState <= SUBTIMER_STATE_STOP) {
+ gSaveContext.subTimerState = SUBTIMER_STATE_DOWN_PREVIEW;
} else {
- gSaveContext.timer2State = 8;
+ gSaveContext.subTimerState = SUBTIMER_STATE_UP_PREVIEW;
}
- gSaveContext.timer1State = 0;
+ gSaveContext.timerState = TIMER_STATE_OFF;
} else {
- gSaveContext.timer1State = 0;
+ gSaveContext.timerState = TIMER_STATE_OFF;
}
- case 15:
+ FALLTHROUGH;
+ case TIMER_STATE_UP_FREEZE:
break;
- default:
- svar6 = 1;
- switch (gSaveContext.timer2State) {
- case 1:
- case 7:
- D_8015FFE6 = 20;
- D_8015FFE4 = 20;
- gSaveContext.timerX[1] = 140;
- gSaveContext.timerY[1] = 80;
- if (gSaveContext.timer2State == 1) {
- gSaveContext.timer2State = 2;
+
+ default: // TIMER_STATE_OFF
+ // Process the subTimer only if the main timer is off
+ timerId = TIMER_ID_SUB;
+
+ switch (gSaveContext.subTimerState) {
+ case SUBTIMER_STATE_DOWN_INIT:
+ case SUBTIMER_STATE_UP_INIT:
+ sSubTimerStateTimer = 20;
+ sSubTimerNextSecondTimer = 20;
+ gSaveContext.timerX[TIMER_ID_SUB] = 140;
+ gSaveContext.timerY[TIMER_ID_SUB] = 80;
+ if (gSaveContext.subTimerState == SUBTIMER_STATE_DOWN_INIT) {
+ gSaveContext.subTimerState = SUBTIMER_STATE_DOWN_PREVIEW;
} else {
- gSaveContext.timer2State = 8;
+ gSaveContext.subTimerState = SUBTIMER_STATE_UP_PREVIEW;
}
break;
- case 2:
- case 8:
- D_8015FFE6--;
- if (D_8015FFE6 == 0) {
- D_8015FFE6 = 20;
- if (gSaveContext.timer2State == 2) {
- gSaveContext.timer2State = 3;
+
+ case SUBTIMER_STATE_DOWN_PREVIEW:
+ case SUBTIMER_STATE_UP_PREVIEW:
+ sSubTimerStateTimer--;
+ if (sSubTimerStateTimer == 0) {
+ sSubTimerStateTimer = 20;
+ if (gSaveContext.subTimerState == SUBTIMER_STATE_DOWN_PREVIEW) {
+ gSaveContext.subTimerState = SUBTIMER_STATE_DOWN_MOVE;
} else {
- gSaveContext.timer2State = 9;
+ gSaveContext.subTimerState = SUBTIMER_STATE_UP_MOVE;
}
}
break;
- case 3:
- case 9:
+
+ case SUBTIMER_STATE_DOWN_MOVE:
+ case SUBTIMER_STATE_UP_MOVE:
osSyncPrintf("event_xp[1]=%d, event_yp[1]=%d TOTAL_EVENT_TM=%d\n",
- ((void)0, gSaveContext.timerX[1]), ((void)0, gSaveContext.timerY[1]),
- gSaveContext.timer2Value);
- svar1 = (gSaveContext.timerX[1] - 26) / D_8015FFE6;
- gSaveContext.timerX[1] -= svar1;
+ ((void)0, gSaveContext.timerX[TIMER_ID_SUB]),
+ ((void)0, gSaveContext.timerY[TIMER_ID_SUB]), gSaveContext.subTimerSeconds);
+ svar1 = (gSaveContext.timerX[TIMER_ID_SUB] - 26) / sSubTimerStateTimer;
+ gSaveContext.timerX[TIMER_ID_SUB] -= svar1;
if (gSaveContext.healthCapacity > 0xA0) {
- svar1 = (gSaveContext.timerY[1] - 54) / D_8015FFE6;
+ // two rows of hearts
+ svar1 = (gSaveContext.timerY[TIMER_ID_SUB] - 54) / sSubTimerStateTimer;
} else {
- svar1 = (gSaveContext.timerY[1] - 46) / D_8015FFE6;
+ // one row of hearts
+ svar1 = (gSaveContext.timerY[TIMER_ID_SUB] - 46) / sSubTimerStateTimer;
}
- gSaveContext.timerY[1] -= svar1;
+ gSaveContext.timerY[TIMER_ID_SUB] -= svar1;
- D_8015FFE6--;
- if (D_8015FFE6 == 0) {
- D_8015FFE6 = 20;
- gSaveContext.timerX[1] = 26;
+ sSubTimerStateTimer--;
+ if (sSubTimerStateTimer == 0) {
+ sSubTimerStateTimer = 20;
+ gSaveContext.timerX[TIMER_ID_SUB] = 26;
if (gSaveContext.healthCapacity > 0xA0) {
- gSaveContext.timerY[1] = 54;
+ gSaveContext.timerY[TIMER_ID_SUB] = 54; // two rows of hearts
} else {
- gSaveContext.timerY[1] = 46;
+ gSaveContext.timerY[TIMER_ID_SUB] = 46; // one row of hearts
}
- if (gSaveContext.timer2State == 3) {
- gSaveContext.timer2State = 4;
+ if (gSaveContext.subTimerState == SUBTIMER_STATE_DOWN_MOVE) {
+ gSaveContext.subTimerState = SUBTIMER_STATE_DOWN_TICK;
} else {
- gSaveContext.timer2State = 10;
+ gSaveContext.subTimerState = SUBTIMER_STATE_UP_TICK;
}
}
FALLTHROUGH;
- case 4:
- case 10:
- if ((gSaveContext.timer2State == 4) || (gSaveContext.timer2State == 10)) {
+ case SUBTIMER_STATE_DOWN_TICK:
+ case SUBTIMER_STATE_UP_TICK:
+ if ((gSaveContext.subTimerState == SUBTIMER_STATE_DOWN_TICK) ||
+ (gSaveContext.subTimerState == SUBTIMER_STATE_UP_TICK)) {
if (gSaveContext.healthCapacity > 0xA0) {
- gSaveContext.timerY[1] = 54;
+ gSaveContext.timerY[TIMER_ID_SUB] = 54; // two rows of hearts
} else {
- gSaveContext.timerY[1] = 46;
+ gSaveContext.timerY[TIMER_ID_SUB] = 46; // one row of hearts
}
}
- if (gSaveContext.timer2State >= 3) {
- D_8015FFE4--;
- if (D_8015FFE4 == 0) {
- D_8015FFE4 = 20;
- if (gSaveContext.timer2State == 4) {
- gSaveContext.timer2Value--;
- osSyncPrintf("TOTAL_EVENT_TM=%d\n", gSaveContext.timer2Value);
+ if (gSaveContext.subTimerState >= SUBTIMER_STATE_DOWN_MOVE) {
+ sSubTimerNextSecondTimer--;
+ if (sSubTimerNextSecondTimer == 0) {
+ sSubTimerNextSecondTimer = 20;
+ if (gSaveContext.subTimerState == SUBTIMER_STATE_DOWN_TICK) {
+ gSaveContext.subTimerSeconds--;
+ osSyncPrintf("TOTAL_EVENT_TM=%d\n", gSaveContext.subTimerSeconds);
- if (gSaveContext.timer2Value <= 0) {
+ if (gSaveContext.subTimerSeconds <= 0) {
+ // Out of time
if (!Flags_GetSwitch(play, 0x37) ||
((play->sceneId != SCENE_GANON_DEMO) &&
(play->sceneId != SCENE_GANON_FINAL) &&
(play->sceneId != SCENE_GANON_SONOGO) &&
(play->sceneId != SCENE_GANONTIKA_SONOGO))) {
- D_8015FFE6 = 40;
- gSaveContext.timer2State = 5;
+ sSubTimerStateTimer = 40;
+ gSaveContext.subTimerState = SUBTIMER_STATE_RESPAWN;
gSaveContext.cutsceneIndex = 0;
Message_StartTextbox(play, 0x71B0, NULL);
func_8002DF54(play, NULL, 8);
} else {
- D_8015FFE6 = 40;
- gSaveContext.timer2State = 6;
+ sSubTimerStateTimer = 40;
+ gSaveContext.subTimerState = SUBTIMER_STATE_STOP;
}
- } else if (gSaveContext.timer2Value > 60) {
- if (timerDigits[4] == 1) {
+ } else if (gSaveContext.subTimerSeconds > 60) {
+ // Beep at "xx:x1" (every 10 seconds)
+ if (sTimerDigits[4] == 1) {
Audio_PlaySfxGeneral(NA_SE_SY_MESSAGE_WOMAN, &gSfxDefaultPos, 4,
&gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
}
- } else if (gSaveContext.timer2Value > 10) {
- if (timerDigits[4] & 1) {
+ } else if (gSaveContext.subTimerSeconds > 10) {
+ // Beep on alternating seconds
+ if ((sTimerDigits[4] % 2) != 0) {
Audio_PlaySfxGeneral(NA_SE_SY_WARNING_COUNT_N, &gSfxDefaultPos, 4,
&gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
}
} else {
+ // Beep every second
Audio_PlaySfxGeneral(NA_SE_SY_WARNING_COUNT_E, &gSfxDefaultPos, 4,
&gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
}
- } else {
- gSaveContext.timer2Value++;
- if (GET_EVENTINF(EVENTINF_10)) {
- if (gSaveContext.timer2Value == 240) {
- Message_StartTextbox(play, 0x6083, NULL);
- CLEAR_EVENTINF(EVENTINF_10);
- gSaveContext.timer2State = 0;
- }
+ } else { // SUBTIMER_STATE_UP_TICK
+ gSaveContext.subTimerSeconds++;
+
+ // Special case for the running-man race
+ if (GET_EVENTINF(EVENTINF_MARATHON_ACTIVE) &&
+ (gSaveContext.subTimerSeconds == MARATHON_TIME_LIMIT)) {
+ // After 4 minutes, cancel the timer
+ Message_StartTextbox(play, 0x6083, NULL);
+ CLEAR_EVENTINF(EVENTINF_MARATHON_ACTIVE);
+ gSaveContext.subTimerState = SUBTIMER_STATE_OFF;
}
}
- if ((gSaveContext.timer2Value % 60) == 0) {
+ // Beep at the minute mark
+ if ((gSaveContext.subTimerSeconds % 60) == 0) {
Audio_PlaySfxGeneral(NA_SE_SY_WARNING_COUNT_N, &gSfxDefaultPos, 4,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultReverb);
@@ -3782,39 +3824,40 @@ void Interface_Draw(PlayState* play) {
}
}
break;
- case 6:
- D_8015FFE6--;
- if (D_8015FFE6 == 0) {
- gSaveContext.timer2State = 0;
+
+ case SUBTIMER_STATE_STOP:
+ sSubTimerStateTimer--;
+ if (sSubTimerStateTimer == 0) {
+ gSaveContext.subTimerState = SUBTIMER_STATE_OFF;
}
break;
}
break;
}
- if (((gSaveContext.timer1State != 0) && (gSaveContext.timer1State != 10)) ||
- (gSaveContext.timer2State != 0)) {
- timerDigits[0] = timerDigits[1] = timerDigits[3] = 0;
- timerDigits[2] = 10; // digit 10 is used as ':' (colon)
+ if (((gSaveContext.timerState != TIMER_STATE_OFF) && (gSaveContext.timerState != TIMER_STATE_STOP)) ||
+ (gSaveContext.subTimerState != SUBTIMER_STATE_OFF)) {
+ sTimerDigits[0] = sTimerDigits[1] = sTimerDigits[3] = 0;
+ sTimerDigits[2] = 10; // digit 10 is used as ':' (colon)
- if (gSaveContext.timer1State != 0) {
- timerDigits[4] = gSaveContext.timer1Value;
+ if (gSaveContext.timerState != TIMER_STATE_OFF) {
+ sTimerDigits[4] = gSaveContext.timerSeconds;
} else {
- timerDigits[4] = gSaveContext.timer2Value;
+ sTimerDigits[4] = gSaveContext.subTimerSeconds;
}
- while (timerDigits[4] >= 60) {
- timerDigits[1]++;
- if (timerDigits[1] >= 10) {
- timerDigits[0]++;
- timerDigits[1] -= 10;
+ while (sTimerDigits[4] >= 60) {
+ sTimerDigits[1]++;
+ if (sTimerDigits[1] >= 10) {
+ sTimerDigits[0]++;
+ sTimerDigits[1] -= 10;
}
- timerDigits[4] -= 60;
+ sTimerDigits[4] -= 60;
}
- while (timerDigits[4] >= 10) {
- timerDigits[3]++;
- timerDigits[4] -= 10;
+ while (sTimerDigits[4] >= 10) {
+ sTimerDigits[3]++;
+ sTimerDigits[4] -= 10;
}
// Clock Icon
@@ -3822,34 +3865,36 @@ void Interface_Draw(PlayState* play) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0);
OVERLAY_DISP =
- Gfx_TextureIA8(OVERLAY_DISP, gClockIconTex, 16, 16, ((void)0, gSaveContext.timerX[svar6]),
- ((void)0, gSaveContext.timerY[svar6]) + 2, 16, 16, 1 << 10, 1 << 10);
+ Gfx_TextureIA8(OVERLAY_DISP, gClockIconTex, 16, 16, ((void)0, gSaveContext.timerX[timerId]),
+ ((void)0, gSaveContext.timerY[timerId]) + 2, 16, 16, 1 << 10, 1 << 10);
// Timer Counter
gDPPipeSync(OVERLAY_DISP++);
gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
TEXEL0, 0, PRIMITIVE, 0);
- if (gSaveContext.timer1State != 0) {
- if ((gSaveContext.timer1Value < 10) && (gSaveContext.timer1State < 11)) {
+ if (gSaveContext.timerState != TIMER_STATE_OFF) {
+ // TIMER_ID_MAIN
+ if ((gSaveContext.timerSeconds < 10) && (gSaveContext.timerState <= TIMER_STATE_STOP)) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 50, 0, 255);
} else {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, 255);
}
} else {
- if ((gSaveContext.timer2Value < 10) && (gSaveContext.timer2State < 6)) {
+ // TIMER_ID_SUB
+ if ((gSaveContext.subTimerSeconds < 10) && (gSaveContext.subTimerState <= SUBTIMER_STATE_RESPAWN)) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 50, 0, 255);
} else {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 0, 255);
}
}
- for (svar1 = 0; svar1 < 5; svar1++) {
+ for (svar1 = 0; svar1 < ARRAY_COUNT(sTimerDigits); svar1++) {
OVERLAY_DISP =
- Gfx_TextureI8(OVERLAY_DISP, ((u8*)gCounterDigit0Tex + (8 * 16 * timerDigits[svar1])), 8, 16,
- ((void)0, gSaveContext.timerX[svar6]) + timerDigitLeftPos[svar1],
- ((void)0, gSaveContext.timerY[svar6]), digitWidth[svar1], VREG(42), VREG(43) << 1,
- VREG(43) << 1);
+ Gfx_TextureI8(OVERLAY_DISP, ((u8*)gCounterDigit0Tex + (8 * 16 * sTimerDigits[svar1])), 8, 16,
+ ((void)0, gSaveContext.timerX[timerId]) + timerDigitLeftPos[svar1],
+ ((void)0, gSaveContext.timerY[timerId]), sDigitWidths[svar1], VREG(42),
+ VREG(43) << 1, VREG(43) << 1);
}
}
}
@@ -4021,24 +4066,25 @@ void Interface_Update(PlayState* play) {
}
Health_UpdateBeatingHeart(play);
- D_80125A58 = func_8008F2F8(play);
+ sEnvHazard = Player_GetEnvironmentalHazard(play);
- if (D_80125A58 == 1) {
+ if (sEnvHazard == PLAYER_ENV_HAZARD_HOTROOM) {
if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == EQUIP_VALUE_TUNIC_GORON) {
- D_80125A58 = 0;
+ sEnvHazard = PLAYER_ENV_HAZARD_NONE;
}
- } else if ((func_8008F2F8(play) >= 2) && (func_8008F2F8(play) < 5)) {
+ } else if ((Player_GetEnvironmentalHazard(play) >= PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) &&
+ (Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE)) {
if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == EQUIP_VALUE_TUNIC_ZORA) {
- D_80125A58 = 0;
+ sEnvHazard = PLAYER_ENV_HAZARD_NONE;
}
}
Health_UpdateMeter(play);
- if ((gSaveContext.timer1State >= 3) && (play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) &&
- (msgCtx->msgMode == MSGMODE_NONE) && !(player->stateFlags2 & PLAYER_STATE2_24) &&
- (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF) &&
- !Play_InCsMode(play)) {}
+ if ((gSaveContext.timerState >= TIMER_STATE_ENV_HAZARD_MOVE) && (play->pauseCtx.state == 0) &&
+ (play->pauseCtx.debugState == 0) && (msgCtx->msgMode == MSGMODE_NONE) &&
+ !(player->stateFlags2 & PLAYER_STATE2_24) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
+ (play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play)) {}
if (gSaveContext.rupeeAccumulator != 0) {
if (gSaveContext.rupeeAccumulator > 0) {
@@ -4140,16 +4186,19 @@ void Interface_Update(PlayState* play) {
Magic_Update(play);
}
- if (gSaveContext.timer1State == 0) {
- if (((D_80125A58 == 1) || (D_80125A58 == 2) || (D_80125A58 == 4)) && ((gSaveContext.health >> 1) != 0)) {
- gSaveContext.timer1State = 1;
- gSaveContext.timerX[0] = 140;
- gSaveContext.timerY[0] = 80;
- D_80125A5C = true;
+ if (gSaveContext.timerState == TIMER_STATE_OFF) {
+ if (((sEnvHazard == PLAYER_ENV_HAZARD_HOTROOM) || (sEnvHazard == PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) ||
+ (sEnvHazard == PLAYER_ENV_HAZARD_UNDERWATER_FREE)) &&
+ ((gSaveContext.health >> 1) != 0)) {
+ gSaveContext.timerState = TIMER_STATE_ENV_HAZARD_INIT;
+ gSaveContext.timerX[TIMER_ID_MAIN] = 140;
+ gSaveContext.timerY[TIMER_ID_MAIN] = 80;
+ sEnvHazardActive = true;
}
} else {
- if (((D_80125A58 == 0) || (D_80125A58 == 3)) && (gSaveContext.timer1State < 5)) {
- gSaveContext.timer1State = 0;
+ if (((sEnvHazard == PLAYER_ENV_HAZARD_NONE) || (sEnvHazard == PLAYER_ENV_HAZARD_SWIMMING)) &&
+ (gSaveContext.timerState <= TIMER_STATE_ENV_HAZARD_TICK)) {
+ gSaveContext.timerState = TIMER_STATE_OFF;
}
}
diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c
index 363139972..5ccf3aae8 100644
--- a/src/code/z_player_lib.c
+++ b/src/code/z_player_lib.c
@@ -4,11 +4,6 @@
#include "assets/objects/object_link_child/object_link_child.h"
typedef struct {
- /* 0x00 */ u8 flag;
- /* 0x02 */ u16 textId;
-} TextTriggerEntry; // size = 0x04
-
-typedef struct {
/* 0x00 */ Gfx* dList;
/* 0x04 */ Vec3f pos;
} BowSlingshotStringData; // size = 0x10
@@ -95,11 +90,16 @@ u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_LENS_OF_TRUTH
};
-TextTriggerEntry sTextTriggers[] = {
- { 1, 0x3040 },
- { 2, 0x401D },
- { 0, 0x0000 },
- { 2, 0x401D },
+typedef struct {
+ /* 0x0 */ u8 flag;
+ /* 0x2 */ u16 textId;
+} EnvHazardTextTriggerEntry; // size = 0x4
+
+EnvHazardTextTriggerEntry sEnvHazardTextTriggers[] = {
+ { ENV_HAZARD_TEXT_TRIGGER_HOTROOM, 0x3040 }, // PLAYER_ENV_HAZARD_HOTROOM - 1
+ { ENV_HAZARD_TEXT_TRIGGER_UNDERWATER, 0x401D }, // PLAYER_ENV_HAZARD_UNDERWATER_FLOOR - 1
+ { 0, 0x0000 }, // PLAYER_ENV_HAZARD_SWIMMING - 1
+ { ENV_HAZARD_TEXT_TRIGGER_UNDERWATER, 0x401D }, // PLAYER_ENV_HAZARD_UNDERWATER_FREE - 1
};
// Used to map model groups to model types for [animation, left hand, right hand, sheath, waist]
@@ -778,35 +778,37 @@ return_neg:
return -1;
}
-s32 func_8008F2F8(PlayState* play) {
+s32 Player_GetEnvironmentalHazard(PlayState* play) {
Player* this = GET_PLAYER(play);
- TextTriggerEntry* triggerEntry;
- s32 var;
+ EnvHazardTextTriggerEntry* triggerEntry;
+ s32 envHazard;
if (play->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_3) { // Room is hot
- var = 0;
- } else if ((this->unk_840 > 80) &&
- ((this->currentBoots == PLAYER_BOOTS_IRON) || (this->unk_840 >= 300))) { // Deep underwater
- var = ((this->currentBoots == PLAYER_BOOTS_IRON) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) ? 1 : 3;
+ envHazard = PLAYER_ENV_HAZARD_HOTROOM - 1;
+ } else if ((this->underwaterTimer > 80) &&
+ ((this->currentBoots == PLAYER_BOOTS_IRON) || (this->underwaterTimer >= 300))) {
+ envHazard = ((this->currentBoots == PLAYER_BOOTS_IRON) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))
+ ? (PLAYER_ENV_HAZARD_UNDERWATER_FLOOR - 1)
+ : (PLAYER_ENV_HAZARD_UNDERWATER_FREE - 1);
} else if (this->stateFlags1 & PLAYER_STATE1_27) { // Swimming
- var = 2;
+ envHazard = PLAYER_ENV_HAZARD_SWIMMING - 1;
} else {
- return 0;
+ return PLAYER_ENV_HAZARD_NONE;
}
- // Trigger general textboxes under certain conditions, like "It's so hot in here!"
- triggerEntry = &sTextTriggers[var];
+ triggerEntry = &sEnvHazardTextTriggers[envHazard];
if (!Player_InCsMode(play)) {
- if ((triggerEntry->flag != 0) && !(gSaveContext.textTriggerFlags & triggerEntry->flag) &&
- (((var == 0) && (this->currentTunic != PLAYER_TUNIC_GORON)) ||
- (((var == 1) || (var == 3)) && (this->currentBoots == PLAYER_BOOTS_IRON) &&
- (this->currentTunic != PLAYER_TUNIC_ZORA)))) {
+ if ((triggerEntry->flag != 0) && !(gSaveContext.envHazardTextTriggerFlags & triggerEntry->flag) &&
+ (((envHazard == (PLAYER_ENV_HAZARD_HOTROOM - 1)) && (this->currentTunic != PLAYER_TUNIC_GORON)) ||
+ (((envHazard == (PLAYER_ENV_HAZARD_UNDERWATER_FLOOR - 1)) ||
+ (envHazard == (PLAYER_ENV_HAZARD_UNDERWATER_FREE - 1))) &&
+ (this->currentBoots == PLAYER_BOOTS_IRON) && (this->currentTunic != PLAYER_TUNIC_ZORA)))) {
Message_StartTextbox(play, triggerEntry->textId, NULL);
- gSaveContext.textTriggerFlags |= triggerEntry->flag;
+ gSaveContext.envHazardTextTriggerFlags |= triggerEntry->flag;
}
}
- return var + 1;
+ return envHazard + 1;
}
u8 sEyeMouthIndices[][2] = {