Fixed pause menu buttons not interpolating, skipped cursor interpolation when it moves, fixed pause menu panels popping in on widescreen

This commit is contained in:
Mr-Wiseguy 2024-04-04 02:11:48 -04:00
parent 407b6e547c
commit 6848645854
4 changed files with 859 additions and 8 deletions

View File

@ -34,6 +34,9 @@
#define gEXMatrixGroupDecomposedVerts(cmd, id, push, proj, edit) \ #define gEXMatrixGroupDecomposedVerts(cmd, id, push, proj, edit) \
gEXMatrixGroupDecomposed(cmd, id, push, proj, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, edit) gEXMatrixGroupDecomposed(cmd, id, push, proj, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, edit)
#define gEXMatrixGroupDecomposedVertsOrderAuto(cmd, id, push, proj, edit) \
gEXMatrixGroupDecomposed(cmd, id, push, proj, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, edit)
int recomp_printf(const char* fmt, ...); int recomp_printf(const char* fmt, ...);
float recomp_powf(float, float); float recomp_powf(float, float);

View File

@ -1,5 +1,13 @@
__start = 0x80000000; __start = 0x80000000;
/* Manual symbol overrides to work around recompiler ambiguity issue (TODO fix this) */
_ovl_daytelopSegmentOvlEnd = 0x0;
_ovl_kaleido_scopeSegmentTextStart = 0x0;
_ovl_kaleido_scopeSegmentStart = 0x0;
_ovl_daytelopSegmentBssStart = 0x0;
_ovl_daytelopSegmentEnd = 0x0;
_ovl_daytelopSegmentBssEnd = 0x0;
/* Static symbols that aren't in the elf */ /* Static symbols that aren't in the elf */
sSceneEntranceTable = 0x801C5720; sSceneEntranceTable = 0x801C5720;
D_808DE5B0 = 0x808DE5B0; D_808DE5B0 = 0x808DE5B0;
@ -31,3 +39,4 @@ bzero_recomp = 0x8F00005C;
osFlashWriteArray_recomp = 0x8F000060; osFlashWriteArray_recomp = 0x8F000060;
osFlashWriteBuffer_recomp = 0x8F000064; osFlashWriteBuffer_recomp = 0x8F000064;
osWritebackDCache_recomp = 0x8F000068; osWritebackDCache_recomp = 0x8F000068;
recomp_get_pending_set_time = 0x8F00006C;

View File

@ -8,6 +8,8 @@
#define TEXTBOX_TRANSFORM_PROJECTION_ID 0x14U #define TEXTBOX_TRANSFORM_PROJECTION_ID 0x14U
#define LETTERBOX_TRANSFORM_ID 0x15U #define LETTERBOX_TRANSFORM_ID 0x15U
#define LETTERBOX_TRANSFORM_PROJECTION_ID 0x16U #define LETTERBOX_TRANSFORM_PROJECTION_ID 0x16U
#define PAUSE_CURSOR_TRANSFORM_ID 0x17U
#define PAUSE_INFO_PANEL_TRANSFORM_ID 0x18U
#define SKYBOX_TRANSFORM_ID_START 0x100U #define SKYBOX_TRANSFORM_ID_START 0x100U
@ -19,7 +21,6 @@
#define BOWSTRING_TRANSFORM_ID 0x400U #define BOWSTRING_TRANSFORM_ID 0x400U
#define HOOKSHOT_RETICLE_TRANSFORM_ID 0x401U #define HOOKSHOT_RETICLE_TRANSFORM_ID 0x401U
#define PAUSE_CURSOR_TRANSFORM_ID_START 0x500U
#define GOHT_ROCKS_TRANSFORM_ID_START 0x600U // Count: 0x200 #define GOHT_ROCKS_TRANSFORM_ID_START 0x600U // Count: 0x200
#define SPECIAL_EFFECTS_TRANSFORM_ID_START 0x800U #define SPECIAL_EFFECTS_TRANSFORM_ID_START 0x800U

View File

@ -2,6 +2,16 @@
#include "transform_ids.h" #include "transform_ids.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.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 sCursorPrimR;
extern s16 sCursorPrimG; extern s16 sCursorPrimG;
extern s16 sCursorPrimB; extern s16 sCursorPrimB;
@ -12,6 +22,37 @@ extern f32 sCursorCirclesX[4];
extern f32 sCursorCirclesY[4]; extern f32 sCursorCirclesY[4];
extern u64 gPauseMenuCursorTex[]; 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) { s16 kaleido_s16(s16* addr) {
return *(s16*)KaleidoManager_GetRamAddr(addr); return *(s16*)KaleidoManager_GetRamAddr(addr);
@ -21,6 +62,89 @@ f32 kaleido_f32(f32* addr) {
return *(f32*)KaleidoManager_GetRamAddr(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) { void KaleidoScope_DrawCursor(PlayState* play) {
PauseContext* pauseCtx = &play->pauseCtx; PauseContext* pauseCtx = &play->pauseCtx;
s16 i; s16 i;
@ -32,6 +156,10 @@ void KaleidoScope_DrawCursor(PlayState* play) {
((pauseCtx->pageIndex == PAUSE_QUEST) && ((pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PLAYBACK) || ((pauseCtx->pageIndex == PAUSE_QUEST) && ((pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
(pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) ||
(pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)))) { (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++); gDPPipeSync(POLY_OPA_DISP++);
gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
@ -43,14 +171,19 @@ void KaleidoScope_DrawCursor(PlayState* play) {
Matrix_Translate(pauseCtx->cursorX, pauseCtx->cursorY, -50.0f, MTXMODE_NEW); Matrix_Translate(pauseCtx->cursorX, pauseCtx->cursorY, -50.0f, MTXMODE_NEW);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); 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++) { for (i = 0; i < 4; i++) {
Matrix_Push(); Matrix_Push();
// @recomp manual relocations, TODO remove when recompiler can handle this. // @recomp manual relocations, TODO remove when recompiler can handle this.
Matrix_Translate(kaleido_f32(&sCursorCirclesX[i]), kaleido_f32(&sCursorCirclesY[i]), -50.0f, MTXMODE_APPLY); Matrix_Translate(kaleido_f32(&sCursorCirclesX[i]), kaleido_f32(&sCursorCirclesY[i]), -50.0f, MTXMODE_APPLY);
// @recomp Tag the current pause cursor segment.
gEXMatrixGroupDecomposedVerts(POLY_OPA_DISP++, PAUSE_CURSOR_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPPipeSync(POLY_OPA_DISP++); gDPPipeSync(POLY_OPA_DISP++);
gDPLoadTextureBlock(POLY_OPA_DISP++, gPauseMenuCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0, gDPLoadTextureBlock(POLY_OPA_DISP++, gPauseMenuCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0,
@ -59,15 +192,720 @@ void KaleidoScope_DrawCursor(PlayState* play) {
gSPVertex(POLY_OPA_DISP++, &pauseCtx->cursorVtx[0], 4, 0); gSPVertex(POLY_OPA_DISP++, &pauseCtx->cursorVtx[0], 4, 0);
gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
// @recomp Pop the pause cursor segment's transform id.
gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW);
Matrix_Pop(); Matrix_Pop();
} }
// @recomp Pop the pause cursor's transform id.
gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW);
gDPPipeSync(POLY_OPA_DISP++); gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); 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); 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);
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);
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);
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);
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);
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);
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);
Matrix_Translate(0.0f, 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);
Matrix_Translate(0.0f, 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);
}