diff --git a/config/eur/arm9/symbols.txt b/config/eur/arm9/symbols.txt index 81d11530..0c677bce 100644 --- a/config/eur/arm9/symbols.txt +++ b/config/eur/arm9/symbols.txt @@ -1822,10 +1822,10 @@ func_02037158 kind:function(arm,size=0x20) addr:0x2037158 func_02037178 kind:function(arm,size=0x38) addr:0x2037178 func_020371b0 kind:function(arm,size=0x4) addr:0x20371b0 _Z13func_020371b4P11BMGFileInfo kind:function(thumb,size=0x14) addr:0x20371b4 -_Z13func_020371c8P11BMGFileInfoPji kind:function(thumb,size=0x90) addr:0x20371c8 +_Z13func_020371c8P11BMGFileInfoPjs kind:function(thumb,size=0x90) addr:0x20371c8 _Z13func_02037258P11BMGFileInfoi kind:function(arm,size=0x34) addr:0x2037258 _Z13func_0203728cP11BMGFileInfoi kind:function(arm,size=0x64) addr:0x203728c -_ZN14MessageManager13func_020372f0Eiii kind:function(thumb,size=0xc4) addr:0x20372f0 +_ZN14MessageManager13func_020372f0Eisi kind:function(thumb,size=0xc4) addr:0x20372f0 func_020373b4 kind:function(thumb,size=0x38) addr:0x20373b4 func_020373ec kind:function(arm,size=0x60) addr:0x20373ec func_0203744c kind:function(thumb,size=0xc) addr:0x203744c diff --git a/config/usa/arm9/symbols.txt b/config/usa/arm9/symbols.txt index 1ddc3578..e9affc4c 100644 --- a/config/usa/arm9/symbols.txt +++ b/config/usa/arm9/symbols.txt @@ -1822,10 +1822,10 @@ func_02037158 kind:function(arm,size=0x20) addr:0x2037114 func_02037178 kind:function(arm,size=0x38) addr:0x2037134 func_020371b0 kind:function(arm,size=0x4) addr:0x203716c _Z13func_020371b4P11BMGFileInfo kind:function(thumb,size=0x14) addr:0x2037170 -_Z13func_020371c8P11BMGFileInfoPji kind:function(thumb,size=0x90) addr:0x2037184 +_Z13func_020371c8P11BMGFileInfoPjs kind:function(thumb,size=0x90) addr:0x2037184 _Z13func_02037258P11BMGFileInfoi kind:function(arm,size=0x34) addr:0x2037214 _Z13func_0203728cP11BMGFileInfoi kind:function(arm,size=0x64) addr:0x2037248 -_ZN14MessageManager13func_020372f0Eiii kind:function(thumb,size=0xc4) addr:0x20372ac +_ZN14MessageManager13func_020372f0Eisi kind:function(thumb,size=0xc4) addr:0x20372ac func_020373b4 kind:function(thumb,size=0x38) addr:0x2037370 func_020373ec kind:function(arm,size=0x60) addr:0x20373a8 func_0203744c kind:function(thumb,size=0xc) addr:0x2037408 diff --git a/include/Message/BMG.hpp b/include/Message/BMG.hpp index cbb41527..fccb914d 100644 --- a/include/Message/BMG.hpp +++ b/include/Message/BMG.hpp @@ -4,13 +4,15 @@ #include "types.h" #define BMG_MAGIC "MESGbmg1" -#define BMG_TAG(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) +#define BMG_TAG(a, b, c, d) (((d) << 24) | ((c) << 16) | ((b) << 8) | (a)) typedef enum BMGTag { /* "INF1" */ BMG_TAG_INF1 = BMG_TAG('I', 'N', 'F', '1'), /* "FLW1" */ BMG_TAG_FLW1 = BMG_TAG('F', 'L', 'W', '1'), /* "FLI1" */ BMG_TAG_FLI1 = BMG_TAG('F', 'L', 'I', '1'), /* "DAT1" */ BMG_TAG_DAT1 = BMG_TAG('D', 'A', 'T', '1'), + /* "MID1" */ BMG_TAG_MID1 = BMG_TAG('M', 'I', 'D', '1'), + /* "MID1" */ BMG_TAG_STR1 = BMG_TAG('S', 'T', 'R', '1'), } BMGTag; typedef enum BMGEncoding { @@ -22,7 +24,7 @@ typedef enum BMGEncoding { } BMGEncoding; typedef struct SectionBase { - /* 0x00 */ char tag[4]; // "INF1", "DAT1", ... + /* 0x00 */ u32 tag; // "INF1", "DAT1", ... /* 0x04 */ u32 size; // the size of the section } SectionBase; // size = 0x8 @@ -32,8 +34,7 @@ typedef struct BMGHeader { /* 0x0C */ u32 numSections; // the number of sections (INF1, DAT1, ...) /* 0x10 */ u8 encoding; // see `BMGEncoding` /* 0x11 */ u8 unk_11[0xF]; // alignment padding? - /* 0x20 */ SectionBase* firstSection; // technically not part of the header but used by functions -} BMGHeader; // size = 0x24 +} BMGHeader; // size = 0x20 typedef struct EntryINF1 { /* 0x00 */ u32 offset; // relative to the end of the DAT1 header diff --git a/include/Message/MessageManager.hpp b/include/Message/MessageManager.hpp index 71106045..e1d63cc3 100644 --- a/include/Message/MessageManager.hpp +++ b/include/Message/MessageManager.hpp @@ -17,5 +17,5 @@ private: BMGFileInfo* aUnknownData; public: - void func_020372f0(int index, int param_3, int param_4); + void func_020372f0(int index, s16 unk_18, int param_4); }; diff --git a/src/Main/MessageManager.cpp b/src/Main/MessageManager.cpp index 08166652..ca199d89 100644 --- a/src/Main/MessageManager.cpp +++ b/src/Main/MessageManager.cpp @@ -20,89 +20,78 @@ THUMB void func_020371b4(BMGFileInfo* pData) { pData->unk_18 = 0; } -THUMB int func_020371c8(BMGFileInfo* pData, u32* pFile, int param_3) { - char acVar1; - char* pacVar2; - char acVar3; - int dVar4; - u32 uVar5; +THUMB u16 func_020371c8(BMGFileInfo* pFileInfo, u32* pFile, s16 unk_18) { + SectionBase* pSection; + u16 groupId; + u32 i; - pData->unk_14 = (BMGHeader*)pFile; - pData->unk_18 = param_3; - pData->pHeader = (BMGHeader*)pFile; + groupId = -1; + pFileInfo->unk_14 = (BMGHeader*)pFile; + pFileInfo->pHeader = (BMGHeader*)pFile; + pFileInfo->unk_18 = unk_18; + pSection = (SectionBase*)((u8*)pFile + sizeof(BMGHeader)); - // acVar1 = BMG_TAG_FLI1; - // pacVar2 = pHeader->firstSection; - // uVar5 = 0; - // dVar4 = 0xFFFF; + for (i = 0; i < pFileInfo->pHeader->numSections; i++) { + switch (pSection->tag) { + case BMG_TAG_MID1: + // unused + break; + case BMG_TAG_STR1: + // unused + break; + case BMG_TAG_INF1: + pFileInfo->pINF1 = (SectionINF1*)pSection; + groupId = pFileInfo->pINF1->groupId; + break; + case BMG_TAG_DAT1: + //! TODO: fake? + pFileInfo->pDAT1 = (SectionDAT1*)(pSection + 1); + break; + case BMG_TAG_FLW1: + pFileInfo->pFLW1 = (SectionFLW1*)pSection; + break; + case BMG_TAG_FLI1: + pFileInfo->pFLI1 = (SectionFLI1*)pSection; + break; + } - if (pData->pFLI1 != NULL) { - // do { - // acVar3 = *pacVar2; - - if (acVar1 < acVar3) { - // if ('DAT1' < acVar3) { - // if (acVar3 == 'FLW1') { - // pData->pFLW1 = (int)pacVar2; - // } - // } else if ('DAT1' <= acVar3) { - // pData->pDAT1 = (int)(pacVar2 + 2); - // } - } else if (acVar3 < acVar1) { - // if (('MID1' < acVar3) && (acVar3 == 'INF1')) { - // pData->pINF1 = (int)pacVar2; - // dVar4 = pacVar2[3]; - // } - } else { - // pData->pFLI1 = (int)pacVar2; - } - - // uVar5 = uVar5 + 1; - // pacVar2++; - // } while (uVar5 < pData->pFLI1); + pSection = (SectionBase*)((u8*)pSection + pSection->size); } - return dVar4; + return groupId; } -ARM int func_02037258(BMGFileInfo* pData, unk32 param_2) { - // u32 iVar1; +ARM EntryINF1* func_02037258(BMGFileInfo* pFileInfo, unk32 param_2) { + SectionINF1* pINF1 = pFileInfo->pINF1; - // iVar1 = pData->pINF1; + if (pINF1 == NULL) { + return NULL; + } - // if (iVar1 == 0) { - // return 0; - // } + if (param_2 < pINF1->numEntries) { + return &pINF1->entries[pINF1->entrySize * param_2]; + } - // if (param_2 < iVar1) { - // return (iVar1 + 10) * param_2 + iVar1 + 0x10; - // } - - // return 0; + return NULL; } -ARM s64 func_0203728c(BMGFileInfo* pData, unk32 param_2) { - // u32* iVar1; - // u32 uVar2; - // u32 uVar3; +ARM u16 func_0203728c(BMGFileInfo* pFileInfo, unk32 param_2) { + SectionFLI1* pFLI1; + u16 i; - // iVar1 = pData->unk_0C; - // if (iVar1 == 0) { - // return 0xFFFF; - // } + pFLI1 = pFileInfo->pFLI1; - // uVar2 = 0; - // if (iVar1 + 0xC + 8 != 0) { - // do { - // if (param_2 == *(int *)(iVar1 + 0x10 + uVar2 * 8)) { - // return iVar1 + 0x10 + uVar2 * 8 + 4; - // } - // uVar3 = uVar2 + 1; - // uVar2 = uVar3 & 0xFFFF; - // } while ((uVar3 & 0xFFFF) < iVar1 + 0xC + 8); - // } + if (pFLI1 == NULL) { + return -1; + } - // return 0xFFFF; + for (i = 0; i < pFLI1->entrySize; i++) { + if (param_2 == pFLI1->entries[i * 8].msgFlowID) { + return pFLI1->entries[i * 8].msgFlowNodeIndex; + } + } + + return -1; } static char* sBMGFiles[] = { @@ -142,11 +131,11 @@ static char* sBMGFiles[] = { "kaitei_F", }; -THUMB void MessageManager::func_020372f0(int index, int param_3, int param_4) { +THUMB void MessageManager::func_020372f0(int index, s16 unk_18, int param_4) { char bmgPath[64]; BMGFileInfo bmgFile; u32* pFile; - int iVar1; + u16 groupId; // path to the bmg file for the current language (i.e.: "English/Message/battle.bmg") strcpy(bmgPath, func_0202ab38(&data_027e05f4)); @@ -156,8 +145,8 @@ THUMB void MessageManager::func_020372f0(int index, int param_3, int param_4) { pFile = data_027e0ce0[1]; - if (param_3 != 1) { - if (param_3 != 4) { + if (unk_18 != 1) { + if (unk_18 != 4) { pFile = data_027e0ce0[0]; } else { pFile = data_ov002_0210016c; @@ -171,7 +160,7 @@ THUMB void MessageManager::func_020372f0(int index, int param_3, int param_4) { bmgFile.unk_1A = 0; func_020371b4(&bmgFile); - iVar1 = func_020371c8(&bmgFile, pFile, param_3); - this->aUnknownData[iVar1] = bmgFile; - this->aUnknownData[iVar1].unk_1A = iVar1; + groupId = func_020371c8(&bmgFile, pFile, unk_18); + this->aUnknownData[groupId] = bmgFile; + this->aUnknownData[groupId].unk_1A = groupId; }