mirror of https://github.com/AxioDL/metaforce.git
Fix CScriptActorRotate
This commit is contained in:
parent
083571e693
commit
d35cc2ce1d
|
@ -57,10 +57,12 @@ void CScriptActorRotate::Think(float dt, CStateManager& mgr)
|
||||||
if (TCastToPtr<CActor> act = mgr.ObjectById(actorPair.first))
|
if (TCastToPtr<CActor> act = mgr.ObjectById(actorPair.first))
|
||||||
{
|
{
|
||||||
zeus::CTransform xf =
|
zeus::CTransform xf =
|
||||||
zeus::CTransform::RotateX(zeus::degToRad(timeOffset * x34_rotation.x)) *
|
zeus::CTransform::RotateZ(zeus::degToRad(timeOffset * x34_rotation.z)) *
|
||||||
zeus::CTransform::RotateY(zeus::degToRad(timeOffset * x34_rotation.y)) *
|
zeus::CTransform::RotateY(zeus::degToRad(timeOffset * x34_rotation.y)) *
|
||||||
zeus::CTransform::RotateZ(zeus::degToRad(timeOffset * x34_rotation.z));
|
zeus::CTransform::RotateX(zeus::degToRad(timeOffset * x34_rotation.x));
|
||||||
act->SetTransform({xf.basis, act->GetTranslation()});
|
zeus::CTransform localRot = actorPair.second * xf;
|
||||||
|
localRot.origin = act->GetTranslation();
|
||||||
|
act->SetTransform(localRot);
|
||||||
|
|
||||||
if (TCastToPtr<CScriptPlatform> plat = mgr.ObjectById(actorPair.first))
|
if (TCastToPtr<CScriptPlatform> plat = mgr.ObjectById(actorPair.first))
|
||||||
UpdatePlatformRiders(*plat.GetPtr(), xf, mgr);
|
UpdatePlatformRiders(*plat.GetPtr(), xf, mgr);
|
||||||
|
@ -71,6 +73,7 @@ void CScriptActorRotate::Think(float dt, CStateManager& mgr)
|
||||||
{
|
{
|
||||||
if (!x58_25_skipSpiderBallWaypoints)
|
if (!x58_25_skipSpiderBallWaypoints)
|
||||||
UpdateSpiderBallWaypoints(mgr);
|
UpdateSpiderBallWaypoints(mgr);
|
||||||
|
|
||||||
if (x58_26_updateActors)
|
if (x58_26_updateActors)
|
||||||
UpdateActors(false, mgr);
|
UpdateActors(false, mgr);
|
||||||
}
|
}
|
||||||
|
@ -133,7 +136,7 @@ void CScriptActorRotate::UpdateActors(bool next, CStateManager& mgr)
|
||||||
if (!x48_actors.empty())
|
if (!x48_actors.empty())
|
||||||
{
|
{
|
||||||
x58_24_updateRotation = true;
|
x58_24_updateRotation = true;
|
||||||
x44_currentTime = (next ? 0.f : x40_maxTime);
|
x44_currentTime = (next ? x40_maxTime : 0.f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ class CScriptActorRotate : public CEntity
|
||||||
{
|
{
|
||||||
zeus::CVector3f x34_rotation;
|
zeus::CVector3f x34_rotation;
|
||||||
float x40_maxTime;
|
float x40_maxTime;
|
||||||
float x44_currentTime;
|
float x44_currentTime = 0.f;
|
||||||
std::map<TUniqueId, zeus::CTransform> x48_actors;
|
std::map<TUniqueId, zeus::CTransform> x48_actors;
|
||||||
|
|
||||||
union
|
union
|
||||||
|
|
|
@ -28,22 +28,139 @@ void CScriptColorModulate::Accept(IVisitor& visitor)
|
||||||
visitor.Visit(this);
|
visitor.Visit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CScriptColorModulate::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr)
|
void CScriptColorModulate::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& mgr)
|
||||||
{
|
{
|
||||||
CEntity::AcceptScriptMsg(msg, objId, stateMgr);
|
CEntity::AcceptScriptMsg(msg, objId, mgr);
|
||||||
|
return;
|
||||||
|
if (!GetActive())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (msg == EScriptObjectMessage::Decrement)
|
||||||
|
{
|
||||||
|
if (x54_29_)
|
||||||
|
{
|
||||||
|
x38_ = x38_ == 0;
|
||||||
|
x54_29_ = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (x54_30_)
|
||||||
|
{
|
||||||
|
if (x38_ == 0)
|
||||||
|
x3c_ = 0.f;
|
||||||
|
else
|
||||||
|
x3c_ = -((x50_ * (x3c_ / x4c_)) - x50_);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SetTargetFlags(mgr, CalculateFlags(x44_));
|
||||||
|
|
||||||
|
x54_30_ = true;
|
||||||
|
x38_ = 0;
|
||||||
|
}
|
||||||
|
else if (msg == EScriptObjectMessage::Increment)
|
||||||
|
{
|
||||||
|
if (x54_29_)
|
||||||
|
{
|
||||||
|
x38_ = x38_ == 0;
|
||||||
|
x54_29_ = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (x54_30_)
|
||||||
|
{
|
||||||
|
if (x38_ == 0)
|
||||||
|
x3c_ = 0.f;
|
||||||
|
else
|
||||||
|
x3c_ = -((x4c_ * (x3c_ / x50_)) - x4c_);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SetTargetFlags(mgr, CalculateFlags(x40_));
|
||||||
|
|
||||||
|
x54_30_ = true;
|
||||||
|
x38_ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CScriptColorModulate::Think(float, CStateManager &)
|
void CScriptColorModulate::Think(float dt, CStateManager& mgr)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
if (!GetActive() || !x54_30_)
|
||||||
|
return;
|
||||||
|
|
||||||
|
x3c_ += dt;
|
||||||
|
if (x38_ == 0)
|
||||||
|
{
|
||||||
|
float f2 = x4c_;
|
||||||
|
float f1 = f2 - dt;
|
||||||
|
if (std::fabs(f1) < 0.000001)
|
||||||
|
f1 = 1.f;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
f1 = x3c_;
|
||||||
|
f1 /= f2;
|
||||||
|
if (f1 >= 1.f)
|
||||||
|
f1 = 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
zeus::CColor CScriptColorModulate::CalculateFlags(const zeus::CColor &) const
|
zeus::CColor lerpedCol = zeus::CColor::lerp(x40_, x44_, f1);
|
||||||
|
CModelFlags flags = CalculateFlags(lerpedCol);
|
||||||
|
SetTargetFlags(mgr, flags);
|
||||||
|
|
||||||
|
if (x3c_ <= x4c_)
|
||||||
|
return;
|
||||||
|
|
||||||
|
End(mgr);
|
||||||
|
}
|
||||||
|
else if (x38_ == 1)
|
||||||
|
{
|
||||||
|
float f2 = x50_;
|
||||||
|
float f1 = f2 - dt;
|
||||||
|
if (std::fabs(f1) < 0.000001)
|
||||||
|
f1 = 1.f;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
f1 = x3c_;
|
||||||
|
f1 /= f2;
|
||||||
|
if (f1 >= 1.f)
|
||||||
|
f1 = 1.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
zeus::CColor lerpedCol = zeus::CColor::lerp(x40_, x44_, f1);
|
||||||
|
CModelFlags flags = CalculateFlags(lerpedCol);
|
||||||
|
SetTargetFlags(mgr, flags);
|
||||||
|
|
||||||
|
if (x3c_ <= x50_)
|
||||||
|
return;
|
||||||
|
|
||||||
|
End(mgr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CModelFlags CScriptColorModulate::CalculateFlags(const zeus::CColor &) const
|
||||||
{
|
{
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void CScriptColorModulate::SetTargetFlags(CStateManager &, const CModelFlags &)
|
void CScriptColorModulate::SetTargetFlags(CStateManager& stateMgr, const CModelFlags& flags)
|
||||||
{
|
{
|
||||||
|
for (const SConnection& conn : x20_conns)
|
||||||
|
{
|
||||||
|
if (conn.x0_state != EScriptObjectState::Play || conn.x4_msg != EScriptObjectMessage::Activate)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto search = stateMgr.GetIdListForScript(conn.x8_objId);
|
||||||
|
for (auto it = search.first ; it != search.second ; ++it)
|
||||||
|
{
|
||||||
|
CEntity* ent = stateMgr.ObjectById(it->second);
|
||||||
|
if (CActor* act = TCastToPtr<CActor>(ent))
|
||||||
|
act->SetDrawFlags(flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x34_ != kInvalidUniqueId)
|
||||||
|
{
|
||||||
|
CEntity* ent = stateMgr.ObjectById(x34_);
|
||||||
|
if (CActor* act = TCastToPtr<CActor>(ent))
|
||||||
|
act->SetDrawFlags(flags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CScriptColorModulate::FadeOutHelper(CStateManager &, TUniqueId, float)
|
void CScriptColorModulate::FadeOutHelper(CStateManager &, TUniqueId, float)
|
||||||
|
@ -61,7 +178,7 @@ void CScriptColorModulate::End(CStateManager& stateMgr)
|
||||||
if (x54_24_ && !x54_29_)
|
if (x54_24_ && !x54_29_)
|
||||||
{
|
{
|
||||||
x54_29_ = true;
|
x54_29_ = true;
|
||||||
x38_ = 0;
|
x38_ = x38_ == 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,12 +187,12 @@ void CScriptColorModulate::End(CStateManager& stateMgr)
|
||||||
if (x54_25_)
|
if (x54_25_)
|
||||||
SetTargetFlags(stateMgr, CModelFlags(0, 0, 3, zeus::CColor::skWhite));
|
SetTargetFlags(stateMgr, CModelFlags(0, 0, 3, zeus::CColor::skWhite));
|
||||||
|
|
||||||
if (x54_24_)
|
if (x55_24_)
|
||||||
stateMgr.SendScriptMsg(x8_uid, x34_, EScriptObjectMessage::Deactivate);
|
stateMgr.SendScriptMsgAlways(x34_, x8_uid, EScriptObjectMessage::Deactivate);
|
||||||
|
|
||||||
CEntity::SendScriptMsgs(EScriptObjectState::MaxReached, stateMgr, EScriptObjectMessage::None);
|
CEntity::SendScriptMsgs(EScriptObjectState::MaxReached, stateMgr, EScriptObjectMessage::None);
|
||||||
|
|
||||||
if (x54_31_)
|
if (!x54_31_)
|
||||||
stateMgr.FreeScriptObject(x8_uid);
|
stateMgr.FreeScriptObject(GetUniqueId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ public:
|
||||||
void Accept(IVisitor& visitor);
|
void Accept(IVisitor& visitor);
|
||||||
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr);
|
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr);
|
||||||
void Think(float, CStateManager &);
|
void Think(float, CStateManager &);
|
||||||
zeus::CColor CalculateFlags(const zeus::CColor&) const;
|
CModelFlags CalculateFlags(const zeus::CColor&) const;
|
||||||
void SetTargetFlags(CStateManager&, const CModelFlags&);
|
void SetTargetFlags(CStateManager&, const CModelFlags&);
|
||||||
static void FadeOutHelper(CStateManager&, TUniqueId, float);
|
static void FadeOutHelper(CStateManager&, TUniqueId, float);
|
||||||
static void FadeInHelper(CStateManager&, TUniqueId, float);
|
static void FadeInHelper(CStateManager&, TUniqueId, float);
|
||||||
|
|
|
@ -23,6 +23,7 @@ void CScriptGenerator::Accept(IVisitor& visitor) { visitor.Visit(this); }
|
||||||
|
|
||||||
void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
|
void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
if (msg == EScriptObjectMessage::SetToZero && GetActive() && !x20_conns.empty())
|
if (msg == EScriptObjectMessage::SetToZero && GetActive() && !x20_conns.empty())
|
||||||
{
|
{
|
||||||
std::vector<TUniqueId> follows;
|
std::vector<TUniqueId> follows;
|
||||||
|
|
Loading…
Reference in New Issue