summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-04-06 23:15:50 +0200
committerrobojumper <robojumper@gmail.com>2025-04-07 22:12:41 +0200
commitd14d64ef672bab94f835fe894d8dc83094075809 (patch)
treea5ab3dd689010104c11b4f4bf71ecc0857959d31
parent45bc91d2636900dc0e279dcdc4b298fe0840e3dd (diff)
some d_message additions
-rw-r--r--config/SOUE01/symbols.txt18
-rw-r--r--include/d/d_message.h17
-rw-r--r--include/d/d_textunk.h21
-rw-r--r--include/libms/flowfile.h2
-rw-r--r--src/d/d_message.cpp114
5 files changed, 158 insertions, 14 deletions
diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt
index 9f10d075..231ed689 100644
--- a/config/SOUE01/symbols.txt
+++ b/config/SOUE01/symbols.txt
@@ -10932,22 +10932,22 @@ getMsbtIndexForLabel__10dMessage_cFPCc = .text:0x801B2A70; // type:function size
getMsbtIndexForLabelInternal__10dMessage_cFPCc = .text:0x801B2A80; // type:function size:0xA4
getMsbtInfoForIndex__10dMessage_cFl = .text:0x801B2B30; // type:function size:0xC
getMsbtInfoForIndexInternal__10dMessage_cFl = .text:0x801B2B40; // type:function size:0x38
-getMsbfInfoForIndex = .text:0x801B2B80; // type:function size:0xC
-fn_801B2B90 = .text:0x801B2B90; // type:function size:0x38
+getMsbfInfoForIndex__10dMessage_cFl = .text:0x801B2B80; // type:function size:0xC
+getMsbfInfoForIndexInternal__10dMessage_cFl = .text:0x801B2B90; // type:function size:0x38
fn_801B2BD0 = .text:0x801B2BD0; // type:function size:0x10
fn_801B2BE0 = .text:0x801B2BE0; // type:function size:0x40
fn_801B2C20 = .text:0x801B2C20; // type:function size:0x30
-fn_801B2C50 = .text:0x801B2C50; // type:function size:0xC0
+executeMinigame__10dMessage_cFv = .text:0x801B2C50; // type:function size:0xC0
fn_801B2D10 = .text:0x801B2D10; // type:function size:0x4C
reset__10dMessage_cFv = .text:0x801B2D60; // type:function size:0x44
getLanguageIdentifier__10dMessage_cFv = .text:0x801B2DB0; // type:function size:0x1B0
getArcNameByIndex__10dMessage_cFlb = .text:0x801B2F60; // type:function size:0x4
-getEventFlowFileNameByIndex2 = .text:0x801B2F70; // type:function size:0x14
+getArcNameByIndexInternal__10dMessage_cFlb = .text:0x801B2F70; // type:function size:0x14
getDataFromMsbArc__10dMessage_cFlPCcb = .text:0x801B2F90; // type:function size:0x70
setZevFromMsbArc__10dMessage_cFv = .text:0x801B3000; // type:function size:0x68
-fn_801B3070 = .text:0x801B3070; // type:function size:0x104
-fn_801B3180 = .text:0x801B3180; // type:function size:0x24
-fn_801B31B0 = .text:0x801B31B0; // type:function size:0x24
+setStageZevFromMsbArc__10dMessage_cFv = .text:0x801B3070; // type:function size:0x104
+getZev0Internal__10dMessage_cFv = .text:0x801B3180; // type:function size:0x24
+getZevStageInternal__10dMessage_cFv = .text:0x801B31B0; // type:function size:0x24
getArcIndexForFile__10dMessage_cFPCc = .text:0x801B31E0; // type:function size:0x34
__dt__10dMessage_cFv = .text:0x801B3220; // type:function size:0x64
__sinit_\d_message_cpp = .text:0x801B3290; // type:function size:0xC scope:local
@@ -40234,8 +40234,8 @@ sTagProcessor__10dMessage_c = .sbss:0x80575744; // type:object size:0x4 data:4by
lbl_80575748 = .sbss:0x80575748; // type:object size:0x1 data:byte
lbl_80575749 = .sbss:0x80575749; // type:object size:0x7 data:byte
CURRENT_LANGUAGE_STRING = .sbss:0x80575750; // type:object size:0x8 data:byte
-lbl_80575758 = .sbss:0x80575758; // type:object size:0x4 data:4byte
-lbl_8057575C = .sbss:0x8057575C; // type:object size:0x4 data:4byte
+sZev0__10dMessage_c = .sbss:0x80575758; // type:object size:0x4 data:4byte
+sZevStage__10dMessage_c = .sbss:0x8057575C; // type:object size:0x4 data:4byte
sInstance__8dStage_c = .sbss:0x80575760; // type:object size:0x4 data:4byte
lbl_80575764 = .sbss:0x80575764; // type:object size:0x1 data:byte
lbl_80575768 = .sbss:0x80575768; // type:object size:0x8 data:byte
diff --git a/include/d/d_message.h b/include/d/d_message.h
index 47b0fe4d..cd075bb0 100644
--- a/include/d/d_message.h
+++ b/include/d/d_message.h
@@ -57,6 +57,14 @@ public:
static const wchar_t *formatText(const wchar_t *text);
private:
+ static void *sZev0;
+ static void *sZevStage;
+
+ static void *getZev0Internal();
+ static void *getZevStageInternal();
+
+ void executeMinigame();
+
const wchar_t *formatTextInternal(const wchar_t *text);
const wchar_t *getTextMessageByLabelInternal(
const char *label, dTagProcessor_c *pTagProcessor, bool global, wchar_t *dstBuf, u32 maxLen
@@ -68,6 +76,7 @@ private:
bool checkIsValidTextLabel(const char *name);
static void setZevFromMsbArc();
+ static void setStageZevFromMsbArc();
static s32 getMsbtNumberByIndex(s32 index);
static const char *getMsbfFileName(s32 index);
static s32 getMsbfNumberByIndex(s32 index);
@@ -78,6 +87,11 @@ private:
static MsbtInfo *getMsbtInfoForIndex(s32 index);
MsbtInfo *getMsbtInfoForIndexInternal(s32 index);
+ static MsbfInfo *getMsbfInfoForIndex(s32 index);
+ MsbfInfo *getMsbfInfoForIndexInternal(s32 index);
+
+ static const char *getArcNameByIndexInternal(s32 idx, bool global);
+
static dMessage_c *sInstance;
static dTagProcessor_c *sTagProcessor;
@@ -93,8 +107,11 @@ private:
/* 0x329 */ bool field_0x329;
/* 0x32A */ bool field_0x32A;
+ /* 0x32B */ u8 _0x32B[0x334 - 0x32B];
+
/* 0x334 */ u32 mMinigameResultPoints;
/* 0x338 */ u32 mMinigameTime;
+ /* 0x33C */ u8 _0x33C[0x344 - 0x33C];
/* 0x344 */ s32 field_0x344;
};
diff --git a/include/d/d_textunk.h b/include/d/d_textunk.h
index bc820fd7..90e2a4d4 100644
--- a/include/d/d_textunk.h
+++ b/include/d/d_textunk.h
@@ -133,10 +133,26 @@ public:
return field_0x7B4;
}
+ void *getField_0x74C() const {
+ return field_0x74C;
+ }
+
+ void *getField_0x750() const {
+ return field_0x750;
+ }
+
+ bool getField_0x7B6() const {
+ return field_0x7B6;
+ }
+
MsbtInfo *getMsbtInfo(s32 index) const {
return field_buf2[index];
}
+ MsbfInfo *getMsbfInfo(s32 index) const {
+ return field_buf3[index];
+ }
+
const char *getStr1() const {
return field_0x004;
}
@@ -161,11 +177,12 @@ public:
field_0x104 = s;
}
+ void *allocUnk(size_t size, int align);
+ void destroyUnk(void *thing);
+
private:
static UnkTextThing *sInstance;
- void *allocUnk(size_t size, int align);
- void destroyUnk(void *thing);
void destroyFlow(MsbfInfo *flow);
void destroyMsg(MsbtInfo *msg);
diff --git a/include/libms/flowfile.h b/include/libms/flowfile.h
index 9bc47790..edd1710f 100644
--- a/include/libms/flowfile.h
+++ b/include/libms/flowfile.h
@@ -12,7 +12,7 @@ struct MsbfInfo;
struct MsbFlowInfo {
/* 0x00 */ char type;
/* 0x01 */ char subType;
- /* 0x04 */ short params1n2;
+ /* 0x04 */ int params1n2;
/* 0x08 */ short next;
/* 0x0A */ short param3;
/* 0x0C */ short param4;
diff --git a/src/d/d_message.cpp b/src/d/d_message.cpp
index 4633ff8a..f0c01978 100644
--- a/src/d/d_message.cpp
+++ b/src/d/d_message.cpp
@@ -1,16 +1,21 @@
#include "d/d_message.h"
#include "common.h"
+#include "d/d_sc_game.h"
#include "d/d_tag_processor.h"
#include "d/d_textunk.h"
+#include "egg/core/eggHeap.h"
#include "f/f_base.h"
#include "f/f_profile.h"
#include "f/f_profile_name.h"
#include "libms/libms.h"
#include "libms/msgfile.h"
#include "sized_string.h"
+#include "toBeSorted/arc_managers/oarc_manager.h"
+#include "toBeSorted/event_manager.h"
#include "toBeSorted/global_fi_context.h"
+
SPECIAL_BASE_PROFILE(MESSAGE, dMessage_c, fProfile::MESSAGE, 0x2A8, 0);
static const char *sMsbtFileNames[82] = {
@@ -181,12 +186,28 @@ static char *sMsbfFileNames[80] = {
"599-Demo.msbf",
};
+static char *sArcNames[] = {
+ "0-Common", "1-Town", "2-Forest", "3-Mountain", "4-Desert", "5-CenterField",
+};
+
dMessage_c *dMessage_c::sInstance;
dTagProcessor_c *dMessage_c::sTagProcessor;
-static void *msbAlloc(size_t size) {}
+static void *msbAlloc(size_t size) {
+ if (UnkTextThing::getInstance()->getField_0x7B6() == false) {
+ return EGG::Heap::alloc(size, 0x20, nullptr);
+ } else {
+ return UnkTextThing::getInstance()->allocUnk(size, 0x20);
+ }
+}
-static void msbFree(void *ptr) {}
+static void msbFree(void *ptr) {
+ if (UnkTextThing::getInstance()->getField_0x7B6() == false) {
+ EGG::Heap::free(ptr, nullptr);
+ } else {
+ UnkTextThing::getInstance()->destroyUnk(ptr);
+ }
+}
dMessage_c::dMessage_c() {
sInstance = this;
@@ -251,6 +272,16 @@ int dMessage_c::doDelete() {
}
int dMessage_c::execute() {
+ if (field_0x2FC != 0 && !EventManager::isInEvent()) {
+ field_0x2FC = 0;
+ }
+
+ if (field_0x2FC > 0) {
+ field_0x2FC--;
+ }
+ executeMinigame();
+ sTagProcessor->execute();
+
return SUCCEEDED;
}
@@ -394,6 +425,10 @@ s32 dMessage_c::getTextIndexForLabel(const char *label) {
return LMS_GetTextIndexByLabel(info, label);
}
+s32 dMessage_c::getMsbtIndexForLabel(const char *label) {
+ return sInstance->getMsbtIndexForLabelInternal(label);
+}
+
s32 dMessage_c::getMsbtIndexForLabelInternal(const char *label) {
if (mCurrentTextFileNumber <= 81) {
MsbtInfo *info = getMsbtInfoForIndex(mCurrentTextFileNumber);
@@ -426,6 +461,19 @@ MsbtInfo *dMessage_c::getMsbtInfoForIndexInternal(s32 index) {
return mpMsgs[index];
}
+MsbfInfo *dMessage_c::getMsbfInfoForIndex(s32 index) {
+ return sInstance->getMsbfInfoForIndexInternal(index);
+}
+
+MsbfInfo *dMessage_c::getMsbfInfoForIndexInternal(s32 index) {
+ UnkTextThing *thing = UnkTextThing::getInstance();
+ MsbfInfo *overrideMsbf = thing->getMsbfInfo(index);
+ if (overrideMsbf != nullptr && thing->getField_0x7B4() == true) {
+ return overrideMsbf;
+ }
+ return mpFlows[index];
+}
+
extern "C" u8 fn_80054F30();
static SizedString<8> sCurrentLanguage;
@@ -441,6 +489,68 @@ const char *dMessage_c::getLanguageIdentifier() {
return sCurrentLanguage;
}
+const char *dMessage_c::getArcNameByIndex(s32 idx, bool global) {
+ return getArcNameByIndexInternal(idx, global);
+}
+
+const char *dMessage_c::getArcNameByIndexInternal(s32 idx, bool global) {
+ return sArcNames[idx];
+}
+
+void *dMessage_c::getDataFromMsbArc(s32 number, const char *fileName, bool global) {
+ SizedString<128> path;
+ path.sprintf("%s/%s", getLanguageIdentifier(), getArcNameByIndex(number, global));
+ return OarcManager::GetInstance()->getData(path, fileName);
+}
+
+void dMessage_c::setZevFromMsbArc() {
+ SizedString<128> path;
+ path.sprintf("%s/dat/zev.dat", getArcNameByIndex(0, false));
+ sZev0 = getDataFromMsbArc(0, path, false);
+ sZevStage = nullptr;
+}
+
+void dMessage_c::setStageZevFromMsbArc() {
+ SizedString<32> stage = dScGame_c::currentSpawnInfo.stageName;
+ char buf[2];
+ buf[0] = stage[1];
+ buf[1] = '\0';
+
+ SizedString<128> path;
+
+ int i = atoi(buf) + 1;
+
+ // TODO figure out what this is
+ if (stage == "t_tkm24" || stage == "t_tkm26") {
+ i = 2;
+ } else if (i < 1 || 6 <= i) {
+ i = 0;
+ }
+ path.sprintf("%s/dat/zev.dat", getArcNameByIndex(i, false));
+ sZevStage = getDataFromMsbArc(i, path, false);
+}
+
+void *dMessage_c::sZev0;
+void *dMessage_c::sZevStage;
+
+void *dMessage_c::getZev0Internal() {
+ UnkTextThing *thing = UnkTextThing::getInstance();
+ void *overrideZev = thing->getField_0x74C();
+ if (overrideZev != nullptr && thing->getField_0x7B4() == true) {
+ return overrideZev;
+ }
+ return sZev0;
+}
+
+void *dMessage_c::getZevStageInternal() {
+ UnkTextThing *thing = UnkTextThing::getInstance();
+ void *overrideZev = thing->getField_0x750();
+ if (overrideZev != nullptr && thing->getField_0x7B4() == true) {
+ return overrideZev;
+ }
+ return sZevStage;
+}
+
s32 dMessage_c::getArcIndexForFile(const char *fileName) {
char buf[2];
buf[0] = fileName[0];