diff --git a/assets/xml/interface/parameter_static.xml b/assets/xml/interface/parameter_static.xml index e5e0808c0f..a2ab9e0c50 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 1e9d7b4c81..19d0c8ad9f 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1705,7 +1705,6 @@ Gfx* Gfx_DrawTexRectI8(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 textu Gfx* Gfx_DrawTexQuadIA8(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 textureHeight, u16 point); Gfx* Gfx_DrawTexQuad4b(Gfx* gfx, TexturePtr texture, s32 fmt, s16 textureWidth, s16 textureHeight, u16 point); -// void func_8010E028(void); void Interface_StartTimer(s16 timerId, s16 seconds); void Interface_StartPostmanTimer(s16 seconds, s16 bunnyHoodState); void func_8010EE74(PlayState* play, s32 day); @@ -1713,7 +1712,7 @@ void Interface_SetHudVisibility(u16 hudVisibility); void func_80110038(PlayState* play); // void func_80111CB4(void); // void func_801129E4(void); -void func_80112AFC(PlayState* play); +void Interface_InitMinigame(PlayState* play); void Interface_LoadItemIconImpl(PlayState* play, u8 btn); void Interface_LoadItemIcon(PlayState* play, u8 btn); void func_80112C0C(PlayState* play, u16 flag); @@ -1741,30 +1740,13 @@ 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 func_80116FD8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -// void func_801170B8(void); -// void func_80117100(void); -// void func_80117A20(void); -// void func_80117BD0(void); -// void func_80118084(void); -// void func_80118890(void); -// void func_80118BA4(void); -// void func_80119030(void); -// void func_80119610(void); -void func_8011B4E0(PlayState* play, s32 arg1); -// void func_8011B5C0(void); -// void func_8011B9E0(void); -// void func_8011BF70(void); -// void func_8011C4C4(void); +void Interface_SetPerfectLetters(PlayState* play, s16 perfectLettersType); void Interface_StartMoonCrash(PlayState* play); -// void func_8011E730(void); -// void func_8011F0E0(UNK_TYPE4 ctxt); -// void func_80120F90(void); -// void func_80121000(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE1 param_8, UNK_TYPE1 param_9, UNK_TYPE1 param_10, UNK_TYPE4 param_11, UNK_TYPE4 param_12, UNK_TYPE4 param_13, UNK_TYPE4 param_14); -// void func_80121064(void); -// void func_801210E0(void); +void Interface_Draw(PlayState* play); +void Interface_Update(PlayState* play); void Interface_Destroy(PlayState* play); -void func_80121FC4(PlayState* play); +void Interface_Init(PlayState* play); + Path* Path_GetByIndex(PlayState* play, s16 index, s16 max); f32 Path_OrientAndGetDistSq(Actor* actor, Path* path, s16 waypoint, s16* yaw); void Path_CopyLastPoint(Path* path, Vec3f* dest); diff --git a/include/variables.h b/include/variables.h index a96dc8173b..0d3bbf5d16 100644 --- a/include/variables.h +++ b/include/variables.h @@ -690,13 +690,6 @@ extern UNK_PTR D_801BF5C0; // extern UNK_TYPE2 D_801BF9F8; // extern UNK_TYPE2 D_801BF9FC; // extern UNK_TYPE2 D_801BFA00; -// extern UNK_TYPE2 D_801BFA04; -// extern UNK_TYPE2 D_801BFA1C; -// extern UNK_TYPE2 D_801BFA34; -// extern UNK_TYPE2 D_801BFA4C; -// extern UNK_TYPE2 D_801BFA64; -// extern UNK_TYPE2 D_801BFA74; -// extern UNK_TYPE4 sPostmanTimerInputBtnAPressed; // extern UNK_TYPE1 D_801BFAB0; // extern UNK_TYPE1 D_801BFAB8; // extern UNK_TYPE1 D_801BFAC4; @@ -737,17 +730,6 @@ extern UNK_PTR D_801BF5C0; // extern UNK_TYPE1 D_801BFC10; // extern UNK_TYPE1 D_801BFC14; // extern UNK_TYPE1 D_801BFC40; -// extern UNK_TYPE2 D_801BFC50; -// extern UNK_TYPE2 D_801BFC60; -// extern UNK_TYPE2 D_801BFC62; -// extern UNK_TYPE2 D_801BFC64; -// extern UNK_TYPE2 D_801BFC6C; -// extern UNK_TYPE2 D_801BFC7C; -// extern UNK_TYPE1 D_801BFC8C; -// extern UNK_TYPE2 D_801BFC98; -// extern UNK_TYPE2 D_801BFCA8; -// extern UNK_TYPE1 D_801BFCB8; -// extern UNK_TYPE4 D_801BFCC4; // extern UNK_TYPE2 sTimerStateTimer; // extern UNK_TYPE2 sTimerDigits; // extern UNK_TYPE2 D_801BFCEA; diff --git a/include/z64.h b/include/z64.h index 922f5eeb72..eabda7d4e7 100644 --- a/include/z64.h +++ b/include/z64.h @@ -35,6 +35,7 @@ #include "z64cutscene.h" #include "z64dma.h" #include "z64effect.h" +#include "z64interface.h" #include "z64item.h" #include "z64light.h" #include "z64map.h" @@ -506,10 +507,10 @@ typedef struct { /* 0x256 */ s16 unk_256; /* 0x258 */ s16 magicConsumptionTimer; // For certain magic states, 1 unit of magic is consumed every time the timer reaches 0 /* 0x25A */ u8 numHorseBoosts; - /* 0x25C */ u16 unk_25C; - /* 0x25E */ u16 unk_25E; - /* 0x260 */ u16 hbaAmmo; - /* 0x262 */ u16 unk_262; + /* 0x25C */ u16 minigamePoints; // Points to add to the minigame score. Reset to 0 every frame. + /* 0x25E */ u16 minigameHiddenPoints; // Points to add to the secondary set of minigame points not displayed. Reset to 0 every frame. + /* 0x260 */ u16 minigameAmmo; + /* 0x262 */ u16 minigameUnusedPoints; // Associated with other minigame points, unused /* 0x264 */ s16 unk_264; /* 0x266 */ s16 aAlpha; /* 0x268 */ s16 bAlpha; @@ -525,22 +526,22 @@ typedef struct { /* 0x27C */ s16 mapRoomNum; /* 0x27E */ u8 unk_27E; /* 0x27F */ u8 unk_27F; - /* 0x280 */ u8 unk_280; - /* 0x282 */ s16 unk_282; - /* 0x284 */ s16 unk_284; - /* 0x286 */ s16 unk_286; - /* 0x288 */ s16 unk_288; - /* 0x28A */ s16 unk_28A[8]; - /* 0x29A */ u16 unk_29A[8]; - /* 0x2AA */ s16 unk_2AA[8]; - /* 0x2BC */ f32 unk_2BC[8]; - /* 0x2DC */ f32 unk_2DC[8]; - /* 0x2FC */ s16 unk_2FC[4]; - /* 0x304 */ s16 unk_304; - /* 0x306 */ s16 unk_306; - /* 0x308 */ s16 unk_308; - /* 0x30A */ s16 unk_30A; - /* 0x30C */ s16 unk_30C; + /* 0x280 */ u8 minigameState; + /* 0x282 */ s16 minigameCountdownAlpha; + /* 0x284 */ s16 minigameCountdownScale; + /* 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 unk_30E; // "h_gauge" /* 0x30F */ u8 bButton; diff --git a/include/z64interface.h b/include/z64interface.h new file mode 100644 index 0000000000..4c27a25fc5 --- /dev/null +++ b/include/z64interface.h @@ -0,0 +1,41 @@ +#ifndef Z64INTERFACE_H +#define Z64INTERFACE_H + +#include "ultra64.h" + +typedef enum { + /* 0 */ MINIGAME_STATE_NONE, + /* 1 */ MINIGAME_STATE_COUNTDOWN_SETUP_3, + /* 2 */ MINIGAME_STATE_COUNTDOWN_3, + /* 3 */ MINIGAME_STATE_COUNTDOWN_SETUP_2, + /* 4 */ MINIGAME_STATE_COUNTDOWN_2, + /* 5 */ MINIGAME_STATE_COUNTDOWN_SETUP_1, + /* 6 */ MINIGAME_STATE_COUNTDOWN_1, + /* 7 */ MINIGAME_STATE_COUNTDOWN_SETUP_GO, + /* 8 */ MINIGAME_STATE_COUNTDOWN_GO, + /* 20 */ MINIGAME_STATE_NO_COUNTDOWN_SETUP = 20, + /* 21 */ MINIGAME_STATE_NO_COUNTDOWN, + /* 30 */ MINIGAME_STATE_PLAYING = 30 +} MinigameState; + +typedef enum { + /* 0 */ PERFECT_LETTERS_TYPE_OFF, + /* 1 */ PERFECT_LETTERS_TYPE_1, + /* 2 */ PERFECT_LETTERS_TYPE_2, + /* 3 */ PERFECT_LETTERS_TYPE_3 +} PerfectLettersType; + +typedef enum { + /* 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 +} PerfectLettersState; + +#define PERFECT_LETTERS_NUM_LETTERS 8 +#define PERFECT_LETTERS_ANGLE_PER_LETTER (0x10000 / PERFECT_LETTERS_NUM_LETTERS) + +#endif diff --git a/include/z64save.h b/include/z64save.h index 56468af67b..a742f6b0bc 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -105,6 +105,12 @@ typedef enum { /* 1 */ BOTTLE_TIMER_STATE_COUNTING } BottleTimerState; +typedef enum { + /* 0 */ MINIGAME_STATUS_INACTIVE, + /* 1 */ MINIGAME_STATUS_ACTIVE, + /* 3 */ MINIGAME_STATUS_END = 3 +} MinigameStatus; + typedef enum { /* 0 */ HUD_VISIBILITY_IDLE, /* 1 */ HUD_VISIBILITY_NONE, @@ -343,9 +349,9 @@ typedef struct SaveContext { /* 0x3F32 */ s16 magicToConsume; // accumulated magic that is requested to be consumed "magic_used" /* 0x3F34 */ s16 magicToAdd; // accumulated magic that is requested to be added "magic_recovery" /* 0x3F36 */ u16 mapIndex; // "scene_ID" - /* 0x3F38 */ u16 minigameState; // "yabusame_mode" + /* 0x3F38 */ u16 minigameStatus; // "yabusame_mode" /* 0x3F3A */ u16 minigameScore; // "yabusame_total" - /* 0x3F3C */ u16 unk_3F3C; // "yabusame_out_ct" + /* 0x3F3C */ u16 minigameHiddenScore; // "yabusame_out_ct" /* 0x3F3E */ u8 unk_3F3E; // "no_save" /* 0x3F3F */ u8 unk_3F3F; // "flash_flag" /* 0x3F40 */ SaveOptions options; diff --git a/src/code/z_camera.c b/src/code/z_camera.c index 3a5cde3956..f54fc93daf 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -1,4 +1,3 @@ -//#include "prevent_bss_reordering.h" #include "global.h" #include "z64quake.h" #include "z64shrink_window.h" diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index 79c50e9211..4e61639fb8 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -506,26 +506,324 @@ Gfx* Gfx_DrawTexQuad4b(Gfx* gfx, TexturePtr texture, s32 fmt, s16 textureWidth, return gfx; } -s16 D_801BFA04[] = { - -14, -14, -24, -8, -12, -12, -7, -8, -7, -8, -12, 0, -}; -s16 D_801BFA1C[] = { - 0x1C, 0x1C, 0x30, 0x10, 0x18, 0x18, 0x10, 0x10, 0x10, 0x10, 0x18, 0, -}; -s16 D_801BFA34[] = { - 14, 14, 8, 24, -82, -82, 58, 59, 58, 59, 32, 0, -}; -s16 D_801BFA4C[] = { - 0x1C, 0x1C, 0x10, 0x10, 0x18, 0x18, 0xB, 0xB, 0xB, 0xB, 0x20, 0, -}; -s16 D_801BFA64[] = { - -61, -45, 29, 104, -117, -42, 32, 55, -}; -s16 D_801BFA74[] = { - 1, -70, -99, -70, 71, 101, 72, 1, +// 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 + -8, // Three-Day Clock's Star (for the Minute Tracker) + -12, // Three-Day Clock's Sun (for the Day-Time Hours Tracker) + -12, // Three-Day Clock's Moon (for the Night-Time Hours Tracker) + -7, // Three-Day Clock's Hour Digit Above the Sun + -8, // Three-Day Clock's Hour Digit Above the Sun + -7, // Three-Day Clock's Hour Digit Above the Moon + -8, // Three-Day Clock's Hour Digit Above the Moon + -12, // Minigame Countdown Textures }; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010E028.s") +s16 sActionVtxWidths[ACTION_QUAD_BASE_COUNT] = { + 28, // A Button + 28, // A Button Background + 48, // A Button Do-Action + 16, // Three-Day Clock's Star (for the Minute Tracker) + 24, // Three-Day Clock's Sun (for the Day-Time Hours Tracker) + 24, // Three-Day Clock's Moon (for the Night-Time Hours Tracker) + 16, // Three-Day Clock's Hour Digit Above the Sun + 16, // Three-Day Clock's Hour Digit Above the Sun + 16, // Three-Day Clock's Hour Digit Above the Moon + 16, // Three-Day Clock's Hour Digit Above the Moon + 24, // Minigame Countdown Textures +}; + +s16 sActionVtxPosY[ACTION_QUAD_BASE_COUNT] = { + 14, // A Button + 14, // A Button Background + 8, // A Button Do-Action + 24, // Three-Day Clock's Star (for the Minute Tracker) + -82, // Three-Day Clock's Sun (for the Day-Time Hours Tracker) + -82, // Three-Day Clock's Moon (for the Night-Time Hours Tracker) + 58, // Three-Day Clock's Hour Digit Above the Sun + 59, // Three-Day Clock's Hour Digit Above the Sun + 58, // Three-Day Clock's Hour Digit Above the Moon + 59, // Three-Day Clock's Hour Digit Above the Moon + 32, // Minigame Countdown Textures +}; + +s16 sActionVtxHeights[ACTION_QUAD_BASE_COUNT] = { + 28, // A Button + 28, // A Button Background + 16, // A Button Do-Action + 16, // Three-Day Clock's Star (for the Minute Tracker) + 24, // Three-Day Clock's Sun (for the Day-Time Hours Tracker) + 24, // Three-Day Clock's Moon (for the Night-Time Hours Tracker) + 11, // Three-Day Clock's Hour Digit Above the Sun + 11, // Three-Day Clock's Hour Digit Above the Sun + 11, // Three-Day Clock's Hour Digit Above the Moon + 11, // Three-Day Clock's Hour Digit Above the Moon + 32, // Minigame Countdown Textures +}; + +#define PERFECT_LETTERS_VTX_WIDTH 32 +#define PERFECT_LETTERS_VTX_HEIGHT 33 + +// 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 + 104, // F + -117, // E + -42, // C + 32, // T + 55, // ! +}; + +s16 sPerfectLettersCenterY[PERFECT_LETTERS_NUM_LETTERS] = { + 1, // P + -70, // E + -99, // R + -70, // F + 71, // E + 101, // C + 72, // T + 1, // ! +}; + +/** + * interfaceCtx->actionVtx[0] -> A Button + * 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 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 + * interfaceCtx->actionVtx[44] -> Minigame Perfect Letter P Shadow + * interfaceCtx->actionVtx[48] -> Minigame Perfect Letter E Shadow + * interfaceCtx->actionVtx[52] -> Minigame Perfect Letter R Shadow + * interfaceCtx->actionVtx[56] -> Minigame Perfect Letter F Shadow + * interfaceCtx->actionVtx[60] -> Minigame Perfect Letter E Shadow + * interfaceCtx->actionVtx[64] -> Minigame Perfect Letter C Shadow + * interfaceCtx->actionVtx[68] -> Minigame Perfect Letter T Shadow + * interfaceCtx->actionVtx[72] -> Minigame Perfect Letter ! Shadow + * interfaceCtx->actionVtx[76] -> Minigame Perfect Letter P Colored + * interfaceCtx->actionVtx[80] -> Minigame Perfect Letter E Colored + * interfaceCtx->actionVtx[84] -> Minigame Perfect Letter R Colored + * interfaceCtx->actionVtx[88] -> Minigame Perfect Letter F Colored + * interfaceCtx->actionVtx[92] -> Minigame Perfect Letter E Colored + * interfaceCtx->actionVtx[96] -> Minigame Perfect Letter C Colored + * interfaceCtx->actionVtx[100] -> Minigame Perfect Letter T Colored + * interfaceCtx->actionVtx[104] -> Minigame Perfect Letter ! Colored + */ + +#define BEATING_HEART_VTX_X -8 +#define BEATING_HEART_VTX_Y -8 +#define BEATING_HEART_VTX_WIDTH 16 + +void Interface_SetVertices(PlayState* play) { + InterfaceContext* interfaceCtx = &play->interfaceCtx; + s16 i; + s16 j; + s16 k; + s16 shadowOffset; + + play->interfaceCtx.actionVtx = + GRAPH_ALLOC(play->state.gfxCtx, (ACTION_QUAD_BASE_COUNT + (2 * PERFECT_LETTERS_NUM_LETTERS)) * 4 * sizeof(Vtx)); + + // Loop over all non-minigame perfect vertices + // 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 + 0].v.ob[0] + sActionVtxWidths[k]; + + // Top vertices y Pos + 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 + 0].v.ob[1] - sActionVtxHeights[k]; + + // All vertices z Pos + 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 + 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 + 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] = sActionVtxWidths[k] << 5; + + // Bottom vertices texture coordinates + interfaceCtx->actionVtx[i + 2].v.tc[1] = interfaceCtx->actionVtx[i + 3].v.tc[1] = sActionVtxHeights[k] << 5; + + // Set color + 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 + 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 + 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 + 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; + } + + // A button right and top texture coordinates + interfaceCtx->actionVtx[1].v.tc[0] = interfaceCtx->actionVtx[3].v.tc[0] = interfaceCtx->actionVtx[2].v.tc[1] = + interfaceCtx->actionVtx[3].v.tc[1] = 32 << 5; + + // A button background right and top texture coordinates + interfaceCtx->actionVtx[5].v.tc[0] = interfaceCtx->actionVtx[7].v.tc[0] = interfaceCtx->actionVtx[6].v.tc[1] = + 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 (j = 0) and colored letters (j = 1) + for (j = 0, shadowOffset = 2; j < 2; j++, shadowOffset -= 2) { + // 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 + 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 + 0].v.ob[0] + PERFECT_LETTERS_VTX_WIDTH; + + // Top vertices y Pos + 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 + 0].v.ob[1] - PERFECT_LETTERS_VTX_HEIGHT; + + } else if ((interfaceCtx->perfectLettersType == PERFECT_LETTERS_TYPE_2) || + (interfaceCtx->perfectLettersType == PERFECT_LETTERS_TYPE_3)) { + // Left vertices x Pos + 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 + 0].v.ob[0] + PERFECT_LETTERS_VTX_WIDTH; + + // Top vertices y Pos + 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 + 0].v.ob[1] - PERFECT_LETTERS_VTX_HEIGHT; + + } else { + // Left vertices x Pos + 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 + 0].v.ob[0] + PERFECT_LETTERS_VTX_WIDTH; + + // Top vertices y Pos + 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 + 0].v.ob[1] - PERFECT_LETTERS_VTX_HEIGHT; + } + + // All vertices z Pos + 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 + 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 + 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] = PERFECT_LETTERS_VTX_WIDTH + << 5; + + // Bottom vertices texture coordinates + interfaceCtx->actionVtx[i + 2].v.tc[1] = interfaceCtx->actionVtx[i + 3].v.tc[1] = PERFECT_LETTERS_VTX_HEIGHT + << 5; + + // Set color + 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 + 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 + 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 + 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; + } + } + + // Beating Hearts Vertices + interfaceCtx->beatingHeartVtx = GRAPH_ALLOC(play->state.gfxCtx, 4 * sizeof(Vtx)); + + // Left vertices x Pos + interfaceCtx->beatingHeartVtx[0].v.ob[0] = interfaceCtx->beatingHeartVtx[2].v.ob[0] = BEATING_HEART_VTX_X; + + // Right vertices x Pos + interfaceCtx->beatingHeartVtx[1].v.ob[0] = interfaceCtx->beatingHeartVtx[3].v.ob[0] = + BEATING_HEART_VTX_X + BEATING_HEART_VTX_WIDTH; + + // Top vertices y Pos + interfaceCtx->beatingHeartVtx[0].v.ob[1] = interfaceCtx->beatingHeartVtx[1].v.ob[1] = + BEATING_HEART_VTX_Y + BEATING_HEART_VTX_WIDTH; + + // Bottom vertices y Pos + interfaceCtx->beatingHeartVtx[2].v.ob[1] = interfaceCtx->beatingHeartVtx[3].v.ob[1] = BEATING_HEART_VTX_Y; + + // All vertices z Pos + interfaceCtx->beatingHeartVtx[0].v.ob[2] = interfaceCtx->beatingHeartVtx[1].v.ob[2] = + interfaceCtx->beatingHeartVtx[2].v.ob[2] = interfaceCtx->beatingHeartVtx[3].v.ob[2] = 0; + + // unused flag + interfaceCtx->beatingHeartVtx[0].v.flag = interfaceCtx->beatingHeartVtx[1].v.flag = + interfaceCtx->beatingHeartVtx[2].v.flag = interfaceCtx->beatingHeartVtx[3].v.flag = 0; + + // Texture Coordinates + interfaceCtx->beatingHeartVtx[0].v.tc[0] = interfaceCtx->beatingHeartVtx[0].v.tc[1] = + interfaceCtx->beatingHeartVtx[1].v.tc[1] = interfaceCtx->beatingHeartVtx[2].v.tc[0] = 0; + interfaceCtx->beatingHeartVtx[1].v.tc[0] = interfaceCtx->beatingHeartVtx[2].v.tc[1] = + interfaceCtx->beatingHeartVtx[3].v.tc[0] = interfaceCtx->beatingHeartVtx[3].v.tc[1] = + BEATING_HEART_VTX_WIDTH << 5; + + // Set color + interfaceCtx->beatingHeartVtx[0].v.cn[0] = interfaceCtx->beatingHeartVtx[1].v.cn[0] = + interfaceCtx->beatingHeartVtx[2].v.cn[0] = interfaceCtx->beatingHeartVtx[3].v.cn[0] = + interfaceCtx->beatingHeartVtx[0].v.cn[1] = interfaceCtx->beatingHeartVtx[1].v.cn[1] = + interfaceCtx->beatingHeartVtx[2].v.cn[1] = interfaceCtx->beatingHeartVtx[3].v.cn[1] = + interfaceCtx->beatingHeartVtx[0].v.cn[2] = interfaceCtx->beatingHeartVtx[1].v.cn[2] = + interfaceCtx->beatingHeartVtx[2].v.cn[2] = interfaceCtx->beatingHeartVtx[3].v.cn[2] = + interfaceCtx->beatingHeartVtx[0].v.cn[3] = interfaceCtx->beatingHeartVtx[1].v.cn[3] = + interfaceCtx->beatingHeartVtx[2].v.cn[3] = interfaceCtx->beatingHeartVtx[3].v.cn[3] = + 255; +} s32 sPostmanTimerInputBtnAPressed = false; @@ -1409,7 +1707,18 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { #pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80112AF4.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80112AFC.s") +void Interface_InitMinigame(PlayState* play) { + InterfaceContext* interfaceCtx = &play->interfaceCtx; + + gSaveContext.minigameStatus = MINIGAME_STATUS_ACTIVE; + gSaveContext.minigameScore = 0; + gSaveContext.minigameHiddenScore = 0; + + sHBAScoreTier = 0; + interfaceCtx->minigamePoints = interfaceCtx->minigameHiddenPoints = interfaceCtx->minigameUnusedPoints = 0; + + interfaceCtx->minigameAmmo = 20; +} #pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Interface_LoadItemIconImpl.s") @@ -2826,49 +3135,556 @@ s16 D_801BFC40[] = { #pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80119610.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8011B4E0.s") +void Interface_SetPerfectLetters(PlayState* play, s16 perfectLettersType) { + InterfaceContext* interfaceCtx = &play->interfaceCtx; + s16 i; -u16 D_801BFC50[] = { - 0xC000, 0xE000, 0x0000, 0x2000, 0xA000, 0x8000, 0x6000, 0x4000, -}; -s16 D_801BFC60[][3] = { - 255, 255, 255, 255, 165, 55, + interfaceCtx->perfectLettersOn = true; + interfaceCtx->perfectLettersType = perfectLettersType; + + interfaceCtx->perfectLettersPrimColor[0] = 255; + interfaceCtx->perfectLettersPrimColor[1] = 165; + interfaceCtx->perfectLettersPrimColor[2] = 55; + interfaceCtx->perfectLettersPrimColor[3] = 255; + interfaceCtx->perfectLettersColorTimer = 20; + + interfaceCtx->perfectLettersColorIndex = 0; + interfaceCtx->perfectLettersCount = 1; + interfaceCtx->perfectLettersTimer = 0; + + 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->perfectLettersSemiAxisY[i] = 200.0f; + interfaceCtx->perfectLettersSemiAxisX[i] = 200.0f; + } + } + interfaceCtx->perfectLettersState[0] = PERFECT_LETTERS_STATE_INIT; +} + +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, // ! }; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8011B5C0.s") - -s16 D_801BFC6C[] = { - 78, 54, 29, 5, -18, -42, -67, -85, -}; -s16 D_801BFC7C[] = { - 180, 180, 180, 180, -180, -180, -180, -180, -}; -s16 D_801BFC8C[2][3] = { +s16 sPerfectLettersType1PrimColorTargets[2][3] = { { 255, 255, 255 }, { 255, 165, 55 }, }; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8011B9E0.s") +void Interface_UpdatePerfectLettersType1(PlayState* play) { + InterfaceContext* interfaceCtx = &play->interfaceCtx; + s16 i; + s16 count; + s16 colorStepR; + s16 colorStepG; + s16 colorStepB; -s16 D_801BFC98[] = { - 78, 54, 29, 5, -18, -42, -67, -85, + // Update letter positions + 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->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 `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->perfectLettersSemiAxisX[interfaceCtx->perfectLettersCount] = 140.0f; + interfaceCtx->perfectLettersSemiAxisY[interfaceCtx->perfectLettersCount] = 100.0f; + interfaceCtx->perfectLettersAngles[interfaceCtx->perfectLettersCount] = + sPerfectLettersType1OffScreenAngles[interfaceCtx->perfectLettersCount] + 0xA000; + + interfaceCtx->perfectLettersCount++; + } + + // Update letter colors + if ((interfaceCtx->perfectLettersCount == PERFECT_LETTERS_NUM_LETTERS) && + (interfaceCtx->perfectLettersState[PERFECT_LETTERS_NUM_LETTERS - 1] == PERFECT_LETTERS_STATE_STATIONARY)) { + + 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->perfectLettersPrimColor[0] >= + sPerfectLettersType1PrimColorTargets[interfaceCtx->perfectLettersColorIndex][0]) { + interfaceCtx->perfectLettersPrimColor[0] -= colorStepR; + } else { + interfaceCtx->perfectLettersPrimColor[0] += colorStepR; + } + + if (interfaceCtx->perfectLettersPrimColor[1] >= + sPerfectLettersType1PrimColorTargets[interfaceCtx->perfectLettersColorIndex][1]) { + interfaceCtx->perfectLettersPrimColor[1] -= colorStepG; + } else { + interfaceCtx->perfectLettersPrimColor[1] += colorStepG; + } + + if (interfaceCtx->perfectLettersPrimColor[2] >= + sPerfectLettersType1PrimColorTargets[interfaceCtx->perfectLettersColorIndex][2]) { + interfaceCtx->perfectLettersPrimColor[2] -= colorStepB; + } else { + interfaceCtx->perfectLettersPrimColor[2] += colorStepB; + } + + 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_SPREAD; + } + } + } + } + + for (count = 0, i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) { + if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_OFF) { + count++; + } + } + + if (count == PERFECT_LETTERS_NUM_LETTERS) { + interfaceCtx->perfectLettersOn = false; + } +} + +// Targets to offset each letter to properly spell "PERFECT!" +s16 sPerfectLettersType2SpellingOffsetsX[PERFECT_LETTERS_NUM_LETTERS] = { + 78, // P + 54, // E + 29, // R + 5, // F + -18, // E + -42, // C + -67, // T + -85, // ! }; -u16 D_801BFCA8[] = { - 0xC000, 0xE000, 0x0000, 0x2000, 0xA000, 0x8000, 0x6000, 0x4000, + +// Targets to offset each letter to sweep horizontally offscreen +s16 sPerfectLettersType2OffScreenOffsetsX[PERFECT_LETTERS_NUM_LETTERS] = { + 180, // P (offscreen left) + 180, // E (offscreen left) + 180, // R (offscreen left) + 180, // F (offscreen left) + -180, // E (offscreen right) + -180, // C (offscreen right) + -180, // T (offscreen right) + -180, // ! (offscreen right) }; -s16 D_801BFCB8[2][3] = { + +s16 sPerfectLettersType2PrimColorTargets[2][3] = { { 255, 255, 255 }, { 255, 165, 55 }, }; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8011BF70.s") +void Interface_UpdatePerfectLettersType2(PlayState* play) { + s16 i; + InterfaceContext* interfaceCtx = &play->interfaceCtx; + s16 colorStepR; + s16 colorStepG; + s16 colorStepB; + s16 colorStepA; + s16 j = 0; // unused incrementer -TexturePtr D_801BFCC4[] = { - gMinigameLetterPTex, gMinigameLetterETex, gMinigameLetterRTex, gMinigameLetterFTex, - gMinigameLetterETex, gMinigameLetterCTex, gMinigameLetterTTex, gMinigameExclamationTex, + // Update letter positions + 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->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->perfectLettersSemiAxisX[i] <= 0.0f) { + // The letter has reached the center of the screen + interfaceCtx->perfectLettersSemiAxisY[i] = 0.0f; + interfaceCtx->perfectLettersSemiAxisX[i] = 0.0f; + interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_STATIONARY; + + if (i == (PERFECT_LETTERS_NUM_LETTERS - 1)) { + // The last letter has reached the center of the screen + 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->perfectLettersState[i] == PERFECT_LETTERS_STATE_SPREAD) { + // Spread out the letters horizontally from the center to the spelt-out word + colorStepR = ABS_ALT(interfaceCtx->perfectLettersOffsetX[i] - sPerfectLettersType2SpellingOffsetsX[i]) / + interfaceCtx->perfectLettersColorTimer; + if (interfaceCtx->perfectLettersOffsetX[i] >= sPerfectLettersType2SpellingOffsetsX[i]) { + interfaceCtx->perfectLettersOffsetX[i] -= colorStepR; + } else { + interfaceCtx->perfectLettersOffsetX[i] += colorStepR; + } + } 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->perfectLettersOffsetX[i] - sPerfectLettersType2OffScreenOffsetsX[i]) / + interfaceCtx->perfectLettersColorTimer; + if (interfaceCtx->perfectLettersOffsetX[i] >= sPerfectLettersType2OffScreenOffsetsX[i]) { + interfaceCtx->perfectLettersOffsetX[i] -= colorStepR; + } else { + interfaceCtx->perfectLettersOffsetX[i] += colorStepR; + } + } + } + + 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->perfectLettersColorTimer--; + if (interfaceCtx->perfectLettersColorTimer == 0) { + + 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->perfectLettersColorTimer = 20; + } else { + for (i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) { + interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_OFF; + } + interfaceCtx->perfectLettersOn = false; + } + } + } + + // Initialize the next letter in the list + 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->perfectLettersCount == PERFECT_LETTERS_NUM_LETTERS) { + if (interfaceCtx->perfectLettersState[PERFECT_LETTERS_NUM_LETTERS - 1] == PERFECT_LETTERS_STATE_DISPLAY) { + + 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->perfectLettersPrimColor[0] >= + sPerfectLettersType2PrimColorTargets[interfaceCtx->perfectLettersColorIndex][0]) { + interfaceCtx->perfectLettersPrimColor[0] -= colorStepR; + } else { + interfaceCtx->perfectLettersPrimColor[0] += colorStepR; + } + + if (interfaceCtx->perfectLettersPrimColor[1] >= + sPerfectLettersType2PrimColorTargets[interfaceCtx->perfectLettersColorIndex][1]) { + interfaceCtx->perfectLettersPrimColor[1] -= colorStepG; + } else { + interfaceCtx->perfectLettersPrimColor[1] += colorStepG; + } + + if (interfaceCtx->perfectLettersPrimColor[2] >= + sPerfectLettersType2PrimColorTargets[interfaceCtx->perfectLettersColorIndex][2]) { + interfaceCtx->perfectLettersPrimColor[2] -= colorStepB; + } else { + interfaceCtx->perfectLettersPrimColor[2] += colorStepB; + } + + 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->perfectLettersColorTimer = 5; + } + } + } + } +} + +// Targets to offset each letter to properly spell "PERFECT!" +s16 sPerfectLettersType3SpellingOffsetsX[PERFECT_LETTERS_NUM_LETTERS] = { + 78, // P + 54, // E + 29, // R + 5, // F + -18, // E + -42, // C + -67, // T + -85, // ! }; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8011C4C4.s") +// 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 sPerfectLettersType3PrimColorTargets[2][3] = { + { 255, 255, 255 }, + { 255, 165, 55 }, +}; + +void Interface_UpdatePerfectLettersType3(PlayState* play) { + s16 i; + InterfaceContext* interfaceCtx = &play->interfaceCtx; + s16 colorStepR; + s16 colorStepG; + s16 colorStepB; + s16 j = 0; + + // Update letter positions + 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->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->perfectLettersSemiAxisX[i] <= 0.0f) { + // The letter has reached the center of the screen + interfaceCtx->perfectLettersSemiAxisY[i] = 0.0f; + interfaceCtx->perfectLettersSemiAxisX[i] = 0.0f; + interfaceCtx->perfectLettersState[i] = PERFECT_LETTERS_STATE_STATIONARY; + + if (i == (PERFECT_LETTERS_NUM_LETTERS - 1)) { + // The last letter has reached the center of the screen + 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->perfectLettersState[i] == PERFECT_LETTERS_STATE_SPREAD) { + // Spread out the letters horizontally from the center to the spelt-out word + colorStepR = ABS_ALT(interfaceCtx->perfectLettersOffsetX[i] - sPerfectLettersType3SpellingOffsetsX[i]) / + interfaceCtx->perfectLettersColorTimer; + if (interfaceCtx->perfectLettersOffsetX[i] >= sPerfectLettersType3SpellingOffsetsX[i]) { + interfaceCtx->perfectLettersOffsetX[i] -= colorStepR; + } else { + interfaceCtx->perfectLettersOffsetX[i] += colorStepR; + } + } 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->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->perfectLettersColorTimer = 20; + } + } + + // Initialize the next letter in the list + 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->perfectLettersCount == PERFECT_LETTERS_NUM_LETTERS) && + (interfaceCtx->perfectLettersState[PERFECT_LETTERS_NUM_LETTERS - 1] == PERFECT_LETTERS_STATE_DISPLAY)) { + + 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->perfectLettersPrimColor[0] >= + sPerfectLettersType3PrimColorTargets[interfaceCtx->perfectLettersColorIndex][0]) { + interfaceCtx->perfectLettersPrimColor[0] -= colorStepR; + } else { + interfaceCtx->perfectLettersPrimColor[0] += colorStepR; + } + + if (interfaceCtx->perfectLettersPrimColor[1] >= + sPerfectLettersType3PrimColorTargets[interfaceCtx->perfectLettersColorIndex][1]) { + interfaceCtx->perfectLettersPrimColor[1] -= colorStepG; + } else { + interfaceCtx->perfectLettersPrimColor[1] += colorStepG; + } + + if (interfaceCtx->perfectLettersPrimColor[2] >= + sPerfectLettersType3PrimColorTargets[interfaceCtx->perfectLettersColorIndex][2]) { + interfaceCtx->perfectLettersPrimColor[2] -= colorStepB; + } else { + interfaceCtx->perfectLettersPrimColor[2] += colorStepB; + } + + 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->perfectLettersColorTimer = 5; + } + } + } + + j = 0; + for (i = 0; i < PERFECT_LETTERS_NUM_LETTERS; i++) { + if (interfaceCtx->perfectLettersState[i] == PERFECT_LETTERS_STATE_OFF) { + j++; + } + } + + if (j == PERFECT_LETTERS_NUM_LETTERS) { + interfaceCtx->perfectLettersOn = false; + } +} + +TexturePtr sPerfectLettersTextures[] = { + gPerfectLetterPTex, gPerfectLetterETex, gPerfectLetterRTex, gPerfectLetterFTex, + gPerfectLetterETex, gPerfectLetterCTex, gPerfectLetterTTex, gPerfectLetterExclamationTex, +}; + +void Interface_DrawPerfectLetters(PlayState* play) { + InterfaceContext* interfaceCtx = &play->interfaceCtx; + f32 letterX; + f32 letterY; + s16 i; + s16 vtxOffset; + + OPEN_DISPS(play->state.gfxCtx); + + func_8012C8D4(play->state.gfxCtx); + + gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + 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 < PERFECT_LETTERS_NUM_LETTERS; vtxOffset += 4, i++) { + if (interfaceCtx->perfectLettersState[i] != PERFECT_LETTERS_STATE_OFF) { + + // 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->perfectLettersPrimColor[3]); + + Matrix_Translate(letterX, letterY, 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[44 + vtxOffset], 4, 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->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); + + 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, sPerfectLettersTextures[i], 4, 32, 33, 0); + } + } + + CLOSE_DISPS(play->state.gfxCtx); +} void Interface_StartMoonCrash(PlayState* play) { if (play->actorCtx.flags & ACTORCTX_FLAG_1) { @@ -3005,7 +3821,7 @@ void Interface_DrawTimers(PlayState* play) { case TIMER_STATE_START: case TIMER_STATE_ALT_START: sTimerStateTimer = 20; - if (interfaceCtx->unk_280 != 0) { + if (interfaceCtx->minigameState != MINIGAME_STATE_NONE) { // Set the timer position gSaveContext.timerX[sTimerId] = 26; @@ -3018,7 +3834,8 @@ void Interface_DrawTimers(PlayState* play) { gSaveContext.timerY[sTimerId] = 46; } - if ((interfaceCtx->unk_280 == 8) || (interfaceCtx->unk_280 == 30)) { + if ((interfaceCtx->minigameState == MINIGAME_STATE_COUNTDOWN_GO) || + (interfaceCtx->minigameState == MINIGAME_STATE_PLAYING)) { if (gSaveContext.timerStates[sTimerId] == TIMER_STATE_START) { gSaveContext.timerStates[sTimerId] = TIMER_STATE_COUNTING; } else { @@ -3150,7 +3967,7 @@ void Interface_DrawTimers(PlayState* play) { OSTIME_TO_TIMER(osTime - ((void)0, gSaveContext.timerStartOsTimes[sTimerId]) - ((void)0, gSaveContext.timerPausedOsTimes[sTimerId])); - if ((gSaveContext.minigameState == 1) && + if ((gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) && (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0))) { if (gSaveContext.timerStopTimes[sTimerId] >= SECONDS_TO_TIMER(120)) { gSaveContext.timerStopTimes[sTimerId] = SECONDS_TO_TIMER(120); @@ -3261,7 +4078,8 @@ void Interface_DrawTimers(PlayState* play) { osTime = SECONDS_TO_TIMER(0); } - if ((gSaveContext.minigameState == 1) && (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0))) { + if ((gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) && + (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0))) { if (osTime >= SECONDS_TO_TIMER(120)) { osTime = SECONDS_TO_TIMER(120); } @@ -3276,7 +4094,8 @@ void Interface_DrawTimers(PlayState* play) { Interface_GetTimerDigits(osTime, sTimerDigits); // Use seconds to determine when to beep - if ((gSaveContext.minigameState == 1) && (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0))) { + if ((gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) && + (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0))) { if ((gSaveContext.timerCurTimes[sTimerId] > SECONDS_TO_TIMER(110)) && (sTimerBeepSfxSeconds != sTimerDigits[4])) { play_sound(NA_SE_SY_WARNING_COUNT_E); @@ -3313,7 +4132,7 @@ void Interface_DrawTimers(PlayState* play) { } else { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, 255); } - } else if ((gSaveContext.minigameState == 1) && + } else if ((gSaveContext.minigameStatus == 1) && (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0))) { if (gSaveContext.timerCurTimes[sTimerId] >= SECONDS_TO_TIMER(110)) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 50, 0, 255); @@ -3447,7 +4266,121 @@ void Interface_UpdateBottleTimers(PlayState* play) { } } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8011E730.s") +void Interface_DrawMinigameIcons(PlayState* play) { + InterfaceContext* interfaceCtx = &play->interfaceCtx; + s16 i; + s16 numDigitsDrawn; + s16 rectX; + s16 rectY; + s16 width; + s16 height; + + OPEN_DISPS(play->state.gfxCtx); + + func_8012C654(play->state.gfxCtx); + + if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) { + // Carrots rendering if the action corresponds to riding a horse + if (interfaceCtx->unk_212 == 8) { + // Load Carrot Icon + gDPLoadTextureBlock(OVERLAY_DISP++, gCarrotIconTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 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); + + rectX = 110; + rectY = (interfaceCtx->minigameState != MINIGAME_STATE_NONE) ? 200 : 56; + + // Draw 6 carrots + for (i = 1; i < 7; i++, rectX += 16) { + // Carrot Color (based on availability) + if ((interfaceCtx->numHorseBoosts == 0) || (interfaceCtx->numHorseBoosts < i)) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 150, 255, interfaceCtx->aAlpha); + } else { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->aAlpha); + } + + gSPTextureRectangle(OVERLAY_DISP++, rectX << 2, rectY << 2, (rectX + 16) << 2, (rectY + 16) << 2, + G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + } + } + + if (gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) { + gDPPipeSync(OVERLAY_DISP++); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + width = 24; + height = 16; + rectX = 20; + if (gSaveContext.save.playerData.healthCapacity > 0xA0) { + rectY = 75; // two rows of hearts + } else { + rectY = 67; // one row of hearts + } + + if (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 1)) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->bAlpha); + gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255); + gDPLoadTextureBlock(OVERLAY_DISP++, gBeaverRingIconTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 24, 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); + } else if (play->sceneId == SCENE_DOUJOU) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 140, 50, interfaceCtx->bAlpha); + gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255); + gDPLoadTextureBlock(OVERLAY_DISP++, gSwordTrainingLogIconTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 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); + } else if (play->sceneId == SCENE_30GYOSON) { + width = 16; + height = 30; + rectX = 24; + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 100, 75, interfaceCtx->bAlpha); + gDPSetEnvColor(OVERLAY_DISP++, 55, 55, 0, 255); + gDPLoadTextureBlock(OVERLAY_DISP++, gFishermanMinigameTorchIconTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 30, 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); + } else { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->bAlpha); + gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255); + gDPLoadTextureBlock(OVERLAY_DISP++, gArcheryScoreIconTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 24, 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); + } + + gSPTextureRectangle(OVERLAY_DISP++, (rectX << 2), (rectY << 2), ((rectX + width) << 2), + ((rectY + height) << 2), G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->bAlpha); + gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, + 0, PRIMITIVE, 0); + + if (play->sceneId == SCENE_30GYOSON) { + rectX += 20; + if (gSaveContext.save.playerData.healthCapacity > 0xA0) { + rectY = 87; // two rows of hearts + } else { + rectY = 79; // one row of hearts + } + } else { + rectX += 26; + } + + for (i = 0, numDigitsDrawn = 0; i < 4; i++) { + if ((sMinigameScoreDigits[i] != 0) || (numDigitsDrawn != 0) || (i >= 3)) { + OVERLAY_DISP = + Gfx_DrawTexRectI8(OVERLAY_DISP, ((u8*)gCounterDigit0Tex + (8 * 16 * sMinigameScoreDigits[i])), + 8, 0x10, rectX, rectY - 2, 9, 0xFA, 0x370, 0x370); + rectX += 9; + numDigitsDrawn++; + } + } + + gDPPipeSync(OVERLAY_DISP++); + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + } + } + + CLOSE_DISPS(play->state.gfxCtx); +} // rupeeDigitsFirst s16 D_801BFD1C[] = { 1, 0, 0, 0 }; @@ -3492,7 +4425,7 @@ TexturePtr D_801BFD8C[] = { gStoryGiantsLeavingTLUT, }; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8011F0E0.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Interface_Draw.s") #pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80120F90.s") @@ -3502,11 +4435,11 @@ u8 D_801BFD94 = 0; s16 D_801BFD98 = 0; s16 D_801BFD9C = 0; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_801210E0.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Interface_Update.s") void Interface_Destroy(PlayState* play) { Map_Destroy(play); func_80174F9C(Interface_PostmanTimerCallback, NULL); } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80121FC4.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Interface_Init.s") 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 0f267dccbb..2ef547b485 100644 --- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c +++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c @@ -342,7 +342,7 @@ void BgIngate_Init(Actor* thisx, PlayState* play2) { if (play->curSpawn == 6) { func_80953F14(this, play); if (CHECK_EVENTINF(EVENTINF_35)) { - func_80112AFC(play); + Interface_InitMinigame(play); } else { SET_EVENTINF(EVENTINF_41); } diff --git a/src/overlays/actors/ovl_En_Az/z_en_az.c b/src/overlays/actors/ovl_En_Az/z_en_az.c index 0a5056b1fb..bfefb5a857 100644 --- a/src/overlays/actors/ovl_En_Az/z_en_az.c +++ b/src/overlays/actors/ovl_En_Az/z_en_az.c @@ -1482,9 +1482,9 @@ void func_80A97D5C(EnAz* this, PlayState* play) { Player* player = GET_PLAYER(play); player->stateFlags1 |= PLAYER_STATE1_20; - func_80112AFC(play); + Interface_InitMinigame(play); gSaveContext.minigameScore = (this->unk_374 & 2) ? 25 : 20; - play->interfaceCtx.unk_280 = 1; + play->interfaceCtx.minigameState = MINIGAME_STATE_COUNTDOWN_SETUP_3; if ((this->unk_2FA == 1) || (this->unk_2FA == 3)) { Interface_StartTimer(TIMER_ID_MINIGAME_2, 120); } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_25_01)) { @@ -1498,7 +1498,7 @@ void func_80A97D5C(EnAz* this, PlayState* play) { void func_80A97E48(EnAz* this, PlayState* play) { Player* player = GET_PLAYER(play); - if (play->interfaceCtx.unk_280 >= 8) { + if (play->interfaceCtx.minigameState >= MINIGAME_STATE_COUNTDOWN_GO) { player->stateFlags1 &= ~PLAYER_STATE1_20; func_80A97EAC(this, play); } 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 a3d76fab70..041cadaa76 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); - func_8011B4E0(play, 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.unk_286 == 0)) { + if ((this->unk_54A == 3) && !play->interfaceCtx.perfectLettersOn) { this->unk_54A = 2; D_80964C24 = 1; } diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c index 2c7eec6072..5ffc364c34 100644 --- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -875,7 +875,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) { EnHorse_InitCutscene(this, play); } else if (thisx->params == ENHORSE_10) { EnHorse_InitHorsebackArchery(this); - func_80112AFC(play); + Interface_InitMinigame(play); } else if (thisx->params == ENHORSE_14) { func_808846F0(this, play); if ((play->sceneId == SCENE_LOST_WOODS) && !Cutscene_IsPlaying(play)) { @@ -2917,22 +2917,23 @@ void EnHorse_UpdateHorsebackArchery(EnHorse* this, PlayState* play) { EnHorse_PlayWalkingSound(this); } - if (play->interfaceCtx.hbaAmmo == 0) { + if (play->interfaceCtx.minigameAmmo == 0) { this->hbaTimer++; } sp28 = Audio_IsSequencePlaying(NA_BGM_HORSE_GOAL); EnHorse_UpdateHbaRaceInfo(this, play, &sHbaInfo); - if (((this->hbaFlags & 1) || (this->hbaTimer > 45)) && (sp28 != 1) && (gSaveContext.minigameState != 3)) { + if (((this->hbaFlags & 1) || (this->hbaTimer > 45)) && (sp28 != 1) && + (gSaveContext.minigameStatus != MINIGAME_STATUS_END)) { gSaveContext.save.cutscene = 0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_64; } - if (play->interfaceCtx.hbaAmmo) {} + if (play->interfaceCtx.minigameAmmo) {} - if (((play->interfaceCtx.hbaAmmo == 0) || (this->hbaFlags & 2)) && (this->hbaFlags & 4)) { + if (((play->interfaceCtx.minigameAmmo == 0) || (this->hbaFlags & 2)) && (this->hbaFlags & 4)) { this->hbaFlags &= ~4; Audio_QueueSeqCmd(0x8041); } 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 b2e745cadd..5299dbaa1a 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 @@ -122,7 +122,7 @@ s32 func_808F8CCC(EnHorseGameCheck* this, PlayState* play2) { } Interface_StartTimer(TIMER_ID_MINIGAME_2, 0); - play->interfaceCtx.unk_280 = 1; + play->interfaceCtx.minigameState = MINIGAME_STATE_COUNTDOWN_SETUP_3; this->horse1 = (EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1149.0f, -106.0f, 470.0f, 0, 0x7FFF, 0, ENHORSE_PARAMS(ENHORSE_PARAM_BANDIT, ENHORSE_4)); @@ -212,10 +212,10 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) { if ((this->unk_168 > 50) && !(this->unk_164 & 2)) { this->unk_164 |= 2; - } else if ((play->interfaceCtx.unk_280 >= 8) && !(this->unk_164 & 1)) { + } else if ((play->interfaceCtx.minigameState >= MINIGAME_STATE_COUNTDOWN_GO) && !(this->unk_164 & 1)) { this->unk_164 |= 1; horse->inRace = true; - } else if ((play->interfaceCtx.unk_280 >= 8) && !(this->unk_164 & 8)) { + } else if ((play->interfaceCtx.minigameState >= MINIGAME_STATE_COUNTDOWN_GO) && !(this->unk_164 & 8)) { EnHorse* horse = this->horse1; horse->inRace = true; diff --git a/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c b/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c index 9bafd7ea60..03cc41f20e 100644 --- a/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c +++ b/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c @@ -94,7 +94,7 @@ s32 EnJcMato_CheckForHit(EnJcMato* this, PlayState* play) { if ((this->collider.base.acFlags & AC_HIT) && !this->hitFlag && (this->actor.colChkInfo.damageEffect == 0xF)) { this->collider.base.acFlags &= ~AC_HIT; Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR); - play->interfaceCtx.unk_25C = 1; + play->interfaceCtx.minigamePoints = 1; this->hitFlag = true; return 1; } else { diff --git a/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c b/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c index 8e82716588..92e918c5df 100644 --- a/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c +++ b/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c @@ -284,8 +284,8 @@ void func_80C1410C(EnJgameTsn* this, PlayState* play) { player->stateFlags1 |= PLAYER_STATE1_20; func_801A2BB8(0x25); - play->interfaceCtx.unk_280 = 1; - func_80112AFC(play); + play->interfaceCtx.minigameState = MINIGAME_STATE_COUNTDOWN_SETUP_3; + Interface_InitMinigame(play); SET_WEEKEVENTREG(WEEKEVENTREG_90_20); Interface_StartTimer(TIMER_ID_MINIGAME_2, 120); this->actionFunc = func_80C1418C; @@ -294,7 +294,7 @@ void func_80C1410C(EnJgameTsn* this, PlayState* play) { void func_80C1418C(EnJgameTsn* this, PlayState* play) { Player* player = GET_PLAYER(play); - if (play->interfaceCtx.unk_280 == 8) { + if (play->interfaceCtx.minigameState == MINIGAME_STATE_COUNTDOWN_GO) { func_80C141DC(this); player->stateFlags1 &= ~PLAYER_STATE1_20; } @@ -478,7 +478,7 @@ void func_80C147B4(EnJgameTsn* this, PlayState* play) { case 0x10A0: case 0x10A1: func_801477B4(play); - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_STOP; CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_20); func_80C144E4(this); @@ -563,14 +563,14 @@ s32 func_80C14BCC(EnJgameTsn* this, PlayState* play) { if (phi_s3 == this->unk_218) { Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR); *this->unk_208[phi_s3] |= OBJLUPYGAMELIFT_DISPLAY_CORRECT; - play->interfaceCtx.unk_25C = 1; + play->interfaceCtx.minigamePoints = 1; return true; } if (*this->unk_208[phi_s3] & OBJLUPYGAMELIFT_IGNITE_FIRE) { Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR); *this->unk_208[phi_s3] |= OBJLUPYGAMELIFT_DISPLAY_CORRECT; - play->interfaceCtx.unk_25C = 1; + play->interfaceCtx.minigamePoints = 1; } else { *this->unk_208[phi_s3] |= OBJLUPYGAMELIFT_DISPLAY_INCORRECT; Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_ERROR); diff --git a/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c b/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c index 7a28cf0fc3..c02b00b5aa 100644 --- a/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c +++ b/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c @@ -297,14 +297,14 @@ void func_80B269A4(EnKendoJs* this, PlayState* play) { case 0x273B: func_801477B4(play); - func_80112AFC(play); + Interface_InitMinigame(play); player->stateFlags1 |= PLAYER_STATE1_20; func_80B273D0(this); break; case 0x272D: func_801477B4(play); - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; func_80B276C4(this); func_80B276D8(this, play); break; @@ -334,7 +334,7 @@ void func_80B26AFC(EnKendoJs* this, PlayState* play) { } if ((this->unk_288 == 0x272E) || (this->unk_288 == 0x272F) || (this->unk_288 == 0x2730)) { - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; } player->stateFlags1 &= ~PLAYER_STATE1_20; @@ -625,14 +625,14 @@ void func_80B274BC(EnKendoJs* this, PlayState* play) { if (this->unk_28E == 1) { if ((player->meleeWeaponAnimation == PLAYER_MWA_JUMPSLASH_START) || (player->meleeWeaponAnimation == PLAYER_MWA_JUMPSLASH_FINISH)) { - play->interfaceCtx.unk_25C = 3; + play->interfaceCtx.minigamePoints = 3; if (gSaveContext.minigameScore >= 27) { player->stateFlags1 |= PLAYER_STATE1_20; } } else if (player->meleeWeaponAnimation == PLAYER_MWA_STAB_1H) { - play->interfaceCtx.unk_25C = 2; + play->interfaceCtx.minigamePoints = 2; } else { - play->interfaceCtx.unk_25C = 1; + play->interfaceCtx.minigamePoints = 1; } Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR); this->unk_28E = 0; diff --git a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c index efe7546625..93f33cfeda 100644 --- a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c +++ b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c @@ -688,10 +688,10 @@ void EnMa4_HorsebackGameTalking(EnMa4* this, PlayState* play) { void EnMa4_InitHorsebackGame(EnMa4* this, PlayState* play) { Player* player = GET_PLAYER(play); - play->interfaceCtx.unk_280 = 1; + play->interfaceCtx.minigameState = MINIGAME_STATE_COUNTDOWN_SETUP_3; Interface_StartTimer(TIMER_ID_MINIGAME_2, 0); SET_WEEKEVENTREG(WEEKEVENTREG_08_01); - func_80112AFC(play); + Interface_InitMinigame(play); player->stateFlags1 |= PLAYER_STATE1_20; this->actionFunc = EnMa4_SetupHorsebackGameWait; } @@ -699,7 +699,7 @@ void EnMa4_InitHorsebackGame(EnMa4* this, PlayState* play) { void EnMa4_SetupHorsebackGameWait(EnMa4* this, PlayState* play) { Player* player = GET_PLAYER(play); - if (play->interfaceCtx.unk_280 == 8) { + if (play->interfaceCtx.minigameState == MINIGAME_STATE_COUNTDOWN_GO) { this->actionFunc = EnMa4_HorsebackGameWait; player->stateFlags1 &= ~PLAYER_STATE1_20; } @@ -714,7 +714,7 @@ void EnMa4_HorsebackGameWait(EnMa4* this, PlayState* play) { if (this->poppedBalloonCounter != D_80AC0258) { D_80AC0258 = this->poppedBalloonCounter; - play->interfaceCtx.unk_25C = 1; + play->interfaceCtx.minigamePoints = 1; } if ((gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] >= SECONDS_TO_TIMER(120)) || diff --git a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c index 8d6b75fbdd..a077ee1bf7 100644 --- a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c +++ b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c @@ -315,11 +315,11 @@ void EnMttag_RaceStart(EnMttag* this, PlayState* play) { } else { if (DECR(this->timer) == 60) { Interface_StartTimer(TIMER_ID_MINIGAME_2, 0); - play->interfaceCtx.unk_280 = 1; + play->interfaceCtx.minigameState = MINIGAME_STATE_COUNTDOWN_SETUP_3; Audio_QueueSeqCmd(NA_BGM_GORON_RACE | 0x8000); play->envCtx.unk_E4 = 0xFE; player->stateFlags1 &= ~PLAYER_STATE1_20; - } else if ((this->timer < 60) && (play->interfaceCtx.unk_280 == 8)) { + } else if ((this->timer < 60) && (play->interfaceCtx.minigameState == MINIGAME_STATE_COUNTDOWN_GO)) { this->timer = 0; SET_EVENTINF(EVENTINF_10); this->actionFunc = EnMttag_Race; diff --git a/src/overlays/actors/ovl_En_Ot/z_en_ot.c b/src/overlays/actors/ovl_En_Ot/z_en_ot.c index 928d4e5783..e2490bb8dc 100644 --- a/src/overlays/actors/ovl_En_Ot/z_en_ot.c +++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.c @@ -59,9 +59,9 @@ EnOtUnkStruct* func_80B5DF58(EnOtUnkStruct* arg0, u8 arg1, Vec3f* arg2, Vec3s* a void func_80B5E078(PlayState* play, EnOtUnkStruct* arg1, s32 arg2); void func_80B5E1D8(PlayState* play, EnOtUnkStruct* arg1, s32 arg2); -static EnOt* D_80B5E880; -static EnOt* D_80B5E884; -static EnOt* D_80B5E888; +EnOt* D_80B5E880; +EnOt* D_80B5E884; +EnOt* D_80B5E888; ActorInit En_Ot_InitVars = { ACTOR_EN_OT, 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 3234941735..759e97206c 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 @@ -334,7 +334,7 @@ void EnSyatekiMan_Swamp_HandleChoice(EnSyatekiMan* this, PlayState* play) { Message_StartTextbox(play, 0xA31, &this->actor); this->prevTextId = 0xA31; if (this->shootingGameState == SG_GAME_STATE_ONE_MORE_GAME) { - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; } this->shootingGameState = SG_GAME_STATE_NOT_PLAYING; @@ -373,7 +373,7 @@ void EnSyatekiMan_Swamp_HandleChoice(EnSyatekiMan* this, PlayState* play) { } if (this->shootingGameState == SG_GAME_STATE_ONE_MORE_GAME) { - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; } this->shootingGameState = SG_GAME_STATE_NOT_PLAYING; @@ -399,8 +399,8 @@ void EnSyatekiMan_Swamp_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) play->msgCtx.msgMode = 0x43; play->msgCtx.stateTimer = 4; player->actor.freezeTimer = 0; - func_80112AFC(play); - play->interfaceCtx.hbaAmmo = 80; + Interface_InitMinigame(play); + play->interfaceCtx.minigameAmmo = 80; func_80123F2C(play, 80); this->shootingGameState = SG_GAME_STATE_RUNNING; this->actionFunc = EnSyatekiMan_Swamp_StartGame; @@ -414,7 +414,7 @@ void EnSyatekiMan_Swamp_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01); CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02); this->actionFunc = EnSyatekiMan_Swamp_Idle; - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; this->shootingGameState = SG_GAME_STATE_NONE; } else { // Wanna play again? @@ -434,7 +434,7 @@ void EnSyatekiMan_Swamp_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) play->msgCtx.msgMode = 0x43; play->msgCtx.stateTimer = 4; player->actor.freezeTimer = 0; - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; player->stateFlags1 |= PLAYER_STATE1_20; this->actionFunc = EnSyatekiMan_Swamp_SetupGiveReward; EnSyatekiMan_Swamp_SetupGiveReward(this, play); @@ -641,7 +641,7 @@ void EnSyatekiMan_Town_HandleChoice(EnSyatekiMan* this, PlayState* play) { if (this->shootingGameState == SG_GAME_STATE_ONE_MORE_GAME) { player->stateFlags3 &= ~PLAYER_STATE3_400; - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; } this->shootingGameState = SG_GAME_STATE_NOT_PLAYING; @@ -677,7 +677,7 @@ void EnSyatekiMan_Town_HandleChoice(EnSyatekiMan* this, PlayState* play) { if (this->shootingGameState == SG_GAME_STATE_ONE_MORE_GAME) { player->stateFlags3 &= ~PLAYER_STATE3_400; - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; } this->shootingGameState = SG_GAME_STATE_NOT_PLAYING; @@ -759,7 +759,7 @@ void EnSyatekiMan_Town_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) play->msgCtx.stateTimer = 4; player->actor.freezeTimer = 0; this->flagsIndex = 0; - func_80112AFC(play); + Interface_InitMinigame(play); func_80123F2C(play, 0x63); this->shootingGameState = SG_GAME_STATE_RUNNING; func_801A2BB8(NA_BGM_TIMED_MINI_GAME); @@ -808,7 +808,7 @@ void EnSyatekiMan_Town_HandleNormalMessage(EnSyatekiMan* this, PlayState* play) play->msgCtx.msgMode = 0x43; play->msgCtx.stateTimer = 4; player->actor.freezeTimer = 0; - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; this->actionFunc = EnSyatekiMan_Town_SetupGiveReward; EnSyatekiMan_Town_SetupGiveReward(this, play); break; @@ -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) { - func_8011B4E0(play, 2); + Interface_SetPerfectLetters(play, PERFECT_LETTERS_TYPE_2); gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_6; this->actionFunc = EnSyatekiMan_Swamp_AddBonusPoints; } else { @@ -1122,7 +1122,7 @@ void EnSyatekiMan_Swamp_EndGame(EnSyatekiMan* this, PlayState* play) { CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_01); CLEAR_WEEKEVENTREG(WEEKEVENTREG_63_02); this->shootingGameState = SG_GAME_STATE_NONE; - gSaveContext.minigameState = 3; + gSaveContext.minigameStatus = MINIGAME_STATUS_END; this->actionFunc = EnSyatekiMan_Swamp_Idle; return; } @@ -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.unk_286 == 0) { + 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; @@ -1166,7 +1166,7 @@ void EnSyatekiMan_Swamp_AddBonusPoints(EnSyatekiMan* this, PlayState* play) { sBonusTimer = 0; } else if (sBonusTimer > 10) { gSaveContext.timerStopTimes[TIMER_ID_MINIGAME_1] += SECONDS_TO_TIMER(1); - play->interfaceCtx.unk_25C += 10; + play->interfaceCtx.minigamePoints += 10; this->score += 10; Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR); sBonusTimer = 0; @@ -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); - func_8011B4E0(play, 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.unk_286 == 0)) { + 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_Syateki_Okuta/z_en_syateki_okuta.c b/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c index 5358d44cf5..162a6d7182 100644 --- a/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c +++ b/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c @@ -370,7 +370,7 @@ void EnSyatekiOkuta_Update(Actor* thisx, PlayState* play) { syatekiMan = (EnSyatekiMan*)this->actor.parent; if (this->unk_2A6 == 1) { Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR); - play->interfaceCtx.unk_25C++; + play->interfaceCtx.minigamePoints++; syatekiMan->score++; syatekiMan->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_RED; } else { diff --git a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c index d90b83a570..e51af14ae7 100644 --- a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c +++ b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c @@ -185,7 +185,7 @@ s32 func_80B761FC(EnTruMt* this, PlayState* play) { this->unk_3A4 = 0; Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOUME_DAMAGE2); } - play->interfaceCtx.unk_25E = 1; + play->interfaceCtx.minigameHiddenPoints = 1; Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 25); return true; } @@ -342,7 +342,7 @@ void func_80B76924(EnTruMt* this) { void func_80B76980(EnTruMt* this, PlayState* play) { Player* player = GET_PLAYER(play); - if (gSaveContext.unk_3F3C >= 10) { + if (gSaveContext.minigameHiddenScore >= 10) { Message_StartTextbox(play, 0x87F, &this->actor); SET_EVENTINF(EVENTINF_36); SET_EVENTINF(EVENTINF_40); diff --git a/src/overlays/actors/ovl_En_Twig/z_en_twig.c b/src/overlays/actors/ovl_En_Twig/z_en_twig.c index 31af7f8b6c..5843357ee8 100644 --- a/src/overlays/actors/ovl_En_Twig/z_en_twig.c +++ b/src/overlays/actors/ovl_En_Twig/z_en_twig.c @@ -198,7 +198,7 @@ void func_80AC0D2C(EnTwig* this, PlayState* play) { (s32)(Rand_ZeroOne() * 10.0f) + 20); } play_sound(NA_SE_SY_GET_ITEM); - play->interfaceCtx.unk_25C--; + play->interfaceCtx.minigamePoints--; sRingNotCollected[RACERING_GET_PARAM_FE0(&this->dyna.actor)] = true; if (sCurrentRing == RACERING_GET_PARAM_FE0(&this->dyna.actor)) { s32 i; diff --git a/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c b/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c index 1ec1ab41d5..bf21a87416 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c +++ b/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c @@ -92,6 +92,6 @@ void EffectSsExtra_Update(PlayState* play, u32 index, EffectSs* this) { } if (this->rTimer == 1) { - play->interfaceCtx.unk_25C = sScores[this->rScoreIndex]; + play->interfaceCtx.minigamePoints = sScores[this->rScoreIndex]; } } diff --git a/src/overlays/gamestates/ovl_select/z_select.c b/src/overlays/gamestates/ovl_select/z_select.c index 3699f22cd1..461192d485 100644 --- a/src/overlays/gamestates/ovl_select/z_select.c +++ b/src/overlays/gamestates/ovl_select/z_select.c @@ -517,7 +517,7 @@ void MapSelect_UpdateMenu(MapSelectState* this) { gSaveContext.timerStopTimes[i] = SECONDS_TO_TIMER(0); gSaveContext.timerPausedOsTimes[i] = 0; } - gSaveContext.minigameState = 0; + gSaveContext.minigameStatus = MINIGAME_STATUS_INACTIVE; if (this->scenes[this->currentScene].loadFunc != NULL) { this->scenes[this->currentScene].loadFunc(this, this->scenes[this->currentScene].entrance, this->opt); diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 94d2bd0599..ddc6a12958 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -2092,7 +2092,7 @@ 0x8010D9F4:("Gfx_DrawTexRect4b",), 0x8010DC58:("Gfx_DrawTexQuadIA8",), 0x8010DE38:("Gfx_DrawTexQuad4b",), - 0x8010E028:("func_8010E028",), + 0x8010E028:("Interface_SetVertices",), 0x8010E968:("Interface_PostmanTimerCallback",), 0x8010E9F0:("Interface_StartTimer",), 0x8010EA9C:("Interface_StartPostmanTimer",), @@ -2108,7 +2108,7 @@ 0x80111CB4:("func_80111CB4",), 0x801129E4:("func_801129E4",), 0x80112AF4:("func_80112AF4",), - 0x80112AFC:("func_80112AFC",), + 0x80112AFC:("Interface_InitMinigame",), 0x80112B40:("Interface_LoadItemIconImpl",), 0x80112BE4:("Interface_LoadItemIcon",), 0x80112C0C:("func_80112C0C",), @@ -2151,22 +2151,22 @@ 0x80118BA4:("func_80118BA4",), 0x80119030:("func_80119030",), 0x80119610:("func_80119610",), - 0x8011B4E0:("func_8011B4E0",), - 0x8011B5C0:("func_8011B5C0",), - 0x8011B9E0:("func_8011B9E0",), - 0x8011BF70:("func_8011BF70",), - 0x8011C4C4:("func_8011C4C4",), + 0x8011B4E0:("Interface_SetPerfectLetters",), + 0x8011B5C0:("Interface_UpdatePerfectLettersType1",), + 0x8011B9E0:("Interface_UpdatePerfectLettersType2",), + 0x8011BF70:("Interface_UpdatePerfectLettersType3",), + 0x8011C4C4:("Interface_DrawPerfectLetters",), 0x8011C808:("Interface_StartMoonCrash",), 0x8011C898:("Interface_GetTimerDigits",), 0x8011CA64:("Interface_DrawTimers",), 0x8011E3B4:("Interface_UpdateBottleTimers",), - 0x8011E730:("func_8011E730",), - 0x8011F0E0:("func_8011F0E0",), + 0x8011E730:("Interface_DrawMinigameIcons",), + 0x8011F0E0:("Interface_Draw",), 0x80120F90:("func_80120F90",), 0x80121064:("func_80121064",), - 0x801210E0:("func_801210E0",), + 0x801210E0:("Interface_Update",), 0x80121F94:("Interface_Destroy",), - 0x80121FC4:("func_80121FC4",), + 0x80121FC4:("Interface_Init",), 0x801224E0:("Path_GetByIndex",), 0x80122524:("Path_OrientAndGetDistSq",), 0x801225CC:("Path_CopyLastPoint",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index b91d5471f7..14d2a9ffa7 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -1119,12 +1119,12 @@ 0x801BF9F8:("sFinalHoursClockFrameEnvBlue","UNK_TYPE2","",0x2), 0x801BF9FC:("sFinalHoursClockColorTimer","UNK_TYPE2","",0x2), 0x801BFA00:("sFinalHoursClockColorTargetIndex","UNK_TYPE2","",0x2), - 0x801BFA04:("D_801BFA04","UNK_TYPE2","",0x2), - 0x801BFA1C:("D_801BFA1C","UNK_TYPE2","",0x2), - 0x801BFA34:("D_801BFA34","UNK_TYPE2","",0x2), - 0x801BFA4C:("D_801BFA4C","UNK_TYPE2","",0x2), - 0x801BFA64:("D_801BFA64","UNK_TYPE2","",0x2), - 0x801BFA74:("D_801BFA74","UNK_TYPE2","",0x2), + 0x801BFA04:("sActionVtxPosX","UNK_TYPE2","",0x2), + 0x801BFA1C:("sActionVtxWidths","UNK_TYPE2","",0x2), + 0x801BFA34:("sActionVtxPosY","UNK_TYPE2","",0x2), + 0x801BFA4C:("sActionVtxHeights","UNK_TYPE2","",0x2), + 0x801BFA64:("sPerfectLettersCenterX","UNK_TYPE2","",0x2), + 0x801BFA74:("sPerfectLettersCenterY","UNK_TYPE2","",0x2), 0x801BFA84:("sPostmanTimerInputBtnAPressed","UNK_TYPE4","",0x4), 0x801BFAB0:("sDoActionTextures","UNK_TYPE1","",0x1), 0x801BFAB8:("magicBorderColors","UNK_TYPE1","",0x1), @@ -1164,15 +1164,15 @@ 0x801BFC10:("D_801BFC10","UNK_TYPE1","",0x1), 0x801BFC14:("D_801BFC14","UNK_TYPE1","",0x1), 0x801BFC40:("D_801BFC40","UNK_TYPE1","",0x1), - 0x801BFC50:("D_801BFC50","UNK_TYPE2","",0x2), - 0x801BFC60:("D_801BFC60","s16","[6]",0xC), - 0x801BFC6C:("D_801BFC6C","UNK_TYPE4","",0x4), - 0x801BFC7C:("D_801BFC7C","UNK_TYPE2","",0x2), - 0x801BFC8C:("D_801BFC8C","UNK_TYPE1","",0x1), - 0x801BFC98:("D_801BFC98","UNK_TYPE2","",0x2), - 0x801BFCA8:("D_801BFCA8","UNK_TYPE2","",0x2), - 0x801BFCB8:("D_801BFCB8","UNK_TYPE1","",0x1), - 0x801BFCC4:("D_801BFCC4","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 d7e86937e7..33f6b62e21 100755 --- a/tools/namefixer.py +++ b/tools/namefixer.py @@ -499,6 +499,8 @@ wordReplace = { "func_80169E6C": "Play_SetupRespawnPoint", "func_8016A0AC": "Play_IsUnderwater", "func_801690CC": "Play_InCsMode", + "func_8011B4E0": "Interface_SetPerfectLetters", + "func_80112AFC": "Interface_InitMinigame", "func_8010E9F0": "Interface_StartTimer", "func_8010EA9C": "Interface_StartPostmanTimer", "func_80121F94": "Interface_Destroy", @@ -714,6 +716,8 @@ wordReplace = { "gSaveContext.sceneSetupIndex": "gSaveContext.sceneLayer", "gSaveContext.seqIndex": "gSaveContext.seqId", "gSaveContext.nightSeqIndex": "gSaveContext.ambienceId", + "gSaveContext.minigameState": "gSaveContext.minigameStatus", + "gSaveContext.unk_3F3C": "gSaveContext.minigameHiddenScore", "player->unk_A87": "player->exchangeItemId", "player->leftHandActor": "player->heldActor", @@ -754,6 +758,11 @@ wordReplace = { "globalCtx->interfaceCtx.unk_21E": "play->interfaceCtx.bButtonDoAction", "play->interfaceCtx.unk_31A": "play->interfaceCtx.storyState", "play->interfaceCtx.unk_31B": "play->interfaceCtx.storyType", + "play->interfaceCtx.unk_25C": "play->interfaceCtx.minigamePoints", + "play->interfaceCtx.unk_25E": "play->interfaceCtx.minigameHiddenPoints", + "play->interfaceCtx.unk_280": "play->interfaceCtx.minigameState", + "play->interfaceCtx.unk_286": "play->interfaceCtx.perfectLettersOn", + "play->interfaceCtx.hbaAmmo": "play->interfaceCtx.minigameAmmo", # "play->actorCtx.flags": "play->actorCtx.sceneFlags", # "play->actorCtx.unk5": "play->actorCtx.flags", diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index 6b3273c934..a27d1651d2 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -1606,7 +1606,7 @@ asm/non_matchings/code/z_parameter/Gfx_DrawTexRectI8.s,Gfx_DrawTexRectI8,0x8010D asm/non_matchings/code/z_parameter/Gfx_DrawTexRect4b.s,Gfx_DrawTexRect4b,0x8010D9F4,0x99 asm/non_matchings/code/z_parameter/Gfx_DrawTexQuadIA8.s,Gfx_DrawTexQuadIA8,0x8010DC58,0x78 asm/non_matchings/code/z_parameter/Gfx_DrawTexQuad4b.s,Gfx_DrawTexQuad4b,0x8010DE38,0x7C -asm/non_matchings/code/z_parameter/func_8010E028.s,func_8010E028,0x8010E028,0x250 +asm/non_matchings/code/z_parameter/Interface_SetVertices.s,Interface_SetVertices,0x8010E028,0x250 asm/non_matchings/code/z_parameter/Interface_PostmanTimerCallback.s,Interface_PostmanTimerCallback,0x8010E968,0x22 asm/non_matchings/code/z_parameter/Interface_StartTimer.s,Interface_StartTimer,0x8010E9F0,0x2B asm/non_matchings/code/z_parameter/Interface_StartPostmanTimer.s,Interface_StartPostmanTimer,0x8010EA9C,0x2D @@ -1622,7 +1622,7 @@ asm/non_matchings/code/z_parameter/func_80110038.s,func_80110038,0x80110038,0x71 asm/non_matchings/code/z_parameter/func_80111CB4.s,func_80111CB4,0x80111CB4,0x34C asm/non_matchings/code/z_parameter/func_801129E4.s,func_801129E4,0x801129E4,0x44 asm/non_matchings/code/z_parameter/func_80112AF4.s,func_80112AF4,0x80112AF4,0x2 -asm/non_matchings/code/z_parameter/func_80112AFC.s,func_80112AFC,0x80112AFC,0x11 +asm/non_matchings/code/z_parameter/Interface_InitMinigame.s,Interface_InitMinigame,0x80112AFC,0x11 asm/non_matchings/code/z_parameter/Interface_LoadItemIconImpl.s,Interface_LoadItemIconImpl,0x80112B40,0x29 asm/non_matchings/code/z_parameter/Interface_LoadItemIcon.s,Interface_LoadItemIcon,0x80112BE4,0xA asm/non_matchings/code/z_parameter/func_80112C0C.s,func_80112C0C,0x80112C0C,0x9D @@ -1665,22 +1665,22 @@ asm/non_matchings/code/z_parameter/func_80118890.s,func_80118890,0x80118890,0xC5 asm/non_matchings/code/z_parameter/func_80118BA4.s,func_80118BA4,0x80118BA4,0x123 asm/non_matchings/code/z_parameter/func_80119030.s,func_80119030,0x80119030,0x178 asm/non_matchings/code/z_parameter/func_80119610.s,func_80119610,0x80119610,0x7B4 -asm/non_matchings/code/z_parameter/func_8011B4E0.s,func_8011B4E0,0x8011B4E0,0x38 -asm/non_matchings/code/z_parameter/func_8011B5C0.s,func_8011B5C0,0x8011B5C0,0x108 -asm/non_matchings/code/z_parameter/func_8011B9E0.s,func_8011B9E0,0x8011B9E0,0x164 -asm/non_matchings/code/z_parameter/func_8011BF70.s,func_8011BF70,0x8011BF70,0x155 -asm/non_matchings/code/z_parameter/func_8011C4C4.s,func_8011C4C4,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 asm/non_matchings/code/z_parameter/Interface_UpdateBottleTimers.s,Interface_UpdateBottleTimers,0x8011E3B4,0xDF -asm/non_matchings/code/z_parameter/func_8011E730.s,func_8011E730,0x8011E730,0x26C -asm/non_matchings/code/z_parameter/func_8011F0E0.s,func_8011F0E0,0x8011F0E0,0x7AC +asm/non_matchings/code/z_parameter/Interface_DrawMinigameIcons.s,Interface_DrawMinigameIcons,0x8011E730,0x26C +asm/non_matchings/code/z_parameter/Interface_Draw.s,Interface_Draw,0x8011F0E0,0x7AC asm/non_matchings/code/z_parameter/func_80120F90.s,func_80120F90,0x80120F90,0x35 asm/non_matchings/code/z_parameter/func_80121064.s,func_80121064,0x80121064,0x1F -asm/non_matchings/code/z_parameter/func_801210E0.s,func_801210E0,0x801210E0,0x3AD +asm/non_matchings/code/z_parameter/Interface_Update.s,Interface_Update,0x801210E0,0x3AD asm/non_matchings/code/z_parameter/Interface_Destroy.s,Interface_Destroy,0x80121F94,0xC -asm/non_matchings/code/z_parameter/func_80121FC4.s,func_80121FC4,0x80121FC4,0x147 +asm/non_matchings/code/z_parameter/Interface_Init.s,Interface_Init,0x80121FC4,0x147 asm/non_matchings/code/z_path/func_801224E0.s,func_801224E0,0x801224E0,0x11 asm/non_matchings/code/z_path/func_80122524.s,func_80122524,0x80122524,0x2A asm/non_matchings/code/z_path/func_801225CC.s,func_801225CC,0x801225CC,0x25