summaryrefslogtreecommitdiff
path: root/src/toBeSorted/counters/counters.cpp
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-04-01 00:50:34 +0200
committerrobojumper <robojumper@gmail.com>2025-04-01 00:50:34 +0200
commitf92ba9710d0a0023d26fc758ddace22e34f1046c (patch)
treeef4e23d859acaa493ef048c9cce2b83e4c3bed6d /src/toBeSorted/counters/counters.cpp
parentdaadae488119c7a8cd28548e5d502abdafbf68e0 (diff)
Counters except sinit won't match
Diffstat (limited to 'src/toBeSorted/counters/counters.cpp')
-rw-r--r--src/toBeSorted/counters/counters.cpp169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/toBeSorted/counters/counters.cpp b/src/toBeSorted/counters/counters.cpp
new file mode 100644
index 00000000..4de56844
--- /dev/null
+++ b/src/toBeSorted/counters/counters.cpp
@@ -0,0 +1,169 @@
+#include "d/flag/dungeonflag_manager.h"
+#include "toBeSorted/counters/counter.h"
+
+class SmallKeyCounter : public Counter {
+public:
+ SmallKeyCounter() : Counter(0xF) {}
+ virtual u16 getMax() const override {
+ return 15;
+ }
+ virtual u16 getCommittedValue() const override;
+ virtual u16 getUncommittedValue() const override;
+ virtual void setValue(u16 num) override;
+};
+
+u16 SmallKeyCounter::getCommittedValue() const {
+ u16 counter = counterId;
+ return DungeonflagManager::sInstance->getCounterOrFlag(counter, 8);
+}
+
+u16 SmallKeyCounter::getUncommittedValue() const {
+ return DungeonflagManager::sInstance->getDungeonFlag(counterId);
+}
+
+void SmallKeyCounter::setValue(u16 num) {
+ return DungeonflagManager::sInstance->setToValue(counterId, num);
+}
+
+static SmallKeyCounter sSmallKeyCounter;
+
+#define MAKE_COMMON_COUNTER(name, id, max) \
+ class name##Counter : public Counter { \
+ public: \
+ name##Counter() : Counter(id) {} \
+ virtual u16 getMax() const override { \
+ return max; \
+ } \
+ }; \
+ static name##Counter s##name##Counter;
+
+MAKE_COMMON_COUNTER(PouchExpansion, 0x1EA, 7);
+
+class HeartPieceCounter : public Counter {
+public:
+ HeartPieceCounter() : Counter(0x1E9) {}
+ virtual s32 checkedAdd(s32 num) override;
+ virtual u16 getMax() const override {
+ return 3;
+ }
+};
+
+static HeartPieceCounter sHeartPieceCounter;
+
+s32 HeartPieceCounter::checkedAdd(s32 num) {
+ if (num > 0) {
+ s32 uncommitted = getUncommittedValue();
+ s32 newCount = uncommitted + num;
+ setValue(newCount % 4);
+ }
+
+ return 0;
+}
+
+MAKE_COMMON_COUNTER(HeartContainer, 0x1Fd, 24);
+
+MAKE_COMMON_COUNTER(FaronGrasshopper, 0x1B9, 99);
+MAKE_COMMON_COUNTER(WoodlandRhinoBeetle, 0x1BA, 99);
+MAKE_COMMON_COUNTER(DekuHornet, 0x1BB, 99);
+MAKE_COMMON_COUNTER(SkyloftMantis, 0x1BC, 99);
+MAKE_COMMON_COUNTER(VolcanicLadybug, 0x1BD, 99);
+MAKE_COMMON_COUNTER(BlessedButterfly, 0x1BE, 99);
+MAKE_COMMON_COUNTER(LanayruAnt, 0x1BF, 99);
+MAKE_COMMON_COUNTER(SandCicada, 0x1C0, 99);
+MAKE_COMMON_COUNTER(GerudoDragonfly, 0x1C1, 99);
+MAKE_COMMON_COUNTER(EldinRoller, 0x1C2, 99);
+MAKE_COMMON_COUNTER(SkyStagBeetle, 0x1C3, 99);
+MAKE_COMMON_COUNTER(StarryFirefly, 0x1C4, 99);
+
+MAKE_COMMON_COUNTER(HornetLarvae, 0x1A5, 99);
+MAKE_COMMON_COUNTER(BirdFeather, 0x1A6, 99);
+MAKE_COMMON_COUNTER(Tumbleweed, 0x1A7, 99); // TIM!!
+MAKE_COMMON_COUNTER(LizardTail, 0x1A8, 99);
+MAKE_COMMON_COUNTER(EldinOre, 0x1A9, 99);
+MAKE_COMMON_COUNTER(AncientFlower, 0x1AA, 99);
+MAKE_COMMON_COUNTER(AmberRelic, 0x1AB, 99);
+MAKE_COMMON_COUNTER(DuskRelic, 0x1AC, 99);
+MAKE_COMMON_COUNTER(JellyBlob, 0x1AD, 99);
+MAKE_COMMON_COUNTER(MonsterClaw, 0x1AE, 99);
+MAKE_COMMON_COUNTER(MonsterHorn, 0x1AF, 99);
+MAKE_COMMON_COUNTER(OrnamentalSkull, 0x1B0, 99);
+MAKE_COMMON_COUNTER(EvilCrystal, 0x1B1, 99);
+MAKE_COMMON_COUNTER(BlueBirdFeather, 0x1B2, 99);
+MAKE_COMMON_COUNTER(GoldenSkull, 0x1B3, 99);
+MAKE_COMMON_COUNTER(GoddessPlume, 0x1B4, 99);
+MAKE_COMMON_COUNTER(GratitudeCrystal, 0x1B5, 127);
+
+// I don't want to move all of these to headers yet
+extern TumbleweedCounter ARROW_COUNTER;
+extern TumbleweedCounter BOMB_COUNTER;
+extern TumbleweedCounter EXTRA_WALLET_COUNTER;
+extern TumbleweedCounter KEY_PIECE_COUNTER;
+extern TumbleweedCounter RUPEE_COUNTER;
+extern TumbleweedCounter SLINGSHOT_SEED_COUNTER;
+extern TumbleweedCounter TEAR_COUNTER;
+
+class Counters {
+public:
+ Counters() {
+ // mCounters\[([0-9]+)\] = &([A-Za-z_]+);
+ mCounters[0] = &RUPEE_COUNTER;
+ mCounters[1] = &ARROW_COUNTER;
+ mCounters[2] = &BOMB_COUNTER;
+ mCounters[3] = &TEAR_COUNTER;
+ mCounters[4] = &SLINGSHOT_SEED_COUNTER;
+ mCounters[5] = &KEY_PIECE_COUNTER;
+
+ mCounters[6] = &sSmallKeyCounter;
+ mCounters[7] = &sPouchExpansionCounter;
+ mCounters[8] = &sHeartPieceCounter;
+ mCounters[9] = &sHeartContainerCounter;
+
+ mCounters[10] = &sFaronGrasshopperCounter;
+ mCounters[11] = &sWoodlandRhinoBeetleCounter;
+ mCounters[12] = &sDekuHornetCounter;
+ mCounters[13] = &sSkyloftMantisCounter;
+ mCounters[14] = &sVolcanicLadybugCounter;
+ mCounters[15] = &sBlessedButterflyCounter;
+ mCounters[16] = &sLanayruAntCounter;
+ mCounters[17] = &sSandCicadaCounter;
+ mCounters[18] = &sGerudoDragonflyCounter;
+ mCounters[19] = &sEldinRollerCounter;
+ mCounters[20] = &sSkyStagBeetleCounter;
+ mCounters[21] = &sStarryFireflyCounter;
+
+ mCounters[22] = &sHornetLarvaeCounter;
+ mCounters[23] = &sBirdFeatherCounter;
+ mCounters[24] = &sTumbleweedCounter;
+ mCounters[25] = &sLizardTailCounter;
+ mCounters[26] = &sEldinOreCounter;
+ mCounters[27] = &sAncientFlowerCounter;
+ mCounters[28] = &sAmberRelicCounter;
+ mCounters[29] = &sDuskRelicCounter;
+ mCounters[30] = &sJellyBlobCounter;
+ mCounters[31] = &sMonsterClawCounter;
+ mCounters[32] = &sMonsterHornCounter;
+ mCounters[33] = &sOrnamentalSkullCounter;
+ mCounters[34] = &sEvilCrystalCounter;
+ mCounters[35] = &sBlueBirdFeatherCounter;
+ mCounters[36] = &sGoldenSkullCounter;
+ mCounters[37] = &sGoddessPlumeCounter;
+ mCounters[38] = &sGratitudeCrystalCounter;
+ mCounters[39] = &EXTRA_WALLET_COUNTER;
+ }
+
+ Counter *mCounters[40];
+};
+
+Counters sCounters;
+
+s32 increaseCounter(u16 counterIdx, s32 value) {
+ return sCounters.mCounters[counterIdx]->checkedAdd(value);
+}
+
+s32 getCounterByIndex(u16 counterIdx) {
+ return sCounters.mCounters[counterIdx]->getCommittedValue();
+}
+
+s32 getMaxItemCount(u16 counterIdx) {
+ return sCounters.mCounters[counterIdx]->getMax();
+}