浏览代码

Extracted common properties of buildings into a shared file

Ivan Savenko 1 年之前
父节点
当前提交
57430c101f

+ 41 - 0
config/buildingsLibrary.json

@@ -0,0 +1,41 @@
+{
+	"mageGuild1":     { "id" : 0 },
+	"mageGuild2":     { "id" : 1,  "upgrades" : "mageGuild1" },
+	"mageGuild3":     { "id" : 2,  "upgrades" : "mageGuild2" },
+	"mageGuild4":     { "id" : 3,  "upgrades" : "mageGuild3" },
+	"mageGuild5":     { "id" : 4,  "upgrades" : "mageGuild4" },
+	"tavern":         { "id" : 5 },
+	"shipyard":       { "id" : 6 },
+	"fort":           { "id" : 7 },
+	"citadel":        { "id" : 8,  "upgrades" : "fort" },
+	"castle":         { "id" : 9,  "upgrades" : "citadel" },
+	
+	"villageHall": {
+		"id" : 10,
+		"mode" : "auto",
+		"produce": { "gold": 500 }
+	},
+
+	"townHall": {
+		"id" : 11, 
+		"upgrades" : "villageHall", 
+		"requires" : [ "tavern" ], 
+		"produce": { "gold": 1000 }
+	},
+	"cityHall": {
+		"id" : 12,
+		"upgrades" : "townHall",
+		"requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ],
+		"produce": { "gold": 2000 }
+	},
+	"capitol": {
+		"id" : 13,
+		"upgrades" : "cityHall",
+		"requires" : [ "castle" ],
+		"produce": { "gold": 4000 }
+	},
+
+	"marketplace":    { "id" : 14 },
+	"resourceSilo":   { "id" : 15, "requires" : [ "marketplace" ] },
+	"blacksmith":     { "id" : 16 }
+}

+ 16 - 16
config/factions/castle.json

@@ -153,22 +153,22 @@
 
 			"buildings" :
 			{
-				"mageGuild1":     { "id" : 0 },
-				"mageGuild2":     { "id" : 1,  "upgrades" : "mageGuild1" },
-				"mageGuild3":     { "id" : 2,  "upgrades" : "mageGuild2" },
-				"mageGuild4":     { "id" : 3,  "upgrades" : "mageGuild3" },
-				"tavern":         { "id" : 5 },
-				"shipyard":       { "id" : 6 },
-				"fort":           { "id" : 7 },
-				"citadel":        { "id" : 8,  "upgrades" : "fort" },
-				"castle":         { "id" : 9,  "upgrades" : "citadel" },
-				"villageHall":    { "id" : 10, "mode" : "auto", "produce": { "gold": 500 } },
-				"townHall":       { "id" : 11, "upgrades" : "villageHall", "requires" : [ "tavern" ], "produce": { "gold": 1000 } },
-				"cityHall":       { "id" : 12, "upgrades" : "townHall", "requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ], "produce": { "gold": 2000 } },
-				"capitol":        { "id" : 13, "upgrades" : "cityHall", "requires" : [ "castle" ], "produce": { "gold": 4000 } },
-				"marketplace":    { "id" : 14 },
-				"resourceSilo":   { "id" : 15, "requires" : [ "marketplace" ], "produce": { "ore": 1, "wood": 1 } },
-				"blacksmith":     { "id" : 16 },
+				"mageGuild1":     { },
+				"mageGuild2":     { },
+				"mageGuild3":     { },
+				"mageGuild4":     { },
+				"tavern":         { },
+				"shipyard":       { },
+				"fort":           { },
+				"citadel":        { },
+				"castle":         { },
+				"villageHall":    { },
+				"townHall":       { },
+				"cityHall":       { },
+				"capitol":        { },
+				"marketplace":    { },
+				"resourceSilo":   { "produce": { "ore": 1, "wood": 1 } },
+				"blacksmith":     { },
 
 				"special1":       { "type" : "lighthouse", "requires" : [ "shipyard" ] },
 				"horde1":         { "id" : 18, "upgrades" : "dwellingLvl3" },

+ 17 - 17
config/factions/conflux.json

@@ -157,23 +157,23 @@
 
 			"buildings" :
 			{
-				"mageGuild1":     { "id" : 0 },
-				"mageGuild2":     { "id" : 1,  "upgrades" : "mageGuild1" },
-				"mageGuild3":     { "id" : 2,  "upgrades" : "mageGuild2" },
-				"mageGuild4":     { "id" : 3,  "upgrades" : "mageGuild3" },
-				"mageGuild5":     { "id" : 4,  "upgrades" : "mageGuild4" },
-				"tavern":         { "id" : 5 },
-				"shipyard":       { "id" : 6 },
-				"fort":           { "id" : 7 },
-				"citadel":        { "id" : 8,  "upgrades" : "fort" },
-				"castle":         { "id" : 9,  "upgrades" : "citadel" },
-				"villageHall":    { "id" : 10, "mode" : "auto", "produce": { "gold": 500 } },
-				"townHall":       { "id" : 11, "upgrades" : "villageHall", "requires" : [ "tavern" ], "produce": { "gold": 1000 } },
-				"cityHall":       { "id" : 12, "upgrades" : "townHall", "requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ], "produce": { "gold": 2000 } },
-				"capitol":        { "id" : 13, "upgrades" : "cityHall", "requires" : [ "castle" ], "produce": { "gold": 4000 } },
-				"marketplace":    { "id" : 14 },
-				"resourceSilo":   { "id" : 15, "requires" : [ "marketplace" ], "produce": { "mercury": 1 } },
-				"blacksmith":     { "id" : 16 },
+				"mageGuild1":     { },
+				"mageGuild2":     { },
+				"mageGuild3":     { },
+				"mageGuild4":     { },
+				"mageGuild5":     { },
+				"tavern":         { },
+				"shipyard":       { },
+				"fort":           { },
+				"citadel":        { },
+				"castle":         { },
+				"villageHall":    { },
+				"townHall":       { },
+				"cityHall":       { },
+				"capitol":        { },
+				"marketplace":    { },
+				"resourceSilo":   { "produce": { "mercury": 1 } },
+				"blacksmith":     { },
 
 				"special1":       { "type" : "artifactMerchant", "requires" : [ "marketplace" ] },
 				"horde1":         { "id" : 18, "upgrades" : "dwellingLvl1" },

+ 16 - 16
config/factions/dungeon.json

@@ -154,22 +154,22 @@
 
 			"buildings" :
 			{
-				"mageGuild1":     { "id" : 0 },
-				"mageGuild2":     { "id" : 1,  "upgrades" : "mageGuild1" },
-				"mageGuild3":     { "id" : 2,  "upgrades" : "mageGuild2" },
-				"mageGuild4":     { "id" : 3,  "upgrades" : "mageGuild3" },
-				"mageGuild5":     { "id" : 4,  "upgrades" : "mageGuild4" },
-				"tavern":         { "id" : 5 },
-				"fort":           { "id" : 7 },
-				"citadel":        { "id" : 8,  "upgrades" : "fort" },
-				"castle":         { "id" : 9,  "upgrades" : "citadel" },
-				"villageHall":    { "id" : 10, "mode" : "auto", "produce": { "gold": 500 } },
-				"townHall":       { "id" : 11, "upgrades" : "villageHall", "requires" : [ "tavern" ], "produce": { "gold": 1000 } },
-				"cityHall":       { "id" : 12, "upgrades" : "townHall", "requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ], "produce": { "gold": 2000 } },
-				"capitol":        { "id" : 13, "upgrades" : "cityHall", "requires" : [ "castle" ], "produce": { "gold": 4000 } },
-				"marketplace":    { "id" : 14 },
-				"resourceSilo":   { "id" : 15, "requires" : [ "marketplace" ] },
-				"blacksmith":     { "id" : 16 },
+				"mageGuild1":     { },
+				"mageGuild2":     { },
+				"mageGuild3":     { },
+				"mageGuild4":     { },
+				"mageGuild5":     { },
+				"tavern":         { },
+				"fort":           { },
+				"citadel":        { },
+				"castle":         { },
+				"villageHall":    { },
+				"townHall":       { },
+				"cityHall":       { },
+				"capitol":        { },
+				"marketplace":    { },
+				"resourceSilo":   { "produce": { "sulfur": 1 } },
+				"blacksmith":     { },
 
 				"special1":       { "type" : "artifactMerchant", "requires" : [ "marketplace" ] },
 				"horde1":         { "id" : 18, "upgrades" : "dwellingLvl1" },

+ 15 - 15
config/factions/fortress.json

@@ -153,21 +153,21 @@
 
 			"buildings" :
 			{
-				"mageGuild1":     { "id" : 0 },
-				"mageGuild2":     { "id" : 1,  "upgrades" : "mageGuild1" },
-				"mageGuild3":     { "id" : 2,  "upgrades" : "mageGuild2" },
-				"tavern":         { "id" : 5 },
-				"shipyard":       { "id" : 6 },
-				"fort":           { "id" : 7 },
-				"citadel":        { "id" : 8,  "upgrades" : "fort" },
-				"castle":         { "id" : 9,  "upgrades" : "citadel" },
-				"villageHall":    { "id" : 10, "mode" : "auto", "produce": { "gold": 500 } },
-				"townHall":       { "id" : 11, "upgrades" : "villageHall", "requires" : [ "tavern" ], "produce": { "gold": 1000 } },
-				"cityHall":       { "id" : 12, "upgrades" : "townHall", "requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ], "produce": { "gold": 2000 } },
-				"capitol":        { "id" : 13, "upgrades" : "cityHall", "requires" : [ "castle" ], "produce": { "gold": 4000 } },
-				"marketplace":    { "id" : 14 },
-				"resourceSilo":   { "id" : 15, "requires" : [ "marketplace" ], "produce": { "wood": 1, "ore": 1 } },
-				"blacksmith":     { "id" : 16 },
+				"mageGuild1":     { },
+				"mageGuild2":     { },
+				"mageGuild3":     { },
+				"tavern":         { },
+				"shipyard":       { },
+				"fort":           { },
+				"citadel":        { },
+				"castle":         { },
+				"villageHall":    { },
+				"townHall":       { },
+				"cityHall":       { },
+				"capitol":        { },
+				"marketplace":    { },
+				"resourceSilo":   { "produce": { "wood": 1, "ore": 1 } },
+				"blacksmith":     { },
 
 				"special1":       {
 					"type" : "configurable",

+ 16 - 16
config/factions/inferno.json

@@ -154,22 +154,22 @@
 
 			"buildings" :
 			{
-				"mageGuild1":     { "id" : 0 },
-				"mageGuild2":     { "id" : 1,  "upgrades" : "mageGuild1" },
-				"mageGuild3":     { "id" : 2,  "upgrades" : "mageGuild2" },
-				"mageGuild4":     { "id" : 3,  "upgrades" : "mageGuild3" },
-				"mageGuild5":     { "id" : 4,  "upgrades" : "mageGuild4" },
-				"tavern":         { "id" : 5 },
-				"fort":           { "id" : 7 },
-				"citadel":        { "id" : 8,  "upgrades" : "fort" },
-				"castle":         { "id" : 9,  "upgrades" : "citadel" },
-				"villageHall":    { "id" : 10, "mode" : "auto", "produce": { "gold": 500 } },
-				"townHall":       { "id" : 11, "upgrades" : "villageHall", "requires" : [ "tavern" ], "produce": { "gold": 1000 } },
-				"cityHall":       { "id" : 12, "upgrades" : "townHall", "requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ], "produce": { "gold": 2000 } },
-				"capitol":        { "id" : 13, "upgrades" : "cityHall", "requires" : [ "castle" ], "produce": { "gold": 4000 } },
-				"marketplace":    { "id" : 14 },
-				"resourceSilo":   { "id" : 15, "requires" : [ "marketplace" ], "produce": { "mercury": 1 } },
-				"blacksmith":     { "id" : 16 },
+				"mageGuild1":     { },
+				"mageGuild2":     { },
+				"mageGuild3":     { },
+				"mageGuild4":     { },
+				"mageGuild5":     { },
+				"tavern":         { },
+				"fort":           { },
+				"citadel":        { },
+				"castle":         { },
+				"villageHall":    { },
+				"townHall":       { },
+				"cityHall":       { },
+				"capitol":        { },
+				"marketplace":    { },
+				"resourceSilo":   { "produce": { "mercury": 1 } },
+				"blacksmith":     { },
 
 				"horde1":         { "id" : 18, "upgrades" : "dwellingLvl1" },
 				"horde1Upgr":     { "id" : 19, "upgrades" : "dwellingUpLvl1", "requires" : [ "horde1" ], "mode" : "auto" },

+ 17 - 17
config/factions/necropolis.json

@@ -158,23 +158,23 @@
 
 			"buildings" :
 			{
-				"mageGuild1":     { "id" : 0 },
-				"mageGuild2":     { "id" : 1,  "upgrades" : "mageGuild1" },
-				"mageGuild3":     { "id" : 2,  "upgrades" : "mageGuild2" },
-				"mageGuild4":     { "id" : 3,  "upgrades" : "mageGuild3" },
-				"mageGuild5":     { "id" : 4,  "upgrades" : "mageGuild4" },
-				"tavern":         { "id" : 5 },
-				"shipyard":       { "id" : 6 },
-				"fort":           { "id" : 7 },
-				"citadel":        { "id" : 8,  "upgrades" : "fort" },
-				"castle":         { "id" : 9,  "upgrades" : "citadel" },
-				"villageHall":    { "id" : 10, "mode" : "auto", "produce": { "gold": 500 } },
-				"townHall":       { "id" : 11, "upgrades" : "villageHall", "requires" : [ "tavern" ], "produce": { "gold": 1000 } },
-				"cityHall":       { "id" : 12, "upgrades" : "townHall", "requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ], "produce": { "gold": 2000 } },
-				"capitol":        { "id" : 13, "upgrades" : "cityHall", "requires" : [ "castle" ], "produce": { "gold": 4000 } },
-				"marketplace":    { "id" : 14 },
-				"resourceSilo":   { "id" : 15, "requires" : [ "marketplace" ], "produce": { "ore": 1, "wood": 1 } },
-				"blacksmith":     { "id" : 16 },
+				"mageGuild1":     { },
+				"mageGuild2":     { },
+				"mageGuild3":     { },
+				"mageGuild4":     { },
+				"mageGuild5":     { },
+				"tavern":         { },
+				"shipyard":       { },
+				"fort":           { },
+				"citadel":        { },
+				"castle":         { },
+				"villageHall":    { },
+				"townHall":       { },
+				"cityHall":       { },
+				"capitol":        { },
+				"marketplace":    { },
+				"resourceSilo":   { "produce": { "ore": 1, "wood": 1 } },
+				"blacksmith":     { },
 
 				"special1":       { "requires" : [ "fort" ], "bonuses": [ { "type": "DARKNESS", "val": 20  } ] },
 				"horde1":         { "id" : 18, "upgrades" : "dwellingLvl1", "requires" : [ "special3" ] },

+ 16 - 16
config/factions/rampart.json

@@ -157,22 +157,22 @@
 
 			"buildings" :
 			{
-				"mageGuild1":     { "id" : 0 },
-				"mageGuild2":     { "id" : 1,  "upgrades" : "mageGuild1" },
-				"mageGuild3":     { "id" : 2,  "upgrades" : "mageGuild2" },
-				"mageGuild4":     { "id" : 3,  "upgrades" : "mageGuild3" },
-				"mageGuild5":     { "id" : 4,  "upgrades" : "mageGuild4" },
-				"tavern":         { "id" : 5 },
-				"fort":           { "id" : 7 },
-				"citadel":        { "id" : 8,  "upgrades" : "fort" },
-				"castle":         { "id" : 9,  "upgrades" : "citadel" },
-				"villageHall":    { "id" : 10, "mode" : "auto", "produce": { "gold": 500 } },
-				"townHall":       { "id" : 11, "upgrades" : "villageHall", "requires" : [ "tavern" ], "produce": { "gold": 1000 } },
-				"cityHall":       { "id" : 12, "upgrades" : "townHall", "requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ], "produce": { "gold": 2000 } },
-				"capitol":        { "id" : 13, "upgrades" : "cityHall", "requires" : [ "castle" ], "produce": { "gold": 4000 } },
-				"marketplace":    { "id" : 14 },
-				"resourceSilo":   { "id" : 15, "requires" : [ "marketplace" ], "produce": { "crystal": 1 } },
-				"blacksmith":     { "id" : 16 },
+				"mageGuild1":     { },
+				"mageGuild2":     { },
+				"mageGuild3":     { },
+				"mageGuild4":     { },
+				"mageGuild5":     { },
+				"tavern":         { },
+				"fort":           { },
+				"citadel":        { },
+				"castle":         { },
+				"villageHall":    { },
+				"townHall":       { },
+				"cityHall":       { },
+				"capitol":        { },
+				"marketplace":    { },
+				"resourceSilo":   { "produce": { "crystal": 1 } },
+				"blacksmith":     { },
 
 				"special1":       { "type" : "mysticPond" },
 				"horde1":         { "id" : 18, "upgrades" : "dwellingLvl2" },

+ 14 - 14
config/factions/stronghold.json

@@ -151,20 +151,20 @@
 
 			"buildings" :
 			{
-				"mageGuild1":     { "id" : 0 },
-				"mageGuild2":     { "id" : 1,  "upgrades" : "mageGuild1" },
-				"mageGuild3":     { "id" : 2,  "upgrades" : "mageGuild2" },
-				"tavern":         { "id" : 5 },
-				"fort":           { "id" : 7 },
-				"citadel":        { "id" : 8,  "upgrades" : "fort" },
-				"castle":         { "id" : 9,  "upgrades" : "citadel" },
-				"villageHall":    { "id" : 10, "mode" : "auto", "produce": { "gold": 500 } },
-				"townHall":       { "id" : 11, "upgrades" : "villageHall", "requires" : [ "tavern" ], "produce": { "gold": 1000 } },
-				"cityHall":       { "id" : 12, "upgrades" : "townHall", "requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ], "produce": { "gold": 2000 } },
-				"capitol":        { "id" : 13, "upgrades" : "cityHall", "requires" : [ "castle" ], "produce": { "gold": 4000 } },
-				"marketplace":    { "id" : 14 },
-				"resourceSilo":   { "id" : 15, "requires" : [ "marketplace" ], "produce": { "ore": 1, "wood": 1 } },
-				"blacksmith":     { "id" : 16 },
+				"mageGuild1":     { },
+				"mageGuild2":     { },
+				"mageGuild3":     { },
+				"tavern":         { },
+				"fort":           { },
+				"citadel":        { },
+				"castle":         { },
+				"villageHall":    { },
+				"townHall":       { },
+				"cityHall":       { },
+				"capitol":        { },
+				"marketplace":    { },
+				"resourceSilo":   { "produce": { "ore": 1, "wood": 1 } },
+				"blacksmith":     { },
 
 				"special1":       { "type" : "escapeTunnel", "requires" : [ "fort" ] },
 				"horde1":         { "id" : 18, "upgrades" : "dwellingLvl1" },

+ 16 - 16
config/factions/tower.json

@@ -152,22 +152,22 @@
 
 			"buildings" :
 			{
-				"mageGuild1":     { "id" : 0 },
-				"mageGuild2":     { "id" : 1,  "upgrades" : "mageGuild1" },
-				"mageGuild3":     { "id" : 2,  "upgrades" : "mageGuild2" },
-				"mageGuild4":     { "id" : 3,  "upgrades" : "mageGuild3" },
-				"mageGuild5":     { "id" : 4,  "upgrades" : "mageGuild4" },
-				"tavern":         { "id" : 5 },
-				"fort":           { "id" : 7 },
-				"citadel":        { "id" : 8,  "upgrades" : "fort" },
-				"castle":         { "id" : 9,  "upgrades" : "citadel" },
-				"villageHall":    { "id" : 10, "mode" : "auto", "produce" : { "gold": 500 } },
-				"townHall":       { "id" : 11, "upgrades" : "villageHall", "requires" : [ "tavern" ], "produce" : { "gold": 1000 } },
-				"cityHall":       { "id" : 12, "upgrades" : "townHall", "requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ], "produce": { "gold": 2000 } },
-				"capitol":        { "id" : 13, "upgrades" : "cityHall", "requires" : [ "castle" ], "produce" : { "gold": 4000 } },
-				"marketplace":    { "id" : 14 },
-				"resourceSilo":   { "id" : 15, "requires" : [ "marketplace" ], "produce" : { "gems": 1 } },
-				"blacksmith":     { "id" : 16 },
+				"mageGuild1":     { },
+				"mageGuild2":     { },
+				"mageGuild3":     { },
+				"mageGuild4":     { },
+				"mageGuild5":     { },
+				"tavern":         { },
+				"fort":           { },
+				"citadel":        { },
+				"castle":         { },
+				"villageHall":    { },
+				"townHall":       { },
+				"cityHall":       { },
+				"capitol":        { },
+				"marketplace":    { },
+				"resourceSilo":   { "produce" : { "gems": 1 } },
+				"blacksmith":     { },
 
 				"special1":       { "type" : "artifactMerchant", "requires" : [ "marketplace" ] },
 				"horde1":         { "id" : 18, "upgrades" : "dwellingLvl2" },

+ 28 - 3
lib/entities/faction/CTownHandler.cpp

@@ -30,14 +30,16 @@
 #include "../../texts/CGeneralTextHandler.h"
 #include "../../texts/CLegacyConfigParser.h"
 #include "../../json/JsonBonus.h"
+#include "../../json/JsonUtils.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
 const int NAMES_PER_TOWN=16; // number of town names per faction in H3 files. Json can define any number
 
-CTownHandler::CTownHandler():
-	randomTown(new CTown()),
-	randomFaction(new CFaction())
+CTownHandler::CTownHandler()
+	: buildingsLibrary(JsonPath::builtin("config/buildingsLibrary"))
+	, randomTown(new CTown())
+	, randomFaction(new CFaction())
 {
 	randomFaction->town = randomTown;
 	randomTown->faction = randomFaction;
@@ -895,6 +897,29 @@ void CTownHandler::loadCustom()
 	loadRandomFaction();
 }
 
+void CTownHandler::beforeValidate(JsonNode & object)
+{
+	if (object.Struct().count("town") == 0)
+		return;
+
+	const auto & inheritBuilding = [this](const std::string & name, JsonNode & target)
+	{
+		if (buildingsLibrary.Struct().count(name) == 0)
+			return;
+
+		JsonNode baseCopy(buildingsLibrary[name]);
+		baseCopy.setModScope(target.getModScope());
+		JsonUtils::inherit(target, baseCopy);
+	};
+
+	for (auto & building : object["town"]["buildings"].Struct())
+	{
+		inheritBuilding(building.first, building.second);
+		if (building.second.Struct().count("type"))
+			inheritBuilding(building.second["type"].String(), building.second);
+	}
+}
+
 void CTownHandler::afterLoadFinalization()
 {
 	initializeRequirements();

+ 3 - 0
lib/entities/faction/CTownHandler.h

@@ -25,6 +25,8 @@ class CTown;
 
 class DLL_LINKAGE CTownHandler : public CHandlerBase<FactionID, Faction, CFaction, FactionService>
 {
+	JsonNode buildingsLibrary;
+
 	struct BuildingRequirementsHelper
 	{
 		JsonNode json;
@@ -82,6 +84,7 @@ public:
 
 	void loadCustom() override;
 	void afterLoadFinalization() override;
+	void beforeValidate(JsonNode & object) override;
 
 	std::set<FactionID> getDefaultAllowed() const;
 	std::set<FactionID> getAllowedFactions(bool withTown = true) const;