mirror of
https://github.com/vcmi/vcmi.git
synced 2025-09-16 09:26:28 +02:00
ObjectTemplate serialization
(+) generated map displayed correctly in editor
This commit is contained in:
@@ -335,7 +335,7 @@ void CGObjectInstance::writeJson(JsonNode & json, bool withState) const
|
|||||||
json["y"].Float() = pos.y;
|
json["y"].Float() = pos.y;
|
||||||
json["l"].Float() = pos.z;
|
json["l"].Float() = pos.z;
|
||||||
|
|
||||||
appearance.writeJson(json["template"]);
|
appearance.writeJson(json["template"], false);
|
||||||
writeJsonOptions(json["options"]);
|
writeJsonOptions(json["options"]);
|
||||||
if(withState)
|
if(withState)
|
||||||
writeJsonState(json["state"]);
|
writeJsonState(json["state"]);
|
||||||
@@ -352,7 +352,7 @@ void CGObjectInstance::readJson(const JsonNode & json, bool withState)
|
|||||||
pos.y = json["y"].Float();
|
pos.y = json["y"].Float();
|
||||||
pos.z = json["l"].Float();
|
pos.z = json["l"].Float();
|
||||||
|
|
||||||
appearance.readJson(json["template"]);
|
appearance.readJson(json["template"], false);
|
||||||
readJsonOptions(json["options"]);
|
readJsonOptions(json["options"]);
|
||||||
if(withState)
|
if(withState)
|
||||||
readJsonState(json["state"]);
|
readJsonState(json["state"]);
|
||||||
|
@@ -183,7 +183,7 @@ void ObjectTemplate::readMap(CBinaryReader & reader)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectTemplate::readJson(const JsonNode &node)
|
void ObjectTemplate::readJson(const JsonNode &node, const bool withTerrain)
|
||||||
{
|
{
|
||||||
animationFile = node["animation"].String();
|
animationFile = node["animation"].String();
|
||||||
|
|
||||||
@@ -202,7 +202,7 @@ void ObjectTemplate::readJson(const JsonNode &node)
|
|||||||
else
|
else
|
||||||
visitDir = 0x00;
|
visitDir = 0x00;
|
||||||
|
|
||||||
if (!node["allowedTerrains"].isNull())
|
if(withTerrain && !node["allowedTerrains"].isNull())
|
||||||
{
|
{
|
||||||
for (auto & entry : node["allowedTerrains"].Vector())
|
for (auto & entry : node["allowedTerrains"].Vector())
|
||||||
allowedTerrains.insert(ETerrainType(vstd::find_pos(GameConstants::TERRAIN_NAMES, entry.String())));
|
allowedTerrains.insert(ETerrainType(vstd::find_pos(GameConstants::TERRAIN_NAMES, entry.String())));
|
||||||
@@ -211,11 +211,14 @@ void ObjectTemplate::readJson(const JsonNode &node)
|
|||||||
{
|
{
|
||||||
for (size_t i=0; i< GameConstants::TERRAIN_TYPES; i++)
|
for (size_t i=0; i< GameConstants::TERRAIN_TYPES; i++)
|
||||||
allowedTerrains.insert(ETerrainType(i));
|
allowedTerrains.insert(ETerrainType(i));
|
||||||
|
|
||||||
|
allowedTerrains.erase(ETerrainType::ROCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allowedTerrains.empty())
|
if(withTerrain && allowedTerrains.empty())
|
||||||
logGlobal->warnStream() << "Loaded template without allowed terrains!";
|
logGlobal->warnStream() << "Loaded template without allowed terrains!";
|
||||||
|
|
||||||
|
|
||||||
auto charToTile = [&](const char & ch) -> ui8
|
auto charToTile = [&](const char & ch) -> ui8
|
||||||
{
|
{
|
||||||
switch (ch)
|
switch (ch)
|
||||||
@@ -256,10 +259,91 @@ void ObjectTemplate::readJson(const JsonNode &node)
|
|||||||
printPriority = 0; //default value
|
printPriority = 0; //default value
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectTemplate::writeJson(JsonNode & node) const
|
void ObjectTemplate::writeJson(JsonNode & node, const bool withTerrain) const
|
||||||
{
|
{
|
||||||
node.setType(JsonNode::DATA_STRUCT);
|
node["animation"].String() = animationFile;
|
||||||
//todo: ObjectTemplate::writeJson
|
|
||||||
|
if(visitDir != 0x0)
|
||||||
|
{
|
||||||
|
JsonVector & visitDirs = node["visitableFrom"].Vector();
|
||||||
|
visitDirs.resize(3);
|
||||||
|
|
||||||
|
visitDirs[0].String().resize(3);
|
||||||
|
visitDirs[1].String().resize(3);
|
||||||
|
visitDirs[2].String().resize(3);
|
||||||
|
|
||||||
|
visitDirs[0].String()[0] = (visitDir & 1) ? '+' : '-';
|
||||||
|
visitDirs[0].String()[1] = (visitDir & 2) ? '+' : '-';
|
||||||
|
visitDirs[0].String()[2] = (visitDir & 4) ? '+' : '-';
|
||||||
|
visitDirs[1].String()[2] = (visitDir & 8) ? '+' : '-';
|
||||||
|
visitDirs[2].String()[2] = (visitDir & 16) ? '+' : '-';
|
||||||
|
visitDirs[2].String()[1] = (visitDir & 32) ? '+' : '-';
|
||||||
|
visitDirs[2].String()[0] = (visitDir & 64) ? '+' : '-';
|
||||||
|
visitDirs[1].String()[0] = (visitDir & 128) ? '+' : '-';
|
||||||
|
|
||||||
|
visitDirs[1].String()[1] = '-';//??? center
|
||||||
|
}
|
||||||
|
|
||||||
|
if(withTerrain)
|
||||||
|
{
|
||||||
|
//assumed that ROCK terrain not included
|
||||||
|
if(allowedTerrains.size() < (GameConstants::TERRAIN_TYPES - 1))
|
||||||
|
{
|
||||||
|
JsonVector & data = node["allowedTerrains"].Vector();
|
||||||
|
|
||||||
|
for(auto type : allowedTerrains)
|
||||||
|
{
|
||||||
|
JsonNode value(JsonNode::DATA_STRING);
|
||||||
|
value.String() = GameConstants::TERRAIN_NAMES[type.num];
|
||||||
|
data.push_back(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//todo: use lookup?
|
||||||
|
auto tileToChar = [&](const ui8 & tile) -> char
|
||||||
|
{
|
||||||
|
if(tile & VISIBLE)
|
||||||
|
{
|
||||||
|
if(tile & BLOCKED)
|
||||||
|
{
|
||||||
|
if(tile & VISITABLE)
|
||||||
|
return 'A';
|
||||||
|
else
|
||||||
|
return 'B';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 'V';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(tile & BLOCKED)
|
||||||
|
{
|
||||||
|
if(tile & VISITABLE)
|
||||||
|
return 'T';
|
||||||
|
else
|
||||||
|
return 'H';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return '0';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t height = getHeight();
|
||||||
|
size_t width = getWidth();
|
||||||
|
|
||||||
|
JsonVector & mask = node["mask"].Vector();
|
||||||
|
|
||||||
|
|
||||||
|
for(size_t i=0; i < height; i++)
|
||||||
|
{
|
||||||
|
JsonNode lineNode(JsonNode::DATA_STRING);
|
||||||
|
|
||||||
|
std::string & line = lineNode.String();
|
||||||
|
line.resize(width);
|
||||||
|
for(size_t j=0; j < width; j++)
|
||||||
|
line[j] = tileToChar(usedTiles[height - 1 - i][width - 1 - j]);
|
||||||
|
mask.push_back(lineNode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ui32 ObjectTemplate::getWidth() const
|
ui32 ObjectTemplate::getWidth() const
|
||||||
|
@@ -73,8 +73,8 @@ public:
|
|||||||
void readTxt(CLegacyConfigParser & parser);
|
void readTxt(CLegacyConfigParser & parser);
|
||||||
void readMsk();
|
void readMsk();
|
||||||
void readMap(CBinaryReader & reader);
|
void readMap(CBinaryReader & reader);
|
||||||
void readJson(const JsonNode & node);
|
void readJson(const JsonNode & node, const bool withTerrain = true);
|
||||||
void writeJson(JsonNode & node) const;
|
void writeJson(JsonNode & node, const bool withTerrain = true) const;
|
||||||
|
|
||||||
bool operator==(const ObjectTemplate& ot) const { return (id == ot.id && subid == ot.subid); }
|
bool operator==(const ObjectTemplate& ot) const { return (id == ot.id && subid == ot.subid); }
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user