metaforce/Runtime/World/CWorld.hpp

224 lines
7.0 KiB
C++
Raw Normal View History

#ifndef __URDE_CWORLD_HPP__
#define __URDE_CWORLD_HPP__
2016-04-19 00:17:49 +00:00
#include "RetroTypes.hpp"
2016-04-23 18:04:49 +00:00
#include "ScriptObjectSupport.hpp"
#include "CGameArea.hpp"
2016-07-24 04:46:32 +00:00
#include "Graphics/CModel.hpp"
2017-07-07 12:23:20 +00:00
#include "Audio/CSfxManager.hpp"
#include "AutoMapper/CMapWorld.hpp"
#include "CEnvFxManager.hpp"
2016-04-19 00:17:49 +00:00
namespace urde
{
2016-04-19 00:17:49 +00:00
class CGameArea;
2016-04-23 18:04:49 +00:00
class IObjectStore;
class CResFactory;
class IGameArea;
class CAudioGroupSet;
class IWorld
{
public:
virtual ~IWorld() = default;
2017-08-13 05:26:14 +00:00
virtual CAssetId IGetWorldAssetId() const=0;
virtual CAssetId IGetStringTableAssetId() const=0;
virtual CAssetId IGetSaveWorldAssetId() const=0;
virtual const CMapWorld* IGetMapWorld() const=0;
virtual CMapWorld* IMapWorld()=0;
2017-04-22 06:42:32 +00:00
virtual const IGameArea* IGetAreaAlways(TAreaId id) const=0;
2016-07-24 04:46:32 +00:00
virtual TAreaId IGetCurrentAreaId() const=0;
2017-08-13 05:26:14 +00:00
virtual TAreaId IGetAreaId(CAssetId id) const=0;
virtual bool ICheckWorldComplete()=0;
virtual std::string IGetDefaultAudioTrack() const=0;
virtual int IGetAreaCount() const=0;
};
class CDummyWorld : public IWorld
{
bool x4_loadMap;
enum class Phase
{
Loading,
LoadingMap,
LoadingMapAreas,
Done,
} x8_phase = Phase::Loading;
2017-08-13 05:26:14 +00:00
CAssetId xc_mlvlId;
CAssetId x10_strgId;
CAssetId x14_savwId = -1;
std::vector<CDummyGameArea> x18_areas;
2017-08-13 05:26:14 +00:00
CAssetId x28_mapWorldId = -1;
2016-07-24 04:46:32 +00:00
TLockedToken<CMapWorld> x2c_mapWorld;
//AsyncTask x30_loadToken;
std::unique_ptr<uint8_t[]> x34_loadBuf;
//u32 x38_bufSz;
2016-07-24 04:46:32 +00:00
TAreaId x3c_curAreaId = kInvalidAreaId;
public:
2017-08-13 05:26:14 +00:00
CDummyWorld(CAssetId mlvlId, bool loadMap);
CAssetId IGetWorldAssetId() const;
CAssetId IGetStringTableAssetId() const;
CAssetId IGetSaveWorldAssetId() const;
const CMapWorld* IGetMapWorld() const;
CMapWorld* IMapWorld();
2016-07-24 04:46:32 +00:00
const IGameArea* IGetAreaAlways(TAreaId id) const;
TAreaId IGetCurrentAreaId() const;
2017-08-13 05:26:14 +00:00
TAreaId IGetAreaId(CAssetId id) const;
bool ICheckWorldComplete();
std::string IGetDefaultAudioTrack() const;
int IGetAreaCount() const;
};
class CWorld : public IWorld
{
friend class CStateManager;
2016-05-03 08:27:28 +00:00
public:
class CRelay
{
TEditorId x0_relay = kInvalidEditorId;
TEditorId x4_target = kInvalidEditorId;
s16 x8_msg = -1;
bool xa_active = false;
public:
CRelay() = default;
CRelay(CInputStream& in);
TEditorId GetRelayId() const { return x0_relay; }
TEditorId GetTargetId() const { return x4_target; }
s16 GetMessage() const { return x8_msg; }
bool GetActive() const { return xa_active; }
2016-07-24 04:46:32 +00:00
static std::vector<CWorld::CRelay> ReadMemoryRelays(athena::io::MemoryReader& r);
};
struct CSoundGroupData
2016-07-24 04:46:32 +00:00
{
int x0_groupId;
2017-08-13 05:26:14 +00:00
CAssetId x4_agscId;
std::string xc_name;
TCachedToken<CAudioGroupSet> x1c_groupData;
2016-07-24 04:46:32 +00:00
public:
2017-08-13 05:26:14 +00:00
CSoundGroupData(int grpId, CAssetId agsc);
2016-05-03 08:27:28 +00:00
};
2016-07-24 04:46:32 +00:00
2016-05-03 08:27:28 +00:00
private:
2017-01-07 01:58:05 +00:00
static constexpr CGameArea* skGlobalEnd = nullptr;
static constexpr CGameArea* skGlobalNonConstEnd = nullptr;
2016-07-24 04:46:32 +00:00
enum class Phase
{
Loading,
LoadingMap,
LoadingMapAreas,
LoadingSkyBox,
LoadingSoundGroups,
2016-07-24 04:46:32 +00:00
Done,
} x4_phase = Phase::Loading;
2017-08-13 05:26:14 +00:00
CAssetId x8_mlvlId = -1;
CAssetId xc_strgId = -1;
CAssetId x10_savwId = -1;
2016-07-24 04:46:32 +00:00
std::vector<std::unique_ptr<CGameArea>> x18_areas;
2017-08-13 05:26:14 +00:00
CAssetId x24_mapwId = -1;
2016-07-24 04:46:32 +00:00
TLockedToken<CMapWorld> x28_mapWorld;
std::vector<CRelay> x2c_relays;
//AsyncTask x3c_loadToken;
std::unique_ptr<uint8_t[]> x40_loadBuf;
//u32 x44_bufSz;
u32 x48_chainCount = 0;
CGameArea* x4c_chainHeads[5] = {};
IObjectStore& x60_objectStore;
IFactory& x64_resFactory;
TAreaId x68_curAreaId = kInvalidAreaId;
2016-05-03 08:27:28 +00:00
u32 x6c_ = 0;
2016-04-23 18:04:49 +00:00
union
{
struct
{
2017-04-13 19:28:31 +00:00
bool x70_24_currentAreaNeedsAllocation : 1;
2017-02-18 02:19:50 +00:00
bool x70_25_paused : 1;
bool x70_26_skyboxOverridden : 1;
bool x70_27_needsSky : 1;
2016-04-23 18:04:49 +00:00
};
u16 dummy = 0;
2016-04-23 18:04:49 +00:00
};
2016-07-24 04:46:32 +00:00
std::vector<CSoundGroupData> x74_soundGroupData;
std::string x84_defAudioTrack;
TLockedToken<CModel> x94_skybox;
TLockedToken<CModel> xa4_skyboxB;
TLockedToken<CModel> xb4_skyboxC;
EEnvFxType xc4_neededFx = EEnvFxType::None;
std::vector<CSfxHandle> xc8_sfxHandles;
2017-08-13 05:26:14 +00:00
void LoadSoundGroup(int groupId, CAssetId agscId, CSoundGroupData& data);
void LoadSoundGroups();
2016-04-23 18:04:49 +00:00
2016-05-03 08:27:28 +00:00
public:
2016-04-23 18:04:49 +00:00
2016-07-24 04:46:32 +00:00
void MoveToChain(CGameArea* area, EChain chain);
2017-02-19 09:27:01 +00:00
void MoveAreaToChain3(TAreaId aid);
2017-08-13 05:26:14 +00:00
bool CheckWorldComplete(CStateManager* mgr, TAreaId id, CAssetId mreaId);
CGameArea::CChainIterator GetChainHead(EChain chain) { return {x4c_chainHeads[int(chain)]}; }
CGameArea::CConstChainIterator GetChainHead(EChain chain) const { return {x4c_chainHeads[int(chain)]}; }
CGameArea::CChainIterator begin() { return GetChainHead(EChain::Alive); }
CGameArea::CChainIterator end() { return AliveAreasEnd(); }
CGameArea::CConstChainIterator begin() const { return GetChainHead(EChain::Alive); }
CGameArea::CConstChainIterator end() const { return GetAliveAreasEnd(); }
bool ScheduleAreaToLoad(CGameArea* area, CStateManager& mgr);
void TravelToArea(TAreaId aid, CStateManager& mgr, bool);
2017-02-18 02:19:50 +00:00
void SetPauseState(bool paused);
2016-07-24 04:46:32 +00:00
2017-08-13 05:26:14 +00:00
CWorld(IObjectStore& objStore, IFactory& resFactory, CAssetId mlvlId);
2016-04-24 02:46:13 +00:00
bool DoesAreaExist(TAreaId area) const;
const std::vector<std::unique_ptr<CGameArea>>& GetGameAreas() const { return x18_areas; }
2017-04-15 05:32:25 +00:00
const CMapWorld* GetMapWorld() const { return x28_mapWorld.GetObj(); }
2016-07-24 23:14:58 +00:00
u32 GetRelayCount() const { return x2c_relays.size(); }
CRelay GetRelay(u32 idx) const { return x2c_relays[idx]; }
2016-07-24 04:46:32 +00:00
2017-08-13 05:26:14 +00:00
CAssetId IGetWorldAssetId() const;
CAssetId IGetStringTableAssetId() const;
CAssetId IGetSaveWorldAssetId() const;
const CMapWorld* IGetMapWorld() const;
CMapWorld* IMapWorld();
2016-08-09 03:58:19 +00:00
const CGameArea* GetAreaAlways(TAreaId) const;
CGameArea* GetArea(TAreaId);
s32 GetNumAreas() const { return x18_areas.size(); }
2016-07-24 04:46:32 +00:00
const IGameArea* IGetAreaAlways(TAreaId id) const;
TAreaId IGetCurrentAreaId() const;
2017-04-16 05:52:43 +00:00
TAreaId GetCurrentAreaId() const { return x68_curAreaId; }
2017-08-13 05:26:14 +00:00
TAreaId IGetAreaId(CAssetId id) const;
bool ICheckWorldComplete();
std::string IGetDefaultAudioTrack() const;
int IGetAreaCount() const;
2017-01-07 01:58:05 +00:00
static void PropogateAreaChain(CGameArea::EOcclusionState, CGameArea*, CWorld*);
static CGameArea::CConstChainIterator GetAliveAreasEnd() { return {skGlobalEnd}; }
static CGameArea::CChainIterator AliveAreasEnd() { return {skGlobalNonConstEnd}; }
2017-03-24 05:30:16 +00:00
void Update(float dt);
void PreRender();
void TouchSky();
void DrawSky(const zeus::CTransform& xf) const;
2017-07-07 12:26:53 +00:00
void StopSound(s16);
EEnvFxType GetNeededEnvFx() const { return xc4_neededFx; }
};
struct CWorldLayers
{
struct Area
{
u32 m_startNameIdx;
u32 m_layerCount;
u64 m_layerBits;
};
std::vector<Area> m_areas;
std::vector<std::string> m_names;
2017-08-13 05:26:14 +00:00
static void ReadWorldLayers(athena::io::MemoryReader& r, int version, CAssetId mlvlId);
};
}
#endif // __URDE_CWORLD_HPP__
2016-04-23 18:04:49 +00:00