diff --git a/config/skills.json b/config/skills.json index 528b6f381..601d48d1d 100644 --- a/config/skills.json +++ b/config/skills.json @@ -164,7 +164,8 @@ "effects" : { "main" : { "val" : 150 } } - } + }, + "onlyOnWaterMap" : true }, "leadership" : { "index" : 6, diff --git a/lib/CSkillHandler.cpp b/lib/CSkillHandler.cpp index 17f53240d..95b69a2ff 100644 --- a/lib/CSkillHandler.cpp +++ b/lib/CSkillHandler.cpp @@ -199,6 +199,8 @@ CSkill * CSkillHandler::loadFromJson(const std::string & scope, const JsonNode & auto * skill = new CSkill(SecondarySkill((si32)index), identifier, major, minor); skill->modScope = scope; + skill->onlyOnWaterMap = json["onlyOnWaterMap"].Bool(); + VLC->generaltexth->registerString(scope, skill->getNameTextID(), json["name"].String()); switch(json["gainChance"].getType()) { diff --git a/lib/CSkillHandler.h b/lib/CSkillHandler.h index 457707e42..da5c8777b 100644 --- a/lib/CSkillHandler.h +++ b/lib/CSkillHandler.h @@ -80,6 +80,8 @@ public: void updateFrom(const JsonNode & data); void serializeJson(JsonSerializeFormat & handler); + bool onlyOnWaterMap; + template void serialize(Handler & h, const int version) { h & id; @@ -88,6 +90,7 @@ public: h & levels; h & obligatoryMajor; h & obligatoryMinor; + h & onlyOnWaterMap; } friend class CSkillHandler; diff --git a/lib/mapping/CMap.cpp b/lib/mapping/CMap.cpp index 91a6210a0..b496eda98 100644 --- a/lib/mapping/CMap.cpp +++ b/lib/mapping/CMap.cpp @@ -585,6 +585,7 @@ void CMap::banWaterContent() banWaterHeroes(); banWaterArtifacts(); banWaterSpells(); + banWaterSkills(); } void CMap::banWaterSpells() @@ -617,6 +618,21 @@ void CMap::banWaterArtifacts() } } +void CMap::banWaterSkills() +{ + for (int j = 0; j < allowedAbilities.size(); j++) + { + if (allowedAbilities[j]) + { + auto* skill = dynamic_cast(VLC->skills()->getByIndex(j)); + if (skill->onlyOnWaterMap && !isWaterMap()) + { + allowedAbilities[j] = false; + } + } + } +} + void CMap::banWaterHeroes() { for (int j = 0; j < allowedHeroes.size(); j++) diff --git a/lib/mapping/CMap.h b/lib/mapping/CMap.h index 224361f7c..0aa6afb06 100644 --- a/lib/mapping/CMap.h +++ b/lib/mapping/CMap.h @@ -112,6 +112,7 @@ public: void banWaterHeroes(); void banHero(const HeroTypeID& id); void banWaterSpells(); + void banWaterSkills(); void banWaterContent(); /// Gets object of specified type on requested position