Files
mm/src/code/z_message.c
T
Derek Hensley 250be53cde Add Shift-JIS support for some voice and message files (#1500)
* z_message iconv

* voicecheckword iconv

* format

* TODO

* voice_external iconv

* Missed a few in message

* Use shiftjis_conv instead

* space comment in message_nes

* Use chars for cases

* Add ending single quote check as well

* table comments

* No look up table

* align makefile tools
2024-03-31 20:24:06 -07:00

6061 lines
254 KiB
C
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "z64message.h"
#include "global.h"
#include "message_data_static.h"
#include "padmgr.h"
#include "segment_symbols.h"
#include "z64actor.h"
#include "z64horse.h"
#include "z64shrink_window.h"
#include "z64save.h"
#include "interface/parameter_static/parameter_static.h"
u8 D_801C6A70 = 0;
s16 sOcarinaButtonIndexBufPos = 0;
s16 sOcarinaButtonIndexBufLen = 0;
s16 sLastPlayedSong = 0xFF;
s16 sOcarinaButtonStepR = 0;
s16 sOcarinaButtonStepG = 0;
s16 sOcarinaButtonStepB = 0;
s16 sOcarinaButtonFlashTimer = 12;
s16 sOcarinaButtonFlashColorIndex = 1;
s16 D_801C6A94 = 0;
u8 gPageSwitchNextButtonStatus[][5] = {
{ BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
{ BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
{ BTN_ENABLED, BTN_DISABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
{ BTN_ENABLED, BTN_DISABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
{ BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
{ BTN_ENABLED, BTN_ENABLED, BTN_DISABLED, BTN_ENABLED, BTN_ENABLED },
};
#define DEFINE_PERSON(_enum, _photo, _description, _metEnum, metMessage, _metFlag) metMessage,
#define DEFINE_EVENT(_enum, _icon, _colorFlag, _description, completedMessage, _completedFlag) completedMessage,
u16 sBombersNotebookEventMessages[BOMBERS_NOTEBOOK_EVENT_MAX] = {
#include "tables/bombers_notebook/person_table.h"
#include "tables/bombers_notebook/event_table.h"
};
#undef DEFINE_PERSON
#undef DEFINE_EVENT
#define DEFINE_PERSON(_enum, _photo, _description, _metEnum, _metMessage, metFlag) metFlag,
#define DEFINE_EVENT(_enum, _icon, _colorFlag, _description, _completedMessage, completedFlag) completedFlag,
u16 gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_EVENT_MAX] = {
#include "tables/bombers_notebook/person_table.h"
#include "tables/bombers_notebook/event_table.h"
};
#undef DEFINE_PERSON
#undef DEFINE_EVENT
#define DEFINE_MESSAGE(textId, typePos, msg) { textId, typePos, _message_##textId },
MessageTableEntry sMessageTableNES[] = {
#include "assets/text/message_data.h"
{ 0xFFFF, 0, NULL },
};
#undef DEFINE_MESSAGE
#define DEFINE_MESSAGE(textId, typePos, msg) { textId, typePos, _message_##textId##_staff },
MessageTableEntry sMessageTableCredits[] = {
#include "assets/text/staff_message_data.h"
{ 0xFFFF, 0, NULL },
};
#undef DEFINE_MESSAGE
s16 D_801CFC78[TEXTBOX_TYPE_MAX] = {
0, // TEXTBOX_TYPE_0
1, // TEXTBOX_TYPE_1
3, // TEXTBOX_TYPE_2
2, // TEXTBOX_TYPE_3
14, // TEXTBOX_TYPE_4
14, // TEXTBOX_TYPE_5
0, // TEXTBOX_TYPE_6
14, // TEXTBOX_TYPE_7
0, // TEXTBOX_TYPE_8
0, // TEXTBOX_TYPE_9
0, // TEXTBOX_TYPE_A
14, // TEXTBOX_TYPE_B
14, // TEXTBOX_TYPE_C
4, // TEXTBOX_TYPE_D
14, // TEXTBOX_TYPE_E
0, // TEXTBOX_TYPE_F
};
u8 sOcarinaButtonIndexBuf[12] = { 0 };
s16 sOcarinaButtonAlphaValues[9] = { 0 };
s16 gOcarinaSongItemMap[] = {
OCARINA_SONG_SONATA, OCARINA_SONG_GORON_LULLABY, OCARINA_SONG_NEW_WAVE,
OCARINA_SONG_ELEGY, OCARINA_SONG_OATH, OCARINA_SONG_SARIAS,
OCARINA_SONG_TIME, OCARINA_SONG_HEALING, OCARINA_SONG_EPONAS,
OCARINA_SONG_SOARING, OCARINA_SONG_STORMS, OCARINA_SONG_SUNS,
OCARINA_SONG_INVERTED_TIME, OCARINA_SONG_DOUBLE_TIME, OCARINA_SONG_GORON_LULLABY_INTRO,
};
// bss
s32 sCharTexSize;
s32 sCharTexScale;
s32 D_801F6B08;
s16 sOcarinaButtonAPrimR;
s16 sOcarinaButtonAPrimB;
s16 sOcarinaButtonAPrimG;
s16 sOcarinaButtonAEnvR;
s16 sOcarinaButtonAEnvB;
s16 sOcarinaButtonAEnvG;
s16 sOcarinaButtonCPrimR;
s16 sOcarinaButtonCPrimB;
s16 sOcarinaButtonCPrimG;
s16 sOcarinaButtonCEnvR;
s16 sOcarinaButtonCEnvB;
s16 sOcarinaButtonCEnvG;
void Message_ResetOcarinaButtonAlphas(void) {
sOcarinaButtonIndexBuf[0] = OCARINA_BTN_INVALID;
sOcarinaButtonAlphaValues[0] = sOcarinaButtonAlphaValues[1] = sOcarinaButtonAlphaValues[2] =
sOcarinaButtonAlphaValues[3] = sOcarinaButtonAlphaValues[4] = sOcarinaButtonAlphaValues[5] =
sOcarinaButtonAlphaValues[6] = sOcarinaButtonAlphaValues[7] = sOcarinaButtonAlphaValues[8] = 0;
}
void Message_ResetOcarinaButtonState(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
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;
Message_ResetOcarinaButtonAlphas();
sOcarinaButtonAPrimR = 80;
sOcarinaButtonAPrimG = 150;
sOcarinaButtonAPrimB = 255;
sOcarinaButtonAEnvR = 10;
sOcarinaButtonAEnvG = 10;
sOcarinaButtonAEnvB = 10;
sOcarinaButtonCPrimR = 255;
sOcarinaButtonCPrimG = 255;
sOcarinaButtonCPrimB = 50;
sOcarinaButtonCEnvR = 10;
sOcarinaButtonCEnvG = 10;
sOcarinaButtonCEnvB = 10;
}
bool Message_ShouldAdvance(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Input* controller = CONTROLLER1(&play->state);
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_TWO_CHOICE) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_THREE_CHOICE)) {
if (CHECK_BTN_ALL(controller->press.button, BTN_A)) {
Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
}
return CHECK_BTN_ALL(controller->press.button, BTN_A);
} else {
if (CHECK_BTN_ALL(controller->press.button, BTN_A) || CHECK_BTN_ALL(controller->press.button, BTN_B) ||
CHECK_BTN_ALL(controller->press.button, BTN_CUP)) {
Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
}
return CHECK_BTN_ALL(controller->press.button, BTN_A) || CHECK_BTN_ALL(controller->press.button, BTN_B) ||
CHECK_BTN_ALL(controller->press.button, BTN_CUP);
}
}
bool Message_ShouldAdvanceSilent(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Input* controller = CONTROLLER1(&play->state);
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_TWO_CHOICE) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_THREE_CHOICE)) {
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) ||
CHECK_BTN_ALL(controller->press.button, BTN_CUP);
}
}
void Message_CloseTextbox(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
if (play->msgCtx.msgLength != 0) {
msgCtx->stateTimer = 2;
msgCtx->msgMode = MSGMODE_TEXT_CLOSING;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_DEFAULT;
Audio_PlaySfx(NA_SE_NONE);
}
}
void Message_DrawTextboxIcon(PlayState* play, Gfx** gfxP, s16 x, s16 y) {
static Color_RGB16 sIconPrimColors[] = {
{ 0, 80, 200 },
{ 50, 130, 255 },
};
static Color_RGB16 sIconEnvColors[] = {
{ 0, 0, 0 },
{ 0, 130, 255 },
};
static s16 sIconPrimR = 0;
static s16 sIconPrimG = 80;
static s16 sIconPrimB = 200;
static s16 sIconFlashTimer = 12;
static s16 sIconFlashColorIndex = 0;
static s16 sIconEnvR = 0;
static s16 sIconEnvG = 0;
static s16 sIconEnvB = 0;
Gfx* gfx;
MessageContext* msgCtx = &play->msgCtx;
Font* font = &msgCtx->font;
s16 primR;
s16 primG;
s16 primB;
s16 envR;
s16 envG;
s16 envB;
u8* iconTexture = msgCtx->font.iconBuf;
gfx = *gfxP;
if (!msgCtx->textIsCredits) {
primR = ABS_ALT(sIconPrimR - sIconPrimColors[sIconFlashColorIndex].r) / sIconFlashTimer;
primG = ABS_ALT(sIconPrimG - sIconPrimColors[sIconFlashColorIndex].g) / sIconFlashTimer;
primB = ABS_ALT(sIconPrimB - sIconPrimColors[sIconFlashColorIndex].b) / sIconFlashTimer;
if (sIconPrimR >= sIconPrimColors[sIconFlashColorIndex].r) {
sIconPrimR -= primR;
} else {
sIconPrimR += primR;
}
if (sIconPrimG >= sIconPrimColors[sIconFlashColorIndex].g) {
sIconPrimG -= primG;
} else {
sIconPrimG += primG;
}
if (sIconPrimB >= sIconPrimColors[sIconFlashColorIndex].b) {
sIconPrimB -= primB;
} else {
sIconPrimB += primB;
}
envR = ABS_ALT(sIconEnvR - sIconEnvColors[sIconFlashColorIndex].r) / sIconFlashTimer;
envG = ABS_ALT(sIconEnvG - sIconEnvColors[sIconFlashColorIndex].g) / sIconFlashTimer;
envB = ABS_ALT(sIconEnvB - sIconEnvColors[sIconFlashColorIndex].b) / sIconFlashTimer;
if (sIconEnvR >= sIconEnvColors[sIconFlashColorIndex].r) {
sIconEnvR -= envR;
} else {
sIconEnvR += envR;
}
if (sIconEnvG >= sIconEnvColors[sIconFlashColorIndex].g) {
sIconEnvG -= envG;
} else {
sIconEnvG += envG;
}
if (sIconEnvB >= sIconEnvColors[sIconFlashColorIndex].b) {
sIconEnvB -= envB;
} else {
sIconEnvB += envB;
}
sIconFlashTimer--;
if (sIconFlashTimer == 0) {
sIconPrimR = sIconPrimColors[sIconFlashColorIndex].r;
sIconPrimG = sIconPrimColors[sIconFlashColorIndex].g;
sIconPrimB = sIconPrimColors[sIconFlashColorIndex].b;
sIconEnvR = sIconEnvColors[sIconFlashColorIndex].r;
sIconEnvG = sIconEnvColors[sIconFlashColorIndex].g;
sIconEnvB = sIconEnvColors[sIconFlashColorIndex].b;
sIconFlashTimer = 12;
sIconFlashColorIndex ^= 1;
}
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
gDPSetPrimColor(gfx++, 0, 0, sIconPrimR, sIconPrimG, sIconPrimB, 255);
gDPSetEnvColor(gfx++, sIconEnvR, sIconEnvG, sIconEnvB, 255);
if (!play->pauseCtx.bombersNotebookOpen) {
gDPLoadTextureBlock_4b(gfx++, iconTexture, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP,
G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(gfx++, x << 2, y << 2, (x + sCharTexSize) << 2, (y + sCharTexSize) << 2,
G_TX_RENDERTILE, 0, 0, sCharTexScale, sCharTexScale);
}
msgCtx->stateTimer++;
*gfxP = gfx;
}
}
void func_80147F18(PlayState* play, Gfx** gfxP, s16 arg2, s16 arg3) {
static Color_RGB16 D_801CFD10[] = {
{ 0, 80, 200 },
{ 50, 130, 255 },
};
static Color_RGB16 D_801CFD1C[] = {
{ 0, 0, 0 },
{ 0, 130, 255 },
};
static s16 D_801CFD28 = 0;
static s16 D_801CFD2C = 80;
static s16 D_801CFD30 = 200;
static s16 D_801CFD34 = 12;
static s16 D_801CFD38 = 0;
static s16 D_801CFD3C = 0;
static s16 D_801CFD40 = 0;
static s16 D_801CFD44 = 0;
Gfx* gfx;
MessageContext* msgCtx = &play->msgCtx;
s16 primR;
s16 primG;
s16 primB;
s16 envR;
s16 envG;
s16 envB;
gfx = *gfxP;
if (!msgCtx->textIsCredits) {
primR = ABS_ALT(D_801CFD28 - D_801CFD10[D_801CFD38].r) / D_801CFD34;
primG = ABS_ALT(D_801CFD2C - D_801CFD10[D_801CFD38].g) / D_801CFD34;
primB = ABS_ALT(D_801CFD30 - D_801CFD10[D_801CFD38].b) / D_801CFD34;
if (D_801CFD28 >= D_801CFD10[D_801CFD38].r) {
D_801CFD28 -= primR;
} else {
D_801CFD28 += primR;
}
if (D_801CFD2C >= D_801CFD10[D_801CFD38].g) {
D_801CFD2C -= primG;
} else {
D_801CFD2C += primG;
}
if (D_801CFD30 >= D_801CFD10[D_801CFD38].b) {
D_801CFD30 -= primB;
} else {
D_801CFD30 += primB;
}
envR = ABS_ALT(D_801CFD3C - D_801CFD1C[D_801CFD38].r) / D_801CFD34;
envG = ABS_ALT(D_801CFD40 - D_801CFD1C[D_801CFD38].g) / D_801CFD34;
envB = ABS_ALT(D_801CFD44 - D_801CFD1C[D_801CFD38].b) / D_801CFD34;
if (D_801CFD3C >= D_801CFD1C[D_801CFD38].r) {
D_801CFD3C -= envR;
} else {
D_801CFD3C += envR;
}
if (D_801CFD40 >= D_801CFD1C[D_801CFD38].g) {
D_801CFD40 -= envG;
} else {
D_801CFD40 += envG;
}
if (D_801CFD44 >= D_801CFD1C[D_801CFD38].b) {
D_801CFD44 -= envB;
} else {
D_801CFD44 += envB;
}
D_801CFD34--;
if (D_801CFD34 == 0) {
D_801CFD28 = D_801CFD10[D_801CFD38].r;
D_801CFD2C = D_801CFD10[D_801CFD38].g;
D_801CFD30 = D_801CFD10[D_801CFD38].b;
D_801CFD3C = D_801CFD1C[D_801CFD38].r;
D_801CFD40 = D_801CFD1C[D_801CFD38].g;
D_801CFD44 = D_801CFD1C[D_801CFD38].b;
D_801CFD34 = 12;
D_801CFD38 ^= 1;
}
gDPPipeSync(gfx++);
gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
gDPSetCombineMode(gfx++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gDPSetPrimColor(gfx++, 0, 0, D_801CFD28, D_801CFD2C, D_801CFD30, 120);
gDPFillRectangle(gfx++, arg2 + 3, arg3, arg2 + 17, arg3 + 11);
gDPFillRectangle(gfx++, arg2 + 6, arg3 - 2, arg2 + 14, arg3 + 13);
gDPPipeSync(gfx++);
msgCtx->stateTimer++;
*gfxP = gfx++;
}
}
void func_80148558(PlayState* play, Gfx** gfxP, s16 arg2, s16 arg3) {
static Color_RGB16 D_801CFD48[] = {
{ 0, 80, 200 },
{ 50, 130, 255 },
};
static Color_RGB16 D_801CFD54[] = {
{ 0, 0, 0 },
{ 0, 130, 255 },
};
static s16 D_801CFD60 = 0;
static s16 D_801CFD64 = 80;
static s16 D_801CFD68 = 200;
static s16 D_801CFD6C = 12;
static s16 D_801CFD70 = 0;
static s16 D_801CFD74 = 0;
static s16 D_801CFD78 = 0;
static s16 D_801CFD7C = 0;
Gfx* gfx;
MessageContext* msgCtx = &play->msgCtx;
s16 primR;
s16 primG;
s16 primB;
s16 envR;
s16 envG;
s16 envB;
gfx = *gfxP;
if (!msgCtx->textIsCredits) {
primR = ABS_ALT(D_801CFD60 - D_801CFD48[D_801CFD70].r) / D_801CFD6C;
primG = ABS_ALT(D_801CFD64 - D_801CFD48[D_801CFD70].g) / D_801CFD6C;
primB = ABS_ALT(D_801CFD68 - D_801CFD48[D_801CFD70].b) / D_801CFD6C;
if (D_801CFD60 >= D_801CFD48[D_801CFD70].r) {
D_801CFD60 -= primR;
} else {
D_801CFD60 += primR;
}
if (D_801CFD64 >= D_801CFD48[D_801CFD70].g) {
D_801CFD64 -= primG;
} else {
D_801CFD64 += primG;
}
if (D_801CFD68 >= D_801CFD48[D_801CFD70].b) {
D_801CFD68 -= primB;
} else {
D_801CFD68 += primB;
}
envR = ABS_ALT(D_801CFD74 - D_801CFD54[D_801CFD70].r) / D_801CFD6C;
envG = ABS_ALT(D_801CFD78 - D_801CFD54[D_801CFD70].g) / D_801CFD6C;
envB = ABS_ALT(D_801CFD7C - D_801CFD54[D_801CFD70].b) / D_801CFD6C;
if (D_801CFD74 >= D_801CFD54[D_801CFD70].r) {
D_801CFD74 -= envR;
} else {
D_801CFD74 += envR;
}
if (D_801CFD78 >= D_801CFD54[D_801CFD70].g) {
D_801CFD78 -= envG;
} else {
D_801CFD78 += envG;
}
if (D_801CFD7C >= D_801CFD54[D_801CFD70].b) {
D_801CFD7C -= envB;
} else {
D_801CFD7C += envB;
}
D_801CFD6C--;
if (D_801CFD6C == 0) {
D_801CFD60 = D_801CFD48[D_801CFD70].r;
D_801CFD64 = D_801CFD48[D_801CFD70].g;
D_801CFD68 = D_801CFD48[D_801CFD70].b;
D_801CFD74 = D_801CFD54[D_801CFD70].r;
D_801CFD78 = D_801CFD54[D_801CFD70].g;
D_801CFD7C = D_801CFD54[D_801CFD70].b;
D_801CFD6C = 12;
D_801CFD70 ^= 1;
}
gDPPipeSync(gfx++);
gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
gDPSetCombineMode(gfx++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gDPSetPrimColor(gfx++, 0, 0, D_801CFD60, D_801CFD64, D_801CFD68, 120);
gDPFillRectangle(gfx++, arg2 + 3, arg3, arg2 + 29, arg3 + 11);
gDPFillRectangle(gfx++, arg2 + 6, arg3 - 2, arg2 + 26, arg3 + 13);
gDPPipeSync(gfx++);
msgCtx->stateTimer++;
*gfxP = gfx++;
}
}
void Message_HandleChoiceSelection(PlayState* play, u8 numChoices) {
static s16 sAnalogStickHeld = false;
MessageContext* msgCtx = &play->msgCtx;
Input* input = CONTROLLER1(&play->state);
if ((input->rel.stick_y >= 30) && !sAnalogStickHeld) {
sAnalogStickHeld = true;
msgCtx->choiceIndex--;
if (msgCtx->choiceIndex > 128) {
msgCtx->choiceIndex = 0;
} else {
Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else if ((input->rel.stick_y <= -30) && !sAnalogStickHeld) {
sAnalogStickHeld = true;
msgCtx->choiceIndex++;
if (msgCtx->choiceIndex > numChoices) {
msgCtx->choiceIndex = numChoices;
} else {
Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else if (ABS_ALT(input->rel.stick_y) < 30) {
sAnalogStickHeld = false;
}
}
void func_80148CBC(PlayState* play, Gfx** gfxP, u8 arg2) {
MessageContext* msgCtx = &play->msgCtx;
msgCtx->textPosX = 48;
if (arg2 == 1) {
msgCtx->textPosY = msgCtx->unk11FFE[1 + msgCtx->choiceIndex];
} else {
msgCtx->textPosY = msgCtx->unk11FFE[msgCtx->choiceIndex];
}
Message_DrawTextboxIcon(play, gfxP, msgCtx->textPosX, msgCtx->textPosY);
}
void func_80148D64(PlayState* play) {
static s16 sAnalogStickHeld = false;
MessageContext* msgCtx = &play->msgCtx;
if (play->msgCtx.stickAdjY <= -30) {
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]--;
if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] < '0') {
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '9';
}
Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
} else if (msgCtx->stickAdjY >= 30) {
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]++;
if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] > '9') {
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '0';
}
Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
} else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) {
sAnalogStickHeld = true;
msgCtx->unk120C2++;
if (msgCtx->unk120C2 > 2) {
msgCtx->unk120C2 = 2;
} else {
Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) {
sAnalogStickHeld = true;
msgCtx->unk120C2--;
if (msgCtx->unk120C2 < 0) {
msgCtx->unk120C2 = 0;
} else {
Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else {
sAnalogStickHeld = false;
}
msgCtx->rupeesSelected = (msgCtx->decodedBuffer.schar[msgCtx->unk120C0] - '0') * 100;
msgCtx->rupeesSelected += (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + 1] - '0') * 10;
msgCtx->rupeesSelected += msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + 2] - '0';
}
void func_80149048(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
if (msgCtx->stickAdjY <= -30) {
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]--;
if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] < '0') {
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '9';
}
Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
} else if (msgCtx->stickAdjY >= 30) {
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2]++;
if (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] > '9') {
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = '0';
}
Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
}
msgCtx->rupeesSelected = (msgCtx->decodedBuffer.schar[msgCtx->unk120C0] - '0') * 10;
}
void func_801491DC(PlayState* play) {
static s16 sAnalogStickHeld = false;
MessageContext* msgCtx = &play->msgCtx;
if (msgCtx->stickAdjY <= -30) {
msgCtx->unk12054[msgCtx->unk120C2]--;
if (msgCtx->unk12054[msgCtx->unk120C2] <= 0) {
msgCtx->unk12054[msgCtx->unk120C2] = 5;
}
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0';
Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
} else if (msgCtx->stickAdjY >= 30) {
msgCtx->unk12054[msgCtx->unk120C2]++;
if (msgCtx->unk12054[msgCtx->unk120C2] > 5) {
msgCtx->unk12054[msgCtx->unk120C2] = 1;
}
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0';
Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
} else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) {
sAnalogStickHeld = true;
msgCtx->unk120C2++;
if (msgCtx->unk120C2 > 4) {
msgCtx->unk120C2 = 4;
} else {
Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) {
sAnalogStickHeld = true;
msgCtx->unk120C2--;
if (msgCtx->unk120C2 < 0) {
msgCtx->unk120C2 = 0;
} else {
Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else {
sAnalogStickHeld = false;
}
}
void func_80149454(PlayState* play) {
static s16 sAnalogStickHeld = false;
MessageContext* msgCtx = &play->msgCtx;
if (msgCtx->stickAdjY <= -30) {
msgCtx->unk12054[msgCtx->unk120C2]--;
if (msgCtx->unk12054[msgCtx->unk120C2] < 0) {
msgCtx->unk12054[msgCtx->unk120C2] = 9;
}
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0';
Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
} else if (msgCtx->stickAdjY >= 30) {
msgCtx->unk12054[msgCtx->unk120C2]++;
if (msgCtx->unk12054[msgCtx->unk120C2] > 9) {
msgCtx->unk12054[msgCtx->unk120C2] = 0;
}
msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '0';
Font_LoadCharNES(play, msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + msgCtx->unk120C2],
msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
} else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) {
sAnalogStickHeld = true;
msgCtx->unk120C2++;
if (msgCtx->unk120C2 > 2) {
msgCtx->unk120C2 = 2;
} else {
Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) {
sAnalogStickHeld = true;
msgCtx->unk120C2--;
if (msgCtx->unk120C2 < 0) {
msgCtx->unk120C2 = 0;
} else {
Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else {
sAnalogStickHeld = false;
}
}
void func_801496C8(PlayState* play) {
static s16 sAnalogStickHeld = false;
MessageContext* msgCtx = &play->msgCtx;
if (play->msgCtx.stickAdjY <= -30) {
msgCtx->unk12054[msgCtx->unk120C2]--;
if (msgCtx->unk12054[msgCtx->unk120C2] < 0) {
msgCtx->unk12054[msgCtx->unk120C2] = 3;
}
msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '';
Font_LoadChar(play, msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2],
msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
} else if (msgCtx->stickAdjY >= 30) {
msgCtx->unk12054[msgCtx->unk120C2]++;
if (msgCtx->unk12054[msgCtx->unk120C2] >= 4) {
msgCtx->unk12054[msgCtx->unk120C2] = 0;
}
msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2] = msgCtx->unk12054[msgCtx->unk120C2] + '';
Font_LoadChar(play, msgCtx->decodedBuffer.wchar[msgCtx->unk120C0 + msgCtx->unk120C2],
msgCtx->unk120C4 + (msgCtx->unk120C2 << 7));
Audio_PlaySfx(NA_SE_SY_RUPY_COUNT);
} else if ((msgCtx->stickAdjX >= 30) && !sAnalogStickHeld) {
sAnalogStickHeld = true;
msgCtx->unk120C2++;
if (msgCtx->unk120C2 > 5) {
msgCtx->unk120C2 = 5;
} else {
Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else if ((msgCtx->stickAdjX <= -30) && !sAnalogStickHeld) {
sAnalogStickHeld = true;
msgCtx->unk120C2--;
if (msgCtx->unk120C2 < 0) {
msgCtx->unk120C2 = 0;
} else {
Audio_PlaySfx(NA_SE_SY_CURSOR);
}
} else {
sAnalogStickHeld = false;
}
}
void Message_DrawTextChar(PlayState* play, TexturePtr texture, Gfx** gfxP) {
MessageContext* msgCtx = &play->msgCtx;
Gfx* gfx = *gfxP;
s16 x = msgCtx->textPosX;
s16 y = msgCtx->textPosY;
gDPPipeSync(gfx++);
gDPLoadTextureBlock_4b(gfx++, texture, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP,
G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
if ((msgCtx->textBoxType != TEXTBOX_TYPE_5) && (msgCtx->textBoxType != TEXTBOX_TYPE_D) &&
!play->pauseCtx.bombersNotebookOpen) {
gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textColorAlpha);
gSPTextureRectangle(gfx++, (x + 1) << 2, (y + 1) << 2, (x + sCharTexSize + 1) << 2, (y + sCharTexSize + 1) << 2,
G_TX_RENDERTILE, 0, 0, sCharTexScale, sCharTexScale);
gDPPipeSync(gfx++);
}
gDPSetPrimColor(gfx++, 0, 0, msgCtx->textColorR, msgCtx->textColorG, msgCtx->textColorB, msgCtx->textColorAlpha);
gSPTextureRectangle(gfx++, x << 2, y << 2, (x + sCharTexSize) << 2, (y + sCharTexSize) << 2, G_TX_RENDERTILE, 0, 0,
sCharTexScale, sCharTexScale);
*gfxP = gfx++;
}
s16 sTextboxWidth = 256;
s16 sTextboxHeight = 64;
s16 sTextboxTexWidth = 1024;
s16 sTextboxTexHeight = 1024;
f32 D_801CFDA4[] = { 0.6f, 0.75f, 0.9f, 1.0f, 1.05f, 1.1f, 1.05f, 1.0f, 1.0f };
f32 D_801CFDC8[] = { 0.6f, 0.75f, 0.9f, 1.0f, 1.05f, 1.1f, 1.05f, 1.0f, 1.0f };
// resizes textboxes when opening them
void Message_GrowTextbox(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
if (!play->pauseCtx.bombersNotebookOpen) {
sTextboxWidth = D_801CFDA4[msgCtx->stateTimer] * 256.0f;
sTextboxTexWidth = 1024.0f / D_801CFDA4[msgCtx->stateTimer];
sTextboxHeight = D_801CFDC8[msgCtx->stateTimer] * 64.0f;
sTextboxTexHeight = 1024.0f / D_801CFDC8[msgCtx->stateTimer];
msgCtx->textboxY = msgCtx->textboxYTarget + ((64 - sTextboxHeight) / 2);
msgCtx->textboxColorAlphaCurrent += msgCtx->textboxColorAlphaTarget / 8;
msgCtx->stateTimer++;
} else {
msgCtx->stateTimer = 8;
sTextboxWidth = 512;
sTextboxTexWidth = 512;
sTextboxHeight = 89;
sTextboxTexHeight = 731;
msgCtx->textboxY = msgCtx->textboxYTarget + ((90 - sTextboxHeight) / 2);
}
if (msgCtx->stateTimer == 8) {
// Reached the end
msgCtx->textboxX = msgCtx->textboxXTarget;
msgCtx->textboxY = msgCtx->textboxYTarget;
msgCtx->msgMode = MSGMODE_TEXT_STARTING;
msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget;
}
if (!play->pauseCtx.bombersNotebookOpen) {
msgCtx->textboxX = msgCtx->textboxXTarget + ((256 - sTextboxWidth) / 2);
} else {
msgCtx->textboxX = msgCtx->textboxXTarget + ((512 - sTextboxWidth) / 2);
}
}
void Message_FindMessage(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
Font* font = &msgCtx->font;
MessageTableEntry* msgEntry = msgCtx->messageTable;
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->messageTable;
foundSegment = msgEntry->segment;
msgEntry++;
nextSegment = msgEntry->segment;
font->messageStart = foundSegment - segment;
font->messageEnd = nextSegment - foundSegment;
}
Color_RGB8 D_801CFDEC[] = {
{ 0, 255, 0 }, { 0, 0, 255 }, { 255, 255, 255 }, { 255, 0, 0 },
{ 255, 0, 255 }, { 255, 255, 255 }, { 255, 100, 0 }, { 0, 0, 0 },
};
s16 D_801CFE04[] = {
150, // ITEM_SONG_SONATA
255, // ITEM_SONG_LULLABY
100, // ITEM_SONG_NOVA
255, // ITEM_SONG_ELEGY
255, // ITEM_SONG_OATH
255, // ITEM_SONG_SARIA
255, // ITEM_SONG_TIME
255, // ITEM_SONG_HEALING
255, // ITEM_SONG_EPONA
255, // ITEM_SONG_SOARING
255, // ITEM_SONG_STORMS
255 // ITEM_SONG_SUN
};
s16 D_801CFE1C[] = {
255, // ITEM_SONG_SONATA
80, // ITEM_SONG_LULLABY
150, // ITEM_SONG_NOVA
160, // ITEM_SONG_ELEGY
100, // ITEM_SONG_OATH
240, // ITEM_SONG_SARIA
255, // ITEM_SONG_TIME
255, // ITEM_SONG_HEALING
255, // ITEM_SONG_EPONA
255, // ITEM_SONG_SOARING
255, // ITEM_SONG_STORMS
255 // ITEM_SONG_SUN
};
s16 D_801CFE34[] = {
100, // ITEM_SONG_SONATA
40, // ITEM_SONG_LULLABY
255, // ITEM_SONG_NOVA
0, // ITEM_SONG_ELEGY
255, // ITEM_SONG_OATH
100, // ITEM_SONG_SARIA
255, // ITEM_SONG_TIME
255, // ITEM_SONG_HEALING
255, // ITEM_SONG_EPONA
255, // ITEM_SONG_SOARING
255, // ITEM_SONG_STORMS
255 // ITEM_SONG_SUN
};
static TexturePtr sStrayFairyIconTextures[] = {
gStrayFairyWoodfallIconTex,
gStrayFairySnowheadIconTex,
gStrayFairyGreatBayIconTex,
gStrayFairyStoneTowerIconTex,
};
static Color_RGB8 sStrayFairyIconPrimColors[] = {
{ 255, 110, 160 },
{ 90, 255, 100 },
{ 120, 255, 255 },
{ 245, 245, 90 },
};
static Color_RGB8 sStrayFairyIconEnvColors[] = {
{ 255, 255, 255 },
{ 255, 255, 255 },
{ 255, 255, 255 },
{ 225, 170, 0 },
};
void Message_DrawItemIcon(PlayState* play, Gfx** gfxP) {
MessageContext* msgCtx = &play->msgCtx;
Gfx* gfx = *gfxP;
s32 index;
msgCtx->unk12016 = msgCtx->unk12014;
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, 255, 255, 255, msgCtx->textColorAlpha);
if (msgCtx->itemId == ITEM_RECOVERY_HEART) {
gDPPipeSync(gfx++);
gDPSetPrimColor(gfx++, 0, 0, 255, 0, 0, msgCtx->textColorAlpha);
gDPSetEnvColor(gfx++, 0, 80, 0, 255);
gDPLoadTextureBlock(gfx++, gHeartFullTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 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);
} else if ((msgCtx->itemId >= ITEM_RUPEE_GREEN) && (msgCtx->itemId <= ITEM_RUPEE_HUGE)) {
index = msgCtx->itemId - ITEM_RUPEE_GREEN;
gDPPipeSync(gfx++);
gDPSetPrimColor(gfx++, 0, 0, D_801CFDEC[index].r, D_801CFDEC[index].g, D_801CFDEC[index].b,
msgCtx->textColorAlpha);
gDPSetEnvColor(gfx++, 0, 80, 0, 255);
gDPLoadTextureBlock(gfx++, gRupeeCounterIconTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 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);
} else if (msgCtx->itemId == ITEM_STRAY_FAIRIES) {
msgCtx->unk12016 = 0x18;
gDPPipeSync(gfx++);
gDPSetPrimColor(gfx++, 0, 0, sStrayFairyIconPrimColors[((void)0, gSaveContext.dungeonIndex)].r,
sStrayFairyIconPrimColors[((void)0, gSaveContext.dungeonIndex)].g,
sStrayFairyIconPrimColors[((void)0, gSaveContext.dungeonIndex)].b, msgCtx->textColorAlpha);
gDPSetEnvColor(gfx++, sStrayFairyIconEnvColors[((void)0, gSaveContext.dungeonIndex)].r,
sStrayFairyIconEnvColors[((void)0, gSaveContext.dungeonIndex)].g,
sStrayFairyIconEnvColors[((void)0, gSaveContext.dungeonIndex)].b, 0);
gDPLoadTextureBlock_4b(gfx++, gStrayFairyGlowingCircleIconTex, G_IM_FMT_I, 32, 24, 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->unk12010 << 2, msgCtx->unk12012 << 2,
(msgCtx->unk12010 + msgCtx->unk12014) << 2, (msgCtx->unk12012 + msgCtx->unk12016) << 2,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, msgCtx->textColorAlpha);
gDPLoadTextureBlock(gfx++, sStrayFairyIconTextures[((void)0, gSaveContext.dungeonIndex)], G_IM_FMT_RGBA,
G_IM_SIZ_32b, 32, 24, 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);
} else if ((msgCtx->itemId >= ITEM_SONG_SONATA) && (msgCtx->itemId <= ITEM_SONG_SUN)) {
index = msgCtx->itemId - ITEM_SONG_SONATA;
gDPSetPrimColor(gfx++, 0, 0, D_801CFE04[index], D_801CFE1C[index], D_801CFE34[index], msgCtx->textColorAlpha);
gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 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);
msgCtx->unk12016 = 0x18;
} else if (msgCtx->itemId == ITEM_CC) {
gDPPipeSync(gfx++);
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 0, msgCtx->textColorAlpha);
gDPSetEnvColor(gfx++, 0, 0, 0, 255);
gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 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);
} else if (msgCtx->itemId >= ITEM_B8) {
gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 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);
} else if (msgCtx->itemId >= ITEM_SKULL_TOKEN) {
gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_32b, 24, 24, 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);
} else {
msgCtx->unk12016 = msgCtx->unk12014;
gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, 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->unk12010 << 2, msgCtx->unk12012 << 2, (msgCtx->unk12010 + msgCtx->unk12014) << 2,
(msgCtx->unk12012 + msgCtx->unk12016) << 2, G_TX_RENDERTILE, 0, 0, D_801F6B08, D_801F6B08);
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
if (!play->pauseCtx.bombersNotebookOpen) {
msgCtx->textPosX += 16;
} else {
msgCtx->textPosX += 50;
}
*gfxP = gfx;
}
void Message_HandleOcarina(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_LONG_RECORDING) {
msgCtx->msgMode = MSGMODE_SCARECROW_LONG_RECORDING_START;
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_LONG_DEMONSTRATION) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
msgCtx->ocarinaStaff->pos = 0;
sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen = 0;
Message_ResetOcarinaButtonState(play);
msgCtx->stateTimer = 3;
msgCtx->msgMode = MSGMODE_SCARECROW_LONG_DEMONSTRATION;
AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_LONG + 1, 1);
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_RECORDING) {
msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_START;
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_DEMONSTRATION) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
msgCtx->ocarinaStaff->pos = 0;
sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen = 0;
Message_ResetOcarinaButtonState(play);
msgCtx->stateTimer = 3;
msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_DEMONSTRATION;
AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_SPAWN + 1, 1);
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_37) {
msgCtx->msgMode = MSGMODE_2F;
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_3A) {
msgCtx->msgMode = MSGMODE_32;
} else if ((msgCtx->ocarinaAction >= OCARINA_ACTION_TIMED_PROMPT_SONATA) &&
(msgCtx->ocarinaAction <= OCARINA_ACTION_TIMED_PROMPT_STORMS)) {
msgCtx->msgMode = MSGMODE_35;
} else if (((msgCtx->ocarinaAction >= OCARINA_ACTION_DEMONSTRATE_SONATA) &&
(msgCtx->ocarinaAction <= OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO)) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_3B) || (msgCtx->ocarinaAction == OCARINA_ACTION_3C) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF)) {
msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION_STARTING;
} else if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_GORON) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_ZORA) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
msgCtx->msgMode = MSGMODE_SONG_PROMPT_STARTING;
} else if ((msgCtx->ocarinaAction == OCARINA_ACTION_0) || (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) ||
(msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_TIME)) {
msgCtx->msgMode = MSGMODE_OCARINA_STARTING;
} else {
msgCtx->msgMode = MSGMODE_SONG_PROMPT_STARTING;
}
}
}
Color_RGB16 D_801CFE74[] = {
{ 255, 120, 0 }, { 70, 255, 80 }, { 80, 110, 255 }, { 255, 255, 30 },
{ 90, 180, 255 }, { 210, 100, 255 }, { 170, 170, 170 }, { 255, 130, 30 },
};
static Color_RGB16 sColorsNormalJPN[] = {
{ 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
{ 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
};
static Color_RGB16 sColorsButtonsJPN[] = {
{ 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_801CFF04[] = {
{ 195, 0, 0 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
{ 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
};
static Color_RGB16 sColorsBombersNotebookJPN[] = {
{ 255, 60, 60 }, { 110, 170, 255 }, { 80, 90, 255 }, { 255, 255, 50 },
{ 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
};
static u8 sButtonColorIndicesJPN[] = { 2, 1, 3, 6, 6, 6, 3, 3, 3, 3, 1, 6 };
#define MESSAGE_ITEM_NONE 9999
void Message_DrawTextDefault(PlayState* play, Gfx** gfxP) {
MessageContext* msgCtx = &play->msgCtx;
u16 j;
Font* font = &play->msgCtx.font;
u16 i;
u16 charTexIndex;
Gfx* gfx = *gfxP;
u16 character;
s16 sp130;
s16 prevR;
s16 prevG;
s16 prevB;
u16 lookAheadCharacter;
play->msgCtx.textPosX = play->msgCtx.unk11F1A[0] + play->msgCtx.unk11FF8;
play->msgCtx.textPosY = play->msgCtx.unk11FFA;
sp130 = 0;
if (play->msgCtx.itemId != MESSAGE_ITEM_NONE) {
Message_DrawItemIcon(play, &gfx);
}
msgCtx->textColorR = msgCtx->unk120C8;
msgCtx->textColorG = msgCtx->unk120CA;
msgCtx->textColorB = msgCtx->unk120CC;
charTexIndex = 0;
for (i = 0; i < msgCtx->textDrawPos; i++) {
character = msgCtx->decodedBuffer.wchar[i];
switch (character) {
case 0x2000:
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 0x2001:
case 0x2002:
case 0x2003:
case 0x2004:
case 0x2005:
case 0x2006:
case 0x2007:
case 0x2008:
if ((msgCtx->msgMode >= MSGMODE_NEW_CYCLE_0) && (msgCtx->msgMode <= MSGMODE_NEW_CYCLE_2) &&
(character == 0x2002)) {
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_801CFE74[(s16)(character - 0x2001)].r + msgCtx->unk120D4 < 0) {
msgCtx->textColorR = 0;
} else {
msgCtx->textColorR = D_801CFE74[(s16)(character - 0x2001)].r + msgCtx->unk120D4;
}
if (D_801CFE74[(s16)(character - 0x2001)].g + msgCtx->unk120D4 >= 255) {
msgCtx->textColorG = D_801CFE74[(s16)(character - 0x2001)].g;
} else {
msgCtx->textColorG = D_801CFE74[(s16)(character - 0x2001)].g + msgCtx->unk120D4;
}
if (D_801CFE74[(s16)(character - 0x2001)].b + msgCtx->unk120D4 < 0) {
msgCtx->textColorB = 0;
} else {
msgCtx->textColorB = D_801CFE74[(s16)(character - 0x2001)].b + msgCtx->unk120D4;
}
} else if (play->pauseCtx.bombersNotebookOpen) {
msgCtx->textColorR = sColorsBombersNotebookJPN[(s16)(character - 0x2001)].r;
msgCtx->textColorG = sColorsBombersNotebookJPN[(s16)(character - 0x2001)].g;
msgCtx->textColorB = sColorsBombersNotebookJPN[(s16)(character - 0x2001)].b;
} else if (msgCtx->textBoxType == TEXTBOX_TYPE_1) {
msgCtx->textColorR = D_801CFE74[(s16)(character - 0x2001)].r;
msgCtx->textColorG = D_801CFE74[(s16)(character - 0x2001)].g;
msgCtx->textColorB = D_801CFE74[(s16)(character - 0x2001)].b;
} else if (msgCtx->textBoxType == TEXTBOX_TYPE_D) {
msgCtx->textColorR = D_801CFF04[(s16)(character - 0x2001)].r;
msgCtx->textColorG = D_801CFF04[(s16)(character - 0x2001)].g;
msgCtx->textColorB = D_801CFF04[(s16)(character - 0x2001)].b;
} else {
msgCtx->textColorR = sColorsNormalJPN[(s16)(character - 0x2001)].r;
msgCtx->textColorG = sColorsNormalJPN[(s16)(character - 0x2001)].g;
msgCtx->textColorB = sColorsNormalJPN[(s16)(character - 0x2001)].b;
}
if ((i + 1) == msgCtx->textDrawPos) {
msgCtx->textDrawPos++;
}
break;
case ' ':
msgCtx->textPosX += 6;
break;
case 0xA:
msgCtx->textPosY += msgCtx->unk11FFC;
// fallthrough
case 0xC:
sp130++;
msgCtx->textPosX = msgCtx->unk11F1A[sp130] + msgCtx->unk11FF8;
if (msgCtx->choiceNum == 1) {
if (!play->pauseCtx.bombersNotebookOpen) {
msgCtx->textPosX += 32;
} else {
msgCtx->textPosX += 57;
}
} else if (msgCtx->choiceNum == 2) {
if (!play->pauseCtx.bombersNotebookOpen) {
msgCtx->textPosX += 22;
} else {
msgCtx->textPosX += 57;
}
}
continue;
case 0x9:
case 0xB:
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 0x101: // 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) {
if ((msgCtx->decodedBuffer.wchar[j] != 0x102) && (msgCtx->decodedBuffer.wchar[j] != 0x104) &&
(msgCtx->decodedBuffer.wchar[j] != 0x103) && (msgCtx->decodedBuffer.wchar[j] != 0x230) &&
(msgCtx->decodedBuffer.wchar[j] != 9) && (msgCtx->decodedBuffer.wchar[j] != 0xB)) {
j++;
continue;
}
break;
}
i = j - 1;
msgCtx->textDrawPos = i + 1;
}
break;
case 0x102: // MESSAGE_QUICKTEXT_DISABLE
break;
case 0x110: // MESSAGE_BOX_BREAK_DELAYED
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
msgCtx->stateTimer = msgCtx->decodedBuffer.wchar[++i];
msgCtx->msgMode = MSGMODE_TEXT_DELAYED_BREAK;
}
*gfxP = gfx;
return;
case 0x111:
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
msgCtx->msgMode = MSGMODE_TEXT_DONE;
if (msgCtx->unk11F0C == 3) {
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_FADE_STAGES_1;
} else {
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_FADE_NORMAL;
}
msgCtx->stateTimer = msgCtx->decodedBuffer.wchar[++i];
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
if (play->csCtx.state == CS_STATE_IDLE) {
func_8011552C(play, DO_ACTION_RETURN);
}
}
*gfxP = gfx;
return;
case 0x112:
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
msgCtx->msgMode = MSGMODE_TEXT_DONE;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_FADE_SKIPPABLE;
msgCtx->stateTimer = msgCtx->decodedBuffer.wchar[++i];
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
if (play->csCtx.state == CS_STATE_IDLE) {
func_8011552C(play, DO_ACTION_RETURN);
}
}
*gfxP = gfx;
return;
case 0x120: // MESSAGE_SFX
if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) {
Audio_PlaySfx(msgCtx->decodedBuffer.wchar[i + 1]);
}
if ((i + 1) == msgCtx->textDrawPos) {
msgCtx->textDrawPos++;
}
i++;
break;
case 0x128:
if (((i + 1) == msgCtx->textDrawPos) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING)) {
msgCtx->msgMode = MSGMODE_9;
msgCtx->textDelayTimer = msgCtx->decodedBuffer.wchar[i + 1];
}
i++;
break;
case 0x130:
case 0x131:
case 0x132:
case 0x133:
case 0x134:
case 0x135:
case 0x136:
msgCtx->textDelay = character - 0x130;
if ((i + 1) == msgCtx->textDrawPos) {
msgCtx->textDrawPos++;
}
break;
case 0x201: // MESSAGE_BACKGROUND
msgCtx->textPosX = 45;
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 + 96) << 2, (msgCtx->unk12012 + 49) << 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 + 96) << 2, (msgCtx->unk12012 + 1) << 2,
(msgCtx->textPosX + 193) << 2, (msgCtx->unk12012 + 49) << 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 + 96) << 2,
(msgCtx->unk12012 + 48) << 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 + 96) << 2, msgCtx->unk12012 << 2,
(msgCtx->textPosX + 192) << 2, (msgCtx->unk12012 + 48) << 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 0x202:
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_TWO_CHOICE;
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
msgCtx->choiceTextId = msgCtx->currentTextId;
msgCtx->stateTimer = 4;
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 2);
}
break;
case 0x203:
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_THREE_CHOICE;
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
msgCtx->choiceTextId = msgCtx->currentTextId;
msgCtx->stateTimer = 4;
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 2);
}
break;
case 0x20C:
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_INPUT_BANK;
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
}
break;
case 0x220:
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_INPUT_DOGGY_RACETRACK_BET;
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
}
break;
case 0x221:
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_INPUT_BOMBER_CODE;
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
}
break;
case 0x222:
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
msgCtx->msgMode = MSGMODE_TEXT_DONE;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_PAUSE_MENU;
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 0);
Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
}
break;
case 0x225:
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_INPUT_LOTTERY_CODE;
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
}
break;
case 0x240:
case 0x500:
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 == TEXTBOX_ENDTYPE_DEFAULT) {
Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
if (character == 0x500) {
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 0x104:
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
Audio_PlaySfx(NA_SE_NONE);
msgCtx->msgMode = MSGMODE_TEXT_DONE;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_PERSISTENT;
}
*gfxP = gfx;
return;
case 0x103:
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
msgCtx->msgMode = MSGMODE_TEXT_DONE;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_EVENT;
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 0);
Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
}
*gfxP = gfx;
return;
case 0x230:
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
msgCtx->msgMode = MSGMODE_TEXT_DONE;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_EVENT2;
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
}
*gfxP = gfx;
return;
default:
switch (character) {
case '':
case '':
msgCtx->textPosX -= TRUNCF_BINANG(6.0f * msgCtx->textCharScale);
break;
case '':
msgCtx->textPosX -= TRUNCF_BINANG(3.0f * msgCtx->textCharScale);
break;
case '':
case '':
msgCtx->textPosX -= TRUNCF_BINANG(2.0f * msgCtx->textCharScale);
break;
default:
break;
}
if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && ((i + 1) == msgCtx->textDrawPos)) {
Audio_PlaySfx(NA_SE_NONE);
}
if ((character >= 0x839F) && (character < 0x83AB)) {
prevR = msgCtx->textColorR;
prevG = msgCtx->textColorG;
prevB = msgCtx->textColorB;
msgCtx->textColorR = sColorsButtonsJPN[(s16)sButtonColorIndicesJPN[character - 0x839F]].r;
msgCtx->textColorG = sColorsButtonsJPN[(s16)sButtonColorIndicesJPN[character - 0x839F]].g;
msgCtx->textColorB = sColorsButtonsJPN[(s16)sButtonColorIndicesJPN[character - 0x839F]].b;
Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
msgCtx->textColorR = prevR;
msgCtx->textColorG = prevG;
msgCtx->textColorB = prevB;
} else {
Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
}
charTexIndex += FONT_CHAR_TEX_SIZE;
switch (character) {
case '':
msgCtx->textPosX += TRUNCF_BINANG(8.0f * msgCtx->textCharScale);
break;
case '':
case '':
msgCtx->textPosX += TRUNCF_BINANG(10.0f * msgCtx->textCharScale);
break;
case '':
case '':
case '':
msgCtx->textPosX += TRUNCF_BINANG(12.0f * msgCtx->textCharScale);
break;
case '':
msgCtx->textPosX += TRUNCF_BINANG(14.0f * msgCtx->textCharScale);
break;
case '':
msgCtx->textPosX += TRUNCF_BINANG(15.0f * msgCtx->textCharScale);
break;
default:
if ((msgCtx->msgMode >= MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND) &&
(msgCtx->msgMode <= MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND)) {
msgCtx->textPosX += TRUNCF_BINANG((16.0f * msgCtx->textCharScale) - 1.0f);
} else {
msgCtx->textPosX += TRUNCF_BINANG(16.0f * 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;
}
s16 D_801CFF70[LANGUAGE_MAX] = {
4, // LANGUAGE_JPN
0x12, // LANGUAGE_ENG
0x12, // LANGUAGE_GER
0x12, // LANGUAGE_FRE
0x12, // LANGUAGE_SPA
};
s16 D_801CFF7C[LANGUAGE_MAX] = {
0, // LANGUAGE_JPN
0xE, // LANGUAGE_ENG
0xE, // LANGUAGE_GER
0xE, // LANGUAGE_FRE
0xE, // LANGUAGE_SPA
};
s16 D_801CFF88[LANGUAGE_MAX] = {
0, // LANGUAGE_JPN
0x16, // LANGUAGE_ENG
0x16, // LANGUAGE_GER
0x16, // LANGUAGE_FRE
0x16, // LANGUAGE_SPA
};
s16 D_801CFF94[] = {
/* 0x00 */ MESSAGE_ITEM_NONE,
/* 0x01 */ ITEM_RUPEE_GREEN,
/* 0x02 */ ITEM_RUPEE_BLUE,
/* 0x03 */ ITEM_RUPEE_10,
/* 0x04 */ ITEM_RUPEE_RED,
/* 0x05 */ ITEM_RUPEE_PURPLE,
/* 0x06 */ ITEM_RUPEE_SILVER,
/* 0x07 */ ITEM_RUPEE_HUGE,
/* 0x08 */ ITEM_WALLET_ADULT,
/* 0x09 */ ITEM_WALLET_GIANT,
/* 0x0A */ ITEM_RECOVERY_HEART,
/* 0x0B */ ITEM_RECOVERY_HEART,
/* 0x0C */ ITEM_HEART_PIECE,
/* 0x0D */ ITEM_HEART_CONTAINER,
/* 0x0E */ ITEM_MAGIC_JAR_SMALL,
/* 0x0F */ ITEM_MAGIC_JAR_BIG,
/* 0x10 */ ITEM_RECOVERY_HEART,
/* 0x11 */ ITEM_STRAY_FAIRIES,
/* 0x12 */ ITEM_RECOVERY_HEART,
/* 0x13 */ ITEM_RECOVERY_HEART,
/* 0x14 */ ITEM_BOMB,
/* 0x15 */ ITEM_BOMB,
/* 0x16 */ ITEM_BOMB,
/* 0x17 */ ITEM_BOMB,
/* 0x18 */ ITEM_BOMB,
/* 0x19 */ ITEM_DEKU_STICK,
/* 0x1A */ ITEM_BOMBCHU,
/* 0x1B */ ITEM_BOMB_BAG_20,
/* 0x1C */ ITEM_BOMB_BAG_30,
/* 0x1D */ ITEM_BOMB_BAG_40,
/* 0x1E */ ITEM_BOW,
/* 0x1F */ ITEM_BOW,
/* 0x20 */ ITEM_BOW,
/* 0x21 */ ITEM_BOW,
/* 0x22 */ ITEM_QUIVER_30,
/* 0x23 */ ITEM_QUIVER_40,
/* 0x24 */ ITEM_QUIVER_50,
/* 0x25 */ ITEM_ARROW_FIRE,
/* 0x26 */ ITEM_ARROW_ICE,
/* 0x27 */ ITEM_ARROW_LIGHT,
/* 0x28 */ ITEM_DEKU_NUT,
/* 0x29 */ ITEM_DEKU_NUT,
/* 0x2A */ ITEM_DEKU_NUT,
/* 0x2B */ MESSAGE_ITEM_NONE,
/* 0x2C */ MESSAGE_ITEM_NONE,
/* 0x2D */ MESSAGE_ITEM_NONE,
/* 0x2E */ MESSAGE_ITEM_NONE,
/* 0x2F */ ITEM_DEKU_STICK_UPGRADE_20,
/* 0x30 */ MESSAGE_ITEM_NONE,
/* 0x31 */ MESSAGE_ITEM_NONE,
/* 0x32 */ ITEM_SHIELD_HERO,
/* 0x33 */ ITEM_SHIELD_MIRROR,
/* 0x34 */ ITEM_POWDER_KEG,
/* 0x35 */ ITEM_MAGIC_BEANS,
/* 0x36 */ ITEM_PICTOGRAPH_BOX,
/* 0x37 */ ITEM_SWORD_KOKIRI,
/* 0x38 */ ITEM_SWORD_RAZOR,
/* 0x39 */ ITEM_SWORD_GILDED,
/* 0x3A */ ITEM_SWORD_DEITY,
/* 0x3B */ ITEM_SWORD_GREAT_FAIRY,
/* 0x3C */ ITEM_KEY_SMALL,
/* 0x3D */ ITEM_KEY_BOSS,
/* 0x3E */ ITEM_DUNGEON_MAP,
/* 0x3F */ ITEM_COMPASS,
/* 0x40 */ ITEM_POWDER_KEG,
/* 0x41 */ ITEM_HOOKSHOT,
/* 0x42 */ ITEM_LENS_OF_TRUTH,
/* 0x43 */ ITEM_PICTOGRAPH_BOX,
/* 0x44 */ ITEM_FISHING_ROD,
/* 0x45 */ MESSAGE_ITEM_NONE,
/* 0x46 */ MESSAGE_ITEM_NONE,
/* 0x47 */ MESSAGE_ITEM_NONE,
/* 0x48 */ MESSAGE_ITEM_NONE,
/* 0x49 */ MESSAGE_ITEM_NONE,
/* 0x4A */ MESSAGE_ITEM_NONE,
/* 0x4B */ MESSAGE_ITEM_NONE,
/* 0x4C */ ITEM_OCARINA_OF_TIME,
/* 0x4D */ MESSAGE_ITEM_NONE,
/* 0x4E */ MESSAGE_ITEM_NONE,
/* 0x4F */ MESSAGE_ITEM_NONE,
/* 0x50 */ ITEM_BOMBERS_NOTEBOOK,
/* 0x51 */ MESSAGE_ITEM_NONE,
/* 0x52 */ ITEM_SKULL_TOKEN,
/* 0x53 */ MESSAGE_ITEM_NONE,
/* 0x54 */ MESSAGE_ITEM_NONE,
/* 0x55 */ ITEM_REMAINS_ODOLWA,
/* 0x56 */ ITEM_REMAINS_GOHT,
/* 0x57 */ ITEM_REMAINS_GYORG,
/* 0x58 */ ITEM_REMAINS_TWINMOLD,
/* 0x59 */ ITEM_POTION_RED,
/* 0x5A */ ITEM_BOTTLE,
/* 0x5B */ ITEM_POTION_RED,
/* 0x5C */ ITEM_POTION_GREEN,
/* 0x5D */ ITEM_POTION_BLUE,
/* 0x5E */ ITEM_FAIRY,
/* 0x5F */ ITEM_DEKU_PRINCESS,
/* 0x60 */ ITEM_MILK_BOTTLE,
/* 0x61 */ ITEM_MILK_HALF,
/* 0x62 */ ITEM_FISH,
/* 0x63 */ ITEM_BUG,
/* 0x64 */ ITEM_BLUE_FIRE,
/* 0x65 */ ITEM_POE,
/* 0x66 */ ITEM_BIG_POE,
/* 0x67 */ ITEM_SPRING_WATER,
/* 0x68 */ ITEM_HOT_SPRING_WATER,
/* 0x69 */ ITEM_ZORA_EGG,
/* 0x6A */ ITEM_GOLD_DUST,
/* 0x6B */ ITEM_MUSHROOM,
/* 0x6C */ MESSAGE_ITEM_NONE,
/* 0x6D */ MESSAGE_ITEM_NONE,
/* 0x6E */ ITEM_SEAHORSE,
/* 0x6F */ ITEM_CHATEAU,
/* 0x70 */ ITEM_HYLIAN_LOACH,
/* 0x71 */ MESSAGE_ITEM_NONE,
/* 0x72 */ MESSAGE_ITEM_NONE,
/* 0x73 */ MESSAGE_ITEM_NONE,
/* 0x74 */ MESSAGE_ITEM_NONE,
/* 0x75 */ MESSAGE_ITEM_NONE,
/* 0x76 */ MESSAGE_ITEM_NONE,
/* 0x77 */ MESSAGE_ITEM_NONE,
/* 0x78 */ ITEM_MASK_DEKU,
/* 0x79 */ ITEM_MASK_GORON,
/* 0x7A */ ITEM_MASK_ZORA,
/* 0x7B */ ITEM_MASK_FIERCE_DEITY,
/* 0x7C */ ITEM_MASK_TRUTH,
/* 0x7D */ ITEM_MASK_KAFEIS_MASK,
/* 0x7E */ ITEM_MASK_ALL_NIGHT,
/* 0x7F */ ITEM_MASK_BUNNY,
/* 0x80 */ ITEM_MASK_KEATON,
/* 0x81 */ ITEM_MASK_GARO,
/* 0x82 */ ITEM_MASK_ROMANI,
/* 0x83 */ ITEM_MASK_CIRCUS_LEADER,
/* 0x84 */ ITEM_MASK_POSTMAN,
/* 0x85 */ ITEM_MASK_COUPLE,
/* 0x86 */ ITEM_MASK_GREAT_FAIRY,
/* 0x87 */ ITEM_MASK_GIBDO,
/* 0x88 */ ITEM_MASK_DON_GERO,
/* 0x89 */ ITEM_MASK_KAMARO,
/* 0x8A */ ITEM_MASK_CAPTAIN,
/* 0x8B */ ITEM_MASK_STONE,
/* 0x8C */ ITEM_MASK_BREMEN,
/* 0x8D */ ITEM_MASK_BLAST,
/* 0x8E */ ITEM_MASK_SCENTS,
/* 0x8F */ ITEM_MASK_GIANT,
/* 0x90 */ MESSAGE_ITEM_NONE,
/* 0x91 */ ITEM_CHATEAU,
/* 0x92 */ ITEM_MILK_BOTTLE,
/* 0x93 */ ITEM_GOLD_DUST,
/* 0x94 */ ITEM_HYLIAN_LOACH,
/* 0x95 */ ITEM_SEAHORSE,
/* 0x96 */ ITEM_MOONS_TEAR,
/* 0x97 */ ITEM_DEED_LAND,
/* 0x98 */ ITEM_DEED_SWAMP,
/* 0x99 */ ITEM_DEED_MOUNTAIN,
/* 0x9A */ ITEM_DEED_OCEAN,
/* 0x9B */ MESSAGE_ITEM_NONE,
/* 0x9C */ MESSAGE_ITEM_NONE,
/* 0x9D */ MESSAGE_ITEM_NONE,
/* 0x9E */ MESSAGE_ITEM_NONE,
/* 0x9F */ MESSAGE_ITEM_NONE,
/* 0xA0 */ ITEM_ROOM_KEY,
/* 0xA1 */ ITEM_LETTER_MAMA,
/* 0xA2 */ MESSAGE_ITEM_NONE,
/* 0xA3 */ MESSAGE_ITEM_NONE,
/* 0xA4 */ MESSAGE_ITEM_NONE,
/* 0xA5 */ MESSAGE_ITEM_NONE,
/* 0xA6 */ MESSAGE_ITEM_NONE,
/* 0xA7 */ MESSAGE_ITEM_NONE,
/* 0xA8 */ MESSAGE_ITEM_NONE,
/* 0xA9 */ MESSAGE_ITEM_NONE,
/* 0xAA */ ITEM_LETTER_TO_KAFEI,
/* 0xAB */ ITEM_PENDANT_OF_MEMORIES,
/* 0xAC */ MESSAGE_ITEM_NONE,
/* 0xAD */ MESSAGE_ITEM_NONE,
/* 0xAE */ MESSAGE_ITEM_NONE,
/* 0xAF */ MESSAGE_ITEM_NONE,
/* 0xB0 */ MESSAGE_ITEM_NONE,
/* 0xB1 */ MESSAGE_ITEM_NONE,
/* 0xB2 */ MESSAGE_ITEM_NONE,
/* 0xB3 */ ITEM_TINGLE_MAP,
/* 0xB4 */ ITEM_TINGLE_MAP,
/* 0xB5 */ ITEM_TINGLE_MAP,
/* 0xB6 */ ITEM_TINGLE_MAP,
/* 0xB7 */ ITEM_TINGLE_MAP,
/* 0xB8 */ ITEM_TINGLE_MAP,
/* 0xB9 */ ITEM_TINGLE_MAP,
/* 0xBA */ MESSAGE_ITEM_NONE,
/* 0xBB */ MESSAGE_ITEM_NONE,
/* 0xBC */ MESSAGE_ITEM_NONE,
/* 0xBD */ MESSAGE_ITEM_NONE,
/* 0xBE */ MESSAGE_ITEM_NONE,
/* 0xBF */ MESSAGE_ITEM_NONE,
/* 0xC0 */ MESSAGE_ITEM_NONE,
/* 0xC1 */ MESSAGE_ITEM_NONE,
/* 0xC2 */ MESSAGE_ITEM_NONE,
/* 0xC3 */ MESSAGE_ITEM_NONE,
/* 0xC4 */ MESSAGE_ITEM_NONE,
/* 0xC5 */ MESSAGE_ITEM_NONE,
/* 0xC6 */ MESSAGE_ITEM_NONE,
/* 0xC7 */ MESSAGE_ITEM_NONE,
/* 0xC8 */ ITEM_SONG_SONATA,
/* 0xC9 */ ITEM_SONG_SONATA,
/* 0xCA */ ITEM_SONG_SONATA,
/* 0xCB */ ITEM_SONG_LULLABY,
/* 0xCC */ ITEM_SONG_NOVA,
/* 0xCD */ ITEM_SONG_ELEGY,
/* 0xCE */ ITEM_SONG_OATH,
/* 0xCF */ ITEM_SONG_SARIA,
/* 0xD0 */ ITEM_SONG_TIME,
/* 0xD1 */ ITEM_SONG_HEALING,
/* 0xD2 */ ITEM_SONG_EPONA,
/* 0xD3 */ ITEM_SONG_SOARING,
/* 0xD4 */ ITEM_SONG_STORMS,
/* 0xD5 */ ITEM_SONG_SUN,
/* 0xD6 */ ITEM_SONG_LULLABY,
/* 0xD7 */ ITEM_SONG_SONATA,
/* 0xD8 */ ITEM_SONG_SONATA,
/* 0xD9 */ ITEM_SONG_SONATA,
/* 0xDA */ ITEM_SONG_LULLABY,
/* 0xDB */ ITEM_SONG_NOVA,
/* 0xDC */ ITEM_B8,
/* 0xDD */ ITEM_B9,
/* 0xDE */ ITEM_BA,
/* 0xDF */ ITEM_BB,
/* 0xE0 */ ITEM_BC,
/* 0xE1 */ ITEM_BD,
/* 0xE2 */ ITEM_BE,
/* 0xE3 */ ITEM_BF,
/* 0xE4 */ ITEM_C0,
/* 0xE5 */ ITEM_C1,
/* 0xE6 */ ITEM_C2,
/* 0xE7 */ ITEM_C3,
/* 0xE8 */ ITEM_C4,
/* 0xE9 */ ITEM_C5,
/* 0xEA */ ITEM_C6,
/* 0xEB */ ITEM_C7,
/* 0xEC */ ITEM_C8,
/* 0xED */ ITEM_C9,
/* 0xEE */ ITEM_CA,
/* 0xEF */ ITEM_CB,
/* 0xF0 */ ITEM_CC,
/* 0xF1 */ MESSAGE_ITEM_NONE,
/* 0xF2 */ MESSAGE_ITEM_NONE,
/* 0xF3 */ MESSAGE_ITEM_NONE,
/* 0xF4 */ MESSAGE_ITEM_NONE,
/* 0xF5 */ MESSAGE_ITEM_NONE,
/* 0xF6 */ MESSAGE_ITEM_NONE,
/* 0xF7 */ MESSAGE_ITEM_NONE,
/* 0xF8 */ MESSAGE_ITEM_NONE,
/* 0xF9 */ MESSAGE_ITEM_NONE,
};
void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 arg2) {
MessageContext* msgCtx = &play->msgCtx;
u16* new_var2 = &itemId;
if (itemId == ITEM_RECOVERY_HEART) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 0xA);
msgCtx->unk12014 = 0x10;
} else if ((itemId >= ITEM_RUPEE_GREEN) && (itemId <= ITEM_RUPEE_HUGE)) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 0xA);
msgCtx->unk12014 = 0x10;
} else if (itemId == ITEM_STRAY_FAIRIES) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 0xA);
msgCtx->unk12014 = 0x20;
} else if ((itemId >= ITEM_SONG_SONATA) && (itemId <= ITEM_SONG_SUN)) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 0xA);
msgCtx->unk12014 = 0x10;
CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), ITEM_SONG_SONATA, msgCtx->textboxSegment + 0x1000,
0x180);
} else if (itemId == ITEM_BOMBERS_NOTEBOOK) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 6);
msgCtx->unk12014 = 0x20;
CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), ITEM_SONG_SONATA, msgCtx->textboxSegment + 0x1000,
0x1000);
} else if (itemId <= ITEM_REMAINS_TWINMOLD) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 6);
msgCtx->unk12014 = 0x20;
CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), itemId, msgCtx->textboxSegment + 0x1000, 0x1000);
} else if (itemId == ITEM_CC) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 8);
msgCtx->unk12014 = 0x20;
CmpDma_LoadFile(SEGMENT_ROM_START(schedule_dma_static_yar), ITEM_POTION_BLUE, msgCtx->textboxSegment + 0x1000,
0x400);
} else if (itemId >= ITEM_B8) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 8);
msgCtx->unk12014 = 0x20;
CmpDma_LoadFile(SEGMENT_ROM_START(schedule_dma_static_yar), (itemId - ITEM_B8), msgCtx->textboxSegment + 0x1000,
0x800);
} else if (itemId >= ITEM_SKULL_TOKEN) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF7C[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 0xA);
msgCtx->unk12014 = 0x18;
CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_24_static_yar), (itemId - ITEM_SKULL_TOKEN),
msgCtx->textboxSegment + 0x1000, 0x900);
}
if (play->pauseCtx.bombersNotebookOpen) {
msgCtx->unk12010 = ((msgCtx->unk12010 * 1.4f) + 2.0f);
msgCtx->unk12014 = (msgCtx->unk12014 * 1.4f);
}
msgCtx->choiceNum = 1;
}
void Message_LoadChar(PlayState* play, u16 codePointIndex, s32* offset, f32* arg3, s16 decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
s32 temp1 = *offset;
f32 temp2 = *arg3;
Font_LoadChar(play, codePointIndex, temp1);
msgCtx->decodedBuffer.wchar[decodedBufPos] = codePointIndex;
temp1 += FONT_CHAR_TEX_SIZE;
temp2 += (16.0f * msgCtx->textCharScale);
*offset = temp1;
*arg3 = temp2;
}
void Message_LoadRupeesJPN(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) {
MessageContext* msgCtx = &play->msgCtx;
s16 t = *decodedBufPos;
s32 k = *offset;
f32 f = *arg3;
Font_LoadChar(play, '', k);
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = '';
t++;
Font_LoadChar(play, '', k);
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = '';
t++;
Font_LoadChar(play, '', k);
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = '';
f += 16.0f * msgCtx->textCharScale * 3.0f;
*decodedBufPos = t;
*offset = k;
*arg3 = f;
}
/*
* offsetting to actual codepoints is done outside this function
* every digit will be added 0x824F ('') to get an actual S-JIS
* printable character.
*/
void Message_GetTimerDigits(OSTime time, s16 digits[8]) {
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;
}
void Message_DecodeHeader(PlayState* play) {
Font* font;
MessageContext* msgCtx = &play->msgCtx;
font = &msgCtx->font;
if (msgCtx->msgBufPos == 0) {
if (font->msgBuf.schar[msgCtx->msgBufPos + 2] != 0xFE) {
msgCtx->unk11F18 = 0;
if ((msgCtx->currentTextId == 0x176F) || (msgCtx->currentTextId == 0x1770) ||
(msgCtx->currentTextId == 0x1771)) {
msgCtx->itemId = ITEM_OCARINA_OF_TIME;
msgCtx->msgBufPos += 2;
} else {
msgCtx->msgBufPos += 2;
if ((font->msgBuf.schar[msgCtx->msgBufPos] < 0xC8) || (font->msgBuf.schar[msgCtx->msgBufPos] >= 0xD8)) {
msgCtx->itemId = D_801CFF94[(u8)font->msgBuf.schar[msgCtx->msgBufPos]];
} else {
msgCtx->itemId = 0xFE;
}
}
} else {
msgCtx->msgBufPos += 2;
msgCtx->itemId = font->msgBuf.schar[msgCtx->msgBufPos];
}
msgCtx->nextTextId = font->msgBuf.schar[++msgCtx->msgBufPos] << 8;
msgCtx->nextTextId |= font->msgBuf.schar[++msgCtx->msgBufPos];
msgCtx->unk1206C = font->msgBuf.schar[++msgCtx->msgBufPos] << 8;
msgCtx->unk1206C |= font->msgBuf.schar[++msgCtx->msgBufPos];
msgCtx->unk12070 = font->msgBuf.schar[++msgCtx->msgBufPos] << 8;
msgCtx->unk12070 |= font->msgBuf.schar[++msgCtx->msgBufPos];
msgCtx->unk12074 = font->msgBuf.schar[++msgCtx->msgBufPos] << 8;
msgCtx->unk12074 |= font->msgBuf.schar[++msgCtx->msgBufPos];
msgCtx->msgBufPos++;
if (msgCtx->itemId != 0xFE) {
Message_LoadItemIcon(play, msgCtx->itemId, msgCtx->textboxY + 10);
}
}
}
void Message_LoadTime(PlayState* play, u16 curChar, s32* offset, f32* arg3, s16* decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
s16 i;
s16 p = *decodedBufPos;
s32 o = *offset;
f32 f = *arg3;
u32 dayTime;
s16 digits[4];
f32 timeInMinutes;
if (curChar == 0x20F) {
dayTime = TIME_UNTIL_MOON_CRASH;
} else {
dayTime = TIME_UNTIL_NEW_DAY;
}
timeInMinutes = TIME_TO_MINUTES_F(dayTime);
digits[0] = 0;
digits[1] = (timeInMinutes / 60.0f);
while (digits[1] >= 10) {
digits[0]++;
digits[1] -= 10;
}
digits[2] = 0;
digits[3] = (s32)timeInMinutes % 60;
while (digits[3] >= 10) {
digits[2]++;
digits[3] -= 10;
}
for (i = 0; i < 4; i++) {
Font_LoadChar(play, digits[i] + '', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[p] = digits[i] + '';
p++;
if (i == 1) {
// Hours (時間)
Font_LoadChar(play, '', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[p] = '';
p++;
Font_LoadChar(play, '', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[p] = '';
p++;
} else if (i == 3) {
// Minutes (分)
Font_LoadChar(play, '', o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[p] = '';
}
}
f += 7.0f * (16.0f * msgCtx->textCharScale);
*decodedBufPos = p;
*offset = o;
*arg3 = f;
}
#define GREAT_BAY_COAST_STR \
{ 'グ', 'レ', 'ー', 'ト', 'ベ', 'イ', 'の', '海', '岸' }
#define ZORA_CAPE_STR \
{ 'ゾ', 'ー', 'ラ', 'の', 'み', 'さ', 'き' }
#define SNOWHEAD_STR \
{ 'ス', '', 'ー', 'ヘ', 'ッ', 'ド' }
#define MOUNTAIN_VILLAGE_STR \
{ '山', '里' }
#define CLOCK_TOWN_STR \
{ 'ク', 'ロ', 'ッ', 'ク', 'タ', 'ウ', 'ン' }
#define MILK_ROAD_STR \
{ 'ミ', 'ル', 'ク', 'ロ', 'ー', 'ド' }
#define WOODFALL_STR \
{ 'ウ', 'ッ', 'ド', 'フ', 'ォ', 'ー', 'ル' }
#define SOUTHERN_SWAMP_STR \
{ '沼', '地' }
#define IKANA_CANYON_STR \
{ 'イ', 'カ', 'ー', 'ナ', '渓', '谷' }
#define STONE_TOWER_STR \
{ 'ロ', 'ッ', 'ク', 'ビ', 'ル' }
#define ENTRANCE_STR \
{ '入', 'り', '口' }
u16 sOwlWarpTextJPN[OWL_WARP_MAX][9] = {
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 sOwlWarpTextLengthJPN[OWL_WARP_MAX] = {
9, // OWL_WARP_GREAT_BAY_COAST
7, // OWL_WARP_ZORA_CAPE
6, // OWL_WARP_SNOWHEAD
2, // OWL_WARP_MOUNTAIN_VILLAGE
7, // OWL_WARP_CLOCK_TOWN
6, // OWL_WARP_MILK_ROAD
7, // OWL_WARP_WOODFALL
2, // OWL_WARP_SOUTHERN_SWAMP
6, // OWL_WARP_IKANA_CANYON
5, // OWL_WARP_STONE_TOWER
3, // OWL_WARP_ENTRANCE
};
void Message_LoadOwlWarpText(PlayState* play, s32* offset, f32* arg2, s16* decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
PauseContext* pauseCtx = &play->pauseCtx;
s16 stringLimit;
s16 curDecodedBufPos = *decodedBufPos;
s32 temp_s2 = *offset;
f32 sp3C = *arg2;
s16 owlWarpId;
s16 i;
if (func_8010A0A4(play) || (play->sceneId == SCENE_SECOM)) {
owlWarpId = OWL_WARP_ENTRANCE;
} else {
owlWarpId = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
}
stringLimit = sOwlWarpTextLengthJPN[owlWarpId];
for (i = 0; i < stringLimit; i++, curDecodedBufPos++, temp_s2 += FONT_CHAR_TEX_SIZE) {
msgCtx->decodedBuffer.wchar[curDecodedBufPos] = sOwlWarpTextJPN[owlWarpId][i];
Font_LoadChar(play, sOwlWarpTextJPN[owlWarpId][i], temp_s2);
}
curDecodedBufPos--;
sp3C += (stringLimit - 1) * (16.0f * msgCtx->textCharScale);
*decodedBufPos = curDecodedBufPos;
*offset = temp_s2;
*arg2 = sp3C;
}
u16 sTimeSpeedTextJPN[][3] = {
{ '', '', '' },
{ '', '', '' },
{ '', '', '' },
};
u16 sMaskCodeColorCmdJPN[] = { 0x2001, 0x2003, 0x2004, 0x2002 };
// Counterpart to NES sMaskCodeTextENG
u16 sMaskCodeTextJPN[] = { '', '', '', '' };
void Message_Decode(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Font* font = &msgCtx->font;
Player* player = GET_PLAYER(play);
s16 decodedBufPos;
s16 loadChar;
u32 timeToMoonCrash;
s16 var_v0;
s16 numLines;
s16 value;
s16 digits[5];
s16 spD2;
f32 timeInSeconds;
s32 charTexIndex;
u8* fontBuf;
f32 spC0;
s16 index;
s16 playerNameLen;
s16 spAC[8];
f32 var_fs0;
s16 i;
u16 curChar;
u8 index2 = 0;
msgCtx->textDelayTimer = 0;
msgCtx->textDelay = msgCtx->textDelayTimer;
msgCtx->textFade = 0;
spC0 = 0.0f;
font->unk_11D88 = (font->unk_11D88 ^ 1) & 1;
if ((gSaveContext.options.language == LANGUAGE_JPN) && !msgCtx->textIsCredits) {
spD2 = 0;
numLines = 0;
decodedBufPos = 0;
charTexIndex = 0;
Message_DecodeHeader(play);
while (true) {
curChar = msgCtx->decodedBuffer.wchar[decodedBufPos] = font->msgBuf.wchar[msgCtx->msgBufPos];
if ((curChar == 9) || (curChar == 0xB) || (curChar == 0x110) || (curChar == 0x111) || (curChar == 0x112) ||
(curChar == 0x103) || (curChar == 0x230) || (curChar == 0x500) || (curChar == 0x240) ||
(curChar == 0x104)) {
msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
msgCtx->textDrawPos = 1;
msgCtx->unk11FFA = msgCtx->textboxY + 6;
msgCtx->unk11F1A[spD2] = 0;
if (msgCtx->unk11F18 == 0) {
msgCtx->unk11F1A[spD2] = TRUNCF_BINANG((msgCtx->textCharScale * 16.0f * 16.0f) - spC0) / 2;
}
spC0 = 0.0f;
if (curChar == 0xB) {
if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) {
if (numLines < 2) {
msgCtx->unk11FFA = msgCtx->textboxY + 0x16;
} else if (numLines == 2) {
msgCtx->unk11FFA = msgCtx->textboxY + 0xE;
}
}
} else {
s8 requiredScopeTemp;
if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) {
if (numLines == 0) {
msgCtx->unk11FFA = msgCtx->textboxY + 0x16;
} else if (numLines == 1) {
msgCtx->unk11FFA = msgCtx->textboxY + 0xE;
}
}
}
if ((curChar == 0x110) || (curChar == 0x111) || (curChar == 0x112)) {
msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[msgCtx->msgBufPos + 1];
msgCtx->msgBufPos += 2;
}
msgCtx->decodedTextLen = decodedBufPos;
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;
}
if (curChar == 0x100) {
for (playerNameLen = ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); playerNameLen > 0;
playerNameLen--) {
if (((void)0, gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1]) != 0x3E) {
break;
}
}
for (i = 0; i < playerNameLen; i++) {
curChar = gSaveContext.save.saveInfo.playerData.playerName[i];
index2 = curChar & 0xFFFF;
fontBuf = &font->fontBuf[index2 * FONT_CHAR_TEX_SIZE];
msgCtx->decodedBuffer.wchar[decodedBufPos + i] = 0x100;
for (var_v0 = 0; var_v0 < FONT_CHAR_TEX_SIZE; var_v0 += 4) {
font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 0] = fontBuf[var_v0 + 0];
font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 1] = fontBuf[var_v0 + 1];
font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 2] = fontBuf[var_v0 + 2];
font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 3] = fontBuf[var_v0 + 3];
}
charTexIndex += FONT_CHAR_TEX_SIZE;
}
//! FAKE:
fontBuf = &font->fontBuf[index2 * FONT_CHAR_TEX_SIZE];
decodedBufPos += playerNameLen - 1;
spC0 += playerNameLen * (16.0f * msgCtx->textCharScale);
} else if (curChar == 0x201) {
DmaMgr_RequestSync(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900);
DmaMgr_RequestSync(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900,
0x900);
numLines = 2;
spD2 = 2;
msgCtx->unk12012 = msgCtx->textboxY + 8;
msgCtx->unk11F18 = 1;
msgCtx->unk12010 = XREG(47);
} else if (curChar == 0x202) {
msgCtx->unk11F18 = 1;
msgCtx->choiceNum = 2;
} else if (curChar == 0x203) {
msgCtx->unk11F18 = 1;
msgCtx->choiceNum = 3;
msgCtx->unk11FF8 += 0x16;
} else if (curChar == 0x204) {
Message_GetTimerDigits(((void)0, gSaveContext.timerCurTimes[curChar - 0x204]), spAC);
loadChar = false;
for (i = 0; i < ARRAY_COUNT(spAC) - 3; i++) {
if ((i == 1) || (spAC[i + 3] != 0)) {
loadChar = true;
}
if (loadChar) {
Message_LoadChar(play, spAC[i + 3] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
}
decodedBufPos--;
} else if ((curChar == 0x205) || (curChar == 0x206) || (curChar == 0x207) || (curChar == 0x208) ||
(curChar == 0x209)) {
Message_GetTimerDigits(((void)0, gSaveContext.timerCurTimes[curChar - 0x204]), spAC);
loadChar = false;
for (i = 0; i < ARRAY_COUNT(spAC); i++) {
if ((i == 4) || ((i != 2) && (i != 5) && (spAC[i] != '\0'))) {
loadChar = true;
}
if (loadChar) {
Message_LoadChar(play, spAC[i] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
}
decodedBufPos--;
} else if (curChar == 0x20A) {
digits[0] = 0;
timeInSeconds = TIME_TO_MINUTES_F(CURRENT_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_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
if (i == 1) {
Font_LoadChar(play, '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = '';
decodedBufPos++;
} else if (i == 3) {
Font_LoadChar(play, '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = '';
}
}
spC0 += 6 * (16.0f * msgCtx->textCharScale);
} else if (curChar == 0x20B) {
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_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadChar(play, 0x9543, &charTexIndex, &spC0, decodedBufPos);
} else if (curChar == 0x20C) {
decodedBufPos++;
msgCtx->unk120BE = spD2;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 2;
msgCtx->rupeesSelected = 0;
msgCtx->unk120C4 = charTexIndex;
digits[0] = digits[1] = digits[2] = 0;
for (i = 0; i < 3; i++) {
Message_LoadChar(play, digits[i] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
Message_LoadRupeesJPN(play, &decodedBufPos, &charTexIndex, &spC0);
} else if (curChar == 0x20D) {
digits[0] = digits[1] = 0;
digits[2] = msgCtx->rupeesSelected;
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_LoadChar(play, digits[i] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
}
Message_LoadRupeesJPN(play, &decodedBufPos, &charTexIndex, &spC0);
} else if (curChar == 0x20E) {
digits[0] = digits[1] = digits[2] = 0;
digits[3] = msgCtx->rupeesTotal;
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_LoadChar(play, digits[i] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
}
Message_LoadRupeesJPN(play, &decodedBufPos, &charTexIndex, &spC0);
} else if (curChar == 0x20F) {
Message_LoadTime(play, curChar, &charTexIndex, &spC0, &decodedBufPos);
} else if (curChar == 0x21C) {
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_LoadChar(play, digits[i] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
}
Message_LoadChar(play, '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
Message_LoadChar(play, '', &charTexIndex, &spC0, decodedBufPos);
} else if (curChar == 0x21D) {
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_LoadChar(play, digits[i] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
}
Message_LoadChar(play, '', &charTexIndex, &spC0, decodedBufPos);
} else if (curChar == 0x21E) {
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_LoadChar(play, digits[i] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
}
decodedBufPos--;
} else if (curChar == 0x21F) {
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_LoadChar(play, digits[i] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
}
decodedBufPos--;
} else if (curChar == 0x220) {
decodedBufPos++;
msgCtx->unk120BE = spD2;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 0;
msgCtx->rupeesSelected = 0;
msgCtx->unk120C4 = charTexIndex;
digits[0] = digits[1] = digits[2] = 0;
for (i = 0; i < 2; i++) {
Message_LoadChar(play, digits[i] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
Message_LoadRupeesJPN(play, &decodedBufPos, &charTexIndex, &spC0);
} else if (curChar == 0x221) {
decodedBufPos++;
msgCtx->unk120BE = spD2;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 0;
msgCtx->rupeesSelected = 0;
msgCtx->unk120C4 = charTexIndex;
for (i = 0; i < 5; i++) {
msgCtx->unk12054[i] = 1;
Message_LoadChar(play, '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
decodedBufPos--;
} else if (curChar == 0x223) {
if (((void)0, gSaveContext.save.timeSpeedOffset) == 0x12) {
index = 0;
} else if (((void)0, gSaveContext.save.timeSpeedOffset) == 0) {
index = 1;
} else {
index = 2;
}
for (i = 0; i < 3; i++, decodedBufPos++) {
msgCtx->decodedBuffer.wchar[decodedBufPos] = sTimeSpeedTextJPN[index][i];
Font_LoadChar(play, sTimeSpeedTextJPN[index][i], charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
}
decodedBufPos--;
spC0 += 3.0f * (16.0f * msgCtx->textCharScale);
msgCtx->choiceIndex = index;
} else if (curChar == 0x224) {
Message_LoadOwlWarpText(play, &charTexIndex, &spC0, &decodedBufPos);
} else if (curChar == 0x225) {
decodedBufPos++;
msgCtx->unk120BE = spD2;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 0;
msgCtx->rupeesSelected = 0;
msgCtx->unk120C4 = charTexIndex;
for (i = 0; i < 3; i++) {
msgCtx->unk12054[i] = 1;
Font_LoadChar(play, '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = '';
spC0 += 16.0f * msgCtx->textCharScale;
decodedBufPos++;
}
decodedBufPos--;
} else if (curChar == 0x226) {
for (i = 0; i < 6; i++) {
msgCtx->decodedBuffer.wchar[decodedBufPos] =
sMaskCodeColorCmdJPN[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])];
decodedBufPos++;
Message_LoadChar(play, i + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x2000;
} else if ((curChar >= 0x227) && (curChar < 0x22B)) {
digits[0] = digits[1] = 0;
digits[2] =
STRAY_FAIRY_SCATTERED_TOTAL - gSaveContext.save.saveInfo.inventory.strayFairies[curChar - 0x227];
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_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadChar(play, '', &charTexIndex, &spC0, decodedBufPos);
} else if (curChar == 0x22B) {
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_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadChar(play, '', &charTexIndex, &spC0, decodedBufPos);
} else if ((curChar == 0x22C) || (curChar == 0x22D)) {
if (curChar == 0x22C) {
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_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
decodedBufPos--;
} else if (curChar == 0x22E) {
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_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadRupeesJPN(play, &decodedBufPos, &charTexIndex, &spC0);
} else if (curChar == 0x22F) {
for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.bomberCode); i++) {
digits[i] = gSaveContext.save.saveInfo.bomberCode[i];
Font_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
decodedBufPos--;
} else if ((curChar >= 0x231) && (curChar < 0x237)) {
msgCtx->decodedBuffer.wchar[decodedBufPos] = sMaskCodeColorCmdJPN[(
(void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0x231)])];
decodedBufPos++;
Message_LoadChar(play,
sMaskCodeTextJPN[(
(void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0x231)])],
&charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x2000;
} else if (curChar == 0x237) {
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_LoadChar(play, digits[i] + '', &charTexIndex, &spC0, decodedBufPos);
decodedBufPos++;
}
}
Font_LoadChar(play, '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = '';
decodedBufPos++;
Font_LoadChar(play, '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = '';
spC0 += 2.0f * (16.0f * msgCtx->textCharScale);
} else if (curChar == 0x238) {
Message_LoadTime(play, curChar, &charTexIndex, &spC0, &decodedBufPos);
} else if ((curChar == 0x300) || (curChar == 0x301) || (curChar == 0x302) || (curChar == 0x308)) {
if (curChar == 0x308) {
value = (s32)HS_GET_HIGH_SCORE_3_LOWER();
} else {
value = HIGH_SCORE(curChar - 0x300);
}
if (curChar == 0x302) {
if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
value &= 0x7F;
} else {
value = (s16)((HIGH_SCORE(font->msgBuf.wchar[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_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
decodedBufPos--;
} else if ((curChar == 0x307) || (curChar == 0x309) || (curChar == 0x30A) || (curChar == 0x30B) ||
(curChar == 0x30C)) {
var_fs0 = 8.0f;
if (curChar == 0x307) {
Message_GetTimerDigits(GET_HIGH_SCORE(HS_UNK_1), spAC);
} else if (curChar == 0x309) {
Message_GetTimerDigits(GET_HIGH_SCORE(HS_HORSE_BACK_BALLOON), spAC);
} else {
Message_GetTimerDigits(
((void)0, gSaveContext.save.saveInfo.dekuPlaygroundHighScores[curChar - 0x30A]), spAC);
}
loadChar = false;
for (i = 0; i < ARRAY_COUNT(spAC); i++) {
if ((i == 4) || ((i != 2) && (i != 5) && (spAC[i] != '\0'))) {
loadChar = true;
}
if (loadChar) {
Font_LoadChar(play, spAC[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = spAC[i] + '';
decodedBufPos++;
} else {
var_fs0 -= 1.0f;
}
}
spC0 += var_fs0 * (16.0f * msgCtx->textCharScale);
decodedBufPos--;
} else if ((curChar == 0x303) || (curChar == 0x304) || (curChar == 0x305)) {
value = HIGH_SCORE(curChar - 0x303 + 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_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
if (i == 1) {
Font_LoadChar(play, '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = '';
decodedBufPos++;
} else if (i == 3) {
Font_LoadChar(play, '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = '';
}
}
spC0 += 4.0f * (16.0f * msgCtx->textCharScale);
} else if (curChar == 0x306) {
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_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadChar(play, '', &charTexIndex, &spC0, decodedBufPos);
} else if ((curChar == 0x30D) || (curChar == 0x30E) || (curChar == 0x30F)) {
index = curChar - 0x30D;
for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) {
if (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]);
//! FAKE: 0xFFFF
fontBuf = &font->fontBuf[(curChar & 0xFFFF) * FONT_CHAR_TEX_SIZE];
msgCtx->decodedBuffer.wchar[decodedBufPos + i] = 0x30D;
for (var_v0 = 0; var_v0 < FONT_CHAR_TEX_SIZE; var_v0 += 4) {
font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 0] = fontBuf[var_v0 + 0];
font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 1] = fontBuf[var_v0 + 1];
font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 2] = fontBuf[var_v0 + 2];
font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 3] = fontBuf[var_v0 + 3];
}
charTexIndex += FONT_CHAR_TEX_SIZE;
}
decodedBufPos += playerNameLen - 1;
spC0 += playerNameLen * (16.0f * msgCtx->textCharScale);
} else if (curChar == 0x310) {
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_LoadChar(play, digits[i] + '', charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + '';
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadChar(play, '', &charTexIndex, &spC0, decodedBufPos);
} else if (curChar == 0x1F) {
decodedBufPos--;
for (i = 0; i < font->msgBuf.wchar[msgCtx->msgBufPos + 1]; i++) {
msgCtx->decodedBuffer.wchar[++decodedBufPos] = ' ';
spC0 += 6.0f;
}
msgCtx->msgBufPos++;
} else if ((curChar == 0xC) || (curChar == 0xA)) {
msgCtx->unk11F1A[spD2] = 0;
if (msgCtx->unk11F18 == 0) {
msgCtx->unk11F1A[spD2] = ((msgCtx->textCharScale * 16.0f * 16.0f) - spC0) * 0.5f;
}
spD2++;
spC0 = 0.0f;
if (curChar == 0xA) {
numLines++;
}
} else if ((curChar == 0x101) || (curChar == 0x102) || (curChar == 0x104) ||
((curChar >= 0x130) && (curChar < 0x137))) {
// pass
} else if (curChar == 0x111) {
msgCtx->textFade = true;
msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[++msgCtx->msgBufPos] & 0xFF;
} else if (curChar == 0x120) {
msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[++msgCtx->msgBufPos];
if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) ||
(msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) ||
(msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) ||
(msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) {
Audio_PlaySfx(msgCtx->decodedBuffer.wchar[decodedBufPos]);
}
} else if (curChar == 0x128) {
msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[++msgCtx->msgBufPos];
} else if ((curChar != 0x20) && ((curChar < 0x2000) || (curChar >= 0x2009))) {
Font_LoadChar(play, curChar, charTexIndex);
charTexIndex += FONT_CHAR_TEX_SIZE;
if ((curChar == '') || (curChar == '')) {
spC0 += 10.0f * msgCtx->textCharScale;
} else if (curChar == '') {
spC0 += (12.0f * msgCtx->textCharScale);
} else if ((curChar == '') || (curChar == '')) {
spC0 += 14.0f * msgCtx->textCharScale;
} else if (curChar == '') {
spC0 += 8.0f * msgCtx->textCharScale;
} else if ((curChar == '') || (curChar == '')) {
spC0 += 10.0f * msgCtx->textCharScale;
} else if ((curChar == '') || (curChar == '') || (curChar == '')) {
spC0 += 12.0f * msgCtx->textCharScale;
} else if (curChar == '') {
spC0 += 14.0f * msgCtx->textCharScale;
} else {
spC0 += 16.0f * msgCtx->textCharScale;
}
} else if (curChar == 0x20) {
spC0 += 6.0f;
}
decodedBufPos++;
msgCtx->msgBufPos++;
}
} else if (msgCtx->textIsCredits) {
Message_DecodeCredits(play);
} else {
Message_DecodeNES(play);
}
}
void func_80150A84(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
s32 textBoxType = msgCtx->textBoxType;
if (D_801CFC78[textBoxType] != 14) {
DmaMgr_RequestSync(msgCtx->textboxSegment, SEGMENT_ROM_START(message_static) + D_801CFC78[textBoxType] * 0x1000,
0x1000);
if (!play->pauseCtx.bombersNotebookOpen) {
if ((textBoxType == TEXTBOX_TYPE_0) || (textBoxType == TEXTBOX_TYPE_6) || (textBoxType == TEXTBOX_TYPE_A) ||
(textBoxType == TEXTBOX_TYPE_B)) {
msgCtx->textboxColorRed = 0;
msgCtx->textboxColorGreen = 0;
msgCtx->textboxColorBlue = 0;
} else if (textBoxType == TEXTBOX_TYPE_1) {
msgCtx->textboxColorRed = 70;
msgCtx->textboxColorGreen = 50;
msgCtx->textboxColorBlue = 30;
} else if ((textBoxType == TEXTBOX_TYPE_2) || (textBoxType == TEXTBOX_TYPE_8)) {
msgCtx->textboxColorRed = 0;
msgCtx->textboxColorGreen = 10;
msgCtx->textboxColorBlue = 50;
} else if (textBoxType == TEXTBOX_TYPE_D) {
msgCtx->textboxColorRed = 255;
msgCtx->textboxColorGreen = 255;
msgCtx->textboxColorBlue = 195;
} else {
msgCtx->textboxColorRed = 255;
msgCtx->textboxColorGreen = 0;
msgCtx->textboxColorBlue = 0;
}
if (textBoxType == TEXTBOX_TYPE_1) {
msgCtx->textboxColorAlphaTarget = 230;
} else if (textBoxType == TEXTBOX_TYPE_3) {
msgCtx->textboxColorAlphaTarget = 180;
} else if (textBoxType == TEXTBOX_TYPE_D) {
msgCtx->textboxColorAlphaTarget = 220;
} else {
msgCtx->textboxColorAlphaTarget = 170;
}
} else {
msgCtx->textboxColorRed = 255;
msgCtx->textboxColorGreen = 255;
msgCtx->textboxColorBlue = 255;
msgCtx->textboxColorAlphaTarget = 255;
}
msgCtx->textboxColorAlphaCurrent = 0;
}
}
void Message_OpenText(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
Font* font = &msgCtx->font;
Player* player = GET_PLAYER(play);
f32 var_fv0;
if (play->msgCtx.msgMode == MSGMODE_NONE) {
gSaveContext.prevHudVisibility = gSaveContext.hudVisibility;
}
if (textId == 0xFF) {
func_80115844(play, DO_ACTION_STOP);
play->msgCtx.hudVisibility = gSaveContext.hudVisibility;
Interface_SetHudVisibility(HUD_VISIBILITY_A_B_C);
gSaveContext.save.unk_06 = 20;
} else if ((textId == 0x579) || (textId == 0x8D8)) {
Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE);
} else if (((textId == 0x28) || (textId == 0x29) || (textId == 0x2A)) &&
(player->transformation == PLAYER_FORM_DEKU)) {
//! FAKE:
if (msgCtx) {}
textId = 0xC9;
} else if (textId == 0x11) {
if (gSaveContext.save.saveInfo.inventory.strayFairies[((void)0, gSaveContext.dungeonIndex)] == 0xF) {
textId = 0xF3;
}
} else if ((textId == 0x92) && (play->sceneId == SCENE_KOEPONARACE)) {
textId = 0xCD;
}
if ((textId == 0xC) && (GET_QUEST_HEART_PIECE_COUNT != 0)) {
textId = GET_QUEST_HEART_PIECE_COUNT;
textId += 0xC4;
}
msgCtx->currentTextId = textId;
if ((msgCtx->currentTextId == 0xC) || (msgCtx->currentTextId == 0xD) || (msgCtx->currentTextId == 0xC5) ||
(msgCtx->currentTextId == 0xC6) || (msgCtx->currentTextId == 0xC7)) {
Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE);
}
msgCtx->messageHasSetSfx = false;
D_801C6A70 = 0;
msgCtx->textboxSkipped = false;
msgCtx->textIsCredits = false;
var_fv0 = 1.0f;
if (play->pauseCtx.bombersNotebookOpen) {
if (gSaveContext.options.language == LANGUAGE_JPN) {
msgCtx->textCharScale = 1.4f;
msgCtx->unk11FFC = 0x1E;
msgCtx->unk11FF8 = 0x32;
var_fv0 = 1.4;
} else {
msgCtx->textCharScale = 1.4f;
msgCtx->unk11FFC = 0x16;
msgCtx->unk11FF8 = 0x32;
var_fv0 = 1.4;
}
} else if (textId >= 0x4E20) {
msgCtx->textIsCredits = true;
msgCtx->textCharScale = 0.85f;
msgCtx->unk11FFC = 6;
msgCtx->unk11FF8 = 0x14;
} else if (gSaveContext.options.language == LANGUAGE_JPN) {
msgCtx->textCharScale = 0.88f;
msgCtx->unk11FFC = 0x12;
msgCtx->unk11FF8 = 0x32;
} else {
msgCtx->textCharScale = 0.75f;
msgCtx->unk11FFC = 0xC;
msgCtx->unk11FF8 = 0x41;
}
sCharTexSize = msgCtx->textCharScale * 16.0f;
sCharTexScale = 1024.0f / msgCtx->textCharScale;
D_801F6B08 = 1024.0f / var_fv0;
if (msgCtx->textIsCredits) {
Message_FindCreditsMessage(play, textId);
msgCtx->msgLength = font->messageEnd;
DmaMgr_RequestSync(&font->msgBuf, SEGMENT_ROM_START(staff_message_data_static) + font->messageStart,
font->messageEnd);
} else if (gSaveContext.options.language == LANGUAGE_JPN) {
Message_FindMessage(play, textId);
msgCtx->msgLength = font->messageEnd;
DmaMgr_RequestSync(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart,
font->messageEnd);
} else {
Message_FindMessageNES(play, textId);
msgCtx->msgLength = font->messageEnd;
DmaMgr_RequestSync(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart,
font->messageEnd);
}
msgCtx->choiceNum = 0;
msgCtx->textUnskippable = false;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_DEFAULT;
msgCtx->textDrawPos = 0;
msgCtx->msgBufPos = 0;
msgCtx->decodedTextLen = 0;
msgCtx->unk11F08 = font->msgBuf.schar[msgCtx->msgBufPos] << 8;
msgCtx->unk11F08 |= font->msgBuf.schar[msgCtx->msgBufPos + 1];
msgCtx->unk11F18 = (msgCtx->unk11F08 & 0xF000) >> 0xC;
msgCtx->textBoxType = (msgCtx->unk11F08 & 0xF00) >> 8;
msgCtx->textBoxPos = (msgCtx->unk11F08 & 0xF0) >> 4;
msgCtx->unk11F0C = msgCtx->unk11F08 & 0xF;
if ((msgCtx->unk11F0C == 1) || (msgCtx->unk11F0C == 3)) {
msgCtx->textUnskippable = true;
}
msgCtx->itemId = 0xFE;
if ((msgCtx->textBoxType == TEXTBOX_TYPE_5) || (msgCtx->textBoxType == TEXTBOX_TYPE_D) ||
(play->pauseCtx.bombersNotebookOpen)) {
msgCtx->unk120CE = msgCtx->unk120D0 = msgCtx->unk120D2 = 0;
} else {
msgCtx->unk120CE = msgCtx->unk120D0 = msgCtx->unk120D2 = 0xFF;
}
msgCtx->choiceIndex = 0;
if (msgCtx->unk11F0C != 3) {
msgCtx->textColorAlpha = 0xFF;
} else {
msgCtx->textColorAlpha = 0;
}
if (textId == 0x1467) {
Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI);
}
if (textId == 0x2955) {
Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ANJU);
Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI);
Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK);
}
}
void func_801514B0(PlayState* play, u16 arg1, u8 arg2) {
MessageContext* msgCtx = &play->msgCtx;
Font* font = &msgCtx->font;
Player* player = GET_PLAYER(play);
f32 temp = 1024.0f;
msgCtx->ocarinaAction = 0xFFFF;
if (msgCtx->msgMode == MSGMODE_NONE) {
gSaveContext.prevHudVisibility = gSaveContext.hudVisibility;
}
msgCtx->messageHasSetSfx = false;
D_801C6A70 = 0;
msgCtx->textboxSkipped = false;
msgCtx->textIsCredits = false;
if (gSaveContext.options.language == LANGUAGE_JPN) {
msgCtx->textCharScale = 0.88f;
msgCtx->unk11FFC = 0x12;
msgCtx->unk11FF8 = 0x32;
} else {
msgCtx->textCharScale = 0.75f;
msgCtx->unk11FFC = 0xC;
msgCtx->unk11FF8 = 0x41;
}
sCharTexSize = msgCtx->textCharScale * 16.0f;
sCharTexScale = temp / msgCtx->textCharScale;
D_801F6B08 = temp / 1;
if ((arg1 == 0x1709) && (player->transformation == 3)) {
arg1 = 0x1705;
}
msgCtx->currentTextId = arg1;
if (gSaveContext.options.language == LANGUAGE_JPN) {
Message_FindMessage(play, arg1);
msgCtx->msgLength = font->messageEnd;
DmaMgr_RequestSync(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart,
font->messageEnd);
} else {
Message_FindMessageNES(play, arg1);
msgCtx->msgLength = font->messageEnd;
DmaMgr_RequestSync(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart,
font->messageEnd);
}
msgCtx->choiceNum = 0;
msgCtx->textUnskippable = false;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_DEFAULT;
msgCtx->textDrawPos = 0;
msgCtx->msgBufPos = 0;
msgCtx->decodedTextLen = 0;
msgCtx->unk11F08 = font->msgBuf.wchar[msgCtx->msgBufPos];
msgCtx->unk11F18 = (msgCtx->unk11F08 & 0xF000) >> 0xC;
msgCtx->textBoxType = TEXTBOX_TYPE_9;
msgCtx->textBoxPos = arg2;
msgCtx->unk11F0C = msgCtx->unk11F08 & 0xF;
msgCtx->textUnskippable = true;
DmaMgr_RequestSync(msgCtx->textboxSegment, SEGMENT_ROM_START(message_static) + (D_801CFC78[0] * 0x1000), 0x1000);
msgCtx->textboxColorRed = 0;
msgCtx->textboxColorGreen = 0;
msgCtx->textboxColorBlue = 0;
msgCtx->textboxColorAlphaTarget = 0xE6;
msgCtx->textboxColorAlphaCurrent = 0;
msgCtx->textColorAlpha = 0xFF;
msgCtx->talkActor = NULL;
msgCtx->msgMode = MSGMODE_TEXT_START;
msgCtx->stateTimer = 0;
msgCtx->textDelayTimer = 0;
play->msgCtx.ocarinaMode = OCARINA_MODE_NONE;
msgCtx->unk120D2 = 0xFF;
msgCtx->unk120CE = msgCtx->unk120D0 = msgCtx->unk120D2;
}
void Message_StartTextbox(PlayState* play, u16 textId, Actor* actor) {
MessageContext* msgCtx = &play->msgCtx;
msgCtx->ocarinaAction = 0xFFFF;
Message_OpenText(play, textId);
msgCtx->talkActor = actor;
msgCtx->msgMode = MSGMODE_TEXT_START;
msgCtx->stateTimer = 0;
msgCtx->textDelayTimer = 0;
play->msgCtx.ocarinaMode = OCARINA_MODE_NONE;
}
void Message_ContinueTextbox(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
InterfaceContext* interfaceCtx = &play->interfaceCtx;
msgCtx->msgLength = 0;
Message_OpenText(play, textId);
func_80150A84(play);
msgCtx->msgMode = MSGMODE_TEXT_CONTINUING;
msgCtx->stateTimer = 8;
msgCtx->textDelayTimer = 0;
if (interfaceCtx->unk_222 == 0) {
if (textId != 0x1B93) {
func_8011552C(play, DO_ACTION_NEXT);
} else if (textId != 0xF8) {
func_8011552C(play, DO_ACTION_DECIDE);
}
}
msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget;
if (play->pauseCtx.bombersNotebookOpen) {
msgCtx->textboxXTarget = 34;
msgCtx->textboxYTarget = 350;
Message_GrowTextbox(play);
msgCtx->stateTimer = 1;
}
}
void Message_DisplaySceneTitleCard(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
msgCtx->msgLength = 0;
Message_OpenText(play, textId);
func_80150A84(play);
Message_DecodeNES(play);
msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND;
msgCtx->textDelayTimer = 0;
msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget = msgCtx->textColorAlpha = 0;
msgCtx->stateTimer = 30;
// Day/Dawn/Night.. Messages
if ((msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6)) {
XREG(74) = 0x6A;
XREG(75) = 0;
XREG(77) = 0x58;
XREG(76) = 0x44;
} else {
XREG(74) = 0x42;
XREG(75) = 0x1E;
XREG(77) = 0x3C;
XREG(76) = 0x1C;
msgCtx->unk11F1A[0] = msgCtx->unk11F1A[1] = msgCtx->unk11F1A[2] = 0;
Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
}
}
void Message_BombersNotebookQueueEvent(PlayState* play, u8 event) {
MessageContext* msgCtx = &play->msgCtx;
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[event])) {
msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount] = event;
msgCtx->bombersNotebookEventQueueCount++;
}
} else if (event >= BOMBERS_NOTEBOOK_PERSON_MAX) {
// Non MET events are processed even if the player does not have the notebook yet
if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[event])) {
msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount] = event;
msgCtx->bombersNotebookEventQueueCount++;
}
}
}
/**
* @return s32 true if an entry to be shown was found and triggered
*/
s32 Message_BombersNotebookProcessEventQueue(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
while (true) {
if (msgCtx->bombersNotebookEventQueueCount == 0) {
return false;
}
msgCtx->bombersNotebookEventQueueCount--;
if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags
[msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]])) {
SET_WEEKEVENTREG(gBombersNotebookWeekEventFlags
[msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]]);
if ((sBombersNotebookEventMessages
[msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]] != 0) &&
CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
Message_ContinueTextbox(
play, sBombersNotebookEventMessages
[msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]]);
Audio_PlaySfx(NA_SE_SY_SCHEDULE_WRITE);
return true;
}
}
}
}
u16 D_801D028C[] = {
0x1B5A, // OCARINA_ACTION_0
0x1B5B, //
0x1B5C, // OCARINA_ACTION_DEMONSTRATE_SONATA
0x1B5D, // OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY
0x1B5E, // OCARINA_ACTION_DEMONSTRATE_NEW_WAVE
0x1B5F, // OCARINA_ACTION_DEMONSTRATE_ELEGY
0x1B60, // OCARINA_ACTION_DEMONSTRATE_OATH
0x1B61, // OCARINA_ACTION_DEMONSTRATE_SARIAS
0x1B62, // OCARINA_ACTION_DEMONSTRATE_TIME
0x1B63, // OCARINA_ACTION_DEMONSTRATE_HEALING
0x1B64, // OCARINA_ACTION_DEMONSTRATE_EPONAS
0x1B65, // OCARINA_ACTION_DEMONSTRATE_SOARING
0x1B66, // OCARINA_ACTION_DEMONSTRATE_STORMS
0x1B67, // OCARINA_ACTION_DEMONSTRATE_SUNS
0x1B68, // OCARINA_ACTION_DEMONSTRATE_INVERTED_TIME
0x1B69, // OCARINA_ACTION_DEMONSTRATE_DOUBLE_TIME
0x1B6A, // OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO
0, // OCARINA_ACTION_11
0xDC7, // OCARINA_ACTION_3B
0xDC9, // OCARINA_ACTION_3C
0x120A, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF
0x120B, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF
0x122C, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF
0x122F, // OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF
0x120A, // OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF
0x120B, // OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF
};
u16 sOcarinaSongFlagsMap[] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800 };
void Message_DisplayOcarinaStaffImpl(PlayState* play, u16 ocarinaAction) {
MessageContext* msgCtx = &play->msgCtx;
s16 j;
s16 noStop;
s32 k;
u32 i;
msgCtx->ocarinaAvailableSongs = 0;
for (i = msgCtx->ocarinaAvailableSongs; i <= (QUEST_SONG_SUN - QUEST_SONG_SONATA); i++) {
if (CHECK_QUEST_ITEM(QUEST_SONG_SONATA + i)) {
msgCtx->ocarinaAvailableSongs = msgCtx->ocarinaAvailableSongs | sOcarinaSongFlagsMap[i];
}
}
if (CHECK_QUEST_ITEM(QUEST_SONG_TIME)) {
msgCtx->ocarinaAvailableSongs |= 0x3000;
}
if (CHECK_QUEST_ITEM(QUEST_SONG_LULLABY_INTRO)) {
msgCtx->ocarinaAvailableSongs |= 0x4000;
}
if (CHECK_QUEST_ITEM(QUEST_SONG_LULLABY)) {
msgCtx->ocarinaAvailableSongs &= (u16)~0x4000;
}
if (gSaveContext.save.saveInfo.scarecrowSpawnSongSet) {
msgCtx->ocarinaAvailableSongs |= 0x400000;
}
if (CHECK_EVENTINF(EVENTINF_31)) {
msgCtx->ocarinaAvailableSongs |= 0x800000;
}
msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff();
if ((ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
(ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
sOcarinaButtonAlphaValues[0] = sOcarinaButtonAlphaValues[1] = sOcarinaButtonAlphaValues[2] =
sOcarinaButtonAlphaValues[3] = 255;
} else {
msgCtx->ocarinaStaff->pos = 0;
sOcarinaButtonIndexBufPos = 0;
sOcarinaButtonIndexBufLen = 0;
Message_ResetOcarinaButtonState(play);
}
sLastPlayedSong = 0xFF;
msgCtx->lastPlayedSong = 0xFF;
msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID;
noStop = false;
msgCtx->ocarinaAction = ocarinaAction;
if ((ocarinaAction >= OCARINA_ACTION_TIMED_PROMPT_SONATA) &&
(ocarinaAction <= OCARINA_ACTION_TIMED_PROMPT_STORMS)) {
Message_OpenText(play, 0x1B59);
func_80150A84(play);
} else if ((ocarinaAction == OCARINA_ACTION_3B) || (ocarinaAction == OCARINA_ACTION_3C)) {
noStop = true;
Message_OpenText(play, D_801D028C[ocarinaAction - 0x29]);
func_80150A84(play);
} else if ((ocarinaAction >= OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) &&
(ocarinaAction <= OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
noStop = true;
Message_OpenText(play, D_801D028C[ocarinaAction - 0x29]);
func_80150A84(play);
} else if ((ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
(ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
noStop = true;
Message_OpenText(play, 0x1B59);
func_80150A84(play);
} else if ((ocarinaAction == OCARINA_ACTION_FREE_PLAY) || (ocarinaAction >= OCARINA_ACTION_CHECK_TIME)) {
if ((ocarinaAction >= OCARINA_ACTION_CHECK_TIME) && (ocarinaAction <= OCARINA_ACTION_CHECK_STORMS)) {
Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
if (ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_DEMONSTRATION) {
Message_OpenText(play, 0x1B5B);
func_80150A84(play);
} else {
Message_OpenText(play, 0x1B5A);
func_80150A84(play);
}
} else {
noStop = true;
if (ocarinaAction >= OCARINA_ACTION_PROMPT_SONATA) {
Message_OpenText(play, 0x1B59);
func_80150A84(play);
} else {
Message_OpenText(play, D_801D028C[ocarinaAction]);
func_80150A84(play);
}
}
msgCtx->talkActor = NULL;
msgCtx->textDelayTimer = 0;
play->msgCtx.ocarinaMode = OCARINA_MODE_NONE;
msgCtx->textboxXTarget = 34;
msgCtx->textboxYTarget = 142;
msgCtx->stateTimer = 8;
Message_GrowTextbox(play);
msgCtx->textboxX = 34;
msgCtx->textboxY = 142;
msgCtx->unk1200C = 0x200;
msgCtx->unk1200E = 0x200;
msgCtx->unk12008 = 0x100;
msgCtx->unk1200A = 0x40;
msgCtx->msgMode = MSGMODE_TEXT_CONTINUING;
msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget;
msgCtx->textboxColorAlphaCurrent = msgCtx->textboxColorAlphaTarget;
if (!noStop) {
func_80115844(play, DO_ACTION_STOP);
noStop = gSaveContext.hudVisibility;
Interface_SetHudVisibility(HUD_VISIBILITY_B_ALT);
gSaveContext.hudVisibility = noStop;
}
if ((ocarinaAction == OCARINA_ACTION_FREE_PLAY) || (ocarinaAction == OCARINA_ACTION_CHECK_NOTIME)) {
msgCtx->msgMode = MSGMODE_OCARINA_STARTING;
msgCtx->textBoxType = TEXTBOX_TYPE_E;
} else if (ocarinaAction == OCARINA_ACTION_3A) {
msgCtx->msgMode = MSGMODE_32;
} else if (ocarinaAction == OCARINA_ACTION_37) {
msgCtx->msgMode = MSGMODE_2F;
msgCtx->textBoxType = TEXTBOX_TYPE_2;
} else if (ocarinaAction == OCARINA_ACTION_SCARECROW_LONG_DEMONSTRATION) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
msgCtx->ocarinaStaff->pos = 0;
sOcarinaButtonIndexBufLen = 0;
sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen;
Message_ResetOcarinaButtonState(play);
msgCtx->msgMode = MSGMODE_SCARECROW_LONG_DEMONSTRATION;
AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_LONG + 1, 1);
gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
}
for (j = 0, k = 0; j < 48; j++, k += FONT_CHAR_TEX_SIZE) {
Font_LoadChar(play, ' ', k);
};
msgCtx->stateTimer = 3;
}
void Message_DisplayOcarinaStaff(PlayState* play, u16 ocarinaAction) {
play->msgCtx.blockSunsSong = false;
Message_DisplayOcarinaStaffImpl(play, ocarinaAction);
}
void Message_DisplayOcarinaStaffBlockSunsSong(PlayState* play, u16 ocarinaAction) {
play->msgCtx.blockSunsSong = true;
Message_DisplayOcarinaStaffImpl(play, ocarinaAction);
}
/**
* @return u8 A value of the TextState enum representing the current state of the on-screen message
*/
u8 Message_GetState(MessageContext* msgCtx) {
if (msgCtx->msgLength == 0) {
return TEXT_STATE_NONE;
}
if (msgCtx->msgMode == MSGMODE_TEXT_DONE) {
if (msgCtx->nextTextId != 0xFFFF) {
return TEXT_STATE_NEXT;
}
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_TWO_CHOICE) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_THREE_CHOICE)) {
return TEXT_STATE_CHOICE;
}
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_EVENT) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_EVENT2) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_PERSISTENT)) {
return TEXT_STATE_EVENT;
}
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_PAUSE_MENU) {
return TEXT_STATE_PAUSE_MENU;
}
if ((msgCtx->textboxEndType >= TEXTBOX_ENDTYPE_FADE_NORMAL) &&
(msgCtx->textboxEndType <= TEXTBOX_ENDTYPE_FADE_STAGES_3)) {
return TEXT_STATE_FADING;
}
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_INPUT_BANK) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_INPUT_DOGGY_RACETRACK_BET)) {
return TEXT_STATE_INPUT_RUPEES;
}
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_INPUT_BOMBER_CODE) {
return TEXT_STATE_INPUT_BOMBER_CODE;
}
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_INPUT_LOTTERY_CODE) {
return TEXT_STATE_INPUT_LOTTERY_CODE;
}
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_12) {
return TEXT_STATE_18;
}
return TEXT_STATE_DONE;
}
if (msgCtx->msgMode == MSGMODE_TEXT_AWAIT_NEXT) {
return TEXT_STATE_AWAITING_NEXT;
}
if (msgCtx->msgMode == MSGMODE_SONG_DEMONSTRATION_DONE) {
return TEXT_STATE_SONG_DEMO_DONE;
}
if ((msgCtx->ocarinaMode == OCARINA_MODE_EVENT) || (msgCtx->msgMode == MSGMODE_37)) {
return TEXT_STATE_8;
}
if (msgCtx->msgMode == MSGMODE_OCARINA_AWAIT_INPUT) {
return TEXT_STATE_9;
}
if ((msgCtx->msgMode == MSGMODE_21) || (msgCtx->msgMode == MSGMODE_3A)) {
return TEXT_STATE_11;
}
if (msgCtx->msgMode == MSGMODE_3D) {
return TEXT_STATE_12;
}
if (msgCtx->msgMode == MSGMODE_40) {
return TEXT_STATE_13;
}
if ((msgCtx->msgMode == MSGMODE_TEXT_CLOSING) && (msgCtx->stateTimer == 1) &&
(msgCtx->bombersNotebookEventQueueCount == 0)) {
return TEXT_STATE_CLOSING;
}
return TEXT_STATE_FADING;
}
void Message_DrawTextBox(PlayState* play, Gfx** gfxP) {
MessageContext* msgCtx = &play->msgCtx;
Gfx* gfx = *gfxP;
gDPPipeSync(gfx++);
if (((u32)msgCtx->textBoxType == TEXTBOX_TYPE_0) || (msgCtx->textBoxType == TEXTBOX_TYPE_2) ||
(msgCtx->textBoxType == TEXTBOX_TYPE_9) || (msgCtx->textBoxType == TEXTBOX_TYPE_A)) {
gDPSetRenderMode(gfx++, G_RM_CLD_SURF, G_RM_CLD_SURF2);
} else if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
gDPSetAlphaCompare(gfx++, G_AC_THRESHOLD);
gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
}
gDPSetPrimColor(gfx++, 0, 0, msgCtx->textboxColorRed, msgCtx->textboxColorGreen, msgCtx->textboxColorBlue,
msgCtx->textboxColorAlphaCurrent);
if (((u32)msgCtx->textBoxType == TEXTBOX_TYPE_0) || (msgCtx->textBoxType == TEXTBOX_TYPE_2) ||
(msgCtx->textBoxType == TEXTBOX_TYPE_6) || (msgCtx->textBoxType == TEXTBOX_TYPE_8) ||
(msgCtx->textBoxType == TEXTBOX_TYPE_9) || (msgCtx->textBoxType == TEXTBOX_TYPE_A)) {
gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment, G_IM_FMT_I, 128, 64, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, 7, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
} else {
gDPPipeSync(gfx++);
if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
gDPSetEnvColor(gfx++, 0, 0, 0, 255);
} else if (msgCtx->textBoxType == TEXTBOX_TYPE_D) {
gDPSetEnvColor(gfx++, 20, 0, 10, 255);
} else {
gDPSetEnvColor(gfx++, 50, 20, 0, 255);
}
gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment, G_IM_FMT_IA, 128, 64, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_MIRROR | G_TX_WRAP, 7, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}
if (msgCtx->textBoxType == TEXTBOX_TYPE_A) {
gSPTextureRectangle(gfx++, msgCtx->textboxX << 2, (msgCtx->textboxY + 22) << 2,
(msgCtx->textboxX + msgCtx->unk12008) << 2, (msgCtx->textboxY + 54) << 2, G_TX_RENDERTILE,
0, 6, msgCtx->unk1200C << 1, 2 << 10);
} else {
gSPTextureRectangle(gfx++, msgCtx->textboxX << 2, (msgCtx->textboxY) << 2,
(msgCtx->textboxX + sTextboxWidth) << 2, (msgCtx->textboxY + sTextboxHeight) << 2,
G_TX_RENDERTILE, 0, 0, sTextboxTexWidth, sTextboxTexHeight);
}
// Draw treble clef
if (msgCtx->textBoxType == TEXTBOX_TYPE_3) {
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE,
0);
gDPSetPrimColor(gfx++, 0, 0, 255, 100, 0, 255);
gDPLoadTextureBlock_4b(gfx++, gOcarinaTrebleClefTex, G_IM_FMT_I, 16, 32, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(gfx++, 78 << 2, 166 << 2, 94 << 2, 198 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
}
*gfxP = gfx++;
}
void Message_SetView(View* view) {
SET_FULLSCREEN_VIEWPORT(view);
View_ApplyOrthoToOverlay(view);
}
void func_80152CAC(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_SONATA) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_MONKEY);
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_HEALING) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_PIANO);
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_SARIAS) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_TATL);
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EPONAS) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_FEMALE_VOICE);
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_STORMS) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_BABY_SINGING);
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_ELDER_GORON_DRUMS);
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_OATH) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_TATL);
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_ELEGY) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_IKANA_KING);
} else {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
}
if ((msgCtx->ocarinaAction == OCARINA_ACTION_3B) || (msgCtx->ocarinaAction == OCARINA_ACTION_3C)) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_ELDER_GORON_DRUMS);
AudioOcarina_SetPlaybackSong(OCARINA_SONG_GORON_LULLABY_INTRO + 1, 0x83);
return;
}
if ((msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF)) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_BASS_GUITAR);
AudioOcarina_SetPlaybackSong(
((msgCtx->ocarinaAction - OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF) + OCARINA_SONG_EVAN_PART1 + 1),
0x84);
return;
}
if ((msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF)) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_ZORA_GUITAR);
AudioOcarina_SetPlaybackSong(
((msgCtx->ocarinaAction - OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) + OCARINA_SONG_EVAN_PART1 + 1),
0x44);
return;
}
AudioOcarina_SetPlaybackSong((msgCtx->ocarinaAction - OCARINA_ACTION_FREE_PLAY), 2);
}
s16 sOcarinaEffectActorIds[] = {
ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect
ACTOR_OCEFF_WIPE, // Song of Time Effect
ACTOR_OCEFF_WIPE7, // Song of Healing Effect
ACTOR_OCEFF_WIPE2, // Epona's Song Effect
ACTOR_OCEFF_WIPE6, // Song of Soaring Effect
ACTOR_OCEFF_STORM, // Song of Storms Effect II [?]
ACTOR_OCEFF_SPOT, // Sun's Song Effect
ACTOR_OCEFF_WIPE, // Song of Time Effect
ACTOR_OCEFF_WIPE, // Song of Time Effect
ACTOR_OCEFF_WIPE4 // Scarecrow's Song Effect
};
s32 sOcarinaEffectActorParams[] = { 0, 1, 2, 3, 4, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0 };
void Message_SpawnSongEffect(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Player* player = GET_PLAYER(play);
//! FAKE:
if (1) {}
if ((msgCtx->songPlayed <= OCARINA_SONG_SCARECROW_SPAWN) &&
(msgCtx->songPlayed != OCARINA_SONG_GORON_LULLABY_INTRO) &&
!((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
(msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU))) {
msgCtx->ocarinaSongEffectActive = true;
if (msgCtx->songPlayed != OCARINA_SONG_SCARECROW_SPAWN) {
Actor_Spawn(&play->actorCtx, play, sOcarinaEffectActorIds[msgCtx->songPlayed], player->actor.world.pos.x,
player->actor.world.pos.y, player->actor.world.pos.z, 0, 0, 0,
sOcarinaEffectActorParams[msgCtx->songPlayed]);
} else {
Actor_Spawn(&play->actorCtx, play, ACTOR_OCEFF_WIPE4, player->actor.world.pos.x, player->actor.world.pos.y,
player->actor.world.pos.z, 0, 0, 0, 0);
}
}
}
Color_RGB16 sOcarinaButtonAPrimColors[] = {
{ 80, 150, 255 },
{ 100, 200, 255 },
};
Color_RGB16 sOcarinaButtonAEnvColors[] = {
{ 10, 10, 10 },
{ 50, 50, 255 },
};
Color_RGB16 sOcarinaButtonCPrimColors[] = {
{ 255, 255, 50 },
{ 255, 255, 180 },
};
Color_RGB16 sOcarinaButtonCEnvColors[] = {
{ 10, 10, 10 },
{ 110, 110, 50 },
};
void Message_FlashOcarinaButtons(void) {
sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonAPrimR - sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].r) /
sOcarinaButtonFlashTimer;
sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonAPrimG - sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].g) /
sOcarinaButtonFlashTimer;
sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonAPrimB - sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].b) /
sOcarinaButtonFlashTimer;
if (sOcarinaButtonAPrimR >= sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].r) {
sOcarinaButtonAPrimR -= sOcarinaButtonStepR;
} else {
sOcarinaButtonAPrimR += sOcarinaButtonStepR;
}
if (sOcarinaButtonAPrimG >= sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].g) {
sOcarinaButtonAPrimG -= sOcarinaButtonStepG;
} else {
sOcarinaButtonAPrimG += sOcarinaButtonStepG;
}
if (sOcarinaButtonAPrimB >= sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].b) {
sOcarinaButtonAPrimB -= sOcarinaButtonStepB;
} else {
sOcarinaButtonAPrimB += sOcarinaButtonStepB;
}
sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonAEnvR - sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].r) /
sOcarinaButtonFlashTimer;
sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonAEnvG - sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].g) /
sOcarinaButtonFlashTimer;
sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonAEnvB - sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].b) /
sOcarinaButtonFlashTimer;
if (sOcarinaButtonCEnvR >= sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].r) {
sOcarinaButtonAEnvR -= sOcarinaButtonStepR;
} else {
sOcarinaButtonAEnvR += sOcarinaButtonStepR;
}
if (sOcarinaButtonCEnvG >= sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].g) {
sOcarinaButtonAEnvG -= sOcarinaButtonStepG;
} else {
sOcarinaButtonAEnvG += sOcarinaButtonStepG;
}
if (sOcarinaButtonCEnvB >= sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].b) {
sOcarinaButtonAEnvB -= sOcarinaButtonStepB;
} else {
sOcarinaButtonAEnvB += sOcarinaButtonStepB;
}
sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonCPrimR - sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].r) /
sOcarinaButtonFlashTimer;
sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonCPrimG - sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].g) /
sOcarinaButtonFlashTimer;
sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonCPrimB - sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].b) /
sOcarinaButtonFlashTimer;
if (sOcarinaButtonCPrimR >= sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].r) {
sOcarinaButtonCPrimR -= sOcarinaButtonStepR;
} else {
sOcarinaButtonCPrimR += sOcarinaButtonStepR;
}
if (sOcarinaButtonCPrimG >= sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].g) {
sOcarinaButtonCPrimG -= sOcarinaButtonStepG;
} else {
sOcarinaButtonCPrimG += sOcarinaButtonStepG;
}
if (sOcarinaButtonCPrimB >= sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].b) {
sOcarinaButtonCPrimB -= sOcarinaButtonStepB;
} else {
sOcarinaButtonCPrimB += sOcarinaButtonStepB;
}
sOcarinaButtonStepR = ABS_ALT(sOcarinaButtonCEnvR - sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].r) /
sOcarinaButtonFlashTimer;
sOcarinaButtonStepG = ABS_ALT(sOcarinaButtonCEnvG - sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].g) /
sOcarinaButtonFlashTimer;
sOcarinaButtonStepB = ABS_ALT(sOcarinaButtonCEnvB - sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].b) /
sOcarinaButtonFlashTimer;
if (sOcarinaButtonCEnvR >= sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].r) {
sOcarinaButtonCEnvR -= sOcarinaButtonStepR;
} else {
sOcarinaButtonCEnvR += sOcarinaButtonStepR;
}
if (sOcarinaButtonCEnvG >= sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].g) {
sOcarinaButtonCEnvG -= sOcarinaButtonStepG;
} else {
sOcarinaButtonCEnvG += sOcarinaButtonStepG;
}
if (sOcarinaButtonCEnvB >= sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].b) {
sOcarinaButtonCEnvB -= sOcarinaButtonStepB;
} else {
sOcarinaButtonCEnvB += sOcarinaButtonStepB;
}
sOcarinaButtonFlashTimer--;
if (sOcarinaButtonFlashTimer == 0) {
sOcarinaButtonAPrimR = sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].r;
sOcarinaButtonAPrimG = sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].g;
sOcarinaButtonAPrimB = sOcarinaButtonAPrimColors[sOcarinaButtonFlashColorIndex].b;
sOcarinaButtonAEnvR = sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].r;
sOcarinaButtonAEnvG = sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].g;
sOcarinaButtonAEnvB = sOcarinaButtonAEnvColors[sOcarinaButtonFlashColorIndex].b;
sOcarinaButtonCPrimR = sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].r;
sOcarinaButtonCPrimG = sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].g;
sOcarinaButtonCPrimB = sOcarinaButtonCPrimColors[sOcarinaButtonFlashColorIndex].b;
sOcarinaButtonCEnvR = sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].r;
sOcarinaButtonCEnvG = sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].g;
sOcarinaButtonCEnvB = sOcarinaButtonCEnvColors[sOcarinaButtonFlashColorIndex].b;
sOcarinaButtonFlashTimer = 3;
sOcarinaButtonFlashColorIndex ^= 1;
}
}
TexturePtr sOcarinaButtonTextures[] = {
gOcarinaATex, gOcarinaCDownTex, gOcarinaCRightTex, gOcarinaCLeftTex, gOcarinaCUpTex,
};
void Message_DrawOcarinaButtons(PlayState* play, Gfx** gfxP) {
MessageContext* msgCtx = &play->msgCtx;
Gfx* gfx = *gfxP;
u16 i;
u16 notePosX;
if ((play->msgCtx.msgMode >= MSGMODE_OCARINA_PLAYING) && (msgCtx->msgMode <= MSGMODE_40)) {
if ((msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY) &&
(msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME)) {
Gfx_SetupDL39_Ptr(&gfx);
gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
if ((msgCtx->msgMode == MSGMODE_SONG_PROMPT) || (msgCtx->msgMode == MSGMODE_36)) {
if ((msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) &&
(msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
if (msgCtx->ocarinaAction >= OCARINA_ACTION_TIMED_PROMPT_SONATA) {
sOcarinaButtonStepG = msgCtx->ocarinaAction - OCARINA_ACTION_TIMED_PROMPT_SONATA;
} else if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
// Can never pass as the conditional is opposite to one scope higher
sOcarinaButtonStepG = (msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) +
OCARINA_SONG_EVAN_PART1;
} else if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
(msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
sOcarinaButtonStepG = msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN +
OCARINA_SONG_WIND_FISH_HUMAN;
} else {
sOcarinaButtonStepG = msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_SONATA;
}
sOcarinaButtonStepR = gOcarinaSongButtons[sOcarinaButtonStepG].numButtons;
for (notePosX = 98, i = 0; i < sOcarinaButtonStepR; notePosX += 18, i++) {
gDPPipeSync(gfx++);
gDPSetPrimColor(gfx++, 0, 0, 150, 150, 150, 150);
gDPSetEnvColor(gfx++, 10, 10, 10, 0);
gDPLoadTextureBlock(
gfx++, sOcarinaButtonTextures[gOcarinaSongButtons[sOcarinaButtonStepG].buttonIndex[i]],
G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 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++, notePosX << 2,
msgCtx->ocarinaButtonsPosY[gOcarinaSongButtons[sOcarinaButtonStepG].buttonIndex[i]] << 2,
(notePosX + 16) << 2,
(msgCtx->ocarinaButtonsPosY[gOcarinaSongButtons[sOcarinaButtonStepG].buttonIndex[i]] + 16)
<< 2,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
}
}
}
if (msgCtx->msgMode != MSGMODE_SCARECROW_LONG_RECORDING_START) {
for (notePosX = 98, i = 0; i < 8; notePosX += 18, i++) {
if (sOcarinaButtonIndexBuf[i] == OCARINA_BTN_INVALID) {
break;
}
if (sOcarinaButtonAlphaValues[i] != 255) {
sOcarinaButtonAlphaValues[i] += 50;
if (sOcarinaButtonAlphaValues[i] >= 255) {
sOcarinaButtonAlphaValues[i] = 255;
}
}
gDPPipeSync(gfx++);
if (sOcarinaButtonIndexBuf[i] == OCARINA_BTN_A) {
gDPSetPrimColor(gfx++, 0, 0, sOcarinaButtonAPrimR, sOcarinaButtonAPrimG, sOcarinaButtonAPrimB,
sOcarinaButtonAlphaValues[i]);
gDPSetEnvColor(gfx++, sOcarinaButtonAEnvR, sOcarinaButtonAEnvG, sOcarinaButtonAEnvB, 0);
} else {
gDPSetPrimColor(gfx++, 0, 0, sOcarinaButtonCPrimR, sOcarinaButtonCPrimG, sOcarinaButtonCPrimB,
sOcarinaButtonAlphaValues[i]);
gDPSetEnvColor(gfx++, sOcarinaButtonCEnvR, sOcarinaButtonCEnvG, sOcarinaButtonCEnvB, 0);
}
gDPLoadTextureBlock(gfx++, sOcarinaButtonTextures[sOcarinaButtonIndexBuf[i]], G_IM_FMT_IA,
G_IM_SIZ_8b, 16, 16, 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++, notePosX << 2, msgCtx->ocarinaButtonsPosY[sOcarinaButtonIndexBuf[i]] << 2,
(notePosX + 16) << 2, (msgCtx->ocarinaButtonsPosY[sOcarinaButtonIndexBuf[i]] + 16) << 2,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
}
}
}
}
*gfxP = gfx;
}
void Message_DrawText(PlayState* play, Gfx** gfxP) {
if ((gSaveContext.options.language == LANGUAGE_JPN) && !play->msgCtx.textIsCredits) {
Message_DrawTextDefault(play, gfxP);
} else if (play->msgCtx.textIsCredits) {
Message_DrawTextCredits(play, gfxP);
} else {
Message_DrawTextNES(play, gfxP, 0);
}
}
void Message_DrawSceneTitleCard(PlayState* play, Gfx** gfxP) {
MessageContext* msgCtx = &play->msgCtx;
Gfx* gfx;
gfx = *gfxP;
Gfx_SetupDL39_Ptr(&gfx);
gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
gDPSetTextureFilter(gfx++, G_TF_BILERP);
gDPSetAlphaDither(gfx++, G_AD_NOTPATTERN);
gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, msgCtx->textboxColorAlphaCurrent);
gDPSetEnvColor(gfx++, 140, 40, 160, 255);
gDPLoadTextureBlock(gfx++, gSceneTitleCardGradientTex, G_IM_FMT_I, G_IM_SIZ_8b, 64, 1, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, 6, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(gfx++, 0, XREG(77) << 2, 320 << 2, (XREG(77) + XREG(76)) << 2, G_TX_RENDERTILE, 0, 0, 204,
1 << 10);
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
gDPSetEnvColor(gfx++, 0, 0, 0, 255);
if ((msgCtx->currentTextId < 0x1BB2) || (msgCtx->currentTextId >= 0x1BB7)) {
msgCtx->unk11FF8 = XREG(75);
}
msgCtx->unk11FFA = XREG(74);
Message_DrawTextNES(play, &gfx, 0);
*gfxP = gfx++;
}
s16 sOcarinaSongFanfares[] = {
NA_BGM_OCARINA_SONATA, // OCARINA_SONG_SONATA
NA_BGM_OCARINA_LULLABY, // OCARINA_SONG_GORON_LULLABY
NA_BGM_OCARINA_NEW_WAVE, // OCARINA_SONG_NEW_WAVE
NA_BGM_OCARINA_ELEGY, // OCARINA_SONG_ELEGY
NA_BGM_OCARINA_OATH, // OCARINA_SONG_OATH
NA_BGM_MAJORAS_LAIR, // OCARINA_SONG_SARIAS
NA_BGM_OCARINA_TIME, // OCARINA_SONG_TIME
NA_BGM_OCARINA_HEALING, // OCARINA_SONG_HEALING
NA_BGM_OCARINA_EPONA, // OCARINA_SONG_EPONAS
NA_BGM_OCARINA_SOARING, // OCARINA_SONG_SOARING
NA_BGM_OCARINA_STORM, // OCARINA_SONG_STORMS
NA_BGM_OCARINA_SUNS, // OCARINA_SONG_SUNS
NA_BGM_INVERTED_SONG_OF_TIME, // OCARINA_SONG_INVERTED_TIME
NA_BGM_SONG_OF_DOUBLE_TIME, // OCARINA_SONG_DOUBLE_TIME
NA_BGM_OCARINA_LULLABY_INTRO_PTR, // OCARINA_SONG_GORON_LULLABY_INTRO
NA_BGM_OCARINA_LULLABY_INTRO_PTR, // OCARINA_SONG_WIND_FISH_HUMAN
NA_BGM_OCARINA_LULLABY_INTRO_PTR, // OCARINA_SONG_WIND_FISH_GORON
};
s8 sOcarinaSongFanfareIoData[PLAYER_FORM_MAX] = {
0x35, // PLAYER_FORM_FIERCE_DEITY
0x5C, // PLAYER_FORM_GORON
0x5D, // PLAYER_FORM_ZORA
0x5E, // PLAYER_FORM_DEKU
0x35, // PLAYER_FORM_HUMAN
};
u8 sPlayerFormOcarinaInstruments[] = {
OCARINA_INSTRUMENT_DEFAULT,
OCARINA_INSTRUMENT_GORON_DRUMS,
OCARINA_INSTRUMENT_ZORA_GUITAR,
OCARINA_INSTRUMENT_DEKU_PIPES,
};
s16 D_801D03A8[TEXTBOX_TYPE_MAX] = {
0x3B, // TEXTBOX_TYPE_0
0x3B, // TEXTBOX_TYPE_1
0x3B, // TEXTBOX_TYPE_2
0x3B, // TEXTBOX_TYPE_3
0x22, // TEXTBOX_TYPE_4
0x3B, // TEXTBOX_TYPE_5
0x3B, // TEXTBOX_TYPE_6
0x3B, // TEXTBOX_TYPE_7
0x3B, // TEXTBOX_TYPE_8
0x3B, // TEXTBOX_TYPE_9
0x3B, // TEXTBOX_TYPE_A
0x3B, // TEXTBOX_TYPE_B
0x3B, // TEXTBOX_TYPE_C
0x3B, // TEXTBOX_TYPE_D
0x3B, // TEXTBOX_TYPE_E
0x3B, // TEXTBOX_TYPE_F
};
void Message_DrawMain(PlayState* play, Gfx** gfxP) {
s32 pad;
MessageContext* msgCtx = &play->msgCtx;
Gfx* gfx;
u16 i;
u16 buttonIndexPos;
u8 ocarinaError;
s32 j;
s16 temp_v0_33;
s16 temp;
gfx = *gfxP;
gSPSegment(gfx++, 0x02, play->interfaceCtx.parameterSegment);
gSPSegment(gfx++, 0x07, msgCtx->textboxSegment);
if (msgCtx->msgLength != 0) {
if (!msgCtx->textIsCredits) {
Message_SetView(&msgCtx->view);
Gfx_SetupDL39_Ptr(&gfx);
if (msgCtx->ocarinaAction != OCARINA_ACTION_37) {
if ((msgCtx->msgMode != MSGMODE_18) && (msgCtx->msgMode != MSGMODE_39) &&
(msgCtx->msgMode != MSGMODE_3C) && (msgCtx->msgMode != MSGMODE_3F) &&
(msgCtx->msgMode != MSGMODE_3A) && (msgCtx->msgMode != MSGMODE_3D) &&
(msgCtx->msgMode != MSGMODE_40) &&
(((msgCtx->msgMode >= MSGMODE_TEXT_BOX_GROWING) && (msgCtx->msgMode <= MSGMODE_TEXT_DONE)) ||
((msgCtx->msgMode >= MSGMODE_NEW_CYCLE_0) && (msgCtx->msgMode <= MSGMODE_OWL_SAVE_2))) &&
(D_801CFC78[msgCtx->textBoxType] != 0xE)) {
Message_DrawTextBox(play, &gfx);
}
}
}
Gfx_SetupDL39_Ptr(&gfx);
gDPSetAlphaCompare(gfx++, G_AC_NONE);
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
0);
if (YREG(0) != msgCtx->msgMode) {
YREG(0) = msgCtx->msgMode;
YREG(1) = msgCtx->ocarinaAction;
}
switch (msgCtx->msgMode) {
case MSGMODE_TEXT_START:
case MSGMODE_TEXT_BOX_GROWING:
case MSGMODE_TEXT_STARTING:
case MSGMODE_TEXT_NEXT_MSG:
break;
case MSGMODE_TEXT_CONTINUING:
if (msgCtx->stateTimer == 1) {
for (i = 0, j = 0; i < 48; i++, j += FONT_CHAR_TEX_SIZE) {
Font_LoadChar(play, ' ', j);
}
Message_DrawText(play, &gfx);
} else {
gDPPipeSync(gfx++);
gDPSetRenderMode(gfx++, G_RM_CLD_SURF, G_RM_CLD_SURF2);
gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 0);
gDPSetEnvColor(gfx++, 0, 0, 0, 255);
}
break;
case MSGMODE_TEXT_DISPLAYING:
case MSGMODE_TEXT_DELAYED_BREAK:
case MSGMODE_9:
if ((gSaveContext.options.language == LANGUAGE_JPN) && !msgCtx->textIsCredits) {
if (msgCtx->textDelay != 0) {
msgCtx->textDrawPos += msgCtx->textDelay;
}
Message_DrawTextNES(play, &gfx, 0);
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
Message_DrawTextNES(play, &gfx, (s32)msgCtx->textDrawPos);
}
} else if (msgCtx->textIsCredits) {
Message_DrawTextCredits(play, &gfx);
} else {
if (msgCtx->textDelay != 0) {
msgCtx->textDrawPos += msgCtx->textDelay;
}
Message_DrawTextNES(play, &gfx, 0);
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
Message_DrawTextNES(play, &gfx, (s32)msgCtx->textDrawPos);
}
}
break;
case MSGMODE_NEW_CYCLE_0:
case MSGMODE_NEW_CYCLE_1:
case MSGMODE_NEW_CYCLE_2:
case MSGMODE_OWL_SAVE_0:
case MSGMODE_OWL_SAVE_1:
case MSGMODE_OWL_SAVE_2:
Message_DrawTextNES(play, &gfx, 0);
break;
case MSGMODE_TEXT_AWAIT_INPUT:
case MSGMODE_TEXT_AWAIT_NEXT:
Message_DrawText(play, &gfx);
Message_DrawTextboxIcon(play, &gfx, 158,
(s16)(D_801D03A8[msgCtx->textBoxType] + msgCtx->textboxYTarget));
break;
case MSGMODE_OCARINA_STARTING:
case MSGMODE_SONG_DEMONSTRATION_STARTING:
case MSGMODE_SONG_PROMPT_STARTING:
case MSGMODE_32:
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
if ((msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) &&
(msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
msgCtx->ocarinaStaff->pos = 0;
sOcarinaButtonIndexBufPos = 0;
Message_ResetOcarinaButtonState(play);
}
sOcarinaButtonFlashColorIndex = 1;
sOcarinaButtonFlashTimer = 3;
if (msgCtx->msgMode == MSGMODE_OCARINA_STARTING) {
if ((msgCtx->ocarinaAction == OCARINA_ACTION_0) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_RECORDING) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME) ||
(msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_TIME)) {
if ((msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_10)) {
AudioOcarina_StartDefault(msgCtx->ocarinaAvailableSongs | 0xC0000000);
} else if (CHECK_EVENTINF(EVENTINF_31)) {
AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
AudioOcarina_StartDefault(0x80800000);
} else {
AudioOcarina_StartAtSongStartingPos((msgCtx->ocarinaAvailableSongs + 0x80000) |
0xC0000000);
AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
}
} else {
AudioOcarina_StartDefault(msgCtx->ocarinaAvailableSongs);
}
} else {
AudioOcarina_StartDefault((1 << msgCtx->ocarinaAction) | 0x80000000);
}
msgCtx->msgMode = MSGMODE_OCARINA_PLAYING;
if (CHECK_EVENTINF(EVENTINF_24)) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEKU_TRUMPET);
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_41_20)) {
AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
//! FAKE:
(void)CUR_FORM;
if (gSaveContext.save.playerForm == 4) {}
} else {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_AMPLIFIED_GUITAR);
}
} else if (msgCtx->msgMode == MSGMODE_SONG_DEMONSTRATION_STARTING) {
msgCtx->stateTimer = 20;
msgCtx->msgMode = MSGMODE_19;
} else if (msgCtx->msgMode == MSGMODE_32) {
AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
AudioOcarina_StartDefault(0x80800000);
msgCtx->msgMode = MSGMODE_33;
} else { // MSGMODE_SONG_PROMPT_STARTING
if (CHECK_EVENTINF(EVENTINF_24)) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEKU_TRUMPET);
} else {
AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
}
if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
AudioOcarina_StartForSongCheck(
(1 << (OCARINA_ACTION_PROMPT_SONATA + msgCtx->ocarinaAction)) | 0x80000000, 4);
msgCtx->msgMode = MSGMODE_SONG_PROMPT;
} else {
if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
(msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
AudioOcarina_StartDefault(
(1 << ((msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) +
OCARINA_SONG_WIND_FISH_HUMAN)) |
0x80000000);
} else {
AudioOcarina_StartDefault(
(1 << ((msgCtx->ocarinaAction - OCARINA_ACTION_PROMPT_SONATA) + OCARINA_SONG_SONATA)) |
0x80000000);
}
msgCtx->msgMode = MSGMODE_SONG_PROMPT;
}
}
if ((msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY) &&
(msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME)) {
Message_DrawText(play, &gfx);
}
break;
case MSGMODE_OCARINA_PLAYING:
msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
if ((u32)msgCtx->ocarinaStaff->pos != 0) {
if ((msgCtx->ocarinaStaff->pos == 1) && (sOcarinaButtonIndexBufPos == 8)) {
sOcarinaButtonIndexBufPos = 0;
}
if (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1)) {
msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] =
msgCtx->ocarinaStaff->buttonIndex;
sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID;
sOcarinaButtonIndexBufPos++;
}
}
msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_SCARECROW_SPAWN) {
if (msgCtx->ocarinaStaff->state == OCARINA_SONG_EVAN_PART1) {
AudioOcarina_ResetAndReadInput();
AudioOcarina_StartDefault(0x80100000);
} else if (msgCtx->ocarinaStaff->state == OCARINA_SONG_EVAN_PART2) {
Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
AudioOcarina_SetOcarinaDisableTimer(0, 20);
Message_CloseTextbox(play);
play->msgCtx.ocarinaMode = OCARINA_MODE_PLAYED_FULL_EVAN_SONG;
} else if ((msgCtx->ocarinaStaff->state == OCARINA_SONG_SCARECROW_SPAWN) ||
(msgCtx->ocarinaStaff->state == OCARINA_SONG_INVERTED_TIME) ||
(msgCtx->ocarinaStaff->state == OCARINA_SONG_DOUBLE_TIME) ||
(msgCtx->ocarinaStaff->state == OCARINA_SONG_GORON_LULLABY_INTRO) ||
CHECK_QUEST_ITEM(QUEST_SONG_SONATA + msgCtx->ocarinaStaff->state)) {
sLastPlayedSong = msgCtx->ocarinaStaff->state;
msgCtx->lastPlayedSong = msgCtx->ocarinaStaff->state;
msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
msgCtx->msgMode = MSGMODE_E;
msgCtx->stateTimer = 20;
if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME) {
if ((msgCtx->ocarinaStaff->state <= OCARINA_SONG_SARIAS) ||
(msgCtx->ocarinaStaff->state == OCARINA_SONG_SCARECROW_SPAWN)) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
msgCtx->msgMode = MSGMODE_OCARINA_STARTING;
} else {
Message_ContinueTextbox(play, 0x1B5B);
msgCtx->msgMode = MSGMODE_SONG_PLAYED;
msgCtx->textBoxType = TEXTBOX_TYPE_3;
msgCtx->stateTimer = 10;
Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
}
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_SCARECROW_SPAWN) {
if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_STORMS) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
msgCtx->stateTimer = 10;
msgCtx->msgMode = MSGMODE_OCARINA_FAIL;
} else {
Message_ContinueTextbox(play, 0x1B5B);
msgCtx->msgMode = MSGMODE_SONG_PLAYED;
msgCtx->textBoxType = TEXTBOX_TYPE_3;
msgCtx->stateTimer = 10;
Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
}
} else if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) {
Message_ContinueTextbox(play, 0x1B5B);
msgCtx->msgMode = MSGMODE_SONG_PLAYED;
msgCtx->textBoxType = TEXTBOX_TYPE_3;
msgCtx->stateTimer = 10;
Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
} else {
Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
}
Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
} else {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
msgCtx->msgMode = MSGMODE_OCARINA_STARTING;
}
} else if (msgCtx->ocarinaStaff->state == OCARINA_SONG_TERMINA_WALL) {
Message_CloseTextbox(play);
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
SET_EVENTINF(EVENTINF_32);
Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
AudioOcarina_SetOcarinaDisableTimer(0, 20);
} else if (msgCtx->ocarinaStaff->state == 0xFF) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_10)) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
msgCtx->stateTimer = 10;
msgCtx->msgMode = MSGMODE_OCARINA_FAIL;
} else {
AudioOcarina_SetSongStartingPos();
AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
AudioOcarina_StartAtSongStartingPos((msgCtx->ocarinaAvailableSongs + 0x80000) | 0xC0000000);
}
}
if ((msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY) &&
(msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME)) {
Message_DrawText(play, &gfx);
}
break;
case MSGMODE_E:
case MSGMODE_SONG_PROMPT_SUCCESS:
case MSGMODE_22:
case MSGMODE_SCARECROW_SPAWN_RECORDING_DONE:
case MSGMODE_34:
Message_FlashOcarinaButtons();
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
if (msgCtx->msgMode == MSGMODE_E) {
Message_ContinueTextbox(play, 0x1B5B);
msgCtx->msgMode = MSGMODE_SONG_PLAYED;
msgCtx->textBoxType = TEXTBOX_TYPE_3;
msgCtx->stateTimer = 1;
} else if (msgCtx->msgMode == MSGMODE_SONG_PROMPT_SUCCESS) {
Message_ContinueTextbox(play, 0x1B5B);
msgCtx->msgMode = MSGMODE_SONG_PLAYED;
msgCtx->textBoxType = TEXTBOX_TYPE_3;
msgCtx->stateTimer = 1;
} else if (msgCtx->msgMode == MSGMODE_22) {
msgCtx->msgMode = MSGMODE_23;
play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
msgCtx->textBoxType = TEXTBOX_TYPE_0;
} else if (msgCtx->msgMode == MSGMODE_34) {
if (msgCtx->songPlayed == OCARINA_SONG_TERMINA_WALL) {
Message_CloseTextbox(play);
play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
Audio_PlaySfx(NA_SE_SY_CORRECT_CHIME);
} else {
Message_CloseTextbox(play);
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
} else {
Message_CloseTextbox(play);
play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
}
}
Message_DrawText(play, &gfx);
break;
case MSGMODE_OCARINA_FAIL:
case MSGMODE_SONG_PROMPT_FAIL:
Message_DrawText(play, &gfx);
// fallthrough
case MSGMODE_OCARINA_FAIL_NO_TEXT:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
D_801C6A94 = 1;
if (msgCtx->msgMode == MSGMODE_SONG_PROMPT_FAIL) {
Message_ContinueTextbox(play, 0x1B89);
Message_Decode(play);
msgCtx->msgMode = MSGMODE_SONG_PROMPT_NOTES_DROP;
} else {
msgCtx->msgMode = MSGMODE_OCARINA_NOTES_DROP;
}
}
break;
case MSGMODE_OCARINA_NOTES_DROP:
case MSGMODE_SONG_PROMPT_NOTES_DROP:
for (i = 0; i < 5; i++) {
msgCtx->ocarinaButtonsPosY[i] += D_801C6A94;
}
D_801C6A94 += D_801C6A94;
if (D_801C6A94 >= 0x226) {
Message_ResetOcarinaButtonAlphas();
if (msgCtx->msgMode == MSGMODE_SONG_PROMPT_NOTES_DROP) {
msgCtx->msgMode = MSGMODE_OCARINA_AWAIT_INPUT;
msgCtx->stateTimer = 10;
} else {
msgCtx->msgMode = MSGMODE_OCARINA_STARTING;
}
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
break;
case MSGMODE_SONG_PLAYED:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
Message_Decode(play);
msgCtx->msgMode = MSGMODE_SETUP_DISPLAY_SONG_PLAYED;
msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
msgCtx->ocarinaStaff->pos = 0;
sOcarinaButtonIndexBufPos = 0;
Message_ResetOcarinaButtonState(play);
Message_SpawnSongEffect(play);
}
break;
case MSGMODE_SETUP_DISPLAY_SONG_PLAYED:
Message_DrawText(play, &gfx);
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
(msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
AudioOcarina_SetPlaybackSong(msgCtx->ocarinaAction - OCARINA_ACTION_SCARECROW_LONG_RECORDING, 1);
} else {
AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
AudioOcarina_SetPlaybackSong((u8)msgCtx->songPlayed + 1, 1);
if (msgCtx->songPlayed != OCARINA_SONG_SCARECROW_SPAWN) {
Audio_PlayFanfareWithPlayerIOPort7((u16)sOcarinaSongFanfares[msgCtx->songPlayed],
(u8)sOcarinaSongFanfareIoData[CUR_FORM]);
AudioSfx_MuteBanks(0x20);
}
}
play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY) {
msgCtx->ocarinaAction = OCARINA_ACTION_FREE_PLAY_DONE;
}
if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOTIME) {
msgCtx->ocarinaAction = OCARINA_ACTION_CHECK_NOTIME_DONE;
}
sOcarinaButtonIndexBufPos = 0;
msgCtx->msgMode = MSGMODE_DISPLAY_SONG_PLAYED;
break;
case MSGMODE_DISPLAY_SONG_PLAYED_TEXT_BEGIN:
if (msgCtx->songPlayed == OCARINA_SONG_SCARECROW_SPAWN) {
Message_ContinueTextbox(play, 0x1B6B);
} else {
Message_ContinueTextbox(play, 0x1B72 + msgCtx->songPlayed);
}
Message_Decode(play);
msgCtx->msgMode = MSGMODE_16;
msgCtx->stateTimer = 20;
Message_DrawText(play, &gfx);
break;
case MSGMODE_16:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
msgCtx->msgMode = MSGMODE_17;
}
Message_DrawText(play, &gfx);
break;
case MSGMODE_17:
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
Message_ResetOcarinaButtonState(play);
msgCtx->msgMode = MSGMODE_18;
msgCtx->stateTimer = 2;
Message_DrawText(play, &gfx);
break;
case MSGMODE_18:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
Message_CloseTextbox(play);
if (msgCtx->songPlayed == OCARINA_SONG_EPONAS) {
gHorsePlayedEponasSong = true;
}
if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY_DONE) {
if (sLastPlayedSong == OCARINA_SONG_ELEGY) {
if ((play->sceneId == SCENE_F40) || (play->sceneId == SCENE_F41) ||
(play->sceneId == SCENE_IKANAMAE) || (play->sceneId == SCENE_CASTLE) ||
(play->sceneId == SCENE_IKNINSIDE) || (play->sceneId == SCENE_IKANA) ||
(play->sceneId == SCENE_INISIE_N) || (play->sceneId == SCENE_INISIE_R) ||
(play->sceneId == SCENE_INISIE_BS) || (play->sceneId == SCENE_RANDOM) ||
(play->sceneId == SCENE_REDEAD) || (play->sceneId == SCENE_TOUGITES)) {
play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
} else {
sLastPlayedSong = 0xFF;
Message_StartTextbox(play, 0x1B95, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
}
} else {
play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
if (msgCtx->songPlayed == OCARINA_SONG_SCARECROW_SPAWN) {
play->msgCtx.ocarinaMode = OCARINA_MODE_PLAYED_SCARECROW_SPAWN;
}
}
} else if (msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_SONATA) {
if ((OCARINA_ACTION_CHECK_SONATA + msgCtx->songPlayed) == msgCtx->ocarinaAction) {
play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
} else {
play->msgCtx.ocarinaMode = msgCtx->songPlayed - 1;
}
} else if ((OCARINA_ACTION_PROMPT_SONATA + msgCtx->songPlayed) == msgCtx->ocarinaAction) {
play->msgCtx.ocarinaMode = OCARINA_MODE_EVENT;
} else {
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
}
break;
case MSGMODE_19:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
func_80152CAC(play);
sOcarinaButtonIndexBufPos = 0;
msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION;
}
Message_DrawText(play, &gfx);
break;
case MSGMODE_DISPLAY_SONG_PLAYED:
case MSGMODE_SONG_DEMONSTRATION:
msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
if (msgCtx->ocarinaStaff->state == 0) {
if ((msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF)) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
if ((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
(msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
Message_CloseTextbox(play);
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
} else if (msgCtx->msgMode == MSGMODE_DISPLAY_SONG_PLAYED) {
msgCtx->msgMode = MSGMODE_DISPLAY_SONG_PLAYED_TEXT_BEGIN;
} else {
msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION_DONE;
}
} else {
if ((sOcarinaButtonIndexBufPos != 0) && (msgCtx->ocarinaStaff->pos == 1)) {
sOcarinaButtonIndexBufPos = 0;
}
if (((u32)msgCtx->ocarinaStaff->pos != 0) &&
(sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) {
msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] =
msgCtx->ocarinaStaff->buttonIndex;
sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID;
sOcarinaButtonIndexBufPos++;
}
}
// fallthrough
case MSGMODE_SONG_DEMONSTRATION_DONE:
Message_DrawText(play, &gfx);
break;
case MSGMODE_SONG_PROMPT:
case MSGMODE_33:
msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
if (((u32)msgCtx->ocarinaStaff->pos != 0) &&
(sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) {
msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] =
msgCtx->ocarinaStaff->buttonIndex;
sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID;
sOcarinaButtonIndexBufPos++;
}
if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_SCARECROW_SPAWN) {
if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
msgCtx->msgMode = MSGMODE_22;
} else {
msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
msgCtx->msgMode = MSGMODE_SONG_PROMPT_SUCCESS;
if (msgCtx->ocarinaStaff->state == OCARINA_SONG_GORON_LULLABY_INTRO) {
Item_Give(play, ITEM_SONG_LULLABY_INTRO);
} else if (!((msgCtx->ocarinaAction >= OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN) &&
(msgCtx->ocarinaAction <= OCARINA_ACTION_PROMPT_WIND_FISH_DEKU)) &&
(msgCtx->ocarinaStaff->state != OCARINA_SONG_NEW_WAVE)) {
Item_Give(play,
(gOcarinaSongItemMap[msgCtx->ocarinaStaff->state] + ITEM_SONG_SONATA) & 0xFF);
}
}
msgCtx->stateTimer = 20;
Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
} else if (msgCtx->ocarinaStaff->state == OCARINA_SONG_TERMINA_WALL) {
msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
msgCtx->msgMode = MSGMODE_34;
Item_Give(play, (gOcarinaSongItemMap[msgCtx->ocarinaStaff->state] + ITEM_SONG_SONATA) & 0xFF);
msgCtx->stateTimer = 20;
AudioOcarina_SetOcarinaDisableTimer(0, 20);
Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
} else if (msgCtx->ocarinaStaff->state == 0xFF) {
Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
msgCtx->stateTimer = 10;
if (msgCtx->msgMode == MSGMODE_SONG_PROMPT) {
msgCtx->msgMode = MSGMODE_SONG_PROMPT_FAIL;
} else {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
Message_CloseTextbox(play);
}
}
Message_DrawText(play, &gfx);
break;
case MSGMODE_OCARINA_AWAIT_INPUT:
Message_DrawText(play, &gfx);
if ((msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) ||
(msgCtx->ocarinaAction == OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
msgCtx->msgMode = MSGMODE_21;
msgCtx->textBoxType = TEXTBOX_TYPE_0;
}
}
break;
case MSGMODE_SCARECROW_LONG_RECORDING_START:
AudioOcarina_SetRecordingState(OCARINA_RECORD_SCARECROW_LONG);
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff();
msgCtx->ocarinaStaff->pos = 0;
sOcarinaButtonIndexBufPos = 0;
sOcarinaButtonIndexBufLen = 0;
Message_ResetOcarinaButtonState(play);
msgCtx->msgMode = MSGMODE_SCARECROW_LONG_RECORDING_ONGOING;
Message_DrawText(play, &gfx);
break;
case MSGMODE_SCARECROW_LONG_RECORDING_ONGOING:
msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff();
if (((u32)msgCtx->ocarinaStaff->pos != 0) &&
(sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) {
if (sOcarinaButtonIndexBufLen >= 8) {
for (buttonIndexPos = sOcarinaButtonIndexBufLen - 8, i = 0; i < 8; i++, buttonIndexPos++) {
sOcarinaButtonIndexBuf[buttonIndexPos] = sOcarinaButtonIndexBuf[buttonIndexPos + 1];
}
sOcarinaButtonIndexBufLen--;
}
msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] =
msgCtx->ocarinaStaff->buttonIndex;
sOcarinaButtonIndexBufLen++;
sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = OCARINA_BTN_INVALID;
sOcarinaButtonIndexBufPos++;
if (msgCtx->ocarinaStaff) {}
if (msgCtx->ocarinaStaff->pos == 8) {
sOcarinaButtonIndexBufPos = 0;
}
}
Message_DrawText(play, &gfx);
break;
case MSGMODE_SCARECROW_LONG_DEMONSTRATION:
case MSGMODE_SCARECROW_SPAWN_DEMONSTRATION:
msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff();
if (((u32)msgCtx->ocarinaStaff->pos != 0) &&
(sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) {
if (sOcarinaButtonIndexBufLen >= 8) {
for (buttonIndexPos = sOcarinaButtonIndexBufLen - 8, i = 0; i < 8; i++, buttonIndexPos++) {
sOcarinaButtonIndexBuf[buttonIndexPos] = sOcarinaButtonIndexBuf[buttonIndexPos + 1];
}
sOcarinaButtonIndexBufLen--;
}
sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = msgCtx->ocarinaStaff->buttonIndex;
sOcarinaButtonIndexBufLen++;
sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = OCARINA_BTN_INVALID;
sOcarinaButtonIndexBufPos++;
if (msgCtx->ocarinaStaff->pos == 8) {
sOcarinaButtonIndexBufLen = sOcarinaButtonIndexBufPos = 0;
}
}
if (msgCtx->stateTimer == 0) {
if (msgCtx->ocarinaStaff->state == 0) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
play->msgCtx.ocarinaMode = OCARINA_MODE_11;
Message_CloseTextbox(play);
}
} else {
msgCtx->stateTimer--;
}
break;
case MSGMODE_SCARECROW_SPAWN_RECORDING_START:
AudioOcarina_SetRecordingState(OCARINA_RECORD_SCARECROW_SPAWN);
AudioOcarina_SetInstrument(sPlayerFormOcarinaInstruments[CUR_FORM]);
msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING;
Message_DrawText(play, &gfx);
break;
case MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING:
msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff();
if ((u32)msgCtx->ocarinaStaff->pos != 0) {
if (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1)) {
msgCtx->ocarinaButtonIndex = sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufPos] =
msgCtx->ocarinaStaff->buttonIndex;
sOcarinaButtonIndexBufPos++;
sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufPos] = OCARINA_BTN_INVALID;
}
}
if (msgCtx->ocarinaStaff->state == 0) {
msgCtx->stateTimer = 20;
gSaveContext.save.saveInfo.scarecrowSpawnSongSet = true;
msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_DONE;
Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
Lib_MemCpy(gSaveContext.save.saveInfo.scarecrowSpawnSong, gScarecrowSpawnSongPtr,
sizeof(gSaveContext.save.saveInfo.scarecrowSpawnSong));
for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.scarecrowSpawnSong); i++) {
// osSyncPrintf("%d, ", gSaveContext.scarecrowSpawnSong[i]);
}
} else if (msgCtx->ocarinaStaff->state == 0xFF) {
AudioOcarina_SetRecordingState(OCARINA_RECORD_OFF);
Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
Message_CloseTextbox(play);
msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED;
}
Message_DrawText(play, &gfx);
break;
case MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED:
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
Message_StartTextbox(play, 0x1647, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
break;
case MSGMODE_2F:
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
msgCtx->ocarinaStaff->pos = 0;
sOcarinaButtonIndexBufPos = 0;
play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
Message_ResetOcarinaButtonState(play);
AudioOcarina_StartDefault(msgCtx->ocarinaAvailableSongs | 0xC0000000);
msgCtx->msgMode = MSGMODE_30;
break;
case MSGMODE_30:
msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
if (((u32)msgCtx->ocarinaStaff->pos != 0) &&
(sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1))) {
msgCtx->ocarinaButtonIndex = msgCtx->ocarinaStaff->buttonIndex;
msgCtx->ocarinaStaff->pos = 0;
sOcarinaButtonIndexBufPos = 0;
Message_ResetOcarinaButtonState(play);
msgCtx->msgMode = MSGMODE_31;
}
break;
case MSGMODE_35:
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT);
msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
msgCtx->ocarinaStaff->pos = 0;
sOcarinaButtonIndexBufPos = 0;
play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
Message_ResetOcarinaButtonState(play);
sOcarinaButtonFlashColorIndex = 1;
sOcarinaButtonFlashTimer = 3;
AudioOcarina_StartWithSongNoteLengths(
(1 << ((msgCtx->ocarinaAction - OCARINA_ACTION_TIMED_PROMPT_SONATA) & 0xFFFF)) | 0x80000000);
msgCtx->msgMode = MSGMODE_36;
Message_DrawText(play, &gfx);
break;
case MSGMODE_36:
msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff();
if ((u32)msgCtx->ocarinaStaff->pos != 0) {
if (sOcarinaButtonIndexBufPos == (msgCtx->ocarinaStaff->pos - 1)) {
sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->buttonIndex;
sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID;
sOcarinaButtonIndexBufPos++;
}
}
if (msgCtx->ocarinaStaff->state <= OCARINA_SONG_SCARECROW_SPAWN) {
msgCtx->songPlayed = msgCtx->ocarinaStaff->state;
msgCtx->msgMode = MSGMODE_37;
Item_Give(play, (gOcarinaSongItemMap[msgCtx->ocarinaStaff->state] + ITEM_SONG_SONATA) & 0xFF);
msgCtx->stateTimer = 20;
Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR);
} else if (msgCtx->ocarinaStaff->state == 0xFF) {
ocarinaError = func_8019B5AC();
if (ocarinaError == OCARINA_ERROR_2) {
Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
D_801C6A94 = 1;
msgCtx->msgMode = MSGMODE_3B;
} else if (ocarinaError == OCARINA_ERROR_3) {
Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
D_801C6A94 = 1;
msgCtx->msgMode = MSGMODE_3E;
} else {
Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
D_801C6A94 = 1;
msgCtx->msgMode = MSGMODE_38;
}
}
Message_DrawText(play, &gfx);
break;
case MSGMODE_37:
Message_FlashOcarinaButtons();
Message_DrawText(play, &gfx);
break;
case MSGMODE_38:
case MSGMODE_3B:
case MSGMODE_3E:
// notes drop
for (i = 0; i < 5; i++) {
msgCtx->ocarinaButtonsPosY[i] += D_801C6A94;
}
D_801C6A94 += D_801C6A94;
if (D_801C6A94 >= 0x226) {
Message_ResetOcarinaButtonAlphas();
msgCtx->textBoxType = TEXTBOX_TYPE_0;
msgCtx->textboxColorRed = msgCtx->textboxColorGreen = msgCtx->textboxColorBlue = 0;
msgCtx->stateTimer = 3;
msgCtx->msgMode++;
}
break;
case MSGMODE_39:
case MSGMODE_3C:
case MSGMODE_3F:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
msgCtx->msgMode++;
}
break;
case MSGMODE_TEXT_DONE:
switch (msgCtx->textboxEndType) {
case TEXTBOX_ENDTYPE_INPUT_BANK:
temp_v0_33 = msgCtx->unk120BE;
temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33);
func_80147F18(play, &gfx,
msgCtx->unk11F1A[temp_v0_33] +
(s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 5)) - 1,
temp);
func_80148D64(play);
break;
case TEXTBOX_ENDTYPE_INPUT_DOGGY_RACETRACK_BET:
temp_v0_33 = msgCtx->unk120BE;
temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33);
func_80148558(play, &gfx,
msgCtx->unk11F1A[temp_v0_33] + (s32)(16.0f * msgCtx->textCharScale * 5.0f) - 1,
temp);
func_80149048(play);
break;
case TEXTBOX_ENDTYPE_INPUT_BOMBER_CODE:
temp_v0_33 = msgCtx->unk120BE;
temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33);
func_80147F18(play, &gfx,
msgCtx->unk11F1A[temp_v0_33] +
(s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 5)) - 1,
temp);
func_801491DC(play);
break;
case TEXTBOX_ENDTYPE_INPUT_LOTTERY_CODE:
temp_v0_33 = msgCtx->unk120BE;
temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33);
func_80147F18(play, &gfx,
msgCtx->unk11F1A[temp_v0_33] +
(s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 5)) - 1,
temp);
func_80149454(play);
break;
case TEXTBOX_ENDTYPE_64:
temp_v0_33 = msgCtx->unk120BE;
temp = msgCtx->unk11FFA + (msgCtx->unk11FFC * temp_v0_33);
func_80147F18(play, &gfx,
msgCtx->unk11F1A[temp_v0_33] +
(s32)(16.0f * msgCtx->textCharScale * (msgCtx->unk120C2 + 4)) - 6,
temp);
func_801496C8(play);
break;
default:
break;
}
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
PRIMITIVE, 0);
gDPSetEnvColor(gfx++, 0, 0, 0, 255);
Message_DrawText(play, &gfx);
switch (msgCtx->textboxEndType) {
case TEXTBOX_ENDTYPE_TWO_CHOICE:
func_80148CBC(play, &gfx, 1);
break;
case TEXTBOX_ENDTYPE_THREE_CHOICE:
func_80148CBC(play, &gfx, 2);
break;
case TEXTBOX_ENDTYPE_12:
func_80148CBC(play, &gfx, 1);
break;
case TEXTBOX_ENDTYPE_PERSISTENT:
case TEXTBOX_ENDTYPE_PAUSE_MENU:
case TEXTBOX_ENDTYPE_FADE_NORMAL:
case TEXTBOX_ENDTYPE_FADE_SKIPPABLE:
case TEXTBOX_ENDTYPE_FADE_STAGES_1:
case TEXTBOX_ENDTYPE_FADE_STAGES_2:
case TEXTBOX_ENDTYPE_FADE_STAGES_3:
case TEXTBOX_ENDTYPE_INPUT_BOMBER_CODE:
break;
case TEXTBOX_ENDTYPE_EVENT:
case TEXTBOX_ENDTYPE_INPUT_BANK:
case TEXTBOX_ENDTYPE_INPUT_DOGGY_RACETRACK_BET:
default:
Message_DrawTextboxIcon(play, &gfx, 158,
(s16)(D_801D03A8[msgCtx->textBoxType] + msgCtx->textboxYTarget));
break;
case TEXTBOX_ENDTYPE_EVENT2:
Message_DrawTextboxIcon(play, &gfx, 158,
(s16)(D_801D03A8[msgCtx->textBoxType] + msgCtx->textboxYTarget));
break;
}
break;
case MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND:
case MSGMODE_SCENE_TITLE_CARD_FADE_IN_TEXT:
case MSGMODE_SCENE_TITLE_CARD_DISPLAYING:
case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_TEXT:
case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND:
Message_DrawSceneTitleCard(play, &gfx);
break;
case MSGMODE_21:
case MSGMODE_23:
case MSGMODE_31:
case MSGMODE_3A:
case MSGMODE_3D:
case MSGMODE_40:
case MSGMODE_TEXT_CLOSING:
case MSGMODE_PAUSED:
break;
case MSGMODE_24:
case MSGMODE_25:
case MSGMODE_26:
default:
msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
break;
}
}
Message_DrawOcarinaButtons(play, &gfx);
*gfxP = gfx;
}
void Message_Draw(PlayState* play) {
Gfx* gfx;
Gfx* gfxHead;
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(gfxCtx);
gfxHead = POLY_OPA_DISP;
gfx = Graph_GfxPlusOne(gfxHead);
gSPDisplayList(OVERLAY_DISP++, gfx);
if ((play->msgCtx.currentTextId != 0x5E6) || !Play_InCsMode(play)) {
Message_DrawMain(play, &gfx);
}
gSPEndDisplayList(gfx++);
Graph_BranchDlist(gfxHead, gfx);
POLY_OPA_DISP = gfx;
CLOSE_DISPS(gfxCtx);
}
s16 sTextboxXPositions[TEXTBOX_TYPE_MAX] = {
34, // TEXTBOX_TYPE_0
34, // TEXTBOX_TYPE_1
34, // TEXTBOX_TYPE_2
34, // TEXTBOX_TYPE_3
34, // TEXTBOX_TYPE_4
34, // TEXTBOX_TYPE_5
34, // TEXTBOX_TYPE_6
34, // TEXTBOX_TYPE_7
34, // TEXTBOX_TYPE_8
34, // TEXTBOX_TYPE_9
34, // TEXTBOX_TYPE_A
34, // TEXTBOX_TYPE_B
34, // TEXTBOX_TYPE_C
34, // TEXTBOX_TYPE_D
34, // TEXTBOX_TYPE_E
34, // TEXTBOX_TYPE_F
};
s16 sTextboxLowerYPositions[] = {
142, // TEXTBOX_TYPE_0
142, // TEXTBOX_TYPE_1
142, // TEXTBOX_TYPE_2
142, // TEXTBOX_TYPE_3
174, // TEXTBOX_TYPE_4
142, // TEXTBOX_TYPE_5
142, // TEXTBOX_TYPE_6
142, // TEXTBOX_TYPE_7
142, // TEXTBOX_TYPE_8
130, // TEXTBOX_TYPE_9
174, // TEXTBOX_TYPE_A
0, // TEXTBOX_TYPE_B
142, // TEXTBOX_TYPE_C
142, // TEXTBOX_TYPE_D
142, // TEXTBOX_TYPE_E
142, // TEXTBOX_TYPE_F
};
s16 sTextboxUpperYPositions[] = {
38, // TEXTBOX_TYPE_0
38, // TEXTBOX_TYPE_1
38, // TEXTBOX_TYPE_2
38, // TEXTBOX_TYPE_3
174, // TEXTBOX_TYPE_4
38, // TEXTBOX_TYPE_5
38, // TEXTBOX_TYPE_6
38, // TEXTBOX_TYPE_7
38, // TEXTBOX_TYPE_8
60, // TEXTBOX_TYPE_9
174, // TEXTBOX_TYPE_A
0, // TEXTBOX_TYPE_B
38, // TEXTBOX_TYPE_C
38, // TEXTBOX_TYPE_D
38, // TEXTBOX_TYPE_E
38, // TEXTBOX_TYPE_F
};
s16 sTextboxMidYPositions[] = {
90, // TEXTBOX_TYPE_0
90, // TEXTBOX_TYPE_1
90, // TEXTBOX_TYPE_2
90, // TEXTBOX_TYPE_3
174, // TEXTBOX_TYPE_4
90, // TEXTBOX_TYPE_5
90, // TEXTBOX_TYPE_6
90, // TEXTBOX_TYPE_7
90, // TEXTBOX_TYPE_8
90, // TEXTBOX_TYPE_9
174, // TEXTBOX_TYPE_A
0, // TEXTBOX_TYPE_B
90, // TEXTBOX_TYPE_C
90, // TEXTBOX_TYPE_D
90, // TEXTBOX_TYPE_E
90, // TEXTBOX_TYPE_F
};
s16 D_801D0448[] = { 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25 };
s16 D_801D045C[] = {
0x1B91,
0x1B90,
0x1B8F,
};
s16 D_801D0464[] = {
0x1B92,
0x1B8E,
};
void Message_Update(PlayState* play) {
static u8 D_801D0468 = 0;
MessageContext* msgCtx = &play->msgCtx;
SramContext* sramCtx = &play->sramCtx; // Optional
PauseContext* pauseCtx = &play->pauseCtx;
InterfaceContext* interfaceCtx = &play->interfaceCtx;
Input* input = CONTROLLER1(&play->state);
s16 avgScreenPosY;
s16 screenPosX;
u16 temp_v1_2;
s16 playerScreenPosY;
s16 actorScreenPosY;
s16 sp48;
s32 sp44;
s32 sp40;
u16 sp3E;
s16 var_v1;
u16 temp;
msgCtx->stickAdjX = input->rel.stick_x;
msgCtx->stickAdjY = input->rel.stick_y;
avgScreenPosY = 0;
// If stickAdj is held, set a delay to allow the cursor to read the next input.
// The first delay is given a longer time than all subsequent delays.
if (msgCtx->stickAdjX < -30) {
if (msgCtx->stickXRepeatState == -1) {
msgCtx->stickXRepeatTimer--;
if (msgCtx->stickXRepeatTimer < 0) {
// Allow the input to register and apply the delay for all subsequent repeated inputs
msgCtx->stickXRepeatTimer = 2;
} else {
// Cancel the current input
msgCtx->stickAdjX = 0;
}
} else {
// Allow the input to register and apply the delay for the first repeated input
msgCtx->stickXRepeatTimer = 10;
msgCtx->stickXRepeatState = -1;
}
} else if (msgCtx->stickAdjX > 30) {
if (msgCtx->stickXRepeatState == 1) {
msgCtx->stickXRepeatTimer--;
if (msgCtx->stickXRepeatTimer < 0) {
// Allow the input to register and apply the delay for all subsequent repeated inputs
msgCtx->stickXRepeatTimer = 2;
} else {
// Cancel the current input
msgCtx->stickAdjX = 0;
}
} else {
// Allow the input to register and apply the delay for the first repeated input
msgCtx->stickXRepeatTimer = 10;
msgCtx->stickXRepeatState = 1;
}
} else {
msgCtx->stickXRepeatState = 0;
}
if (msgCtx->stickAdjY < -30) {
if (msgCtx->stickYRepeatState == -1) {
msgCtx->stickYRepeatTimer--;
if (msgCtx->stickYRepeatTimer < 0) {
// Allow the input to register and apply the delay for all subsequent repeated inputs
msgCtx->stickYRepeatTimer = 2;
} else {
// Cancel the current input
msgCtx->stickAdjY = 0;
}
} else {
// Allow the input to register and apply the delay for the first repeated input
msgCtx->stickYRepeatTimer = 10;
msgCtx->stickYRepeatState = -1;
}
} else if (msgCtx->stickAdjY > 30) {
if (msgCtx->stickYRepeatState == 1) {
msgCtx->stickYRepeatTimer--;
if (msgCtx->stickYRepeatTimer < 0) {
// Allow the input to register and apply the delay for all subsequent repeated inputs
msgCtx->stickYRepeatTimer = 2;
} else {
// Cancel the current input
msgCtx->stickAdjY = 0;
}
} else {
// Allow the input to register and apply the delay for the first repeated input
msgCtx->stickYRepeatTimer = 10;
msgCtx->stickYRepeatState = 1;
}
} else {
msgCtx->stickYRepeatState = 0;
}
if (msgCtx->msgLength == 0) {
return;
}
switch (msgCtx->msgMode) {
case MSGMODE_TEXT_START:
D_801C6A70++;
temp = false;
if ((D_801C6A70 >= 4) || ((msgCtx->talkActor == NULL) && (D_801C6A70 >= 2))) {
temp = true;
}
if (temp) {
if (msgCtx->talkActor != NULL) {
Actor_GetScreenPos(play, &GET_PLAYER(play)->actor, &screenPosX, &playerScreenPosY);
Actor_GetScreenPos(play, msgCtx->talkActor, &screenPosX, &actorScreenPosY);
if (playerScreenPosY >= actorScreenPosY) {
avgScreenPosY = ((playerScreenPosY - actorScreenPosY) / 2) + actorScreenPosY;
} else {
avgScreenPosY = ((actorScreenPosY - playerScreenPosY) / 2) + playerScreenPosY;
}
} else {
msgCtx->textboxX = msgCtx->textboxXTarget;
msgCtx->textboxY = msgCtx->textboxYTarget;
}
var_v1 = msgCtx->textBoxType;
if ((u32)msgCtx->textBoxPos == 0) {
if ((play->sceneId == SCENE_UNSET_04) || (play->sceneId == SCENE_UNSET_05) ||
(play->sceneId == SCENE_UNSET_06)) {
if (avgScreenPosY < 100) {
msgCtx->textboxYTarget = sTextboxLowerYPositions[var_v1];
} else {
msgCtx->textboxYTarget = sTextboxUpperYPositions[var_v1];
}
} else {
if (avgScreenPosY < 160) {
msgCtx->textboxYTarget = sTextboxLowerYPositions[var_v1];
} else {
msgCtx->textboxYTarget = sTextboxUpperYPositions[var_v1];
}
}
} else if (msgCtx->textBoxPos == 1) {
msgCtx->textboxYTarget = sTextboxUpperYPositions[var_v1];
} else if (msgCtx->textBoxPos == 2) {
msgCtx->textboxYTarget = sTextboxMidYPositions[var_v1];
} else if (msgCtx->textBoxPos == 7) {
msgCtx->textboxYTarget = 158;
} else {
msgCtx->textboxYTarget = sTextboxLowerYPositions[var_v1];
}
msgCtx->textboxXTarget = sTextboxXPositions[var_v1];
if ((gSaveContext.options.language == LANGUAGE_JPN) && !msgCtx->textIsCredits) {
msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 7);
msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 25);
msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 43);
} else {
msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 20);
msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 32);
msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 44);
}
if ((msgCtx->textBoxType == TEXTBOX_TYPE_4) || (msgCtx->textBoxType == TEXTBOX_TYPE_5)) {
msgCtx->msgMode = MSGMODE_TEXT_STARTING;
msgCtx->textboxX = msgCtx->textboxXTarget;
msgCtx->textboxY = msgCtx->textboxYTarget;
msgCtx->unk12008 = 0x100;
msgCtx->unk1200A = 0x40;
msgCtx->unk1200C = 0x200;
msgCtx->unk1200E = 0x200;
break;
}
Message_GrowTextbox(play);
Audio_PlaySfx_IfNotInCutscene(NA_SE_NONE);
msgCtx->stateTimer = 0;
msgCtx->msgMode = MSGMODE_TEXT_BOX_GROWING;
if (!pauseCtx->itemDescriptionOn) {
func_80150A84(play);
}
}
break;
case MSGMODE_TEXT_BOX_GROWING:
Message_GrowTextbox(play);
break;
case MSGMODE_TEXT_STARTING:
msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
if (!pauseCtx->itemDescriptionOn) {
if (msgCtx->currentTextId == 0xFF) {
func_8011552C(play, DO_ACTION_STOP);
} else if (msgCtx->currentTextId != 0xF8) {
func_8011552C(play, DO_ACTION_NEXT);
}
}
break;
case MSGMODE_TEXT_NEXT_MSG:
Message_Decode(play);
if (msgCtx->textFade) {
Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
}
if (D_801D0468 != 0) {
msgCtx->textDrawPos = msgCtx->decodedTextLen;
D_801D0468 = 0;
}
break;
case MSGMODE_TEXT_CONTINUING:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
Message_Decode(play);
}
break;
case MSGMODE_TEXT_DISPLAYING:
if (msgCtx->textBoxType != TEXTBOX_TYPE_4) {
if (CHECK_BTN_ALL(input->press.button, BTN_B) && !msgCtx->textUnskippable) {
msgCtx->textboxSkipped = true;
msgCtx->textDrawPos = msgCtx->decodedTextLen;
} else if (CHECK_BTN_ALL(input->press.button, BTN_A) && !msgCtx->textUnskippable) {
while (true) {
temp_v1_2 = msgCtx->decodedBuffer.wchar[msgCtx->textDrawPos];
if ((temp_v1_2 == 0x10) || (temp_v1_2 == 0x12) || (temp_v1_2 == 0x1B) || (temp_v1_2 == 0x1C) ||
(temp_v1_2 == 0x1D) || (temp_v1_2 == 0x19) || (temp_v1_2 == 0xE0) || (temp_v1_2 == 0xBF) ||
(temp_v1_2 == 0x15) || (temp_v1_2 == 0x1A)) {
break;
}
msgCtx->textDrawPos++;
}
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_A) && (msgCtx->textUnskippable == 0)) {
while (true) {
temp_v1_2 = msgCtx->decodedBuffer.wchar[msgCtx->textDrawPos];
if ((temp_v1_2 == 0x10) || (temp_v1_2 == 0x12) || (temp_v1_2 == 0x1B) || (temp_v1_2 == 0x1C) ||
(temp_v1_2 == 0x1D) || (temp_v1_2 == 0x19) || (temp_v1_2 == 0xE0) || (temp_v1_2 == 0xBF) ||
(temp_v1_2 == 0x15) || (temp_v1_2 == 0x1A)) {
break;
}
msgCtx->textDrawPos++;
}
}
break;
case MSGMODE_TEXT_AWAIT_INPUT:
if (Message_ShouldAdvance(play)) {
msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING;
msgCtx->textDrawPos++;
}
break;
case MSGMODE_TEXT_DELAYED_BREAK:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
}
break;
case MSGMODE_TEXT_AWAIT_NEXT:
if (Message_ShouldAdvance(play)) {
msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG;
msgCtx->msgBufPos++;
}
break;
case MSGMODE_TEXT_DONE:
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_FADE_NORMAL) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_FADE_SKIPPABLE)) {
msgCtx->stateTimer--;
if ((msgCtx->stateTimer == 0) ||
((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_FADE_SKIPPABLE) && Message_ShouldAdvance(play))) {
if (msgCtx->nextTextId != 0xFFFF) {
Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
Message_ContinueTextbox(play, msgCtx->nextTextId);
} else if (msgCtx->bombersNotebookEventQueueCount != 0) {
if (Message_BombersNotebookProcessEventQueue(play) == 0) {
Message_CloseTextbox(play);
}
} else {
Message_CloseTextbox(play);
}
}
} else {
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_PERSISTENT) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_EVENT) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_EVENT2) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_PAUSE_MENU)) {
return;
}
switch (msgCtx->textboxEndType) {
case TEXTBOX_ENDTYPE_FADE_STAGES_1:
msgCtx->textColorAlpha += 20;
if (msgCtx->textColorAlpha >= 255) {
msgCtx->textColorAlpha = 255;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_FADE_STAGES_2;
}
break;
case TEXTBOX_ENDTYPE_FADE_STAGES_2:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_FADE_STAGES_3;
}
break;
case TEXTBOX_ENDTYPE_FADE_STAGES_3:
msgCtx->textColorAlpha -= 20;
if (msgCtx->textColorAlpha <= 0) {
msgCtx->textColorAlpha = 0;
if (msgCtx->nextTextId != 0xFFFF) {
Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
Message_ContinueTextbox(play, msgCtx->nextTextId);
return;
}
if (msgCtx->bombersNotebookEventQueueCount != 0) {
if (Message_BombersNotebookProcessEventQueue(play) == 0) {
Message_CloseTextbox(play);
return;
}
} else {
Message_CloseTextbox(play);
return;
}
}
break;
case TEXTBOX_ENDTYPE_TWO_CHOICE:
Message_HandleChoiceSelection(play, 1);
break;
case TEXTBOX_ENDTYPE_THREE_CHOICE:
Message_HandleChoiceSelection(play, 2);
break;
case TEXTBOX_ENDTYPE_12:
Message_HandleChoiceSelection(play, 1);
break;
default:
break;
}
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_TWO_CHOICE) &&
(play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE)) {
if (Message_ShouldAdvance(play)) {
if (msgCtx->choiceIndex == 0) {
play->msgCtx.ocarinaMode = OCARINA_MODE_WARP;
} else {
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
Message_CloseTextbox(play);
}
} else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_TWO_CHOICE) &&
(play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_SOT)) {
if (Message_ShouldAdvance(play)) {
if (msgCtx->choiceIndex == 0) {
Audio_PlaySfx_MessageDecide();
msgCtx->msgMode = MSGMODE_NEW_CYCLE_0;
msgCtx->decodedTextLen -= 3;
msgCtx->unk120D6 = 0;
msgCtx->unk120D4 = 0;
} else {
Audio_PlaySfx_MessageCancel();
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
Message_CloseTextbox(play);
}
}
} else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_TWO_CHOICE) &&
(play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_INVERTED_TIME)) {
if (Message_ShouldAdvance(play)) {
if (msgCtx->choiceIndex == 0) {
Audio_PlaySfx_MessageDecide();
if (gSaveContext.save.timeSpeedOffset == 0) {
play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_INV_SOT_SLOW;
gSaveContext.save.timeSpeedOffset = -2;
} else {
play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_INV_SOT_FAST;
gSaveContext.save.timeSpeedOffset = 0;
}
Message_CloseTextbox(play);
} else {
Audio_PlaySfx_MessageCancel();
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
Message_CloseTextbox(play);
}
}
} else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_TWO_CHOICE) &&
(play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_DOUBLE_TIME)) {
if (Message_ShouldAdvance(play)) {
if (msgCtx->choiceIndex == 0) {
Audio_PlaySfx_MessageDecide();
if (gSaveContext.save.isNight != 0) {
gSaveContext.save.time = CLOCK_TIME(6, 0);
} else {
gSaveContext.save.time = CLOCK_TIME(18, 0);
}
play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_DOUBLE_SOT;
gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF;
} else {
Audio_PlaySfx_MessageCancel();
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
Message_CloseTextbox(play);
}
} else if ((msgCtx->textboxEndType != TEXTBOX_ENDTYPE_TWO_CHOICE) ||
(pauseCtx->state != PAUSE_STATE_OWL_WARP_CONFIRM)) {
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_TWO_CHOICE) &&
(play->msgCtx.ocarinaMode == OCARINA_MODE_1B)) {
if (Message_ShouldAdvance(play)) {
if (msgCtx->choiceIndex == 0) {
Audio_PlaySfx_MessageDecide();
play->msgCtx.ocarinaMode = OCARINA_MODE_WARP_TO_ENTRANCE;
} else {
Audio_PlaySfx_MessageCancel();
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
Message_CloseTextbox(play);
}
} else if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_INPUT_BANK) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_INPUT_DOGGY_RACETRACK_BET) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_TWO_CHOICE) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_THREE_CHOICE) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_FADE_NORMAL) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_FADE_SKIPPABLE) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_FADE_STAGES_1) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_FADE_STAGES_2) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_FADE_STAGES_3) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_INPUT_BOMBER_CODE)) {
//! FAKE: debug?
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_FADE_NORMAL) {}
} else if (pauseCtx->itemDescriptionOn) {
if ((input->rel.stick_x != 0) || (input->rel.stick_y != 0) ||
CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_B) ||
CHECK_BTN_ALL(input->press.button, BTN_START)) {
Audio_PlaySfx(NA_SE_SY_DECIDE);
Message_CloseTextbox(play);
}
} else if (play->msgCtx.ocarinaMode == OCARINA_MODE_PROCESS_RESTRICTED_SONG) {
if (Message_ShouldAdvanceSilent(play)) {
Audio_PlaySfx(NA_SE_SY_DECIDE);
Message_CloseTextbox(play);
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
} else if ((msgCtx->currentTextId != 0x2790) && Message_ShouldAdvanceSilent(play)) {
if (msgCtx->nextTextId != 0xFFFF) {
Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
Message_ContinueTextbox(play, msgCtx->nextTextId);
} else if ((msgCtx->bombersNotebookEventQueueCount == 0) ||
(Message_BombersNotebookProcessEventQueue(play) != 1)) {
if (msgCtx->currentTextId == 0x579) {
gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
}
Audio_PlaySfx(NA_SE_SY_DECIDE);
Message_CloseTextbox(play);
}
}
}
}
break;
case MSGMODE_TEXT_CLOSING:
msgCtx->stateTimer--;
if (msgCtx->stateTimer != 0) {
break;
}
if (sLastPlayedSong == OCARINA_SONG_SOARING) {
if (interfaceCtx->restrictions.songOfSoaring == 0) {
if (func_8010A0A4(play) || (play->sceneId == SCENE_SECOM)) {
Message_StartTextbox(play, 0x1B93, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_1B;
sLastPlayedSong = 0xFF;
} else if (!msgCtx->ocarinaSongEffectActive) {
if (gSaveContext.save.saveInfo.playerData.owlActivationFlags != 0) {
pauseCtx->unk_2C8 = pauseCtx->pageIndex;
pauseCtx->unk_2CA = pauseCtx->cursorPoint[4];
pauseCtx->pageIndex = PAUSE_ITEM;
pauseCtx->state = PAUSE_STATE_OWL_WARP_0;
func_800F4A10(play);
pauseCtx->pageIndex = PAUSE_MAP;
sLastPlayedSong = 0xFF;
Message_CloseTextbox(play);
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
gSaveContext.prevHudVisibility = HUD_VISIBILITY_A_B;
func_80115844(play, DO_ACTION_STOP);
GameState_SetFramerateDivisor(&play->state, 2);
if (ShrinkWindow_Letterbox_GetSizeTarget() != 0) {
ShrinkWindow_Letterbox_SetSizeTarget(0);
}
Audio_PlaySfx_PauseMenuOpenOrClose(1);
break;
}
sLastPlayedSong = 0xFF;
Message_StartTextbox(play, 0xFB, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
} else {
msgCtx->stateTimer = 1;
}
} else {
sLastPlayedSong = 0xFF;
Message_StartTextbox(play, 0x1B95, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
}
break;
}
if ((msgCtx->currentTextId == 0xC) || (msgCtx->currentTextId == 0xD) || (msgCtx->currentTextId == 0xC5) ||
(msgCtx->currentTextId == 0xC6) || (msgCtx->currentTextId == 0xC7) ||
(msgCtx->currentTextId == 0x2165) || (msgCtx->currentTextId == 0x2166) ||
(msgCtx->currentTextId == 0x2167) || (msgCtx->currentTextId == 0x2168)) {
gSaveContext.healthAccumulator = 20 * 0x10; // Refill 20 hearts
}
if ((play->csCtx.state == CS_STATE_IDLE) && (gSaveContext.save.cutsceneIndex < 0xFFF0) &&
((play->activeCamId == CAM_ID_MAIN) ||
((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF))) &&
(play->msgCtx.ocarinaMode == OCARINA_MODE_END)) {
if (((u32)gSaveContext.prevHudVisibility == HUD_VISIBILITY_IDLE) ||
(gSaveContext.prevHudVisibility == HUD_VISIBILITY_NONE) ||
(gSaveContext.prevHudVisibility == HUD_VISIBILITY_NONE_ALT)) {
gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL;
}
gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
}
if ((msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6) &&
(play->actorCtx.flags & ACTORCTX_FLAG_TELESCOPE_ON)) {
Message_StartTextbox(play, 0x5E6, NULL);
break;
}
if (msgCtx->bombersNotebookEventQueueCount != 0) {
if (Message_BombersNotebookProcessEventQueue(play) == 0) {
msgCtx->stateTimer = 1;
}
break;
}
msgCtx->msgLength = 0;
msgCtx->msgMode = MSGMODE_NONE;
msgCtx->currentTextId = 0;
msgCtx->stateTimer = 0;
XREG(31) = 0;
if (pauseCtx->itemDescriptionOn) {
func_8011552C(play, DO_ACTION_INFO);
pauseCtx->itemDescriptionOn = false;
}
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_PERSISTENT) {
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_DEFAULT;
play->msgCtx.ocarinaMode = OCARINA_MODE_WARP;
} else {
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_DEFAULT;
}
if (EQ_MAX_QUEST_HEART_PIECE_COUNT) {
RESET_HEART_PIECE_COUNT;
gSaveContext.save.saveInfo.playerData.healthCapacity += 0x10;
gSaveContext.save.saveInfo.playerData.health += 0x10;
}
if (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOTIME_DONE) {
s16 pad;
if (sLastPlayedSong == OCARINA_SONG_TIME) {
if (interfaceCtx->restrictions.songOfTime == 0) {
Message_StartTextbox(play, 0x1B8A, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_SOT;
} else {
sLastPlayedSong = 0xFF;
Message_StartTextbox(play, 0x1B95, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
}
} else if (sLastPlayedSong == OCARINA_SONG_INVERTED_TIME) {
if (interfaceCtx->restrictions.invSongOfTime == 0) {
if (R_TIME_SPEED != 0) {
if (gSaveContext.save.timeSpeedOffset == 0) {
Message_StartTextbox(play, 0x1B8C, NULL);
} else {
Message_StartTextbox(play, 0x1B8D, NULL);
}
play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_INVERTED_TIME;
} else {
Message_StartTextbox(play, 0x1B8B, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
} else {
sLastPlayedSong = 0xFF;
Message_StartTextbox(play, 0x1B95, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
}
} else if (sLastPlayedSong == OCARINA_SONG_DOUBLE_TIME) {
if (interfaceCtx->restrictions.songOfDoubleTime == 0) {
if ((CURRENT_DAY != 3) || (gSaveContext.save.isNight == 0)) {
if (gSaveContext.save.isNight) {
Message_StartTextbox(play, D_801D0464[CURRENT_DAY - 1], NULL);
} else {
Message_StartTextbox(play, D_801D045C[CURRENT_DAY - 1], NULL);
}
play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_DOUBLE_TIME;
} else {
Message_StartTextbox(play, 0x1B94, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
}
} else {
sLastPlayedSong = 0xFF;
Message_StartTextbox(play, 0x1B95, NULL);
play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_RESTRICTED_SONG;
}
} else if ((msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY_DONE) &&
((play->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE) ||
(play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) ||
(play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_SCARECROW_SPAWN) ||
(play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_FULL_EVAN_SONG))) {
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
if (msgCtx->lastPlayedSong == OCARINA_SONG_SOARING) {
play->msgCtx.ocarinaMode = OCARINA_MODE_ACTIVE;
}
}
sLastPlayedSong = 0xFF;
}
break;
case MSGMODE_OCARINA_PLAYING:
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
Message_CloseTextbox(play);
} else {
msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID;
}
break;
case MSGMODE_OCARINA_AWAIT_INPUT:
if ((msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF) &&
(msgCtx->ocarinaAction != OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF)) {
if (Message_ShouldAdvance(play)) {
Message_DisplayOcarinaStaff(play, msgCtx->ocarinaAction);
}
}
break;
case MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING:
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
AudioOcarina_SetRecordingState(OCARINA_RECORD_OFF);
Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR);
Message_CloseTextbox(play);
msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED;
} else {
msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID;
}
break;
case MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND:
msgCtx->textboxColorAlphaCurrent += XREG(73);
if (msgCtx->textboxColorAlphaCurrent >= 255) {
msgCtx->textboxColorAlphaCurrent = 255;
msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_IN_TEXT;
}
break;
case MSGMODE_SCENE_TITLE_CARD_FADE_IN_TEXT:
msgCtx->textColorAlpha += XREG(73);
if (msgCtx->textColorAlpha >= 255) {
msgCtx->textColorAlpha = 255;
msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_DISPLAYING;
}
break;
case MSGMODE_SCENE_TITLE_CARD_DISPLAYING:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_OUT_TEXT;
}
break;
case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_TEXT:
msgCtx->textColorAlpha -= XREG(70);
if (msgCtx->textColorAlpha <= 0) {
msgCtx->textColorAlpha = 0;
msgCtx->msgMode = MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND;
}
break;
case MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND:
msgCtx->textboxColorAlphaCurrent -= XREG(70);
if (msgCtx->textboxColorAlphaCurrent <= 0) {
if ((msgCtx->currentTextId >= 0x1BB2) && (msgCtx->currentTextId <= 0x1BB6) &&
(play->actorCtx.flags & ACTORCTX_FLAG_TELESCOPE_ON)) {
Message_StartTextbox(play, 0x5E6, NULL);
Interface_SetHudVisibility(HUD_VISIBILITY_NONE_ALT);
} else {
//! FAKE: debug?
if (msgCtx->currentTextId >= 0x100) {
if (msgCtx && msgCtx && msgCtx) {}
}
msgCtx->textboxColorAlphaCurrent = 0;
msgCtx->msgLength = 0;
msgCtx->msgMode = MSGMODE_NONE;
msgCtx->currentTextId = 0;
msgCtx->stateTimer = 0;
}
}
break;
case MSGMODE_NEW_CYCLE_0:
play->state.unk_A3 = 1;
sp44 = gSaveContext.save.cutsceneIndex;
sp3E = CURRENT_TIME;
sp40 = gSaveContext.save.day;
Sram_SaveEndOfCycle(play);
gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF;
func_8014546C(&play->sramCtx);
gSaveContext.save.day = sp40;
gSaveContext.save.time = sp3E;
gSaveContext.save.cutsceneIndex = sp44;
if (gSaveContext.fileNum != 0xFF) {
Sram_SetFlashPagesDefault(&play->sramCtx, gFlashSaveStartPages[gSaveContext.fileNum * 2],
gFlashSpecialSaveNumPages[gSaveContext.fileNum * 2]);
Sram_StartWriteToFlashDefault(&play->sramCtx);
}
msgCtx->msgMode = MSGMODE_NEW_CYCLE_1;
break;
case MSGMODE_NEW_CYCLE_1:
if (gSaveContext.fileNum != 0xFF) {
play->state.unk_A3 = 1;
if (play->sramCtx.status == 0) {
play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT;
msgCtx->msgMode = MSGMODE_NEW_CYCLE_2;
}
} else {
play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT;
msgCtx->msgMode = MSGMODE_NEW_CYCLE_2;
}
break;
case MSGMODE_OWL_SAVE_0:
play->state.unk_A3 = 1;
gSaveContext.save.isOwlSave = true;
Play_SaveCycleSceneFlags(&play->state);
func_8014546C(&play->sramCtx);
if (gSaveContext.fileNum != 0xFF) {
Sram_SetFlashPagesOwlSave(&play->sramCtx, gFlashOwlSaveStartPages[gSaveContext.fileNum * 2],
gFlashOwlSaveNumPages[gSaveContext.fileNum * 2]);
Sram_StartWriteToFlashOwlSave(&play->sramCtx);
}
msgCtx->msgMode = MSGMODE_OWL_SAVE_1;
break;
case MSGMODE_OWL_SAVE_1:
if (gSaveContext.fileNum != 0xFF) {
play->state.unk_A3 = 1;
if (play->sramCtx.status == 0) {
play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT;
msgCtx->msgMode = MSGMODE_OWL_SAVE_2;
}
} else {
play->msgCtx.ocarinaMode = OCARINA_MODE_APPLY_SOT;
msgCtx->msgMode = MSGMODE_OWL_SAVE_2;
}
if (msgCtx->msgMode == MSGMODE_OWL_SAVE_2) {
gSaveContext.gameMode = GAMEMODE_OWL_SAVE;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
play->nextEntrance = ENTRANCE(CUTSCENE, 0);
gSaveContext.save.cutsceneIndex = 0;
gSaveContext.sceneLayer = 0;
}
break;
case MSGMODE_9:
case MSGMODE_PAUSED:
case MSGMODE_NEW_CYCLE_2:
case MSGMODE_OWL_SAVE_2:
break;
default:
msgCtx->ocarinaButtonIndex = OCARINA_BTN_INVALID;
break;
}
}
void Message_SetTables(PlayState* play) {
play->msgCtx.messageTableNES = sMessageTableNES;
play->msgCtx.messageTableCredits = sMessageTableCredits;
}
void Message_Init(PlayState* play) {
Font* font;
MessageContext* msgCtx = &play->msgCtx;
Message_SetTables(play);
play->msgCtx.ocarinaMode = OCARINA_MODE_NONE;
msgCtx->msgMode = MSGMODE_NONE;
msgCtx->msgLength = 0;
msgCtx->currentTextId = 0;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_DEFAULT;
msgCtx->choiceIndex = 0;
msgCtx->ocarinaAction = msgCtx->textUnskippable = 0;
msgCtx->textColorAlpha = 255;
View_Init(&msgCtx->view, play->state.gfxCtx);
msgCtx->textboxSegment = THA_AllocTailAlign16(&play->state.tha, 0x13C00);
font = &play->msgCtx.font;
Font_LoadOrderedFont(&play->msgCtx.font);
font->unk_11D88 = 0;
msgCtx->textIsCredits = msgCtx->messageHasSetSfx = false;
msgCtx->textboxSkipped = false;
msgCtx->textFade = false;
msgCtx->ocarinaAvailableSongs = 0;
msgCtx->textboxX = 52;
msgCtx->textboxY = 36;
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;
}