diff --git a/Runtime/MP1/World/CMakeLists.txt b/Runtime/MP1/World/CMakeLists.txt index ef259283e..8df8a0819 100644 --- a/Runtime/MP1/World/CMakeLists.txt +++ b/Runtime/MP1/World/CMakeLists.txt @@ -9,6 +9,7 @@ set(MP1_WORLD_SOURCES CActorContraption.hpp CActorContraption.cpp CThardusRockProjectile.hpp CThardusRockProjectile.cpp CMetroidBeta.hpp CMetroidBeta.cpp - CMetroid.hpp CMetroid.cpp) + CMetroid.hpp CMetroid.cpp + CMetaree.hpp CMetaree.cpp) runtime_add_list(World MP1_WORLD_SOURCES) diff --git a/Runtime/MP1/World/CMetaree.cpp b/Runtime/MP1/World/CMetaree.cpp new file mode 100644 index 000000000..ea23151ff --- /dev/null +++ b/Runtime/MP1/World/CMetaree.cpp @@ -0,0 +1,43 @@ +// +// Created by antidote on 8/19/17. +// + +#include "CMetaree.hpp" + +namespace urde +{ +namespace MP1 +{ +CMetaree::CMetaree(TUniqueId uid, const std::string& name, EFlavorType flavor, const CEntityInfo& info, + const zeus::CTransform& xf, CModelData&& mData, const CPatternedInfo& pInfo, const CDamageInfo& dInfo, + float f1, const zeus::CVector3f& v1, float f2, EBodyType bodyType, float f3, float f4, + const CActorParameters& aParms) +: CPatterned(ECharacter::Metaree, uid, name, flavor, info, xf, std::move(mData), pInfo, EMovementType::Flyer, + EColliderType::Zero, bodyType, aParms, 0) +, x568_(f3) +, x56c_(f4) +, x570_(f1) +, x574_(v1) +, x580_(f2) +, x5ca_24_(true) +, x5ca_25_(false) +, x5ca_26_(false) +{ +} + +void CMetaree::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + +void CMetaree::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) +{ + CPatterned::AcceptScriptMsg(msg, uid, mgr); + + if (msg == EScriptObjectMessage::Start) + x5ca_25_ = true; + else if (msg == EScriptObjectMessage::Registered) + x450_bodyController->Activate(mgr); +} +} +} diff --git a/Runtime/MP1/World/CMetaree.hpp b/Runtime/MP1/World/CMetaree.hpp new file mode 100644 index 000000000..bb41a6d68 --- /dev/null +++ b/Runtime/MP1/World/CMetaree.hpp @@ -0,0 +1,56 @@ +#ifndef URDE_CMETAREE_HPP +#define URDE_CMETAREE_HPP + +#include "World/CPatterned.hpp" +#include "World/CDamageInfo.hpp" + +namespace urde +{ +namespace MP1 +{ +class CMetaree : public CPatterned +{ + float x568_; + float x56c_; + float x570_; + zeus::CVector3f x574_; + float x580_; + zeus::CVector3f x584_; + float x590_ = 0.f; + float x594_ = 0.f; + float x598_ = 0.f; + zeus::CVector3f x59c_; + u32 x5a8_ = 0; + CDamageInfo x5ac_damgeInfo; + u16 x5c8_ = 549; + + struct + { + struct + { + bool x5ca_24_ : 1; + bool x5ca_25_ : 1; + bool x5ca_26_ : 1; + }; + u16 _dummy; + }; + + u32 x5cc_; +public: + static constexpr ECharacter CharacterType = ECharacter::MetroidPrimeExo; + CMetaree(TUniqueId, const std::string&, EFlavorType, const CEntityInfo&, const zeus::CTransform&, CModelData&&, + const CPatternedInfo&, const CDamageInfo&, float, const zeus::CVector3f&, float, EBodyType, float, float, + const CActorParameters&); + + void Accept(IVisitor& visitor); + void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&); + + bool Delay(CStateManager&, float) + { + return x338_ == x568_; + } +}; +} +} + +#endif //URDE_CMETAREE_HPP diff --git a/Runtime/World/CPatterned.hpp b/Runtime/World/CPatterned.hpp index 69e8040f2..0f89599db 100644 --- a/Runtime/World/CPatterned.hpp +++ b/Runtime/World/CPatterned.hpp @@ -66,10 +66,11 @@ public: }; enum class EColliderType { + Zero = 0, One = 1 }; -private: +protected: union { struct @@ -83,6 +84,9 @@ private: }; ECharacter x34c_character; + float x338_; + std::unique_ptr x450_bodyController; + union { struct @@ -99,6 +103,7 @@ public: CPatterned::EMovementType movement, EColliderType collider, EBodyType body, const CActorParameters& params, int variant); + void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) {} virtual void Death(CStateManager&, const zeus::CVector3f&, EStateMsg) {} virtual void KnockBack(const zeus::CVector3f&, CStateManager&, const CDamageInfo& info, EKnockBackType, bool, float) {}