diff options
| author | Elijah Thomas <42302100+elijah-thomas774@users.noreply.github.com> | 2024-05-05 11:24:35 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-05 11:24:35 -0400 |
| commit | fb4db5dcbb0493aeea41fcec30f193d47d40685c (patch) | |
| tree | 40a939334475988741da22b8de39043613ac6ef4 /src/toBeSorted/counters/counter.cpp | |
| parent | 430ad58726f2d13e03970af69e0b91e8a84af7c2 (diff) | |
| parent | dcb2c48b588405ab01807516bb2ee920f734a1f2 (diff) | |
Merge pull request #16 from robojumper/single-counters
Match the single-counter files
Diffstat (limited to 'src/toBeSorted/counters/counter.cpp')
| -rw-r--r-- | src/toBeSorted/counters/counter.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/toBeSorted/counters/counter.cpp b/src/toBeSorted/counters/counter.cpp new file mode 100644 index 00000000..2c388e44 --- /dev/null +++ b/src/toBeSorted/counters/counter.cpp @@ -0,0 +1,55 @@ +#include <toBeSorted/counters/counter.h> + +// TODO use the item flag manager once it exists +class ItemFlagManager { +public: + ItemFlagManager() {} + /** 0x08 */ virtual ~ItemFlagManager(); + /** 0x0C */ virtual void setFlagszptr(); + /** 0x10 */ virtual void onDirty(); + /** 0x14 */ virtual void copyFlagsFromSave() = 0; + /** 0x18 */ virtual void setupUnkFlagsStuff() = 0; + /** 0x1C */ virtual bool doCommit() = 0; + /** 0x20 */ virtual void setFlag(u16 flag); + /** 0x24 */ virtual void unsetFlag(u16 flag); + /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value); + /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag); + /** 0x30 */ virtual u16 getUncommittedValue(u16 flag); + /** 0x34 */ virtual void unk3(); + /** 0x38 */ virtual u16 *getSaveFlagSpace() = 0; +}; + +// TODO set up item flag manager +extern "C" ItemFlagManager *lbl_80575400; + + +/* 8016cc40 */ s32 Counter::checkedAdd(s32 num) { + s32 uncommitted = getUncommittedValue(); + s32 max = getMax(); + s32 result = uncommitted + num; + if (result < 0) { + setValue(0); + } else if (result < max) { + setValue(result); + } else { + setValue(max); + } + + if (result < 0) { + return result; + } + + return result <= max ? 0 : (result - max); +} + +/* 8016cd30 */ u16 Counter::getCommittedValue() { + return lbl_80575400->getCounterOrFlag(counterId | 0x4000); +} + +/* 8016cd50 */ u16 Counter::getUncommittedValue() { + return lbl_80575400->getUncommittedValue(counterId | 0x4000); +} + +/* 8016cd70 */ void Counter::setValue(u16 num) { + lbl_80575400->setFlagOrCounterToValue(counterId | 0x4000, num); +} |
