metaforce/Runtime/World/CTeamAiMgr.hpp

124 lines
4.7 KiB
C++
Raw Normal View History

2018-10-06 20:42:33 -07:00
#pragma once
#include "Runtime/RetroTypes.hpp"
#include "Runtime/World/CEntity.hpp"
#include <zeus/CVector3f.hpp>
2021-04-10 01:42:06 -07:00
namespace metaforce {
2018-11-25 18:15:44 -08:00
class CStateManager;
class CAi;
2018-12-07 21:30:43 -08:00
class CTeamAiRole {
friend class CTeamAiMgr;
2018-11-25 18:15:44 -08:00
public:
2019-01-30 00:38:16 -08:00
enum class ETeamAiRole { Invalid = -1, Initial, Melee, Ranged, Unknown, Unassigned };
2018-12-07 21:30:43 -08:00
2018-11-25 18:15:44 -08:00
private:
2018-12-07 21:30:43 -08:00
TUniqueId x0_ownerId;
ETeamAiRole x4_roleA = ETeamAiRole::Invalid;
ETeamAiRole x8_roleB = ETeamAiRole::Invalid;
ETeamAiRole xc_roleC = ETeamAiRole::Invalid;
ETeamAiRole x10_curRole = ETeamAiRole::Invalid;
s32 x14_roleIndex = -1;
s32 x18_captainPriority = 0;
zeus::CVector3f x1c_position;
2018-11-25 18:15:44 -08:00
public:
CTeamAiRole(TUniqueId ownerId, ETeamAiRole a = ETeamAiRole::Invalid, ETeamAiRole b = ETeamAiRole::Invalid,
ETeamAiRole c = ETeamAiRole::Invalid)
2018-12-07 21:30:43 -08:00
: x0_ownerId(ownerId), x4_roleA(a), x8_roleB(b), xc_roleC(c) {}
TUniqueId GetOwnerId() const { return x0_ownerId; }
bool HasTeamAiRole() const { return false; }
ETeamAiRole GetTeamAiRole() const { return x10_curRole; }
void SetTeamAiRole(ETeamAiRole role) { x10_curRole = role; }
s32 GetRoleIndex() const { return x14_roleIndex; }
void SetRoleIndex(s32 idx) { x14_roleIndex = idx; }
const zeus::CVector3f& GetTeamPosition() const { return x1c_position; }
void SetTeamPosition(const zeus::CVector3f& pos) { x1c_position = pos; }
bool operator<(const CTeamAiRole& other) const { return x0_ownerId < other.x0_ownerId; }
2018-11-25 18:15:44 -08:00
};
2018-12-07 21:30:43 -08:00
class CTeamAiData {
friend class CTeamAiMgr;
u32 x0_aiCount;
u32 x4_meleeCount;
2019-01-30 00:38:16 -08:00
u32 x8_rangedCount;
2018-12-07 21:30:43 -08:00
u32 xc_unknownCount;
u32 x10_maxMeleeAttackerCount;
2019-01-30 00:38:16 -08:00
u32 x14_maxRangedAttackerCount;
2018-12-07 21:30:43 -08:00
u32 x18_positionMode;
float x1c_meleeTimeInterval;
2019-01-30 00:38:16 -08:00
float x20_rangedTimeInterval;
2018-12-07 21:30:43 -08:00
public:
2018-12-07 21:30:43 -08:00
CTeamAiData(CInputStream& in, s32 propCount);
};
2018-12-07 21:30:43 -08:00
class CTeamAiMgr : public CEntity {
public:
2019-01-30 00:38:16 -08:00
enum class EAttackType { Melee, Ranged };
2018-12-07 21:30:43 -08:00
2018-11-25 18:15:44 -08:00
private:
2018-12-07 21:30:43 -08:00
CTeamAiData x34_data;
std::vector<CTeamAiRole> x58_roles;
std::vector<TUniqueId> x68_meleeAttackers;
2019-01-30 00:38:16 -08:00
std::vector<TUniqueId> x78_rangedAttackers;
float x88_timeDirty = 0.0f;
2018-12-07 21:30:43 -08:00
TUniqueId x8c_teamCaptainId = kInvalidUniqueId;
float x90_timeSinceMelee = 0.0f;
float x94_timeSinceRanged = 0.0f;
2018-11-25 18:15:44 -08:00
2018-12-07 21:30:43 -08:00
void UpdateTeamCaptain();
bool ShouldUpdateRoles(float dt);
void ResetRoles(CStateManager& mgr);
void AssignRoles(CTeamAiRole::ETeamAiRole role, s32 count);
void UpdateRoles(CStateManager& mgr);
void SpacingSort(CStateManager& mgr, const zeus::CVector3f& pos);
void PositionTeam(CStateManager& mgr);
2018-11-25 18:15:44 -08:00
public:
2021-05-26 07:00:57 -07:00
DEFINE_ENTITY
2018-12-07 21:30:43 -08:00
CTeamAiMgr(TUniqueId uid, std::string_view name, const CEntityInfo& info, const CTeamAiData& data);
void Accept(IVisitor&) override;
void Think(float dt, CStateManager& mgr) override;
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& mgr) override;
2018-12-07 21:30:43 -08:00
CTeamAiRole* GetTeamAiRole(TUniqueId aiId);
bool IsPartOfTeam(TUniqueId aiId) const;
bool HasTeamAiRole(TUniqueId aiId) const;
bool AssignTeamAiRole(const CAi& ai, CTeamAiRole::ETeamAiRole roleA, CTeamAiRole::ETeamAiRole roleB,
CTeamAiRole::ETeamAiRole roleC);
void RemoveTeamAiRole(TUniqueId aiId);
void ClearTeamAiRole(TUniqueId aiId);
s32 GetNumAssignedOfRole(CTeamAiRole::ETeamAiRole role) const;
s32 GetNumAssignedAiRoles() const;
2018-11-25 18:15:44 -08:00
2018-12-30 21:01:42 -08:00
bool IsMeleeAttacker(TUniqueId aiId) const;
bool CanAcceptMeleeAttacker(TUniqueId aiId) const;
bool AddMeleeAttacker(TUniqueId aiId);
void RemoveMeleeAttacker(TUniqueId aiId);
2019-01-30 00:38:16 -08:00
bool IsRangedAttacker(TUniqueId aiId) const;
bool CanAcceptRangedAttacker(TUniqueId aiId) const;
bool AddRangedAttacker(TUniqueId aiId);
void RemoveRangedAttacker(TUniqueId aiId);
2018-12-30 21:01:42 -08:00
2019-01-15 20:22:44 -08:00
bool HasMeleeAttackers() const { return !x68_meleeAttackers.empty(); }
const std::vector<TUniqueId>& GetMeleeAttackers() const { return x68_meleeAttackers; }
2019-01-30 00:38:16 -08:00
bool HasRangedAttackers() const { return !x78_rangedAttackers.empty(); }
const std::vector<TUniqueId>& GetRangedAttackers() const { return x78_rangedAttackers; }
2019-01-15 20:22:44 -08:00
s32 GetNumRoles() const { return x58_roles.size(); }
const std::vector<CTeamAiRole>& GetRoles() const { return x58_roles; }
s32 GetMaxMeleeAttackerCount() const { return x34_data.x10_maxMeleeAttackerCount; }
2019-01-30 00:38:16 -08:00
s32 GetMaxRangedAttackerCount() const { return x34_data.x14_maxRangedAttackerCount; }
2019-01-15 20:22:44 -08:00
2018-12-07 21:30:43 -08:00
static CTeamAiRole* GetTeamAiRole(CStateManager& mgr, TUniqueId mgrId, TUniqueId aiId);
static void ResetTeamAiRole(EAttackType type, CStateManager& mgr, TUniqueId mgrId, TUniqueId aiId, bool clearRole);
static bool CanAcceptAttacker(EAttackType type, CStateManager& mgr, TUniqueId mgrId, TUniqueId aiId);
static bool AddAttacker(EAttackType type, CStateManager& mgr, TUniqueId mgrId, TUniqueId aiId);
2018-12-07 17:49:15 -08:00
static TUniqueId GetTeamAiMgr(const CAi& ai, const CStateManager& mgr);
};
2021-04-10 01:42:06 -07:00
} // namespace metaforce