mirror of
https://github.com/zeldaret/mm.git
synced 2026-06-22 08:15:41 -04:00
2e87212038
* z_message_staff from z_message branch * Use highscores array * Clean up * format * PR cleanup * PR Review * Fix bss * Fix bss
677 lines
28 KiB
C
677 lines
28 KiB
C
#include "global.h"
|
|
#include "message_data_static.h"
|
|
|
|
void Message_FindCreditsMessage(PlayState* play, u16 textId) {
|
|
MessageContext* msgCtx = &play->msgCtx;
|
|
Font* font = &msgCtx->font;
|
|
MessageTableEntry* msgEntry = msgCtx->messageTableStaff;
|
|
const char* segment = msgEntry->segment;
|
|
const char* foundSegment;
|
|
const char* nextSegment;
|
|
|
|
while (msgEntry->textId != 0xFFFF) {
|
|
if (msgEntry->textId == textId) {
|
|
foundSegment = msgEntry->segment;
|
|
font->charBuf[font->unk_11D88][0] = msgEntry->typePos;
|
|
msgEntry++;
|
|
nextSegment = msgEntry->segment;
|
|
font->messageStart = foundSegment - segment;
|
|
font->messageEnd = nextSegment - foundSegment;
|
|
break;
|
|
}
|
|
msgEntry++;
|
|
}
|
|
}
|
|
|
|
f32 sCreditsFontWidths[144] = {
|
|
8.0f, 8.0f, 6.0f, 9.0f, 9.0f, 14.0f, 12.0f, 3.0f, 7.0f, 7.0f, 7.0f, 9.0f, 4.0f, 6.0f, 4.0f, 9.0f,
|
|
10.0f, 5.0f, 9.0f, 9.0f, 10.0f, 9.0f, 9.0f, 9.0f, 9.0f, 9.0f, 6.0f, 6.0f, 9.0f, 11.0f, 9.0f, 11.0f,
|
|
13.0f, 12.0f, 9.0f, 11.0f, 11.0f, 8.0f, 8.0f, 12.0f, 10.0f, 4.0f, 8.0f, 10.0f, 8.0f, 13.0f, 11.0f, 13.0f,
|
|
9.0f, 13.0f, 10.0f, 10.0f, 9.0f, 10.0f, 11.0f, 15.0f, 11.0f, 10.0f, 10.0f, 7.0f, 10.0f, 7.0f, 10.0f, 9.0f,
|
|
5.0f, 8.0f, 9.0f, 8.0f, 9.0f, 9.0f, 6.0f, 9.0f, 8.0f, 4.0f, 6.0f, 8.0f, 4.0f, 12.0f, 9.0f, 9.0f,
|
|
9.0f, 9.0f, 7.0f, 8.0f, 7.0f, 8.0f, 9.0f, 12.0f, 8.0f, 9.0f, 8.0f, 7.0f, 5.0f, 7.0f, 10.0f, 10.0f,
|
|
12.0f, 12.0f, 12.0f, 12.0f, 11.0f, 8.0f, 8.0f, 8.0f, 6.0f, 6.0f, 13.0f, 13.0f, 10.0f, 10.0f, 10.0f, 9.0f,
|
|
8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f, 6.0f, 9.0f, 9.0f, 9.0f, 9.0f, 9.0f, 14.0f,
|
|
14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f,
|
|
};
|
|
|
|
#ifdef NON_MATCHING
|
|
// https://decomp.me/scratch/yc8Or
|
|
// v0/v1 swap between `character` and `i`
|
|
void Message_DrawTextCredits(PlayState* play, Gfx** gfxP) {
|
|
MessageContext* msgCtx = &play->msgCtx;
|
|
u16 lookAheadCharacter;
|
|
u16 j;
|
|
u16 i;
|
|
u16 sfxHi;
|
|
char character;
|
|
u16 charTexIndex;
|
|
Font* font = &msgCtx->font;
|
|
Gfx* gfx = *gfxP;
|
|
|
|
msgCtx->textPosX = msgCtx->unk11FF8;
|
|
|
|
if (!msgCtx->textIsCredits) {
|
|
msgCtx->textPosY = msgCtx->unk11FFA;
|
|
} else {
|
|
msgCtx->textPosY = 48;
|
|
}
|
|
|
|
if (msgCtx->textBoxType == TEXTBOX_TYPE_5) {
|
|
msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0;
|
|
} else {
|
|
msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 255;
|
|
}
|
|
|
|
charTexIndex = 0;
|
|
|
|
for (i = 0; i < msgCtx->textDrawPos; i++) {
|
|
character = msgCtx->decodedBuffer.schar[i];
|
|
|
|
switch (character) {
|
|
case 0x1: // MESSAGE_NEWLINE
|
|
msgCtx->textPosX = msgCtx->unk11FF8;
|
|
if ((msgCtx->choiceNum == 1) || (msgCtx->choiceNum == 3)) {
|
|
msgCtx->textPosX += 32;
|
|
}
|
|
if ((msgCtx->choiceNum == 2) && (msgCtx->textPosY != msgCtx->unk11FFA)) {
|
|
msgCtx->textPosX += 32;
|
|
}
|
|
msgCtx->textPosY += msgCtx->unk11FFC;
|
|
break;
|
|
|
|
case 0x5: // Remnant of MESSAGE_COLOR
|
|
break;
|
|
|
|
case ' ':
|
|
msgCtx->textPosX += 6;
|
|
break;
|
|
|
|
case 0x4: // MESSAGE_BOX_BREAK
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
if (!msgCtx->textboxSkipped) {
|
|
Audio_PlaySfx(NA_SE_NONE);
|
|
msgCtx->msgMode = MSGMODE_TEXT_AWAIT_NEXT;
|
|
Font_LoadMessageBoxEndIcon(font, 0);
|
|
} else {
|
|
msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
|
|
msgCtx->textUnskippable = false;
|
|
msgCtx->msgBufPos++;
|
|
}
|
|
}
|
|
*gfxP = gfx;
|
|
return;
|
|
|
|
case 0x6: // MESSAGE_SHIFT
|
|
msgCtx->textPosX += msgCtx->decodedBuffer.schar[++i];
|
|
break;
|
|
|
|
case 0x7: // MESSAGE_TEXTID
|
|
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_20;
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
Audio_PlaySfx(NA_SE_NONE);
|
|
msgCtx->msgMode = MSGMODE_TEXT_DONE;
|
|
Font_LoadMessageBoxEndIcon(font, 0);
|
|
}
|
|
*gfxP = gfx;
|
|
return;
|
|
|
|
case 0x8: // MESSAGE_QUICKTEXT_ENABLE
|
|
if (((i + 1) == msgCtx->textDrawPos) &&
|
|
((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) ||
|
|
((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26)))) {
|
|
j = i;
|
|
while (true) {
|
|
lookAheadCharacter = msgCtx->decodedBuffer.schar[j];
|
|
if (lookAheadCharacter == 6) {
|
|
j += 2;
|
|
continue;
|
|
}
|
|
if ((lookAheadCharacter != 9) && (lookAheadCharacter != 0xA) && (lookAheadCharacter != 0xB) &&
|
|
(lookAheadCharacter != 0xC) && (lookAheadCharacter != 0xD) && (lookAheadCharacter != 4) &&
|
|
(lookAheadCharacter != 2)) {
|
|
j++;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
i = j - 1;
|
|
msgCtx->textDrawPos = i + 1;
|
|
}
|
|
// fallthrough
|
|
case 0x9: // MESSAGE_QUICKTEXT_DISABLE
|
|
break;
|
|
|
|
case 0xD: // MESSAGE_AWAIT_BUTTON_PRESS
|
|
if ((i + 1) == msgCtx->textDrawPos) {
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
msgCtx->msgMode = MSGMODE_TEXT_AWAIT_INPUT;
|
|
Font_LoadMessageBoxEndIcon(font, 0);
|
|
}
|
|
*gfxP = gfx;
|
|
return;
|
|
}
|
|
break;
|
|
|
|
case 0xC: // MESSAGE_BOX_BREAK_DELAYED
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
msgCtx->stateTimer = msgCtx->decodedBuffer.schar[++i];
|
|
msgCtx->msgMode = MSGMODE_TEXT_DELAYED_BREAK;
|
|
}
|
|
*gfxP = gfx;
|
|
return;
|
|
|
|
case 0x11: // MESSAGE_FADE2
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
msgCtx->msgMode = MSGMODE_TEXT_DONE;
|
|
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_50;
|
|
msgCtx->stateTimer = msgCtx->decodedBuffer.schar[++i] << 8;
|
|
msgCtx->stateTimer |= msgCtx->decodedBuffer.schar[++i];
|
|
}
|
|
*gfxP = gfx;
|
|
return;
|
|
|
|
case 0x12: // MESSAGE_SFX
|
|
if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && !msgCtx->messageHasSetSfx) {
|
|
msgCtx->messageHasSetSfx = true;
|
|
sfxHi = msgCtx->decodedBuffer.schar[i + 1];
|
|
sfxHi = sfxHi << 8;
|
|
Audio_PlaySfx(sfxHi | msgCtx->decodedBuffer.schar[i + 2]);
|
|
}
|
|
i += 2;
|
|
break;
|
|
|
|
case 0x13: // remnant of MESSAGE_ITEM_ICON
|
|
break;
|
|
|
|
case 0x15: // MESSAGE_BACKGROUND
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
Audio_PlaySfx(NA_SE_NONE);
|
|
}
|
|
gDPPipeSync(gfx++);
|
|
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textColorAlpha);
|
|
|
|
gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 0,
|
|
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
|
|
G_TX_NOLOD, G_TX_NOLOD);
|
|
gSPTextureRectangle(gfx++, (msgCtx->textPosX + 1) << 2, (msgCtx->unk12012 + 1) << 2,
|
|
(msgCtx->textPosX + 0x61) << 2, (msgCtx->unk12012 + 0x31) << 2, G_TX_RENDERTILE, 0,
|
|
0, 1 << 10, 1 << 10);
|
|
|
|
gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 0,
|
|
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
|
|
G_TX_NOLOD, G_TX_NOLOD);
|
|
gSPTextureRectangle(gfx++, (msgCtx->textPosX + 0x61) << 2, (msgCtx->unk12012 + 1) << 2,
|
|
(msgCtx->textPosX + 0xC2) << 2, (msgCtx->unk12012 + 0x31) << 2, 0, 0, 0, 1 << 10,
|
|
1 << 10);
|
|
|
|
gDPPipeSync(gfx++);
|
|
gDPSetPrimColor(gfx++, 0, 0, 255, 60, 0, msgCtx->textColorAlpha);
|
|
gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 0,
|
|
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
|
|
G_TX_NOLOD, G_TX_NOLOD);
|
|
gSPTextureRectangle(gfx++, msgCtx->textPosX << 2, msgCtx->unk12012 << 2, (msgCtx->textPosX + 0x60) << 2,
|
|
(msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
|
|
gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 0,
|
|
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
|
|
G_TX_NOLOD, G_TX_NOLOD);
|
|
gSPTextureRectangle(gfx++, (msgCtx->textPosX + 0x60) << 2, msgCtx->unk12012 << 2,
|
|
(msgCtx->textPosX + 0xC0) << 2, (msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0,
|
|
0, 1 << 10, 1 << 10);
|
|
gDPPipeSync(gfx++);
|
|
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
|
|
PRIMITIVE, 0);
|
|
msgCtx->textPosX += 0x20;
|
|
break;
|
|
|
|
case 0x14: // MESSAGE_TEXT_SPEED
|
|
msgCtx->textDelay = msgCtx->decodedBuffer.schar[++i];
|
|
break;
|
|
|
|
case 0x1A: // MESSAGE_UNSKIPPABLE
|
|
msgCtx->textUnskippable = true;
|
|
break;
|
|
|
|
case 0x1B: // MESSAGE_TWO_CHOICE
|
|
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_10;
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
msgCtx->choiceTextId = msgCtx->currentTextId;
|
|
msgCtx->stateTimer = 4;
|
|
msgCtx->choiceIndex = 0;
|
|
Font_LoadMessageBoxEndIcon(font, 2);
|
|
}
|
|
break;
|
|
|
|
case 0x1C: // MESSAGE_THREE_CHOICE
|
|
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_11;
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
msgCtx->choiceTextId = msgCtx->currentTextId;
|
|
msgCtx->stateTimer = 4;
|
|
msgCtx->choiceIndex = 0;
|
|
Font_LoadMessageBoxEndIcon(font, 2);
|
|
}
|
|
break;
|
|
|
|
case 0x2: // MESSAGE_END
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
msgCtx->msgMode = MSGMODE_TEXT_DONE;
|
|
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_00) {
|
|
Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
|
|
Font_LoadMessageBoxEndIcon(font, 1);
|
|
if (play->csCtx.state == CS_STATE_IDLE) {
|
|
func_8011552C(play, DO_ACTION_RETURN);
|
|
}
|
|
}
|
|
}
|
|
*gfxP = gfx;
|
|
return;
|
|
|
|
case 0x10: // MESSAGE_OCARINA
|
|
if ((i + 1) == msgCtx->textDrawPos) {
|
|
Message_HandleOcarina(play);
|
|
*gfxP = gfx;
|
|
return;
|
|
}
|
|
break;
|
|
|
|
case 0xE: // MESSAGE_FADE
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
msgCtx->msgMode = MSGMODE_TEXT_DONE;
|
|
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_50;
|
|
msgCtx->stateTimer = msgCtx->decodedBuffer.schar[++i];
|
|
Font_LoadMessageBoxEndIcon(font, 1);
|
|
if (play->csCtx.state == CS_STATE_IDLE) {
|
|
func_8011552C(play, DO_ACTION_RETURN);
|
|
}
|
|
}
|
|
*gfxP = gfx;
|
|
return;
|
|
|
|
case 0xA: // MESSAGE_PERSISTENT
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
Audio_PlaySfx(NA_SE_NONE);
|
|
msgCtx->msgMode = MSGMODE_TEXT_DONE;
|
|
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_30;
|
|
}
|
|
*gfxP = gfx;
|
|
return;
|
|
|
|
case 0xB: // MESSAGE_EVENT
|
|
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
|
msgCtx->msgMode = MSGMODE_TEXT_DONE;
|
|
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_40;
|
|
Font_LoadMessageBoxEndIcon(font, 0);
|
|
Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
|
|
}
|
|
*gfxP = gfx;
|
|
return;
|
|
|
|
default:
|
|
if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && ((i + 1) == msgCtx->textDrawPos) &&
|
|
(msgCtx->textDelayTimer == msgCtx->textDelay)) {
|
|
Audio_PlaySfx(NA_SE_NONE);
|
|
}
|
|
Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
|
|
charTexIndex += FONT_CHAR_TEX_SIZE;
|
|
|
|
msgCtx->textPosX += (s32)(sCreditsFontWidths[character - ' '] * msgCtx->textCharScale);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (msgCtx->textDelayTimer == 0) {
|
|
msgCtx->textDrawPos = i + 1;
|
|
msgCtx->textDelayTimer = msgCtx->textDelay;
|
|
} else {
|
|
msgCtx->textDelayTimer--;
|
|
}
|
|
|
|
*gfxP = gfx;
|
|
}
|
|
#else
|
|
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_staff/Message_DrawTextCredits.s")
|
|
#endif
|
|
|
|
void Message_DecodeCredits(PlayState* play) {
|
|
u16 curChar;
|
|
s16 loadChar;
|
|
s16 i;
|
|
s16 playerNameLen;
|
|
s16 decodedBufPos = 0;
|
|
s16 charOffset;
|
|
f32 timeInSeconds;
|
|
s16 numLines = 0;
|
|
s16 value;
|
|
s16 digits[4];
|
|
s32 charTexIdx = 0;
|
|
MessageContext* msgCtx = &play->msgCtx;
|
|
Font* font = &play->msgCtx.font;
|
|
|
|
msgCtx->nextTextId = 0xFFFF;
|
|
|
|
while (true) {
|
|
curChar = font->msgBuf.schar[msgCtx->msgBufPos];
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos];
|
|
|
|
if ((curChar == 4) || (curChar == 7) || (curChar == 0xC) || (curChar == 0xB) || (curChar == 2)) {
|
|
// Textbox decoding ends with any of the above text control characters
|
|
msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
|
|
msgCtx->textDrawPos = 1;
|
|
msgCtx->unk11FFA = msgCtx->textboxY + 8;
|
|
|
|
if (msgCtx->textBoxType != TEXTBOX_TYPE_4) {
|
|
if (numLines == 0) {
|
|
msgCtx->unk11FFA = msgCtx->textboxY + 26;
|
|
} else if (numLines == 1) {
|
|
msgCtx->unk11FFA = msgCtx->textboxY + 20;
|
|
} else if (numLines == 2) {
|
|
msgCtx->unk11FFA = msgCtx->textboxY + 16;
|
|
}
|
|
}
|
|
|
|
if (curChar == 7) {
|
|
value = font->msgBuf.schar[msgCtx->msgBufPos + 1];
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1];
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 2];
|
|
value <<= 8;
|
|
msgCtx->nextTextId = msgCtx->decodedBuffer.schar[decodedBufPos] | value;
|
|
}
|
|
|
|
if (curChar == 0xC) {
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1];
|
|
msgCtx->msgBufPos += 2;
|
|
}
|
|
|
|
msgCtx->decodedTextLen = decodedBufPos;
|
|
|
|
if (msgCtx->textboxSkipped) {
|
|
msgCtx->textDrawPos = msgCtx->decodedTextLen;
|
|
}
|
|
break;
|
|
} else if (curChar == 0xF) {
|
|
// Substitute the player name control character for the file's player name.
|
|
for (playerNameLen = ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); playerNameLen > 0;
|
|
playerNameLen--) {
|
|
if (gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1] != 0x3E) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < playerNameLen; i++) {
|
|
curChar = gSaveContext.save.saveInfo.playerData.playerName[i];
|
|
if (curChar == 62) {
|
|
curChar = ' ';
|
|
} else if (curChar == 64) {
|
|
curChar = '.';
|
|
} else if (curChar == 63) {
|
|
curChar = '-';
|
|
} else if (curChar < 10) {
|
|
charOffset = curChar;
|
|
curChar = '0' + charOffset;
|
|
} else if (curChar < 36) {
|
|
charOffset = curChar;
|
|
curChar = 'A' - 10 + charOffset;
|
|
} else if (curChar < 62) {
|
|
charOffset = curChar;
|
|
curChar = 'a' - 36 + charOffset;
|
|
}
|
|
|
|
if (curChar != ' ') {
|
|
Font_LoadCharNES(play, curChar - ' ', charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
}
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = curChar;
|
|
decodedBufPos++;
|
|
}
|
|
decodedBufPos--;
|
|
} else if ((curChar == 0x16) || (curChar == 0x17)) {
|
|
digits[0] = digits[1] = digits[2] = 0;
|
|
if (curChar == 0x17) {
|
|
digits[3] = gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2];
|
|
} else {
|
|
digits[3] = gSaveContext.timerCurTimes[TIMER_ID_GORON_RACE_UNUSED];
|
|
}
|
|
|
|
while (digits[3] >= 60) {
|
|
digits[1]++;
|
|
if (digits[1] >= 10) {
|
|
digits[0]++;
|
|
digits[1] -= 10;
|
|
}
|
|
digits[3] -= 60;
|
|
}
|
|
|
|
while (digits[3] >= 10) {
|
|
digits[2]++;
|
|
digits[3] -= 10;
|
|
}
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
|
|
decodedBufPos++;
|
|
if (i == 1) {
|
|
Font_LoadCharNES(play, '"' - ' ', charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
|
|
decodedBufPos++;
|
|
} else if (i == 3) {
|
|
Font_LoadCharNES(play, '"' - ' ', charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
|
|
}
|
|
}
|
|
|
|
} else if (curChar == 0x18) {
|
|
digits[0] = digits[1] = digits[2] = 0;
|
|
digits[3] = gSaveContext.minigameScore;
|
|
|
|
while (digits[3] >= 1000) {
|
|
digits[0]++;
|
|
digits[3] -= 1000;
|
|
}
|
|
while (digits[3] >= 100) {
|
|
digits[1]++;
|
|
digits[3] -= 100;
|
|
}
|
|
while (digits[3] >= 10) {
|
|
digits[2]++;
|
|
digits[3] -= 10;
|
|
}
|
|
|
|
loadChar = false;
|
|
for (i = 0; i < 4; i++) {
|
|
if ((i == 3) || (digits[i] != 0)) {
|
|
loadChar = true;
|
|
}
|
|
if (loadChar) {
|
|
Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
decodedBufPos++;
|
|
}
|
|
}
|
|
decodedBufPos--;
|
|
} else if (curChar != 0x19) {
|
|
if (curChar == 0x1D) {
|
|
digits[0] = 0;
|
|
digits[1] = gSaveContext.minigameScore;
|
|
|
|
while (digits[1] >= 10) {
|
|
digits[0]++;
|
|
digits[1] -= 10;
|
|
}
|
|
|
|
for (i = 0; i < 2; i++) {
|
|
if ((i == 1) || (digits[i] != 0)) {
|
|
Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
|
|
decodedBufPos++;
|
|
}
|
|
}
|
|
decodedBufPos--;
|
|
} else if (curChar == 0x1E) {
|
|
value = HIGH_SCORE((u8)font->msgBuf.schar[++msgCtx->msgBufPos]);
|
|
if ((font->msgBuf.schar[msgCtx->msgBufPos] & 0xFF) == HS_FISHING) {
|
|
if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
|
|
value &= 0x7F;
|
|
} else {
|
|
value =
|
|
(s16)((HIGH_SCORE((u8)font->msgBuf.schar[msgCtx->msgBufPos]) & 0xFF000000) >> 0x18) & 0x7F;
|
|
}
|
|
value = SQ((f32)value) * 0.0036f + 0.5f;
|
|
}
|
|
switch (font->msgBuf.schar[msgCtx->msgBufPos] & 0xFF) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
digits[0] = digits[1] = digits[2] = 0;
|
|
digits[3] = value;
|
|
|
|
while (digits[3] >= 1000) {
|
|
digits[0]++;
|
|
digits[3] -= 1000;
|
|
}
|
|
while (digits[3] >= 100) {
|
|
digits[1]++;
|
|
digits[3] -= 100;
|
|
}
|
|
while (digits[3] >= 10) {
|
|
digits[2]++;
|
|
digits[3] -= 10;
|
|
}
|
|
|
|
loadChar = false;
|
|
for (i = 0; i < 4; i++) {
|
|
if ((i == 3) || (digits[i] != 0)) {
|
|
loadChar = true;
|
|
}
|
|
if (loadChar) {
|
|
Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
decodedBufPos++;
|
|
}
|
|
}
|
|
decodedBufPos--;
|
|
break;
|
|
|
|
case 3:
|
|
case 4:
|
|
case 6:
|
|
digits[0] = digits[1] = digits[2] = 0;
|
|
digits[3] = value;
|
|
|
|
while (digits[3] >= 60) {
|
|
digits[1]++;
|
|
if (digits[1] >= 10) {
|
|
digits[0]++;
|
|
digits[1] -= 10;
|
|
}
|
|
digits[3] -= 60;
|
|
}
|
|
while (digits[3] >= 10) {
|
|
digits[2]++;
|
|
digits[3] -= 10;
|
|
}
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
|
|
decodedBufPos++;
|
|
if (i == 1) {
|
|
Font_LoadCharNES(play, '"' - ' ', charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
|
|
decodedBufPos++;
|
|
} else if (i == 3) {
|
|
Font_LoadCharNES(play, '"' - ' ', charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = '"';
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (curChar == 0x1F) {
|
|
digits[0] = 0;
|
|
timeInSeconds = TIME_TO_MINUTES_F(gSaveContext.save.time);
|
|
|
|
digits[1] = timeInSeconds / 60.0f;
|
|
while (digits[1] >= 10) {
|
|
digits[0]++;
|
|
digits[1] -= 10;
|
|
}
|
|
|
|
digits[2] = 0;
|
|
digits[3] = (s32)timeInSeconds % 60;
|
|
while (digits[3] >= 10) {
|
|
digits[2]++;
|
|
digits[3] -= 10;
|
|
}
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
Font_LoadCharNES(play, digits[i] + '0' - ' ', charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0';
|
|
decodedBufPos++;
|
|
if (i == 1) {
|
|
Font_LoadCharNES(play, ':' - ' ', charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
msgCtx->decodedBuffer.schar[decodedBufPos] = ':';
|
|
decodedBufPos++;
|
|
}
|
|
}
|
|
|
|
decodedBufPos--;
|
|
} else if (curChar == 0x13) {
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1];
|
|
Message_LoadItemIcon(play, font->msgBuf.schar[msgCtx->msgBufPos + 1], msgCtx->textboxY + 10);
|
|
} else if (curChar == 0x15) {
|
|
DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000,
|
|
(uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
|
|
DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900,
|
|
(uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
|
|
msgCtx->msgBufPos += 3;
|
|
msgCtx->unk12012 = msgCtx->textboxY + 8;
|
|
numLines = 2;
|
|
} else if (curChar == 5) {
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
|
|
} else if (curChar == 1) {
|
|
numLines++;
|
|
} else if ((curChar != 8) && (curChar != 9) && (curChar != 0xD) && (curChar != 0x10) && (curChar != 0xA) &&
|
|
(curChar != 0x1A)) {
|
|
if (curChar == 0xE) {
|
|
msgCtx->textFade = true;
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
|
|
} else if (curChar == 0x11) {
|
|
msgCtx->textFade = true;
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
|
|
} else if ((curChar == 6) || (curChar == 0x14)) {
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos] & 0xFF;
|
|
} else if (curChar == 0x12) {
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
|
|
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
|
|
} else if (curChar == 0x1B) {
|
|
msgCtx->choiceNum = 2;
|
|
} else if (curChar == 0x1C) {
|
|
msgCtx->choiceNum = 3;
|
|
} else if (curChar != ' ') {
|
|
Font_LoadCharNES(play, curChar, charTexIdx);
|
|
charTexIdx += FONT_CHAR_TEX_SIZE;
|
|
}
|
|
}
|
|
}
|
|
|
|
decodedBufPos++;
|
|
msgCtx->msgBufPos++;
|
|
}
|
|
}
|