mm/src/code/z_message.c

6058 lines
252 KiB
C

#include "global.h"
#include "z64horse.h"
#include "z64shrink_window.h"
#include "z64view.h"
#include "message_data_static.h"
#include "interface/parameter_static/parameter_static.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.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
// TODO: Scripts
// Include message tables D_801C6B98 and D_801CFB08
#include "src/code/z_message_tables.inc.c"
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;
}
s32 Message_ShouldAdvance(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Input* controller = CONTROLLER1(&play->state);
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
if (CHECK_BTN_ALL(controller->press.button, BTN_A)) {
Audio_PlaySfx(NA_SE_SY_MESSAGE_PASS);
}
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);
}
}
s32 Message_ShouldAdvanceSilent(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Input* controller = CONTROLLER1(&play->state);
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
return CHECK_BTN_ALL(controller->press.button, BTN_A);
} else {
return CHECK_BTN_ALL(controller->press.button, BTN_A) || CHECK_BTN_ALL(controller->press.button, BTN_B) ||
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_00;
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->bankRupeesSelected = (msgCtx->decodedBuffer.schar[msgCtx->unk120C0] - '0') * 100;
msgCtx->bankRupeesSelected += (msgCtx->decodedBuffer.schar[msgCtx->unk120C0 + 1] - '0') * 10;
msgCtx->bankRupeesSelected += 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->bankRupeesSelected = (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] + 0x824F;
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] + 0x824F;
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->messageEntryTable;
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->messageEntryTable;
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 },
};
Color_RGB16 D_801CFEA4[] = {
{ 255, 60, 60 }, { 70, 255, 80 }, { 80, 90, 255 }, { 255, 255, 50 },
{ 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
};
Color_RGB16 D_801CFED4[] = {
{ 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 },
};
Color_RGB16 D_801CFF34[] = {
{ 255, 60, 60 }, { 110, 170, 255 }, { 80, 90, 255 }, { 255, 255, 50 },
{ 80, 150, 255 }, { 255, 150, 180 }, { 170, 170, 170 }, { 255, 130, 30 },
};
u8 D_801CFF64[] = { 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 sp12E;
s16 sp12C;
s16 sp12A;
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 = D_801CFF34[(s16)(character - 0x2001)].r;
msgCtx->textColorG = D_801CFF34[(s16)(character - 0x2001)].g;
msgCtx->textColorB = D_801CFF34[(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 = D_801CFEA4[(s16)(character - 0x2001)].r;
msgCtx->textColorG = D_801CFEA4[(s16)(character - 0x2001)].g;
msgCtx->textColorB = D_801CFEA4[(s16)(character - 0x2001)].b;
}
if ((i + 1) == msgCtx->textDrawPos) {
msgCtx->textDrawPos++;
}
break;
case 0x20: // ` `
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_55;
} else {
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_50;
}
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_52;
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_10;
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_11;
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_60;
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
}
break;
case 0x220:
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_61;
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
}
break;
case 0x221:
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_62;
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_41;
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 0);
Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
}
break;
case 0x225:
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_63;
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_00) {
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_30;
}
*gfxP = gfx;
return;
case 0x103:
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
msgCtx->msgMode = MSGMODE_TEXT_DONE;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_40;
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_42;
Font_LoadMessageBoxEndIcon(&play->msgCtx.font, 1);
Audio_PlaySfx(NA_SE_SY_MESSAGE_END);
}
*gfxP = gfx;
return;
default:
switch (character) {
case 0x8169:
case 0x8175:
msgCtx->textPosX -= (s16)(6.0f * msgCtx->textCharScale);
break;
case 0x8145:
msgCtx->textPosX -= (s16)(3.0f * msgCtx->textCharScale);
break;
case 0x8148:
case 0x8149:
msgCtx->textPosX -= (s16)(2.0f * msgCtx->textCharScale);
break;
default:
break;
}
if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) && ((i + 1) == msgCtx->textDrawPos)) {
Audio_PlaySfx(NA_SE_NONE);
}
if ((character >= 0x839F) && (character < 0x83AB)) {
sp12E = msgCtx->textColorR;
sp12C = msgCtx->textColorG;
sp12A = msgCtx->textColorB;
msgCtx->textColorR = D_801CFED4[(s16)D_801CFF64[character - 0x839F]].r;
msgCtx->textColorG = D_801CFED4[(s16)D_801CFF64[character - 0x839F]].g;
msgCtx->textColorB = D_801CFED4[(s16)D_801CFF64[character - 0x839F]].b;
Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
msgCtx->textColorR = sp12E;
msgCtx->textColorG = sp12C;
msgCtx->textColorB = sp12A;
} else {
Message_DrawTextChar(play, &font->charBuf[font->unk_11D88][charTexIndex], &gfx);
}
charTexIndex += FONT_CHAR_TEX_SIZE;
switch (character) {
case 0x8144:
msgCtx->textPosX += (s16)(8.0f * msgCtx->textCharScale);
break;
case 0x816A:
case 0x8176:
msgCtx->textPosX += (s16)(10.0f * msgCtx->textCharScale);
break;
case 0x8141:
case 0x8142:
case 0x8168:
msgCtx->textPosX += (s16)(12.0f * msgCtx->textCharScale);
break;
case 0x8194:
msgCtx->textPosX += (s16)(14.0f * msgCtx->textCharScale);
break;
case 0x8145:
msgCtx->textPosX += (s16)(15.0f * msgCtx->textCharScale);
break;
default:
if ((msgCtx->msgMode >= MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND) &&
(msgCtx->msgMode <= MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND)) {
msgCtx->textPosX += (s16)((16.0f * msgCtx->textCharScale) - 1.0f);
} else {
msgCtx->textPosX += (s16)(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;
}
// TODO: SJIS support
// Message_LoadRupees JPN ?
void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) {
MessageContext* msgCtx = &play->msgCtx;
s16 t = *decodedBufPos;
s32 k = *offset;
f32 f = *arg3;
Font_LoadChar(play, 0x838B, k); // 0x838B = ル in JISX0213
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = 0x838B;
t++;
Font_LoadChar(play, 0x8373, k); // 0x8373 = ピ in JISX0213
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = 0x8373;
t++;
Font_LoadChar(play, 0x815C, k); // 0x815C = ― in JISX0213
k += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[t] = 0x815C;
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) {
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] = 0x135B; // 0x135B + 0x824F = 分 (minutes) in S-JIS
// 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] = 0x1313; // 0x1313 + 0x824F = ç§’ (seconds) in S-JIS
// 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_SetupLoadItemIcon(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] + 0x824F, o); // 0x824F = '0' in S-JIS
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[p] = digits[i] + 0x824F;
p++;
if (i == 1) {
// Hours (時間)
Font_LoadChar(play, 0x8E9E, o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[p] = 0x8E9E;
p++;
Font_LoadChar(play, 0x8AD4, o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[p] = 0x8E9E;
p++;
} else if (i == 3) {
// Minutes (分)
Font_LoadChar(play, 0x95AA, o);
o += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[p] = 0x95AA;
}
}
f += 7.0f * (16.0f * msgCtx->textCharScale);
*decodedBufPos = p;
*offset = o;
*arg3 = f;
}
#define GREAT_BAY_COAST_STR \
{ 0x834F, 0x838C, 0x815B, 0x8367, 0x8378, 0x8343, 0x82CC, 0x8A43, 0x8ADD }
#define ZORA_CAPE_STR \
{ 0x835D, 0x815B, 0x8389, 0x82CC, 0x82DD, 0x82B3, 0x82AB }
#define SNOWHEAD_STR \
{ 0x8358, 0x836D, 0x815B, 0x8377, 0x8362, 0x8368 }
#define MOUNTAIN_VILLAGE_STR \
{ 0x8E52, 0x97A2 }
#define CLOCK_TOWN_STR \
{ 0x834E, 0x838D, 0x8362, 0x834E, 0x835E, 0x8345, 0x8393 }
#define MILK_ROAD_STR \
{ 0x837E, 0x838B, 0x834E, 0x838D, 0x815B, 0x8368 }
#define WOODFALL_STR \
{ 0x8345, 0x8362, 0x8368, 0x8374, 0x8348, 0x815B, 0x838B }
#define SOUTHERN_SWAMP_STR \
{ 0x8FC0, 0x926E }
#define IKANA_CANYON_STR \
{ 0x8343, 0x834A, 0x815B, 0x8369, 0x8C6B, 0x924A }
#define STONE_TOWER_STR \
{ 0x838D, 0x8362, 0x834E, 0x8372, 0x838B }
#define ENTRANCE_STR \
{ 0x93FC, 0x82E8, 0x8CFB }
// Shift JIS
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
};
//! TODO: use sizeof when we have strings
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;
}
// Counterpart to NES D_801D08D8
u16 D_801D0268[][3] = {
{ 0x82CD, 0x82E2, 0x82A2 },
{ 0x82D3, 0x82C2, 0x82A4 },
{ 0x82A8, 0x82BB, 0x82A2 },
};
// Counterpart to NES D_801D08E4
u16 D_801D027C[] = { 0x2001, 0x2003, 0x2004, 0x2002 };
// Counterpart to NES sMaskCodeTextENG
u16 D_801D0284[] = { 0x90D4, 0x90C2, 0x89A9, 0x97CE };
#ifdef NON_MATCHING
// https://decomp.me/scratch/ZTbP4
void Message_Decode(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
Font* font = &msgCtx->font; // spF0
Player* player; // spEC
s16 decodedBufPos; // spEA
u32 timeToMoonCrash;
s16 temp2;
s16 spE0;
s32 pad4;
s16 digits[4]; // spD4/D6/D8/DA
s16 spD2;
f32 timeInSeconds;
s32 charTexIdx; // spC8
s16 var_v0;
s16 loadChar;
f32 spC0;
f32 var_fs0;
s16 index;
s16 value;
s16 playerNameLen;
s16 i; // s1
s16 spAC[4];
u8 var_s3_8;
u16 curChar;
u32 temp;
u8* ptr2;
player = GET_PLAYER(play);
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;
spE0 = 0;
decodedBufPos = 0;
charTexIdx = 0;
Message_SetupLoadItemIcon(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] = (s16)((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 (spE0 < 2) {
msgCtx->unk11FFA = msgCtx->textboxY + 0x16;
} else if (spE0 == 2) {
msgCtx->unk11FFA = msgCtx->textboxY + 0xE;
}
}
} else {
if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) {
if (spE0 == 0) {
msgCtx->unk11FFA = msgCtx->textboxY + 0x16;
} else if (spE0 == 1) {
msgCtx->unk11FFA = msgCtx->textboxY + 0xE;
}
}
}
{
s32 pad;
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 (gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1] != 0x3E) {
break;
}
}
for (i = 0; i < playerNameLen; i++) {
ptr2 = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.playerData.playerName[i]) *
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][charTexIdx + var_v0 + 0] =
ptr2[var_v0 + 0] & 0xFF; //! FAKE: Fixes later regalloc
font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 1] = ptr2[var_v0 + 1];
font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 2] = ptr2[var_v0 + 2];
font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 3] = ptr2[var_v0 + 3];
}
charTexIdx += FONT_CHAR_TEX_SIZE;
}
decodedBufPos += playerNameLen - 1;
spC0 += playerNameLen * (16.0f * msgCtx->textCharScale);
} else if (curChar == 0x201) {
DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900);
DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900,
(uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
spE0 = 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 = msgCtx->unk11FF8 + 0x16;
} else if (curChar == 0x204) {
Message_GetTimerDigits(((void)0, gSaveContext.timerCurTimes[curChar - 0x204]), spAC);
loadChar = false;
for (i = 0; i < 5; i++) {
if ((i == 1) || (spAC[i + 3] != 0)) {
loadChar = true;
}
if (loadChar) {
Message_LoadChar(play, spAC[i + 3] + 0x824F, &charTexIdx, &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 < 8; i++) {
if ((i == 4) || ((i != 2) && (i != 5) && (spAC[i] != '\0'))) {
loadChar = true;
}
if (loadChar) {
Message_LoadChar(play, spAC[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
}
decodedBufPos--;
} else if (curChar == 0x20A) {
digits[0] = 0;
timeInSeconds = TIME_TO_MINUTES_F(gSaveContext.save.time);
digits[1] = timeInSeconds / 60.0f;
while (digits[1] >= 10) {
digits[0]++;
digits[1] -= 10;
}
digits[2] = 0;
digits[3] = (s32)timeInSeconds % 60;
while (digits[3] >= 10) {
digits[2]++;
digits[3] -= 10;
}
for (i = 0; i < 4; i++) {
Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
decodedBufPos++;
if (i == 1) {
Font_LoadChar(play, 0x8E9E, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E;
decodedBufPos++;
} else if (i == 3) {
Font_LoadChar(play, 0x95AA, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x95AA;
}
}
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] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos);
} else if (curChar == 0x20C) {
decodedBufPos++;
msgCtx->unk120BE = spD2;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 2;
msgCtx->bankRupeesSelected = 0;
msgCtx->unk120C4 = charTexIdx;
digits[0] = digits[1] = digits[2] = 0;
for (i = 0; i < 3; i++) {
Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0);
} else if (curChar == 0x20D) {
digits[0] = digits[1] = 0;
digits[2] = msgCtx->bankRupeesSelected;
while (digits[2] >= 100) {
digits[0]++;
digits[2] -= 100;
}
while (digits[2] >= 10) {
digits[1]++;
digits[2] -= 10;
}
loadChar = false;
for (i = 0; i < 3; i++) {
if ((i == 2) || (digits[i] != 0)) {
loadChar = true;
}
if (loadChar) {
Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
}
func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0);
} else if (curChar == 0x20E) {
digits[0] = digits[1] = digits[2] = 0;
digits[3] = msgCtx->bankRupees;
while (digits[3] >= 1000) {
digits[0]++;
digits[3] -= 1000;
}
while (digits[3] >= 100) {
digits[1]++;
digits[3] -= 100;
}
while (digits[3] >= 10) {
digits[2]++;
digits[3] -= 10;
}
loadChar = false;
for (i = 0; i < 4; i++) {
if ((i == 3) || (digits[i] != 0)) {
loadChar = true;
}
if (loadChar) {
Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
}
func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0);
} else if (curChar == 0x20F) {
Message_LoadTime(play, curChar, &charTexIdx, &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] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
}
Message_LoadChar(play, 0x906C, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
Message_LoadChar(play, 0x96DA, &charTexIdx, &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] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
}
Message_LoadChar(play, 0x9543, &charTexIdx, &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] + 0x824F, &charTexIdx, &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] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
}
decodedBufPos--;
} else if (curChar == 0x220) {
decodedBufPos++;
msgCtx->unk120BE = spD2;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 0;
msgCtx->bankRupeesSelected = 0;
msgCtx->unk120C4 = charTexIdx;
digits[0] = digits[1] = digits[2] = 0;
for (i = 0; i < 2; i++) {
Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0);
} else if (curChar == 0x221) {
decodedBufPos++;
msgCtx->unk120BE = spD2;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 0;
msgCtx->bankRupeesSelected = 0;
msgCtx->unk120C4 = charTexIdx;
for (i = 0; i < 5; i++) {
msgCtx->unk12054[i] = 1;
Message_LoadChar(play, 0x8250, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
decodedBufPos--;
} else if (curChar == 0x223) {
if (gSaveContext.save.timeSpeedOffset == 0x12) {
var_s3_8 = 0;
} else if (gSaveContext.save.timeSpeedOffset == 0) {
var_s3_8 = 1;
} else {
var_s3_8 = 2;
}
for (i = 0; i < 3; i++) {
msgCtx->decodedBuffer.wchar[decodedBufPos] = D_801D0268[var_s3_8][i];
Font_LoadChar(play, D_801D0268[var_s3_8][i], charTexIdx);
decodedBufPos++;
charTexIdx += FONT_CHAR_TEX_SIZE;
}
decodedBufPos--;
spC0 += 3.0f * (16.0f * msgCtx->textCharScale);
msgCtx->choiceIndex = var_s3_8;
} else if (curChar == 0x224) {
Message_LoadOwlWarpText(play, &charTexIdx, &spC0, &decodedBufPos);
} else if (curChar == 0x225) {
decodedBufPos++;
msgCtx->unk120BE = spD2;
msgCtx->unk120C0 = decodedBufPos;
msgCtx->unk120C2 = 0;
msgCtx->bankRupeesSelected = 0;
msgCtx->unk120C4 = charTexIdx;
for (i = 0; i < 3; i++) {
msgCtx->unk12054[i] = 1;
Font_LoadChar(play, 0x8250, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8250;
spC0 += 16.0f * msgCtx->textCharScale;
decodedBufPos++;
}
decodedBufPos--;
} else if (curChar == 0x226) {
for (i = 0; i < 6; i++) {
msgCtx->decodedBuffer.wchar[decodedBufPos] =
D_801D027C[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])];
decodedBufPos++;
Message_LoadChar(play, i + 0x8250, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x2000;
} else if ((curChar >= 0x227) && (curChar < 0x22B)) {
digits[0] = digits[1] = 0;
digits[2] = 15 - 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] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadChar(play, 0x906C, &charTexIdx, &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] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadChar(play, 0x94AD, &charTexIdx, &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] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
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] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0);
} else if (curChar == 0x22F) {
for (i = 0; i < 5; i++) {
digits[i] = gSaveContext.save.saveInfo.bomberCode[i];
Font_LoadChar(play, digits[i] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
decodedBufPos--;
} else if ((curChar >= 0x231) && (curChar < 0x237)) {
// index = curChar - 0x231;
msgCtx->decodedBuffer.wchar[decodedBufPos] =
D_801D027C[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0x231)])];
decodedBufPos++;
Message_LoadChar(
play,
D_801D0284[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0x231)])],
&charTexIdx, &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] + 0x824F, &charTexIdx, &spC0, decodedBufPos);
decodedBufPos++;
}
}
Font_LoadChar(play, 0x8E9E, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E;
decodedBufPos++;
Font_LoadChar(play, 0x8AD4, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E;
spC0 += 2.0f * (16.0f * msgCtx->textCharScale);
} else if (curChar == 0x238) {
Message_LoadTime(play, curChar, &charTexIdx, &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] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
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 < 8; i++) {
if ((i == 4) || ((i != 2) && (i != 5) && (spAC[i] != '\0'))) {
loadChar = true;
}
if (loadChar) {
Font_LoadChar(play, spAC[i] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = spAC[i] + 0x824F;
decodedBufPos++;
} else {
var_fs0 -= 1.0f;
}
}
spC0 += var_fs0 * (16.0f * msgCtx->textCharScale);
decodedBufPos--;
} else if ((curChar == 0x303) || (curChar == 0x304) || (curChar == 0x305)) {
temp2 = HIGH_SCORE(curChar - 0x303 + HS_BOAT_ARCHERY);
digits[0] = digits[1] = digits[2] = 0;
digits[3] = temp2;
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] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
decodedBufPos++;
if (i == 1) {
Font_LoadChar(play, 0x95AA, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x95AA;
decodedBufPos++;
} else if (i == 3) {
Font_LoadChar(play, 0x9562, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x9562;
}
}
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] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos);
} else if ((curChar == 0x30D) || (curChar == 0x30E) || (curChar == 0x30F)) {
//! Removing index and casting one version causes gSaveContext to be reloaded
// index = curChar - 0x30D;
for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) {
if (gSaveContext.save.saveInfo.inventory
.dekuPlaygroundPlayerName[(s16)(curChar - 0x30D)][playerNameLen - 1] != 0x3E) {
break;
}
}
for (i = 0; i < playerNameLen; i++) {
ptr2 = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.inventory
.dekuPlaygroundPlayerName[curChar - 0x30D][i]) *
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][charTexIdx + var_v0 + 0] = ptr2[var_v0 + 0];
font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 1] = ptr2[var_v0 + 1];
font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 2] = ptr2[var_v0 + 2];
font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 3] = ptr2[var_v0 + 3];
}
charTexIdx += 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] + 0x824F, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F;
decodedBufPos++;
spC0 += 16.0f * msgCtx->textCharScale;
}
}
Message_LoadChar(play, 0x94AD, &charTexIdx, &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) {
spE0++;
}
} 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, charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
if ((curChar == 0x8169) || (curChar == 0x8175)) {
spC0 += 10.0f * msgCtx->textCharScale;
} else if (curChar == 0x8145) {
spC0 += (12.0f * msgCtx->textCharScale);
} else if ((curChar == 0x8148) || (curChar == 0x8149)) {
spC0 += 14.0f * msgCtx->textCharScale;
} else if (curChar == 0x8144) {
spC0 += 8.0f * msgCtx->textCharScale;
} else if ((curChar == 0x816A) || (curChar == 0x8176)) {
spC0 += 10.0f * msgCtx->textCharScale;
} else if ((curChar == 0x8141) || (curChar == 0x8142) || (curChar == 0x8168)) {
spC0 += 12.0f * msgCtx->textCharScale;
} else if (curChar == 0x8194) {
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);
}
}
#else
void Message_Decode(PlayState* play);
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_Decode.s")
#endif
void func_80150A84(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
s32 textBoxType = msgCtx->textBoxType;
if (D_801CFC78[textBoxType] != 14) {
DmaMgr_SendRequest0(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_SendRequest0(&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_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart],
font->messageEnd);
} else {
Message_FindMessageNES(play, textId);
msgCtx->msgLength = font->messageEnd;
DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart],
font->messageEnd);
}
msgCtx->choiceNum = 0;
msgCtx->textUnskippable = false;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
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_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart],
font->messageEnd);
} else {
Message_FindMessageNES(play, arg1);
msgCtx->msgLength = font->messageEnd;
DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart],
font->messageEnd);
}
msgCtx->choiceNum = 0;
msgCtx->textUnskippable = false;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
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_SendRequest0(msgCtx->textboxSegment, &SEGMENT_ROM_START(message_static)[D_801CFC78[0] << 12], 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, 0x8140, 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_1;
}
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11)) {
return TEXT_STATE_CHOICE;
}
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_40) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_42) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_30)) {
return TEXT_STATE_5;
}
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_41) {
return TEXT_STATE_16;
}
if ((msgCtx->textboxEndType >= TEXTBOX_ENDTYPE_50) && (msgCtx->textboxEndType <= TEXTBOX_ENDTYPE_57)) {
return TEXT_STATE_3;
}
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_60) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_61)) {
return TEXT_STATE_14;
}
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_62) {
return TEXT_STATE_15;
}
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_63) {
return TEXT_STATE_17;
}
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_12) {
return TEXT_STATE_18;
}
return TEXT_STATE_DONE;
}
if (msgCtx->msgMode == MSGMODE_TEXT_AWAIT_NEXT) {
return TEXT_STATE_10;
}
if (msgCtx->msgMode == MSGMODE_SONG_DEMONSTRATION_DONE) {
return TEXT_STATE_7;
}
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_3;
}
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, 0x8140, 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) {
func_801A3000((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_60:
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_61:
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_62:
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_63:
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_10:
func_80148CBC(play, &gfx, 1);
break;
case TEXTBOX_ENDTYPE_11:
func_80148CBC(play, &gfx, 2);
break;
case TEXTBOX_ENDTYPE_12:
func_80148CBC(play, &gfx, 1);
break;
case TEXTBOX_ENDTYPE_30:
case TEXTBOX_ENDTYPE_41:
case TEXTBOX_ENDTYPE_50:
case TEXTBOX_ENDTYPE_52:
case TEXTBOX_ENDTYPE_55:
case TEXTBOX_ENDTYPE_56:
case TEXTBOX_ENDTYPE_57:
case TEXTBOX_ENDTYPE_62:
break;
case TEXTBOX_ENDTYPE_40:
case TEXTBOX_ENDTYPE_60:
case TEXTBOX_ENDTYPE_61:
default:
Message_DrawTextboxIcon(play, &gfx, 158,
(s16)(D_801D03A8[msgCtx->textBoxType] + msgCtx->textboxYTarget));
break;
case TEXTBOX_ENDTYPE_42:
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* nextDisplayList;
Gfx* polyOpa;
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(gfxCtx);
polyOpa = POLY_OPA_DISP;
nextDisplayList = Graph_GfxPlusOne(polyOpa);
gSPDisplayList(OVERLAY_DISP++, nextDisplayList);
if ((play->msgCtx.currentTextId != 0x5E6) || !Play_InCsMode(play)) {
Message_DrawMain(play, &nextDisplayList);
}
gSPEndDisplayList(nextDisplayList++);
Graph_BranchDlist(polyOpa, nextDisplayList);
POLY_OPA_DISP = nextDisplayList;
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,
};
#ifdef NON_MATCHING
// Down to a single compiler-managed stack variable
// Also contains in-function data
// https://decomp.me/scratch/QcQ0a
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 averageY;
s16 sp50;
u16 temp_v1_2;
s16 sp4C;
s16 sp4A;
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;
averageY = 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, &sp50, &sp4C);
Actor_GetScreenPos(play, msgCtx->talkActor, &sp50, &sp4A);
if (sp4C >= sp4A) {
averageY = ((sp4C - sp4A) / 2) + sp4A;
} else {
averageY = ((sp4A - sp4C) / 2) + sp4C;
}
} 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 (averageY < 0x64) {
msgCtx->textboxYTarget = sTextboxLowerYPositions[var_v1];
} else {
msgCtx->textboxYTarget = sTextboxUpperYPositions[var_v1];
}
} else {
if (averageY < 0xA0) {
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 = 0x9E;
} 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 + 0x19);
msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x2B);
} else {
msgCtx->unk11FFE[0] = (s16)(msgCtx->textboxYTarget + 0x14);
msgCtx->unk11FFE[1] = (s16)(msgCtx->textboxYTarget + 0x20);
msgCtx->unk11FFE[2] = (s16)(msgCtx->textboxYTarget + 0x2C);
}
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_50) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_52)) {
msgCtx->stateTimer--;
if ((msgCtx->stateTimer == 0) ||
((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_52) && 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_30) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_40) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_42) || (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_41)) {
return;
}
switch (msgCtx->textboxEndType) {
case TEXTBOX_ENDTYPE_55:
msgCtx->textColorAlpha += 20;
if (msgCtx->textColorAlpha >= 255) {
msgCtx->textColorAlpha = 255;
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_56;
}
break;
case TEXTBOX_ENDTYPE_56:
msgCtx->stateTimer--;
if (msgCtx->stateTimer == 0) {
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_57;
}
break;
case TEXTBOX_ENDTYPE_57:
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_10:
Message_HandleChoiceSelection(play, 1);
break;
case TEXTBOX_ENDTYPE_11:
Message_HandleChoiceSelection(play, 2);
break;
case TEXTBOX_ENDTYPE_12:
Message_HandleChoiceSelection(play, 1);
break;
default:
break;
}
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) &&
(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_10) &&
(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_10) &&
(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_10) &&
(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_10) ||
(pauseCtx->state != PAUSE_STATE_OWLWARP_CONFIRM)) {
if ((msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) &&
(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_60) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_61) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_10) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_11) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_50) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_52) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_55) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_56) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_57) ||
(msgCtx->textboxEndType == TEXTBOX_ENDTYPE_62)) {
//! FAKE: debug?
if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_50) {}
} 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_OWLWARP_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 ((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_1)) {
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_30) {
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
play->msgCtx.ocarinaMode = OCARINA_MODE_WARP;
} else {
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_00;
}
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_1)) {
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 = gSaveContext.save.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;
}
}
#else
u8 D_801D0468 = 0;
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_Update.s")
#endif
void Message_SetTables(PlayState* play) {
play->msgCtx.messageEntryTableNes = D_801C6B98;
play->msgCtx.messageTableStaff = D_801CFB08;
}
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_00;
msgCtx->choiceIndex = 0;
msgCtx->ocarinaAction = msgCtx->textUnskippable = 0;
msgCtx->textColorAlpha = 0xFF;
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;
}