This commit is contained in:
Jack Andersen 2016-04-25 14:48:25 -10:00
commit 460f4ade35
41 changed files with 727 additions and 257 deletions

View File

@ -64,7 +64,7 @@ CStateManager::CStateManager(const std::weak_ptr<CScriptMailbox>&,
x904_loaderFuncs[int(EScriptObjectType::CameraShaker)] = ScriptLoader::LoadCameraShaker;
x904_loaderFuncs[int(EScriptObjectType::ActorKeyframe)] = ScriptLoader::LoadActorKeyframe;
x904_loaderFuncs[int(EScriptObjectType::Water)] = ScriptLoader::LoadWater;
x904_loaderFuncs[int(EScriptObjectType::Warwasp)] = ScriptLoader::LoadWarwasp;
x904_loaderFuncs[int(EScriptObjectType::Warwasp)] = ScriptLoader::LoadWarWasp;
x904_loaderFuncs[int(EScriptObjectType::SpacePirate)] = ScriptLoader::LoadSpacePirate;
x904_loaderFuncs[int(EScriptObjectType::FlyingPirate)] = ScriptLoader::LoadFlyingPirate;
x904_loaderFuncs[int(EScriptObjectType::ElitePirate)] = ScriptLoader::LoadElitePirate;

View File

@ -15,6 +15,7 @@ enum class ELocomotionAnim
};
}
class CBodyController;
class CStateManager;
class CBodyState

View File

@ -32,7 +32,7 @@ CModelData::CModelData(const CAnimRes& res)
: x0_particleScale(res.x8_scale)
{
TToken<CCharacterFactory> factory = g_CharFactoryBuilder->GetFactory(res);
xc_animData = factory->CreateCharacter(res.x4_charIdx, res.x14_, factory, res.x1c_defaultAnim);
xc_animData = factory->CreateCharacter(res.x4_charIdx, res.x14_, factory, res.x18_defaultAnim);
}
SAdvancementDeltas CModelData::GetAdvancementDeltas(const CCharAnimTime& a,

View File

@ -33,7 +33,7 @@ struct CAnimRes
s32 x4_charIdx = 0;
zeus::CVector3f x8_scale;
bool x14_ = false;
s32 x1c_defaultAnim = 0;
s32 x18_defaultAnim = 0;
};
class CModelData

View File

@ -4,7 +4,7 @@ set(COLLISION_SOURCES
CCollidableOBBTree.hpp CCollidableOBBTree.cpp
CCollidableOBBTreeGroup.hpp CCollidableOBBTreeGroup.cpp
CMaterialList.hpp
CMaterialFilter.hpp
CMaterialFilter.hpp CMaterialFilter.cpp
CRayCastResult.hpp CRayCastResult.cpp)
runtime_add_list(Collision COLLISION_SOURCES)

View File

@ -0,0 +1,29 @@
#include "CMaterialFilter.hpp"
namespace urde
{
const CMaterialFilter CMaterialFilter::skPassEverything({0x00000000FFFFFFFF}, {0}, CMaterialFilter::EFilterType::Zero);
CMaterialFilter::CMaterialFilter(const CMaterialList& include, const CMaterialList& exclude, CMaterialFilter::EFilterType type)
: x0_include(include),
x8_exclude(exclude),
x10_type(type)
{
}
CMaterialFilter CMaterialFilter::MakeInclude(const CMaterialList& include)
{
return CMaterialFilter(include, {EMaterialTypes::Zero}, EFilterType::Zero);
}
CMaterialFilter CMaterialFilter::MakeExclude(const CMaterialList& exclude)
{
return CMaterialFilter({u64(0x00000000FFFFFFFF)}, exclude, EFilterType::Two);
}
CMaterialFilter CMaterialFilter::MakeIncludeExclude(const CMaterialList& include, const CMaterialList& exclude)
{
return CMaterialFilter(include, exclude, EFilterType::Three);
}
}

View File

@ -7,10 +7,32 @@ namespace urde
{
class CMaterialFilter
{
CMaterialList x0_;
CMaterialList x8_;
u32 x10_ = 0;
public:
enum class EFilterType
{
Zero,
One,
Two,
Three
};
private:
CMaterialList x0_include;
CMaterialList x8_exclude;
EFilterType x10_type = EFilterType::Three;
public:
static const CMaterialFilter skPassEverything;
CMaterialFilter(const CMaterialList& include, const CMaterialList& exclude, EFilterType type);
static CMaterialFilter MakeInclude(const CMaterialList& include);
static CMaterialFilter MakeExclude(const CMaterialList& exclude);
static CMaterialFilter MakeIncludeExclude(const CMaterialList& include, const CMaterialList& exclude);
const CMaterialList& GetIncludeList() const { return x0_include; }
const CMaterialList& GetExcludeList() const { return x8_exclude; }
bool Passes(const CMaterialList&) const;
};
}
#endif // __CMATERIALFILTER_HPP__

View File

@ -8,6 +8,7 @@ namespace urde
enum class EMaterialTypes
{
Zero = 0,
Three = 3,
Six = 6,
Eight = 8,
Ten = 10,
@ -19,7 +20,10 @@ enum class EMaterialTypes
Nineteen = 19,
TwentyOne = 21,
ThirtyTwo = 32,
ThirtyThree = 33,
ThirtyFour = 34,
ThirtySeven = 37,
Fourty = 40,
FourtyOne = 41,
FourtyTwo = 42,
FourtyThree = 43,

View File

@ -7,6 +7,7 @@ set(MP1_SOURCES
CPlayMovie.hpp CPlayMovie.cpp
CFrontEndUI.hpp CFrontEndUI.cpp
CNewIntroBoss.hpp CNewIntroBoss.cpp
CWarWasp.hpp CWarWasp.cpp
MP1.hpp MP1.cpp)
runtime_add_list(MP1 MP1_SOURCES)

View File

@ -10,7 +10,7 @@ CNewIntroBoss::CNewIntroBoss(TUniqueId uid, const std::string& name, const CEnti
const CActorParameters& actParms, float, u32, const CDamageInfo& dInfo,
u32, u32, u32, u32)
: CPatterned(EUnknown::TwentyThree, uid, name, EFlavorType::Zero, info, xf, std::move(mData), pInfo,
EMovementType::One, EColliderType::Flyer, EBodyType::Two, actParms)
EMovementType::Flyer, EColliderType::One, EBodyType::Two, actParms, 1)
{
}

18
Runtime/MP1/CWarWasp.cpp Normal file
View File

@ -0,0 +1,18 @@
#include "CWarWasp.hpp"
namespace urde
{
namespace MP1
{
CWarWasp::CWarWasp(TUniqueId uid, const std::string& name, const CEntityInfo& info, const zeus::CTransform& xf,
CModelData&& mData, const CPatternedInfo& pInfo, CPatterned::EFlavorType flavor,
CPatterned::EColliderType collider, const CDamageInfo& dInfo1, const CActorParameters& actorParms,
ResId weapon, const CDamageInfo& dInfo2, ResId particle, u32 w3)
: CPatterned(EUnknown::ThirtyNine, uid, name, flavor, info, xf, std::move(mData), pInfo, EMovementType::Flyer, collider, EBodyType::Three,
actorParms, 0)
{
}
}
}

22
Runtime/MP1/CWarWasp.hpp Normal file
View File

@ -0,0 +1,22 @@
#ifndef CWARWASP_HPP
#define CWARWASP_HPP
#include "World/CPatterned.hpp"
namespace urde
{
class CDamageInfo;
namespace MP1
{
class CWarWasp : public CPatterned
{
public:
CWarWasp(TUniqueId uid, const std::string& name, const CEntityInfo& info,
const zeus::CTransform& xf, CModelData&& mData, const CPatternedInfo& pInfo,
CPatterned::EFlavorType flavor, CPatterned::EColliderType, const CDamageInfo& dInfo1, const CActorParameters&,
ResId weapon, const CDamageInfo& dInfo2, ResId particle, u32 w3);
};
}
}
#endif // CWARWASP_HPP

View File

@ -285,28 +285,22 @@ bool CVEParticleLocation::GetValue(int /*frame*/, zeus::CVector3f& valOut) const
bool CVEParticleSystemOrientationFront::GetValue(int /*frame*/, zeus::CVector3f& valOut) const
{
zeus::CTransform trans= CParticleGlobals::g_currentParticleSystem->x4_system->GetOrientation();
valOut.x = trans.m_basis.vec[1].x;
valOut.y = trans.m_basis.vec[2].y;
valOut.z = trans.m_origin.z;
zeus::CMatrix4f trans = CParticleGlobals::g_currentParticleSystem->x4_system->GetOrientation().toMatrix4f().transposed();
valOut.assign(trans.vec[0].y, trans.vec[1].z, trans.vec[3].x);
return false;
}
bool CVEParticleSystemOrientationUp::GetValue(int /*frame*/, zeus::CVector3f& valOut) const
{
zeus::CTransform trans= CParticleGlobals::g_currentParticleSystem->x4_system->GetOrientation();
valOut.x = trans.m_basis.vec[2].x;
valOut.y = trans.m_basis.vec[0].z;
valOut.z = trans.m_origin.y;
zeus::CMatrix4f trans = CParticleGlobals::g_currentParticleSystem->x4_system->GetOrientation().toMatrix4f().transposed();
valOut.assign(trans.vec[0].z, trans.vec[2].x, trans.vec[3].y);
return false;
}
bool CVEParticleSystemOrientationRight::GetValue(int /*frame*/, zeus::CVector3f& valOut) const
{
zeus::CTransform trans = CParticleGlobals::g_currentParticleSystem->x4_system->GetOrientation();
valOut.x = trans.m_basis.vec[0].x;
valOut.y = trans.m_basis.vec[1].y;
valOut.z = trans.m_basis.vec[2].z;
zeus::CMatrix4f trans = CParticleGlobals::g_currentParticleSystem->x4_system->GetOrientation().toMatrix4f().transposed();
valOut.assign(trans.vec[0].x, trans.vec[1].y, trans.vec[2].z);
return false;
}

View File

@ -21,7 +21,7 @@ CActor::CActor(TUniqueId uid, bool active, const std::string& name, const CEntit
const CActorParameters& params, TUniqueId)
: CEntity(uid, info, active, name),
x68_(MakeActorMaterialList(list, params)),
x70_(EMaterialTypes::Nineteen)
x70_(CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Nineteen}, {EMaterialTypes::Zero}))
{
if (mData.x1c_normalModel)
x64_modelData = std::make_unique<CModelData>(std::move(mData));

View File

@ -3,7 +3,7 @@
#include "CEntity.hpp"
#include "zeus/zeus.hpp"
#include "Collision/CMaterialList.hpp"
#include "Collision/CMaterialFilter.hpp"
#include "Character/CModelData.hpp"
namespace urde
@ -33,7 +33,7 @@ protected:
zeus::CTransform x34_transform;
std::unique_ptr<CModelData> x64_modelData;
CMaterialList x68_;
CMaterialList x70_;
CMaterialFilter x70_;
union
{
struct
@ -63,7 +63,6 @@ public:
const zeus::CTransform&, CModelData&&, const CMaterialList&,
const CActorParameters&, TUniqueId);
virtual void Accept(IVisitor&) {}/*= 0;*/
virtual void AddToRenderer(const zeus::CFrustum&, CStateManager&) {}
virtual void Render(CStateManager&) {}
virtual void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) {}
@ -85,6 +84,8 @@ public:
virtual zeus::CVector3f GetOrbitPosition(const CStateManager&)
{ return x34_transform.m_origin; }
virtual const zeus::CAABox* GetTouchBounds() const { return nullptr; }
virtual ECollisionResponseType GetCollisionResponseType(const zeus::CVector3f&, const zeus::CVector3f&, CWeaponMode&, int) { return ECollisionResponseType::Unknown12; }
void RemoveMaterial(EMaterialTypes, EMaterialTypes, EMaterialTypes, EMaterialTypes, CStateManager&);
void RemoveMaterial(EMaterialTypes, EMaterialTypes, EMaterialTypes, CStateManager&);
@ -115,6 +116,8 @@ public:
{
return xe5_27_useInSortedLists;
}
const CMaterialFilter& GetMaterialFilter() const { return x70_; }
};
}

View File

@ -5,149 +5,6 @@
namespace urde
{
CAiFuncMap::CAiFuncMap()
{
/* Ai States */
x0_stateFuncs["Patrol"] = &CAi::Patrol;
x0_stateFuncs["FollowPattern"] = &CAi::FollowPattern;
x0_stateFuncs["Dead"] = &CAi::Dead;
x0_stateFuncs["PathFind"] = &CAi::PathFind;
x0_stateFuncs["Start"] = &CAi::Start;
x0_stateFuncs["SelectTarget"] = &CAi::SelectTarget;
x0_stateFuncs["TargetPatrol"] = &CAi::TargetPatrol;
x0_stateFuncs["TargetPlayer"] = &CAi::TargetPlayer;
x0_stateFuncs["TargetCover"] = &CAi::TargetCover;
x0_stateFuncs["Halt"] = &CAi::Halt;
x0_stateFuncs["Walk"] = &CAi::Walk;
x0_stateFuncs["Run"] = &CAi::Run;
x0_stateFuncs["Generate"] = &CAi::Generate;
x0_stateFuncs["Deactivate"] = &CAi::Deactivate;
x0_stateFuncs["Attack"] = &CAi::Attack;
x0_stateFuncs["LoopedAttack"] = &CAi::LoopedAttack;
x0_stateFuncs["JumpBack"] = &CAi::JumpBack;
x0_stateFuncs["DoubleSnap"] = &CAi::DoubleSnap;
x0_stateFuncs["Shuffle"] = &CAi::Shuffle;
x0_stateFuncs["TurnAround"] = &CAi::TurnAround;
x0_stateFuncs["Skid"] = &CAi::Skid;
x0_stateFuncs["Active"] = &CAi::Active;
x0_stateFuncs["InActive"] = &CAi::InActive;
x0_stateFuncs["CoverAttack"] = &CAi::CoverAttack;
x0_stateFuncs["Crouch"] = &CAi::Crouch;
x0_stateFuncs["FadeIn"] = &CAi::FadeIn;
x0_stateFuncs["FadeOut"] = &CAi::FadeOut;
x0_stateFuncs["GetUp"] = &CAi::GetUp;
x0_stateFuncs["Taunt"] = &CAi::Taunt;
x0_stateFuncs["Suck"] = &CAi::Suck;
x0_stateFuncs["Flee"] = &CAi::Flee;
x0_stateFuncs["Lurk"] = &CAi::Lurk;
x0_stateFuncs["ProjectileAttack"] = &CAi::ProjectileAttack;
x0_stateFuncs["Flinch"] = &CAi::Flinch;
x0_stateFuncs["Hurled"] = &CAi::Hurled;
x0_stateFuncs["TelegraphAttack"] = &CAi::TelegraphAttack;
x0_stateFuncs["Jump"] = &CAi::Jump;
x0_stateFuncs["Explode"] = &CAi::Explode;
x0_stateFuncs["Dodge"] = &CAi::Dodge;
x0_stateFuncs["Retreat"] = &CAi::Retreat;
x0_stateFuncs["Cover"] = &CAi::Cover;
x0_stateFuncs["Approach"] = &CAi::Approach;
x0_stateFuncs["WallHang"] = &CAi::WallHang;
x0_stateFuncs["WallDetach"] = &CAi::WallDetach;
x0_stateFuncs["Enraged"] = &CAi::Enraged;
x0_stateFuncs["SpecialAttack"] = &CAi::SpecialAttack;
x0_stateFuncs["Growth"] = &CAi::Growth;
x0_stateFuncs["Faint"] = &CAi::Faint;
x0_stateFuncs["Land"] = &CAi::Land;
x0_stateFuncs["Bounce"] = &CAi::Bounce;
x0_stateFuncs["PathFindEx"] = &CAi::PathFindEx;
x0_stateFuncs["Dizzy"] = &CAi::Dizzy;
x0_stateFuncs["CallForBackup"] = &CAi::CallForBackup;
x0_stateFuncs["BulbAttack"] = &CAi::BulbAttack;
x0_stateFuncs["PodAttack"] = &CAi::PodAttack;
/* Ai Triggers */
x10_triggerFuncs["InAttackPosition"] = &CAi::InAttackPosition;
x10_triggerFuncs["Leash"] = &CAi::Leash;
x10_triggerFuncs["OffLine"] = &CAi::OffLine;
x10_triggerFuncs["Attacked"] = &CAi::Attacked;
x10_triggerFuncs["PathShagged"] = &CAi::PathShagged;
x10_triggerFuncs["TooClose"] = &CAi::TooClose;
x10_triggerFuncs["InRange"] = &CAi::InRange;
x10_triggerFuncs["InMaxRange"] = &CAi::InMaxRange;
x10_triggerFuncs["InDetectionRange"] = &CAi::InDetectionRange;
x10_triggerFuncs["SpotPlayer"] = &CAi::SpotPlayer;
x10_triggerFuncs["PlayerSpot"] = &CAi::PlayerSpot;
x10_triggerFuncs["PatternOver"] = &CAi::PatternOver;
x10_triggerFuncs["PatternShagged"] = &CAi::PatternShagged;
x10_triggerFuncs["HasAttackPattern"] = &CAi::HasAttackPattern;
x10_triggerFuncs["HasPatrolPath"] = &CAi::HasPatrolPath;
x10_triggerFuncs["HasRetreatPattern"] = &CAi::HasRetreatPattern;
x10_triggerFuncs["Delay"] = &CAi::Delay;
x10_triggerFuncs["RandomDelay"] = &CAi::RandomDelay;
x10_triggerFuncs["FixedDelay"] = &CAi::FixedDelay;
x10_triggerFuncs["Default"] = &CAi::Default;
x10_triggerFuncs["AnimOver"] = &CAi::AnimOver;
x10_triggerFuncs["ShouldAttack"] = &CAi::ShouldAttack;
x10_triggerFuncs["ShouldDoubleSnap"] = &CAi::ShouldDoubleSnap;
x10_triggerFuncs["InPosition"] = &CAi::InPosition;
x10_triggerFuncs["ShouldTurn"] = &CAi::ShouldTurn;
x10_triggerFuncs["HitSomething"] = &CAi::HitSomething;
x10_triggerFuncs["ShouldJumpBack"] = &CAi::ShouldJumpBack;
x10_triggerFuncs["Stuck"] = &CAi::Stuck;
x10_triggerFuncs["NoPathNodes"] = &CAi::NoPathNodes;
x10_triggerFuncs["Landed"] = &CAi::Landed;
x10_triggerFuncs["HearShot"] = &CAi::HearShot;
x10_triggerFuncs["HearPlayer"] = &CAi::HearPlayer;
x10_triggerFuncs["CoverCheck"] = &CAi::CoverCheck;
x10_triggerFuncs["CoverFind"] = &CAi::CoverFind;
x10_triggerFuncs["CoverBlown"] = &CAi::CoverBlown;
x10_triggerFuncs["CoverNearlyBlown"] = &CAi::CoverNearlyBlown;
x10_triggerFuncs["CoveringFire"] = &CAi::CoveringFire;
x10_triggerFuncs["GotUp"] = &CAi::GotUp;
x10_triggerFuncs["LineOfSight"] = &CAi::LineOfSight;
x10_triggerFuncs["AggressionCheck"] = &CAi::AggressionCheck;
x10_triggerFuncs["AttackOver"] = &CAi::AttackOver;
x10_triggerFuncs["ShouldTaunt"] = &CAi::ShouldTaunt;
x10_triggerFuncs["Inside"] = &CAi::Inside;
x10_triggerFuncs["ShouldFire"] = &CAi::ShouldFire;
x10_triggerFuncs["ShouldFlinch"] = &CAi::ShouldFlinch;
x10_triggerFuncs["PatrolPathOver"] = &CAi::PatrolPathOver;
x10_triggerFuncs["ShouldDodge"] = &CAi::ShouldDodge;
x10_triggerFuncs["ShouldRetreat"] = &CAi::ShouldRetreat;
x10_triggerFuncs["ShouldCrouch"] = &CAi::ShouldCrouch;
x10_triggerFuncs["ShouldMove"] = &CAi::ShouldMove;
x10_triggerFuncs["ShotAt"] = &CAi::ShotAt;
x10_triggerFuncs["HasTargetingPoint"] = &CAi::HasTargetingPoint;
x10_triggerFuncs["ShouldWallHang"] = &CAi::ShouldWallHang;
x10_triggerFuncs["SetAIStage"] = &CAi::SetAIStage;
x10_triggerFuncs["AIStage"] = &CAi::AIStage;
x10_triggerFuncs["StartAttack"] = &CAi::StartAttack;
x10_triggerFuncs["BreakAttack"] = &CAi::BreakAttack;
x10_triggerFuncs["ShouldStrafe"] = &CAi::ShouldStrafe;
x10_triggerFuncs["ShouldSpecialAttack"] = &CAi::ShouldSpecialAttack;
x10_triggerFuncs["LostInterest"] = &CAi::LostInterest;
x10_triggerFuncs["CodeTrigger"] = &CAi::CodeTrigger;
x10_triggerFuncs["BounceFind"] = &CAi::BounceFind;
x10_triggerFuncs["Random"] = &CAi::Random;
x10_triggerFuncs["FixedRandom"] = &CAi::FixedRandom;
x10_triggerFuncs["IsDizzy"] = &CAi::IsDizzy;
x10_triggerFuncs["ShouldCallForBackup"] = &CAi::ShouldCallForBackup;
CAi::CreateFuncLookup(this);
}
CAiStateFunc CAiFuncMap::GetStateFunc(const char* func)
{
if (x0_stateFuncs.find(func) == x0_stateFuncs.end())
return nullptr;
return x0_stateFuncs[func];
}
CAiTriggerFunc CAiFuncMap::GetTriggerFunc(const char* func)
{
if (x10_triggerFuncs.find(func) == x10_triggerFuncs.end())
return nullptr;
return x10_triggerFuncs[func];
}
static CMaterialList MakeAiMaterialList(const CMaterialList& in)
{
CMaterialList ret = in;
@ -157,10 +14,10 @@ static CMaterialList MakeAiMaterialList(const CMaterialList& in)
}
CAi::CAi(TUniqueId uid, bool active, const std::string& name, const CEntityInfo& info, const zeus::CTransform& xf,
CModelData&& mData, const zeus::CAABox& box, float f1, const CHealthInfo& hInfo, const CDamageVulnerability& dmgVuln,
const CMaterialList& list, ResId, const CActorParameters& actorParams, float f2, float f3)
: CPhysicsActor(uid, active, name, info, xf, std::move(mData), MakeAiMaterialList(list), box, SMoverData(f1), actorParams,
f2, f3),
CModelData&& mData, const zeus::CAABox& box, float mass, const CHealthInfo& hInfo, const CDamageVulnerability& dmgVuln,
const CMaterialList& list, ResId, const CActorParameters& actorParams, float f1, float f2)
: CPhysicsActor(uid, active, name, info, xf, std::move(mData), MakeAiMaterialList(list), box, SMoverData(mass), actorParams,
f1, f2),
x258_healthInfo(hInfo),
x260_damageVulnerability(dmgVuln)
{

View File

@ -8,37 +8,18 @@
#include "CPhysicsActor.hpp"
#include "CDamageVulnerability.hpp"
#include "CHealthInfo.hpp"
#include "CStateMachine.hpp"
#include "zeus/zeus.hpp"
namespace urde
{
/* TODO: Figure out what all this is for and move it somewhere appropriate */
enum class EStateMsg
{
};
enum class EListenNoiseType
{
};
class CAi;
class CStateMachine;
typedef void (CAi::*CAiStateFunc)(CStateManager&, EStateMsg, float);
typedef bool (CAi::*CAiTriggerFunc)(CStateManager&, float);
class CAiFuncMap
{
std::map<const char*, CAiStateFunc> x0_stateFuncs;
std::map<const char*, CAiTriggerFunc> x10_triggerFuncs;
public:
CAiFuncMap();
CAiStateFunc GetStateFunc(const char*);
CAiTriggerFunc GetTriggerFunc(const char*);
};
class CAiFuncMap;
class CStateManager;
class CAi : public CPhysicsActor
{
@ -49,20 +30,21 @@ class CAi : public CPhysicsActor
public:
CAi(TUniqueId uid, bool active, const std::string& name, const CEntityInfo& info, const zeus::CTransform& xf,
CModelData&& mData, const zeus::CAABox& box, float f1, const CHealthInfo& hInfo, const CDamageVulnerability&,
const CMaterialList& list, ResId, const CActorParameters&, float f2, float f3);
CModelData&& mData, const zeus::CAABox& box, float mass, const CHealthInfo& hInfo, const CDamageVulnerability&,
const CMaterialList& list, ResId, const CActorParameters&, float f1, float f2);
static void CreateFuncLookup(CAiFuncMap* funcMap);
CAiStateFunc GetStateFunc(const char* func);
CAiTriggerFunc GetTrigerFunc(const char* func);
static CAiStateFunc GetStateFunc(const char* func);
static CAiTriggerFunc GetTrigerFunc(const char* func);
void GetStateMachine() {}
virtual void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) {}
virtual CHealthInfo HealthInfo(CStateManager&) { return x258_healthInfo; }
virtual CHealthInfo GetHealthInfo(const CStateManager&) { return x258_healthInfo; }
virtual void Death(const zeus::CVector3f&, CStateManager&)=0;
virtual void KnockBack(const zeus::CVector3f&, CStateManager&)=0;
virtual CDamageVulnerability GetDamageVulnerability() { return x260_damageVulnerability; }
virtual void TakeDamage(const zeus::CVector3f&, float) {}
virtual bool CanBeShot(const CStateManager&, int) { return true; }
virtual bool IsListening() { return false; }

View File

@ -0,0 +1,150 @@
#include "CAiFuncMap.hpp"
#include "CAi.hpp"
#include "CStateManager.hpp"
namespace urde
{
CAiFuncMap::CAiFuncMap()
{
/* Ai States */
x0_stateFuncs["Patrol"] = &CAi::Patrol;
x0_stateFuncs["FollowPattern"] = &CAi::FollowPattern;
x0_stateFuncs["Dead"] = &CAi::Dead;
x0_stateFuncs["PathFind"] = &CAi::PathFind;
x0_stateFuncs["Start"] = &CAi::Start;
x0_stateFuncs["SelectTarget"] = &CAi::SelectTarget;
x0_stateFuncs["TargetPatrol"] = &CAi::TargetPatrol;
x0_stateFuncs["TargetPlayer"] = &CAi::TargetPlayer;
x0_stateFuncs["TargetCover"] = &CAi::TargetCover;
x0_stateFuncs["Halt"] = &CAi::Halt;
x0_stateFuncs["Walk"] = &CAi::Walk;
x0_stateFuncs["Run"] = &CAi::Run;
x0_stateFuncs["Generate"] = &CAi::Generate;
x0_stateFuncs["Deactivate"] = &CAi::Deactivate;
x0_stateFuncs["Attack"] = &CAi::Attack;
x0_stateFuncs["LoopedAttack"] = &CAi::LoopedAttack;
x0_stateFuncs["JumpBack"] = &CAi::JumpBack;
x0_stateFuncs["DoubleSnap"] = &CAi::DoubleSnap;
x0_stateFuncs["Shuffle"] = &CAi::Shuffle;
x0_stateFuncs["TurnAround"] = &CAi::TurnAround;
x0_stateFuncs["Skid"] = &CAi::Skid;
x0_stateFuncs["Active"] = &CAi::Active;
x0_stateFuncs["InActive"] = &CAi::InActive;
x0_stateFuncs["CoverAttack"] = &CAi::CoverAttack;
x0_stateFuncs["Crouch"] = &CAi::Crouch;
x0_stateFuncs["FadeIn"] = &CAi::FadeIn;
x0_stateFuncs["FadeOut"] = &CAi::FadeOut;
x0_stateFuncs["GetUp"] = &CAi::GetUp;
x0_stateFuncs["Taunt"] = &CAi::Taunt;
x0_stateFuncs["Suck"] = &CAi::Suck;
x0_stateFuncs["Flee"] = &CAi::Flee;
x0_stateFuncs["Lurk"] = &CAi::Lurk;
x0_stateFuncs["ProjectileAttack"] = &CAi::ProjectileAttack;
x0_stateFuncs["Flinch"] = &CAi::Flinch;
x0_stateFuncs["Hurled"] = &CAi::Hurled;
x0_stateFuncs["TelegraphAttack"] = &CAi::TelegraphAttack;
x0_stateFuncs["Jump"] = &CAi::Jump;
x0_stateFuncs["Explode"] = &CAi::Explode;
x0_stateFuncs["Dodge"] = &CAi::Dodge;
x0_stateFuncs["Retreat"] = &CAi::Retreat;
x0_stateFuncs["Cover"] = &CAi::Cover;
x0_stateFuncs["Approach"] = &CAi::Approach;
x0_stateFuncs["WallHang"] = &CAi::WallHang;
x0_stateFuncs["WallDetach"] = &CAi::WallDetach;
x0_stateFuncs["Enraged"] = &CAi::Enraged;
x0_stateFuncs["SpecialAttack"] = &CAi::SpecialAttack;
x0_stateFuncs["Growth"] = &CAi::Growth;
x0_stateFuncs["Faint"] = &CAi::Faint;
x0_stateFuncs["Land"] = &CAi::Land;
x0_stateFuncs["Bounce"] = &CAi::Bounce;
x0_stateFuncs["PathFindEx"] = &CAi::PathFindEx;
x0_stateFuncs["Dizzy"] = &CAi::Dizzy;
x0_stateFuncs["CallForBackup"] = &CAi::CallForBackup;
x0_stateFuncs["BulbAttack"] = &CAi::BulbAttack;
x0_stateFuncs["PodAttack"] = &CAi::PodAttack;
/* Ai Triggers */
x10_triggerFuncs["InAttackPosition"] = &CAi::InAttackPosition;
x10_triggerFuncs["Leash"] = &CAi::Leash;
x10_triggerFuncs["OffLine"] = &CAi::OffLine;
x10_triggerFuncs["Attacked"] = &CAi::Attacked;
x10_triggerFuncs["PathShagged"] = &CAi::PathShagged;
x10_triggerFuncs["TooClose"] = &CAi::TooClose;
x10_triggerFuncs["InRange"] = &CAi::InRange;
x10_triggerFuncs["InMaxRange"] = &CAi::InMaxRange;
x10_triggerFuncs["InDetectionRange"] = &CAi::InDetectionRange;
x10_triggerFuncs["SpotPlayer"] = &CAi::SpotPlayer;
x10_triggerFuncs["PlayerSpot"] = &CAi::PlayerSpot;
x10_triggerFuncs["PatternOver"] = &CAi::PatternOver;
x10_triggerFuncs["PatternShagged"] = &CAi::PatternShagged;
x10_triggerFuncs["HasAttackPattern"] = &CAi::HasAttackPattern;
x10_triggerFuncs["HasPatrolPath"] = &CAi::HasPatrolPath;
x10_triggerFuncs["HasRetreatPattern"] = &CAi::HasRetreatPattern;
x10_triggerFuncs["Delay"] = &CAi::Delay;
x10_triggerFuncs["RandomDelay"] = &CAi::RandomDelay;
x10_triggerFuncs["FixedDelay"] = &CAi::FixedDelay;
x10_triggerFuncs["Default"] = &CAi::Default;
x10_triggerFuncs["AnimOver"] = &CAi::AnimOver;
x10_triggerFuncs["ShouldAttack"] = &CAi::ShouldAttack;
x10_triggerFuncs["ShouldDoubleSnap"] = &CAi::ShouldDoubleSnap;
x10_triggerFuncs["InPosition"] = &CAi::InPosition;
x10_triggerFuncs["ShouldTurn"] = &CAi::ShouldTurn;
x10_triggerFuncs["HitSomething"] = &CAi::HitSomething;
x10_triggerFuncs["ShouldJumpBack"] = &CAi::ShouldJumpBack;
x10_triggerFuncs["Stuck"] = &CAi::Stuck;
x10_triggerFuncs["NoPathNodes"] = &CAi::NoPathNodes;
x10_triggerFuncs["Landed"] = &CAi::Landed;
x10_triggerFuncs["HearShot"] = &CAi::HearShot;
x10_triggerFuncs["HearPlayer"] = &CAi::HearPlayer;
x10_triggerFuncs["CoverCheck"] = &CAi::CoverCheck;
x10_triggerFuncs["CoverFind"] = &CAi::CoverFind;
x10_triggerFuncs["CoverBlown"] = &CAi::CoverBlown;
x10_triggerFuncs["CoverNearlyBlown"] = &CAi::CoverNearlyBlown;
x10_triggerFuncs["CoveringFire"] = &CAi::CoveringFire;
x10_triggerFuncs["GotUp"] = &CAi::GotUp;
x10_triggerFuncs["LineOfSight"] = &CAi::LineOfSight;
x10_triggerFuncs["AggressionCheck"] = &CAi::AggressionCheck;
x10_triggerFuncs["AttackOver"] = &CAi::AttackOver;
x10_triggerFuncs["ShouldTaunt"] = &CAi::ShouldTaunt;
x10_triggerFuncs["Inside"] = &CAi::Inside;
x10_triggerFuncs["ShouldFire"] = &CAi::ShouldFire;
x10_triggerFuncs["ShouldFlinch"] = &CAi::ShouldFlinch;
x10_triggerFuncs["PatrolPathOver"] = &CAi::PatrolPathOver;
x10_triggerFuncs["ShouldDodge"] = &CAi::ShouldDodge;
x10_triggerFuncs["ShouldRetreat"] = &CAi::ShouldRetreat;
x10_triggerFuncs["ShouldCrouch"] = &CAi::ShouldCrouch;
x10_triggerFuncs["ShouldMove"] = &CAi::ShouldMove;
x10_triggerFuncs["ShotAt"] = &CAi::ShotAt;
x10_triggerFuncs["HasTargetingPoint"] = &CAi::HasTargetingPoint;
x10_triggerFuncs["ShouldWallHang"] = &CAi::ShouldWallHang;
x10_triggerFuncs["SetAIStage"] = &CAi::SetAIStage;
x10_triggerFuncs["AIStage"] = &CAi::AIStage;
x10_triggerFuncs["StartAttack"] = &CAi::StartAttack;
x10_triggerFuncs["BreakAttack"] = &CAi::BreakAttack;
x10_triggerFuncs["ShouldStrafe"] = &CAi::ShouldStrafe;
x10_triggerFuncs["ShouldSpecialAttack"] = &CAi::ShouldSpecialAttack;
x10_triggerFuncs["LostInterest"] = &CAi::LostInterest;
x10_triggerFuncs["CodeTrigger"] = &CAi::CodeTrigger;
x10_triggerFuncs["BounceFind"] = &CAi::BounceFind;
x10_triggerFuncs["Random"] = &CAi::Random;
x10_triggerFuncs["FixedRandom"] = &CAi::FixedRandom;
x10_triggerFuncs["IsDizzy"] = &CAi::IsDizzy;
x10_triggerFuncs["ShouldCallForBackup"] = &CAi::ShouldCallForBackup;
CAi::CreateFuncLookup(this);
}
CAiStateFunc CAiFuncMap::GetStateFunc(const char* func)
{
if (x0_stateFuncs.find(func) == x0_stateFuncs.end())
return nullptr;
return x0_stateFuncs[func];
}
CAiTriggerFunc CAiFuncMap::GetTriggerFunc(const char* func)
{
if (x10_triggerFuncs.find(func) == x10_triggerFuncs.end())
return nullptr;
return x10_triggerFuncs[func];
}
}

View File

@ -0,0 +1,28 @@
#ifndef __URDE_CAIFUNCMAP_HPP__
#define __URDE_CAIFUNCMAP_HPP__
#include "RetroTypes.hpp"
namespace urde
{
enum class EStateMsg
{
One,
};
class CStateManager;
class CAi;
typedef void (CAi::*CAiStateFunc)(CStateManager&, EStateMsg, float);
typedef bool (CAi::*CAiTriggerFunc)(CStateManager&, float);
class CAiFuncMap
{
std::map<const char*, CAiStateFunc> x0_stateFuncs;
std::map<const char*, CAiTriggerFunc> x10_triggerFuncs;
public:
CAiFuncMap();
CAiStateFunc GetStateFunc(const char*);
CAiTriggerFunc GetTriggerFunc(const char*);
};
}
#endif // __URDE_CAIFUNCMAP_HPP__

View File

@ -9,9 +9,10 @@ namespace urde
class CAnimationParameters
{
public:
ResId x0_ancs;
s32 x4_charIdx;
u32 x8_defaultAnim;
ResId x0_ancs = -1;
s32 x4_charIdx = -1;
u32 x8_defaultAnim = -1;
CAnimationParameters() = default;
CAnimationParameters(ResId ancs, s32 charIdx, u32 defaultAnim)
: x0_ancs(ancs), x4_charIdx(charIdx), x8_defaultAnim(defaultAnim) {}
CAnimationParameters(CInputStream& in)

View File

@ -26,6 +26,7 @@ class CDamageInfo
float x14_knockback;
bool x18_ = false;
public:
CDamageInfo() = default;
CDamageInfo(CInputStream& in)
{
in.readUint32Big();

View File

@ -7,7 +7,6 @@
namespace urde
{
class CStateManager;
class IVisitor;
struct SConnection
{
@ -54,7 +53,6 @@ public:
static const std::vector<SConnection> NullConnectionList;
virtual ~CEntity() {}
CEntity(TUniqueId uid, const CEntityInfo& info, bool active, const std::string& name);
virtual void Accept(IVisitor&)=0;
virtual void PreThink(float, CStateManager&) {}
virtual void Think(float, CStateManager&) {}
virtual void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr);

View File

@ -3,6 +3,8 @@ set(WORLD_SOURCES
IGameArea.hpp IGameArea.cpp
CGameArea.hpp CGameArea.cpp
CAi.hpp CAi.cpp
CAiFuncMap.hpp CAiFuncMap.cpp
CPatterned.hpp CPatterned.cpp
CPathFindArea.hpp CPathFindArea.cpp
CAreaOctTree.hpp CAreaOctTree.cpp
CActor.hpp CActor.cpp
@ -30,6 +32,7 @@ set(WORLD_SOURCES
CScriptGrapplePoint.hpp CScriptGrapplePoint.cpp
CScriptAreaAttributes.hpp CScriptAreaAttributes.cpp
CScriptCameraWaypoint.hpp CScriptCameraWaypoint.cpp
CScriptCoverPoint.hpp CScriptCoverPoint.cpp
CGrappleParameters.hpp
CActorParameters.hpp
CLightParameters.hpp

View File

@ -4,19 +4,26 @@
namespace urde
{
CMaterialList gkPatternedGroundMaterialList;
CMaterialList gkPatternedFlyerMaterialList;
CMaterialList gkPatternedGroundMaterialList(EMaterialTypes::ThirtyThree,
EMaterialTypes::Nineteen,
EMaterialTypes::FourtyOne,
EMaterialTypes::ThirtySeven,
EMaterialTypes::Fourty);
CMaterialList gkPatternedFlyerMaterialList(EMaterialTypes::ThirtyThree,
EMaterialTypes::Nineteen,
EMaterialTypes::FourtyOne,
EMaterialTypes::Fourty);
CPatterned::CPatterned(EUnknown, TUniqueId uid, const std::string& name, EFlavorType, const CEntityInfo& info,
const zeus::CTransform& xf, CModelData&& mData,
const CPatternedInfo& pInfo, EMovementType, EColliderType colType,
EBodyType, const CActorParameters& actParms)
: CAi(uid, pInfo.xf8_active, name, info, xf, std::move(mData),
CPatterned::CPatterned(EUnknown, TUniqueId uid, const std::string& name, CPatterned::EFlavorType flavor,
const CEntityInfo& info, const zeus::CTransform& xf, CModelData&& mData,
const CPatternedInfo& pInfo, CPatterned::EMovementType moveType, CPatterned::EColliderType,
EBodyType, const CActorParameters& actorParms, u32)
: CAi(uid, pInfo.xf8_active, name, info, xf, std::move(mData),
zeus::CAABox(pInfo.xcc_bodyOrigin - zeus::CVector3f{pInfo.xc4_halfExtent, pInfo.xc4_halfExtent, 0.f},
pInfo.xcc_bodyOrigin + zeus::CVector3f{pInfo.xc4_halfExtent, pInfo.xc4_halfExtent, pInfo.xc8_height}),
pInfo.x0_mass, pInfo.x54_healthInfo, pInfo.x5c_damageVulnerability,
colType == EColliderType::Flyer ? gkPatternedFlyerMaterialList : gkPatternedGroundMaterialList,
pInfo.xfc_stateMachineId, actParms, pInfo.xd8_, 0.8f)
moveType == EMovementType::Flyer ? gkPatternedFlyerMaterialList : gkPatternedGroundMaterialList,
pInfo.xfc_stateMachineId, actorParms, pInfo.xd8_, 0.8f)
{
}

View File

@ -9,7 +9,8 @@ class CPatternedInfo;
enum class EBodyType
{
Two = 2
Two = 2,
Three
};
class CPatterned : public CAi
@ -17,29 +18,33 @@ class CPatterned : public CAi
public:
enum class EUnknown
{
TwentyThree = 23
TwentyThree = 23,
ThirtyNine
};
enum class EFlavorType
{
Zero = 0
};
enum class EMovementType
{
One = 1
};
enum class EColliderType
{
Ground = 0,
Flyer = 1
};
enum class EColliderType
{
One = 1
};
private:
public:
CPatterned(EUnknown, TUniqueId, const std::string& name, EFlavorType, const CEntityInfo& info,
const zeus::CTransform& xf, CModelData&& mData,
const CPatternedInfo& pInfo, EMovementType, EColliderType,
EBodyType, const CActorParameters& actParms);
};
CPatterned(EUnknown unk, TUniqueId uid, const std::string& name, EFlavorType flavor,
const CEntityInfo& info, const zeus::CTransform& xf, CModelData&& mData,
const CPatternedInfo& pinfo, CPatterned::EMovementType movement, EColliderType collider,
EBodyType body, const CActorParameters& params, u32 w1);
virtual void Death(const zeus::CVector3f& , CStateManager& ) {}
virtual void KnockBack(const zeus::CVector3f &, CStateManager &) {}
};
}
#endif // __URDE_CPATTERNED_HPP__
#endif // CPATTERNED_HPP

View File

@ -21,8 +21,6 @@ public:
float envFxDensity, float thermalHeat, float xrayFogDistance,
float worldLightingLevel, ResId skybox, EPhazonType phazonType);
void Accept(IVisitor&) {}
};
}

View File

@ -9,6 +9,4 @@ CScriptCounter::CScriptCounter(TUniqueId uid, const std::string& name, const CEn
{
}
void CScriptCounter::Accept(IVisitor&) {}
}

View File

@ -11,7 +11,6 @@ class CScriptCounter : public CEntity
public:
CScriptCounter(TUniqueId, const std::string& name, const CEntityInfo& info,
u32, u32, bool, bool);
virtual void Accept(IVisitor&);
};
}

View File

@ -0,0 +1,134 @@
#include "CScriptCoverPoint.hpp"
#include "CActorParameters.hpp"
#include "CStateManager.hpp"
namespace urde
{
CScriptCoverPoint::CScriptCoverPoint(TUniqueId uid, const std::string &name, const CEntityInfo &info,
zeus::CTransform xf, bool active, u32 flags, bool crouch, float horizontalAngle, float verticalAngle, float coverTime)
: CActor(uid, active, name, info, xf, CModelData::CModelDataNull(),
CMaterialList(EMaterialTypes::Zero), CActorParameters::None(), kInvalidUniqueId),
xe8_flags(flags),
xf4_coverTime(coverTime),
xf8_24_crouch(crouch)
{
xec_cosHorizontalAngle = std::cos(zeus::degToRad(horizontalAngle) * 0.5f);
xf0_sinVerticalAngle = std::sin(zeus::degToRad(verticalAngle) * 0.5f);
zeus::CMatrix4f mtx = xf.toMatrix4f().transposed();
x100_touchBounds.emplace(zeus::CAABox({mtx.vec[1].x, mtx.vec[2].y, mtx.vec[3].z},
{mtx.vec[1].x, mtx.vec[2].y, mtx.vec[3].z}));
}
void CScriptCoverPoint::Think(float delta, CStateManager&)
{
if (x11c_timeLeft <= 0.f)
return;
x11c_timeLeft -= delta;
}
const zeus::CAABox* CScriptCoverPoint::GetTouchBounds() const
{
if (x100_touchBounds)
return &x100_touchBounds.value();
return nullptr;
}
void CScriptCoverPoint::SetInUse(bool inUse)
{
xf8_25_inUse = inUse;
if (inUse)
x11c_timeLeft = xf4_coverTime;
}
bool CScriptCoverPoint::GetInUse(TUniqueId uid) const
{
if (xf8_25_inUse || x11c_timeLeft > 0.f)
return true;
if (xfa_occupant == kInvalidUniqueId || uid == kInvalidUniqueId || xfa_occupant == uid)
return false;
return true;
}
bool CScriptCoverPoint::Blown(const zeus::CVector3f& point) const
{
if (!x30_24_active)
return true;
if (ShouldWallHang())
{
zeus::CMatrix4f mtx = x34_transform.toMatrix4f().transposed();
zeus::CVector3f posDif = point - zeus::CVector3f(mtx.vec[1].x, mtx.vec[2].y, mtx.vec[3].z);
posDif *= (1.0 / posDif.magnitude());
zeus::CVector3f normDif = posDif.normalized();
/* zeus::CVector3f unkVec(mtx.vec[0].y, mtx.vec[1].z, mtx.vec[3].x); */
zeus::CVector3f unkVec2(mtx.vec[1].z, mtx.vec[0].y, 0.f);
unkVec2.normalize();
if (unkVec2.dot(normDif) <= GetCosHorizontalAngle() || (posDif.z * posDif.z) >= GetSinSqVerticalAngle())
return true;
}
return false;
}
float CScriptCoverPoint::GetSinSqVerticalAngle() const
{
return xf0_sinVerticalAngle * xf0_sinVerticalAngle;
}
float CScriptCoverPoint::GetCosHorizontalAngle() const
{
return xec_cosHorizontalAngle;
}
bool CScriptCoverPoint::ShouldLandHere() const
{
return xe8_26_landHere;
}
bool CScriptCoverPoint::ShouldWallHang() const
{
return xe8_27_wallHang;
}
bool CScriptCoverPoint::ShouldStay() const
{
return xe8_28_stay;
}
bool CScriptCoverPoint::ShouldCrouch() const
{
return xf8_24_crouch;
}
u32 CScriptCoverPoint::GetAttackDirection() const
{
return xe8_flags;
}
void CScriptCoverPoint::Reserve(TUniqueId id)
{
xfa_occupant = id;
}
void CScriptCoverPoint::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr)
{
CActor::AcceptScriptMsg(msg, uid, mgr);
if (msg == EScriptObjectMessage::UNKM4)
{
for (const SConnection& con : x20_conns)
if (con.x0_state == EScriptObjectState::Retreat)
{
xfc_ = mgr.GetIdForScript(con.x8_objId);
break;
}
}
}
}

View File

@ -0,0 +1,60 @@
#ifndef CSCRIPTCOVERPOINT_HPP
#define CSCRIPTCOVERPOINT_HPP
#include "CActor.hpp"
namespace urde
{
class CScriptCoverPoint : public CActor
{
union
{
struct
{
bool xe8_26_landHere : 1;
bool xe8_27_wallHang : 1;
bool xe8_28_stay : 1;
};
u32 xe8_flags;
};
float xec_cosHorizontalAngle;
float xf0_sinVerticalAngle;
float xf4_coverTime;
union
{
struct
{
bool xf8_24_crouch : 1;
bool xf8_25_inUse : 1;
};
u32 xf8_flags = 0;
};
TUniqueId xfa_occupant = kInvalidUniqueId;
TUniqueId xfc_ = kInvalidUniqueId;
std::experimental::optional<zeus::CAABox> x100_touchBounds;
float x11c_timeLeft = 0.f;
public:
CScriptCoverPoint(TUniqueId uid, const std::string& name, const CEntityInfo& info,
zeus::CTransform xf, bool active, u32 flags, bool crouch, float horizontalAngle, float verticalAngle, float coverTime);
void Think(float, CStateManager &);
void AddToRenderer(const zeus::CFrustum &, CStateManager &) {}
void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager &);
void Render(CStateManager &) {}
const zeus::CAABox* GetTouchBounds() const;
void SetInUse(bool inUse);
bool GetInUse(TUniqueId uid) const;
bool ShouldLandHere() const;
bool ShouldWallHang() const;
bool ShouldStay() const;
bool ShouldCrouch() const;
bool Blown(const zeus::CVector3f& pos) const;
float GetSinSqVerticalAngle() const;
float GetCosHorizontalAngle() const;
u32 GetAttackDirection() const;
void Reserve(TUniqueId id);
};
}
#endif // CSCRIPTCOVERPOINT_HPP

View File

@ -59,7 +59,7 @@ public:
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr);
void Think(float, CStateManager& mgr);
void AddToRenderer(const zeus::CFrustum&, CStateManager& mgr);
zeus::CAABox GetTouchBounds() const {}
const zeus::CAABox* GetTouchBounds() const { return nullptr; }
void Render(const CStateManager&) {}
void ForceClosed(CStateManager&);
bool IsConnectedToArea(const CStateManager& mgr, TAreaId area);

View File

@ -8,7 +8,4 @@ CScriptGenerator::CScriptGenerator(TUniqueId uid, const std::string& name, const
: CEntity(uid, info, active, name)
{
}
void CScriptGenerator::Accept(IVisitor&) {}
}

View File

@ -12,7 +12,6 @@ class CScriptGenerator : public CEntity
public:
CScriptGenerator(TUniqueId uid, const std::string& name, const CEntityInfo& info,
u32, bool, const zeus::CVector3f&, bool, bool, float, float);
virtual void Accept(IVisitor&);
};
}

View File

@ -9,6 +9,4 @@ CScriptTimer::CScriptTimer(TUniqueId uid, const std::string& name, const CEntity
{
}
void CScriptTimer::Accept(IVisitor&) {}
}

View File

@ -11,7 +11,6 @@ class CScriptTimer : public CEntity
public:
CScriptTimer(TUniqueId, const std::string& name, const CEntityInfo& info,
float, float, bool, bool, bool);
virtual void Accept(IVisitor&);
};
}

View File

@ -0,0 +1,9 @@
#include "CStateMachine.hpp"
#include "CAi.hpp"
namespace urde
{
CStateMachine::CStateMachine(CInputStream& in)
{
}
}

View File

@ -0,0 +1,103 @@
#ifndef CSTATEMACHINE_HPP
#define CSTATEMACHINE_HPP
#include "RetroTypes.hpp"
#include "CAiFuncMap.hpp"
namespace urde
{
class CAiState;
class CStateManager;
class CAiTrigger
{
float xc_ = 0.f;
u32 x10_;
bool x18_;
public:
CAiTrigger() = default;
bool GetAnd();
void GetState();
bool CallFunc(CStateManager&, CAi&)
{
return false;
}
void Setup(CAiTriggerFunc func, bool, float, CAiTrigger*);
void Setup(CAiTriggerFunc func, bool, float, CAiState*);
};
class CAiState
{
CAiStateFunc x0_func;
const char* x4_name;
u32 x8_;
u32 xc_;
u32 x10_;
u32 x14_;
u32 x18_;
u32 x1c_;
u32 x20_;
u32 x24_;
u32 x28_;
u32 x2c_;
u32 x30_;
public:
CAiState(CAiStateFunc func, const char* name)
{}
u32 GetNumTriggers() const;
CAiTrigger& GetTrig(s32) const;
const char* GetName() const;
void SetTriggers(CAiTrigger* triggers);
void SetNumTriggers(s32 numTriggers);
void CallFunc(CStateManager& mgr, CAi& ai, EStateMsg msg, float delta) const
{
if (x0_func)
(ai.*x0_func)(mgr, msg, delta);
}
};
class CStateMachine
{
std::vector<CAiState> x0_states;
std::vector<CAiTrigger> x10_triggers;
public:
CStateMachine(CInputStream& in);
const std::vector<CAiState>& GetStateVector() const { return x0_states; }
};
class CStateMachineState
{
const CStateMachine* x0_ = nullptr;
CAiState* x4_state = nullptr;
float x8_ = 0;
float xc_ = 0;
float x10_ = 0;
public:
CStateMachineState()=default;
void Setup(const CStateMachine* machine)
{
x0_ = machine;
x4_state = nullptr;
x8_ = 0.f;
xc_ = 0.f;
x10_= 0.f;
}
void SetDelay(float);
float GetDelay() const;
void Update(CStateManager& mgr, CAi& ai, float delta)
{
x8_ += delta;
if (x4_state)
x4_state->CallFunc(mgr, ai, EStateMsg::One, delta);
}
};
}
#endif // CSTATEMACHINE_HPP

View File

@ -27,8 +27,10 @@
#include "CScriptGrapplePoint.hpp"
#include "CScriptAreaAttributes.hpp"
#include "CScriptCameraWaypoint.hpp"
#include "CScriptCoverPoint.hpp"
#include "Camera/CCinematicCamera.hpp"
#include "MP1/CNewIntroBoss.hpp"
#include "MP1/CWarWasp.hpp"
#include "CPatternedInfo.hpp"
#include "CSimplePool.hpp"
#include "Collision/CCollidableOBBTreeGroup.hpp"
@ -365,13 +367,13 @@ CEntity* ScriptLoader::LoadActor(CStateManager& mgr, CInputStream& in,
CMaterialList list;
if (b2)
list.Add(EMaterialTypes::SixtyThree);
list.Add(EMaterialTypes::Eleven);
if (b3)
list.Add(EMaterialTypes::Eight);
list.Add(EMaterialTypes::Three);
if (b4)
list.Add(EMaterialTypes::ThirtyTwo);
list.Add(EMaterialTypes::Six);
bool generateExtent = false;
if (collisionExtent.x < 0.f || collisionExtent.y < 0.f || collisionExtent.z < 0.f)
@ -385,7 +387,7 @@ CEntity* ScriptLoader::LoadActor(CStateManager& mgr, CInputStream& in,
aRes.x4_charIdx = aParms.x4_charIdx;
aRes.x8_scale = head.x40_scale;
aRes.x14_ = true;
aRes.x1c_defaultAnim = aParms.x8_defaultAnim;
aRes.x18_defaultAnim = aParms.x8_defaultAnim;
data = aRes;
}
else
@ -457,7 +459,7 @@ CEntity* ScriptLoader::LoadDoor(CStateManager& mgr, CInputStream& in,
CAnimRes aRes;
aRes.x0_ancsId = aParms.x0_ancs;
aRes.x4_charIdx = aParms.x4_charIdx;
aRes.x1c_defaultAnim = aParms.x8_defaultAnim;
aRes.x18_defaultAnim = aParms.x8_defaultAnim;
aRes.x8_scale = head.x40_scale;
CModelData mData = aRes;
@ -641,7 +643,7 @@ CEntity* ScriptLoader::LoadPlatform(CStateManager& mgr, CInputStream& in,
aRes.x4_charIdx = aParms.x4_charIdx;
aRes.x8_scale = head.x40_scale;
aRes.x14_ = true;
aRes.x1c_defaultAnim = aParms.x8_defaultAnim;
aRes.x18_defaultAnim = aParms.x8_defaultAnim;
data = aRes;
}
else
@ -815,7 +817,7 @@ CEntity* ScriptLoader::LoadNewIntroBoss(CStateManager& mgr, CInputStream& in,
res.x4_charIdx = animParms.x4_charIdx;
res.x8_scale = head.x40_scale;
res.x14_ = true;
res.x1c_defaultAnim = animParms.x8_defaultAnim;
res.x18_defaultAnim = animParms.x8_defaultAnim;
return new MP1::CNewIntroBoss(mgr.AllocateUniqueId(), head.x0_name, info,
head.x10_transform, res, pInfo, actParms, f1, w1,
@ -1004,9 +1006,44 @@ CEntity* ScriptLoader::LoadWater(CStateManager& mgr, CInputStream& in,
w21, w22, b5, bitVal0, bitVal0, bitset);
}
CEntity* ScriptLoader::LoadWarwasp(CStateManager& mgr, CInputStream& in,
CEntity* ScriptLoader::LoadWarWasp(CStateManager& mgr, CInputStream& in,
int propCount, const CEntityInfo& info)
{
if (!EnsurePropertyCount(propCount, 13, "WarWasp"))
return nullptr;
std::string name = *mgr.HashInstanceName(in);
CPatterned::EFlavorType flavor = CPatterned::EFlavorType(in.readUint32Big());
zeus::CTransform xf = LoadEditorTransformPivotOnly(in);
zeus::CVector3f scale;
scale.readBig(in);
std::pair<bool, u32> verifyPair = CPatternedInfo::HasCorrectParameterCount(in);
if (!verifyPair.first)
return nullptr;
CPatternedInfo pInfo(in, verifyPair.second);
CActorParameters actorParms = LoadActorParameters(in);
CPatterned::EColliderType collider = CPatterned::EColliderType(in.readBool());
CDamageInfo damageInfo1(in);
ResId weaponDesc = in.readUint32Big();
CDamageInfo damageInfo2(in);
ResId particle = in.readUint32Big();
u32 w1 = in.readUint32Big();
FourCC animType = g_ResFactory->GetResourceTypeById(pInfo.GetAnimationParameters().x0_ancs);
if (animType != SBIG('ANCS'))
return nullptr;
CAnimRes res;
res.x0_ancsId = pInfo.GetAnimationParameters().x0_ancs;
res.x4_charIdx = pInfo.GetAnimationParameters().x4_charIdx;
res.x8_scale = scale;
res.x14_ = true;
res.x18_defaultAnim = pInfo.GetAnimationParameters().x8_defaultAnim;
CModelData mData(res);
return new MP1::CWarWasp(mgr.AllocateUniqueId(), name, info, xf, std::move(mData), pInfo, flavor, collider, damageInfo1, actorParms, weaponDesc,
damageInfo2, particle, w1);
}
CEntity* ScriptLoader::LoadSpacePirate(CStateManager& mgr, CInputStream& in,
@ -1037,6 +1074,18 @@ CEntity* ScriptLoader::LoadChozoGhost(CStateManager& mgr, CInputStream& in,
CEntity* ScriptLoader::LoadCoverPoint(CStateManager& mgr, CInputStream& in,
int propCount, const CEntityInfo& info)
{
if (!EnsurePropertyCount(propCount, 9, "CoverPoint"))
return nullptr;
SActorHead head = LoadActorHead(in, mgr);
bool b1 = in.readBool();
u32 w1 = in.readUint32Big();
bool b2 = in.readBool();
float f1 = in.readFloatBig();
float f2 = in.readFloatBig();
float f3 = in.readFloatBig();
return new CScriptCoverPoint(mgr.AllocateUniqueId(), head.x0_name, info, head.x10_transform, b1, w1, b2, f1, f2, f3);
}
CEntity* ScriptLoader::LoadSpiderBallWaypoint(CStateManager& mgr, CInputStream& in,

View File

@ -63,7 +63,7 @@ public:
static CEntity* LoadCameraShaker(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info);
static CEntity* LoadActorKeyframe(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info);
static CEntity* LoadWater(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info);
static CEntity* LoadWarwasp(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info);
static CEntity* LoadWarWasp(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info);
static CEntity* LoadSpacePirate(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info);
static CEntity* LoadFlyingPirate(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info);
static CEntity* LoadElitePirate(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info);

View File

@ -200,7 +200,8 @@ enum class EScriptObjectMessage
Play,
Alert,
ObjectAdded = 0x1f,
DeleteRequested = 0x20
DeleteRequested = 0x20,
UNKM4 = 0x23
};
}

@ -1 +1 @@
Subproject commit 633c50fe33deb153a3e28d0e66ede01832741f62
Subproject commit d705b8d7f4f433b0bcbc76a789b3ed7874829e56