mirror of https://github.com/AxioDL/metaforce.git
69 lines
2.6 KiB
C++
69 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include "CPatterned.hpp"
|
|
#include "Collision/CCollisionSurface.hpp"
|
|
#include "Collision/CCollidableSphere.hpp"
|
|
|
|
namespace urde
|
|
{
|
|
class CWallWalker : public CPatterned
|
|
{
|
|
public:
|
|
enum class EWalkerType
|
|
{
|
|
Parasite = 0,
|
|
Oculus = 1,
|
|
Geemer = 2,
|
|
IceZoomer = 3,
|
|
Seedling = 4
|
|
};
|
|
protected:
|
|
CCollisionSurface x568_alignNormal = CCollisionSurface(zeus::CVector3f(),
|
|
zeus::CVector3f::skForward,
|
|
zeus::CVector3f::skRight, -1);
|
|
CCollidableSphere x590_colSphere;
|
|
float x5b0_collisionCloseMargin;
|
|
float x5b4_alignAngVel;
|
|
float x5b8_tumbleAngle = 0.f;
|
|
float x5bc_patrolPauseRemTime = 0.f;
|
|
float x5c0_advanceWpRadius;
|
|
float x5c4_playerObstructionMinDist;
|
|
float x5c8_bendingHackWeight = 0.f;
|
|
s32 x5cc_bendingHackAnim;
|
|
EWalkerType x5d0_walkerType;
|
|
s16 x5d4_thinkCounter = 0;
|
|
bool x5d6_24_alignToFloor : 1;
|
|
bool x5d6_25_hasAlignSurface : 1;
|
|
bool x5d6_26_playerObstructed : 1;
|
|
bool x5d6_27_disableMove : 1;
|
|
bool x5d6_28_addBendingWeight : 1;
|
|
bool x5d6_29_applyBendingHack : 1;
|
|
static zeus::CVector3f ProjectVectorToPlane(const zeus::CVector3f& pt, const zeus::CVector3f& plane)
|
|
{
|
|
return pt - plane * pt.dot(plane);
|
|
}
|
|
static zeus::CVector3f ProjectPointToPlane(const zeus::CVector3f& p0, const zeus::CVector3f& p1,
|
|
const zeus::CVector3f& plane)
|
|
{
|
|
return p0 - (p0 - p1).dot(plane) * plane;
|
|
}
|
|
void OrientToSurfaceNormal(const zeus::CVector3f& normal, float clampAngle);
|
|
static bool PointOnSurface(const CCollisionSurface& surf, const zeus::CVector3f& point);
|
|
void AlignToFloor(CStateManager&, float, const zeus::CVector3f&, float);
|
|
void GotoNextWaypoint(CStateManager& mgr);
|
|
public:
|
|
CWallWalker(ECharacter chr, TUniqueId uid, std::string_view name, EFlavorType flavType,
|
|
const CEntityInfo& eInfo, const zeus::CTransform& xf,
|
|
CModelData&& mData, const CPatternedInfo& pInfo, EMovementType mType,
|
|
EColliderType colType, EBodyType bType, const CActorParameters& aParms,
|
|
float collisionCloseMargin, float alignAngVel, EKnockBackVariant kbVariant,
|
|
float advanceWpRadius, EWalkerType wType, float playerObstructionMinDist, bool disableMove);
|
|
|
|
void PreThink(float, CStateManager&);
|
|
void Think(float, CStateManager&);
|
|
void Render(const CStateManager&) const;
|
|
const CCollisionPrimitive* GetCollisionPrimitive() const { return &x590_colSphere; }
|
|
void UpdateWPDestination(CStateManager&);
|
|
};
|
|
}
|