#include "patches.h" #include "transform_ids.h" #include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" void KaleidoScope_DrawCursor(PlayState* play); void KaleidoScope_DrawGameOver(PlayState* play); void KaleidoScope_DrawInfoPanel(PlayState* play); void KaleidoScope_DrawOwlWarpInfoPanel(PlayState* play); void KaleidoScope_DrawOwlWarpMapPage(PlayState* play); void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx); Gfx* KaleidoScope_DrawPageSections(Gfx* gfx, Vtx* vertices, TexturePtr* textures); void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx); void KaleidoScope_UpdateCursorSize(PlayState* play); extern s16 sCursorPrimR; extern s16 sCursorPrimG; extern s16 sCursorPrimB; extern s16 sCursorEnvR; extern s16 sCursorEnvG; extern s16 sCursorEnvB; extern f32 sCursorCirclesX[4]; extern f32 sCursorCirclesY[4]; extern u64 gPauseMenuCursorTex[]; extern s16 sInDungeonScene; extern s16 sPauseCursorLeftX; extern s16 sPauseCursorRightX; extern s16 D_8082B920; extern s16 sPauseZRCursorColorTimerInits[]; extern TexturePtr D_8082B998[]; extern TexturePtr D_8082B9A8[]; extern Gfx gItemNamePanelDL[]; extern Gfx gZButtonIconDL[]; extern Gfx gRButtonIconDL[]; extern Gfx gAButtonIconDL[]; extern Gfx gCButtonIconsDL[]; extern u64 gPauseToDecideENGTex[]; extern u64 gPauseToEquipENGTex[]; extern u64 gPauseToViewNotebookENGTex[]; extern u64 gPauseToPlayMelodyENGTex[]; s16 sCursorPrimColorTarget[][3] = { { 255, 255, 255 }, { 255, 255, 255 }, { 255, 255, 0 }, { 255, 255, 0 }, { 100, 150, 255 }, { 100, 255, 255 }, }; s16 sCursorEnvColorTarget[][3] = { { 0, 0, 0 }, { 170, 170, 170 }, { 0, 0, 0 }, { 255, 160, 0 }, { 0, 0, 100 }, { 0, 150, 255 }, }; extern f32 sPauseMenuVerticalOffset; extern TexturePtr sItemPageBgTextures[]; extern TexturePtr sMapPageBgTextures[]; extern TexturePtr sQuestPageBgTextures[]; extern TexturePtr sMaskPageBgTextures[]; s16 kaleido_s16(s16* addr) { return *(s16*)KaleidoManager_GetRamAddr(addr); } f32 kaleido_f32(f32* addr) { return *(f32*)KaleidoManager_GetRamAddr(addr); } // @recomp Patched to set pageIndex to a dummy value when KaleidoScope_SetVertices is called to make it // allocate vertices for all pages at all times. This is simpler than patching KaleidoScope_SetVertices directly. void KaleidoScope_Draw(PlayState* play) { s32 pad; PauseContext* pauseCtx = &play->pauseCtx; InterfaceContext* interfaceCtx = &play->interfaceCtx; OPEN_DISPS(play->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x02, interfaceCtx->parameterSegment); gSPSegment(POLY_OPA_DISP++, 0x08, pauseCtx->iconItemSegment); gSPSegment(POLY_OPA_DISP++, 0x09, pauseCtx->iconItem24Segment); gSPSegment(POLY_OPA_DISP++, 0x0A, pauseCtx->nameSegment); gSPSegment(POLY_OPA_DISP++, 0x0C, pauseCtx->iconItemAltSegment); gSPSegment(POLY_OPA_DISP++, 0x0D, pauseCtx->iconItemLangSegment); gSPSegment(POLY_OPA_DISP++, 0x0B, pauseCtx->iconItemVtxSegment); if (pauseCtx->debugEditor == DEBUG_EDITOR_NONE) { KaleidoScope_SetView(pauseCtx, pauseCtx->eye.x, pauseCtx->eye.y, pauseCtx->eye.z); Gfx_SetupDL42_Opa(play->state.gfxCtx); if (!IS_PAUSE_STATE_OWL_WARP) { // Draw Default or Game Over Menus // @recomp Record the current pageIndex, then change it to a dummy value for the KaleidoScope_SetVertices. u16 saved_page_index = pauseCtx->pageIndex; pauseCtx->pageIndex = (u16)-1; KaleidoScope_SetVertices(play, play->state.gfxCtx); // @recomp Restore the old pageIndex value. pauseCtx->pageIndex = saved_page_index; KaleidoScope_DrawPages(play, play->state.gfxCtx); Gfx_SetupDL42_Opa(play->state.gfxCtx); gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); KaleidoScope_SetView(pauseCtx, 0.0f, 0.0f, 64.0f); if (!IS_PAUSE_STATE_GAMEOVER) { KaleidoScope_DrawInfoPanel(play); } KaleidoScope_UpdateCursorSize(play); if (pauseCtx->state == PAUSE_STATE_MAIN) { KaleidoScope_DrawCursor(play); } if ((pauseCtx->state >= PAUSE_STATE_GAMEOVER_3) && (pauseCtx->state <= PAUSE_STATE_GAMEOVER_10) && (play->gameOverCtx.state != GAMEOVER_INACTIVE)) { KaleidoScope_DrawGameOver(play); } } else { // Draw Owl Warp Menu // @recomp Record the current pageIndex, then change it to a dummy value for the KaleidoScope_SetVertices. u16 saved_page_index = pauseCtx->pageIndex; pauseCtx->pageIndex = (u16)-1; KaleidoScope_SetVertices(play, play->state.gfxCtx); // @recomp Restore the old pageIndex value. pauseCtx->pageIndex = saved_page_index; KaleidoScope_DrawPages(play, play->state.gfxCtx); KaleidoScope_DrawOwlWarpMapPage(play); Gfx_SetupDL42_Opa(play->state.gfxCtx); gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); KaleidoScope_SetView(pauseCtx, 0.0f, 0.0f, 64.0f); KaleidoScope_DrawOwlWarpInfoPanel(play); KaleidoScope_UpdateCursorSize(play); if (pauseCtx->state == PAUSE_STATE_OWL_WARP_SELECT) { KaleidoScope_DrawCursor(play); } } } if ((pauseCtx->debugEditor == DEBUG_EDITOR_INVENTORY_INIT) || (pauseCtx->debugEditor == DEBUG_EDITOR_INVENTORY)) { KaleidoScope_DrawInventoryEditor(play); } CLOSE_DISPS(play->state.gfxCtx); } void KaleidoScope_DrawCursor(PlayState* play) { PauseContext* pauseCtx = &play->pauseCtx; s16 i; OPEN_DISPS(play->state.gfxCtx); if ((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG) || ((pauseCtx->pageIndex == PAUSE_QUEST) && ((pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PLAYBACK) || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)))) { // @recomp Track the previously drawn cursor position. static f32 prev_cursor_x = 0.0f; static f32 prev_cursor_y = 0.0f; gDPPipeSync(POLY_OPA_DISP++); gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); // @recomp manual relocations, TODO remove when recompiler can handle this. gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, kaleido_s16(&sCursorPrimR), kaleido_s16(&sCursorPrimG), kaleido_s16(&sCursorPrimB), 255); gDPSetEnvColor(POLY_OPA_DISP++, kaleido_s16(&sCursorEnvR), kaleido_s16(&sCursorEnvG), kaleido_s16(&sCursorEnvB), 255); Matrix_Translate(pauseCtx->cursorX, pauseCtx->cursorY, -50.0f, MTXMODE_NEW); Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); // @recomp Tag the current pause cursor matrices. Skip interpolation if the cursor moved. if (pauseCtx->cursorX == prev_cursor_x && pauseCtx->cursorY == prev_cursor_y) { gEXMatrixGroupDecomposedVerts(POLY_OPA_DISP++, PAUSE_CURSOR_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } else { gEXMatrixGroupDecomposedSkipAll(POLY_OPA_DISP++, PAUSE_CURSOR_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } for (i = 0; i < 4; i++) { Matrix_Push(); // @recomp manual relocations, TODO remove when recompiler can handle this. Matrix_Translate(kaleido_f32(&sCursorCirclesX[i]), kaleido_f32(&sCursorCirclesY[i]), -50.0f, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPPipeSync(POLY_OPA_DISP++); gDPLoadTextureBlock(POLY_OPA_DISP++, gPauseMenuCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); gSPVertex(POLY_OPA_DISP++, &pauseCtx->cursorVtx[0], 4, 0); gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); Matrix_Pop(); } // @recomp Pop the pause cursor's transform id. gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); gDPPipeSync(POLY_OPA_DISP++); gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); // @recomp Update the tracked cursor position. prev_cursor_x = pauseCtx->cursorX; prev_cursor_y = pauseCtx->cursorY; } CLOSE_DISPS(play->state.gfxCtx); } /** * infoPanelVtx * * infoPanelVtx[0] name panel left texture * infoPanelVtx[4] name panel right texture * infoPanelVtx[8] Z Button icon * infoPanelVtx[12] R Button icon * infoPanelVtx[16] A button icon (or name segment) * infoPanelVtx[20] pause-to-decide texture * infoPanelVtx[24] (unused) oot remnant of Gold Skulltula Icon Texture */ // @recomp Patched to tag the matrix for interpolating the vertices of the Z button, R button, and name panel. void KaleidoScope_DrawInfoPanel(PlayState* play) { static s16 sPauseZRCursorColorTargets[][4] = { { 180, 210, 255, 220 }, { 100, 100, 150, 220 }, }; static s16 sPauseZRCursorColorTimer = 20; static s16 sPauseZRCursorColorIndex = 0; static s16 sPauseZRCursorRed; static s16 sPauseZRCursorGreen; static s16 sPauseZRCursorBlue; static s16 sPauseZRCursorAlpha; PauseContext* pauseCtx = &play->pauseCtx; s16 stepR; s16 stepG; s16 stepB; s16 stepA; s16 y; s16 i; s16 j; // @recomp Manual relocations, TODO remove when done automatically by the recompiler. s16* sPauseZRCursorColorTimerInits_reloc = KaleidoManager_GetRamAddr(&sPauseZRCursorColorTimerInits); TexturePtr* D_8082B998_reloc = KaleidoManager_GetRamAddr(&D_8082B998); TexturePtr* D_8082B9A8_reloc = KaleidoManager_GetRamAddr(&D_8082B9A8); OPEN_DISPS(play->state.gfxCtx); stepR = ABS_ALT(sPauseZRCursorRed - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) / sPauseZRCursorColorTimer; stepG = ABS_ALT(sPauseZRCursorGreen - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) / sPauseZRCursorColorTimer; stepB = ABS_ALT(sPauseZRCursorBlue - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) / sPauseZRCursorColorTimer; stepA = ABS_ALT(sPauseZRCursorAlpha - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) / sPauseZRCursorColorTimer; if (sPauseZRCursorRed >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) { sPauseZRCursorRed -= stepR; } else { sPauseZRCursorRed += stepR; } if (sPauseZRCursorGreen >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) { sPauseZRCursorGreen -= stepG; } else { sPauseZRCursorGreen += stepG; } if (sPauseZRCursorBlue >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) { sPauseZRCursorBlue -= stepB; } else { sPauseZRCursorBlue += stepB; } if (sPauseZRCursorAlpha >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) { sPauseZRCursorAlpha -= stepA; } else { sPauseZRCursorAlpha += stepA; } sPauseZRCursorColorTimer--; if (sPauseZRCursorColorTimer == 0) { sPauseZRCursorRed = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]; sPauseZRCursorGreen = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]; sPauseZRCursorBlue = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]; sPauseZRCursorAlpha = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]; sPauseZRCursorColorTimer = sPauseZRCursorColorTimerInits_reloc[0]; sPauseZRCursorColorIndex ^= 1; } 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] = y; 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; pauseCtx->infoPanelVtx[j + 0].v.flag = pauseCtx->infoPanelVtx[j + 1].v.flag = pauseCtx->infoPanelVtx[j + 2].v.flag = pauseCtx->infoPanelVtx[j + 3].v.flag = 0; 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] = 72 * (1 << 5); 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] = pauseCtx->infoPanelVtx[j + 0].v.cn[2] = pauseCtx->infoPanelVtx[j + 2].v.cn[2] = pauseCtx->infoPanelVtx[j + 1].v.cn[0] = pauseCtx->infoPanelVtx[j + 3].v.cn[0] = pauseCtx->infoPanelVtx[j + 1].v.cn[1] = pauseCtx->infoPanelVtx[j + 3].v.cn[1] = pauseCtx->infoPanelVtx[j + 1].v.cn[2] = pauseCtx->infoPanelVtx[j + 3].v.cn[2] = 200; pauseCtx->infoPanelVtx[j + 0].v.cn[3] = pauseCtx->infoPanelVtx[j + 2].v.cn[3] = pauseCtx->infoPanelVtx[j + 1].v.cn[3] = pauseCtx->infoPanelVtx[j + 3].v.cn[3] = pauseCtx->alpha; } pauseCtx->infoPanelVtx[4].v.ob[0] = pauseCtx->infoPanelVtx[6].v.ob[0] = pauseCtx->infoPanelVtx[0].v.ob[0] + 72; 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] = kaleido_s16(&sPauseCursorLeftX); 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] = kaleido_s16(&D_8082B920); 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] = kaleido_s16(&sPauseCursorLeftX) + 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] = kaleido_s16(&D_8082B920) - 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] = kaleido_s16(&sPauseCursorRightX); 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] = kaleido_s16(&D_8082B920); 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] = kaleido_s16(&sPauseCursorRightX) + 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] = kaleido_s16(&D_8082B920) - 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] = 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] = 32 * (1 << 5); gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); Matrix_Translate(0.0f, 0.0f, -144.0f, MTXMODE_NEW); Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); // @recomp Tag the matrix used for the for vertex interpolation. gEXMatrixGroupDecomposedVerts(POLY_OPA_DISP++, PAUSE_INFO_PANEL_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, 255); gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[0], 16, 0); // @recomp Pop the matrix tag. gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); // @recomp Multiply in an identity matrix to be able to split this into two matrix groups. gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_NOPUSH | G_MTX_MUL); gSPDisplayList(POLY_OPA_DISP++, gItemNamePanelDL); if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK))) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, sPauseZRCursorAlpha); } gSPDisplayList(POLY_OPA_DISP++, gZButtonIconDL); if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK))) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, sPauseZRCursorAlpha); } gSPDisplayList(POLY_OPA_DISP++, gRButtonIconDL); if (pauseCtx->cursorSpecialPos != 0) { j = (pauseCtx->cursorSpecialPos * 4) - 32; pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->infoPanelVtx[j].v.ob[0]; pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->infoPanelVtx[j].v.ob[1]; } 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] = 16 * (1 << 5); gDPPipeSync(POLY_OPA_DISP++); gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); gDPSetEnvColor(POLY_OPA_DISP++, 20, 30, 40, 0); if (pauseCtx->itemDescriptionOn || ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->namedItem != PAUSE_ITEM_NONE) && (pauseCtx->nameDisplayTimer < 40) && (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK) || ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) && (pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED)) || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) && (pauseCtx->cursorSpecialPos == 0))) { if (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK) || ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) && (pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED)) || (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] = 128 * (1 << 5); gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 4, 0); if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_GREY) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 70, 70, 70, 255); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); } POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, pauseCtx->nameSegment, G_IM_FMT_IA, 128, 16, 0); } } else if ((pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PLAYBACK) || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED) || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG) || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK)) { 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] = 16 * (1 << 5); gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 8, 0); if (pauseCtx->state == PAUSE_STATE_SAVEPROMPT) { pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -33; pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 24; pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 0x10; pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = pauseCtx->infoPanelVtx[20].v.ob[0] + 0x30; 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] = 48 * (1 << 5); gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL); gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); //! @bug: Incorrect dimensions. Should be 64x16 POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToDecideENGTex, G_IM_FMT_IA, 48, 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; 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] = 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 = Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B998_reloc[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0); } else { POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B9A8_reloc[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0); } } } else if ((!pauseCtx->pageIndex || (pauseCtx->pageIndex == PAUSE_MASK)) && (pauseCtx->namedItem != PAUSE_ITEM_NONE)) { pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -49; pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 48; pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 47; pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = pauseCtx->infoPanelVtx[20].v.ob[0] + 64; 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] = 64 * (1 << 5); gSPDisplayList(POLY_OPA_DISP++, gCButtonIconsDL); gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToEquipENGTex, G_IM_FMT_IA, 64, 16, 4); } else if ((pauseCtx->pageIndex == PAUSE_MAP) && kaleido_s16(&sInDungeonScene)) { // No code in this case } else if ((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] == QUEST_BOMBERS_NOTEBOOK)) { if (pauseCtx->namedItem != PAUSE_ITEM_NONE) { // The cursor is on the bombers notebook pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -58; pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 24; pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 0x14; pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = pauseCtx->infoPanelVtx[20].v.ob[0] + 0x60; 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] = 96 * (1 << 5); gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL); gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToViewNotebookENGTex, G_IM_FMT_IA, 96, 16, 4); } } else if ((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_SONATA) && (pauseCtx->cursorSlot[PAUSE_QUEST] <= QUEST_SONG_SUN) && (pauseCtx->namedItem != PAUSE_ITEM_NONE)) { // The cursor is on a learned song pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -55; pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 24; pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 20; pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = pauseCtx->infoPanelVtx[20].v.ob[0] + 96; 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] = 96 * (1 << 5); gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL); gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToPlayMelodyENGTex, G_IM_FMT_IA, 96, 16, 4); } } CLOSE_DISPS(play->state.gfxCtx); } // @recomp Patched to draw always all 4 pages and tag their matrices. void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { static s16 sCursorColorTimer = 10; static s16 sCursorColorTargetIndex = 0; PauseContext* pauseCtx = &play->pauseCtx; s16 stepR; s16 stepG; s16 stepB; // @recomp Manual relocation, TODO remove when recompiler handles it automatically. TexturePtr* sItemPageBgTextures_reloc = KaleidoManager_GetRamAddr(&sItemPageBgTextures); TexturePtr* sMapPageBgTextures_reloc = KaleidoManager_GetRamAddr(&sMapPageBgTextures); TexturePtr* sQuestPageBgTextures_reloc = KaleidoManager_GetRamAddr(&sQuestPageBgTextures); TexturePtr* sMaskPageBgTextures_reloc = KaleidoManager_GetRamAddr(&sMaskPageBgTextures); s16* sCursorPrimR_reloc = KaleidoManager_GetRamAddr(&sCursorPrimR); s16* sCursorPrimG_reloc = KaleidoManager_GetRamAddr(&sCursorPrimG); s16* sCursorPrimB_reloc = KaleidoManager_GetRamAddr(&sCursorPrimB); s16* sCursorEnvR_reloc = KaleidoManager_GetRamAddr(&sCursorEnvR); s16* sCursorEnvG_reloc = KaleidoManager_GetRamAddr(&sCursorEnvG); s16* sCursorEnvB_reloc = KaleidoManager_GetRamAddr(&sCursorEnvB); OPEN_DISPS(gfxCtx); if (!IS_PAUSE_STATE_GAMEOVER) { if (pauseCtx->state != PAUSE_STATE_SAVEPROMPT) { stepR = ABS_ALT(*sCursorPrimR_reloc - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) / sCursorColorTimer; stepG = ABS_ALT(*sCursorPrimG_reloc - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) / sCursorColorTimer; stepB = ABS_ALT(*sCursorPrimB_reloc - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) / sCursorColorTimer; if (*sCursorPrimR_reloc >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) { *sCursorPrimR_reloc -= stepR; } else { *sCursorPrimR_reloc += stepR; } if (*sCursorPrimG_reloc >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) { *sCursorPrimG_reloc -= stepG; } else { *sCursorPrimG_reloc += stepG; } if (*sCursorPrimB_reloc >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) { *sCursorPrimB_reloc -= stepB; } else { *sCursorPrimB_reloc += stepB; } stepR = ABS_ALT(*sCursorEnvR_reloc - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) / sCursorColorTimer; stepG = ABS_ALT(*sCursorEnvG_reloc - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) / sCursorColorTimer; stepB = ABS_ALT(*sCursorEnvB_reloc - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) / sCursorColorTimer; if (*sCursorEnvR_reloc >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) { *sCursorEnvR_reloc -= stepR; } else { *sCursorEnvR_reloc += stepR; } if (*sCursorEnvG_reloc >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) { *sCursorEnvG_reloc -= stepG; } else { *sCursorEnvG_reloc += stepG; } if (*sCursorEnvB_reloc >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) { *sCursorEnvB_reloc -= stepB; } else { *sCursorEnvB_reloc += stepB; } sCursorColorTimer--; if (sCursorColorTimer == 0) { *sCursorPrimR_reloc = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]; *sCursorPrimG_reloc = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]; *sCursorPrimB_reloc = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]; *sCursorEnvR_reloc = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]; *sCursorEnvG_reloc = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]; *sCursorEnvB_reloc = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]; sCursorColorTargetIndex ^= 1; sCursorColorTimer = 10; } } // @recomp Draw this page even when it's opposite the active one. if ((pauseCtx->pageIndex != PAUSE_ITEM)) { gDPPipeSync(POLY_OPA_DISP++); gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255); Matrix_RotateYF(0.0f, MTXMODE_NEW); // @recomp Manual relocation, TODO remove when automated. Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateXFApply(-pauseCtx->itemPageRoll / 100.0f); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sItemPageBgTextures_reloc); KaleidoScope_DrawItemSelect(play); } // @recomp Draw this page even when it's opposite the active one. if ((pauseCtx->pageIndex != PAUSE_MAP)) { gDPPipeSync(POLY_OPA_DISP++); gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255); Matrix_RotateYF(-1.57f, MTXMODE_NEW); // @recomp Manual relocation, TODO remove when automated. Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures_reloc); if (kaleido_s16(&sInDungeonScene)) { KaleidoScope_DrawDungeonMap(play); Gfx_SetupDL42_Opa(gfxCtx); gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); func_801091F0(play); } else { KaleidoScope_DrawWorldMap(play); } } // @recomp Draw this page even when it's opposite the active one. if ((pauseCtx->pageIndex != PAUSE_QUEST)) { gDPPipeSync(POLY_OPA_DISP++); gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP); gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255); Matrix_RotateYF(-3.14f, MTXMODE_NEW); // @recomp Manual relocation, TODO remove when automated. Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateXFApply(-pauseCtx->questPageRoll / 100.0f); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestPageBgTextures_reloc); KaleidoScope_DrawQuestStatus(play); } // @recomp Draw this page even when it's opposite the active one. if ((pauseCtx->pageIndex != PAUSE_MASK)) { gDPPipeSync(POLY_OPA_DISP++); gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP); gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255); Matrix_RotateYF(1.57f, MTXMODE_NEW); // @recomp Manual relocation, TODO remove when automated. Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateXFApply(-pauseCtx->maskPageRoll / 100.0f); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->maskPageVtx, sMaskPageBgTextures_reloc); KaleidoScope_DrawMaskSelect(play); } switch (pauseCtx->pageIndex) { case PAUSE_ITEM: if (pauseCtx->mainState <= PAUSE_MAIN_STATE_EQUIP_MASK) { gDPPipeSync(POLY_OPA_DISP++); gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255); Matrix_RotateYF(0.0f, MTXMODE_NEW); // @recomp Manual relocation, TODO remove when automated. Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateXFApply(-pauseCtx->itemPageRoll / 100.0f); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sItemPageBgTextures_reloc); KaleidoScope_DrawItemSelect(play); } break; case PAUSE_MAP: gDPPipeSync(POLY_OPA_DISP++); gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255); Matrix_RotateYF(-1.57f, MTXMODE_NEW); // @recomp Manual relocation, TODO remove when automated. Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures_reloc); if (kaleido_s16(&sInDungeonScene)) { KaleidoScope_DrawDungeonMap(play); Gfx_SetupDL42_Opa(gfxCtx); gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); func_801091F0(play); } else { Matrix_RotateYF(R_PAUSE_WORLD_MAP_YAW / 1000.0f, MTXMODE_NEW); if ((pauseCtx->state == PAUSE_STATE_OPENING_3) || (pauseCtx->state == PAUSE_STATE_OWL_WARP_3) || (pauseCtx->state >= PAUSE_STATE_OWL_WARP_6) || ((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) && ((pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_3) || (pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_7)))) { Matrix_Translate(0.0f, (R_PAUSE_WORLD_MAP_Y_OFFSET - 8000) / 100.0f, R_PAUSE_WORLD_MAP_DEPTH / 100.0f, MTXMODE_APPLY); } else { Matrix_Translate(0.0f, R_PAUSE_WORLD_MAP_Y_OFFSET / 100.0f, R_PAUSE_WORLD_MAP_DEPTH / 100.0f, MTXMODE_APPLY); } Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); KaleidoScope_DrawWorldMap(play); } break; case PAUSE_QUEST: gDPPipeSync(POLY_OPA_DISP++); gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255); gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP); Matrix_RotateYF(-3.14f, MTXMODE_NEW); // @recomp Manual relocation, TODO remove when automated. Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateXFApply(-pauseCtx->questPageRoll / 100.0f); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestPageBgTextures_reloc); KaleidoScope_DrawQuestStatus(play); break; case PAUSE_MASK: gDPPipeSync(POLY_OPA_DISP++); gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255); Matrix_RotateYF(1.57f, MTXMODE_NEW); // @recomp Manual relocation, TODO remove when automated. Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateXFApply(-pauseCtx->maskPageRoll / 100.0f); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->maskPageVtx, sMaskPageBgTextures_reloc); KaleidoScope_DrawMaskSelect(play); break; } } CLOSE_DISPS(gfxCtx); }