From 0f71c498ece982e92b60f1c1094301afd19452c1 Mon Sep 17 00:00:00 2001 From: Max <34987259+mparisi20@users.noreply.github.com> Date: Sun, 23 Aug 2026 17:29:40 -0400 Subject: [PATCH] Match st_data_container_multi.cpp --- config/RSBE01_02/splits.txt | 10 +++++ config/RSBE01_02/symbols.txt | 28 ++++++------ configure.py | 2 + include/lib/BrawlHeaders | 2 +- src/sora/gf/gf_error_manager.cpp | 12 +++-- src/sora/st/st_data_container.cpp | 6 +-- src/sora/st/st_data_container_magic.cpp | 5 +++ src/sora/st/st_data_container_multi.cpp | 60 +++++++++++++++++++++++++ 8 files changed, 104 insertions(+), 21 deletions(-) create mode 100644 src/sora/st/st_data_container_magic.cpp create mode 100644 src/sora/st/st_data_container_multi.cpp diff --git a/config/RSBE01_02/splits.txt b/config/RSBE01_02/splits.txt index ae7658cab..9b8e63d74 100644 --- a/config/RSBE01_02/splits.txt +++ b/config/RSBE01_02/splits.txt @@ -303,6 +303,16 @@ sora/st/st_data_container.cpp: .data start:0x80462C08 end:0x80462C78 .sdata start:0x8059E848 end:0x8059E858 +sora/st/st_data_container_multi.cpp: + .text start:0x8015BBF4 end:0x8015BF9C + .ctors start:0x80406578 end:0x8040657C + .data start:0x80462C78 end:0x80462CC0 + .sdata start:0x8059E858 end:0x8059E860 + .sbss start:0x805A0470 end:0x805A0474 + +sora/st/st_data_container_magic.cpp: + .sdata start:0x8059E860 end:0x8059E864 + Runtime.PPCEABI.H/__init_cpp_exceptions.cpp: .text start:0x803F1A08 end:0x803F1A78 .ctors start:0x804064E0 end:0x804064E4 rename:.ctors$10 diff --git a/config/RSBE01_02/symbols.txt b/config/RSBE01_02/symbols.txt index 48785336e..bd0560d8c 100644 --- a/config/RSBE01_02/symbols.txt +++ b/config/RSBE01_02/symbols.txt @@ -6511,16 +6511,16 @@ getData__15stDataContainerFUl = .text:0x8015BB0C; // type:function size:0x6C getDataAddressHead__15stDataContainerFv = .text:0x8015BB78; // type:function size:0x10 __ct__21stDataSimpleContainerFP19stDataContainerData = .text:0x8015BB88; // type:function size:0x1C __dt__21stDataSimpleContainerFv = .text:0x8015BBA4; // type:function size:0x40 -getExtParam__15stDataContainerFv = .text:0x8015BBE4; // type:function size:0x8 scope:weak -getVersion__15stDataContainerFv = .text:0x8015BBEC; // type:function size:0x8 scope:weak -create__20stDataMultiContainerFPvQ25Heaps8HeapType = .text:0x8015BBF4; // type:function size:0x110 -fn_8015BD04 = .text:0x8015BD04; // type:function size:0xC8 -fn_8015BDCC = .text:0x8015BDCC; // type:function size:0x70 -fn_8015BE3C = .text:0x8015BE3C; // type:function size:0xB8 -fn_8015BEF4 = .text:0x8015BEF4; // type:function size:0x84 -fn_8015BF78 = .text:0x8015BF78; // type:function size:0xC -fn_8015BF84 = .text:0x8015BF84; // type:function size:0xC -fn_8015BF90 = .text:0x8015BF90; // type:function size:0xC +getExtParam__15stDataContainerCFv = .text:0x8015BBE4; // type:function size:0x8 scope:weak +getVersion__15stDataContainerCFv = .text:0x8015BBEC; // type:function size:0x8 scope:weak +create__20stDataMultiContainerFP19stDataContainerDataQ25Heaps8HeapType = .text:0x8015BBF4; // type:function size:0x110 +__dt__20stDataMultiContainerFv = .text:0x8015BD04; // type:function size:0xC8 +searchContainer__20stDataMultiContainerFUlUl = .text:0x8015BDCC; // type:function size:0x70 +getContainerData__20stDataMultiContainerFUlUlUl = .text:0x8015BE3C; // type:function size:0xB8 +getContainerDataNum__20stDataMultiContainerFUlUl = .text:0x8015BEF4; // type:function size:0x84 +getExtParam__20stDataMultiContainerCFv = .text:0x8015BF78; // type:function size:0xC +getVersion__20stDataMultiContainerCFv = .text:0x8015BF84; // type:function size:0xC +__sinit_\st_data_container_multi_cpp = .text:0x8015BF90; // type:function size:0xC scope:local fn_8015BF9C = .text:0x8015BF9C; // type:function size:0x18 fn_8015BFB4 = .text:0x8015BFB4; // type:function size:0x70 fn_8015C024 = .text:0x8015C024; // type:function size:0x120 @@ -26243,7 +26243,7 @@ __vt__21stDataSimpleContainer = .data:0x80462C08; // type:object size:0x1C @88 = .data:0x80462C3C; // type:object size:0xC scope:local __vt__15stDataContainer = .data:0x80462C48; // type:object size:0x1C @89 = .data:0x80462C68; // type:object size:0x10 scope:local data:string -lbl_80462C78 = .data:0x80462C78; // type:object size:0x1C +__vt__20stDataMultiContainer = .data:0x80462C78; // type:object size:0x1C lbl_80462C94 = .data:0x80462C94; // type:object size:0x15 data:string lbl_80462CAC = .data:0x80462CAC; // type:object size:0x14 HomeBtnIcon = .data:0x80462CC0; // type:object size:0x18C0 scope:global align:32 @@ -29641,8 +29641,8 @@ lbl_8059E834 = .sdata:0x8059E834; // type:object size:0x5 data:string lbl_8059E840 = .sdata:0x8059E840; // type:object size:0x8 __RTTI__21stDataSimpleContainer = .sdata:0x8059E848; // type:object size:0x8 scope:weak __RTTI__15stDataContainer = .sdata:0x8059E850; // type:object size:0x8 scope:weak -lbl_8059E858 = .sdata:0x8059E858; // type:object size:0x8 -lbl_8059E860 = .sdata:0x8059E860; // type:object size:0x8 data:4byte +__RTTI__20stDataMultiContainer = .sdata:0x8059E858; // type:object size:0x8 +g_BlocMagicInit = .sdata:0x8059E860; // type:object size:0x4 data:4byte lbl_8059E868 = .sdata:0x8059E868; // type:object size:0x8 data:2byte lbl_8059E870 = .sdata:0x8059E870; // type:object size:0x4 data:4byte lbl_8059E874 = .sdata:0x8059E874; // type:object size:0xC data:byte @@ -30856,7 +30856,7 @@ lbl_805A0454 = .sbss:0x805A0454; // type:object size:0x4 data:4byte lbl_805A0458 = .sbss:0x805A0458; // type:object size:0x8 data:byte lbl_805A0460 = .sbss:0x805A0460; // type:object size:0x8 data:4byte lbl_805A0468 = .sbss:0x805A0468; // type:object size:0x8 data:4byte -lbl_805A0470 = .sbss:0x805A0470; // type:object size:0x8 data:4byte +g_BlocMagic = .sbss:0x805A0470; // type:object size:0x4 data:4byte lbl_805A0478 = .sbss:0x805A0478; // type:object size:0x8 data:4byte lbl_805A0480 = .sbss:0x805A0480; // type:object size:0x8 data:4byte lbl_805A0488 = .sbss:0x805A0488; // type:object size:0x8 data:4byte diff --git a/configure.py b/configure.py index a2e5dba0a..6e071d989 100755 --- a/configure.py +++ b/configure.py @@ -354,6 +354,8 @@ def MatchingFor(*versions): Object(Matching, "sora/nt/nt_etc_dwc.cpp", extra_cflags=["-RTTI off"]), Object(Matching, "sora/ad/ad_static_data.cpp"), Object(Matching, "sora/st/st_data_container.cpp"), + Object(Matching, "sora/st/st_data_container_multi.cpp"), + Object(Matching, "sora/st/st_data_container_magic.cpp"), ], }, # Common REL units diff --git a/include/lib/BrawlHeaders b/include/lib/BrawlHeaders index a0118ed9c..e041191b9 160000 --- a/include/lib/BrawlHeaders +++ b/include/lib/BrawlHeaders @@ -1 +1 @@ -Subproject commit a0118ed9c02c21fe8acf1e1a85bb99271c761e35 +Subproject commit e041191b93f83a03ed19972fcc936ad502b266cc diff --git a/src/sora/gf/gf_error_manager.cpp b/src/sora/gf/gf_error_manager.cpp index 41e8a6a1b..e21ad9788 100644 --- a/src/sora/gf/gf_error_manager.cpp +++ b/src/sora/gf/gf_error_manager.cpp @@ -15,9 +15,15 @@ #include // TODO: These belong to different files + +// Big compressed object, possibly linked from an independent data-only unit // .data start:0x80423980 end:0x8042ADD0 extern CXStream g_LZEncodedAlertFont; + +// global defined in ms_resfont.cpp extern nw4r::ut::ResFont g_AlertFont; + +// probably defined in gf_file_io.cpp extern const char* g_ErrorMsgTable[12]; static gfErrorManager* g_gfErrorManager; @@ -113,9 +119,9 @@ void gfErrorManager::render() { } void gfErrorManager::notifyError(u32 errorCode, u32 reasonCode) { - bool res; - notifyErrorHelper(res, errorCode); - if (res) { + bool statusChanged; + suspendGame(statusChanged, errorCode); + if (statusChanged) { m_reasonCode = reasonCode; m_errorCode = errorCode; } diff --git a/src/sora/st/st_data_container.cpp b/src/sora/st/st_data_container.cpp index 0de679bcf..9b5a4ac61 100644 --- a/src/sora/st/st_data_container.cpp +++ b/src/sora/st/st_data_container.cpp @@ -6,11 +6,12 @@ stDataContainer::stDataContainer(stDataContainerData* data) stDataContainer::~stDataContainer() { } -void* stDataContainer::getData(u32 index) { +stDataContainerData* stDataContainer::getData(u32 index) { if (m_filedata->m_numFiles <= index) return nullptr; u32* startOffsets = static_cast(getDataAddressHead()); - return reinterpret_cast(m_filedata) + startOffsets[index]; + return reinterpret_cast( + reinterpret_cast(m_filedata) + startOffsets[index]); } void* stDataContainer::getDataAddressHead() { @@ -23,4 +24,3 @@ stDataSimpleContainer::stDataSimpleContainer(stDataContainerData* data) } stDataSimpleContainer::~stDataSimpleContainer() { } - diff --git a/src/sora/st/st_data_container_magic.cpp b/src/sora/st/st_data_container_magic.cpp new file mode 100644 index 000000000..6645edca2 --- /dev/null +++ b/src/sora/st/st_data_container_magic.cpp @@ -0,0 +1,5 @@ +#include +#include + +// Spells 'BLOC' +u32 g_BlocMagicInit = 0x424C4F43; diff --git a/src/sora/st/st_data_container_multi.cpp b/src/sora/st/st_data_container_multi.cpp new file mode 100644 index 000000000..f194d3d99 --- /dev/null +++ b/src/sora/st/st_data_container_multi.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include + +BlocMagicT g_BlocMagic = g_BlocMagicInit; + +stDataMultiContainer* stDataMultiContainer::create(stDataContainerData* filedata, HeapType destHeap) { + return new (destHeap) stDataMultiContainer(filedata, destHeap); +} + +stDataMultiContainer::~stDataMultiContainer() { + const u32 numFiles = m_filedata->m_numFiles; + for (u32 i = 0; i < numFiles; i++) + delete m_nodes[i]; + // TODO: determine the pattern causing this tautological check + if (&m_maxFiles && m_nodes) + gfHeapManager::free(m_nodes); +} + +stDataContainer* stDataMultiContainer::searchContainer(u32 targetMagic, u32 nodeIdx) { + if (g_BlocMagic.data != m_filedata->m_MAGIC) + return nullptr; + + stDataContainer* c; + u32 j = 0; + for (u32 i = 0; i < m_numFiles; i++) { + c = m_nodes[i]; + if (targetMagic == c->m_filedata->m_MAGIC) { + if (j == nodeIdx) + return c; + j++; + } + } + return nullptr; +} + +stDataContainerData* stDataMultiContainer::getContainerData(u32 targetMagic, u32 nodeDataIdx, u32 nodeIdx) { + if (g_BlocMagic.data == m_filedata->m_MAGIC) { + if (stDataContainer* c = searchContainer(targetMagic, nodeIdx)) + return c->getData(nodeDataIdx); + } else if (targetMagic == m_filedata->m_MAGIC && nodeIdx != 0) { + return getData(nodeDataIdx); + } + return nullptr; +} + +u32 stDataMultiContainer::getContainerDataNum(u32 targetMagic, u32 nodeIdx) { + if (stDataContainer* c = searchContainer(targetMagic, nodeIdx)) + return c->m_filedata->m_numFiles; + return 0; +} + +u32 stDataMultiContainer::getExtParam() const { + return m_filedata->m_extParam; +} + +u32 stDataMultiContainer::getVersion() const { + return m_filedata->m_version; +}