Message_DecodeNES matching

This commit is contained in:
Alejandro Javier Asenjo Nitti
2023-11-09 04:02:57 -03:00
parent 956436315e
commit 5c571c2593
+56 -62
View File
@@ -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;
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->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;
} 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