2016-04-17 22:38:05 +00:00
|
|
|
#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"
|
2016-07-23 21:41:18 +00:00
|
|
|
#include "CGameArea.hpp"
|
2016-07-24 04:46:32 +00:00
|
|
|
#include "Graphics/CModel.hpp"
|
2016-07-24 06:05:12 +00:00
|
|
|
#include "AutoMapper/CMapWorld.hpp"
|
|
|
|
|
2016-04-19 00:17:49 +00:00
|
|
|
|
2016-04-17 22:38:05 +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;
|
2016-07-23 21:41:18 +00:00
|
|
|
class IGameArea;
|
2016-07-24 22:51:15 +00:00
|
|
|
class CAudioGroupSet;
|
2016-04-17 22:38:05 +00:00
|
|
|
|
2016-07-23 21:41:18 +00:00
|
|
|
class IWorld
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~IWorld() = default;
|
|
|
|
virtual ResId IGetWorldAssetId() const=0;
|
|
|
|
virtual ResId IGetStringTableAssetId() const=0;
|
|
|
|
virtual ResId IGetSaveWorldAssetId() const=0;
|
|
|
|
virtual const CMapWorld* IGetMapWorld() const=0;
|
|
|
|
virtual CMapWorld* IMapWorld()=0;
|
2016-07-24 04:46:32 +00:00
|
|
|
virtual const IGameArea* IGetAreaAlways(TAreaId id) const=0;
|
|
|
|
virtual TAreaId IGetCurrentAreaId() const=0;
|
2016-08-14 03:00:58 +00:00
|
|
|
virtual TAreaId IGetAreaId(ResId id) const=0;
|
2016-07-23 21:41:18 +00:00
|
|
|
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;
|
|
|
|
ResId xc_mlvlId;
|
|
|
|
ResId x10_strgId;
|
|
|
|
ResId x14_savwId = -1;
|
|
|
|
std::vector<CDummyGameArea> x18_areas;
|
|
|
|
ResId x28_mapWorldId = -1;
|
2016-07-24 04:46:32 +00:00
|
|
|
TLockedToken<CMapWorld> x2c_mapWorld;
|
2016-07-23 21:41:18 +00:00
|
|
|
//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;
|
2016-07-23 21:41:18 +00:00
|
|
|
public:
|
|
|
|
CDummyWorld(ResId mlvlId, bool loadMap);
|
|
|
|
ResId IGetWorldAssetId() const;
|
|
|
|
ResId IGetStringTableAssetId() const;
|
|
|
|
ResId 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;
|
|
|
|
TAreaId IGetAreaId(ResId id) const;
|
2016-07-23 21:41:18 +00:00
|
|
|
bool ICheckWorldComplete();
|
|
|
|
std::string IGetDefaultAudioTrack() const;
|
|
|
|
int IGetAreaCount() const;
|
|
|
|
};
|
|
|
|
|
|
|
|
class CWorld : public IWorld
|
2016-04-17 22:38:05 +00:00
|
|
|
{
|
2016-08-14 03:00:58 +00:00
|
|
|
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);
|
|
|
|
};
|
|
|
|
|
2016-07-24 22:51:15 +00:00
|
|
|
struct CSoundGroupData
|
2016-07-24 04:46:32 +00:00
|
|
|
{
|
2016-07-24 22:51:15 +00:00
|
|
|
int x0_groupId;
|
|
|
|
ResId x4_agscId;
|
|
|
|
std::string xc_name;
|
|
|
|
TCachedToken<CAudioGroupSet> x1c_groupData;
|
2016-07-24 04:46:32 +00:00
|
|
|
public:
|
|
|
|
CSoundGroupData(int grpId, ResId 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,
|
2016-07-24 22:51:15 +00:00
|
|
|
LoadingSkyBox,
|
|
|
|
LoadingSoundGroups,
|
2016-07-24 04:46:32 +00:00
|
|
|
Done,
|
|
|
|
} x4_phase = Phase::Loading;
|
|
|
|
ResId x8_mlvlId = -1;
|
|
|
|
ResId xc_strgId = -1;
|
|
|
|
ResId x10_savwId = -1;
|
|
|
|
std::vector<std::unique_ptr<CGameArea>> x18_areas;
|
|
|
|
ResId x24_mapwId = -1;
|
|
|
|
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
|
|
|
|
{
|
|
|
|
bool x70_24_ : 1;
|
2017-02-18 02:19:50 +00:00
|
|
|
bool x70_25_paused : 1;
|
2016-04-23 18:04:49 +00:00
|
|
|
bool x70_26_ : 1;
|
2016-05-03 08:27:28 +00:00
|
|
|
bool x70_27_ : 1;
|
2016-04-23 18:04:49 +00:00
|
|
|
};
|
2016-07-24 22:51:15 +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;
|
2016-07-24 22:51:15 +00:00
|
|
|
TLockedToken<CModel> x94_skybox;
|
|
|
|
TLockedToken<CModel> xa4_skyboxB;
|
2017-03-04 04:31:08 +00:00
|
|
|
TLockedToken<CModel> xb4_skyboxC;
|
2016-07-24 22:51:15 +00:00
|
|
|
|
|
|
|
void LoadSoundGroup(int groupId, ResId 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);
|
2016-07-24 04:46:32 +00:00
|
|
|
bool CheckWorldComplete(CStateManager* mgr, TAreaId id, ResId mreaId);
|
2017-03-04 04:31:08 +00:00
|
|
|
CGameArea* GetChainHead(EChain chain) { return x4c_chainHeads[int(chain)]; }
|
2017-03-06 06:33:51 +00:00
|
|
|
const CGameArea* GetChainHead(EChain chain) const { return x4c_chainHeads[int(chain)]; }
|
2016-08-14 03:00:58 +00:00
|
|
|
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
|
|
|
|
|
|
|
CWorld(IObjectStore& objStore, IFactory& resFactory, ResId mlvlId);
|
2016-04-24 02:46:13 +00:00
|
|
|
bool DoesAreaExist(TAreaId area) const;
|
2016-04-19 00:17:49 +00:00
|
|
|
std::vector<std::unique_ptr<CGameArea>>& GetGameAreas() {return x18_areas;}
|
2016-07-23 21:41:18 +00:00
|
|
|
|
2016-08-14 03:00:58 +00:00
|
|
|
CMapWorld* GetMapWorld() {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
|
|
|
|
2016-07-23 21:41:18 +00:00
|
|
|
ResId IGetWorldAssetId() const;
|
|
|
|
ResId IGetStringTableAssetId() const;
|
|
|
|
ResId IGetSaveWorldAssetId() const;
|
|
|
|
const CMapWorld* IGetMapWorld() const;
|
|
|
|
CMapWorld* IMapWorld();
|
2016-08-09 03:58:19 +00:00
|
|
|
const CGameArea* GetAreaAlways(TAreaId) const;
|
|
|
|
CGameArea* GetArea(TAreaId);
|
2017-01-04 04:08:30 +00:00
|
|
|
s32 GetNumAreas() const { return x18_areas.size(); }
|
2016-07-24 04:46:32 +00:00
|
|
|
const IGameArea* IGetAreaAlways(TAreaId id) const;
|
|
|
|
TAreaId IGetCurrentAreaId() const;
|
|
|
|
TAreaId IGetAreaId(ResId id) const;
|
2016-07-23 21:41:18 +00:00
|
|
|
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 const CGameArea* GetAliveAreasEnd() { return skGlobalEnd; }
|
|
|
|
static CGameArea* AliveAreasEnd() { return skGlobalNonConstEnd; }
|
2017-03-03 07:18:12 +00:00
|
|
|
|
2017-03-24 05:30:16 +00:00
|
|
|
void Update(float dt);
|
2017-03-03 07:18:12 +00:00
|
|
|
void PreRender();
|
2017-03-04 04:31:08 +00:00
|
|
|
void TouchSky();
|
|
|
|
void DrawSky(const zeus::CTransform& xf) const;
|
2016-07-23 21:41:18 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
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-02-08 06:48:43 +00:00
|
|
|
static void ReadWorldLayers(athena::io::MemoryReader& r, int version, ResId mlvlId);
|
2016-04-17 22:38:05 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // __URDE_CWORLD_HPP__
|
2016-04-23 18:04:49 +00:00
|
|
|
|