metaforce/Runtime/CGameState.hpp

133 lines
4.9 KiB
C++
Raw Normal View History

2018-10-06 20:42:33 -07:00
#pragma once
2015-08-16 22:26:58 -07:00
#include <array>
2015-08-17 13:33:58 -07:00
#include <memory>
#include <vector>
2016-10-09 00:45:04 -07:00
#include "DataSpec/DNACommon/DNACommon.hpp"
#include "Runtime/CBasics.hpp"
#include "Runtime/CGameOptions.hpp"
#include "Runtime/CPlayerState.hpp"
#include "Runtime/CScriptMailbox.hpp"
#include "Runtime/AutoMapper/CMapWorldInfo.hpp"
#include "Runtime/World/CWorld.hpp"
#include "Runtime/World/CWorldTransManager.hpp"
2021-04-10 01:42:06 -07:00
namespace metaforce {
2016-09-24 18:58:20 -07:00
class CSaveWorldMemory;
class CScriptLayerManager {
2018-12-07 21:30:43 -08:00
friend class CSaveWorldIntermediate;
std::vector<CWorldLayers::Area> x0_areaLayers;
DataSpec::WordBitmap x10_saveLayers;
2017-01-06 17:58:05 -08:00
2016-09-24 18:58:20 -07:00
public:
CScriptLayerManager() = default;
CScriptLayerManager(CInputStream& reader, const CWorldSaveGameInfo& saveWorld);
2016-10-09 00:45:04 -07:00
2018-12-07 21:30:43 -08:00
bool IsLayerActive(int areaIdx, int layerIdx) const { return ((x0_areaLayers[areaIdx].m_layerBits >> layerIdx) & 1); }
2016-09-24 18:58:20 -07:00
2018-12-07 21:30:43 -08:00
void SetLayerActive(int areaIdx, int layerIdx, bool active) {
if (active)
x0_areaLayers[areaIdx].m_layerBits |= uint64_t(1) << layerIdx;
else
x0_areaLayers[areaIdx].m_layerBits &= ~(uint64_t(1) << layerIdx);
}
2016-10-09 00:45:04 -07:00
2018-12-07 21:30:43 -08:00
void InitializeWorldLayers(const std::vector<CWorldLayers::Area>& layers);
2016-10-09 14:41:23 -07:00
2018-12-07 21:30:43 -08:00
u32 GetAreaLayerCount(int areaIdx) const { return x0_areaLayers[areaIdx].m_layerCount; }
u32 GetAreaCount() const { return x0_areaLayers.size(); }
2016-10-09 14:41:23 -07:00
void PutTo(COutputStream& writer) const;
2016-09-24 18:58:20 -07:00
};
2018-12-07 21:30:43 -08:00
class CWorldState {
CAssetId x0_mlvlId;
TAreaId x4_areaId = kInvalidAreaId;
std::shared_ptr<CScriptMailbox> x8_mailbox;
2018-12-07 21:30:43 -08:00
std::shared_ptr<CMapWorldInfo> xc_mapWorldInfo;
CAssetId x10_desiredAreaAssetId;
std::shared_ptr<CScriptLayerManager> x14_layerState;
2017-01-06 17:58:05 -08:00
public:
2018-12-07 21:30:43 -08:00
explicit CWorldState(CAssetId id);
CWorldState(CInputStream& reader, CAssetId mlvlId, const CWorldSaveGameInfo& saveWorld);
2018-12-07 21:30:43 -08:00
CAssetId GetWorldAssetId() const { return x0_mlvlId; }
void SetAreaId(TAreaId aid) { x4_areaId = aid; }
TAreaId GetCurrentAreaId() const { return x4_areaId; }
CAssetId GetDesiredAreaAssetId() const { return x10_desiredAreaAssetId; }
void SetDesiredAreaAssetId(CAssetId id) { x10_desiredAreaAssetId = id; }
const std::shared_ptr<CScriptMailbox>& Mailbox() const { return x8_mailbox; }
2018-12-07 21:30:43 -08:00
const std::shared_ptr<CMapWorldInfo>& MapWorldInfo() const { return xc_mapWorldInfo; }
const std::shared_ptr<CScriptLayerManager>& GetLayerState() const { return x14_layerState; }
void PutTo(COutputStream& writer, const CWorldSaveGameInfo& savw) const;
};
2018-12-07 21:30:43 -08:00
class CGameState {
friend class CStateManager;
std::array<bool, 128> x0_{};
u32 x80_ = 0;
2018-12-07 21:30:43 -08:00
CAssetId x84_mlvlId;
std::vector<CWorldState> x88_worldStates;
std::shared_ptr<CPlayerState> x98_playerState;
std::shared_ptr<CWorldTransManager> x9c_transManager;
double xa0_playTime = 0.0;
CPersistentOptions xa8_systemOptions;
CGameOptions x17c_gameOptions;
CHintOptions x1f8_hintOptions;
u32 x20c_saveFileIdx = 0;
u64 x210_cardSerial = 0;
std::vector<u8> x218_backupBuf;
bool x228_24_hardMode : 1 = false;
bool x228_25_initPowerupsAtFirstSpawn : 1 = true;
2016-09-24 18:58:20 -07:00
2015-08-17 13:33:58 -07:00
public:
2018-12-07 21:30:43 -08:00
CGameState();
CGameState(CInputStream& stream, u32 saveIdx);
2018-12-07 21:30:43 -08:00
void SetCurrentWorldId(CAssetId id);
std::shared_ptr<CPlayerState> GetPlayerState() const { return x98_playerState; }
std::shared_ptr<CWorldTransManager> GetWorldTransitionManager() const { return x9c_transManager; }
void SetTotalPlayTime(double time);
double GetTotalPlayTime() const { return xa0_playTime; }
2018-12-07 21:30:43 -08:00
CPersistentOptions& SystemOptions() { return xa8_systemOptions; }
CGameOptions& GameOptions() { return x17c_gameOptions; }
CHintOptions& HintOptions() { return x1f8_hintOptions; }
CWorldState& StateForWorld(CAssetId mlvlId);
CWorldState& CurrentWorldState() { return StateForWorld(x84_mlvlId); }
CAssetId CurrentWorldAssetId() const { return x84_mlvlId; }
void SetHardMode(bool v) { x228_24_hardMode = v; }
bool GetHardMode() const { return x228_24_hardMode; }
void ReadPersistentOptions(CInputStream& r);
2018-12-07 21:30:43 -08:00
void SetPersistentOptions(const CPersistentOptions& opts) { xa8_systemOptions = opts; }
void ImportPersistentOptions(const CPersistentOptions& opts);
void ExportPersistentOptions(CPersistentOptions& opts) const;
void SetGameOptions(const CGameOptions& opts) { x17c_gameOptions = opts; }
void WriteBackupBuf();
std::vector<u8>& BackupBuf() { return x218_backupBuf; }
u32 GetFileIdx() const { return x20c_saveFileIdx; }
void SetFileIdx(u32 idx) { x20c_saveFileIdx = idx; }
void SetCardSerial(u64 serial) { x210_cardSerial = serial; }
u64 GetCardSerial() const { return x210_cardSerial; }
void PutTo(COutputStream& writer);
2018-12-07 21:30:43 -08:00
float GetHardModeDamageMultiplier() const;
float GetHardModeWeaponMultiplier() const;
void InitializeMemoryWorlds();
void InitializeMemoryStates();
struct GameFileStateInfo {
double x0_playTime;
CAssetId x8_mlvlId;
float xc_health;
u32 x10_energyTanks;
u32 x14_timestamp;
u32 x18_itemPercent;
float x1c_scanPercent;
bool x20_hardMode;
};
static GameFileStateInfo LoadGameFileState(const u8* data);
2015-08-16 22:26:58 -07:00
};
2021-04-10 01:42:06 -07:00
} // namespace metaforce