mirror of
https://github.com/PrimeDecomp/echoes.git
synced 2026-03-31 14:23:06 -07:00
232 lines
7.6 KiB
C++
232 lines
7.6 KiB
C++
#ifndef _CSTATEMANAGER
|
|
#define _CSTATEMANAGER
|
|
|
|
#include "Kyoto/Math/CFrustumPlanes.hpp"
|
|
#include "MetroidPrime/CEntityInfo.hpp"
|
|
#include "MetroidPrime/CObjectList.hpp"
|
|
#include "TGameTypes.hpp"
|
|
|
|
#include "Kyoto/Graphics/CColor.hpp"
|
|
#include "Kyoto/Input/CFinalInput.hpp"
|
|
#include "Kyoto/Math/CVector3f.hpp"
|
|
#include "Kyoto/SObjectTag.hpp"
|
|
#include "Kyoto/TToken.hpp"
|
|
|
|
#include "rstl/auto_ptr.hpp"
|
|
#include "rstl/map.hpp"
|
|
#include "rstl/pair.hpp"
|
|
#include "rstl/rc_ptr.hpp"
|
|
#include "rstl/reserved_vector.hpp"
|
|
#include "rstl/single_ptr.hpp"
|
|
|
|
class CWorld;
|
|
class CArchitectureQueue;
|
|
class CEnvFxManager;
|
|
class CEntity;
|
|
class CActor;
|
|
class CScriptMailbox;
|
|
class CMapWorldInfo;
|
|
class CPlayerState;
|
|
class CWorldTransManager;
|
|
class CPlayer;
|
|
class CCameraManager;
|
|
class CRumbleManager;
|
|
class CSaveGameScreen;
|
|
class CActorModelParticles;
|
|
class CRelayTracker;
|
|
class CWorldLayerState;
|
|
class CStateManagerContainer;
|
|
class CSortedListManager;
|
|
class CWeaponMgr;
|
|
class CFluidPlaneManager;
|
|
class CAABox;
|
|
|
|
struct MapWorldInfoAreas {};
|
|
|
|
enum EStateManagerTransition {
|
|
kSMT_InGame,
|
|
kSMT_MapScreen,
|
|
kSMT_PauseGame,
|
|
kSMT_LogBook,
|
|
kSMT_SaveGame,
|
|
kSMT_Unk,
|
|
kSMT_MessageScreen
|
|
};
|
|
|
|
class CStateManager {
|
|
struct ScriptMsgArray {
|
|
CScriptMsg msgs[192];
|
|
int lastIndex;
|
|
int otherIndex;
|
|
|
|
void Append(const CScriptMsg& msg);
|
|
int fn_8019E69C();
|
|
const CScriptMsg& fn_8019E6BC() const;
|
|
|
|
bool empty() const { return lastIndex == otherIndex; }
|
|
};
|
|
|
|
public:
|
|
typedef rstl::map< TEditorId, TUniqueId > TIdList;
|
|
typedef rstl::pair< TIdList::const_iterator, TIdList::const_iterator > TIdListResult;
|
|
|
|
CStateManager(const rstl::ncrc_ptr< CScriptMailbox >&, const rstl::ncrc_ptr< CMapWorldInfo >&,
|
|
const rstl::ncrc_ptr< CPlayerState >&, const rstl::ncrc_ptr< CWorldTransManager >&);
|
|
~CStateManager();
|
|
|
|
TUniqueId AllocateUniqueId();
|
|
uint MaskUIdNumPlayers(TUniqueId id) const;
|
|
void ShowPausedHUDMemo(CAssetId strg, float time);
|
|
void SetIsDarkWorld(bool);
|
|
|
|
void SendScriptMsg_fn_80037100(const CScriptMsg&);
|
|
|
|
void AddObject(CEntity*);
|
|
void DeleteObjectRequest(TUniqueId);
|
|
void UpdateObjectInLists(CEntity&);
|
|
|
|
bool AddDrawableActor(const CActor& actor, const CVector3f& pos, const CAABox& bounds) const;
|
|
void SetupParticleHook(const CActor& actor) const;
|
|
const CActorModelParticles* GetActorModelParticles() const { return m_actorModelParticles; }
|
|
|
|
CEntity* ObjectById(TUniqueId uid);
|
|
const CEntity* GetObjectById(TUniqueId uid) const;
|
|
CEntity* GetObjectByIdFromListAll(TUniqueId uid);
|
|
|
|
TEditorId GetEditorIdForUniqueId(TUniqueId) const;
|
|
TUniqueId GetIdForScript(TEditorId eid) const;
|
|
TIdListResult GetIdListForScript(TEditorId) const;
|
|
|
|
CWorld* World() { return m_world; }
|
|
const CWorld* GetWorld() const { return m_world; }
|
|
CEnvFxManager* EnvFxManager() { return m_envFxManager; }
|
|
const CEnvFxManager* GetEnvFxManager() const { return m_envFxManager; }
|
|
// CRandom16* Random() const { return x900_random; }
|
|
int GetUpdateFrameIdx() const { return m_updateFrameIdx; }
|
|
|
|
TAreaId GetNextAreaId() const { return m_nextAreaId; }
|
|
void SetCurrentAreaId(TAreaId);
|
|
void SetActorAreaId(CActor& actor, TAreaId);
|
|
|
|
const CFrustumPlanes& GetFrustumPlanes() const { return m_planes; }
|
|
int Get0x244c() const { return x244c; }
|
|
|
|
int GetNumPlayers() const { return m_numPlayers; }
|
|
CPlayer* GetPlayer(int index) { return m_players[index]; }
|
|
CPlayer* Player(int index) { return m_players[index]; }
|
|
|
|
CObjectList& ObjectListById(EGameObjectList id) { return *m_objectLists[id]; }
|
|
const CObjectList& GetObjectListById(EGameObjectList id) const { return *m_objectLists[id]; }
|
|
|
|
void UpdateActorInSortedLists(CActor*);
|
|
|
|
void fn_8003BF84(CEntity*);
|
|
void fn_800412EC(TUniqueId);
|
|
bool fn_80036F10() const; // Maybe_CheckIsMultiplayer
|
|
void fn_8003BE54();
|
|
|
|
// State transitions
|
|
void DeferStateTransition(EStateManagerTransition t);
|
|
void EnterMapScreen() { DeferStateTransition(kSMT_MapScreen); }
|
|
void EnterPauseScreen() { DeferStateTransition(kSMT_PauseGame); }
|
|
void EnterLogBookScreen() { DeferStateTransition(kSMT_LogBook); }
|
|
void EnterSaveGameScreen() { DeferStateTransition(kSMT_SaveGame); }
|
|
void EnterMessageScreen(uint, float);
|
|
bool GetWantsToEnterMapScreen() const { return m_deferredTransition == kSMT_MapScreen; }
|
|
bool GetWantsToEnterPauseScreen() const { return m_deferredTransition == kSMT_PauseGame; }
|
|
bool GetWantsToEnterLogBookScreen() const { return m_deferredTransition == kSMT_LogBook; }
|
|
bool GetWantsToEnterSaveGameScreen() const { return m_deferredTransition == kSMT_SaveGame; }
|
|
bool GetWantsToEnterMessageScreen() const { return m_deferredTransition == kSMT_MessageScreen; }
|
|
|
|
const CCameraManager* GetCameraManager(int playerIndex) const { return m_cameraManagers[playerIndex]; }
|
|
const CPlayerState* GetPlayerState() const { return m_playerState; }
|
|
const CPlayerState* GetPlayerState(int playerIndex) const { return m_playerStates[playerIndex]; }
|
|
CPlayerState* PlayerState(int playerIndex) { return m_playerStates[playerIndex]; }
|
|
|
|
int fn_800366e4(CActor *);
|
|
int fn_801EDD8C(TUniqueId) const;
|
|
|
|
public:
|
|
ushort m_nextFreeIndex;
|
|
rstl::reserved_vector< ushort, 1024 > m_objectIndexArray; // x0x4
|
|
rstl::reserved_vector< rstl::auto_ptr< CObjectList >, 9 > m_objectLists; // 0x808
|
|
MapWorldInfoAreas mapWorldInfoAreas;
|
|
char pad1[0x94]; // 0x408
|
|
ScriptMsgArray m_scriptMsgs;
|
|
CArchitectureQueue* m_archQueue;
|
|
int m_numPlayers;
|
|
CPlayer* m_players[4];
|
|
CPlayerState* m_playerStates[4];
|
|
CCameraManager* m_cameraManagers[4];
|
|
CRumbleManager* m_rumbleManagers[4];
|
|
CFinalInput m_finalInputs[4];
|
|
CPlayerState* m_playerState;
|
|
CCameraManager* m_cameraManager;
|
|
CWorld* m_world; // 0x1604
|
|
rstl::list< rstl::reserved_vector< CEntity*, 32 > > m_graveyard; // 0x1608
|
|
rstl::single_ptr< CStateManagerContainer > m_stateManagerContainer;
|
|
CSortedListManager* m_sortedListManager;
|
|
CWeaponMgr* m_weaponMgr;
|
|
CFluidPlaneManager* m_fluidPlaneManager;
|
|
CEnvFxManager* m_envFxManager; // 0x1630
|
|
CActorModelParticles* m_actorModelParticles; // 0x1634
|
|
void* x1638;
|
|
char pad2_2[0x48];
|
|
rstl::rc_ptr< CRelayTracker > m_relayTracker;
|
|
int x1684;
|
|
int x1688;
|
|
rstl::rc_ptr< CWorldTransManager > m_worldTransManager;
|
|
CWorldLayerState* m_currentWorldLayerState;
|
|
int* x1698;
|
|
rstl::single_ptr< CSaveGameScreen > m_saveGameScreen; // x169C
|
|
TAreaId m_nextAreaId; // x16a0
|
|
char pad3[0x8]; // 16A4
|
|
int m_updateFrameIdx; // 16AC
|
|
char pad4[0xD84]; // 16B0
|
|
|
|
CAssetId m_pauseHudMessage; // 0x2434
|
|
float x2438_escapeTotalTime;
|
|
float x243c;
|
|
TUniqueId m_bossId; // 0x2440
|
|
float m_bossHealth;
|
|
uint m_bossLanguageTableIndex;
|
|
int x244c; // unk type
|
|
TUniqueId m_uid_setBySpecialFunc;
|
|
float m_hudMessageTime; // 0x2454
|
|
int x2458; // unk type
|
|
int m_hudMessageFrameCount; // 0x245c
|
|
int m_forPausedHudMemo; // 0x2460
|
|
CAssetId m_pausedHudMemoAssetId;
|
|
float x2468;
|
|
int x246c;
|
|
EStateManagerTransition m_deferredTransition;
|
|
|
|
char pad5[4]; // 0x246c
|
|
CFrustumPlanes m_planes; // 0x2478
|
|
char pad6[0x460]; // 0x24D0
|
|
|
|
CVector3f x2938;
|
|
float x2944;
|
|
CColor x2948;
|
|
bool m_unkFlagA1 : 1;
|
|
bool m_unkFlagA2 : 1;
|
|
bool m_unkFlagA3 : 1;
|
|
bool m_unkFlagA4 : 1;
|
|
bool m_unkFlagA5 : 1;
|
|
bool m_unkFlagA6 : 1;
|
|
bool m_unkFlagA7 : 1;
|
|
bool m_isDarkWorld : 1; // 0x294c
|
|
bool m_unkFlagB1 : 1;
|
|
bool m_unkFlagB2 : 1;
|
|
bool m_unkFlagB3 : 1;
|
|
bool m_unkFlagB4 : 1;
|
|
bool m_unkFlagB5 : 1;
|
|
bool m_unkFlagB6 : 1;
|
|
bool m_unkFlagB7 : 1;
|
|
bool m_unkFlagB8 : 1;
|
|
};
|
|
// CHECK_OFFSETOF(CStateManager, m_world, 0x1604)
|
|
// CHECK_OFFSETOF(CStateManager, m_envFxManager, 0x1630)
|
|
|
|
#endif // _CSTATEMANAGER
|