prime/src/MetroidPrime/ScriptObjects/CScriptTimer.cpp
Luke Street 3df1cc45b6 Use private fields + getters for CEntity
Former-commit-id: 3e2ea84c7e2f80392b4884cbd93a76e270200e25
2022-10-22 11:57:01 -04:00

99 lines
2.1 KiB
C++

#include "MetroidPrime/ScriptObjects/CScriptTimer.hpp"
#include "MetroidPrime/CStateManager.hpp"
CScriptTimer::CScriptTimer(TUniqueId uid, const rstl::string& name, const CEntityInfo& info,
float startTime, float maxRandDelay, bool loop, bool autoStart,
bool active)
: CEntity(uid, info, active, name)
, x34_time(startTime)
, x38_startTime(startTime)
, x3c_maxRandDelay(maxRandDelay)
, x40_loop(loop)
, x41_autoStart(autoStart)
, x42_isTiming(autoStart) {}
CScriptTimer::~CScriptTimer() {}
void CScriptTimer::Reset(CStateManager& mgr) {
const float rDt = mgr.Random()->Float();
x34_time = (x3c_maxRandDelay * rDt) + x38_startTime;
}
void CScriptTimer::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId,
CStateManager& stateMgr) {
switch (msg) {
case kSM_Start:
if (GetActive()) {
StartTiming(true);
}
break;
case kSM_Stop:
if (GetActive()) {
StartTiming(false);
}
break;
case kSM_Reset:
if (GetActive()) {
Reset(stateMgr);
if (x41_autoStart) {
StartTiming(true);
}
}
break;
case kSM_StopAndReset:
if (GetActive()) {
Reset(stateMgr);
StartTiming(false);
}
break;
case kSM_ResetAndStart:
if (GetActive()) {
Reset(stateMgr);
StartTiming(true);
}
break;
}
CEntity::AcceptScriptMsg(msg, objId, stateMgr);
}
void CScriptTimer::ApplyTime(float dt, CStateManager& mgr) {
if (x34_time > 0.f && GetActive()) {
x34_time -= dt;
if (x34_time <= 0.f) {
SendScriptMsgs(kSS_Zero, mgr, kSM_None);
x42_isTiming = false;
if (!x40_loop) {
return;
}
Reset(mgr);
if (!x41_autoStart) {
return;
}
x42_isTiming = true;
}
}
}
void CScriptTimer::Think(float dt, CStateManager& mgr) {
if (GetActive()) {
bool should = false;
if (IsTiming() && GetActive()) {
should = true;
}
if (should) {
ApplyTime(dt, mgr);
}
}
}
void CScriptTimer::Accept(IVisitor& visitor) { visitor.Visit(*this); }