From 10b075567664b09b8524fd9f634a771e9b02448f Mon Sep 17 00:00:00 2001 From: engineer124 Date: Sun, 20 Nov 2022 13:35:22 -0500 Subject: [PATCH] sync to PRs --- assets/xml/interface/parameter_static.xml | 14 +- include/functions.h | 8 +- include/macros.h | 7 +- include/variables.h | 18 +- include/z64interface.h | 52 +- include/z64save.h | 7 +- src/code/z_demo.c | 2 +- src/code/z_kankyo.c | 6 +- src/code/z_parameter.c | 1644 ++++++++--------- src/code/z_sram_NES.c | 4 +- .../actors/ovl_Bg_Ingate/z_bg_ingate.c | 8 +- src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c | 7 +- .../actors/ovl_Door_Warp1/z_door_warp1.c | 2 +- src/overlays/actors/ovl_En_Al/z_en_al.c | 2 +- .../actors/ovl_En_Aob_01/z_en_aob_01.c | 2 +- src/overlays/actors/ovl_En_Baba/z_en_baba.c | 2 +- src/overlays/actors/ovl_En_Fu/z_en_fu.c | 4 +- src/overlays/actors/ovl_En_Gb2/z_en_gb2.c | 4 +- src/overlays/actors/ovl_En_Gm/z_en_gm.c | 2 +- .../z_en_horse_game_check.c | 2 +- src/overlays/actors/ovl_En_Ig/z_en_ig.c | 2 +- src/overlays/actors/ovl_En_Ja/z_en_ja.c | 2 +- src/overlays/actors/ovl_En_Nb/z_en_nb.c | 2 +- src/overlays/actors/ovl_En_Pm/z_en_pm.c | 2 +- .../actors/ovl_En_Suttari/z_en_suttari.c | 10 +- .../ovl_En_Syateki_Man/z_en_syateki_man.c | 8 +- src/overlays/actors/ovl_En_Tab/z_en_tab.c | 2 +- src/overlays/actors/ovl_En_Test3/z_en_test3.c | 8 +- .../ovl_En_Weather_Tag/z_en_weather_tag.c | 3 +- src/overlays/actors/ovl_Obj_Um/z_obj_um.c | 8 +- tools/disasm/functions.txt | 16 +- tools/disasm/variables.txt | 18 +- tools/namefixer.py | 2 +- tools/sizes/code_functions.csv | 16 +- 34 files changed, 942 insertions(+), 954 deletions(-) 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