2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-08 22:27:43 +00:00

Finish CScriptActor

This commit is contained in:
2017-02-12 16:00:07 -08:00
parent 6857e219b4
commit e062de1429
6 changed files with 103 additions and 30 deletions

View File

@@ -22,12 +22,12 @@ CScriptActor::CScriptActor(TUniqueId uid, const std::string& name, const CEntity
, x2d8_(w1)
, x2dc_xrayAlpha(f3)
, x2e2_24_(b2)
, x2e2_25_(false)
, x2e2_26_(true)
, x2e2_25_dead(false)
, x2e2_26_animating(true)
, x2e2_27_(std::fabs(f3 - 1.f) > 0.00001)
, x2e2_28_(false)
, x2e2_29_((x2e2_24_ && x2e2_25_ && x2d8_ != 0))
, x2e2_30_(b4)
, x2e2_29_((x2e2_24_ && x2e2_25_dead && x2d8_ != 0))
, x2e2_30_transposeRotate(b4)
, x2e2_31_(b5)
{
if (x64_modelData && (x64_modelData->HasAnimData() || x64_modelData->HasNormalModel()) && castsShadow)
@@ -45,17 +45,17 @@ void CScriptActor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CSta
{
if (msg == EScriptObjectMessage::Reset)
{
x2e2_25_ = false;
x2e2_25_dead = false;
x260_currentHealth = x258_initialHealth;
}
else if (msg == EScriptObjectMessage::Increment && !GetActive())
{
mgr.SendScriptMsg(this, x8_uid, EScriptObjectMessage::Activate);
CScriptColorModulate::FadeInHelper(mgr, x8_uid, x2d0_);
CScriptColorModulate::FadeInHelper(mgr, x8_uid, x2d0_alphaMax);
}
else if (msg == EScriptObjectMessage::Decrement)
{
CScriptColorModulate::FadeOutHelper(mgr, x8_uid, x2d4_);
CScriptColorModulate::FadeOutHelper(mgr, x8_uid, x2d4_alphaMin);
}
else if (msg == EScriptObjectMessage::InternalMessage13)
{
@@ -89,14 +89,87 @@ void CScriptActor::Think(float dt, CStateManager& mgr)
if (HasModelData() && x64_modelData->HasAnimData())
{
bool animTimeRemaining = x64_modelData->GetAnimationData()->IsAnimTimeRemaining(dt - FLT_EPSILON, "Whole Body");
bool timeRemaining = x64_modelData->GetAnimationData()->IsAnimTimeRemaining(dt - FLT_EPSILON, "Whole Body");
bool loop = x64_modelData->GetIsLoop();
CActor::UpdateAnimation(dt, mgr, true);
SAdvancementDeltas deltas = CActor::UpdateAnimation(dt, mgr, true);
if (timeRemaining || loop)
{
x2e2_26_animating = true;
if (x2e2_30_transposeRotate)
MoveToOR(
x34_transform.rotate(x64_modelData->GetScale() * x34_transform.transposeRotate(deltas.x0_posDelta)),
dt);
else
MoveToOR(deltas.x0_posDelta, dt);
RotateToOR(deltas.xc_rotDelta, dt);
}
if (!timeRemaining && x2e2_26_animating && !loop)
{
SendScriptMsgs(EScriptObjectState::MaxReached, mgr, EScriptObjectMessage::None);
x2e2_26_animating = false;
}
}
if (!x2e2_25_dead && HealthInfo()->GetHP() <= 0.f)
{
x2e2_25_dead = true;
SendScriptMsgs(EScriptObjectState::Dead, mgr, EScriptObjectMessage::None);
}
}
void CScriptActor::PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) {}
void CScriptActor::PreRender(CStateManager& mgr, const zeus::CFrustum& frustum)
{
CActor::PreRender(mgr, frustum);
if (xe4_30_ && TCastToPtr<CCinematicCamera>(mgr.GetCameraManager()->GetCurrentCamera(mgr)))
xe4_30_ = false;
if (xe4_30_ && !x2e2_29_ && !x2e2_27_)
{
zeus::CColor col(1.f, 1.f, x2dc_xrayAlpha);
if (mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::EPlayerVisor::XRay)
{
xb4_ = 5;
xb5_ = 0;
xb6_ = 3;
xb8_ = col;
x2e2_28_ = true;
}
if (x2e2_28_)
{
x2e2_28_ = false;
if (xb4_ != 5 && xb5_ != 0 && xb4_ != 3 && xb8_ != col)
{
xb4_ = 5;
xb5_ = 0;
xb6_ = 3;
xb8_ = col;
}
}
if (!x2e2_24_ && xe6_27_ == 2 &&
mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::EPlayerVisor::XRay)
{
xb6_ &= ~3;
}
else
{
xb6_ |= 3;
}
if (x2d8_ != 0)
xb5_ = 0;
}
if (mgr.GetObjectById(x2e0_triggerId) == nullptr)
x2e0_triggerId = kInvalidUniqueId;
}
zeus::CAABox CScriptActor::GetSortingBounds(const CStateManager& mgr) const
{