1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

* WIP on event condition format

* Hero portrait serialization
* Fix town spells serialization

* Added support for float exponential part in Json
* Added support for int64 in Json
* Added basic Hero definitions serialization
* Added rumors serialization
* Advanced player info serialization.
* Added Disposed heroes serialization, (!) not covered with tests yet
* Added Local event serialization
* Added Pandoras box serialization
* Added Seer hut reward serialization
* Added CQuest serialization
* Added API for map object instance names serialization.
* Added random dwelling options serialization
* Advanced town options serialization
* Advanced hero options serialization
* More map format tests
* A lot of fixes, cleanup and refactoring
This commit is contained in:
AlexVinS
2016-11-13 13:38:42 +03:00
parent 5127061e28
commit a85b4cf2a5
70 changed files with 18728 additions and 687 deletions

View File

@@ -83,11 +83,12 @@ JsonNode::JsonNode(const JsonNode &copy):
switch(type)
{
break; case DATA_NULL:
break; case DATA_BOOL: Bool() = copy.Bool();
break; case DATA_FLOAT: Float() = copy.Float();
break; case DATA_STRING: String() = copy.String();
break; case DATA_VECTOR: Vector() = copy.Vector();
break; case DATA_STRUCT: Struct() = copy.Struct();
break; case DATA_BOOL: Bool() = copy.Bool();
break; case DATA_FLOAT: Float() = copy.Float();
break; case DATA_STRING: String() = copy.String();
break; case DATA_VECTOR: Vector() = copy.Vector();
break; case DATA_STRUCT: Struct() = copy.Struct();
break; case DATA_INTEGER:Integer() = copy.Integer();
}
}
@@ -122,6 +123,7 @@ bool JsonNode::operator == (const JsonNode &other) const
case DATA_STRING: return String() == other.String();
case DATA_VECTOR: return Vector() == other.Vector();
case DATA_STRUCT: return Struct() == other.Struct();
case DATA_INTEGER:return Integer()== other.Integer();
}
}
return false;
@@ -167,6 +169,22 @@ void JsonNode::setType(JsonType Type)
if (type == Type)
return;
//float<->int conversion
if(type == DATA_FLOAT && Type == DATA_INTEGER)
{
si64 converted = data.Float;
type = Type;
data.Integer = converted;
return;
}
else if(type == DATA_INTEGER && Type == DATA_FLOAT)
{
double converted = data.Integer;
type = Type;
data.Float = converted;
return;
}
//Reset node to nullptr
if (Type != DATA_NULL)
setType(DATA_NULL);
@@ -189,6 +207,7 @@ void JsonNode::setType(JsonType Type)
break; case DATA_STRING: data.String = new std::string();
break; case DATA_VECTOR: data.Vector = new JsonVector();
break; case DATA_STRUCT: data.Struct = new JsonMap();
break; case DATA_INTEGER: data.Integer = 0;
}
}
@@ -197,6 +216,11 @@ bool JsonNode::isNull() const
return type == DATA_NULL;
}
bool JsonNode::isNumber() const
{
return type == DATA_INTEGER || type == DATA_FLOAT;
}
void JsonNode::clear()
{
setType(DATA_NULL);
@@ -214,6 +238,12 @@ double & JsonNode::Float()
return data.Float;
}
si64 & JsonNode::Integer()
{
setType(DATA_INTEGER);
return data.Integer;
}
std::string & JsonNode::String()
{
setType(DATA_STRING);
@@ -233,7 +263,7 @@ JsonMap & JsonNode::Struct()
}
const bool boolDefault = false;
const bool & JsonNode::Bool() const
bool JsonNode::Bool() const
{
if (type == DATA_NULL)
return boolDefault;
@@ -242,14 +272,29 @@ const bool & JsonNode::Bool() const
}
const double floatDefault = 0;
const double & JsonNode::Float() const
double JsonNode::Float() const
{
if (type == DATA_NULL)
if(type == DATA_NULL)
return floatDefault;
else if(type == DATA_INTEGER)
return data.Integer;
assert(type == DATA_FLOAT);
return data.Float;
}
const si64 integetDefault = 0;
si64 JsonNode::Integer() const
{
if(type == DATA_NULL)
return integetDefault;
else if(type == DATA_FLOAT)
return data.Float;
assert(type == DATA_INTEGER);
return data.Integer;
}
const std::string stringDefault = std::string();
const std::string & JsonNode::String() const
{
@@ -385,6 +430,9 @@ void JsonUtils::resolveIdentifier(si32 &var, const JsonNode &node, std::string n
{
switch (value.getType())
{
case JsonNode::DATA_INTEGER:
var = value.Integer();
break;
case JsonNode::DATA_FLOAT:
var = value.Float();
break;
@@ -404,6 +452,9 @@ void JsonUtils::resolveIdentifier(const JsonNode &node, si32 &var)
{
switch (node.getType())
{
case JsonNode::DATA_INTEGER:
var = node.Integer();
break;
case JsonNode::DATA_FLOAT:
var = node.Float();
break;
@@ -738,6 +789,7 @@ void JsonUtils::merge(JsonNode & dest, JsonNode & source)
}
case JsonNode::DATA_BOOL:
case JsonNode::DATA_FLOAT:
case JsonNode::DATA_INTEGER:
case JsonNode::DATA_STRING:
case JsonNode::DATA_VECTOR:
{