diff --git a/assets/xml/interface/parameter_static.xml b/assets/xml/interface/parameter_static.xml
index e5e0808c0..a2ab9e0c5 100644
--- a/assets/xml/interface/parameter_static.xml
+++ b/assets/xml/interface/parameter_static.xml
@@ -119,13 +119,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/include/functions.h b/include/functions.h
index 888303d2d..2806bb55e 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -1383,9 +1383,9 @@ void func_800FD928(s32 param_1);
// void func_800FDC94(void);
// void func_800FE390(void);
// void func_800FE3E0(void);
-void func_800FE484(void);
-void func_800FE498(void);
-u8 func_800FE4A8(void);
+void Environment_StopTime(void);
+void Environment_StartTime(void);
+u8 Environment_IsTimeStopped(void);
u32 func_800FE4B8(PlayState* play);
// void func_800FE590(void);
// void func_800FE5D0(void);
@@ -1737,7 +1737,7 @@ void Inventory_ChangeAmmo(s16 item, s16 ammoChange);
void Magic_Add(PlayState* play, s16 magicToAdd);
void Magic_Reset(PlayState* play);
s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type);
-void Interface_SetMinigamePerfect(PlayState* play, s16 minigamePerfectType);
+void Interface_SetPerfectLetters(PlayState* play, s16 perfectLettersType);
void Interface_StartMoonCrash(PlayState* play);
void Interface_Draw(PlayState* play);
void Interface_Update(PlayState* play);
diff --git a/include/macros.h b/include/macros.h
index f5638199e..913ccac4a 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -48,10 +48,13 @@
#define DAY_LENGTH (CLOCK_TIME(24, 0))
#define TIME_TO_MINUTES_F(time) ((time) * ((24.0f * 60.0f) / 0x10000)) // 0.021972656f
-#define CLOCK_TIME_F(hr, min) (((hr) * 60.0f + (min)) * (0x10000 / (24.0f * 60.0f)))
-
#define TIME_TO_MINUTES_ALT_F(time) ((time) / (0x10000 / (24.0f * 60.0f)))
+
+#define TIME_TO_SECONDS_F(time) ((time) * ((24.0f * 60.0f * 60.0f) / 0x10000))
+
+#define CLOCK_TIME_F(hr, min) (((hr) * 60.0f + (min)) * (0x10000 / (24.0f * 60.0f)))
#define CLOCK_TIME_ALT_F(hr, min) (((hr) * 60.0f + (min)) / (24.0f * 60.0f / 0x10000))
+#define CLOCK_TIME_ALT2_F(hr, min) ((((hr) + (min) / 60.0f) * 60.0f) / (24.0f * 60.0f / 0x10000))
#define CAPACITY(upg, value) gUpgradeCapacities[upg][value]
#define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg))
diff --git a/include/variables.h b/include/variables.h
index 2d80ceabf..500d35af2 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -737,17 +737,17 @@ extern UNK_PTR D_801BF5C0;
// extern UNK_TYPE1 D_801BFC10;
// extern UNK_TYPE1 sFinalHoursDigitTextures;
// extern UNK_TYPE1 D_801BFC40;
-// extern UNK_TYPE2 sMinigamePerfectType1AngleOffScreenTargets;
-// extern UNK_TYPE2 sMinigamePerfectType1PrimColorTargets;
+// extern UNK_TYPE2 sPerfectLettersType1OffScreenAngles;
+// extern UNK_TYPE2 sPerfectLettersType1PrimColorTargets;
// extern UNK_TYPE2 D_801BFC62;
// extern UNK_TYPE2 D_801BFC64;
-// extern UNK_TYPE2 sMinigamePerfectType2LetterXOffsetSpellingTargets;
-// extern UNK_TYPE2 sMinigamePerfectType2LetterXOffsetOffScreenTargets;
-// extern UNK_TYPE1 sMinigamePerfectType2PrimColorTargets;
-// extern UNK_TYPE2 sMinigamePerfectType3LetterXOffsetSpellingTargets;
-// extern UNK_TYPE2 sMinigamePerfectType3AngleOffScreenTargets;
-// extern UNK_TYPE1 sMinigamePerfectType3PrimColorTargets;
-// extern UNK_TYPE4 sMinigamePerfectTextures;
+// extern UNK_TYPE2 sPerfectLettersType2SpellingOffsetsX;
+// extern UNK_TYPE2 sPerfectLettersType2OffScreenOffsetsX;
+// extern UNK_TYPE1 sPerfectLettersType2PrimColorTargets;
+// extern UNK_TYPE2 sPerfectLettersType3SpellingOffsetsX;
+// extern UNK_TYPE2 sPerfectLettersType3OffScreenAngles;
+// extern UNK_TYPE1 sPerfectLettersType3PrimColorTargets;
+// extern UNK_TYPE4 sPerfectLettersTextures;
// extern UNK_TYPE2 sTimerStateTimer;
// extern UNK_TYPE2 sTimerDigits;
// extern UNK_TYPE2 D_801BFCEA;
diff --git a/include/z64interface.h b/include/z64interface.h
index 7dcbf0fcb..be2249710 100644
--- a/include/z64interface.h
+++ b/include/z64interface.h
@@ -74,24 +74,24 @@ typedef enum {
} MinigameState;
typedef enum {
- /* 0 */ MINIGAME_PERFECT_TYPE_OFF,
- /* 1 */ MINIGAME_PERFECT_TYPE_1,
- /* 2 */ MINIGAME_PERFECT_TYPE_2,
- /* 3 */ MINIGAME_PERFECT_TYPE_3
+ /* 0 */ PERFECT_LETTERS_TYPE_OFF,
+ /* 1 */ PERFECT_LETTERS_TYPE_1,
+ /* 2 */ PERFECT_LETTERS_TYPE_2,
+ /* 3 */ PERFECT_LETTERS_TYPE_3
} MinigamePerfectType;
typedef enum {
- /* 0 */ MINIGAME_PERFECT_STATE_OFF,
- /* 1 */ MINIGAME_PERFECT_STATE_INIT,
- /* 2 */ MINIGAME_PERFECT_STATE_ENTER,
- /* 3 */ MINIGAME_PERFECT_STATE_STATIONARY, // Display for type 1
- /* 4 */ MINIGAME_PERFECT_STATE_SPREAD, // Exit for type 1
- /* 5 */ MINIGAME_PERFECT_STATE_DISPLAY,
- /* 6 */ MINIGAME_PERFECT_STATE_EXIT
+ /* 0 */ PERFECT_LETTERS_STATE_OFF,
+ /* 1 */ PERFECT_LETTERS_STATE_INIT,
+ /* 2 */ PERFECT_LETTERS_STATE_ENTER,
+ /* 3 */ PERFECT_LETTERS_STATE_STATIONARY, // Display for type 1
+ /* 4 */ PERFECT_LETTERS_STATE_SPREAD, // Exit for type 1
+ /* 5 */ PERFECT_LETTERS_STATE_DISPLAY,
+ /* 6 */ PERFECT_LETTERS_STATE_EXIT
} MinigamePerfectState;
-#define MINIGAME_PERFECT_NUM_LETTERS 8
-#define MINIGAME_PERFECT_ANGLE_PER_LETTER (0x10000 / MINIGAME_PERFECT_NUM_LETTERS)
+#define PERFECT_LETTERS_NUM_LETTERS 8
+#define PERFECT_LETTERS_ANGLE_PER_LETTER (0x10000 / PERFECT_LETTERS_NUM_LETTERS)
typedef enum {
/* 0 */ STORY_DMA_IDLE,
@@ -177,19 +177,19 @@ typedef struct {
/* 0x280 */ u8 minigameState;
/* 0x282 */ s16 minigameCountdownAlpha;
/* 0x284 */ s16 minigameCountdownScale;
- /* 0x286 */ s16 isMinigamePerfect;
- /* 0x288 */ s16 minigamePerfectType;
- /* 0x28A */ s16 minigamePerfectState[MINIGAME_PERFECT_NUM_LETTERS];
- /* 0x29A */ u16 minigamePerfectLetterEllipseAngle[MINIGAME_PERFECT_NUM_LETTERS];
- /* 0x2AA */ s16 minigamePerfectLetterXOffset[MINIGAME_PERFECT_NUM_LETTERS];
- /* 0x2BC */ f32 minigamePerfectLetterEllipseRadiusX[MINIGAME_PERFECT_NUM_LETTERS];
- /* 0x2DC */ f32 minigamePerfectLetterEllipseRadiusY[MINIGAME_PERFECT_NUM_LETTERS];
- /* 0x2FC */ s16 minigamePerfectPrimColor[4];
- /* 0x304 */ s16 minigamePerfectLetterCount;
- /* 0x306 */ s16 minigamePerfectUnused;
- /* 0x308 */ s16 minigamePerfectColorTargetIndex;
- /* 0x30A */ s16 minigamePerfectColorTimer;
- /* 0x30C */ s16 minigamePerfectTimer;
+ /* 0x286 */ s16 perfectLettersOn;
+ /* 0x288 */ s16 perfectLettersType;
+ /* 0x28A */ s16 perfectLettersState[PERFECT_LETTERS_NUM_LETTERS];
+ /* 0x29A */ u16 perfectLettersAngles[PERFECT_LETTERS_NUM_LETTERS]; // Angle that follows the projectory of an ellipse
+ /* 0x2AA */ s16 perfectLettersOffsetX[PERFECT_LETTERS_NUM_LETTERS];
+ /* 0x2BC */ f32 perfectLettersSemiAxisX[PERFECT_LETTERS_NUM_LETTERS];
+ /* 0x2DC */ f32 perfectLettersSemiAxisY[PERFECT_LETTERS_NUM_LETTERS];
+ /* 0x2FC */ s16 perfectLettersPrimColor[4];
+ /* 0x304 */ s16 perfectLettersCount;
+ /* 0x306 */ s16 perfectLettersUnused;
+ /* 0x308 */ s16 perfectLettersColorIndex;
+ /* 0x30A */ s16 perfectLettersColorTimer;
+ /* 0x30C */ s16 perfectLettersTimer;
struct {
/* 0x30E */ u8 hGauge;
/* 0x30F */ u8 bButton;
diff --git a/include/z64save.h b/include/z64save.h
index aad3cfcc4..52afb3bf8 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -258,7 +258,7 @@ typedef struct Save {
/* 0x000C */ u16 time; // "zelda_time"
/* 0x000E */ u16 owlSaveLocation;
/* 0x0010 */ s32 isNight; // "asahiru_fg"
- /* 0x0014 */ s32 daySpeed; // "change_zelda_time"
+ /* 0x0014 */ s32 timeSpeedOffset; // "change_zelda_time"
/* 0x0018 */ s32 day; // "totalday"
/* 0x001C */ s32 daysElapsed; // "eventday"
/* 0x0020 */ u8 playerForm; // "player_character"
@@ -409,6 +409,11 @@ typedef enum SunsSongState {
#define CURRENT_DAY (((void)0, gSaveContext.save.day) % 5)
+// The day begins at CLOCK_TIME(6, 0) so it must be offset.
+#define TIME_UNTIL_MOON_CRASH \
+ ((4 - CURRENT_DAY) * DAY_LENGTH - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0)));
+#define TIME_UNTIL_NEW_DAY (DAY_LENGTH - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0)));
+
#define GET_PLAYER_FORM ((void)0, gSaveContext.save.playerForm)
#define SLOT(item) gItemSlots[item]
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index 5f6ebc7e1..7e12bcece 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -329,7 +329,7 @@ void Cutscene_Command_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdBase* c
if (R_TIME_SPEED != 0) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
gSaveContext.save.time =
- ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed);
+ ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset);
}
}
break;
diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c
index ad66fe4a1..919abbb1d 100644
--- a/src/code/z_kankyo.c
+++ b/src/code/z_kankyo.c
@@ -124,11 +124,11 @@
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE3E0.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE484.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_StopTime.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE498.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_StartTime.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE4A8.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_IsTimeStopped.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE4B8.s")
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index f7baa99c4..4eaab27f7 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -529,7 +529,10 @@ Gfx* Gfx_DrawTexQuad4b(Gfx* gfx, TexturePtr texture, s32 fmt, s16 textureWidth,
return gfx;
}
-s16 sActionVtxPosX[] = {
+// Total number of non-minigame-perfect action quads
+#define ACTION_QUAD_BASE_COUNT 11
+
+s16 sActionVtxPosX[ACTION_QUAD_BASE_COUNT] = {
-14, // A Button
-14, // A Button Background
-24, // A Button Do-Action
@@ -542,7 +545,8 @@ s16 sActionVtxPosX[] = {
-8, // Three-Day Clock's Hour Digit Above the Moon
-12, // Minigame Countdown Textures
};
-s16 sActionVtxWidths[] = {
+
+s16 sActionVtxWidths[ACTION_QUAD_BASE_COUNT] = {
28, // A Button
28, // A Button Background
48, // A Button Do-Action
@@ -555,7 +559,8 @@ s16 sActionVtxWidths[] = {
16, // Three-Day Clock's Hour Digit Above the Moon
24, // Minigame Countdown Textures
};
-s16 sActionVtxPosY[] = {
+
+s16 sActionVtxPosY[ACTION_QUAD_BASE_COUNT] = {
14, // A Button
14, // A Button Background
8, // A Button Do-Action
@@ -568,7 +573,8 @@ s16 sActionVtxPosY[] = {
59, // Three-Day Clock's Hour Digit Above the Moon
32, // Minigame Countdown Textures
};
-s16 sActionVtxHeights[] = {
+
+s16 sActionVtxHeights[ACTION_QUAD_BASE_COUNT] = {
28, // A Button
28, // A Button Background
16, // A Button Do-Action
@@ -582,12 +588,12 @@ s16 sActionVtxHeights[] = {
32, // Minigame Countdown Textures
};
-#define MINIGAME_PERFECT_VTX_WIDTH 32
-#define MINIGAME_PERFECT_VTX_HEIGHT 33
+#define PERFECT_LETTERS_VTX_WIDTH 32
+#define PERFECT_LETTERS_VTX_HEIGHT 33
-// Used for MINIGAME_PERFECT_TYPE_1 and only part of MINIGAME_PERFECT_TYPE_3
-// Both MINIGAME_PERFECT_TYPE_2 and MINIGAME_PERFECT_TYPE_2 have (0, 0) as the center for all letters
-s16 sMinigamePerfectLetterEllipseCenterX[MINIGAME_PERFECT_NUM_LETTERS] = {
+// Used for PERFECT_LETTERS_TYPE_1 and only part of PERFECT_LETTERS_TYPE_3
+// Both PERFECT_LETTERS_TYPE_2 and PERFECT_LETTERS_TYPE_2 have (0, 0) as the center for all letters
+s16 sPerfectLettersCenterX[PERFECT_LETTERS_NUM_LETTERS] = {
-61, // P
-45, // E
29, // R
@@ -597,7 +603,8 @@ s16 sMinigamePerfectLetterEllipseCenterX[MINIGAME_PERFECT_NUM_LETTERS] = {
32, // T
55, // !
};
-s16 sMinigamePerfectLetterEllipseCenterY[MINIGAME_PERFECT_NUM_LETTERS] = {
+
+s16 sPerfectLettersCenterY[PERFECT_LETTERS_NUM_LETTERS] = {
1, // P
-70, // E
-99, // R
@@ -613,8 +620,8 @@ s16 sMinigamePerfectLetterEllipseCenterY[MINIGAME_PERFECT_NUM_LETTERS] = {
* interfaceCtx->actionVtx[4] -> A Button Shadow
* interfaceCtx->actionVtx[8] -> A Button Do-Action
* interfaceCtx->actionVtx[12] -> Three-Day Clock's Star (for the Minute Tracker)
- * interfaceCtx->actionVtx[16] -> Three-Day Clock's Sun (for the Day-Time Hours Tracker)
- * interfaceCtx->actionVtx[20] -> Three-Day Clock's Moon (for the Night-Time Hours Tracker)
+ * interfaceCtx->actionVtx[16] -> Three-Day Clock's Sun (for the Day Hours Tracker)
+ * interfaceCtx->actionVtx[20] -> Three-Day Clock's Moon (for the Night Hours Tracker)
* interfaceCtx->actionVtx[24] -> Three-Day Clock's Hour Digit Above the Sun (uses 8 vertices)
* interfaceCtx->actionVtx[32] -> Three-Day Clock's Hour Digit Above the Moon (uses 8 vertices)
* interfaceCtx->actionVtx[40] -> Minigame Countdown Textures
@@ -636,10 +643,6 @@ s16 sMinigamePerfectLetterEllipseCenterY[MINIGAME_PERFECT_NUM_LETTERS] = {
* interfaceCtx->actionVtx[104] -> Minigame Perfect Letter ! Colored
*/
-// TODO: Mess with macros
-#define MINIGAME_PERFECT_VTX_SHADOW(index) (interfaceCtx->actionVtx[44 + index])
-#define MINIGAME_PERFECT_VTX_COLOR(index) (interfaceCtx->actionVtx[76 + index])
-
#define BEATING_HEART_VTX_X -8
#define BEATING_HEART_VTX_Y -8
#define BEATING_HEART_VTX_WIDTH 16
@@ -651,25 +654,25 @@ void Interface_SetVertices(PlayState* play) {
s16 k;
s16 shadowOffset;
- // 108 = 11 + (2 * 8 minigame perfect)) * 4 vertices per quad
play->interfaceCtx.actionVtx =
- GRAPH_ALLOC(play->state.gfxCtx, (11 + (2 * MINIGAME_PERFECT_NUM_LETTERS)) * 4 * sizeof(Vtx));
+ GRAPH_ALLOC(play->state.gfxCtx, (ACTION_QUAD_BASE_COUNT + (2 * PERFECT_LETTERS_NUM_LETTERS)) * 4 * sizeof(Vtx));
// Loop over all non-minigame perfect vertices
- for (k = 0, i = 0; i < 44; i += 4, k++) {
+ // where (i) is the actionVtx index, (k) is the iterator
+ for (k = 0, i = 0; i < (ACTION_QUAD_BASE_COUNT * 4); i += 4, k++) {
// Left vertices x Pos
interfaceCtx->actionVtx[i + 0].v.ob[0] = interfaceCtx->actionVtx[i + 2].v.ob[0] = sActionVtxPosX[k];
// Right vertices x Pos
interfaceCtx->actionVtx[i + 1].v.ob[0] = interfaceCtx->actionVtx[i + 3].v.ob[0] =
- interfaceCtx->actionVtx[i].v.ob[0] + sActionVtxWidths[k];
+ interfaceCtx->actionVtx[i + 0].v.ob[0] + sActionVtxWidths[k];
// Top vertices y Pos
- interfaceCtx->actionVtx[i].v.ob[1] = interfaceCtx->actionVtx[i + 1].v.ob[1] = sActionVtxPosY[k];
+ interfaceCtx->actionVtx[i + 0].v.ob[1] = interfaceCtx->actionVtx[i + 1].v.ob[1] = sActionVtxPosY[k];
// Bottom vertices y Pos
interfaceCtx->actionVtx[i + 2].v.ob[1] = interfaceCtx->actionVtx[i + 3].v.ob[1] =
- interfaceCtx->actionVtx[i].v.ob[1] - sActionVtxHeights[k];
+ interfaceCtx->actionVtx[i + 0].v.ob[1] - sActionVtxHeights[k];
// All vertices z Pos
interfaceCtx->actionVtx[i + 0].v.ob[2] = interfaceCtx->actionVtx[i + 1].v.ob[2] =
@@ -711,91 +714,92 @@ void Interface_SetVertices(PlayState* play) {
interfaceCtx->actionVtx[7].v.tc[1] = 32 << 5;
// Loop over vertices for the minigame-perfect letters
- // Outer loop is to loop over 2 sets of letters: shadowed letters and colored letters
+ // Outer loop is to loop over 2 sets of letters: shadowed letters (j = 0) and colored letters (j = 1)
for (j = 0, shadowOffset = 2; j < 2; j++, shadowOffset -= 2) {
- for (k = 0; k < MINIGAME_PERFECT_NUM_LETTERS; k++, i += 4) {
- if ((interfaceCtx->minigamePerfectType == MINIGAME_PERFECT_TYPE_1) ||
- ((interfaceCtx->minigamePerfectType == MINIGAME_PERFECT_TYPE_3) &&
- (interfaceCtx->minigamePerfectState[0] == MINIGAME_PERFECT_STATE_EXIT))) {
+ // Inner loop is to loop over letters (k) and actionVtx index (i)
+ for (k = 0; k < PERFECT_LETTERS_NUM_LETTERS; k++, i += 4) {
+ if ((interfaceCtx->perfectLettersType == PERFECT_LETTERS_TYPE_1) ||
+ ((interfaceCtx->perfectLettersType == PERFECT_LETTERS_TYPE_3) &&
+ (interfaceCtx->perfectLettersState[0] == PERFECT_LETTERS_STATE_EXIT))) {
// Left vertices x Pos
- interfaceCtx->actionVtx[i].v.ob[0] = interfaceCtx->actionVtx[i + 2].v.ob[0] =
- -((sMinigamePerfectLetterEllipseCenterX[k] - shadowOffset) + 16);
+ interfaceCtx->actionVtx[i + 0].v.ob[0] = interfaceCtx->actionVtx[i + 2].v.ob[0] =
+ -((sPerfectLettersCenterX[k] - shadowOffset) + 16);
// Right vertices x Pos
interfaceCtx->actionVtx[i + 1].v.ob[0] = interfaceCtx->actionVtx[i + 3].v.ob[0] =
- interfaceCtx->actionVtx[i].v.ob[0] + MINIGAME_PERFECT_VTX_WIDTH;
+ interfaceCtx->actionVtx[i + 0].v.ob[0] + PERFECT_LETTERS_VTX_WIDTH;
// Top vertices y Pos
- interfaceCtx->actionVtx[i].v.ob[1] = interfaceCtx->actionVtx[i + 1].v.ob[1] =
- (sMinigamePerfectLetterEllipseCenterY[k] - shadowOffset) + 16;
+ interfaceCtx->actionVtx[i + 0].v.ob[1] = interfaceCtx->actionVtx[i + 1].v.ob[1] =
+ (sPerfectLettersCenterY[k] - shadowOffset) + 16;
// Bottom vertices y Pos
interfaceCtx->actionVtx[i + 2].v.ob[1] = interfaceCtx->actionVtx[i + 3].v.ob[1] =
- interfaceCtx->actionVtx[i].v.ob[1] - MINIGAME_PERFECT_VTX_HEIGHT;
+ interfaceCtx->actionVtx[i + 0].v.ob[1] - PERFECT_LETTERS_VTX_HEIGHT;
- } else if ((interfaceCtx->minigamePerfectType == MINIGAME_PERFECT_TYPE_2) ||
- (interfaceCtx->minigamePerfectType == MINIGAME_PERFECT_TYPE_3)) {
+ } else if ((interfaceCtx->perfectLettersType == PERFECT_LETTERS_TYPE_2) ||
+ (interfaceCtx->perfectLettersType == PERFECT_LETTERS_TYPE_3)) {
// Left vertices x Pos
- interfaceCtx->actionVtx[i].v.ob[0] = interfaceCtx->actionVtx[i + 2].v.ob[0] =
- -(interfaceCtx->minigamePerfectLetterXOffset[k] - shadowOffset + 16);
+ interfaceCtx->actionVtx[i + 0].v.ob[0] = interfaceCtx->actionVtx[i + 2].v.ob[0] =
+ -(interfaceCtx->perfectLettersOffsetX[k] - shadowOffset + 16);
// Right vertices x Pos
interfaceCtx->actionVtx[i + 1].v.ob[0] = interfaceCtx->actionVtx[i + 3].v.ob[0] =
- interfaceCtx->actionVtx[i].v.ob[0] + MINIGAME_PERFECT_VTX_WIDTH;
+ interfaceCtx->actionVtx[i + 0].v.ob[0] + PERFECT_LETTERS_VTX_WIDTH;
// Top vertices y Pos
- interfaceCtx->actionVtx[i].v.ob[1] = interfaceCtx->actionVtx[i + 1].v.ob[1] = 16 - shadowOffset;
+ interfaceCtx->actionVtx[i + 0].v.ob[1] = interfaceCtx->actionVtx[i + 1].v.ob[1] = 16 - shadowOffset;
// Bottom vertices y Pos
interfaceCtx->actionVtx[i + 2].v.ob[1] = interfaceCtx->actionVtx[i + 3].v.ob[1] =
- interfaceCtx->actionVtx[i].v.ob[1] - MINIGAME_PERFECT_VTX_HEIGHT;
+ interfaceCtx->actionVtx[i + 0].v.ob[1] - PERFECT_LETTERS_VTX_HEIGHT;
} else {
// Left vertices x Pos
- interfaceCtx->actionVtx[i].v.ob[0] = interfaceCtx->actionVtx[i + 2].v.ob[0] = -(216 - shadowOffset);
+ interfaceCtx->actionVtx[i + 0].v.ob[0] = interfaceCtx->actionVtx[i + 2].v.ob[0] = -(216 - shadowOffset);
// Right vertices x Pos
interfaceCtx->actionVtx[i + 1].v.ob[0] = interfaceCtx->actionVtx[i + 3].v.ob[0] =
- interfaceCtx->actionVtx[i].v.ob[0] + MINIGAME_PERFECT_VTX_WIDTH;
+ interfaceCtx->actionVtx[i + 0].v.ob[0] + PERFECT_LETTERS_VTX_WIDTH;
// Top vertices y Pos
- interfaceCtx->actionVtx[i].v.ob[1] = interfaceCtx->actionVtx[i + 1].v.ob[1] = 24 - shadowOffset;
+ interfaceCtx->actionVtx[i + 0].v.ob[1] = interfaceCtx->actionVtx[i + 1].v.ob[1] = 24 - shadowOffset;
// Bottom vertices y Pos
interfaceCtx->actionVtx[i + 2].v.ob[1] = interfaceCtx->actionVtx[i + 3].v.ob[1] =
- interfaceCtx->actionVtx[i].v.ob[1] - MINIGAME_PERFECT_VTX_HEIGHT;
+ interfaceCtx->actionVtx[i + 0].v.ob[1] - PERFECT_LETTERS_VTX_HEIGHT;
}
// All vertices z Pos
- interfaceCtx->actionVtx[i].v.ob[2] = interfaceCtx->actionVtx[i + 1].v.ob[2] =
+ interfaceCtx->actionVtx[i + 0].v.ob[2] = interfaceCtx->actionVtx[i + 1].v.ob[2] =
interfaceCtx->actionVtx[i + 2].v.ob[2] = interfaceCtx->actionVtx[i + 3].v.ob[2] = 0;
// Unused flag
- interfaceCtx->actionVtx[i].v.flag = interfaceCtx->actionVtx[i + 1].v.flag =
+ interfaceCtx->actionVtx[i + 0].v.flag = interfaceCtx->actionVtx[i + 1].v.flag =
interfaceCtx->actionVtx[i + 2].v.flag = interfaceCtx->actionVtx[i + 3].v.flag = 0;
// Left and Top texture coordinates
- interfaceCtx->actionVtx[i].v.tc[0] = interfaceCtx->actionVtx[i].v.tc[1] =
+ interfaceCtx->actionVtx[i + 0].v.tc[0] = interfaceCtx->actionVtx[i + 0].v.tc[1] =
interfaceCtx->actionVtx[i + 1].v.tc[1] = interfaceCtx->actionVtx[i + 2].v.tc[0] = 0;
// Right vertices texture coordinates
- interfaceCtx->actionVtx[i + 1].v.tc[0] = interfaceCtx->actionVtx[i + 3].v.tc[0] = MINIGAME_PERFECT_VTX_WIDTH
+ interfaceCtx->actionVtx[i + 1].v.tc[0] = interfaceCtx->actionVtx[i + 3].v.tc[0] = PERFECT_LETTERS_VTX_WIDTH
<< 5;
// Bottom vertices texture coordinates
- interfaceCtx->actionVtx[i + 2].v.tc[1] = interfaceCtx->actionVtx[i + 3].v.tc[1] =
- MINIGAME_PERFECT_VTX_HEIGHT << 5;
+ interfaceCtx->actionVtx[i + 2].v.tc[1] = interfaceCtx->actionVtx[i + 3].v.tc[1] = PERFECT_LETTERS_VTX_HEIGHT
+ << 5;
// Set color
- interfaceCtx->actionVtx[i].v.cn[0] = interfaceCtx->actionVtx[i + 1].v.cn[0] =
+ interfaceCtx->actionVtx[i + 0].v.cn[0] = interfaceCtx->actionVtx[i + 1].v.cn[0] =
interfaceCtx->actionVtx[i + 2].v.cn[0] = interfaceCtx->actionVtx[i + 3].v.cn[0] =
- interfaceCtx->actionVtx[i].v.cn[1] = interfaceCtx->actionVtx[i + 1].v.cn[1] =
+ interfaceCtx->actionVtx[i + 0].v.cn[1] = interfaceCtx->actionVtx[i + 1].v.cn[1] =
interfaceCtx->actionVtx[i + 2].v.cn[1] = interfaceCtx->actionVtx[i + 3].v.cn[1] =
- interfaceCtx->actionVtx[i].v.cn[2] = interfaceCtx->actionVtx[i + 1].v.cn[2] =
+ interfaceCtx->actionVtx[i + 0].v.cn[2] = interfaceCtx->actionVtx[i + 1].v.cn[2] =
interfaceCtx->actionVtx[i + 2].v.cn[2] = interfaceCtx->actionVtx[i + 3].v.cn[2] = 255;
// Set alpha
- interfaceCtx->actionVtx[i].v.cn[3] = interfaceCtx->actionVtx[i + 1].v.cn[3] =
+ interfaceCtx->actionVtx[i + 0].v.cn[3] = interfaceCtx->actionVtx[i + 1].v.cn[3] =
interfaceCtx->actionVtx[i + 2].v.cn[3] = interfaceCtx->actionVtx[i + 3].v.cn[3] = 255;
}
}
@@ -964,7 +968,7 @@ void Interface_NewDay(PlayState* play, s32 day) {
(u32)SEGMENT_ROM_START(week_static) + i * 0x510, 0x510);
// i is used to store sceneId
- for (i = 0; i < 120; i++) {
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.permanentSceneFlags); i++) {
gSaveContext.save.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
gSaveContext.save.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
gSaveContext.save.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
@@ -4470,8 +4474,8 @@ void Interface_DrawPauseMenuEquippingIcons(PlayState* play) {
#ifdef NON_MATCHING
void Interface_DrawClock(PlayState* play) {
static s16 sThreeDayClockAlpha = 255;
- static s16 D_801BFB30 = 0; // clockAlphaTimer1
- static s16 D_801BFB34 = 0; // clockAlphaTimer2
+ static s16 D_801BFB30 = 0; // sClockAlphaTimer1
+ static s16 D_801BFB34 = 0; // sClockAlphaTimer2
static u16 sThreeDayClockHours[] = {
CLOCK_TIME(0, 0), CLOCK_TIME(1, 0), CLOCK_TIME(2, 0), CLOCK_TIME(3, 0), CLOCK_TIME(4, 0),
CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), CLOCK_TIME(7, 0), CLOCK_TIME(8, 0), CLOCK_TIME(9, 0),
@@ -4487,30 +4491,30 @@ void Interface_DrawClock(PlayState* play) {
gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex,
gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex,
};
- static s16 D_801BFBCC = 0; // clockInvDiamondPrimRed
- static s16 D_801BFBD0 = 0; // clockInvDiamondPrimGreen
- static s16 D_801BFBD4 = 255; // clockInvDiamondPrimBlue
- static s16 D_801BFBD8 = 0; // clockInvDiamondEnvRed
- static s16 D_801BFBDC = 0; // clockInvDiamondEnvGreen
- static s16 D_801BFBE0 = 0; // clockInvDiamondEnvBlue
- static s16 D_801BFBE4 = 15; // clockInvDiamondTimer
- static s16 D_801BFBE8 = 0; // clockInvDiamondTargetIndex
- static s16 D_801BFBEC[] = { 100, 0 }; // clockInvDiamondPrimRedTargets
- static s16 D_801BFBF0[] = { 205, 155 }; // clockInvDiamondPrimGreenTargets
- static s16 D_801BFBF4[] = { 255, 255 }; // clockInvDiamondPrimBlueTargets
- static s16 D_801BFBF8[] = { 30, 0 }; // clockInvDiamondEnvRedTargets
- static s16 D_801BFBFC[] = { 30, 0 }; // clockInvDiamondEnvGreenTargets
- static s16 D_801BFC00[] = { 100, 0 }; // clockInvDiamondEnvBlueTargets
- static s16 D_801BFC04[] = { 255, 0 }; // finalHoursClockDigitsRed
- static s16 D_801BFC08[] = { 100, 0 }; // finalHoursClockFrameEnvRedTargets
- static s16 D_801BFC0C[] = { 30, 0 }; // finalHoursClockFrameEnvGreenTargets
- static s16 D_801BFC10[] = { 100, 0 }; // finalHoursClockFrameEnvBlueTargets
+ static s16 D_801BFBCC = 0; // sClockInvDiamondPrimRed
+ static s16 D_801BFBD0 = 0; // sClockInvDiamondPrimGreen
+ static s16 D_801BFBD4 = 255; // sClockInvDiamondPrimBlue
+ static s16 D_801BFBD8 = 0; // sClockInvDiamondEnvRed
+ static s16 D_801BFBDC = 0; // sClockInvDiamondEnvGreen
+ static s16 D_801BFBE0 = 0; // sClockInvDiamondEnvBlue
+ static s16 D_801BFBE4 = 15; // sClockInvDiamondTimer
+ static s16 D_801BFBE8 = 0; // sClockInvDiamondTargetIndex
+ static s16 D_801BFBEC[] = { 100, 0 }; // sClockInvDiamondPrimRedTargets
+ static s16 D_801BFBF0[] = { 205, 155 }; // sClockInvDiamondPrimGreenTargets
+ static s16 D_801BFBF4[] = { 255, 255 }; // sClockInvDiamondPrimBlueTargets
+ static s16 D_801BFBF8[] = { 30, 0 }; // sClockInvDiamondEnvRedTargets
+ static s16 D_801BFBFC[] = { 30, 0 }; // sClockInvDiamondEnvGreenTargets
+ static s16 D_801BFC00[] = { 100, 0 }; // sClockInvDiamondEnvBlueTargets
+ static s16 D_801BFC04[] = { 255, 0 }; // sFinalHoursClockDigitsRed
+ static s16 D_801BFC08[] = { 100, 0 }; // sFinalHoursClockFrameEnvRedTargets
+ static s16 D_801BFC0C[] = { 30, 0 }; // sFinalHoursClockFrameEnvGreenTargets
+ static s16 D_801BFC10[] = { 100, 0 }; // sFinalHoursClockFrameEnvBlueTargets
static TexturePtr sFinalHoursDigitTextures[] = {
gFinalHoursClockDigit0Tex, gFinalHoursClockDigit1Tex, gFinalHoursClockDigit2Tex, gFinalHoursClockDigit3Tex,
gFinalHoursClockDigit4Tex, gFinalHoursClockDigit5Tex, gFinalHoursClockDigit6Tex, gFinalHoursClockDigit7Tex,
gFinalHoursClockDigit8Tex, gFinalHoursClockDigit9Tex, gFinalHoursClockColonTex,
};
- // finalHoursDigitSlotPosXOffset
+ // sFinalHoursDigitSlotPosXOffset
static s16 D_801BFC40[] = {
127, 136, 144, 151, 160, 168, 175, 184,
};
@@ -4518,10 +4522,10 @@ void Interface_DrawClock(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
s16 sp1E6;
f32 temp_f14;
- u32 timeBeforeMoonCrash;
+ u32 timeUntilMoonCrash;
f32 sp1D8;
f32 timeInMinutes;
- f32 sp1D0;
+ f32 timeInSeconds;
f32 sp1CC;
s32 new_var;
s16 sp1C6;
@@ -4538,468 +4542,456 @@ void Interface_DrawClock(PlayState* play) {
if ((msgCtx->msgMode == 0) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) ||
(msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) ||
(gSaveContext.gameMode == 3)) {
- if (!FrameAdvance_IsEnabled(&play->state)) {
- if (func_800FE4A8() == 0) {
- if (((void)0, gSaveContext.save.day) < 4) {
- /**
- * Changes Clock's transparancy depending if Player is moving or not and possibly other things
- */
- if (((void)0, gSaveContext.hudVisibility) == HUD_VISIBILITY_ALL) {
- if (func_801234D4(play) != 0) {
- sThreeDayClockAlpha = 80;
- D_801BFB30 = 5;
- D_801BFB34 = 20;
- } else if (D_801BFB34 != 0) {
- D_801BFB34--;
- } else if (D_801BFB30 != 0) {
- colorStep = ABS_ALT(sThreeDayClockAlpha - 255) / D_801BFB30;
- sThreeDayClockAlpha += colorStep;
+ if (!FrameAdvance_IsEnabled(&play->state) && !Environment_IsTimeStopped() && (gSaveContext.save.day < 4)) {
+ /**
+ * Changes Clock's transparancy depending if Player is moving or not and possibly other things
+ */
+ if (gSaveContext.hudVisibility == HUD_VISIBILITY_ALL) {
+ if (func_801234D4(play)) {
+ sThreeDayClockAlpha = 80;
+ D_801BFB30 = 5;
+ D_801BFB34 = 20;
+ } else if (D_801BFB34 != 0) {
+ D_801BFB34--;
+ } else if (D_801BFB30 != 0) {
+ colorStep = ABS_ALT(sThreeDayClockAlpha - 255) / D_801BFB30;
+ sThreeDayClockAlpha += colorStep;
- if (sThreeDayClockAlpha >= 255) {
- sThreeDayClockAlpha = 255;
- D_801BFB30 = 0;
- }
- } else {
- if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- sThreeDayClockAlpha = 255;
- } else {
- sThreeDayClockAlpha = interfaceCtx->bAlpha;
- }
- D_801BFB34 = 0;
- D_801BFB30 = 0;
- }
- } else {
- if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- sThreeDayClockAlpha = 255;
- } else {
- sThreeDayClockAlpha = interfaceCtx->bAlpha;
- }
- D_801BFB34 = 0;
+ if (sThreeDayClockAlpha >= 255) {
+ sThreeDayClockAlpha = 255;
D_801BFB30 = 0;
}
+ } else {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
+ sThreeDayClockAlpha = 255;
+ } else {
+ sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ }
+ D_801BFB34 = 0;
+ D_801BFB30 = 0;
+ }
+ } else {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
+ sThreeDayClockAlpha = 255;
+ } else {
+ sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ }
+ D_801BFB34 = 0;
+ D_801BFB30 = 0;
+ }
- if ((play->pauseCtx.state == PAUSE_STATE_OFF) &&
- (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
+ if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
- func_8012C654(play->state.gfxCtx);
+ func_8012C654(play->state.gfxCtx);
- /**
- * Draw Clock's Hour Lines
- */
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 130, 130, 130, sThreeDayClockAlpha);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0,
- PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
+ /**
+ * Draw Clock's Hour Lines
+ */
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 130, 130, 130, sThreeDayClockAlpha);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
+ TEXEL0, 0, PRIMITIVE, 0);
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockHourLinesTex, 4, 64, 35, 96,
- 180, 128, 35, 1, 6, 0, 1 << 10, 1 << 10);
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockHourLinesTex, 4, 64, 35, 96, 180, 128,
+ 35, 1, 6, 0, 1 << 10, 1 << 10);
- /**
- * Draw Clock's Border
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, sThreeDayClockAlpha);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0,
- PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
+ /**
+ * Draw Clock's Border
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, sThreeDayClockAlpha);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
+ TEXEL0, 0, PRIMITIVE, 0);
- //! @bug A texture height of 50 is given below. The texture is only 48 units height
- //! resulting in this reading into the next texture. This results in a white
- //! dot in the bottom center of the clock. For the three-day clock, this is
- //! covered by the diamond. However, it can be seen by the final-hours clock.
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockBorderTex, 4, 64, 50, 96, 168,
- 128, 50, 1, 6, 0, 1 << 10, 1 << 10);
+ //! @bug A texture height of 50 is given below. The texture is only 48 units height
+ //! resulting in this reading into the next texture. This results in a white
+ //! dot in the bottom center of the clock. For the three-day clock, this is
+ //! covered by the diamond. However, it can be seen by the final-hours clock.
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockBorderTex, 4, 64, 50, 96, 168, 128, 50,
+ 1, 6, 0, 1 << 10, 1 << 10);
- if (((CURRENT_DAY >= 4) ||
- ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) &&
- (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0))))) {
- func_8012C8D4(play->state.gfxCtx);
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ if (((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) &&
+ (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0))))) {
+ func_8012C8D4(play->state.gfxCtx);
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ } else {
+ /**
+ * Draw Three-Day Clock's Diamond
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+
+ // Time is slowed down to half speed with inverted song of time
+ if (gSaveContext.save.timeSpeedOffset == -2) {
+ // Clock diamond is blue and flashes white
+ colorStep = ABS_ALT(D_801BFBCC - D_801BFBEC[D_801BFBE8]) / D_801BFBE4;
+ if (D_801BFBCC >= D_801BFBEC[D_801BFBE8]) {
+ D_801BFBCC -= colorStep;
} else {
- /**
- * Draw Three-Day Clock's Diamond
- */
- gDPPipeSync(OVERLAY_DISP++);
-
- // Time is slowed down to half speed with inverted song of time
- if (gSaveContext.save.daySpeed == -2) {
- // Clock diamond is blue and flashes white
- colorStep = ABS_ALT(D_801BFBCC - D_801BFBEC[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBCC >= D_801BFBEC[D_801BFBE8]) {
- D_801BFBCC -= colorStep;
- } else {
- D_801BFBCC += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD0 - D_801BFBF0[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD0 >= D_801BFBF0[D_801BFBE8]) {
- D_801BFBD0 -= colorStep;
- } else {
- D_801BFBD0 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD4 - D_801BFBF4[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD4 >= D_801BFBF4[D_801BFBE8]) {
- D_801BFBD4 -= colorStep;
- } else {
- D_801BFBD4 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD8 - D_801BFBF8[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD8 >= D_801BFBF8[D_801BFBE8]) {
- D_801BFBD8 -= colorStep;
- } else {
- D_801BFBD8 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBDC - D_801BFBFC[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBDC >= D_801BFBFC[D_801BFBE8]) {
- D_801BFBDC -= colorStep;
- } else {
- D_801BFBDC += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBE0 - D_801BFC00[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBE0 >= D_801BFC00[D_801BFBE8]) {
- D_801BFBE0 -= colorStep;
- } else {
- D_801BFBE0 += colorStep;
- }
-
- D_801BFBE4--;
-
- if (D_801BFBE4 == 0) {
- D_801BFBCC = D_801BFBEC[D_801BFBE8];
- D_801BFBD0 = D_801BFBF0[D_801BFBE8];
- D_801BFBD4 = D_801BFBF4[D_801BFBE8];
- D_801BFBD8 = D_801BFBF8[D_801BFBE8];
- D_801BFBDC = D_801BFBFC[D_801BFBE8];
- D_801BFBE0 = D_801BFC00[D_801BFBE8];
- D_801BFBE4 = 15;
- D_801BFBE8 ^= 1;
- }
-
- gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT,
- TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0,
- ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, D_801BFBCC, D_801BFBD0, 255,
- sThreeDayClockAlpha);
- gDPSetEnvColor(OVERLAY_DISP++, D_801BFBD8, D_801BFBDC, D_801BFBE0, 0);
- } else {
- // Clock diamond is green for regular daySpeed
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 170, 100, sThreeDayClockAlpha);
- }
-
- OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gThreeDayClockDiamondTex, 40, 32, 140,
- 190, 40, 32, 1 << 10, 1 << 10);
-
- /**
- * Draw Three-Day Clock's Day-Number over Diamond
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
-
- OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, interfaceCtx->doActionSegment + 0x780,
- 48, 27, 137, 192, 48, 27, 1 << 10, 1 << 10);
-
- /**
- * Draw Three-Day Clock's Star (for the Minute Tracker)
- */
- gDPPipeSync(OVERLAY_DISP++);
-
- if (D_801BF974 != 0) {
- D_801BF980 += 0.02f;
- D_801BF97C += 11;
- } else {
- D_801BF980 -= 0.02f;
- D_801BF97C -= 11;
- }
-
- D_801BF978--;
- if (D_801BF978 == 0) {
- D_801BF978 = 10;
- D_801BF974 ^= 1;
- }
-
- sp1D0 = gSaveContext.save.time * 1.3183594f;
- sp1D0 -= ((s16)(sp1D0 / 3600.0f)) * 3600.0f;
-
- func_8012C8D4(play->state.gfxCtx);
-
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- if (sThreeDayClockAlpha != 255) {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, sThreeDayClockAlpha);
- } else {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, D_801BF97C);
- }
-
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
-
- Matrix_Translate(0.0f, -86.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, D_801BF980, MTXMODE_APPLY);
- Matrix_RotateZF(-(sp1D0 * 0.0175f) / 10.0f, MTXMODE_APPLY);
-
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[12], 4, 0);
- gDPLoadTextureBlock_4b(OVERLAY_DISP++, gThreeDayClockStarMinuteTex, G_IM_FMT_I, 16, 16,
- 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP,
- G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
- gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
+ D_801BFBCC += colorStep;
}
- /**
- * Cuts off Three-Day Clock's Sun and Moon when they dip below the clock
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
- R_THREE_DAY_CLOCK_SUN_MOON_CUTOFF * 4.0f);
-
- // determines the current hour
- for (sp1C6 = 0; sp1C6 <= 24; sp1C6++) {
- if (((void)0, gSaveContext.save.time) < sThreeDayClockHours[sp1C6 + 1]) {
- break;
- }
+ colorStep = ABS_ALT(D_801BFBD0 - D_801BFBF0[D_801BFBE8]) / D_801BFBE4;
+ if (D_801BFBD0 >= D_801BFBF0[D_801BFBE8]) {
+ D_801BFBD0 -= colorStep;
+ } else {
+ D_801BFBD0 += colorStep;
}
- /**
- * Draw Three-Day Clock's Sun (for the Day-Time Hours Tracker)
- */
- time = gSaveContext.save.time;
- sp1D8 = Math_SinS(time) * -40.0f;
- temp_f14 = Math_CosS(time) * -34.0f;
+ colorStep = ABS_ALT(D_801BFBD4 - D_801BFBF4[D_801BFBE8]) / D_801BFBE4;
+ if (D_801BFBD4 >= D_801BFBF4[D_801BFBE8]) {
+ D_801BFBD4 -= colorStep;
+ } else {
+ D_801BFBD4 += colorStep;
+ }
- gDPPipeSync(OVERLAY_DISP++);
+ colorStep = ABS_ALT(D_801BFBD8 - D_801BFBF8[D_801BFBE8]) / D_801BFBE4;
+ if (D_801BFBD8 >= D_801BFBF8[D_801BFBE8]) {
+ D_801BFBD8 -= colorStep;
+ } else {
+ D_801BFBD8 += colorStep;
+ }
+
+ colorStep = ABS_ALT(D_801BFBDC - D_801BFBFC[D_801BFBE8]) / D_801BFBE4;
+ if (D_801BFBDC >= D_801BFBFC[D_801BFBE8]) {
+ D_801BFBDC -= colorStep;
+ } else {
+ D_801BFBDC += colorStep;
+ }
+
+ colorStep = ABS_ALT(D_801BFBE0 - D_801BFC00[D_801BFBE8]) / D_801BFBE4;
+ if (D_801BFBE0 >= D_801BFC00[D_801BFBE8]) {
+ D_801BFBE0 -= colorStep;
+ } else {
+ D_801BFBE0 += colorStep;
+ }
+
+ D_801BFBE4--;
+
+ if (D_801BFBE4 == 0) {
+ D_801BFBCC = D_801BFBEC[D_801BFBE8];
+ D_801BFBD0 = D_801BFBF0[D_801BFBE8];
+ D_801BFBD4 = D_801BFBF4[D_801BFBE8];
+ D_801BFBD8 = D_801BFBF8[D_801BFBE8];
+ D_801BFBDC = D_801BFBFC[D_801BFBE8];
+ D_801BFBE0 = D_801BFC00[D_801BFBE8];
+ D_801BFBE4 = 15;
+ D_801BFBE8 ^= 1;
+ }
+
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
+ PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, D_801BFBCC, D_801BFBD0, 255, sThreeDayClockAlpha);
+ gDPSetEnvColor(OVERLAY_DISP++, D_801BFBD8, D_801BFBDC, D_801BFBE0, 0);
+ } else {
+ // Clock diamond is green for regular timeSpeedOffset
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 100, 110, sThreeDayClockAlpha);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 170, 100, sThreeDayClockAlpha);
+ }
- Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gThreeDayClockDiamondTex, 40, 32, 140, 190, 40,
+ 32, 1 << 10, 1 << 10);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[16], 4, 0);
+ /**
+ * Draw Three-Day Clock's Day-Number over Diamond
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockSunHourTex, 24, 24, 0);
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, interfaceCtx->doActionSegment + 0x780, 48, 27,
+ 137, 192, 48, 27, 1 << 10, 1 << 10);
- /**
- * Draw Three-Day Clock's Moon (for the Night-Time Hours Tracker)
- */
- sp1D8 = Math_SinS(time) * 40.0f;
- temp_f14 = Math_CosS(time) * 34.0f;
+ /**
+ * Draw Three-Day Clock's Star (for the Minute Tracker)
+ */
+ gDPPipeSync(OVERLAY_DISP++);
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 55, sThreeDayClockAlpha);
+ if (D_801BF974 != 0) {
+ D_801BF980 += 0.02f;
+ D_801BF97C += 11;
+ } else {
+ D_801BF980 -= 0.02f;
+ D_801BF97C -= 11;
+ }
- Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[20], 4, 0);
+ D_801BF978--;
+ if (D_801BF978 == 0) {
+ D_801BF978 = 10;
+ D_801BF974 ^= 1;
+ }
- OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockMoonHourTex, 24, 24, 0);
+ timeInSeconds = TIME_TO_SECONDS_F(gSaveContext.save.time);
+ timeInSeconds -= ((s16)(timeInSeconds / 3600.0f)) * 3600.0f;
- /**
- * Cuts off Three-Day Clock's Hour Digits when they dip below the clock
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
- R_THREE_DAY_CLOCK_HOUR_DIGIT_CUTOFF * 4.0f);
+ func_8012C8D4(play->state.gfxCtx);
- /**
- * Draws Three-Day Clock's Hour Digit Above the Sun
- */
- sp1CC = gSaveContext.save.time * 0.000096131f;
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- // Rotates Three-Day Clock's Hour Digit To Above the Sun
- Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateZF(-(sp1CC - 3.15f), MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ if (sThreeDayClockAlpha != 255) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, sThreeDayClockAlpha);
+ } else {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, D_801BF97C);
+ }
- // Draws Three-Day Clock's Hour Digit Above the Sun
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0,
- PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[24], 8, 0);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+
+ Matrix_Translate(0.0f, -86.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, D_801BF980, MTXMODE_APPLY);
+ Matrix_RotateZF(-(timeInSeconds * 0.0175f) / 10.0f, MTXMODE_APPLY);
+
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[12], 4, 0);
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, gThreeDayClockStarMinuteTex, G_IM_FMT_I, 16, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
+ G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
+ }
+
+ /**
+ * Cuts off Three-Day Clock's Sun and Moon when they dip below the clock
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
+ R_THREE_DAY_CLOCK_SUN_MOON_CUTOFF * 4.0f);
+
+ // determines the current hour
+ for (sp1C6 = 0; sp1C6 <= 24; sp1C6++) {
+ if (((void)0, gSaveContext.save.time) < sThreeDayClockHours[sp1C6 + 1]) {
+ break;
+ }
+ }
+
+ /**
+ * Draw Three-Day Clock's Sun (for the Day-Time Hours Tracker)
+ */
+ time = gSaveContext.save.time;
+ sp1D8 = Math_SinS(time) * -40.0f;
+ temp_f14 = Math_CosS(time) * -34.0f;
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 100, 110, sThreeDayClockAlpha);
+
+ Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[16], 4, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockSunHourTex, 24, 24, 0);
+
+ /**
+ * Draw Three-Day Clock's Moon (for the Night-Time Hours Tracker)
+ */
+ sp1D8 = Math_SinS(time) * 40.0f;
+ temp_f14 = Math_CosS(time) * 34.0f;
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 55, sThreeDayClockAlpha);
+
+ Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[20], 4, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockMoonHourTex, 24, 24, 0);
+
+ /**
+ * Cuts off Three-Day Clock's Hour Digits when they dip below the clock
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
+ R_THREE_DAY_CLOCK_HOUR_DIGIT_CUTOFF * 4.0f);
+
+ /**
+ * Draws Three-Day Clock's Hour Digit Above the Sun
+ */
+ sp1CC = gSaveContext.save.time * 0.000096131f;
+
+ // Rotates Three-Day Clock's Hour Digit To Above the Sun
+ Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(-(sp1CC - 3.15f), MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ // Draws Three-Day Clock's Hour Digit Above the Sun
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
+ TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[24], 8, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
+
+ // Colours the Three-Day Clocks's Hour Digit Above the Sun
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
+ gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
+
+ /**
+ * Draws Three-Day Clock's Hour Digit Above the Moon
+ */
+ // Rotates Three-Day Clock's Hour Digit To Above the Moon
+ Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(-sp1CC, MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ // Draws Three-Day Clock's Hour Digit Above the Moon
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
+ TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[32], 8, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
+
+ // Colours the Three-Day Clocks's Hour Digit Above the Moon
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
+ gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
+
+ gSPDisplayList(OVERLAY_DISP++, D_0E000000.setScissor);
+
+ // Final Hours
+ if ((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) &&
+ (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0)))) {
+ if (((void)0, gSaveContext.save.time) >= CLOCK_TIME(5, 0)) {
+ // The Final Hours clock will flash red
+
+ colorStep =
+ ABS_ALT(sFinalHoursClockDigitsRed - D_801BFC04[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockDigitsRed >= D_801BFC04[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockDigitsRed -= colorStep;
+ } else {
+ sFinalHoursClockDigitsRed += colorStep;
+ }
+
+ colorStep =
+ ABS_ALT(sFinalHoursClockFrameEnvRed - D_801BFC08[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockFrameEnvRed >= D_801BFC08[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvRed -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvRed += colorStep;
+ }
+
+ colorStep =
+ ABS_ALT(sFinalHoursClockFrameEnvGreen - D_801BFC0C[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockFrameEnvGreen >= D_801BFC0C[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvGreen -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvGreen += colorStep;
+ }
+
+ colorStep =
+ ABS_ALT(sFinalHoursClockFrameEnvBlue - D_801BFC10[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockFrameEnvBlue >= D_801BFC10[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvBlue -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvBlue += colorStep;
+ }
+
+ sFinalHoursClockColorTimer--;
+
+ if (sFinalHoursClockColorTimer == 0) {
+ sFinalHoursClockDigitsRed = D_801BFC04[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvRed = D_801BFC08[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvGreen = D_801BFC0C[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvBlue = D_801BFC10[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockColorTimer = 6;
+ sFinalHoursClockColorTargetIndex ^= 1;
+ }
+ }
+
+ sp1E6 = sThreeDayClockAlpha;
+ if (sp1E6 != 0) {
+ sp1E6 = 255;
+ }
+
+ func_8012C654(play->state.gfxCtx);
+
+ /**
+ * Draws Final-Hours Clock's Frame
+ */
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
+ PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 195, sp1E6);
+ gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockFrameEnvRed, sFinalHoursClockFrameEnvGreen,
+ sFinalHoursClockFrameEnvBlue, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gFinalHoursClockFrameTex, 3, 80, 13, 119, 202,
+ 80, 13, 0, 0, 0, 1 << 10, 1 << 10);
+
+ finalHoursClockSlots[0] = 0;
+
+ timeUntilMoonCrash = TIME_UNTIL_MOON_CRASH;
+
+ timeInMinutes = TIME_TO_MINUTES_F(timeUntilMoonCrash);
+
+ // digits for hours
+ finalHoursClockSlots[1] = timeInMinutes / 60.0f;
+ finalHoursClockSlots[2] = timeInMinutes / 60.0f;
+
+ temp = (s32)timeInMinutes % 60;
+
+ while (finalHoursClockSlots[1] >= 10) {
+ finalHoursClockSlots[0]++;
+ finalHoursClockSlots[1] -= 10;
+ }
+
+ // digits for minutes
+ finalHoursClockSlots[3] = 0;
+ finalHoursClockSlots[4] = temp;
+
+ while (finalHoursClockSlots[4] >= 10) {
+ finalHoursClockSlots[3]++;
+ finalHoursClockSlots[4] -= 10;
+ }
+
+ // digits for seconds
+ finalHoursClockSlots[6] = 0;
+ finalHoursClockSlots[7] =
+ timeUntilMoonCrash - (u32)((finalHoursClockSlots[2] * ((f32)0x10000 / 24)) +
+ (((void)0, temp) * ((f32)0x10000 / (24 * 60))));
+
+ while (finalHoursClockSlots[7] >= 10) {
+ finalHoursClockSlots[6]++;
+ finalHoursClockSlots[7] -= 10;
+ }
+
+ // Colon separating hours from minutes and minutes from seconds
+ finalHoursClockSlots[2] = finalHoursClockSlots[5] = 10;
+
+ /**
+ * Draws Final-Hours Clock's Digits
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sFinalHoursClockDigitsRed, 0, 0, sp1E6);
+ gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockDigitsRed, 0, 0, 0);
+
+ for (sp1C6 = 0; sp1C6 < 8; sp1C6++) {
+ index = D_801BFC40[sp1C6];
OVERLAY_DISP =
- Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
-
- // Colours the Three-Day Clocks's Hour Digit Above the Sun
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
-
- /**
- * Draws Three-Day Clock's Hour Digit Above the Moon
- */
- // Rotates Three-Day Clock's Hour Digit To Above the Moon
- Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateZF(-sp1CC, MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- // Draws Three-Day Clock's Hour Digit Above the Moon
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0,
- PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[32], 8, 0);
-
- OVERLAY_DISP =
- Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
-
- // Colours the Three-Day Clocks's Hour Digit Above the Moon
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
-
- // Unknown
- gSPDisplayList(OVERLAY_DISP++, D_0E0001C8);
-
- // Final Hours
- if ((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) &&
- (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0)))) {
- if (((void)0, gSaveContext.save.time) >= CLOCK_TIME(5, 0)) {
- // The Final Hours clock will flash red
-
- colorStep = ABS_ALT(sFinalHoursClockDigitsRed -
- D_801BFC04[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockDigitsRed >= D_801BFC04[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockDigitsRed -= colorStep;
- } else {
- sFinalHoursClockDigitsRed += colorStep;
- }
-
- colorStep = ABS_ALT(sFinalHoursClockFrameEnvRed -
- D_801BFC08[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvRed >= D_801BFC08[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvRed -= colorStep;
- } else {
- sFinalHoursClockFrameEnvRed += colorStep;
- }
-
- colorStep = ABS_ALT(sFinalHoursClockFrameEnvGreen -
- D_801BFC0C[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvGreen >= D_801BFC0C[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvGreen -= colorStep;
- } else {
- sFinalHoursClockFrameEnvGreen += colorStep;
- }
-
- colorStep = ABS_ALT(sFinalHoursClockFrameEnvBlue -
- D_801BFC10[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvBlue >= D_801BFC10[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvBlue -= colorStep;
- } else {
- sFinalHoursClockFrameEnvBlue += colorStep;
- }
-
- sFinalHoursClockColorTimer--;
-
- if (sFinalHoursClockColorTimer == 0) {
- sFinalHoursClockDigitsRed = D_801BFC04[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvRed = D_801BFC08[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvGreen = D_801BFC0C[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvBlue = D_801BFC10[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockColorTimer = 6;
- sFinalHoursClockColorTargetIndex ^= 1;
- }
- }
-
- sp1E6 = sThreeDayClockAlpha;
- if (sp1E6 != 0) {
- sp1E6 = 255;
- }
-
- func_8012C654(play->state.gfxCtx);
-
- /**
- * Draws Final-Hours Clock's Frame
- */
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
- gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0,
- 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0,
- 0, PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 195, sp1E6);
- gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockFrameEnvRed,
- sFinalHoursClockFrameEnvGreen, sFinalHoursClockFrameEnvBlue, 0);
-
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gFinalHoursClockFrameTex, 3, 80, 13, 119,
- 202, 80, 13, 0, 0, 0, 1 << 10, 1 << 10);
-
- finalHoursClockSlots[0] = 0;
-
- timeBeforeMoonCrash = (4 - CURRENT_DAY) * DAY_LENGTH -
- (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0));
-
- timeInMinutes = TIME_TO_MINUTES_F(timeBeforeMoonCrash);
-
- finalHoursClockSlots[1] = timeInMinutes / 60.0f;
- finalHoursClockSlots[2] = timeInMinutes / 60.0f;
-
- temp = (s32)timeInMinutes % 60;
-
- // digits for hours
- while (finalHoursClockSlots[1] >= 10) {
- finalHoursClockSlots[0]++;
- finalHoursClockSlots[1] -= 10;
- }
-
- finalHoursClockSlots[3] = 0;
- finalHoursClockSlots[4] = temp;
-
- // digits for minutes
- while (finalHoursClockSlots[4] >= 10) {
- finalHoursClockSlots[3]++;
- finalHoursClockSlots[4] -= 10;
- }
-
- finalHoursClockSlots[6] = 0;
- finalHoursClockSlots[7] =
- timeBeforeMoonCrash -
- (u32)((finalHoursClockSlots[2] * 2730.6667f) + // 2^13 / 3 (ft1 - e6c4)
- (((void)0, temp) * 45.511112f)); // 2^13 / 3 / 60 (ft0 - e758)
-
- // digits for seconds
- while (finalHoursClockSlots[7] >= 10) {
- finalHoursClockSlots[6]++;
- finalHoursClockSlots[7] -= 10;
- }
-
- // Colon separating hours from minutes and minutes from seconds
- finalHoursClockSlots[2] = finalHoursClockSlots[5] = 10;
-
- /**
- * Draws Final-Hours Clock's Digits
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sFinalHoursClockDigitsRed, 0, 0, sp1E6);
- gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockDigitsRed, 0, 0, 0);
-
- for (sp1C6 = 0; sp1C6 < 8; sp1C6++) {
- index = D_801BFC40[sp1C6];
-
- OVERLAY_DISP = Gfx_DrawTexRectI8(
- OVERLAY_DISP, sFinalHoursDigitTextures[finalHoursClockSlots[sp1C6]], 8, 8,
- index, 205, 8, 8, 1 << 10, 1 << 10);
- }
- }
+ Gfx_DrawTexRectI8(OVERLAY_DISP, sFinalHoursDigitTextures[finalHoursClockSlots[sp1C6]],
+ 8, 8, index, 205, 8, 8, 1 << 10, 1 << 10);
}
}
}
@@ -5051,59 +5043,60 @@ TexturePtr sFinalHoursDigitTextures[] = {
gFinalHoursClockDigit8Tex, gFinalHoursClockDigit9Tex, gFinalHoursClockColonTex,
};
s16 D_801BFC40[] = {
- 0x007F, 0x0088, 0x0090, 0x0097, 0x00A0, 0x00A8, 0x00AF, 0x00B8,
+ 127, 136, 144, 151, 160, 168, 175, 184,
};
void Interface_DrawClock(PlayState* play);
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Interface_DrawClock.s")
#endif
-void Interface_SetMinigamePerfect(PlayState* play, s16 minigamePerfectType) {
+void Interface_SetPerfectLetters(PlayState* play, s16 perfectLettersType) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
s16 i;
- interfaceCtx->isMinigamePerfect = true;
- interfaceCtx->minigamePerfectType = minigamePerfectType;
+ interfaceCtx->perfectLettersOn = true;
+ interfaceCtx->perfectLettersType = perfectLettersType;
- interfaceCtx->minigamePerfectPrimColor[0] = 255;
- interfaceCtx->minigamePerfectPrimColor[1] = 165;
- interfaceCtx->minigamePerfectPrimColor[2] = 55;
- interfaceCtx->minigamePerfectPrimColor[3] = 255;
- interfaceCtx->minigamePerfectColorTimer = 20;
+ interfaceCtx->perfectLettersPrimColor[0] = 255;
+ interfaceCtx->perfectLettersPrimColor[1] = 165;
+ interfaceCtx->perfectLettersPrimColor[2] = 55;
+ interfaceCtx->perfectLettersPrimColor[3] = 255;
+ interfaceCtx->perfectLettersColorTimer = 20;
- interfaceCtx->minigamePerfectColorTargetIndex = 0;
- interfaceCtx->minigamePerfectLetterCount = 1;
- interfaceCtx->minigamePerfectTimer = 0;
+ interfaceCtx->perfectLettersColorIndex = 0;
+ interfaceCtx->perfectLettersCount = 1;
+ interfaceCtx->perfectLettersTimer = 0;
- for (i = 0; i < MINIGAME_PERFECT_NUM_LETTERS; i++) {
- interfaceCtx->minigamePerfectLetterEllipseAngle[i] = 0;
- interfaceCtx->minigamePerfectState[i] = interfaceCtx->minigamePerfectLetterXOffset[i] = 0;
- if (interfaceCtx->minigamePerfectType == MINIGAME_PERFECT_TYPE_1) {
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] = 140.0f;
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[i] = 100.0f;
+ for (i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) {
+ interfaceCtx->perfectLettersAngles[i] = 0;
+ interfaceCtx->perfectLettersState[i] = interfaceCtx->perfectLettersOffsetX[i] = 0;
+ if (interfaceCtx->perfectLettersType == PERFECT_LETTERS_TYPE_1) {
+ interfaceCtx->perfectLettersSemiAxisX[i] = 140.0f;
+ interfaceCtx->perfectLettersSemiAxisY[i] = 100.0f;
} else {
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[i] = 200.0f;
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] = 200.0f;
+ interfaceCtx->perfectLettersSemiAxisY[i] = 200.0f;
+ interfaceCtx->perfectLettersSemiAxisX[i] = 200.0f;
}
}
- interfaceCtx->minigamePerfectState[0] = MINIGAME_PERFECT_STATE_INIT;
+ interfaceCtx->perfectLettersState[0] = PERFECT_LETTERS_STATE_INIT;
}
-u16 sMinigamePerfectType1AngleOffScreenTargets[MINIGAME_PERFECT_NUM_LETTERS] = {
- 6 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // P
- 7 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // E
- 0 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // R
- 1 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // F
- 5 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // E
- 4 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // C
- 3 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // T
- 2 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // !
+u16 sPerfectLettersType1OffScreenAngles[PERFECT_LETTERS_NUM_LETTERS] = {
+ 6 * PERFECT_LETTERS_ANGLE_PER_LETTER, // P
+ 7 * PERFECT_LETTERS_ANGLE_PER_LETTER, // E
+ 0 * PERFECT_LETTERS_ANGLE_PER_LETTER, // R
+ 1 * PERFECT_LETTERS_ANGLE_PER_LETTER, // F
+ 5 * PERFECT_LETTERS_ANGLE_PER_LETTER, // E
+ 4 * PERFECT_LETTERS_ANGLE_PER_LETTER, // C
+ 3 * PERFECT_LETTERS_ANGLE_PER_LETTER, // T
+ 2 * PERFECT_LETTERS_ANGLE_PER_LETTER, // !
};
-s16 sMinigamePerfectType1PrimColorTargets[2][3] = {
+
+s16 sPerfectLettersType1PrimColorTargets[2][3] = {
{ 255, 255, 255 },
{ 255, 165, 55 },
};
-void Interface_UpdateMinigamePerfectType1(PlayState* play) {
+void Interface_UpdatePerfectLettersType1(PlayState* play) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
s16 i;
s16 count;
@@ -5112,105 +5105,104 @@ void Interface_UpdateMinigamePerfectType1(PlayState* play) {
s16 colorStepB;
// Update letter positions
- for (count = 0, i = 0; i < interfaceCtx->minigamePerfectLetterCount; i++, count += 4) {
- if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_INIT) {
- // Initialize letter positions along the parameteric ellipse curve
- interfaceCtx->minigamePerfectLetterEllipseAngle[i] = sMinigamePerfectType1AngleOffScreenTargets[i] + 0xA000;
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_ENTER;
- } else if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_ENTER) {
- // Swirl inwards along a swirlic parametric ellipse equation to the spelt-out word
- interfaceCtx->minigamePerfectLetterEllipseAngle[i] -= 0x800;
- if (interfaceCtx->minigamePerfectLetterEllipseAngle[i] == sMinigamePerfectType1AngleOffScreenTargets[i]) {
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_STATIONARY;
+ for (count = 0, i = 0; i < interfaceCtx->perfectLettersCount; i++, count += 4) {
+ if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_INIT) {
+ // Initialize letter positions along the elliptical spirals
+ interfaceCtx->perfectLettersAngles[i] = sPerfectLettersType1OffScreenAngles[i] + 0xA000;
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_ENTER;
+ } else if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_ENTER) {
+ // Swirl inwards along elliptical spirals to form the spelt-out word
+ interfaceCtx->perfectLettersAngles[i] -= 0x800;
+ if (interfaceCtx->perfectLettersAngles[i] == sPerfectLettersType1OffScreenAngles[i]) {
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_STATIONARY;
}
- } else if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_SPREAD) {
- // Swirl outwards along a swirlic parametric ellipse equation offscreen
- interfaceCtx->minigamePerfectLetterEllipseAngle[i] -= 0x800;
- if (interfaceCtx->minigamePerfectLetterEllipseAngle[i] ==
- (u16)(sMinigamePerfectType1AngleOffScreenTargets[i] - 0x8000)) {
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_OFF;
+ } else if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_SPREAD) {
+ // Swirl outwards along elliptical spirals offscreen
+ interfaceCtx->perfectLettersAngles[i] -= 0x800;
+ if (interfaceCtx->perfectLettersAngles[i] == (u16)(sPerfectLettersType1OffScreenAngles[i] - 0x8000)) {
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_OFF;
}
}
}
// Initialize the next letter in the list
- // if `minigamePerfectLetterCount == MINIGAME_PERFECT_NUM_LETTERS`,
- // then minigamePerfectState[] is accessed
- if ((interfaceCtx->minigamePerfectState[interfaceCtx->minigamePerfectLetterCount] == MINIGAME_PERFECT_STATE_OFF) &&
- (interfaceCtx->minigamePerfectLetterCount < MINIGAME_PERFECT_NUM_LETTERS)) {
- interfaceCtx->minigamePerfectState[interfaceCtx->minigamePerfectLetterCount] = MINIGAME_PERFECT_STATE_INIT;
+ // if `perfectLettersCount == PERFECT_LETTERS_NUM_LETTERS`,
+ // then perfectLettersState[] is accessed
+ if ((interfaceCtx->perfectLettersState[interfaceCtx->perfectLettersCount] == PERFECT_LETTERS_STATE_OFF) &&
+ (interfaceCtx->perfectLettersCount < PERFECT_LETTERS_NUM_LETTERS)) {
+ interfaceCtx->perfectLettersState[interfaceCtx->perfectLettersCount] = PERFECT_LETTERS_STATE_INIT;
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[interfaceCtx->minigamePerfectLetterCount] = 140.0f;
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[interfaceCtx->minigamePerfectLetterCount] = 100.0f;
- interfaceCtx->minigamePerfectLetterEllipseAngle[interfaceCtx->minigamePerfectLetterCount] =
- sMinigamePerfectType1AngleOffScreenTargets[interfaceCtx->minigamePerfectLetterCount] + 0xA000;
+ interfaceCtx->perfectLettersSemiAxisX[interfaceCtx->perfectLettersCount] = 140.0f;
+ interfaceCtx->perfectLettersSemiAxisY[interfaceCtx->perfectLettersCount] = 100.0f;
+ interfaceCtx->perfectLettersAngles[interfaceCtx->perfectLettersCount] =
+ sPerfectLettersType1OffScreenAngles[interfaceCtx->perfectLettersCount] + 0xA000;
- interfaceCtx->minigamePerfectLetterCount++;
+ interfaceCtx->perfectLettersCount++;
}
// Update letter colors
- if ((interfaceCtx->minigamePerfectLetterCount == MINIGAME_PERFECT_NUM_LETTERS) &&
- (interfaceCtx->minigamePerfectState[MINIGAME_PERFECT_NUM_LETTERS - 1] == MINIGAME_PERFECT_STATE_STATIONARY)) {
+ if ((interfaceCtx->perfectLettersCount == PERFECT_LETTERS_NUM_LETTERS) &&
+ (interfaceCtx->perfectLettersState[PERFECT_LETTERS_NUM_LETTERS - 1] == PERFECT_LETTERS_STATE_STATIONARY)) {
- colorStepR = ABS_ALT(interfaceCtx->minigamePerfectPrimColor[0] -
- sMinigamePerfectType1PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][0]) /
- interfaceCtx->minigamePerfectColorTimer;
- colorStepG = ABS_ALT(interfaceCtx->minigamePerfectPrimColor[1] -
- sMinigamePerfectType1PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][1]) /
- interfaceCtx->minigamePerfectColorTimer;
- colorStepB = ABS_ALT(interfaceCtx->minigamePerfectPrimColor[2] -
- sMinigamePerfectType1PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][2]) /
- interfaceCtx->minigamePerfectColorTimer;
+ colorStepR = ABS_ALT(interfaceCtx->perfectLettersPrimColor[0] -
+ sPerfectLettersType1PrimColorTargets[interfaceCtx->perfectLettersColorIndex][0]) /
+ interfaceCtx->perfectLettersColorTimer;
+ colorStepG = ABS_ALT(interfaceCtx->perfectLettersPrimColor[1] -
+ sPerfectLettersType1PrimColorTargets[interfaceCtx->perfectLettersColorIndex][1]) /
+ interfaceCtx->perfectLettersColorTimer;
+ colorStepB = ABS_ALT(interfaceCtx->perfectLettersPrimColor[2] -
+ sPerfectLettersType1PrimColorTargets[interfaceCtx->perfectLettersColorIndex][2]) /
+ interfaceCtx->perfectLettersColorTimer;
- if (interfaceCtx->minigamePerfectPrimColor[0] >=
- sMinigamePerfectType1PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][0]) {
- interfaceCtx->minigamePerfectPrimColor[0] -= colorStepR;
+ if (interfaceCtx->perfectLettersPrimColor[0] >=
+ sPerfectLettersType1PrimColorTargets[interfaceCtx->perfectLettersColorIndex][0]) {
+ interfaceCtx->perfectLettersPrimColor[0] -= colorStepR;
} else {
- interfaceCtx->minigamePerfectPrimColor[0] += colorStepR;
+ interfaceCtx->perfectLettersPrimColor[0] += colorStepR;
}
- if (interfaceCtx->minigamePerfectPrimColor[1] >=
- sMinigamePerfectType1PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][1]) {
- interfaceCtx->minigamePerfectPrimColor[1] -= colorStepG;
+ if (interfaceCtx->perfectLettersPrimColor[1] >=
+ sPerfectLettersType1PrimColorTargets[interfaceCtx->perfectLettersColorIndex][1]) {
+ interfaceCtx->perfectLettersPrimColor[1] -= colorStepG;
} else {
- interfaceCtx->minigamePerfectPrimColor[1] += colorStepG;
+ interfaceCtx->perfectLettersPrimColor[1] += colorStepG;
}
- if (interfaceCtx->minigamePerfectPrimColor[2] >=
- sMinigamePerfectType1PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][2]) {
- interfaceCtx->minigamePerfectPrimColor[2] -= colorStepB;
+ if (interfaceCtx->perfectLettersPrimColor[2] >=
+ sPerfectLettersType1PrimColorTargets[interfaceCtx->perfectLettersColorIndex][2]) {
+ interfaceCtx->perfectLettersPrimColor[2] -= colorStepB;
} else {
- interfaceCtx->minigamePerfectPrimColor[2] += colorStepB;
+ interfaceCtx->perfectLettersPrimColor[2] += colorStepB;
}
- interfaceCtx->minigamePerfectColorTimer--;
+ interfaceCtx->perfectLettersColorTimer--;
- if (interfaceCtx->minigamePerfectColorTimer == 0) {
- interfaceCtx->minigamePerfectColorTimer = 20;
- interfaceCtx->minigamePerfectColorTargetIndex ^= 1;
- interfaceCtx->minigamePerfectTimer++;
+ if (interfaceCtx->perfectLettersColorTimer == 0) {
+ interfaceCtx->perfectLettersColorTimer = 20;
+ interfaceCtx->perfectLettersColorIndex ^= 1;
+ interfaceCtx->perfectLettersTimer++;
- if (interfaceCtx->minigamePerfectTimer == 6) {
- for (i = 0; i < MINIGAME_PERFECT_NUM_LETTERS; i++) {
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_SPREAD;
+ if (interfaceCtx->perfectLettersTimer == 6) {
+ for (i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) {
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_SPREAD;
}
}
}
}
- for (count = 0, i = 0; i < MINIGAME_PERFECT_NUM_LETTERS; i++) {
- if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_OFF) {
+ for (count = 0, i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) {
+ if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_OFF) {
count++;
}
}
- if (count == MINIGAME_PERFECT_NUM_LETTERS) {
- interfaceCtx->isMinigamePerfect = false;
+ if (count == PERFECT_LETTERS_NUM_LETTERS) {
+ interfaceCtx->perfectLettersOn = false;
}
}
// Targets to offset each letter to properly spell "PERFECT!"
-s16 sMinigamePerfectType2LetterXOffsetSpellingTargets[MINIGAME_PERFECT_NUM_LETTERS] = {
+s16 sPerfectLettersType2SpellingOffsetsX[PERFECT_LETTERS_NUM_LETTERS] = {
78, // P
54, // E
29, // R
@@ -5222,7 +5214,7 @@ s16 sMinigamePerfectType2LetterXOffsetSpellingTargets[MINIGAME_PERFECT_NUM_LETTE
};
// Targets to offset each letter to sweep horizontally offscreen
-s16 sMinigamePerfectType2LetterXOffsetOffScreenTargets[MINIGAME_PERFECT_NUM_LETTERS] = {
+s16 sPerfectLettersType2OffScreenOffsetsX[PERFECT_LETTERS_NUM_LETTERS] = {
180, // P (offscreen left)
180, // E (offscreen left)
180, // R (offscreen left)
@@ -5233,12 +5225,12 @@ s16 sMinigamePerfectType2LetterXOffsetOffScreenTargets[MINIGAME_PERFECT_NUM_LETT
-180, // ! (offscreen right)
};
-s16 sMinigamePerfectType2PrimColorTargets[2][3] = {
+s16 sPerfectLettersType2PrimColorTargets[2][3] = {
{ 255, 255, 255 },
{ 255, 165, 55 },
};
-void Interface_UpdateMinigamePerfectType2(PlayState* play) {
+void Interface_UpdatePerfectLettersType2(PlayState* play) {
s16 i;
InterfaceContext* interfaceCtx = &play->interfaceCtx;
s16 colorStepR;
@@ -5248,143 +5240,134 @@ void Interface_UpdateMinigamePerfectType2(PlayState* play) {
s16 j = 0; // unused incrementer
// Update letter positions
- for (i = 0; i < interfaceCtx->minigamePerfectLetterCount; i++, j += 4) {
- if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_INIT) {
- // Initialize letter positions along the parameteric ellipse curve
- interfaceCtx->minigamePerfectLetterEllipseAngle[i] = i * (0x10000 / MINIGAME_PERFECT_NUM_LETTERS);
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] = 200.0f;
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[i] = 200.0f;
+ for (i = 0; i < interfaceCtx->perfectLettersCount; i++, j += 4) {
+ if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_INIT) {
+ // Initialize letter positions along the elliptical spirals
+ interfaceCtx->perfectLettersAngles[i] = i * (0x10000 / PERFECT_LETTERS_NUM_LETTERS);
+ interfaceCtx->perfectLettersSemiAxisX[i] = 200.0f;
+ interfaceCtx->perfectLettersSemiAxisY[i] = 200.0f;
- interfaceCtx->minigamePerfectLetterXOffset[i] = 0;
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_ENTER;
- } else if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_ENTER) {
- // Swirl inwards to the center of the screen
- interfaceCtx->minigamePerfectLetterEllipseAngle[i] -= 0x800;
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] -= 8.0f;
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[i] -= 8.0f;
+ interfaceCtx->perfectLettersOffsetX[i] = 0;
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_ENTER;
+ } else if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_ENTER) {
+ // Swirl inwards along elliptical spirals to the center of the screen
+ interfaceCtx->perfectLettersAngles[i] -= 0x800;
+ interfaceCtx->perfectLettersSemiAxisX[i] -= 8.0f;
+ interfaceCtx->perfectLettersSemiAxisY[i] -= 8.0f;
- if (interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] <= 0.0f) {
+ if (interfaceCtx->perfectLettersSemiAxisX[i] <= 0.0f) {
// The letter has reached the center of the screen
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[i] = 0.0f;
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] = 0.0f;
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_STATIONARY;
+ interfaceCtx->perfectLettersSemiAxisY[i] = 0.0f;
+ interfaceCtx->perfectLettersSemiAxisX[i] = 0.0f;
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_STATIONARY;
- if (i == (MINIGAME_PERFECT_NUM_LETTERS - 1)) {
+ if (i == (PERFECT_LETTERS_NUM_LETTERS - 1)) {
// The last letter has reached the center of the screen
- interfaceCtx->minigamePerfectColorTimer = 5;
- interfaceCtx->minigamePerfectState[7] = MINIGAME_PERFECT_STATE_SPREAD;
- interfaceCtx->minigamePerfectState[6] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[5] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[4] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[3] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[2] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[1] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[0] = interfaceCtx->minigamePerfectState[7];
+ interfaceCtx->perfectLettersColorTimer = 5;
+ interfaceCtx->perfectLettersState[0] = interfaceCtx->perfectLettersState[1] =
+ interfaceCtx->perfectLettersState[2] = interfaceCtx->perfectLettersState[3] =
+ interfaceCtx->perfectLettersState[4] = interfaceCtx->perfectLettersState[5] =
+ interfaceCtx->perfectLettersState[6] = interfaceCtx->perfectLettersState[7] =
+ PERFECT_LETTERS_STATE_SPREAD;
}
}
- } else if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_SPREAD) {
+ } else if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_SPREAD) {
// Spread out the letters horizontally from the center to the spelt-out word
- colorStepR = ABS_ALT(interfaceCtx->minigamePerfectLetterXOffset[i] -
- sMinigamePerfectType2LetterXOffsetSpellingTargets[i]) /
- interfaceCtx->minigamePerfectColorTimer;
- if (interfaceCtx->minigamePerfectLetterXOffset[i] >= sMinigamePerfectType2LetterXOffsetSpellingTargets[i]) {
- interfaceCtx->minigamePerfectLetterXOffset[i] -= colorStepR;
+ colorStepR = ABS_ALT(interfaceCtx->perfectLettersOffsetX[i] - sPerfectLettersType2SpellingOffsetsX[i]) /
+ interfaceCtx->perfectLettersColorTimer;
+ if (interfaceCtx->perfectLettersOffsetX[i] >= sPerfectLettersType2SpellingOffsetsX[i]) {
+ interfaceCtx->perfectLettersOffsetX[i] -= colorStepR;
} else {
- interfaceCtx->minigamePerfectLetterXOffset[i] += colorStepR;
+ interfaceCtx->perfectLettersOffsetX[i] += colorStepR;
}
- } else if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_EXIT) {
+ } else if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_EXIT) {
// Spread out the letters horizontally from the spelt-out world to offscreen
- colorStepR = ABS_ALT(interfaceCtx->minigamePerfectLetterXOffset[i] -
- sMinigamePerfectType2LetterXOffsetOffScreenTargets[i]) /
- interfaceCtx->minigamePerfectColorTimer;
- if (interfaceCtx->minigamePerfectLetterXOffset[i] >=
- sMinigamePerfectType2LetterXOffsetOffScreenTargets[i]) {
- interfaceCtx->minigamePerfectLetterXOffset[i] -= colorStepR;
+ colorStepR = ABS_ALT(interfaceCtx->perfectLettersOffsetX[i] - sPerfectLettersType2OffScreenOffsetsX[i]) /
+ interfaceCtx->perfectLettersColorTimer;
+ if (interfaceCtx->perfectLettersOffsetX[i] >= sPerfectLettersType2OffScreenOffsetsX[i]) {
+ interfaceCtx->perfectLettersOffsetX[i] -= colorStepR;
} else {
- interfaceCtx->minigamePerfectLetterXOffset[i] += colorStepR;
+ interfaceCtx->perfectLettersOffsetX[i] += colorStepR;
}
}
}
- if ((interfaceCtx->minigamePerfectState[0] == MINIGAME_PERFECT_STATE_SPREAD) ||
- (interfaceCtx->minigamePerfectState[0] == MINIGAME_PERFECT_STATE_EXIT)) {
- if (interfaceCtx->minigamePerfectState[0] == MINIGAME_PERFECT_STATE_EXIT) {
- colorStepA = interfaceCtx->minigamePerfectPrimColor[3] / interfaceCtx->minigamePerfectColorTimer;
- interfaceCtx->minigamePerfectPrimColor[3] -= colorStepA;
+ if ((interfaceCtx->perfectLettersState[0] == PERFECT_LETTERS_STATE_SPREAD) ||
+ (interfaceCtx->perfectLettersState[0] == PERFECT_LETTERS_STATE_EXIT)) {
+ if (interfaceCtx->perfectLettersState[0] == PERFECT_LETTERS_STATE_EXIT) {
+ colorStepA = interfaceCtx->perfectLettersPrimColor[3] / interfaceCtx->perfectLettersColorTimer;
+ interfaceCtx->perfectLettersPrimColor[3] -= colorStepA;
}
- interfaceCtx->minigamePerfectColorTimer--;
- if (interfaceCtx->minigamePerfectColorTimer == 0) {
+ interfaceCtx->perfectLettersColorTimer--;
+ if (interfaceCtx->perfectLettersColorTimer == 0) {
- if (interfaceCtx->minigamePerfectState[0] == MINIGAME_PERFECT_STATE_SPREAD) {
- for (i = 0; i < MINIGAME_PERFECT_NUM_LETTERS; i++) {
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_DISPLAY;
+ if (interfaceCtx->perfectLettersState[0] == PERFECT_LETTERS_STATE_SPREAD) {
+ for (i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) {
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_DISPLAY;
}
- interfaceCtx->minigamePerfectColorTimer = 20;
+ interfaceCtx->perfectLettersColorTimer = 20;
} else {
- for (i = 0; i < MINIGAME_PERFECT_NUM_LETTERS; i++) {
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_OFF;
+ for (i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) {
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_OFF;
}
- interfaceCtx->isMinigamePerfect = false;
+ interfaceCtx->perfectLettersOn = false;
}
}
}
// Initialize the next letter in the list
- if (interfaceCtx->minigamePerfectState[interfaceCtx->minigamePerfectLetterCount] == MINIGAME_PERFECT_STATE_OFF) {
- if (interfaceCtx->minigamePerfectLetterCount < MINIGAME_PERFECT_NUM_LETTERS) {
- interfaceCtx->minigamePerfectState[interfaceCtx->minigamePerfectLetterCount] = MINIGAME_PERFECT_STATE_INIT;
- interfaceCtx->minigamePerfectLetterCount++;
+ if (interfaceCtx->perfectLettersState[interfaceCtx->perfectLettersCount] == PERFECT_LETTERS_STATE_OFF) {
+ if (interfaceCtx->perfectLettersCount < PERFECT_LETTERS_NUM_LETTERS) {
+ interfaceCtx->perfectLettersState[interfaceCtx->perfectLettersCount] = PERFECT_LETTERS_STATE_INIT;
+ interfaceCtx->perfectLettersCount++;
}
}
// Update letter colors
- if (interfaceCtx->minigamePerfectLetterCount == MINIGAME_PERFECT_NUM_LETTERS) {
- if (interfaceCtx->minigamePerfectState[MINIGAME_PERFECT_NUM_LETTERS - 1] == MINIGAME_PERFECT_STATE_DISPLAY) {
+ if (interfaceCtx->perfectLettersCount == PERFECT_LETTERS_NUM_LETTERS) {
+ if (interfaceCtx->perfectLettersState[PERFECT_LETTERS_NUM_LETTERS - 1] == PERFECT_LETTERS_STATE_DISPLAY) {
- colorStepR =
- ABS_ALT(interfaceCtx->minigamePerfectPrimColor[0] -
- sMinigamePerfectType2PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][0]) /
- interfaceCtx->minigamePerfectColorTimer;
- colorStepG =
- ABS_ALT(interfaceCtx->minigamePerfectPrimColor[1] -
- sMinigamePerfectType2PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][1]) /
- interfaceCtx->minigamePerfectColorTimer;
- colorStepB =
- ABS_ALT(interfaceCtx->minigamePerfectPrimColor[2] -
- sMinigamePerfectType2PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][2]) /
- interfaceCtx->minigamePerfectColorTimer;
+ colorStepR = ABS_ALT(interfaceCtx->perfectLettersPrimColor[0] -
+ sPerfectLettersType2PrimColorTargets[interfaceCtx->perfectLettersColorIndex][0]) /
+ interfaceCtx->perfectLettersColorTimer;
+ colorStepG = ABS_ALT(interfaceCtx->perfectLettersPrimColor[1] -
+ sPerfectLettersType2PrimColorTargets[interfaceCtx->perfectLettersColorIndex][1]) /
+ interfaceCtx->perfectLettersColorTimer;
+ colorStepB = ABS_ALT(interfaceCtx->perfectLettersPrimColor[2] -
+ sPerfectLettersType2PrimColorTargets[interfaceCtx->perfectLettersColorIndex][2]) /
+ interfaceCtx->perfectLettersColorTimer;
- if (interfaceCtx->minigamePerfectPrimColor[0] >=
- sMinigamePerfectType2PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][0]) {
- interfaceCtx->minigamePerfectPrimColor[0] -= colorStepR;
+ if (interfaceCtx->perfectLettersPrimColor[0] >=
+ sPerfectLettersType2PrimColorTargets[interfaceCtx->perfectLettersColorIndex][0]) {
+ interfaceCtx->perfectLettersPrimColor[0] -= colorStepR;
} else {
- interfaceCtx->minigamePerfectPrimColor[0] += colorStepR;
+ interfaceCtx->perfectLettersPrimColor[0] += colorStepR;
}
- if (interfaceCtx->minigamePerfectPrimColor[1] >=
- sMinigamePerfectType2PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][1]) {
- interfaceCtx->minigamePerfectPrimColor[1] -= colorStepG;
+ if (interfaceCtx->perfectLettersPrimColor[1] >=
+ sPerfectLettersType2PrimColorTargets[interfaceCtx->perfectLettersColorIndex][1]) {
+ interfaceCtx->perfectLettersPrimColor[1] -= colorStepG;
} else {
- interfaceCtx->minigamePerfectPrimColor[1] += colorStepG;
+ interfaceCtx->perfectLettersPrimColor[1] += colorStepG;
}
- if (interfaceCtx->minigamePerfectPrimColor[2] >=
- sMinigamePerfectType2PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][2]) {
- interfaceCtx->minigamePerfectPrimColor[2] -= colorStepB;
+ if (interfaceCtx->perfectLettersPrimColor[2] >=
+ sPerfectLettersType2PrimColorTargets[interfaceCtx->perfectLettersColorIndex][2]) {
+ interfaceCtx->perfectLettersPrimColor[2] -= colorStepB;
} else {
- interfaceCtx->minigamePerfectPrimColor[2] += colorStepB;
+ interfaceCtx->perfectLettersPrimColor[2] += colorStepB;
}
- interfaceCtx->minigamePerfectColorTimer--;
- if (interfaceCtx->minigamePerfectColorTimer == 0) {
- interfaceCtx->minigamePerfectColorTimer = 20;
- interfaceCtx->minigamePerfectColorTargetIndex ^= 1;
- interfaceCtx->minigamePerfectTimer++;
- if (interfaceCtx->minigamePerfectTimer == 6) {
- for (i = 0; i < MINIGAME_PERFECT_NUM_LETTERS; i++) {
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_EXIT;
+ interfaceCtx->perfectLettersColorTimer--;
+ if (interfaceCtx->perfectLettersColorTimer == 0) {
+ interfaceCtx->perfectLettersColorTimer = 20;
+ interfaceCtx->perfectLettersColorIndex ^= 1;
+ interfaceCtx->perfectLettersTimer++;
+ if (interfaceCtx->perfectLettersTimer == 6) {
+ for (i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) {
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_EXIT;
}
- interfaceCtx->minigamePerfectColorTimer = 5;
+ interfaceCtx->perfectLettersColorTimer = 5;
}
}
}
@@ -5392,7 +5375,7 @@ void Interface_UpdateMinigamePerfectType2(PlayState* play) {
}
// Targets to offset each letter to properly spell "PERFECT!"
-s16 sMinigamePerfectType3LetterXOffsetSpellingTargets[MINIGAME_PERFECT_NUM_LETTERS] = {
+s16 sPerfectLettersType3SpellingOffsetsX[PERFECT_LETTERS_NUM_LETTERS] = {
78, // P
54, // E
29, // R
@@ -5402,23 +5385,25 @@ s16 sMinigamePerfectType3LetterXOffsetSpellingTargets[MINIGAME_PERFECT_NUM_LETTE
-67, // T
-85, // !
};
-// Targets to sweep each letter's angle along an parametric ellipse equation offscreen
-u16 sMinigamePerfectType3AngleOffScreenTargets[MINIGAME_PERFECT_NUM_LETTERS] = {
- 6 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // P
- 7 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // E
- 0 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // R
- 1 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // F
- 5 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // E
- 4 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // C
- 3 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // T
- 2 * MINIGAME_PERFECT_ANGLE_PER_LETTER, // !
+
+// Targets to sweep each letter's angle along an elliptical spiral offscreen
+u16 sPerfectLettersType3OffScreenAngles[PERFECT_LETTERS_NUM_LETTERS] = {
+ 6 * PERFECT_LETTERS_ANGLE_PER_LETTER, // P
+ 7 * PERFECT_LETTERS_ANGLE_PER_LETTER, // E
+ 0 * PERFECT_LETTERS_ANGLE_PER_LETTER, // R
+ 1 * PERFECT_LETTERS_ANGLE_PER_LETTER, // F
+ 5 * PERFECT_LETTERS_ANGLE_PER_LETTER, // E
+ 4 * PERFECT_LETTERS_ANGLE_PER_LETTER, // C
+ 3 * PERFECT_LETTERS_ANGLE_PER_LETTER, // T
+ 2 * PERFECT_LETTERS_ANGLE_PER_LETTER, // !
};
-s16 sMinigamePerfectType3PrimColorTargets[2][3] = {
+
+s16 sPerfectLettersType3PrimColorTargets[2][3] = {
{ 255, 255, 255 },
{ 255, 165, 55 },
};
-void Interface_UpdateMinigamePerfectType3(PlayState* play) {
+void Interface_UpdatePerfectLettersType3(PlayState* play) {
s16 i;
InterfaceContext* interfaceCtx = &play->interfaceCtx;
s16 colorStepR;
@@ -5427,147 +5412,142 @@ void Interface_UpdateMinigamePerfectType3(PlayState* play) {
s16 j = 0;
// Update letter positions
- for (i = 0; i < interfaceCtx->minigamePerfectLetterCount; i++, j += 4) {
- if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_INIT) {
- // Initialize letter positions along the parameteric ellipse curve
- interfaceCtx->minigamePerfectLetterEllipseAngle[i] = i * (0x10000 / MINIGAME_PERFECT_NUM_LETTERS);
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] = 200.0f;
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[i] = 200.0f;
+ for (i = 0; i < interfaceCtx->perfectLettersCount; i++, j += 4) {
+ if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_INIT) {
+ // Initialize letter positions along the elliptical spirals
+ interfaceCtx->perfectLettersAngles[i] = i * (0x10000 / PERFECT_LETTERS_NUM_LETTERS);
+ interfaceCtx->perfectLettersSemiAxisX[i] = 200.0f;
+ interfaceCtx->perfectLettersSemiAxisY[i] = 200.0f;
- interfaceCtx->minigamePerfectLetterXOffset[i] = 0;
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_ENTER;
- } else if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_ENTER) {
- // Swirl inwards along a swirlic parametric ellipse equation to the center of the screen
- interfaceCtx->minigamePerfectLetterEllipseAngle[i] -= 0x800;
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] -= 8.0f;
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[i] -= 8.0f;
+ interfaceCtx->perfectLettersOffsetX[i] = 0;
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_ENTER;
+ } else if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_ENTER) {
+ // Swirl inwards along elliptical spirals to the center of the screen
+ interfaceCtx->perfectLettersAngles[i] -= 0x800;
+ interfaceCtx->perfectLettersSemiAxisX[i] -= 8.0f;
+ interfaceCtx->perfectLettersSemiAxisY[i] -= 8.0f;
- if (interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] <= 0.0f) {
+ if (interfaceCtx->perfectLettersSemiAxisX[i] <= 0.0f) {
// The letter has reached the center of the screen
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[i] = 0.0f;
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] = 0.0f;
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_STATIONARY;
+ interfaceCtx->perfectLettersSemiAxisY[i] = 0.0f;
+ interfaceCtx->perfectLettersSemiAxisX[i] = 0.0f;
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_STATIONARY;
- if (i == (MINIGAME_PERFECT_NUM_LETTERS - 1)) {
+ if (i == (PERFECT_LETTERS_NUM_LETTERS - 1)) {
// The last letter has reached the center of the screen
- interfaceCtx->minigamePerfectState[7] = MINIGAME_PERFECT_STATE_SPREAD;
- interfaceCtx->minigamePerfectColorTimer = 5;
- interfaceCtx->minigamePerfectState[6] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[5] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[4] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[3] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[2] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[1] = interfaceCtx->minigamePerfectState[7];
- interfaceCtx->minigamePerfectState[0] = interfaceCtx->minigamePerfectState[7];
+ interfaceCtx->perfectLettersColorTimer = 5;
+ interfaceCtx->perfectLettersState[0] = interfaceCtx->perfectLettersState[1] =
+ interfaceCtx->perfectLettersState[2] = interfaceCtx->perfectLettersState[3] =
+ interfaceCtx->perfectLettersState[4] = interfaceCtx->perfectLettersState[5] =
+ interfaceCtx->perfectLettersState[6] = interfaceCtx->perfectLettersState[7] =
+ PERFECT_LETTERS_STATE_SPREAD;
}
}
- } else if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_SPREAD) {
+ } else if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_SPREAD) {
// Spread out the letters horizontally from the center to the spelt-out word
- colorStepR = ABS_ALT(interfaceCtx->minigamePerfectLetterXOffset[i] -
- sMinigamePerfectType3LetterXOffsetSpellingTargets[i]) /
- interfaceCtx->minigamePerfectColorTimer;
- if (interfaceCtx->minigamePerfectLetterXOffset[i] >= sMinigamePerfectType3LetterXOffsetSpellingTargets[i]) {
- interfaceCtx->minigamePerfectLetterXOffset[i] -= colorStepR;
+ colorStepR = ABS_ALT(interfaceCtx->perfectLettersOffsetX[i] - sPerfectLettersType3SpellingOffsetsX[i]) /
+ interfaceCtx->perfectLettersColorTimer;
+ if (interfaceCtx->perfectLettersOffsetX[i] >= sPerfectLettersType3SpellingOffsetsX[i]) {
+ interfaceCtx->perfectLettersOffsetX[i] -= colorStepR;
} else {
- interfaceCtx->minigamePerfectLetterXOffset[i] += colorStepR;
+ interfaceCtx->perfectLettersOffsetX[i] += colorStepR;
}
- } else if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_EXIT) {
- // Swirl outwards along a swirlic parametric ellipse equation offscreen
- interfaceCtx->minigamePerfectLetterEllipseAngle[i] -= 0x800;
- if (interfaceCtx->minigamePerfectLetterEllipseAngle[i] ==
- (u16)(sMinigamePerfectType3AngleOffScreenTargets[i] - 0x8000)) {
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_OFF;
+ } else if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_EXIT) {
+ // Swirl outwards along elliptical spirals offscreen
+ interfaceCtx->perfectLettersAngles[i] -= 0x800;
+ if (interfaceCtx->perfectLettersAngles[i] == (u16)(sPerfectLettersType3OffScreenAngles[i] - 0x8000)) {
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_OFF;
}
}
}
- if (interfaceCtx->minigamePerfectState[0] == MINIGAME_PERFECT_STATE_SPREAD) {
- interfaceCtx->minigamePerfectColorTimer--;
- if (interfaceCtx->minigamePerfectColorTimer == 0) {
- for (i = 0; i < MINIGAME_PERFECT_NUM_LETTERS; i++) {
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_DISPLAY;
+ if (interfaceCtx->perfectLettersState[0] == PERFECT_LETTERS_STATE_SPREAD) {
+ interfaceCtx->perfectLettersColorTimer--;
+ if (interfaceCtx->perfectLettersColorTimer == 0) {
+ for (i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) {
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_DISPLAY;
}
- interfaceCtx->minigamePerfectColorTimer = 20;
+ interfaceCtx->perfectLettersColorTimer = 20;
}
}
// Initialize the next letter in the list
- if ((interfaceCtx->minigamePerfectState[interfaceCtx->minigamePerfectLetterCount] == MINIGAME_PERFECT_STATE_OFF) &&
- (interfaceCtx->minigamePerfectLetterCount < MINIGAME_PERFECT_NUM_LETTERS)) {
- interfaceCtx->minigamePerfectState[interfaceCtx->minigamePerfectLetterCount] = MINIGAME_PERFECT_STATE_INIT;
- interfaceCtx->minigamePerfectLetterCount++;
+ if ((interfaceCtx->perfectLettersState[interfaceCtx->perfectLettersCount] == PERFECT_LETTERS_STATE_OFF) &&
+ (interfaceCtx->perfectLettersCount < PERFECT_LETTERS_NUM_LETTERS)) {
+ interfaceCtx->perfectLettersState[interfaceCtx->perfectLettersCount] = PERFECT_LETTERS_STATE_INIT;
+ interfaceCtx->perfectLettersCount++;
}
// Update letter colors
- if ((interfaceCtx->minigamePerfectLetterCount == MINIGAME_PERFECT_NUM_LETTERS) &&
- (interfaceCtx->minigamePerfectState[MINIGAME_PERFECT_NUM_LETTERS - 1] == MINIGAME_PERFECT_STATE_DISPLAY)) {
+ if ((interfaceCtx->perfectLettersCount == PERFECT_LETTERS_NUM_LETTERS) &&
+ (interfaceCtx->perfectLettersState[PERFECT_LETTERS_NUM_LETTERS - 1] == PERFECT_LETTERS_STATE_DISPLAY)) {
- colorStepR = ABS_ALT(interfaceCtx->minigamePerfectPrimColor[0] -
- sMinigamePerfectType3PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][0]) /
- interfaceCtx->minigamePerfectColorTimer;
- colorStepG = ABS_ALT(interfaceCtx->minigamePerfectPrimColor[1] -
- sMinigamePerfectType3PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][1]) /
- interfaceCtx->minigamePerfectColorTimer;
- colorStepB = ABS_ALT(interfaceCtx->minigamePerfectPrimColor[2] -
- sMinigamePerfectType3PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][2]) /
- interfaceCtx->minigamePerfectColorTimer;
+ colorStepR = ABS_ALT(interfaceCtx->perfectLettersPrimColor[0] -
+ sPerfectLettersType3PrimColorTargets[interfaceCtx->perfectLettersColorIndex][0]) /
+ interfaceCtx->perfectLettersColorTimer;
+ colorStepG = ABS_ALT(interfaceCtx->perfectLettersPrimColor[1] -
+ sPerfectLettersType3PrimColorTargets[interfaceCtx->perfectLettersColorIndex][1]) /
+ interfaceCtx->perfectLettersColorTimer;
+ colorStepB = ABS_ALT(interfaceCtx->perfectLettersPrimColor[2] -
+ sPerfectLettersType3PrimColorTargets[interfaceCtx->perfectLettersColorIndex][2]) /
+ interfaceCtx->perfectLettersColorTimer;
- if (interfaceCtx->minigamePerfectPrimColor[0] >=
- sMinigamePerfectType3PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][0]) {
- interfaceCtx->minigamePerfectPrimColor[0] -= colorStepR;
+ if (interfaceCtx->perfectLettersPrimColor[0] >=
+ sPerfectLettersType3PrimColorTargets[interfaceCtx->perfectLettersColorIndex][0]) {
+ interfaceCtx->perfectLettersPrimColor[0] -= colorStepR;
} else {
- interfaceCtx->minigamePerfectPrimColor[0] += colorStepR;
+ interfaceCtx->perfectLettersPrimColor[0] += colorStepR;
}
- if (interfaceCtx->minigamePerfectPrimColor[1] >=
- sMinigamePerfectType3PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][1]) {
- interfaceCtx->minigamePerfectPrimColor[1] -= colorStepG;
+ if (interfaceCtx->perfectLettersPrimColor[1] >=
+ sPerfectLettersType3PrimColorTargets[interfaceCtx->perfectLettersColorIndex][1]) {
+ interfaceCtx->perfectLettersPrimColor[1] -= colorStepG;
} else {
- interfaceCtx->minigamePerfectPrimColor[1] += colorStepG;
+ interfaceCtx->perfectLettersPrimColor[1] += colorStepG;
}
- if (interfaceCtx->minigamePerfectPrimColor[2] >=
- sMinigamePerfectType3PrimColorTargets[interfaceCtx->minigamePerfectColorTargetIndex][2]) {
- interfaceCtx->minigamePerfectPrimColor[2] -= colorStepB;
+ if (interfaceCtx->perfectLettersPrimColor[2] >=
+ sPerfectLettersType3PrimColorTargets[interfaceCtx->perfectLettersColorIndex][2]) {
+ interfaceCtx->perfectLettersPrimColor[2] -= colorStepB;
} else {
- interfaceCtx->minigamePerfectPrimColor[2] += colorStepB;
+ interfaceCtx->perfectLettersPrimColor[2] += colorStepB;
}
- interfaceCtx->minigamePerfectColorTimer--;
- if (interfaceCtx->minigamePerfectColorTimer == 0) {
- interfaceCtx->minigamePerfectColorTimer = 20;
- interfaceCtx->minigamePerfectColorTargetIndex ^= 1;
- interfaceCtx->minigamePerfectTimer++;
- if (interfaceCtx->minigamePerfectTimer == 6) {
- for (i = 0; i < MINIGAME_PERFECT_NUM_LETTERS; i++) {
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[i] = 140.0f;
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[i] = 100.0f;
- interfaceCtx->minigamePerfectLetterEllipseAngle[i] = sMinigamePerfectType3AngleOffScreenTargets[i];
- interfaceCtx->minigamePerfectState[i] = MINIGAME_PERFECT_STATE_EXIT;
+ interfaceCtx->perfectLettersColorTimer--;
+ if (interfaceCtx->perfectLettersColorTimer == 0) {
+ interfaceCtx->perfectLettersColorTimer = 20;
+ interfaceCtx->perfectLettersColorIndex ^= 1;
+ interfaceCtx->perfectLettersTimer++;
+ if (interfaceCtx->perfectLettersTimer == 6) {
+ for (i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) {
+ interfaceCtx->perfectLettersSemiAxisX[i] = 140.0f;
+ interfaceCtx->perfectLettersSemiAxisY[i] = 100.0f;
+ interfaceCtx->perfectLettersAngles[i] = sPerfectLettersType3OffScreenAngles[i];
+ interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_EXIT;
}
- interfaceCtx->minigamePerfectColorTimer = 5;
+ interfaceCtx->perfectLettersColorTimer = 5;
}
}
}
j = 0;
- for (i = 0; i < MINIGAME_PERFECT_NUM_LETTERS; i++) {
- if (interfaceCtx->minigamePerfectState[i] == MINIGAME_PERFECT_STATE_OFF) {
+ for (i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) {
+ if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_OFF) {
j++;
}
}
- if (j == MINIGAME_PERFECT_NUM_LETTERS) {
- interfaceCtx->isMinigamePerfect = false;
+ if (j == PERFECT_LETTERS_NUM_LETTERS) {
+ interfaceCtx->perfectLettersOn = false;
}
}
-TexturePtr sMinigamePerfectTextures[MINIGAME_PERFECT_NUM_LETTERS] = {
- gMinigameLetterPTex, gMinigameLetterETex, gMinigameLetterRTex, gMinigameLetterFTex,
- gMinigameLetterETex, gMinigameLetterCTex, gMinigameLetterTTex, gMinigameExclamationTex,
+TexturePtr sPerfectLettersTextures[PERFECT_LETTERS_NUM_LETTERS] = {
+ gPerfectLetterPTex, gPerfectLetterETex, gPerfectLetterRTex, gPerfectLetterFTex,
+ gPerfectLetterETex, gPerfectLetterCTex, gPerfectLetterTTex, gPerfectLetterExclamationTex,
};
-void Interface_DrawMinigamePerfect(PlayState* play) {
+void Interface_DrawPerfectLetters(PlayState* play) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
f32 letterX;
f32 letterY;
@@ -5582,18 +5562,16 @@ void Interface_DrawMinigamePerfect(PlayState* play) {
gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
PRIMITIVE, 0);
- for (vtxOffset = 0, i = 0; i < MINIGAME_PERFECT_NUM_LETTERS; vtxOffset += 4, i++) {
- if (interfaceCtx->minigamePerfectState[i] != MINIGAME_PERFECT_STATE_OFF) {
+ for (vtxOffset = 0, i = 0; i < PERFECT_LETTERS_NUM_LETTERS; vtxOffset += 4, i++) {
+ if (interfaceCtx->perfectLettersState[i] != PERFECT_LETTERS_STATE_OFF) {
- // The positions follow the path of a parametric ellipse equation
- letterX = Math_SinS(interfaceCtx->minigamePerfectLetterEllipseAngle[i]) *
- interfaceCtx->minigamePerfectLetterEllipseRadiusX[i];
- letterY = Math_CosS(interfaceCtx->minigamePerfectLetterEllipseAngle[i]) *
- interfaceCtx->minigamePerfectLetterEllipseRadiusY[i];
+ // The positions follow the path of an elliptical spiral
+ letterX = Math_SinS(interfaceCtx->perfectLettersAngles[i]) * interfaceCtx->perfectLettersSemiAxisX[i];
+ letterY = Math_CosS(interfaceCtx->perfectLettersAngles[i]) * interfaceCtx->perfectLettersSemiAxisY[i];
// Draw Minigame Perfect Shadows
gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, interfaceCtx->minigamePerfectPrimColor[3]);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, interfaceCtx->perfectLettersPrimColor[3]);
Matrix_Translate(letterX, letterY, 0.0f, MTXMODE_NEW);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
@@ -5601,13 +5579,13 @@ void Interface_DrawMinigamePerfect(PlayState* play) {
gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[44 + vtxOffset], 4, 0);
- OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sMinigamePerfectTextures[i], 4, 32, 33, 0);
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sPerfectLettersTextures[i], 4, 32, 33, 0);
// Draw Minigame Perfect Colored Letters
gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, interfaceCtx->minigamePerfectPrimColor[0],
- interfaceCtx->minigamePerfectPrimColor[1], interfaceCtx->minigamePerfectPrimColor[2],
- interfaceCtx->minigamePerfectPrimColor[3]);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, interfaceCtx->perfectLettersPrimColor[0],
+ interfaceCtx->perfectLettersPrimColor[1], interfaceCtx->perfectLettersPrimColor[2],
+ interfaceCtx->perfectLettersPrimColor[3]);
Matrix_Translate(letterX, letterY, 0.0f, MTXMODE_NEW);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
@@ -5615,7 +5593,7 @@ void Interface_DrawMinigamePerfect(PlayState* play) {
gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[76 + vtxOffset], 4, 0);
- OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sMinigamePerfectTextures[i], 4, 32, 33, 0);
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sPerfectLettersTextures[i], 4, 32, 33, 0);
}
}
@@ -6625,8 +6603,8 @@ void Interface_Draw(PlayState* play) {
}
// Draw the letters of minigame perfect
- if (interfaceCtx->isMinigamePerfect) {
- Interface_DrawMinigamePerfect(play);
+ if (interfaceCtx->perfectLettersOn) {
+ Interface_DrawPerfectLetters(play);
}
Interface_DrawMinigameIcons(play);
@@ -6963,13 +6941,13 @@ void Interface_Update(PlayState* play) {
// Update minigame perfect
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
- if (interfaceCtx->isMinigamePerfect) {
- if (interfaceCtx->minigamePerfectType == MINIGAME_PERFECT_TYPE_1) {
- Interface_UpdateMinigamePerfectType1(play);
- } else if (interfaceCtx->minigamePerfectType == MINIGAME_PERFECT_TYPE_2) {
- Interface_UpdateMinigamePerfectType2(play);
- } else if (interfaceCtx->minigamePerfectType == MINIGAME_PERFECT_TYPE_3) {
- Interface_UpdateMinigamePerfectType3(play);
+ if (interfaceCtx->perfectLettersOn) {
+ if (interfaceCtx->perfectLettersType == PERFECT_LETTERS_TYPE_1) {
+ Interface_UpdatePerfectLettersType1(play);
+ } else if (interfaceCtx->perfectLettersType == PERFECT_LETTERS_TYPE_2) {
+ Interface_UpdatePerfectLettersType2(play);
+ } else if (interfaceCtx->perfectLettersType == PERFECT_LETTERS_TYPE_3) {
+ Interface_UpdatePerfectLettersType3(play);
}
}
}
@@ -7319,9 +7297,9 @@ void Interface_Init(PlayState* play) {
Map_Init(play);
gSaveContext.minigameStatus = MINIGAME_STATUS_DONE;
- interfaceCtx->minigamePerfectPrimColor[0] = 255;
- interfaceCtx->minigamePerfectPrimColor[1] = 165;
- interfaceCtx->minigamePerfectPrimColor[2] = 55;
+ interfaceCtx->perfectLettersPrimColor[0] = 255;
+ interfaceCtx->perfectLettersPrimColor[1] = 165;
+ interfaceCtx->perfectLettersPrimColor[2] = 55;
if (CHECK_EVENTINF(EVENTINF_34)) {
CLEAR_EVENTINF(EVENTINF_34);
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index b3d335afb..6a4210df7 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -342,7 +342,7 @@ void Sram_SaveEndOfCycle(PlayState* play) {
u8 slot;
u8 item;
- gSaveContext.save.daySpeed = 0;
+ gSaveContext.save.timeSpeedOffset = 0;
gSaveContext.save.daysElapsed = 0;
gSaveContext.save.day = 0;
gSaveContext.save.time = CLOCK_TIME(6, 0) - 1;
@@ -593,7 +593,7 @@ void Sram_ResetSave(void) {
gSaveContext.save.unk_06 = 0;
gSaveContext.save.linkAge = 0;
gSaveContext.save.isNight = false;
- gSaveContext.save.daySpeed = 0;
+ gSaveContext.save.timeSpeedOffset = 0;
gSaveContext.save.snowheadCleared = 0;
gSaveContext.save.hasTatl = false;
gSaveContext.save.isOwlSave = false;
diff --git a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
index 9b33866e2..740d23259 100644
--- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
+++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
@@ -255,7 +255,7 @@ void func_809542A0(BgIngate* this, PlayState* play) {
gSaveContext.nextTransitionType = TRANS_TYPE_03;
this->actionFunc = func_80953F8C;
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40);
- func_800FE498();
+ Environment_StartTime();
}
void func_80954340(BgIngate* this, PlayState* play) {
@@ -264,7 +264,7 @@ void func_80954340(BgIngate* this, PlayState* play) {
func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
this->timePath = &play->setupPathList[this->timePath->unk1];
func_80953F14(this, play);
- func_800FE484();
+ Environment_StopTime();
}
}
}
@@ -283,7 +283,7 @@ void func_809543D4(BgIngate* this, PlayState* play) {
func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
this->unk160 &= ~0x4;
this->actionFunc = func_809541B8;
- func_800FE498();
+ Environment_StartTime();
func_8019F208();
} else {
if (this->timePath != NULL) {
@@ -304,7 +304,7 @@ void func_809543D4(BgIngate* this, PlayState* play) {
func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
this->unk160 &= ~0x4;
this->actionFunc = func_809541B8;
- func_800FE498();
+ Environment_StartTime();
func_8019F230();
}
func_801477B4(play);
diff --git a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
index cd494f6fa..4f9d7d702 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
@@ -1154,7 +1154,7 @@ void DmStk_WaitForTelescope(DmStk* this, PlayState* play) {
if (play->view.fovy < 25.0f) {
if ((screenPos.x >= 70.0f) && (screenPos.x < (SCREEN_WIDTH - 70.0f)) && (screenPos.y >= 30.0f) &&
(screenPos.y < (SCREEN_HEIGHT - 30.0f))) {
- func_800FE484();
+ Environment_StopTime();
this->actionFunc = DmStk_StartTelescopeCutscene;
}
}
@@ -1181,7 +1181,7 @@ void DmStk_StartTelescopeCutscene(DmStk* this, PlayState* play) {
if (ActorCutscene_GetCanPlayNext(cutscene)) {
ActorCutscene_Start(cutscene, &this->actor);
- func_800FE498();
+ Environment_StartTime();
this->actionFunc = DmStk_DoNothing;
} else {
ActorCutscene_SetIntentToPlay(cutscene);
@@ -1818,7 +1818,8 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
(play->csCtx.state == 0)) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
if (R_TIME_SPEED != 0) {
- gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed);
+ gSaveContext.save.time =
+ ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset);
}
}
}
diff --git a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
index bf31f039c..3487d95c6 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
@@ -163,7 +163,7 @@ void DoorWarp1_Init(Actor* thisx, PlayState* play) {
if ((play->sceneId == SCENE_MITURIN_BS) || (play->sceneId == SCENE_HAKUGIN_BS) ||
(play->sceneId == SCENE_INISIE_BS) || (play->sceneId == SCENE_SEA_BS)) {
- func_800FE484();
+ Environment_StopTime();
play->interfaceCtx.restrictions.unk_312 = 1;
play->interfaceCtx.restrictions.songOfSoaring = 1;
}
diff --git a/src/overlays/actors/ovl_En_Al/z_en_al.c b/src/overlays/actors/ovl_En_Al/z_en_al.c
index 4dae6d577..da1cc7d7e 100644
--- a/src/overlays/actors/ovl_En_Al/z_en_al.c
+++ b/src/overlays/actors/ovl_En_Al/z_en_al.c
@@ -748,7 +748,7 @@ void func_80BDF578(EnAl* this, PlayState* play) {
void func_80BDF5E8(EnAl* this, PlayState* play) {
ScheduleOutput sp20;
- this->unk_4E0 = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->unk_4E0 = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BDFC70, &sp20) ||
((this->unk_35C != sp20.result) && !func_80BDF390(this, play, &sp20))) {
this->actor.shape.shadowDraw = NULL;
diff --git a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c
index b07a11520..a6624dc38 100644
--- a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c
+++ b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c
@@ -103,7 +103,7 @@ void func_809C10B0(EnAob01* this, s32 arg1) {
void func_809C1124(void) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
- gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed);
+ gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset);
}
void func_809C1158(EnAob01* this, PlayState* play) {
diff --git a/src/overlays/actors/ovl_En_Baba/z_en_baba.c b/src/overlays/actors/ovl_En_Baba/z_en_baba.c
index 584c51f4e..6040076f4 100644
--- a/src/overlays/actors/ovl_En_Baba/z_en_baba.c
+++ b/src/overlays/actors/ovl_En_Baba/z_en_baba.c
@@ -654,7 +654,7 @@ void EnBaba_GaveBlastMask(EnBaba* this, PlayState* play) {
void EnBaba_FollowSchedule(EnBaba* this, PlayState* play) {
ScheduleOutput scheduleOutput;
- this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, sSchedule, &scheduleOutput) ||
((this->scheduleResult != scheduleOutput.result) &&
diff --git a/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
index 159bd7981..041cadaa7 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
@@ -800,7 +800,7 @@ void func_80962F4C(EnFu* this, PlayState* play) {
gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] = SECONDS_TO_TIMER(0);
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_STOP;
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
- Interface_SetMinigamePerfect(play, MINIGAME_PERFECT_TYPE_1);
+ Interface_SetPerfectLetters(play, PERFECT_LETTERS_TYPE_1);
this->unk_54A = 3;
func_809632D0(this);
}
@@ -848,7 +848,7 @@ void func_80963350(EnFu* this, PlayState* play) {
D_80964C24 = 1;
}
- if ((this->unk_54A == 3) && !play->interfaceCtx.isMinigamePerfect) {
+ if ((this->unk_54A == 3) && !play->interfaceCtx.perfectLettersOn) {
this->unk_54A = 2;
D_80964C24 = 1;
}
diff --git a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
index 38c484cc6..d56882b1c 100644
--- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
+++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
@@ -488,7 +488,7 @@ void func_80B10344(EnGb2* this, PlayState* play) {
if (this->unk_280 == 3) {
this->unk_26C &= ~0x200;
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP;
- func_800FE498();
+ Environment_StartTime();
SET_EVENTINF(EVENTINF_46);
func_80B0FE7C(play);
} else if (this->unk_280 == 2) {
@@ -892,7 +892,7 @@ void EnGb2_Init(Actor* thisx, PlayState* play) {
}
if (gSaveContext.save.entrance == ENTRANCE(GHOST_HUT, 1)) {
- func_800FE484();
+ Environment_StopTime();
this->actionFunc = func_80B10240;
break;
}
diff --git a/src/overlays/actors/ovl_En_Gm/z_en_gm.c b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
index 232e3ae79..01146c0cf 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
@@ -1582,7 +1582,7 @@ void func_80950C24(EnGm* this, PlayState* play) {
void func_80950CDC(EnGm* this, PlayState* play) {
ScheduleOutput sp20;
- this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80951820, &sp20) ||
((this->unk_258 != sp20.result) && !func_80950280(this, play, &sp20))) {
diff --git a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
index 5299dbaa1..e97deee04 100644
--- a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
+++ b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
@@ -140,7 +140,7 @@ s32 func_808F8CCC(EnHorseGameCheck* this, PlayState* play2) {
Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_FREE0);
Play_SetCameraAtEye(play, CAM_ID_MAIN, &mainCamAt, &mainCamEye);
Play_SetCameraFov(play, CAM_ID_MAIN, 45.0f);
- func_800FE484();
+ Environment_StopTime();
return false;
}
diff --git a/src/overlays/actors/ovl_En_Ig/z_en_ig.c b/src/overlays/actors/ovl_En_Ig/z_en_ig.c
index 4244c705d..2468e5961 100644
--- a/src/overlays/actors/ovl_En_Ig/z_en_ig.c
+++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.c
@@ -876,7 +876,7 @@ void func_80BF2A50(EnIg* this, PlayState* play) {
void func_80BF2AF8(EnIg* this, PlayState* play) {
ScheduleOutput sp20;
- this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BF3260, &sp20) ||
((this->scheduleResult != sp20.result) && !func_80BF2368(this, play, &sp20))) {
diff --git a/src/overlays/actors/ovl_En_Ja/z_en_ja.c b/src/overlays/actors/ovl_En_Ja/z_en_ja.c
index 84857fdfe..39a28c4bd 100644
--- a/src/overlays/actors/ovl_En_Ja/z_en_ja.c
+++ b/src/overlays/actors/ovl_En_Ja/z_en_ja.c
@@ -301,7 +301,7 @@ void func_80BC2150(EnJa* this, PlayState* play) {
void func_80BC21A8(EnJa* this, PlayState* play) {
ScheduleOutput sp18;
- this->unk_35C = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->unk_35C = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BC35F0, &sp18) ||
((this->unk_1D8.unk_00 != sp18.result) && !func_80BC20D0(this, play, &sp18))) {
this->actor.shape.shadowDraw = NULL;
diff --git a/src/overlays/actors/ovl_En_Nb/z_en_nb.c b/src/overlays/actors/ovl_En_Nb/z_en_nb.c
index 572364bbd..70208c942 100644
--- a/src/overlays/actors/ovl_En_Nb/z_en_nb.c
+++ b/src/overlays/actors/ovl_En_Nb/z_en_nb.c
@@ -638,7 +638,7 @@ void EnNb_HandleSchedule(EnNb* this, PlayState* play) {
void EnNb_FollowSchedule(EnNb* this, PlayState* play) {
ScheduleOutput scheduleOutput;
- this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed);
+ this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.timeSpeedOffset);
if (gSaveContext.eventInf[4] & 8) {
scheduleOutput.result = EN_NB_SCH_1;
diff --git a/src/overlays/actors/ovl_En_Pm/z_en_pm.c b/src/overlays/actors/ovl_En_Pm/z_en_pm.c
index c4d1184bf..c2846a26b 100644
--- a/src/overlays/actors/ovl_En_Pm/z_en_pm.c
+++ b/src/overlays/actors/ovl_En_Pm/z_en_pm.c
@@ -1987,7 +1987,7 @@ void func_80AFA4D0(EnPm* this, PlayState* play) {
u16 sp3C = 0;
ScheduleOutput sp2C;
- this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (this->unk_38C != 0) {
time = gSaveContext.save.time - D_801F4E78;
sp3C = gSaveContext.save.time;
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 e8a445433..93c93eef9 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
@@ -232,7 +232,7 @@ void EnSuttari_TriggerTransition(PlayState* play, u16 entrance) {
void EnSuttari_UpdateTime(void) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
- gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed);
+ gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset);
}
s32 func_80BAA904(EnSuttari* this, PlayState* play) {
@@ -1104,7 +1104,7 @@ void func_80BACE4C(EnSuttari* this, PlayState* play) {
void func_80BACEE0(EnSuttari* this, PlayState* play) {
ScheduleOutput scheduleOutput;
- this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
this->actor.flags &= ~ACTOR_FLAG_1;
@@ -1128,7 +1128,7 @@ void func_80BACEE0(EnSuttari* this, PlayState* play) {
void func_80BAD004(EnSuttari* this, PlayState* play) {
ScheduleOutput scheduleOutput;
- this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
this->actor.flags &= ~ACTOR_FLAG_1;
@@ -1255,7 +1255,7 @@ void func_80BAD5F8(EnSuttari* this, PlayState* play) {
this->animIndex = 2;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
- this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
this->actor.flags &= ~ACTOR_FLAG_1;
@@ -1293,7 +1293,7 @@ void func_80BAD7F8(EnSuttari* this, PlayState* play) {
this->animIndex = 2;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
- this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
this->actor.flags &= ~ACTOR_FLAG_1;
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 b8121acf4..717d19917 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
@@ -1090,7 +1090,7 @@ void EnSyatekiMan_Swamp_RunGame(EnSyatekiMan* this, PlayState* play) {
func_801A2C20();
this->shootingGameState = SG_GAME_STATE_GIVING_BONUS;
if (this->score == 2120) {
- Interface_SetMinigamePerfect(play, MINIGAME_PERFECT_TYPE_2);
+ Interface_SetPerfectLetters(play, PERFECT_LETTERS_TYPE_2);
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_6;
this->actionFunc = EnSyatekiMan_Swamp_AddBonusPoints;
} else {
@@ -1156,7 +1156,7 @@ void EnSyatekiMan_Swamp_AddBonusPoints(EnSyatekiMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
player->stateFlags1 |= PLAYER_STATE1_20;
- if (!play->interfaceCtx.isMinigamePerfect) {
+ if (!play->interfaceCtx.perfectLettersOn) {
if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_1] == SECONDS_TO_TIMER(0)) {
gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_1] = SECONDS_TO_TIMER(0);
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP;
@@ -1359,7 +1359,7 @@ void EnSyatekiMan_Town_RunGame(EnSyatekiMan* this, PlayState* play) {
this->actionFunc = EnSyatekiMan_Town_EndGame;
if (this->score == 50) {
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
- Interface_SetMinigamePerfect(play, MINIGAME_PERFECT_TYPE_1);
+ Interface_SetPerfectLetters(play, PERFECT_LETTERS_TYPE_1);
}
}
}
@@ -1368,7 +1368,7 @@ void EnSyatekiMan_Town_RunGame(EnSyatekiMan* this, PlayState* play) {
void EnSyatekiMan_Town_EndGame(EnSyatekiMan* this, PlayState* play) {
if (this->shootingGameState == SG_GAME_STATE_RUNNING) {
this->octorokFlags = 0;
- if ((this->talkWaitTimer <= 0) && !play->interfaceCtx.isMinigamePerfect) {
+ if ((this->talkWaitTimer <= 0) && !play->interfaceCtx.perfectLettersOn) {
Flags_SetAllTreasure(play, this->score);
this->talkWaitTimer = 15;
if ((GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() < this->score) || (this->score == 50)) {
diff --git a/src/overlays/actors/ovl_En_Tab/z_en_tab.c b/src/overlays/actors/ovl_En_Tab/z_en_tab.c
index 3159e4a18..abd7c100c 100644
--- a/src/overlays/actors/ovl_En_Tab/z_en_tab.c
+++ b/src/overlays/actors/ovl_En_Tab/z_en_tab.c
@@ -473,7 +473,7 @@ void func_80BE1224(EnTab* this, PlayState* play) {
void func_80BE127C(EnTab* this, PlayState* play) {
ScheduleOutput sp18;
- this->unk_31A = R_TIME_SPEED + ((void)0, gSaveContext.save.daySpeed);
+ this->unk_31A = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset);
if (!Schedule_RunScript(play, D_80BE18D0, &sp18) ||
((this->unk_1D8 != sp18.result) && !func_80BE1060(this, play, &sp18))) {
diff --git a/src/overlays/actors/ovl_En_Test3/z_en_test3.c b/src/overlays/actors/ovl_En_Test3/z_en_test3.c
index a459fc1d5..2dc7417e8 100644
--- a/src/overlays/actors/ovl_En_Test3/z_en_test3.c
+++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.c
@@ -508,7 +508,7 @@ void EnTest3_Destroy(Actor* thisx, PlayState* play2) {
Collider_DestroyQuad(play, &this->player.meleeWeaponQuads[1]);
Collider_DestroyQuad(play, &this->player.shieldQuad);
ZeldaArena_Free(this->player.maskObjectSegment);
- func_800FE498();
+ Environment_StartTime();
}
s32 func_80A3F080(EnTest3* this, PlayState* play, struct_80A41828* arg2, ScheduleOutput* scheduleOutput) {
@@ -765,7 +765,7 @@ s32 func_80A3FBE8(EnTest3* this, PlayState* play) {
if (this->unk_D8D >= 0) {
if (func_80A3E9DC(this, play)) {
this->unk_D8D = -1;
- func_800FE484();
+ Environment_StopTime();
}
} else if ((play->actorCtx.flags & ACTORCTX_FLAG_6) || (play->actorCtx.flags & ACTORCTX_FLAG_5)) {
this->unk_D8D = ActorCutscene_GetAdditionalCutscene(this->player.actor.cutscene);
@@ -780,7 +780,7 @@ s32 func_80A3FBE8(EnTest3* this, PlayState* play) {
}
} else if ((D_80A41D20 == 2) && func_80A3E9DC(this, play)) {
ActorCutscene_SetReturnCamera(CAM_ID_MAIN);
- func_800FE498();
+ Environment_StartTime();
if (((void)0, gSaveContext.save.time) > CLOCK_TIME(6, 0)) {
func_800FE658(TIME_TO_MINUTES_ALT_F(fabsf((s16) - ((void)0, gSaveContext.save.time))));
}
@@ -968,7 +968,7 @@ void func_80A40678(EnTest3* this, PlayState* play) {
this->unk_D80 = ((this->unk_D88 == 20) || (this->unk_D88 == 10) || (this->unk_D88 == 9)) ? 3
: Play_InCsMode(play) ? 0
- : REG(15) + ((void)0, gSaveContext.save.daySpeed);
+ : REG(15) + ((void)0, gSaveContext.save.timeSpeedOffset);
if (Schedule_RunScript(play, sScheduleScript, &scheduleOutput)) {
if (this->unk_D88 != scheduleOutput.result) {
diff --git a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
index 32e3e3437..7ddd539e7 100644
--- a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
+++ b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
@@ -488,7 +488,8 @@ void EnWeatherTag_Update(Actor* thisx, PlayState* play) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
if (R_TIME_SPEED != 0) {
- gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed);
+ gSaveContext.save.time =
+ ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset);
}
}
}
diff --git a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
index 0309a511a..fbdc8b398 100644
--- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
+++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
@@ -698,7 +698,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
sp54 = false;
this->flags |= OBJ_UM_FLAG_0100;
ObjUm_SetupAction(this, func_80B7A144);
- func_800FE484();
+ Environment_StopTime();
} else {
// Waiting for player
@@ -722,7 +722,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) {
this->pathIndex = this->initialPathIndex;
sp54 = false;
- func_800FE484();
+ Environment_StopTime();
ObjUm_SetupAction(this, ObjUm_PreMilkRunStartCs);
this->unk_354 = 0;
ObjUm_RotatePlayer(this, play, 0);
@@ -735,7 +735,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
this->pathIndex = this->initialPathIndex;
sp54 = false;
- func_800FE484();
+ Environment_StopTime();
ObjUm_SetupAction(this, ObjUm_StartCs);
this->unk_354 = 0;
ObjUm_RotatePlayer(this, play, 0);
@@ -747,7 +747,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
this->pathIndex = this->initialPathIndex;
sp54 = false;
- func_800FE484();
+ Environment_StopTime();
ObjUm_SetupAction(this, ObjUm_PostMilkRunStartCs);
this->unk_354 = 0;
ObjUm_RotatePlayer(this, play, 0);
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index 56c0cb28d..bd23a330d 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -1768,9 +1768,9 @@
0x800FDC94:("func_800FDC94",),
0x800FE390:("func_800FE390",),
0x800FE3E0:("func_800FE3E0",),
- 0x800FE484:("func_800FE484",),
- 0x800FE498:("func_800FE498",),
- 0x800FE4A8:("func_800FE4A8",),
+ 0x800FE484:("Environment_StopTime",),
+ 0x800FE498:("Environment_StartTime",),
+ 0x800FE4A8:("Environment_IsTimeStopped",),
0x800FE4B8:("func_800FE4B8",),
0x800FE590:("func_800FE590",),
0x800FE5D0:("func_800FE5D0",),
@@ -2151,11 +2151,11 @@
0x80118BA4:("Interface_DrawAButton",),
0x80119030:("Interface_DrawPauseMenuEquippingIcons",),
0x80119610:("Interface_DrawClock",),
- 0x8011B4E0:("Interface_SetMinigamePerfect",),
- 0x8011B5C0:("Interface_UpdateMinigamePerfectType1",),
- 0x8011B9E0:("Interface_UpdateMinigamePerfectType2",),
- 0x8011BF70:("Interface_UpdateMinigamePerfectType3",),
- 0x8011C4C4:("Interface_DrawMinigamePerfect",),
+ 0x8011B4E0:("Interface_SetPerfectLetters",),
+ 0x8011B5C0:("Interface_UpdatePerfectLettersType1",),
+ 0x8011B9E0:("Interface_UpdatePerfectLettersType2",),
+ 0x8011BF70:("Interface_UpdatePerfectLettersType3",),
+ 0x8011C4C4:("Interface_DrawPerfectLetters",),
0x8011C808:("Interface_StartMoonCrash",),
0x8011C898:("Interface_GetTimerDigits",),
0x8011CA64:("Interface_DrawTimers",),
diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt
index d96397e5f..18a8c44e6 100644
--- a/tools/disasm/variables.txt
+++ b/tools/disasm/variables.txt
@@ -1164,15 +1164,15 @@
0x801BFC10:("D_801BFC10","UNK_TYPE1","",0x1),
0x801BFC14:("sFinalHoursDigitTextures","UNK_TYPE1","",0x1),
0x801BFC40:("D_801BFC40","UNK_TYPE1","",0x1),
- 0x801BFC50:("sMinigamePerfectType1AngleOffScreenTargets","UNK_TYPE2","",0x2),
- 0x801BFC60:("sMinigamePerfectType1PrimColorTargets","s16","[6]",0xC),
- 0x801BFC6C:("sMinigamePerfectType2LetterXOffsetSpellingTargets","UNK_TYPE4","",0x4),
- 0x801BFC7C:("sMinigamePerfectType2LetterXOffsetOffScreenTargets","UNK_TYPE2","",0x2),
- 0x801BFC8C:("sMinigamePerfectType2PrimColorTargets","UNK_TYPE1","",0x1),
- 0x801BFC98:("sMinigamePerfectType3LetterXOffsetSpellingTargets","UNK_TYPE2","",0x2),
- 0x801BFCA8:("sMinigamePerfectType3AngleOffScreenTargets","UNK_TYPE2","",0x2),
- 0x801BFCB8:("sMinigamePerfectType3PrimColorTargets","UNK_TYPE1","",0x1),
- 0x801BFCC4:("sMinigamePerfectTextures","UNK_TYPE4","",0x4),
+ 0x801BFC50:("sPerfectLettersType1OffScreenAngles","UNK_TYPE2","",0x2),
+ 0x801BFC60:("sPerfectLettersType1PrimColorTargets","s16","[6]",0xC),
+ 0x801BFC6C:("sPerfectLettersType2SpellingOffsetsX","UNK_TYPE4","",0x4),
+ 0x801BFC7C:("sPerfectLettersType2OffScreenOffsetsX","UNK_TYPE2","",0x2),
+ 0x801BFC8C:("sPerfectLettersType2PrimColorTargets","UNK_TYPE1","",0x1),
+ 0x801BFC98:("sPerfectLettersType3SpellingOffsetsX","UNK_TYPE2","",0x2),
+ 0x801BFCA8:("sPerfectLettersType3OffScreenAngles","UNK_TYPE2","",0x2),
+ 0x801BFCB8:("sPerfectLettersType3PrimColorTargets","UNK_TYPE1","",0x1),
+ 0x801BFCC4:("sPerfectLettersTextures","UNK_TYPE4","",0x4),
0x801BFCE4:("sTimerStateTimer","UNK_TYPE4","",0x4),
0x801BFCE8:("sTimerDigits","u16","[8]",0x10),
0x801BFCF8:("sTimerBeepSfxSeconds","UNK_TYPE4","",0x4),
diff --git a/tools/namefixer.py b/tools/namefixer.py
index b58693986..c28311683 100755
--- a/tools/namefixer.py
+++ b/tools/namefixer.py
@@ -694,7 +694,7 @@ wordReplace = {
"gSaveContext.equippedMask": "gSaveContext.save.equippedMask",
"gSaveContext.entranceIndex": "gSaveContext.save.entrance",
"gSaveContext.time": "gSaveContext.save.time",
- "gSaveContext.unk_14": "gSaveContext.save.daySpeed",
+ "gSaveContext.unk_14": "gSaveContext.save.timeSpeedOffset",
"gSaveContext.unk_FE6": "gSaveContext.save.bombersCaughtNum",
"gSaveContext.unk_FE7": "gSaveContext.save.bombersCaughtOrder",
"gSaveContext.linkAge": "gSaveContext.save.linkAge",
diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv
index 1bbca17ce..c57c29cbc 100644
--- a/tools/sizes/code_functions.csv
+++ b/tools/sizes/code_functions.csv
@@ -1282,9 +1282,9 @@ asm/non_matchings/code/z_kankyo/func_800FDAF8.s,func_800FDAF8,0x800FDAF8,0x67
asm/non_matchings/code/z_kankyo/func_800FDC94.s,func_800FDC94,0x800FDC94,0x1BF
asm/non_matchings/code/z_kankyo/func_800FE390.s,func_800FE390,0x800FE390,0x14
asm/non_matchings/code/z_kankyo/func_800FE3E0.s,func_800FE3E0,0x800FE3E0,0x29
-asm/non_matchings/code/z_kankyo/func_800FE484.s,func_800FE484,0x800FE484,0x5
-asm/non_matchings/code/z_kankyo/func_800FE498.s,func_800FE498,0x800FE498,0x4
-asm/non_matchings/code/z_kankyo/func_800FE4A8.s,func_800FE4A8,0x800FE4A8,0x4
+asm/non_matchings/code/z_kankyo/Environment_StopTime.s,Environment_StopTime,0x800FE484,0x5
+asm/non_matchings/code/z_kankyo/Environment_StartTime.s,Environment_StartTime,0x800FE498,0x4
+asm/non_matchings/code/z_kankyo/Environment_IsTimeStopped.s,Environment_IsTimeStopped,0x800FE4A8,0x4
asm/non_matchings/code/z_kankyo/func_800FE4B8.s,func_800FE4B8,0x800FE4B8,0x36
asm/non_matchings/code/z_kankyo/func_800FE590.s,func_800FE590,0x800FE590,0x10
asm/non_matchings/code/z_kankyo/func_800FE5D0.s,func_800FE5D0,0x800FE5D0,0x10
@@ -1665,11 +1665,11 @@ asm/non_matchings/code/z_parameter/Interface_DrawCButtonIcons.s,Interface_DrawCB
asm/non_matchings/code/z_parameter/Interface_DrawAButton.s,Interface_DrawAButton,0x80118BA4,0x123
asm/non_matchings/code/z_parameter/Interface_DrawPauseMenuEquippingIcons.s,Interface_DrawPauseMenuEquippingIcons,0x80119030,0x178
asm/non_matchings/code/z_parameter/Interface_DrawClock.s,Interface_DrawClock,0x80119610,0x7B4
-asm/non_matchings/code/z_parameter/Interface_SetMinigamePerfect.s,Interface_SetMinigamePerfect,0x8011B4E0,0x38
-asm/non_matchings/code/z_parameter/Interface_UpdateMinigamePerfectType1.s,Interface_UpdateMinigamePerfectType1,0x8011B5C0,0x108
-asm/non_matchings/code/z_parameter/Interface_UpdateMinigamePerfectType2.s,Interface_UpdateMinigamePerfectType2,0x8011B9E0,0x164
-asm/non_matchings/code/z_parameter/Interface_UpdateMinigamePerfectType3.s,Interface_UpdateMinigamePerfectType3,0x8011BF70,0x155
-asm/non_matchings/code/z_parameter/Interface_DrawMinigamePerfect.s,Interface_DrawMinigamePerfect,0x8011C4C4,0xD1
+asm/non_matchings/code/z_parameter/Interface_SetPerfectLetters.s,Interface_SetPerfectLetters,0x8011B4E0,0x38
+asm/non_matchings/code/z_parameter/Interface_UpdatePerfectLettersType1.s,Interface_UpdatePerfectLettersType1,0x8011B5C0,0x108
+asm/non_matchings/code/z_parameter/Interface_UpdatePerfectLettersType2.s,Interface_UpdatePerfectLettersType2,0x8011B9E0,0x164
+asm/non_matchings/code/z_parameter/Interface_UpdatePerfectLettersType3.s,Interface_UpdatePerfectLettersType3,0x8011BF70,0x155
+asm/non_matchings/code/z_parameter/Interface_DrawPerfectLetters.s,Interface_DrawPerfectLetters,0x8011C4C4,0xD1
asm/non_matchings/code/z_parameter/Interface_StartMoonCrash.s,Interface_StartMoonCrash,0x8011C808,0x24
asm/non_matchings/code/z_parameter/Interface_GetTimerDigits.s,Interface_GetTimerDigits,0x8011C898,0x73
asm/non_matchings/code/z_parameter/Interface_DrawTimers.s,Interface_DrawTimers,0x8011CA64,0x654