Files
ss/src/toBeSorted/dungeonflag_manager.cpp
T
2024-05-03 09:58:42 +02:00

105 lines
2.7 KiB
C++

#include "toBeSorted/bitwise_flag_helper.h"
#include "toBeSorted/file_manager.h"
#include "toBeSorted/flag_space.h"
#include "toBeSorted/unk_flag_stuff.h"
#include <libc.h>
// TODO move
extern "C" UnkFlagDefinition lbl_80511AF0[];
class DungeonflagManager {
public:
bool mShouldCommit;
u16 mStageIndex;
UnkFlagStuff *mFlagStuff;
FlagSpace mFlagSpace;
static u16 sDungeonFlags[8];
// static DungeonflagManager *sInstance;
void copyFromSave(s16 flag);
void copyFromSave(u16 flagIndex);
void setCommitFlag(u16 flag);
DungeonflagManager();
void setupFlagStuff();
void setToValue(u16 flag, u32 value);
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 */
// DungeonflagManager *DungeonflagManager::sInstance = nullptr;
/** 805a9c58 */
u16 DungeonflagManager::sDungeonFlags[8] = {};
/** 800bf8d0 */
void DungeonflagManager::copyFromSave(u16 flagIndex) {
mFlagSpace.copyFromSaveFile(saveFilePtr(flagIndex), 0, 0x8);
}
/** 800bf930 */
void DungeonflagManager::setCommitFlag(u16 flag) {
mShouldCommit = true;
}
/** 0x800bf940 */
DungeonflagManager::DungeonflagManager()
: mShouldCommit(false), mStageIndex(-1), mFlagStuff(nullptr),
mFlagSpace(sDungeonFlags, ARRAY_LENGTH(sDungeonFlags)) {}
/** 800bf980 */
void DungeonflagManager::setupFlagStuff() {
mFlagStuff = new UnkFlagStuff(0x11, lbl_80511AF0);
mShouldCommit = false;
}
/** 800bf9e0 */
void DungeonflagManager::copyFromSave(s16 flag) {
mStageIndex = flag;
copyFromSave((u16)flag);
}
/** 800bf9f0 */
void DungeonflagManager::setToValue(u16 flag, u32 value) {
u16 *data = mFlagSpace.getFlagPtrChecked();
mFlagStuff->setCounterOrFlag(flag, data, 8, value);
setCommitFlag(flag);
}
/** 800bfa60 */
void DungeonflagManager::setFlag(u16 flag) {
u16 *data = mFlagSpace.getFlagPtrChecked();
mFlagStuff->setCounterOrFlag(flag, data, 8, 1);
setCommitFlag(flag);
}
/** 800fbac0 */
u32 DungeonflagManager::getDungeonFlag(u16 flag) {
u16 *data = mFlagSpace.getFlagPtrUnchecked();
return mFlagStuff->getCounterOrFlag(flag, data, 8);
}
/** 800fbb10 */
bool DungeonflagManager::doCommit() {
FileManager *instance;
u16 idx = mStageIndex;
if (idx == 0xFFFF) {
return false;
} else if (mShouldCommit) {
instance = FileManager::sInstance;
u16 *ptr = mFlagSpace.getFlagPtrUnchecked();
instance->setDungeonFlags(ptr, (idx & 0x1fff) * 8, 0x08);
mShouldCommit = false;
return true;
}
return false;
}