1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-02 23:07:36 +02:00

Extracted common properties of buildings into a shared file

This commit is contained in:
Ivan Savenko 2024-08-15 23:06:33 +00:00
parent 2a54de7569
commit 57430c101f
12 changed files with 215 additions and 146 deletions

View File

@ -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 }
}

View File

@ -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" },

View File

@ -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" },

View File

@ -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" },

View File

@ -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",

View File

@ -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" },

View File

@ -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" ] },

View File

@ -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" },

View File

@ -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" },

View File

@ -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" },

View File

@ -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();

View File

@ -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;