mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-18 03:25:24 +00:00
Initial CEnergyBall, update submodules, various fixes
This commit is contained in:
@@ -1,4 +1,9 @@
|
||||
#include "CSimplePool.hpp"
|
||||
#include "CStateManager.hpp"
|
||||
#include "GameGlobalObjects.hpp"
|
||||
#include "MP1/World/CEnergyBall.hpp"
|
||||
#include "World/CPatternedInfo.hpp"
|
||||
#include "World/CPlayer.hpp"
|
||||
|
||||
namespace urde::MP1 {
|
||||
CEnergyBall::CEnergyBall(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf,
|
||||
@@ -7,5 +12,90 @@ CEnergyBall::CEnergyBall(TUniqueId uid, std::string_view name, const CEntityInfo
|
||||
const CAssetId& a2, const CAssetId& a3, s16 sfxId2, float f3, float f4, const CAssetId& a4,
|
||||
const CDamageInfo& dInfo2, float f5)
|
||||
: CPatterned(ECharacter::EnergyBall, uid, name, EFlavorType::Zero, info, xf, std::move(mData), pInfo,
|
||||
EMovementType::Flyer, EColliderType::One, EBodyType::NewFlyer, actParms, EKnockBackVariant::Medium) {}
|
||||
EMovementType::Flyer, EColliderType::One, EBodyType::NewFlyer, actParms, EKnockBackVariant::Medium)
|
||||
, x570_(w1)
|
||||
, x574_(f1)
|
||||
, x578_(dInfo1)
|
||||
, x594_initialTurnSpeed(pInfo.GetTurnSpeed())
|
||||
, x598_(f2)
|
||||
, x59c_(a1)
|
||||
, x5a0_(sfxId1)
|
||||
, x5a4_(a2)
|
||||
, x5a8_(g_SimplePool->GetObj({FOURCC('ELSC'), a3}))
|
||||
, x5b4_(sfxId2)
|
||||
, x5b8_(f3)
|
||||
, x5bc_(f4)
|
||||
, x5c0_(g_SimplePool->GetObj({FOURCC('PART'), a4}))
|
||||
, x5cc_(dInfo2)
|
||||
, x5e8_(f5) {
|
||||
x460_knockBackController.SetEnableExplodeDeath(false);
|
||||
x460_knockBackController.SetAutoResetImpulse(false);
|
||||
x460_knockBackController.SetEnableBurnDeath(false);
|
||||
x460_knockBackController.SetX82_24(false);
|
||||
x460_knockBackController.SetEnableBurn(false);
|
||||
x460_knockBackController.SetEnableLaggedBurnDeath(false);
|
||||
x460_knockBackController.SetEnableShock(false);
|
||||
x460_knockBackController.SetEnableFreeze(false);
|
||||
x460_knockBackController.SetX81_31(false);
|
||||
}
|
||||
|
||||
void CEnergyBall::Think(float dt, CStateManager& mgr) {
|
||||
float newTurnSpeed = x594_initialTurnSpeed * zeus::clamp(0.f, (x56c_ - 2.5f) * 0.125f, 1.f);
|
||||
x3b8_turnSpeed = newTurnSpeed;
|
||||
x450_bodyController->SetTurnSpeed(newTurnSpeed);
|
||||
CPatterned::Think(dt, mgr);
|
||||
GetModelData()->GetAnimationData()->GetParticleDB().SetModulationColorAllActiveEffects(
|
||||
zeus::CColor::lerp(zeus::skWhite, zeus::skRed, zeus::clamp(0.f, x428_damageCooldownTimer / 0.33f, 1.f)));
|
||||
|
||||
bool r27 = false;
|
||||
if (GetActive() && IsAlive()) {
|
||||
x56c_ -= dt;
|
||||
if (x56c_ > x574_)
|
||||
r27 = true;
|
||||
if (!InMaxRange(mgr, dt))
|
||||
r27 = true;
|
||||
}
|
||||
|
||||
if (!r27)
|
||||
sub8029f4a8(mgr);
|
||||
}
|
||||
|
||||
void CEnergyBall::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) {
|
||||
if (msg == EScriptObjectMessage::Registered) {
|
||||
SetMaterialFilter(CMaterialFilter::MakeInclude({EMaterialTypes::Player}));
|
||||
RemoveMaterial(EMaterialTypes::Solid, mgr);
|
||||
}
|
||||
CPatterned::AcceptScriptMsg(msg, uid, mgr);
|
||||
}
|
||||
|
||||
void CEnergyBall::Death(CStateManager& mgr, const zeus::CVector3f& direction, EScriptObjectState /* state */) {
|
||||
CHealthInfo* hInfo = HealthInfo(mgr);
|
||||
if (hInfo && hInfo->GetHP() > 0.f) {
|
||||
CPatterned::Death(mgr, direction, EScriptObjectState::Any);
|
||||
} else {
|
||||
CPatterned::Death(mgr, direction, EScriptObjectState::DeathRattle);
|
||||
}
|
||||
}
|
||||
|
||||
void CEnergyBall::Generate(CStateManager& mgr, EStateMsg msg, float /*arg*/) {
|
||||
if (msg == EStateMsg::Activate || msg == EStateMsg::Update) {
|
||||
if (msg == EStateMsg::Activate)
|
||||
x32c_animState = EAnimState::Ready;
|
||||
|
||||
TryGenerateDeactivate(mgr, 0);
|
||||
|
||||
if (!x450_bodyController->GetActive())
|
||||
x450_bodyController->Activate(mgr);
|
||||
} else if (msg == EStateMsg::Deactivate) {
|
||||
x32c_animState = EAnimState::NotReady;
|
||||
}
|
||||
}
|
||||
|
||||
void CEnergyBall::Attack(CStateManager& mgr, EStateMsg msg, float arg) {
|
||||
if (msg == EStateMsg::Update) {
|
||||
zeus::CVector3f seekPos = x568_steeringBehaviors.Seek(*this, mgr.GetPlayer().GetEyePosition());
|
||||
x450_bodyController->FaceDirection3D(seekPos, GetTransform().basis[1], arg);
|
||||
}
|
||||
}
|
||||
void CEnergyBall::sub8029f4a8(CStateManager& mgr) {}
|
||||
}
|
||||
Reference in New Issue
Block a user