summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2023-09-24 01:46:07 -0700
committerGitHub <noreply@github.com>2023-09-24 18:46:07 +1000
commit2e87212038a4abe3c66d20b98d6f1c2fff8f2380 (patch)
tree1083df7a1d55514a6a5e6b07c45ca002c3ff680c /src/code
parent3d3ca570221bc9cafd07d0d1affcc44bab8c84b7 (diff)
z_message_staff (1 NON-MATCHING) (#1376)
* z_message_staff from z_message branch * Use highscores array * Clean up * format * PR cleanup * PR Review * Fix bss * Fix bss
Diffstat (limited to 'src/code')
-rw-r--r--src/code/code_8012EC80.c3
-rw-r--r--src/code/z_message.c153
-rw-r--r--src/code/z_message_nes.c16
-rw-r--r--src/code/z_message_staff.c654
-rw-r--r--src/code/z_parameter.c2
-rw-r--r--src/code/z_play.c6
-rw-r--r--src/code/z_player_lib.c4
-rw-r--r--src/code/z_sram_NES.c10
8 files changed, 747 insertions, 101 deletions
diff --git a/src/code/code_8012EC80.c b/src/code/code_8012EC80.c
index 9a2100d01..768c0b8dc 100644
--- a/src/code/code_8012EC80.c
+++ b/src/code/code_8012EC80.c
@@ -723,6 +723,5 @@ void Inventory_SaveLotteryCodeGuess(PlayState* play) {
lotteryCodeGuess = ((play->msgCtx.unk12054[0] & 0xF) << 8); // First Digit
lotteryCodeGuess |= ((play->msgCtx.unk12054[1] & 0xF) << 4); // Second Digit
lotteryCodeGuess |= (play->msgCtx.unk12054[2] & 0xF); // Third Digit
- gSaveContext.save.saveInfo.lotteryCodeGuess =
- (gSaveContext.save.saveInfo.lotteryCodeGuess & 0xFFFF0000) | (lotteryCodeGuess & 0xFFFF);
+ HS_SET_LOTTERY_CODE_GUESS(lotteryCodeGuess);
}
diff --git a/src/code/z_message.c b/src/code/z_message.c
index cf88c60df..37e392aec 100644
--- a/src/code/z_message.c
+++ b/src/code/z_message.c
@@ -67,11 +67,11 @@ void func_80147520(void) {
void func_80147564(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- msgCtx->unk1204A[0] = 0xBD;
- msgCtx->unk1204A[1] = 0xB8;
- msgCtx->unk1204A[2] = 0xB3;
- msgCtx->unk1204A[3] = 0xAE;
- msgCtx->unk1204A[4] = 0xA9;
+ msgCtx->ocarinaButtonsPosY[OCARINA_BTN_A] = 189;
+ msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_DOWN] = 184;
+ msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_RIGHT] = 179;
+ msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_LEFT] = 174;
+ msgCtx->ocarinaButtonsPosY[OCARINA_BTN_C_UP] = 169;
func_80147520();
D_801F6B0C = 0x50;
D_801F6B10 = 0x96;
@@ -91,7 +91,7 @@ s32 Message_ShouldAdvance(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Input* controller = CONTROLLER1(&play->state);
- if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
if (CHECK_BTN_ALL(controller->press.button, BTN_A)) {
Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
}
@@ -110,7 +110,7 @@ s32 Message_ShouldAdvanceSilent(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Input* controller = CONTROLLER1(&play->state);
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
return CHECK_BTN_ALL(controller->press.button, BTN_A);
} else {
return CHECK_BTN_ALL(controller->press.button, BTN_A) || CHECK_BTN_ALL(controller->press.button, BTN_B) ||
@@ -124,7 +124,7 @@ void Message_CloseTextbox(PlayState* play) {
if (play->msgCtx.msgLength != 0) {
msgCtx->stateTimer = 2;
msgCtx->msgMode = 0x43;
- msgCtx->unk12020 = 0;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
Audio_PlaySfx(NA_SE_NONE);
}
}
@@ -172,13 +172,13 @@ void func_80148B98(PlayState* play, u8 arg1) {
void func_80148CBC(PlayState* play, UNK_PTR puParm2, u8 arg2) {
MessageContext* msgCtx = &play->msgCtx;
- msgCtx->unk11FF4 = 0x30;
+ msgCtx->textPosX = 0x30;
if (arg2 == 1) {
- msgCtx->unk11FF6 = msgCtx->unk11FFE[1 + msgCtx->choiceIndex];
+ msgCtx->textPosY = msgCtx->unk11FFE[1 + msgCtx->choiceIndex];
} else {
- msgCtx->unk11FF6 = msgCtx->unk11FFE[msgCtx->choiceIndex];
+ msgCtx->textPosY = msgCtx->unk11FFE[msgCtx->choiceIndex];
}
- func_80147818(play, puParm2, msgCtx->unk11FF4, msgCtx->unk11FF6);
+ func_80147818(play, puParm2, msgCtx->textPosX, msgCtx->textPosY);
}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80148D64.s")
@@ -191,7 +191,7 @@ void func_80148CBC(PlayState* play, UNK_PTR puParm2, u8 arg2) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_801496C8.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014995C.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_DrawTextChar.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149C18.s")
@@ -225,11 +225,11 @@ void Message_FindMessage(PlayState* play, u16 textId) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149F74.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014AAD0.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_HandleOcarina.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014ADBC.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014C70C.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_LoadItemIcon.s")
void Message_LoadChar(PlayState* play, u16 codePointIndex, s32* offset, f32* arg3, s16 decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
@@ -239,7 +239,7 @@ void Message_LoadChar(PlayState* play, u16 codePointIndex, s32* offset, f32* arg
Font_LoadChar(play, codePointIndex, temp1);
msgCtx->decodedBuffer.wchar[decodedBufPos] = codePointIndex;
temp1 += FONT_CHAR_TEX_SIZE;
- temp2 += (16.0f * msgCtx->unk12098);
+ temp2 += (16.0f * msgCtx->textCharScale);
*offset = temp1;
*arg3 = temp2;
}
@@ -264,7 +264,7 @@ void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3)
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = 0x815C;
- f += 16.0f * msgCtx->unk12098 * 3.0f;
+ f += 16.0f * msgCtx->textCharScale * 3.0f;
*decodedBufPos = t;
*offset = k;
*arg3 = f;
@@ -302,7 +302,7 @@ void func_8014D62C(PlayState* play, s32* arg1, f32* arg2, s16* arg3) {
}
temp_s1--;
- sp3C += (stringLimit - 1) * (16.0f * msgCtx->unk12098);
+ sp3C += (stringLimit - 1) * (16.0f * msgCtx->textCharScale);
*arg3 = temp_s1;
*arg1 = temp_s2;
@@ -317,15 +317,15 @@ void func_8014D62C(PlayState* play, s32* arg1, f32* arg2, s16* arg3) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_801514B0.s")
-void Message_StartTextbox(PlayState* play, u16 textId, Actor* Actor) {
+void Message_StartTextbox(PlayState* play, u16 textId, Actor* actor) {
MessageContext* msgCtx = &play->msgCtx;
msgCtx->ocarinaAction = 0xFFFF;
func_80150D08(play, textId);
- msgCtx->unkActor = Actor;
+ msgCtx->talkActor = actor;
msgCtx->msgMode = 1;
msgCtx->stateTimer = 0;
- msgCtx->unk12024 = 0;
+ msgCtx->textDelayTimer = 0;
play->msgCtx.ocarinaMode = 0;
}
@@ -338,7 +338,7 @@ void Message_ContinueTextbox(PlayState* play, u16 textId) {
func_80150A84(play);
msgCtx->msgMode = 5;
msgCtx->stateTimer = 8;
- msgCtx->unk12024 = 0;
+ msgCtx->textDelayTimer = 0;
if (interfaceCtx->unk_222 == 0) {
if (textId != 0x1B93) {
@@ -347,11 +347,11 @@ void Message_ContinueTextbox(PlayState* play, u16 textId) {
func_8011552C(play, DO_ACTION_DECIDE);
}
}
- msgCtx->unk1203C = msgCtx->unk1203A;
+ msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget;
if (play->pauseCtx.bombersNotebookOpen) {
- msgCtx->unk12004 = 0x22;
- msgCtx->unk12006 = 0x15E;
+ msgCtx->textboxXTarget = 0x22;
+ msgCtx->textboxYTarget = 0x15E;
func_80149C18(play);
msgCtx->stateTimer = 1;
}
@@ -365,8 +365,8 @@ void func_80151A68(PlayState* play, u16 textId) {
func_80150A84(play);
func_8015B198(play);
msgCtx->msgMode = 0x45;
- msgCtx->unk12024 = 0;
- msgCtx->unk1203C = msgCtx->unk1203A = msgCtx->unk1201E = 0;
+ msgCtx->textDelayTimer = 0;
+ msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget = msgCtx->textColorAlpha = 0;
msgCtx->stateTimer = 30;
// Day/Dawn/Night.. Messages
@@ -432,12 +432,12 @@ u32 func_80151C9C(PlayState* play) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80151DA4.s")
void func_80152434(PlayState* play, u16 arg2) {
- play->msgCtx.unk12046 = 0;
+ play->msgCtx.blockSunsSong = false;
func_80151DA4(play, arg2);
}
void func_80152464(PlayState* play, u16 arg1) {
- play->msgCtx.unk12046 = 1;
+ play->msgCtx.blockSunsSong = true;
func_80151DA4(play, arg1);
}
@@ -450,32 +450,33 @@ u8 Message_GetState(MessageContext* msgCtx) {
}
if (msgCtx->msgMode == 0x42) {
- if (msgCtx->unk11F14 != 0xFFFF) {
+ if (msgCtx->nextTextId != 0xFFFF) {
return TEXT_STATE_1;
}
- if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
return TEXT_STATE_CHOICE;
}
- if ((msgCtx->unk12020 == 0x40) || (msgCtx->unk12020 == 0x42) || (msgCtx->unk12020 == 0x30)) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_40) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_42) ||
+ (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_30)) {
return TEXT_STATE_5;
}
- if (msgCtx->unk12020 == 0x41) {
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_41) {
return TEXT_STATE_16;
}
- if ((msgCtx->unk12020 >= 0x50) && (msgCtx->unk12020 < 0x58)) {
+ if ((msgCtx->textboxEndType >= TEXTBOX_ENDTYPE_50) && (msgCtx->textboxEndType <= TEXTBOX_ENDTYPE_57)) {
return TEXT_STATE_3;
}
- if ((msgCtx->unk12020 == 0x60) || (msgCtx->unk12020 == 0x61)) {
+ if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_60) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_61)) {
return TEXT_STATE_14;
}
- if (msgCtx->unk12020 == 0x62) {
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_62) {
return TEXT_STATE_15;
}
- if (msgCtx->unk12020 == 0x63) {
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_63) {
return TEXT_STATE_17;
}
- if (msgCtx->unk12020 == 0x12) {
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_12) {
return TEXT_STATE_18;
}
return TEXT_STATE_DONE;
@@ -526,7 +527,7 @@ void func_80152EC0(PlayState* play) {
if (1) {}
if ((msgCtx->songPlayed < 0x17) && (msgCtx->songPlayed != 0xE) &&
((msgCtx->ocarinaAction < 0x43) || (msgCtx->ocarinaAction >= 0x47))) {
- msgCtx->unk120B0 = 1;
+ msgCtx->ocarinaSongEffectActive = true;
if (msgCtx->songPlayed != 0x16) {
Actor_Spawn(&play->actorCtx, play, D_801D02D8[msgCtx->songPlayed], player->actor.world.pos.x,
player->actor.world.pos.y, player->actor.world.pos.z, 0, 0, 0, D_801D02F8[msgCtx->songPlayed]);
@@ -541,16 +542,14 @@ void func_80152EC0(PlayState* play) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80153750.s")
-void func_80153E7C(PlayState* play, void* arg1) {
- if ((gSaveContext.options.language == 0) && (play->msgCtx.unk12090 == 0)) {
- func_8014ADBC(play, arg1);
- return;
- }
- if (play->msgCtx.unk12090 != 0) {
- func_8015E7EC(play, arg1);
- return;
+void func_80153E7C(PlayState* play, Gfx** gfxP) {
+ if ((gSaveContext.options.language == 0) && !play->msgCtx.textIsCredits) {
+ func_8014ADBC(play, gfxP);
+ } else if (play->msgCtx.textIsCredits) {
+ Message_DrawTextCredits(play, gfxP);
+ } else {
+ func_8015966C(play, gfxP, 0);
}
- func_8015966C(play, arg1, 0);
}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80153EF0.s")
@@ -586,39 +585,39 @@ void func_801586A4(PlayState* play) {
void Message_Init(PlayState* play) {
Font* font;
- MessageContext* messageCtx = &play->msgCtx;
+ MessageContext* msgCtx = &play->msgCtx;
func_801586A4(play);
play->msgCtx.ocarinaMode = 0;
- messageCtx->msgMode = 0;
- messageCtx->msgLength = 0;
- messageCtx->currentTextId = 0;
- messageCtx->unk12020 = 0;
- messageCtx->choiceIndex = 0;
- messageCtx->ocarinaAction = messageCtx->unk11FF2 = 0;
- messageCtx->unk1201E = 0xFF;
- View_Init(&messageCtx->view, play->state.gfxCtx);
- messageCtx->unk11EF8 = THA_AllocTailAlign16(&play->state.heap, 0x13C00);
+ msgCtx->msgMode = 0;
+ msgCtx->msgLength = 0;
+ msgCtx->currentTextId = 0;
+ msgCtx->textboxEndType = 0;
+ msgCtx->choiceIndex = 0;
+ msgCtx->ocarinaAction = msgCtx->textUnskippable = 0;
+ msgCtx->textColorAlpha = 0xFF;
+ View_Init(&msgCtx->view, play->state.gfxCtx);
+ msgCtx->textboxSegment = THA_AllocTailAlign16(&play->state.heap, 0x13C00);
font = &play->msgCtx.font;
Font_LoadOrderedFont(&play->msgCtx.font);
font->unk_11D88 = 0;
- messageCtx->unk12090 = messageCtx->unk12092 = 0;
- messageCtx->unk12094 = 0;
- messageCtx->unk1209C = 0;
- messageCtx->unk120A0 = 0;
- messageCtx->unk12068 = 0x34;
- messageCtx->unk1206A = 0x24;
- messageCtx->unk120B0 = 0;
- messageCtx->unk120BE = 0;
- messageCtx->unk120C0 = 0;
- messageCtx->unk120C2 = 0;
- messageCtx->unk120C4 = 0;
- messageCtx->unk120C8 = 0;
- messageCtx->unk120CA = 0;
- messageCtx->unk120CC = 0;
- messageCtx->unk120CE = 0;
- messageCtx->unk120D0 = 0;
- messageCtx->unk120D2 = 0;
- messageCtx->unk120D4 = 0;
- messageCtx->unk120D6 = 0;
+ msgCtx->textIsCredits = msgCtx->messageHasSetSfx = false;
+ msgCtx->textboxSkipped = 0;
+ msgCtx->textFade = 0;
+ msgCtx->ocarinaAvailableSongs = 0;
+ msgCtx->textboxX = 0x34;
+ msgCtx->textboxY = 0x24;
+ msgCtx->ocarinaSongEffectActive = false;
+ msgCtx->unk120BE = 0;
+ msgCtx->unk120C0 = 0;
+ msgCtx->unk120C2 = 0;
+ msgCtx->unk120C4 = 0;
+ msgCtx->unk120C8 = 0;
+ msgCtx->unk120CA = 0;
+ msgCtx->unk120CC = 0;
+ msgCtx->unk120CE = 0;
+ msgCtx->unk120D0 = 0;
+ msgCtx->unk120D2 = 0;
+ msgCtx->unk120D4 = 0;
+ msgCtx->unk120D6 = 0;
}
diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c
index 759c3d611..1dcb16474 100644
--- a/src/code/z_message_nes.c
+++ b/src/code/z_message_nes.c
@@ -91,7 +91,7 @@ void Message_LoadCharNES(PlayState* play, u8 codePointIndex, s32* offset, f32* a
Font_LoadCharNES(play, codePointIndex, temp1);
msgCtx->decodedBuffer.schar[decodedBufPos] = codePointIndex;
temp1 += FONT_CHAR_TEX_SIZE;
- temp2 += (16.0f * msgCtx->unk12098);
+ temp2 += (16.0f * msgCtx->textCharScale);
*offset = temp1;
*arg3 = temp2;
}
@@ -128,7 +128,7 @@ void Message_LoadPluralRupeesNES(PlayState* play, s16* decodedBufPos, s32* offse
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 's';
- f += 16.0f * msgCtx->unk12098 * 6.0f;
+ f += 16.0f * msgCtx->textCharScale * 6.0f;
*decodedBufPos = p;
*offset = o;
*arg3 = f;
@@ -152,7 +152,7 @@ void Message_LoadLocalizedRupeesNES(PlayState* play, s16* decodedBufPos, s32* of
}
p--;
- f += 16.0f * msgCtx->unk12098 * (D_801D0710[gSaveContext.options.language - 1] + 1);
+ f += 16.0f * msgCtx->textCharScale * (D_801D0710[gSaveContext.options.language - 1] + 1);
*decodedBufPos = p;
*offset = o;
*arg3 = f;
@@ -191,9 +191,9 @@ void Message_LoadRupeesNES(PlayState* play, s16* decodedBufPos, s32* offset, f32
Font_LoadCharNES(play, 's', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 's';
- f += 16.0f * msgCtx->unk12098 * 6.0f;
+ f += 16.0f * msgCtx->textCharScale * 6.0f;
} else {
- f += 16.0f * msgCtx->unk12098 * 5.0f;
+ f += 16.0f * msgCtx->textCharScale * 5.0f;
}
*decodedBufPos = p;
@@ -246,7 +246,7 @@ void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16*
}
}
- f += 5.0f * (16.0f * msgCtx->unk12098);
+ f += 5.0f * (16.0f * msgCtx->textCharScale);
*decodedBufPos = p - 1;
*offset = o;
*arg3 = f;
@@ -278,11 +278,11 @@ void Message_LoadOwlWarpTextNES(PlayState* play, s32* offset, f32* arg2, s16* de
}
currentChar = msgCtx->decodedBuffer.schar[p];
p++;
- f += (D_801D0470[currentChar - ' '] * msgCtx->unk12098);
+ f += (D_801D0470[currentChar - ' '] * msgCtx->textCharScale);
}
p--;
- f += (stringLimit - 1) * (16.0f * msgCtx->unk12098);
+ f += (stringLimit - 1) * (16.0f * msgCtx->textCharScale);
*decodedBufPos = p;
*offset = o;
*arg2 = f;
diff --git a/src/code/z_message_staff.c b/src/code/z_message_staff.c
index ab30a3d9c..a093ef5c1 100644
--- a/src/code/z_message_staff.c
+++ b/src/code/z_message_staff.c
@@ -17,12 +17,660 @@ void Message_FindCreditsMessage(PlayState* play, u16 textId) {
nextSegment = msgEntry->segment;
font->messageStart = foundSegment - segment;
font->messageEnd = nextSegment - foundSegment;
- return;
+ break;
}
msgEntry++;
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_staff/func_8015E7EC.s")
+f32 sCreditsFontWidths[144] = {
+ 8.0f, 8.0f, 6.0f, 9.0f, 9.0f, 14.0f, 12.0f, 3.0f, 7.0f, 7.0f, 7.0f, 9.0f, 4.0f, 6.0f, 4.0f, 9.0f,
+ 10.0f, 5.0f, 9.0f, 9.0f, 10.0f, 9.0f, 9.0f, 9.0f, 9.0f, 9.0f, 6.0f, 6.0f, 9.0f, 11.0f, 9.0f, 11.0f,
+ 13.0f, 12.0f, 9.0f, 11.0f, 11.0f, 8.0f, 8.0f, 12.0f, 10.0f, 4.0f, 8.0f, 10.0f, 8.0f, 13.0f, 11.0f, 13.0f,
+ 9.0f, 13.0f, 10.0f, 10.0f, 9.0f, 10.0f, 11.0f, 15.0f, 11.0f, 10.0f, 10.0f, 7.0f, 10.0f, 7.0f, 10.0f, 9.0f,
+ 5.0f, 8.0f, 9.0f, 8.0f, 9.0f, 9.0f, 6.0f, 9.0f, 8.0f, 4.0f, 6.0f, 8.0f, 4.0f, 12.0f, 9.0f, 9.0f,
+ 9.0f, 9.0f, 7.0f, 8.0f, 7.0f, 8.0f, 9.0f, 12.0f, 8.0f, 9.0f, 8.0f, 7.0f, 5.0f, 7.0f, 10.0f, 10.0f,
+ 12.0f, 12.0f, 12.0f, 12.0f, 11.0f, 8.0f, 8.0f, 8.0f, 6.0f, 6.0f, 13.0f, 13.0f, 10.0f, 10.0f, 10.0f, 9.0f,
+ 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f, 6.0f, 9.0f, 9.0f, 9.0f, 9.0f, 9.0f, 14.0f,
+ 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_staff/func_8015F8A8.s")
+#ifdef NON_MATCHING
+// https://decomp.me/scratch/yc8Or
+// v0/v1 swap between `character` and `i`
+void Message_DrawTextCredits(PlayState* play, Gfx** gfxP) {
+ MessageContext* msgCtx = &play->msgCtx;
+ u16 lookAheadCharacter;
+ u16 j;
+ u16 i;
+ u16 sfxHi;
+ char character;
+ u16 charTexIndex;
+ Font* font = &msgCtx->font;
+ Gfx* gfx = *gfxP;
+
+ msgCtx->textPosX = msgCtx->unk11FF8;
+
+ if (!msgCtx->textIsCredits) {
+ msgCtx->textPosY = msgCtx->unk11FFA;
+ } else {
+ msgCtx->textPosY = 48;
+ }
+
+ if (msgCtx->textBoxType == TEXTBOX_TYPE_5) {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0;
+ } else {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 255;
+ }
+
+ charTexIndex = 0;
+
+ for (i = 0; i < msgCtx->textDrawPos; i++) {
+ character = msgCtx->decodedBuffer.schar[i];
+
+ switch (character) {
+ case 0x1: // MESSAGE_NEWLINE
+ msgCtx->textPosX = msgCtx->unk11FF8;
+ if ((msgCtx->choiceNum == 1) || (msgCtx->choiceNum == 3)) {
+ msgCtx->textPosX += 32;
+ }
+ if ((msgCtx->choiceNum == 2) && (msgCtx->textPosY != msgCtx->unk11FFA)) {
+ msgCtx->textPosX += 32;
+ }
+ msgCtx->textPosY += msgCtx->unk11FFC;
+ break;
+
+ case 0x5: // Remnant of MESSAGE_COLOR
+ break;
+
+ case ' ':
+ msgCtx->textPosX += 6;
+ break;
+
+ case 0x4: // MESSAGE_BOX_BREAK
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ if (!msgCtx->textboxSkipped) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_AWAIT_NEXT;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ } else {
+ msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
+ msgCtx->textUnskippable = false;
+ msgCtx->msgBufPos++;
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x6: // MESSAGE_SHIFT
+ msgCtx->textPosX += msgCtx->decodedBuffer.schar[++i];
+ break;
+
+ case 0x7: // MESSAGE_TEXTID
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_20;
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x8: // MESSAGE_QUICKTEXT_ENABLE
+ if (((i + 1) == msgCtx->textDrawPos) &&
+ ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) ||
+ ((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26)))) {
+ j = i;
+ while (true) {
+ lookAheadCharacter = msgCtx->decodedBuffer.schar[j];
+ if (lookAheadCharacter == 6) {
+ j += 2;
+ continue;
+ }
+ if ((lookAheadCharacter != 9) && (lookAheadCharacter != 0xA) && (lookAheadCharacter != 0xB) &&
+ (lookAheadCharacter != 0xC) && (lookAheadCharacter != 0xD) && (lookAheadCharacter != 4) &&
+ (lookAheadCharacter != 2)) {
+ j++;
+ continue;
+ }
+ break;
+ }
+ i = j - 1;
+ msgCtx->textDrawPos = i + 1;
+ }
+ // fallthrough
+ case 0x9: // MESSAGE_QUICKTEXT_DISABLE
+ break;
+
+ case 0xD: // MESSAGE_AWAIT_BUTTON_PRESS
+ if ((i + 1) == msgCtx->textDrawPos) {
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_AWAIT_INPUT;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ }
+ *gfxP = gfx;
+ return;
+ }
+ break;
+
+ case 0xC: // MESSAGE_BOX_BREAK_DELAYED
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->stateTimer = msgCtx->decodedBuffer.schar[++i];
+ msgCtx->msgMode = MSGMODE_TEXT_DELAYED_BREAK;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x11: // MESSAGE_FADE2
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_50;
+ msgCtx->stateTimer = msgCtx->decodedBuffer.schar[++i] << 8;
+ msgCtx->stateTimer |= msgCtx->decodedBuffer.schar[++i];
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x12: // MESSAGE_SFX
+ if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && !msgCtx->messageHasSetSfx) {
+ msgCtx->messageHasSetSfx = true;
+ sfxHi = msgCtx->decodedBuffer.schar[i + 1];
+ sfxHi = sfxHi << 8;
+ Audio_PlaySfx(sfxHi | msgCtx->decodedBuffer.schar[i + 2]);
+ }
+ i += 2;
+ break;
+
+ case 0x13: // remnant of MESSAGE_ITEM_ICON
+ break;
+
+ case 0x15: // MESSAGE_BACKGROUND
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textColorAlpha);
+
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 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);
+ gSPTextureRectangle(gfx++, (msgCtx->textPosX + 1) << 2, (msgCtx->unk12012 + 1) << 2,
+ (msgCtx->textPosX + 0x61) << 2, (msgCtx->unk12012 + 0x31) << 2, G_TX_RENDERTILE, 0,
+ 0, 1 << 10, 1 << 10);
+
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 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);
+ gSPTextureRectangle(gfx++, (msgCtx->textPosX + 0x61) << 2, (msgCtx->unk12012 + 1) << 2,
+ (msgCtx->textPosX + 0xC2) << 2, (msgCtx->unk12012 + 0x31) << 2, 0, 0, 0, 1 << 10,
+ 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 60, 0, msgCtx->textColorAlpha);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 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);
+ gSPTextureRectangle(gfx++, msgCtx->textPosX << 2, msgCtx->unk12012 << 2, (msgCtx->textPosX + 0x60) << 2,
+ (msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 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);
+ gSPTextureRectangle(gfx++, (msgCtx->textPosX + 0x60) << 2, msgCtx->unk12012 << 2,
+ (msgCtx->textPosX + 0xC0) << 2, (msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0,
+ 0, 1 << 10, 1 << 10);
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+ msgCtx->textPosX += 0x20;
+ break;
+
+ case 0x14: // MESSAGE_TEXT_SPEED
+ msgCtx->textDelay = msgCtx->decodedBuffer.schar[++i];
+ break;
+
+ case 0x1A: // MESSAGE_UNSKIPPABLE
+ msgCtx->textUnskippable = true;
+ break;
+
+ case 0x1B: // MESSAGE_TWO_CHOICE
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_10;
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->choiceTextId = msgCtx->currentTextId;
+ msgCtx->stateTimer = 4;
+ msgCtx->choiceIndex = 0;
+ Font_LoadMessageBoxEndIcon(font, 2);
+ }
+ break;
+
+ case 0x1C: // MESSAGE_THREE_CHOICE
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_11;
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->choiceTextId = msgCtx->currentTextId;
+ msgCtx->stateTimer = 4;
+ msgCtx->choiceIndex = 0;
+ Font_LoadMessageBoxEndIcon(font, 2);
+ }
+ break;
+
+ case 0x2: // MESSAGE_END
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_00) {
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ Font_LoadMessageBoxEndIcon(font, 1);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x10: // MESSAGE_OCARINA
+ if ((i + 1) == msgCtx->textDrawPos) {
+ Message_HandleOcarina(play);
+ *gfxP = gfx;
+ return;
+ }
+ break;
+
+ case 0xE: // MESSAGE_FADE
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_50;
+ msgCtx->stateTimer = msgCtx->decodedBuffer.schar[++i];
+ Font_LoadMessageBoxEndIcon(font, 1);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0xA: // MESSAGE_PERSISTENT
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_30;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0xB: // MESSAGE_EVENT
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = TEXTBOX_ENDTYPE_40;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ *gfxP = gfx;
+ return;
+
+ default:
+ if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && ((i + 1) == msgCtx->textDrawPos) &&
+ (msgCtx->textDelayTimer == msgCtx->textDelay)) {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+ Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
+ charTexIndex += FONT_CHAR_TEX_SIZE;
+
+ msgCtx->textPosX += (s32)(sCreditsFontWidths[character - ' '] * msgCtx->textCharScale);
+ break;
+ }
+ }
+
+ if (msgCtx->textDelayTimer == 0) {
+ msgCtx->textDrawPos = i + 1;
+ msgCtx->textDelayTimer = msgCtx->textDelay;
+ } else {
+ msgCtx->textDelayTimer--;
+ }
+
+ *gfxP = gfx;
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_staff/Message_DrawTextCredits.s")
+#endif
+
+void Message_DecodeCredits(PlayState* play) {
+ u16 curChar;
+ s16 loadChar;
+ s16 i;
+ s16 playerNameLen;
+ s16 decodedBufPos = 0;
+ s16 charOffset;
+ f32 timeInSeconds;
+ s16 numLines = 0;
+ s16 value;
+ s16 digits[4];
+ s32 charTexIdx = 0;
+ MessageContext* msgCtx = &play->msgCtx;
+ Font* font = &play->msgCtx.font;
+
+ msgCtx->nextTextId = 0xFFFF;
+
+ while (true) {
+ curChar = font->msgBuf.schar[msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos];
+
+ if ((curChar == 4) || (curChar == 7) || (curChar == 0xC) || (curChar == 0xB) || (curChar == 2)) {
+ // Textbox decoding ends with any of the above text control characters
+ msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
+ msgCtx->textDrawPos = 1;
+ msgCtx->unk11FFA = msgCtx->textboxY + 8;
+
+ if (msgCtx->textBoxType != TEXTBOX_TYPE_4) {
+ if (numLines == 0) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 26;
+ } else if (numLines == 1) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 20;
+ } else if (numLines == 2) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 16;
+ }
+ }
+
+ if (curChar == 7) {
+ value = font->msgBuf.schar[msgCtx->msgBufPos + 1];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 2];
+ value <<= 8;
+ msgCtx->nextTextId = msgCtx->decodedBuffer.schar[decodedBufPos] | value;
+ }
+
+ if (curChar == 0xC) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1];
+ msgCtx->msgBufPos += 2;
+ }
+
+ msgCtx->decodedTextLen = decodedBufPos;
+
+ if (msgCtx->textboxSkipped) {
+ msgCtx->textDrawPos = msgCtx->decodedTextLen;
+ }
+ break;
+ } else if (curChar == 0xF) {
+ // Substitute the player name control character for the file's player name.
+ for (playerNameLen = ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); playerNameLen > 0;
+ playerNameLen--) {
+ if (gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1] != 0x3E) {
+ break;
+ }
+ }
+
+ for (i = 0; i < playerNameLen; i++) {
+ curChar = gSaveContext.save.saveInfo.playerData.playerName[i];
+ if (curChar == 62) {
+ curChar = ' ';
+ } else if (curChar == 64) {
+ curChar = '.';
+ } else if (curChar == 63) {
+ curChar = '-';
+ } else if (curChar < 10) {
+ charOffset = curChar;
+ curChar = '0' + charOffset;
+ } else if (curChar < 36) {
+ charOffset = curChar;
+ curChar = 'A' - 10 + charOffset;
+ } else if (curChar < 62) {
+ charOffset = curChar;
+ curChar = 'a' - 36 + charOffset;
+ }
+
+ if (curChar != ' ') {
+ Font_LoadCharNES(play, curChar - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ msgCtx->decodedBuffer.schar[decodedBufPos] = curChar;
+ decodedBufPos++;
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0x16) || (curChar == 0x17)) {
+ digits[0] = digits[1] = digits[2] = 0;
+ if (curChar == 0x17) {
+ digits[3] = gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2];
+ } else {
+ digits[3] = gSaveContext.timerCurTimes[TIMER_ID_GORON_RACE_UNUSED];
+ }
+
+ while (digits[3] >= 60) {
+ digits[1]++;
+ if (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+ digits[3] -= 60;
+ }
+
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ if (i == 1) {
+ Font_LoadCharNES(play, '"' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
+ decodedBufPos++;
+ } else if (i == 3) {
+ Font_LoadCharNES(play, '"' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
+ }
+ }
+
+ } else if (curChar == 0x18) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = gSaveContext.minigameScore;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar != 0x19) {
+ if (curChar == 0x1D) {
+ digits[0] = 0;
+ digits[1] = gSaveContext.minigameScore;
+
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ for (i = 0; i < 2; i++) {
+ if ((i == 1) || (digits[i] != 0)) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0x1E) {
+ value = HIGH_SCORE((u8)font->msgBuf.schar[++msgCtx->msgBufPos]);
+ if ((font->msgBuf.schar[msgCtx->msgBufPos] & 0xFF) == HS_FISHING) {
+ if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
+ value &= 0x7F;
+ } else {
+ value =
+ (s16)((HIGH_SCORE((u8)font->msgBuf.schar[msgCtx->msgBufPos]) & 0xFF000000) >> 0x18) & 0x7F;
+ }
+ value = SQ((f32)value) * 0.0036f + 0.5f;
+ }
+ switch (font->msgBuf.schar[msgCtx->msgBufPos] & 0xFF) {
+ case 0:
+ case 1:
+ case 2:
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = value;
+
+ while (digits[3] >= 1000) {
+ digits[0]++;
+ digits[3] -= 1000;
+ }
+ while (digits[3] >= 100) {
+ digits[1]++;
+ digits[3] -= 100;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 4; i++) {
+ if ((i == 3) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ break;
+
+ case 3:
+ case 4:
+ case 6:
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = value;
+
+ while (digits[3] >= 60) {
+ digits[1]++;
+ if (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+ digits[3] -= 60;
+ }
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ if (i == 1) {
+ Font_LoadCharNES(play, '"' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
+ decodedBufPos++;
+ } else if (i == 3) {
+ Font_LoadCharNES(play, '"' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (curChar == 0x1F) {
+ digits[0] = 0;
+ timeInSeconds = TIME_TO_MINUTES_F(gSaveContext.save.time);
+
+ digits[1] = timeInSeconds / 60.0f;
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ digits[2] = 0;
+ digits[3] = (s32)timeInSeconds % 60;
+ while (digits[3] >= 10) {
+ digits[2]++;
+ digits[3] -= 10;
+ }
+
+ for (i = 0; i < 4; i++) {
+ Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ if (i == 1) {
+ Font_LoadCharNES(play, ':' - ' ', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = ':';
+ decodedBufPos++;
+ }
+ }
+
+ decodedBufPos--;
+ } else if (curChar == 0x13) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1];
+ Message_LoadItemIcon(play, font->msgBuf.schar[msgCtx->msgBufPos + 1], msgCtx->textboxY + 10);
+ } else if (curChar == 0x15) {
+ DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000,
+ (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
+ DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900,
+ (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
+ msgCtx->msgBufPos += 3;
+ msgCtx->unk12012 = msgCtx->textboxY + 8;
+ numLines = 2;
+ } else if (curChar == 5) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if (curChar == 1) {
+ numLines++;
+ } else if ((curChar != 8) && (curChar != 9) && (curChar != 0xD) && (curChar != 0x10) && (curChar != 0xA) &&
+ (curChar != 0x1A)) {
+ if (curChar == 0xE) {
+ msgCtx->textFade = true;
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if (curChar == 0x11) {
+ msgCtx->textFade = true;
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if ((curChar == 6) || (curChar == 0x14)) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos] & 0xFF;
+ } else if (curChar == 0x12) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if (curChar == 0x1B) {
+ msgCtx->choiceNum = 2;
+ } else if (curChar == 0x1C) {
+ msgCtx->choiceNum = 3;
+ } else if (curChar != ' ') {
+ Font_LoadCharNES(play, curChar, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ }
+ }
+
+ decodedBufPos++;
+ msgCtx->msgBufPos++;
+ }
+}
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index a3dc07aaf..2c4106e05 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -6870,7 +6870,7 @@ void Interface_Update(PlayState* play) {
interfaceCtx->aButtonRoll = -15700.0f;
interfaceCtx->aButtonState = A_BTN_STATE_2;
- if ((msgCtx->msgMode != 0) && (msgCtx->unk12006 == 0x26)) {
+ if ((msgCtx->msgMode != 0) && (msgCtx->textboxYTarget == 0x26)) {
R_A_BTN_Y_OFFSET = -14;
} else {
R_A_BTN_Y_OFFSET = 0;
diff --git a/src/code/z_play.c b/src/code/z_play.c
index 9bb8d5817..44efbfbfb 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -961,9 +961,9 @@ void Play_UpdateMain(PlayState* this) {
Play_UpdateTransition(this);
if (gTransitionTileState != TRANS_TILE_READY) {
if ((gSaveContext.gameMode == GAMEMODE_NORMAL) &&
- (((this->msgCtx.msgMode == 0)) ||
- ((this->msgCtx.currentTextId == 0xFF) && (this->msgCtx.msgMode == 0x42) &&
- (this->msgCtx.unk12020 == 0x41)) ||
+ (((this->msgCtx.msgMode == MSGMODE_NONE)) ||
+ ((this->msgCtx.currentTextId == 0xFF) && (this->msgCtx.msgMode == MSGMODE_TEXT_DONE) &&
+ (this->msgCtx.textboxEndType == TEXTBOX_ENDTYPE_41)) ||
((this->msgCtx.currentTextId >= 0x100) && (this->msgCtx.currentTextId <= 0x200))) &&
(this->gameOverCtx.state == GAMEOVER_INACTIVE)) {
KaleidoSetup_Update(this);
diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c
index a890090ff..2e36ea553 100644
--- a/src/code/z_player_lib.c
+++ b/src/code/z_player_lib.c
@@ -620,7 +620,7 @@ PlayerItemAction func_80123810(PlayState* play) {
if (CHECK_BTN_ANY(CONTROLLER1(&play->state)->press.button, BTN_A | BTN_B)) {
play->interfaceCtx.unk_222 = 0;
play->interfaceCtx.unk_224 = 0;
- Interface_SetHudVisibility(play->msgCtx.unk_120BC);
+ Interface_SetHudVisibility(play->msgCtx.hudVisibility);
return PLAYER_IA_MINUS1;
}
} else {
@@ -634,7 +634,7 @@ PlayerItemAction func_80123810(PlayState* play) {
play->interfaceCtx.unk_222 = 0;
play->interfaceCtx.unk_224 = 0;
- Interface_SetHudVisibility(play->msgCtx.unk_120BC);
+ Interface_SetHudVisibility(play->msgCtx.hudVisibility);
if ((itemId >= ITEM_FD) || ((itemAction = play->unk_18794(play, player, itemId)) <= PLAYER_IA_MINUS1)) {
Audio_PlaySfx(NA_SE_SY_ERROR);
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index 768314490..198dac4e9 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -396,11 +396,11 @@ void Sram_ActivateOwl(u8 owlId) {
}
void Sram_ClearHighscores(void) {
- gSaveContext.save.saveInfo.unk_EC4 = (gSaveContext.save.saveInfo.unk_EC4 & 0xFFFF) | 0x130000;
- gSaveContext.save.saveInfo.unk_EC4 = (gSaveContext.save.saveInfo.unk_EC4 & 0xFFFF0000) | 0xA;
- gSaveContext.save.saveInfo.horseBackBalloonHighScore = SECONDS_TO_TIMER(60);
- SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(39);
- SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(10);
+ HS_SET_BOAT_ARCHERY_HIGH_SCORE(19);
+ HS_SET_HIGH_SCORE_3_LOWER(10);
+ HS_SET_HORSE_BACK_BALLOON_TIME(SECONDS_TO_TIMER(60));
+ HS_SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(39);
+ HS_SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(10);
gSaveContext.save.saveInfo.dekuPlaygroundHighScores[0] = SECONDS_TO_TIMER(75);
gSaveContext.save.saveInfo.dekuPlaygroundHighScores[1] = SECONDS_TO_TIMER(75);