summaryrefslogtreecommitdiff
path: root/src/d
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 /src/d
parent45bc91d2636900dc0e279dcdc4b298fe0840e3dd (diff)
some d_message additions
Diffstat (limited to 'src/d')
-rw-r--r--src/d/d_message.cpp114
1 files changed, 112 insertions, 2 deletions
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];