From 4353833983e4d82e607746c6f9ccfc289c5eaf4a Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 28 Apr 2024 11:29:13 +0200 Subject: [PATCH] inline shenanigans --- config/SOUE01/splits.txt | 2 +- src/toBeSorted/dungeonflag_manager.cpp | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 66a7b4af..79f8f510 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -123,7 +123,7 @@ toBeSorted/bitwise_flag_helper.cpp: .text start:0x800BF200 end:0x800BF264 toBeSorted/dungeonflag_manager.cpp: - .text start:0x800BF8D0 end:0x800BFBA0 + .text start:0x800BF8D0 end:0x800BFB9C .sbss start:0x80575404 end:0x80575408 .bss start:0x805A9C58 end:0x805A9C68 diff --git a/src/toBeSorted/dungeonflag_manager.cpp b/src/toBeSorted/dungeonflag_manager.cpp index 4c463a31..cf4410f5 100644 --- a/src/toBeSorted/dungeonflag_manager.cpp +++ b/src/toBeSorted/dungeonflag_manager.cpp @@ -7,10 +7,16 @@ // TODO move extern "C" UnkFlagDefinition lbl_80511AF0[]; +// TODO what's preventing this from actually matching +// is that we pretend this TU contains the instance, +// which breaks .sbss section alignment. +// It's much more likely that a separate TU contains +// all instance pointers + class DungeonflagManager { public: bool mShouldCommit; - u16 mFlagIndex; + u16 mStageIndex; UnkFlagStuff *mFlagStuff; FlagSpace mFlagSpace; @@ -26,6 +32,12 @@ public: void setFlag(u16 flag); u32 getDungeonFlag(u16 flag); bool doCommit(); + + /** inline shenanigans to get copyFromSave to match */ + static inline u16 *saveFilePtr(u16 flagIndex) { + u32 offset = (flagIndex & 0x1fff) * 8; + return FileManager::sInstance->getDungeonFlagsConst() + offset; + } }; /** 80575404 */ @@ -35,8 +47,7 @@ u16 DungeonflagManager::sDungeonFlags[8] = {}; /** 800bf8d0 */ void DungeonflagManager::copyFromSave(u16 flagIndex) { - u16 *ptr = FileManager::sInstance->getDungeonFlagsConst(); - mFlagSpace.copyFromSaveFile(ptr + (flagIndex & 0x1fff) * 8, 0, 0x8); + mFlagSpace.copyFromSaveFile(saveFilePtr(flagIndex), 0, 0x8); } /** 800bf930 */ @@ -46,7 +57,7 @@ void DungeonflagManager::setCommitFlag(u16 flag) { /** 0x800bf940 */ DungeonflagManager::DungeonflagManager() - : mShouldCommit(false), mFlagIndex(-1), mFlagStuff(nullptr), + : mShouldCommit(false), mStageIndex(-1), mFlagStuff(nullptr), mFlagSpace(sDungeonFlags, ARRAY_LENGTH(sDungeonFlags)) {} /** 800bf980 */ @@ -57,7 +68,7 @@ void DungeonflagManager::setupFlagStuff() { /** 800bf9e0 */ void DungeonflagManager::copyFromSave(s16 flag) { - mFlagIndex = flag; + mStageIndex = flag; copyFromSave((u16)flag); } @@ -84,7 +95,7 @@ u32 DungeonflagManager::getDungeonFlag(u16 flag) { /** 800fbb10 */ bool DungeonflagManager::doCommit() { FileManager *instance; - u16 idx = mFlagIndex; + u16 idx = mStageIndex; if (idx == 0xFFFF) { return false; } else if (mShouldCommit) {