2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-09 03:47:43 +00:00

Finish CStateMachine

This commit is contained in:
Jack Andersen
2018-11-10 20:24:24 -10:00
parent 9512f6c98d
commit 94333e4726
5 changed files with 128 additions and 53 deletions

View File

@@ -12,24 +12,39 @@ class CAiState;
class CStateManager;
class CAiTrigger
{
u32 x0_ = 0;
u32 x4_ = 0;
u32 x8_ = 0;
float xc_ = 0.f;
u32 x10_ = 0;
u32 x14_ = 0;
bool x18_ = false;
CAiTriggerFunc x0_func;
float xc_arg = 0.f;
CAiTrigger* x10_andTrig = nullptr;
CAiState* x14_state = nullptr;
bool x18_lNot = false;
public:
CAiTrigger() = default;
bool GetAnd();
void GetState();
bool CallFunc(CStateManager&, CAi&)
CAiTrigger* GetAnd() const { return x10_andTrig; }
CAiState* GetState() const { return x14_state; }
bool CallFunc(CStateManager& mgr, CAi& ai)
{
return false;
if (x0_func)
{
bool ret = (ai.*x0_func)(mgr, xc_arg);
return x18_lNot ? !ret : ret;
}
return true;
}
void Setup(CAiTriggerFunc func, bool, float, CAiTrigger*);
void Setup(CAiTriggerFunc func, bool, float, CAiState*);
void Setup(CAiTriggerFunc func, bool lnot, float arg, CAiTrigger* andTrig)
{
x0_func = func;
x18_lNot = lnot;
xc_arg = arg;
x10_andTrig = andTrig;
}
void Setup(CAiTriggerFunc func, bool lnot, float arg, CAiState* state)
{
x0_func = func;
x18_lNot = lnot;
xc_arg = arg;
x14_state = state;
}
};
class CAiState
@@ -38,15 +53,18 @@ class CAiState
CAiStateFunc x0_func;
char xc_name[32];
u32 x2c_numTriggers;
u32 x30_;
CAiTrigger* x30_firstTrigger;
public:
CAiState(CAiStateFunc func, const char* name)
{}
{
x0_func = func;
strncpy(xc_name, name, 32);
}
s32 GetNumTriggers() const;
CAiTrigger& GetTrig(s32) const;
s32 GetNumTriggers() const { return x2c_numTriggers; }
CAiTrigger* GetTrig(s32 i) const { return &x30_firstTrigger[i]; }
const char* GetName() const { return xc_name; }
void SetTriggers(CAiTrigger* triggers);
void SetTriggers(CAiTrigger* triggers) { x30_firstTrigger = triggers; }
void SetNumTriggers(s32 numTriggers) { x2c_numTriggers = numTriggers; }
void CallFunc(CStateManager& mgr, CAi& ai, EStateMsg msg, float delta) const
{
@@ -88,12 +106,7 @@ public:
CAiState* GetActorState() const { return x4_state; }
void Update(CStateManager& mgr, CAi& ai, float delta)
{
x8_time += delta;
if (x4_state)
x4_state->CallFunc(mgr, ai, EStateMsg::One, delta);
}
void Update(CStateManager& mgr, CAi& ai, float delta);
void SetState(CStateManager&, CAi&, s32);
void SetState(CStateManager&, CAi&, const CStateMachine*, std::string_view);
const std::vector<CAiState>* GetStateVector() const;