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