PrimeWorldEditor/src/Core/GameProject/CGameInfo.cpp

99 lines
2.4 KiB
C++

#include "CGameInfo.h"
#include "CResourceStore.h"
#include <Common/FileUtil.h>
#include <algorithm>
constexpr char gkGameInfoDir[] = "resources/gameinfo";
constexpr char gkGameInfoExt[] = "xml";
bool CGameInfo::LoadGameInfo(EGame Game)
{
Game = RoundGame(Game);
mGame = Game;
TString Path = GetDefaultGameInfoPath(Game);
return LoadGameInfo(Path);
}
bool CGameInfo::LoadGameInfo(const TString& Path)
{
CXMLReader Reader(Path);
if (Reader.IsValid())
{
Serialize(Reader);
return true;
}
return false;
}
bool CGameInfo::SaveGameInfo(TString Path)
{
ASSERT(mGame != EGame::Invalid); // can't save game info that was never loaded
if (Path.IsEmpty())
Path = GetDefaultGameInfoPath(mGame);
CXMLWriter Writer(Path, "GameInfo", 0, mGame);
Serialize(Writer);
return Writer.Save();
}
void CGameInfo::Serialize(IArchive& rArc)
{
// Validate game
if (rArc.IsReader() && mGame != EGame::Invalid)
{
ASSERT(mGame == rArc.Game());
}
// Serialize data
rArc << SerialParameter("GameBuilds", mBuilds);
if (mGame <= EGame::Prime)
rArc << SerialParameter("AreaNameMap", mAreaNameMap);
}
TString CGameInfo::GetBuildName(float BuildVer, ERegion Region) const
{
const auto it = std::find_if(mBuilds.cbegin(), mBuilds.cend(),
[=](const auto& entry) { return entry.Version == BuildVer && entry.Region == Region; });
if (it == mBuilds.cend())
return "Unknown Build";
return it->Name;
}
TString CGameInfo::GetAreaName(const CAssetID &rkID) const
{
const auto Iter = mAreaNameMap.find(rkID);
return Iter == mAreaNameMap.cend() ? "" : Iter->second;
}
// ************ STATIC ************
EGame CGameInfo::RoundGame(EGame Game)
{
if (Game == EGame::PrimeDemo) return EGame::Prime;
if (Game == EGame::EchoesDemo) return EGame::Echoes;
if (Game == EGame::CorruptionProto) return EGame::Corruption;
return Game;
}
TString CGameInfo::GetDefaultGameInfoPath(EGame Game)
{
Game = RoundGame(Game);
if (Game == EGame::Invalid)
return "";
const TString GameName = GetGameShortName(Game);
return TString::Format("%s/%s/GameInfo%s.%s", gDataDir.ToStdString().c_str(), gkGameInfoDir, GameName.ToStdString().c_str(), gkGameInfoExt);
}
TString CGameInfo::GetExtension()
{
return gkGameInfoExt;
}