Files
prime/include/MetroidPrime/Enemies/CMagdolite.hpp
2026-03-19 20:55:56 -06:00

125 lines
5.0 KiB
C++

#ifndef _CMAGDOLITE
#define _CMAGDOLITE
#include "types.h"
#include "MetroidPrime/CBoneTracking.hpp"
#include "MetroidPrime/CDamageVulnerability.hpp"
#include "MetroidPrime/Enemies/CPatterned.hpp"
#include "MetroidPrime/Weapons/CFlameInfo.hpp"
#include "Kyoto/TToken.hpp"
#include "rstl/reserved_vector.hpp"
#include "rstl/single_ptr.hpp"
class CCollisionActorManager;
class CObjectReference;
class CSkinnedModel;
class CWeaponDescription;
class CMagdolite : public CPatterned {
public:
CMagdolite(TUniqueId uid, const rstl::string& name, const CEntityInfo& info,
const CTransform4f& xf, const CModelData& mData, const CPatternedInfo& pInfo,
const CActorParameters& actParms, float headTrackAngle, float losAngle,
const CDamageInfo& flameThrowerDamage, const CDamageInfo& headContactDamage,
const CDamageVulnerability& headVuln, const CDamageVulnerability& bodyVuln,
CAssetId headlessModel, CAssetId headlessSkin, float minHp, float initialDelay,
float minDelay, float maxDelay, const CFlameInfo& flameInfo, float f7, float f8,
float f9);
// CEntity
~CMagdolite() override;
void Accept(IVisitor& visitor) override;
void Think(float dt, CStateManager& mgr) override;
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override;
// CActor
void Render(const CStateManager& mgr) const override;
const CDamageVulnerability* GetDamageVulnerability() const override;
const CDamageVulnerability* GetDamageVulnerability(const CVector3f&, const CVector3f&,
const CDamageInfo&) const override;
void Touch(CActor& actor, CStateManager& mgr) override;
void FluidFXThink(EFluidState state, CScriptWater& water, CStateManager& mgr) override;
void DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, EUserEventType type,
float dt) override;
// CAi
void Death(CStateManager& mgr, const CVector3f& direction, EScriptObjectState state) override;
void KnockBack(const CVector3f&, CStateManager&, const CDamageInfo& info, EKnockBackType type,
bool inDeferred, float magnitude) override;
// CPatterned (state functions)
void SelectTarget(CStateManager& mgr, EStateMsg msg, float arg) override;
void Generate(CStateManager& mgr, EStateMsg msg, float arg) override;
void Deactivate(CStateManager& mgr, EStateMsg msg, float arg) override;
void Attack(CStateManager& mgr, EStateMsg msg, float arg) override;
void Active(CStateManager& mgr, EStateMsg msg, float arg) override;
void InActive(CStateManager& mgr, EStateMsg msg, float arg) override;
void GetUp(CStateManager& mgr, EStateMsg msg, float arg) override;
void Taunt(CStateManager& mgr, EStateMsg msg, float arg) override;
void Lurk(CStateManager& mgr, EStateMsg msg, float arg) override;
void ProjectileAttack(CStateManager& mgr, EStateMsg msg, float arg) override;
void Flinch(CStateManager& mgr, EStateMsg msg, float arg) override;
void Retreat(CStateManager& mgr, EStateMsg msg, float arg) override;
// CPatterned (trigger functions)
bool InAttackPosition(CStateManager& mgr, float arg) override;
bool Leash(CStateManager& mgr, float arg) override;
bool HasAttackPattern(CStateManager& mgr, float arg) override;
bool LineOfSight(CStateManager& mgr, float arg) override;
bool ShouldRetreat(CStateManager& mgr, float arg) override;
private:
void ApplyContactDamage(TUniqueId uid, CStateManager& mgr);
void SetupCollisionActors(CStateManager& mgr);
void CreateFlameThrower(CStateManager& mgr);
void LaunchFlameThrower(CStateManager& mgr, bool fire);
void UpdateOrientation(CStateManager& mgr);
TUniqueId FindSuitableTarget(CStateManager& mgr, EScriptObjectState state,
EScriptObjectMessage msg);
float x568_initialDelay;
float x56c_minDelay;
float x570_maxDelay;
float x574_minHp;
float x578_losMaxDistance;
float x57c_headTrackAngle;
rstl::single_ptr< CCollisionActorManager > x580_collisionManager;
CBoneTracking x584_boneTracker;
CDamageVulnerability x5bc_instaKillVulnerability;
CDamageVulnerability x624_normalVulnerability;
CObjectReference* x68c_;
TLockedToken< CSkinnedModel > x690_headlessModel;
rstl::reserved_vector< TUniqueId, 4 > x69c_headCollisionActors;
CFlameInfo x6a8_flameInfo;
TUniqueId x6c8_flameThrowerId;
TToken< CWeaponDescription > x6cc_flameThrowerDesc;
CDamageInfo x6d4_flameThrowerDamage;
CDamageInfo x6f0_headContactDamage;
float x70c_curHealth;
CVector3f x710_attackOffset;
CVector3f x71c_attackTarget;
CVector3f x728_cachedTarget;
float x734_;
float x738_;
float x73c_;
float x740_;
float x744_;
float x748_;
float x74c_;
uint x750_aiStage;
bool x754_24_retreat : 1;
bool x754_25_up : 1;
bool x754_26_lostMyHead : 1;
bool x754_27_flameThrowerActive : 1;
bool x754_28_alert : 1;
bool x754_29_useDetectionRange : 1;
bool x754_30_inProjectileAttack : 1;
float x758_;
};
CHECK_SIZEOF(CMagdolite, 0x760)
#endif // _CMAGDOLITE