Browse Source

fixed crash when loading neutral faction; skills.json no longer requires index values

Henning Koehler 8 years ago
parent
commit
c0740e3623
6 changed files with 41 additions and 7 deletions
  1. 0 4
      config/schemas/skill.json
  2. 0 1
      config/skills.json
  3. 7 1
      lib/CModHandler.cpp
  4. 28 0
      lib/CSkillHandler.cpp
  5. 2 0
      lib/CSkillHandler.h
  6. 4 1
      lib/CTownHandler.cpp

+ 0 - 4
config/schemas/skill.json

@@ -29,10 +29,6 @@
         "required" : ["basic", "advanced", "expert"],
 
         "properties": {
-            "index":{
-                "type": "number",
-                "description": "numeric id of skill required only for original skills, prohibited for new skills"
-            },
             "basic":{
                 "$ref" : "#/definitions/skillBonus"
             },

+ 0 - 1
config/skills.json

@@ -1,6 +1,5 @@
 {
     "estates" : {
-        "index" : 13,
         "basic" : {
             "description" : "Hero generates 250 gold each day.",
             "effects" : [

+ 7 - 1
lib/CModHandler.cpp

@@ -398,8 +398,14 @@ bool CContentHandler::ContentTypeHandler::loadMod(std::string modName, bool vali
 			}
 			else
 			{
+				// trace only name field of original data - I miss list comprehension
+				std::vector<std::string> originalNames;
+				for (const JsonNode & orgElem : originalData)
+					originalNames.push_back(orgElem["name"].String());
 				logger->debugStream() << "no original data in loadMod(" << name << ") at index " << index;
-				logger->traceStream() << data;
+				logger->traceStream() << "originalData: " << originalNames;
+				logger->traceStream() << "new data: " << data;
+
 				performValidate(data, name);
 				handler->loadObject(modName, name, data, index);
 			}

+ 28 - 0
lib/CSkillHandler.cpp

@@ -150,6 +150,34 @@ CSkill * CSkillHandler::loadFromJson(const JsonNode & json, const std::string &
     return skill;
 }
 
+void CSkillHandler::loadObject(std::string scope, std::string name, const JsonNode & data)
+{
+	auto type_name = getTypeName();
+	auto object = loadFromJson(data, normalizeIdentifier(scope, "core", name));
+
+	if(object->id == SecondarySkill::DEFAULT) // new skill - no index identified
+	{
+		object->id = SecondarySkill(objects.size());
+		objects.push_back(object);
+	}
+	else
+		objects[object->id] = object;
+
+	registerObject(scope, type_name, name, object->id);
+}
+
+void CSkillHandler::loadObject(std::string scope, std::string name, const JsonNode & data, size_t index)
+{
+	auto type_name = getTypeName();
+	auto object = loadFromJson(data, normalizeIdentifier(scope, "core", name));
+
+	assert(object->id == index);
+	objects[index] = object;
+
+	registerObject(scope,type_name, name, object->id);
+}
+
+
 void CSkillHandler::afterLoadFinalization()
 {
     CLogger * logger = CLogger::getLogger(CLoggerDomain(getTypeName()));

+ 2 - 0
lib/CSkillHandler.h

@@ -73,6 +73,8 @@ public:
 
     std::vector<bool> getDefaultAllowed() const override;
     const std::string getTypeName() const override;
+    void loadObject(std::string scope, std::string name, const JsonNode & data) override;
+    void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
 
     template <typename Handler> void serialize(Handler &h, const int version)
     {

+ 4 - 1
lib/CTownHandler.cpp

@@ -763,7 +763,10 @@ void CTownHandler::loadObject(std::string scope, std::string name, const JsonNod
 {
 	auto object = loadFromJson(data, normalizeIdentifier(scope, "core", name));
 	object->index = index;
-	assert(factions[index] == nullptr); // ensure that this id was not loaded before
+	if (factions.size() > index)
+		assert(factions[index] == nullptr); // ensure that this id was not loaded before
+	else
+		factions.resize(index + 1);
 	factions[index] = object;
 
 	if (object->town)