mm/src/code/z_message_nes.c

1877 lines
73 KiB
C

#include "global.h"
#include "message_data_static.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
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,
};
void Message_FindMessageNES(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
Font* font = &msgCtx->font;
MessageTableEntry* msgEntry = msgCtx->messageEntryTableNes;
const char* segment = msgEntry->segment;
const char* foundSegment;
const char* nextSegment;
while (msgEntry->textId != 0xFFFF) {
if (msgEntry->textId == textId) {
foundSegment = msgEntry->segment;
msgEntry++;
nextSegment = msgEntry->segment;
font->messageStart = foundSegment - segment;
font->messageEnd = nextSegment - foundSegment;
return;
}
msgEntry++;
}
msgEntry = msgCtx->messageEntryTableNes;
foundSegment = msgEntry->segment;
msgEntry++;
nextSegment = msgEntry->segment;
font->messageStart = foundSegment - segment;
font->messageEnd = nextSegment - foundSegment;
}
void Message_LoadCharNES(PlayState* play, u8 codePointIndex, s32* offset, f32* arg3, s16 decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
s32 temp1 = *offset;
f32 temp2 = *arg3;
Font_LoadCharNES(play, codePointIndex, temp1);
msgCtx->decodedBuffer.schar[decodedBufPos] = codePointIndex;
temp1 += FONT_CHAR_TEX_SIZE;
temp2 += (16.0f * msgCtx->textCharScale);
*offset = temp1;
*arg3 = temp2;
}
void Message_LoadPluralRupeesNES(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) {
MessageContext* msgCtx = &play->msgCtx;
s16 p = *decodedBufPos;
s32 o = *offset;
f32 f = *arg3;
msgCtx->decodedBuffer.schar[p] = ' ';
p++;
Font_LoadCharNES(play, 'R', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 'R';
p++;
Font_LoadCharNES(play, 'u', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 'u';
p++;
Font_LoadCharNES(play, 'p', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 'p';
p++;
Font_LoadCharNES(play, 'e', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 'e';
p++;
Font_LoadCharNES(play, 'e', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 'e';
p++;
Font_LoadCharNES(play, 's', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 's';
f += 16.0f * msgCtx->textCharScale * 6.0f;
*decodedBufPos = p;
*offset = o;
*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;
s32 o = *offset;
f32 f = *arg3;
u8 j;
msgCtx->decodedBuffer.schar[p] = ' ';
p++;
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 * (sRupeesTextLength[gSaveContext.options.language - 1] + 1);
*decodedBufPos = p;
*offset = o;
*arg3 = f;
}
void Message_LoadRupeesNES(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3, s16 singular) {
MessageContext* msgCtx = &play->msgCtx;
s16 p = *decodedBufPos;
s32 o = *offset;
f32 f = *arg3;
msgCtx->decodedBuffer.schar[p] = ' ';
p++;
Font_LoadCharNES(play, 'R', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 'R';
p++;
Font_LoadCharNES(play, 'u', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 'u';
p++;
Font_LoadCharNES(play, 'p', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 'p';
p++;
Font_LoadCharNES(play, 'e', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 'e';
p++;
Font_LoadCharNES(play, 'e', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 'e';
if (singular != 1) {
p++;
Font_LoadCharNES(play, 's', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = 's';
f += 16.0f * msgCtx->textCharScale * 6.0f;
} else {
f += 16.0f * msgCtx->textCharScale * 5.0f;
}
*decodedBufPos = p;
*offset = o;
*arg3 = f;
}
void Message_LoadTimeNES(PlayState* play, u8 curChar, s32* offset, f32* arg3, s16* decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
s16 p = *decodedBufPos;
s32 o = *offset;
f32 f = *arg3;
u32 timeLeft;
s16 digits[4];
f32 timeLeftInMinutes;
s16 i;
if (curChar == 0xCF) {
timeLeft = TIME_UNTIL_MOON_CRASH;
} else {
timeLeft = TIME_UNTIL_NEW_DAY;
}
timeLeftInMinutes = TIME_TO_MINUTES_F(timeLeft);
digits[0] = 0;
digits[1] = (timeLeftInMinutes / 60.0f);
while (digits[1] >= 10) {
digits[0]++;
digits[1] -= 10;
}
digits[2] = 0;
digits[3] = (s32)timeLeftInMinutes % 60;
while (digits[3] >= 10) {
digits[2]++;
digits[3] -= 10;
}
for (i = 0; i < 4; i++) {
Font_LoadCharNES(play, digits[i] + '0', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = digits[i] + '0';
p++;
if (i == 1) {
Font_LoadCharNES(play, ':', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[p] = ':';
p++;
}
}
f += 5.0f * (16.0f * msgCtx->textCharScale);
*decodedBufPos = p - 1;
*offset = o;
*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;
s32 o = *offset;
f32 f = *arg2;
s16 i;
u8 currentChar;
s16 owlWarpId;
s16 stringLimit;
if (func_8010A0A4(play) || (play->sceneId == SCENE_SECOM)) {
owlWarpId = OWL_WARP_ENTRANCE;
} else {
owlWarpId = play->pauseCtx.cursorPoint[PAUSE_WORLD_MAP];
}
stringLimit = sOwlWarpTextLengthENG[owlWarpId];
for (i = 0; i < stringLimit; i++) {
msgCtx->decodedBuffer.schar[p] = sOwlWarpTextENG[owlWarpId][i];
currentChar = msgCtx->decodedBuffer.schar[p];
if (currentChar != ' ') {
Font_LoadCharNES(play, sOwlWarpTextENG[owlWarpId][i], o);
o += FONT_CHAR_TEX_SIZE;
}
currentChar = msgCtx->decodedBuffer.schar[p];
p++;
f += (sNESFontWidths[currentChar - ' '] * msgCtx->textCharScale);
}
p--;
f += (stringLimit - 1) * (16.0f * msgCtx->textCharScale);
*decodedBufPos = p;
*offset = o;
*arg2 = f;
}
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) {
if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) ||
((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26))) {
j = i;
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;
}
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;
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,
};
void Message_DecodeNES(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Font* font = &msgCtx->font;
Player* player = GET_PLAYER(play);
s16 decodedBufPos = 0;
s16 value;
u32 timeToMoonCrash;
s16 i;
s16 numLines;
s16 digits[4];
s16 spC6 = 0;
u16 sfxHi;
f32 var_fs0;
s32 charTexIndex = 0;
s16 loadChar;
s16 index;
s16 spA8[8];
f32 spA4;
u8* fontBuf;
s16 playerNameLen;
s16 var_v1_3;
u8 curChar;
numLines = 0;
msgCtx->textDelayTimer = 0;
msgCtx->textDelay = msgCtx->textDelayTimer;
msgCtx->textFade = false;
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 (numLines < 2) {
msgCtx->unk11FFA = msgCtx->textboxY + XREG(10);
} else if (numLines == 2) {
msgCtx->unk11FFA = msgCtx->textboxY + XREG(11);
} else if (numLines == 3) {
msgCtx->unk11FFA = msgCtx->textboxY + XREG(12);
}
}
} else {
if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) {
if (numLines == 0) {
msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(10);
} else if (numLines == 1) {
msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(11);
} else if (numLines == 2) {
msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(12);
}
}
}
{
s8 requiredScopeTemp;
if ((curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D)) {
//! FAKE: & 0xFFFF to fix regalloc
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[(msgCtx->msgBufPos & 0xFFFF) + 1];
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 2];
msgCtx->msgBufPos += 3;
}
}
msgCtx->decodedTextLen = decodedBufPos;
msgCtx->unk120D8 = numLines;
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) {
curChar += 0;
curChar = '0' + curChar;
} else if (curChar < 0x24) {
curChar += 0;
curChar = 'A' - 10 + curChar;
} else if (curChar < 0x3E) {
curChar += 0;
curChar = 'a' - 36 + curChar;
}
if (curChar != ' ') {
Font_LoadCharNES(play, curChar, charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
}
msgCtx->decodedBuffer.schar[decodedBufPos] = curChar;
decodedBufPos++;
}
decodedBufPos--;
} else if (curChar == 0xC1) {
DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900);
DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900,
0x900);
numLines = 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], &charTexIndex, &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], &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
}
}
decodedBufPos--;
} else if (curChar == 0xCA) {
digits[0] = 0;
digits[1] = TIME_TO_MINUTES_F(CURRENT_TIME) / 60.0f;
while (digits[1] >= 10) {
digits[0]++;
digits[1] -= 10;
}
digits[2] = 0;
digits[3] = (s32)TIME_TO_MINUTES_F(CURRENT_TIME) % 60;
while (digits[3] >= 10) {
digits[2]++;
digits[3] -= 10;
}
for (i = 0; i < 4; i++) {
Font_LoadCharNES(play, digits[i] + '0', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
decodedBufPos++;
if (i == 1) {
Font_LoadCharNES(play, '"', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[decodedBufPos] = 0x22;
decodedBufPos++;
} else if (i == 3) {
Font_LoadCharNES(play, 0x27, charTexIndex);
charTexIndex += 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', charTexIndex);
charTexIndex += 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 = charTexIndex;
digits[0] = digits[1] = digits[2] = 0;
for (i = 0; i < 3; i++) {
Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
}
Message_LoadLocalizedRupeesNES(play, &decodedBufPos, &charTexIndex, &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', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
}
}
Message_LoadRupeesNES(play, &decodedBufPos, &charTexIndex, &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', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
}
}
Message_LoadRupeesNES(play, &decodedBufPos, &charTexIndex, &spA4, msgCtx->bankRupees);
} else if (curChar == 0xCF) {
Message_LoadTimeNES(play, curChar, &charTexIndex, &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', &charTexIndex, &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', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 't', &charTexIndex, &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', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 'd', &charTexIndex, &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', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 'd', &charTexIndex, &spA4, decodedBufPos);
} else {
Message_LoadCharNES(play, 't', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 'h', &charTexIndex, &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', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
}
}
if ((Inventory_GetSkullTokenCount(play->sceneId) == 1) ||
(Inventory_GetSkullTokenCount(play->sceneId) == 21)) {
Message_LoadCharNES(play, 's', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 't', &charTexIndex, &spA4, decodedBufPos);
} else if ((Inventory_GetSkullTokenCount(play->sceneId) == 2) ||
(Inventory_GetSkullTokenCount(play->sceneId) == 22)) {
Message_LoadCharNES(play, 'n', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 'd', &charTexIndex, &spA4, decodedBufPos);
} else if ((Inventory_GetSkullTokenCount(play->sceneId) == 3) ||
(Inventory_GetSkullTokenCount(play->sceneId) == 23)) {
Message_LoadCharNES(play, 'r', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 'd', &charTexIndex, &spA4, decodedBufPos);
} else {
Message_LoadCharNES(play, 't', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 'h', &charTexIndex, &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', &charTexIndex, &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', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
}
}
decodedBufPos--;
} else if (curChar == 0xD0) {
decodedBufPos++;
msgCtx->unk120BE = spC6;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 0;
msgCtx->bankRupeesSelected = 0;
msgCtx->unk120C4 = charTexIndex;
digits[0] = digits[1] = digits[2] = 0;
for (i = 0; i < 2; i++) {
Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
}
Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIndex, &spA4);
} else if (curChar == 0xD1) {
decodedBufPos++;
msgCtx->unk120BE = spC6;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 0;
msgCtx->bankRupeesSelected = 0;
msgCtx->unk120C4 = charTexIndex;
for (i = 0; i < 5; i++) {
msgCtx->unk12054[i] = 1;
Message_LoadCharNES(play, '1', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
}
decodedBufPos--;
} else if (curChar == 0xD3) {
if (((void)0, gSaveContext.save.timeSpeedOffset) == 18) {
index = 0;
} else if (((void)0, gSaveContext.save.timeSpeedOffset) == 0) {
index = 1;
} else {
index = 2;
}
for (i = 0; i < 4; i++, decodedBufPos++) {
msgCtx->decodedBuffer.schar[decodedBufPos] = D_801D08D8[index][i];
Font_LoadCharNES(play, D_801D08D8[index][i], charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
}
decodedBufPos--;
spA4 += 3.0f * (16.0f * msgCtx->textCharScale);
msgCtx->choiceIndex = index;
} else if (curChar == 0xD4) {
Message_LoadOwlWarpTextNES(play, &charTexIndex, &spA4, &decodedBufPos);
} else if (curChar == 0xD5) {
decodedBufPos++;
msgCtx->unk120BE = spC6;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 0;
msgCtx->bankRupeesSelected = 0;
msgCtx->unk120C4 = charTexIndex;
for (i = 0; i < 3; i++) {
msgCtx->unk12054[i] = 1;
Font_LoadCharNES(play, '1', charTexIndex);
charTexIndex += 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] =
D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])];
decodedBufPos++;
Message_LoadCharNES(play, i + '1', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
}
msgCtx->decodedBuffer.schar[decodedBufPos] = 0;
} else if ((curChar >= 0xD7) && (curChar < 0xDB)) {
digits[0] = digits[1] = 0;
digits[2] = STRAY_FAIRY_SCATTERED_TOTAL - 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', charTexIndex);
charTexIndex += 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', charTexIndex);
charTexIndex += 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', charTexIndex);
charTexIndex += 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', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
decodedBufPos++;
spA4 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIndex, &spA4);
} else if (curChar == 0xDF) {
for (i = 0; i < 5; i++) {
digits[i] = gSaveContext.save.saveInfo.bomberCode[i];
Font_LoadCharNES(play, digits[i] + '0', charTexIndex);
charTexIndex += 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)])];
index = sMaskCodeTextLengthENG[((void)0,
gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])];
for (playerNameLen = 0; playerNameLen < index; playerNameLen++, decodedBufPos++) {
Message_LoadCharNES(
play,
sMaskCodeTextENG[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])]
[playerNameLen],
&charTexIndex, &spA4, 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', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
}
}
msgCtx->decodedBuffer.schar[decodedBufPos] = ' ';
decodedBufPos++;
Message_LoadCharNES(play, 'h', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 'o', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 'u', &charTexIndex, &spA4, decodedBufPos);
decodedBufPos++;
Message_LoadCharNES(play, 'r', &charTexIndex, &spA4, decodedBufPos);
if ((digits[0] != 0) || (digits[1] != 1)) {
decodedBufPos++;
Message_LoadCharNES(play, 's', &charTexIndex, &spA4, decodedBufPos);
}
} else if (curChar == 0xE8) {
Message_LoadTimeNES(play, curChar, &charTexIndex, &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', charTexIndex);
charTexIndex += 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], charTexIndex);
charTexIndex += 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', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
decodedBufPos++;
if (i == 1) {
Font_LoadCharNES(play, '"', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
decodedBufPos++;
} else if (i == 3) {
Font_LoadCharNES(play, 0x27, charTexIndex);
charTexIndex += 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', charTexIndex);
charTexIndex += 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)) {
index = curChar - 0xFD;
for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) {
if (((void)0,
gSaveContext.save.saveInfo.inventory.dekuPlaygroundPlayerName[index][playerNameLen - 1]) != 0x3E) {
break;
}
}
for (i = 0; i < playerNameLen; i++) {
curChar = ((void)0, gSaveContext.save.saveInfo.inventory.dekuPlaygroundPlayerName[index][i]);
msgCtx->decodedBuffer.schar[decodedBufPos + i] = 0xFD;
fontBuf = &font->fontBuf[(curChar & 0xFFFF) * FONT_CHAR_TEX_SIZE];
for (var_v1_3 = 0; var_v1_3 < FONT_CHAR_TEX_SIZE; var_v1_3 += 4) {
font->charBuf[font->unk_11D88][charTexIndex + var_v1_3 + 0] = fontBuf[var_v1_3 + 0];
font->charBuf[font->unk_11D88][charTexIndex + var_v1_3 + 1] = fontBuf[var_v1_3 + 1];
font->charBuf[font->unk_11D88][charTexIndex + var_v1_3 + 2] = fontBuf[var_v1_3 + 2];
font->charBuf[font->unk_11D88][charTexIndex + var_v1_3 + 3] = fontBuf[var_v1_3 + 3];
}
charTexIndex += 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', charTexIndex);
charTexIndex += 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) {
numLines++;
}
} 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] & 0xFF;
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos] & 0xFF;
} 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)) {
sfxHi = msgCtx->decodedBuffer.schar[decodedBufPos - 1] << 8;
sfxHi |= msgCtx->decodedBuffer.schar[decodedBufPos];
Audio_PlaySfx(sfxHi);
}
} 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, charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
spA4 += sNESFontWidths[curChar - ' '] * msgCtx->textCharScale;
} else if (curChar == 0x20) {
spA4 += 6.0f;
}
decodedBufPos++;
msgCtx->msgBufPos++;
}
}