浏览代码

Ban Navigation on maps without water

Tomasz Zieliński 2 年之前
父节点
当前提交
03b3771f19
共有 5 个文件被更改,包括 24 次插入1 次删除
  1. 2 1
      config/skills.json
  2. 2 0
      lib/CSkillHandler.cpp
  3. 3 0
      lib/CSkillHandler.h
  4. 16 0
      lib/mapping/CMap.cpp
  5. 1 0
      lib/mapping/CMap.h

+ 2 - 1
config/skills.json

@@ -164,7 +164,8 @@
 			"effects" : {
 				"main" : { "val" : 150 }
 			}
-		}
+		},
+		"onlyOnWaterMap" : true
 	},
 	"leadership" : {
 		"index" : 6,

+ 2 - 0
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())
 	{

+ 3 - 0
lib/CSkillHandler.h

@@ -80,6 +80,8 @@ public:
 	void updateFrom(const JsonNode & data);
 	void serializeJson(JsonSerializeFormat & handler);
 
+	bool onlyOnWaterMap;
+
 	template <typename Handler> 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;

+ 16 - 0
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<const CSkill*>(VLC->skills()->getByIndex(j));
+			if (skill->onlyOnWaterMap && !isWaterMap())
+			{
+				allowedAbilities[j] = false;
+			}
+		}
+	}
+}
+
 void CMap::banWaterHeroes()
 {
 	for (int j = 0; j < allowedHeroes.size(); j++)

+ 1 - 0
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