diff --git a/include/z64pause.h b/include/z64pause.h index 9116003e86..da0e56038a 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_kaleido_setup.c b/src/code/z_kaleido_setup.c index 3b88de28c3..2cffb853f5 100644 --- a/src/code/z_kaleido_setup.c +++ b/src/code/z_kaleido_setup.c @@ -160,8 +160,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/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 75c942820d..6b7da76bbd 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -13,18 +13,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) { @@ -46,15 +88,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, @@ -76,7 +118,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, @@ -156,7 +198,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); @@ -170,6 +214,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; @@ -185,12 +231,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; } @@ -232,7 +279,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; } @@ -279,17 +326,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; @@ -301,13 +352,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; @@ -328,25 +381,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; @@ -362,7 +419,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } } - } else { + } else { // cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT if (pauseCtx->stickAdjX < -30) { pauseCtx->nameDisplayTimer = 0; pauseCtx->cursorSpecialPos = 0; @@ -372,18 +429,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; @@ -401,11 +460,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]] + @@ -413,7 +475,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]] + @@ -430,8 +493,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; @@ -445,6 +509,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; } @@ -457,7 +523,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; @@ -469,20 +536,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_INDEX_1DX] = 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 { @@ -490,8 +562,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; } @@ -502,7 +573,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, @@ -514,7 +587,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; @@ -524,13 +597,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] = @@ -545,13 +624,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]); @@ -562,6 +647,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); @@ -572,12 +659,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) { @@ -587,13 +682,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)) { #ifndef AVOID_UB //! @bug: This function shouldn't take any arguments KaleidoScope_ProcessPlayerPreRender(play); @@ -609,6 +706,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_scope.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c index cf4c408427..6926c9d1f6 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c @@ -1876,13 +1876,14 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { (pauseCtx->nameDisplayTimer < WREG(89)) && (((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; @@ -1949,7 +1950,7 @@ 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; @@ -2156,7 +2157,7 @@ void KaleidoScope_UpdateNamePanel(PlayState* play) { ((pauseCtx->cursorSlot[PAUSE_QUEST] >= 6) && (pauseCtx->cursorSlot[PAUSE_QUEST] <= 0x11)) && (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)) { @@ -2691,9 +2692,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 @@ -3109,19 +3115,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; @@ -3133,7 +3149,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] = @@ -3147,19 +3163,23 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { } } - for (j = 0; j < 4; k += 4, j++) { + // EQUIP_QUAD_SELECTED_SWORD, EQUIP_QUAD_SELECTED_SHIELD, EQUIP_QUAD_SELECTED_TUNIC, EQUIP_QUAD_SELECTED_BOOTS + + for (j = 0; j < EQUIP_TYPE_MAX; k += 4, j++) { if (CUR_EQUIP_VALUE(j) != 0) { - i = (CUR_EQUIP_VALUE(j) + D_8082B134[j] - 1) * 4; + i = (CUR_EQUIP_VALUE(j) + sEquipQuadsFirstByEquipType[j] - 1) * 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; @@ -3171,7 +3191,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] = @@ -3185,16 +3205,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; for (;;) { 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; @@ -3205,9 +3229,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] = @@ -3218,16 +3243,18 @@ 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; + x -= 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; } - y -= 32; + y -= PAUSE_EQUIP_PLAYER_FRAG_HEIGHT; k += 4; } @@ -4144,7 +4171,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: 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 27454ee1f7..fcc84c5395 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.h +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.h @@ -69,6 +69,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