Main counters file

This commit is contained in:
robojumper
2024-05-03 09:50:23 +02:00
parent cf42625664
commit 5f621162a2
4 changed files with 63 additions and 28 deletions
+3
View File
@@ -127,6 +127,9 @@ toBeSorted/skipflag_manager.cpp:
.sbss start:0x80575408 end:0x8057540C
.bss start:0x805A9C68 end:0x805A9C88
toBeSorted/counters/counter.cpp:
.text start:0x8016CC40 end:0x8016CD94
toBeSorted/counters/rupee_counter.cpp:
.text start:0x8016DE10 end:0x8016DF98
.ctors start:0x804DB7BC end:0x804DB7C0
+1
View File
@@ -285,6 +285,7 @@ config.libs = [
Object(NonMatching, "d/a/d_a_base.cpp"),
Object(NonMatching, "d/a/obj/d_a_obj_base.cpp"),
Object(Matching, "toBeSorted/save_file.cpp"),
Object(Matching, "toBeSorted/counters/counter.cpp"),
Object(Matching, "toBeSorted/counters/rupee_counter.cpp"),
Object(Matching, "toBeSorted/counters/arrow_counter.cpp"),
Object(Matching, "toBeSorted/counters/bomb_counter.cpp"),
+4 -28
View File
@@ -6,36 +6,12 @@
class Counter {
public:
Counter(u16 id): counterId(id) {}
// No vtable, this class appears to be header-only
virtual ~Counter() {};
/* 8016cc40 */ virtual s32 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);
}
virtual u16 getCommittedValue() {
return 0;
}
virtual s32 checkedAdd(s32 num);
virtual u16 getCommittedValue();
virtual u16 getMax() = 0;
virtual u16 getUncommittedValue() {
return 0;
}
virtual void setValue(u16 num) {
return;
}
virtual u16 getUncommittedValue();
virtual void setValue(u16 num);
u16 counterId;
};
+55
View File
@@ -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);
}