diff --git a/ZAPDTR b/ZAPDTR
index 51917d817..1b84f796e 160000
--- a/ZAPDTR
+++ b/ZAPDTR
@@ -1 +1 @@
-Subproject commit 51917d817a5828c075ec1e31eac4205e9b456ea7
+Subproject commit 1b84f796ec278128f51d68766d35f052ed69bde9
diff --git a/mm/assets/xml/interface/message_static.xml b/mm/assets/xml/interface/message_static.xml
new file mode 100644
index 000000000..81024355b
--- /dev/null
+++ b/mm/assets/xml/interface/message_static.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mm/assets/xml/interface/message_texture_static.xml b/mm/assets/xml/interface/message_texture_static.xml
new file mode 100644
index 000000000..d7ecf1745
--- /dev/null
+++ b/mm/assets/xml/interface/message_texture_static.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/mm/include/z64message.h b/mm/include/z64message.h
index 2a6eab7f3..34360fe72 100644
--- a/mm/include/z64message.h
+++ b/mm/include/z64message.h
@@ -204,10 +204,18 @@ typedef struct {
/* 0x11D88 */ u8 unk_11D88; // current Char Buffer ?
} Font; // size = 0x11D90
+typedef enum {
+ /* 0 */ TEXTBOX_SEG_ICON,
+ /* 1 */ TEXTBOX_SEG_TYPE,
+ /* 1 */ TEXTBOX_SEG_BG_1,
+ /* 1 */ TEXTBOX_SEG_BG_2,
+ /* 4 */ TEXTBOX_SEG_MAX
+} TextboxSegmentIndex;
+
typedef struct MessageContext {
/* 0x00000 */ View view;
/* 0x00168 */ Font font;
- /* 0x11EF8 */ u8* textboxSegment;
+ /* 0x11EF8 */ char** textboxSegment;
/* 0x11EFC */ UNK_TYPE1 unk11EFC[0x4];
/* 0x11F00 */ struct OcarinaStaff* ocarinaStaff;
/* 0x11F04 */ u16 currentTextId;
diff --git a/mm/src/code/z_kanfont.c b/mm/src/code/z_kanfont.c
index 3860cb92b..1182b7a16 100644
--- a/mm/src/code/z_kanfont.c
+++ b/mm/src/code/z_kanfont.c
@@ -1,7 +1,10 @@
#include "global.h"
#include "BenPort.h"
#include "assets/interface/nes_font_static/nes_font_static.h"
+#include "assets/interface/message_static/message_static.h"
#include
+
+// #region 2S2H [Port] Asset tables we can pull from instead of from ROM
static const char* fontTbl[] = {
gMsgChar20SpaceTex,
gMsgChar21ExclamationMarkTex,
@@ -161,6 +164,13 @@ static const char* fontTbl[] = {
gMsgCharBBControlStickTex,
};
+const char* gMessageBoxEndIcons[] = {
+ gMessageContinueTriangleTex,
+ gMessageEndSquareTex,
+ gMessageArrowTex,
+};
+// #endregion
+
// stubbed in NTSC-U
void Font_LoadChar(PlayState* play, u16 codePointIndex, s32 offset) {
}
@@ -180,12 +190,12 @@ void Font_LoadCharNES(PlayState* play, u8 codePointIndex, s32 offset) {
}
void Font_LoadMessageBoxEndIcon(Font* font, u16 icon) {
- void* tex = ResourceMgr_LoadTexOrDListByName(gItemIcons[icon]);
- memcpy(&font->iconBuf, tex, FONT_CHAR_TEX_SIZE);
-
+ // #region 2S2H [Port]
// DmaMgr_SendRequest0(&font->iconBuf,
- //&((u8*)SEGMENT_ROM_START(message_static))[5 * 0x1000 + icon * FONT_CHAR_TEX_SIZE],
- // FONT_CHAR_TEX_SIZE);
+ // SEGMENT_ROM_START_OFFSET(message_static, 5 * 0x1000 + icon * FONT_CHAR_TEX_SIZE),
+ // FONT_CHAR_TEX_SIZE);
+ memcpy(&font->iconBuf, gMessageBoxEndIcons[icon], strlen(gMessageBoxEndIcons[icon]) + 1);
+ // #endregion
}
static u8 sFontOrdering[] = {
@@ -202,18 +212,17 @@ void Font_LoadOrderedFont(Font* font) {
u8* writeLocation;
while (1) {
- void* tex;
writeLocation = &font->fontBuf[codePointIndex * FONT_CHAR_TEX_SIZE];
- loadOffset = sFontOrdering[codePointIndex]; // *FONT_CHAR_TEX_SIZE;
+ // #region 2S2H [Port]
+ loadOffset = sFontOrdering[codePointIndex]; // * FONT_CHAR_TEX_SIZE;
if (sFontOrdering[codePointIndex] == 0) {
loadOffset = 0;
}
- tex = ResourceMgr_LoadTexOrDListByName(fontTbl[loadOffset]);
- memcpy(writeLocation, tex, FONT_CHAR_TEX_SIZE);
+ // DmaMgr_SendRequest0(writeLocation, (uintptr_t)SEGMENT_ROM_START(nes_font_static) + loadOffset, FONT_CHAR_TEX_SIZE);
+ memcpy(writeLocation, fontTbl[loadOffset], strlen(fontTbl[loadOffset]) + 1);
+ // #endregion
- // DmaMgr_SendRequest0(writeLocation, (uintptr_t)SEGMENT_ROM_START(nes_font_static) + loadOffset,
- // FONT_CHAR_TEX_SIZE);
if (sFontOrdering[codePointIndex] == 0x8C) {
break;
}
diff --git a/mm/src/code/z_message.c b/mm/src/code/z_message.c
index 6265033e8..7716ca9fe 100644
--- a/mm/src/code/z_message.c
+++ b/mm/src/code/z_message.c
@@ -6,6 +6,65 @@
#include "interface/parameter_static/parameter_static.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
#include "BenPort.h"
+#include
+#include "assets/archives/schedule_dma_static/schedule_dma_static_yar.h"
+#include "assets/archives/icon_item_24_static/icon_item_24_static_yar.h"
+#include "assets/interface/message_static/message_static.h"
+#include "assets/interface/message_texture_static/message_texture_static.h"
+
+// #region 2S2H [Port] Asset tables we can pull from instead of from ROM
+#define dgEmptyTexture "__OTR__textures/virtual/gEmptyTexture"
+static const ALIGN_ASSET(2) char gEmptyTexture[] = dgEmptyTexture;
+
+const char* gBombersNotebookPhotos[] = {
+ gBombersNotebookPhotoAnjuTex,
+ gBombersNotebookPhotoKafeiTex,
+ gBombersNotebookPhotoCuriosityShopManTex,
+ gBombersNotebookPhotoBombShopLadyTex,
+ gBombersNotebookPhotoRomaniTex,
+ gBombersNotebookPhotoCremiaTex,
+ gBombersNotebookPhotoMayorDotourTex,
+ gBombersNotebookPhotoMadameAromaTex,
+ gBombersNotebookPhotoTotoTex,
+ gBombersNotebookPhotoGormanTex,
+ gBombersNotebookPhotoPostmanTex,
+ gBombersNotebookPhotoRosaSistersTex,
+ gBombersNotebookPhotoToiletHandTex,
+ gBombersNotebookPhotoAnjusGrandmotherTex,
+ gBombersNotebookPhotoKamaroTex,
+ gBombersNotebookPhotoGrogTex,
+ gBombersNotebookPhotoGormanBrothersTex,
+ gBombersNotebookPhotoShiroTex,
+ gBombersNotebookPhotoGuruGuruTex,
+ gBombersNotebookPhotoBombersTex,
+ gBombersNotebookPhotoMadameAromaBrightTex,
+};
+
+const char* gQuestIcons[] = {
+ gQuestIconGoldSkulltulaTex,
+ gQuestIconHeartContainerTex,
+ gQuestIconPieceOfHeartTex,
+ gQuestIconPieceOfHeart2Tex,
+ gQuestIconHeartContainer2Tex,
+ gQuestIconHeartContainer3Tex,
+ gQuestIconBossKeyTex,
+ gQuestIconCompassTex,
+ gQuestIconDungeonMapTex,
+ gQuestIconGoldSkulltula2Tex,
+ gQuestIconSmallMagicJarTex,
+ gQuestIconSmallKeyTex,
+ gQuestIconBigMagicJarTex,
+ gQuestIconLinkHumanFaceTex,
+};
+
+const char* gMessageBackgrounds[] = {
+ gMessageDefaultBackgroundTex,
+ gMessageSignBackgroundTex,
+ gMessageNoteStaffBackgroundTex,
+ gMessageFadingBackgroundTex,
+ gMessageNotebookBackgroundTex,
+};
+// #endregion
u8 D_801C6A70 = 0;
s16 sOcarinaButtonIndexBufPos = 0;
@@ -929,7 +988,7 @@ void Message_DrawItemIcon(PlayState* play, Gfx** gfxP) {
} 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,
+ gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_ICON], 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;
@@ -937,20 +996,20 @@ void Message_DrawItemIcon(PlayState* play, Gfx** gfxP) {
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,
+ gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_ICON], 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,
+ gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_ICON], 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,
+ gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_ICON], 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,
+ gDPLoadTextureBlock(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_ICON], 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);
}
@@ -1305,13 +1364,13 @@ void Message_DrawTextDefault(PlayState* play, Gfx** gfxP) {
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,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_1], 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,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_2], 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,
@@ -1320,12 +1379,12 @@ void Message_DrawTextDefault(PlayState* play, Gfx** gfxP) {
gDPPipeSync(gfx++);
gDPSetPrimColor(gfx++, 0, 0, 255, 60, 0, msgCtx->textColorAlpha);
- gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 0,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_1], 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,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_2], 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,
@@ -1820,8 +1879,6 @@ s16 D_801CFF94[] = {
void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 arg2) {
MessageContext* msgCtx = &play->msgCtx;
u16* new_var2 = &itemId;
- itemId = 0;
- // BENTODO: Test
if (itemId == ITEM_RECOVERY_HEART) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]);
@@ -1839,40 +1896,45 @@ void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 arg2) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF88[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 0xA);
msgCtx->unk12014 = 0x10;
- void* tex = ResourceMgr_LoadTexOrDListByName(gItemIcons[ITEM_SONG_SONATA]);
- memcpy(msgCtx->textboxSegment + 0x1000, tex, 0x1000);
+ // #region 2S2H [Port]
+ // CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), ITEM_SONG_SONATA, msgCtx->textboxSegment + 0x1000,
+ // 0x180);
+ msgCtx->textboxSegment[TEXTBOX_SEG_ICON] = gItemIcons[ITEM_SONG_SONATA];
} else if (itemId == ITEM_BOMBERS_NOTEBOOK) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 6);
msgCtx->unk12014 = 0x20;
- void* tex = ResourceMgr_LoadTexOrDListByName(gItemIcons[ITEM_SONG_SONATA]);
- memcpy(msgCtx->textboxSegment + 0x1000, tex, 0x1000);
+ // CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), ITEM_SONG_SONATA, msgCtx->textboxSegment + 0x1000,
+ // 0x1000);
+ msgCtx->textboxSegment[TEXTBOX_SEG_ICON] = gItemIcons[ITEM_SONG_SONATA];
} else if (itemId <= ITEM_REMAINS_TWINMOLD) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 6);
msgCtx->unk12014 = 0x20;
- // BENTODO this wasn't done in the minibuild
- void* tex = ResourceMgr_LoadTexOrDListByName(gItemIcons[itemId]);
- memcpy(msgCtx->textboxSegment + 0x1000, tex, 0x1000);
- //CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), itemId, msgCtx->textboxSegment + 0x1000, 0x1000);
+ // CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_static_yar), itemId, msgCtx->textboxSegment + 0x1000, 0x1000);
+ msgCtx->textboxSegment[TEXTBOX_SEG_ICON] = gItemIcons[itemId];
} else if (itemId == ITEM_CC) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 8);
msgCtx->unk12014 = 0x20;
- void* tex = ResourceMgr_LoadTexOrDListByName(gItemIcons[ITEM_POTION_BLUE]);
- memcpy(msgCtx->textboxSegment + 0x1000, tex, 0x400);
+ // CmpDma_LoadFile(SEGMENT_ROM_START(schedule_dma_static_yar), ITEM_POTION_BLUE, msgCtx->textboxSegment + 0x1000,
+ // 0x400);
+ msgCtx->textboxSegment[TEXTBOX_SEG_ICON] = gBombersNotebookPhotos[ITEM_POTION_BLUE];
} else if (itemId >= ITEM_B8) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF70[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 8);
msgCtx->unk12014 = 0x20;
- void* tex = ResourceMgr_LoadTexOrDListByName(gItemIcons[itemId - ITEM_B8]);
- memcpy(msgCtx->textboxSegment + 0x1000, tex, 0x800);
+ // CmpDma_LoadFile(SEGMENT_ROM_START(schedule_dma_static_yar), (itemId - ITEM_B8), msgCtx->textboxSegment + 0x1000,
+ // 0x800);
+ msgCtx->textboxSegment[TEXTBOX_SEG_ICON] = gBombersNotebookPhotos[itemId - ITEM_B8];
} else if (itemId >= ITEM_SKULL_TOKEN) {
msgCtx->unk12010 = (msgCtx->unk11FF8 - D_801CFF7C[gSaveContext.options.language]);
msgCtx->unk12012 = (arg2 + 0xA);
msgCtx->unk12014 = 0x18;
- void* tex = ResourceMgr_LoadTexOrDListByName(gItemIcons[itemId - ITEM_SKULL_TOKEN]);
- memcpy(msgCtx->textboxSegment + 0x1000, tex, 0x900);
+ // CmpDma_LoadFile(SEGMENT_ROM_START(icon_item_24_static_yar), (itemId - ITEM_SKULL_TOKEN),
+ // msgCtx->textboxSegment + 0x1000, 0x900);
+ msgCtx->textboxSegment[TEXTBOX_SEG_ICON] = gQuestIcons[itemId - ITEM_SKULL_TOKEN];
+ // #endregion
}
if (play->pauseCtx.bombersNotebookOpen) {
@@ -1964,7 +2026,7 @@ void Message_SetupLoadItemIcon(PlayState* play) {
font = &msgCtx->font;
if (msgCtx->msgBufPos == 0) {
- if (font->msgBuf.schar[msgCtx->msgBufPos + 2] != 0xFE) {
+ if (((u8)font->msgBuf.schar[msgCtx->msgBufPos + 2]) != 0xFE) {
msgCtx->unk11F18 = 0;
if ((msgCtx->currentTextId == 0x176F) || (msgCtx->currentTextId == 0x1770) ||
(msgCtx->currentTextId == 0x1771)) {
@@ -1972,7 +2034,7 @@ void Message_SetupLoadItemIcon(PlayState* play) {
msgCtx->msgBufPos += 2;
} else {
msgCtx->msgBufPos += 2;
- if ((font->msgBuf.schar[msgCtx->msgBufPos] < 0xC8) || (font->msgBuf.schar[msgCtx->msgBufPos] >= 0xD8)) {
+ if ((((u8)font->msgBuf.schar[msgCtx->msgBufPos]) < 0xC8) || (((u8)font->msgBuf.schar[msgCtx->msgBufPos]) >= 0xD8)) {
msgCtx->itemId = D_801CFF94[(u8)font->msgBuf.schar[msgCtx->msgBufPos]];
} else {
msgCtx->itemId = 0xFE;
@@ -1980,7 +2042,7 @@ void Message_SetupLoadItemIcon(PlayState* play) {
}
} else {
msgCtx->msgBufPos += 2;
- msgCtx->itemId = font->msgBuf.schar[msgCtx->msgBufPos];
+ msgCtx->itemId = (u8)font->msgBuf.schar[msgCtx->msgBufPos];
}
msgCtx->nextTextId = font->msgBuf.schar[++msgCtx->msgBufPos] << 8;
msgCtx->nextTextId |= font->msgBuf.schar[++msgCtx->msgBufPos];
@@ -2279,10 +2341,13 @@ void Message_Decode(PlayState* play) {
decodedBufPos += playerNameLen - 1;
spC0 += playerNameLen * (16.0f * msgCtx->textCharScale);
} else if (curChar == 0x201) {
- // BENTODO
+ // #region 2S2H [Port]
//DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900);
//DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900,
// 0x900);
+ msgCtx->textboxSegment[TEXTBOX_SEG_BG_1] = gMessageXLeftTex;
+ msgCtx->textboxSegment[TEXTBOX_SEG_BG_2] = gMessageXRightTex;
+ // #endregion
numLines = 2;
spD2 = 2;
msgCtx->unk12012 = msgCtx->textboxY + 8;
@@ -3048,9 +3113,11 @@ void func_80150A84(PlayState* play) {
s32 textBoxType = msgCtx->textBoxType;
if (D_801CFC78[textBoxType] != 14) {
- // BENTODO
+ // #region 2S2H [Port]
//DmaMgr_SendRequest0(msgCtx->textboxSegment,
// SEGMENT_ROM_START(message_static) + D_801CFC78[textBoxType] * 0x1000, 0x1000);
+ msgCtx->textboxSegment[TEXTBOX_SEG_TYPE] = gMessageBackgrounds[D_801CFC78[textBoxType]];
+ // #endregion
if (!play->pauseCtx.bombersNotebookOpen) {
if ((textBoxType == TEXTBOX_TYPE_0) || (textBoxType == TEXTBOX_TYPE_6) || (textBoxType == TEXTBOX_TYPE_A) ||
@@ -3309,8 +3376,10 @@ void func_801514B0(PlayState* play, u16 arg1, u8 arg2) {
msgCtx->textBoxPos = arg2;
msgCtx->unk11F0C = msgCtx->unk11F08 & 0xF;
msgCtx->textUnskippable = true;
- // BENTODO
+ // #region 2S2H [Port]
//DmaMgr_SendRequest0(msgCtx->textboxSegment, SEGMENT_ROM_START(message_static) + (D_801CFC78[0] << 12), 0x1000);
+ msgCtx->textboxSegment[TEXTBOX_SEG_TYPE] = gMessageBackgrounds[D_801CFC78[0]];
+ // #endregion
msgCtx->textboxColorRed = 0;
msgCtx->textboxColorGreen = 0;
msgCtx->textboxColorBlue = 0;
@@ -3715,7 +3784,7 @@ void Message_DrawTextBox(PlayState* play, Gfx** gfxP) {
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,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_TYPE], 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++);
@@ -3727,7 +3796,7 @@ void Message_DrawTextBox(PlayState* play, Gfx** gfxP) {
} 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,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_TYPE], 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);
}
@@ -4185,7 +4254,7 @@ void Message_DrawMain(PlayState* play, Gfx** gfxP) {
gfx = *gfxP;
gSPSegment(gfx++, 0x02, play->interfaceCtx.parameterSegment);
- gSPSegment(gfx++, 0x07, msgCtx->textboxSegment);
+ gSPSegment(gfx++, 0x07, msgCtx->textboxSegment[TEXTBOX_SEG_TYPE]);
if (msgCtx->msgLength != 0) {
if (!msgCtx->textIsCredits) {
@@ -6039,7 +6108,12 @@ void Message_Init(PlayState* play) {
View_Init(&msgCtx->view, play->state.gfxCtx);
- msgCtx->textboxSegment = THA_AllocTailAlign16(&play->state.tha, 0x13C00);
+ // #region 2S2H [Port]
+ msgCtx->textboxSegment = THA_AllocTailAlign16(&play->state.tha, sizeof(char*) * TEXTBOX_SEG_MAX);
+ for (size_t id = 0; id < TEXTBOX_SEG_MAX; id++) {
+ msgCtx->textboxSegment[id] = gEmptyTexture;
+ }
+ // #endregion
font = &play->msgCtx.font;
Font_LoadOrderedFont(&play->msgCtx.font);
diff --git a/mm/src/code/z_message_nes.c b/mm/src/code/z_message_nes.c
index cf595be0c..6626eef29 100644
--- a/mm/src/code/z_message_nes.c
+++ b/mm/src/code/z_message_nes.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "message_data_static.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
+#include "assets/interface/message_texture_static/message_texture_static.h"
#include
f32 sNESFontWidths[160] = {
@@ -26,13 +27,17 @@ void Message_FindMessageNES(PlayState* play, u16 textId) {
while (msgEntry->textId != 0xFFFF) {
if (msgEntry->textId == textId) {
+ // #region 2SH2 [Port] Just assign the msgEntry, we don't need to change the messageStart and messageEnd
font->messageStart = msgEntry;
+ return;
+ // #endregion
+
foundSegment = msgEntry->segment;
msgEntry++;
nextSegment = msgEntry->segment;
- //font->messageStart = foundSegment - segment;
- //font->messageEnd = nextSegment - foundSegment;
+ font->messageStart = foundSegment - segment;
+ font->messageEnd = nextSegment - foundSegment;
return;
}
msgEntry++;
@@ -42,8 +47,11 @@ void Message_FindMessageNES(PlayState* play, u16 textId) {
foundSegment = msgEntry->segment;
msgEntry++;
nextSegment = msgEntry->segment;
- font->messageStart = foundSegment - segment;
- font->messageEnd = nextSegment - foundSegment;
+ // #region 2S2H [Port] This seems to be a fallback if the message isn't found it just
+ // returns the first message, we still don't need to change the messageStart and messageEnd
+ // font->messageStart = foundSegment - segment;
+ // font->messageEnd = nextSegment - foundSegment;
+ // #endregion
}
void Message_LoadCharNES(PlayState* play, u8 codePointIndex, s32* offset, f32* arg3, s16 decodedBufPos) {
@@ -663,13 +671,13 @@ void Message_DrawTextNES(PlayState* play, Gfx** gfxP, u16 textDrawPos) {
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,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_1], 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 + 0x60) << 2, (msgCtx->unk12012 + 0x31) << 2, G_TX_RENDERTILE, 0,
0, 1 << 10, 1 << 10);
- gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 0,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_2], G_IM_FMT_I, 96, 48, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(gfx++, (msgCtx->textPosX + 0x60) << 2, (msgCtx->unk12012 + 1) << 2,
@@ -678,12 +686,12 @@ void Message_DrawTextNES(PlayState* play, Gfx** gfxP, u16 textDrawPos) {
gDPPipeSync(gfx++);
gDPSetPrimColor(gfx++, 0, 0, 255, 60, 0, msgCtx->textColorAlpha);
- gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 0,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_1], G_IM_FMT_I, 96, 48, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(gfx++, msgCtx->textPosX << 2, msgCtx->unk12012 << 2, (msgCtx->textPosX + 0x60) << 2,
(msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
- gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 0,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_2], G_IM_FMT_I, 96, 48, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(gfx++, (msgCtx->textPosX + 0x60) << 2, msgCtx->unk12012 << 2,
@@ -847,11 +855,6 @@ void Message_DrawTextNES(PlayState* play, Gfx** gfxP, u16 textDrawPos) {
Audio_PlaySfx(NA_SE_NONE);
}
- if (((u8)character >= 0xB0) && ((u8)character <= 0xBB)) {
- } else {
- printf("Unhandled or default character: 0x%04X\n", character);
- }
-
if (((u8)character >= 0xB0) && ((u8)character <= 0xBB)) {
sp12E = msgCtx->textColorR;
sp12C = msgCtx->textColorG;
@@ -1093,10 +1096,13 @@ void Message_DecodeNES(PlayState* play) {
}
decodedBufPos--;
} else if (curChar == 0xC1) {
- // BENTODO
+ // #region 2S2H [Port]
//DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900);
//DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900,
// 0x900);
+ msgCtx->textboxSegment[TEXTBOX_SEG_BG_1] = gMessageXLeftTex;
+ msgCtx->textboxSegment[TEXTBOX_SEG_BG_2] = gMessageXRightTex;
+ // #endregion
numLines = 2;
spC6 = 2;
msgCtx->unk12012 = msgCtx->textboxY + 8;
diff --git a/mm/src/code/z_message_staff.c b/mm/src/code/z_message_staff.c
index 6b94d7719..4a7addd9c 100644
--- a/mm/src/code/z_message_staff.c
+++ b/mm/src/code/z_message_staff.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "message_data_static.h"
+#include "assets/interface/message_texture_static/message_texture_static.h"
void Message_FindCreditsMessage(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
@@ -188,14 +189,14 @@ void Message_DrawTextCredits(PlayState* play, Gfx** gfxP) {
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,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_1], G_IM_FMT_I, 96, 48, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(gfx++, (msgCtx->textPosX + 1) << 2, (msgCtx->unk12012 + 1) << 2,
(msgCtx->textPosX + 0x61) << 2, (msgCtx->unk12012 + 0x31) << 2, G_TX_RENDERTILE, 0,
0, 1 << 10, 1 << 10);
- gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 0,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_2], G_IM_FMT_I, 96, 48, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(gfx++, (msgCtx->textPosX + 0x61) << 2, (msgCtx->unk12012 + 1) << 2,
@@ -204,12 +205,12 @@ void Message_DrawTextCredits(PlayState* play, Gfx** gfxP) {
gDPPipeSync(gfx++);
gDPSetPrimColor(gfx++, 0, 0, 255, 60, 0, msgCtx->textColorAlpha);
- gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1000, G_IM_FMT_I, 96, 48, 0,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_1], G_IM_FMT_I, 96, 48, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(gfx++, msgCtx->textPosX << 2, msgCtx->unk12012 << 2, (msgCtx->textPosX + 0x60) << 2,
(msgCtx->unk12012 + 0x30) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
- gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment + 0x1900, G_IM_FMT_I, 96, 48, 0,
+ gDPLoadTextureBlock_4b(gfx++, msgCtx->textboxSegment[TEXTBOX_SEG_BG_2], G_IM_FMT_I, 96, 48, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(gfx++, (msgCtx->textPosX + 0x60) << 2, msgCtx->unk12012 << 2,
@@ -627,10 +628,14 @@ void Message_DecodeCredits(PlayState* play) {
msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1];
Message_LoadItemIcon(play, font->msgBuf.schar[msgCtx->msgBufPos + 1], msgCtx->textboxY + 10);
} else if (curChar == 0x15) {
- DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000,
- (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
- DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900,
- (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
+ // #region 2S2H [Port]
+ // DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000,
+ // (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
+ // DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900,
+ // (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900);
+ msgCtx->textboxSegment[TEXTBOX_SEG_BG_1] = gMessageXLeftTex;
+ msgCtx->textboxSegment[TEXTBOX_SEG_BG_2] = gMessageXRightTex;
+ // #endregion
msgCtx->msgBufPos += 3;
msgCtx->unk12012 = msgCtx->textboxY + 8;
numLines = 2;