Merge pull request #52 from robojumper/d_t_timer

d_t_counter
This commit is contained in:
Elijah Thomas
2024-06-09 22:53:17 -04:00
committed by GitHub
7 changed files with 231 additions and 81 deletions
+100
View File
@@ -0,0 +1,100 @@
#include <d/tg/d_t_timer.h>
#include <toBeSorted/sceneflag_manager.h>
SPECIAL_ACTOR_PROFILE(TIMER_TAG, dTgTimer_c, fProfile::TAG_TIMER, 0x029F, 0, 0);
// TODO counter abstraction
bool increment(u16 *t) {
if (*t < 0xFFFF) {
(*t)++;
return true;
}
return false;
}
int dTgTimer_c::create() {
switch (getSubtypeFromParams()) {
case 0:
mGetTargetTimeFunc = dTgTimer_c::getConstant0x50_Thunk;
break;
case 1:
mTargetTime = getTimerFromParams() * 0x1e;
mGetTargetTimeFunc = getStoredTargetTime;
break;
default:
mTargetTime = getTimerFromParams();
mGetTargetTimeFunc = getStoredTargetTime;
break;
}
resetTimer();
return 1;
}
int dTgTimer_c::actorExecute() {
bool getFlag = SceneflagManager::sInstance->checkFlag(roomid, getCheckSceneflag());
if (getFlag) {
if (checkShouldTrigger()) {
SceneflagManager::sInstance->setFlag(roomid, getSetSceneflag());
} else {
incrementTimer();
}
} else {
resetTimer();
}
return 1;
}
int dTgTimer_c::getSubtypeFromParams() {
return params & 0xFF;
}
u16 dTgTimer_c::getTimerFromParams() {
return params >> 8 & 0xFF;
}
u16 dTgTimer_c::getCheckSceneflag() {
return params >> 0x10 & 0xFF;
}
u16 dTgTimer_c::getSetSceneflag() {
return params >> 0x18 & 0xFF;
}
u16 dTgTimer_c::getTimer() {
return mTimer;
}
u16 dTgTimer_c::getConstant0x50() {
return 0x50;
}
u16 dTgTimer_c::setTimer(u16 val) {
mTimer = val;
}
u16 dTgTimer_c::getTargetTime() {
return (this->*mGetTargetTimeFunc)();
}
void dTgTimer_c::resetTimer() {
setTimer(0);
}
void dTgTimer_c::incrementTimer() {
u16 t = getTimer();
increment(&t);
setTimer(t);
}
bool dTgTimer_c::checkShouldTrigger() {
return getTargetTime() <= getTimer();
}
u16 dTgTimer_c::getStoredTargetTime() {
return mTargetTime;
}
// TODO what causes this (likely weak) thunk?
u16 dTgTimer_c::getConstant0x50_Thunk() {
return getConstant0x50();
}
+2 -58
View File
@@ -1,64 +1,8 @@
#include "libc.h"
#include <common.h>
#include "toBeSorted/bitwise_flag_helper.h"
#include "toBeSorted/sceneflag_manager.h"
#include "toBeSorted/file_manager.h"
#include "toBeSorted/flag_space.h"
class SceneflagManager {
public:
FlagSpace mSceneflags;
FlagSpace mTempflags;
FlagSpace mZoneflags;
BitwiseFlagHelper mFlagHelper;
u16 mSceneIdx;
u8 mShouldCommit;
static u16 sTempFlags[4];
static u16 sSceneFlags[8];
static u16 sZoneFlags[0xFC];
static SceneflagManager *sInstance;
void doNothing();
void setShouldCommit(u16 flag);
SceneflagManager();
s32 isNotTempOrZoneFlag(u16 flag);
s32 isZoneFlag(u32 flag);
void updateFlagindex(u16 flagindex);
void copyFromSave(u32 flagindex);
void unsetAllTempflags();
void zoneflagsResetAll();
void zoneflagsResetForRoom(u16 roomId);
void unsetZoneAndTempflags();
void unsetAllZoneflags();
void unsetZoneflagsForRoom(u16 roomId);
u16 getZoneflagSlot(u16 roomId, u16 flag);
u16 getSceneflagSlotGlobal(u16 sceneIdx, u16 flag);
u16 getSceneflagSlot(u16 flag);
u16 getTempflagSlot(u16 flag);
bool checkZoneFlag(u16 roomId, u16 flag);
bool checkUncommittedZoneflag(u16 roomId, u16 flag);
u16 checkUncommittedZoneflag2(u16 roomId, u16 flag) {
return checkUncommittedZoneflag(roomId, flag);
}
bool checkUncommittedTempOrSceneflag(u16 flag);
u16 checkUncommittedTempOrSceneflag2(u16 flag) {
return checkUncommittedTempOrSceneflag(flag);
}
bool checkFlag(u16 roomId, u16 flag);
bool checkSceneflagGlobal(u16 sceneIdx, u16 flag);
bool checkTempOrSceneflag(u16 flag);
bool checkUncommittedFlag(u16 roomId, u16 flag);
void setZoneflag(u16 roomId, u16 flag);
void setFlag(u16 roomId, u16 flag);
void setSceneflagGlobal(u16 sceneIdx, u16 flag);
void setTempOrSceneflag(u16 flag);
void unsetZoneflag(u16 roomId, u16 flag);
void unsetFlag(u16 roomId, u16 flag);
void unsetSceneflagGlobal(u16 sceneIdx, u16 flag);
void unsetTempOrSceneflag(u16 flag);
s32 doCommit();
};
SceneflagManager *SceneflagManager::sInstance = nullptr;
u16 SceneflagManager::sTempFlags[] = {};
@@ -200,7 +144,7 @@ bool SceneflagManager::checkUncommittedTempOrSceneflag(u16 flag) {
// mFlagHelper.checkFlag(getSceneflagSlot2(flag), flag % 16, pData, mSceneflags.mCount);
}
}
bool SceneflagManager::checkFlag(u16 roomId, u16 flag) {
u16 SceneflagManager::checkFlag(u16 roomId, u16 flag) {
if (isZoneFlag(flag)) {
return checkZoneFlag(roomId, flag);
} else {