Browse Source

Merge branch 'vcmi:develop' into max_range_spell

Laserlicht 3 tháng trước cách đây
mục cha
commit
13a2b8781e
100 tập tin đã thay đổi với 1605 bổ sung731 xóa
  1. 4 5
      AI/BattleAI/StackWithBonuses.cpp
  2. 1 2
      AI/BattleAI/StackWithBonuses.h
  3. 3 3
      AI/Nullkiller/AIUtility.cpp
  4. 1 1
      AI/Nullkiller/Analyzers/ArmyManager.cpp
  5. 1 1
      AI/Nullkiller/Pathfinding/Actors.h
  6. 40 38
      AUTHORS.h
  7. 10 4
      Global.h
  8. 11 1
      Mods/vcmi/Content/config/czech.json
  9. 31 0
      Mods/vcmi/Content/config/english.json
  10. 119 48
      Mods/vcmi/Content/config/german.json
  11. 70 57
      Mods/vcmi/Content/config/portuguese.json
  12. 10 10
      client/ArtifactsUIController.cpp
  13. 1 0
      client/CPlayerInterface.cpp
  14. 2 2
      client/ClientCommandManager.cpp
  15. 7 0
      client/adventureMap/AdventureMapInterface.cpp
  16. 10 6
      client/battle/BattleActionsController.cpp
  17. 7 5
      client/battle/BattleFieldController.cpp
  18. 1 1
      client/battle/BattleStacksController.cpp
  19. 6 0
      client/gui/CIntObject.h
  20. 36 3
      client/mainmenu/CreditsScreen.cpp
  21. 3 0
      client/mapView/IMapRendererContext.h
  22. 30 5
      client/mapView/MapRenderer.cpp
  23. 3 1
      client/mapView/MapRenderer.h
  24. 14 0
      client/mapView/MapRendererContext.cpp
  25. 1 0
      client/mapView/MapRendererContext.h
  26. 10 0
      client/renderSDL/RenderHandler.cpp
  27. 30 10
      client/windows/CCastleInterface.cpp
  28. 2 1
      client/windows/CCastleInterface.h
  29. 6 3
      client/windows/CCreatureWindow.cpp
  30. 12 12
      client/windows/CExchangeWindow.cpp
  31. 1 1
      client/windows/CExchangeWindow.h
  32. 5 5
      client/windows/CHeroWindow.cpp
  33. 1 1
      client/windows/CHeroWindow.h
  34. 5 0
      client/windows/CKingdomInterface.cpp
  35. 1 1
      client/windows/CMarketWindow.cpp
  36. 2 1
      client/windows/CMarketWindow.h
  37. 1 1
      client/windows/CWindowWithArtifacts.cpp
  38. 2 2
      client/windows/CWindowWithArtifacts.h
  39. 13 0
      client/windows/settings/AdventureOptionsTab.cpp
  40. 6 6
      config/artifacts.json
  41. 4 4
      config/buildingsLibrary.json
  42. 30 2
      config/creatures/castle.json
  43. 28 0
      config/creatures/conflux.json
  44. 28 0
      config/creatures/dungeon.json
  45. 28 0
      config/creatures/fortress.json
  46. 28 0
      config/creatures/inferno.json
  47. 28 0
      config/creatures/necropolis.json
  48. 30 0
      config/creatures/neutral.json
  49. 28 0
      config/creatures/rampart.json
  50. 28 0
      config/creatures/stronghold.json
  51. 28 0
      config/creatures/tower.json
  52. 12 5
      config/factions/castle.json
  53. 10 2
      config/factions/conflux.json
  54. 10 2
      config/factions/dungeon.json
  55. 8 2
      config/factions/fortress.json
  56. 10 2
      config/factions/inferno.json
  57. 12 4
      config/factions/necropolis.json
  58. 11 3
      config/factions/rampart.json
  59. 8 2
      config/factions/stronghold.json
  60. 10 2
      config/factions/tower.json
  61. 1 1
      config/objects/lighthouse.json
  62. 39 2
      config/schemas/bonusInstance.json
  63. 49 6
      config/schemas/creature.json
  64. 56 6
      config/schemas/faction.json
  65. 5 2
      config/schemas/settings.json
  66. 4 3
      config/widgets/settings/adventureOptionsTab.json
  67. 15 0
      docs/modders/Bonus/Bonus_Limiters.md
  68. 18 6
      docs/modders/Bonus/Bonus_Propagators.md
  69. 61 2
      docs/modders/Bonus/Bonus_Updaters.md
  70. 4 0
      docs/modders/Entities_Format/Creature_Format.md
  71. 17 5
      docs/modders/Entities_Format/Faction_Format.md
  72. 18 18
      launcher/translation/belarusian.ts
  73. 18 18
      launcher/translation/bulgarian.ts
  74. 18 18
      launcher/translation/chinese.ts
  75. 18 18
      launcher/translation/czech.ts
  76. 18 18
      launcher/translation/english.ts
  77. 18 18
      launcher/translation/finnish.ts
  78. 18 18
      launcher/translation/french.ts
  79. 18 18
      launcher/translation/german.ts
  80. 18 18
      launcher/translation/greek.ts
  81. 18 18
      launcher/translation/hungarian.ts
  82. 18 18
      launcher/translation/italian.ts
  83. 18 18
      launcher/translation/japanese.ts
  84. 18 18
      launcher/translation/korean.ts
  85. 18 18
      launcher/translation/norwegian.ts
  86. 18 18
      launcher/translation/polish.ts
  87. 18 18
      launcher/translation/portuguese.ts
  88. 18 18
      launcher/translation/romanian.ts
  89. 18 18
      launcher/translation/russian.ts
  90. 18 18
      launcher/translation/spanish.ts
  91. 18 18
      launcher/translation/swedish.ts
  92. 18 18
      launcher/translation/turkish.ts
  93. 18 18
      launcher/translation/ukrainian.ts
  94. 18 18
      launcher/translation/vietnamese.ts
  95. 4 2
      lib/CCreatureHandler.cpp
  96. 2 0
      lib/CCreatureHandler.h
  97. 10 8
      lib/CCreatureSet.cpp
  98. 2 1
      lib/CCreatureSet.h
  99. 1 1
      lib/CPlayerState.cpp
  100. 5 5
      lib/CStack.cpp

+ 4 - 5
AI/BattleAI/StackWithBonuses.cpp

@@ -133,11 +133,10 @@ SlotID StackWithBonuses::unitSlot() const
 	return slot;
 }
 
-TConstBonusListPtr StackWithBonuses::getAllBonuses(const CSelector & selector, const CSelector & limit,
-	const std::string & cachingStr) const
+TConstBonusListPtr StackWithBonuses::getAllBonuses(const CSelector & selector, const std::string & cachingStr) const
 {
 	auto ret = std::make_shared<BonusList>();
-	TConstBonusListPtr originalList = origBearer->getAllBonuses(selector, limit, cachingStr);
+	TConstBonusListPtr originalList = origBearer->getAllBonuses(selector, cachingStr);
 
 	vstd::copy_if(*originalList, std::back_inserter(*ret), [this](const std::shared_ptr<Bonus> & b)
 	{
@@ -147,7 +146,7 @@ TConstBonusListPtr StackWithBonuses::getAllBonuses(const CSelector & selector, c
 
 	for(const Bonus & bonus : bonusesToUpdate)
 	{
-		if(selector(&bonus) && (!limit || limit(&bonus)))
+		if(selector(&bonus))
 		{
 			if(ret->getFirst(Selector::source(BonusSource::SPELL_EFFECT, bonus.sid).And(Selector::typeSubtype(bonus.type, bonus.subtype))))
 			{
@@ -164,7 +163,7 @@ TConstBonusListPtr StackWithBonuses::getAllBonuses(const CSelector & selector, c
 	for(auto & bonus : bonusesToAdd)
 	{
 		auto b = std::make_shared<Bonus>(bonus);
-		if(selector(b.get()) && (!limit || !limit(b.get())))
+		if(selector(b.get()))
 			ret->push_back(b);
 	}
 	//TODO limiters?

+ 1 - 2
AI/BattleAI/StackWithBonuses.h

@@ -90,8 +90,7 @@ public:
 	SlotID unitSlot() const override;
 
 	///IBonusBearer
-	TConstBonusListPtr getAllBonuses(const CSelector & selector, const CSelector & limit,
-		const std::string & cachingStr = "") const override;
+	TConstBonusListPtr getAllBonuses(const CSelector & selector, const std::string & cachingStr = "") const override;
 
 	int32_t getTreeVersion() const override;
 

+ 3 - 3
AI/Nullkiller/AIUtility.cpp

@@ -271,7 +271,7 @@ bool compareArmyStrength(const CArmedInstance * a1, const CArmedInstance * a2)
 
 double getArtifactBonusRelevance(const CGHeroInstance * hero, const std::shared_ptr<Bonus> & bonus)
 {
-	if (bonus->propagator && bonus->limiter && bonus->propagator->getPropagatorType() == CBonusSystemNode::BATTLE)
+	if (bonus->propagator && bonus->limiter && bonus->propagator->getPropagatorType() == BonusNodeType::BATTLE_WIDE)
 	{
 		// assume that this is battle wide / other side propagator+limiter
 		// consider it as fully relevant since we don't know about future combat when equipping artifacts
@@ -290,7 +290,7 @@ double getArtifactBonusRelevance(const CGHeroInstance * hero, const std::shared_
 
 		for (const auto & slot : hero->Slots())
 		{
-			const auto allBonuses = slot.second->getAllBonuses(Selector::all, Selector::all);
+			const auto allBonuses = slot.second->getAllBonuses(Selector::all);
 			BonusLimitationContext context = {*bonus, *slot.second, *allBonuses, stillUndecided};
 
 			uint64_t unitStrength = slot.second->getPower();
@@ -526,7 +526,7 @@ int32_t getArtifactBonusScoreImpl(const std::shared_ptr<Bonus> & bonus)
 
 int32_t getArtifactBonusScore(const std::shared_ptr<Bonus> & bonus)
 {
-	if (bonus->propagator && bonus->propagator->getPropagatorType() == CBonusSystemNode::BATTLE)
+	if (bonus->propagator && bonus->propagator->getPropagatorType() == BonusNodeType::BATTLE_WIDE)
 	{
 		if (bonus->limiter)
 		{

+ 1 - 1
AI/Nullkiller/Analyzers/ArmyManager.cpp

@@ -172,7 +172,7 @@ class TemporaryArmy : public CArmedInstance
 public:
 	void armyChanged() override {}
 	TemporaryArmy()
-		:CArmedInstance(nullptr, true)
+		:CArmedInstance(nullptr, BonusNodeType::UNKNOWN, true)
 	{
 	}
 };

+ 1 - 1
AI/Nullkiller/Pathfinding/Actors.h

@@ -31,7 +31,7 @@ public:
 	bool needsLastStack() const override;
 	std::shared_ptr<SpecialAction> getActorAction() const;
 
-	HeroExchangeArmy(): CArmedInstance(nullptr, true), requireBuyArmy(false) {}
+	HeroExchangeArmy(): CArmedInstance(nullptr, BonusNodeType::UNKNOWN, true), requireBuyArmy(false) {}
 };
 
 struct ExchangeResult

+ 40 - 38
AUTHORS.h

@@ -11,44 +11,46 @@
 
 //VCMI PROJECT CODE CONTRIBUTORS:
 const std::vector<std::vector<std::string>> contributors = {
-//   Task          Name                    Aka                      E-Mail
-   { "Idea",       "Michał Urbańczyk",     "Tow",                   "[email protected]"             },
-   { "Idea",       "Mateusz B.",           "Tow dragon",            "[email protected]"            },
+	//Task          Name                   Aka                    E-Mail
+	{ "Idea"      , "Mateusz B."         , "Tow dragon"         , "[email protected]"            },
+	{ "Idea"      , "Michał Urbańczyk"   , "Tow"                , "[email protected]"             },
 
-   { "Developing", "Andrea Palmate",       "afxgroup",              "[email protected]"         },
-   { "Developing", "Alexander Shishkin",   "alexvins",              ""                             },
-   { "Developing", "Rafal R.",             "ambtrip",               "[email protected]"                },
-   { "Developing", "Andrii Danylchenko",   "",                      ""                             },
-   { "Developing", "Benjamin Gentner",     "beegee",                ""                             },
-   { "Developing", "Piotr Wójcik",         "Chocimier",             "[email protected]"            },
-   { "Developing", "Dmitry Orlov",         "",                      "[email protected]" },
-   { "Developing", "",                     "Dydzio",                "[email protected]"           },
-   { "Developing", "Andrzej Żak",          "godric3",               ""                             },
-   { "Developing", "Henning Koehler",      "henningkoehlernz",      "[email protected]" },
-   { "Developing", "Ivan Savenko",         "",                      "[email protected]"         },
-   { "Developing", "",                     "kambala-decapitator",   "[email protected]"          },
-   { "Developing", "",                     "krs0",                  ""                             },
-   { "Developing", "",                     "Laserlicht",            ""                             },
-   { "Developing", "Alexey",               "Macron1Robot",          ""                             },
-   { "Developing", "Michał Kalinowski",    "",                      "[email protected]"            },
-   { "Developing", "Vadim Glazunov",       "neweagle",              "[email protected]"           },
-   { "Developing", "Andrey Cherkas",       "nordsoft",              "[email protected]"           },
-   { "Developing", "Rickard Westerlund",   "Onion Knight",          "[email protected]"         },
-   { "Developing", "Yifeng Sun",           "phoebus118",            "[email protected]"       },
-   { "Developing", "",                     "rilian-la-te",          ""                             },
-   { "Developing", "",                     "SoundSSGood",           ""                             },
-   { "Developing", "Stefan Pavlov",        "Ste",                   "[email protected]"            },
-   { "Developing", "Arseniy Shestakov",    "SXX",                   "[email protected]"      },
-   { "Developing", "Lukasz Wychrystenko",  "tezeriusz",             "[email protected]"         },
-   { "Developing", "Trevor Standley",      "tstandley",             ""                             },
-   { "Developing", "Vadim Markovtsev",     "",                      "[email protected]"           },
-   { "Developing", "Frank Zago",           "ubuntux",               ""                             },
-   { "Developing", "",                     "vmarkovtsev",           ""                             },
-   { "Developing", "Tom Zielinski",        "Warmonger",             "[email protected]"              },
-   { "Developing", "Xiaomin Ding",         "",                      "[email protected]"        },
-   { "Developing", "Fenghuang Rumeng",     "kdmcser",               "[email protected]"             },
+	{ "Developing", "Alexander Shishkin" , "alexvins"           , ""                             },
+	{ "Developing", "Alexey"             , "Macron1Robot"       , ""                             },
+	{ "Developing", "Andrea Palmate"     , "afxgroup"           , "[email protected]"         },
+	{ "Developing", "Andrey Cherkas"     , "nordsoft"           , "[email protected]"           },
+	{ "Developing", "Andrii Danylchenko" , ""                   , ""                             },
+	{ "Developing", "Andrzej Żak"        , "godric3"            , ""                             },
+	{ "Developing", "Arseniy Shestakov"  , "SXX"                , "[email protected]"      },
+	{ "Developing", "Benjamin Gentner"   , "beegee"             , ""                             },
+	{ "Developing", "Dmitry Orlov"       , ""                   , "[email protected]" },
+	{ "Developing", ""                   , "Dydzio"             , "[email protected]"           },
+	{ "Developing", "Fenghuang Rumeng"   , "kdmcser"            , "[email protected]"            },
+	{ "Developing", "Frank Zago"         , "ubuntux"            , ""                             },
+	{ "Developing", "Henning Koehler"    , "henningkoehlernz"   , "[email protected]" },
+	{ "Developing", "Ivan Savenko"       , ""                   , "[email protected]"         },
+	{ "Developing", ""                   , "kambala-decapitator", "[email protected]"          },
+	{ "Developing", ""                   , "krs0"               , ""                             },
+	{ "Developing", ""                   , "Laserlicht"         , ""                             },
+	{ "Developing", "Lukasz Wychrystenko", "tezeriusz"          , "[email protected]"         },
+	{ "Developing", "Michał Kalinowski"  , ""                   , "[email protected]"            },
+	{ "Developing", "Piotr Wójcik"       , "Chocimier"          , "[email protected]"            },
+	{ "Developing", "Rafal R."           , "ambtrip"            , "[email protected]"                },
+	{ "Developing", "Rickard Westerlund" , "Onion Knight"       , "[email protected]"         },
+	{ "Developing", ""                   , "rilian-la-te"       , ""                             },
+	{ "Developing", ""                   , "SoundSSGood"        , ""                             },
+	{ "Developing", "Stefan Pavlov"      , "Ste"                , "[email protected]"            },
+	{ "Developing", "Tom Zielinski"      , "Warmonger"          , "[email protected]"              },
+	{ "Developing", "Trevor Standley"    , "tstandley"          , ""                             },
+	{ "Developing", "Vadim Glazunov"     , "neweagle"           , "[email protected]"           },
+	{ "Developing", "Vadim Markovtsev"   , ""                   , "[email protected]"           },
+	{ "Developing", ""                   , "vmarkovtsev"        , ""                             },
+	{ "Developing", "Xiaomin Ding"       , ""                   , "[email protected]"        },
+	{ "Developing", "Yifeng Sun"         , "phoebus118"         , "[email protected]"       },
 
-   { "Testing",    "Ben Yan",              "by003",                 "[email protected],"        },
-   { "Testing",    "",                     "Misiokles",             ""                             },
-   { "Testing",    "",                     "Povelitel",             ""                             },
+	{ "Testing"   , "Ben Yan"            , "by003"              , "[email protected]"         },
+	{ "Testing"   , ""                   , "Misiokles"          , ""                             },
+	{ "Testing"   , ""                   , "Povelitel"          , ""                             },
+
+	// List is ordered by "Name" (if empty than "Aka" will used as sorting key)
 };

+ 10 - 4
Global.h

@@ -712,13 +712,16 @@ namespace vstd
 		return a + (b - a) * f;
 	}
 
-	/// Divides dividend by divisor and rounds result up
+	/// Divides dividend by divisor and rounds result away from zero
 	/// For use with integer-only arithmetic
 	template<typename Integer1, typename Integer2>
 	Integer1 divideAndCeil(const Integer1 & dividend, const Integer2 & divisor)
 	{
 		static_assert(std::is_integral_v<Integer1> && std::is_integral_v<Integer2>, "This function should only be used with integral types");
-		return (dividend + divisor - 1) / divisor;
+		if (dividend >= 0)
+			return (dividend + divisor - 1) / divisor;
+		else
+			return (dividend - divisor + 1) / divisor;
 	}
 
 	/// Divides dividend by divisor and rounds result to nearest
@@ -727,10 +730,13 @@ namespace vstd
 	Integer1 divideAndRound(const Integer1 & dividend, const Integer2 & divisor)
 	{
 		static_assert(std::is_integral_v<Integer1> && std::is_integral_v<Integer2>, "This function should only be used with integral types");
-		return (dividend + divisor / 2 - 1) / divisor;
+		if (dividend >= 0)
+			return (dividend + divisor / 2 - 1) / divisor;
+		else
+			return (dividend - divisor / 2 + 1) / divisor;
 	}
 
-	/// Divides dividend by divisor and rounds result down
+	/// Divides dividend by divisor and rounds result towards zero
 	/// For use with integer-only arithmetic
 	template<typename Integer1, typename Integer2>
 	Integer1 divideAndFloor(const Integer1 & dividend, const Integer2 & divisor)

+ 11 - 1
Mods/vcmi/Content/config/czech.json

@@ -32,6 +32,13 @@
 	"vcmi.adventureMap.dwelling3" : "{%s}\n\nChceš najmout jednotku %s, %s nebo %s?",
 	
 	"vcmi.artifact.charges" : "Použití",
+	
+	"vcmi.battle.action.move" : "Přesunout jednotku na určené místo",
+	"vcmi.battle.action.info" : "Zobrazit informace o jednotce",
+	"vcmi.battle.action.shoot" : "Použít střelecký útok",
+	"vcmi.battle.action.attack" : "Použít útok zblízka",
+	"vcmi.battle.action.return" : "Zaútočit zblízka a vrátit se",
+	"vcmi.battle.action.genie" : "Seslat náhodné podpůrné kouzlo",
 
 	"vcmi.bonusSource.artifact" : "Artefakt",
 	"vcmi.bonusSource.creature" : "Schopnost",
@@ -435,6 +442,9 @@
 	"vcmi.townWindow.upgradeAll.notAllUpgradable" : "Nemáte dostatek surovin na vylepšení všech jednotek. Chcete vylepšit následující jednotky?",
 	"vcmi.townWindow.upgradeAll.notUpgradable" : "Nemáte dostatek surovin na vylepšení žádné z jednotek.",
 
+	"vcmi.kingdomOverview.secSkillOverflow.hover" : "Další druhotné dovednosti",
+	"vcmi.kingdomOverview.secSkillOverflow.help" : "{Další druhotné dovednosti}\n\nTento hrdina má více druhotných dovedností.\nVšechny si můžeš prohlédnout v přehledu hrdiny.",
+
 	"vcmi.logicalExpressions.anyOf"  : "Nějaké z následujících:",
 	"vcmi.logicalExpressions.allOf"  : "Všechny následující:",
 	"vcmi.logicalExpressions.noneOf" : "Žádné z následujících:",
@@ -637,7 +647,6 @@
 	"creatures.core.azureDragon.bonus.fearful" : "{Strach}\nVyvolává strach u nepřátelské jednotky",
 	"creatures.core.azureDragon.bonus.fearless" : "{Nebojácnost}\nImunní vůči schopnosti Strach",
 
-
 	"core.bonus.ADDITIONAL_ATTACK.description" : "{Dvojitý útok}\nÚtočí dvakrát", // TODO: alternative descriptions for melee/ranged effect range
 	"core.bonus.ADDITIONAL_RETALIATION.description" : "{Další odvetné útoky}\nMůže odvetně zaútočit ${val} krát navíc",
 	"core.bonus.ATTACKS_ALL_ADJACENT.description" : "{Útok na všechny kolem}\nÚtočí na všechny sousední nepřátele",
@@ -700,6 +709,7 @@
 	"core.bonus.REVENGE.description" : "{Pomsta}\nZpůsobuje extra poškození na základě ztrát útočníka v bitvě",
 	"core.bonus.SHOOTER.description" : "{Střelec}\nJednotka může střílet",
 	"core.bonus.SHOOTS_ALL_ADJACENT.description" : "{Střílí všude kolem}\nStřelecký útok této jednotky zasáhne všechny cíle v malé oblasti",
+	"core.bonus.SKELETON_TRANSFORMER_TARGET.description" : "{Přeměna na kostlivce}\nMěnič na kostlivce přemění tuto jednotku na ${subtype.creature}.",
 	"core.bonus.SOUL_STEAL.description" : "{Zloděj duší}\nZískává ${val} nové jednotky za každého zabitého nepřítele",
 	"core.bonus.SPELL_AFTER_ATTACK.description" : "{Sesílá po útoku}\nMá ${val}% šanci seslat ${subtype.spell} po útoku",
 	"core.bonus.SPELL_BEFORE_ATTACK.description" : "{Sesílá před útokem}\nMá ${val}% šanci seslat ${subtype.spell} před útokem",

+ 31 - 0
Mods/vcmi/Content/config/english.json

@@ -417,6 +417,36 @@
 	"vcmi.battleResultsWindow.spellDurationRemaining.1" : "Remaining duration : %d combat round",
 	"vcmi.battleResultsWindow.spellDurationRemaining.2" : "Remaining duration : %d combat rounds",
 
+	"vcmi.credits.website" : "Website",
+	"vcmi.credits.vcmi" : "VCMI",
+	"vcmi.credits.heroes" : "Heroes III",
+	"vcmi.credits.idea" : "Idea",
+	"vcmi.credits.developing" : "Developing",
+	"vcmi.credits.testing" : "Testing",
+	"core.credits.createdBy" : "Created By",
+	"core.credits.executiveProducer" : "Executive Producer",
+	"core.credits.producer" : "Producer",
+	"core.credits.director" : "Director",
+	"core.credits.designers" : "Designers",
+	"core.credits.leadProgrammers" : "Lead Programmers",
+	"core.credits.programmers" : "Programmers",
+	"core.credits.installerProgrammer" : "Installer Programmer",
+	"core.credits.leadArtists" : "Lead Artists",
+	"core.credits.artists" : "Artists",
+	"core.credits.assetCoordinator" : "Asset Coordinator",
+	"core.credits.levelDesigners" : "Level Designers",
+	"core.credits.musicProducer" : "Music Producer",
+	"core.credits.townThemes" : "Town Themes",
+	"core.credits.music" : "Music",
+	"core.credits.soundDesign" : "Sound Design",
+	"core.credits.voiceProduction" : "Voice Production",
+	"core.credits.voiceTalent" : "Voice Talent",
+	"core.credits.leadTester" : "Lead Tester",
+	"core.credits.seniorTester" : "Senior Tester",
+	"core.credits.testers" : "Testers",
+	"core.credits.specialThanks" : "Special Thanks",
+	"core.credits.visitUsOnTheWeb" : "Visit us on the Web",
+
 	"vcmi.tutorialWindow.title" : "Touchscreen Introduction",
 	"vcmi.tutorialWindow.decription.RightClick" : "Touch and hold the element on which you want to right-click. Touch the free area to close.",
 	"vcmi.tutorialWindow.decription.MapPanning" : "Touch and drag with one finger to move the map.",
@@ -730,6 +760,7 @@
 	"core.bonus.SUMMON_GUARDIANS.description" : "{Summon guardians}\nAt the start of battle summons ${subtype.creature} (${val}%)",
 	"core.bonus.THREE_HEADED_ATTACK.description" : "{Three-headed attack}\nAttacks three adjacent units",
 	"core.bonus.TRANSMUTATION.description" : "{Transmutation}\n${val}% chance to transform attacked unit to a different type",
+	"core.bonus.TRANSMUTATION_IMMUNITY.description" : "{Transmutation Immunity}\nThis unit cannot be transformed into another unit by enemy attack",
 	"core.bonus.TWO_HEX_ATTACK_BREATH.description" : "{Breath Attack}\nAttacks by this unit will also hit any unit positioned immediately behind the target",
 	"core.bonus.UNDEAD.description" : "{Undead}\nCreature is Undead and is immune to effects that only affect living",
 	"core.bonus.UNLIMITED_RETALIATIONS.description" : "{Unlimited retaliations}\nThis unit can retaliate against an unlimited number of attacks",

+ 119 - 48
Mods/vcmi/Content/config/german.json

@@ -28,6 +28,18 @@
 	"vcmi.adventureMap.movementPointsHeroInfo"           : "(Bewegungspunkte: %REMAINING / %POINTS)",
 	"vcmi.adventureMap.replayOpponentTurnNotImplemented" : "Das Wiederholen des gegnerischen Zuges ist aktuell noch nicht implementiert!",
 
+	"vcmi.adventureMap.dwelling2" : "{%s}\r\n\r\nWürdet Ihr gerne %s oder %s rekrutieren?",
+	"vcmi.adventureMap.dwelling3" : "{%s}\r\n\r\nWürdet Ihr gerne %s, %s oder %s rekrutieren?",
+	
+	"vcmi.artifact.charges" : "Geladene",
+	
+	"vcmi.battle.action.move" : "Bewegen der Einheit an einen bestimmten Ort",
+	"vcmi.battle.action.info" : "Informationen zur Einheit anzeigen",
+	"vcmi.battle.action.shoot" : "Fernkampfangriff verwenden",
+	"vcmi.battle.action.attack" : "Nahkampfangriff verwenden",
+	"vcmi.battle.action.return" : "Nahkampfangriff verwenden und zurückkehren",
+	"vcmi.battle.action.genie" : "Zufälliger nützlicher Zauberspruch",
+
 	"vcmi.bonusSource.artifact" : "Artefakt",
 	"vcmi.bonusSource.creature" : "Fähigkeit",
 	"vcmi.bonusSource.spell" : "Zauber",
@@ -332,44 +344,46 @@
 	"vcmi.adventureOptions.smoothDragging.help" : "{Nahtloses Ziehen der Karte}\n\nWenn aktiviert hat das Ziehen der Karte einen sanften Auslaufeffekt.",
 	"vcmi.adventureOptions.skipAdventureMapAnimations.hover" : "Fading-Effekte überspringen",
 	"vcmi.adventureOptions.skipAdventureMapAnimations.help" : "{Fading-Effekte überspringen}\n\nWenn diese Funktion aktiviert ist, werden das Ausblenden von Objekten und ähnliche Effekte übersprungen (Ressourcensammlung, Anlegen von Schiffen usw.). Macht die Benutzeroberfläche in einigen Fällen auf Kosten der Ästhetik reaktiver. Besonders nützlich in PvP-Spielen. Für maximale Bewegungsgeschwindigkeit ist das Überspringen unabhängig von dieser Einstellung aktiv.",
-	"vcmi.adventureOptions.mapScrollSpeed1.hover": "",
-	"vcmi.adventureOptions.mapScrollSpeed5.hover": "",
-	"vcmi.adventureOptions.mapScrollSpeed6.hover": "",
-	"vcmi.adventureOptions.mapScrollSpeed1.help": "Geschwindigkeit des Kartenbildlaufs auf sehr langsam einstellen",
-	"vcmi.adventureOptions.mapScrollSpeed5.help": "Geschwindigkeit des Kartenbildlaufs auf sehr schnell einstellen",
-	"vcmi.adventureOptions.mapScrollSpeed6.help": "Geschwindigkeit des Kartenbildlaufs auf sofort einstellen",
+	"vcmi.adventureOptions.mapScrollSpeed1.hover" : "",
+	"vcmi.adventureOptions.mapScrollSpeed5.hover" : "",
+	"vcmi.adventureOptions.mapScrollSpeed6.hover" : "",
+	"vcmi.adventureOptions.mapScrollSpeed1.help" : "Geschwindigkeit des Kartenbildlaufs auf sehr langsam einstellen",
+	"vcmi.adventureOptions.mapScrollSpeed5.help" : "Geschwindigkeit des Kartenbildlaufs auf sehr schnell einstellen",
+	"vcmi.adventureOptions.mapScrollSpeed6.help" : "Geschwindigkeit des Kartenbildlaufs auf sofort einstellen",
 	"vcmi.adventureOptions.hideBackground.hover" : "Hintergrund ausblenden",
 	"vcmi.adventureOptions.hideBackground.help" : "{Hintergrund ausblenden}\n\nDie Abenteuerkarte im Hintergrund ausblenden und stattdessen eine Textur anzeigen.",
-
-	"vcmi.battleOptions.queueSizeLabel.hover": "Reihenfolge der Kreaturen anzeigen",
-	"vcmi.battleOptions.queueSizeNoneButton.hover": "AUS",
-	"vcmi.battleOptions.queueSizeAutoButton.hover": "AUTO",
-	"vcmi.battleOptions.queueSizeSmallButton.hover": "KLEIN",
-	"vcmi.battleOptions.queueSizeBigButton.hover": "GROß",
-	"vcmi.battleOptions.queueSizeNoneButton.help": "Vollständige Deaktivierung der Sichtbarkeit der Reihenfolge der Kreaturen im Kampf",
-	"vcmi.battleOptions.queueSizeAutoButton.help": "Stellt die Größe der Zugreihenfolge abhängig von der Spielauflösung ein (klein, wenn mit einer Bildschirmauflösung unter 700 Pixeln gespielt wird, ansonsten groß)",
-	"vcmi.battleOptions.queueSizeSmallButton.help": "Setzt die Zugreihenfolge auf klein",
-	"vcmi.battleOptions.queueSizeBigButton.help": "Setzt die Größe der Zugreihenfolge auf groß (nicht unterstützt, wenn die Spielauflösung weniger als 700 Pixel hoch ist)",
-	"vcmi.battleOptions.animationsSpeed1.hover": "",
-	"vcmi.battleOptions.animationsSpeed5.hover": "",
-	"vcmi.battleOptions.animationsSpeed6.hover": "",
-	"vcmi.battleOptions.animationsSpeed1.help": "Setzt die Animationsgeschwindigkeit auf sehr langsam",
-	"vcmi.battleOptions.animationsSpeed5.help": "Setzt die Animationsgeschwindigkeit auf sehr schnell",
-	"vcmi.battleOptions.animationsSpeed6.help": "Setzt die Animationsgeschwindigkeit auf sofort",
-	"vcmi.battleOptions.movementHighlightOnHover.hover": "Hervorhebung der Bewegung bei Hover",
-	"vcmi.battleOptions.movementHighlightOnHover.help": "{Hervorhebung der Bewegung bei Hover}\n\nHebt die Bewegungsreichweite der Einheit hervor, wenn man mit dem Mauszeiger über sie fährt.",
-	"vcmi.battleOptions.rangeLimitHighlightOnHover.hover": "Bereichsgrenzen für Schützen anzeigen",
-	"vcmi.battleOptions.rangeLimitHighlightOnHover.help": "{Bereichsgrenzen für Schützen anzeigen}\n\nZeigt die Entfernungsgrenzen des Schützen an, wenn man mit dem Mauszeiger über ihn fährt.",
-	"vcmi.battleOptions.showStickyHeroInfoWindows.hover": "Statistikfenster für Helden anzeigen",
-	"vcmi.battleOptions.showStickyHeroInfoWindows.help": "{Statistikfenster für Helden anzeigen}\n\nDauerhaftes Einschalten des Statistikfenster für Helden, das die primären Werte und Zauberpunkte anzeigt.",
-	"vcmi.battleOptions.skipBattleIntroMusic.hover": "Intro-Musik überspringen",
-	"vcmi.battleOptions.skipBattleIntroMusic.help": "{Intro-Musik überspringen}\n\n Überspringe die kurze Musik, die zu Beginn eines jeden Kampfes gespielt wird, bevor die Action beginnt. Kann auch durch Drücken der ESC-Taste übersprungen werden.",	
-	"vcmi.battleOptions.endWithAutocombat.hover": "Kampf beenden",
-	"vcmi.battleOptions.endWithAutocombat.help": "{Kampf beenden}\n\nAutokampf spielt den Kampf sofort zu Ende",
-	"vcmi.battleOptions.showQuickSpell.hover": "Schnellzauber-Panel anzeigen",
-	"vcmi.battleOptions.showQuickSpell.help": "{Schnellzauber-Panel anzeigen}\n\nZeigt ein Panel, auf dem schnell Zauber ausgewählt werden können",
-	"vcmi.battleOptions.showHealthBar.hover": "Gesundheits-Balken anzeigen",
-	"vcmi.battleOptions.showHealthBar.help": "{Gesundheits-Balken anzeigen}\n\nAnzeige eines Gesundheitsbalkens, der die verbleibende Gesundheit anzeigt, bevor eine Einheit stirbt.",	
+	"vcmi.adventureOptions.minimapShowHeroes.hover" : "Helden auf Minimap anz.",
+	"vcmi.adventureOptions.minimapShowHeroes.help" : "{Helden auf der Minimap anzeigen}\n\nZusätzliches Symbol für alle Helden auf der Minimap anzeigen, damit sie auf großen Karten besser zu sehen sind",
+
+	"vcmi.battleOptions.queueSizeLabel.hover" : "Reihenfolge der Kreaturen anzeigen",
+	"vcmi.battleOptions.queueSizeNoneButton.hover" : "AUS",
+	"vcmi.battleOptions.queueSizeAutoButton.hover" : "AUTO",
+	"vcmi.battleOptions.queueSizeSmallButton.hover" : "KLEIN",
+	"vcmi.battleOptions.queueSizeBigButton.hover" : "GROß",
+	"vcmi.battleOptions.queueSizeNoneButton.help" : "Vollständige Deaktivierung der Sichtbarkeit der Reihenfolge der Kreaturen im Kampf",
+	"vcmi.battleOptions.queueSizeAutoButton.help" : "Stellt die Größe der Zugreihenfolge abhängig von der Spielauflösung ein (klein, wenn mit einer Bildschirmauflösung unter 700 Pixeln gespielt wird, ansonsten groß)",
+	"vcmi.battleOptions.queueSizeSmallButton.help" : "Setzt die Zugreihenfolge auf klein",
+	"vcmi.battleOptions.queueSizeBigButton.help" : "Setzt die Größe der Zugreihenfolge auf groß (nicht unterstützt, wenn die Spielauflösung weniger als 700 Pixel hoch ist)",
+	"vcmi.battleOptions.animationsSpeed1.hover" : "",
+	"vcmi.battleOptions.animationsSpeed5.hover" : "",
+	"vcmi.battleOptions.animationsSpeed6.hover" : "",
+	"vcmi.battleOptions.animationsSpeed1.help" : "Setzt die Animationsgeschwindigkeit auf sehr langsam",
+	"vcmi.battleOptions.animationsSpeed5.help" : "Setzt die Animationsgeschwindigkeit auf sehr schnell",
+	"vcmi.battleOptions.animationsSpeed6.help" : "Setzt die Animationsgeschwindigkeit auf sofort",
+	"vcmi.battleOptions.movementHighlightOnHover.hover" : "Hervorhebung der Bewegung bei Hover",
+	"vcmi.battleOptions.movementHighlightOnHover.help" : "{Hervorhebung der Bewegung bei Hover}\n\nHebt die Bewegungsreichweite der Einheit hervor, wenn man mit dem Mauszeiger über sie fährt.",
+	"vcmi.battleOptions.rangeLimitHighlightOnHover.hover" : "Bereichsgrenzen für Schützen anzeigen",
+	"vcmi.battleOptions.rangeLimitHighlightOnHover.help" : "{Bereichsgrenzen für Schützen anzeigen}\n\nZeigt die Entfernungsgrenzen des Schützen an, wenn man mit dem Mauszeiger über ihn fährt.",
+	"vcmi.battleOptions.showStickyHeroInfoWindows.hover" : "Statistikfenster für Helden anzeigen",
+	"vcmi.battleOptions.showStickyHeroInfoWindows.help" : "{Statistikfenster für Helden anzeigen}\n\nDauerhaftes Einschalten des Statistikfenster für Helden, das die primären Werte und Zauberpunkte anzeigt.",
+	"vcmi.battleOptions.skipBattleIntroMusic.hover" : "Intro-Musik überspringen",
+	"vcmi.battleOptions.skipBattleIntroMusic.help" : "{Intro-Musik überspringen}\n\n Überspringe die kurze Musik, die zu Beginn eines jeden Kampfes gespielt wird, bevor die Action beginnt. Kann auch durch Drücken der ESC-Taste übersprungen werden.",	
+	"vcmi.battleOptions.endWithAutocombat.hover" : "Kampf beenden",
+	"vcmi.battleOptions.endWithAutocombat.help" : "{Kampf beenden}\n\nAutokampf spielt den Kampf sofort zu Ende",
+	"vcmi.battleOptions.showQuickSpell.hover" : "Schnellzauber-Panel anzeigen",
+	"vcmi.battleOptions.showQuickSpell.help" : "{Schnellzauber-Panel anzeigen}\n\nZeigt ein Panel, auf dem schnell Zauber ausgewählt werden können",
+	"vcmi.battleOptions.showHealthBar.hover" : "Gesundheits-Balken anzeigen",
+	"vcmi.battleOptions.showHealthBar.help" : "{Gesundheits-Balken anzeigen}\n\nAnzeige eines Gesundheitsbalkens, der die verbleibende Gesundheit anzeigt, bevor eine Einheit stirbt.",	
 
 	"vcmi.adventureMap.revisitObject.hover" : "Objekt erneut besuchen",
 	"vcmi.adventureMap.revisitObject.help" : "{Objekt erneut besuchen}\n\nSteht ein Held gerade auf einem Kartenobjekt, kann er den Ort erneut aufsuchen.",
@@ -399,6 +413,39 @@
 	"vcmi.battleWindow.endWithAutocombat" : "Seid Ihr sicher, dass Ihr den Kampf mit Auto-Kampf beenden wollt?",
 
 	"vcmi.battleResultsWindow.applyResultsLabel" : "Kampfergebnis übernehmen",
+	"vcmi.battleResultsWindow.spellDurationRemaining.0" : "Verbleibende Dauer: %d Kampfrunden",
+	"vcmi.battleResultsWindow.spellDurationRemaining.1" : "Verbleibende Dauer: %d Kampfrunde",
+	"vcmi.battleResultsWindow.spellDurationRemaining.2" : "Verbleibende Dauer: %d Kampfrunden",
+
+	"vcmi.credits.website" : "Webseite",
+	"vcmi.credits.vcmi" : "VCMI",
+	"vcmi.credits.heroes" : "Heroes III",
+	"vcmi.credits.idea" : "Idee",
+	"vcmi.credits.developing" : "Entwicklung",
+	"vcmi.credits.testing" : "Tester",
+	"core.credits.createdBy" : "Erstellt von",
+	"core.credits.executiveProducer" : "Ausführender Produzent",
+	"core.credits.producer" : "Produzent",
+	"core.credits.director" : "Regisseur",
+	"core.credits.designers" : "Designer",
+	"core.credits.leadProgrammers" : "Leitende Programmierer",
+	"core.credits.programmers" : "Programmierer",
+	"core.credits.installerProgrammer" : "Installationsprogrammierer",
+	"core.credits.leadArtists" : "Leitende Künstler",
+	"core.credits.artists" : "Künstler",
+	"core.credits.assetCoordinator" : "Asset-Koordinator",
+	"core.credits.levelDesigners" : "Level-Designer",
+	"core.credits.musicProducer" : "Musikproduzent",
+	"core.credits.townThemes" : "Stadtthemen",
+	"core.credits.music" : "Musik",
+	"core.credits.soundDesign" : "Sounddesign",
+	"core.credits.voiceProduction" : "Sprachproduktion",
+	"core.credits.voiceTalent" : "Sprechertalente",
+	"core.credits.leadTester" : "Leitender Tester",
+	"core.credits.seniorTester" : "Senior-Tester",
+	"core.credits.testers" : "Tester",
+	"core.credits.specialThanks" : "Besonderer Dank",
+	"core.credits.visitUsOnTheWeb" : "Besuchen Sie uns im Internet",
 
 	"vcmi.tutorialWindow.title" : "Touchscreen Einführung",
 	"vcmi.tutorialWindow.decription.RightClick" : "Berührt und haltet das Element, auf das mit der rechten Maustaste geklickt werden soll. Berührt den freien Bereich, um zu schließen.",
@@ -413,8 +460,8 @@
 	"vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Verfügbare Kreaturen anzeigen}\n\n Zeigt in der Stadtübersicht (linke untere Ecke) die zum Kauf verfügbaren Kreaturen anstelle ihres Wachstums an.",
 	"vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Wöchentl. Wachstum der Kreaturen anz.",
 	"vcmi.otherOptions.creatureGrowthAsDwellingLabel.help" : "{Wöchentliches Wachstum der Kreaturen anzeigen}\n\n Zeigt das wöchentliche Wachstum der Kreaturen anstelle der verfügbaren Menge in der Stadtübersicht (unten links).",
-	"vcmi.otherOptions.compactTownCreatureInfo.hover": "Kompakte Kreatur-Infos",
-	"vcmi.otherOptions.compactTownCreatureInfo.help": "{Kompakte Kreatur-Infos}\n\n Kleinere Stadt-Kreaturen Informationen in der Stadtübersicht.",
+	"vcmi.otherOptions.compactTownCreatureInfo.hover" : "Kompakte Kreatur-Infos",
+	"vcmi.otherOptions.compactTownCreatureInfo.help" : "{Kompakte Kreatur-Infos}\n\n Kleinere Stadt-Kreaturen Informationen in der Stadtübersicht.",
 
 	"vcmi.townHall.missingBase"             : "Basis Gebäude %s muss als erstes gebaut werden",
 	"vcmi.townHall.noCreaturesToRecruit"    : "Es gibt keine Kreaturen zu rekrutieren!",
@@ -621,11 +668,16 @@
 	"core.seerhut.quest.reachDate.visit.5" : "Geschlossen bis %s.",
 	
 	"mapObject.core.hillFort.object.description" : "Aufwertungen von Kreaturen. Die Stufen 1 - 4 sind billiger als in der zugehörigen Stadt.",
-
+	
+	"artifact.core.orbOfVulnerability.bonus.noResistance" : "{Kugel der Verwundbarkeit}\nNegiert die natürliche Magieresistenz aller Kreaturen auf dem Schlachtfeld",
+	"creatures.core.angel.bonus.raisesMorale" : "{Steigert die Moral der Verbündeten}\nEngel und Erzengel erhöhen die Moral der Verbündeten um eins",
+	"creatures.core.devil.bonus.decreaseLuck" : "{Verringert feindliches Glück}\nTeufel und Erzteufel reduzieren das Glück des Gegners um eins",
+	"creatures.core.boneDragon.bonus.decreaseMorale" : "{Senkt die Moral des Gegners}\nKnochendrachen und Geisterdrachen senken die Moral von gegnerischen Einheiten um eins",
+	"creatures.core.marksman.bonus.extraAttack" : "{Schießt zweimal}\nDiese Einheit kann zweimal schießen",
 	"creatures.core.azureDragon.bonus.fearful" : "{Furcht}\nVerursacht Furcht bei einem gegnerischen Stapel",
 	"creatures.core.azureDragon.bonus.fearless" : "{Furchtlos}\nimmun gegen die Fähigkeit Furcht",
 
-	"core.bonus.ADDITIONAL_ATTACK.description" : "{Doppelschlag}\nGreift zweimal an",
+	"core.bonus.ADDITIONAL_ATTACK.description" : "{Doppelschlag}\nGreift zweimal an", // TODO: alternative descriptions for melee/ranged effect range
 	"core.bonus.ADDITIONAL_RETALIATION.description" : "{Zusätzliche Vergeltungsmaßnahmen}\nKann ${val} zusätzliche Male vergelten",
 	"core.bonus.ATTACKS_ALL_ADJACENT.description" : "{Rundum angreifen}\nGreift alle benachbarten Gegner an",
 	"core.bonus.BLOCKS_RANGED_RETALIATION.description" : "{Keine Reichweitenverschiebung}\nFeind kann nicht durch Schießen vergelten",
@@ -646,17 +698,24 @@
 	"core.bonus.ENEMY_DEFENCE_REDUCTION.description" : "{Ignoriere Verteidigung (${val}%)}\nIgnoriert einen Teil der Verteidigung für den Angriff",
 	"core.bonus.FEROCITY.description" : "{Wildheit}\nGreift ${val} zusätzliche Male an, wenn jemand getötet wird",
 	"core.bonus.FIRE_SHIELD.description" : "{Feuerschild (${val}%)}\nReflektiert einen Teil des Nahkampfschadens",
+	"core.bonus.FIRST_STRIKE.description.bonusSubtype.damageTypeMelee" : "{Erstschlag}\nDie Einheit erwidert den Angriff, bevor sie im Nahkampf angegriffen wird",
+	"core.bonus.FIRST_STRIKE.description.bonusSubtype.damageTypeRanged" : "{Erstschlag}\nDie Einheit erwidert den Angriff, bevor sie mit einem Fernkampfangriff angegriffen wird",
 	"core.bonus.FIRST_STRIKE.description" : "{Erstschlag}\nDiese Kreatur greift zuerst an, anstatt zu vergelten",
+	"core.bonus.FLYING.description.bonusSubtype.movementTeleporting" : "{Teleportation}\nDiese Einheit kann sich in ein beliebiges Feld teleportieren und ignoriert Hindernisse auf dem Schlachtfeld",
 	"core.bonus.FLYING.description" : "{Fliegen}\nKann fliegen (ignoriert Hindernisse)",
 	"core.bonus.FREE_SHOOTING.description" : "{Nah schießen}\nKann im Nahkampf schießen",
 	"core.bonus.GARGOYLE.description" : "{Gargoyle}\nKann nicht aufgerichtet oder geheilt werden",
+	"core.bonus.GENERAL_DAMAGE_REDUCTION.description.bonusSubtype.damageTypeMelee" : "{Schaden mindern (${val}%) }\nVerringert physischen Schaden durch Nahkampfangriffe um ${val}%",
+	"core.bonus.GENERAL_DAMAGE_REDUCTION.description.bonusSubtype.damageTypeRanged" : "{Schaden mindern (${val}%) }\nVerringert den physischen Schaden von Fernkampfangriffen um ${val}%",
 	"core.bonus.GENERAL_DAMAGE_REDUCTION.description" : "{Schaden vermindern (${val}%)}\nReduziert physischen Schaden aus dem Fern- oder Nahkampf",
 	"core.bonus.HATE.description" : "{Hasst ${subtype.creature}}\nMacht ${val}% mehr Schaden",
 	"core.bonus.HEALER.description" : "{Heiler}\nHeilt verbündete Einheiten",
 	"core.bonus.HP_REGENERATION.description" : "{Regeneration}\nHeilt ${val} Trefferpunkte jede Runde",
 	"core.bonus.INVINCIBLE.description" : "{Unbesiegbar}\nKann durch nichts beeinflusst werden",
 	"core.bonus.JOUSTING.description" : "{Champion Charge}\n+${val}% Schaden pro zurückgelegtem Feld",
-	"core.bonus.KING.description" : "{König}\nAnfällig für Drachentöter Level ${val} oder höher",
+	"core.bonus.KING.description.2" : "{König verbessert}\nErhält zusätzlichen Schaden von Einheiten, die unter dem Zauber Drachentöter verbessert stehen",
+	"core.bonus.KING.description.3" : "{König Meisterhaft}\nErhält zusätzlichen Schaden von Einheiten, die unter dem Zauber Drachentöter Meisterhaft stehen",
+	"core.bonus.KING.description" : "{König}\nErhält zusätzlichen Schaden von Einheiten, die unter dem Zauber Drachentöter stehen",
 	"core.bonus.LEVEL_SPELL_IMMUNITY.description" : "{Zauberimmunität 1-${val}}\nImmun gegen Zaubersprüche der Stufen 1-${val}",
 	"core.bonus.LIFE_DRAIN.description" : "{Leben entziehen (${val}%)}\nDrainiert ${val}% des zugefügten Schadens",
 	"core.bonus.LIMITED_SHOOTING_RANGE.description" : "{Begrenzte Schussweite}\nKann nicht auf Ziele schießen, die weiter als ${val} Felder entfernt sind",
@@ -680,23 +739,24 @@
 	"core.bonus.REVENGE.description" : "{Rache}\nVerursacht zusätzlichen Schaden basierend auf der verlorenen Gesundheit des Angreifers im Kampf",
 	"core.bonus.SHOOTER.description" : "{Fernkämpfer}\nKreatur kann schießen",
 	"core.bonus.SHOOTS_ALL_ADJACENT.description" : "{Schießt rundherum}\nDie Fernkampfangriffe dieser Kreatur treffen alle Ziele in einem kleinen Bereich",
+	"core.bonus.SKELETON_TRANSFORMER_TARGET.description" : "{Skelett Transformation}\nDer Skeleton Transformer verwandelt diese Einheit in ein ${subtype.creature}",
 	"core.bonus.SOUL_STEAL.description" : "{Seelenraub}\nGewinnt ${val} neue Kreaturen für jeden getöteten Gegner",
 	"core.bonus.SPELL_AFTER_ATTACK.description" : "{Nach Angriff zaubern}\n${val}%, um ${subtype.spell} nach dem Angriff zu wirken",
 	"core.bonus.SPELL_BEFORE_ATTACK.description" : "{Zauber vor Angriff}\n${val}% um ${subtype.spell} vor dem Angriff zu wirken",
 	"core.bonus.SPELLCASTER.description" : "{Zauberer}\nKann ${subtype.spell} zaubern",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description" : "{Zauberwiderstand}\nSchaden von allen Zaubern um ${val}% reduziert.",
 	"core.bonus.SPELL_DAMAGE_REDUCTION.description.spellSchool.air" : "{Luft-Zauberwiderstand}\nSchaden von Luft-Zaubern um ${val}% reduziert.",
 	"core.bonus.SPELL_DAMAGE_REDUCTION.description.spellSchool.earth" : "{Erde-Zauberwiderstand}\nSchaden von Erde-Zaubern um ${val}% reduziert.",
 	"core.bonus.SPELL_DAMAGE_REDUCTION.description.spellSchool.fire" : "{Feuer-Zauberwiderstand}\nSchaden von Feuer-Zaubern um ${val}% reduziert.",
 	"core.bonus.SPELL_DAMAGE_REDUCTION.description.spellSchool.water" : "{Wasser-Zauberwiderstand}\nSchaden von Wasser-Zaubern um ${val}% reduziert.",
-	"core.bonus.SPELL_DAMAGE_REDUCTION.description" : "{Zauberwiderstand}\nSchaden von allen Zaubern um ${val}% reduziert.",
 	"core.bonus.SPELL_IMMUNITY.description" : "{Zauberimmunität}\nImmun gegen ${subtype.spell}",
-	"core.bonus.SPELL_LIKE_ATTACK.description" : "{zauberähnlicher Angriff}\nAngriffe mit ${subtype.spell}",
+	"core.bonus.SPELL_LIKE_ATTACK.description" : "{Zauberähnlicher Angriff}\nAngriffe mit ${subtype.spell}",
 	"core.bonus.SPELL_RESISTANCE_AURA.description" : "{Aura des Widerstands}\nStapel in der Nähe erhalten ${val}% Widerstand",
-	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.spellSchool.air" : "{Luft-Immunität}\nImmunität gegen Zauber der Luft-Schule",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description" : "{Zauber-Immunität}\nImmunität gegen alle Zauber-Schulen",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.spellSchool.air"   : "{Luft-Immunität}\nImmunität gegen Zauber der Luft-Schule",
 	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.spellSchool.earth" : "{Erde-Immunität}\nImmunität gegen Zauber der Erde-Schule",
-	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.spellSchool.fire" : "{Feuer-Immunität}\nImmunität gegen Zauber der Feuer-Schule",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.spellSchool.fire"  : "{Feuer-Immunität}\nImmunität gegen Zauber der Feuer-Schule",
 	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.spellSchool.water" : "{Wasser-Immunität}\nImmunität gegen Zauber der Wasser-Schule",
-	"core.bonus.SPELL_SCHOOL_IMMUNITY.description" : "{Zauber-Immunität}\nImmunität gegen alle Zauber-Schulen",
 	"core.bonus.SUMMON_GUARDIANS.description" : "{Wächter beschwören}\nBeschwört bei Kampfbeginn ${subtype.creature} (${val}%)",
 	"core.bonus.THREE_HEADED_ATTACK.description" : "{Dreiköpfiger Angriff}\nGreift drei benachbarte Einheiten an",
 	"core.bonus.TRANSMUTATION.description" : "{Transmutation}\n${val}% Chance, angegriffene Einheit in einen anderen Typ zu verwandeln",
@@ -725,5 +785,16 @@
 	"spell.core.strongholdMoat.name" : "Holzspieße",
 	"spell.core.strongholdMoatTrigger.name" : "Holzspieße",
 	"spell.core.summonDemons.name" : "Dämonen beschwören",
-	"spell.core.towerMoat.name" : "Landmine"
-}
+	"spell.core.towerMoat.name" : "Landmine",
+
+	"spell.core.stoneGaze.description.none" : "{Steinerner Blick}\n\nDie anvisierte Einheit wird versteinert und kann sich drei Kampfrunden lang nicht bewegen. Wenn sie angegriffen wird, erleidet sie 50% Schaden und wird wieder aufgetaut",
+	"spell.core.poison.description.none" : "{Gift}\n\nWenn die Kreatur vergiftet ist, wird die maximale Gesundheit des Zielstapels drei Runden lang in jeder Kampfrunde um 10% verringert. Nach drei Runden ist die Kreatur nicht mehr vergiftet, aber die maximale Gesundheit bleibt verringert",
+	"spell.core.bind.description.none" : "{Binden}\n\nDie betroffene Einheit ist an den Boden gefesselt und kann sich nicht bewegen, bis sich der Stapel, der sie gefesselt hat, bewegt oder untergeht",
+	"spell.core.disease.description.none" : "{Krankheit}\n\nDas lebende Ziel wird krank, wodurch seine Angriffs- und Verteidigungswerte drei Runden lang um zwei reduziert werden",
+	"spell.core.paralyze.description.none" : "{Lähmen}\n\nDas Ziel ist gelähmt und verzichtet für den Rest der aktuellen Kampfrunde und die beiden darauf folgenden Kampfrunden auf seinen Zug, es sei denn, es wird in der Zwischenzeit angegriffen. Gelähmte Kreaturen erleiden bei Angriffen den vollen Schaden, können aber nur mit einem Viertel ihrer Stärke zurückschlagen",
+	"spell.core.age.description.none" : "{Alter}\n\nAltern senkt die maximale Gesundheit jeder Kreatur im Zielstapel drei Kampfrunden lang auf 50%",
+	"spell.core.deathCloud.description.none" : "{Death Cloud}\n\nZusätzlich zum normalen Fernkampfschaden im Zielfeld wirkt die Todeswolke auch auf alle 6 angrenzenden Felder um das Zielfeld und fügt allen Lebewesen im Radius Schaden zu.",
+	"spell.core.thunderbolt.description.none" : "{Donnerblitz}\n\nWenn der Stapel angreift, besteht eine 20-prozentige Chance, dass ein Blitzschlag erfolgt, bevor der Feind die Chance hat, zurückzuschlagen. Tritt dieser Fall ein, verursacht der Blitzschlag Schaden in Höhe der zehnfachen Anzahl der angreifenden Donnervögel",
+	"spell.core.dispelHelpful.description.none" : "{Hilfreiche Zaubersprüche bannen}\n\nEntfernt alle Zaubereffekte von der anvisierten Einheit",
+	"spell.core.acidBreath.description.none" : "{Saurer Atem}\n\nDer Atem reduziert die Verteidigung des Zielstapels um 3 und hat eine 20%ige Chance, zusätzlichen Schaden in Höhe von 25 Punkten pro angreifender Einheit zu verursachen",
+}

+ 70 - 57
Mods/vcmi/Content/config/portuguese.json

@@ -12,7 +12,7 @@
 	"vcmi.adventureMap.monsterThreat.levels.9"  : "Avassaladora",
 	"vcmi.adventureMap.monsterThreat.levels.10" : "Mortal",
 	"vcmi.adventureMap.monsterThreat.levels.11" : "Impossível",
-	"vcmi.adventureMap.monsterLevel"            : "\n\nNível %LEVEL, unidade %TOWN de ataque %ATTACK_TYPE",
+	"vcmi.adventureMap.monsterLevel"            : "\n\nUnidade %TOWN de nível %LEVEL de ataque %ATTACK_TYPE",
 	"vcmi.adventureMap.monsterMeleeType"        : "corpo a corpo",
 	"vcmi.adventureMap.monsterRangedType"       : "à distância",
 	"vcmi.adventureMap.search.hover"            : "Procurar objeto no mapa",
@@ -32,6 +32,13 @@
 	"vcmi.adventureMap.dwelling3" : "{%s}\n\nVocê gostaria de recrutar %s, %s ou %s?",
 	
 	"vcmi.artifact.charges" : "Cargas",
+	
+	"vcmi.battle.action.move" : "Mover unidade para o local especificado",
+	"vcmi.battle.action.info" : "Mostrar informações da unidade",
+	"vcmi.battle.action.shoot" : "Usar ataque à distância",
+	"vcmi.battle.action.attack" : "Usar ataque corpo a corpo",
+	"vcmi.battle.action.return" : "Usar ataque corpo a corpo e retornar",
+	"vcmi.battle.action.genie" : "Lançar feitiço benéfico aleatório",
 
 	"vcmi.bonusSource.artifact" : "Artefato",
 	"vcmi.bonusSource.creature" : "Habilidade",
@@ -154,10 +161,10 @@
 	"vcmi.broadcast.vote.yes" : "sim",
 	"vcmi.broadcast.vote.no" : "não",
 	"vcmi.broadcast.vote.notRecognized" : "Comando de votação não reconhecido!",
-	"vcmi.broadcast.vote.success.untilContacts" : "Votação concluída com sucesso. Os turnos simultâneos ocorrerão por mais %s dias, ou até o contato",
-	"vcmi.broadcast.vote.success.contactsBlocked" : "Votação concluída com sucesso. Os turnos simultâneos ocorrerão por mais %s dias. Os contatos estão bloqueados",
-	"vcmi.broadcast.vote.success.nextDay" : "Votação concluída com sucesso. Os turnos simultâneos serão encerrados no próximo dia",
-	"vcmi.broadcast.vote.success.timer" : "Votação concluída com sucesso. O cronômetro para todos os jogadores foi prolongado em %s segundos",
+	"vcmi.broadcast.vote.success.untilContacts" : "Votação bem-sucedida. Os turnos simultâneos ocorrerão por mais %s dias, ou até o contato",
+	"vcmi.broadcast.vote.success.contactsBlocked" : "Votação bem-sucedida. Os turnos simultâneos ocorrerão por mais %s dias. Os contatos estão bloqueados",
+	"vcmi.broadcast.vote.success.nextDay" : "Votação bem-sucedida. Os turnos simultâneos serão encerrados no próximo dia",
+	"vcmi.broadcast.vote.success.timer" : "Votação bem-sucedida. O cronômetro para todos os jogadores foi prolongado em %s segundos",
 	"vcmi.broadcast.vote.aborted" : "O jogador votou contra a mudança. Votação abortada",
 	"vcmi.broadcast.vote.start.untilContacts" : "Votação iniciada para permitir turnos simultâneos por mais %s dias",
 	"vcmi.broadcast.vote.start.contactsBlocked" : "Votação iniciada para forçar turnos simultâneos por mais %s dias",
@@ -180,7 +187,7 @@
 	"vcmi.lobby.header.chat.player" : "Bate-papo privado com %s", // %s -> apelido de outro jogador
 	"vcmi.lobby.header.history" : "Seus Jogos Anteriores",
 	"vcmi.lobby.header.players" : "Jogadores Online - %d",
-	"vcmi.lobby.match.solo" : "Jogo para um Jogador",
+	"vcmi.lobby.match.solo" : "Jogo para Um Jogador",
 	"vcmi.lobby.match.duel" : "Jogo com %s", // %s -> apelido de outro jogador
 	"vcmi.lobby.match.multi" : "%d jogadores",
 	"vcmi.lobby.room.create.hover" : "Criar Nova Sala",
@@ -197,7 +204,7 @@
 	"vcmi.lobby.preview.subtitle" : "Jogo em %s, hospedado por %s", //TL Note: 1) name of map or RMG template 2) nickname of game host
 	"vcmi.lobby.preview.version" : "Versão do jogo:",
 	"vcmi.lobby.preview.players" : "Jogadores:",
-	"vcmi.lobby.preview.mods" : "Mods utilizados:",
+	"vcmi.lobby.preview.mods" : "Mods usados:",
 	"vcmi.lobby.preview.allowed" : "Deseja entrar na sala de jogo?",
 	"vcmi.lobby.preview.error.header" : "Não foi possível entrar nesta sala.",
 	"vcmi.lobby.preview.error.playing" : "Você precisa sair do seu jogo atual primeiro.",
@@ -230,7 +237,7 @@
 	"vcmi.lobby.pvp.randomTownVs.help" : "Escreve duas cidades aleatórias no bate-papo",
 	"vcmi.lobby.pvp.versus" : "vs.",
 
-	"vcmi.client.errors.invalidMap" : "{Mapa ou campanha inválido}\n\nFalha ao iniciar o jogo! O mapa ou campanha selecionado pode ser inválido ou corrompido. Motivo:\n%s",
+	"vcmi.client.errors.invalidMap" : "{Mapa ou campanha inválida}\n\nFalha ao iniciar o jogo! O mapa ou campanha selecionado pode ser inválido ou corrompido. Motivo:\n%s",
 	"vcmi.client.errors.modLoadingFailure" : "{Falha ao carregar mod}\n\nProblemas críticos encontrados ao carregar mods! O jogo pode não funcionar corretamente ou travar! Por favor, atualize ou desative os seguintes mods:\n\n",
 	"vcmi.server.errors.disconnected" : "{Erro de Rede}\n\nA conexão com o servidor do jogo foi perdida!",
 	"vcmi.server.errors.playerLeft" : "{Jogador Saiu}\n\nO jogador %s desconectou-se do jogo!", //%s -> player color
@@ -337,40 +344,42 @@
 	"vcmi.adventureOptions.smoothDragging.help" : "{Arrasto Suave do Mapa}\n\nQuando ativado, o arrasto do mapa tem um efeito de movimento moderno.",
 	"vcmi.adventureOptions.skipAdventureMapAnimations.hover" : "Omitir Efeitos de Desvanecimento",
 	"vcmi.adventureOptions.skipAdventureMapAnimations.help" : "{Omite os Efeitos de Desvanecimento}\n\nQuando ativado, omite o desvanecimento de objetos e efeitos semelhantes (coleta de recursos, embarque em navios etc.). Torna a interface do usuário mais reativa em alguns casos, em detrimento da estética. Especialmente útil em jogos PvP. Para obter velocidade de movimento máxima, o pulo está ativo independentemente desta configuração.",
-	"vcmi.adventureOptions.mapScrollSpeed1.hover": "",
-	"vcmi.adventureOptions.mapScrollSpeed5.hover": "",
-	"vcmi.adventureOptions.mapScrollSpeed6.hover": "",
+	"vcmi.adventureOptions.mapScrollSpeed1.hover" : "",
+	"vcmi.adventureOptions.mapScrollSpeed5.hover" : "",
+	"vcmi.adventureOptions.mapScrollSpeed6.hover" : "",
 	"vcmi.adventureOptions.mapScrollSpeed1.help" : "Define a velocidade de rolagem do mapa como muito lenta.",
 	"vcmi.adventureOptions.mapScrollSpeed5.help" : "Define a velocidade de rolagem do mapa como muito rápida.",
 	"vcmi.adventureOptions.mapScrollSpeed6.help" : "Define a velocidade de rolagem do mapa como instantânea.",
 	"vcmi.adventureOptions.hideBackground.hover" : "Ocultar Fundo",
 	"vcmi.adventureOptions.hideBackground.help" : "{Oculta o Fundo}\n\nOculta o mapa de aventura no fundo e mostra uma textura em vez disso.",
-
-	"vcmi.battleOptions.queueSizeLabel.hover": "Mostrar Fila de Ordem de Turno",
-	"vcmi.battleOptions.queueSizeNoneButton.hover": "DESL.",
-	"vcmi.battleOptions.queueSizeAutoButton.hover": "AUTO.",
-	"vcmi.battleOptions.queueSizeSmallButton.hover": "PEQU.",
-	"vcmi.battleOptions.queueSizeBigButton.hover": "GRAN.",
-	"vcmi.battleOptions.queueSizeNoneButton.help": "Não exibir Fila de Ordem de Turno.",
-	"vcmi.battleOptions.queueSizeAutoButton.help": "Ajusta automaticamente o tamanho da fila de ordem de turno com base na resolução do jogo (o tamanho PEQUENO é usado ao jogar em uma resolução com altura inferior a 700 pixels; o tamanho GRANDE é usado caso contrário).",
-	"vcmi.battleOptions.queueSizeSmallButton.help": "Define o tamanho da fila de ordem de turno como PEQUENO.",
-	"vcmi.battleOptions.queueSizeBigButton.help": "Define o tamanho da fila de ordem de turno como GRANDE (não suportado se a altura da resolução do jogo for inferior a 700 pixels).",
-	"vcmi.battleOptions.animationsSpeed1.hover": "",
-	"vcmi.battleOptions.animationsSpeed5.hover": "",
-	"vcmi.battleOptions.animationsSpeed6.hover": "",
-	"vcmi.battleOptions.animationsSpeed1.help": "Define a velocidade da animação como muito lenta.",
-	"vcmi.battleOptions.animationsSpeed5.help": "Define a velocidade da animação como muito rápida.",
-	"vcmi.battleOptions.animationsSpeed6.help": "Define a velocidade da animação como instantânea.",
-	"vcmi.battleOptions.movementHighlightOnHover.hover": "Destacar Movimento ao Passar o Mouse",
-	"vcmi.battleOptions.movementHighlightOnHover.help": "{Destaca o Movimento ao Passar o Mouse}\n\nDestaca o alcance de movimento da unidade quando você passa o mouse sobre ela.",
-	"vcmi.battleOptions.rangeLimitHighlightOnHover.hover": "Mostrar Limites de Alcance de Atiradores",
-	"vcmi.battleOptions.rangeLimitHighlightOnHover.help": "{Mostra os Limites de Alcance dos Atiradores ao Passar o Mouse}\n\nMostra os limites de alcance do atirador quando você passa o mouse sobre ele.",
-	"vcmi.battleOptions.showStickyHeroInfoWindows.hover": "Mostrar Janelas de Estatísticas de Heróis",
-	"vcmi.battleOptions.showStickyHeroInfoWindows.help": "{Mostra as Janelas de Estatísticas de Heróis}\n\nAlterna permanentemente as janelas de estatísticas dos heróis que mostram estatísticas primárias e pontos de mana.",
-	"vcmi.battleOptions.skipBattleIntroMusic.hover": "Pular Música de Introdução",
-	"vcmi.battleOptions.skipBattleIntroMusic.help": "{Pula a Música de Introdução}\n\nPermite ações durante a música de introdução que toca no início de cada batalha.",
-	"vcmi.battleOptions.endWithAutocombat.hover": "Terminar a batalha",
-	"vcmi.battleOptions.endWithAutocombat.help": "{Termina a batalha}\n\nO Combate Automático reproduz a batalha até o final instantâneo.",
+	"vcmi.adventureOptions.minimapShowHeroes.hover" : "Mostrar Heróis no Minimapa",
+	"vcmi.adventureOptions.minimapShowHeroes.help" : "{Mostrar Heróis no Minimapa}\n\nMostra um ícone adicional para todos os heróis visíveis no minimapa, facilitando a visualização deles em mapas grandes.",
+
+	"vcmi.battleOptions.queueSizeLabel.hover" : "Mostrar Fila de Ordem de Turno",
+	"vcmi.battleOptions.queueSizeNoneButton.hover" : "DESL.",
+	"vcmi.battleOptions.queueSizeAutoButton.hover" : "AUTO.",
+	"vcmi.battleOptions.queueSizeSmallButton.hover" : "PEQU.",
+	"vcmi.battleOptions.queueSizeBigButton.hover" : "GRAN.",
+	"vcmi.battleOptions.queueSizeNoneButton.help" : "Não exibir Fila de Ordem de Turno.",
+	"vcmi.battleOptions.queueSizeAutoButton.help" : "Ajusta automaticamente o tamanho da fila de ordem de turno com base na resolução do jogo (o tamanho PEQUENO é usado ao jogar em uma resolução com altura inferior a 700 pixels; o tamanho GRANDE é usado caso contrário).",
+	"vcmi.battleOptions.queueSizeSmallButton.help" : "Define o tamanho da fila de ordem de turno como PEQUENO.",
+	"vcmi.battleOptions.queueSizeBigButton.help" : "Define o tamanho da fila de ordem de turno como GRANDE (não suportado se a altura da resolução do jogo for inferior a 700 pixels).",
+	"vcmi.battleOptions.animationsSpeed1.hover" : "",
+	"vcmi.battleOptions.animationsSpeed5.hover" : "",
+	"vcmi.battleOptions.animationsSpeed6.hover" : "",
+	"vcmi.battleOptions.animationsSpeed1.help" : "Define a velocidade da animação como muito lenta.",
+	"vcmi.battleOptions.animationsSpeed5.help" : "Define a velocidade da animação como muito rápida.",
+	"vcmi.battleOptions.animationsSpeed6.help" : "Define a velocidade da animação como instantânea.",
+	"vcmi.battleOptions.movementHighlightOnHover.hover" : "Destacar Movimento ao Passar o Mouse",
+	"vcmi.battleOptions.movementHighlightOnHover.help" : "{Destaca o Movimento ao Passar o Mouse}\n\nDestaca o alcance de movimento da unidade quando você passa o mouse sobre ela.",
+	"vcmi.battleOptions.rangeLimitHighlightOnHover.hover" : "Mostrar Limites de Alcance de Atiradores",
+	"vcmi.battleOptions.rangeLimitHighlightOnHover.help" : "{Mostra os Limites de Alcance dos Atiradores ao Passar o Mouse}\n\nMostra os limites de alcance do atirador quando você passa o mouse sobre ele.",
+	"vcmi.battleOptions.showStickyHeroInfoWindows.hover" : "Mostrar Janelas de Estatísticas de Heróis",
+	"vcmi.battleOptions.showStickyHeroInfoWindows.help" : "{Mostra as Janelas de Estatísticas de Heróis}\n\nAlterna permanentemente as janelas de estatísticas dos heróis que mostram estatísticas primárias e pontos de mana.",
+	"vcmi.battleOptions.skipBattleIntroMusic.hover" : "Pular Música de Introdução",
+	"vcmi.battleOptions.skipBattleIntroMusic.help" : "{Pula a Música de Introdução}\n\nPermite ações durante a música de introdução que toca no início de cada batalha.",
+	"vcmi.battleOptions.endWithAutocombat.hover" : "Terminar a batalha",
+	"vcmi.battleOptions.endWithAutocombat.help" : "{Termina a batalha}\n\nO Combate Automático reproduz a batalha até o final instantâneo.",
 	"vcmi.battleOptions.showQuickSpell.hover" : "Mostrar painel de Feitiços Rápidos",
 	"vcmi.battleOptions.showQuickSpell.help" : "{Mostra o painel de Feitiços Rápidos}\n\nMostra um painel para seleção rápida de feitiços",
 	"vcmi.battleOptions.showHealthBar.hover" : "Mostrar barra de vida",
@@ -433,6 +442,9 @@
 	"vcmi.townWindow.upgradeAll.notAllUpgradable" : "Recursos insuficientes para atualizar todas as criaturas. Deseja atualizar as seguintes criaturas?",
 	"vcmi.townWindow.upgradeAll.notUpgradable" : "Recursos insuficientes para atualizar qualquer criatura.",
 
+	"vcmi.kingdomOverview.secSkillOverflow.hover" : "Mais habilidades",
+	"vcmi.kingdomOverview.secSkillOverflow.help" : "{Mais habilidades}\n\nEste herói possui mais habilidades.\nVocê pode vê-las na visão geral do herói.",
+
 	"vcmi.logicalExpressions.anyOf"  : "Qualquer um dos seguintes:",
 	"vcmi.logicalExpressions.allOf"  : "Todos os seguintes:",
 	"vcmi.logicalExpressions.noneOf" : "Nenhum dos seguintes:",
@@ -535,7 +547,7 @@
 
 	"vcmi.optionsTab.cheatAllowed.hover" : "Permitir trapaças",
 	"vcmi.optionsTab.unlimitedReplay.hover" : "Repetição de batalha ilimitada",
-	"vcmi.optionsTab.cheatAllowed.help" : "{Permitir trapaças}\nPermite a entrada de trapaças durante o jogo.",
+	"vcmi.optionsTab.cheatAllowed.help" : "{Permitir trapaças}\nPermite a inserção de códigos de trapaça durante o jogo.",
 	"vcmi.optionsTab.unlimitedReplay.help" : "{Repetição de batalha ilimitada}\nSem limite de repetição de batalhas.",
 
 	// Custom victory conditions for H3 campaigns and HotA maps
@@ -632,12 +644,12 @@
 	"creatures.core.devil.bonus.decreaseLuck" : "{Reduz a sorte do inimigo}\nDiabos e Arquidiabos reduzem a sorte do inimigo em um",
 	"creatures.core.boneDragon.bonus.decreaseMorale" : "{Reduz a moral do inimigo}\nDragões Esqueletos e Dragões Fantasmas diminuem a moral das unidades inimigas em um",
 	"creatures.core.marksman.bonus.extraAttack" : "{Atira duas vezes}\nEsta unidade pode atirar duas vezes",
-	"creatures.core.azureDragon.bonus.fearful" : "{Medo}\nCausa Medo em uma pilha inimiga",
-	"creatures.core.azureDragon.bonus.fearless" : "{Destemido}\nImune à habilidade de Medo",
+	"creatures.core.azureDragon.bonus.fearful" : "{Medo}\nUnidades inimigas têm 10% de chance de congelar de medo",
+	"creatures.core.azureDragon.bonus.fearless" : "{Destemido}\nImune à habilidade Medo",
 
-	"core.bonus.ADDITIONAL_ATTACK.description" : "{Ataque Duplo}\nAtaca duas vezes",
-	"core.bonus.ADDITIONAL_RETALIATION.description" : "{Contra-ataques Adicionais}\nPode contra-atacar ${val} vezes extras",
-	"core.bonus.ATTACKS_ALL_ADJACENT.description" : "{Ataque em Todas as Direções}\nAtaca todos os inimigos adjacentes",
+	"core.bonus.ADDITIONAL_ATTACK.description" : "{Ataques Adicionais}\nA unidade pode atacar {$val} vezes adicionais",
+	"core.bonus.ADDITIONAL_RETALIATION.description" : "{Contra-ataques Adicionais}\nA unidade pode contra-atacar ${val} vezes extras",
+	"core.bonus.ATTACKS_ALL_ADJACENT.description" : "{Ataque em Área}\nAtaca todos os inimigos adjacentes além do alvo principal",
 	"core.bonus.BLOCKS_RANGED_RETALIATION.description" : "{Evita Contra-ataques à Distância}\nO inimigo não pode contra-atacar usando um ataque à distância",
 	"core.bonus.BLOCKS_RETALIATION.description" : "{Evita Contra-ataques}\nO inimigo não pode contra-atacar",
 	"core.bonus.CATAPULT.description" : "{Catapulta}\nAtaca as muralhas de cerco",
@@ -655,7 +667,7 @@
 	"core.bonus.ENEMY_ATTACK_REDUCTION.description" : "{Ignorar Ataque (${val}%)}\nAo ser atacado, ${val}% do ataque do agressor é ignorado",
 	"core.bonus.ENEMY_DEFENCE_REDUCTION.description" : "{Ignorar Defesa (${val}%)}\nAo atacar, ${val}% da defesa do defensor é ignorada",
 	"core.bonus.FEROCITY.description" : "{Ferocidade}\nAtaca ${val} vezes adicionais se matar alguém",
-	"core.bonus.FIRE_SHIELD.description" : "{Escudo de Fogo (${val}%)}\nReflete parte do dano corpo a corpo",
+	"core.bonus.FIRE_SHIELD.description" : "{Escudo de Fogo (${val}%) }\nA unidade reflete ${val} do dano corpo a corpo recebido",
 	"core.bonus.FIRST_STRIKE.description.bonusSubtype.damageTypeMelee" : "{Primeiro Ataque}\nA unidade contra-atacará antes de ser atacada em combate corpo a corpo",
 	"core.bonus.FIRST_STRIKE.description.bonusSubtype.damageTypeRanged" : "{Primeiro Ataque}\nA unidade contra-atacará antes de ser atacada por um ataque à distância",
 	"core.bonus.FIRST_STRIKE.description" : "{Primeiro Ataque}\nA unidade contra-atacará antes de ser atacada",
@@ -670,23 +682,23 @@
 	"core.bonus.HEALER.description" : "{Curandeiro}\nCura unidades aliadas",
 	"core.bonus.HP_REGENERATION.description" : "{Regeneração}\nCura ${val} pontos de vida a cada turno",
 	"core.bonus.INVINCIBLE.description" : "{Invencível}\nNão pode ser afetado por nada",
-	"core.bonus.JOUSTING.description" : "{Carga do Campeão}\n+${val}% de dano para cada hexágono percorrido",
+	"core.bonus.JOUSTING.description" : "{Carga do Campeão}\nMover antes de um ataque aumenta o dano em ${val}% para cada hexágono percorrido",
 	"core.bonus.KING.description.2" : "{Rei Nv. Avançado}\nRecebe dano adicional de unidades sob o feitiço Matador Nv. Avançado",
 	"core.bonus.KING.description.3" : "{Rei Nv. Experiente}\nRecebe dano adicional de unidades sob o feitiço Matador Nv. Experiente",
 	"core.bonus.KING.description" : "{Rei}\nRecebe dano adicional de unidades sob o feitiço Matador",
 	"core.bonus.LEVEL_SPELL_IMMUNITY.description" : "{Imune a Feitiços 1-${val}}\nImunidade a feitiços dos níveis 1-${val}",
-	"core.bonus.LIFE_DRAIN.description" : "{Drenar Vida (${val}%)}\nDrena ${val}% do dano causado",
+	"core.bonus.LIFE_DRAIN.description" : "{Drenar Vida}\nDrena ${val}% do dano causado",
 	"core.bonus.LIMITED_SHOOTING_RANGE.description" : "{Alcance de Tiro Limitado}\nIncapaz de mirar unidades a mais de ${val} hexágonos de distância",
-	"core.bonus.MAGIC_MIRROR.description" : "{Espelho Mágico (${val}%)}\nTem ${val}% de chance de redirecionar um feitiço ofensivo para uma unidade inimiga",
+	"core.bonus.MAGIC_MIRROR.description" : "{Espelho Mágico}\nTem ${val}% de chance de redirecionar um feitiço ofensivo para uma unidade inimiga",
 	"core.bonus.MAGIC_RESISTANCE.description" : "{Resistência Mágica (${val}%)}\nTem ${val}% de chance de resistir a um feitiço inimigo",
-	"core.bonus.MANA_CHANNELING.description" : "{Canalização Mágica ${val}%}\nDá ao seu herói ${val}% da mana gasta pelo inimigo",
+	"core.bonus.MANA_CHANNELING.description" : "{Canalização Mágica}\nDá ao seu herói ${val}% da mana gasta pelo inimigo",
 	"core.bonus.MANA_DRAIN.description" : "{Drenagem de Mana}\nDrena ${val} de mana a cada turno",
 	"core.bonus.MECHANICAL.description" : "{Mecânico}\nImunidade a muitos efeitos, reparável",
 	"core.bonus.MIND_IMMUNITY.description" : "{Imune a Feitiços Mentais}\nImunidade a feitiços do tipo Mental",
 	"core.bonus.NO_DISTANCE_PENALTY.description" : "{Sem Penal. à Distância}\nCausa dano total a qualquer distância",
 	"core.bonus.NO_MELEE_PENALTY.description" : "{Sem Penal. em Comb.}\nSem penalidade no corpo a corpo",
 	"core.bonus.NO_MORALE.description" : "{Moral Neutra}\nA criatura é imune aos efeitos de moral",
-	"core.bonus.NON_LIVING.description" : "{Não Vivo}\nImune a muitos efeitos",
+	"core.bonus.NON_LIVING.description" : "{Não-Vivo}\nImune a muitos efeitos",
 	"core.bonus.NO_WALL_PENALTY.description" : "{Sem Penal. por Muralha}\nCausa dano total\ndurante cerco",
 	"core.bonus.PRISM_HEX_ATTACK_BREATH.description" : "{Sopro Prismático}\nAtaque de Sopro Prismático (três direções)",
 	"core.bonus.RANDOM_SPELLCASTER.description" : "{Conjurador Aleatório}\nPode lançar um feitiço aleatório",
@@ -696,7 +708,8 @@
 	"core.bonus.RETURN_AFTER_STRIKE.description" : "{Atacar e Voltar}\nVolta após o ataque corpo a corpo",
 	"core.bonus.REVENGE.description" : "{Vingança}\nCausa dano extra com base na saúde perdida do atacante em batalha",
 	"core.bonus.SHOOTER.description" : "{Longo Alcance}\nA criatura pode atirar",
-	"core.bonus.SHOOTS_ALL_ADJACENT.description" : "{Atirar em Tudo ao Redor}\nOs ataques à distância desta criatura atingem todos os alvos em uma pequena área",
+	"core.bonus.SHOOTS_ALL_ADJACENT.description" : "{Atirar em Área}\nOs ataques à distância desta unidade atingem todos os alvos em uma pequena área",
+	"core.bonus.SKELETON_TRANSFORMER_TARGET.description" : "{Transformação de Esqueleto}\nO Transformador Esquelético transformará esta unidade em um ${subtype.creature}",
 	"core.bonus.SOUL_STEAL.description" : "{Roubo de Alma}\nGanha ${val} novas criaturas para cada inimigo morto",
 	"core.bonus.SPELL_AFTER_ATTACK.description" : "{Lançar Após Ataque}\nTem ${val}% de chance de lançar ${subtype.spell} após atacar",
 	"core.bonus.SPELL_BEFORE_ATTACK.description" : "{Lançar Antes do Ataque}\nTem ${val}% de chance de lançar ${subtype.spell} antes de atacar",
@@ -714,13 +727,13 @@
 	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.spellSchool.fire" : "{Imunidade a Fogo}\nEsta unidade é imune a todos os feitiços da escola de Fogo",
 	"core.bonus.SPELL_SCHOOL_IMMUNITY.description" : "{Imunidade a Feitiços}\nEsta unidade é imune a todos os feitiços",
 	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.spellSchool.water" : "{Imunidade a Água}\nEsta unidade é imune a todos os feitiços da escola de Água",
-	"core.bonus.SUMMON_GUARDIANS.description" : "{Invocar Guardas}\nNo início da batalha, invoca ${subtype.creature} (${val}%)",
+	"core.bonus.SUMMON_GUARDIANS.description" : "{Invocar Guardiões}\nNo início da batalha, invoca ${subtype.creature} (${val}%)",
 	"core.bonus.THREE_HEADED_ATTACK.description" : "{Ataque das Três Cabeças}\nAtaca três unidades adjacentes",
 	"core.bonus.TRANSMUTATION.description" : "{Transmutação}\n${val}% de chance de transformar a unidade atacada em um tipo diferente",
-	"core.bonus.TWO_HEX_ATTACK_BREATH.description" : "{Sopro}\nAtaque de Sopro (alcança 2 hexágonos)",
-	"core.bonus.UNDEAD.description" : "{Morto-vivo}\nA criatura é um Morto-vivo",
-	"core.bonus.UNLIMITED_RETALIATIONS.description" : "{Contra-ataques Ilimitados}\nPode contra-atacar um número ilimitado de vezes",
-	"core.bonus.WIDE_BREATH.description" : "{Sopro Amplo}\nAtaque de sopro amplo (vários hexágonos)",
+	"core.bonus.TWO_HEX_ATTACK_BREATH.description" : "{Ataque de Sopro}\nOs ataques desta unidade também atingirão qualquer unidade posicionada imediatamente atrás do alvo",
+	"core.bonus.UNDEAD.description" : "{Morto-vivo}\nA criatura é um Morto-vivo e é imune a efeitos que afetam apenas os vivos",
+	"core.bonus.UNLIMITED_RETALIATIONS.description" : "{Contra-ataques Ilimitados}\nEsta unidade pode contra-atacar um número ilimitado de vezes",
+	"core.bonus.WIDE_BREATH.description" : "{Sopro Amplo}\nEsta unidade ataca todas as unidades ao redor de seu alvo",
 
 	"spell.core.castleMoat.name" : "Fosso",
 	"spell.core.castleMoatTrigger.name" : "Fosso",
@@ -737,8 +750,8 @@
 	"spell.core.landMineTrigger.name" : "Mina Terrestre",
 	"spell.core.necropolisMoat.name" : "Cemitério",
 	"spell.core.necropolisMoatTrigger.name" : "Cemitério",
-	"spell.core.rampartMoat.name" : "Espraiamento",
-	"spell.core.rampartMoatTrigger.name" : "Espraiamento",
+	"spell.core.rampartMoat.name" : "Espinhos",
+	"spell.core.rampartMoatTrigger.name" : "Espinhos",
 	"spell.core.strongholdMoat.name" : "Estacas de Madeira",
 	"spell.core.strongholdMoatTrigger.name" : "Estacas de Madeira",
 	"spell.core.summonDemons.name" : "Invocar Demônios",

+ 10 - 10
client/ArtifactsUIController.cpp

@@ -127,8 +127,8 @@ bool ArtifactsUIController::askToDisassemble(const CGHeroInstance * hero, const
 
 void ArtifactsUIController::artifactRemoved()
 {
-	for(const auto & artWin : ENGINE->windows().findWindows<CWindowWithArtifacts>())
-		artWin->update();
+	for(const auto & artWin : ENGINE->windows().findWindows<IArtifactsHolder>())
+		artWin->updateArtifacts();
 	GAME->interface()->waitWhileDialog();
 }
 
@@ -139,10 +139,10 @@ void ArtifactsUIController::artifactMoved()
 		numOfMovedArts--;
 
 	if(numOfMovedArts == 0)
-		for(const auto & artWin : ENGINE->windows().findWindows<CWindowWithArtifacts>())
-		{
-			artWin->update();
-		}
+	{
+		for(const auto & artWin : ENGINE->windows().findWindows<IArtifactsHolder>())
+			artWin->updateArtifacts();
+	}
 	GAME->interface()->waitWhileDialog();
 }
 
@@ -160,12 +160,12 @@ void ArtifactsUIController::bulkArtMovementStart(size_t totalNumOfArts, size_t p
 
 void ArtifactsUIController::artifactAssembled()
 {
-	for(const auto & artWin : ENGINE->windows().findWindows<CWindowWithArtifacts>())
-		artWin->update();
+	for(const auto & artWin : ENGINE->windows().findWindows<IArtifactsHolder>())
+		artWin->updateArtifacts();
 }
 
 void ArtifactsUIController::artifactDisassembled()
 {
-	for(const auto & artWin : ENGINE->windows().findWindows<CWindowWithArtifacts>())
-		artWin->update();
+	for(const auto & artWin : ENGINE->windows().findWindows<IArtifactsHolder>())
+		artWin->updateArtifacts();
 }

+ 1 - 0
client/CPlayerInterface.cpp

@@ -498,6 +498,7 @@ void CPlayerInterface::heroMovePointsChanged(const CGHeroInstance * hero)
 	if (makingTurn && hero->tempOwner == playerID)
 		adventureInt->onHeroChanged(hero);
 	invalidatePaths();
+	localState->verifyPath(hero);
 }
 void CPlayerInterface::receivedResource()
 {

+ 2 - 2
client/ClientCommandManager.cpp

@@ -440,14 +440,14 @@ void ClientCommandManager::handleBonusesCommand(std::istringstream & singleWordB
 		return ss.str();
 	};
 		printCommandMessage("Bonuses of " + GAME->interface()->localState->getCurrentArmy()->getObjectName() + "\n");
-		printCommandMessage(format(*GAME->interface()->localState->getCurrentArmy()->getAllBonuses(Selector::all, Selector::all)) + "\n");
+		printCommandMessage(format(*GAME->interface()->localState->getCurrentArmy()->getAllBonuses(Selector::all)) + "\n");
 
 	printCommandMessage("\nInherited bonuses:\n");
 	TCNodes parents;
 		GAME->interface()->localState->getCurrentArmy()->getParents(parents);
 	for(const CBonusSystemNode *parent : parents)
 	{
-		printCommandMessage(std::string("\nBonuses from ") + typeid(*parent).name() + "\n" + format(*parent->getAllBonuses(Selector::all, Selector::all)) + "\n");
+		printCommandMessage(std::string("\nBonuses from ") + typeid(*parent).name() + "\n" + format(*parent->getAllBonuses(Selector::all)) + "\n");
 	}
 }
 

+ 7 - 0
client/adventureMap/AdventureMapInterface.cpp

@@ -362,6 +362,7 @@ void AdventureMapInterface::onHotseatWaitStarted(PlayerColor playerID)
 {
 	backgroundDimLevel = 255;
 
+	widget->getMinimap()->setAIRadar(true);
 	onCurrentPlayerChanged(playerID);
 	setState(EAdventureState::HOTSEAT_WAIT);
 }
@@ -562,6 +563,12 @@ void AdventureMapInterface::onTileLeftClicked(const int3 &targetPosition)
 			if(topBlocking && topBlocking->isVisitable() && !topBlocking->visitableAt(destinationTile) && settings["gameTweaks"]["simpleObjectSelection"].Bool())
 				destinationTile = topBlocking->visitablePos();
 
+			if(!settings["adventure"]["showMovePath"].Bool())
+			{
+				GAME->interface()->localState->setPath(currentHero, destinationTile);
+				onHeroChanged(currentHero);				
+			}
+
 			if(GAME->interface()->localState->hasPath(currentHero) &&
 			   GAME->interface()->localState->getPath(currentHero).endPos() == destinationTile &&
 			   !ENGINE->isKeyboardShiftDown())//we'll be moving

+ 10 - 6
client/battle/BattleActionsController.cpp

@@ -530,6 +530,7 @@ std::string BattleActionsController::actionGetStatusMessage(PossiblePlayerBattle
 				int distance = attacker->position.isValid() ? owner.getBattle()->battleGetDistances(attacker, attacker->getPosition())[attackFromHex.toInt()] : 0;
 				DamageEstimation retaliation;
 				BattleAttackInfo attackInfo(attacker, targetStack, distance, false );
+				attackInfo.attackerPos = attackFromHex;
 				DamageEstimation estimation = owner.getBattle()->battleEstimateDamage(attackInfo, &retaliation);
 				estimation.kills.max = std::min<int64_t>(estimation.kills.max, targetStack->getCount());
 				estimation.kills.min = std::min<int64_t>(estimation.kills.min, targetStack->getCount());
@@ -730,15 +731,18 @@ void BattleActionsController::actionRealize(PossiblePlayerBattleAction action, c
 		case PossiblePlayerBattleAction::MOVE_STACK:
 		{
 			const auto * activeStack = owner.stacksController->getActiveStack();
-			const bool backwardsMove = activeStack->unitSide() == BattleSide::ATTACKER ?
-				targetHex.getX() < activeStack->getPosition().getX():
-				targetHex.getX() > activeStack->getPosition().getX();
 
-			if(activeStack->doubleWide() && backwardsMove)
+			if(activeStack->doubleWide())
 			{
-				BattleHexArray acc = owner.getBattle()->battleGetAvailableHexes(activeStack, false);
+				BattleHexArray availableHexes = owner.getBattle()->battleGetAvailableHexes(activeStack, false);
 				BattleHex shiftedDest = targetHex.cloneInDirection(activeStack->destShiftDir(), false);
-				if(acc.contains(shiftedDest))
+				const bool canMoveHeadHere = availableHexes.contains(targetHex);
+				const bool canMoveTailHere = availableHexes.contains(shiftedDest);
+				const bool backwardsMove = activeStack->unitSide() == BattleSide::ATTACKER ?
+											   targetHex.getX() < activeStack->getPosition().getX():
+											   targetHex.getX() > activeStack->getPosition().getX();
+
+				if(canMoveTailHere && (backwardsMove || !canMoveHeadHere))
 					owner.giveCommand(EActionType::WALK, shiftedDest);
 				else
 					owner.giveCommand(EActionType::WALK, targetHex);

+ 7 - 5
client/battle/BattleFieldController.cpp

@@ -392,14 +392,16 @@ BattleHexArray BattleFieldController::getHighlightedHexesForMovementTarget()
 
 	if (stack->doubleWide())
 	{
+		const bool canMoveHeadHere = hoveredHex.isAvailable() && availableHexes.contains(hoveredHex);
+		const bool canMoveTailHere = hoveredHex.isAvailable() && availableHexes.contains(hoveredHex.cloneInDirection(stack->destShiftDir()));
 		const bool backwardsMove = stack->unitSide() == BattleSide::ATTACKER ?
-			hoveredHex.getX() < stack->getPosition().getX():
-			hoveredHex.getX() > stack->getPosition().getX();
+									   hoveredHex.getX() < stack->getPosition().getX():
+									   hoveredHex.getX() > stack->getPosition().getX();
 
-		if (backwardsMove && availableHexes.contains(hoveredHex.cloneInDirection(stack->destShiftDir())))
+		if(canMoveTailHere && (backwardsMove || !canMoveHeadHere))
 			return {hoveredHex, hoveredHex.cloneInDirection(stack->destShiftDir())};
 
-		if (availableHexes.contains(hoveredHex))
+		if (canMoveHeadHere)
 			return {hoveredHex, stack->occupiedHex(hoveredHex)};
 
 		return {};
@@ -820,7 +822,7 @@ bool BattleFieldController::isTileAttackable(const BattleHex & number) const
 
 	for (auto & elem : occupiableHexes)
 	{
-		if (BattleHex::mutualPosition(elem, number) != -1 || elem == number)
+		if (BattleHex::mutualPosition(elem, number) != BattleHex::EDir::NONE || elem == number)
 			return true;
 	}
 	return false;

+ 1 - 1
client/battle/BattleStacksController.cpp

@@ -805,7 +805,7 @@ void BattleStacksController::removeExpiredColorFilters()
 	{
 		if (!filter.persistent)
 		{
-			if (filter.source && !filter.target->hasBonus(Selector::source(BonusSource::SPELL_EFFECT, BonusSourceID(filter.source->id)), Selector::all))
+			if (filter.source && !filter.target->hasBonus(Selector::source(BonusSource::SPELL_EFFECT, BonusSourceID(filter.source->id))))
 				return true;
 			if (filter.effectColor == Colors::TRANSPARENCY && filter.transparency == 255)
 				return true;

+ 6 - 0
client/gui/CIntObject.h

@@ -162,6 +162,12 @@ public:
 	virtual void updateGarrisons() = 0;
 };
 
+class IArtifactsHolder
+{
+public:
+	virtual void updateArtifacts() = 0;
+};
+
 class IMarketHolder
 {
 public:

+ 36 - 3
client/mainmenu/CreditsScreen.cpp

@@ -17,7 +17,9 @@
 #include "../widgets/TextControls.h"
 #include "../widgets/ObjectLists.h"
 
+#include "../../lib/GameLibrary.h"
 #include "../../lib/filesystem/Filesystem.h"
+#include "../../lib/texts/CGeneralTextHandler.h"
 
 #include "../../AUTHORS.h"
 
@@ -36,8 +38,8 @@ CreditsScreen::CreditsScreen(Rect rect)
 	for (auto & element : contributors) 
 	{
 		if(element[0] != contributorsTask)
-			contributorsText += "\r\n{" + element[0] + ":}\r\n";
-		contributorsText += (element[2] != "" ? element[2] : element[1]) + "\r\n";
+			contributorsText += "\r\n\r\n{" + LIBRARY->generaltexth->translate("vcmi.credits." + boost::to_lower_copy(element[0])) + ":}\r\n";
+		contributorsText += (element[1] != "" ? element[1] : element[2]) + "\r\n";
 		contributorsTask = element[0];
 	}
 
@@ -45,7 +47,38 @@ CreditsScreen::CreditsScreen(Rect rect)
 	std::string text((char *)textFile.first.get(), textFile.second);
 	size_t firstQuote = text.find('\"') + 1;
 	text = text.substr(firstQuote, text.find('\"', firstQuote) - firstQuote);
-	text = "{- VCMI -}\r\n\r\n" + contributorsText + "\r\n\r\n{Website:}\r\nhttps://vcmi.eu\r\n\r\n\r\n\r\n\r\n{- Heroes of Might and Magic III -}\r\n\r\n" + text;
+
+	auto translateCredits = [&text](std::map<std::string, std::string> replacements){
+		for(auto & item : replacements)
+			boost::replace_first(text, "{" + item.second + ":}", "{" + LIBRARY->generaltexth->translate(item.first) + ":}");
+	};
+	translateCredits({
+		{ "core.credits.createdBy",           "Created By"           },
+		{ "core.credits.executiveProducer",   "Executive Producer"   },
+		{ "core.credits.producer",            "Producer"             },
+		{ "core.credits.director",            "Director"             },
+		{ "core.credits.designers",           "Designers"            },
+		{ "core.credits.leadProgrammers",     "Lead Programmers"     },
+		{ "core.credits.programmers",         "Programmers"          },
+		{ "core.credits.installerProgrammer", "Installer Programmer" },
+		{ "core.credits.leadArtists",         "Lead Artists"         },
+		{ "core.credits.artists",             "Artists"              },
+		{ "core.credits.assetCoordinator",    "Asset Coordinator"    },
+		{ "core.credits.levelDesigners",      "Level Designers"      },
+		{ "core.credits.musicProducer",       "Music Producer"       },
+		{ "core.credits.townThemes",          "Town Themes"          },
+		{ "core.credits.music",               "Music"                },
+		{ "core.credits.soundDesign",         "Sound Design"         },
+		{ "core.credits.voiceProduction",     "Voice Production"     },
+		{ "core.credits.voiceTalent",         "Voice Talent"         },
+		{ "core.credits.leadTester",          "Lead Tester"          },
+		{ "core.credits.seniorTester",        "Senior Tester"        },
+		{ "core.credits.testers",             "Testers"              },
+		{ "core.credits.specialThanks",       "Special Thanks"       },
+		{ "core.credits.visitUsOnTheWeb",     "Visit us on the Web"  }
+	});
+
+	text = "{- " + LIBRARY->generaltexth->translate("vcmi.credits.vcmi") + " -}\r\n" + contributorsText + "\r\n\r\n{" + LIBRARY->generaltexth->translate("vcmi.credits.website") + ":}\r\nhttps://vcmi.eu\r\n\r\n\r\n\r\n\r\n{- " + LIBRARY->generaltexth->translate("vcmi.credits.heroes") + " -}\r\n\r\n\r\n" + text;
 	credits = std::make_shared<CMultiLineLabel>(Rect(pos.w - 350, 0, 350, 600), FONT_CREDITS, ETextAlignment::CENTER, Colors::WHITE, text);
 	credits->scrollTextTo(-600); // move all text below the screen
 }

+ 3 - 0
client/mapView/IMapRendererContext.h

@@ -56,6 +56,9 @@ public:
 	/// returns true if specified object is the currently active hero
 	virtual bool isActiveHero(const CGObjectInstance* obj) const = 0;
 
+	/// Returns moveDir of hero that attacked this wandering monster, or -1 on failure
+	virtual int attackedMonsterDirection(const CGObjectInstance * wanderingMonster) const = 0;
+
 	virtual size_t objectGroupIndex(ObjectInstanceID objectID) const = 0;
 	virtual Point objectImageOffset(ObjectInstanceID objectID, const int3 & coordinates) const = 0;
 

+ 30 - 5
client/mapView/MapRenderer.cpp

@@ -22,6 +22,7 @@
 #include "../render/Colors.h"
 #include "../render/Graphics.h"
 
+#include "../../lib/CConfigHandler.h"
 #include "../../lib/RiverHandler.h"
 #include "../../lib/RoadHandler.h"
 #include "../../lib/TerrainHandler.h"
@@ -420,6 +421,19 @@ std::shared_ptr<CAnimation> MapRendererObjects::getAnimation(const AnimationPath
 	return ret;
 }
 
+std::shared_ptr<IImage> MapRendererObjects::getImage(const ImagePath & filename) const
+{
+	auto it = images.find(filename);
+
+	if(it != images.end())
+		return it->second;
+
+	auto ret = ENGINE->renderHandler().loadImage(filename, EImageBlitMode::SIMPLE);
+	images[filename] = ret;
+
+	return ret;
+}
+
 std::shared_ptr<CAnimation> MapRendererObjects::getFlagAnimation(const CGObjectInstance* obj)
 {
 	//TODO: relocate to config file?
@@ -456,7 +470,7 @@ std::shared_ptr<CAnimation> MapRendererObjects::getOverlayAnimation(const CGObje
 	return nullptr;
 }
 
-std::shared_ptr<IImage> MapRendererObjects::getImage(IMapRendererContext & context, const CGObjectInstance * obj, const std::shared_ptr<CAnimation>& animation) const
+std::shared_ptr<IImage> MapRendererObjects::getImageToRender(IMapRendererContext & context, const CGObjectInstance * obj, const std::shared_ptr<CAnimation>& animation) const
 {
 	if(!animation)
 		return nullptr;
@@ -465,6 +479,17 @@ std::shared_ptr<IImage> MapRendererObjects::getImage(IMapRendererContext & conte
 
 	if(animation->size(groupIndex) == 0)
 		return nullptr;
+	
+	auto attackerPos = context.attackedMonsterDirection(obj);
+	if(attackerPos != -1)
+	{
+		const auto * creature = dynamic_cast<const CArmedInstance *>(obj);
+		auto const & creatureType = LIBRARY->creh->objects[creature->appearance->subid];
+		auto dir = std::vector<int>({1, 2, 7, 8});
+		ImagePath imgPath = std::count(dir.begin(), dir.end(), attackerPos) ? creatureType->mapAttackFromRight : creatureType->mapAttackFromLeft;
+		if(!imgPath.empty())
+			return getImage(imgPath);
+	}
 
 	size_t frameIndex = context.objectImageIndex(obj->id, animation->size(groupIndex));
 
@@ -502,9 +527,9 @@ void MapRendererObjects::renderImage(IMapRendererContext & context, Canvas & tar
 
 void MapRendererObjects::renderObject(IMapRendererContext & context, Canvas & target, const int3 & coordinates, const CGObjectInstance * instance)
 {
-	renderImage(context, target, coordinates, instance, getImage(context, instance, getBaseAnimation(instance)));
-	renderImage(context, target, coordinates, instance, getImage(context, instance, getFlagAnimation(instance)));
-	renderImage(context, target, coordinates, instance, getImage(context, instance, getOverlayAnimation(instance)));
+	renderImage(context, target, coordinates, instance, getImageToRender(context, instance, getBaseAnimation(instance)));
+	renderImage(context, target, coordinates, instance, getImageToRender(context, instance, getFlagAnimation(instance)));
+	renderImage(context, target, coordinates, instance, getImageToRender(context, instance, getOverlayAnimation(instance)));
 }
 
 void MapRendererObjects::renderTile(IMapRendererContext & context, Canvas & target, const int3 & coordinates)
@@ -677,7 +702,7 @@ void MapRendererPath::renderTile(IMapRendererContext & context, Canvas & target,
 {
 	size_t imageID = selectImage(context, coordinates);
 
-	if (imageID < pathNodes->size())
+	if (imageID < pathNodes->size() && settings["adventure"]["showMovePath"].Bool())
 		target.draw(pathNodes->getImage(imageID), Point(0,0));
 }
 

+ 3 - 1
client/mapView/MapRenderer.h

@@ -73,14 +73,16 @@ public:
 class MapRendererObjects
 {
 	std::map<AnimationPath, std::shared_ptr<CAnimation>> animations;
+	mutable std::map<ImagePath, std::shared_ptr<IImage>> images;
 
 	std::shared_ptr<CAnimation> getBaseAnimation(const CGObjectInstance * obj);
 	std::shared_ptr<CAnimation> getFlagAnimation(const CGObjectInstance * obj);
 	std::shared_ptr<CAnimation> getOverlayAnimation(const CGObjectInstance * obj);
 
 	std::shared_ptr<CAnimation> getAnimation(const AnimationPath & filename, bool generateMovementGroups, bool enableOverlay);
+	std::shared_ptr<IImage> getImage(const ImagePath & filename) const;
 
-	std::shared_ptr<IImage> getImage(IMapRendererContext & context, const CGObjectInstance * obj, const std::shared_ptr<CAnimation> & animation) const;
+	std::shared_ptr<IImage> getImageToRender(IMapRendererContext & context, const CGObjectInstance * obj, const std::shared_ptr<CAnimation> & animation) const;
 
 	void renderImage(IMapRendererContext & context, Canvas & target, const int3 & coordinates, const CGObjectInstance * object, const std::shared_ptr<IImage> & image);
 	void renderObject(IMapRendererContext & context, Canvas & target, const int3 & coordinates, const CGObjectInstance * obj);

+ 14 - 0
client/mapView/MapRendererContext.cpp

@@ -25,6 +25,8 @@
 #include "../../lib/spells/CSpellHandler.h"
 #include "../../lib/mapping/CMap.h"
 #include "../../lib/pathfinder/CGPathNode.h"
+#include "../../lib/battle/CPlayerBattleCallback.h"
+#include "../../lib/battle/IBattleState.h"
 
 MapRendererBaseContext::MapRendererBaseContext(const MapRendererContextState & viewState)
 	: viewState(viewState)
@@ -85,6 +87,18 @@ bool MapRendererBaseContext::isActiveHero(const CGObjectInstance * obj) const
 	return false;
 }
 
+int MapRendererBaseContext::attackedMonsterDirection(const CGObjectInstance * wanderingMonster) const
+{
+	if(wanderingMonster->ID != Obj::MONSTER)
+		return -1;
+		
+	for(auto & battle : GAME->interface()->cb->getActiveBattles())
+		if(wanderingMonster->pos == battle.second->getBattle()->getLocation())
+			return battle.second->getBattle()->getSideHero(BattleSide::ATTACKER)->moveDir;
+
+	return -1;
+}
+
 bool MapRendererBaseContext::tileAnimated(const int3 & coordinates) const
 {
 	return false;

+ 1 - 0
client/mapView/MapRendererContext.h

@@ -36,6 +36,7 @@ public:
 	bool tileAnimated(const int3 & coordinates) const override;
 
 	bool isActiveHero(const CGObjectInstance* obj) const override;
+	int attackedMonsterDirection(const CGObjectInstance * wanderingMonster) const override;
 
 	const TerrainTile & getMapTile(const int3 & coordinates) const override;
 	const MapObjectsList & getObjects(const int3 & coordinates) const override;

+ 10 - 0
client/renderSDL/RenderHandler.cpp

@@ -354,6 +354,16 @@ std::shared_ptr<IImage> RenderHandler::loadImage(const AnimationPath & path, int
 
 std::shared_ptr<IImage> RenderHandler::loadImage(const ImagePath & path, EImageBlitMode mode)
 {
+	auto name = path.getOriginalName();
+	
+	std::vector<std::string> splitted;
+	boost::split(splitted, name, boost::is_any_of(":"));
+	if(splitted.size() == 3)
+	{
+		ImageLocator locator = getLocatorForAnimationFrame(AnimationPath::builtin(splitted[0]), std::stoi(splitted[2]), std::stoi(splitted[1]), 1, mode);
+		return loadImage(locator);
+	}
+
 	ImageLocator locator(path, mode);
 	return loadImage(locator);
 }

+ 30 - 10
client/windows/CCastleInterface.cpp

@@ -1194,7 +1194,10 @@ void CCastleBuildings::enterTownHall()
 void CCastleBuildings::openMagesGuild()
 {
 	auto mageGuildBackground = GAME->interface()->castleInt->town->getTown()->clientInfo.guildBackground;
-	ENGINE->windows().createAndPushWindow<CMageGuildScreen>(GAME->interface()->castleInt, mageGuildBackground);
+	assert(mageGuildBackground.size() == 1 || mageGuildBackground.size() == GAME->interface()->castleInt->town->getTown()->mageLevel);
+	auto selectedMageGuildBackground = mageGuildBackground.size() == 1 ? mageGuildBackground[0] : mageGuildBackground[town->mageGuildLevel() - 1];
+
+	ENGINE->windows().createAndPushWindow<CMageGuildScreen>(GAME->interface()->castleInt, selectedMageGuildBackground);
 }
 
 void CCastleBuildings::openTownHall()
@@ -1473,6 +1476,13 @@ CCastleInterface::~CCastleInterface()
 		GAME->interface()->castleInt = nullptr;
 }
 
+void CCastleInterface::updateArtifacts()
+{
+	// handle equipping / unequipping Legion pieces
+	for(auto creatureInfoBox : creainfo)
+		creatureInfoBox->update();
+}
+
 void CCastleInterface::updateGarrisons()
 {
 	garr->setArmy(town->getUpperArmy(), EGarrisonType::UPPER);
@@ -2114,7 +2124,14 @@ CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner, const ImagePath & i
 {
 	OBJECT_CONSTRUCTION;
 
-	window = std::make_shared<CPicture>(owner->town->getTown()->clientInfo.guildWindow, 332, 76);
+	auto guildWindow = owner->town->getTown()->clientInfo.guildWindow;
+	assert(guildWindow.size() == 1 || guildWindow.size() == GAME->interface()->castleInt->town->getTown()->mageLevel);
+	auto selectedGuildWindow = guildWindow.size() == 1 ? guildWindow[0] : guildWindow[owner->town->mageGuildLevel() - 1];
+
+	auto windowPosition = owner->town->getTown()->clientInfo.guildWindowPosition;
+	if(windowPosition == Point(0, 0)) // TODO: remove legacy for compatibility
+		windowPosition = Point(332, 76);
+	window = std::make_shared<CPicture>(selectedGuildWindow, windowPosition.x, windowPosition.y);
 
 	resdatabar = std::make_shared<CMinorResDataBar>();
 	resdatabar->moveBy(pos.topLeft(), true);
@@ -2135,20 +2152,23 @@ void CMageGuildScreen::updateSpells(ObjectInstanceID tID)
 		return;
 
 	OBJECT_CONSTRUCTION;
-	static const std::vector<std::vector<Point> > positions =
-	{
-		{Point(222,445), Point(312,445), Point(402,445), Point(520,445), Point(610,445), Point(700,445)},
-		{Point(48,53),   Point(48,147),  Point(48,241),  Point(48,335),  Point(48,429)},
-		{Point(570,82),  Point(672,82),  Point(570,157), Point(672,157)},
-		{Point(183,42),  Point(183,148), Point(183,253)},
-		{Point(491,325), Point(591,325)}
-	};
 
 	spells.clear();
 	emptyScrolls.clear();
 
 	const CGTownInstance * town = GAME->interface()->cb->getTown(townId);
 
+	auto positions = town->getTown()->clientInfo.guildSpellPositions;
+	if(!positions.size()) // TODO: remove legacy for compatibility
+		positions =
+		{
+			{Point(222,445), Point(312,445), Point(402,445), Point(520,445), Point(610,445), Point(700,445)},
+			{Point(48,53),   Point(48,147),  Point(48,241),  Point(48,335),  Point(48,429)},
+			{Point(570,82),  Point(672,82),  Point(570,157), Point(672,157)},
+			{Point(183,42),  Point(183,148), Point(183,253)},
+			{Point(491,325), Point(591,325)}
+		};
+
 	for(uint32_t i=0; i<town->getTown()->mageLevel; i++)
 	{
 		uint32_t spellCount = town->spellsAtLevel(i+1,false); //spell at level with -1 hmmm?

+ 2 - 1
client/windows/CCastleInterface.h

@@ -223,7 +223,7 @@ public:
 };
 
 /// Class which manages the castle window
-class CCastleInterface : public CStatusbarWindow, public IGarrisonHolder
+class CCastleInterface final : public CStatusbarWindow, public IGarrisonHolder, public IArtifactsHolder
 {
 	std::shared_ptr<CLabel> title;
 	std::shared_ptr<CLabel> income;
@@ -257,6 +257,7 @@ public:
 	CCastleInterface(const CGTownInstance * Town, const CGTownInstance * from = nullptr);
 	~CCastleInterface();
 
+	void updateArtifacts() override;
 	void updateGarrisons() override;
 	bool holdsGarrison(const CArmedInstance * army) override;
 

+ 6 - 3
client/windows/CCreatureWindow.cpp

@@ -848,7 +848,7 @@ void CStackWindow::init()
 
 void CStackWindow::initBonusesList()
 {
-	BonusList receivedBonuses = *info->stackNode->getBonuses(CSelector(Bonus::Permanent), Selector::all);
+	BonusList receivedBonuses = *info->stackNode->getBonuses(CSelector(Bonus::Permanent));
 	BonusList abilities = info->creature->getExportedBonusList();
 
 	// remove all bonuses that are not propagated away
@@ -900,9 +900,12 @@ void CStackWindow::initBonusesList()
 		BonusList groupIndepMin = group;
 		BonusList groupIndepMax = group;
 		BonusList groupNoMinMax = group;
+		BonusList groupBaseOnly = group;
+
 		groupIndepMin.remove_if([](const Bonus * b) { return b->valType != BonusValueType::INDEPENDENT_MIN; });
 		groupIndepMax.remove_if([](const Bonus * b) { return b->valType != BonusValueType::INDEPENDENT_MAX; });
 		groupNoMinMax.remove_if([](const Bonus * b) { return b->valType == BonusValueType::INDEPENDENT_MAX || b->valType == BonusValueType::INDEPENDENT_MIN; });
+		groupBaseOnly.remove_if([](const Bonus * b) { return b->valType != BonusValueType::ADDITIVE_VALUE || b->valType == BonusValueType::BASE_NUMBER; });
 
 		int valIndepMin = groupIndepMin.totalValue();
 		int valIndepMax = groupIndepMax.totalValue();
@@ -914,8 +917,8 @@ void CStackWindow::initBonusesList()
 			usedGroup = groupIndepMin; // bonus value was limited due to INDEPENDENT_MIN bonus -> show this bonus
 		else if (!groupIndepMax.empty() && valNoMinMax != valIndepMax)
 			usedGroup = groupIndepMax; // bonus value was limited due to INDEPENDENT_MAX bonus -> show this bonus
-		else
-			usedGroup = groupNoMinMax; // bonus value is not limited - show first non-independent bonus
+		else if (!groupBaseOnly.empty())
+			usedGroup = groupNoMinMax; // bonus value is not limited and has bonuses other than percent to base / percent to all - show first non-independent bonus
 
 		// It is possible that empty group was selected. For example, there is only INDEPENDENT effect with value of 0, which does not actually has any effect on this unit
 		// For example, orb of vulnerability on unit without any resistances

+ 12 - 12
client/windows/CExchangeWindow.cpp

@@ -62,8 +62,8 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 		return boost::str(fmt);
 	};
 
-	titles[0] = std::make_shared<CLabel>(147, 25, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, genTitle(heroInst[0]));
-	titles[1] = std::make_shared<CLabel>(653, 25, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, genTitle(heroInst[1]));
+	titles[0] = std::make_shared<CLabel>(147, qeLayout ? 21 : 25, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, genTitle(heroInst[0]));
+	titles[1] = std::make_shared<CLabel>(653, qeLayout ? 21 : 25, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, genTitle(heroInst[1]));
 
 	for(int g = 0; g < 4; ++g)
 	{
@@ -82,7 +82,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 
 
 		for(int m=0; m < std::min(static_cast<int>(hero->secSkills.size()), 8); ++m)
-			secSkills[leftRight].push_back(std::make_shared<CSecSkillPlace>(Point(32 + 36 * m + 454 * leftRight, qeLayout ? 83 : 88), CSecSkillPlace::ImageSize::SMALL,
+			secSkills[leftRight].push_back(std::make_shared<CSecSkillPlace>(Point(32 + 36 * m + 454 * leftRight, qeLayout ? 80 : 88), CSecSkillPlace::ImageSize::SMALL,
 				hero->secSkills[m].first, hero->secSkills[m].second));
 
 		specImages[leftRight] = std::make_shared<CAnimImage>(AnimationPath::builtin("UN32"), hero->getHeroType()->imageIndex, 0, 67 + 490 * leftRight, qeLayout ? 41 : 45);
@@ -127,7 +127,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 	{
 		const CGHeroInstance * hero = heroInst.at(b);
 
-		heroAreas[b] = std::make_shared<CHeroArea>(257 + 228 * b, 13, hero);
+		heroAreas[b] = std::make_shared<CHeroArea>(257 + 228 * b + (qeLayout ? 1 : 0), qeLayout ? 10 : 13, hero);
 		heroAreas[b]->addClickCallback([this, hero]() -> void
 									   {
 										   if(getPickedArtifact() == nullptr)
@@ -163,7 +163,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 	if(queryID.getNum() > 0)
 		quit->addCallback([=](){ GAME->interface()->cb->selectionMade(0, queryID); });
 
-	questlogButton[0] = std::make_shared<CButton>(Point( 10, qeLayout ? 39 : 44), AnimationPath::builtin("hsbtns4.def"), CButton::tooltip(LIBRARY->generaltexth->heroscrn[0]), std::bind(&CExchangeWindow::questLogShortcut, this));
+	questlogButton[0] = std::make_shared<CButton>(Point( qeLayout ? 8 : 10, qeLayout ? 39 : 44), AnimationPath::builtin("hsbtns4.def"), CButton::tooltip(LIBRARY->generaltexth->heroscrn[0]), std::bind(&CExchangeWindow::questLogShortcut, this));
 	questlogButton[1] = std::make_shared<CButton>(Point(740, qeLayout ? 39 : 44), AnimationPath::builtin("hsbtns4.def"), CButton::tooltip(LIBRARY->generaltexth->heroscrn[0]), std::bind(&CExchangeWindow::questLogShortcut, this));
 
 	Rect barRect(5, 578, 725, 18);
@@ -171,7 +171,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 
 	//garrison interface
 
-	garr = std::make_shared<CGarrisonInt>(Point(69, qeLayout ? 122 : 131), 4, Point(418,0), heroInst[0], heroInst[1], true, true);
+	garr = std::make_shared<CGarrisonInt>(Point(69, qeLayout ? 120 : 131), 4, Point(418,0), heroInst[0], heroInst[1], true, true);
 	auto splitButtonCallback = [&](){ garr->splitClick(); };
 	garr->addSplitBtn(std::make_shared<CButton>( Point( 10, qeLayout ? 122 : 132), AnimationPath::builtin("TSBTNS.DEF"), CButton::tooltip(LIBRARY->generaltexth->tcommands[3]), splitButtonCallback, EShortcut::HERO_ARMY_SPLIT));
 	garr->addSplitBtn(std::make_shared<CButton>( Point(744, qeLayout ? 122 : 132), AnimationPath::builtin("TSBTNS.DEF"), CButton::tooltip(LIBRARY->generaltexth->tcommands[3]), splitButtonCallback, EShortcut::HERO_ARMY_SPLIT));
@@ -245,7 +245,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 		{
 			moveUnitFromRightToLeftButtons.push_back(
 				std::make_shared<CButton>(
-					Point(484 + 35 * i, 154),
+					Point(483 + 36 * i, 155),
 					AnimationPath::builtin("quick-exchange/unitLeft.DEF"),
 					CButton::tooltip(LIBRARY->generaltexth->translate("vcmi.quickExchange.moveUnit")),
 					[this, i]() { creatureArrowButtonCallback(false, SlotID(i)); }));
@@ -253,7 +253,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 
 			moveUnitFromLeftToRightButtons.push_back(
 				std::make_shared<CButton>(
-					Point(66 + 35 * i, 154),
+					Point(65 + 36 * i, 155),
 					AnimationPath::builtin("quick-exchange/unitRight.DEF"),
 					CButton::tooltip(LIBRARY->generaltexth->translate("vcmi.quickExchange.moveUnit")),
 					[this, i]() { creatureArrowButtonCallback(true, SlotID(i)); }));
@@ -261,7 +261,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 		}
 	}
 
-	CExchangeWindow::update();
+	CExchangeWindow::updateArtifacts();
 }
 
 void CExchangeWindow::creatureArrowButtonCallback(bool leftToRight, SlotID slotId)
@@ -361,7 +361,7 @@ void CExchangeWindow::updateGarrisons()
 {
 	garr->recreateSlots();
 
-	update();
+	updateArtifacts();
 }
 
 bool CExchangeWindow::holdsGarrison(const CArmedInstance * army)
@@ -375,13 +375,13 @@ void CExchangeWindow::questLogShortcut()
 	GAME->interface()->showQuestLog();
 }
 
-void CExchangeWindow::update()
+void CExchangeWindow::updateArtifacts()
 {
 	const bool qeLayout = isQuickExchangeLayoutAvailable();
 
 	OBJECT_CONSTRUCTION;
 
-	CWindowWithArtifacts::update();
+	CWindowWithArtifacts::updateArtifacts();
 
 	for(size_t leftRight : {0, 1})
 	{

+ 1 - 1
client/windows/CExchangeWindow.h

@@ -75,7 +75,7 @@ public:
 
 	void keyPressed(EShortcut key) override;
 
-	void update() override;
+	void updateArtifacts() override;
 
 	// IGarrisonHolder impl
 	void updateGarrisons() override;

+ 5 - 5
client/windows/CHeroWindow.cpp

@@ -46,7 +46,7 @@ void CHeroSwitcher::clickPressed(const Point & cursorPosition)
 	//TODO: do not recreate window
 	if (false)
 	{
-		owner->update();
+		owner->updateArtifacts();
 	}
 	else
 	{
@@ -153,7 +153,7 @@ CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
 	{
 		auto divisionRoundUp = [](int x, int y){ return (x + (y - 1)) / y; };
 		int lines = divisionRoundUp(hero->secSkills.size(), 2);
-		secSkillSlider = std::make_shared<CSlider>(Point(284, 276), 189, [this](int val){ CHeroWindow::update(); }, 4, lines, 0, Orientation::VERTICAL, CSlider::BROWN);
+		secSkillSlider = std::make_shared<CSlider>(Point(284, 276), 189, [this](int val){ CHeroWindow::updateArtifacts(); }, 4, lines, 0, Orientation::VERTICAL, CSlider::BROWN);
 		secSkillSlider->setPanningStep(48);
 		secSkillSlider->setScrollBounds(Rect(-266, 0, secSkillSlider->pos.x - pos.x + secSkillSlider->pos.w, secSkillSlider->pos.h));
 	}
@@ -182,14 +182,14 @@ CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
 	labels.push_back(std::make_shared<CLabel>(69, 232, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, LIBRARY->generaltexth->jktexts[6]));
 	labels.push_back(std::make_shared<CLabel>(213, 232, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, LIBRARY->generaltexth->jktexts[7]));
 
-	CHeroWindow::update();
+	CHeroWindow::updateArtifacts();
 }
 
-void CHeroWindow::update()
+void CHeroWindow::updateArtifacts()
 {
 	OBJECT_CONSTRUCTION;
 
-	CWindowWithArtifacts::update();
+	CWindowWithArtifacts::updateArtifacts();
 	auto & heroscrn = LIBRARY->generaltexth->heroscrn;
 	assert(curHero);
 

+ 1 - 1
client/windows/CHeroWindow.h

@@ -101,7 +101,7 @@ public:
 
 	CHeroWindow(const CGHeroInstance * hero);
 
-	void update() override;
+	void updateArtifacts() override;
 
 	void dismissCurrent(); //dismissed currently displayed hero (curHero)
 	void commanderWindow();

+ 5 - 0
client/windows/CKingdomInterface.cpp

@@ -27,6 +27,7 @@
 #include "../widgets/MiscWidgets.h"
 #include "../widgets/Buttons.h"
 #include "../widgets/ObjectLists.h"
+#include "../windows/CHeroWindow.h"
 #include "../windows/CMarketWindow.h"
 
 #include "../../lib/CConfigHandler.h"
@@ -101,6 +102,7 @@ void InfoBox::showPopupWindow(const Point & cursorPosition)
 	std::shared_ptr<CComponent> comp;
 	std::string text;
 	data->prepareMessage(text, comp);
+
 	if (comp)
 		CRClickPopup::createAndPush(text, CInfoWindow::TCompsInfo(1, comp));
 	else if (!text.empty())
@@ -115,6 +117,8 @@ void InfoBox::clickPressed(const Point & cursorPosition)
 
 	if(comp)
 		GAME->interface()->showInfoDialog(text, CInfoWindow::TCompsInfo(1, comp));
+	else if (!text.empty())
+		GAME->interface()->showInfoDialog(text);
 }
 
 IInfoBoxData::IInfoBoxData(InfoType Type)
@@ -974,6 +978,7 @@ CHeroItem::CHeroItem(const CGHeroInstance * Hero)
 
 	portrait = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsLarge"), hero->getIconIndex(), 0, 5, 6);
 	heroArea = std::make_shared<CHeroArea>(5, 6, hero);
+	heroArea->addRClickCallback([this](){ ENGINE->windows().createAndPushWindow<CRClickPopupInt>(std::make_shared<CHeroWindow>(hero)); });
 
 	name = std::make_shared<CLabel>(73, 7, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, hero->getNameTranslated());
 	artsText = std::make_shared<CLabel>(320, 55, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, LIBRARY->generaltexth->overview[2]);

+ 1 - 1
client/windows/CMarketWindow.cpp

@@ -85,7 +85,7 @@ void CMarketWindow::updateExperience()
 
 void CMarketWindow::update()
 {
-	CWindowWithArtifacts::update();
+	CWindowWithArtifacts::updateArtifacts();
 	assert(marketWidget);
 	marketWidget->update();
 }

+ 2 - 1
client/windows/CMarketWindow.h

@@ -20,7 +20,8 @@ public:
 	void updateArtifacts() override;
 	void updateGarrisons() override;
 	void updateExperience() override;
-	void update() override;
+
+	void update();
 	void close() override;
 	bool holdsGarrison(const CArmedInstance * army) override;
 

+ 1 - 1
client/windows/CWindowWithArtifacts.cpp

@@ -164,7 +164,7 @@ void CWindowWithArtifacts::enableKeyboardShortcuts() const
 		artSet->enableKeyboardShortcuts();
 }
 
-void CWindowWithArtifacts::update()
+void CWindowWithArtifacts::updateArtifacts()
 {
 	for(const auto & artSet : artSets)
 	{

+ 2 - 2
client/windows/CWindowWithArtifacts.h

@@ -16,7 +16,7 @@
 #include "../widgets/CArtifactsOfHeroBackpack.h"
 #include "CWindowObject.h"
 
-class CWindowWithArtifacts : virtual public CWindowObject
+class CWindowWithArtifacts : virtual public CWindowObject, public IArtifactsHolder
 {
 public:
 	using CArtifactsOfHeroPtr = std::shared_ptr<CArtifactsOfHeroBase>;
@@ -36,7 +36,7 @@ public:
 	void deactivate() override;
 	void enableKeyboardShortcuts() const;
 
-	virtual void update();
+	void updateArtifacts() override;
 
 protected:
 	void markPossibleSlots() const;

+ 13 - 0
client/windows/settings/AdventureOptionsTab.cpp

@@ -12,6 +12,9 @@
 #include "AdventureOptionsTab.h"
 
 #include "../../GameEngine.h"
+#include "../../GameInstance.h"
+#include "../../CPlayerInterface.h"
+#include "../../PlayerLocalState.h"
 #include "../../eventsSDL/InputHandler.h"
 #include "../../gui/WindowHandler.h"
 #include "../../widgets/Buttons.h"
@@ -153,6 +156,13 @@ AdventureOptionsTab::AdventureOptionsTab()
 		setBoolSetting("adventure", "minimapShowHeroes", value);
 		ENGINE->windows().totalRedraw();
 	});
+	addCallback("showMovePathChanged", [](bool value)
+	{
+		setBoolSetting("adventure", "showMovePath", value);
+		if (GAME->interface()->makingTurn && GAME->interface()->localState->getCurrentHero())
+			GAME->interface()->localState->erasePath(GAME->interface()->localState->getCurrentHero());
+		ENGINE->windows().totalRedraw();
+	});
 	build(config);
 
 	std::shared_ptr<CToggleGroup> playerHeroSpeedToggle = widget<CToggleGroup>("heroMovementSpeedPicker");
@@ -208,4 +218,7 @@ AdventureOptionsTab::AdventureOptionsTab()
 
 	std::shared_ptr<CToggleButton> minimapShowHeroesCheckbox = widget<CToggleButton>("minimapShowHeroesCheckbox");
 	minimapShowHeroesCheckbox->setSelected(settings["adventure"]["minimapShowHeroes"].Bool());
+
+	std::shared_ptr<CToggleButton> showMovePathCheckbox = widget<CToggleButton>("showMovePathCheckbox");
+	showMovePathCheckbox->setSelected(settings["adventure"]["showMovePath"].Bool());
 }

+ 6 - 6
config/artifacts.json

@@ -1733,7 +1733,7 @@
 				"type" : "CREATURE_GROWTH",
 				"subtype" : "creatureLevel2",
 				"val" : 5,
-				"propagator": "VISITED_TOWN_AND_VISITOR"
+				"propagator": "TOWN_AND_VISITOR"
 			}
 		}
 	},
@@ -1746,7 +1746,7 @@
 				"type" : "CREATURE_GROWTH",
 				"subtype" : "creatureLevel3",
 				"val" : 4,
-				"propagator": "VISITED_TOWN_AND_VISITOR"
+				"propagator": "TOWN_AND_VISITOR"
 			}
 		}
 	},
@@ -1759,7 +1759,7 @@
 				"type" : "CREATURE_GROWTH",
 				"subtype" : "creatureLevel4",
 				"val" : 3,
-				"propagator": "VISITED_TOWN_AND_VISITOR"
+				"propagator": "TOWN_AND_VISITOR"
 			}
 		}
 	},
@@ -1772,7 +1772,7 @@
 				"type" : "CREATURE_GROWTH",
 				"subtype" : "creatureLevel5",
 				"val" : 2,
-				"propagator": "VISITED_TOWN_AND_VISITOR"
+				"propagator": "TOWN_AND_VISITOR"
 			}
 		}
 	},
@@ -1785,7 +1785,7 @@
 				"type" : "CREATURE_GROWTH",
 				"subtype" : "creatureLevel6",
 				"val" : 1,
-				"propagator": "VISITED_TOWN_AND_VISITOR"
+				"propagator": "TOWN_AND_VISITOR"
 			}
 		}
 	},
@@ -2094,7 +2094,7 @@
 			"growth" : {
 				"type" : "CREATURE_GROWTH_PERCENT",
 				"val" : 50,
-				"propagator": "PLAYER_PROPAGATOR"
+				"propagator": "PLAYER"
 			}
 		}
 	},

+ 4 - 4
config/buildingsLibrary.json

@@ -12,7 +12,7 @@
 				"val": 1
 			},
 			{
-				"propagator": "PLAYER_PROPAGATOR",
+				"propagator": "PLAYER",
 				"type": "THIEVES_GUILD_ACCESS",
 				"val": 1
 			}
@@ -130,7 +130,7 @@
 	"lighthouse" : {
 		"bonuses": [
 			{
-				"propagator": "PLAYER_PROPAGATOR",
+				"propagator": "PLAYER",
 				"type": "MOVEMENT",
 				"subtype": "heroMovementSea",
 				"val": 500
@@ -257,10 +257,10 @@
 	"thievesGuild" : {
 		"bonuses": [
 			{
-				"propagator": "PLAYER_PROPAGATOR",
+				"propagator": "PLAYER",
 				"type": "THIEVES_GUILD_ACCESS",
 				"val": 2
 			}
 		]
 	}
-}
+}

+ 30 - 2
config/creatures/castle.json

@@ -14,6 +14,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:0",
+			"mapAttackFromLeft": "AvWattak.def:0:1",
 			"animation": "CPKMAN.DEF"
 		},
 		"sound" :
@@ -39,6 +41,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:2",
+			"mapAttackFromLeft": "AvWattak.def:0:3",
 			"animation": "CHALBD.DEF"
 		},
 		"sound" :
@@ -66,6 +70,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:4",
+			"mapAttackFromLeft": "AvWattak.def:0:5",
 			"animation": "CLCBOW.DEF",
 			"missile" :
 			{
@@ -103,6 +109,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:6",
+			"mapAttackFromLeft": "AvWattak.def:0:7",
 			"animation": "CHCBOW.DEF",
 			"missile" :
 			{
@@ -140,6 +148,8 @@
 		"hasDoubleWeek": true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:8",
+			"mapAttackFromLeft": "AvWattak.def:0:9",
 			"animation": "CGRIFF.DEF"
 		},
 		"sound" :
@@ -169,6 +179,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:10",
+			"mapAttackFromLeft": "AvWattak.def:0:11",
 			"animation": "CRGRIF.DEF"
 		},
 		"sound" :
@@ -188,6 +200,8 @@
 		"upgrades": ["crusader"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:12",
+			"mapAttackFromLeft": "AvWattak.def:0:13",
 			"animation": "CSWORD.DEF"
 		},
 		"sound" :
@@ -214,6 +228,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:14",
+			"mapAttackFromLeft": "AvWattak.def:0:15",
 			"animation": "CCRUSD.DEF"
 		},
 		"sound" :
@@ -240,6 +256,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:16",
+			"mapAttackFromLeft": "AvWattak.def:0:17",
 			"animation": "CMONKK.DEF",
 			"missile" :
 			{
@@ -273,6 +291,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:18",
+			"mapAttackFromLeft": "AvWattak.def:0:19",
 			"animation": "CZEALT.DEF",
 			"missile" :
 			{
@@ -306,6 +326,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:20",
+			"mapAttackFromLeft": "AvWattak.def:0:21",
 			"animation": "CCAVLR.DEF"
 		},
 		"sound" :
@@ -333,6 +355,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:22",
+			"mapAttackFromLeft": "AvWattak.def:0:23",
 			"animation": "CCHAMP.DEF"
 		},
 		"sound" :
@@ -359,7 +383,7 @@
 			{
 				"type" : "MORALE",
 				"val" : 1,
-				"propagator" : "HERO",
+				"propagator" : "ARMY",
 				"description" : "PLACEHOLDER",
 				"stacking" : "Angels"
 			},
@@ -384,6 +408,8 @@
 		"upgrades": ["archangel"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:24",
+			"mapAttackFromLeft": "AvWattak.def:0:25",
 			"animation": "CANGEL.DEF"
 		},
 		"sound" :
@@ -427,7 +453,7 @@
 			"raisesMorale" : {
 				"type" : "MORALE",
 				"val" : 1,
-				"propagator" : "HERO",
+				"propagator" : "ARMY",
 				"description" : "@creatures.core.angel.bonus.raisesMorale",
 				"stacking" : "Angels"
 			},
@@ -451,6 +477,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:26",
+			"mapAttackFromLeft": "AvWattak.def:0:27",
 			"animation": "CRANGL.DEF"
 		},
 		"sound" :

+ 28 - 0
config/creatures/conflux.json

@@ -15,6 +15,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:236",
+			"mapAttackFromLeft": "AvWattak.def:0:237",
 			"animation": "CPIXIE.DEF"
 		},
 		"sound" :
@@ -44,6 +46,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:238",
+			"mapAttackFromLeft": "AvWattak.def:0:239",
 			"animation": "CSPRITE.DEF"
 		},
 		"sound" :
@@ -111,6 +115,8 @@
 		"upgrades": ["stormElemental"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:224",
+			"mapAttackFromLeft": "AvWattak.def:0:225",
 			"animation": "CAELEM.DEF"
 		},
 		"sound" :
@@ -196,6 +202,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:254",
+			"mapAttackFromLeft": "AvWattak.def:0:255",
 			"animation": "CSTORM.DEF",
 			"missile" :
 			{
@@ -285,6 +293,8 @@
 		"upgrades": ["iceElemental"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:230",
+			"mapAttackFromLeft": "AvWattak.def:0:231",
 			"animation": "CWELEM.DEF"
 		},
 		"sound" :
@@ -388,6 +398,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:246",
+			"mapAttackFromLeft": "AvWattak.def:0:247",
 			"animation": "CICEE.DEF",
 			"missile" :
 			{
@@ -452,6 +464,8 @@
 		"upgrades": ["energyElemental"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:228",
+			"mapAttackFromLeft": "AvWattak.def:0:229",
 			"animation": "CFELEM.DEF"
 		},
 		"sound" :
@@ -530,6 +544,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:258",
+			"mapAttackFromLeft": "AvWattak.def:0:259",
 			"animation": "CNRG.DEF"
 		},
 		"sound" :
@@ -593,6 +609,8 @@
 		"upgrades": ["magmaElemental"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:226",
+			"mapAttackFromLeft": "AvWattak.def:0:227",
 			"animation": "CEELEM.DEF"
 		},
 		"sound" :
@@ -671,6 +689,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:250",
+			"mapAttackFromLeft": "AvWattak.def:0:251",
 			"animation": "CSTONE.DEF"
 		},
 		"sound" :
@@ -710,6 +730,8 @@
 		"upgrades": ["magicElemental"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:240",
+			"mapAttackFromLeft": "AvWattak.def:0:241",
 			"animation": "CPSYEL.DEF"
 		},
 		"sound" :
@@ -749,6 +771,8 @@
 		"doubleWide" : false,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:242",
+			"mapAttackFromLeft": "AvWattak.def:0:243",
 			"animation": "CMAGEL.DEF"
 		},
 		"sound" :
@@ -790,6 +814,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:260",
+			"mapAttackFromLeft": "AvWattak.def:0:261",
 			"animation": "CFBIRD.DEF"
 		},
 		"sound" :
@@ -840,6 +866,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:262",
+			"mapAttackFromLeft": "AvWattak.def:0:263",
 			"animation": "CPHX.DEF"
 		},
 		"sound" :

+ 28 - 0
config/creatures/dungeon.json

@@ -21,6 +21,8 @@
 		"hasDoubleWeek": true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:140",
+			"mapAttackFromLeft": "AvWattak.def:0:141",
 			"animation": "CTROGL.DEF"
 		},
 		"sound" :
@@ -52,6 +54,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:142",
+			"mapAttackFromLeft": "AvWattak.def:0:143",
 			"animation": "CITROG.DEF"
 		},
 		"sound" :
@@ -83,6 +87,8 @@
 		"hasDoubleWeek": true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:144",
+			"mapAttackFromLeft": "AvWattak.def:0:145",
 			"animation": "CHARPY.DEF"
 		},
 		"sound" :
@@ -116,6 +122,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:146",
+			"mapAttackFromLeft": "AvWattak.def:0:147",
 			"animation": "CHARPH.DEF"
 		},
 		"sound" :
@@ -148,6 +156,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:148",
+			"mapAttackFromLeft": "AvWattak.def:0:149",
 			"animation": "CBEHOL.DEF",
 			"missile" :
 			{
@@ -190,6 +200,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:150",
+			"mapAttackFromLeft": "AvWattak.def:0:151",
 			"animation": "CEVEYE.DEF",
 			"missile" :
 			{
@@ -241,6 +253,8 @@
 		"upgrades": ["medusaQueen"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:152",
+			"mapAttackFromLeft": "AvWattak.def:0:153",
 			"animation": "CMEDUS.DEF",
 			"missile" :
 			{
@@ -284,6 +298,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:154",
+			"mapAttackFromLeft": "AvWattak.def:0:155",
 			"animation": "CMEDUQ.DEF",
 			"missile" :
 			{
@@ -317,6 +333,8 @@
 		"upgrades": ["minotaurKing"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:156",
+			"mapAttackFromLeft": "AvWattak.def:0:157",
 			"animation": "CMINOT.DEF"
 		},
 		"sound" :
@@ -344,6 +362,8 @@
 		 },
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:158",
+			"mapAttackFromLeft": "AvWattak.def:0:159",
 			"animation": "CMINOK.DEF"
 		},
 		"sound" :
@@ -372,6 +392,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:160",
+			"mapAttackFromLeft": "AvWattak.def:0:161",
 			"animation": "CMCORE.DEF"
 		},
 		"sound" :
@@ -405,6 +427,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:162",
+			"mapAttackFromLeft": "AvWattak.def:0:163",
 			"animation": "CCMCOR.DEF"
 		},
 		"sound" :
@@ -456,6 +480,8 @@
 		"upgrades": ["blackDragon"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:164",
+			"mapAttackFromLeft": "AvWattak.def:0:165",
 			"animation": "CRDRGN.DEF"
 		},
 		"sound" :
@@ -511,6 +537,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:166",
+			"mapAttackFromLeft": "AvWattak.def:0:167",
 			"animation": "CBDRGN.DEF"
 		},
 		"sound" :

+ 28 - 0
config/creatures/fortress.json

@@ -7,6 +7,8 @@
 		"upgrades": ["gnollMarauder"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:196",
+			"mapAttackFromLeft": "AvWattak.def:0:197",
 			"animation": "CGNOLL.DEF"
 		},
 		"sound" :
@@ -25,6 +27,8 @@
 		"faction": "fortress",
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:198",
+			"mapAttackFromLeft": "AvWattak.def:0:199",
 			"animation": "CGNOLM.DEF"
 		},
 		"sound" :
@@ -54,6 +58,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:200",
+			"mapAttackFromLeft": "AvWattak.def:0:201",
 			"animation": "CPLIZA.DEF",
 			"missile" :
 			{
@@ -85,6 +91,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:202",
+			"mapAttackFromLeft": "AvWattak.def:0:203",
 			"animation": "CALIZA.DEF",
 			"missile" :
 			{
@@ -124,6 +132,8 @@
 		"hasDoubleWeek": true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:208",
+			"mapAttackFromLeft": "AvWattak.def:0:209",
 			"animation": "CDRFLY.DEF"
 		},
 		"sound" :
@@ -161,6 +171,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:210",
+			"mapAttackFromLeft": "AvWattak.def:0:211",
 			"animation": "CDRFIR.DEF"
 		},
 		"sound" :
@@ -191,6 +203,8 @@
 		"upgrades": ["greaterBasilisk"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:212",
+			"mapAttackFromLeft": "AvWattak.def:0:213",
 			"animation": "CBASIL.DEF"
 		},
 		"sound" :
@@ -219,6 +233,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:214",
+			"mapAttackFromLeft": "AvWattak.def:0:215",
 			"animation": "CGBASI.DEF"
 		},
 		"sound" :
@@ -239,6 +255,8 @@
 		"doubleWide" : true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:204",
+			"mapAttackFromLeft": "AvWattak.def:0:205",
 			"animation": "CCGORG.DEF"
 		},
 		"sound" :
@@ -267,6 +285,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:206",
+			"mapAttackFromLeft": "AvWattak.def:0:207",
 			"animation": "CBGOG.DEF"
 		},
 		"sound" :
@@ -294,6 +314,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:216",
+			"mapAttackFromLeft": "AvWattak.def:0:217",
 			"animation": "CWYVER.DEF"
 		},
 		"sound" :
@@ -326,6 +348,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:218",
+			"mapAttackFromLeft": "AvWattak.def:0:219",
 			"animation": "CWYVMN.DEF"
 		},
 		"sound" :
@@ -367,6 +391,8 @@
 		"upgrades": ["chaosHydra"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:220",
+			"mapAttackFromLeft": "AvWattak.def:0:221",
 			"animation": "CHYDRA.DEF"
 		},
 		"sound" :
@@ -407,6 +433,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:222",
+			"mapAttackFromLeft": "AvWattak.def:0:223",
 			"animation": "CCHYDR.DEF"
 		},
 		"sound" :

+ 28 - 0
config/creatures/inferno.json

@@ -7,6 +7,8 @@
 		"upgrades": ["familiar"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:84",
+			"mapAttackFromLeft": "AvWattak.def:0:85",
 			"animation": "CIMP.DEF"
 		},
 		"sound" :
@@ -33,6 +35,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:86",
+			"mapAttackFromLeft": "AvWattak.def:0:87",
 			"animation": "CFAMIL.DEF"
 		},
 		"sound" :
@@ -61,6 +65,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:88",
+			"mapAttackFromLeft": "AvWattak.def:0:89",
 			"animation": "CGOG.DEF",
 			"missile" :
 			{
@@ -97,6 +103,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:90",
+			"mapAttackFromLeft": "AvWattak.def:0:91",
 			"animation": "CMAGOG.DEF",
 			"missile" :
 			{
@@ -122,6 +130,8 @@
 		"doubleWide" : true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:92",
+			"mapAttackFromLeft": "AvWattak.def:0:93",
 			"animation": "CHHOUN.DEF"
 		},
 		"sound" :
@@ -152,6 +162,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:94",
+			"mapAttackFromLeft": "AvWattak.def:0:95",
 			"animation": "CCERBU.DEF"
 		},
 		"sound" :
@@ -171,6 +183,8 @@
 		"upgrades": ["hornedDemon"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:96",
+			"mapAttackFromLeft": "AvWattak.def:0:97",
 			"animation": "COHDEM.DEF"
 		},
 		"sound" :
@@ -189,6 +203,8 @@
 		"faction": "inferno",
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:98",
+			"mapAttackFromLeft": "AvWattak.def:0:99",
 			"animation": "CTHDEM.DEF"
 		},
 		"sound" :
@@ -208,6 +224,8 @@
 		"upgrades": ["pitLord"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:100",
+			"mapAttackFromLeft": "AvWattak.def:0:101",
 			"animation": "CPFIEN.DEF"
 		},
 		"sound" :
@@ -246,6 +264,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:102",
+			"mapAttackFromLeft": "AvWattak.def:0:103",
 			"animation": "CPFOE.DEF"
 		},
 		"sound" :
@@ -289,6 +309,8 @@
 		"upgrades": ["efreetSultan"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:104",
+			"mapAttackFromLeft": "AvWattak.def:0:105",
 			"animation": "CEFREE.DEF"
 		},
 		"sound" :
@@ -336,6 +358,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:106",
+			"mapAttackFromLeft": "AvWattak.def:0:107",
 			"animation": "CEFRES.DEF"
 		},
 		"sound" :
@@ -396,6 +420,8 @@
 		"upgrades": ["archDevil"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:108",
+			"mapAttackFromLeft": "AvWattak.def:0:109",
 			"animation": "CDEVIL.DEF"
 		},
 		"sound" :
@@ -456,6 +482,8 @@
 		"graphics" :
 		{
 			"missile" : null,
+			"mapAttackFromRight": "AvWattak.def:0:110",
+			"mapAttackFromLeft": "AvWattak.def:0:111",
 			"animation": "CADEVL.DEF"
 		},
 		"sound" :

+ 28 - 0
config/creatures/necropolis.json

@@ -14,6 +14,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:112",
+			"mapAttackFromLeft": "AvWattak.def:0:113",
 			"animation": "CSKELE.DEF"
 		},
 		"sound" :
@@ -39,6 +41,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:114",
+			"mapAttackFromLeft": "AvWattak.def:0:115",
 			"animation": "CWSKEL.DEF"
 		},
 		"sound" :
@@ -66,6 +70,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:116",
+			"mapAttackFromLeft": "AvWattak.def:0:117",
 			"animation": "CZOMBI.DEF"
 		},
 		"sound" :
@@ -84,6 +90,8 @@
 		"faction": "necropolis",
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:118",
+			"mapAttackFromLeft": "AvWattak.def:0:119",
 			"animation": "CZOMLO.DEF"
 		},
 		"sound" :
@@ -133,6 +141,8 @@
 		"hasDoubleWeek": true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:120",
+			"mapAttackFromLeft": "AvWattak.def:0:121",
 			"animation": "CWIGHT.DEF"
 		},
 		"sound" :
@@ -172,6 +182,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:122",
+			"mapAttackFromLeft": "AvWattak.def:0:123",
 			"animation": "CWRAIT.DEF"
 		},
 		"sound" :
@@ -206,6 +218,8 @@
 		"upgrades": ["vampireLord"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:124",
+			"mapAttackFromLeft": "AvWattak.def:0:125",
 			"animation": "CVAMP.DEF"
 		},
 		"sound" :
@@ -246,6 +260,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:126",
+			"mapAttackFromLeft": "AvWattak.def:0:127",
 			"animation": "CNOSFE.DEF"
 		},
 		"sound" :
@@ -285,6 +301,8 @@
 		"upgrades": ["powerLich"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:128",
+			"mapAttackFromLeft": "AvWattak.def:0:129",
 			"animation": "CLICH.DEF",
 			"missile" :
 			{
@@ -325,6 +343,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:130",
+			"mapAttackFromLeft": "AvWattak.def:0:131",
 			"animation": "CPLICH.DEF",
 			"missile" :
 			{
@@ -363,6 +383,8 @@
 		"upgrades": ["dreadKnight"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:132",
+			"mapAttackFromLeft": "AvWattak.def:0:133",
 			"animation": "CBKNIG.DEF"
 		},
 		"sound" :
@@ -400,6 +422,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:134",
+			"mapAttackFromLeft": "AvWattak.def:0:135",
 			"animation": "CBLORD.DEF"
 		},
 		"sound" :
@@ -450,6 +474,8 @@
 		"upgrades": ["ghostDragon"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:136",
+			"mapAttackFromLeft": "AvWattak.def:0:137",
 			"animation": "CNDRGN.DEF"
 		},
 		"sound" :
@@ -505,6 +531,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:138",
+			"mapAttackFromLeft": "AvWattak.def:0:139",
 			"animation": "CHDRGN.DEF"
 		},
 		"sound" :

+ 30 - 0
config/creatures/neutral.json

@@ -20,6 +20,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:232",
+			"mapAttackFromLeft": "AvWattak.def:0:233",
 			"animation": "CGGOLE.DEF"
 		},
 		"sound" :
@@ -51,6 +53,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:234",
+			"mapAttackFromLeft": "AvWattak.def:0:235",
 			"animation": "CDGOLE.DEF"
 		},
 		"sound" :
@@ -124,6 +128,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:264",
+			"mapAttackFromLeft": "AvWattak.def:0:265",
 			"animation": "CADRGN.DEF"
 		},
 		"sound" :
@@ -170,6 +176,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:266",
+			"mapAttackFromLeft": "AvWattak.def:0:267",
 			"animation": "CCDRGN.DEF"
 		},
 		"sound" :
@@ -282,6 +290,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:268",
+			"mapAttackFromLeft": "AvWattak.def:0:269",
 			"animation": "CFDRGN.DEF"
 		},
 		"sound" :
@@ -340,6 +350,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:270",
+			"mapAttackFromLeft": "AvWattak.def:0:271",
 			"animation": "CRSDGN.DEF"
 		},
 		"sound" :
@@ -423,6 +435,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:272",
+			"mapAttackFromLeft": "AvWattak.def:0:273",
 			"animation": "Cench.DEF",
 			"missile" :
 			{
@@ -464,6 +478,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:274",
+			"mapAttackFromLeft": "AvWattak.def:0:275",
 			"animation": "CSHARP.DEF",
 			"missile" :
 			{
@@ -501,6 +517,8 @@
 		 },
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:276",
+			"mapAttackFromLeft": "AvWattak.def:0:277",
 			"animation": "CHALF.DEF",
 			"missile" :
 			{
@@ -524,6 +542,8 @@
 		"faction": "neutral",
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:278",
+			"mapAttackFromLeft": "AvWattak.def:0:279",
 			"animation": "CPEAS.DEF"
 		},
 		"sound" :
@@ -543,6 +563,8 @@
 		"doubleWide" : true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:280",
+			"mapAttackFromLeft": "AvWattak.def:0:281",
 			"animation": "CBOAR.DEF"
 		},
 		"sound" :
@@ -574,6 +596,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:282",
+			"mapAttackFromLeft": "AvWattak.def:0:283",
 			"animation": "CMUMMY.DEF"
 		},
 		"sound" :
@@ -602,6 +626,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:284",
+			"mapAttackFromLeft": "AvWattak.def:0:285",
 			"animation": "CNOMAD.DEF"
 		},
 		"sound" :
@@ -647,6 +673,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:286",
+			"mapAttackFromLeft": "AvWattak.def:0:287",
 			"animation": "CROGUE.DEF"
 		},
 		"sound" :
@@ -673,6 +701,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:288",
+			"mapAttackFromLeft": "AvWattak.def:0:289",
 			"animation": "CTROLL.DEF"
 		},
 		"sound" :

+ 28 - 0
config/creatures/rampart.json

@@ -10,6 +10,8 @@
 		"graphics" :
 		{
 			"missile" : null,
+			"mapAttackFromRight": "AvWattak.def:0:28",
+			"mapAttackFromLeft": "AvWattak.def:0:29",
 			"animation": "CCENTR.DEF"
 		},
 		"sound" :
@@ -31,6 +33,8 @@
 		"graphics" :
 		{
 			"missile" : null,
+			"mapAttackFromRight": "AvWattak.def:0:30",
+			"mapAttackFromLeft": "AvWattak.def:0:31",
 			"animation": "CECENT.DEF"
 		},
 		"sound" :
@@ -58,6 +62,8 @@
 		"upgrades": ["battleDwarf"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:32",
+			"mapAttackFromLeft": "AvWattak.def:0:33",
 			"animation": "CDWARF.DEF"
 		},
 		"sound" :
@@ -84,6 +90,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:34",
+			"mapAttackFromLeft": "AvWattak.def:0:35",
 			"animation": "CBDWAR.DEF"
 		},
 		"sound" :
@@ -111,6 +119,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:36",
+			"mapAttackFromLeft": "AvWattak.def:0:37",
 			"animation": "CELF.DEF",
 			"missile" :
 			{
@@ -149,6 +159,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:38",
+			"mapAttackFromLeft": "AvWattak.def:0:39",
 			"animation": "CGRELF.DEF",
 			"missile" :
 			{
@@ -187,6 +199,8 @@
 		"hasDoubleWeek": true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:40",
+			"mapAttackFromLeft": "AvWattak.def:0:41",
 			"animation": "CPEGAS.DEF"
 		},
 		"sound" :
@@ -218,6 +232,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:42",
+			"mapAttackFromLeft": "AvWattak.def:0:43",
 			"animation": "CAPEGS.DEF"
 		},
 		"sound" :
@@ -246,6 +262,8 @@
 		"upgrades": ["dendroidSoldier"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:44",
+			"mapAttackFromLeft": "AvWattak.def:0:45",
 			"animation": "CTREE.DEF"
 		},
 		"sound" :
@@ -273,6 +291,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:46",
+			"mapAttackFromLeft": "AvWattak.def:0:47",
 			"animation": "CBTREE.DEF"
 		},
 		"sound" :
@@ -308,6 +328,8 @@
 		"upgrades": ["warUnicorn"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:48",
+			"mapAttackFromLeft": "AvWattak.def:0:49",
 			"animation": "CUNICO.DEF"
 		},
 		"sound" :
@@ -342,6 +364,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:50",
+			"mapAttackFromLeft": "AvWattak.def:0:51",
 			"animation": "CWUNIC.DEF"
 		},
 		"sound" :
@@ -393,6 +417,8 @@
 		"upgrades": ["goldDragon"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:52",
+			"mapAttackFromLeft": "AvWattak.def:0:53",
 			"animation": "CGDRAG.DEF"
 		},
 		"sound" :
@@ -442,6 +468,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:54",
+			"mapAttackFromLeft": "AvWattak.def:0:55",
 			"animation": "CDDRAG.DEF"
 		},
 		"sound" :

+ 28 - 0
config/creatures/stronghold.json

@@ -8,6 +8,8 @@
 		"upgrades": ["hobgoblin"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:168",
+			"mapAttackFromLeft": "AvWattak.def:0:169",
 			"animation": "CGOBLI.DEF"
 		},
 		"sound" :
@@ -27,6 +29,8 @@
 		"hasDoubleWeek": true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:170",
+			"mapAttackFromLeft": "AvWattak.def:0:171",
 			"animation": "CHGOBL.DEF"
 		},
 		"sound" :
@@ -48,6 +52,8 @@
 		"hasDoubleWeek": true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:172",
+			"mapAttackFromLeft": "AvWattak.def:0:173",
 			"animation": "CBWLFR.DEF"
 		},
 		"sound" :
@@ -75,6 +81,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:174",
+			"mapAttackFromLeft": "AvWattak.def:0:175",
 			"animation": "CUWLFR.DEF"
 		},
 		"sound" :
@@ -102,6 +110,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:176",
+			"mapAttackFromLeft": "AvWattak.def:0:177",
 			"animation": "CORC.DEF",
 			"missile" :
 			{
@@ -133,6 +143,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:178",
+			"mapAttackFromLeft": "AvWattak.def:0:179",
 			"animation": "CORCCH.DEF",
 			"missile" :
 			{
@@ -157,6 +169,8 @@
 		"upgrades": ["ogreMage"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:180",
+			"mapAttackFromLeft": "AvWattak.def:0:181",
 			"animation": "COGRE.DEF"
 		},
 		"sound" :
@@ -194,6 +208,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:182",
+			"mapAttackFromLeft": "AvWattak.def:0:183",
 			"animation": "COGMAG.DEF"
 		},
 		"sound" :
@@ -222,6 +238,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:184",
+			"mapAttackFromLeft": "AvWattak.def:0:185",
 			"animation": "CROC.DEF"
 		},
 		"sound" :
@@ -260,6 +278,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:186",
+			"mapAttackFromLeft": "AvWattak.def:0:187",
 			"animation": "CTBIRD.DEF"
 		},
 		"sound" :
@@ -292,6 +312,8 @@
 		"upgrades": ["cyclopKing"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:188",
+			"mapAttackFromLeft": "AvWattak.def:0:189",
 			"animation": "CCYCLR.DEF",
 			"missile" :
 			{
@@ -335,6 +357,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:190",
+			"mapAttackFromLeft": "AvWattak.def:0:191",
 			"animation": "CCYCLLOR.DEF",
 			"missile" :
 			{
@@ -373,6 +397,8 @@
 		"upgrades": ["ancientBehemoth"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:192",
+			"mapAttackFromLeft": "AvWattak.def:0:193",
 			"animation": "CYBEHE.DEF"
 		},
 		"sound" :
@@ -405,6 +431,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:194",
+			"mapAttackFromLeft": "AvWattak.def:0:195",
 			"animation": "CABEHE.DEF"
 		},
 		"sound" :

+ 28 - 0
config/creatures/tower.json

@@ -9,6 +9,8 @@
 		"hasDoubleWeek": true,
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:56",
+			"mapAttackFromLeft": "AvWattak.def:0:57",
 			"animation": "CGREMA.DEF"
 		},
 		"sound" :
@@ -36,6 +38,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:58",
+			"mapAttackFromLeft": "AvWattak.def:0:59",
 			"animation": "CGREMM.DEF",
 			"missile" :
 			{
@@ -71,6 +75,8 @@
 		"upgrades": ["obsidianGargoyle"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:60",
+			"mapAttackFromLeft": "AvWattak.def:0:61",
 			"animation": "CGARGO.DEF"
 		},
 		"sound" :
@@ -100,6 +106,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:62",
+			"mapAttackFromLeft": "AvWattak.def:0:63",
 			"animation": "COGARG.DEF"
 		},
 		"sound" :
@@ -132,6 +140,8 @@
 		"upgrades": ["stoneGolem"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:64",
+			"mapAttackFromLeft": "AvWattak.def:0:65",
 			"animation": "CSGOLE.DEF"
 		},
 		"sound" :
@@ -163,6 +173,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:66",
+			"mapAttackFromLeft": "AvWattak.def:0:67",
 			"animation": "CIGOLE.DEF"
 		},
 		"sound" :
@@ -199,6 +211,8 @@
 		"upgrades": ["archMage"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:68",
+			"mapAttackFromLeft": "AvWattak.def:0:69",
 			"animation": "CMAGE.DEF",
 			"missile" :
 			{
@@ -243,6 +257,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:70",
+			"mapAttackFromLeft": "AvWattak.def:0:71",
 			"animation": "CAMAGE.DEF",
 			"missile" :
 			{
@@ -294,6 +310,8 @@
 		"upgrades": ["masterGenie"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:72",
+			"mapAttackFromLeft": "AvWattak.def:0:73",
 			"animation": "CGENIE.DEF"
 		},
 		"sound" :
@@ -346,6 +364,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:74",
+			"mapAttackFromLeft": "AvWattak.def:0:75",
 			"animation": "CSULTA.DEF"
 		},
 		"sound" :
@@ -374,6 +394,8 @@
 		"upgrades": ["nagaQueen"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:76",
+			"mapAttackFromLeft": "AvWattak.def:0:77",
 			"animation": "CNAGA.DEF"
 		},
 		"sound" :
@@ -400,6 +422,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:78",
+			"mapAttackFromLeft": "AvWattak.def:0:79",
 			"animation": "CNAGAG.DEF"
 		},
 		"sound" :
@@ -431,6 +455,8 @@
 		"upgrades": ["titan"],
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:80",
+			"mapAttackFromLeft": "AvWattak.def:0:81",
 			"animation": "CLTITA.DEF"
 		},
 		"sound" :
@@ -476,6 +502,8 @@
 		},
 		"graphics" :
 		{
+			"mapAttackFromRight": "AvWattak.def:0:82",
+			"mapAttackFromLeft": "AvWattak.def:0:83",
 			"animation": "CGTITA.DEF",
 			"missile" :
 			{

+ 12 - 5
config/factions/castle.json

@@ -122,9 +122,9 @@
 			"musicTheme" : [ "music/CstleTown" ],
 			"defaultTavern" : 5,
 			"tavernVideo" : "TAVERN.BIK",
-			"guildBackground" : "TPMAGE.bmp",
+			"guildBackground" : [ "TPMAGE.bmp" ],
 			"townBackground": "TBCSBACK.bmp",
-			"guildWindow": "TPMAGECS.bmp",
+			"guildWindow": [ "TPMAGECS.bmp" ],
 			"buildingsIcons": "HALLCSTL.DEF",
 			"hallBackground": "TPTHBKCS.BMP",
 			"hallSlots":
@@ -147,6 +147,13 @@
 			],
 			"horde" : [ 2, -1 ],
 			"mageGuild" : 4,
+			"guildSpellPositions" : [
+				[ { "x": 222, "y": 445 }, { "x": 312, "y": 445 }, { "x": 402, "y": 445 }, { "x": 520, "y": 445 }, { "x": 610, "y": 445 }, { "x": 700, "y": 445 } ],
+				[ { "x":  48, "y":  53 }, { "x":  48, "y": 147 }, { "x":  48, "y": 241 }, { "x":  48, "y": 335 }, { "x":  48, "y": 429 } ],
+				[ { "x": 570, "y":  82 }, { "x": 672, "y":  82 }, { "x": 570, "y": 157 }, { "x": 672, "y": 157 } ],
+				[ { "x": 183, "y":  42 }, { "x": 183, "y": 148 }, { "x": 183, "y": 253 } ]
+			],
+			"guildWindowPosition": { "x": 332, "y": 76 },
 			"moatAbility" : "castleMoat",
 			// primaryResource not specified so town get both Wood and Ore for resource bonus
 
@@ -172,7 +179,7 @@
 				"special1":       { 
 					"bonuses": [
 						{
-							"propagator": "PLAYER_PROPAGATOR",
+							"propagator": "PLAYER",
 							"type": "MOVEMENT",
 							"subtype": "heroMovementSea",
 							"val": 500
@@ -205,14 +212,14 @@
 							"val": 2
 						},
 						{
-							"propagator": "PLAYER_PROPAGATOR",
+							"propagator": "PLAYER",
 							"type": "THIEVES_GUILD_ACCESS",
 							"val": 1
 						}
 					],
 					"upgrades" : "tavern"
 				},
-				"grail":          { "id" : 26, "mode" : "grail", "produce": { "gold": 5000 }, "bonuses": [ { "type": "MORALE", "val": 2, "propagator": "PLAYER_PROPAGATOR" } ] },
+				"grail":          { "id" : 26, "mode" : "grail", "produce": { "gold": 5000 }, "bonuses": [ { "type": "MORALE", "val": 2, "propagator": "PLAYER" } ] },
 
 				"dwellingLvl1":   { "id" : 30, "requires" : [ "fort" ] },
 				"dwellingLvl2":   { "id" : 31, "requires" : [ "dwellingLvl1" ] },

+ 10 - 2
config/factions/conflux.json

@@ -126,9 +126,9 @@
 			"musicTheme" : [ "music/ElemTown" ],
 			"defaultTavern" : 5,
 			"tavernVideo" : "TAVERN.BIK",
-			"guildBackground" : "TPMAGE.bmp",
+			"guildBackground" : [ "TPMAGE.bmp" ],
 			"townBackground": "TBELBACK.bmp",
-			"guildWindow": "TPMAGEEL.bmp",
+			"guildWindow": [ "TPMAGEEL.bmp" ],
 			"buildingsIcons": "HALLELEM.DEF",
 			"hallBackground": "TPTHBKFR.BMP",
 			"hallSlots":
@@ -151,6 +151,14 @@
 			],
 			"horde" : [ 0, -1 ],
 			"mageGuild" : 5,
+			"guildSpellPositions" : [
+				[ { "x": 222, "y": 445 }, { "x": 312, "y": 445 }, { "x": 402, "y": 445 }, { "x": 520, "y": 445 }, { "x": 610, "y": 445 }, { "x": 700, "y": 445 } ],
+				[ { "x":  48, "y":  53 }, { "x":  48, "y": 147 }, { "x":  48, "y": 241 }, { "x":  48, "y": 335 }, { "x":  48, "y": 429 } ],
+				[ { "x": 570, "y":  82 }, { "x": 672, "y":  82 }, { "x": 570, "y": 157 }, { "x": 672, "y": 157 } ],
+				[ { "x": 183, "y":  42 }, { "x": 183, "y": 148 }, { "x": 183, "y": 253 } ],
+				[ { "x": 491, "y": 325 }, { "x": 591, "y": 325 } ]
+			],
+			"guildWindowPosition": { "x": 332, "y": 76 },
 			"primaryResource" : "mercury",
 			"moatAbility" : "castleMoat",
 

+ 10 - 2
config/factions/dungeon.json

@@ -122,9 +122,9 @@
 			"musicTheme" : [ "music/Dungeon" ],
 			"defaultTavern" : 5,
 			"tavernVideo" : "TAVERN.BIK",
-			"guildBackground" : "TPMAGE.bmp",
+			"guildBackground" : [ "TPMAGE.bmp" ],
 			"townBackground": "TBDNBACK.bmp",
-			"guildWindow": "TPMAGEDN.bmp",
+			"guildWindow": [ "TPMAGEDN.bmp" ],
 			"buildingsIcons": "HALLDUNG.DEF",
 			"hallBackground": "TPTHBKDG.BMP",
 			"hallSlots":
@@ -147,6 +147,14 @@
 			],
 			"horde" : [ 0, -1 ],
 			"mageGuild" : 5,
+			"guildSpellPositions" : [
+				[ { "x": 222, "y": 445 }, { "x": 312, "y": 445 }, { "x": 402, "y": 445 }, { "x": 520, "y": 445 }, { "x": 610, "y": 445 }, { "x": 700, "y": 445 } ],
+				[ { "x":  48, "y":  53 }, { "x":  48, "y": 147 }, { "x":  48, "y": 241 }, { "x":  48, "y": 335 }, { "x":  48, "y": 429 } ],
+				[ { "x": 570, "y":  82 }, { "x": 672, "y":  82 }, { "x": 570, "y": 157 }, { "x": 672, "y": 157 } ],
+				[ { "x": 183, "y":  42 }, { "x": 183, "y": 148 }, { "x": 183, "y": 253 } ],
+				[ { "x": 491, "y": 325 }, { "x": 591, "y": 325 } ]
+			],
+			"guildWindowPosition": { "x": 332, "y": 76 },
 			"primaryResource" : "sulfur",
 			"moatAbility" : "dungeonMoat",
 

+ 8 - 2
config/factions/fortress.json

@@ -122,9 +122,9 @@
 			"musicTheme" : [ "music/FortressTown" ],
 			"defaultTavern" : 5,
 			"tavernVideo" : "TAVERN.BIK",
-			"guildBackground" : "TPMAGE.bmp",
+			"guildBackground" : [ "TPMAGE.bmp" ],
 			"townBackground": "TBFRBACK.bmp",
-			"guildWindow": "TPMAGEFR.bmp",
+			"guildWindow": [ "TPMAGEFR.bmp" ],
 			"buildingsIcons": "HALLFORT.DEF",
 			"hallBackground": "TPTHBKFR.BMP",
 			"hallSlots":
@@ -147,6 +147,12 @@
 			],
 			"horde" : [ 0, -1 ],
 			"mageGuild" : 3,
+			"guildSpellPositions" : [
+				[ { "x": 222, "y": 445 }, { "x": 312, "y": 445 }, { "x": 402, "y": 445 }, { "x": 520, "y": 445 }, { "x": 610, "y": 445 }, { "x": 700, "y": 445 } ],
+				[ { "x":  48, "y":  53 }, { "x":  48, "y": 147 }, { "x":  48, "y": 241 }, { "x":  48, "y": 335 }, { "x":  48, "y": 429 } ],
+				[ { "x": 570, "y":  82 }, { "x": 672, "y":  82 }, { "x": 570, "y": 157 }, { "x": 672, "y": 157 } ]
+			],
+			"guildWindowPosition": { "x": 332, "y": 76 },
 			"moatAbility" : "fortressMoat",
 			// primaryResource not specified so town get both Wood and Ore for resource bonus
 

+ 10 - 2
config/factions/inferno.json

@@ -123,9 +123,9 @@
 			"musicTheme" : [ "music/InfernoTown" ],
 			"defaultTavern" : 5,
 			"tavernVideo" : "TAVERN.BIK",
-			"guildBackground" : "TPMAGE.bmp",
+			"guildBackground" : [ "TPMAGE.bmp" ],
 			"townBackground": "TBINBACK.bmp",
-			"guildWindow": "TPMAGEIN.bmp",
+			"guildWindow": [ "TPMAGEIN.bmp" ],
 			"buildingsIcons": "HALLINFR.DEF",
 			"hallBackground": "TPTHBKIN.BMP",
 			"hallSlots":
@@ -148,6 +148,14 @@
 			],
 			"horde" : [ 0, 2 ],
 			"mageGuild" : 5,
+			"guildSpellPositions" : [
+				[ { "x": 222, "y": 445 }, { "x": 312, "y": 445 }, { "x": 402, "y": 445 }, { "x": 520, "y": 445 }, { "x": 610, "y": 445 }, { "x": 700, "y": 445 } ],
+				[ { "x":  48, "y":  53 }, { "x":  48, "y": 147 }, { "x":  48, "y": 241 }, { "x":  48, "y": 335 }, { "x":  48, "y": 429 } ],
+				[ { "x": 570, "y":  82 }, { "x": 672, "y":  82 }, { "x": 570, "y": 157 }, { "x": 672, "y": 157 } ],
+				[ { "x": 183, "y":  42 }, { "x": 183, "y": 148 }, { "x": 183, "y": 253 } ],
+				[ { "x": 491, "y": 325 }, { "x": 591, "y": 325 } ]
+			],
+			"guildWindowPosition": { "x": 332, "y": 76 },
 			"primaryResource" : "mercury",
 			"moatAbility" : "infernoMoat",
 

+ 12 - 4
config/factions/necropolis.json

@@ -127,9 +127,9 @@
 			"musicTheme" : [ "music/NecroTown" ],
 			"defaultTavern" : 5,
 			"tavernVideo" : "TAVERN.BIK",
-			"guildBackground" : "TPMAGE.bmp",
+			"guildBackground" : [ "TPMAGE.bmp" ],
 			"townBackground": "TBNCBACK.bmp",
-			"guildWindow": "TPMAGENC.bmp",
+			"guildWindow": [ "TPMAGENC.bmp" ],
 			"buildingsIcons": "HALLNECR.DEF",
 			"hallBackground": "TPTHBKNC.BMP",
 			"hallSlots":
@@ -152,6 +152,14 @@
 			],
 			"horde" : [ 0, -1 ],
 			"mageGuild" : 5,
+			"guildSpellPositions" : [
+				[ { "x": 222, "y": 445 }, { "x": 312, "y": 445 }, { "x": 402, "y": 445 }, { "x": 520, "y": 445 }, { "x": 610, "y": 445 }, { "x": 700, "y": 445 } ],
+				[ { "x":  48, "y":  53 }, { "x":  48, "y": 147 }, { "x":  48, "y": 241 }, { "x":  48, "y": 335 }, { "x":  48, "y": 429 } ],
+				[ { "x": 570, "y":  82 }, { "x": 672, "y":  82 }, { "x": 570, "y": 157 }, { "x": 672, "y": 157 } ],
+				[ { "x": 183, "y":  42 }, { "x": 183, "y": 148 }, { "x": 183, "y": 253 } ],
+				[ { "x": 491, "y": 325 }, { "x": 591, "y": 325 } ]
+			],
+			"guildWindowPosition": { "x": 332, "y": 76 },
 			"moatAbility" : "necropolisMoat",
 			// primaryResource not specified so town get both Wood and Ore for resource bonus
 
@@ -180,10 +188,10 @@
 				"horde1Upgr":     { "id" : 19, "upgrades" : "dwellingUpLvl1", "requires" : [ "horde1" ], "mode" : "auto" },
 				"ship":           { "id" : 20, "upgrades" : "shipyard" },
 				"special2":       { "requires" : [ "mageGuild1" ],
-					"bonuses": [ { "type": "UNDEAD_RAISE_PERCENTAGE", "val": 10, "propagator": "PLAYER_PROPAGATOR" } ] },
+					"bonuses": [ { "type": "UNDEAD_RAISE_PERCENTAGE", "val": 10, "propagator": "PLAYER" } ] },
 				"special3":       { "requires" : [ "dwellingLvl1" ], "marketModes" : ["creature-undead"] },
 				"grail":          { "id" : 26, "mode" : "grail", "produce": { "gold": 5000 },
-					"bonuses": [ { "type": "UNDEAD_RAISE_PERCENTAGE", "val": 20, "propagator": "PLAYER_PROPAGATOR" } ] },
+					"bonuses": [ { "type": "UNDEAD_RAISE_PERCENTAGE", "val": 20, "propagator": "PLAYER" } ] },
 
 				"extraTownHall":  { "id" : 27, "requires" : [ "townHall" ], "mode" : "auto" },
 				"extraCityHall":  { "id" : 28, "requires" : [ "cityHall" ], "mode" : "auto" },

+ 11 - 3
config/factions/rampart.json

@@ -126,9 +126,9 @@
 			"musicTheme" : [ "music/Rampart" ],
 			"defaultTavern" : 5,
 			"tavernVideo" : "TAVERN.BIK",
-			"guildBackground" : "TPMAGE.bmp",
+			"guildBackground" : [ "TPMAGE.bmp" ],
 			"townBackground": "TBRMBACK.bmp",
-			"guildWindow": "TPMAGERM.bmp",
+			"guildWindow": [ "TPMAGERM.bmp" ],
 			"buildingsIcons": "HALLRAMP.DEF",
 			"hallBackground": "TPTHBKRM.BMP",
 			"hallSlots":
@@ -151,6 +151,14 @@
 			],
 			"horde" : [ 1, 4 ],
 			"mageGuild" : 5,
+			"guildSpellPositions" : [
+				[ { "x": 222, "y": 445 }, { "x": 312, "y": 445 }, { "x": 402, "y": 445 }, { "x": 520, "y": 445 }, { "x": 610, "y": 445 }, { "x": 700, "y": 445 } ],
+				[ { "x":  48, "y":  53 }, { "x":  48, "y": 147 }, { "x":  48, "y": 241 }, { "x":  48, "y": 335 }, { "x":  48, "y": 429 } ],
+				[ { "x": 570, "y":  82 }, { "x": 672, "y":  82 }, { "x": 570, "y": 157 }, { "x": 672, "y": 157 } ],
+				[ { "x": 183, "y":  42 }, { "x": 183, "y": 148 }, { "x": 183, "y": 253 } ],
+				[ { "x": 491, "y": 325 }, { "x": 591, "y": 325 } ]
+			],
+			"guildWindowPosition": { "x": 332, "y": 76 },
 			"primaryResource" : "crystal",
 			"moatAbility" : "rampartMoat",
 
@@ -188,7 +196,7 @@
 				"special3":       { "type" : "treasury", "requires" : [ "horde1" ] },
 				"horde2":         { "id" : 24, "upgrades" : "dwellingLvl5" },
 				"horde2Upgr":     { "id" : 25, "upgrades" : "dwellingUpLvl5", "requires" : [ "horde2" ], "mode" : "auto" },
-				"grail":          { "id" : 26, "mode" : "grail", "produce": { "gold": 5000 }, "bonuses": [ { "type": "LUCK", "val": 2, "propagator": "PLAYER_PROPAGATOR" } ] },
+				"grail":          { "id" : 26, "mode" : "grail", "produce": { "gold": 5000 }, "bonuses": [ { "type": "LUCK", "val": 2, "propagator": "PLAYER" } ] },
 
 				"extraTownHall":  { "id" : 27, "requires" : [ "townHall" ], "mode" : "auto" },
 				"extraCityHall":  { "id" : 28, "requires" : [ "cityHall" ], "mode" : "auto" },

+ 8 - 2
config/factions/stronghold.json

@@ -120,9 +120,9 @@
 			"musicTheme" : [ "music/Stronghold" ],
 			"defaultTavern" : 5,
 			"tavernVideo" : "TAVERN.BIK",
-			"guildBackground" : "TPMAGE.bmp",
+			"guildBackground" : [ "TPMAGE.bmp" ],
 			"townBackground": "TBSTBACK.bmp",
-			"guildWindow": "TPMAGEST.bmp",
+			"guildWindow": [ "TPMAGEST.bmp" ],
 			"buildingsIcons": "HALLSTRN.DEF",
 			"hallBackground": "TPTHBKTW.BMP",
 			"hallSlots":
@@ -145,6 +145,12 @@
 			],
 			"horde" : [ 0, -1 ],
 			"mageGuild" : 3,
+			"guildSpellPositions" : [
+				[ { "x": 222, "y": 445 }, { "x": 312, "y": 445 }, { "x": 402, "y": 445 }, { "x": 520, "y": 445 }, { "x": 610, "y": 445 }, { "x": 700, "y": 445 } ],
+				[ { "x":  48, "y":  53 }, { "x":  48, "y": 147 }, { "x":  48, "y": 241 }, { "x":  48, "y": 335 }, { "x":  48, "y": 429 } ],
+				[ { "x": 570, "y":  82 }, { "x": 672, "y":  82 }, { "x": 570, "y": 157 }, { "x": 672, "y": 157 } ]
+			],
+			"guildWindowPosition": { "x": 332, "y": 76 },
 			"moatAbility" : "strongholdMoat",
 			// primaryResource not specified so town get both Wood and Ore for resource bonus
 

+ 10 - 2
config/factions/tower.json

@@ -121,9 +121,9 @@
 			"musicTheme" : [ "music/TowerTown" ],
 			"defaultTavern" : 5,
 			"tavernVideo" : "TAVERN.BIK",
-			"guildBackground" : "TPMAGE.bmp",
+			"guildBackground" : [ "TPMAGE.bmp" ],
 			"townBackground": "TBTWBACK.bmp",
-			"guildWindow": "TPMAGETW.bmp",
+			"guildWindow": [ "TPMAGETW.bmp" ],
 			"buildingsIcons": "HALLTOWR.DEF",
 			"hallBackground": "TPTHBKTW.BMP",
 			"hallSlots":
@@ -147,6 +147,14 @@
 			"horde" : [ 1, -1 ],
 			"primaryResource" : "gems",
 			"mageGuild" : 5,
+			"guildSpellPositions" : [
+				[ { "x": 222, "y": 445 }, { "x": 312, "y": 445 }, { "x": 402, "y": 445 }, { "x": 520, "y": 445 }, { "x": 610, "y": 445 }, { "x": 700, "y": 445 } ],
+				[ { "x":  48, "y":  53 }, { "x":  48, "y": 147 }, { "x":  48, "y": 241 }, { "x":  48, "y": 335 }, { "x":  48, "y": 429 } ],
+				[ { "x": 570, "y":  82 }, { "x": 672, "y":  82 }, { "x": 570, "y": 157 }, { "x": 672, "y": 157 } ],
+				[ { "x": 183, "y":  42 }, { "x": 183, "y": 148 }, { "x": 183, "y": 253 } ],
+				[ { "x": 491, "y": 325 }, { "x": 591, "y": 325 } ]
+			],
+			"guildWindowPosition": { "x": 332, "y": 76 },
 			"moatAbility" : "towerMoat",
 
 			"buildings" :

+ 1 - 1
config/objects/lighthouse.json

@@ -21,7 +21,7 @@
 						"type" : "MOVEMENT",
 						"subtype" : "heroMovementSea",
 						"val" : 500,
-						"propagator": "PLAYER_PROPAGATOR"
+						"propagator": "PLAYER"
 					}
 				}
 			}

+ 39 - 2
config/schemas/bonusInstance.json

@@ -43,7 +43,7 @@
 			"anyOf" : [
 				{
 					"type" : "string",
-					"enum" : [ "TIMES_HERO_LEVEL", "TIMES_STACK_LEVEL", "DIVIDE_STACK_LEVEL", "BONUS_OWNER_UPDATER", "TIMES_HERO_LEVEL_DIVIDE_STACK_LEVEL" ]
+					"enum" : [ "TIMES_HERO_LEVEL", "TIMES_STACK_LEVEL", "DIVIDE_STACK_LEVEL", "BONUS_OWNER_UPDATER", "TIMES_STACK_SIZE", "TIMES_HERO_LEVEL_DIVIDE_STACK_LEVEL" ]
 				},
 				{
 					"description" : "GROWS_WITH_LEVEL updater",
@@ -107,6 +107,43 @@
 							"description" : "Maximal bonus value"
 						}
 					}
+				},
+				{
+					"description" : "TIMES_ARMY_SIZE updater",
+					"type" : "object",
+					"required" : ["type"],
+					"additionalProperties" : false,
+					"properties" : {
+						"type" : {
+							"type" : "string",
+							"const" : "TIMES_ARMY_SIZE",
+						},
+						"stepSize" : {
+							"type" : "integer",
+							"minimum" : 1,
+							"description" : "Size of each step, in levels"
+						},
+						"minimum" : {
+							"type" : "integer",
+							"description" : "Minimal bonus value"
+						},
+						"maximum" : {
+							"type" : "integer",
+							"description" : "Maximal bonus value"
+						},
+						"filteredLevel" : {
+							"type" : "integer",
+							"description" : "Level of units to count"
+						},
+						"filteredFaction" : {
+							"type" : "string",
+							"description" : "Faction of units to count"
+						},
+						"filteredCreature" : {
+							"type" : "string",
+							"description" : "Specific unit to count"
+						}
+					}
 				}
 			]
 		}
@@ -138,7 +175,7 @@
 		"propagator" : {
 			"description" : "propagator",
 			"type" : "string",
-			"enum" : [ "BATTLE_WIDE", "VISITED_TOWN_AND_VISITOR", "PLAYER_PROPAGATOR", "HERO", "TEAM_PROPAGATOR", "GLOBAL_EFFECT" ]
+			"enum" : [ "BATTLE_WIDE", "TOWN_AND_VISITOR", "PLAYER", "HERO", "TOWN", "ARMY", "TEAM", "GLOBAL_EFFECT" ]
 		},
 		"updater" : {
 			"$ref" : "#/definitions/updater"

+ 49 - 6
config/schemas/creature.json

@@ -4,15 +4,47 @@
 	"title" : "VCMI creature format",
 	"description" : "Json format for defining new creatures in VCMI",
 	"required" : [ "faction" ],
-	"anyOf" : [
+	"allOf" : [
 		{
-			"disabled" : { "enum" : [ true ] }
+			"if" : {
+				"properties" : {
+					"disabled" : {
+						"const" : false
+					}
+				}
+			},
+			"then" : {
+				"required" : [
+					"name", "level", "cost", "speed", "hitPoints", "attack", "defense", "damage", "fightValue", "aiValue", "graphics", "sound"
+				]
+			}
 		},
 		{
-			"required" : [
-				"name", "level", "cost", "speed", "hitPoints", "attack", "defense", "damage",
-				"fightValue", "aiValue", "advMapAmount", "graphics", "sound"
-			]
+			"if" : {
+				"properties" : {
+					"special" : {
+						"const" : false
+					},
+					"disabled" : {
+						"const" : false 
+					}
+				}
+			},
+			"then" : {
+				"required" : [ "advMapAmount" ],
+				"properties" : {
+					"advMapAmount" : {
+						"type" : "object",
+						"additionalProperties" : false,
+						"description" : "Initial size of random stacks on adventure map",
+						"required" : [ "min", "max" ],
+						"properties" : {
+							"min" : { "type" : "number", "minimum" : 1 },
+							"max" : { "type" : "number", "minimum" : 1 }
+						}
+					}
+				}
+			}
 		}
 	],
 	"additionalProperties" : false,
@@ -80,6 +112,7 @@
 		"damage" : {
 			"type" : "object",
 			"additionalProperties" : false,
+			"required" : [ "min", "max" ],
 			"properties" : {
 				"max" : { "type" : "number" },
 				"min" : { "type" : "number" }
@@ -153,6 +186,16 @@
 					"items" : { "type" : "string" },
 					"description" : "Object mask that describes on which tiles object is visible/blocked/activatable"
 				},
+				"mapAttackFromLeft" : {
+					"type" : "string",
+					"description" : "Adventure map creature image when attacked from left",
+					"format" : "imageFile"
+				},
+				"mapAttackFromRight" : {
+					"type" : "string",
+					"description" : "Adventure map creature image when attacked from right",
+					"format" : "imageFile"
+				},
 				"iconLarge" : {
 					"type" : "string",
 					"description" : "Large icon for this creature, used for example in town screen",

+ 56 - 6
config/schemas/faction.json

@@ -166,13 +166,63 @@
 					"format" : "imageFile"
 				},
 				"guildWindow" : {
-					"type" : "string",
-					"description" : "Image with small view on town from mage guild"
+					"anyOf" : [
+						{
+							"type" : "array",
+							"description" : "Image with small view on town from mage guild (each array element for different mage guild level; if one element only this will be always selected)",
+							"minItems" : 1,
+							"items" : { 
+								"type" : "string",
+								"format" : "imageFile"
+							}
+						},
+						{
+							"type" : "string",
+							"description" : "Image with small view on town from mage guild",
+							"format" : "imageFile"
+						}
+					]
 				},
 				"guildBackground" : {
-					"type" : "string",
-					"description" : "Image with background of mage guild",
-					"format" : "imageFile"
+					"anyOf" : [
+						{
+							"type" : "array",
+							"description" : "Image with background of mage guild (each array element for different mage guild level; if one element only this will be always selected)",
+							"minItems" : 1,
+							"items" : { 
+								"type" : "string",
+								"format" : "imageFile"
+							}
+						},
+						{
+							"type" : "string",
+							"description" : "Image with background of mage guild",
+							"format" : "imageFile"
+						}
+					]
+				},
+				"guildWindowPosition" : {
+					"type" : "object",
+					"additionalProperties" : false,
+					"properties" : {
+						"x" :     { "type" : "number", "description" : "X coordinate on screen" },
+						"y" :     { "type" : "number", "description" : "Y coordinate on screen" }
+					}
+				},
+				"guildSpellPositions" : {
+					"type" : "array",
+					"description" : "Positions of spells in mage guild",
+					"items" : { 
+						"type" : "array",
+						"items" : {
+							"type" : "object",
+							"additionalProperties" : false,
+							"properties" : {
+								"x" :     { "type" : "number", "description" : "X coordinate on screen" },
+								"y" :     { "type" : "number", "description" : "Y coordinate on screen" }
+							}
+						}
+					}
 				},
 				"hallBackground" : {
 					"type" : "string",
@@ -259,7 +309,7 @@
 						"properties" : {
 							"index" : { "type" : "number", "description" : "Order in which images will be opened" },
 							"x" :     { "type" : "number", "description" : "X coordinate on screen" },
-							"y" :     { "type" : "number", "description" : "X coordinate on screen" }
+							"y" :     { "type" : "number", "description" : "Y coordinate on screen" }
 						}
 					}
 				},

+ 5 - 2
config/schemas/settings.json

@@ -387,7 +387,7 @@
 			"type" : "object",
 			"additionalProperties" : false,
 			"default" : {},
-			"required" : [ "heroMoveTime", "enemyMoveTime", "scrollSpeedPixels", "heroReminder", "quickCombat", "objectAnimation", "terrainAnimation", "forceQuickCombat", "borderScroll", "leftButtonDrag", "rightButtonDrag", "smoothDragging", "backgroundDimLevel", "hideBackground", "backgroundDimSmallWindows", "tileZoom", "minimapShowHeroes" ],
+			"required" : [ "heroMoveTime", "enemyMoveTime", "scrollSpeedPixels", "heroReminder", "quickCombat", "objectAnimation", "terrainAnimation", "forceQuickCombat", "borderScroll", "leftButtonDrag", "rightButtonDrag", "smoothDragging", "backgroundDimLevel", "hideBackground", "backgroundDimSmallWindows", "tileZoom", "minimapShowHeroes", "showMovePath" ],
 			"properties" : {
 				"heroMoveTime" : {
 					"type" : "number",
@@ -456,10 +456,13 @@
 					"type" : "boolean",
 					"default" : true
 				},
-				
 				"tileZoom" : {
 					"type" : "number",
 					"default" : 32
+				},
+				"showMovePath" : {
+					"type" : "boolean",
+					"default" : true
 				}
 			}
 		},

+ 4 - 3
config/widgets/settings/adventureOptionsTab.json

@@ -289,7 +289,7 @@
 			"items":
 			[
 				{
-					"text": "core.genrltxt.572" // TODO: show move path
+					"text": "core.genrltxt.572" // show move path
 				},
 				{
 					"text": "core.genrltxt.573" // show hero reminder
@@ -315,8 +315,9 @@
 			"items":
 			[
 				{
-					"name": "showMovePathPlaceholder",
-					"type": "checkboxFake"
+					"name": "showMovePathCheckbox",
+					"help": "core.help.360",
+					"callback": "showMovePathChanged"
 				},
 				{
 					"name": "heroReminderCheckbox",

+ 15 - 0
docs/modders/Bonus/Bonus_Limiters.md

@@ -128,6 +128,21 @@ Parameters:
 
 For reference on tiles indexes see image below:
 
+### HAS_CHARGES_LIMITER
+
+Currently works only with spells. Sets the cost of use in charges
+
+Parameters:
+
+- use cost (charges)
+
+```json
+"limiters" : [ {
+  "type" : "HAS_CHARGES_LIMITER",
+  "parameters" : [2]
+} ]
+```
+
 ![Battlefield Hexes Layout](../../images/Battle_Field_Hexes.svg)
 
 ## Aggregate Limiters

+ 18 - 6
docs/modders/Bonus/Bonus_Propagators.md

@@ -1,10 +1,22 @@
 # Bonus Propagators
 
+Propagators allow to propagate bonus effect "upwards". For example, they can be used to make unit ability battle-wide, or to provide some bonuses to hero. See [Bonus System Guide](../Guides/Bonus_System.md) for more information.
+
 ## Available propagators
 
-- BATTLE_WIDE: Affects both sides during battle
-- VISITED_TOWN_AND_VISITOR: Used with Legion artifacts (town visited by hero)
-- PLAYER_PROPAGATOR: Bonus will affect all objects owned by player. Used by Statue of Legion.
-- HERO: Bonus will be transferred to hero (for example from stacks in his army).
-- TEAM_PROPAGATOR: Bonus will affect all objects owned by player and his allies.
-- GLOBAL_EFFECT: This effect will influence all creatures, heroes and towns on the map.
+- `ARMY`: Propagators that allow bonuses to be transferred to an army. It is typically used by creature abilities to affect the army that the creature is part of.
+- `HERO`: Similar to `ARMY`, but works only with armies led by heroes.
+- `TOWN`: Similar to `ARMY`, but only affects units that are part of the town garrison.
+- `TOWN_AND_VISITOR`: Propagator that allows the town and the visiting hero to interact. It can be used to propagate the effects of town buildings to the visiting hero outside of combat or the effects of the hero to the town (e.g. Legion artifacts)
+- `BATTLE_WIDE` - Propagator that allows bonuses to affect all entities in battles. It is typically used for creature abilities or artifacts that need to affect either both sides or only the enemy side in combat.
+- `PLAYER`: The bonus affects all objects owned by the player. Used by the Statue of Legion.
+- `TEAM`: The bonus affects all objects owned by the player and their allies.
+- `GLOBAL_EFFECT`: This effect influences all creatures, towns and recruited heroes on the map.
+
+## Deprecated propagators
+
+These propagators are still supported, but in future they may be removed.
+
+- `VISITED_TOWN_AND_VISITOR`: Replaced by `TOWN_AND_VISITOR`
+- `PLAYER_PROPAGATOR`: Replaced by `PLAYER`
+- `TEAM_PROPAGATOR`: Replaced by `TEAM`

+ 61 - 2
docs/modders/Bonus/Bonus_Updaters.md

@@ -84,19 +84,78 @@ Usage:
 
 Effect: Updates val to `val = clamp(val * floor(stackSize / stepSize), minimum, maximum)`, where stackSize is total number of creatures in current unit stack
 
-Parameters `minimum` and `maximum` are optional and can be dropped if not needed
+Example of short form with default parameters:
 
-Example:
+```json
+"updater" : "TIMES_STACK_SIZE"
+```
+
+Example of long form with custom parameters:
 
 ```json
 "updater" : {
     "type" : "TIMES_STACK_SIZE",
+    
+    // Optional, by default - unlimited
+    "minimum" : 0,
+    
+    // Optional, by default - unlimited
+    "maximum" : 100,
+    
+    // Optional, by default - 1
+    "stepSize" : 2
+}
+```
+
+## TIMES_ARMY_SIZE
+
+Effect: Updates val to `val = clamp(val * floor(stackSize / stepSize), minimum, maximum)`, where stackSize is total number of creatures in hero army that fulful filter
+
+Parameters:
+
+- `minimum`: minimum possible value of the bonus value. Unlimited by default
+- `maximum`: maximum possible value of the bonus value. Unlimited by default
+- `stepSize`: number of units needed to increase updater multiplier by 1
+- `filteredCreature`: identifier of specific unit to filter
+- `filteredLevel`: level of units that need to be counted. Redundant if `filteredCreature` is used
+- `filteredFaction`: faction of units that need to be counted. Redundant if `filteredCreature` is used
+
+Filtering for specific unit:
+
+```json
+"updater" : {
+    "type" : "TIMES_ARMY_SIZE",
+    "filteredCreature" : "pikeman",
+    
+    // Optional, by default - unlimited
     "minimum" : 0,
+    
+    // Optional, by default - unlimited
     "maximum" : 100,
+    
+    // Optional, by default - 1
     "stepSize" : 2
 }
 ```
 
+Filtering for specific faction:
+
+```json
+"updater" : {
+    "type" : "TIMES_STACK_SIZE",
+    "filteredFaction" : "castle"
+}
+```
+
+Filtering for specific unit level:
+
+```json
+"updater" : {
+    "type" : "TIMES_STACK_SIZE",
+    "filteredLevel" : 2
+}
+```
+
 ## BONUS_OWNER_UPDATER
 
 Helper updater for proper functionality of `OPPOSITE_SIDE` limiter

+ 4 - 0
docs/modders/Entities_Format/Creature_Format.md

@@ -128,6 +128,10 @@ In order to make functional creature you also need:
 		"iconSmall" : "",
 		// Large icon for this creature, used for example in town screen
 		"iconLarge" : "",
+
+		// Optional. Images of creatures when attacked on adventure map
+		"mapAttackFromRight": "",
+		"mapAttackFromLeft": "",
 		
 		// animation parameters
 

+ 17 - 5
docs/modders/Entities_Format/Faction_Format.md

@@ -177,11 +177,11 @@ Each town requires a set of buildings (Around 30-45 buildings)
 	// Background scenery for town screen, size must be 800x374
 	"townBackground": "",
 
-	// Small scenery for window in mage guild screen
-	"guildWindow": "",
+	// Small scenery for window in mage guild screen; each element of array is for seperate mage guild level image (if only one element, then this will always used)
+	"guildWindow": [""],
 
-	// Background image for window in mage guild screen
-	"guildBackground" : "",
+	// Background image for window in mage guild screen; each element of array is for seperate mage guild level image (if only one element, then this will always used)
+	"guildBackground" : [""],
 
 	// Video for tavern window
 	"tavernVideo" : "",
@@ -250,7 +250,19 @@ Each town requires a set of buildings (Around 30-45 buildings)
 	"primaryResource" : "gems", 
 
 	// maximum level of mage guild
-	"mageGuild" : 4,
+	"mageGuild" : 5,
+
+	// Coordinates of spell images in mage guild screen. Should contain the maximum level of mage guild amount of elements. Example are HoMM3 defaults:
+	"guildSpellPositions" : [
+		[ { "x": 222, "y": 445 }, { "x": 312, "y": 445 }, { "x": 402, "y": 445 }, { "x": 520, "y": 445 }, { "x": 610, "y": 445 }, { "x": 700, "y": 445 } ],
+		[ { "x":  48, "y":  53 }, { "x":  48, "y": 147 }, { "x":  48, "y": 241 }, { "x":  48, "y": 335 }, { "x":  48, "y": 429 } ],
+		[ { "x": 570, "y":  82 }, { "x": 672, "y":  82 }, { "x": 570, "y": 157 }, { "x": 672, "y": 157 } ],
+		[ { "x": 183, "y":  42 }, { "x": 183, "y": 148 }, { "x": 183, "y": 253 } ],
+		[ { "x": 491, "y": 325 }, { "x": 591, "y": 325 } ]
+	],
+
+	// Coordinates of window image in mage guild screen. Example is HoMM3 default:
+	"guildWindowPosition": { "x": 332, "y": 76 },
 
 	// Identifier of spell that will create effects for town moat during siege
 	"moatAbility" : "castleMoat"

+ 18 - 18
launcher/translation/belarusian.ts

@@ -1098,7 +1098,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation type="unfinished"></translation>
@@ -1115,69 +1115,69 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1521,12 +1521,12 @@ Bin (%n bytes):
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation type="unfinished"></translation>

+ 18 - 18
launcher/translation/bulgarian.ts

@@ -1098,7 +1098,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation type="unfinished"></translation>
@@ -1115,69 +1115,69 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1519,12 +1519,12 @@ Bin (%n bytes):
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation type="unfinished"></translation>

+ 18 - 18
launcher/translation/chinese.ts

@@ -1124,7 +1124,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation>选择%1文件...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>你必须选择%1文件!</translation>
@@ -1141,19 +1141,19 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>GOG安装包</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>VCMI不支持英雄无敌3高清版文件。
 请选择包含《英雄无敌3:完全版》或《英雄无敌3:死亡阴影》的目录。</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>检测到未知或不支持的英雄无敌3版本。
@@ -1161,52 +1161,52 @@ Please select the directory with Heroes III: Complete Edition or Heroes III: Sha
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>GOG数据</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation>打开文件失败:%1</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>您提供的是GOG Galaxy安装器!这个文件不包含游戏内容,请下载离线游戏安装器!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>哈希错误!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>没有英雄无敌3数据!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>所选的文件不包含英雄无敌3数据!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>从所选目录检测有效的英雄无敌3数据失败。
 请选择已安装英雄无敌3的数据目录。</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>未找到英雄无敌3数据!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>提取错误!</translation>
     </message>
@@ -1567,12 +1567,12 @@ Bin (%n字节):
         <translation>提取模组数据失败</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>未找到模组数据</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>模组位于受保护的目录,请手动删除它:

+ 18 - 18
launcher/translation/czech.ts

@@ -1117,7 +1117,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation>Vyberte soubor %1...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Musíte vybrat soubor %1!</translation>
@@ -1134,24 +1134,24 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>Instalátor GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>Poskytli jste instalátor GOG Galaxy! Tento soubor neobsahuje hru. Prosím, stáhněte si záložní offline instalátor hry!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Soubory z Heroes III: HD Edition nejsou ve VCMI  podporovány.
 Vyberte prosím adresář s Heroes III: Complete Edition nebo Heroes III: Shadow of Death.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Byla nalezena neznámá nebo nepodporovaná verze Heroes III.
@@ -1159,47 +1159,47 @@ Vyberte prosím adresář s Heroes III: Complete Edition nebo Heroes III: Shadow
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>Data GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation>Nepodařilo se otevřít soubor: %1</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Chyba při rozbalování!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Nesouhlasí kontrolní součet!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Chybí data Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>Vybrané soubory neobsahují data Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Nepodařilo se detekovat platná data Heroes III ve vybraném adresáři.
 Vyberte prosím adresář s nainstalovanými daty Heroes III.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Data Heroes III nenalezena!</translation>
     </message>
@@ -1566,12 +1566,12 @@ Bin (%n bajtů):
         <translation>Extrakce modifikace selhala</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>Data modifikace nebyla nalezena</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>Modifikace se nachází v chráněném adresáři, odstraňte ji prosím ručně:

+ 18 - 18
launcher/translation/english.ts

@@ -1098,7 +1098,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation type="unfinished"></translation>
@@ -1115,69 +1115,69 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1519,12 +1519,12 @@ Bin (%n bytes):
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation type="unfinished"></translation>

+ 18 - 18
launcher/translation/finnish.ts

@@ -1098,7 +1098,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation type="unfinished"></translation>
@@ -1115,69 +1115,69 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1519,12 +1519,12 @@ Bin (%n bytes):
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation type="unfinished"></translation>

+ 18 - 18
launcher/translation/french.ts

@@ -1119,7 +1119,7 @@ L&apos;installateur hors ligne est composé de deux fichiers : &quot;.exe&quot;
         <translation>Sélectionner le fichier %1...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Vous avez sélectionné le fichier %1 !</translation>
@@ -1136,19 +1136,19 @@ L&apos;installateur hors ligne est composé de deux fichiers : &quot;.exe&quot;
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>Installateur GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Les fichiers de Heroes III: HD Edition ne sont pas pris en charge par VCMI.
 Veuillez sélectionner le répertoire contenant Heroes III: Complete Edition ou Heroes III: Shadow of Death.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Version inconnue ou non prise en charge de Heroes III détectée.
@@ -1156,52 +1156,52 @@ Veuillez sélectionner le répertoire contenant Heroes III: Complete Edition ou
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>Données GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>Vous avez fourni un installateur GOG Galaxy ! Ce fichier ne contient pas le jeu. Veuillez télécharger l&apos;installateur de sauvegarde hors ligne !</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Erreur de hachage !</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Pas de données Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>Les fichiers sélectionnés ne contiennent pas les données de Heroes III !</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Impossible de détecter des données valides de Heroes III dans le répertoire choisi.
 Veuillez sélectionner le répertoire contenant les données installées de Heroes III.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Données Heroes III introuvables !</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Erreur d&apos;extraction !</translation>
     </message>
@@ -1562,12 +1562,12 @@ Bin (%n octets):
         <translation>Échec de l&apos;extraction des données du mod</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>Les données du mod n&apos;ont pas été trouvées</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>Le mod est situé dans un répertoire protégé, veuillez le supprimer manuellement :</translation>

+ 18 - 18
launcher/translation/german.ts

@@ -1118,7 +1118,7 @@ Der Offline-Installer besteht aus zwei Dateien: „.exe“ und ‚.bin‘ - Sie
         <translation>%1 Datei auswählen...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Sie müssen %1 Datei auswählen!</translation>
@@ -1135,19 +1135,19 @@ Der Offline-Installer besteht aus zwei Dateien: „.exe“ und ‚.bin‘ - Sie
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>GOG-Installationsprogramm</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Heroes III: HD Edition Dateien werden von VCMI nicht unterstützt.
 Bitte wählt das Verzeichnis mit Heroes III: Complete Edition oder Heroes III: Shadow of Death.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Unbekannte oder nicht unterstützte Heroes III-Version gefunden.
@@ -1155,52 +1155,52 @@ Bitte wählt das Verzeichnis mit Heroes III: Complete Edition oder Heroes III: S
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>GOG-Datendatei</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation>Öffnen der Datei fehlgeschlagen: %1</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>Ein GOG Galaxy-Installationsprogramm wurde bereitgestellt! Diese Datei enthält nicht das Spiel. Bitte ladet den Offline-Backup-Installer für das Spiel herunter!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Hash-Fehler!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Keine Heroes III-Daten!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>Die ausgewählten Dateien enthalten keine Heroes III-Daten!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Es konnten keine gültigen Heroes III-Daten im gewählten Verzeichnis gefunden werden.
 Bitte wählt das Verzeichnis mit installierten Heroes III-Daten.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Heroes III Daten nicht gefunden!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Fehler beim Extrahieren!</translation>
     </message>
@@ -1561,12 +1561,12 @@ Bin (%n Bytes):
         <translation>Mod-Daten konnten nicht extrahiert werden</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>Mod-Daten wurden nicht gefunden</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>Mod befindet sich in einem geschützten Verzeichnis, bitte manuell entfernen:

+ 18 - 18
launcher/translation/greek.ts

@@ -1098,7 +1098,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation type="unfinished"></translation>
@@ -1115,69 +1115,69 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1519,12 +1519,12 @@ Bin (%n bytes):
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation type="unfinished"></translation>

+ 18 - 18
launcher/translation/hungarian.ts

@@ -1122,7 +1122,7 @@ Az offline telepítő két fájlból áll: &quot;.exe&quot; és &quot;.bin&quot;
         <translation>Válasszon ki egy %1 fájlt...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Ki kell választania egy %1 fájlt!</translation>
@@ -1139,24 +1139,24 @@ Az offline telepítő két fájlból áll: &quot;.exe&quot; és &quot;.bin&quot;
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>GOG telepítő</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>GOG Galaxy telepítőt adott meg! Ez a fájl nem tartalmazza a játékot. Kérjük, töltse le az offline biztonsági telepítőt!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>A Heroes III: HD Edition fájlokat a VCMI nem támogatja.
 Kérjük, válassza ki a Heroes III: Complete Edition vagy Heroes III: Shadow of Death verzió könyvtárát.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Ismeretlen vagy nem támogatott Heroes III verzió található.
@@ -1164,47 +1164,47 @@ Kérjük, válassza ki a Heroes III: Complete Edition vagy Heroes III: Shadow of
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>GOG adatok</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Kicsomagolási hiba!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Hash hiba!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Nincs Heroes III adat!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>A kiválasztott fájlok nem tartalmaznak Heroes III adatokat!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Nem sikerült érvényes Heroes III adatokat találni a kiválasztott könyvtárban.
 Kérjük, válassza ki az installált Heroes III adatokat tartalmazó könyvtárat.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Heroes III adatok nem találhatóak!</translation>
     </message>
@@ -1559,12 +1559,12 @@ Bin (%n bájt):
         <translation>Nem sikerült kibontani a mod adatokat</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>A mod adatai nem találhatók</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>A mod védett könyvtárban található, kérjük, távolítsa el manuálisan:

+ 18 - 18
launcher/translation/italian.ts

@@ -1118,7 +1118,7 @@ L&apos;installer offline è composto da due file: &quot;.exe&quot; e &quot;.bin&
         <translation>Seleziona il file %1...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Devi selezionare il file %1!</translation>
@@ -1135,24 +1135,24 @@ L&apos;installer offline è composto da due file: &quot;.exe&quot; e &quot;.bin&
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>Installer GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>Hai fornito un installer di GOG Galaxy! Questo file non contiene il gioco. Scarica l&apos;installer di backup offline del gioco!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>I file di Heroes III: HD Edition non sono supportati da VCMI.
 Seleziona la directory con Heroes III: Complete Edition o Heroes III: Shadow of Death.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Trovata una versione sconosciuta o non supportata di Heroes III.
@@ -1160,47 +1160,47 @@ Seleziona la directory con Heroes III: Complete Edition o Heroes III: Shadow of
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>Dati GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Errore durante l&apos;estrazione!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Errore di hash!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Nessun dato di Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>I file selezionati non contengono dati di Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Impossibile rilevare dati validi di Heroes III nella directory scelta.
 Seleziona la directory con i dati installati di Heroes III.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Dati di Heroes III non trovati!</translation>
     </message>
@@ -1561,12 +1561,12 @@ Bin (%n byte):
         <translation>Impossibile estrarre i dati del mod</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>Dati del mod non trovati</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>Il mod si trova in una directory protetta, rimuovilo manualmente:</translation>

+ 18 - 18
launcher/translation/japanese.ts

@@ -1098,7 +1098,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation type="unfinished"></translation>
@@ -1115,69 +1115,69 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1517,12 +1517,12 @@ Bin (%n bytes):
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation type="unfinished"></translation>

+ 18 - 18
launcher/translation/korean.ts

@@ -1098,7 +1098,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation type="unfinished"></translation>
@@ -1115,69 +1115,69 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1517,12 +1517,12 @@ Bin (%n bytes):
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation type="unfinished"></translation>

+ 18 - 18
launcher/translation/norwegian.ts

@@ -1098,7 +1098,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation type="unfinished"></translation>
@@ -1115,69 +1115,69 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1519,12 +1519,12 @@ Bin (%n bytes):
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation type="unfinished"></translation>

+ 18 - 18
launcher/translation/polish.ts

@@ -1119,7 +1119,7 @@ Instalator offline składa się z dwóch plików: &quot;.exe&quot; i &quot;.bin&
         <translation>Wybierz plik %1...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Musisz wybrać plik %1!</translation>
@@ -1136,19 +1136,19 @@ Instalator offline składa się z dwóch plików: &quot;.exe&quot; i &quot;.bin&
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>Instalator GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Pliki Heroes III: HD Edition nie są obsługiwane przez VCMI.  
 Wybierz katalog z Heroes III: Complete Edition lub Heroes III: Shadow of Death.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Nieznana lub nieobsługiwana wersja Heroes III została wykryta.  
@@ -1156,52 +1156,52 @@ Wybierz katalog z Heroes III: Complete Edition lub Heroes III: Shadow of Death.<
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>Dane GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>Podany plik jest instalatorem GOG Galaxy! Ten plik nie zawiera gry. Proszę pobrać zapasowy instalator offline gry!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Błąd sumy kontrolnej!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Brak danych Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>Wybrane pliki nie zawierają danych Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Nieudane znalezienie poprawnych plików Heroes III w podanej lokalizacji.
 Proszę wybrać folder z zainstalowanymi danymi Heroes III.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Nie odnaleziono danych Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Błąd wypakowywania!</translation>
     </message>
@@ -1565,12 +1565,12 @@ Bin (%n bytes):
         <translation>Nieudane wyodrębnienie danych moda</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>Nie znaleziono danych moda</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>Mod jest umiejscowiony w chronionym folderze, proszę go usunąć ręcznie:</translation>

+ 18 - 18
launcher/translation/portuguese.ts

@@ -1118,7 +1118,7 @@ O instalador offline consiste em dois arquivos: &quot;.exe&quot; e &quot;.bin&qu
         <translation>Selecionar arquivo %1...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Você precisa selecionar o arquivo %1!</translation>
@@ -1135,24 +1135,24 @@ O instalador offline consiste em dois arquivos: &quot;.exe&quot; e &quot;.bin&qu
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>Instalador GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>Você forneceu um instalador do GOG Galaxy! Este arquivo não contém o jogo. Por favor, baixe o instalador offline de backup do jogo!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Os arquivos do Heroes III: HD Edition não são suportados pelo VCMI.
 Por favor, selecione o diretório com Heroes III: Complete Edition ou Heroes III: Sombra da Morte.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Versão desconhecida ou não suportada do Heroes III encontrada.
@@ -1160,47 +1160,47 @@ Por favor, selecione o diretório com Heroes III: Complete Edition ou Heroes III
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>Dados do GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation>Falha ao abrir o arquivo: %1</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Erro ao extrair!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Erro de hash!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Nenhum dado do Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>Os arquivos selecionados não contêm dados do Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Falha ao detectar dados válidos do Heroes III no diretório escolhido.
 Por favor, selecione o diretório com os dados do Heroes III instalados.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Dados do Heroes III não encontrados!</translation>
     </message>
@@ -1561,12 +1561,12 @@ Bin (%n bytes):
         <translation>Falha ao extrair os dados do mod</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>Os dados do mod não foram encontrados</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>O mod está localizado em um diretório protegido. Remova-o manualmente:

+ 18 - 18
launcher/translation/romanian.ts

@@ -1098,7 +1098,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation type="unfinished"></translation>
@@ -1115,69 +1115,69 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1521,12 +1521,12 @@ Bin (%n bytes):
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation type="unfinished"></translation>

+ 18 - 18
launcher/translation/russian.ts

@@ -1118,7 +1118,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation>Выберите файл %1...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Вы должны выбрать файл %1!</translation>
@@ -1135,24 +1135,24 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>Установщик GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>Вы указали установщик GOG Galaxy! Этот файл не содержит игру. Пожалуйста, скачайте оффлайн установочный файл игры!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Файлы Heroes III: HD Edition не поддерживаются VCMI.
 Пожалуйста, выберите каталог с Heroes III: Complete Edition или Heroes III: Shadow of Death.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Обнаружена неизвестная или неподдерживаемая версия Heroes III.
@@ -1160,47 +1160,47 @@ Please select the directory with Heroes III: Complete Edition or Heroes III: Sha
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>Данные GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Ошибка распаковки!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Ошибка хэша!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Нет данных Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>Выбранные файлы не содержат данных Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Не удалось обнаружить корректные данные Heroes III в выбранном каталоге.
 Пожалуйста, выберите каталог с установленными данными Heroes III.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Данные Heroes III не найдены!</translation>
     </message>
@@ -1559,12 +1559,12 @@ Bin (%n байт):
         <translation>Не удалось распаковать данные мода</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>Данные мода не найдены</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>Мод находится в защищённом каталоге, пожалуйста, удалите его вручную:

+ 18 - 18
launcher/translation/spanish.ts

@@ -1122,7 +1122,7 @@ El instalador offline consta de dos archivos: &quot;.exe&quot; y &quot;.bin&quot
         <translation>Seleccionar archivo %1...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>¡Debes seleccionar el archivo %1!</translation>
@@ -1139,24 +1139,24 @@ El instalador offline consta de dos archivos: &quot;.exe&quot; y &quot;.bin&quot
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>Instalador de GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>¡Has proporcionado un instalador de GOG Galaxy! Este archivo no contiene el juego. ¡Por favor, descarga el instalador de respaldo del juego offline!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Los archivos de Heroes III: HD Edition no son compatibles con VCMI.
 Por favor, selecciona el directorio con Heroes III: Complete Edition o Heroes III: Shadow of Death.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Se ha encontrado una versión desconocida o no compatible de Heroes III.
@@ -1164,47 +1164,47 @@ Por favor, selecciona el directorio con Heroes III: Complete Edition o Heroes II
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>Datos de GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Error al extraer</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Error de hash</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>¡No hay datos de Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>Los archivos seleccionados no contienen datos de Heroes III.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>No se han detectado datos válidos de Heroes III en el directorio elegido.
 Por favor, selecciona el directorio con los datos de Heroes III instalados.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>¡Datos de Heroes III no encontrados!</translation>
     </message>
@@ -1565,12 +1565,12 @@ Bin (%n bytes):
         <translation>Error al extraer los datos del mod</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>No se encontraron datos del mod</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>El mod está ubicado en un directorio protegido, por favor elimínalo manualmente:</translation>

+ 18 - 18
launcher/translation/swedish.ts

@@ -1118,7 +1118,7 @@ När dessa två filer finns på din enhet kan VCMI börja importera nödvändiga
         <translation>Välj %1-filen...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Du behöver välja %1-filen!</translation>
@@ -1135,24 +1135,24 @@ När dessa två filer finns på din enhet kan VCMI börja importera nödvändiga
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>Offline Backup Game Installers (gog.com)</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>Du har tillhandahållit en installationsfil av GOG Galaxy! Den här filen innehåller inte spelet. Vänligen ladda ner säkerhetskopian av spelet (offline backup game installers)!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Heroes III: HD Edition-filer stöds inte av VCMI.
 Vänligen välj mappen med Heroes III: Complete Edition eller Heroes III: Shadow of Death.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Okänd eller ej stödd Heroes III-version hittades.
@@ -1160,47 +1160,47 @@ Vänligen välj mappen med Heroes III: Complete Edition eller Heroes III: Shadow
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>GOG-data</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation>Kunde inte öppna filen: %1</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Extraheringsfel!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Hashfel!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Inga Heroes III-data!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>De valda filerna innehåller inte Heroes III-data!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Lyckades inte upptäcka giltiga Heroes III-data i vald mapp.
 Vänligen välj mappen där du installerade Heroes III.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Heroes III-data hittades inte!</translation>
     </message>
@@ -1561,12 +1561,12 @@ Bin (%n byte):
         <translation>Misslyckades att extrahera modd-data</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>Moddata hittades inte</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>Modden finns i en skyddad mapp. Vänligen ta bort den manuellt:

+ 18 - 18
launcher/translation/turkish.ts

@@ -1098,7 +1098,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation type="unfinished"></translation>
@@ -1115,69 +1115,69 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1517,12 +1517,12 @@ Bin (%n bytes):
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation type="unfinished"></translation>

+ 18 - 18
launcher/translation/ukrainian.ts

@@ -1118,7 +1118,7 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
         <translation>Оберіть файл %1...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Ви повинні обрати файл %1!</translation>
@@ -1135,19 +1135,19 @@ Offline installer consists of two files: &quot;.exe&quot; and &quot;.bin&quot; -
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>Інсталятор GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Файли Heroes III: HD Edition не підтримуються VCMI.
 Будь ласка, виберіть теку з Heroes III: Complete Edition або Heroes III: Shadow of Death.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Знайдено невідому або не підтримувану версію Heroes III.
@@ -1155,52 +1155,52 @@ Please select the directory with Heroes III: Complete Edition or Heroes III: Sha
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>Дані GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>Ви надали інсталятор GOG Galaxy! Цей файл не містить гри. Будь ласка, завантажте резервну копію інсталятора гри!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Помилка хешу!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Немає файлів даних Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>Обрані файли не містять файлів з грою Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Не вдалося виявити файли Heroes III у вибраному каталозі.
 Будь ласка, виберіть теку зі встановленими даними Heroes III.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Файли даних Heroes III не знайдено!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Помилка видобування!</translation>
     </message>
@@ -1567,12 +1567,12 @@ Bin (%n байтів):
         <translation>Не вдалося видобути дані модифікації</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>Не знайдено файли даних модифікації</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>Модифікація знаходиться в захищеному каталозі, будь ласка, видаліть її вручну:

+ 18 - 18
launcher/translation/vietnamese.ts

@@ -1142,7 +1142,7 @@ Cài đặt ngoại tuyến bao gồm hai tệp tin sau: &quot;.exe&quot; và &q
         <translation>Chọn tệp tin %1...</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="376"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="377"/>
         <source>You have to select %1 file!</source>
         <comment>param is file extension</comment>
         <translation>Bạn phải chọn tệp tin %1!</translation>
@@ -1159,24 +1159,24 @@ Cài đặt ngoại tuyến bao gồm hai tệp tin sau: &quot;.exe&quot; và &q
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="334"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="385"/>
         <source>GOG installer</source>
         <translation>Trình cài đặt GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="438"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="439"/>
         <source>You&apos;ve provided a GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
         <translation>Bạn đã cung cấp bộ cài đặt GOG Galaxy! Tệp tin này không chứa dữ liệu trò chơi. Hãy tải về bộ cài đặt trò chơi Heroes III.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
         <source>Heroes III: HD Edition files are not supported by VCMI.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>VCMI không hỗ trợ các tập tin Heroes III: HD Edition.
 Hãy chọn thư mục có Heroes III: Complete Edition hoặc Heroes III: Shadow of Death.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Unknown or unsupported Heroes III version found.
 Please select the directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.</source>
         <translation>Phiên bản Heroes III không đúng hoặc không được hỗ trợ.
@@ -1184,47 +1184,47 @@ Hãy chọn thư mục có Heroes III: Complete Edition hoặc Heroes III: Shado
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="333"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="383"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="384"/>
         <source>GOG data</source>
         <translation>Dữ liệu GOG</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="369"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="370"/>
         <source>Failed to open file: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="462"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="463"/>
         <source>Extracting error!</source>
         <translation>Có lỗi khi giải nén</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="466"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="467"/>
         <source>Hash error!</source>
         <translation>Lỗi hàm Hash!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>No Heroes III data!</source>
         <translation>Không có dữ liệu Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="470"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="471"/>
         <source>Selected files do not contain Heroes III data!</source>
         <translation>Các tệp tin đã chọn không chứa dữ liệu Heroes III!</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="515"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="516"/>
         <source>Failed to detect valid Heroes III data in chosen directory.
 Please select the directory with installed Heroes III data.</source>
         <translation>Không tìm thấy dữ liệu Heroes III trong thư mục đã chọn.
 Hãy chọn đúng thư mục chứa dữ liệu Heroes III đã cài đặt.</translation>
     </message>
     <message>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="518"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="532"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="539"/>
-        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="544"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="519"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="533"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="540"/>
+        <location filename="../firstLaunch/firstlaunch_moc.cpp" line="545"/>
         <source>Heroes III data not found!</source>
         <translation>Không tìm thấy dữ liệu Heroes III!</translation>
     </message>
@@ -1578,12 +1578,12 @@ Bin (%n bytes):
         <translation>Không trích xuất được dữ liệu mod</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="251"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="256"/>
         <source>Mod data was not found</source>
         <translation>Không tìm thấy dữ liệu mod</translation>
     </message>
     <message>
-        <location filename="../modManager/modstatecontroller.cpp" line="255"/>
+        <location filename="../modManager/modstatecontroller.cpp" line="260"/>
         <source>Mod is located in a protected directory, please remove it manually:
 </source>
         <translation>Mod nằm trong thư mục được bảo vệ, hãy xóa thủ công:

+ 4 - 2
lib/CCreatureHandler.cpp

@@ -313,8 +313,8 @@ si32 CCreature::maxAmount(const TResources &res) const //how many creatures can
 }
 
 CCreature::CCreature()
+	:CBonusSystemNode(BonusNodeType::CREATURE)
 {
-	setNodeType(CBonusSystemNode::CREATURE);
 	fightValue = AIValue = growth = hordeGrowth = ammMin = ammMax = 0;
 }
 
@@ -329,7 +329,7 @@ void CCreature::addBonus(int val, BonusType type, BonusSubtypeID subtype)
 	BonusList & exported = getExportedBonusList();
 
 	BonusList existing;
-	exported.getBonuses(existing, selector, Selector::all);
+	exported.getBonuses(existing, selector);
 
 	if(existing.empty())
 	{
@@ -902,6 +902,8 @@ void CCreatureHandler::loadJsonAnimation(CCreature * cre, const JsonNode & graph
 void CCreatureHandler::loadCreatureJson(CCreature * creature, const JsonNode & config) const
 {
 	creature->animDefName = AnimationPath::fromJson(config["graphics"]["animation"]);
+	creature->mapAttackFromLeft = ImagePath::fromJson(config["graphics"]["mapAttackFromLeft"]);
+	creature->mapAttackFromRight = ImagePath::fromJson(config["graphics"]["mapAttackFromRight"]);
 
 	for(const auto & ability : config["abilities"].Struct())
 	{

+ 2 - 0
lib/CCreatureHandler.h

@@ -67,6 +67,8 @@ public:
 	std::set<CreatureID> upgrades; // IDs of creatures to which this creature can be upgraded
 
 	AnimationPath animDefName; // creature animation used during battles
+	ImagePath mapAttackFromLeft; // adventure map creature image when attacked from left
+	ImagePath mapAttackFromRight; // adventure map creature image when attacked from right
 
 	si32 iconIndex = -1; // index of icon in files like twcrport, used in tests now.
 	/// names of files with appropriate icons. Used only during loading

+ 10 - 8
lib/CCreatureSet.cpp

@@ -707,20 +707,22 @@ void CCreatureSet::serializeJson(JsonSerializeFormat & handler, const std::strin
 	}
 }
 
-CStackInstance::CStackInstance(IGameInfoCallback *cb, bool isHypothetic)
-	: CBonusSystemNode(isHypothetic)
+CStackInstance::CStackInstance(IGameInfoCallback *cb)
+	: CStackInstance(cb, BonusNodeType::STACK_INSTANCE, false)
+{}
+
+CStackInstance::CStackInstance(IGameInfoCallback *cb, BonusNodeType nodeType, bool isHypothetic)
+	: CBonusSystemNode(nodeType, isHypothetic)
 	, CStackBasicDescriptor(nullptr, 0)
 	, CArtifactSet(cb)
 	, GameCallbackHolder(cb)
 	, nativeTerrain(this, Selector::type()(BonusType::TERRAIN_NATIVE))
 	, initiative(this, Selector::type()(BonusType::STACKS_SPEED))
 	, totalExperience(0)
-{
-	setNodeType(STACK_INSTANCE);
-}
+{}
 
 CStackInstance::CStackInstance(IGameInfoCallback *cb, const CreatureID & id, TQuantity Count, bool isHypothetic)
-	: CStackInstance(cb, false)
+	: CStackInstance(cb, BonusNodeType::STACK_INSTANCE, false)
 {
 	setType(id);
 	setCount(Count);
@@ -833,6 +835,7 @@ void CStackInstance::setCount(TQuantity newCount)
 	}
 
 	CStackBasicDescriptor::setCount(newCount);
+	nodeHasChanged();
 }
 
 std::string CStackInstance::bonusToString(const std::shared_ptr<Bonus>& bonus) const
@@ -1039,14 +1042,13 @@ CCommanderInstance::CCommanderInstance(IGameInfoCallback *cb)
 {}
 
 CCommanderInstance::CCommanderInstance(IGameInfoCallback *cb, const CreatureID & id)
-	: CStackInstance(cb)
+	: CStackInstance(cb, BonusNodeType::COMMANDER, false)
 	, name("Commando")
 {
 	alive = true;
 	level = 1;
 	setCount(1);
 	setType(nullptr);
-	setNodeType (CBonusSystemNode::COMMANDER);
 	secondarySkills.resize (ECommander::SPELL_POWER + 1);
 	setType(id);
 	//TODO - parse them

+ 2 - 1
lib/CCreatureSet.h

@@ -146,7 +146,8 @@ public:
 	virtual int getLevel() const; //different for regular stack and commander
 	CreatureID getCreatureID() const; //-1 if not available
 	std::string getName() const; //plural or singular
-	CStackInstance(IGameInfoCallback *cb, bool isHypothetic	= false);
+	CStackInstance(IGameInfoCallback *cb);
+	CStackInstance(IGameInfoCallback *cb, BonusNodeType nodeType, bool isHypothetic = false);
 	CStackInstance(IGameInfoCallback *cb, const CreatureID & id, TQuantity count, bool isHypothetic = false);
 	virtual ~CStackInstance() = default;
 

+ 1 - 1
lib/CPlayerState.cpp

@@ -22,7 +22,7 @@
 VCMI_LIB_NAMESPACE_BEGIN
 
 PlayerState::PlayerState(IGameInfoCallback *cb)
-	: CBonusSystemNode(PLAYER)
+	: CBonusSystemNode(BonusNodeType::PLAYER)
 	, GameCallbackHolder(cb)
 	, color(-1)
 	, human(false)

+ 5 - 5
lib/CStack.cpp

@@ -26,7 +26,7 @@ VCMI_LIB_NAMESPACE_BEGIN
 
 ///CStack
 CStack::CStack(const CStackInstance * Base, const PlayerColor & O, int I, BattleSide Side, const SlotID & S):
-	CBonusSystemNode(STACK_BATTLE),
+	CBonusSystemNode(BonusNodeType::STACK_BATTLE),
 	base(Base),
 	ID(I),
 	typeID(Base->getId()),
@@ -40,7 +40,7 @@ CStack::CStack(const CStackInstance * Base, const PlayerColor & O, int I, Battle
 }
 
 CStack::CStack():
-	CBonusSystemNode(STACK_BATTLE),
+	CBonusSystemNode(BonusNodeType::STACK_BATTLE),
 	owner(PlayerColor::NEUTRAL),
 	slot(SlotID(255)),
 	initialPosition(BattleHex())
@@ -48,7 +48,7 @@ CStack::CStack():
 }
 
 CStack::CStack(const CStackBasicDescriptor * stack, const PlayerColor & O, int I, BattleSide Side, const SlotID & S):
-	CBonusSystemNode(STACK_BATTLE),
+	CBonusSystemNode(BonusNodeType::STACK_BATTLE),
 	ID(I),
 	typeID(stack->getId()),
 	baseAmount(stack->getCount()),
@@ -134,7 +134,7 @@ std::vector<SpellID> CStack::activeSpells() const
 		return b->type != BonusType::NONE && b->sid.as<SpellID>().toSpell() && !b->sid.as<SpellID>().toSpell()->isAdventure();
 	}));
 
-	TConstBonusListPtr spellEffects = getBonuses(selector, Selector::all, cachingStr.str());
+	TConstBonusListPtr spellEffects = getBonuses(selector, cachingStr.str());
 	for(const auto & it : *spellEffects)
 	{
 		if(!vstd::contains(ret, it->sid.as<SpellID>()))  //do not duplicate spells with multiple effects
@@ -155,7 +155,7 @@ const CGHeroInstance * CStack::getMyHero() const
 		return dynamic_cast<const CGHeroInstance *>(base->getArmy());
 	else //we are attached directly?
 		for(const CBonusSystemNode * n : getParentNodes())
-			if(n->getNodeType() == HERO)
+			if(n->getNodeType() == BonusNodeType::HERO)
 				return dynamic_cast<const CGHeroInstance *>(n);
 
 	return nullptr;

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác