summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Javier Asenjo Nitti <alejandro.asenjo88@gmail.com>2023-11-09 04:02:57 -0300
committerAlejandro Javier Asenjo Nitti <alejandro.asenjo88@gmail.com>2023-11-09 04:02:57 -0300
commit5c571c25937a60426d3f0ef95008c7bd7dc9cac9 (patch)
treedd4f6b0e89115beff4c1477f2b216169ee6d957a
parent956436315ed73d80ffe167212ea755307edc6ba1 (diff)
Message_DecodeNES matching
-rw-r--r--src/code/z_message_nes.c118
1 files changed, 56 insertions, 62 deletions
diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c
index 069a97d45..b3ef5d2a9 100644
--- a/src/code/z_message_nes.c
+++ b/src/code/z_message_nes.c
@@ -954,12 +954,8 @@ u8 sMaskCodeTextLengthENG[] = {
sizeof(GREEN_STR) - 1,
};
-#ifdef NON_MATCHING
-// https://decomp.me/scratch/w2ckG
void Message_DecodeNES(PlayState* play) {
- f32 var_fs0;
MessageContext* msgCtx = &play->msgCtx;
- u8* ptr;
Font* font = &msgCtx->font; // spE0
Player* player; // spDC
s16 decodedBufPos; // spDA
@@ -969,17 +965,18 @@ void Message_DecodeNES(PlayState* play) {
s16 spD0; // numLines
s16 digits[4]; // spC8/CA/CC/CE
s16 spC6;
- f32 timeInSeconds;
+ u16 sfxHi;
+ f32 var_fs0;
s32 charTexIdx; // spBC
s16 loadChar;
+ s16 temp_s2_2;
s16 spA8[8];
f32 spA4;
- s16 playerNameLen; // s0
- s16 var_v1_3;
+ u8* ptr;
u8 curChar; // sp78
s8 charOffset;
- s16 temp_s2_2;
- s16 var_s2_9;
+ s16 playerNameLen; // s0
+ s16 var_v1_3;
player = GET_PLAYER(play);
decodedBufPos = 0;
@@ -988,7 +985,7 @@ void Message_DecodeNES(PlayState* play) {
spD0 = 0;
msgCtx->textDelayTimer = 0;
msgCtx->textDelay = msgCtx->textDelayTimer;
- msgCtx->textFade = 0;
+ msgCtx->textFade = false;
spA4 = 0.0f;
font->unk_11D88 = (font->unk_11D88 ^ 1) & 1;
Message_SetupLoadItemIcon(play);
@@ -1032,27 +1029,30 @@ void Message_DecodeNES(PlayState* play) {
}
}
}
+ {
+ //! FAKE: Use pad once stack has enough space
+ dummy:;
- //! FAKE: Perhaps a locally required temp for scoping
- dummy:;
- if ((curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D)) {
- //! FAKE: & 0xFFFF to fix regalloc
- msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1] & 0xFFFF;
- msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 2];
- msgCtx->msgBufPos += 3;
- }
- msgCtx->decodedTextLen = decodedBufPos;
- msgCtx->unk120D8 = spD0;
- 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;
+ if ((curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D)) {
+ //! FAKE: & 0xFFFF to fix regalloc
+
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[(msgCtx->msgBufPos & 0xFFFF) + 1];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[(msgCtx->msgBufPos) + 2];
+ msgCtx->msgBufPos += 3;
+ }
+ msgCtx->decodedTextLen = decodedBufPos;
+ msgCtx->unk120D8 = spD0;
+ 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;
}
- msgCtx->unk120C8 = msgCtx->unk120CE;
- msgCtx->unk120CA = msgCtx->unk120D0;
- msgCtx->unk120CC = msgCtx->unk120D2;
- break;
} else if (curChar == 0x16) {
// Substitute the player name control character for the file's player name.
for (playerNameLen = ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); playerNameLen > 0;
@@ -1136,16 +1136,14 @@ void Message_DecodeNES(PlayState* play) {
decodedBufPos--;
} else if (curChar == 0xCA) {
digits[0] = 0;
- timeInSeconds = TIME_TO_MINUTES_F(gSaveContext.save.time);
-
- digits[1] = timeInSeconds / 60.0f;
+ digits[1] = TIME_TO_MINUTES_F(gSaveContext.save.time) / 60.0f;
while (digits[1] >= 10) {
digits[0]++;
digits[1] -= 10;
}
digits[2] = 0;
- digits[3] = (s32)timeInSeconds % 60;
+ digits[3] = (s32)TIME_TO_MINUTES_F(gSaveContext.save.time) % 60;
while (digits[3] >= 10) {
digits[2]++;
digits[3] -= 10;
@@ -1429,23 +1427,22 @@ void Message_DecodeNES(PlayState* play) {
}
decodedBufPos--;
} else if (curChar == 0xD3) {
- if (gSaveContext.save.timeSpeedOffset == 18) {
- var_s2_9 = 0;
- } else if (gSaveContext.save.timeSpeedOffset == 0) {
- var_s2_9 = 1;
+ if (((void)0, gSaveContext.save.timeSpeedOffset) == 18) {
+ temp_s2_2 = 0;
+ } else if (((void)0, gSaveContext.save.timeSpeedOffset) == 0) {
+ temp_s2_2 = 1;
} else {
- var_s2_9 = 2;
+ temp_s2_2 = 2;
}
- for (i = 0; i < 4; i++) {
- msgCtx->decodedBuffer.schar[decodedBufPos] = D_801D08D8[var_s2_9][i];
- Font_LoadCharNES(play, D_801D08D8[var_s2_9][i], charTexIdx);
- decodedBufPos++;
+ for (i = 0; i < 4; i++, decodedBufPos++) {
+ msgCtx->decodedBuffer.schar[decodedBufPos] = D_801D08D8[temp_s2_2][i];
+ Font_LoadCharNES(play, D_801D08D8[temp_s2_2][i], charTexIdx);
charTexIdx += FONT_CHAR_TEX_SIZE;
}
decodedBufPos--;
spA4 += 3.0f * (16.0f * msgCtx->textCharScale);
- msgCtx->choiceIndex = var_s2_9;
+ msgCtx->choiceIndex = temp_s2_2;
} else if (curChar == 0xD4) {
Message_LoadOwlWarpTextNES(play, &charTexIdx, &spA4, &decodedBufPos);
} else if (curChar == 0xD5) {
@@ -1468,7 +1465,7 @@ void Message_DecodeNES(PlayState* play) {
} else if (curChar == 0xD6) {
for (i = 0; i < 6; i++) {
msgCtx->decodedBuffer.schar[decodedBufPos] =
- (s8)D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])];
+ D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])];
decodedBufPos++;
Message_LoadCharNES(play, i + '1', &charTexIdx, &spA4, decodedBufPos);
decodedBufPos++;
@@ -1592,19 +1589,16 @@ void Message_DecodeNES(PlayState* play) {
}
decodedBufPos--;
} else if ((curChar >= 0xE1) && (curChar < 0xE7)) {
- msgCtx->decodedBuffer.schar[decodedBufPos] =
+ msgCtx->decodedBuffer.schar[decodedBufPos++] =
D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])];
temp_s2_2 = sMaskCodeTextLengthENG[(
(void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])];
- decodedBufPos++;
-
- for (i = 0; i < temp_s2_2; i++) {
+ for (playerNameLen = 0; playerNameLen < temp_s2_2; playerNameLen++, decodedBufPos++) {
Message_LoadCharNES(
play,
sMaskCodeTextENG[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])]
- [i],
+ [playerNameLen],
&charTexIdx, &spA4, decodedBufPos);
- decodedBufPos++;
}
msgCtx->decodedBuffer.schar[decodedBufPos] = 0;
@@ -1782,19 +1776,21 @@ void Message_DecodeNES(PlayState* play) {
}
decodedBufPos--;
} else if ((curChar == 0xFD) || (curChar == 0xFE) || (curChar == 0xFF)) {
+ temp_s2_2 = curChar - 0xFD;
for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) {
- if (gSaveContext.save.saveInfo.inventory
- .dekuPlaygroundPlayerName[(s16)(curChar - 0xFD)][playerNameLen - 1] != 0x3E) {
+ if (((void)0,
+ gSaveContext.save.saveInfo.inventory.dekuPlaygroundPlayerName[temp_s2_2][playerNameLen - 1]) !=
+ 0x3E) {
break;
}
}
for (i = 0; i < playerNameLen; i++) {
- ptr = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.inventory
- .dekuPlaygroundPlayerName[(s16)(curChar - 0xFD)][i]) *
- FONT_CHAR_TEX_SIZE];
+ curChar = (gSaveContext.save.saveInfo.inventory.dekuPlaygroundPlayerName[temp_s2_2][i]);
msgCtx->decodedBuffer.schar[decodedBufPos + i] = 0xFD;
+ // playerName
+ ptr = &font->fontBuf[(curChar & 0xFFFF) * FONT_CHAR_TEX_SIZE];
for (var_v1_3 = 0; var_v1_3 < FONT_CHAR_TEX_SIZE; var_v1_3 += 4) {
font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 0] = ptr[var_v1_3 + 0];
font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 1] = ptr[var_v1_3 + 1];
@@ -1859,8 +1855,8 @@ void Message_DecodeNES(PlayState* play) {
decodedBufPos++;
} else if (curChar == 0x1C) {
msgCtx->textFade = true;
- msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
- msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos] & 0xFF;
+ msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos] & 0xFF;
} else if (curChar == 0x1E) {
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
@@ -1868,8 +1864,9 @@ void Message_DecodeNES(PlayState* play) {
(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.schar[decodedBufPos - 1] << 8) |
- msgCtx->decodedBuffer.schar[decodedBufPos]);
+ sfxHi = msgCtx->decodedBuffer.schar[decodedBufPos - 1] << 8;
+ sfxHi |= msgCtx->decodedBuffer.schar[decodedBufPos];
+ Audio_PlaySfx(sfxHi);
}
} else if (curChar == 0x1F) {
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos];
@@ -1885,6 +1882,3 @@ void Message_DecodeNES(PlayState* play) {
msgCtx->msgBufPos++;
}
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/Message_DecodeNES.s")
-#endif