metaforce/Runtime/CMemoryCardSys.hpp

182 lines
6.8 KiB
C++
Raw Normal View History

2016-04-12 23:07:23 -07:00
#ifndef __URDE_CMEMORYCARDSYS_HPP__
#define __URDE_CMEMORYCARDSYS_HPP__
2015-08-16 22:26:58 -07:00
2016-09-24 18:58:20 -07:00
#include "CToken.hpp"
#include "World/CWorld.hpp"
#include "CGameHintInfo.hpp"
#include "CSaveWorld.hpp"
#include "GuiSys/CStringTable.hpp"
2016-12-28 00:51:28 -08:00
#include "kabufuda/Card.hpp"
2016-09-24 18:58:20 -07:00
#include <vector>
2016-03-04 15:04:53 -08:00
namespace urde
{
2016-09-24 18:58:20 -07:00
class CDummyWorld;
class CStringTable;
2016-12-22 22:41:39 -08:00
class CSimplePool;
2016-09-24 18:58:20 -07:00
class CSaveWorldMemory
{
friend class CMemoryCardSys;
ResId x0_strgId = -1;
ResId x4_savwId = -1;
u32 x8_areaCount;
2016-10-09 00:45:04 -07:00
std::vector<ResId> xc_areaIds;
std::vector<CWorldLayers::Area> x1c_defaultLayerStates;
TLockedToken<CStringTable> x2c_worldName; /* used to be optional */
TLockedToken<CSaveWorld> x3c_saveWorld; /* used to be optional */
2016-09-24 18:58:20 -07:00
public:
ResId GetSaveWorldAssetId() const { return x4_savwId; }
u32 GetAreaCount() const { return x8_areaCount; }
const TLockedToken<CStringTable>& GetWorldName() const { return x2c_worldName; }
const TLockedToken<CSaveWorld>& GetSaveWorld() const { return x3c_saveWorld; }
const wchar_t* GetFrontEndName() const
2017-01-08 19:44:00 -08:00
{
if (!x2c_worldName)
return L"";
2017-01-08 19:44:00 -08:00
return x2c_worldName->GetString(0);
}
2016-09-24 18:58:20 -07:00
};
class CSaveWorldIntermediate
2016-09-24 18:58:20 -07:00
{
friend class CMemoryCardSys;
ResId x0_mlvlId;
ResId x4_strgId;
ResId x8_savwId;
std::vector<ResId> xc_areaIds;
2016-10-09 00:45:04 -07:00
std::vector<CWorldLayers::Area> x1c_defaultLayerStates;
std::unique_ptr<CDummyWorld> x2c_dummyWorld;
TLockedToken<CSaveWorld> x34_saveWorld; /* Used to be auto_ptr */
public:
CSaveWorldIntermediate(ResId mlvl, ResId savw);
bool InitializePump();
2016-09-24 18:58:20 -07:00
};
2015-08-16 22:26:58 -07:00
class CMemoryCardSys
{
2016-09-24 18:58:20 -07:00
TLockedToken<CGameHintInfo> x0_hints;
std::vector<std::pair<ResId, CSaveWorldMemory>> xc_memoryWorlds; /* MLVL as key */
std::experimental::optional<std::vector<CSaveWorldIntermediate>> x1c_worldInter; /* used to be auto_ptr of vector */
2016-12-20 13:51:50 -08:00
std::vector<std::pair<ResId, CSaveWorld::EScanCategory>> x20_scanStates;
2016-09-24 18:58:20 -07:00
public:
static kabufuda::SystemString ResolveDolphinCardPath(kabufuda::ECardSlot slot);
2016-12-28 00:51:28 -08:00
using ECardResult = kabufuda::ECardResult;
struct CardResult
2016-12-17 20:16:04 -08:00
{
2016-12-28 00:51:28 -08:00
ECardResult result;
CardResult(ECardResult res) : result(res) {}
operator ECardResult() const { return result; }
operator bool() const { return result != ECardResult::READY; }
2016-12-17 20:16:04 -08:00
};
2016-12-28 00:51:28 -08:00
struct CardFileHandle
2016-12-20 13:51:50 -08:00
{
2016-12-28 00:51:28 -08:00
kabufuda::ECardSlot slot;
std::unique_ptr<kabufuda::IFileHandle> handle;
CardFileHandle(kabufuda::ECardSlot slot) : slot(slot) {}
kabufuda::IFileHandle* operator->() const { return handle.get(); }
operator std::unique_ptr<kabufuda::IFileHandle>&() { return handle; }
operator const std::unique_ptr<kabufuda::IFileHandle>&() const { return handle; }
2016-12-20 13:51:50 -08:00
};
2016-12-28 00:51:28 -08:00
using CardStat = kabufuda::CardStat;
const std::vector<CGameHintInfo::CGameHint>& GetHints() const { return x0_hints->GetHints(); }
const std::vector<std::pair<ResId, CSaveWorldMemory>>& GetMemoryWorlds() const { return xc_memoryWorlds; }
const std::vector<std::pair<ResId, CSaveWorld::EScanCategory>>& GetScanStates() const { return x20_scanStates; }
2017-01-08 19:44:00 -08:00
bool HasSaveWorldMemory(ResId wldId) const;
const CSaveWorldMemory& GetSaveWorldMemory(ResId wldId) const;
2016-12-28 00:51:28 -08:00
CMemoryCardSys();
bool InitializePump();
2016-12-22 22:41:39 -08:00
struct CCardFileInfo
{
struct Icon
{
ResId x0_id;
2016-12-28 00:51:28 -08:00
kabufuda::EAnimationSpeed x4_speed;
2016-12-22 22:41:39 -08:00
TLockedToken<CTexture> x8_tex;
2016-12-28 00:51:28 -08:00
Icon(ResId id, kabufuda::EAnimationSpeed speed, CSimplePool& sp, const CVParamTransfer& cv);
2016-12-22 22:41:39 -08:00
};
enum class EStatus
{
Standby,
Transferring,
Done
};
EStatus x0_status = EStatus::Standby;
2016-12-28 00:51:28 -08:00
//CARDFileInfo x4_info;
CardFileHandle m_handle;
2016-12-23 16:45:51 -08:00
std::string x18_fileName;
std::string x28_comment;
2016-12-22 22:41:39 -08:00
ResId x3c_bannerTex = -1;
std::experimental::optional<TLockedToken<CTexture>> x40_bannerTok;
rstl::reserved_vector<Icon, 8> x50_iconToks;
std::vector<u8> xf4_saveBuffer;
std::vector<u8> x104_cardBuffer;
CVParamTransfer m_texParam = {new TObjOwnerParam<u32>(SBIG('OTEX'))};
2016-12-28 00:51:28 -08:00
CCardFileInfo(kabufuda::ECardSlot port, const std::string& name)
: m_handle(port), x18_fileName(name) {}
2016-12-22 22:41:39 -08:00
void LockBannerToken(ResId bannerTxtr, CSimplePool& sp);
2016-12-28 00:51:28 -08:00
void LockIconToken(ResId iconTxtr, kabufuda::EAnimationSpeed speed, CSimplePool& sp);
2016-12-22 22:41:39 -08:00
2016-12-28 00:51:28 -08:00
kabufuda::ECardSlot GetCardPort() const { return m_handle.slot; }
int GetFileNo() const { return m_handle->getFileNo(); }
2016-12-22 22:41:39 -08:00
u32 CalculateBannerDataSize() const;
u32 CalculateTotalDataSize() const;
void BuildCardBuffer();
void WriteBannerData(CMemoryOutStream& out) const;
void WriteIconData(CMemoryOutStream& out) const;
2016-12-23 16:45:51 -08:00
void SetComment(const std::string& c) { x28_comment = c; }
2016-12-22 22:41:39 -08:00
ECardResult PumpCardTransfer();
2016-12-28 00:51:28 -08:00
ECardResult GetStatus(CardStat& stat) const;
2016-12-22 22:41:39 -08:00
ECardResult CreateFile();
2016-12-28 00:51:28 -08:00
ECardResult WriteFile();
ECardResult CloseFile();
2016-12-23 16:45:51 -08:00
CMemoryOutStream BeginMemoryOut(u32 sz)
{
xf4_saveBuffer.resize(sz);
return CMemoryOutStream(xf4_saveBuffer.data(), sz);
}
2016-12-22 22:41:39 -08:00
};
2016-12-28 00:51:28 -08:00
static kabufuda::ProbeResults CardProbe(kabufuda::ECardSlot port);
static ECardResult MountCard(kabufuda::ECardSlot port);
2016-12-28 13:51:33 -08:00
static ECardResult UnmountCard(kabufuda::ECardSlot port);
2016-12-28 00:51:28 -08:00
static ECardResult CheckCard(kabufuda::ECardSlot port);
static ECardResult CreateFile(kabufuda::ECardSlot port, const char* name, u32 size, CardFileHandle& info);
static ECardResult OpenFile(kabufuda::ECardSlot port, const char* name, CardFileHandle& info);
static ECardResult FastOpenFile(kabufuda::ECardSlot port, int fileNo, CardFileHandle& info);
static ECardResult CloseFile(CardFileHandle& info);
static ECardResult ReadFile(const CardFileHandle& info, void* buf, s32 length, s32 offset);
static ECardResult WriteFile(const CardFileHandle& info, const void* buf, s32 length, s32 offset);
static ECardResult GetNumFreeBytes(kabufuda::ECardSlot port, s32& freeBytes, s32& freeFiles);
static ECardResult GetSerialNo(kabufuda::ECardSlot port, u64& serialOut);
static ECardResult GetResultCode(kabufuda::ECardSlot port);
static ECardResult GetStatus(const CardFileHandle& info, CardStat& statOut);
static ECardResult SetStatus(const CardFileHandle& info, const CardStat& stat);
2016-12-28 00:51:28 -08:00
static ECardResult DeleteFile(kabufuda::ECardSlot port, const char* name);
static ECardResult FastDeleteFile(kabufuda::ECardSlot port, int fileNo);
static ECardResult Rename(kabufuda::ECardSlot port, const char* oldName, const char* newName);
static ECardResult FormatCard(kabufuda::ECardSlot port);
2016-12-28 13:51:33 -08:00
static void CommitToDisk(kabufuda::ECardSlot port);
2015-08-16 22:26:58 -07:00
};
}
2016-04-12 23:07:23 -07:00
#endif // __URDE_CMEMORYCARDSYS_HPP__