1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-03 13:01:33 +02:00

Start implementing PlayerInfo serialisation

This commit is contained in:
AlexVinS 2015-08-24 09:11:09 +03:00 committed by AlexVinS
parent 2f67e015e1
commit 60825fbbd3
2 changed files with 90 additions and 6 deletions

View File

@ -210,6 +210,17 @@ CMapLoaderJson::CMapLoaderJson(CInputOutputStream * stream):
}
si32 CMapLoaderJson::getIdentifier(const std::string& type, const std::string& name)
{
boost::optional<si32> res = VLC->modh->identifiers.getIdentifier("core", type, name, false);
if(!res)
{
throw new std::runtime_error("Map load failed. Identifier not resolved.");
}
return res.get();
}
std::unique_ptr<CMap> CMapLoaderJson::loadMap()
{
map = new CMap();
@ -285,16 +296,61 @@ void CMapLoaderJson::readHeader()
// std::vector<ui16> placeholdedHeroes;
readTriggeredEvents(header);
readPlayerInfo();
readPlayerInfo(header);
//TODO: readHeader
}
void CMapLoaderJson::readPlayerInfo()
void CMapLoaderJson::readPlayerInfo(const JsonNode & input)
{
//ui8 howManyTeams;
//TODO: readPlayerInfo
const JsonNode & src = input["players"];
int howManyTeams = 0;
for(int player = 0; player < PlayerColor::PLAYER_LIMIT_I; player++)
{
PlayerInfo & info = map->players.at(player);
const JsonNode & playerSrc = src[GameConstants::PLAYER_COLOR_NAMES[player]];
if(playerSrc.isNull())
{
info.canComputerPlay = false;
info.canHumanPlay = false;
}
else
{
readPlayerInfo(info, playerSrc);
vstd::amax(howManyTeams, info.team.getNum()+1);
}
}
mapHeader->howManyTeams = howManyTeams;
}
void CMapLoaderJson::readPlayerInfo(PlayerInfo& info, const JsonNode& input)
{
//allowed factions
info.isFactionRandom = input["randomFaction"].Bool();
info.canComputerPlay = input["canComputerPlay"].Bool();
info.canHumanPlay = input["canHumanPlay"].Bool();
//plasedHeroes
//mainTown
info.generateHeroAtMainTown = input["generateHeroAtMainTown"].Bool();
info.hasRandomHero = input["randomHero"].Bool();
//mainHero
//mainHeroPortrait
info.mainCustomHeroName = input["mainHeroName"].String();
info.team = TeamID(input["team"].Float());
}
void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile)
{
using namespace TerrainDetail;
@ -533,7 +589,28 @@ void CMapSaverJson::writePlayerInfo(JsonNode & output)
void CMapSaverJson::writePlayerInfo(const PlayerInfo & info, JsonNode & output)
{
//allowed factions
output["randomFaction"].Bool() = info.isFactionRandom;
output["canComputerPlay"].Bool() = info.canComputerPlay;
output["canHumanPlay"].Bool() = info.canHumanPlay;
//plasedHeroes
//mainTown
output["generateHeroAtMainTown"].Bool() = info.generateHeroAtMainTown;
output["randomHero"].Bool() = info.hasRandomHero;
//mainHero
//mainHeroPortrait
output["mainHeroName"].String() = info.mainCustomHeroName;
output["team"].Float() = info.team.getNum();
}
const std::string CMapSaverJson::writeTerrainTile(const TerrainTile & tile)

View File

@ -120,7 +120,9 @@ public:
*/
std::unique_ptr<CMapHeader> loadMapHeader() override;
private:
private:
si32 getIdentifier(const std::string & type, const std::string & name);
/**
* Reads complete map.
*/
@ -134,7 +136,12 @@ private:
/**
* Reads player information.
*/
void readPlayerInfo();
void readPlayerInfo(const JsonNode & input);
/**
* Reads one player information.
*/
void readPlayerInfo(PlayerInfo & info, const JsonNode & input);
void readTerrainTile(const std::string & src, TerrainTile & tile);