mirror of
https://github.com/zeldaret/ss
synced 2026-08-19 05:51:59 -04:00
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user