CBodyState and CStateMachine work

This commit is contained in:
Phillip Stephens 2016-08-15 13:43:04 -07:00
parent eb7ce0b84b
commit a840cc7afb
18 changed files with 296 additions and 42 deletions

View File

@ -6,6 +6,7 @@
#include "zeus/CVector2f.hpp" #include "zeus/CVector2f.hpp"
#include "zeus/CQuaternion.hpp" #include "zeus/CQuaternion.hpp"
#include "CScannableObjectInfo.hpp" #include "CScannableObjectInfo.hpp"
#include "Graphics/CTexture.hpp"
namespace urde namespace urde
{ {
@ -48,6 +49,7 @@ public:
struct SBucketBackground struct SBucketBackground
{ {
}; };
public: public:
CScanDisplay() = default; CScanDisplay() = default;
void StartScan(TUniqueId, const CScannableObjectInfo&, CGuiTextPane*, CGuiWidget*, float); void StartScan(TUniqueId, const CScannableObjectInfo&, CGuiTextPane*, CGuiWidget*, float);

View File

View File

@ -0,0 +1,76 @@
#ifndef __URDE_CBODYCONTROLLER_HPP__
#define __URDE_CBODYCONTROLLER_HPP__
#include "RetroTypes.hpp"
#include "zeus/CQuaternion.hpp"
#include "CharacterCommon.hpp"
namespace urde
{
class CActor;
class CAnimPlaybackParms;
class CFinalInput;
class CPASAnimParmData;
class CRandom16;
class CStateManager;
class CBodyController
{
public:
CBodyController(CActor&, float, EBodyType);
void GetCurrentStateId() const;
void GetComandMgr();
void SetDoDeathAnims(bool);
bool IsElectrocuting() const;
bool IsOnFire() const;
bool IsFrozen() const;
void GetBodyStateInfo() const;
bool GetIsActive() const;
void BodyStateInfo();
float GetTurnSpeed() const;
pas::ELocomotionType GetLocomotionType() const;
void GetOwner();
bool IsAnimationOver() const;
void EnableAnimation(bool);
bool ShouldPlayDeathAnims() const;
void GetCurrentAnimId() const;
void Activate(CStateManager&);
void GetCurrentAdditiveState();
void SetState(pas::EAnimationState);
void Update(float, CStateManager&);
void Deactivate();
bool ShouldBeHurled() const;
bool HasBodyState(pas::EAnimationState);
pas::EFallState GetFallState() const;
void SetFallState(pas::EFallState);
void UpdateBody(float, CStateManager&);
void SetAdditiveState(pas::EAnimationState);
void SetTurnSpeed(float);
void SetCurrentAnimation(const CAnimPlaybackParms&, bool, bool);
void GetAnimTimeRemaining() const;
void SetPlaybackRate(float);
void MultiplyPlaybackRate(float);
void SetDeltaRotation(const zeus::CQuaternion&);
void FaceDirection(const zeus::CVector3f&, float);
void FaceDirection3D(const zeus::CVector3f&, float);
void HasBodyInfo(CActor&);
void ProcessInput(const CFinalInput&);
void GetPASDatabase() const;
void PlayBestAnimation(const CPASAnimParmData&, CRandom16&);
void LoopBestAnimation(const CPASAnimParmData&, CRandom16&);
void Freeze(float, float, float);
void UnFreeze();
void GetPercentageFrozen() const;
void SetOnFire(float);
void DouseFlames();
void SetElectrocuting(float);
void DouseElectrocuting();
void UpdateFrozenInfo(float, CStateManager&);
void GetCurrentAdditiveStateId() const;
EBodyType GetBodyType() const;
bool HasBeenFrozen() const;
void GetOwner() const;
};
}
#endif // __URDE_CBODYCONTROLLER_HPP__

View File

View File

@ -1,21 +1,10 @@
#ifndef CBODYSTATE_HPP #ifndef CBODYSTATE_HPP
#define CBODYSTATE_HPP #define CBODYSTATE_HPP
#include "RetroTypes.hpp" #include "RetroTypes.hpp"
#include "CharacterCommon.hpp"
namespace urde namespace urde
{ {
namespace pas
{
enum class ELocomotionType
{
};
enum class ELocomotionAnim
{
};
}
class CBodyController; class CBodyController;
class CStateManager; class CStateManager;
class CBodyState class CBodyState

View File

View File

@ -0,0 +1,75 @@
#ifndef __URDE_CBODYSTATECMDMGR_HPP__
#define __URDE_CBODYSTATECMDMGR_HPP__
#include "RetroTypes.hpp"
#include "CharacterCommon.hpp"
#include "zeus/CVector3f.hpp"
namespace urde
{
class CBodyStateCmd;
class CBCMeleeAttackCmd;
class CBCProjectileAttackCmd;
class CBCStepCmd;
class CBCJumpCmd;
class CBCGenerateCmd;
class CBCKnockBackCmd;
class CBCHurledCmd;
class CBCGetupCmd;
class CBCLoopReactionCmd;
class CBCKnockDownCmd;
class CBCSlideCmd;
class CBCScriptedCmd;
class CBCCoverCmd;
class CBCWallHangCmd;
class CBCAdditiveAimCmd;
class CBCLocomotionCmd;
class CBCAdditiveAimCmd;
class CBCAdditiveReactionCmd;
class CBCLoopAttackCmd;
class CBodyStateCmdMgr
{
public:
enum class ESteeringBlendMode
{
};
private:
public:
CBodyStateCmdMgr() = default;
void DeliverCmd(EBodyStateCmd);
void DeliverCmd(const CBodyStateCmd&);
void DeliverCmd(const CBCProjectileAttackCmd&);
void DeliverCmd(const CBCMeleeAttackCmd&);
void DeliverCmd(const CBCStepCmd&);
void DeliverCmd(const CBCGenerateCmd&);
void DeliverCmd(const CBCJumpCmd&);
void DeliverCmd(const CBCSlideCmd&);
void DeliverCmd(const CBCKnockBackCmd&);
void DeliverCmd(const CBCHurledCmd&);
void DeliverCmd(const CBCGetupCmd&);
void DeliverCmd(const CBCLoopReactionCmd&);
void DeliverCmd(const CBCKnockDownCmd&);
void DeliverCmd(const CBCScriptedCmd&);
void DeliverCmd(const CBCCoverCmd&);
void DeliverCmd(const CBCWallHangCmd&);
void DeliverCmd(const CBCAdditiveAimCmd&);
void DeliverCmd(const CBCLocomotionCmd&);
void DeliverCmd(const CBCAdditiveReactionCmd&);
void DeliverCmd(const CBCLoopAttackCmd&);
void DeliverTargetVector(const zeus::CVector3f&);
void DeliverAdditiveTargetVector(const zeus::CVector3f&);
void SetSteeringBlendSpeed(float);
void SetSteeringBlendMode(ESteeringBlendMode);
void SetSteeringSpeedRange(float, float);
void BlendSteeringCmds();
void Reset();
void ClearLocomtionCmds();
void GetCmd(EBodyStateCmd);
zeus::CVector3f GetTargetVector() const;
void GetFaceVector() const;
void GetMoveVector() const;
s32 GetNumSteerCmds() const;
zeus::CVector3f GetAdditiveTargetVector() const;
};
}
#endif // __URDE_CBODYSTATECMDMGR_HPP__

View File

@ -1,4 +1,5 @@
set(CHARACTER_SOURCES set(CHARACTER_SOURCES
CharacterCommon.hpp
CAssetFactory.hpp CAssetFactory.cpp CAssetFactory.hpp CAssetFactory.cpp
CCharacterFactory.hpp CCharacterFactory.cpp CCharacterFactory.hpp CCharacterFactory.cpp
CModelData.hpp CModelData.cpp CModelData.hpp CModelData.cpp
@ -78,6 +79,8 @@ set(CHARACTER_SOURCES
CAdditiveAnimPlayback.hpp CAdditiveAnimPlayback.cpp CAdditiveAnimPlayback.hpp CAdditiveAnimPlayback.cpp
CActorLights.hpp CActorLights.cpp CActorLights.hpp CActorLights.cpp
CAnimSysContext.hpp CAnimSysContext.hpp
CBodyState.hpp) CBodyState.hpp CBodyState.cpp
CBodyStateCmdMgr.hpp CBodyStateCmdMgr.cpp
CBodyController.hpp CBodyController.cpp)
runtime_add_list(Character CHARACTER_SOURCES) runtime_add_list(Character CHARACTER_SOURCES)

View File

@ -0,0 +1,37 @@
#ifndef __URDE_PASTYPES_HPP__
#define __URDE_PASTYPES_HPP__
namespace urde
{
namespace pas
{
enum class ELocomotionType
{
};
enum class ELocomotionAnim
{
};
enum class EAnimationState
{
};
enum class EFallState
{
};
}
enum class EBodyType
{
One,
Two = 2,
Three
};
enum class EBodyStateCmd
{
};
}
#endif // __URDE_PASTYPES_HPP__

View File

@ -578,7 +578,7 @@ CRealElement* CParticleDataFactory::GetRealElement(CInputStream& in)
{ {
CRealElement* a = GetRealElement(in); CRealElement* a = GetRealElement(in);
CRealElement* b = GetRealElement(in); CRealElement* b = GetRealElement(in);
return new CREISWT(a, b); return new CREInitialSwitch(a, b);
} }
case SBIG('CLTN'): case SBIG('CLTN'):
{ {

View File

@ -200,7 +200,7 @@ bool CRESineWave::GetValue(int frame, float& valOut) const
return false; return false;
} }
bool CREISWT::GetValue(int frame, float& valOut) const bool CREInitialSwitch::GetValue(int frame, float& valOut) const
{ {
if (frame == 0) if (frame == 0)
x4_a->GetValue(frame, valOut); x4_a->GetValue(frame, valOut);

View File

@ -155,12 +155,12 @@ public:
bool GetValue(int frame, float& valOut) const; bool GetValue(int frame, float& valOut) const;
}; };
class CREISWT : public CRealElement class CREInitialSwitch : public CRealElement
{ {
std::unique_ptr<CRealElement> x4_a; std::unique_ptr<CRealElement> x4_a;
std::unique_ptr<CRealElement> x8_b; std::unique_ptr<CRealElement> x8_b;
public: public:
CREISWT(CRealElement* a, CRealElement* b) CREInitialSwitch(CRealElement* a, CRealElement* b)
: x4_a(a), x8_b(b) {} : x4_a(a), x8_b(b) {}
bool GetValue(int frame, float& valOut) const; bool GetValue(int frame, float& valOut) const;
}; };

View File

@ -14,8 +14,10 @@ class CStateManager;
class CAi; class CAi;
typedef void (CAi::*CAiStateFunc)(CStateManager&, EStateMsg, float); typedef void (CAi::*CAiStateFunc)(CStateManager&, EStateMsg, float);
typedef bool (CAi::*CAiTriggerFunc)(CStateManager&, float); typedef bool (CAi::*CAiTriggerFunc)(CStateManager&, float);
class CAiFuncMap class CAiFuncMap
{ {
static const std::vector<std::string> gkStateNames;
std::unordered_map<std::string, CAiStateFunc> x0_stateFuncs; std::unordered_map<std::string, CAiStateFunc> x0_stateFuncs;
std::unordered_map<std::string, CAiTriggerFunc> x10_triggerFuncs; std::unordered_map<std::string, CAiTriggerFunc> x10_triggerFuncs;
public: public:

View File

@ -671,6 +671,7 @@ void CGameArea::AllocNewAreaData(int offset, int size)
bool CGameArea::Invalidate(CStateManager& mgr) bool CGameArea::Invalidate(CStateManager& mgr)
{ {
return false;
} }
void CGameArea::CullDeadAreaRequests() void CGameArea::CullDeadAreaRequests()

View File

@ -24,6 +24,7 @@ set(WORLD_SOURCES
CActor.hpp CActor.cpp CActor.hpp CActor.cpp
CAi.hpp CAi.cpp CAi.hpp CAi.cpp
CAiFuncMap.hpp CAiFuncMap.cpp CAiFuncMap.hpp CAiFuncMap.cpp
CStateMachine.hpp CStateMachine.cpp
CPatterned.hpp CPatterned.cpp CPatterned.hpp CPatterned.cpp
CPathFindArea.hpp CPathFindArea.cpp CPathFindArea.hpp CPathFindArea.cpp
CPathFindRegion.hpp CPathFindRegion.cpp CPathFindRegion.hpp CPathFindRegion.cpp

View File

@ -2,18 +2,12 @@
#define __URDE_CPATTERNED_HPP__ #define __URDE_CPATTERNED_HPP__
#include "CAi.hpp" #include "CAi.hpp"
#include "Character/CBodyController.hpp"
namespace urde namespace urde
{ {
class CPatternedInfo; class CPatternedInfo;
enum class EBodyType
{
One,
Two = 2,
Three
};
class CPatterned : public CAi class CPatterned : public CAi
{ {
public: public:

View File

@ -5,6 +5,42 @@ namespace urde
{ {
CStateMachine::CStateMachine(CInputStream& in) CStateMachine::CStateMachine(CInputStream& in)
{ {
#if 0
u32 stateCount = in.readUint32Big();
x0_states.reserve(stateCount);
for (u32 i = 0 ; i<stateCount ; ++i)
{
std::string name = in.readString(31);
CAiStateFunc func = CAi::GetStateFunc(name.c_str());
x0_states.emplace_back(func, name);
}
x10_triggers.reserve(in.readUint32Big());
for (u32 i = 0 ; i<stateCount ; ++i)
{
x0_states[i].SetNumTriggers(in.readUint32Big());
if (x0_states[i].GetNumTriggers() == 0)
continue;
for (u32 j = 0 ; j<x0_states[i].GetNumTriggers() ; ++j)
x10_triggers.emplace_back();
for (u32 j = 0 ; j<x0_states[i].GetNumTriggers() ; ++j)
{
u32 triggerCount = in.readUint32Big();
u32 r19 = triggerCount - 1;
for (u32 k = 0 ; k<triggerCount ; ++k)
{
std::string name = in.readString(31);
CAiTriggerFunc func = CAi::GetTrigerFunc(name.c_str());
float f31 = in.readFloatBig();
}
}
}
#endif
} }
s32 CStateMachine::GetStateIndex(const std::string& state) s32 CStateMachine::GetStateIndex(const std::string& state)
@ -22,4 +58,32 @@ const std::vector<CAiState>& CStateMachine::GetStateVector() const
{ {
return x0_states; return x0_states;
} }
float CStateMachineState::GetTime() const
{
return 0.f;
}
const std::vector<CAiState>* CStateMachineState::GetStateVector() const
{
if (!x0_machine)
return nullptr;
return &x0_machine->GetStateVector();
}
void CStateMachineState::Setup(const CStateMachine *machine)
{
x0_machine = machine;
x4_state = nullptr;
x8_ = 0.f;
xc_ = 0.f;
x10_= 0.f;
}
std::string CStateMachineState::GetName() const
{
return {};
}
} }

View File

@ -10,10 +10,13 @@ class CAiState;
class CStateManager; class CStateManager;
class CAiTrigger class CAiTrigger
{ {
u32 x0_ = 0;
u32 x4_ = 0;
u32 x8_ = 0;
float xc_ = 0.f; float xc_ = 0.f;
u32 x10_; u32 x10_ = 0;
bool x18_; u32 x14_ = 0;
bool x18_ = false;
public: public:
CAiTrigger() = default; CAiTrigger() = default;
bool GetAnd(); bool GetAnd();
@ -40,17 +43,17 @@ class CAiState
u32 x20_; u32 x20_;
u32 x24_; u32 x24_;
u32 x28_; u32 x28_;
u32 x2c_; u32 x2c_numTriggers;
u32 x30_; u32 x30_;
public: public:
CAiState(CAiStateFunc func, const char* name) CAiState(CAiStateFunc func, const char* name)
{} {}
u32 GetNumTriggers() const; s32 GetNumTriggers() const;
CAiTrigger& GetTrig(s32) const; CAiTrigger& GetTrig(s32) const;
const char* GetName() const; const char* GetName() const;
void SetTriggers(CAiTrigger* triggers); void SetTriggers(CAiTrigger* triggers);
void SetNumTriggers(s32 numTriggers); void SetNumTriggers(s32 numTriggers) { x2c_numTriggers = numTriggers; }
void CallFunc(CStateManager& mgr, CAi& ai, EStateMsg msg, float delta) const void CallFunc(CStateManager& mgr, CAi& ai, EStateMsg msg, float delta) const
{ {
if (x0_func) if (x0_func)
@ -71,24 +74,24 @@ public:
class CStateMachineState class CStateMachineState
{ {
const CStateMachine* x0_ = nullptr; const CStateMachine* x0_machine = nullptr;
CAiState* x4_state = nullptr; CAiState* x4_state = nullptr;
float x8_ = 0; float x8_ = 0;
float xc_ = 0; float xc_ = 0;
float x10_ = 0; float x10_ = 0;
union
{
struct
{
bool x18_24_ : 1;
};
u32 dummy = 0;
};
public: public:
CStateMachineState()=default; CStateMachineState()=default;
void Setup(const CStateMachine* machine)
{
x0_ = machine;
x4_state = nullptr;
x8_ = 0.f;
xc_ = 0.f;
x10_= 0.f;
}
void SetDelay(float); void GetActorState() const;
float GetDelay() const; float GetTime() const;
void Update(CStateManager& mgr, CAi& ai, float delta) void Update(CStateManager& mgr, CAi& ai, float delta)
{ {
@ -96,7 +99,14 @@ public:
if (x4_state) if (x4_state)
x4_state->CallFunc(mgr, ai, EStateMsg::One, delta); x4_state->CallFunc(mgr, ai, EStateMsg::One, delta);
} }
void SetState(CStateManager&, CAi&, s32);
void SetState(CStateManager &, CAi &, const std::string&);
const std::vector<CAiState>* GetStateVector() const;
void Setup(const CStateMachine* machine);
std::string GetName() const;
void SetDelay(float);
void GetRandom() const;
float GetDelay() const;
}; };
} }