Flag managers WIP, broken after rebase

This commit is contained in:
robojumper
2024-10-25 10:35:34 +02:00
parent 5995604387
commit e689fbaa42
19 changed files with 529 additions and 164 deletions
-1
View File
@@ -7,7 +7,6 @@ extern "C" {
// void *memset(void *dest, s32 value, u32 count);
// void *memcpy(void *dest, const void *src, u32 count);
void *checkedMemcpy(void *dest, u16 destLen, const void *src, u16 count);
}
#endif
+7 -2
View File
@@ -1,3 +1,6 @@
#ifndef FILE_MANAGER_H
#define FILE_MANAGER_H
#include "common.h"
#include "egg/core/eggHeap.h"
#include "m/m_angle.h"
@@ -76,7 +79,7 @@ public:
/* 8000A330 */ u16 *getStoryFlagsMut();
/* 8000A360 */ const u16 *getStoryFlagsConst() const;
/* 8000A3B0 */ u16 *getItemFlagsMut();
/* 8000A3E0 */ u16 *getItemFlagsConst();
/* 8000A3E0 */ const u16 *getItemFlagsConst();
/* 8000A430 */ u16 *getDungeonFlagsMut();
/* 8000A460 */ u16 *getDungeonFlagsConst();
/* 8000A4B0 */ u16 *getSceneFlagsMut();
@@ -210,7 +213,7 @@ public:
/* 8000CAD0 */ bool isNew_FileA();
/* 8000CB00 */ void setSceneFlagIndex(u16 idx);
/* 8000CB30 */ u16 getSceneFlagIndex();
/* 8000CB30 */ u32 getSceneFlagIndex();
/* 8000CB80 */ s32 getFileAreaIndex();
/* 8000CBD0 */ void fn_8000CBD0(u8);
@@ -285,3 +288,5 @@ public:
}
static FileManager *sInstance;
};
#endif
+5 -5
View File
@@ -16,13 +16,13 @@ public:
mCount = count;
}
FlagSpace(u16 *pFlags, u16 count) : BaseFlagSpace(pFlags, count) {}
u16 *getFlagPtrChecked();
u16 *getFlagPtrUnchecked();
u16 *getFlagPtrChecked() const;
u16 *getFlagPtrUnchecked() const;
void unsetAll();
void setAllToZero(u16 offset, u16 flagCount);
void copyFromSaveFile2(u16 *pSaved, u16 offset, u16 flagCount);
void copyFromSaveFile(u16 *pSaved, u16 offset, u16 flagCount);
virtual void filemanagerCheck();
void copyFromSaveFile2(const u16 *pSaved, u16 offset, u16 flagCount);
void copyFromSaveFile(const u16 *pSaved, u16 offset, u16 flagCount);
virtual void filemanagerCheck() const;
};
#endif
+93 -3
View File
@@ -3,6 +3,7 @@
#include "toBeSorted/flag_space.h"
#include "toBeSorted/unk_flag_stuff.h"
#include "toBeSorted/file_manager.h"
// TODO These classes have an interesting relation and there are like 5 vtables, so
// the stuff in this header should not be relied upon for actually implementing these,
@@ -23,24 +24,113 @@ public:
/** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value);
/** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const;
/** 0x30 */ virtual u16 getUncommittedValue(u16 flag);
/** 0x34 */ virtual void unk3();
/** 0x38 */ virtual u16 *getSaveFlagSpace() = 0;
/** 0x34 */ virtual void unk3(u16 arg);
/** 0x38 */ virtual const u16 *getSaveFlagSpace() const = 0;
u16 getFlag(u16 flag) const;
void init();
void setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe);
void copyFlagsFromSave_Priv();
void setupUnkFlagStuff(UnkFlagDefinition *def, u16 count);
void doCommit_Priv();
void thunk_setOrClearFlag(u16 flag, u16 value);
void setOrClearFlag(u16 flag, u16 value);
u16 getFlag(u16 flag) const;
u16 FUN_800bf600(u16 flag);
void FUN_800bf610(u16 flag);
u16 FUN_800bf640(u16 flag);
void FUN_800bf690();
u16 getUncommittedValue_Priv(u16 flag);
protected:
/** 0x04 */ u16 flagSizeMaybe;
/** 0x06 */ u16 anotherSizeMaybe;
/** 0x08 */ FlagSpace *storyFlagsPtr;
/** 0x0C */ UnkFlagStuff *unkFlagsPtr;
/** 0x10 */ bool dirty;
};
class StoryflagManager : public ItemStoryManagerBase {
public:
StoryflagManager();
virtual ~StoryflagManager() {}
FlagSpace storyFlags;
void init();
bool commit();
/** 0x0C */ virtual void setFlagszptr() override {
}
/** 0x10 */ virtual void onDirty() override;
/** 0x14 */ virtual void copyFlagsFromSave() override;
/** 0x18 */ virtual void setupUnkFlagsStuff() override;
/** 0x1C */ virtual bool doCommit() override {}
/** 0x20 */ virtual void setFlag(u16 flag) override;
/** 0x24 */ virtual void unsetFlag(u16 flag) override;
/** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) override;
/** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const override;
/** 0x30 */ virtual u16 getUncommittedValue(u16 flag) override;
/** 0x34 */ virtual void unk3(u16 arg) override;
/** 0x38 */ virtual const u16 *getSaveFlagSpace() const override {
return FileManager::sInstance->getStoryFlagsConst();
};
public:
static StoryflagManager *sInstance;
static u16 sFlags[0x80];
};
class ItemflagManager : public ItemStoryManagerBase {
public:
FlagSpace itemFlags;
ItemflagManager();
virtual ~ItemflagManager() {}
void init();
bool commit();
/** 0x0C */ virtual void setFlagszptr() override {
}
/** 0x10 */ virtual void onDirty() override;
/** 0x14 */ virtual void copyFlagsFromSave();
/** 0x18 */ virtual void setupUnkFlagsStuff();
/** 0x1C */ virtual bool doCommit() {
u16 sz = flagSizeMaybe;
u16 *flags = storyFlagsPtr->getFlagPtrUnchecked();
FileManager::sInstance->setItemFlags(flags, 0, sz);
}
/** 0x20 */ virtual void setFlag(u16 flag);
/** 0x24 */ virtual void unsetFlag(u16 flag) {
ItemStoryManagerBase::unsetFlag(flag & ~0x4000);
}
/** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) {
ItemStoryManagerBase::thunk_setOrClearFlag(flag & ~0x4000, value);
}
/** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const {
return getFlag(flag & ~0x4000);
}
/** 0x30 */ virtual u16 getUncommittedValue(u16 flag) {
return getUncommittedValue_Priv(flag & ~0x4000);
}
/** 0x34 */ virtual void unk3(u16 arg) {
FUN_800bf600(arg & ~0x4000);
}
/** 0x38 */ virtual const u16 *getSaveFlagSpace() const {
return FileManager::sInstance->getItemFlagsConst();
};
public:
static ItemflagManager *sInstance;
static u16 sFlags[0x40];
};
#endif
+9 -1
View File
@@ -4,12 +4,14 @@
#include "common.h"
#include "toBeSorted/bitwise_flag_helper.h"
#include "toBeSorted/flag_space.h"
#include "toBeSorted/file_manager.h"
class CommittableFlagManager {
public:
bool mNeedsCommit;
virtual void doCommit() = 0;
virtual ~CommittableFlagManager() {}
bool commitIfNecessary();
void setNeedsCommit(bool commit) {
mNeedsCommit = commit;
@@ -37,7 +39,7 @@ public:
TBoxFlagManager();
virtual ~TBoxFlagManager() {}
void init();
void copyFromSave(s16 sceneIndex);
void copyFromSave(u32 sceneIndex);
bool checkFlag(u16 sceneIndex, u16 flag);
virtual u16 getFlagCount() const;
void setFlag(u16 flag);
@@ -47,6 +49,7 @@ public:
}
};
// NOTE: Not actually Enemy Defeat.
// This is a little more than that, it keeps track of live objects based on their id as a whole
class EnemyDefeatManager : public CommittableFlagManager {
@@ -74,6 +77,11 @@ public:
virtual ~EnemyDefeatManager() {}
virtual u16 getFlagCount() const;
void setFlag(u16 flag);
virtual void doCommit() override {
FileManager *mgr = FileManager::sInstance;
mgr->setItemFlags(mFlagSpace.getFlagPtrUnchecked(), 0, 0x1000);
};
};
#endif
+2 -2
View File
@@ -17,8 +17,8 @@ public:
void doNothing(u32 unused);
UnkFlagStuff(u16 count, UnkFlagDefinition *definitions);
void prepareIndexShiftMask(u16 counterIdx, u32 flagCount, u16 *pIndex, u8 *pShift, u16 *pMask);
u16 maskForIdx(u16 index);
u32 getCounterOrFlag(u16 counterIdx, u16 *pData, u32 flagCount);
u16 maskForIdx(u16 index, u16 flagSizeMaybe);
u16 getCounterOrFlag(u16 counterIdx, const u16 *pData, u32 flagCount);
void setCounterOrFlag(u16 counterIdx, u16 *pData, u32 flagCount, u32 value);
u32 checkFlagValid(u16 counterIdx, u32 flagCount);
};