This commit is contained in:
Dragorn421 2025-07-03 23:10:17 +09:00 committed by GitHub
commit a246acd9e0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 302 additions and 160 deletions

View File

@ -1,5 +1,7 @@
#include "icon_item_static.h"
#include "versions.h"
// Item icons textures
u64 gItemIconDekuStickTex[TEX_LEN(u64, ITEM_ICON_WIDTH, ITEM_ICON_HEIGHT, 32)] = {
@ -746,33 +748,84 @@ u64 gMagicArrowEquipEffectTex[TEX_LEN(u64, gMagicArrowEquipEffectTex_WIDTH, gMag
};
Gfx gInfoPanelBgDL[18] = {
#include "assets/textures/icon_item_static/gInfoPanelBgDL.inc.c"
gsDPLoadTextureBlock(gInfoPanelBgLeftTex, G_IM_FMT_IA, G_IM_SIZ_8b, gInfoPanelBgLeftTex_WIDTH,
gInfoPanelBgLeftTex_HEIGHT, 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),
gsSP1Quadrangle(0, 2, 3, 1, 0),
gsDPLoadTextureBlock(gInfoPanelBgRightTex, G_IM_FMT_IA, G_IM_SIZ_8b, gInfoPanelBgRightTex_WIDTH,
gInfoPanelBgRightTex_HEIGHT, 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),
gsSP1Quadrangle(4, 6, 7, 5, 0),
gsDPPipeSync(),
gsSPEndDisplayList(),
};
Gfx gLButtonIconDL[10] = {
#include "assets/textures/icon_item_static/gLButtonIconDL.inc.c"
gsDPLoadTextureBlock(gLButtonTex, G_IM_FMT_IA, G_IM_SIZ_8b, gLButtonTex_WIDTH, gLButtonTex_HEIGHT, 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),
gsSP1Quadrangle(8, 10, 11, 9, 0),
gsDPPipeSync(),
gsSPEndDisplayList(),
};
Gfx gRButtonIconDL[10] = {
#include "assets/textures/icon_item_static/gRButtonIconDL.inc.c"
gsDPLoadTextureBlock(gRButtonTex, G_IM_FMT_IA, G_IM_SIZ_8b, gRButtonTex_WIDTH, gRButtonTex_HEIGHT, 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),
gsSP1Quadrangle(12, 14, 15, 13, 0),
gsDPPipeSync(),
gsSPEndDisplayList(),
};
Gfx gCButtonIconsDL[11] = {
#include "assets/textures/icon_item_static/gCButtonIconsDL.inc.c"
gsDPPipeSync(),
gsDPSetPrimColor(0, 0, 255, 150, 0, 255),
gsDPLoadTextureBlock(gCBtnSymbolsTex, G_IM_FMT_IA, G_IM_SIZ_8b, gCBtnSymbolsTex_WIDTH, gCBtnSymbolsTex_HEIGHT, 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),
gsSP1Quadrangle(0, 2, 3, 1, 0),
gsSPEndDisplayList(),
};
Gfx gAButtonIconDL[11] = {
#include "assets/textures/icon_item_static/gAButtonIconDL.inc.c"
gsDPPipeSync(),
#if PLATFORM_N64 || OOT_VERSION == IQUE_CN
gsDPSetPrimColor(0, 0, 0, 100, 255, 255),
#else
gsDPSetPrimColor(0, 0, 0, 255, 100, 255),
#endif
gsDPLoadTextureBlock(gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, gABtnSymbolTex_WIDTH, gABtnSymbolTex_HEIGHT, 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),
gsSP1Quadrangle(0, 2, 3, 1, 0),
gsSPEndDisplayList(),
};
Gfx gBButtonIconDL[11] = {
#include "assets/textures/icon_item_static/gBButtonIconDL.inc.c"
gsDPPipeSync(),
gsDPSetPrimColor(0, 0, 50, 150, 0, 255),
gsDPLoadTextureBlock(gBBtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, gBBtnSymbolTex_WIDTH, gBBtnSymbolTex_HEIGHT, 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),
gsSP1Quadrangle(0, 2, 3, 1, 0),
gsSPEndDisplayList(),
};
Gfx gPromptCursorLeftDL[10] = {
#include "assets/textures/icon_item_static/gPromptCursorLeftDL.inc.c"
gsDPPipeSync(),
gsDPLoadTextureBlock_4b(gPausePromptCursorTex, G_IM_FMT_I, gPausePromptCursorTex_WIDTH,
gPausePromptCursorTex_HEIGHT, 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),
gsSP1Quadrangle(4, 6, 7, 5, 0),
gsSPEndDisplayList(),
};
Gfx gPromptCursorRightDL[10] = {
#include "assets/textures/icon_item_static/gPromptCursorRightDL.inc.c"
gsDPPipeSync(),
gsDPLoadTextureBlock_4b(gPausePromptCursorTex, G_IM_FMT_I, gPausePromptCursorTex_WIDTH,
gPausePromptCursorTex_HEIGHT, 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),
gsSP1Quadrangle(8, 10, 11, 9, 0),
gsSPEndDisplayList(),
};

View File

@ -126,6 +126,7 @@ struct PlayState;
#define R_EPONAS_SONG_PLAYED DREG(53)
#define R_MAGIC_FILL_COLOR(i) ZREG(0 + (i))
#define R_PAUSE_PAGE_SWITCH_FRAME_ADVANCE_ON ZREG(13)
#define R_PAUSE_BUTTON_L_R_SELECTED_PRIM_TIMER ZREG(28)
#define R_C_BTN_COLOR(i) ZREG(39 + (i))
#define R_B_BTN_COLOR(i) ZREG(43 + (i))
#if OOT_NTSC
@ -192,6 +193,8 @@ struct PlayState;
#define R_B_LABEL_DD WREG(0)
#define R_PAUSE_PAGES_Y_ORIGIN_2 WREG(2) // Complements PauseContext.pagesYOrigin1
#define R_PAUSE_DEPTH_OFFSET WREG(3) // Offset position of all pages away from the camera
#define R_PAUSE_UI_ANIM_ALPHA_ADD_DURATION WREG(4)
#define R_PAUSE_UI_ANIMS_DURATION WREG(6)
#if OOT_NTSC
#define R_B_LABEL_SCALE(i) WREG(8 + (i))
#define R_B_LABEL_X(i) WREG(10 + (i))
@ -201,6 +204,8 @@ struct PlayState;
#define R_PAUSE_BUTTON_LEFT_X WREG(16)
#define R_PAUSE_BUTTON_RIGHT_X WREG(17)
#define R_PAUSE_BUTTON_LEFT_RIGHT_Y WREG(18)
#define R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X WREG(25)
#define R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X WREG(26)
#define R_OW_MINIMAP_X WREG(29)
#define R_OW_MINIMAP_Y WREG(30)
#define R_MINIMAP_DISABLED WREG(31)
@ -218,6 +223,8 @@ struct PlayState;
#endif
#define R_DGN_MINIMAP_X WREG(68)
#define R_DGN_MINIMAP_Y WREG(69)
#define R_PAUSE_NAME_DISPLAY_TIMER_MAX_ WREG(88)
#define R_PAUSE_NAME_DISPLAY_TIMER_THRESHOLD_ WREG(89)
#define R_TEXTBOX_X VREG(0)
#define R_TEXTBOX_Y VREG(1)
#define R_TEXTBOX_CLEF_XPOS VREG(7)

View File

@ -352,7 +352,7 @@ void Regs_InitDataImpl(void) {
ZREG(25) = 4;
ZREG(26) = 20;
ZREG(27) = 10;
ZREG(28) = 20;
R_PAUSE_BUTTON_L_R_SELECTED_PRIM_TIMER = 20;
ZREG(29) = 4;
ZREG(30) = 20;
ZREG(31) = 10;
@ -522,9 +522,9 @@ void Regs_InitDataImpl(void) {
XREG(95) = 200;
R_PAUSE_PAGES_Y_ORIGIN_2 = -6080;
R_PAUSE_DEPTH_OFFSET = 9355;
WREG(4) = 8;
R_PAUSE_UI_ANIM_ALPHA_ADD_DURATION = 8;
WREG(5) = 3;
WREG(6) = 8;
R_PAUSE_UI_ANIMS_DURATION = 8;
WREG(7) = 0;
#if OOT_NTSC
@ -557,8 +557,8 @@ void Regs_InitDataImpl(void) {
WREG(22) = -32;
WREG(23) = -38;
WREG(24) = -36;
WREG(25) = 40;
WREG(26) = -40;
R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X = 40;
R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X = -40;
WREG(27) = 0;
WREG(28) = 0;
R_OW_MINIMAP_X = 238;
@ -605,8 +605,8 @@ void Regs_InitDataImpl(void) {
R_DGN_MINIMAP_X = 204;
R_DGN_MINIMAP_Y = 140;
WREG(87) = 80;
WREG(88) = 70;
WREG(89) = 40;
R_PAUSE_NAME_DISPLAY_TIMER_MAX_ = 70;
R_PAUSE_NAME_DISPLAY_TIMER_THRESHOLD_ = 40;
WREG(90) = 320;
WREG(91) = 40;
WREG(92) = 3;

View File

@ -11,6 +11,8 @@
#include "ultra64.h"
#include "debug.h"
#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0"
typedef struct DebugCamTextBufferEntry {
/* 0x0 */ u8 x;
/* 0x1 */ u8 y;

View File

@ -136,8 +136,11 @@ void KaleidoSetup_Init(PlayState* play) {
pauseCtx->state = PAUSE_STATE_OFF;
pauseCtx->debugState = PAUSE_DEBUG_STATE_CLOSED;
// Setting the eye xz here is irrelevant, it's set on pausing in KaleidoSetup_Update
// x = -PAUSE_EYE_DIST * PAUSE_ITEM_X
pauseCtx->eye.x = pauseCtx->eye.y = 0.0f;
pauseCtx->eye.z = 64.0f;
pauseCtx->eye.z = -PAUSE_EYE_DIST * PAUSE_ITEM_Z;
pauseCtx->promptDepthOffset = 936.0f;
pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch = pauseCtx->questPagePitch = 160.0f;

View File

@ -22,6 +22,7 @@
#include "versions.h"
#include "audio.h"
#include "cutscene_flags.h"
#include "ocarina.h"
#include "play_state.h"
#include "save.h"
#include "ss_sram.h"
@ -101,9 +102,9 @@ void EnMag_Init(Actor* thisx, PlayState* play) {
this->fadeOutAlphaStep = 10;
VREG(19) = 99;
VREG(21) = 9;
VREG(23) = 10;
VREG(24) = 8;
R_PAUSE_SONG_OCA_BTN_Y(OCARINA_BTN_A) = 9;
R_PAUSE_SONG_OCA_BTN_Y(OCARINA_BTN_C_RIGHT) = 10;
R_PAUSE_SONG_OCA_BTN_Y(OCARINA_BTN_C_LEFT) = 8;
this->effectScroll = 0;
this->unk_E30C = 0;

View File

@ -293,10 +293,15 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) {
KaleidoScope_SetCursorPos(pauseCtx, cursor * 4, pauseCtx->questVtx);
// Handle part of the ocarina songs playback
if ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) &&
(pauseCtx->cursorSpecialPos == 0)) {
if ((cursor >= QUEST_SONG_MINUET) && (cursor < QUEST_KOKIRI_EMERALD)) {
if (CHECK_QUEST_ITEM(pauseCtx->cursorPoint[PAUSE_QUEST])) {
// The cursor is on a learned song
// Set some things up for song playback
cursor = pauseCtx->cursorSlot[PAUSE_QUEST];
pauseCtx->ocarinaSongIdx = gOcarinaSongItemMap[cursor - QUEST_SONG_MINUET];
sPlaybackSongStartDelayTimer = 10;
@ -307,6 +312,9 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) {
}
sPlayedSongBtnsNum = 0;
// Have the player play a song, immediately cancelled below
// Also clear the playback staff
// This has no purpose (?)
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
AudioOcarina_Start((1 << pauseCtx->ocarinaSongIdx) + 0x8000);
pauseCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
@ -321,6 +329,7 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) {
pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG;
// Stop having the player play a song as done above
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
}

View File

@ -32,7 +32,14 @@ u8 gAmmoItems[] = {
ITEM_NONE,
};
static s16 sEquipState = 0;
typedef enum ItemEquipState {
/* 0 */ ITEM_EQUIP_STATE_0,
/* 1 */ ITEM_EQUIP_STATE_1,
/* 2 */ ITEM_EQUIP_STATE_2,
/* 3 */ ITEM_EQUIP_STATE_3
} ItemEquipState;
static s16 sEquipState = ITEM_EQUIP_STATE_0;
static s16 sEquipAnimTimer = 0;
static s16 sEquipMoveTimer = 10;
@ -409,11 +416,13 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
pauseCtx->equipAnimY = pauseCtx->itemVtx[index].v.ob[1] * 10;
pauseCtx->equipAnimAlpha = 255;
sEquipAnimTimer = 0;
sEquipState = 3;
sEquipState = ITEM_EQUIP_STATE_3;
sEquipMoveTimer = 10;
if ((pauseCtx->equipTargetItem == ITEM_ARROW_FIRE) ||
(pauseCtx->equipTargetItem == ITEM_ARROW_ICE) ||
(pauseCtx->equipTargetItem == ITEM_ARROW_LIGHT)) {
index = 0;
if (pauseCtx->equipTargetItem == ITEM_ARROW_ICE) {
index = 1;
@ -423,7 +432,7 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
}
SFX_PLAY_CENTERED(NA_SE_SY_SET_FIRE_ARROW + index);
pauseCtx->equipTargetItem = 0xBF + index;
sEquipState = 0;
sEquipState = ITEM_EQUIP_STATE_0;
pauseCtx->equipAnimAlpha = 0;
sEquipMoveTimer = 6;
} else {
@ -435,6 +444,8 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
}
}
} else {
// PAUSE_QUAD_CURSOR_TL
pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->cursorVtx[2].v.ob[0] = pauseCtx->cursorVtx[1].v.ob[0] =
pauseCtx->cursorVtx[3].v.ob[0] = 0;
@ -449,7 +460,9 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
SFX_PLAY_CENTERED(NA_SE_SY_CURSOR);
}
} else if ((pauseCtx->mainState == PAUSE_MAIN_STATE_3) && (pauseCtx->pageIndex == PAUSE_ITEM)) {
//! @bug cursorSlot is uninitialized
//! @bug cursorSlot is used uninitialized
// This leads to reading from the itemVtx array at some index, typically OOB, and setting the cursor to an
// unexpected position. However the cursor is not drawn in this state so it ends up not being an issue.
KaleidoScope_SetCursorPos(pauseCtx, cursorSlot * 4, pauseCtx->itemVtx);
pauseCtx->cursorColorSet = 4;
}
@ -476,7 +489,7 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
if ((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) && (pauseCtx->pageIndex == PAUSE_ITEM) &&
(pauseCtx->cursorSpecialPos == 0)) {
if (CHECK_AGE_REQ_SLOT(i)) {
if ((sEquipState == 2) && (i == 3)) {
if ((sEquipState == ITEM_EQUIP_STATE_2) && (i == SLOT_BOW)) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, magicArrowEffectsR[pauseCtx->equipTargetItem - 0xBF],
magicArrowEffectsG[pauseCtx->equipTargetItem - 0xBF],
magicArrowEffectsB[pauseCtx->equipTargetItem - 0xBF], pauseCtx->alpha);
@ -538,43 +551,44 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_kaleido_item.c", 516);
}
// C-left, C-down, C-right
static s16 sCButtonPosX[] = { 660, 900, 1140 };
static s16 sCButtonPosY[] = { 1100, 920, 1100 };
void KaleidoScope_UpdateItemEquip(PlayState* play) {
static s16 D_8082A488 = 0;
static s16 sItemEquipState2Timer_8082A488 = 0;
PauseContext* pauseCtx = &play->pauseCtx;
Vtx* bowItemVtx;
u16 offsetX;
u16 offsetY;
if (sEquipState == 0) {
pauseCtx->equipAnimAlpha += 14;
if (sEquipState == ITEM_EQUIP_STATE_0) {
pauseCtx->equipAnimAlpha += 255 / 18;
if (pauseCtx->equipAnimAlpha > 255) {
pauseCtx->equipAnimAlpha = 254;
sEquipState++;
sEquipState++; // ITEM_EQUIP_STATE_1
}
sEquipAnimTimer = 5;
return;
}
if (sEquipState == 2) {
D_8082A488--;
if (sEquipState == ITEM_EQUIP_STATE_2) {
sItemEquipState2Timer_8082A488--;
if (D_8082A488 == 0) {
if (sItemEquipState2Timer_8082A488 == 0) {
pauseCtx->equipTargetItem -= 0xBF - ITEM_BOW_FIRE;
pauseCtx->equipTargetSlot = SLOT_BOW;
sEquipMoveTimer = 6;
WREG(90) = 320;
WREG(87) = WREG(91);
sEquipState++;
sEquipState++; // ITEM_EQUIP_STATE_3
SFX_PLAY_CENTERED(NA_SE_SY_SYNTH_MAGIC_ARROW);
}
return;
}
if (sEquipState == 1) {
bowItemVtx = &pauseCtx->itemVtx[12];
if (sEquipState == ITEM_EQUIP_STATE_1) {
bowItemVtx = &pauseCtx->itemVtx[SLOT_BOW * 4];
offsetX = ABS(pauseCtx->equipAnimX - bowItemVtx->v.ob[0] * 10) / sEquipMoveTimer;
offsetY = ABS(pauseCtx->equipAnimY - bowItemVtx->v.ob[1] * 10) / sEquipMoveTimer;
} else {
@ -595,14 +609,14 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) {
WREG(90) -= WREG(87) / sEquipMoveTimer;
WREG(87) -= WREG(87) / sEquipMoveTimer;
if (sEquipState == 1) {
if (pauseCtx->equipAnimX >= (pauseCtx->itemVtx[12].v.ob[0] * 10)) {
if (sEquipState == ITEM_EQUIP_STATE_1) {
if (pauseCtx->equipAnimX >= (pauseCtx->itemVtx[SLOT_BOW * 4].v.ob[0] * 10)) {
pauseCtx->equipAnimX -= offsetX;
} else {
pauseCtx->equipAnimX += offsetX;
}
if (pauseCtx->equipAnimY >= (pauseCtx->itemVtx[12].v.ob[1] * 10)) {
if (pauseCtx->equipAnimY >= (pauseCtx->itemVtx[SLOT_BOW * 4].v.ob[1] * 10)) {
pauseCtx->equipAnimY -= offsetY;
} else {
pauseCtx->equipAnimY += offsetY;
@ -624,9 +638,9 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) {
sEquipMoveTimer--;
if (sEquipMoveTimer == 0) {
if (sEquipState == 1) {
sEquipState++;
D_8082A488 = 4;
if (sEquipState == ITEM_EQUIP_STATE_1) {
sEquipState++; // ITEM_EQUIP_STATE_2
sItemEquipState2Timer_8082A488 = 4;
return;
}

View File

@ -162,7 +162,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) {
pauseCtx->cursorSpecialPos = 0;
pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->cursorPoint[PAUSE_MAP] = pauseCtx->dungeonMapSlot;
pauseCtx->cursorX[PAUSE_MAP] = 0;
j = (pauseCtx->cursorSlot[PAUSE_MAP] + 18) * 4;
j = (pauseCtx->cursorSlot[PAUSE_MAP] + (PAGE_BG_QUADS + 3)) * 4;
KaleidoScope_SetCursorPos(pauseCtx, j, pauseCtx->mapPageVtx);
SFX_PLAY_CENTERED(NA_SE_SY_CURSOR);
}
@ -192,7 +192,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) {
}
PRINTF("kscope->cursor_point====%d\n", pauseCtx->cursorPoint[PAUSE_MAP]);
j = (pauseCtx->cursorSlot[PAUSE_MAP] + 18) * 4;
j = (pauseCtx->cursorSlot[PAUSE_MAP] + (PAGE_BG_QUADS + 3)) * 4;
KaleidoScope_SetCursorPos(pauseCtx, j, pauseCtx->mapPageVtx);
SFX_PLAY_CENTERED(NA_SE_SY_CURSOR);
}
@ -212,7 +212,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) {
pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->cursorPoint[PAUSE_MAP];
j = (pauseCtx->cursorSlot[PAUSE_MAP] + 18) * 4;
j = (pauseCtx->cursorSlot[PAUSE_MAP] + (PAGE_BG_QUADS + 3)) * 4;
KaleidoScope_SetCursorPos(pauseCtx, j, pauseCtx->mapPageVtx);
if (pauseCtx->cursorX[PAUSE_MAP] == 0) {
@ -231,7 +231,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[68], 16, 0);
gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(PAGE_BG_QUADS + 2) * 4], 16, 0);
gDPLoadTextureBlock(POLY_OPA_DISP++, dungeonTitleTexs[gSaveContext.mapIndex], G_IM_FMT_IA, G_IM_SIZ_8b, 96, 16, 0,
G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
@ -256,7 +256,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) {
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 200, pauseCtx->alpha);
gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[84], 32, 0);
gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(PAGE_BG_QUADS + 6) * 4], 32, 0);
for (i = j = 0; i < 8; i++, j += 4) {
if ((gSaveContext.save.info.sceneFlags[gSaveContext.mapIndex].floors & gBitFlags[i]) ||
@ -283,19 +283,26 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) {
gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0);
pauseCtx->mapPageVtx[124].v.ob[0] = pauseCtx->mapPageVtx[126].v.ob[0] = pauseCtx->mapPageVtx[124].v.ob[0] + 2;
pauseCtx->mapPageVtx[125].v.ob[0] = pauseCtx->mapPageVtx[127].v.ob[0] = pauseCtx->mapPageVtx[124].v.ob[0] + 19;
pauseCtx->mapPageVtx[124].v.ob[1] = pauseCtx->mapPageVtx[125].v.ob[1] = pauseCtx->mapPageVtx[124].v.ob[1] - 2;
pauseCtx->mapPageVtx[126].v.ob[1] = pauseCtx->mapPageVtx[127].v.ob[1] = pauseCtx->mapPageVtx[124].v.ob[1] - 19;
// Quad PAGE_BG_QUADS + 16
pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[0] = pauseCtx->mapPageVtx[31 * 4 + 2].v.ob[0] =
pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[0] + 2;
pauseCtx->mapPageVtx[31 * 4 + 1].v.ob[0] = pauseCtx->mapPageVtx[31 * 4 + 3].v.ob[0] =
pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[0] + 19;
pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[1] = pauseCtx->mapPageVtx[31 * 4 + 1].v.ob[1] =
pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[1] - 2;
pauseCtx->mapPageVtx[31 * 4 + 2].v.ob[1] = pauseCtx->mapPageVtx[31 * 4 + 3].v.ob[1] =
pauseCtx->mapPageVtx[31 * 4 + 0].v.ob[1] - 19;
gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[116], 12, 0);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
pauseCtx->mapPageVtx[116].v.ob[1] = pauseCtx->mapPageVtx[117].v.ob[1] =
// Quad PAGE_BG_QUADS + 14
pauseCtx->mapPageVtx[29 * 4 + 0].v.ob[1] = pauseCtx->mapPageVtx[29 * 4 + 1].v.ob[1] =
pauseCtx->pagesYOrigin1 + 50 - (VREG(30) * 14) - 1;
pauseCtx->mapPageVtx[118].v.ob[1] = pauseCtx->mapPageVtx[119].v.ob[1] = pauseCtx->mapPageVtx[116].v.ob[1] - 16;
pauseCtx->mapPageVtx[29 * 4 + 2].v.ob[1] = pauseCtx->mapPageVtx[29 * 4 + 3].v.ob[1] =
pauseCtx->mapPageVtx[29 * 4 + 0].v.ob[1] - 16;
gDPLoadTextureBlock(POLY_OPA_DISP++, gDungeonMapLinkHeadTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0,
G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
@ -305,9 +312,12 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) {
if (CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, gSaveContext.mapIndex) &&
(gMapData->skullFloorIconY[gSaveContext.mapIndex] != -99)) {
pauseCtx->mapPageVtx[120].v.ob[1] = pauseCtx->mapPageVtx[121].v.ob[1] =
// Quad PAGE_BG_QUADS + 15
pauseCtx->mapPageVtx[30 * 4 + 0].v.ob[1] = pauseCtx->mapPageVtx[30 * 4 + 1].v.ob[1] =
gMapData->skullFloorIconY[gSaveContext.mapIndex] + pauseCtx->pagesYOrigin1;
pauseCtx->mapPageVtx[122].v.ob[1] = pauseCtx->mapPageVtx[123].v.ob[1] = pauseCtx->mapPageVtx[120].v.ob[1] - 16;
pauseCtx->mapPageVtx[30 * 4 + 2].v.ob[1] = pauseCtx->mapPageVtx[30 * 4 + 3].v.ob[1] =
pauseCtx->mapPageVtx[30 * 4 + 0].v.ob[1] - 16;
gDPLoadTextureBlock(POLY_OPA_DISP++, gDungeonMapSkullTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0,
G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
@ -348,7 +358,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) {
gDPLoadTLUT_pal16(POLY_OPA_DISP++, 0, interfaceCtx->mapPalette);
gDPSetTextureLUT(POLY_OPA_DISP++, G_TT_RGBA16);
gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[60], 8, 0);
gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(PAGE_BG_QUADS + 0) * 4], 8, 0);
gDPLoadTextureBlock_4b(POLY_OPA_DISP++, interfaceCtx->mapSegment, G_IM_FMT_CI, 48, 85, 0, G_TX_WRAP | G_TX_NOMIRROR,
G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);

View File

@ -688,6 +688,7 @@ static u8 gPageSwitchNextButtonStatus[][5] = {
// PAUSE_EQUIP + PAGE_SWITCH_PT_RIGHT
// -> PAUSE_ITEM
{ BTN_ENABLED, BTN_ENABLED, BTN_ENABLED, BTN_ENABLED, BTN_DISABLED },
};
static s16 D_8082AB8C = 0;
@ -963,7 +964,7 @@ void KaleidoScope_SetupPlayerPreRender(PlayState* play) {
}
void KaleidoScope_ProcessPlayerPreRender(void) {
Sleep_Msec(50);
Sleep_Msec(50); // TODO investigate if this is required
PreRender_ApplyFilters(&sPlayerPreRender);
PreRender_Destroy(&sPlayerPreRender);
}
@ -1164,7 +1165,7 @@ void KaleidoScope_DrawCursor(PlayState* play, u16 pageIndex) {
sCursorColors[pauseCtx->cursorColorSet >> 2][1],
sCursorColors[pauseCtx->cursorColorSet >> 2][2], 255);
gDPSetEnvColor(POLY_OPA_DISP++, D_8082AB8C, D_8082AB90, D_8082AB94, 255);
gSPVertex(POLY_OPA_DISP++, pauseCtx->cursorVtx, 16, 0);
gSPVertex(POLY_OPA_DISP++, pauseCtx->cursorVtx, 4 * 4, 0);
for (i = j = 0; i < 4; i++, j += 4) {
gDPLoadTextureBlock_4b(POLY_OPA_DISP++, sCursorTexs[i], G_IM_FMT_IA, PAUSE_MENU_CURSOR_CORNER_TEX_WIDTH,
@ -1236,10 +1237,12 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
};
static s16 D_8082AD3C = 20;
static s16 D_8082AD40 = 0;
static s16 sStickXRepeatTimer = 0;
static s16 sStickYRepeatTimer = 0;
static s16 sStickXRepeatState = 0;
static s16 sStickYRepeatState = 0;
PauseContext* pauseCtx = &play->pauseCtx;
s16 stepR;
s16 stepG;
@ -1574,6 +1577,7 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
if (((pauseCtx->state == PAUSE_STATE_SAVE_PROMPT) &&
(pauseCtx->savePromptState < PAUSE_SAVE_PROMPT_STATE_SAVED)) ||
(pauseCtx->state == PAUSE_STATE_GAME_OVER_SAVE_PROMPT)) {
POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sSavePromptMessageTexs[gSaveContext.language],
152, 16, PROMPT_QUAD_MESSAGE * 4);
@ -1684,22 +1688,34 @@ void KaleidoScope_DrawUIOverlay(PlayState* play) {
static u16 sToPlayMelodyTextWidths[] =
LANGUAGE_ARRAY(gPauseToPlayMelodyJPNTex_WIDTH, gPauseToPlayMelodyENGTex_WIDTH, gPauseToPlayMelodyGERTex_WIDTH,
gPauseToPlayMelodyFRATex_WIDTH);
static s16 D_8082ADF0[][4] = {
static s16 sLRSelectedPrimColors[][4] = {
{ 180, 210, 255, 220 },
{ 100, 100, 150, 220 },
};
static s16 D_8082AE00 = 20;
static s16 D_8082AE04 = 0;
static s16 sLRSelectedPrimTimer = 20;
static s16 sLRSelectedPrimState = 0;
static s16 D_8082AE08[] = {
10, 16, 16, 17, 12, 13, 18, 17, 17, 19, 13, 21, 20, 21, 14, 15, 15, 15, 11, 14,
};
static s16 D_8082AE30[] = {
21, 20, 19, 18, 11, 14, 10, 15, 16, 13, 12, 17,
static s16 D_8082AE30[WORLD_MAP_POINT_MAX] = {
21, // WORLD_MAP_POINT_HAUNTED_WASTELAND
20, // WORLD_MAP_POINT_GERUDOS_FORTRESS
19, // WORLD_MAP_POINT_GERUDO_VALLEY
18, // WORLD_MAP_POINT_HYLIA_LAKESIDE
11, // WORLD_MAP_POINT_LON_LON_RANCH
14, // WORLD_MAP_POINT_MARKET
10, // WORLD_MAP_POINT_HYRULE_FIELD
15, // WORLD_MAP_POINT_DEATH_MOUNTAIN
16, // WORLD_MAP_POINT_KAKARIKO_VILLAGE
13, // WORLD_MAP_POINT_LOST_WOODS
12, // WORLD_MAP_POINT_KOKIRI_FOREST
17, // WORLD_MAP_POINT_ZORAS_DOMAIN
};
static s16 D_808321A0;
static s16 D_808321A2;
static s16 D_808321A4;
static s16 D_808321A6;
static s16 sLRSelectedPrimR;
static s16 sLRSelectedPrimG;
static s16 sLRSelectedPrimB;
static s16 sLRSelectedPrimA;
PauseContext* pauseCtx = &play->pauseCtx;
s16 stepR;
s16 stepG;
@ -1711,39 +1727,39 @@ void KaleidoScope_DrawUIOverlay(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx, "../z_kaleido_scope_PAL.c", 1676);
stepR = ABS(D_808321A0 - D_8082ADF0[D_8082AE04][0]) / D_8082AE00;
stepG = ABS(D_808321A2 - D_8082ADF0[D_8082AE04][1]) / D_8082AE00;
stepB = ABS(D_808321A4 - D_8082ADF0[D_8082AE04][2]) / D_8082AE00;
stepA = ABS(D_808321A6 - D_8082ADF0[D_8082AE04][3]) / D_8082AE00;
if (D_808321A0 >= D_8082ADF0[D_8082AE04][0]) {
D_808321A0 -= stepR;
stepR = ABS(sLRSelectedPrimR - sLRSelectedPrimColors[sLRSelectedPrimState][0]) / sLRSelectedPrimTimer;
stepG = ABS(sLRSelectedPrimG - sLRSelectedPrimColors[sLRSelectedPrimState][1]) / sLRSelectedPrimTimer;
stepB = ABS(sLRSelectedPrimB - sLRSelectedPrimColors[sLRSelectedPrimState][2]) / sLRSelectedPrimTimer;
stepA = ABS(sLRSelectedPrimA - sLRSelectedPrimColors[sLRSelectedPrimState][3]) / sLRSelectedPrimTimer;
if (sLRSelectedPrimR >= sLRSelectedPrimColors[sLRSelectedPrimState][0]) {
sLRSelectedPrimR -= stepR;
} else {
D_808321A0 += stepR;
sLRSelectedPrimR += stepR;
}
if (D_808321A2 >= D_8082ADF0[D_8082AE04][1]) {
D_808321A2 -= stepG;
if (sLRSelectedPrimG >= sLRSelectedPrimColors[sLRSelectedPrimState][1]) {
sLRSelectedPrimG -= stepG;
} else {
D_808321A2 += stepG;
sLRSelectedPrimG += stepG;
}
if (D_808321A4 >= D_8082ADF0[D_8082AE04][2]) {
D_808321A4 -= stepB;
if (sLRSelectedPrimB >= sLRSelectedPrimColors[sLRSelectedPrimState][2]) {
sLRSelectedPrimB -= stepB;
} else {
D_808321A4 += stepB;
sLRSelectedPrimB += stepB;
}
if (D_808321A6 >= D_8082ADF0[D_8082AE04][3]) {
D_808321A6 -= stepA;
if (sLRSelectedPrimA >= sLRSelectedPrimColors[sLRSelectedPrimState][3]) {
sLRSelectedPrimA -= stepA;
} else {
D_808321A6 += stepA;
sLRSelectedPrimA += stepA;
}
D_8082AE00--;
if (D_8082AE00 == 0) {
D_808321A0 = D_8082ADF0[D_8082AE04][0];
D_808321A2 = D_8082ADF0[D_8082AE04][1];
D_808321A4 = D_8082ADF0[D_8082AE04][2];
D_808321A6 = D_8082ADF0[D_8082AE04][3];
D_8082AE00 = ZREG(28);
D_8082AE04 ^= 1;
sLRSelectedPrimTimer--;
if (sLRSelectedPrimTimer == 0) {
sLRSelectedPrimR = sLRSelectedPrimColors[sLRSelectedPrimState][0];
sLRSelectedPrimG = sLRSelectedPrimColors[sLRSelectedPrimState][1];
sLRSelectedPrimB = sLRSelectedPrimColors[sLRSelectedPrimState][2];
sLRSelectedPrimA = sLRSelectedPrimColors[sLRSelectedPrimState][3];
sLRSelectedPrimTimer = R_PAUSE_BUTTON_L_R_SELECTED_PRIM_TIMER;
sLRSelectedPrimState ^= 1;
}
y = pauseCtx->infoPanelOffsetY - 76;
@ -1853,7 +1869,7 @@ void KaleidoScope_DrawUIOverlay(PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, gInfoPanelBgDL);
if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sLRSelectedPrimR, sLRSelectedPrimG, sLRSelectedPrimB, sLRSelectedPrimA);
}
// Draw UI_OVERLAY_QUAD_BUTTON_LEFT
@ -1862,14 +1878,14 @@ void KaleidoScope_DrawUIOverlay(PlayState* play) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 210, 255, 220);
if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sLRSelectedPrimR, sLRSelectedPrimG, sLRSelectedPrimB, sLRSelectedPrimA);
}
// Draw UI_OVERLAY_QUAD_BUTTON_RIGHT
gSPDisplayList(POLY_OPA_DISP++, gRButtonIconDL);
if (pauseCtx->cursorSpecialPos != 0) {
j = (pauseCtx->cursorSpecialPos - 8) * 4;
j = (pauseCtx->cursorSpecialPos - PAUSE_CURSOR_PAGE_LEFT + UI_OVERLAY_QUAD_BUTTON_LEFT) * 4;
pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->uiOverlayVtx[j].v.ob[0];
pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->uiOverlayVtx[j].v.ob[1];
KaleidoScope_DrawCursor(play, pauseCtx->pageIndex);
@ -1891,13 +1907,14 @@ void KaleidoScope_DrawUIOverlay(PlayState* play) {
gDPSetEnvColor(POLY_OPA_DISP++, 20, 30, 40, 0);
if ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->namedItem != PAUSE_ITEM_NONE) &&
(pauseCtx->nameDisplayTimer < WREG(89)) &&
(pauseCtx->nameDisplayTimer < R_PAUSE_NAME_DISPLAY_TIMER_THRESHOLD_) &&
(((u32)pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) ||
(pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) &&
(pauseCtx->mainState <= PAUSE_MAIN_STATE_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) &&
@ -2070,8 +2087,11 @@ void KaleidoScope_DrawUIOverlay(PlayState* play) {
} else if ((pauseCtx->pageIndex == PAUSE_MAP) && sInDungeonScene) {
} else if ((pauseCtx->pageIndex == PAUSE_QUEST) &&
((pauseCtx->cursorSlot[PAUSE_QUEST] >= 6) && (pauseCtx->cursorSlot[PAUSE_QUEST] <= 0x11))) {
((pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_MINUET) &&
(pauseCtx->cursorSlot[PAUSE_QUEST] < QUEST_KOKIRI_EMERALD))) {
if (pauseCtx->namedItem != PAUSE_ITEM_NONE) {
// The cursor is on a learned song
// UI_OVERLAY_QUAD_INFO_ICON
pauseCtx->uiOverlayVtx[16].v.ob[0] = pauseCtx->uiOverlayVtx[18].v.ob[0] =
R_PAUSE_INFO_PANEL_ICON_PLAY_SONG_X(gSaveContext.language);
@ -2200,13 +2220,14 @@ void KaleidoScope_UpdateNamePanel(PlayState* play) {
}
} else if (pauseCtx->nameColorSet == 0) {
if (((pauseCtx->pageIndex == PAUSE_QUEST) &&
((pauseCtx->cursorSlot[PAUSE_QUEST] >= 6) && (pauseCtx->cursorSlot[PAUSE_QUEST] <= 0x11)) &&
((pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_MINUET) &&
(pauseCtx->cursorSlot[PAUSE_QUEST] < QUEST_KOKIRI_EMERALD)) &&
(pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) ||
(pauseCtx->pageIndex == PAUSE_ITEM) ||
((pauseCtx->pageIndex == PAUSE_EQUIP) && (pauseCtx->cursorX[PAUSE_EQUIP] != EQUIP_CURSOR_X_UPG))) {
if (pauseCtx->namedItem != ITEM_SOLD_OUT) {
pauseCtx->nameDisplayTimer++;
if (pauseCtx->nameDisplayTimer > WREG(88)) {
if (pauseCtx->nameDisplayTimer > R_PAUSE_NAME_DISPLAY_TIMER_MAX_) {
pauseCtx->nameDisplayTimer = 0;
}
}
@ -2233,11 +2254,11 @@ void KaleidoScope_UpdatePageSwitch(PlayState* play, Input* input) {
if (pauseCtx->nextPageMode) {}
if (pauseCtx->pageSwitchTimer < ((4 * PAGE_SWITCH_NSTEPS) / 2)) {
R_PAUSE_BUTTON_LEFT_X -= WREG(25) / WREG(6);
R_PAUSE_BUTTON_RIGHT_X -= WREG(26) / WREG(6);
R_PAUSE_BUTTON_LEFT_X -= R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_RIGHT_X -= R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
} else {
R_PAUSE_BUTTON_LEFT_X += WREG(25) / WREG(6);
R_PAUSE_BUTTON_RIGHT_X += WREG(26) / WREG(6);
R_PAUSE_BUTTON_LEFT_X += R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_RIGHT_X += R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
}
pauseCtx->pageSwitchTimer += 4;
@ -2250,19 +2271,19 @@ void KaleidoScope_UpdatePageSwitch(PlayState* play, Input* input) {
}
}
void KaleidoScope_SetView(PauseContext* pauseCtx, f32 x, f32 y, f32 z) {
void KaleidoScope_SetView(PauseContext* pauseCtx, f32 eyeX, f32 eyeY, f32 eyeZ) {
Vec3f eye;
Vec3f lookAt;
Vec3f at;
Vec3f up;
eye.x = x;
eye.y = y;
eye.z = z;
lookAt.x = lookAt.y = lookAt.z = 0.0f;
eye.x = eyeX;
eye.y = eyeY;
eye.z = eyeZ;
at.x = at.y = at.z = 0.0f;
up.x = up.z = 0.0f;
up.y = 1.0f;
View_LookAt(&pauseCtx->view, &eye, &lookAt, &up);
View_LookAt(&pauseCtx->view, &eye, &at, &up);
View_Apply(&pauseCtx->view,
VIEW_ALL | VIEW_FORCE_VIEWING | VIEW_FORCE_VIEWPORT | VIEW_FORCE_PROJECTION_PERSPECTIVE);
}
@ -2340,6 +2361,7 @@ static s16 sVtxPagePromptQuadsX[VTX_PAGE_PROMPT_QUADS] = {
-58, // PROMPT_QUAD_CHOICE_YES
10, // PROMPT_QUAD_CHOICE_NO
};
static s16 sVtxPageItemQuadsWidth[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
static s16 sVtxPageEquipQuadsWidth[CLAMP_MIN(VTX_PAGE_EQUIP_QUADS, 1)] = { 0 };
static s16 sVtxPageMapDungeonQuadsWidth[VTX_PAGE_MAP_DUNGEON_QUADS] = {
@ -2353,6 +2375,7 @@ static s16 sVtxPagePromptQuadsWidth[VTX_PAGE_PROMPT_QUADS] = {
48, // PROMPT_QUAD_CHOICE_YES
48, // PROMPT_QUAD_CHOICE_NO
};
static s16 sVtxPageItemQuadsY[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
static s16 sVtxPageEquipQuadsY[CLAMP_MIN(VTX_PAGE_EQUIP_QUADS, 1)] = { 0 };
static s16 sVtxPageMapDungeonQuadsY[VTX_PAGE_MAP_DUNGEON_QUADS] = {
@ -2400,6 +2423,7 @@ static s16 sVtxPagePromptQuadsY[VTX_PAGE_PROMPT_QUADS] = {
-6, // PROMPT_QUAD_CHOICE_YES
-6, // PROMPT_QUAD_CHOICE_NO
};
static s16 sVtxPageItemQuadsHeight[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
static s16 sVtxPageEquipQuadsHeight[CLAMP_MIN(VTX_PAGE_EQUIP_QUADS, 1)] = { 0 };
static s16 sVtxPageMapDungeonQuadsHeight[VTX_PAGE_MAP_DUNGEON_QUADS] = {
@ -3664,7 +3688,7 @@ void KaleidoScope_UpdateDungeonMap(PlayState* play) {
void KaleidoScope_Update(PlayState* play) {
static s16 sMainStateAfterSongPlayerPlayingDone = PAUSE_MAIN_STATE_IDLE;
static s16 sDelayTimer = 10;
static s16 D_8082B260 = 0;
static s16 sTimer_ = 0;
PauseContext* pauseCtx = &play->pauseCtx;
InterfaceContext* interfaceCtx = &play->interfaceCtx;
GameOverContext* gameOverCtx = &play->gameOverCtx;
@ -3695,6 +3719,7 @@ void KaleidoScope_Update(PlayState* play) {
KaleidoScope_HandlePageToggles(pauseCtx, input);
} else if ((pauseCtx->pageIndex == PAUSE_QUEST) && ((pauseCtx->mainState < PAUSE_MAIN_STATE_3) ||
(pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT))) {
KaleidoScope_UpdateCursorVtx(play);
}
@ -3771,6 +3796,7 @@ void KaleidoScope_Update(PlayState* play) {
case SCENE_SPIRIT_TEMPLE_BOSS:
case SCENE_SHADOW_TEMPLE_BOSS:
sInDungeonScene = true;
size2 = (uintptr_t)_icon_item_dungeon_staticSegmentRomEnd -
(uintptr_t)_icon_item_dungeon_staticSegmentRomStart;
PRINTF("icon_item_dungeon dungeon-size2=%x\n", size2);
@ -3784,6 +3810,7 @@ void KaleidoScope_Update(PlayState* play) {
default:
sInDungeonScene = false;
size2 = (uintptr_t)_icon_item_field_staticSegmentRomEnd -
(uintptr_t)_icon_item_field_staticSegmentRomStart;
PRINTF("icon_item_field field-size2=%x\n", size2);
@ -3827,6 +3854,8 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->nameSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemLangSegment + size);
// This printf may have been used to compute the size used on playerSegment at one point,
// but is missing the size of icon_item_24_static
PRINTF(T("サイズ=%x\n", "size=%x\n"), size2 + size1 + size0 + size);
PRINTF("item_name I_N_PT=%x\n", 0x800);
Interface_SetDoAction(play, DO_ACTION_DECIDE);
@ -4088,13 +4117,13 @@ void KaleidoScope_Update(PlayState* play) {
}
pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch = pauseCtx->questPagePitch -=
160.0f / WREG(6);
pauseCtx->infoPanelOffsetY += 40 / WREG(6);
interfaceCtx->startAlpha += 255 / WREG(6);
R_PAUSE_BUTTON_LEFT_X += WREG(25) / WREG(6);
R_PAUSE_BUTTON_RIGHT_X += WREG(26) / WREG(6);
XREG(5) += 150 / WREG(6);
pauseCtx->alpha += (u16)(255 / (WREG(6) + WREG(4)));
160.0f / R_PAUSE_UI_ANIMS_DURATION;
pauseCtx->infoPanelOffsetY += 40 / R_PAUSE_UI_ANIMS_DURATION;
interfaceCtx->startAlpha += 255 / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_LEFT_X += R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_RIGHT_X += R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
XREG(5) += 150 / R_PAUSE_UI_ANIMS_DURATION;
pauseCtx->alpha += (u16)(255 / (R_PAUSE_UI_ANIMS_DURATION + R_PAUSE_UI_ANIM_ALPHA_ADD_DURATION));
if (pauseCtx->itemPagePitch == 0) {
interfaceCtx->startAlpha = 255;
@ -4106,7 +4135,7 @@ void KaleidoScope_Update(PlayState* play) {
break;
case PAUSE_STATE_OPENING_2:
pauseCtx->alpha += (u16)(255 / (WREG(6) + WREG(4)));
pauseCtx->alpha += (u16)(255 / (R_PAUSE_UI_ANIMS_DURATION + R_PAUSE_UI_ANIM_ALPHA_ADD_DURATION));
KaleidoScope_UpdateOpening(play);
if (pauseCtx->state == PAUSE_STATE_MAIN) {
@ -4185,6 +4214,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->state = PAUSE_STATE_SAVE_PROMPT;
} else if (pauseCtx->ocarinaStaff->state == pauseCtx->ocarinaSongIdx) {
// The player successfully played the song
SFX_PLAY_CENTERED(NA_SE_SY_TRE_BOX_APPEAR);
sMainStateAfterSongPlayerPlayingDone = PAUSE_MAIN_STATE_IDLE;
@ -4192,6 +4222,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->mainState = PAUSE_MAIN_STATE_SONG_PROMPT_DONE;
} else if (pauseCtx->ocarinaStaff->state == 0xFF) {
// The player failed to play the song
SFX_PLAY_CENTERED(NA_SE_SY_OCARINA_ERROR);
sMainStateAfterSongPlayerPlayingDone = PAUSE_MAIN_STATE_SONG_PROMPT_INIT;
@ -4249,9 +4280,9 @@ void KaleidoScope_Update(PlayState* play) {
case PAUSE_STATE_SAVE_PROMPT:
switch (pauseCtx->savePromptState) {
case PAUSE_SAVE_PROMPT_STATE_APPEARING:
pauseCtx->promptPitch -= 314.0f / WREG(6);
R_PAUSE_BUTTON_LEFT_X -= WREG(25) / WREG(6);
R_PAUSE_BUTTON_RIGHT_X -= WREG(26) / WREG(6);
pauseCtx->promptPitch -= 314.0f / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_LEFT_X -= R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_RIGHT_X -= R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
if (pauseCtx->promptPitch <= -628.0f) {
pauseCtx->promptPitch = -628.0f;
@ -4263,10 +4294,12 @@ void KaleidoScope_Update(PlayState* play) {
if (CHECK_BTN_ALL(input->press.button, BTN_A)) {
if (pauseCtx->promptChoice != 0) {
Interface_SetDoAction(play, DO_ACTION_NONE);
gSaveContext.buttonStatus[0] = gSaveContext.buttonStatus[1] = gSaveContext.buttonStatus[2] =
gSaveContext.buttonStatus[3] = BTN_ENABLED;
gSaveContext.hudVisibilityMode = HUD_VISIBILITY_NO_CHANGE;
Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_ALL);
pauseCtx->savePromptState = PAUSE_SAVE_PROMPT_STATE_CLOSING;
R_PAUSE_PAGES_Y_ORIGIN_2 = PAUSE_PAGES_Y_ORIGIN_2_LOWER;
YREG(8) = pauseCtx->promptPitch;
@ -4276,9 +4309,11 @@ void KaleidoScope_Update(PlayState* play) {
#endif
} else {
SFX_PLAY_CENTERED(NA_SE_SY_PIECE_OF_HEART);
Play_SaveSceneFlags(play);
gSaveContext.save.info.playerData.savedSceneId = play->sceneId;
Sram_WriteSave(&play->sramCtx);
pauseCtx->savePromptState = PAUSE_SAVE_PROMPT_STATE_SAVED;
#if !PLATFORM_GC
sDelayTimer = 90;
@ -4288,11 +4323,14 @@ void KaleidoScope_Update(PlayState* play) {
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_START) ||
CHECK_BTN_ALL(input->press.button, BTN_B)) {
Interface_SetDoAction(play, DO_ACTION_NONE);
pauseCtx->savePromptState = PAUSE_SAVE_PROMPT_STATE_CLOSING;
R_PAUSE_PAGES_Y_ORIGIN_2 = PAUSE_PAGES_Y_ORIGIN_2_LOWER;
YREG(8) = pauseCtx->promptPitch;
func_800F64E0(0);
gSaveContext.buttonStatus[0] = gSaveContext.buttonStatus[1] = gSaveContext.buttonStatus[2] =
gSaveContext.buttonStatus[3] = BTN_ENABLED;
gSaveContext.hudVisibilityMode = HUD_VISIBILITY_NO_CHANGE;
@ -4306,11 +4344,14 @@ void KaleidoScope_Update(PlayState* play) {
case PAUSE_SAVE_PROMPT_STATE_SAVED:
if (CHECK_BTN_ALL(input->press.button, BTN_B) || CHECK_BTN_ALL(input->press.button, BTN_A) ||
CHECK_BTN_ALL(input->press.button, BTN_START) || (--sDelayTimer == 0)) {
Interface_SetDoAction(play, DO_ACTION_NONE);
gSaveContext.buttonStatus[0] = gSaveContext.buttonStatus[1] = gSaveContext.buttonStatus[2] =
gSaveContext.buttonStatus[3] = BTN_ENABLED;
gSaveContext.hudVisibilityMode = HUD_VISIBILITY_NO_CHANGE;
Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_ALL);
pauseCtx->savePromptState = PAUSE_SAVE_PROMPT_STATE_CLOSING_AFTER_SAVED;
R_PAUSE_PAGES_Y_ORIGIN_2 = PAUSE_PAGES_Y_ORIGIN_2_LOWER;
YREG(8) = pauseCtx->promptPitch;
@ -4320,9 +4361,9 @@ void KaleidoScope_Update(PlayState* play) {
case PAUSE_SAVE_PROMPT_STATE_RETURN_TO_MENU:
case PAUSE_SAVE_PROMPT_STATE_RETURN_TO_MENU_2:
pauseCtx->promptPitch += 314.0f / WREG(6);
R_PAUSE_BUTTON_LEFT_X += WREG(25) / WREG(6);
R_PAUSE_BUTTON_RIGHT_X += WREG(26) / WREG(6);
pauseCtx->promptPitch += 314.0f / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_LEFT_X += R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_RIGHT_X += R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
if (pauseCtx->promptPitch >= -314.0f) {
pauseCtx->state = PAUSE_STATE_MAIN;
@ -4337,13 +4378,13 @@ void KaleidoScope_Update(PlayState* play) {
case PAUSE_SAVE_PROMPT_STATE_CLOSING_AFTER_SAVED:
if (pauseCtx->promptPitch != (YREG(8) + 160.0f)) {
pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch =
pauseCtx->questPagePitch += 160.0f / WREG(6);
pauseCtx->promptPitch += 160.0f / WREG(6);
pauseCtx->infoPanelOffsetY -= 40 / WREG(6);
R_PAUSE_BUTTON_LEFT_X -= WREG(25) / WREG(6);
R_PAUSE_BUTTON_RIGHT_X -= WREG(26) / WREG(6);
XREG(5) -= 150 / WREG(6);
pauseCtx->alpha -= (u16)(255 / WREG(6));
pauseCtx->questPagePitch += 160.0f / R_PAUSE_UI_ANIMS_DURATION;
pauseCtx->promptPitch += 160.0f / R_PAUSE_UI_ANIMS_DURATION;
pauseCtx->infoPanelOffsetY -= 40 / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_LEFT_X -= R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_RIGHT_X -= R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
XREG(5) -= 150 / R_PAUSE_UI_ANIMS_DURATION;
pauseCtx->alpha -= (u16)(255 / R_PAUSE_UI_ANIMS_DURATION);
if (pauseCtx->promptPitch == (YREG(8) + 160.0f)) {
pauseCtx->alpha = 0;
}
@ -4431,17 +4472,17 @@ void KaleidoScope_Update(PlayState* play) {
D_8082AB9C = 30;
D_8082ABA0 = 0;
D_8082ABA4 = 0;
D_8082B260 = 30;
sTimer_ = 30;
VREG(88) = 98;
pauseCtx->promptChoice = 0;
pauseCtx->state++; // PAUSE_STATE_GAME_OVER_SHOW_MESSAGE
break;
case PAUSE_STATE_GAME_OVER_SHOW_MESSAGE:
stepR = ABS(D_8082AB8C - 30) / D_8082B260;
stepG = ABS(D_8082AB90) / D_8082B260;
stepB = ABS(D_8082AB94) / D_8082B260;
stepA = ABS(D_8082AB98 - 255) / D_8082B260;
stepR = ABS(D_8082AB8C - 30) / sTimer_;
stepG = ABS(D_8082AB90) / sTimer_;
stepB = ABS(D_8082AB94) / sTimer_;
stepA = ABS(D_8082AB98 - 255) / sTimer_;
if (D_8082AB8C >= 30) {
D_8082AB8C -= stepR;
} else {
@ -4463,9 +4504,9 @@ void KaleidoScope_Update(PlayState* play) {
D_8082AB98 += stepA;
}
stepR = ABS(D_8082AB9C - 255) / D_8082B260;
stepG = ABS(D_8082ABA0 - 130) / D_8082B260;
stepB = ABS(D_8082ABA4) / D_8082B260;
stepR = ABS(D_8082AB9C - 255) / sTimer_;
stepG = ABS(D_8082ABA0 - 130) / sTimer_;
stepB = ABS(D_8082ABA4) / sTimer_;
if (D_8082AB9C >= 255) {
D_8082AB9C -= stepR;
} else {
@ -4482,8 +4523,8 @@ void KaleidoScope_Update(PlayState* play) {
D_8082ABA4 += stepB;
}
D_8082B260--;
if (D_8082B260 == 0) {
sTimer_--;
if (sTimer_ == 0) {
D_8082AB8C = 30;
D_8082AB90 = 0;
D_8082AB94 = 0;
@ -4492,29 +4533,29 @@ void KaleidoScope_Update(PlayState* play) {
D_8082AB9C = 255;
D_8082ABA0 = 130;
D_8082ABA4 = 0;
D_8082B260 = 40;
sTimer_ = 40;
pauseCtx->state++; // PAUSE_STATE_GAME_OVER_WINDOW_DELAY
}
break;
case PAUSE_STATE_GAME_OVER_WINDOW_DELAY:
D_8082B260--;
if (D_8082B260 == 0) {
sTimer_--;
if (sTimer_ == 0) {
pauseCtx->state = PAUSE_STATE_GAME_OVER_SHOW_WINDOW;
}
break;
case PAUSE_STATE_GAME_OVER_SHOW_WINDOW:
pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch = pauseCtx->questPagePitch =
pauseCtx->promptPitch -= 160.0f / WREG(6);
pauseCtx->infoPanelOffsetY += 40 / WREG(6);
interfaceCtx->startAlpha += 255 / WREG(6);
pauseCtx->promptPitch -= 160.0f / R_PAUSE_UI_ANIMS_DURATION;
pauseCtx->infoPanelOffsetY += 40 / R_PAUSE_UI_ANIMS_DURATION;
interfaceCtx->startAlpha += 255 / R_PAUSE_UI_ANIMS_DURATION;
VREG(88) -= 3;
R_PAUSE_BUTTON_LEFT_X += WREG(25) / WREG(6);
R_PAUSE_BUTTON_RIGHT_X += WREG(26) / WREG(6);
XREG(5) += 150 / WREG(6);
pauseCtx->alpha += (u16)(255 / (WREG(6) + WREG(4)));
R_PAUSE_BUTTON_LEFT_X += R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_RIGHT_X += R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
XREG(5) += 150 / R_PAUSE_UI_ANIMS_DURATION;
pauseCtx->alpha += (u16)(255 / (R_PAUSE_UI_ANIMS_DURATION + R_PAUSE_UI_ANIM_ALPHA_ADD_DURATION));
if (pauseCtx->promptPitch < -628.0f) {
pauseCtx->promptPitch = -628.0f;
interfaceCtx->startAlpha = 255;
@ -4676,23 +4717,21 @@ void KaleidoScope_Update(PlayState* play) {
case PAUSE_STATE_CLOSING:
if (pauseCtx->itemPagePitch != 160.0f) {
pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch =
pauseCtx->questPagePitch += 160.0f / WREG(6);
pauseCtx->infoPanelOffsetY -= 40 / WREG(6);
interfaceCtx->startAlpha -= 255 / WREG(6);
R_PAUSE_BUTTON_LEFT_X -= WREG(25) / WREG(6);
R_PAUSE_BUTTON_RIGHT_X -= WREG(26) / WREG(6);
XREG(5) -= 150 / WREG(6);
pauseCtx->alpha -= (u16)(255 / WREG(6));
pauseCtx->questPagePitch += 160.0f / R_PAUSE_UI_ANIMS_DURATION;
pauseCtx->infoPanelOffsetY -= 40 / R_PAUSE_UI_ANIMS_DURATION;
interfaceCtx->startAlpha -= 255 / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_LEFT_X -= R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
R_PAUSE_BUTTON_RIGHT_X -= R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X / R_PAUSE_UI_ANIMS_DURATION;
XREG(5) -= 150 / R_PAUSE_UI_ANIMS_DURATION;
pauseCtx->alpha -= (u16)(255 / R_PAUSE_UI_ANIMS_DURATION);
if (pauseCtx->itemPagePitch == 160.0f) {
pauseCtx->alpha = 0;
}
} else {
pauseCtx->debugState = PAUSE_DEBUG_STATE_CLOSED;
pauseCtx->state = PAUSE_STATE_RESUME_GAMEPLAY;
pauseCtx->questPagePitch = 160.0f;
pauseCtx->mapPagePitch = 160.0f;
pauseCtx->equipPagePitch = 160.0f;
pauseCtx->itemPagePitch = 160.0f;
pauseCtx->itemPagePitch = pauseCtx->equipPagePitch = pauseCtx->mapPagePitch = pauseCtx->questPagePitch =
160.0f;
pauseCtx->namedItem = PAUSE_ITEM_NONE;
interfaceCtx->startAlpha = 0;
}
@ -4734,13 +4773,17 @@ void KaleidoScope_Update(PlayState* play) {
gSaveContext.buttonStatus[2] = sSavedButtonStatus[2];
gSaveContext.buttonStatus[3] = sSavedButtonStatus[3];
gSaveContext.buttonStatus[4] = sSavedButtonStatus[4];
interfaceCtx->unk_1FA = interfaceCtx->unk_1FC = 0;
PRINTF_COLOR_YELLOW();
PRINTF("i=%d LAST_TIME_TYPE=%d\n", i, gSaveContext.prevHudVisibilityMode);
gSaveContext.hudVisibilityMode = HUD_VISIBILITY_NO_CHANGE;
Interface_ChangeHudVisibilityMode(gSaveContext.prevHudVisibilityMode);
player->talkActor = NULL;
Player_SetEquipmentData(play, player);
PRINTF_RST();
break;
}