diff --git a/include/regs.h b/include/regs.h index 61f1ad6426e..6f8f887f85d 100644 --- a/include/regs.h +++ b/include/regs.h @@ -120,6 +120,7 @@ #define R_EPONAS_SONG_PLAYED DREG(53) #define R_MAGIC_FILL_COLOR(i) ZREG(0 + (i)) #define R_PAUSE_PAGE_SWITCH_FRAME_ADVANCE_ON ZREG(13) +#define R_PAUSE_CURSOR_L_R_SELECTED_PRIM_TIMER ZREG(28) #define R_C_BTN_COLOR(i) ZREG(39 + (i)) #define R_B_BTN_COLOR(i) ZREG(43 + (i)) #if OOT_NTSC @@ -186,12 +187,19 @@ #define R_B_LABEL_DD WREG(0) #define R_PAUSE_PAGES_Y_ORIGIN_2 WREG(2) // Complements PauseContext.pagesYOrigin1 #define R_PAUSE_DEPTH_OFFSET WREG(3) // Offset position of all pages away from the camera +#define R_PAUSE_UI_ANIM_ALPHA_ADD_DURATION WREG(4) +#define R_PAUSE_UI_ANIMS_DURATION WREG(6) #if OOT_NTSC #define R_B_LABEL_SCALE(i) WREG(8 + (i)) #define R_B_LABEL_X(i) WREG(10 + (i)) #define R_B_LABEL_Y(i) WREG(12 + (i)) #define R_A_LABEL_Z(i) WREG(14 + (i)) #endif +#define R_PAUSE_CURSOR_LEFT_X WREG(16) +#define R_PAUSE_CURSOR_RIGHT_X WREG(17) +#define R_PAUSE_CURSOR_LEFT_RIGHT_Y WREG(18) +#define R_PAUSE_CURSOR_LEFT_MOVE_OFFSET_X WREG(25) +#define R_PAUSE_CURSOR_RIGHT_MOVE_OFFSET_X WREG(26) #define R_OW_MINIMAP_X WREG(29) #define R_OW_MINIMAP_Y WREG(30) #define R_MINIMAP_DISABLED WREG(31) @@ -209,6 +217,8 @@ #endif #define R_DGN_MINIMAP_X WREG(68) #define R_DGN_MINIMAP_Y WREG(69) +#define R_PAUSE_NAME_DISPLAY_TIMER_MAX_ WREG(88) +#define R_PAUSE_NAME_DISPLAY_TIMER_THRESHOLD_ WREG(89) #define R_TEXTBOX_X VREG(0) #define R_TEXTBOX_Y VREG(1) #define R_TEXTBOX_CLEF_XPOS VREG(7) diff --git a/include/z64pause.h b/include/z64pause.h index e21b2458f99..785f97c37c2 100644 --- a/include/z64pause.h +++ b/include/z64pause.h @@ -50,6 +50,8 @@ typedef enum PauseMenuPage { #define PAUSE_EQUIP_PLAYER_WIDTH 64 #define PAUSE_EQUIP_PLAYER_HEIGHT 112 +#define PAUSE_EQUIP_PLAYER_FRAG_HEIGHT (TMEM_SIZE / (PAUSE_EQUIP_PLAYER_WIDTH * G_IM_SIZ_16b_BYTES)) +#define PAUSE_EQUIP_PLAYER_FRAG_NUM (((PAUSE_EQUIP_PLAYER_HEIGHT - 1) / PAUSE_EQUIP_PLAYER_FRAG_HEIGHT) + 1) #define PAUSE_EQUIP_BUFFER_SIZE sizeof(u16[PAUSE_EQUIP_PLAYER_HEIGHT][PAUSE_EQUIP_PLAYER_WIDTH]) #define PAUSE_PLAYER_SEGMENT_GAMEPLAY_KEEP_BUFFER_SIZE 0x5000 @@ -92,7 +94,7 @@ typedef enum PauseMainState { /* 4 */ PAUSE_MAIN_STATE_SONG_PROMPT_INIT, // Start the prompt for the player to play the song. /* 5 */ PAUSE_MAIN_STATE_SONG_PROMPT, // Waiting for the player to play the song. /* 6 */ PAUSE_MAIN_STATE_SONG_PROMPT_DONE, // The song prompt is done, the player either played the song successfully or made a mistake. - /* 7 */ PAUSE_MAIN_STATE_7, + /* 7 */ PAUSE_MAIN_STATE_EQUIP_CHANGED, /* 8 */ PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG, // Like PAUSE_MAIN_STATE_IDLE, but the quest page is active and the cursor is positioned on a song. /* 9 */ PAUSE_MAIN_STATE_SONG_PLAYBACK_START // Start playing the song back to the player. } PauseMainState; diff --git a/src/code/z_construct.c b/src/code/z_construct.c index 374665d3856..897f1425876 100644 --- a/src/code/z_construct.c +++ b/src/code/z_construct.c @@ -341,7 +341,7 @@ void Regs_InitDataImpl(void) { ZREG(25) = 4; ZREG(26) = 20; ZREG(27) = 10; - ZREG(28) = 20; + R_PAUSE_CURSOR_L_R_SELECTED_PRIM_TIMER = 20; ZREG(29) = 4; ZREG(30) = 20; ZREG(31) = 10; @@ -507,9 +507,9 @@ void Regs_InitDataImpl(void) { XREG(95) = 200; R_PAUSE_PAGES_Y_ORIGIN_2 = -6080; R_PAUSE_DEPTH_OFFSET = 9355; - WREG(4) = 8; + R_PAUSE_UI_ANIM_ALPHA_ADD_DURATION = 8; WREG(5) = 3; - WREG(6) = 8; + R_PAUSE_UI_ANIMS_DURATION = 8; WREG(7) = 0; #if OOT_NTSC @@ -533,17 +533,17 @@ void Regs_InitDataImpl(void) { WREG(15) = -350; #endif - WREG(16) = -175; - WREG(17) = 155; - WREG(18) = 10; + R_PAUSE_CURSOR_LEFT_X = -175; + R_PAUSE_CURSOR_RIGHT_X = 155; + R_PAUSE_CURSOR_LEFT_RIGHT_Y = 10; WREG(19) = 10; WREG(20) = -50; WREG(21) = -54; WREG(22) = -32; WREG(23) = -38; WREG(24) = -36; - WREG(25) = 40; - WREG(26) = -40; + R_PAUSE_CURSOR_LEFT_MOVE_OFFSET_X = 40; + R_PAUSE_CURSOR_RIGHT_MOVE_OFFSET_X = -40; WREG(27) = 0; WREG(28) = 0; R_OW_MINIMAP_X = 238; @@ -590,8 +590,8 @@ void Regs_InitDataImpl(void) { R_DGN_MINIMAP_X = 204; R_DGN_MINIMAP_Y = 140; WREG(87) = 80; - WREG(88) = 70; - WREG(89) = 40; + R_PAUSE_NAME_DISPLAY_TIMER_MAX_ = 70; + R_PAUSE_NAME_DISPLAY_TIMER_THRESHOLD_ = 40; WREG(90) = 320; WREG(91) = 40; WREG(92) = 3; diff --git a/src/code/z_debug.c b/src/code/z_debug.c index 8feacf15e14..aa63ed02c0f 100644 --- a/src/code/z_debug.c +++ b/src/code/z_debug.c @@ -1,5 +1,7 @@ #include "global.h" +#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0" + typedef struct DebugCamTextBufferEntry { /* 0x0 */ u8 x; /* 0x1 */ u8 y; diff --git a/src/code/z_kaleido_setup.c b/src/code/z_kaleido_setup.c index 990b1c0405c..61122b72a28 100644 --- a/src/code/z_kaleido_setup.c +++ b/src/code/z_kaleido_setup.c @@ -79,8 +79,8 @@ void KaleidoSetup_Update(PlayState* play) { // The start button was pressed, pause gSaveContext.prevHudVisibilityMode = gSaveContext.hudVisibilityMode; - WREG(16) = -175; - WREG(17) = 155; + R_PAUSE_CURSOR_LEFT_X = -175; + R_PAUSE_CURSOR_RIGHT_X = 155; pauseCtx->pageSwitchTimer = 0; @@ -130,8 +130,11 @@ void KaleidoSetup_Init(PlayState* play) { pauseCtx->state = PAUSE_STATE_OFF; pauseCtx->debugState = 0; + // Setting the eye xz here is irrelevant, it's set on pausing in KaleidoSetup_Update + // x = -PAUSE_EYE_DIST * PAUSE_ITEM_X pauseCtx->eye.x = pauseCtx->eye.y = 0.0f; - pauseCtx->eye.z = 64.0f; + pauseCtx->eye.z = -PAUSE_EYE_DIST * PAUSE_ITEM_Z; + pauseCtx->promptDepthOffset = 936.0f; pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch = pauseCtx->questPagePitch = 160.0f; @@ -154,8 +157,8 @@ void KaleidoSetup_Init(PlayState* play) { pauseCtx->cursorY[PAUSE_MAP] = 0; pauseCtx->cursorX[PAUSE_QUEST] = 0; pauseCtx->cursorY[PAUSE_QUEST] = 0; - pauseCtx->cursorX[PAUSE_EQUIP] = 1; - pauseCtx->cursorY[PAUSE_EQUIP] = 0; + pauseCtx->cursorX[PAUSE_EQUIP] = EQUIP_VALUE_SWORD_KOKIRI; + pauseCtx->cursorY[PAUSE_EQUIP] = EQUIP_TYPE_SWORD; pauseCtx->cursorItem[PAUSE_ITEM] = PAUSE_ITEM_NONE; pauseCtx->cursorItem[PAUSE_MAP] = VREG(30) + 3; diff --git a/src/overlays/actors/ovl_En_Mag/z_en_mag.c b/src/overlays/actors/ovl_En_Mag/z_en_mag.c index 6d992e457f8..fcf7aec8a6f 100644 --- a/src/overlays/actors/ovl_En_Mag/z_en_mag.c +++ b/src/overlays/actors/ovl_En_Mag/z_en_mag.c @@ -82,9 +82,9 @@ void EnMag_Init(Actor* thisx, PlayState* play) { this->fadeOutAlphaStep = 10; VREG(19) = 99; - VREG(21) = 9; - VREG(23) = 10; - VREG(24) = 8; + R_PAUSE_SONG_OCA_BTN_Y(OCARINA_BTN_A) = 9; + R_PAUSE_SONG_OCA_BTN_Y(OCARINA_BTN_C_RIGHT) = 10; + R_PAUSE_SONG_OCA_BTN_Y(OCARINA_BTN_C_LEFT) = 8; this->effectScroll = 0; this->unk_E30C = 0; diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c index 4828f726ebd..26ba15dccce 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c @@ -283,10 +283,15 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { KaleidoScope_SetCursorPos(pauseCtx, cursor * 4, pauseCtx->questVtx); + // Handle part of the ocarina songs playback + if ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) && (pauseCtx->cursorSpecialPos == 0)) { if ((cursor >= QUEST_SONG_MINUET) && (cursor < QUEST_KOKIRI_EMERALD)) { if (CHECK_QUEST_ITEM(pauseCtx->cursorPoint[PAUSE_QUEST])) { + // The cursor is on a learned song + // Set some things up for song playback + cursor = pauseCtx->cursorSlot[PAUSE_QUEST]; pauseCtx->ocarinaSongIdx = gOcarinaSongItemMap[cursor - QUEST_SONG_MINUET]; sPlaybackSongStartDelayTimer = 10; @@ -297,6 +302,9 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { } sPlayedSongBtnsNum = 0; + // Have the player play a song, immediately cancelled below + // Also clear the playback staff + // This has no purpose (?) AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); AudioOcarina_Start((1 << pauseCtx->ocarinaSongIdx) + 0x8000); pauseCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); @@ -311,6 +319,7 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG; + // Stop having the player play a song as done above AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); } } diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 33c98159c95..daf2c4931a7 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -2,18 +2,60 @@ #include "assets/textures/icon_item_static/icon_item_static.h" #include "assets/textures/parameter_static/parameter_static.h" -static u8 sChildUpgrades[] = { UPG_BULLET_BAG, UPG_BOMB_BAG, UPG_STRENGTH, UPG_SCALE }; -static u8 sAdultUpgrades[] = { UPG_QUIVER, UPG_BOMB_BAG, UPG_STRENGTH, UPG_SCALE }; +static u8 sChildUpgrades[] = { + UPG_BULLET_BAG, // EQUIP_QUAD_UPG_BULLETBAG_QUIVER + UPG_BOMB_BAG, // EQUIP_QUAD_UPG_BOMB_BAG + UPG_STRENGTH, // EQUIP_QUAD_UPG_STRENGTH + UPG_SCALE, // EQUIP_QUAD_UPG_SCALE +}; +static u8 sAdultUpgrades[] = { + UPG_QUIVER, // EQUIP_QUAD_UPG_BULLETBAG_QUIVER + UPG_BOMB_BAG, // EQUIP_QUAD_UPG_BOMB_BAG + UPG_STRENGTH, // EQUIP_QUAD_UPG_STRENGTH + UPG_SCALE, // EQUIP_QUAD_UPG_SCALE +}; -static u8 sChildUpgradeItemBases[] = { ITEM_BULLET_BAG_30, ITEM_BOMB_BAG_20, ITEM_STRENGTH_GORONS_BRACELET, - ITEM_SCALE_SILVER }; -static u8 sAdultUpgradeItemBases[] = { ITEM_QUIVER_30, ITEM_BOMB_BAG_20, ITEM_STRENGTH_GORONS_BRACELET, - ITEM_SCALE_SILVER }; +static u8 sChildUpgradeItemBases[] = { + ITEM_BULLET_BAG_30, // EQUIP_QUAD_UPG_BULLETBAG_QUIVER + ITEM_BOMB_BAG_20, // EQUIP_QUAD_UPG_BOMB_BAG + ITEM_STRENGTH_GORONS_BRACELET, // EQUIP_QUAD_UPG_STRENGTH + ITEM_SCALE_SILVER, // EQUIP_QUAD_UPG_SCALE +}; +static u8 sAdultUpgradeItemBases[] = { + ITEM_QUIVER_30, // EQUIP_QUAD_UPG_BULLETBAG_QUIVER + ITEM_BOMB_BAG_20, // EQUIP_QUAD_UPG_BOMB_BAG + ITEM_STRENGTH_GORONS_BRACELET, // EQUIP_QUAD_UPG_STRENGTH + ITEM_SCALE_SILVER, // EQUIP_QUAD_UPG_SCALE +}; -static u8 sUpgradeItemOffsets[] = { 0x00, 0x03, 0x06, 0x09 }; +static u8 sUpgradeItemOffsets[] = { + 0, // unused + ITEM_BOMB_BAG_20 - ITEM_QUIVER_30, // UPG_BOMB_BAG + ITEM_STRENGTH_GORONS_BRACELET - ITEM_QUIVER_30, // UPG_STRENGTH + ITEM_SCALE_SILVER - ITEM_QUIVER_30, // UPG_SCALE +}; static u8 sEquipmentItemOffsets[] = { - 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x00, 0x06, 0x07, 0x08, 0x00, 0x09, 0x0A, 0x0B, + // EQUIP_TYPE_SWORD + 0, // unused + ITEM_SWORD_KOKIRI - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_SWORD_KOKIRI + ITEM_SWORD_MASTER - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_SWORD_MASTER + ITEM_SWORD_BIGGORON - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_SWORD_BIGGORON + // EQUIP_TYPE_SHIELD + 0, // unused + ITEM_SHIELD_DEKU - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_SHIELD_DEKU + ITEM_SHIELD_HYLIAN - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_SHIELD_HYLIAN + ITEM_SHIELD_MIRROR - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_SHIELD_MIRROR + // EQUIP_TYPE_TUNIC + 0, // unused + ITEM_TUNIC_KOKIRI - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_TUNIC_KOKIRI + ITEM_TUNIC_GORON - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_TUNIC_GORON + ITEM_TUNIC_ZORA - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_TUNIC_ZORA + // EQUIP_TYPE_BOOTS + 0, // unused + ITEM_BOOTS_KOKIRI - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_BOOTS_KOKIRI + ITEM_BOOTS_IRON - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_BOOTS_IRON + ITEM_BOOTS_HOVER - ITEM_SWORD_KOKIRI, // EQUIP_VALUE_BOOTS_HOVER }; void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u32 height) { @@ -35,15 +77,15 @@ void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); curTexture = source; - remainingSize = width * height * 2; - textureHeight = 4096 / (width * 2); - textureSize = width * textureHeight * 2; + remainingSize = width * height * G_IM_SIZ_16b_BYTES; + textureHeight = TMEM_SIZE / (width * G_IM_SIZ_16b_BYTES); + textureSize = width * textureHeight * G_IM_SIZ_16b_BYTES; textureCount = remainingSize / textureSize; if ((remainingSize % textureSize) != 0) { textureCount += 1; } - vtxIndex = 80; + vtxIndex = EQUIP_QUAD_PLAYER_FIRST * 4; gDPSetTileCustom(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, width - 1, textureHeight - 1, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, @@ -65,7 +107,7 @@ void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u if ((remainingSize - textureSize) < 0) { if (remainingSize > 0) { - textureHeight = remainingSize / (s32)(width * 2); + textureHeight = remainingSize / (s32)(width * G_IM_SIZ_16b_BYTES); remainingSize -= textureSize; gDPSetTileCustom(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, width - 1, textureHeight - 1, 0, @@ -143,7 +185,9 @@ void KaleidoScope_DrawEquipment(PlayState* play) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, ZREG(39), ZREG(40), ZREG(41), pauseCtx->alpha); gDPSetEnvColor(POLY_OPA_DISP++, ZREG(43), ZREG(44), ZREG(45), 0); - for (i = 0, j = 64; i < 4; i++, j += 4) { + // Draw EQUIP_QUAD_SELECTED_SWORD, EQUIP_QUAD_SELECTED_SHIELD, EQUIP_QUAD_SELECTED_TUNIC, EQUIP_QUAD_SELECTED_BOOTS + + for (i = 0, j = EQUIP_QUAD_SELECTED_SWORD * 4; i < EQUIP_TYPE_MAX; i++, j += 4) { if (CUR_EQUIP_VALUE(i) != 0) { gDPPipeSync(POLY_OPA_DISP++); gSPVertex(POLY_OPA_DISP++, &pauseCtx->equipVtx[j], 4, 0); @@ -157,6 +201,8 @@ void KaleidoScope_DrawEquipment(PlayState* play) { oldCursorPoint = pauseCtx->cursorPoint[PAUSE_EQUIP]; pauseCtx->cursorColorSet = 0; + // Handle moving the cursor with stick input + if (pauseCtx->cursorSpecialPos == 0) { pauseCtx->nameColorSet = 0; @@ -172,12 +218,13 @@ void KaleidoScope_DrawEquipment(PlayState* play) { cursorMoveResult = 0; do { if (pauseCtx->stickAdjX < -30) { - if (pauseCtx->cursorX[PAUSE_EQUIP] != 0) { + if (pauseCtx->cursorX[PAUSE_EQUIP] != EQUIP_CURSOR_X_UPG) { pauseCtx->cursorX[PAUSE_EQUIP]--; pauseCtx->cursorPoint[PAUSE_EQUIP] -= 1; - if (pauseCtx->cursorX[PAUSE_EQUIP] == 0) { - if (pauseCtx->cursorY[PAUSE_EQUIP] == 0) { + if (pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_CURSOR_X_UPG) { + if (pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) { + //! @bug Assumes adult always has bullet bag (as adult this should rely on `UPG_QUIVER`) if (CUR_UPG_VALUE(UPG_BULLET_BAG) != 0) { cursorMoveResult = 1; } @@ -219,7 +266,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) { pauseCtx->cursorX[PAUSE_EQUIP]++; pauseCtx->cursorPoint[PAUSE_EQUIP] += 1; - if (pauseCtx->cursorX[PAUSE_EQUIP] == 0) { + if (pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_CURSOR_X_UPG) { if (CUR_UPG_VALUE(pauseCtx->cursorY[PAUSE_EQUIP]) != 0) { cursorMoveResult = 1; } @@ -266,17 +313,21 @@ void KaleidoScope_DrawEquipment(PlayState* play) { pauseCtx->cursorY[PAUSE_EQUIP]--; pauseCtx->cursorPoint[PAUSE_EQUIP] -= 4; - if (pauseCtx->cursorX[PAUSE_EQUIP] == 0) { - if (pauseCtx->cursorY[PAUSE_EQUIP] == 0) { + if (pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_CURSOR_X_UPG) { + if (pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) { if (CUR_UPG_VALUE(UPG_BULLET_BAG) != 0) { cursorMoveResult = 1; } - } else if (CUR_UPG_VALUE(pauseCtx->cursorY[PAUSE_EQUIP]) != 0) { - cursorMoveResult = 1; + } else { + if (CUR_UPG_VALUE(pauseCtx->cursorY[PAUSE_EQUIP]) != 0) { + cursorMoveResult = 1; + } + } + } else { + if (gBitFlags[pauseCtx->cursorPoint[PAUSE_EQUIP] - 1] & + gSaveContext.save.info.inventory.equipment) { + cursorMoveResult = 2; } - } else if (gBitFlags[pauseCtx->cursorPoint[PAUSE_EQUIP] - 1] & - gSaveContext.save.info.inventory.equipment) { - cursorMoveResult = 2; } } else { pauseCtx->cursorY[PAUSE_EQUIP] = cursorY; @@ -288,13 +339,15 @@ void KaleidoScope_DrawEquipment(PlayState* play) { pauseCtx->cursorY[PAUSE_EQUIP]++; pauseCtx->cursorPoint[PAUSE_EQUIP] += 4; - if (pauseCtx->cursorX[PAUSE_EQUIP] == 0) { + if (pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_CURSOR_X_UPG) { if (CUR_UPG_VALUE(pauseCtx->cursorY[PAUSE_EQUIP]) != 0) { cursorMoveResult = 1; } - } else if (gBitFlags[pauseCtx->cursorPoint[PAUSE_EQUIP] - 1] & - gSaveContext.save.info.inventory.equipment) { - cursorMoveResult = 2; + } else { + if (gBitFlags[pauseCtx->cursorPoint[PAUSE_EQUIP] - 1] & + gSaveContext.save.info.inventory.equipment) { + cursorMoveResult = 2; + } } } else { pauseCtx->cursorY[PAUSE_EQUIP] = cursorY; @@ -315,25 +368,29 @@ void KaleidoScope_DrawEquipment(PlayState* play) { cursorPoint = cursorX = cursorY = 0; while (true) { - if (cursorX == 0) { - if (cursorY == 0) { + if (cursorX == EQUIP_CURSOR_X_UPG) { + if (cursorY == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) { if (CUR_UPG_VALUE(UPG_BULLET_BAG) != 0) { pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint; pauseCtx->cursorX[PAUSE_EQUIP] = cursorX; pauseCtx->cursorY[PAUSE_EQUIP] = cursorY; break; } - } else if (CUR_UPG_VALUE(cursorY) != 0) { + } else { + if (CUR_UPG_VALUE(cursorY) != 0) { + pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint; + pauseCtx->cursorX[PAUSE_EQUIP] = cursorX; + pauseCtx->cursorY[PAUSE_EQUIP] = cursorY; + break; + } + } + } else { + if (gBitFlags[cursorPoint - 1] & gSaveContext.save.info.inventory.equipment) { pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint; pauseCtx->cursorX[PAUSE_EQUIP] = cursorX; pauseCtx->cursorY[PAUSE_EQUIP] = cursorY; break; } - } else if (gBitFlags[cursorPoint - 1] & gSaveContext.save.info.inventory.equipment) { - pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint; - pauseCtx->cursorX[PAUSE_EQUIP] = cursorX; - pauseCtx->cursorY[PAUSE_EQUIP] = cursorY; - break; } cursorY = cursorY + 1; @@ -349,7 +406,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } } - } else { + } else { // cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT if (pauseCtx->stickAdjX < -30) { pauseCtx->nameDisplayTimer = 0; pauseCtx->cursorSpecialPos = 0; @@ -359,18 +416,20 @@ void KaleidoScope_DrawEquipment(PlayState* play) { cursorPoint = cursorX = 3; cursorY = 0; while (true) { - if (cursorX == 0) { + if (cursorX == EQUIP_CURSOR_X_UPG) { if (CUR_UPG_VALUE(cursorY) != 0) { pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint; pauseCtx->cursorX[PAUSE_EQUIP] = cursorX; pauseCtx->cursorY[PAUSE_EQUIP] = cursorY; break; } - } else if (gBitFlags[cursorPoint - 1] & gSaveContext.save.info.inventory.equipment) { - pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint; - pauseCtx->cursorX[PAUSE_EQUIP] = cursorX; - pauseCtx->cursorY[PAUSE_EQUIP] = cursorY; - break; + } else { + if (gBitFlags[cursorPoint - 1] & gSaveContext.save.info.inventory.equipment) { + pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint; + pauseCtx->cursorX[PAUSE_EQUIP] = cursorX; + pauseCtx->cursorY[PAUSE_EQUIP] = cursorY; + break; + } } cursorY = cursorY + 1; @@ -388,11 +447,14 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } - if (pauseCtx->cursorX[PAUSE_EQUIP] == 0) { + // set cursorItem + + if (pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_CURSOR_X_UPG) { pauseCtx->cursorColorSet = 0; if (LINK_AGE_IN_YEARS == YEARS_CHILD) { - if ((pauseCtx->cursorY[PAUSE_EQUIP] == 0) && (CUR_UPG_VALUE(UPG_BULLET_BAG) != 0)) { + if ((pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) && + (CUR_UPG_VALUE(UPG_BULLET_BAG) != 0)) { cursorItem = ITEM_BULLET_BAG_30 + CUR_UPG_VALUE(UPG_BULLET_BAG) - 1; } else { cursorItem = ITEM_QUIVER_30 + sUpgradeItemOffsets[pauseCtx->cursorY[PAUSE_EQUIP]] + @@ -400,7 +462,8 @@ void KaleidoScope_DrawEquipment(PlayState* play) { PRINTF("H_arrowcase_1 + non_equip_item_table = %d\n", cursorItem); } } else { - if ((pauseCtx->cursorY[PAUSE_EQUIP] == 0) && (CUR_UPG_VALUE(UPG_QUIVER) == 0)) { + if ((pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) && + (CUR_UPG_VALUE(UPG_QUIVER) == 0)) { cursorItem = ITEM_BULLET_BAG_30 + CUR_UPG_VALUE(UPG_BULLET_BAG) - 1; } else { cursorItem = ITEM_QUIVER_30 + sUpgradeItemOffsets[pauseCtx->cursorY[PAUSE_EQUIP]] + @@ -417,8 +480,9 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } - if ((pauseCtx->cursorY[PAUSE_EQUIP] == 0) && (pauseCtx->cursorX[PAUSE_EQUIP] == 3)) { - if (gSaveContext.save.info.playerData.bgsFlag != 0) { + if ((pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_TYPE_SWORD) && + (pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_VALUE_SWORD_BIGGORON)) { + if (gSaveContext.save.info.playerData.bgsFlag) { cursorItem = ITEM_HEART_PIECE_2; } else if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)) { cursorItem = ITEM_GIANTS_KNIFE; @@ -432,6 +496,8 @@ void KaleidoScope_DrawEquipment(PlayState* play) { PRINTF("kscope->select_name[Display_Equipment] = %d\n", pauseCtx->cursorItem[PAUSE_EQUIP]); + // Handle age particularities + if (!CHECK_AGE_REQ_EQUIP(pauseCtx->cursorY[PAUSE_EQUIP], pauseCtx->cursorX[PAUSE_EQUIP])) { pauseCtx->nameColorSet = 1; } @@ -444,7 +510,8 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } - if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 0)) { + if ((pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_CURSOR_X_UPG) && + (pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER)) { if (LINK_AGE_IN_YEARS != YEARS_CHILD) { if ((cursorItem >= ITEM_BULLET_BAG_30) && (cursorItem <= ITEM_BULLET_BAG_50)) { pauseCtx->nameColorSet = 1; @@ -456,20 +523,25 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } + // Set cursor position + KaleidoScope_SetCursorPos(pauseCtx, cursorSlot * 4, pauseCtx->equipVtx); + // Handle input for changing equipment + if ((pauseCtx->cursorSpecialPos == 0) && (cursorItem != PAUSE_ITEM_NONE) && (pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) && - CHECK_BTN_ALL(input->press.button, BTN_A) && (pauseCtx->cursorX[PAUSE_EQUIP] != 0)) { + CHECK_BTN_ALL(input->press.button, BTN_A) && (pauseCtx->cursorX[PAUSE_EQUIP] != EQUIP_CURSOR_X_UPG)) { if (CHECK_AGE_REQ_EQUIP(pauseCtx->cursorY[PAUSE_EQUIP], pauseCtx->cursorX[PAUSE_EQUIP])) { Inventory_ChangeEquipment(pauseCtx->cursorY[PAUSE_EQUIP], pauseCtx->cursorX[PAUSE_EQUIP]); - if (pauseCtx->cursorY[PAUSE_EQUIP] == 0) { + if (pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_TYPE_SWORD) { gSaveContext.save.info.infTable[INFTABLE_1DX_INDEX] = 0; gSaveContext.save.info.equips.buttonItems[0] = cursorItem; - if ((pauseCtx->cursorX[PAUSE_EQUIP] == 3) && (gSaveContext.save.info.playerData.bgsFlag != 0)) { + if ((pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_VALUE_SWORD_BIGGORON) && + gSaveContext.save.info.playerData.bgsFlag) { gSaveContext.save.info.equips.buttonItems[0] = ITEM_SWORD_BIGGORON; gSaveContext.save.info.playerData.swordHealth = 8; } else { @@ -477,8 +549,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) { gSaveContext.save.info.equips.buttonItems[0] = ITEM_SWORD_BIGGORON; } if ((gSaveContext.save.info.equips.buttonItems[0] == ITEM_SWORD_BIGGORON) && - - (gSaveContext.save.info.playerData.bgsFlag == 0) && + !gSaveContext.save.info.playerData.bgsFlag && CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)) { gSaveContext.save.info.equips.buttonItems[0] = ITEM_GIANTS_KNIFE; } @@ -489,7 +560,9 @@ void KaleidoScope_DrawEquipment(PlayState* play) { Audio_PlaySfxGeneral(NA_SE_SY_DECIDE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - pauseCtx->mainState = PAUSE_MAIN_STATE_7; + + // Wait 10 frames before accepting input again + pauseCtx->mainState = PAUSE_MAIN_STATE_EQUIP_CHANGED; sEquipTimer = 10; } else { Audio_PlaySfxGeneral(NA_SE_SY_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, @@ -501,7 +574,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) { Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } - } else if ((pauseCtx->mainState == PAUSE_MAIN_STATE_7) && (pauseCtx->pageIndex == PAUSE_EQUIP)) { + } else if ((pauseCtx->mainState == PAUSE_MAIN_STATE_EQUIP_CHANGED) && (pauseCtx->pageIndex == PAUSE_EQUIP)) { KaleidoScope_SetCursorPos(pauseCtx, pauseCtx->cursorSlot[PAUSE_EQUIP] * 4, pauseCtx->equipVtx); pauseCtx->cursorColorSet = 8; @@ -511,13 +584,19 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } - for (rowStart = 0, i = 0, point = 4; i < 4; i++, rowStart += 4, point += 16) { + // Enlarge the equip item at the current cursor position, if it can be equipped + // for each row (one row per equip type) + for (rowStart = 0, i = 0, point = EQUIP_QUAD_SWORD_KOKIRI * 4; i < EQUIP_TYPE_MAX; + i++, rowStart += 4, point += 4 * 4) { + + // for each equip column for (k = 0, temp = rowStart + 1, bit = rowStart, j = point; k < 3; k++, bit++, j += 4, temp++) { if ((gBitFlags[bit] & gSaveContext.save.info.inventory.equipment) && (pauseCtx->cursorSpecialPos == 0)) { if (CHECK_AGE_REQ_EQUIP(i, k + 1)) { if (temp == cursorSlot) { + pauseCtx->equipVtx[j].v.ob[0] = pauseCtx->equipVtx[j + 2].v.ob[0] = pauseCtx->equipVtx[j].v.ob[0] - 2; pauseCtx->equipVtx[j + 1].v.ob[0] = pauseCtx->equipVtx[j + 3].v.ob[0] = @@ -532,13 +611,19 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } + // Draw upgrades and equips + Gfx_SetupDL_42Opa(play->state.gfxCtx); gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - for (rowStart = 0, j = 0, temp = 0, i = 0; i < 4; i++, rowStart += 4, j += 16) { - gSPVertex(POLY_OPA_DISP++, &pauseCtx->equipVtx[j], 16, 0); + // for each row + for (rowStart = 0, j = 0, temp = 0, i = 0; i < 4; i++, rowStart += 4, j += 4 * 4) { + gSPVertex(POLY_OPA_DISP++, &pauseCtx->equipVtx[j], 4 * 4, 0); + + // Draw upgrade `i` + // EQUIP_QUAD_UPG_BULLETBAG_QUIVER, EQUIP_QUAD_UPG_BOMB_BAG, EQUIP_QUAD_UPG_STRENGTH, EQUIP_QUAD_UPG_SCALE if (LINK_AGE_IN_YEARS == YEARS_CHILD) { point = CUR_UPG_VALUE(sChildUpgrades[i]); @@ -549,6 +634,8 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } else { if ((i == 0) && (CUR_UPG_VALUE(sAdultUpgrades[i]) == 0)) { + // Show bullet bag instead of quiver if player has no quiver + //! @bug This assumes adult always has bullet bag KaleidoScope_DrawQuadTextureRGBA32( play->state.gfxCtx, gItemIcons[sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1], ITEM_ICON_WIDTH, ITEM_ICON_HEIGHT, 0); @@ -559,12 +646,20 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } + // Draw owned equips of type `i` + // EQUIP_QUAD_SWORD_KOKIRI, EQUIP_QUAD_SWORD_MASTER, EQUIP_QUAD_SWORD_BIGGORON + // EQUIP_QUAD_SHIELD_DEKU, EQUIP_QUAD_SHIELD_HYLIAN, EQUIP_QUAD_SHIELD_MIRROR + // EQUIP_QUAD_TUNIC_KOKIRI, EQUIP_QUAD_TUNIC_GORON, EQUIP_QUAD_TUNIC_ZORA + // EQUIP_QUAD_BOOTS_KOKIRI, EQUIP_QUAD_BOOTS_IRON, EQUIP_QUAD_BOOTS_HOVER + for (k = 0, bit = rowStart, point = 4; k < 3; k++, point += 4, temp++, bit++) { - if (((u32)i == 0) && (k == 2) && (gSaveContext.save.info.playerData.bgsFlag != 0)) { + if (((u32)i == EQUIP_TYPE_SWORD) && (k == EQUIP_INV_SWORD_BIGGORON) && + gSaveContext.save.info.playerData.bgsFlag) { KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIconSwordBiggoronTex, ITEM_ICON_WIDTH, ITEM_ICON_HEIGHT, point); - } else if ((i == 0) && (k == 2) && (gBitFlags[bit + 1] & gSaveContext.save.info.inventory.equipment)) { + } else if ((i == EQUIP_TYPE_SWORD) && (k == EQUIP_INV_SWORD_BIGGORON) && + (gBitFlags[bit + 1] & gSaveContext.save.info.inventory.equipment)) { KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIconBrokenGiantsKnifeTex, ITEM_ICON_WIDTH, ITEM_ICON_HEIGHT, point); } else if (gBitFlags[bit] & gSaveContext.save.info.inventory.equipment) { @@ -574,13 +669,15 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } + // Draw player to the player prerender buffer + KaleidoScope_DrawPlayerWork(play); - if ((pauseCtx->mainState == PAUSE_MAIN_STATE_7) && (sEquipTimer == 10)) { + if ((pauseCtx->mainState == PAUSE_MAIN_STATE_EQUIP_CHANGED) && (sEquipTimer == 10)) { KaleidoScope_SetupPlayerPreRender(play); } - if ((pauseCtx->mainState == PAUSE_MAIN_STATE_7) && (sEquipTimer == 9)) { + if ((pauseCtx->mainState == PAUSE_MAIN_STATE_EQUIP_CHANGED) && (sEquipTimer == 9)) { //! @bug: This function shouldn't take any arguments KaleidoScope_ProcessPlayerPreRender(play); } @@ -592,6 +689,8 @@ void KaleidoScope_DrawEquipment(PlayState* play) { gSPSegment(POLY_OPA_DISP++, 0x0B, interfaceCtx->mapSegment); gSPSegment(POLY_OPA_DISP++, 0x0C, pauseCtx->iconItemAltSegment); + // Draw player prerender onto the equip page + Gfx_SetupDL_42Opa(play->state.gfxCtx); KaleidoScope_DrawEquipmentImage(play, pauseCtx->playerSegment, PAUSE_EQUIP_PLAYER_WIDTH, PAUSE_EQUIP_PLAYER_HEIGHT); diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index 3dc94e9c42e..543f679bd98 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -20,7 +20,14 @@ u8 gAmmoItems[] = { ITEM_NONE, }; -static s16 sEquipState = 0; +typedef enum ItemEquipState { + /* 0 */ ITEM_EQUIP_STATE_0, + /* 1 */ ITEM_EQUIP_STATE_1, + /* 2 */ ITEM_EQUIP_STATE_2, + /* 3 */ ITEM_EQUIP_STATE_3 +} ItemEquipState; + +static s16 sEquipState = ITEM_EQUIP_STATE_0; static s16 sEquipAnimTimer = 0; static s16 sEquipMoveTimer = 10; @@ -98,7 +105,14 @@ void KaleidoScope_DrawAmmoCount(PauseContext* pauseCtx, GraphicsContext* gfxCtx, CLOSE_DISPS(gfxCtx, "../z_kaleido_item.c", 116); } +/** + * Set the cursor to the position of `vtx[index]`. + * The position indicates the cursor's top-left. + * + * @see KaleidoScope_UpdateCursorVtx where this position is used to update all cursor quads. + */ void KaleidoScope_SetCursorPos(PauseContext* pauseCtx, u16 index, Vtx* vtx) { + // PAUSE_QUAD_CURSOR_TL pauseCtx->cursorVtx[0].v.ob[0] = vtx[index].v.ob[0]; pauseCtx->cursorVtx[0].v.ob[1] = vtx[index].v.ob[1]; } @@ -392,11 +406,13 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { pauseCtx->equipAnimY = pauseCtx->itemVtx[index].v.ob[1] * 10; pauseCtx->equipAnimAlpha = 255; sEquipAnimTimer = 0; - sEquipState = 3; + sEquipState = ITEM_EQUIP_STATE_3; sEquipMoveTimer = 10; + if ((pauseCtx->equipTargetItem == ITEM_ARROW_FIRE) || (pauseCtx->equipTargetItem == ITEM_ARROW_ICE) || (pauseCtx->equipTargetItem == ITEM_ARROW_LIGHT)) { + index = 0; if (pauseCtx->equipTargetItem == ITEM_ARROW_ICE) { index = 1; @@ -408,7 +424,7 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); pauseCtx->equipTargetItem = 0xBF + index; - sEquipState = 0; + sEquipState = ITEM_EQUIP_STATE_0; pauseCtx->equipAnimAlpha = 0; sEquipMoveTimer = 6; } else { @@ -422,6 +438,8 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { } } } else { + // PAUSE_QUAD_CURSOR_TL + pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->cursorVtx[2].v.ob[0] = pauseCtx->cursorVtx[1].v.ob[0] = pauseCtx->cursorVtx[3].v.ob[0] = 0; @@ -437,7 +455,9 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } } else if ((pauseCtx->mainState == PAUSE_MAIN_STATE_3) && (pauseCtx->pageIndex == PAUSE_ITEM)) { - //! @bug cursorSlot is uninitialized + //! @bug cursorSlot is used uninitialized + // This leads to reading from the itemVtx array at some index, typically OOB, and setting the cursor to an + // unexpected position. However the cursor is not drawn in this state so it ends up not being an issue. KaleidoScope_SetCursorPos(pauseCtx, cursorSlot * 4, pauseCtx->itemVtx); pauseCtx->cursorColorSet = 4; } @@ -464,7 +484,7 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { if ((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) && (pauseCtx->pageIndex == PAUSE_ITEM) && (pauseCtx->cursorSpecialPos == 0)) { if (CHECK_AGE_REQ_SLOT(i)) { - if ((sEquipState == 2) && (i == 3)) { + if ((sEquipState == ITEM_EQUIP_STATE_2) && (i == SLOT_BOW)) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, magicArrowEffectsR[pauseCtx->equipTargetItem - 0xBF], magicArrowEffectsG[pauseCtx->equipTargetItem - 0xBF], magicArrowEffectsB[pauseCtx->equipTargetItem - 0xBF], pauseCtx->alpha); @@ -526,44 +546,45 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { CLOSE_DISPS(play->state.gfxCtx, "../z_kaleido_item.c", 516); } +// C-left, C-down, C-right static s16 sCButtonPosX[] = { 660, 900, 1140 }; static s16 sCButtonPosY[] = { 1100, 920, 1100 }; void KaleidoScope_UpdateItemEquip(PlayState* play) { - static s16 D_8082A488 = 0; + static s16 sItemEquipState2Timer_8082A488 = 0; PauseContext* pauseCtx = &play->pauseCtx; Vtx* bowItemVtx; u16 offsetX; u16 offsetY; - if (sEquipState == 0) { - pauseCtx->equipAnimAlpha += 14; + if (sEquipState == ITEM_EQUIP_STATE_0) { + pauseCtx->equipAnimAlpha += 255 / 18; if (pauseCtx->equipAnimAlpha > 255) { pauseCtx->equipAnimAlpha = 254; - sEquipState++; + sEquipState++; // ITEM_EQUIP_STATE_1 } sEquipAnimTimer = 5; return; } - if (sEquipState == 2) { - D_8082A488--; + if (sEquipState == ITEM_EQUIP_STATE_2) { + sItemEquipState2Timer_8082A488--; - if (D_8082A488 == 0) { + if (sItemEquipState2Timer_8082A488 == 0) { pauseCtx->equipTargetItem -= 0xBF - ITEM_BOW_FIRE; pauseCtx->equipTargetSlot = SLOT_BOW; sEquipMoveTimer = 6; WREG(90) = 320; WREG(87) = WREG(91); - sEquipState++; + sEquipState++; // ITEM_EQUIP_STATE_3 Audio_PlaySfxGeneral(NA_SE_SY_SYNTH_MAGIC_ARROW, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } return; } - if (sEquipState == 1) { - bowItemVtx = &pauseCtx->itemVtx[12]; + if (sEquipState == ITEM_EQUIP_STATE_1) { + bowItemVtx = &pauseCtx->itemVtx[SLOT_BOW * 4]; offsetX = ABS(pauseCtx->equipAnimX - bowItemVtx->v.ob[0] * 10) / sEquipMoveTimer; offsetY = ABS(pauseCtx->equipAnimY - bowItemVtx->v.ob[1] * 10) / sEquipMoveTimer; } else { @@ -584,14 +605,14 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { WREG(90) -= WREG(87) / sEquipMoveTimer; WREG(87) -= WREG(87) / sEquipMoveTimer; - if (sEquipState == 1) { - if (pauseCtx->equipAnimX >= (pauseCtx->itemVtx[12].v.ob[0] * 10)) { + if (sEquipState == ITEM_EQUIP_STATE_1) { + if (pauseCtx->equipAnimX >= (pauseCtx->itemVtx[SLOT_BOW * 4].v.ob[0] * 10)) { pauseCtx->equipAnimX -= offsetX; } else { pauseCtx->equipAnimX += offsetX; } - if (pauseCtx->equipAnimY >= (pauseCtx->itemVtx[12].v.ob[1] * 10)) { + if (pauseCtx->equipAnimY >= (pauseCtx->itemVtx[SLOT_BOW * 4].v.ob[1] * 10)) { pauseCtx->equipAnimY -= offsetY; } else { pauseCtx->equipAnimY += offsetY; @@ -613,9 +634,9 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { sEquipMoveTimer--; if (sEquipMoveTimer == 0) { - if (sEquipState == 1) { - sEquipState++; - D_8082A488 = 4; + if (sEquipState == ITEM_EQUIP_STATE_1) { + sEquipState++; // ITEM_EQUIP_STATE_2 + sItemEquipState2Timer_8082A488 = 4; return; } diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map.c index b8733370306..63843b75b6d 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map.c @@ -150,7 +150,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->cursorSpecialPos = 0; pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->cursorPoint[PAUSE_MAP] = pauseCtx->dungeonMapSlot; pauseCtx->cursorX[PAUSE_MAP] = 0; - j = 72 + (pauseCtx->cursorSlot[PAUSE_MAP] * 4); + j = (PAGE_BG_QUADS + 3 + pauseCtx->cursorSlot[PAUSE_MAP]) * 4; KaleidoScope_SetCursorPos(pauseCtx, j, pauseCtx->mapPageVtx); Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -181,7 +181,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { } PRINTF("kscope->cursor_point====%d\n", pauseCtx->cursorPoint[PAUSE_MAP]); - j = 72 + (pauseCtx->cursorSlot[PAUSE_MAP] * 4); + j = (PAGE_BG_QUADS + 3 + pauseCtx->cursorSlot[PAUSE_MAP]) * 4; KaleidoScope_SetCursorPos(pauseCtx, j, pauseCtx->mapPageVtx); Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -203,7 +203,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->cursorPoint[PAUSE_MAP]; - j = 72 + (pauseCtx->cursorSlot[PAUSE_MAP] * 4); + j = (PAGE_BG_QUADS + 3 + pauseCtx->cursorSlot[PAUSE_MAP]) * 4; KaleidoScope_SetCursorPos(pauseCtx, j, pauseCtx->mapPageVtx); if (pauseCtx->cursorX[PAUSE_MAP] == 0) { @@ -222,7 +222,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); - gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[68], 16, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(PAGE_BG_QUADS + 2) * 4], 16, 0); gDPLoadTextureBlock(POLY_OPA_DISP++, dungeonTitleTexs[gSaveContext.mapIndex], G_IM_FMT_IA, G_IM_SIZ_8b, 96, 16, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, @@ -247,7 +247,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 200, pauseCtx->alpha); - gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[84], 32, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(PAGE_BG_QUADS + 6) * 4], 32, 0); for (i = j = 0; i < 8; i++, j += 4) { if ((gSaveContext.save.info.sceneFlags[gSaveContext.mapIndex].floors & gBitFlags[i]) || @@ -274,19 +274,26 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0); - pauseCtx->mapPageVtx[124].v.ob[0] = pauseCtx->mapPageVtx[126].v.ob[0] = pauseCtx->mapPageVtx[124].v.ob[0] + 2; - pauseCtx->mapPageVtx[125].v.ob[0] = pauseCtx->mapPageVtx[127].v.ob[0] = pauseCtx->mapPageVtx[124].v.ob[0] + 19; - pauseCtx->mapPageVtx[124].v.ob[1] = pauseCtx->mapPageVtx[125].v.ob[1] = pauseCtx->mapPageVtx[124].v.ob[1] - 2; - pauseCtx->mapPageVtx[126].v.ob[1] = pauseCtx->mapPageVtx[127].v.ob[1] = pauseCtx->mapPageVtx[124].v.ob[1] - 19; + // Quad PAGE_BG_QUADS + 16 + pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[0] = pauseCtx->mapPageVtx[31 * 4 + 2].v.ob[0] = + pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[0] + 2; + pauseCtx->mapPageVtx[31 * 4 + 1].v.ob[0] = pauseCtx->mapPageVtx[31 * 4 + 3].v.ob[0] = + pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[0] + 19; + pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[1] = pauseCtx->mapPageVtx[31 * 4 + 1].v.ob[1] = + pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[1] - 2; + pauseCtx->mapPageVtx[31 * 4 + 2].v.ob[1] = pauseCtx->mapPageVtx[31 * 4 + 3].v.ob[1] = + pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[1] - 19; gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[116], 12, 0); gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - pauseCtx->mapPageVtx[116].v.ob[1] = pauseCtx->mapPageVtx[117].v.ob[1] = + // Quad PAGE_BG_QUADS + 14 + pauseCtx->mapPageVtx[29 * 4 + 0].v.ob[1] = pauseCtx->mapPageVtx[29 * 4 + 1].v.ob[1] = pauseCtx->pagesYOrigin1 - (VREG(30) * 14) + 49; - pauseCtx->mapPageVtx[118].v.ob[1] = pauseCtx->mapPageVtx[119].v.ob[1] = pauseCtx->mapPageVtx[116].v.ob[1] - 16; + pauseCtx->mapPageVtx[29 * 4 + 2].v.ob[1] = pauseCtx->mapPageVtx[29 * 4 + 3].v.ob[1] = + pauseCtx->mapPageVtx[29 * 4 + 0].v.ob[1] - 16; gDPLoadTextureBlock(POLY_OPA_DISP++, gDungeonMapLinkHeadTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, @@ -296,9 +303,12 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { if (CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, gSaveContext.mapIndex) && (gMapData->skullFloorIconY[gSaveContext.mapIndex] != -99)) { - pauseCtx->mapPageVtx[120].v.ob[1] = pauseCtx->mapPageVtx[121].v.ob[1] = + + // Quad PAGE_BG_QUADS + 15 + pauseCtx->mapPageVtx[30 * 4 + 0].v.ob[1] = pauseCtx->mapPageVtx[30 * 4 + 1].v.ob[1] = gMapData->skullFloorIconY[gSaveContext.mapIndex] + pauseCtx->pagesYOrigin1; - pauseCtx->mapPageVtx[122].v.ob[1] = pauseCtx->mapPageVtx[123].v.ob[1] = pauseCtx->mapPageVtx[120].v.ob[1] - 16; + pauseCtx->mapPageVtx[30 * 4 + 2].v.ob[1] = pauseCtx->mapPageVtx[30 * 4 + 3].v.ob[1] = + pauseCtx->mapPageVtx[30 * 4 + 0].v.ob[1] - 16; gDPLoadTextureBlock(POLY_OPA_DISP++, gDungeonMapSkullTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, @@ -339,7 +349,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { gDPLoadTLUT_pal16(POLY_OPA_DISP++, 0, interfaceCtx->mapPalette); gDPSetTextureLUT(POLY_OPA_DISP++, G_TT_RGBA16); - gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[60], 8, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(PAGE_BG_QUADS + 0) * 4], 8, 0); gDPLoadTextureBlock_4b(POLY_OPA_DISP++, interfaceCtx->mapSegment, G_IM_FMT_CI, 48, 85, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); @@ -582,7 +592,13 @@ void KaleidoScope_DrawWorldMap(PlayState* play, GraphicsContext* gfxCtx) { PAGE_BG_QUADS + WORLD_MAP_QUAD_POINT_FIRST + pauseCtx->cursorPoint[PAUSE_WORLD_MAP]; KaleidoScope_SetCursorPos(pauseCtx, pauseCtx->cursorSlot[PAUSE_MAP] * 4, pauseCtx->mapPageVtx); } else { + + //! @bug This causes a weird DMA request in `KaleidoScope_UpdateNamePanel`, either for unintended data or + //! outside the intended segment. + // This isn't a visual issue in practice because drawing the texture loaded in + // `KaleidoScope_UpdateNamePanel` is only done under `cursorSpecialPos == 0`. pauseCtx->cursorItem[PAUSE_MAP] = gSaveContext.worldMapArea + 0x18; + if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { if (pauseCtx->stickAdjX > 30) { pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = 0; diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c index 71104dd5454..8268f58928f 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c @@ -663,16 +663,17 @@ static u8 gPageSwitchNextButtonStatus[][5] = { // PAUSE_EQUIP + PAGE_SWITCH_PT_RIGHT // -> PAUSE_ITEM { BTN_ENABLED, BTN_ENABLED, BTN_ENABLED, BTN_ENABLED, BTN_DISABLED }, + }; -static s16 D_8082AB8C = 0; -static s16 D_8082AB90 = 0; -static s16 D_8082AB94 = 0; -static s16 D_8082AB98 = 255; +static s16 sColor82ABRed_D_8082AB8C = 0; +static s16 sColor82ABGreen_D_8082AB90 = 0; +static s16 sColor82ABBlue_D_8082AB94 = 0; +static s16 sColor82ABGameOverPrimAlpha_D_8082AB98 = 255; -static s16 D_8082AB9C = 255; -static s16 D_8082ABA0 = 0; -static s16 D_8082ABA4 = 0; +static s16 sDrawGameOverEnvColorRed_D_8082AB9C = 255; +static s16 sDrawGameOverEnvColorGreen_D_8082ABA0 = 0; +static s16 sDrawGameOverEnvColorBlue_D_8082ABA4 = 0; static s16 sInDungeonScene = false; @@ -902,7 +903,7 @@ static void* sPromptChoiceTexs[][2] = { #endif }; -static u8 D_808321A8[5]; +static u8 D_808321A8_savedButtonStatus[5]; static PreRender sPlayerPreRender; static void* sPreRenderCvg; @@ -933,7 +934,7 @@ void KaleidoScope_SetupPlayerPreRender(PlayState* play) { } void KaleidoScope_ProcessPlayerPreRender(void) { - Sleep_Msec(50); + Sleep_Msec(50); // TODO investigate if this is required PreRender_ApplyFilters(&sPlayerPreRender); PreRender_Destroy(&sPlayerPreRender); } @@ -1136,8 +1137,9 @@ void KaleidoScope_DrawCursor(PlayState* play, u16 pageIndex) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorColors[pauseCtx->cursorColorSet >> 2][0], sCursorColors[pauseCtx->cursorColorSet >> 2][1], sCursorColors[pauseCtx->cursorColorSet >> 2][2], 255); - gDPSetEnvColor(POLY_OPA_DISP++, D_8082AB8C, D_8082AB90, D_8082AB94, 255); - gSPVertex(POLY_OPA_DISP++, pauseCtx->cursorVtx, 16, 0); + gDPSetEnvColor(POLY_OPA_DISP++, sColor82ABRed_D_8082AB8C, sColor82ABGreen_D_8082AB90, + sColor82ABBlue_D_8082AB94, 255); + gSPVertex(POLY_OPA_DISP++, pauseCtx->cursorVtx, 4 * 4, 0); for (i = j = 0; i < 4; i++, j += 4) { gDPLoadTextureBlock_4b(POLY_OPA_DISP++, sCursorTexs[i], G_IM_FMT_IA, 16, 16, 0, @@ -1193,26 +1195,31 @@ Gfx* KaleidoScope_DrawPageSections(Gfx* gfx, Vtx* vertices, void** textures) { } void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { - static s16 D_8082ACF4[][3] = { + static s16 sCursorColors_D_8082ACF4[][3] = { + // "white" ? { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, + // yellow { 255, 255, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 255, 255, 0 }, + // n64: ? / gc: green { KALEIDO_COLOR_CURSOR_UNK_R, KALEIDO_COLOR_CURSOR_UNK_G, KALEIDO_COLOR_CURSOR_UNK_B }, { 0, 0, 0 }, { 0, 0, 0 }, { KALEIDO_COLOR_CURSOR_UNK_R, KALEIDO_COLOR_CURSOR_UNK_G, KALEIDO_COLOR_CURSOR_UNK_B }, }; - static s16 D_8082AD3C = 20; - static s16 D_8082AD40 = 0; + static s16 sCursorColorBlinkTimer_D_8082AD3C = 20; + static s16 sCursorColorBlinkOffset_D_8082AD40 = 0; + static s16 sStickXRepeatTimer = 0; static s16 sStickYRepeatTimer = 0; static s16 sStickXRepeatState = 0; static s16 sStickYRepeatState = 0; + PauseContext* pauseCtx = &play->pauseCtx; s16 stepR; s16 stepG; @@ -1222,34 +1229,46 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { if (!IS_PAUSE_STATE_GAMEOVER(pauseCtx)) { if (pauseCtx->state != PAUSE_STATE_SAVE_PROMPT) { - stepR = ABS(D_8082AB8C - D_8082ACF4[pauseCtx->cursorColorSet + D_8082AD40][0]) / D_8082AD3C; - stepG = ABS(D_8082AB90 - D_8082ACF4[pauseCtx->cursorColorSet + D_8082AD40][1]) / D_8082AD3C; - stepB = ABS(D_8082AB94 - D_8082ACF4[pauseCtx->cursorColorSet + D_8082AD40][2]) / D_8082AD3C; - if (D_8082AB8C >= D_8082ACF4[pauseCtx->cursorColorSet + D_8082AD40][0]) { - D_8082AB8C -= stepR; + stepR = ABS(sColor82ABRed_D_8082AB8C - + sCursorColors_D_8082ACF4[pauseCtx->cursorColorSet + sCursorColorBlinkOffset_D_8082AD40][0]) / + sCursorColorBlinkTimer_D_8082AD3C; + stepG = ABS(sColor82ABGreen_D_8082AB90 - + sCursorColors_D_8082ACF4[pauseCtx->cursorColorSet + sCursorColorBlinkOffset_D_8082AD40][1]) / + sCursorColorBlinkTimer_D_8082AD3C; + stepB = ABS(sColor82ABBlue_D_8082AB94 - + sCursorColors_D_8082ACF4[pauseCtx->cursorColorSet + sCursorColorBlinkOffset_D_8082AD40][2]) / + sCursorColorBlinkTimer_D_8082AD3C; + if (sColor82ABRed_D_8082AB8C >= + sCursorColors_D_8082ACF4[pauseCtx->cursorColorSet + sCursorColorBlinkOffset_D_8082AD40][0]) { + sColor82ABRed_D_8082AB8C -= stepR; } else { - D_8082AB8C += stepR; + sColor82ABRed_D_8082AB8C += stepR; } - if (D_8082AB90 >= D_8082ACF4[pauseCtx->cursorColorSet + D_8082AD40][1]) { - D_8082AB90 -= stepG; + if (sColor82ABGreen_D_8082AB90 >= + sCursorColors_D_8082ACF4[pauseCtx->cursorColorSet + sCursorColorBlinkOffset_D_8082AD40][1]) { + sColor82ABGreen_D_8082AB90 -= stepG; } else { - D_8082AB90 += stepG; + sColor82ABGreen_D_8082AB90 += stepG; } - if (D_8082AB94 >= D_8082ACF4[pauseCtx->cursorColorSet + D_8082AD40][2]) { - D_8082AB94 -= stepB; + if (sColor82ABBlue_D_8082AB94 >= + sCursorColors_D_8082ACF4[pauseCtx->cursorColorSet + sCursorColorBlinkOffset_D_8082AD40][2]) { + sColor82ABBlue_D_8082AB94 -= stepB; } else { - D_8082AB94 += stepB; + sColor82ABBlue_D_8082AB94 += stepB; } - D_8082AD3C--; - if (D_8082AD3C == 0) { - D_8082AB8C = D_8082ACF4[pauseCtx->cursorColorSet + D_8082AD40][0]; - D_8082AB90 = D_8082ACF4[pauseCtx->cursorColorSet + D_8082AD40][1]; - D_8082AB94 = D_8082ACF4[pauseCtx->cursorColorSet + D_8082AD40][2]; - D_8082AD3C = ZREG(28 + D_8082AD40); - D_8082AD40++; - if (D_8082AD40 >= 4) { - D_8082AD40 = 0; + sCursorColorBlinkTimer_D_8082AD3C--; + if (sCursorColorBlinkTimer_D_8082AD3C == 0) { + sColor82ABRed_D_8082AB8C = + sCursorColors_D_8082ACF4[pauseCtx->cursorColorSet + sCursorColorBlinkOffset_D_8082AD40][0]; + sColor82ABGreen_D_8082AB90 = + sCursorColors_D_8082ACF4[pauseCtx->cursorColorSet + sCursorColorBlinkOffset_D_8082AD40][1]; + sColor82ABBlue_D_8082AB94 = + sCursorColors_D_8082ACF4[pauseCtx->cursorColorSet + sCursorColorBlinkOffset_D_8082AD40][2]; + sCursorColorBlinkTimer_D_8082AD3C = ZREG(28 + sCursorColorBlinkOffset_D_8082AD40); + sCursorColorBlinkOffset_D_8082AD40++; + if (sCursorColorBlinkOffset_D_8082AD40 >= 4) { + sCursorColorBlinkOffset_D_8082AD40 = 0; } } @@ -1545,6 +1564,7 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { if (((pauseCtx->state == PAUSE_STATE_SAVE_PROMPT) && (pauseCtx->savePromptState < PAUSE_SAVE_PROMPT_STATE_SAVED)) || (pauseCtx->state == PAUSE_STATE_14)) { + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sSavePromptMessageTexs[gSaveContext.language], 152, 16, PROMPT_QUAD_MESSAGE * 4); @@ -1619,13 +1639,13 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { } void KaleidoScope_DrawInfoPanel(PlayState* play) { - static void* D_8082AD54[] = + static void* D_8082AD54_toEquipTextTextures_[] = LANGUAGE_ARRAY(gPauseToEquipJPNTex, gPauseToEquipENGTex, gPauseToEquipGERTex, gPauseToEquipFRATex); - static void* D_8082AD60[] = + static void* D_8082AD60_toDecideTextTextures_[] = LANGUAGE_ARRAY(gPauseToDecideJPNTex, gPauseToDecideENGTex, gPauseToDecideGERTex, gPauseToDecideFRATex); - static void* D_8082AD6C[] = LANGUAGE_ARRAY(gPauseToPlayMelodyJPNTex, gPauseToPlayMelodyENGTex, - gPauseToPlayMelodyGERTex, gPauseToPlayMelodyFRATex); - static void* D_8082AD78[][LANGUAGE_MAX] = { + static void* D_8082AD6C_toPlayMelodyTextTextures_[] = LANGUAGE_ARRAY( + gPauseToPlayMelodyJPNTex, gPauseToPlayMelodyENGTex, gPauseToPlayMelodyGERTex, gPauseToPlayMelodyFRATex); + static void* D_8082AD78_scrollLeftLabels_[][LANGUAGE_MAX] = { LANGUAGE_ARRAY(gPauseToEquipmentJPNTex, gPauseToEquipmentENGTex, gPauseToEquipmentGERTex, gPauseToEquipmentFRATex), LANGUAGE_ARRAY(gPauseToSelectItemJPNTex, gPauseToSelectItemENGTex, gPauseToSelectItemGERTex, @@ -1634,7 +1654,7 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { LANGUAGE_ARRAY(gPauseToQuestStatusJPNTex, gPauseToQuestStatusENGTex, gPauseToQuestStatusGERTex, gPauseToQuestStatusFRATex), }; - static void* D_8082ADA8[][LANGUAGE_MAX] = { + static void* D_8082ADA8_scrollRightLabels_[][LANGUAGE_MAX] = { LANGUAGE_ARRAY(gPauseToMapJPNTex, gPauseToMapENGTex, gPauseToMapGERTex, gPauseToMapFRATex), LANGUAGE_ARRAY(gPauseToQuestStatusJPNTex, gPauseToQuestStatusENGTex, gPauseToQuestStatusGERTex, gPauseToQuestStatusFRATex), @@ -1643,80 +1663,100 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { LANGUAGE_ARRAY(gPauseToSelectItemJPNTex, gPauseToSelectItemENGTex, gPauseToSelectItemGERTex, gPauseToSelectItemFRATex), }; - static u16 D_8082ADD8[] = LANGUAGE_ARRAY(56, 56, 88, 80); - static u16 D_8082ADE0[] = LANGUAGE_ARRAY(48, 64, 88, 72); - static u16 D_8082ADE8[] = LANGUAGE_ARRAY(96, 80, 104, 112); - static s16 D_8082ADF0[][4] = { + static u16 D_8082ADD8_toEquipTextWidth_[] = LANGUAGE_ARRAY(56, 56, 88, 80); + static u16 D_8082ADE0_toDecideTextWidth_[] = LANGUAGE_ARRAY(48, 64, 88, 72); + static u16 D_8082ADE8_toPlayMelodyTextWidth_[] = LANGUAGE_ARRAY(96, 80, 104, 112); + static s16 sCursorLeftRightSelectedPrimColors[][4] = { { 180, 210, 255, 220 }, { 100, 100, 150, 220 }, }; - static s16 D_8082AE00 = 20; - static s16 D_8082AE04 = 0; + static s16 sCursorLeftRightSelectedPrimTimer = 20; + static s16 sCursorLeftRightSelectedPrimState = 0; static s16 D_8082AE08[] = { 10, 16, 16, 17, 12, 13, 18, 17, 17, 19, 13, 21, 20, 21, 14, 15, 15, 15, 11, 14, }; - static s16 D_8082AE30[] = { - 21, 20, 19, 18, 11, 14, 10, 15, 16, 13, 12, 17, + static s16 D_8082AE30[WORLD_MAP_POINT_MAX] = { + 21, // WORLD_MAP_POINT_HAUNTED_WASTELAND + 20, // WORLD_MAP_POINT_GERUDOS_FORTRESS + 19, // WORLD_MAP_POINT_GERUDO_VALLEY + 18, // WORLD_MAP_POINT_HYLIA_LAKESIDE + 11, // WORLD_MAP_POINT_LON_LON_RANCH + 14, // WORLD_MAP_POINT_MARKET + 10, // WORLD_MAP_POINT_HYRULE_FIELD + 15, // WORLD_MAP_POINT_DEATH_MOUNTAIN + 16, // WORLD_MAP_POINT_KAKARIKO_VILLAGE + 13, // WORLD_MAP_POINT_LOST_WOODS + 12, // WORLD_MAP_POINT_KOKIRI_FOREST + 17, // WORLD_MAP_POINT_ZORAS_DOMAIN }; - static s16 D_808321A0; - static s16 D_808321A2; - static s16 D_808321A4; - static s16 D_808321A6; + static s16 sCursorLeftRightSelectedPrimRed; + static s16 sCursorLeftRightSelectedPrimGreen; + static s16 sCursorLeftRightSelectedPrimBlue; + static s16 sCursorLeftRightSelectedPrimAlpha; + PauseContext* pauseCtx = &play->pauseCtx; s16 stepR; s16 stepG; s16 stepB; s16 stepA; - s16 temp; + s16 y; s16 i; s16 j; OPEN_DISPS(play->state.gfxCtx, "../z_kaleido_scope_PAL.c", 1676); - stepR = ABS(D_808321A0 - D_8082ADF0[D_8082AE04][0]) / D_8082AE00; - stepG = ABS(D_808321A2 - D_8082ADF0[D_8082AE04][1]) / D_8082AE00; - stepB = ABS(D_808321A4 - D_8082ADF0[D_8082AE04][2]) / D_8082AE00; - stepA = ABS(D_808321A6 - D_8082ADF0[D_8082AE04][3]) / D_8082AE00; - if (D_808321A0 >= D_8082ADF0[D_8082AE04][0]) { - D_808321A0 -= stepR; + stepR = ABS(sCursorLeftRightSelectedPrimRed - + sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][0]) / + sCursorLeftRightSelectedPrimTimer; + stepG = ABS(sCursorLeftRightSelectedPrimGreen - + sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][1]) / + sCursorLeftRightSelectedPrimTimer; + stepB = ABS(sCursorLeftRightSelectedPrimBlue - + sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][2]) / + sCursorLeftRightSelectedPrimTimer; + stepA = ABS(sCursorLeftRightSelectedPrimAlpha - + sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][3]) / + sCursorLeftRightSelectedPrimTimer; + if (sCursorLeftRightSelectedPrimRed >= sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][0]) { + sCursorLeftRightSelectedPrimRed -= stepR; } else { - D_808321A0 += stepR; + sCursorLeftRightSelectedPrimRed += stepR; } - if (D_808321A2 >= D_8082ADF0[D_8082AE04][1]) { - D_808321A2 -= stepG; + if (sCursorLeftRightSelectedPrimGreen >= sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][1]) { + sCursorLeftRightSelectedPrimGreen -= stepG; } else { - D_808321A2 += stepG; + sCursorLeftRightSelectedPrimGreen += stepG; } - if (D_808321A4 >= D_8082ADF0[D_8082AE04][2]) { - D_808321A4 -= stepB; + if (sCursorLeftRightSelectedPrimBlue >= sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][2]) { + sCursorLeftRightSelectedPrimBlue -= stepB; } else { - D_808321A4 += stepB; + sCursorLeftRightSelectedPrimBlue += stepB; } - if (D_808321A6 >= D_8082ADF0[D_8082AE04][3]) { - D_808321A6 -= stepA; + if (sCursorLeftRightSelectedPrimAlpha >= sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][3]) { + sCursorLeftRightSelectedPrimAlpha -= stepA; } else { - D_808321A6 += stepA; + sCursorLeftRightSelectedPrimAlpha += stepA; } - D_8082AE00--; - if (D_8082AE00 == 0) { - D_808321A0 = D_8082ADF0[D_8082AE04][0]; - D_808321A2 = D_8082ADF0[D_8082AE04][1]; - D_808321A4 = D_8082ADF0[D_8082AE04][2]; - D_808321A6 = D_8082ADF0[D_8082AE04][3]; - D_8082AE00 = ZREG(28); - D_8082AE04 ^= 1; + sCursorLeftRightSelectedPrimTimer--; + if (sCursorLeftRightSelectedPrimTimer == 0) { + sCursorLeftRightSelectedPrimRed = sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][0]; + sCursorLeftRightSelectedPrimGreen = sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][1]; + sCursorLeftRightSelectedPrimBlue = sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][2]; + sCursorLeftRightSelectedPrimAlpha = sCursorLeftRightSelectedPrimColors[sCursorLeftRightSelectedPrimState][3]; + sCursorLeftRightSelectedPrimTimer = R_PAUSE_CURSOR_L_R_SELECTED_PRIM_TIMER; + sCursorLeftRightSelectedPrimState ^= 1; } - temp = pauseCtx->infoPanelOffsetY - 76; + y = pauseCtx->infoPanelOffsetY - 76; for (j = 0, i = 0; i < 7; i++, j += 4) { pauseCtx->infoPanelVtx[j + 0].v.ob[0] = pauseCtx->infoPanelVtx[j + 2].v.ob[0] = -72; pauseCtx->infoPanelVtx[j + 1].v.ob[0] = pauseCtx->infoPanelVtx[j + 3].v.ob[0] = 0; - pauseCtx->infoPanelVtx[j + 0].v.ob[1] = pauseCtx->infoPanelVtx[j + 1].v.ob[1] = temp; + pauseCtx->infoPanelVtx[j + 0].v.ob[1] = pauseCtx->infoPanelVtx[j + 1].v.ob[1] = y; - pauseCtx->infoPanelVtx[j + 2].v.ob[1] = pauseCtx->infoPanelVtx[j + 3].v.ob[1] = temp - 24; + pauseCtx->infoPanelVtx[j + 2].v.ob[1] = pauseCtx->infoPanelVtx[j + 3].v.ob[1] = y - 24; pauseCtx->infoPanelVtx[j + 0].v.ob[2] = pauseCtx->infoPanelVtx[j + 1].v.ob[2] = pauseCtx->infoPanelVtx[j + 2].v.ob[2] = pauseCtx->infoPanelVtx[j + 3].v.ob[2] = 0; @@ -1727,9 +1767,9 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[j + 0].v.tc[0] = pauseCtx->infoPanelVtx[j + 0].v.tc[1] = pauseCtx->infoPanelVtx[j + 1].v.tc[1] = pauseCtx->infoPanelVtx[j + 2].v.tc[0] = 0; - pauseCtx->infoPanelVtx[j + 1].v.tc[0] = pauseCtx->infoPanelVtx[j + 3].v.tc[0] = 0x900; + pauseCtx->infoPanelVtx[j + 1].v.tc[0] = pauseCtx->infoPanelVtx[j + 3].v.tc[0] = 72 * (1 << 5); - pauseCtx->infoPanelVtx[j + 2].v.tc[1] = pauseCtx->infoPanelVtx[j + 3].v.tc[1] = 0x300; + pauseCtx->infoPanelVtx[j + 2].v.tc[1] = pauseCtx->infoPanelVtx[j + 3].v.tc[1] = 24 * (1 << 5); pauseCtx->infoPanelVtx[j + 0].v.cn[0] = pauseCtx->infoPanelVtx[j + 2].v.cn[0] = pauseCtx->infoPanelVtx[j + 0].v.cn[1] = pauseCtx->infoPanelVtx[j + 2].v.cn[1] = @@ -1747,52 +1787,52 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[5].v.ob[0] = pauseCtx->infoPanelVtx[7].v.ob[0] = pauseCtx->infoPanelVtx[4].v.ob[0] + 72; if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) { - pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = WREG(16); + pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = R_PAUSE_CURSOR_LEFT_X; pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 24; - pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = WREG(18); + pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = R_PAUSE_CURSOR_LEFT_RIGHT_Y; pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] = pauseCtx->infoPanelVtx[8].v.ob[1] - 32; } else { - pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = WREG(16) + 3; + pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = R_PAUSE_CURSOR_LEFT_X + 3; pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 18; - pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = WREG(18) - 3; + pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = R_PAUSE_CURSOR_LEFT_RIGHT_Y - 3; pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] = pauseCtx->infoPanelVtx[8].v.ob[1] - 26; } if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) { - pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = WREG(17); + pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = R_PAUSE_CURSOR_RIGHT_X; pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] = pauseCtx->infoPanelVtx[12].v.ob[0] + 24; - pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = WREG(18); + pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = R_PAUSE_CURSOR_LEFT_RIGHT_Y; pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] = pauseCtx->infoPanelVtx[12].v.ob[1] - 32; } else { - pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = WREG(17) + 3; + pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = R_PAUSE_CURSOR_RIGHT_X + 3; pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] = pauseCtx->infoPanelVtx[12].v.ob[0] + 18; - pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = WREG(18) - 3; + pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = R_PAUSE_CURSOR_LEFT_RIGHT_Y - 3; pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] = pauseCtx->infoPanelVtx[12].v.ob[1] - 26; } pauseCtx->infoPanelVtx[9].v.tc[0] = pauseCtx->infoPanelVtx[11].v.tc[0] = pauseCtx->infoPanelVtx[13].v.tc[0] = - pauseCtx->infoPanelVtx[15].v.tc[0] = 0x300; + pauseCtx->infoPanelVtx[15].v.tc[0] = 24 * (1 << 5); pauseCtx->infoPanelVtx[10].v.tc[1] = pauseCtx->infoPanelVtx[11].v.tc[1] = pauseCtx->infoPanelVtx[14].v.tc[1] = - pauseCtx->infoPanelVtx[15].v.tc[1] = 0x400; + pauseCtx->infoPanelVtx[15].v.tc[1] = 32 * (1 << 5); gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); @@ -1807,7 +1847,8 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { gSPDisplayList(POLY_OPA_DISP++, gItemNamePanelDL); if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorLeftRightSelectedPrimRed, sCursorLeftRightSelectedPrimGreen, + sCursorLeftRightSelectedPrimBlue, sCursorLeftRightSelectedPrimAlpha); } gSPDisplayList(POLY_OPA_DISP++, gLButtonIconDL); @@ -1815,7 +1856,8 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 210, 255, 220); if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorLeftRightSelectedPrimRed, sCursorLeftRightSelectedPrimGreen, + sCursorLeftRightSelectedPrimBlue, sCursorLeftRightSelectedPrimAlpha); } gSPDisplayList(POLY_OPA_DISP++, gRButtonIconDL); @@ -1827,12 +1869,12 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { KaleidoScope_DrawCursor(play, pauseCtx->pageIndex); } - temp = pauseCtx->infoPanelOffsetY - 80; - pauseCtx->infoPanelVtx[16].v.ob[1] = pauseCtx->infoPanelVtx[17].v.ob[1] = temp; + y = pauseCtx->infoPanelOffsetY - 80; + pauseCtx->infoPanelVtx[16].v.ob[1] = pauseCtx->infoPanelVtx[17].v.ob[1] = y; pauseCtx->infoPanelVtx[18].v.ob[1] = pauseCtx->infoPanelVtx[19].v.ob[1] = pauseCtx->infoPanelVtx[16].v.ob[1] - 16; - pauseCtx->infoPanelVtx[18].v.tc[1] = pauseCtx->infoPanelVtx[19].v.tc[1] = 0x200; + pauseCtx->infoPanelVtx[18].v.tc[1] = pauseCtx->infoPanelVtx[19].v.tc[1] = 16 * (1 << 5); gDPPipeSync(POLY_OPA_DISP++); gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, @@ -1840,23 +1882,26 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { gDPSetEnvColor(POLY_OPA_DISP++, 20, 30, 40, 0); if ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->namedItem != PAUSE_ITEM_NONE) && - (pauseCtx->nameDisplayTimer < WREG(89)) && + (pauseCtx->nameDisplayTimer < R_PAUSE_NAME_DISPLAY_TIMER_THRESHOLD_) && (((u32)pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) || - ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) && (pauseCtx->mainState <= PAUSE_MAIN_STATE_7)) || + ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) && + (pauseCtx->mainState <= PAUSE_MAIN_STATE_EQUIP_CHANGED)) || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) && (pauseCtx->cursorSpecialPos == 0)) { + if (((u32)pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) || ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) && - (pauseCtx->mainState <= PAUSE_MAIN_STATE_7)) || + (pauseCtx->mainState <= PAUSE_MAIN_STATE_EQUIP_CHANGED)) || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) { + pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63; pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 128; - pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 0x1000; + pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5); gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 4, 0); @@ -1902,7 +1947,7 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[26].v.ob[1] = pauseCtx->infoPanelVtx[27].v.ob[1] = pauseCtx->infoPanelVtx[24].v.ob[1] - 19; - pauseCtx->infoPanelVtx[25].v.tc[0] = pauseCtx->infoPanelVtx[27].v.tc[0] = 0x300; + pauseCtx->infoPanelVtx[25].v.tc[0] = pauseCtx->infoPanelVtx[27].v.tc[0] = 24 * (1 << 5); gDPPipeSync(POLY_OPA_DISP++); gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[24], 4, 0); @@ -1916,14 +1961,14 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { QUEST_ICON_HEIGHT, 0); } } - } else if ((pauseCtx->mainState < PAUSE_MAIN_STATE_3) || (pauseCtx->mainState == PAUSE_MAIN_STATE_7) || + } else if ((pauseCtx->mainState < PAUSE_MAIN_STATE_3) || (pauseCtx->mainState == PAUSE_MAIN_STATE_EQUIP_CHANGED) || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) { - pauseCtx->infoPanelVtx[20].v.ob[1] = pauseCtx->infoPanelVtx[21].v.ob[1] = temp; + pauseCtx->infoPanelVtx[20].v.ob[1] = pauseCtx->infoPanelVtx[21].v.ob[1] = y; pauseCtx->infoPanelVtx[22].v.ob[1] = pauseCtx->infoPanelVtx[23].v.ob[1] = pauseCtx->infoPanelVtx[20].v.ob[1] - 16; - pauseCtx->infoPanelVtx[22].v.tc[1] = pauseCtx->infoPanelVtx[23].v.tc[1] = 0x200; + pauseCtx->infoPanelVtx[22].v.tc[1] = pauseCtx->infoPanelVtx[23].v.tc[1] = 16 * (1 << 5); gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 8, 0); @@ -1938,20 +1983,21 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[16].v.ob[0] + R_KALEIDO_UNK2(gSaveContext.language); pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = - pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADE0[gSaveContext.language]; + pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADE0_toDecideTextWidth_[gSaveContext.language]; - pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 0x300; + pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5); - pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = D_8082ADE0[gSaveContext.language] - << 5; + pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = + D_8082ADE0_toDecideTextWidth_[gSaveContext.language] << 5; gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL); gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); - POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, D_8082AD60[gSaveContext.language], - D_8082ADE0[gSaveContext.language], 16, 4); + POLY_OPA_DISP = + KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, D_8082AD60_toDecideTextTextures_[gSaveContext.language], + D_8082ADE0_toDecideTextWidth_[gSaveContext.language], 16, 4); } else if (pauseCtx->cursorSpecialPos != 0) { if ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) { pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63; @@ -1959,17 +2005,19 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 128; - pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 0x1000; + pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5); gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 200, 0, 255); if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { POLY_OPA_DISP = KaleidoScope_QuadTextureIA8( - POLY_OPA_DISP, D_8082AD78[pauseCtx->pageIndex][gSaveContext.language], 128, 16, 0); + POLY_OPA_DISP, D_8082AD78_scrollLeftLabels_[pauseCtx->pageIndex][gSaveContext.language], 128, + 16, 0); } else { POLY_OPA_DISP = KaleidoScope_QuadTextureIA8( - POLY_OPA_DISP, D_8082ADA8[pauseCtx->pageIndex][gSaveContext.language], 128, 16, 0); + POLY_OPA_DISP, D_8082ADA8_scrollRightLabels_[pauseCtx->pageIndex][gSaveContext.language], 128, + 16, 0); } } } else { @@ -1984,25 +2032,29 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[16].v.ob[0] + R_KALEIDO_UNK4(gSaveContext.language); pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = - pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADD8[gSaveContext.language]; + pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADD8_toEquipTextWidth_[gSaveContext.language]; - pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 0x600; + pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 48 * (1 << 5); pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = - D_8082ADD8[gSaveContext.language] << 5; + D_8082ADD8_toEquipTextWidth_[gSaveContext.language] << 5; gSPDisplayList(POLY_OPA_DISP++, gCButtonIconsDL); gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); - POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, D_8082AD54[gSaveContext.language], - D_8082ADD8[gSaveContext.language], 16, 4); + POLY_OPA_DISP = + KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, D_8082AD54_toEquipTextTextures_[gSaveContext.language], + D_8082ADD8_toEquipTextWidth_[gSaveContext.language], 16, 4); } else if ((pauseCtx->pageIndex == PAUSE_MAP) && sInDungeonScene) { - } else if ((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= 6) && - (pauseCtx->cursorSlot[PAUSE_QUEST] <= 0x11)) { + } else if ((pauseCtx->pageIndex == PAUSE_QUEST) && + (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_MINUET) && + (pauseCtx->cursorSlot[PAUSE_QUEST] < QUEST_KOKIRI_EMERALD)) { if (pauseCtx->namedItem != PAUSE_ITEM_NONE) { + // The cursor is on a learned song + pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = R_KALEIDO_UNK3(gSaveContext.language); @@ -2020,20 +2072,21 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { #endif pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = - pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADE8[gSaveContext.language]; + pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADE8_toPlayMelodyTextWidth_[gSaveContext.language]; - pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 0x300; + pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5); pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = - D_8082ADE8[gSaveContext.language] << 5; + D_8082ADE8_toPlayMelodyTextWidth_[gSaveContext.language] << 5; gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL); gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); - POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, D_8082AD6C[gSaveContext.language], - D_8082ADE8[gSaveContext.language], 16, 4); + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8( + POLY_OPA_DISP, D_8082AD6C_toPlayMelodyTextTextures_[gSaveContext.language], + D_8082ADE8_toPlayMelodyTextWidth_[gSaveContext.language], 16, 4); } } else if (pauseCtx->pageIndex == PAUSE_EQUIP) { pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = @@ -2046,20 +2099,21 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[16].v.ob[0] + R_KALEIDO_UNK2(gSaveContext.language); pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = - pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADD8[gSaveContext.language]; + pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADD8_toEquipTextWidth_[gSaveContext.language]; - pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 0x300; + pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5); pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = - D_8082ADD8[gSaveContext.language] << 5; + D_8082ADD8_toEquipTextWidth_[gSaveContext.language] << 5; gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL); gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); - POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, D_8082AD54[gSaveContext.language], - D_8082ADD8[gSaveContext.language], 16, 4); + POLY_OPA_DISP = + KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, D_8082AD54_toEquipTextTextures_[gSaveContext.language], + D_8082ADD8_toEquipTextWidth_[gSaveContext.language], 16, 4); } } } @@ -2119,14 +2173,14 @@ void KaleidoScope_UpdateNamePanel(PlayState* play) { pauseCtx->nameDisplayTimer = 0; } } else if (pauseCtx->nameColorSet == 0) { - if (((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= 6) && - (pauseCtx->cursorSlot[PAUSE_QUEST] <= 0x11) && + if (((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_MINUET) && + (pauseCtx->cursorSlot[PAUSE_QUEST] < QUEST_KOKIRI_EMERALD) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) || (pauseCtx->pageIndex == PAUSE_ITEM) || - ((pauseCtx->pageIndex == PAUSE_EQUIP) && (pauseCtx->cursorX[PAUSE_EQUIP] != 0))) { + ((pauseCtx->pageIndex == PAUSE_EQUIP) && (pauseCtx->cursorX[PAUSE_EQUIP] != EQUIP_CURSOR_X_UPG))) { if (pauseCtx->namedItem != ITEM_SOLD_OUT) { pauseCtx->nameDisplayTimer++; - if (pauseCtx->nameDisplayTimer > WREG(88)) { + if (pauseCtx->nameDisplayTimer > R_PAUSE_NAME_DISPLAY_TIMER_MAX_) { pauseCtx->nameDisplayTimer = 0; } } @@ -2153,11 +2207,11 @@ void KaleidoScope_UpdatePageSwitch(PlayState* play, Input* input) { pauseCtx->eye.z += sPageSwitchEyeDz[nextPageMode]; if (pauseCtx->pageSwitchTimer < ((4 * PAGE_SWITCH_NSTEPS) / 2)) { - WREG(16) -= WREG(25) / WREG(6); - WREG(17) -= WREG(26) / WREG(6); + R_PAUSE_CURSOR_LEFT_X -= R_PAUSE_CURSOR_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_RIGHT_X -= R_PAUSE_CURSOR_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; } else { - WREG(16) += WREG(25) / WREG(6); - WREG(17) += WREG(26) / WREG(6); + R_PAUSE_CURSOR_LEFT_X += R_PAUSE_CURSOR_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_RIGHT_X += R_PAUSE_CURSOR_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; } pauseCtx->pageSwitchTimer += 4; @@ -2170,19 +2224,19 @@ void KaleidoScope_UpdatePageSwitch(PlayState* play, Input* input) { } } -void KaleidoScope_SetView(PauseContext* pauseCtx, f32 x, f32 y, f32 z) { +void KaleidoScope_SetView(PauseContext* pauseCtx, f32 eyeX, f32 eyeY, f32 eyeZ) { Vec3f eye; - Vec3f lookAt; + Vec3f at; Vec3f up; - eye.x = x; - eye.y = y; - eye.z = z; - lookAt.x = lookAt.y = lookAt.z = 0.0f; + eye.x = eyeX; + eye.y = eyeY; + eye.z = eyeZ; + at.x = at.y = at.z = 0.0f; up.x = up.z = 0.0f; up.y = 1.0f; - View_LookAt(&pauseCtx->view, &eye, &lookAt, &up); + View_LookAt(&pauseCtx->view, &eye, &at, &up); View_Apply(&pauseCtx->view, VIEW_ALL | VIEW_FORCE_VIEWING | VIEW_FORCE_VIEWPORT | VIEW_FORCE_PROJECTION_PERSPECTIVE); } @@ -2216,8 +2270,7 @@ static u8 sPageBgColorBlue[][4] = { static s16 sVtxPageItemQuadsX[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 }; static s16 sVtxPageEquipQuadsX[CLAMP_MIN(VTX_PAGE_EQUIP_QUADS, 1)] = { 0 }; static s16 sVtxPageMapDungeonQuadsX[VTX_PAGE_MAP_DUNGEON_QUADS] = { - 0xFFDC, 0x000C, 0xFFEE, 0x0046, 0x0046, 0x0046, 0xFFA8, 0xFFA8, 0xFFA8, - 0xFFA8, 0xFFA8, 0xFFA8, 0xFFA8, 0xFFA8, 0xFF96, 0xFFC2, 0xFFD8, + -36, 12, -18, 70, 70, 70, -88, -88, -88, -88, -88, -88, -88, -88, -106, -62, -40, }; static s16 sVtxPageQuestQuadsX[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 }; static s16 sVtxPageMapWorldQuadsX[VTX_PAGE_MAP_WORLD_QUADS] = { @@ -2261,11 +2314,11 @@ static s16 sVtxPagePromptQuadsX[VTX_PAGE_PROMPT_QUADS] = { -58, // PROMPT_QUAD_CHOICE_YES 10, // PROMPT_QUAD_CHOICE_NO }; + static s16 sVtxPageItemQuadsWidth[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 }; static s16 sVtxPageEquipQuadsWidth[CLAMP_MIN(VTX_PAGE_EQUIP_QUADS, 1)] = { 0 }; static s16 sVtxPageMapDungeonQuadsWidth[VTX_PAGE_MAP_DUNGEON_QUADS] = { - 0x0030, 0x0030, 0x0060, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0010, 0x0010, 0x0018, + 48, 48, 96, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 16, 16, 24, }; static s16 sVtxPageQuestQuadsWidth[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 }; static s16 sVtxPagePromptQuadsWidth[VTX_PAGE_PROMPT_QUADS] = { @@ -2275,11 +2328,11 @@ static s16 sVtxPagePromptQuadsWidth[VTX_PAGE_PROMPT_QUADS] = { 48, // PROMPT_QUAD_CHOICE_YES 48, // PROMPT_QUAD_CHOICE_NO }; + static s16 sVtxPageItemQuadsY[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 }; static s16 sVtxPageEquipQuadsY[CLAMP_MIN(VTX_PAGE_EQUIP_QUADS, 1)] = { 0 }; static s16 sVtxPageMapDungeonQuadsY[VTX_PAGE_MAP_DUNGEON_QUADS] = { - 0x001C, 0x001C, 0x002E, 0x001C, 0xFFFE, 0xFFE0, 0x0032, 0x0024, 0x0016, - 0x0008, 0xFFFA, 0xFFEC, 0xFFDE, 0xFFD0, 0x0012, 0x0012, 0x0032, + 28, 28, 46, 28, -2, -32, 50, 36, 22, 8, -6, -20, -34, -48, 18, 18, 50, }; static s16 sVtxPageQuestQuadsY[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 }; static s16 sVtxPageMapWorldQuadsY[VTX_PAGE_MAP_WORLD_QUADS] = { @@ -2323,11 +2376,11 @@ static s16 sVtxPagePromptQuadsY[VTX_PAGE_PROMPT_QUADS] = { -6, // PROMPT_QUAD_CHOICE_YES -6, // PROMPT_QUAD_CHOICE_NO }; + static s16 sVtxPageItemQuadsHeight[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 }; static s16 sVtxPageEquipQuadsHeight[CLAMP_MIN(VTX_PAGE_EQUIP_QUADS, 1)] = { 0 }; static s16 sVtxPageMapDungeonQuadsHeight[VTX_PAGE_MAP_DUNGEON_QUADS] = { - 0x0055, 0x0055, 0x0010, 0x0018, 0x0018, 0x0018, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0018, + 85, 85, 16, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 24, }; static s16 sVtxPageQuestQuadsHeight[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 }; static s16 sVtxPagePromptQuadsHeight[VTX_PAGE_PROMPT_QUADS] = { @@ -2660,9 +2713,14 @@ static s16 sItemVtxQuadsWithAmmo[] = { SLOT_MAGIC_BEAN * 4, // ITEM_QUAD_AMMO_BEAN_ }; -static s16 D_8082B12C[] = { -114, 12, 44, 76 }; +static s16 sEquipColumnsX[] = { -114, 12, 44, 76 }; -static u8 D_8082B134[] = { 1, 5, 9, 13 }; +static u8 sEquipQuadsFirstByEquipType_[EQUIP_TYPE_MAX] = { + EQUIP_QUAD_SWORD_KOKIRI, // EQUIP_TYPE_SWORD + EQUIP_QUAD_SHIELD_DEKU, // EQUIP_TYPE_SHIELD + EQUIP_QUAD_TUNIC_KOKIRI, // EQUIP_TYPE_TUNIC + EQUIP_QUAD_BOOTS_KOKIRI, // EQUIP_TYPE_BOOTS +}; static s16 sQuestQuadsX[] = { 74, // QUEST_MEDALLION_FOREST @@ -3078,19 +3136,29 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { } } - pauseCtx->equipVtx = GRAPH_ALLOC(gfxCtx, 112 * sizeof(Vtx)); + pauseCtx->equipVtx = GRAPH_ALLOC(gfxCtx, (EQUIP_QUAD_MAX * 4) * sizeof(Vtx)); - for (k = 0, i = 0, y = 58; i < 4; i++, y -= 32) { + // EQUIP_QUAD_UPG_BULLETBAG_QUIVER, EQUIP_QUAD_SWORD_KOKIRI, EQUIP_QUAD_SWORD_MASTER, EQUIP_QUAD_SWORD_BIGGORON, + // EQUIP_QUAD_UPG_BOMB_BAG, EQUIP_QUAD_SHIELD_DEKU, EQUIP_QUAD_SHIELD_HYLIAN, EQUIP_QUAD_SHIELD_MIRROR, + // EQUIP_QUAD_UPG_STRENGTH, EQUIP_QUAD_TUNIC_KOKIRI, EQUIP_QUAD_TUNIC_GORON, EQUIP_QUAD_TUNIC_ZORA, + // EQUIP_QUAD_UPG_SCALE, EQUIP_QUAD_BOOTS_KOKIRI, EQUIP_QUAD_BOOTS_IRON, EQUIP_QUAD_BOOTS_HOVER + + // for each row + for (k = 0, i = 0, y = (EQUIP_TYPE_MAX * EQUIP_GRID_CELL_HEIGHT) / 2 - 6; i < EQUIP_TYPE_MAX; + i++, y -= EQUIP_GRID_CELL_HEIGHT) { + // for each column for (j = 0; j < 4; j++, k += 4) { - pauseCtx->equipVtx[k + 0].v.ob[0] = pauseCtx->equipVtx[k + 2].v.ob[0] = D_8082B12C[j] + 2; + pauseCtx->equipVtx[k + 0].v.ob[0] = pauseCtx->equipVtx[k + 2].v.ob[0] = + sEquipColumnsX[j] + EQUIP_GRID_QUAD_MARGIN; pauseCtx->equipVtx[k + 1].v.ob[0] = pauseCtx->equipVtx[k + 3].v.ob[0] = - pauseCtx->equipVtx[k + 0].v.ob[0] + 28; + pauseCtx->equipVtx[k + 0].v.ob[0] + EQUIP_GRID_QUAD_WIDTH; - pauseCtx->equipVtx[k + 0].v.ob[1] = pauseCtx->equipVtx[k + 1].v.ob[1] = y + pauseCtx->pagesYOrigin1 - 2; + pauseCtx->equipVtx[k + 0].v.ob[1] = pauseCtx->equipVtx[k + 1].v.ob[1] = + y + pauseCtx->pagesYOrigin1 - EQUIP_GRID_QUAD_MARGIN; pauseCtx->equipVtx[k + 2].v.ob[1] = pauseCtx->equipVtx[k + 3].v.ob[1] = - pauseCtx->equipVtx[k + 0].v.ob[1] - 28; + pauseCtx->equipVtx[k + 0].v.ob[1] - EQUIP_GRID_QUAD_HEIGHT; pauseCtx->equipVtx[k + 0].v.ob[2] = pauseCtx->equipVtx[k + 1].v.ob[2] = pauseCtx->equipVtx[k + 2].v.ob[2] = pauseCtx->equipVtx[k + 3].v.ob[2] = 0; @@ -3102,7 +3170,7 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->equipVtx[k + 2].v.tc[0] = 0; pauseCtx->equipVtx[k + 1].v.tc[0] = pauseCtx->equipVtx[k + 2].v.tc[1] = pauseCtx->equipVtx[k + 3].v.tc[0] = - pauseCtx->equipVtx[k + 3].v.tc[1] = 0x400; + pauseCtx->equipVtx[k + 3].v.tc[1] = EQUIP_GRID_QUAD_TEX_SIZE * (1 << 5); pauseCtx->equipVtx[k + 0].v.cn[0] = pauseCtx->equipVtx[k + 1].v.cn[0] = pauseCtx->equipVtx[k + 2].v.cn[0] = pauseCtx->equipVtx[k + 3].v.cn[0] = pauseCtx->equipVtx[k + 0].v.cn[1] = @@ -3116,19 +3184,23 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { } } - for (j = 0; j < 4; j++, k += 4) { + // EQUIP_QUAD_SELECTED_SWORD, EQUIP_QUAD_SELECTED_SHIELD, EQUIP_QUAD_SELECTED_TUNIC, EQUIP_QUAD_SELECTED_BOOTS + + for (j = 0; j < EQUIP_TYPE_MAX; j++, k += 4) { if (CUR_EQUIP_VALUE(j) != 0) { - i = (CUR_EQUIP_VALUE(j) + D_8082B134[j] - 1) * 4; + i = (CUR_EQUIP_VALUE(j) - 1 + sEquipQuadsFirstByEquipType_[j]) * 4; - pauseCtx->equipVtx[k + 0].v.ob[0] = pauseCtx->equipVtx[k + 2].v.ob[0] = pauseCtx->equipVtx[i].v.ob[0] - 2; + pauseCtx->equipVtx[k + 0].v.ob[0] = pauseCtx->equipVtx[k + 2].v.ob[0] = + pauseCtx->equipVtx[i].v.ob[0] + EQUIP_GRID_SELECTED_QUAD_MARGIN; pauseCtx->equipVtx[k + 1].v.ob[0] = pauseCtx->equipVtx[k + 3].v.ob[0] = - pauseCtx->equipVtx[k + 0].v.ob[0] + 32; + pauseCtx->equipVtx[k + 0].v.ob[0] + EQUIP_GRID_SELECTED_QUAD_WIDTH; - pauseCtx->equipVtx[k + 0].v.ob[1] = pauseCtx->equipVtx[k + 1].v.ob[1] = pauseCtx->equipVtx[i].v.ob[1] + 2; + pauseCtx->equipVtx[k + 0].v.ob[1] = pauseCtx->equipVtx[k + 1].v.ob[1] = + pauseCtx->equipVtx[i].v.ob[1] - EQUIP_GRID_SELECTED_QUAD_MARGIN; pauseCtx->equipVtx[k + 2].v.ob[1] = pauseCtx->equipVtx[k + 3].v.ob[1] = - pauseCtx->equipVtx[k + 0].v.ob[1] - 32; + pauseCtx->equipVtx[k + 0].v.ob[1] - EQUIP_GRID_SELECTED_QUAD_HEIGHT; pauseCtx->equipVtx[k + 0].v.ob[2] = pauseCtx->equipVtx[k + 1].v.ob[2] = pauseCtx->equipVtx[k + 2].v.ob[2] = pauseCtx->equipVtx[k + 3].v.ob[2] = 0; @@ -3140,7 +3212,7 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->equipVtx[k + 2].v.tc[0] = 0; pauseCtx->equipVtx[k + 1].v.tc[0] = pauseCtx->equipVtx[k + 2].v.tc[1] = pauseCtx->equipVtx[k + 3].v.tc[0] = - pauseCtx->equipVtx[k + 3].v.tc[1] = 0x400; + pauseCtx->equipVtx[k + 3].v.tc[1] = EQUIP_GRID_SELECTED_QUAD_TEX_SIZE * (1 << 5); pauseCtx->equipVtx[k + 0].v.cn[0] = pauseCtx->equipVtx[k + 1].v.cn[0] = pauseCtx->equipVtx[k + 2].v.cn[0] = pauseCtx->equipVtx[k + 3].v.cn[0] = pauseCtx->equipVtx[k + 0].v.cn[1] = @@ -3154,16 +3226,20 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { } } - x = 112; + // EQUIP_QUAD_PLAYER_FIRST..EQUIP_QUAD_PLAYER_LAST + + x = PAUSE_EQUIP_PLAYER_HEIGHT; y = 50; while (true) { pauseCtx->equipVtx[k + 0].v.ob[0] = pauseCtx->equipVtx[k + 2].v.ob[0] = -64; - pauseCtx->equipVtx[k + 1].v.ob[0] = pauseCtx->equipVtx[k + 3].v.ob[0] = pauseCtx->equipVtx[k + 0].v.ob[0] + 64; + pauseCtx->equipVtx[k + 1].v.ob[0] = pauseCtx->equipVtx[k + 3].v.ob[0] = + pauseCtx->equipVtx[k + 0].v.ob[0] + PAUSE_EQUIP_PLAYER_WIDTH; pauseCtx->equipVtx[k + 0].v.ob[1] = pauseCtx->equipVtx[k + 1].v.ob[1] = y + pauseCtx->pagesYOrigin1; - pauseCtx->equipVtx[k + 2].v.ob[1] = pauseCtx->equipVtx[k + 3].v.ob[1] = pauseCtx->equipVtx[k + 0].v.ob[1] - 32; + pauseCtx->equipVtx[k + 2].v.ob[1] = pauseCtx->equipVtx[k + 3].v.ob[1] = + pauseCtx->equipVtx[k + 0].v.ob[1] - PAUSE_EQUIP_PLAYER_FRAG_HEIGHT; pauseCtx->equipVtx[k + 0].v.ob[2] = pauseCtx->equipVtx[k + 1].v.ob[2] = pauseCtx->equipVtx[k + 2].v.ob[2] = pauseCtx->equipVtx[k + 3].v.ob[2] = 0; @@ -3174,9 +3250,10 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->equipVtx[k + 0].v.tc[0] = pauseCtx->equipVtx[k + 0].v.tc[1] = pauseCtx->equipVtx[k + 1].v.tc[1] = pauseCtx->equipVtx[k + 2].v.tc[0] = 0; - pauseCtx->equipVtx[k + 1].v.tc[0] = pauseCtx->equipVtx[k + 3].v.tc[0] = 0x800; + pauseCtx->equipVtx[k + 1].v.tc[0] = pauseCtx->equipVtx[k + 3].v.tc[0] = PAUSE_EQUIP_PLAYER_WIDTH * (1 << 5); - pauseCtx->equipVtx[k + 2].v.tc[1] = pauseCtx->equipVtx[k + 3].v.tc[1] = 0x400; + pauseCtx->equipVtx[k + 2].v.tc[1] = pauseCtx->equipVtx[k + 3].v.tc[1] = + PAUSE_EQUIP_PLAYER_FRAG_HEIGHT * (1 << 5); pauseCtx->equipVtx[k + 0].v.cn[0] = pauseCtx->equipVtx[k + 1].v.cn[0] = pauseCtx->equipVtx[k + 2].v.cn[0] = pauseCtx->equipVtx[k + 3].v.cn[0] = pauseCtx->equipVtx[k + 0].v.cn[1] = pauseCtx->equipVtx[k + 1].v.cn[1] = @@ -3187,13 +3264,16 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->equipVtx[k + 0].v.cn[3] = pauseCtx->equipVtx[k + 1].v.cn[3] = pauseCtx->equipVtx[k + 2].v.cn[3] = pauseCtx->equipVtx[k + 3].v.cn[3] = pauseCtx->alpha; - x -= 32; - y -= 32; + x -= PAUSE_EQUIP_PLAYER_FRAG_HEIGHT; + y -= PAUSE_EQUIP_PLAYER_FRAG_HEIGHT; + if (x < 0) { pauseCtx->equipVtx[k + 2].v.ob[1] = pauseCtx->equipVtx[k + 3].v.ob[1] = - pauseCtx->equipVtx[k + 0].v.ob[1] - 0x10; + pauseCtx->equipVtx[k + 0].v.ob[1] - (PAUSE_EQUIP_PLAYER_HEIGHT % PAUSE_EQUIP_PLAYER_FRAG_HEIGHT); + + pauseCtx->equipVtx[k + 2].v.tc[1] = pauseCtx->equipVtx[k + 3].v.tc[1] = + (PAUSE_EQUIP_PLAYER_HEIGHT % PAUSE_EQUIP_PLAYER_FRAG_HEIGHT) * (1 << 5); - pauseCtx->equipVtx[k + 2].v.tc[1] = pauseCtx->equipVtx[k + 3].v.tc[1] = 0x200; break; } @@ -3286,8 +3366,10 @@ void KaleidoScope_DrawGameOver(PlayState* play) { gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0); - gDPSetPrimColor(POLY_OPA_DISP++, 0, 80, D_8082AB8C, D_8082AB90, D_8082AB94, D_8082AB98); - gDPSetEnvColor(POLY_OPA_DISP++, D_8082AB9C, D_8082ABA0, D_8082ABA4, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 80, sColor82ABRed_D_8082AB8C, sColor82ABGreen_D_8082AB90, + sColor82ABBlue_D_8082AB94, sColor82ABGameOverPrimAlpha_D_8082AB98); + gDPSetEnvColor(POLY_OPA_DISP++, sDrawGameOverEnvColorRed_D_8082AB9C, sDrawGameOverEnvColorGreen_D_8082ABA0, + sDrawGameOverEnvColorBlue_D_8082ABA4, 255); VREG(89) -= 2; @@ -3563,15 +3645,15 @@ void KaleidoScope_UpdateDungeonMap(PlayState* play) { void KaleidoScope_Update(PlayState* play) { static s16 sMainStateAfterSongPlayerPlayingDone = PAUSE_MAIN_STATE_IDLE; static s16 sDelayTimer = 10; - static s16 D_8082B260 = 0; + static s16 sTimer_ = 0; PauseContext* pauseCtx = &play->pauseCtx; InterfaceContext* interfaceCtx = &play->interfaceCtx; GameOverContext* gameOverCtx = &play->gameOverCtx; Player* player = GET_PLAYER(play); Input* input = &play->state.input[0]; u32 size; - u32 size0; - u32 size1; + u32 iconItemStaticSize; + u32 playerSegmentDrawPauseSize; u32 size2; u16 i; s16 stepR; @@ -3594,6 +3676,7 @@ void KaleidoScope_Update(PlayState* play) { KaleidoScope_HandlePageToggles(pauseCtx, input); } else if ((pauseCtx->pageIndex == PAUSE_QUEST) && ((pauseCtx->mainState < PAUSE_MAIN_STATE_3) || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT))) { + KaleidoScope_UpdateCursorVtx(play); } @@ -3604,32 +3687,34 @@ void KaleidoScope_Update(PlayState* play) { switch (pauseCtx->state) { case PAUSE_STATE_INIT: - D_808321A8[0] = gSaveContext.buttonStatus[0]; - D_808321A8[1] = gSaveContext.buttonStatus[1]; - D_808321A8[2] = gSaveContext.buttonStatus[2]; - D_808321A8[3] = gSaveContext.buttonStatus[3]; - D_808321A8[4] = gSaveContext.buttonStatus[4]; + D_808321A8_savedButtonStatus[0] = gSaveContext.buttonStatus[0]; + D_808321A8_savedButtonStatus[1] = gSaveContext.buttonStatus[1]; + D_808321A8_savedButtonStatus[2] = gSaveContext.buttonStatus[2]; + D_808321A8_savedButtonStatus[3] = gSaveContext.buttonStatus[3]; + D_808321A8_savedButtonStatus[4] = gSaveContext.buttonStatus[4]; pauseCtx->cursorX[PAUSE_MAP] = 0; pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->cursorPoint[PAUSE_MAP] = pauseCtx->dungeonMapSlot = VREG(30) + 3; - WREG(16) = -175; - WREG(17) = 155; + R_PAUSE_CURSOR_LEFT_X = -175; + R_PAUSE_CURSOR_RIGHT_X = 155; pauseCtx->promptPitch = -314.0f; //! @bug messed up alignment, should match `ALIGN64` pauseCtx->playerSegment = (void*)(((uintptr_t)play->objectCtx.spaceStart + 0x30) & ~0x3F); - size1 = Player_InitPauseDrawData(play, pauseCtx->playerSegment, &pauseCtx->playerSkelAnime); - PRINTF("プレイヤー size1=%x\n", size1); + playerSegmentDrawPauseSize = + Player_InitPauseDrawData(play, pauseCtx->playerSegment, &pauseCtx->playerSkelAnime); + PRINTF("プレイヤー size1=%x\n", playerSegmentDrawPauseSize); - pauseCtx->iconItemSegment = (void*)ALIGN16((uintptr_t)pauseCtx->playerSegment + size1); + pauseCtx->iconItemSegment = (void*)ALIGN16((uintptr_t)pauseCtx->playerSegment + playerSegmentDrawPauseSize); - size0 = (uintptr_t)_icon_item_staticSegmentRomEnd - (uintptr_t)_icon_item_staticSegmentRomStart; - PRINTF("icon_item size0=%x\n", size0); - DMA_REQUEST_SYNC(pauseCtx->iconItemSegment, (uintptr_t)_icon_item_staticSegmentRomStart, size0, + iconItemStaticSize = + (uintptr_t)_icon_item_staticSegmentRomEnd - (uintptr_t)_icon_item_staticSegmentRomStart; + PRINTF("icon_item size0=%x\n", iconItemStaticSize); + DMA_REQUEST_SYNC(pauseCtx->iconItemSegment, (uintptr_t)_icon_item_staticSegmentRomStart, iconItemStaticSize, "../z_kaleido_scope_PAL.c", 3662); gSegments[8] = VIRTUAL_TO_PHYSICAL(pauseCtx->iconItemSegment); @@ -3641,7 +3726,7 @@ void KaleidoScope_Update(PlayState* play) { } } - pauseCtx->iconItem24Segment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemSegment + size0); + pauseCtx->iconItem24Segment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemSegment + iconItemStaticSize); size = (uintptr_t)_icon_item_24_staticSegmentRomEnd - (uintptr_t)_icon_item_24_staticSegmentRomStart; PRINTF("icon_item24 size=%x\n", size); @@ -3670,6 +3755,7 @@ void KaleidoScope_Update(PlayState* play) { case SCENE_SPIRIT_TEMPLE_BOSS: case SCENE_SHADOW_TEMPLE_BOSS: sInDungeonScene = true; + size2 = (uintptr_t)_icon_item_dungeon_staticSegmentRomEnd - (uintptr_t)_icon_item_dungeon_staticSegmentRomStart; PRINTF("icon_item_dungeon dungeon-size2=%x\n", size2); @@ -3683,6 +3769,7 @@ void KaleidoScope_Update(PlayState* play) { default: sInDungeonScene = false; + size2 = (uintptr_t)_icon_item_field_staticSegmentRomEnd - (uintptr_t)_icon_item_field_staticSegmentRomStart; PRINTF("icon_item_field field-size2=%x\n", size2); @@ -3724,10 +3811,12 @@ void KaleidoScope_Update(PlayState* play) { pauseCtx->nameSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemLangSegment + size); - PRINTF("サイズ=%x\n", size2 + size1 + size0 + size); + // This printf may have been used to compute the size used on playerSegment at one point, + // but is missing the size of icon_item_24_static + PRINTF("サイズ=%x\n", size2 + playerSegmentDrawPauseSize + iconItemStaticSize + size); PRINTF("item_name I_N_PT=%x\n", 0x800); Interface_SetDoAction(play, DO_ACTION_DECIDE); - PRINTF("サイズ=%x\n", size2 + size1 + size0 + size + 0x800); + PRINTF("サイズ=%x\n", size2 + playerSegmentDrawPauseSize + iconItemStaticSize + size + 0x800); if (((void)0, gSaveContext.worldMapArea) < WORLD_MAP_AREA_MAX) { #if OOT_NTSC @@ -3980,13 +4069,13 @@ void KaleidoScope_Update(PlayState* play) { } pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch = pauseCtx->questPagePitch -= - 160.0f / WREG(6); - pauseCtx->infoPanelOffsetY += 40 / WREG(6); - interfaceCtx->startAlpha += 255 / WREG(6); - WREG(16) += WREG(25) / WREG(6); - WREG(17) += WREG(26) / WREG(6); - XREG(5) += 150 / WREG(6); - pauseCtx->alpha += (u16)(255 / (WREG(6) + WREG(4))); + 160.0f / R_PAUSE_UI_ANIMS_DURATION; + pauseCtx->infoPanelOffsetY += 40 / R_PAUSE_UI_ANIMS_DURATION; + interfaceCtx->startAlpha += 255 / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_LEFT_X += R_PAUSE_CURSOR_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_RIGHT_X += R_PAUSE_CURSOR_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + XREG(5) += 150 / R_PAUSE_UI_ANIMS_DURATION; + pauseCtx->alpha += (u16)(255 / (R_PAUSE_UI_ANIMS_DURATION + R_PAUSE_UI_ANIM_ALPHA_ADD_DURATION)); if (pauseCtx->itemPagePitch == 0) { interfaceCtx->startAlpha = 255; @@ -3998,7 +4087,7 @@ void KaleidoScope_Update(PlayState* play) { break; case PAUSE_STATE_OPENING_2: - pauseCtx->alpha += (u16)(255 / (WREG(6) + WREG(4))); + pauseCtx->alpha += (u16)(255 / (R_PAUSE_UI_ANIMS_DURATION + R_PAUSE_UI_ANIM_ALPHA_ADD_DURATION)); KaleidoScope_UpdateOpening(play); if (pauseCtx->state == PAUSE_STATE_MAIN) { @@ -4079,6 +4168,7 @@ void KaleidoScope_Update(PlayState* play) { pauseCtx->state = PAUSE_STATE_SAVE_PROMPT; } else if (pauseCtx->ocarinaStaff->state == pauseCtx->ocarinaSongIdx) { // The player successfully played the song + Audio_PlaySfxGeneral(NA_SE_SY_TRE_BOX_APPEAR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -4087,6 +4177,7 @@ void KaleidoScope_Update(PlayState* play) { pauseCtx->mainState = PAUSE_MAIN_STATE_SONG_PROMPT_DONE; } else if (pauseCtx->ocarinaStaff->state == 0xFF) { // The player failed to play the song + Audio_PlaySfxGeneral(NA_SE_SY_OCARINA_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -4106,7 +4197,7 @@ void KaleidoScope_Update(PlayState* play) { } break; - case PAUSE_MAIN_STATE_7: + case PAUSE_MAIN_STATE_EQUIP_CHANGED: break; case PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG: @@ -4146,9 +4237,10 @@ void KaleidoScope_Update(PlayState* play) { case PAUSE_STATE_SAVE_PROMPT: switch (pauseCtx->savePromptState) { case PAUSE_SAVE_PROMPT_STATE_APPEARING: - pauseCtx->promptPitch -= 314.0f / WREG(6); - WREG(16) -= WREG(25) / WREG(6); - WREG(17) -= WREG(26) / WREG(6); + pauseCtx->promptPitch -= 314.0f / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_LEFT_X -= R_PAUSE_CURSOR_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_RIGHT_X -= R_PAUSE_CURSOR_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + if (pauseCtx->promptPitch <= -628.0f) { pauseCtx->promptPitch = -628.0f; pauseCtx->savePromptState = PAUSE_SAVE_PROMPT_STATE_WAIT_CHOICE; @@ -4159,10 +4251,12 @@ void KaleidoScope_Update(PlayState* play) { if (CHECK_BTN_ALL(input->press.button, BTN_A)) { if (pauseCtx->promptChoice != 0) { Interface_SetDoAction(play, DO_ACTION_NONE); + gSaveContext.buttonStatus[0] = gSaveContext.buttonStatus[1] = gSaveContext.buttonStatus[2] = gSaveContext.buttonStatus[3] = BTN_ENABLED; gSaveContext.hudVisibilityMode = HUD_VISIBILITY_NO_CHANGE; Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_ALL); + pauseCtx->savePromptState = PAUSE_SAVE_PROMPT_STATE_CLOSING; R_PAUSE_PAGES_Y_ORIGIN_2 = PAUSE_PAGES_Y_ORIGIN_2_LOWER; YREG(8) = pauseCtx->promptPitch; @@ -4174,9 +4268,11 @@ void KaleidoScope_Update(PlayState* play) { Audio_PlaySfxGeneral(NA_SE_SY_PIECE_OF_HEART, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Play_SaveSceneFlags(play); gSaveContext.save.info.playerData.savedSceneId = play->sceneId; Sram_WriteSave(&play->sramCtx); + pauseCtx->savePromptState = PAUSE_SAVE_PROMPT_STATE_SAVED; #if PLATFORM_N64 sDelayTimer = 90; @@ -4186,11 +4282,14 @@ void KaleidoScope_Update(PlayState* play) { } } else if (CHECK_BTN_ALL(input->press.button, BTN_START) || CHECK_BTN_ALL(input->press.button, BTN_B)) { + Interface_SetDoAction(play, DO_ACTION_NONE); + pauseCtx->savePromptState = PAUSE_SAVE_PROMPT_STATE_CLOSING; R_PAUSE_PAGES_Y_ORIGIN_2 = PAUSE_PAGES_Y_ORIGIN_2_LOWER; YREG(8) = pauseCtx->promptPitch; func_800F64E0(0); + gSaveContext.buttonStatus[0] = gSaveContext.buttonStatus[1] = gSaveContext.buttonStatus[2] = gSaveContext.buttonStatus[3] = BTN_ENABLED; gSaveContext.hudVisibilityMode = HUD_VISIBILITY_NO_CHANGE; @@ -4204,11 +4303,14 @@ void KaleidoScope_Update(PlayState* play) { case PAUSE_SAVE_PROMPT_STATE_SAVED: if (CHECK_BTN_ALL(input->press.button, BTN_B) || CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_START) || (--sDelayTimer == 0)) { + Interface_SetDoAction(play, DO_ACTION_NONE); + gSaveContext.buttonStatus[0] = gSaveContext.buttonStatus[1] = gSaveContext.buttonStatus[2] = gSaveContext.buttonStatus[3] = BTN_ENABLED; gSaveContext.hudVisibilityMode = HUD_VISIBILITY_NO_CHANGE; Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_ALL); + pauseCtx->savePromptState = PAUSE_SAVE_PROMPT_STATE_CLOSING_AFTER_SAVED; R_PAUSE_PAGES_Y_ORIGIN_2 = PAUSE_PAGES_Y_ORIGIN_2_LOWER; YREG(8) = pauseCtx->promptPitch; @@ -4218,9 +4320,10 @@ void KaleidoScope_Update(PlayState* play) { case PAUSE_SAVE_PROMPT_STATE_RETURN_TO_MENU: case PAUSE_SAVE_PROMPT_STATE_RETURN_TO_MENU_2: - pauseCtx->promptPitch += 314.0f / WREG(6); - WREG(16) += WREG(25) / WREG(6); - WREG(17) += WREG(26) / WREG(6); + pauseCtx->promptPitch += 314.0f / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_LEFT_X += R_PAUSE_CURSOR_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_RIGHT_X += R_PAUSE_CURSOR_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + if (pauseCtx->promptPitch >= -314.0f) { pauseCtx->state = PAUSE_STATE_MAIN; pauseCtx->savePromptState = PAUSE_SAVE_PROMPT_STATE_APPEARING; @@ -4234,13 +4337,13 @@ void KaleidoScope_Update(PlayState* play) { case PAUSE_SAVE_PROMPT_STATE_CLOSING_AFTER_SAVED: if (pauseCtx->promptPitch != (YREG(8) + 160.0f)) { pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch = - pauseCtx->questPagePitch += 160.0f / WREG(6); - pauseCtx->promptPitch += 160.0f / WREG(6); - pauseCtx->infoPanelOffsetY -= 40 / WREG(6); - WREG(16) -= WREG(25) / WREG(6); - WREG(17) -= WREG(26) / WREG(6); - XREG(5) -= 150 / WREG(6); - pauseCtx->alpha -= (u16)(255 / WREG(6)); + pauseCtx->questPagePitch += 160.0f / R_PAUSE_UI_ANIMS_DURATION; + pauseCtx->promptPitch += 160.0f / R_PAUSE_UI_ANIMS_DURATION; + pauseCtx->infoPanelOffsetY -= 40 / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_LEFT_X -= R_PAUSE_CURSOR_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_RIGHT_X -= R_PAUSE_CURSOR_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + XREG(5) -= 150 / R_PAUSE_UI_ANIMS_DURATION; + pauseCtx->alpha -= (u16)(255 / R_PAUSE_UI_ANIMS_DURATION); if (pauseCtx->promptPitch == (YREG(8) + 160.0f)) { pauseCtx->alpha = 0; } @@ -4263,19 +4366,20 @@ void KaleidoScope_Update(PlayState* play) { case PAUSE_STATE_10: pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->cursorPoint[PAUSE_MAP] = pauseCtx->dungeonMapSlot = VREG(30) + 3; - WREG(16) = -175; - WREG(17) = 155; + R_PAUSE_CURSOR_LEFT_X = -175; + R_PAUSE_CURSOR_RIGHT_X = 155; pauseCtx->promptPitch = -434.0f; Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_NOTHING); //! @bug messed up alignment, should match `ALIGN64` pauseCtx->iconItemSegment = (void*)(((uintptr_t)play->objectCtx.spaceStart + 0x30) & ~0x3F); - size0 = (uintptr_t)_icon_item_staticSegmentRomEnd - (uintptr_t)_icon_item_staticSegmentRomStart; - PRINTF("icon_item size0=%x\n", size0); - DMA_REQUEST_SYNC(pauseCtx->iconItemSegment, (uintptr_t)_icon_item_staticSegmentRomStart, size0, + iconItemStaticSize = + (uintptr_t)_icon_item_staticSegmentRomEnd - (uintptr_t)_icon_item_staticSegmentRomStart; + PRINTF("icon_item size0=%x\n", iconItemStaticSize); + DMA_REQUEST_SYNC(pauseCtx->iconItemSegment, (uintptr_t)_icon_item_staticSegmentRomStart, iconItemStaticSize, "../z_kaleido_scope_PAL.c", 4356); - pauseCtx->iconItem24Segment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemSegment + size0); + pauseCtx->iconItem24Segment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemSegment + iconItemStaticSize); size = (uintptr_t)_icon_item_24_staticSegmentRomEnd - (uintptr_t)_icon_item_24_staticSegmentRomStart; PRINTF("icon_item24 size=%x\n", size); DMA_REQUEST_SYNC(pauseCtx->iconItem24Segment, (uintptr_t)_icon_item_24_staticSegmentRomStart, size, @@ -4319,97 +4423,97 @@ void KaleidoScope_Update(PlayState* play) { } #endif - D_8082AB8C = 255; - D_8082AB90 = 130; - D_8082AB94 = 0; - D_8082AB98 = 0; - D_8082AB9C = 30; - D_8082ABA0 = 0; - D_8082ABA4 = 0; - D_8082B260 = 30; + sColor82ABRed_D_8082AB8C = 255; + sColor82ABGreen_D_8082AB90 = 130; + sColor82ABBlue_D_8082AB94 = 0; + sColor82ABGameOverPrimAlpha_D_8082AB98 = 0; + sDrawGameOverEnvColorRed_D_8082AB9C = 30; + sDrawGameOverEnvColorGreen_D_8082ABA0 = 0; + sDrawGameOverEnvColorBlue_D_8082ABA4 = 0; + sTimer_ = 30; VREG(88) = 98; pauseCtx->promptChoice = 0; pauseCtx->state++; // PAUSE_STATE_11 break; case PAUSE_STATE_11: - stepR = ABS(D_8082AB8C - 30) / D_8082B260; - stepG = ABS(D_8082AB90) / D_8082B260; - stepB = ABS(D_8082AB94) / D_8082B260; - stepA = ABS(D_8082AB98 - 255) / D_8082B260; - if (D_8082AB8C >= 30) { - D_8082AB8C -= stepR; + stepR = ABS(sColor82ABRed_D_8082AB8C - 30) / sTimer_; + stepG = ABS(sColor82ABGreen_D_8082AB90) / sTimer_; + stepB = ABS(sColor82ABBlue_D_8082AB94) / sTimer_; + stepA = ABS(sColor82ABGameOverPrimAlpha_D_8082AB98 - 255) / sTimer_; + if (sColor82ABRed_D_8082AB8C >= 30) { + sColor82ABRed_D_8082AB8C -= stepR; } else { - D_8082AB8C += stepR; + sColor82ABRed_D_8082AB8C += stepR; } - if (D_8082AB90 >= 0) { - D_8082AB90 -= stepG; + if (sColor82ABGreen_D_8082AB90 >= 0) { + sColor82ABGreen_D_8082AB90 -= stepG; } else { - D_8082AB90 += stepG; + sColor82ABGreen_D_8082AB90 += stepG; } - if (D_8082AB94 >= 0) { - D_8082AB94 -= stepB; + if (sColor82ABBlue_D_8082AB94 >= 0) { + sColor82ABBlue_D_8082AB94 -= stepB; } else { - D_8082AB94 += stepB; + sColor82ABBlue_D_8082AB94 += stepB; } - if (D_8082AB98 >= 255) { - D_8082AB98 -= stepA; + if (sColor82ABGameOverPrimAlpha_D_8082AB98 >= 255) { + sColor82ABGameOverPrimAlpha_D_8082AB98 -= stepA; } else { - D_8082AB98 += stepA; + sColor82ABGameOverPrimAlpha_D_8082AB98 += stepA; } - stepR = ABS(D_8082AB9C - 255) / D_8082B260; - stepG = ABS(D_8082ABA0 - 130) / D_8082B260; - stepB = ABS(D_8082ABA4) / D_8082B260; - if (D_8082AB9C >= 255) { - D_8082AB9C -= stepR; + stepR = ABS(sDrawGameOverEnvColorRed_D_8082AB9C - 255) / sTimer_; + stepG = ABS(sDrawGameOverEnvColorGreen_D_8082ABA0 - 130) / sTimer_; + stepB = ABS(sDrawGameOverEnvColorBlue_D_8082ABA4) / sTimer_; + if (sDrawGameOverEnvColorRed_D_8082AB9C >= 255) { + sDrawGameOverEnvColorRed_D_8082AB9C -= stepR; } else { - D_8082AB9C += stepR; + sDrawGameOverEnvColorRed_D_8082AB9C += stepR; } - if (D_8082ABA0 >= 130) { - D_8082ABA0 -= stepG; + if (sDrawGameOverEnvColorGreen_D_8082ABA0 >= 130) { + sDrawGameOverEnvColorGreen_D_8082ABA0 -= stepG; } else { - D_8082ABA0 += stepG; + sDrawGameOverEnvColorGreen_D_8082ABA0 += stepG; } - if (D_8082ABA4 >= 0) { - D_8082ABA4 -= stepB; + if (sDrawGameOverEnvColorBlue_D_8082ABA4 >= 0) { + sDrawGameOverEnvColorBlue_D_8082ABA4 -= stepB; } else { - D_8082ABA4 += stepB; + sDrawGameOverEnvColorBlue_D_8082ABA4 += stepB; } - D_8082B260--; - if (D_8082B260 == 0) { - D_8082AB8C = 30; - D_8082AB90 = 0; - D_8082AB94 = 0; - D_8082AB98 = 255; + sTimer_--; + if (sTimer_ == 0) { + sColor82ABRed_D_8082AB8C = 30; + sColor82ABGreen_D_8082AB90 = 0; + sColor82ABBlue_D_8082AB94 = 0; + sColor82ABGameOverPrimAlpha_D_8082AB98 = 255; - D_8082AB9C = 255; - D_8082ABA0 = 130; - D_8082ABA4 = 0; + sDrawGameOverEnvColorRed_D_8082AB9C = 255; + sDrawGameOverEnvColorGreen_D_8082ABA0 = 130; + sDrawGameOverEnvColorBlue_D_8082ABA4 = 0; pauseCtx->state++; // PAUSE_STATE_12 - D_8082B260 = 40; + sTimer_ = 40; } break; case PAUSE_STATE_12: - D_8082B260--; - if (D_8082B260 == 0) { + sTimer_--; + if (sTimer_ == 0) { pauseCtx->state = PAUSE_STATE_13; } break; case PAUSE_STATE_13: pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch = pauseCtx->questPagePitch = - pauseCtx->promptPitch -= 160.0f / WREG(6); - pauseCtx->infoPanelOffsetY += 40 / WREG(6); - interfaceCtx->startAlpha += 255 / WREG(6); + pauseCtx->promptPitch -= 160.0f / R_PAUSE_UI_ANIMS_DURATION; + pauseCtx->infoPanelOffsetY += 40 / R_PAUSE_UI_ANIMS_DURATION; + interfaceCtx->startAlpha += 255 / R_PAUSE_UI_ANIMS_DURATION; VREG(88) -= 3; - WREG(16) += WREG(25) / WREG(6); - WREG(17) += WREG(26) / WREG(6); - XREG(5) += 150 / WREG(6); - pauseCtx->alpha += (u16)(255 / (WREG(6) + WREG(4))); + R_PAUSE_CURSOR_LEFT_X += R_PAUSE_CURSOR_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_RIGHT_X += R_PAUSE_CURSOR_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + XREG(5) += 150 / R_PAUSE_UI_ANIMS_DURATION; + pauseCtx->alpha += (u16)(255 / (R_PAUSE_UI_ANIMS_DURATION + R_PAUSE_UI_ANIM_ALPHA_ADD_DURATION)); if (pauseCtx->promptPitch < -628.0f) { pauseCtx->promptPitch = -628.0f; interfaceCtx->startAlpha = 255; @@ -4575,23 +4679,21 @@ void KaleidoScope_Update(PlayState* play) { case PAUSE_STATE_CLOSING: if (pauseCtx->itemPagePitch != 160.0f) { pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch = - pauseCtx->questPagePitch += 160.0f / WREG(6); - pauseCtx->infoPanelOffsetY -= 40 / WREG(6); - interfaceCtx->startAlpha -= 255 / WREG(6); - WREG(16) -= WREG(25) / WREG(6); - WREG(17) -= WREG(26) / WREG(6); - XREG(5) -= 150 / WREG(6); - pauseCtx->alpha -= (u16)(255 / WREG(6)); + pauseCtx->questPagePitch += 160.0f / R_PAUSE_UI_ANIMS_DURATION; + pauseCtx->infoPanelOffsetY -= 40 / R_PAUSE_UI_ANIMS_DURATION; + interfaceCtx->startAlpha -= 255 / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_LEFT_X -= R_PAUSE_CURSOR_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + R_PAUSE_CURSOR_RIGHT_X -= R_PAUSE_CURSOR_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION; + XREG(5) -= 150 / R_PAUSE_UI_ANIMS_DURATION; + pauseCtx->alpha -= (u16)(255 / R_PAUSE_UI_ANIMS_DURATION); if (pauseCtx->itemPagePitch == 160.0f) { pauseCtx->alpha = 0; } } else { pauseCtx->debugState = 0; pauseCtx->state = PAUSE_STATE_RESUME_GAMEPLAY; - pauseCtx->questPagePitch = 160.0f; - pauseCtx->mapPagePitch = 160.0f; - pauseCtx->equipPagePitch = 160.0f; - pauseCtx->itemPagePitch = 160.0f; + pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch = pauseCtx->questPagePitch = + 160.0f; pauseCtx->namedItem = PAUSE_ITEM_NONE; play->interfaceCtx.startAlpha = 0; } @@ -4628,18 +4730,22 @@ void KaleidoScope_Update(PlayState* play) { break; } - gSaveContext.buttonStatus[0] = D_808321A8[0]; - gSaveContext.buttonStatus[1] = D_808321A8[1]; - gSaveContext.buttonStatus[2] = D_808321A8[2]; - gSaveContext.buttonStatus[3] = D_808321A8[3]; - gSaveContext.buttonStatus[4] = D_808321A8[4]; + gSaveContext.buttonStatus[0] = D_808321A8_savedButtonStatus[0]; + gSaveContext.buttonStatus[1] = D_808321A8_savedButtonStatus[1]; + gSaveContext.buttonStatus[2] = D_808321A8_savedButtonStatus[2]; + gSaveContext.buttonStatus[3] = D_808321A8_savedButtonStatus[3]; + gSaveContext.buttonStatus[4] = D_808321A8_savedButtonStatus[4]; + interfaceCtx->unk_1FA = interfaceCtx->unk_1FC = 0; + PRINTF(VT_FGCOL(YELLOW)); PRINTF("i=%d LAST_TIME_TYPE=%d\n", i, gSaveContext.prevHudVisibilityMode); gSaveContext.hudVisibilityMode = HUD_VISIBILITY_NO_CHANGE; Interface_ChangeHudVisibilityMode(gSaveContext.prevHudVisibilityMode); + player->talkActor = NULL; Player_SetEquipmentData(play, player); + PRINTF(VT_RST); break; } diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.h b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.h index 31b2ec48dd6..7dcc3d48648 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.h +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.h @@ -65,6 +65,55 @@ typedef enum QuestQuad { /* 47 */ QUEST_QUAD_MAX } QuestQuad; +#define EQUIP_CURSOR_X_UPG 0 +#define EQUIP_CURSOR_Y_BULLETBAG_QUIVER 0 + +#define EQUIP_GRID_CELL_WIDTH 32 +#define EQUIP_GRID_CELL_HEIGHT 32 +#define EQUIP_GRID_QUAD_MARGIN 2 +#define EQUIP_GRID_QUAD_WIDTH (EQUIP_GRID_CELL_WIDTH - (2 * EQUIP_GRID_QUAD_MARGIN)) +#define EQUIP_GRID_QUAD_HEIGHT (EQUIP_GRID_CELL_HEIGHT - (2 * EQUIP_GRID_QUAD_MARGIN)) +#define EQUIP_GRID_QUAD_TEX_SIZE 32 // both width and height + +#define EQUIP_GRID_SELECTED_QUAD_MARGIN (-2) +#define EQUIP_GRID_SELECTED_QUAD_WIDTH (EQUIP_GRID_QUAD_WIDTH - (2 * EQUIP_GRID_SELECTED_QUAD_MARGIN)) +#define EQUIP_GRID_SELECTED_QUAD_HEIGHT (EQUIP_GRID_QUAD_HEIGHT - (2 * EQUIP_GRID_SELECTED_QUAD_MARGIN)) +#define EQUIP_GRID_SELECTED_QUAD_TEX_SIZE 32 // both width and height + +typedef enum EquipQuad { + // Grid of upgrades and equips, left column is upgrades, others are equips, with one row per equip type + // Row 0 + /* 0 */ EQUIP_QUAD_UPG_BULLETBAG_QUIVER, + /* 1 */ EQUIP_QUAD_SWORD_KOKIRI, + /* 2 */ EQUIP_QUAD_SWORD_MASTER, + /* 3 */ EQUIP_QUAD_SWORD_BIGGORON, + // Row 1 + /* 4 */ EQUIP_QUAD_UPG_BOMB_BAG, + /* 5 */ EQUIP_QUAD_SHIELD_DEKU, + /* 6 */ EQUIP_QUAD_SHIELD_HYLIAN, + /* 7 */ EQUIP_QUAD_SHIELD_MIRROR, + // Row 2 + /* 8 */ EQUIP_QUAD_UPG_STRENGTH, + /* 9 */ EQUIP_QUAD_TUNIC_KOKIRI, + /* 10 */ EQUIP_QUAD_TUNIC_GORON, + /* 11 */ EQUIP_QUAD_TUNIC_ZORA, + // Row 3 + /* 12 */ EQUIP_QUAD_UPG_SCALE, + /* 13 */ EQUIP_QUAD_BOOTS_KOKIRI, + /* 14 */ EQUIP_QUAD_BOOTS_IRON, + /* 15 */ EQUIP_QUAD_BOOTS_HOVER, + // Markers indicating the currently selected equip + /* 16 */ EQUIP_QUAD_SELECTED_SWORD, + /* 17 */ EQUIP_QUAD_SELECTED_SHIELD, + /* 18 */ EQUIP_QUAD_SELECTED_TUNIC, + /* 19 */ EQUIP_QUAD_SELECTED_BOOTS, + // Player prerender + /* 20 */ EQUIP_QUAD_PLAYER_FIRST, + /* 23 */ EQUIP_QUAD_PLAYER_LAST = EQUIP_QUAD_PLAYER_FIRST + PAUSE_EQUIP_PLAYER_FRAG_NUM - 1, + // 24..27 are unused, probably meant for player prerender + /* 28 */ EQUIP_QUAD_MAX = EQUIP_QUAD_PLAYER_LAST + 4 + 1 +} EquipQuad; + // The world map image is split into a number of quad fragments for drawing #define WORLD_MAP_IMAGE_WIDTH 216 #define WORLD_MAP_IMAGE_HEIGHT 128