summaryrefslogtreecommitdiff
path: root/src/toBeSorted/counters/counter.cpp
diff options
context:
space:
mode:
authorElijah Thomas <42302100+elijah-thomas774@users.noreply.github.com>2024-05-05 11:24:35 -0400
committerGitHub <noreply@github.com>2024-05-05 11:24:35 -0400
commitfb4db5dcbb0493aeea41fcec30f193d47d40685c (patch)
tree40a939334475988741da22b8de39043613ac6ef4 /src/toBeSorted/counters/counter.cpp
parent430ad58726f2d13e03970af69e0b91e8a84af7c2 (diff)
parentdcb2c48b588405ab01807516bb2ee920f734a1f2 (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.cpp55
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);
+}