mirror of https://github.com/AxioDL/metaforce.git
More CChozoGhost imps
This commit is contained in:
parent
9d77d7313c
commit
50a20d7322
|
@ -26,11 +26,11 @@ CChozoGhost::CBehaveChance::CBehaveChance(CInputStream& in)
|
||||||
x10_move *= f2;
|
x10_move *= f2;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 CChozoGhost::CBehaveChance::GetBehave(EBehaveType type, CStateManager& mgr) const {
|
EBehaveType CChozoGhost::CBehaveChance::GetBehave(EBehaveType type, CStateManager& mgr) const {
|
||||||
float dVar5 = x4_lurk;
|
float dVar5 = x4_lurk;
|
||||||
float dVar4 = x8_;
|
float dVar4 = x8_;
|
||||||
float dVar3 = xc_attack;
|
float dVar3 = xc_attack;
|
||||||
if (type == EBehaveType::Zero) {
|
if (type == EBehaveType::Lurk) {
|
||||||
float dVar2 = dVar5 / 3.f;
|
float dVar2 = dVar5 / 3.f;
|
||||||
dVar5 = 0.f;
|
dVar5 = 0.f;
|
||||||
dVar4 += dVar2;
|
dVar4 += dVar2;
|
||||||
|
@ -40,12 +40,12 @@ u32 CChozoGhost::CBehaveChance::GetBehave(EBehaveType type, CStateManager& mgr)
|
||||||
dVar4 = 0.f;
|
dVar4 = 0.f;
|
||||||
dVar5 += dVar2;
|
dVar5 += dVar2;
|
||||||
dVar3 += dVar2;
|
dVar3 += dVar2;
|
||||||
} else if (type == EBehaveType::Two) {
|
} else if (type == EBehaveType::Attack) {
|
||||||
float dVar2 = dVar3 / 3.f;
|
float dVar2 = dVar3 / 3.f;
|
||||||
dVar3 = 0.f;
|
dVar3 = 0.f;
|
||||||
dVar5 += dVar2;
|
dVar5 += dVar2;
|
||||||
dVar4 += dVar2;
|
dVar4 += dVar2;
|
||||||
} else if (type == EBehaveType::Three) {
|
} else if (type == EBehaveType::Move) {
|
||||||
float dVar2 = x10_move / 3.f;
|
float dVar2 = x10_move / 3.f;
|
||||||
dVar5 += dVar2;
|
dVar5 += dVar2;
|
||||||
dVar4 += dVar2;
|
dVar4 += dVar2;
|
||||||
|
@ -54,12 +54,12 @@ u32 CChozoGhost::CBehaveChance::GetBehave(EBehaveType type, CStateManager& mgr)
|
||||||
|
|
||||||
float rnd = mgr.GetActiveRandom()->Float();
|
float rnd = mgr.GetActiveRandom()->Float();
|
||||||
if (dVar5 > rnd)
|
if (dVar5 > rnd)
|
||||||
return 0;
|
return EBehaveType::Lurk;
|
||||||
else if (dVar4 > (rnd - dVar5))
|
else if (dVar4 > (rnd - dVar5))
|
||||||
return 1;
|
return EBehaveType::One;
|
||||||
else if (dVar3 > (rnd - dVar5) - dVar4)
|
else if (dVar3 > (rnd - dVar5) - dVar4)
|
||||||
return 2;
|
return EBehaveType::Attack;
|
||||||
return 3;
|
return EBehaveType::Move;
|
||||||
}
|
}
|
||||||
|
|
||||||
CChozoGhost::CChozoGhost(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf,
|
CChozoGhost::CChozoGhost(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf,
|
||||||
|
@ -107,7 +107,7 @@ CChozoGhost::CChozoGhost(TUniqueId uid, std::string_view name, const CEntityInfo
|
||||||
, x665_27_playerInLeashRange(false)
|
, x665_27_playerInLeashRange(false)
|
||||||
, x665_28_inRange(false)
|
, x665_28_inRange(false)
|
||||||
, x665_29_aggressive(false)
|
, x665_29_aggressive(false)
|
||||||
, x680_stateProg(x664_24_onGround ? 2 : 4)
|
, x680_behaveType(x664_24_onGround ? EBehaveType::Attack : EBehaveType::Four)
|
||||||
, x68c_boneTracking(*GetModelData()->GetAnimationData(), "Head_1"sv, zeus::degToRad(80.f), zeus::degToRad(180.f),
|
, x68c_boneTracking(*GetModelData()->GetAnimationData(), "Head_1"sv, zeus::degToRad(80.f), zeus::degToRad(180.f),
|
||||||
EBoneTrackingFlags::None) {
|
EBoneTrackingFlags::None) {
|
||||||
x578_.Token().Lock();
|
x578_.Token().Lock();
|
||||||
|
@ -273,9 +273,61 @@ void CChozoGhost::Deactivate(CStateManager& mgr, EStateMsg msg, float arg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChozoGhost::Attack(CStateManager& mgr, EStateMsg msg, float arg) { CAi::Attack(mgr, msg, arg); }
|
void CChozoGhost::Attack(CStateManager& mgr, EStateMsg msg, float arg) {
|
||||||
|
if (msg == EStateMsg::Activate) {
|
||||||
|
CTeamAiMgr::AddAttacker(CTeamAiMgr::EAttackType::Melee, mgr, x6c4_teamMgr, GetUniqueId());
|
||||||
|
x32c_animState = EAnimState::Ready;
|
||||||
|
if (x6d8_ == 1)
|
||||||
|
x67c_ = 3;
|
||||||
|
else if (x6d8_ == 2)
|
||||||
|
x67c_ = 4;
|
||||||
|
else if (x6d8_ == 3)
|
||||||
|
x67c_ = 5;
|
||||||
|
|
||||||
void CChozoGhost::Shuffle(CStateManager& mgr, EStateMsg msg, float arg) { CAi::Shuffle(mgr, msg, arg); }
|
if (x665_26_ && mgr.RayStaticIntersection(GetTranslation() + (zeus::skUp * 0.5f), zeus::skUp, x670_,
|
||||||
|
CMaterialFilter::MakeInclude({EMaterialTypes::Solid}))
|
||||||
|
.IsValid()) {
|
||||||
|
x67c_ = 2;
|
||||||
|
x460_knockBackController.SetAvailableState(EKnockBackAnimationState::KnockBack, false);
|
||||||
|
}
|
||||||
|
x150_momentum.zeroOut();
|
||||||
|
xfc_constantForce.zeroOut();
|
||||||
|
} else if (msg == EStateMsg::Update) {
|
||||||
|
TryCommand(mgr, pas::EAnimationState::MeleeAttack, &CPatterned::TryMeleeAttack, x67c_);
|
||||||
|
GetBodyController()->GetCommandMgr().SetTargetVector(mgr.GetPlayer().GetTranslation() - GetTranslation());
|
||||||
|
if (x67c_ != 2)
|
||||||
|
FloatToLevel(x678_, arg);
|
||||||
|
} else if (msg == EStateMsg::Deactivate) {
|
||||||
|
x32c_animState = EAnimState::NotReady;
|
||||||
|
x665_26_ = false;
|
||||||
|
x460_knockBackController.SetAvailableState(EKnockBackAnimationState::KnockBack, true);
|
||||||
|
CTeamAiMgr::ResetTeamAiRole(CTeamAiMgr::EAttackType::Ranged, mgr, x6c4_teamMgr, GetUniqueId(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CChozoGhost::Shuffle(CStateManager& mgr, EStateMsg msg, float arg) {
|
||||||
|
if (msg != EStateMsg::Activate)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const CBehaveChance& chance1 = ChooseBehaveChanceRange(mgr);
|
||||||
|
CTeamAiRole* role = CTeamAiMgr::GetTeamAiRole(mgr, x6c4_teamMgr, GetUniqueId());
|
||||||
|
if (role && role->GetTeamAiRole() == CTeamAiRole::ETeamAiRole::Ranged &&
|
||||||
|
!CTeamAiMgr::CanAcceptAttacker(CTeamAiMgr::EAttackType::Ranged, mgr, x6c4_teamMgr, GetUniqueId())) {
|
||||||
|
x680_behaveType = EBehaveType::Attack;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CBehaveChance& chance2 = ChooseBehaveChanceRange(mgr);
|
||||||
|
x680_behaveType = chance2.GetBehave(x680_behaveType, mgr);
|
||||||
|
if (x680_behaveType == EBehaveType::Lurk)
|
||||||
|
x684_lurkDelay = chance1.GetLurkTime();
|
||||||
|
else if (x680_behaveType == EBehaveType::Attack) {
|
||||||
|
x665_25_ = mgr.GetActiveRandom()->Float() < chance1.GetChargeAttack();
|
||||||
|
const int rnd = mgr.GetActiveRandom()->Next();
|
||||||
|
x6d8_ = (rnd - (rnd / chance1.GetNumBolts()) * chance1.GetNumBolts()) + 1;
|
||||||
|
}
|
||||||
|
x664_31_ = false;
|
||||||
|
x665_27_playerInLeashRange = false;
|
||||||
|
}
|
||||||
|
|
||||||
void CChozoGhost::InActive(CStateManager& mgr, EStateMsg msg, float arg) {
|
void CChozoGhost::InActive(CStateManager& mgr, EStateMsg msg, float arg) {
|
||||||
if (msg == EStateMsg::Activate) {
|
if (msg == EStateMsg::Activate) {
|
||||||
|
@ -346,19 +398,21 @@ void CChozoGhost::Lurk(CStateManager& mgr, EStateMsg msg, float arg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CChozoGhost::Leash(CStateManager& mgr, float arg) { return x665_27_playerInLeashRange || CPatterned::Leash(mgr, arg); }
|
bool CChozoGhost::Leash(CStateManager& mgr, float arg) {
|
||||||
|
return x665_27_playerInLeashRange || CPatterned::Leash(mgr, arg);
|
||||||
|
}
|
||||||
|
|
||||||
bool CChozoGhost::InRange(CStateManager& mgr, float arg) { return x665_28_inRange; }
|
bool CChozoGhost::InRange(CStateManager& mgr, float arg) { return x665_28_inRange; }
|
||||||
|
|
||||||
bool CChozoGhost::InPosition(CStateManager& mgr, float arg) { return x680_stateProg == 2; }
|
bool CChozoGhost::InPosition(CStateManager& mgr, float arg) { return x680_behaveType == EBehaveType::Attack; }
|
||||||
|
|
||||||
bool CChozoGhost::AggressionCheck(CStateManager& mgr, float arg) { return x665_29_aggressive; }
|
bool CChozoGhost::AggressionCheck(CStateManager& mgr, float arg) { return x665_29_aggressive; }
|
||||||
|
|
||||||
bool CChozoGhost::ShouldTaunt(CStateManager& mgr, float arg) { return x680_stateProg == 1; }
|
bool CChozoGhost::ShouldTaunt(CStateManager& mgr, float arg) { return x680_behaveType == EBehaveType::One; }
|
||||||
|
|
||||||
bool CChozoGhost::ShouldFlinch(CStateManager& mgr, float arg) { return x664_25_flinch; }
|
bool CChozoGhost::ShouldFlinch(CStateManager& mgr, float arg) { return x664_25_flinch; }
|
||||||
|
|
||||||
bool CChozoGhost::ShouldMove(CStateManager& mgr, float arg) { return x680_stateProg == 3; }
|
bool CChozoGhost::ShouldMove(CStateManager& mgr, float arg) { return x680_behaveType == EBehaveType::Move; }
|
||||||
|
|
||||||
bool CChozoGhost::AIStage(CStateManager& mgr, float arg) { return arg == x63c_; }
|
bool CChozoGhost::AIStage(CStateManager& mgr, float arg) { return arg == x63c_; }
|
||||||
|
|
||||||
|
|
|
@ -10,12 +10,7 @@
|
||||||
#include <zeus/CVector3f.hpp>
|
#include <zeus/CVector3f.hpp>
|
||||||
|
|
||||||
namespace urde::MP1 {
|
namespace urde::MP1 {
|
||||||
enum class EBehaveType {
|
enum class EBehaveType { Lurk, One, Attack, Move, Four };
|
||||||
Zero,
|
|
||||||
One,
|
|
||||||
Two,
|
|
||||||
Three
|
|
||||||
};
|
|
||||||
|
|
||||||
class CChozoGhost : public CPatterned {
|
class CChozoGhost : public CPatterned {
|
||||||
public:
|
public:
|
||||||
|
@ -32,7 +27,14 @@ public:
|
||||||
public:
|
public:
|
||||||
CBehaveChance(CInputStream&);
|
CBehaveChance(CInputStream&);
|
||||||
|
|
||||||
u32 GetBehave(EBehaveType type, CStateManager& mgr) const;
|
EBehaveType GetBehave(EBehaveType type, CStateManager& mgr) const;
|
||||||
|
float GetLurk() const { return x4_lurk; }
|
||||||
|
float GetX8() const { return x8_; }
|
||||||
|
float GetAttack() const { return xc_attack; }
|
||||||
|
float GetMove() const { return x10_move; }
|
||||||
|
float GetLurkTime() const { return x14_lurkTime; }
|
||||||
|
float GetChargeAttack() const { return x18_chargeAttack; }
|
||||||
|
u32 GetNumBolts() const { return x1c_numBolts; }
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -79,7 +81,7 @@ private:
|
||||||
float x6c8_ = 0.f;
|
float x6c8_ = 0.f;
|
||||||
float x678_ = 0.f;
|
float x678_ = 0.f;
|
||||||
u32 x67c_ = -1;
|
u32 x67c_ = -1;
|
||||||
u32 x680_stateProg = 0;
|
EBehaveType x680_behaveType = EBehaveType::Lurk;
|
||||||
float x684_lurkDelay = 1.f;
|
float x684_lurkDelay = 1.f;
|
||||||
CSteeringBehaviors x688_;
|
CSteeringBehaviors x688_;
|
||||||
CBoneTracking x68c_boneTracking;
|
CBoneTracking x68c_boneTracking;
|
||||||
|
@ -94,6 +96,7 @@ private:
|
||||||
const CBehaveChance& ChooseBehaveChanceRange(CStateManager& mgr);
|
const CBehaveChance& ChooseBehaveChanceRange(CStateManager& mgr);
|
||||||
bool IsVisibleEnough(const CStateManager& mgr) const { return GetModelAlphau8(mgr) > 31; }
|
bool IsVisibleEnough(const CStateManager& mgr) const { return GetModelAlphau8(mgr) > 31; }
|
||||||
void FindNearestSolid(CStateManager& mgr, const zeus::CVector3f& dir);
|
void FindNearestSolid(CStateManager& mgr, const zeus::CVector3f& dir);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DEFINE_PATTERNED(ChozoGhost)
|
DEFINE_PATTERNED(ChozoGhost)
|
||||||
|
|
||||||
|
@ -109,7 +112,8 @@ public:
|
||||||
void Render(const CStateManager& mgr) const override;
|
void Render(const CStateManager& mgr) const override;
|
||||||
void Touch(CActor& act, CStateManager& mgr) override;
|
void Touch(CActor& act, CStateManager& mgr) override;
|
||||||
EWeaponCollisionResponseTypes GetCollisionResponseType(const zeus::CVector3f& pos, const zeus::CVector3f& dir,
|
EWeaponCollisionResponseTypes GetCollisionResponseType(const zeus::CVector3f& pos, const zeus::CVector3f& dir,
|
||||||
const CWeaponMode& mode, EProjectileAttrib attrib) const override;
|
const CWeaponMode& mode,
|
||||||
|
EProjectileAttrib attrib) const override;
|
||||||
void DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, EUserEventType type, float dt) override;
|
void DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, EUserEventType type, float dt) override;
|
||||||
void KnockBack(const zeus::CVector3f& dir, CStateManager& mgr, const CDamageInfo& info, EKnockBackType type,
|
void KnockBack(const zeus::CVector3f& dir, CStateManager& mgr, const CDamageInfo& info, EKnockBackType type,
|
||||||
bool inDeferred, float magnitude) override;
|
bool inDeferred, float magnitude) override;
|
||||||
|
|
Loading…
Reference in New Issue