diff --git a/config/GM8E01_00/symbols.txt b/config/GM8E01_00/symbols.txt index 56e0d2cb..039e6022 100644 --- a/config/GM8E01_00/symbols.txt +++ b/config/GM8E01_00/symbols.txt @@ -9162,11 +9162,11 @@ fn_801DB618 = .text:0x801DB618; // type:function size:0x21C StartAttack__8CThardusFR13CStateManagerf = .text:0x801DB834; // type:function size:0x8 scope:global Suck__8CThardusFR13CStateManager9EStateMsgf = .text:0x801DB83C; // type:function size:0x68 scope:global Explode__8CThardusFR13CStateManager9EStateMsgf = .text:0x801DB8A4; // type:function size:0x17C scope:global -fn_801DBA20 = .text:0x801DBA20; // type:function size:0x1BC +ShakeScreen__8CThardusFR13CStateManagerRC9CVector3ffff = .text:0x801DBA20; // type:function size:0x1BC fn_801DBBDC = .text:0x801DBBDC; // type:function size:0x64 fn_801DBC40 = .text:0x801DBC40; // type:function size:0x1C fn_801DBC5C = .text:0x801DBC5C; // type:function size:0x3C -fn_801DBC98 = .text:0x801DBC98; // type:function size:0x38 +StartTimedThermalFlash__8CThardusFR13CStateManagerfR6CActor = .text:0x801DBC98; // type:function size:0x38 PathFind__8CThardusFR13CStateManager9EStateMsgf = .text:0x801DBCD0; // type:function size:0x25C scope:global PathFound__8CThardusFR13CStateManagerf = .text:0x801DBF2C; // type:function size:0x8 scope:global fn_801DBF34 = .text:0x801DBF34; // type:function size:0x394 @@ -9231,7 +9231,7 @@ Accept__8CThardusFR8IVisitor = .text:0x801E21EC; // type:function size:0x38 scop __ct__8CThardusF9TUniqueIdRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC16CActorParametersRC14CPatternedInfoRCQ24rstl47vector<10CModelData,Q24rstl17rmemory_allocator>RCQ24rstl47vector<10CModelData,Q24rstl17rmemory_allocator>UiUiUifffffff = .text:0x801E2224; // type:function size:0x910 scope:global fn_801E2B34 = .text:0x801E2B34; // type:function size:0x29C fn_801E2DD0 = .text:0x801E2DD0; // type:function size:0x3C -fn_801E2E0C = .text:0x801E2E0C; // type:function size:0xB0 +__ct__Q24rstl47vector<10CModelData,Q24rstl17rmemory_allocator>FRCQ24rstl47vector<10CModelData,Q24rstl17rmemory_allocator> = .text:0x801E2E0C; // type:function size:0xB0 fn_801E2EBC = .text:0x801E2EBC; // type:function size:0x74 fn_801E2F30 = .text:0x801E2F30; // type:function size:0x28 CanRenderUnsorted__16CDestroyableRockCFRC13CStateManager = .text:0x801E2F58; // type:function size:0x8 scope:global @@ -9617,19 +9617,19 @@ fn_802034E0 = .text:0x802034E0; // type:function size:0x110 fn_802035F0 = .text:0x802035F0; // type:function size:0x64 __insertion_sort,Q24rstl17rmemory_allocator>,29CMapObjectSortInfoGreaterThan>__4rstlFQ24rstl162pointer_iterator,Q24rstl17rmemory_allocator>Q24rstl162pointer_iterator = .text:0x8020438C; // type:function size:0x16C SetMaterialProperties__22CThardusRockProjectileFRQ24rstl36single_ptr<22CCollisionActorManager>R13CStateManager = .text:0x802044F8; // type:function size:0xF8 scope:global InitializeCollisionManager__22CThardusRockProjectileFR13CStateManager = .text:0x802045F0; // type:function size:0x1CC scope:global Delay__22CThardusRockProjectileFR13CStateManagerf = .text:0x802047BC; // type:function size:0x18 scope:global -fn_802047D4 = .text:0x802047D4; // type:function size:0x14 +AnimOver__22CThardusRockProjectileFR13CStateManagerf = .text:0x802047D4; // type:function size:0x14 HitSomething__22CThardusRockProjectileFR13CStateManagerf = .text:0x802047E8; // type:function size:0x8 scope:global ShouldAttack__22CThardusRockProjectileFR13CStateManagerf = .text:0x802047F0; // type:function size:0x34 scope:global ShouldMove__22CThardusRockProjectileFR13CStateManagerf = .text:0x80204824; // type:function size:0x1C scope:global @@ -9641,7 +9641,7 @@ GetUp__22CThardusRockProjectileFR13CStateManager9EStateMsgf = .text:0x80204D2C; Think__22CThardusRockProjectileFfR13CStateManager = .text:0x802050A0; // type:function size:0x1C0 scope:global AcceptScriptMsg__22CThardusRockProjectileF20EScriptObjectMessage9TUniqueIdR13CStateManager = .text:0x80205260; // type:function size:0x8C0 scope:global Accept__22CThardusRockProjectileFR8IVisitor = .text:0x80205B20; // type:function size:0x38 scope:global -__ct__22CThardusRockProjectileF9TUniqueIdRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC16CActorParametersRC14CPatternedInfoRCQ24rstl47vector<10CModelData,Q24rstl17rmemory_allocator>Ui = .text:0x80205B58; // type:function size:0x1DC scope:global +__ct__22CThardusRockProjectileF9TUniqueIdRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC16CActorParametersRC14CPatternedInfoRCQ24rstl47vector<10CStaticRes,Q24rstl17rmemory_allocator>Uif = .text:0x80205B58; // type:function size:0x1DC scope:global IsRightLogDynamic__16CInventoryScreenCFv = .text:0x80205D34; // type:function size:0x8 scope:global IsRightInventoryItemEquipped__16CInventoryScreenCFi = .text:0x80205D3C; // type:function size:0x254 scope:global HasRightInventoryItem__16CInventoryScreenCFi = .text:0x80205F90; // type:function size:0x214 scope:global @@ -18583,7 +18583,7 @@ jumptable_803E6B28 = .data:0x803E6B28; // type:object size:0x70 scope:local __vt__20CFlyingPirateRagDoll = .data:0x803E6B98; // type:object size:0x18 scope:global lbl_803E6BB0 = .data:0x803E6BB0; // type:object size:0x20 lbl_803E6BD0 = .data:0x803E6BD0; // type:object size:0x10 -lbl_803E6BE0 = .data:0x803E6BE0; // type:object size:0x2D0 +__vt__22CThardusRockProjectile = .data:0x803E6BE0; // type:object size:0x2D0 lbl_803E6EB0 = .data:0x803E6EB0; // type:object size:0x54 jumptable_803E6F04 = .data:0x803E6F04; // type:object size:0x60 scope:local jumptable_803E6F64 = .data:0x803E6F64; // type:object size:0x60 scope:local @@ -25309,15 +25309,15 @@ lbl_805ACD84 = .sdata2:0x805ACD84; // type:object size:0x4 align:4 data:float lbl_805ACD88 = .sdata2:0x805ACD88; // type:object size:0x8 align:8 data:double lbl_805ACD90 = .sdata2:0x805ACD90; // type:object size:0x8 align:4 data:float lbl_805ACD98 = .sdata2:0x805ACD98; // type:object size:0x8 data:4byte -lbl_805ACDA0 = .sdata2:0x805ACDA0; // type:object size:0x4 align:4 data:float -lbl_805ACDA4 = .sdata2:0x805ACDA4; // type:object size:0x4 align:4 data:float -lbl_805ACDA8 = .sdata2:0x805ACDA8; // type:object size:0x4 align:4 data:float -lbl_805ACDAC = .sdata2:0x805ACDAC; // type:object size:0x4 align:4 data:float -lbl_805ACDB0 = .sdata2:0x805ACDB0; // type:object size:0x4 align:4 data:float -lbl_805ACDB4 = .sdata2:0x805ACDB4; // type:object size:0x4 align:4 data:float -lbl_805ACDB8 = .sdata2:0x805ACDB8; // type:object size:0x4 align:4 data:float -lbl_805ACDBC = .sdata2:0x805ACDBC; // type:object size:0x4 align:4 data:float -lbl_805ACDC0 = .sdata2:0x805ACDC0; // type:object size:0x4 align:4 data:float +@763 = .sdata2:0x805ACDA0; // type:object size:0x4 align:4 data:float +@764 = .sdata2:0x805ACDA4; // type:object size:0x4 align:4 data:float +@765 = .sdata2:0x805ACDA8; // type:object size:0x4 align:4 data:float +@766 = .sdata2:0x805ACDAC; // type:object size:0x4 align:4 data:float +@767 = .sdata2:0x805ACDB0; // type:object size:0x4 align:4 data:float +@768 = .sdata2:0x805ACDB4; // type:object size:0x4 align:4 data:float +@769 = .sdata2:0x805ACDB8; // type:object size:0x4 align:4 data:float +@770 = .sdata2:0x805ACDBC; // type:object size:0x4 align:4 data:float +@781 = .sdata2:0x805ACDC0; // type:object size:0x4 align:4 data:float lbl_805ACDC4 = .sdata2:0x805ACDC4; // type:object size:0x4 align:4 data:float lbl_805ACDC8 = .sdata2:0x805ACDC8; // type:object size:0x4 align:4 data:float lbl_805ACDCC = .sdata2:0x805ACDCC; // type:object size:0x4 align:4 data:float diff --git a/config/GM8E01_01/symbols.txt b/config/GM8E01_01/symbols.txt index c11e8425..b41fa2ca 100644 --- a/config/GM8E01_01/symbols.txt +++ b/config/GM8E01_01/symbols.txt @@ -9162,11 +9162,11 @@ fn_801DB618 = .text:0x801DB694; // type:function size:0x21C scope:global StartAttack__8CThardusFR13CStateManagerf = .text:0x801DB8B0; // type:function size:0x8 scope:global Suck__8CThardusFR13CStateManager9EStateMsgf = .text:0x801DB8B8; // type:function size:0x68 scope:global Explode__8CThardusFR13CStateManager9EStateMsgf = .text:0x801DB920; // type:function size:0x17C scope:global -fn_801DBA20 = .text:0x801DBA9C; // type:function size:0x1BC scope:global +ShakeScreen__8CThardusFR13CStateManagerRC9CVector3ffff = .text:0x801DBA9C; // type:function size:0x1BC scope:global fn_801DBBDC = .text:0x801DBC58; // type:function size:0x64 scope:global fn_801DBC40 = .text:0x801DBCBC; // type:function size:0x1C scope:global fn_801DBC5C = .text:0x801DBCD8; // type:function size:0x3C scope:global -fn_801DBC98 = .text:0x801DBD14; // type:function size:0x38 scope:global +StartTimedThermalFlash__8CThardusFR13CStateManagerfR6CActor = .text:0x801DBD14; // type:function size:0x38 scope:global PathFind__8CThardusFR13CStateManager9EStateMsgf = .text:0x801DBD4C; // type:function size:0x25C scope:global PathFound__8CThardusFR13CStateManagerf = .text:0x801DBFA8; // type:function size:0x8 scope:global fn_801DBF34 = .text:0x801DBFB0; // type:function size:0x394 scope:global @@ -9231,7 +9231,7 @@ Accept__8CThardusFR8IVisitor = .text:0x801E2268; // type:function size:0x38 scop __ct__8CThardusF9TUniqueIdRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC16CActorParametersRC14CPatternedInfoRCQ24rstl47vector<10CModelData,Q24rstl17rmemory_allocator>RCQ24rstl47vector<10CModelData,Q24rstl17rmemory_allocator>UiUiUifffffff = .text:0x801E22A0; // type:function size:0x910 scope:global fn_801E2B34 = .text:0x801E2BB0; // type:function size:0x29C scope:global fn_801E2DD0 = .text:0x801E2E4C; // type:function size:0x3C scope:global -fn_801E2E0C = .text:0x801E2E88; // type:function size:0xB0 scope:global +__ct__Q24rstl47vector<10CModelData,Q24rstl17rmemory_allocator>FRCQ24rstl47vector<10CModelData,Q24rstl17rmemory_allocator> = .text:0x801E2E88; // type:function size:0xB0 scope:global fn_801E2EBC = .text:0x801E2F38; // type:function size:0x74 scope:global fn_801E2F30 = .text:0x801E2FAC; // type:function size:0x28 scope:global CanRenderUnsorted__16CDestroyableRockCFRC13CStateManager = .text:0x801E2FD4; // type:function size:0x8 scope:global @@ -9617,19 +9617,19 @@ fn_802034E0 = .text:0x8020355C; // type:function size:0x110 scope:global fn_802035F0 = .text:0x8020366C; // type:function size:0x64 scope:global __insertion_sort,Q24rstl17rmemory_allocator>,29CMapObjectSortInfoGreaterThan>__4rstlFQ24rstl162pointer_iterator,Q24rstl17rmemory_allocator>Q24rstl162pointer_iterator = .text:0x80204408; // type:function size:0x16C scope:global SetMaterialProperties__22CThardusRockProjectileFRQ24rstl36single_ptr<22CCollisionActorManager>R13CStateManager = .text:0x80204574; // type:function size:0xF8 scope:global InitializeCollisionManager__22CThardusRockProjectileFR13CStateManager = .text:0x8020466C; // type:function size:0x1CC scope:global Delay__22CThardusRockProjectileFR13CStateManagerf = .text:0x80204838; // type:function size:0x18 scope:global -fn_802047D4 = .text:0x80204850; // type:function size:0x14 scope:global +AnimOver__22CThardusRockProjectileFR13CStateManagerf = .text:0x80204850; // type:function size:0x14 scope:global HitSomething__22CThardusRockProjectileFR13CStateManagerf = .text:0x80204864; // type:function size:0x8 scope:global ShouldAttack__22CThardusRockProjectileFR13CStateManagerf = .text:0x8020486C; // type:function size:0x34 scope:global ShouldMove__22CThardusRockProjectileFR13CStateManagerf = .text:0x802048A0; // type:function size:0x1C scope:global @@ -9641,7 +9641,7 @@ GetUp__22CThardusRockProjectileFR13CStateManager9EStateMsgf = .text:0x80204DA8; Think__22CThardusRockProjectileFfR13CStateManager = .text:0x8020511C; // type:function size:0x1C0 scope:global AcceptScriptMsg__22CThardusRockProjectileF20EScriptObjectMessage9TUniqueIdR13CStateManager = .text:0x802052DC; // type:function size:0x8C0 scope:global Accept__22CThardusRockProjectileFR8IVisitor = .text:0x80205B9C; // type:function size:0x38 scope:global -__ct__22CThardusRockProjectileF9TUniqueIdRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC16CActorParametersRC14CPatternedInfoRCQ24rstl47vector<10CModelData,Q24rstl17rmemory_allocator>Ui = .text:0x80205BD4; // type:function size:0x1DC scope:global +__ct__22CThardusRockProjectileF9TUniqueIdRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC16CActorParametersRC14CPatternedInfoRCQ24rstl47vector<10CStaticRes,Q24rstl17rmemory_allocator>Uif = .text:0x80205BD4; // type:function size:0x1DC scope:global IsRightLogDynamic__16CInventoryScreenCFv = .text:0x80205DB0; // type:function size:0x8 scope:global IsRightInventoryItemEquipped__16CInventoryScreenCFi = .text:0x80205DB8; // type:function size:0x254 scope:global HasRightInventoryItem__16CInventoryScreenCFi = .text:0x8020600C; // type:function size:0x214 scope:global diff --git a/include/Collision/CMaterialList.hpp b/include/Collision/CMaterialList.hpp index bb94179d..fdcc2d93 100644 --- a/include/Collision/CMaterialList.hpp +++ b/include/Collision/CMaterialList.hpp @@ -102,9 +102,9 @@ public: } explicit CMaterialList(u64 value) : value(value) {} - void Add(const EMaterialTypes material) { value |= u64(1) << material; } + void Add(const EMaterialTypes material) { value |= 1ull << material; } void Add(const CMaterialList& material) { value |= material.value; } - void Remove(EMaterialTypes material) { value &= ~(u64(1) << material); } + void Remove(EMaterialTypes material) { value &= ~(1ull << material); } void Remove(const CMaterialList& material) { value &= ~material.value; } const CMaterialList Union(const CMaterialList& other) const { return CMaterialList(value | other.value); diff --git a/include/MetroidPrime/CActor.hpp b/include/MetroidPrime/CActor.hpp index aa103916..a9d31ce0 100644 --- a/include/MetroidPrime/CActor.hpp +++ b/include/MetroidPrime/CActor.hpp @@ -89,9 +89,10 @@ public: CAdvancementDeltas UpdateAnimation(float dt, CStateManager& mgr, bool advTree); - void ProcessSoundEvent(int sfxId, float weight, int flags, float fallOff, float maxDist, - uchar minVol, uchar maxVol, const CVector3f& toListener, - const CVector3f& position, int aid, CStateManager& mgr, bool translateId); + void ProcessSoundEvent(const int sfxId, const float weight, const int flags, const float fallOff, + const float maxDist, const uchar minVol, const uchar maxVol, + const CVector3f& toListener, const CVector3f& position, const int aid, + CStateManager& mgr, const bool translateId); void UpdateSfxEmitters(); void RemoveEmitter(); diff --git a/include/MetroidPrime/CCollisionActorManager.hpp b/include/MetroidPrime/CCollisionActorManager.hpp index 58efb800..32432756 100644 --- a/include/MetroidPrime/CCollisionActorManager.hpp +++ b/include/MetroidPrime/CCollisionActorManager.hpp @@ -32,9 +32,9 @@ public: uint GetNumCollisionActors() const { return x0_jointDescriptions.size(); } rstl::optional_object< CVector3f > GetDeviation(const CStateManager& mgr, CSegId seg); - const CJointCollisionDescription& GetCollisionDescFromIndex(uint i) const { + const CJointCollisionDescription& GetCollisionDescFromIndex(uint i) const; /*{ return x0_jointDescriptions[i]; - } + }*/ static CTransform4f GetWRLocatorTransform(const CAnimData& animData, CSegId id, const CTransform4f& worldXf, diff --git a/include/MetroidPrime/CModelData.hpp b/include/MetroidPrime/CModelData.hpp index 0bf8e80f..ad50b507 100644 --- a/include/MetroidPrime/CModelData.hpp +++ b/include/MetroidPrime/CModelData.hpp @@ -70,7 +70,7 @@ public: CModelData(); CModelData(const CAnimRes&); CModelData(const CStaticRes&); - CModelData(const CModelData& other); + //CModelData(const CModelData& other); ~CModelData(); CAdvancementDeltas AdvanceAnimation(float dt, CStateManager& mgr, TAreaId aid, bool advTree); diff --git a/include/MetroidPrime/CStateManager.hpp b/include/MetroidPrime/CStateManager.hpp index 61ac0c95..35728b13 100644 --- a/include/MetroidPrime/CStateManager.hpp +++ b/include/MetroidPrime/CStateManager.hpp @@ -228,8 +228,9 @@ public: void ApplyDamageToWorld(TUniqueId, const CActor&, const CVector3f&, const CDamageInfo& info, const CMaterialFilter&); - bool ApplyDamage(TUniqueId damagerId, TUniqueId damageeId, const TUniqueId radiusSender, - const CDamageInfo& info, const CMaterialFilter& filter, + bool ApplyDamage(const TUniqueId damagerId, const TUniqueId damageeId, + const TUniqueId radiusSender, const CDamageInfo& info, + const CMaterialFilter& filter, const CVector3f& knockbackVec = CVector3f::Zero()); void InformListeners(const CVector3f&, EListenNoiseType); @@ -300,7 +301,7 @@ public: void RemoveActiveFlickerBat(const TUniqueId& uid) { xf3c_activeFlickerBats.remove(uid); } rstl::list< TUniqueId >& GetActiveFlickerBats() { return xf3c_activeFlickerBats; } - + void DrawSpaceWarp(const CVector3f& point, float strength) const; private: diff --git a/include/MetroidPrime/Collision/CPatternedCollisionUtils.hpp b/include/MetroidPrime/Collision/CPatternedCollisionUtils.hpp new file mode 100644 index 00000000..99fde3c2 --- /dev/null +++ b/include/MetroidPrime/Collision/CPatternedCollisionUtils.hpp @@ -0,0 +1,10 @@ +#ifndef _CPATTERNEDCOLLISIONUTILS +#define _CPATTERNEDCOLLISIONUTILS + +namespace CPatternedCollisionUtils { +struct SSphereJointInfo { + const char* name; + float radius; +}; +}; // namespace CPatternedCollisionUtils +#endif // MP1_CPATTERNEDCOLLISIONUTILS_HPP diff --git a/include/MetroidPrime/Enemies/CAi.hpp b/include/MetroidPrime/Enemies/CAi.hpp index ad04cca0..cd7b07c5 100644 --- a/include/MetroidPrime/Enemies/CAi.hpp +++ b/include/MetroidPrime/Enemies/CAi.hpp @@ -42,130 +42,130 @@ public: virtual CVector3f GetOrigin(const CStateManager& mgr, const CTeamAiRole& role, const CVector3f& aimPos) const; - virtual void Patrol(CStateManager&, EStateMsg, float); - virtual void FollowPattern(CStateManager&, EStateMsg, float); - virtual void Dead(CStateManager&, EStateMsg, float); - virtual void PathFind(CStateManager&, EStateMsg, float); - virtual void Start(CStateManager&, EStateMsg, float); - virtual void SelectTarget(CStateManager&, EStateMsg, float); - virtual void TargetPatrol(CStateManager&, EStateMsg, float); - virtual void TargetPlayer(CStateManager&, EStateMsg, float); - virtual void TargetCover(CStateManager&, EStateMsg, float); - virtual void Halt(CStateManager&, EStateMsg, float); - virtual void Walk(CStateManager&, EStateMsg, float); - virtual void Run(CStateManager&, EStateMsg, float); - virtual void Generate(CStateManager&, EStateMsg, float); - virtual void Deactivate(CStateManager&, EStateMsg, float); - virtual void Attack(CStateManager&, EStateMsg, float); - virtual void LoopedAttack(CStateManager&, EStateMsg, float); - virtual void JumpBack(CStateManager&, EStateMsg, float); - virtual void DoubleSnap(CStateManager&, EStateMsg, float); - virtual void Shuffle(CStateManager&, EStateMsg, float); - virtual void TurnAround(CStateManager&, EStateMsg, float); - virtual void Skid(CStateManager&, EStateMsg, float); - virtual void Active(CStateManager&, EStateMsg, float); - virtual void InActive(CStateManager&, EStateMsg, float); - virtual void CoverAttack(CStateManager&, EStateMsg, float); - virtual void Crouch(CStateManager&, EStateMsg, float); - virtual void FadeIn(CStateManager&, EStateMsg, float); - virtual void FadeOut(CStateManager&, EStateMsg, float); - virtual void GetUp(CStateManager&, EStateMsg, float); - virtual void Taunt(CStateManager&, EStateMsg, float); - virtual void Suck(CStateManager&, EStateMsg, float); - virtual void Flee(CStateManager&, EStateMsg, float); - virtual void Lurk(CStateManager&, EStateMsg, float); - virtual void ProjectileAttack(CStateManager&, EStateMsg, float); - virtual void Flinch(CStateManager&, EStateMsg, float); - virtual void Hurled(CStateManager&, EStateMsg, float); - virtual void TelegraphAttack(CStateManager&, EStateMsg, float); - virtual void Jump(CStateManager&, EStateMsg, float); - virtual void Explode(CStateManager&, EStateMsg, float); - virtual void Dodge(CStateManager&, EStateMsg, float); - virtual void Retreat(CStateManager&, EStateMsg, float); - virtual void Cover(CStateManager&, EStateMsg, float); - virtual void Approach(CStateManager&, EStateMsg, float); - virtual void WallHang(CStateManager&, EStateMsg, float); - virtual void WallDetach(CStateManager&, EStateMsg, float); - virtual void Enraged(CStateManager&, EStateMsg, float); - virtual void SpecialAttack(CStateManager&, EStateMsg, float); - virtual void Growth(CStateManager&, EStateMsg, float); - virtual void Faint(CStateManager&, EStateMsg, float); - virtual void Land(CStateManager&, EStateMsg, float); - virtual void Bounce(CStateManager&, EStateMsg, float); - virtual void PathFindEx(CStateManager&, EStateMsg, float); - virtual void Dizzy(CStateManager&, EStateMsg, float); - virtual void CallForBackup(CStateManager&, EStateMsg, float); - virtual void BulbAttack(CStateManager&, EStateMsg, float); - virtual void PodAttack(CStateManager&, EStateMsg, float); + virtual void Patrol(CStateManager& mgr, EStateMsg msg, float arg); + virtual void FollowPattern(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Dead(CStateManager& mgr, EStateMsg msg, float arg); + virtual void PathFind(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Start(CStateManager& mgr, EStateMsg msg, float arg); + virtual void SelectTarget(CStateManager& mgr, EStateMsg msg, float arg); + virtual void TargetPatrol(CStateManager& mgr, EStateMsg msg, float arg); + virtual void TargetPlayer(CStateManager& mgr, EStateMsg msg, float arg); + virtual void TargetCover(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Halt(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Walk(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Run(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Generate(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Deactivate(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Attack(CStateManager& mgr, EStateMsg msg, float arg); + virtual void LoopedAttack(CStateManager& mgr, EStateMsg msg, float arg); + virtual void JumpBack(CStateManager& mgr, EStateMsg msg, float arg); + virtual void DoubleSnap(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Shuffle(CStateManager& mgr, EStateMsg msg, float arg); + virtual void TurnAround(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Skid(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Active(CStateManager& mgr, EStateMsg msg, float arg); + virtual void InActive(CStateManager& mgr, EStateMsg msg, float arg); + virtual void CoverAttack(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Crouch(CStateManager& mgr, EStateMsg msg, float arg); + virtual void FadeIn(CStateManager& mgr, EStateMsg msg, float arg); + virtual void FadeOut(CStateManager& mgr, EStateMsg msg, float arg); + virtual void GetUp(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Taunt(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Suck(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Flee(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Lurk(CStateManager& mgr, EStateMsg msg, float arg); + virtual void ProjectileAttack(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Flinch(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Hurled(CStateManager& mgr, EStateMsg msg, float arg); + virtual void TelegraphAttack(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Jump(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Explode(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Dodge(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Retreat(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Cover(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Approach(CStateManager& mgr, EStateMsg msg, float arg); + virtual void WallHang(CStateManager& mgr, EStateMsg msg, float arg); + virtual void WallDetach(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Enraged(CStateManager& mgr, EStateMsg msg, float arg); + virtual void SpecialAttack(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Growth(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Faint(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Land(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Bounce(CStateManager& mgr, EStateMsg msg, float arg); + virtual void PathFindEx(CStateManager& mgr, EStateMsg msg, float arg); + virtual void Dizzy(CStateManager& mgr, EStateMsg msg, float arg); + virtual void CallForBackup(CStateManager& mgr, EStateMsg msg, float arg); + virtual void BulbAttack(CStateManager& mgr, EStateMsg msg, float arg); + virtual void PodAttack(CStateManager& mgr, EStateMsg msg, float arg); - virtual bool InAttackPosition(CStateManager&, float); - virtual bool Leash(CStateManager&, float); - virtual bool OffLine(CStateManager&, float); - virtual bool Attacked(CStateManager&, float); - virtual bool PathShagged(CStateManager&, float); - virtual bool PathOver(CStateManager&, float); - virtual bool PathFound(CStateManager&, float); - virtual bool TooClose(CStateManager&, float); - virtual bool InRange(CStateManager&, float); - virtual bool InMaxRange(CStateManager&, float); - virtual bool InDetectionRange(CStateManager&, float); - virtual bool SpotPlayer(CStateManager&, float); - virtual bool PlayerSpot(CStateManager&, float); - virtual bool PatternOver(CStateManager&, float); - virtual bool PatternShagged(CStateManager&, float); - virtual bool HasAttackPattern(CStateManager&, float); - virtual bool HasPatrolPath(CStateManager&, float); - virtual bool HasRetreatPattern(CStateManager&, float); - virtual bool Delay(CStateManager&, float); - virtual bool RandomDelay(CStateManager&, float); - virtual bool FixedDelay(CStateManager&, float); - virtual bool Default(CStateManager&, float); - virtual bool AnimOver(CStateManager&, float); - virtual bool ShouldAttack(CStateManager&, float); - virtual bool ShouldDoubleSnap(CStateManager&, float); - virtual bool InPosition(CStateManager&, float); - virtual bool ShouldTurn(CStateManager&, float); - virtual bool HitSomething(CStateManager&, float); - virtual bool ShouldJumpBack(CStateManager&, float); - virtual bool Stuck(CStateManager&, float); - virtual bool NoPathNodes(CStateManager&, float); - virtual bool Landed(CStateManager&, float); - virtual bool HearShot(CStateManager&, float); - virtual bool HearPlayer(CStateManager&, float); - virtual bool CoverCheck(CStateManager&, float); - virtual bool CoverFind(CStateManager&, float); - virtual bool CoverBlown(CStateManager&, float); - virtual bool CoverNearlyBlown(CStateManager&, float); - virtual bool CoveringFire(CStateManager&, float); - virtual bool GotUp(CStateManager&, float); - virtual bool LineOfSight(CStateManager&, float); - virtual bool AggressionCheck(CStateManager&, float); - virtual bool AttackOver(CStateManager&, float); - virtual bool ShouldTaunt(CStateManager&, float); - virtual bool Inside(CStateManager&, float); - virtual bool ShouldFire(CStateManager&, float); - virtual bool ShouldFlinch(CStateManager&, float); - virtual bool PatrolPathOver(CStateManager&, float); - virtual bool ShouldDodge(CStateManager&, float); - virtual bool ShouldRetreat(CStateManager&, float); - virtual bool ShouldCrouch(CStateManager&, float); - virtual bool ShouldMove(CStateManager&, float); - virtual bool ShotAt(CStateManager&, float); - virtual bool HasTargetingPoint(CStateManager&, float); - virtual bool ShouldWallHang(CStateManager&, float); - virtual bool SetAIStage(CStateManager&, float); - virtual bool AIStage(CStateManager&, float); - virtual bool StartAttack(CStateManager&, float); - virtual bool BreakAttack(CStateManager&, float); - virtual bool ShouldStrafe(CStateManager&, float); - virtual bool ShouldSpecialAttack(CStateManager&, float); - virtual bool LostInterest(CStateManager&, float); - virtual bool CodeTrigger(CStateManager&, float); - virtual bool BounceFind(CStateManager&, float); - virtual bool Random(CStateManager&, float); - virtual bool FixedRandom(CStateManager&, float); - virtual bool IsDizzy(CStateManager&, float); - virtual bool ShouldCallForBackup(CStateManager&, float); + virtual bool InAttackPosition(CStateManager& mgr, float arg); + virtual bool Leash(CStateManager& mgr, float arg); + virtual bool OffLine(CStateManager& mgr, float arg); + virtual bool Attacked(CStateManager& mgr, float arg); + virtual bool PathShagged(CStateManager& mgr, float arg); + virtual bool PathOver(CStateManager& mgr, float arg); + virtual bool PathFound(CStateManager& mgr, float arg); + virtual bool TooClose(CStateManager& mgr, float arg); + virtual bool InRange(CStateManager& mgr, float arg); + virtual bool InMaxRange(CStateManager& mgr, float arg); + virtual bool InDetectionRange(CStateManager& mgr, float arg); + virtual bool SpotPlayer(CStateManager& mgr, float arg); + virtual bool PlayerSpot(CStateManager& mgr, float arg); + virtual bool PatternOver(CStateManager& mgr, float arg); + virtual bool PatternShagged(CStateManager& mgr, float arg); + virtual bool HasAttackPattern(CStateManager& mgr, float arg); + virtual bool HasPatrolPath(CStateManager& mgr, float arg); + virtual bool HasRetreatPattern(CStateManager& mgr, float arg); + virtual bool Delay(CStateManager& mgr, float arg); + virtual bool RandomDelay(CStateManager& mgr, float arg); + virtual bool FixedDelay(CStateManager& mgr, float arg); + virtual bool Default(CStateManager& mgr, float arg); + virtual bool AnimOver(CStateManager& mgr, float arg); + virtual bool ShouldAttack(CStateManager& mgr, float arg); + virtual bool ShouldDoubleSnap(CStateManager& mgr, float arg); + virtual bool InPosition(CStateManager& mgr, float arg); + virtual bool ShouldTurn(CStateManager& mgr, float arg); + virtual bool HitSomething(CStateManager& mgr, float arg); + virtual bool ShouldJumpBack(CStateManager& mgr, float arg); + virtual bool Stuck(CStateManager& mgr, float arg); + virtual bool NoPathNodes(CStateManager& mgr, float arg); + virtual bool Landed(CStateManager& mgr, float arg); + virtual bool HearShot(CStateManager& mgr, float arg); + virtual bool HearPlayer(CStateManager& mgr, float arg); + virtual bool CoverCheck(CStateManager& mgr, float arg); + virtual bool CoverFind(CStateManager& mgr, float arg); + virtual bool CoverBlown(CStateManager& mgr, float arg); + virtual bool CoverNearlyBlown(CStateManager& mgr, float arg); + virtual bool CoveringFire(CStateManager& mgr, float arg); + virtual bool GotUp(CStateManager& mgr, float arg); + virtual bool LineOfSight(CStateManager& mgr, float arg); + virtual bool AggressionCheck(CStateManager& mgr, float arg); + virtual bool AttackOver(CStateManager& mgr, float arg); + virtual bool ShouldTaunt(CStateManager& mgr, float arg); + virtual bool Inside(CStateManager& mgr, float arg); + virtual bool ShouldFire(CStateManager& mgr, float arg); + virtual bool ShouldFlinch(CStateManager& mgr, float arg); + virtual bool PatrolPathOver(CStateManager& mgr, float arg); + virtual bool ShouldDodge(CStateManager& mgr, float arg); + virtual bool ShouldRetreat(CStateManager& mgr, float arg); + virtual bool ShouldCrouch(CStateManager& mgr, float arg); + virtual bool ShouldMove(CStateManager& mgr, float arg); + virtual bool ShotAt(CStateManager& mgr, float arg); + virtual bool HasTargetingPoint(CStateManager& mgr, float arg); + virtual bool ShouldWallHang(CStateManager& mgr, float arg); + virtual bool SetAIStage(CStateManager& mgr, float arg); + virtual bool AIStage(CStateManager& mgr, float arg); + virtual bool StartAttack(CStateManager& mgr, float arg); + virtual bool BreakAttack(CStateManager& mgr, float arg); + virtual bool ShouldStrafe(CStateManager& mgr, float arg); + virtual bool ShouldSpecialAttack(CStateManager& mgr, float arg); + virtual bool LostInterest(CStateManager& mgr, float arg); + virtual bool CodeTrigger(CStateManager& mgr, float arg); + virtual bool BounceFind(CStateManager& mgr, float arg); + virtual bool Random(CStateManager& mgr, float arg); + virtual bool FixedRandom(CStateManager& mgr, float arg); + virtual bool IsDizzy(CStateManager& mgr, float arg); + virtual bool ShouldCallForBackup(CStateManager& mgr, float arg); private: CHealthInfo x258_healthInfo; diff --git a/include/MetroidPrime/Enemies/CPatterned.hpp b/include/MetroidPrime/Enemies/CPatterned.hpp index 82fd2744..8e64fbb5 100644 --- a/include/MetroidPrime/Enemies/CPatterned.hpp +++ b/include/MetroidPrime/Enemies/CPatterned.hpp @@ -183,43 +183,43 @@ public: void KnockBack(const CVector3f&, CStateManager&, const CDamageInfo& info, EKnockBackType type, bool inDeferred, float magnitude) override; void TakeDamage(const CVector3f& direction, float magnitude) override; - void Patrol(CStateManager&, EStateMsg, float) override; - void FollowPattern(CStateManager&, EStateMsg, float) override; - void Dead(CStateManager&, EStateMsg, float) override; - void PathFind(CStateManager&, EStateMsg, float) override; - void Start(CStateManager&, EStateMsg, float) override; - void TargetPatrol(CStateManager&, EStateMsg, float) override; - void TargetPlayer(CStateManager&, EStateMsg, float) override; - bool Leash(CStateManager&, float) override; - bool OffLine(CStateManager&, float) override; - bool Attacked(CStateManager&, float) override; - bool PathShagged(CStateManager&, float) override; - bool PathOver(CStateManager&, float) override; - bool PathFound(CStateManager&, float) override; - bool TooClose(CStateManager&, float) override; - bool InRange(CStateManager&, float) override; - bool InMaxRange(CStateManager&, float) override; - bool InDetectionRange(CStateManager&, float) override; - bool SpotPlayer(CStateManager&, float) override; - bool PlayerSpot(CStateManager&, float) override; - bool PatternOver(CStateManager&, float) override; - bool PatternShagged(CStateManager&, float) override; - bool HasAttackPattern(CStateManager&, float) override; - bool HasPatrolPath(CStateManager&, float) override; - bool HasRetreatPattern(CStateManager&, float) override; - bool Delay(CStateManager&, float) override; - bool RandomDelay(CStateManager&, float) override; - bool FixedDelay(CStateManager&, float) override; - bool Default(CStateManager&, float) override; - bool AnimOver(CStateManager&, float) override; - bool InPosition(CStateManager&, float) override; - bool Stuck(CStateManager&, float) override; - bool NoPathNodes(CStateManager&, float) override; - bool Landed(CStateManager&, float) override; - bool PatrolPathOver(CStateManager&, float) override; - bool CodeTrigger(CStateManager&, float) override; - bool Random(CStateManager&, float) override; - bool FixedRandom(CStateManager&, float) override; + void Patrol(CStateManager& mgr, EStateMsg msg, float arg) override; + void FollowPattern(CStateManager& mgr, EStateMsg msg, float arg) override; + void Dead(CStateManager& mgr, EStateMsg msg, float arg) override; + void PathFind(CStateManager& mgr, EStateMsg msg, float arg) override; + void Start(CStateManager& mgr, EStateMsg msg, float arg) override; + void TargetPatrol(CStateManager& mgr, EStateMsg msg, float arg) override; + void TargetPlayer(CStateManager& mgr, EStateMsg msg, float arg) override; + bool Leash(CStateManager& mgr, float arg) override; + bool OffLine(CStateManager& mgr, float arg) override; + bool Attacked(CStateManager& mgr, float arg) override; + bool PathShagged(CStateManager& mgr, float arg) override; + bool PathOver(CStateManager& mgr, float arg) override; + bool PathFound(CStateManager& mgr, float arg) override; + bool TooClose(CStateManager& mgr, float arg) override; + bool InRange(CStateManager& mgr, float arg) override; + bool InMaxRange(CStateManager& mgr, float arg) override; + bool InDetectionRange(CStateManager& mgr, float arg) override; + bool SpotPlayer(CStateManager& mgr, float arg) override; + bool PlayerSpot(CStateManager& mgr, float arg) override; + bool PatternOver(CStateManager& mgr, float arg) override; + bool PatternShagged(CStateManager& mgr, float arg) override; + bool HasAttackPattern(CStateManager& mgr, float arg) override; + bool HasPatrolPath(CStateManager& mgr, float arg) override; + bool HasRetreatPattern(CStateManager& mgr, float arg) override; + bool Delay(CStateManager& mgr, float arg) override; + bool RandomDelay(CStateManager& mgr, float arg) override; + bool FixedDelay(CStateManager& mgr, float arg) override; + bool Default(CStateManager& mgr, float arg) override; + bool AnimOver(CStateManager& mgr, float arg) override; + bool InPosition(CStateManager& mgr, float arg) override; + bool Stuck(CStateManager& mgr, float arg) override; + bool NoPathNodes(CStateManager& mgr, float arg) override; + bool Landed(CStateManager& mgr, float arg) override; + bool PatrolPathOver(CStateManager& mgr, float arg) override; + bool CodeTrigger(CStateManager& mgr, float arg) override; + bool Random(CStateManager& mgr, float arg) override; + bool FixedRandom(CStateManager& mgr, float arg) override; // CPatterned virtual void Freeze(CStateManager& mgr, const CVector3f& pos, const CUnitVector3f& dir, @@ -249,6 +249,8 @@ public: TUniqueId GetDestObj() const { return x2dc_destObj; } // TODO: name? float GetAverageAttackTime() const { return x304_averageAttackTime; } float GetAttackTimeVariation() const { return x308_attackTimeVariation; } + const bool GetVerticalMovement() const { return x328_25_verticalMovement; } + void SetVerticalMovement(const bool v) { x328_25_verticalMovement = v; } EAnimState GetAnimationState() const { return x32c_animState; } void SetAnimationState(const EAnimState state) { x32c_animState = state; } float GetStateMachineTime() const { return GetStateMachineState().GetTime(); } @@ -279,9 +281,10 @@ public: void TryCommand(CStateManager& mgr, int state, FTryCommandCallback cb, int arg); void SetupPlayerCollision(const bool startsHidden); - + void ApproachDest(CStateManager& mgr); void SetDestPos(const CVector3f& pos); + protected: EPatrolState x2d8_patrolState; TUniqueId x2dc_destObj; diff --git a/include/MetroidPrime/Enemies/CThardus.hpp b/include/MetroidPrime/Enemies/CThardus.hpp new file mode 100644 index 00000000..166dffcb --- /dev/null +++ b/include/MetroidPrime/Enemies/CThardus.hpp @@ -0,0 +1,10 @@ +#ifndef _CTHARDUS +#define _CTHARDUS + +class CThardus : public CPatterned { +public: + void ShakeScreen(CStateManager& mgr, const CVector3f& position, const float, const float, + const float); + void StartTimedThermalFlash(CStateManager& mgr, float, CActor& actor); +}; +#endif diff --git a/include/MetroidPrime/Enemies/CThardusRockProjectile.hpp b/include/MetroidPrime/Enemies/CThardusRockProjectile.hpp index 743397bd..8d75df76 100644 --- a/include/MetroidPrime/Enemies/CThardusRockProjectile.hpp +++ b/include/MetroidPrime/Enemies/CThardusRockProjectile.hpp @@ -3,9 +3,81 @@ #include "MetroidPrime/Enemies/CPatterned.hpp" -class CThardusRockProjectile : public CPatterned { +#include "MetroidPrime/Collision/CJointCollisionDescription.hpp" +#include "MetroidPrime/Collision/CPatternedCollisionUtils.hpp" +class CCollisionActorManager; +class CThardusRockProjectile : public CPatterned { +public: + enum EModifyMaterial { + kMM_Add, + kMM_Remove, + }; + CThardusRockProjectile(const TUniqueId uid, const rstl::string& name, const CEntityInfo& info, + const CTransform4f& xf, const CModelData& modelData, + const CActorParameters& aParms, const CPatternedInfo& patternedInfo, + const rstl::vector< CModelData >& mDataVec, const CAssetId stateMachine, + const float); + + void Accept(IVisitor& visitor) override; + void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override; + void Think(float dt, CStateManager& mgr) override; + + void GetUp(CStateManager& mgr, EStateMsg msg, float arg) override; + void Patrol(CStateManager&, EStateMsg, float) override; + void LoopedAttack(CStateManager& mgr, EStateMsg msg, float arg) override; + void Dead(CStateManager& mgr, EStateMsg msg, float arg) override; + void Lurk(CStateManager& mgr, EStateMsg msg, float arg) override; + bool ShouldMove(CStateManager& mgr, float arg) override; + bool ShouldAttack(CStateManager& mgr, float arg) override; + bool HitSomething(CStateManager& mgr, float arg) override; + bool AnimOver(CStateManager& mgr, float arg) override; + bool Delay(CStateManager& mgr, float arg) override; + + void Render(const CStateManager&) const override; + + void AddGravity(CStateManager& mgr); + void AddDeathEffects(CStateManager& mgr, const CVector3f& position); + void AddParticleEffect(CStateManager& mgr, const CAssetId particle, const CVector3f& position, + const CVector3f& scale, const int unk); + +private: + void InitializeCollisionManager(CStateManager& mgr); + void SetMaterialProperties(rstl::single_ptr< CCollisionActorManager >& colMgr, + CStateManager& mgr); + void AddSphereCollisionList(const CPatternedCollisionUtils::SSphereJointInfo*, int, + rstl::vector< CJointCollisionDescription >&); + void UpdateDestroyableRockPositions(CStateManager& mgr); + void UpdateDestroyableRockCollisionActors(CStateManager& mgr); + void SetChildrenActive(CStateManager& mgr, bool active); + void ModifyChildrenMaterial(CStateManager& mgr, EModifyMaterial modify, EMaterialTypes material); + + float x568_; + int mAiState; + TUniqueId x570_; + bool x572_; + EAnimState mAnimState; + rstl::single_ptr< CCollisionActorManager > mCollisionManager; + rstl::vector< CModelData > x57c_; + rstl::vector< TUniqueId > mDestroyableRocks; + CAssetId mStateMachineId; + uint x5a0_; + bool x5a4_; + float mDelayTime; + float mAttackTime; + CVector3f x5b0_; + bool x5bc_; + float x5c0_; + uint x5c4_; + uint x5c8_; + uint x5cc_; + TUniqueId mThardusId; + uint x5d4_; + uint x5d8_; + bool x5dc_; + bool x5dd_; + + static CPatternedCollisionUtils::SSphereJointInfo skJointInfoList[1]; }; - #endif // _CTHARDUSROCKPROJECTILE diff --git a/src/MetroidPrime/Enemies/CThardusRockProjectile.cpp b/src/MetroidPrime/Enemies/CThardusRockProjectile.cpp new file mode 100644 index 00000000..a793b5b4 --- /dev/null +++ b/src/MetroidPrime/Enemies/CThardusRockProjectile.cpp @@ -0,0 +1,245 @@ +#include "MetroidPrime/Enemies/CThardusRockProjectile.hpp" + +#include "Kyoto/Particles/CGenDescription.hpp" +#include "MetroidPrime/CCollisionActorManager.hpp" +#include "MetroidPrime/CExplosion.hpp" +#include "MetroidPrime/Enemies/CThardus.hpp" +#include "MetroidPrime/Player/CPlayer.hpp" + +CPatternedCollisionUtils::SSphereJointInfo CThardusRockProjectile::skJointInfoList[] = { + {"Rock_01_Collision_LCTR", 1.5f}, +}; + +CThardusRockProjectile::CThardusRockProjectile(const TUniqueId uid, const rstl::string& name, + const CEntityInfo& info, const CTransform4f& xf, + const CModelData& modelData, + const CActorParameters& aParms, + const CPatternedInfo& patternedInfo, + const rstl::vector< CModelData >& mDataVec, + const CAssetId stateMachine, const float f1) +: CPatterned(kC_ThardusRockProjectile, uid, name, kFT_Zero, info, xf, modelData, patternedInfo, + kMT_Flyer, kCT_One, kBT_Flyer, aParms, kKBV_Medium) +, x568_(1.f) +, x570_(kInvalidUniqueId) +, x572_(false) +, mAnimState(kAS_Invalid) +, x57c_(mDataVec) +, mStateMachineId(stateMachine) +, x5a0_(0) +, x5a4_(true) +, mDelayTime(0.f) +, mAttackTime(0.f) +, x5b0_(0.f, 1.f, 0.f) +, x5bc_(true) +, x5c0_(f1) +, x5c4_(0) +, x5c8_(0) +, x5cc_(0) +, mThardusId(kInvalidUniqueId) +, x5d4_(0) +, x5d8_(0) +, x5dc_(false) +, x5dd_(false) { + CMaterialList exclude = GetMaterialFilter().GetExcludeList(); + exclude.Add(CMaterialList(kMT_Player, kMT_Character, kMT_NoPlatformCollision)); + SetMaterialFilter( + CMaterialFilter::MakeIncludeExclude(GetMaterialFilter().GetIncludeList(), exclude)); + x50c_baseDamageMag = 1.f; +} + +void CThardusRockProjectile::Accept(IVisitor& visitor) { visitor.Visit(*this); } + +void CThardusRockProjectile::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, + CStateManager& mgr) {} + +void CThardusRockProjectile::Think(float dt, CStateManager& mgr) {} + +void CThardusRockProjectile::GetUp(CStateManager& mgr, const EStateMsg msg, const float arg) { + switch (msg) { + case kStateMsg_Activate: + break; + case kStateMsg_Update: + break; + case kStateMsg_Deactivate: + break; + } +} + +void CThardusRockProjectile::Patrol(CStateManager& mgr, const EStateMsg msg, const float arg) { + switch (msg) { + case kStateMsg_Activate: + break; + case kStateMsg_Update: + break; + case kStateMsg_Deactivate: + break; + } +} + +void CThardusRockProjectile::LoopedAttack(CStateManager& mgr, EStateMsg msg, float arg) { + switch (msg) { + case kStateMsg_Activate: + break; + case kStateMsg_Update: + break; + case kStateMsg_Deactivate: + break; + } +} + +void CThardusRockProjectile::Dead(CStateManager& mgr, EStateMsg msg, float arg) { + switch (msg) { + case kStateMsg_Activate: + break; + case kStateMsg_Update: + break; + case kStateMsg_Deactivate: + break; + } +} + +void CThardusRockProjectile::Lurk(CStateManager& mgr, EStateMsg msg, float arg) { + switch (msg) { + case kStateMsg_Activate: + break; + case kStateMsg_Update: + break; + case kStateMsg_Deactivate: + break; + } +} + +bool CThardusRockProjectile::ShouldMove(CStateManager& mgr, float arg) { return mAiState >= 1; } + +bool CThardusRockProjectile::ShouldAttack(CStateManager& mgr, float arg) { + if (GetStateMachineTime() > mAttackTime && mAiState != 3) { + mAiState = 2; + return true; + } + + return false; +} + +bool CThardusRockProjectile::HitSomething(CStateManager& mgr, float arg) { return x572_; } + +bool CThardusRockProjectile::AnimOver(CStateManager& mgr, float arg) { return mAnimState == 3; } + +bool CThardusRockProjectile::Delay(CStateManager& mgr, float arg) { + return GetStateMachineTime() > mDelayTime; +} + +void CThardusRockProjectile::InitializeCollisionManager(CStateManager& mgr) {} + +void CThardusRockProjectile::SetMaterialProperties( + rstl::single_ptr< CCollisionActorManager >& colMgr, CStateManager& mgr) {} + +void CThardusRockProjectile::AddSphereCollisionList( + const CPatternedCollisionUtils::SSphereJointInfo*, int, + rstl::vector< CJointCollisionDescription >&) {} + +void CThardusRockProjectile::UpdateDestroyableRockPositions(CStateManager& mgr) {} +void CThardusRockProjectile::UpdateDestroyableRockCollisionActors(CStateManager& mgr) {} + +void CThardusRockProjectile::SetChildrenActive(CStateManager& mgr, bool active) { + const int rockCount = mDestroyableRocks.size(); + for (uint i = 0; i < rockCount; i++) { + const TUniqueId rockId = mDestroyableRocks[i]; + const TUniqueId colId = mCollisionManager->GetCollisionDescFromIndex(i).GetCollisionActorId(); + CEntity* rockAct = mgr.ObjectById(rockId); + if (!rockAct) { + continue; + } + CEntity* colAct = mgr.ObjectById(colId); + if (!colAct) { + continue; + } + + rockAct->SetActive(active); + colAct->SetActive(active); + } +} + +void CThardusRockProjectile::ModifyChildrenMaterial(CStateManager& mgr, EModifyMaterial modify, + EMaterialTypes material) { + const int rockCount = mDestroyableRocks.size(); + for (uint i = 0; i < rockCount; i++) { + TUniqueId rockId = mDestroyableRocks[i]; + TUniqueId colId = mCollisionManager->GetCollisionDescFromIndex(i).GetCollisionActorId(); + + CActor* rockAct = TCastToPtr< CActor >(mgr.ObjectById(rockId)); + + if (!rockAct) { + continue; + } + CActor* colAct = TCastToPtr< CActor >(mgr.ObjectById(colId)); + if (!colAct) { + continue; + } + switch (modify) { + case kMM_Add: + rockAct->AddMaterial(material, mgr); + colAct->AddMaterial(material, mgr); + break; + case kMM_Remove: + rockAct->RemoveMaterial(material, mgr); + colAct->RemoveMaterial(material, mgr); + break; + } + } +} + +void CThardusRockProjectile::Render(const CStateManager& mgr) const { CPatterned::Render(mgr); } + +void CThardusRockProjectile::AddGravity(CStateManager& mgr) { + SetVerticalMovement(false); + Stop(); + SetMomentumWR(CVector3f(0.f, 0.f, 2.f * -GetWeight())); + mAiState = 3; +} + +void CThardusRockProjectile::AddDeathEffects(CStateManager& mgr, const CVector3f& position) { + if (mThardusId == kInvalidUniqueId) { + return; + } + + CThardus* thardus = static_cast< CThardus* >(mgr.ObjectById(mThardusId)); + if (!thardus) { + return; + } + + AddParticleEffect(mgr, x5c8_, position, CVector3f(GetModelData()->GetScale()), 0); + thardus->ShakeScreen(mgr, position, 0.75f, 125.f, 1.f); + const CPlayer* player = mgr.GetPlayer(); + const CVector3f diff = player->GetTranslation() - GetTranslation(); + const float widthTimes10 = GetModelData()->GetScale().GetX() * 10.f; + + if (diff.MagSquared() < widthTimes10 * widthTimes10) { + mgr.ApplyDamage(GetUniqueId(), player->GetUniqueId(), GetUniqueId(), + CDamageInfo(CWeaponMode(kWT_AI), GetContactDamage().GetDamage() * 0.5f, + widthTimes10, GetContactDamage().GetKnockBackPower() * 0.5f), + CMaterialFilter::GetPassEverything(), diff.AsNormalized()); + } + + ProcessSoundEvent(x5d8_, 1.f, 0, 0.1f, 1000.f, 20, 127, CVector3f::Zero(), GetTranslation(), + mgr.GetNextAreaId().Value(), mgr, true); + + if (x5dd_) { + thardus->StartTimedThermalFlash(mgr, 2.f, *this); + SendScriptMsgs(kSS_Zero, mgr, kSM_None); + } +} + +void CThardusRockProjectile::AddParticleEffect(CStateManager& mgr, CAssetId particle, + const CVector3f& position, const CVector3f& scale, + int unk) { + TUniqueId uid = mgr.AllocateUniqueId(); + char buf[1024]; + sprintf(buf, "ROCK_PROJECTILE_EFFECT-%u-%i", particle, uid.Value()); + + CEntity* ent = rs_new CExplosion( + TLockedToken< CGenDescription >(gpSimplePool->GetObj(SObjectTag('PART', particle))), uid, + true, CEntityInfo(mgr.GetNextAreaId(), rstl::vector< SConnection >()), rstl::string(buf), + CTransform4f(CMatrix3f::Identity(), position), unk, scale, CColor::White()); + + mgr.AddObject(*ent); +} \ No newline at end of file