summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2023-09-26 21:24:52 -0700
committerGitHub <noreply@github.com>2023-09-27 14:24:52 +1000
commitd4c41f02633ca059d93122fe750d77062984b099 (patch)
treed29327c9f02af24bccd346053930a1027aa5ef04 /src/code
parent775501b28bcac057c9054cba70e28ecbb8f48d5e (diff)
z_message_nes (1 NON_MATCHING) (#1394)
* Bring over progress * Some docs * scratch urls + format * Fixes * Match Message_DrawTextNES * String macros * color structs
Diffstat (limited to 'src/code')
-rw-r--r--src/code/z_message.c8
-rw-r--r--src/code/z_message_nes.c1728
2 files changed, 1666 insertions, 70 deletions
diff --git a/src/code/z_message.c b/src/code/z_message.c
index 37e392aec..a922f237b 100644
--- a/src/code/z_message.c
+++ b/src/code/z_message.c
@@ -223,7 +223,7 @@ void Message_FindMessage(PlayState* play, u16 textId) {
font->messageEnd = nextSegment - foundSegment;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80149F74.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_DrawItemIcon.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_HandleOcarina.s")
@@ -272,7 +272,7 @@ void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3)
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014CDF0.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014CFDC.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_SetupLoadItemIcon.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014D304.s")
@@ -363,7 +363,7 @@ void func_80151A68(PlayState* play, u16 textId) {
msgCtx->msgLength = 0;
func_80150D08(play, textId);
func_80150A84(play);
- func_8015B198(play);
+ Message_DecodeNES(play);
msgCtx->msgMode = 0x45;
msgCtx->textDelayTimer = 0;
msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget = msgCtx->textColorAlpha = 0;
@@ -548,7 +548,7 @@ void func_80153E7C(PlayState* play, Gfx** gfxP) {
} else if (play->msgCtx.textIsCredits) {
Message_DrawTextCredits(play, gfxP);
} else {
- func_8015966C(play, gfxP, 0);
+ Message_DrawTextNES(play, gfxP, 0);
}
}
diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c
index 1dcb16474..6ace9acc1 100644
--- a/src/code/z_message_nes.c
+++ b/src/code/z_message_nes.c
@@ -2,59 +2,20 @@
#include "message_data_static.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
-#if 0
-
-//fontWidth
-extern f32 D_801D0470[159];
-
-//rupeesTextLocalization
-u8 D_801D06F0[4][8] = { { "rupee(s)" }, //EN
- { "rubin(e)" }, //DE
- { "rubis" }, //FR
- { "rupia(s)" } //SPA
- };
-
-// rupeesTextLength
-u8 D_801D0710[4] = {8,8,5,8};
-
-// sOwlWarpText
-char D_801D0714[OWL_WARP_MAX][16] = {
- "Great Bay Coast", // OWL_WARP_GREAT_BAY_COAST
- "Zora Cape", // OWL_WARP_ZORA_CAPE
- "Snowhead", // OWL_WARP_SNOWHEAD
- "Mountain Village", // OWL_WARP_MOUNTAIN_VILLAGE
- "Clock Town", // OWL_WARP_CLOCK_TOWN
- "Milk Road", // OWL_WARP_MILK_ROAD
- "Woodfall", // OWL_WARP_WOODFALL
- "Southern Swamp", // OWL_WARP_SOUTHERN_SWAMP
- "Ikana Canyon", // OWL_WARP_IKANA_CANYON
- "Stone Tower", // OWL_WARP_STONE_TOWER
- "Entrance", // OWL_WARP_ENTRANCE
+// fontWidth
+f32 sNESFontWidths[160] = {
+ 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, 6.0f,
+ 12.0f, 12.0f, 12.0f, 12.0f, 11.0f, 8.0f, 8.0f, 8.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 10.0f, 13.0f, 13.0f,
+ 13.0f, 13.0f, 10.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,
+ 4.0f, 4.0f, 4.0f, 4.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 11.0f, 6.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,
};
-// sOwlWarpTextLength
-s16 D_801D07C4[OWL_WARP_MAX] = {
- 15, // OWL_WARP_GREAT_BAY_COAST
- 9, // OWL_WARP_ZORA_CAPE
- 8, // OWL_WARP_SNOWHEAD
- 16, // OWL_WARP_MOUNTAIN_VILLAGE
- 10, // OWL_WARP_CLOCK_TOWN
- 9, // OWL_WARP_MILK_ROAD
- 8, // OWL_WARP_WOODFALL
- 14, // OWL_WARP_SOUTHERN_SWAMP
- 12, // OWL_WARP_IKANA_CANYON
- 11, // OWL_WARP_STONE_TOWER
- 8, // OWL_WARP_ENTRANCE
-};
-
-#endif
-
-extern f32 D_801D0470[159];
-extern u8 D_801D06F0[4][8];
-extern u8 D_801D0710[4];
-extern u8 D_801D0714[OWL_WARP_MAX][16];
-extern s16 D_801D07C4[OWL_WARP_MAX];
-
void Message_FindMessageNES(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
Font* font = &msgCtx->font;
@@ -102,7 +63,7 @@ void Message_LoadPluralRupeesNES(PlayState* play, s16* decodedBufPos, s32* offse
s32 o = *offset;
f32 f = *arg3;
- msgCtx->decodedBuffer.schar[p] = 0x20;
+ msgCtx->decodedBuffer.schar[p] = ' ';
p++;
Font_LoadCharNES(play, 'R', o);
o += FONT_CHAR_TEX_SIZE;
@@ -134,6 +95,25 @@ void Message_LoadPluralRupeesNES(PlayState* play, s16* decodedBufPos, s32* offse
*arg3 = f;
}
+#define RUPEES_STR_EN "Rupee(s)"
+#define RUPEES_STR_DE "Rubin(e)"
+#define RUPEES_STR_FR "Rubis"
+#define RUPEES_STR_SPA "Rupia(s)"
+
+char sRupeesTextLocalization[LANGUAGE_MAX - 1][8] = {
+ RUPEES_STR_EN, // EN
+ RUPEES_STR_DE, // DE
+ RUPEES_STR_FR, // FR
+ RUPEES_STR_SPA, // SPA
+};
+
+u8 sRupeesTextLength[LANGUAGE_MAX - 1] = {
+ sizeof(RUPEES_STR_EN) - 1,
+ sizeof(RUPEES_STR_DE) - 1,
+ sizeof(RUPEES_STR_FR) - 1,
+ sizeof(RUPEES_STR_SPA) - 1,
+};
+
void Message_LoadLocalizedRupeesNES(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) {
MessageContext* msgCtx = &play->msgCtx;
s16 p = *decodedBufPos;
@@ -144,15 +124,15 @@ void Message_LoadLocalizedRupeesNES(PlayState* play, s16* decodedBufPos, s32* of
msgCtx->decodedBuffer.schar[p] = ' ';
p++;
- for (j = 0; j < D_801D0710[gSaveContext.options.language - 1]; j++) {
- Font_LoadCharNES(play, D_801D06F0[gSaveContext.options.language - 1][j], o);
- msgCtx->decodedBuffer.schar[p] = D_801D06F0[gSaveContext.options.language - 1][j];
+ for (j = 0; j < sRupeesTextLength[gSaveContext.options.language - 1]; j++) {
+ Font_LoadCharNES(play, sRupeesTextLocalization[gSaveContext.options.language - 1][j], o);
+ msgCtx->decodedBuffer.schar[p] = sRupeesTextLocalization[gSaveContext.options.language - 1][j];
o += FONT_CHAR_TEX_SIZE;
p++;
}
p--;
- f += 16.0f * msgCtx->textCharScale * (D_801D0710[gSaveContext.options.language - 1] + 1);
+ f += 16.0f * msgCtx->textCharScale * (sRupeesTextLength[gSaveContext.options.language - 1] + 1);
*decodedBufPos = p;
*offset = o;
*arg3 = f;
@@ -201,7 +181,7 @@ void Message_LoadRupeesNES(PlayState* play, s16* decodedBufPos, s32* offset, f32
*arg3 = f;
}
-void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16* decodedBufPos) {
+void Message_LoadTimeNES(PlayState* play, u8 curChar, s32* offset, f32* arg3, s16* decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
s16 p = *decodedBufPos;
s32 o = *offset;
@@ -211,12 +191,11 @@ void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16*
f32 timeLeftInMinutes;
s16 i;
- if (arg1 == 0xCF) {
+ if (curChar == 0xCF) {
timeLeft = TIME_UNTIL_MOON_CRASH;
} else {
timeLeft = TIME_UNTIL_NEW_DAY;
}
-
timeLeftInMinutes = TIME_TO_MINUTES_F(timeLeft);
digits[0] = 0;
@@ -252,6 +231,46 @@ void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16*
*arg3 = f;
}
+#define GREAT_BAY_COAST_STR "Great Bay Coast"
+#define ZORA_CAPE_STR "Zora Cape"
+#define SNOWHEAD_STR "Snowhead"
+#define MOUNTAIN_VILLAGE_STR "Mountain Village"
+#define CLOCK_TOWN_STR "Clock Town"
+#define MILK_ROAD_STR "Milk Road"
+#define WOODFALL_STR "Woodfall"
+#define SOUTHERN_SWAMP_STR "Southern Swamp"
+#define IKANA_CANYON_STR "Ikana Canyon"
+#define STONE_TOWER_STR "Stone Tower"
+#define ENTRANCE_STR "Entrance"
+
+char sOwlWarpTextENG[OWL_WARP_MAX][16] = {
+ GREAT_BAY_COAST_STR, // OWL_WARP_GREAT_BAY_COAST
+ ZORA_CAPE_STR, // OWL_WARP_ZORA_CAPE
+ SNOWHEAD_STR, // OWL_WARP_SNOWHEAD
+ MOUNTAIN_VILLAGE_STR, // OWL_WARP_MOUNTAIN_VILLAGE
+ CLOCK_TOWN_STR, // OWL_WARP_CLOCK_TOWN
+ MILK_ROAD_STR, // OWL_WARP_MILK_ROAD
+ WOODFALL_STR, // OWL_WARP_WOODFALL
+ SOUTHERN_SWAMP_STR, // OWL_WARP_SOUTHERN_SWAMP
+ IKANA_CANYON_STR, // OWL_WARP_IKANA_CANYON
+ STONE_TOWER_STR, // OWL_WARP_STONE_TOWER
+ ENTRANCE_STR, // OWL_WARP_ENTRANCE
+};
+
+s16 sOwlWarpTextLengthENG[OWL_WARP_MAX] = {
+ sizeof(GREAT_BAY_COAST_STR) - 1, // OWL_WARP_GREAT_BAY_COAST
+ sizeof(ZORA_CAPE_STR) - 1, // OWL_WARP_ZORA_CAPE
+ sizeof(SNOWHEAD_STR) - 1, // OWL_WARP_SNOWHEAD
+ sizeof(MOUNTAIN_VILLAGE_STR) - 1, // OWL_WARP_MOUNTAIN_VILLAGE
+ sizeof(CLOCK_TOWN_STR) - 1, // OWL_WARP_CLOCK_TOWN
+ sizeof(MILK_ROAD_STR) - 1, // OWL_WARP_MILK_ROAD
+ sizeof(WOODFALL_STR) - 1, // OWL_WARP_WOODFALL
+ sizeof(SOUTHERN_SWAMP_STR) - 1, // OWL_WARP_SOUTHERN_SWAMP
+ sizeof(IKANA_CANYON_STR) - 1, // OWL_WARP_IKANA_CANYON
+ sizeof(STONE_TOWER_STR) - 1, // OWL_WARP_STONE_TOWER
+ sizeof(ENTRANCE_STR) - 1, // OWL_WARP_ENTRANCE
+};
+
void Message_LoadOwlWarpTextNES(PlayState* play, s32* offset, f32* arg2, s16* decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
s16 p = *decodedBufPos;
@@ -267,18 +286,18 @@ void Message_LoadOwlWarpTextNES(PlayState* play, s32* offset, f32* arg2, s16* de
} else {
owlWarpId = play->pauseCtx.cursorPoint[PAUSE_WORLD_MAP];
}
- stringLimit = D_801D07C4[owlWarpId];
+ stringLimit = sOwlWarpTextLengthENG[owlWarpId];
for (i = 0; i < stringLimit; i++) {
- msgCtx->decodedBuffer.schar[p] = D_801D0714[owlWarpId][i];
+ msgCtx->decodedBuffer.schar[p] = sOwlWarpTextENG[owlWarpId][i];
currentChar = msgCtx->decodedBuffer.schar[p];
if (currentChar != ' ') {
- Font_LoadCharNES(play, D_801D0714[owlWarpId][i], o);
+ Font_LoadCharNES(play, sOwlWarpTextENG[owlWarpId][i], o);
o += FONT_CHAR_TEX_SIZE;
}
currentChar = msgCtx->decodedBuffer.schar[p];
p++;
- f += (D_801D0470[currentChar - ' '] * msgCtx->textCharScale);
+ f += (sNESFontWidths[currentChar - ' '] * msgCtx->textCharScale);
}
p--;
@@ -288,8 +307,1585 @@ void Message_LoadOwlWarpTextNES(PlayState* play, s32* offset, f32* arg2, s16* de
*arg2 = f;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/func_80159438.s")
+void Message_GetTimerDigitsNES(OSTime time, s16* digits) {
+ OSTime t = time;
+
+ // 6 minutes
+ digits[0] = t / SECONDS_TO_TIMER(360);
+ t -= (digits[0] * SECONDS_TO_TIMER(360));
+
+ // minutes
+ digits[1] = t / SECONDS_TO_TIMER(60);
+ t -= (digits[1] * SECONDS_TO_TIMER(60));
+
+ digits[2] = '\'';
+
+ // 10 seconds
+ digits[3] = t / SECONDS_TO_TIMER(10);
+ t -= digits[3] * SECONDS_TO_TIMER(10);
+
+ // seconds
+ digits[4] = t / SECONDS_TO_TIMER(1);
+ t -= digits[4] * SECONDS_TO_TIMER(1);
+
+ digits[5] = '"';
+
+ // 100 milliseconds
+ digits[6] = t / SECONDS_TO_TIMER_PRECISE(0, 10);
+ t -= digits[6] * SECONDS_TO_TIMER_PRECISE(0, 10);
+
+ // 10 milliseconds
+ digits[7] = t;
+
+ digits[0] += '0';
+ digits[1] += '0';
+ digits[3] += '0';
+ digits[4] += '0';
+ digits[6] += '0';
+ digits[7] += '0';
+}
+
+Color_RGB16 D_801D07DC[] = {
+ { 255, 120, 0 }, { 70, 255, 80 }, { 80, 110, 255 }, { 255, 255, 30 },
+ { 90, 180, 255 }, { 210, 100, 255 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+
+Color_RGB16 D_801D080C[] = {
+ { 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+
+Color_RGB16 D_801D083C[] = {
+ { 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 180, 180, 200 }, { 255, 130, 30 },
+};
+
+Color_RGB16 D_801D086C[] = {
+ { 195, 0, 0 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+
+Color_RGB16 D_801D089C[] = {
+ { 255, 60, 60 }, { 110, 170, 255 }, { 80, 90, 255 }, { 255, 255, 50 },
+ { 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
+};
+
+u8 D_801D08CC[] = {
+ 0x02, 0x01, 0x03, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03, 0x01, 0x06,
+};
+
+void Message_DrawTextNES(PlayState* play, Gfx** gfxP, u16 textDrawPos) {
+ MessageContext* msgCtx = &play->msgCtx;
+ u16 i;
+ u16 j;
+ Font* font = &msgCtx->font;
+ u16 charTexIndex;
+ u16 stateTimerHi;
+ Gfx* gfx = *gfxP;
+ u16 character;
+ s16 sp130;
+ s16 sp12E;
+ s16 sp12C;
+ s16 sp12A;
+
+ msgCtx->textPosX = msgCtx->unk11F1A[0] + msgCtx->unk11FF8;
+ msgCtx->textPosY = msgCtx->unk11FFA;
+
+ sp130 = 0;
+ if (!msgCtx->textIsCredits) {
+ msgCtx->textPosY = msgCtx->unk11FFA;
+ } else {
+ msgCtx->textPosY = 48;
+ }
+
+ if (msgCtx->itemId != 0xFE) {
+ Message_DrawItemIcon(play, &gfx);
+ }
+
+ msgCtx->textColorR = msgCtx->unk120C8;
+ msgCtx->textColorG = msgCtx->unk120CA;
+ msgCtx->textColorB = msgCtx->unk120CC;
+
+ charTexIndex = 0;
+
+ for (i = textDrawPos; i < msgCtx->textDrawPos; i++) {
+ character = msgCtx->decodedBuffer.schar[i];
+
+ switch (character) {
+ case 0x0:
+ if (play->pauseCtx.bombersNotebookOpen || (msgCtx->textBoxType == TEXTBOX_TYPE_D)) {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0;
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_5) {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0;
+ } else {
+ msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 255;
+ }
+
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos++;
+ }
+ break;
+
+ case 0x1:
+ case 0x2:
+ case 0x3:
+ case 0x4:
+ case 0x5:
+ case 0x6:
+ case 0x7:
+ case 0x8:
+ if ((msgCtx->msgMode >= MSGMODE_NEW_CYCLE_0) && (msgCtx->msgMode <= MSGMODE_OWL_SAVE_2) &&
+ (character == 0x2)) {
+ msgCtx->textDrawPos = msgCtx->decodedTextLen;
+ if (msgCtx->unk120D6) {
+ msgCtx->unk120D4 += 25;
+ if (msgCtx->unk120D4 >= 100) {
+ msgCtx->unk120D6 = false;
+ }
+ } else {
+ msgCtx->unk120D4 -= 25;
+ if (msgCtx->unk120D4 <= -100) {
+ msgCtx->unk120D6 = true;
+ }
+ }
+
+ if (D_801D07DC[(s16)(character - 1)].r + msgCtx->unk120D4 < 0) {
+ msgCtx->textColorR = 0;
+ } else {
+ msgCtx->textColorR = D_801D07DC[(s16)(character - 1)].r + msgCtx->unk120D4;
+ }
+
+ if (D_801D07DC[(s16)(character - 1)].g + msgCtx->unk120D4 >= 255) {
+ msgCtx->textColorG = D_801D07DC[(s16)(character - 1)].g;
+ } else {
+ msgCtx->textColorG = D_801D07DC[(s16)(character - 1)].g + msgCtx->unk120D4;
+ }
+
+ if (D_801D07DC[(s16)(character - 1)].b + msgCtx->unk120D4 < 0) {
+ msgCtx->textColorB = 0;
+ } else {
+ msgCtx->textColorB = D_801D07DC[(s16)(character - 1)].b + msgCtx->unk120D4;
+ }
+
+ } else if (play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textColorR = D_801D089C[(s16)(character - 1)].r;
+ msgCtx->textColorG = D_801D089C[(s16)(character - 1)].g;
+ msgCtx->textColorB = D_801D089C[(s16)(character - 1)].b;
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_1) {
+ msgCtx->textColorR = D_801D07DC[(s16)(character - 1)].r;
+ msgCtx->textColorG = D_801D07DC[(s16)(character - 1)].g;
+ msgCtx->textColorB = D_801D07DC[(s16)(character - 1)].b;
+ } else if (msgCtx->textBoxType == TEXTBOX_TYPE_D) {
+ msgCtx->textColorR = D_801D086C[(s16)(character - 1)].r;
+ msgCtx->textColorG = D_801D086C[(s16)(character - 1)].g;
+ msgCtx->textColorB = D_801D086C[(s16)(character - 1)].b;
+ } else {
+ msgCtx->textColorR = D_801D080C[(s16)(character - 1)].r;
+ msgCtx->textColorG = D_801D080C[(s16)(character - 1)].g;
+ msgCtx->textColorB = D_801D080C[(s16)(character - 1)].b;
+ }
+
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos++;
+ }
+ break;
+
+ case 0x20: // ` `
+ msgCtx->textPosX += 6;
+ break;
+
+ case 0x11:
+ msgCtx->textPosY += msgCtx->unk11FFC;
+ // fallthrough
+ case 0x13:
+ sp130++;
+
+ msgCtx->textPosX = msgCtx->unk11F1A[sp130] + msgCtx->unk11FF8;
+ if (msgCtx->choiceNum == 1) {
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textPosX += 16;
+ } else {
+ msgCtx->textPosX += 50;
+ }
+ } else if (msgCtx->choiceNum == 2) {
+ if (msgCtx->unk120D8 != 3) {
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textPosX += 10;
+ } else {
+ msgCtx->textPosX += 57;
+ }
+ } else if (sp130 >= 2) {
+ if (!play->pauseCtx.bombersNotebookOpen) {
+ msgCtx->textPosX += 10;
+ } else {
+ msgCtx->textPosX += 57;
+ }
+ }
+ }
+ continue;
+
+ case 0x10:
+ case 0x12:
+ 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++;
+ }
+ msgCtx->unk120CE = msgCtx->textColorR;
+ msgCtx->unk120D0 = msgCtx->textColorG;
+ msgCtx->unk120D2 = msgCtx->textColorB;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x17: // MESSAGE_QUICKTEXT_ENABLE
+ if ((i + 1) == msgCtx->textDrawPos) {
+ j = i;
+ if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) ||
+ ((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26))) {
+ //! FAKE:
+ dummy:;
+ while (true) {
+ if ((msgCtx->decodedBuffer.schar[j] != 0x18) && (msgCtx->decodedBuffer.schar[j] != 0x1A) &&
+ (msgCtx->decodedBuffer.schar[j] != 0x19) && (msgCtx->decodedBuffer.schar[j] != 0xE0) &&
+ (msgCtx->decodedBuffer.schar[j] != 0x10) && (msgCtx->decodedBuffer.schar[j] != 0x12)) {
+ j++;
+ continue;
+ }
+ break;
+ }
+ i = j - 1;
+ msgCtx->textDrawPos = i + 1;
+ }
+ }
+ break;
+
+ case 0x18: // MESSAGE_QUICKTEXT_DISABLE
+ break;
+
+ case 0x1B: // MESSAGE_BOX_BREAK_DELAYED
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ stateTimerHi = msgCtx->decodedBuffer.schar[++i] << 8;
+ stateTimerHi |= msgCtx->decodedBuffer.schar[++i];
+ msgCtx->stateTimer = stateTimerHi;
+ msgCtx->msgMode = MSGMODE_TEXT_DELAYED_BREAK;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x1C:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ if (msgCtx->unk11F0C == 3) {
+ msgCtx->textboxEndType = 0x55;
+ } else {
+ msgCtx->textboxEndType = 0x50;
+ }
+ stateTimerHi = msgCtx->decodedBuffer.schar[++i] << 8;
+ stateTimerHi |= msgCtx->decodedBuffer.schar[++i];
+ msgCtx->stateTimer = stateTimerHi;
+ Font_LoadMessageBoxEndIcon(font, 1);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x1D:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = 0x52;
+ stateTimerHi = msgCtx->decodedBuffer.schar[++i] << 8;
+ stateTimerHi |= msgCtx->decodedBuffer.schar[++i];
+ msgCtx->stateTimer = stateTimerHi;
+ Font_LoadMessageBoxEndIcon(font, 1);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x1E: // MESSAGE_SFX
+ if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) {
+ stateTimerHi = msgCtx->decodedBuffer.schar[i + 1] << 8;
+ stateTimerHi |= msgCtx->decodedBuffer.schar[i + 2];
+ Audio_PlaySfx(stateTimerHi);
+ }
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos += 2;
+ }
+ i += 2;
+ break;
+
+ case 0x1F:
+ if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) {
+ msgCtx->msgMode = MSGMODE_9;
+ stateTimerHi = msgCtx->decodedBuffer.schar[i + 1] << 8;
+ stateTimerHi |= msgCtx->decodedBuffer.schar[i + 2];
+ msgCtx->textDelayTimer = stateTimerHi;
+ }
+ i += 2;
+ break;
+
+ case 0xA:
+ i++;
+ character = msgCtx->decodedBuffer.schar[i];
+ switch (character) {
+ case 0x0:
+ case 0x1:
+ case 0x2:
+ case 0x3:
+ case 0x4:
+ case 0x5:
+ case 0x6:
+ msgCtx->textDelay = character - 0x0;
+ if ((i + 1) == msgCtx->textDrawPos) {
+ msgCtx->textDrawPos++;
+ }
+ break;
+ }
+ break;
+
+ case 0xC1: // MESSAGE_BACKGROUND
+ msgCtx->textPosX = 0x2D;
+
+ 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 << 2, (msgCtx->unk12012 + 1) << 2,
+ (msgCtx->textPosX + 0x60) << 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 + 0x60) << 2, (msgCtx->unk12012 + 1) << 2,
+ (msgCtx->textPosX + 0xC1) << 2, (msgCtx->unk12012 + 0x31) << 2, G_TX_RENDERTILE, 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 += 32;
+ break;
+
+ case 0xC2:
+ msgCtx->textboxEndType = 0x10;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->choiceTextId = msgCtx->currentTextId;
+ msgCtx->stateTimer = 4;
+ Font_LoadMessageBoxEndIcon(font, 2);
+ if (msgCtx->unk120D8 != 3) {
+ msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 0xE);
+ msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x1A);
+ msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x26);
+ }
+ }
+ break;
+
+ case 0xC3:
+ msgCtx->textboxEndType = 0x11;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->choiceTextId = msgCtx->currentTextId;
+ msgCtx->stateTimer = 4;
+ Font_LoadMessageBoxEndIcon(font, 2);
+ if (msgCtx->unk120D8 != 3) {
+ msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 0xE);
+ msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x1A);
+ msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x26);
+ }
+ }
+ break;
+
+ case 0xCC:
+ msgCtx->textboxEndType = 0x60;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ }
+ break;
+
+ case 0xD0:
+ msgCtx->textboxEndType = 0x61;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ }
+ break;
+
+ case 0xD1:
+ msgCtx->textboxEndType = 0x62;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ }
+ break;
+
+ case 0xD2:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = 0x41;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ break;
+
+ case 0xD5:
+ msgCtx->textboxEndType = 0x63;
+
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ }
+ break;
+
+ case 0x15:
+ case 0xBF:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
+ Message_HandleOcarina(play);
+ *gfxP = gfx;
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/func_8015966C.s")
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ if (msgCtx->textboxEndType == 0) {
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ if (character == 0xBF) {
+ Font_LoadMessageBoxEndIcon(font, 1);
+ } else {
+ Font_LoadMessageBoxEndIcon(font, 0);
+ }
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ func_8011552C(play, DO_ACTION_RETURN);
+ }
+ } else {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+ }
+ *gfxP = gfx;
+ return;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/func_8015B198.s")
+ case 0x1A:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ Audio_PlaySfx(NA_SE_NONE);
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = 0x30;
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0x19:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = 0x40;
+ Font_LoadMessageBoxEndIcon(font, 0);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ *gfxP = gfx;
+ return;
+
+ case 0xE0:
+ if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
+ msgCtx->msgMode = MSGMODE_TEXT_DONE;
+ msgCtx->textboxEndType = 0x42;
+ Font_LoadMessageBoxEndIcon(font, 1);
+ Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
+ }
+ *gfxP = gfx;
+ return;
+
+ default:
+ switch (character) {
+ case 0x8169:
+ case 0x8175:
+ msgCtx->textPosX -= (s16)(6.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8145:
+ msgCtx->textPosX -= (s16)(3.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8148:
+ case 0x8149:
+ msgCtx->textPosX -= (s16)(2.0f * msgCtx->textCharScale);
+ break;
+
+ default:
+ break;
+ }
+ if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && ((i + 1) == msgCtx->textDrawPos)) {
+ Audio_PlaySfx(NA_SE_NONE);
+ }
+ if ((character >= 0xB0) && (character <= 0xBB)) {
+ sp12E = msgCtx->textColorR;
+ sp12C = msgCtx->textColorG;
+ sp12A = msgCtx->textColorB;
+ msgCtx->textColorR = D_801D083C[(s16)D_801D08CC[character - 0xB0]].r;
+ msgCtx->textColorG = D_801D083C[(s16)D_801D08CC[character - 0xB0]].g;
+ msgCtx->textColorB = D_801D083C[(s16)D_801D08CC[character - 0xB0]].b;
+ Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
+ msgCtx->textColorR = sp12E;
+ msgCtx->textColorG = sp12C;
+ msgCtx->textColorB = sp12A;
+ } else if (msgCtx->msgMode >= MSGMODE_OWL_SAVE_0) {
+ if ((i < (msgCtx->decodedTextLen - 6)) || (i >= (msgCtx->decodedTextLen - 4))) {
+ Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
+ }
+ } else {
+ Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
+ }
+ charTexIndex += FONT_CHAR_TEX_SIZE;
+
+ //! @TODO: u8 character but > 0x255 cases
+ switch (character) {
+ case 0x8144:
+ msgCtx->textPosX += (s16)(8.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x816A:
+ case 0x8176:
+ msgCtx->textPosX += (s16)(10.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8141:
+ case 0x8142:
+ case 0x8168:
+ msgCtx->textPosX += (s16)(12.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8194:
+ msgCtx->textPosX += (s16)(14.0f * msgCtx->textCharScale);
+ break;
+
+ case 0x8145:
+ msgCtx->textPosX += (s16)(15.0f * msgCtx->textCharScale);
+ break;
+
+ default:
+ if (((msgCtx->textboxEndType == 0x62) && (i >= msgCtx->unk120C0) &&
+ ((msgCtx->unk120C0 + 4) >= i)) ||
+ ((msgCtx->textboxEndType == 0x63) && (i >= msgCtx->unk120C0) &&
+ ((msgCtx->unk120C0 + 2) >= i)) ||
+ ((msgCtx->textboxEndType == 0x60) && (i >= msgCtx->unk120C0) &&
+ ((msgCtx->unk120C0 + 2) >= i)) ||
+ ((msgCtx->textboxEndType == 0x61) && (i >= msgCtx->unk120C0) &&
+ ((msgCtx->unk120C0 + 1) >= i))) {
+ msgCtx->textPosX += (s32)(16.0f * msgCtx->textCharScale);
+ } else {
+ msgCtx->textPosX += (s32)(sNESFontWidths[character - ' '] * msgCtx->textCharScale);
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ if (msgCtx->textDelayTimer == 0) {
+ msgCtx->textDrawPos = i + 1;
+ msgCtx->textDelayTimer = 0;
+ if (msgCtx->msgMode == MSGMODE_9) {
+ msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
+ }
+ } else {
+ msgCtx->textDelayTimer--;
+ }
+
+ *gfxP = gfx;
+}
+
+char D_801D08D8[][4] = {
+ "Fast",
+ "----",
+ "Slow",
+};
+
+u8 D_801D08E4[] = {
+ 0x01,
+ 0x03,
+ 0x04,
+ 0x02,
+};
+
+#define RED_STR "RED"
+#define BLUE_STR "BLUE"
+#define YELLOW_STR "YELLOW"
+#define GREEN_STR "GREEN"
+
+char sMaskCodeTextENG[][6] = {
+ RED_STR,
+ BLUE_STR,
+ YELLOW_STR,
+ GREEN_STR,
+};
+
+u8 sMaskCodeTextLengthENG[] = {
+ sizeof(RED_STR) - 1,
+ sizeof(BLUE_STR) - 1,
+ sizeof(YELLOW_STR) - 1,
+ sizeof(GREEN_STR) - 1,
+};
+
+#ifdef NON_MATCHING
+// https://decomp.me/scratch/w2ckG
+void Message_DecodeNES(PlayState* play) {
+ f32 var_fs0;
+ MessageContext* msgCtx = &play->msgCtx;
+ u8* ptr;
+ Font* font = &msgCtx->font; // spE0
+ Player* player; // spDC
+ s16 decodedBufPos; // spDA
+ s16 value;
+ u32 timeToMoonCrash;
+ s16 i; // s1
+ s16 spD0; // numLines
+ s16 digits[4]; // spC8/CA/CC/CE
+ s16 spC6;
+ f32 timeInSeconds;
+ s32 charTexIdx; // spBC
+ s16 loadChar;
+ s16 spA8[8];
+ f32 spA4;
+ s16 playerNameLen; // s0
+ s16 var_v1_3;
+ u8 curChar; // sp78
+ s8 charOffset;
+ s16 temp_s2_2;
+ s16 var_s2_9;
+
+ player = GET_PLAYER(play);
+ decodedBufPos = 0;
+ spC6 = 0;
+ charTexIdx = 0;
+ spD0 = 0;
+ msgCtx->textDelayTimer = 0;
+ msgCtx->textDelay = msgCtx->textDelayTimer;
+ msgCtx->textFade = 0;
+ spA4 = 0.0f;
+ font->unk_11D88 = (font->unk_11D88 ^ 1) & 1;
+ Message_SetupLoadItemIcon(play);
+
+ while (true) {
+ curChar = font->msgBuf.schar[msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos];
+
+ if ((curChar == 0x10) || (curChar == 0x12) || (curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D) ||
+ (curChar == 0x19) || (curChar == 0xE0) || (curChar == 0xBF) || (curChar == 0x15) || (curChar == 0x1A)) {
+ msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
+ msgCtx->textDrawPos = 1;
+ if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
+ msgCtx->unk11FFA = msgCtx->textboxY + 2;
+ } else {
+ msgCtx->unk11FFA = msgCtx->textboxY + 8;
+ }
+ msgCtx->unk11F1A[spC6] = 0;
+ if (msgCtx->unk11F18 != 0) {
+ msgCtx->unk11F1A[spC6] = (s16)((msgCtx->textCharScale * 16.0f * 16.0f) - spA4) / 2;
+ }
+ spA4 = 0.0f;
+ if (curChar == 0x12) {
+ if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) {
+ if (spD0 < 2) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(10);
+ } else if (spD0 == 2) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(11);
+ } else if (spD0 == 3) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(12);
+ }
+ }
+ } else {
+ if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) {
+ if (spD0 == 0) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(10);
+ } else if (spD0 == 1) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(11);
+ } else if (spD0 == 2) {
+ msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(12);
+ }
+ }
+ }
+
+ //! FAKE: Perhaps a locally required temp for scoping
+ dummy:;
+ if ((curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D)) {
+ //! FAKE: & 0xFFFF to fix regalloc
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1] & 0xFFFF;
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 2];
+ msgCtx->msgBufPos += 3;
+ }
+ msgCtx->decodedTextLen = decodedBufPos;
+ msgCtx->unk120D8 = spD0;
+ if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) {
+ msgCtx->textDrawPos = msgCtx->decodedTextLen;
+ }
+ msgCtx->unk120C8 = msgCtx->unk120CE;
+ msgCtx->unk120CA = msgCtx->unk120D0;
+ msgCtx->unk120CC = msgCtx->unk120D2;
+ break;
+ } else if (curChar == 0x16) {
+ // 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 == 0x3E) {
+ curChar = ' ';
+ } else if (curChar == 0x40) {
+ curChar = '.';
+ } else if (curChar == 0x3F) {
+ curChar = '-';
+ } else if (curChar < 0xA) {
+ charOffset = curChar;
+ curChar = '0' + charOffset;
+ } else if (curChar < 0x24) {
+ charOffset = curChar;
+ curChar = 'A' - 10 + charOffset;
+ } else if (curChar < 0x3E) {
+ 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 == 0xC1) {
+ //! TODO: + 0x900 on the first one?
+ DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900);
+ DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900,
+ (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
+ spD0 = 2;
+ spC6 = 2;
+ msgCtx->unk12012 = msgCtx->textboxY + 8;
+ msgCtx->unk11F18 = 1;
+ msgCtx->unk12010 = XREG(47);
+ } else if (curChar == 0xC2) {
+ msgCtx->unk11F18 = 0;
+ msgCtx->choiceNum = 2;
+ } else if (curChar == 0xC3) {
+ msgCtx->unk11F18 = 0;
+ msgCtx->choiceNum = 3;
+ msgCtx->unk11FF8 = msgCtx->unk11FF8 + 0x16;
+ } else if (curChar == 0xC4) {
+ Message_GetTimerDigitsNES(((void)0, gSaveContext.timerCurTimes[curChar - 0xC4]), spA8);
+
+ loadChar = false;
+ for (i = 0; i < 5; i++) {
+ if ((i == 1) || (spA8[i + 3] != '0')) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, spA8[i + 3], &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0xC5) || (curChar == 0xC6) || (curChar == 0xC7) || (curChar == 0xC8) ||
+ (curChar == 0xC9)) {
+ Message_GetTimerDigitsNES(((void)0, gSaveContext.timerCurTimes[curChar - 0xC4]), spA8);
+
+ loadChar = false;
+ for (i = 0; i < 8; i++) {
+ if ((i == 4) || ((i != 2) && (i != 5) && (spA8[i] != '0'))) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, spA8[i], &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xCA) {
+ 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] = 0x22;
+ decodedBufPos++;
+ } else if (i == 3) {
+ Font_LoadCharNES(play, 0x27, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = 0x27;
+ }
+ }
+ spA4 += 6 * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0xCB) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = Flags_GetAllTreasure(play);
+
+ 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);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xCC) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spC6;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 2;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+ digits[0] = digits[1] = digits[2] = 0;
+
+ for (i = 0; i < 3; i++) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ Message_LoadLocalizedRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4);
+ } else if (curChar == 0xCD) {
+ digits[0] = digits[1] = 0;
+ digits[2] = msgCtx->bankRupeesSelected;
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ Message_LoadRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4, msgCtx->bankRupeesSelected);
+ } else if (curChar == 0xCE) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = msgCtx->bankRupees;
+
+ 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) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ Message_LoadRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4, msgCtx->bankRupees);
+ } else if (curChar == 0xCF) {
+ Message_LoadTimeNES(play, curChar, &charTexIdx, &spA4, &decodedBufPos);
+ } else if (curChar == 0xC) {
+ digits[0] = digits[1] = 0;
+ digits[2] = gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex];
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+
+ if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 1) ||
+ (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 21)) {
+ Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos);
+ } else if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 2) ||
+ (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 22)) {
+ Message_LoadCharNES(play, 'n', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos);
+ } else if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 3) ||
+ (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 23)) {
+ Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos);
+ } else {
+ Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos);
+ }
+ } else if (curChar == 0xD) {
+ digits[0] = digits[1] = 0;
+ digits[2] = Inventory_GetSkullTokenCount(play->sceneId);
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+
+ if ((Inventory_GetSkullTokenCount(play->sceneId) == 1) ||
+ (Inventory_GetSkullTokenCount(play->sceneId) == 21)) {
+ Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos);
+ } else if ((Inventory_GetSkullTokenCount(play->sceneId) == 2) ||
+ (Inventory_GetSkullTokenCount(play->sceneId) == 22)) {
+ Message_LoadCharNES(play, 'n', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos);
+ } else if ((Inventory_GetSkullTokenCount(play->sceneId) == 3) ||
+ (Inventory_GetSkullTokenCount(play->sceneId) == 23)) {
+ Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos);
+ } else {
+ Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos);
+ }
+ } else if (curChar == 0xE) {
+ 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)) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+
+ decodedBufPos--;
+ } else if (curChar == 0xF) {
+ 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) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xD0) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spC6;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 0;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+ digits[0] = digits[1] = digits[2] = 0;
+ for (i = 0; i < 2; i++) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4);
+ } else if (curChar == 0xD1) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spC6;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 0;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+
+ for (i = 0; i < 5; i++) {
+ msgCtx->unk12054[i] = 1;
+ Message_LoadCharNES(play, '1', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xD3) {
+ if (gSaveContext.save.timeSpeedOffset == 18) {
+ var_s2_9 = 0;
+ } else if (gSaveContext.save.timeSpeedOffset == 0) {
+ var_s2_9 = 1;
+ } else {
+ var_s2_9 = 2;
+ }
+
+ for (i = 0; i < 4; i++) {
+ msgCtx->decodedBuffer.schar[decodedBufPos] = D_801D08D8[var_s2_9][i];
+ Font_LoadCharNES(play, D_801D08D8[var_s2_9][i], charTexIdx);
+ decodedBufPos++;
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ decodedBufPos--;
+ spA4 += 3.0f * (16.0f * msgCtx->textCharScale);
+ msgCtx->choiceIndex = var_s2_9;
+ } else if (curChar == 0xD4) {
+ Message_LoadOwlWarpTextNES(play, &charTexIdx, &spA4, &decodedBufPos);
+ } else if (curChar == 0xD5) {
+ decodedBufPos++;
+ msgCtx->unk120BE = spC6;
+ msgCtx->unk120C0 = decodedBufPos;
+ msgCtx->unk120C2 = 0;
+ msgCtx->bankRupeesSelected = 0;
+ msgCtx->unk120C4 = charTexIdx;
+
+ for (i = 0; i < 3; i++) {
+ msgCtx->unk12054[i] = 1;
+ Font_LoadCharNES(play, '1', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = '1';
+ spA4 += 16.0f * msgCtx->textCharScale;
+ decodedBufPos++;
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xD6) {
+ for (i = 0; i < 6; i++) {
+ msgCtx->decodedBuffer.schar[decodedBufPos] =
+ (s8)D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])];
+ decodedBufPos++;
+ Message_LoadCharNES(play, i + '1', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ msgCtx->decodedBuffer.schar[decodedBufPos] = 0;
+ } else if ((curChar >= 0xD7) && (curChar < 0xDB)) {
+ digits[0] = digits[1] = 0;
+ digits[2] = 15 - gSaveContext.save.saveInfo.inventory.strayFairies[curChar - 0xD7];
+
+ while (digits[2] >= 100) {
+ digits[0]++;
+ digits[2] -= 100;
+ }
+ while (digits[2] >= 10) {
+ digits[1]++;
+ digits[2] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 3; i++) {
+ if ((i == 2) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ } else if (curChar == 0xDB) {
+ 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);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0xDC) || (curChar == 0xDD)) {
+ if (curChar == 0xDC) {
+ digits[0] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][0];
+ digits[1] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][1];
+ digits[2] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][2];
+ } else {
+ digits[0] = (HS_GET_LOTTERY_CODE_GUESS() & 0xF00) >> 8;
+ digits[1] = (HS_GET_LOTTERY_CODE_GUESS() & 0xF0) >> 4;
+ digits[2] = HS_GET_LOTTERY_CODE_GUESS() & 0xF;
+ }
+
+ for (i = 0; i < 3; i++) {
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ decodedBufPos--;
+ } else if (curChar == 0xDE) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = gItemPrices[GET_CUR_FORM_BTN_ITEM(player->heldItemButton)];
+
+ 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);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4);
+ } else if (curChar == 0xDF) {
+ for (i = 0; i < 5; i++) {
+ digits[i] = gSaveContext.save.saveInfo.bomberCode[i];
+ Font_LoadCharNES(play, digits[i] + '0', charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ decodedBufPos--;
+ } else if ((curChar >= 0xE1) && (curChar < 0xE7)) {
+ msgCtx->decodedBuffer.schar[decodedBufPos] =
+ D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])];
+ temp_s2_2 = sMaskCodeTextLengthENG[(
+ (void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])];
+ decodedBufPos++;
+
+ for (i = 0; i < temp_s2_2; i++) {
+ Message_LoadCharNES(
+ play,
+ sMaskCodeTextENG[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])]
+ [i],
+ &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+
+ msgCtx->decodedBuffer.schar[decodedBufPos] = 0;
+ } else if (curChar == 0xE7) {
+ timeToMoonCrash = TIME_UNTIL_MOON_CRASH;
+ digits[0] = 0;
+ digits[1] = TIME_TO_HOURS_F_ALT(timeToMoonCrash);
+
+ while (digits[1] >= 10) {
+ digits[0]++;
+ digits[1] -= 10;
+ }
+
+ loadChar = false;
+ for (i = 0; i < 2; i++) {
+ if ((i == 1) || (digits[i] != 0)) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ }
+ }
+ msgCtx->decodedBuffer.schar[decodedBufPos] = ' ';
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'o', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'u', &charTexIdx, &spA4, decodedBufPos);
+ decodedBufPos++;
+ Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos);
+ if ((digits[0] != 0) || (digits[1] != 1)) {
+ decodedBufPos++;
+ Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos);
+ }
+ } else if (curChar == 0xE8) {
+ Message_LoadTimeNES(play, curChar, &charTexIdx, &spA4, &decodedBufPos);
+
+ } else if ((curChar == 0xF0) || (curChar == 0xF1) || (curChar == 0xF2) || (curChar == 0xF8)) {
+ if (curChar == 0xF8) {
+ value = (s32)HS_GET_HIGH_SCORE_3_LOWER();
+ } else {
+ value = HIGH_SCORE(curChar - 0xF0);
+ }
+ if (curChar == 0xF2) {
+ if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
+ value &= 0x7F;
+ } else {
+ value = (s16)((HIGH_SCORE((u8)font->msgBuf.schar[msgCtx->msgBufPos]) & 0xFF000000) >> 0x18) & 0x7F;
+ }
+ }
+ digits[3] = value;
+ digits[0] = digits[1] = digits[2] = 0;
+
+ 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);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0xF7) || (curChar == 0xF9) || (curChar == 0xFA) || (curChar == 0xFB) ||
+ (curChar == 0xFC)) {
+ var_fs0 = 8.0f;
+ if (curChar == 0xF7) {
+ Message_GetTimerDigitsNES(GET_HIGH_SCORE(HS_UNK_1), spA8);
+ } else if (curChar == 0xF9) {
+ Message_GetTimerDigitsNES(GET_HIGH_SCORE(HS_HORSE_BACK_BALLOON), spA8);
+ } else {
+ Message_GetTimerDigitsNES(
+ ((void)0, gSaveContext.save.saveInfo.dekuPlaygroundHighScores[curChar - 0xFA]), spA8);
+ }
+
+ loadChar = false;
+ for (i = 0; i < 8; i++) {
+ if ((i == 4) || ((i != 2) && (i != 5) && (spA8[i] != '\0'))) {
+ loadChar = true;
+ }
+ if (loadChar) {
+ Font_LoadCharNES(play, spA8[i], charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = spA8[i];
+ decodedBufPos++;
+ } else {
+ var_fs0 -= 1.0f;
+ }
+ }
+ spA4 += var_fs0 * (16.0f * msgCtx->textCharScale);
+ decodedBufPos--;
+ } else if ((curChar == 0xF3) || (curChar == 0xF4) || (curChar == 0xF5)) {
+ value = HIGH_SCORE(curChar - 0xF3 + HS_BOAT_ARCHERY);
+ 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, 0x27, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = 0x27;
+ }
+ }
+ spA4 += 4.0f * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0xF6) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = HS_GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE();
+
+ 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);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if ((curChar == 0xFD) || (curChar == 0xFE) || (curChar == 0xFF)) {
+ for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) {
+ if (gSaveContext.save.saveInfo.inventory
+ .dekuPlaygroundPlayerName[(s16)(curChar - 0xFD)][playerNameLen - 1] != 0x3E) {
+ break;
+ }
+ }
+
+ for (i = 0; i < playerNameLen; i++) {
+ ptr = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.inventory
+ .dekuPlaygroundPlayerName[(s16)(curChar - 0xFD)][i]) *
+ FONT_CHAR_TEX_SIZE];
+ msgCtx->decodedBuffer.schar[decodedBufPos + i] = 0xFD;
+
+ for (var_v1_3 = 0; var_v1_3 < FONT_CHAR_TEX_SIZE; var_v1_3 += 4) {
+ font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 0] = ptr[var_v1_3 + 0];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 1] = ptr[var_v1_3 + 1];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 2] = ptr[var_v1_3 + 2];
+ font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 3] = ptr[var_v1_3 + 3];
+ }
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ }
+ decodedBufPos += playerNameLen - 1;
+ spA4 += playerNameLen * (16.0f * msgCtx->textCharScale);
+ } else if (curChar == 0xB) {
+ digits[0] = digits[1] = digits[2] = 0;
+ digits[3] = HS_GET_BOAT_ARCHERY_HIGH_SCORE();
+
+ 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);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
+ decodedBufPos++;
+ spA4 += 16.0f * msgCtx->textCharScale;
+ }
+ }
+ decodedBufPos--;
+ } else if (curChar == 0x14) {
+ decodedBufPos--;
+ for (i = 0; i < font->msgBuf.schar[msgCtx->msgBufPos + 1]; i++) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = ' ';
+ spA4 += 6.0f;
+ }
+ msgCtx->msgBufPos++;
+ } else if ((curChar == 0x13) || (curChar == 0x11)) {
+ msgCtx->unk11F1A[spC6] = 0;
+ if (msgCtx->unk11F18 != 0) {
+ msgCtx->unk11F1A[spC6] = ((msgCtx->textCharScale * 16.0f * 16.0f) - spA4) * 0.5f;
+ }
+ spC6++;
+ spA4 = 0.0f;
+ if (curChar == 0x11) {
+ spD0++;
+ }
+ } else if ((curChar == 0x17) || (curChar == 0x18) || (curChar == 0x1A)) {
+ // pass
+ } else if (curChar == 0xA) {
+ decodedBufPos++;
+ } else if (curChar == 0x1C) {
+ msgCtx->textFade = true;
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if (curChar == 0x1E) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) ||
+ (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) {
+ Audio_PlaySfx((msgCtx->decodedBuffer.schar[decodedBufPos - 1] << 8) |
+ msgCtx->decodedBuffer.schar[decodedBufPos]);
+ }
+ } else if (curChar == 0x1F) {
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ } else if ((curChar != 0x20) && (curChar >= 9)) {
+ Font_LoadCharNES(play, curChar, charTexIdx);
+ charTexIdx += FONT_CHAR_TEX_SIZE;
+ spA4 += sNESFontWidths[curChar - ' '] * msgCtx->textCharScale;
+ } else if (curChar == 0x20) {
+ spA4 += 6.0f;
+ }
+ decodedBufPos++;
+ msgCtx->msgBufPos++;
+ }
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/Message_DecodeNES.s")
+#endif