Selaa lähdekoodia

Merge branch 'develop' into fix_research_spell_crash

kdmcser 11 kuukautta sitten
vanhempi
sitoutus
51e742f475
100 muutettua tiedostoa jossa 240 lisäystä ja 90 poistoa
  1. 2 3
      .github/workflows/github.yml
  2. 6 6
      AI/Nullkiller/AIGateway.cpp
  3. 5 5
      AI/Nullkiller/AIUtility.cpp
  4. 1 1
      AI/Nullkiller/Analyzers/ArmyManager.cpp
  5. 3 3
      AI/Nullkiller/Engine/PriorityEvaluator.cpp
  6. 2 2
      AI/Nullkiller/Pathfinding/AINodeStorage.cpp
  7. 3 3
      AI/VCAI/AIUtility.cpp
  8. 1 1
      AI/VCAI/ArmyManager.cpp
  9. 1 1
      AI/VCAI/Goals/CompleteQuest.cpp
  10. 1 1
      AI/VCAI/MapObjectsEvaluator.cpp
  11. 2 2
      AI/VCAI/Pathfinding/AINodeStorage.cpp
  12. 3 3
      AI/VCAI/VCAI.cpp
  13. 1 0
      AUTHORS.h
  14. 68 6
      ChangeLog.md
  15. 1 0
      Mods/vcmi/config/chinese.json
  16. 48 14
      Mods/vcmi/config/czech.json
  17. 6 1
      Mods/vcmi/config/english.json
  18. 0 0
      Mods/vcmi/config/french.json
  19. 0 0
      Mods/vcmi/config/german.json
  20. 3 1
      Mods/vcmi/config/polish.json
  21. 83 37
      Mods/vcmi/config/portuguese.json
  22. 0 0
      Mods/vcmi/config/rmg/hdmod/aroundamarsh.json
  23. 0 0
      Mods/vcmi/config/rmg/hdmod/balance.json
  24. 0 0
      Mods/vcmi/config/rmg/hdmod/blockbuster.json
  25. 0 0
      Mods/vcmi/config/rmg/hdmod/clashOfDragons.json
  26. 0 0
      Mods/vcmi/config/rmg/hdmod/coldshadowsFantasy.json
  27. 0 0
      Mods/vcmi/config/rmg/hdmod/cube.json
  28. 0 0
      Mods/vcmi/config/rmg/hdmod/diamond.json
  29. 0 0
      Mods/vcmi/config/rmg/hdmod/extreme.json
  30. 0 0
      Mods/vcmi/config/rmg/hdmod/extreme2.json
  31. 0 0
      Mods/vcmi/config/rmg/hdmod/fear.json
  32. 0 0
      Mods/vcmi/config/rmg/hdmod/frozenDragons.json
  33. 0 0
      Mods/vcmi/config/rmg/hdmod/gimlisRevenge.json
  34. 0 0
      Mods/vcmi/config/rmg/hdmod/guerilla.json
  35. 0 0
      Mods/vcmi/config/rmg/hdmod/headquarters.json
  36. 0 0
      Mods/vcmi/config/rmg/hdmod/hypercube.json
  37. 0 0
      Mods/vcmi/config/rmg/hdmod/jebusCross.json
  38. 0 0
      Mods/vcmi/config/rmg/hdmod/longRun.json
  39. 0 0
      Mods/vcmi/config/rmg/hdmod/marathon.json
  40. 0 0
      Mods/vcmi/config/rmg/hdmod/miniNostalgia.json
  41. 0 0
      Mods/vcmi/config/rmg/hdmod/nostalgia.json
  42. 0 0
      Mods/vcmi/config/rmg/hdmod/oceansEleven.json
  43. 0 0
      Mods/vcmi/config/rmg/hdmod/panic.json
  44. 0 0
      Mods/vcmi/config/rmg/hdmod/poorJebus.json
  45. 0 0
      Mods/vcmi/config/rmg/hdmod/reckless.json
  46. 0 0
      Mods/vcmi/config/rmg/hdmod/roadrunner.json
  47. 0 0
      Mods/vcmi/config/rmg/hdmod/shaaafworld.json
  48. 0 0
      Mods/vcmi/config/rmg/hdmod/skirmish.json
  49. 0 0
      Mods/vcmi/config/rmg/hdmod/speed1.json
  50. 0 0
      Mods/vcmi/config/rmg/hdmod/speed2.json
  51. 0 0
      Mods/vcmi/config/rmg/hdmod/spider.json
  52. 0 0
      Mods/vcmi/config/rmg/hdmod/superslam.json
  53. 0 0
      Mods/vcmi/config/rmg/hdmod/triad.json
  54. 0 0
      Mods/vcmi/config/rmg/hdmod/vortex.json
  55. 0 0
      Mods/vcmi/config/rmg/hdmodUnused/anarchy.json
  56. 0 0
      Mods/vcmi/config/rmg/hdmodUnused/balance m+u 200%.json
  57. 0 0
      Mods/vcmi/config/rmg/hdmodUnused/midnightMix.json
  58. 0 0
      Mods/vcmi/config/rmg/hdmodUnused/skirmish m-u 200%.json
  59. 0 0
      Mods/vcmi/config/rmg/hdmodUnused/true random.json
  60. 0 0
      Mods/vcmi/config/rmg/heroes3/dwarvenTunnels.json
  61. 0 0
      Mods/vcmi/config/rmg/heroes3/golemsAplenty.json
  62. 0 0
      Mods/vcmi/config/rmg/heroes3/meetingInMuzgob.json
  63. 0 0
      Mods/vcmi/config/rmg/heroes3/monksRetreat.json
  64. 0 0
      Mods/vcmi/config/rmg/heroes3/newcomers.json
  65. 0 0
      Mods/vcmi/config/rmg/heroes3/readyOrNot.json
  66. 0 0
      Mods/vcmi/config/rmg/heroes3/smallRing.json
  67. 0 0
      Mods/vcmi/config/rmg/heroes3/southOfHell.json
  68. 0 0
      Mods/vcmi/config/rmg/heroes3/worldsAtWar.json
  69. 0 0
      Mods/vcmi/config/rmg/heroes3unused/dragon.json
  70. 0 0
      Mods/vcmi/config/rmg/heroes3unused/gauntlet.json
  71. 0 0
      Mods/vcmi/config/rmg/heroes3unused/ring.json
  72. 0 0
      Mods/vcmi/config/rmg/heroes3unused/riseOfPhoenix.json
  73. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm0k.json
  74. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2a.json
  75. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2b(2).json
  76. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2b.json
  77. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2c.json
  78. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2f(2).json
  79. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2f.json
  80. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2h(2).json
  81. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2h.json
  82. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2i(2).json
  83. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2i.json
  84. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm4d(2).json
  85. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm4d(3).json
  86. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm4d.json
  87. 0 0
      Mods/vcmi/config/rmg/symmetric/3sb0b.json
  88. 0 0
      Mods/vcmi/config/rmg/symmetric/3sb0c.json
  89. 0 0
      Mods/vcmi/config/rmg/symmetric/3sm3d.json
  90. 0 0
      Mods/vcmi/config/rmg/symmetric/4sm0d.json
  91. 0 0
      Mods/vcmi/config/rmg/symmetric/4sm0f.json
  92. 0 0
      Mods/vcmi/config/rmg/symmetric/4sm0g.json
  93. 0 0
      Mods/vcmi/config/rmg/symmetric/4sm4e.json
  94. 0 0
      Mods/vcmi/config/rmg/symmetric/5sb0a.json
  95. 0 0
      Mods/vcmi/config/rmg/symmetric/5sb0b.json
  96. 0 0
      Mods/vcmi/config/rmg/symmetric/6lm10.json
  97. 0 0
      Mods/vcmi/config/rmg/symmetric/6lm10a.json
  98. 0 0
      Mods/vcmi/config/rmg/symmetric/6sm0b.json
  99. 0 0
      Mods/vcmi/config/rmg/symmetric/6sm0d.json
  100. 0 0
      Mods/vcmi/config/rmg/symmetric/6sm0e.json

+ 2 - 3
.github/workflows/github.yml

@@ -3,7 +3,6 @@ name: VCMI
 on:
   push:
     branches:
-      - features/*
       - beta
       - master
       - develop
@@ -76,6 +75,7 @@ jobs:
             os: windows-latest
             test: 0
             pack: 1
+            upload: 1
             pack_type: RelWithDebInfo
             extension: exe
             before_install: msvc.sh
@@ -92,7 +92,6 @@ jobs:
             os: ubuntu-24.04
             test: 0
             pack: 1
-            upload: 1
             pack_type: Release
             extension: exe
             cmake_args: -G Ninja
@@ -342,7 +341,7 @@ jobs:
             ${{github.workspace}}/**/*.pdb
 
     - name: Upload build
-      if: ${{ (matrix.upload == 1) && (github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/beta' || github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/features/')) }}
+      if: ${{ (matrix.upload == 1) && (github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/beta' || github.ref == 'refs/heads/master') }}
       continue-on-error: true
       run: |
         if [ -z '${{ env.ANDROID_APK_PATH }}' ] ; then

+ 6 - 6
AI/Nullkiller/AIGateway.cpp

@@ -1055,7 +1055,7 @@ void AIGateway::pickBestArtifacts(const CGHeroInstance * h, const CGHeroInstance
 				//FIXME: why are the above possible to be null?
 
 				bool emptySlotFound = false;
-				for(auto slot : artifact->artType->getPossibleSlots().at(target->bearerType()))
+				for(auto slot : artifact->getType()->getPossibleSlots().at(target->bearerType()))
 				{
 					if(target->isPositionFree(slot) && artifact->canBePutAt(target, slot, true)) //combined artifacts are not always allowed to move
 					{
@@ -1068,7 +1068,7 @@ void AIGateway::pickBestArtifacts(const CGHeroInstance * h, const CGHeroInstance
 				}
 				if(!emptySlotFound) //try to put that atifact in already occupied slot
 				{
-					for(auto slot : artifact->artType->getPossibleSlots().at(target->bearerType()))
+					for(auto slot : artifact->getType()->getPossibleSlots().at(target->bearerType()))
 					{
 						auto otherSlot = target->getSlot(slot);
 						if(otherSlot && otherSlot->artifact) //we need to exchange artifact for better one
@@ -1079,8 +1079,8 @@ void AIGateway::pickBestArtifacts(const CGHeroInstance * h, const CGHeroInstance
 							{
 								logAi->trace(
 									"Exchange artifacts %s <-> %s",
-									artifact->artType->getNameTranslated(),
-									otherSlot->artifact->artType->getNameTranslated());
+									artifact->getType()->getNameTranslated(),
+									otherSlot->artifact->getType()->getNameTranslated());
 
 								if(!otherSlot->artifact->canBePutAt(artHolder, location.slot, true))
 								{
@@ -1129,10 +1129,10 @@ void AIGateway::recruitCreatures(const CGDwelling * d, const CArmedInstance * re
 		{
 			for(auto stack : recruiter->Slots())
 			{
-				if(!stack.second->type)
+				if(!stack.second->getType())
 					continue;
 				
-				auto duplicatingSlot = recruiter->getSlotFor(stack.second->type);
+				auto duplicatingSlot = recruiter->getSlotFor(stack.second->getCreature());
 
 				if(duplicatingSlot != stack.first)
 				{

+ 5 - 5
AI/Nullkiller/AIUtility.cpp

@@ -193,7 +193,7 @@ bool canBeEmbarkmentPoint(const TerrainTile * t, bool fromWater)
 {
 	// TODO: Such information should be provided by pathfinder
 	// Tile must be free or with unoccupied boat
-	if(!t->blocked)
+	if(!t->blocked())
 	{
 		return true;
 	}
@@ -267,8 +267,8 @@ bool compareArmyStrength(const CArmedInstance * a1, const CArmedInstance * a2)
 
 bool compareArtifacts(const CArtifactInstance * a1, const CArtifactInstance * a2)
 {
-	auto art1 = a1->artType;
-	auto art2 = a2->artType;
+	auto art1 = a1->getType();
+	auto art2 = a2->getType();
 
 	if(art1->getPrice() == art2->getPrice())
 		return art1->valOfBonuses(BonusType::PRIMARY_SKILL) > art2->valOfBonuses(BonusType::PRIMARY_SKILL);
@@ -312,7 +312,7 @@ int getDuplicatingSlots(const CArmedInstance * army)
 
 	for(auto stack : army->Slots())
 	{
-		if(stack.second->type && army->getSlotFor(stack.second->type) != stack.first)
+		if(stack.second->getCreature() && army->getSlotFor(stack.second->getCreature()) != stack.first)
 			duplicatingSlots++;
 	}
 
@@ -387,7 +387,7 @@ bool shouldVisit(const Nullkiller * ai, const CGHeroInstance * h, const CGObject
 	{
 		for(auto slot : h->Slots())
 		{
-			if(slot.second->type->hasUpgrades())
+			if(slot.second->getType()->hasUpgrades())
 				return true; //TODO: check price?
 		}
 		return false;

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

@@ -90,7 +90,7 @@ std::vector<SlotInfo> ArmyManager::getSortedSlots(const CCreatureSet * target, c
 	{
 		for(auto & i : armyPtr->Slots())
 		{
-			auto cre = dynamic_cast<const CCreature*>(i.second->type);
+			auto cre = dynamic_cast<const CCreature*>(i.second->getType());
 			auto & slotInfp = creToPower[cre];
 
 			slotInfp.creature = cre;

+ 3 - 3
AI/Nullkiller/Engine/PriorityEvaluator.cpp

@@ -155,10 +155,10 @@ uint64_t getCreatureBankArmyReward(const CGObjectInstance * target, const CGHero
 	for (auto c : creatures)
 	{
 		//Only if hero has slot for this creature in the army
-		auto ccre = dynamic_cast<const CCreature*>(c.data.type);
+		auto ccre = dynamic_cast<const CCreature*>(c.data.getType());
 		if (hero->getSlotFor(ccre).validSlot() || duplicatingSlots > 0)
 		{
-			result += (c.data.type->getAIValue() * c.data.count) * c.chance;
+			result += (c.data.getType()->getAIValue() * c.data.count) * c.chance;
 		}
 		/*else
 		{
@@ -290,7 +290,7 @@ uint64_t RewardEvaluator::getArmyReward(
 	case Obj::CREATURE_GENERATOR4:
 		return getDwellingArmyValue(ai->cb.get(), target, checkGold);
 	case Obj::ARTIFACT:
-		return evaluateArtifactArmyValue(dynamic_cast<const CGArtifact *>(target)->storedArtifact->artType);
+		return evaluateArtifactArmyValue(dynamic_cast<const CGArtifact *>(target)->storedArtifact->getType());
 	case Obj::HERO:
 		return  relations == PlayerRelations::ENEMIES
 			? enemyArmyEliminationRewardRatio * dynamic_cast<const CGHeroInstance *>(target)->getArmyStrength()

+ 2 - 2
AI/Nullkiller/Pathfinding/AINodeStorage.cpp

@@ -130,10 +130,10 @@ void AINodeStorage::initialize(const PathfinderOptions & options, const CGameSta
 				for(pos.y = 0; pos.y < sizes.y; ++pos.y)
 				{
 					const TerrainTile & tile = gs->map->getTile(pos);
-					if (!tile.terType->isPassable())
+					if (!tile.getTerrain()->isPassable())
 						continue;
 
-					if (tile.terType->isWater())
+					if (tile.isWater())
 					{
 						resetTile(pos, ELayer::SAIL, PathfinderUtil::evaluateAccessibility<ELayer::SAIL>(pos, tile, fow, player, gs));
 						if (useFlying)

+ 3 - 3
AI/VCAI/AIUtility.cpp

@@ -186,7 +186,7 @@ bool canBeEmbarkmentPoint(const TerrainTile * t, bool fromWater)
 {
 	// TODO: Such information should be provided by pathfinder
 	// Tile must be free or with unoccupied boat
-	if(!t->blocked)
+	if(!t->blocked())
 	{
 		return true;
 	}
@@ -247,8 +247,8 @@ bool compareArmyStrength(const CArmedInstance * a1, const CArmedInstance * a2)
 
 bool compareArtifacts(const CArtifactInstance * a1, const CArtifactInstance * a2)
 {
-	auto art1 = a1->artType;
-	auto art2 = a2->artType;
+	auto art1 = a1->getType();
+	auto art2 = a2->getType();
 
 	if(art1->getPrice() == art2->getPrice())
 		return art1->valOfBonuses(BonusType::PRIMARY_SKILL) > art2->valOfBonuses(BonusType::PRIMARY_SKILL);

+ 1 - 1
AI/VCAI/ArmyManager.cpp

@@ -36,7 +36,7 @@ std::vector<SlotInfo> ArmyManager::getSortedSlots(const CCreatureSet * target, c
 	{
 		for(auto & i : armyPtr->Slots())
 		{
-			auto cre = dynamic_cast<const CCreature*>(i.second->type);
+			auto cre = dynamic_cast<const CCreature*>(i.second->getType());
 			auto & slotInfp = creToPower[cre];
 
 			slotInfp.creature = cre;

+ 1 - 1
AI/VCAI/Goals/CompleteQuest.cpp

@@ -162,7 +162,7 @@ TGoalVec CompleteQuest::missionArmy() const
 
 	for(auto creature : q.quest->mission.creatures)
 	{
-		solutions.push_back(sptr(GatherTroops(creature.type->getId(), creature.count)));
+		solutions.push_back(sptr(GatherTroops(creature.getId(), creature.count)));
 	}
 
 	return solutions;

+ 1 - 1
AI/VCAI/MapObjectsEvaluator.cpp

@@ -92,7 +92,7 @@ std::optional<int> MapObjectsEvaluator::getObjectValue(const CGObjectInstance *
 	else if(obj->ID == Obj::ARTIFACT)
 	{
 		auto artifactObject = dynamic_cast<const CGArtifact *>(obj);
-		switch(artifactObject->storedArtifact->artType->aClass)
+		switch(artifactObject->storedArtifact->getType()->aClass)
 		{
 		case CArtifact::EartClass::ART_TREASURE:
 			return 2000;

+ 2 - 2
AI/VCAI/Pathfinding/AINodeStorage.cpp

@@ -46,10 +46,10 @@ void AINodeStorage::initialize(const PathfinderOptions & options, const CGameSta
 			for(pos.y=0; pos.y < sizes.y; ++pos.y)
 			{
 				const TerrainTile & tile = gs->map->getTile(pos);
-				if(!tile.terType->isPassable())
+				if(!tile.getTerrain()->isPassable())
 					continue;
 				
-				if(tile.terType->isWater())
+				if(tile.getTerrain()->isWater())
 				{
 					resetTile(pos, ELayer::SAIL, PathfinderUtil::evaluateAccessibility<ELayer::SAIL>(pos, tile, fow, player, gs));
 					if(useFlying)

+ 3 - 3
AI/VCAI/VCAI.cpp

@@ -1180,7 +1180,7 @@ void VCAI::pickBestArtifacts(const CGHeroInstance * h, const CGHeroInstance * ot
 				//FIXME: why are the above possible to be null?
 
 				bool emptySlotFound = false;
-				for(auto slot : artifact->artType->getPossibleSlots().at(target->bearerType()))
+				for(auto slot : artifact->getType()->getPossibleSlots().at(target->bearerType()))
 				{
 					if(target->isPositionFree(slot) && artifact->canBePutAt(target, slot, true)) //combined artifacts are not always allowed to move
 					{
@@ -1193,7 +1193,7 @@ void VCAI::pickBestArtifacts(const CGHeroInstance * h, const CGHeroInstance * ot
 				}
 				if(!emptySlotFound) //try to put that atifact in already occupied slot
 				{
-					for(auto slot : artifact->artType->getPossibleSlots().at(target->bearerType()))
+					for(auto slot : artifact->getType()->getPossibleSlots().at(target->bearerType()))
 					{
 						auto otherSlot = target->getSlot(slot);
 						if(otherSlot && otherSlot->artifact) //we need to exchange artifact for better one
@@ -2818,7 +2818,7 @@ bool shouldVisit(HeroPtr h, const CGObjectInstance * obj)
 	{
 		for(auto slot : h->Slots())
 		{
-			if(slot.second->type->hasUpgrades())
+			if(slot.second->getType()->hasUpgrades())
 				return true; //TODO: check price?
 		}
 		return false;

+ 1 - 0
AUTHORS.h

@@ -46,6 +46,7 @@ const std::vector<std::vector<std::string>> contributors = {
    { "Developing", "",                     "vmarkovtsev",           ""                             },
    { "Developing", "Tom Zielinski",        "Warmonger",             "[email protected]"              },
    { "Developing", "Xiaomin Ding",         "",                      "[email protected]"        },
+   { "Developing", "Fenghuang Rumeng",     "kdmcser",               "[email protected]"             },
 
    { "Testing",    "Ben Yan",              "by003",                 "[email protected],"        },
    { "Testing",    "",                     "Misiokles",             ""                             },

+ 68 - 6
ChangeLog.md

@@ -7,15 +7,29 @@
 * Implemented adventure map overlay accessible via Alt key that highlights all interactive objects on screen
 * Implemented xBRZ upscaling filter
 * It is now possible to import data from Heroes Chronicles (gog.com installer only) as custom campaigns
+* Added simple support for spell research feature from HotA that can be enabled via mod or game configuration editing
+* Implemented automatic selection of interface scaling. Selecting interface scaling manually will restore old behavior
+* VCMI will now launch in fullscreen on desktop systems. Use F4 hotkey or toggle option in settings to restore old behavior
 
 ### General
 * Saved game size reduced by approximately 3 times, especially for large maps or games with a large number of mods.
+* Mods that modify game texts, such as descriptions of secondary skills, will now correctly override translation mods
+* Game will now correctly restore information such as hero path, order of heroes and towns, and list of sleeping heroes on loading a save game
+* Added translation for missing texts, such as random map descriptions, quick exchange buttons, wog commander abilities, moat names
+
+### Multiplayer
 * Added option to start vcmi server on randomly selected TCP port
 * Fixed potential desynchronization between server and clients on randomization of map objects if client and server run on different operating systems
+* Fixed possible freeze on receiving turn in multiplayer when player has town window opened
+* Fixed possible freeze if player is attacked by another player on first day of the week
+* If player disconnects from a multiplayer game, all other players will now receive notification in form of popup message instead of chat message
+* Fixed potentially missing disconnection notification in multiplayer if player disconnects due to connection loss
+* Game will now correctly show turn timers and simultaneous turns state on loading game
 
 ### Stability
 * Fixed possible crash on connecting bluetooth mouse during gameplay on Android
 * VCMI will now write more detailed information to log file on crash due to uncaught exception
+* Fixed crash on transfer of multiple artifacts in a backpack to another hero on starting next campaign scenario without hero that held these artifacts before
 
 ### Mechanics
 * Arrow tower will now prefer to attack more units that are viewed most dangerous instead of simply attacking top-most unit
@@ -24,15 +38,38 @@
 * Map events and town events are now triggered on start of turn of player affected by event, in line with H3 instead of triggering on start of new day for all players
 * Neutral towns should now have initial garrison and weekly growth of garrison identical to H3
 * It is now possible to buy a new war machine in town if hero has different war machine in the slot
+* Fixed possible integer overflow if hero has unit with total AI value of over 2^31
+* Unicorn Glade in Rampart now correctly requires Dendroid Arches and not Homestead
+* Game will no longer place obstacles on ship-to-ship battles, in line with H3
+* Game will now place obstacles in battles in villages (towns without forts)
+* Battles in villages (towns without forts) now always occur on battlefield of native terrain
+* Fixed pathfinding through subterranean gates located on right edge of the map or next to terra incognita
+* Chain Lightning will now skip over creatures that are immune to this spell instead of targeting them but dealing no damage
+* Commanders spell resistance now uses golem-like logic which reduces damage instead of using dwarf-style change to block spell
+* It is now possible to target empty hex for shooters with area attack, such as Magog or Lich
+
+### Video / Audio
+* Fixed playback of audio stream with different formats from video files in some Heroes 3 versions
+* Video playback will not be replaced by a black square when another dialogue box is on top of the video.
+* When resuming video playback, the video will now be continued instead of being restarted.
+* Reduced video decompression artefacts for video formats that store RGB rather than YUV data.
+* Intro videos are now played inside a frame on resolutions higher than 800x600 instead of filling entire screen
+* Re-enabled idle animations for Conflux creatures in battles
+* .webm video with vp8 / vp9 codec are now supported on every platform
+* It is now possible to provide external audio stream for a video file (e.g. for translations)
+* It is now possible to provide external subtitles for a video file
+* Game will now correctly resume playback of terrain music on closing scenario information window in campaigns instead of playing main theme
+* Background music theme will now play at lower volume while intro speech in campaign intro / outro is playing
+* Added workaround for playback of corrupted `BladeFWCampaign.mp3` music file
+* Fixed computation of audio length for formats other than .wav. This fixes incorrect text scrolling speed in campaign intro/outro
+* Game will now use Noto family true type font to display characters not preset in Heroes III fonts
+* Added option to scale all in-game fonts when scalable true type fonts are in use
 
 ### Interface
+* It is now possible to search for a map object using Ctrl+F hotkey
 * Added option to drag map with right-click
 * Added hotkeys to reorder list of owned towns or heroes
 * The number of units resurrected using the Life Drain ability is now written to the combat log.
-* Fixed playback of audio stream with different formats from video files in some Heroes 3 versions
-* Video playback will not be replaced by a black square when another dialogue box is on top of the video.
-* When resuming video playback, the video will now be continued instead of being restarted.
-* Reduced video decompression artefacts for video formats that store RGB rather than YUV data.
 * Fixed order of popup dialogs after battle.
 * Right-click on wandering monster on adventure map will now also show creature level and faction it belongs to
 * Added additional information to map right-click popup dialog: map author, map creation date, map version
@@ -47,13 +84,22 @@
 * Fixed hero path not updating correctly after hiring or dismissing creatures
 * Fixed missing description of a stack artifact when accessed through unit window
 * Fixed text overflow on campaign scenario window if campaign name is too long
-* Intro videos are now played inside a frame on resolutions higher than 800x600 instead of filling entire screen
+* Recruiting hero in town will now play "new construction" sound
+* Game will now correctly update displayed hero path when hiring or dismissing creatures that give movement penalty
+* Game will now show level, faction and attack range of wandering monsters in right-click popup window
+* Hovering over owned hero will now show movement points information in status bar
+* Quick backpack window is now also accessible via Shift+mouse click, similar to HD Mod
+* It is now possible to sort artifacts in backpack by cost, slot, or rarity class
+* Fixed incorrect display of names of VCMI maps in scenario selection if multiple VCMI map are present in list
 
 ### Random Maps Generator
 * Implemented connection option 'forcePortal'
 * It is now possible to connect zone to itself using pair of portals
 * It is now possible for a random map template to change game settings
 * Road settings will now be correctly loaded when opening random map setup tab
+* Added support for banning objects per zones
+* Added support for customizing objects frequency, value, and count per zone
+* Fixed values of Pandora Boxes with creatures to be in line with H3:SoD
 
 ### Campaigns
 * It is now possible to use .zip archive for VCMI campaigns instead of raw gzip stream
@@ -65,6 +111,7 @@
 * Added support for custom region definitions (such as background images) for VCMI campaigns 
 
 ### AI
+* VCMI will now use BattleAI for battles with neutral enemies by default
 * Fixed bug where BattleAI attempts to move double-wide unit to an unreachable hex
 * Fixed several cases where Nullkiller AI can count same dangerous object twice, doubling expected army loss.
 * Nullkiller is now capable of visiting configurable objects from mods
@@ -74,6 +121,8 @@
 * Fixed case where BattleAI will go around the map to attack ranged units if direct path is blocked by another unit
 * Fixed evaluation of effects of waiting if unit is under haste effect by Battle AI
 * Battle AI can now use location spells
+* Battle AI will now correctly avoid moving flying units into dangerous obstacles such as moat
+* Fixed possible crash on AI attempting to visit town that is already being visited by this hero
 
 ### Launcher
 * Added Swedish translation
@@ -81,13 +130,23 @@
 ### Map Editor
 * Implemented tracking of building requirements for Building Dialog
 * Added build/demolish/enable/disable all buildings options to Building Dialog in town properties
+* Implemented configuration of patrol radius for heroes
 * It is now possible to set spells allowed or required to be present in Mages Guild
 * It is now possible to add timed events to a town
 * Fixed editor not marking mod as dependency if spells from mod are used in town Mages Guild or in hero starting spells
 * It is now possible to choose road types for random map generation in editor
 * Validator will now warn in case if map has players with no heroes or towns
+* Fixed broken transparency handling on some adventure map objects from mods
+* Fixed duplicated list of spells in Mage Guild in copy-pasted towns
+* Removed separate versioning of map editor. Map editor now has same version as VCMI
+* Timed events interfaces now counts days from 1, instead of from 0
 
 ### Modding
+* Added support for configurable flaggable objects that can provide bonuses or daily income to owning player
+* Added support for soft dependencies for mods, that only affect mod loading order (and as result - override order), without requiring dependent mod or allowing access to its identifiers
+* It is now possible to provide translations for mods that modify strings from original game, such as secondary skill descriptions
+* It is now possible to embed json data directly into mod.json instead of using list of files
+* Implemented detection of potential conflicts between mods. To enable, open Launcher and set "Mod Validation" option to "Full"
 * Fixed multiple issues with configurable town buildings
 * Added documentation for configurable town buildings. See docs/Moddders/Entities_Format/Town_Buildings_Format.md
 * Replaced some of hardcoded town buildings with configurable buildings. These building types are now deprecated and will be removed in future.
@@ -95,7 +154,9 @@
 * It is now possible to add guards to a configurable objects. All H3 creature banks are now implemented as configurable object.
 * It is now possible to define starting position of units in a guarded configurable object
 * Added `canCastWithoutSkip` parameter to a spell. If such spell is cast by a creature, its turn will not end after a spellcast
+* Added `castOnlyOnSelf` parameter to a spell. Creature that can cast this spell can only cast it on themselves
 * Mod can now provide pregenerated assets in place of autogenerated, such as large spellbook.
+* Added support for 'fused' artifacts, as alternative to combined artifacts
 * Added support for custom music and opening sound for a battlefield
 * Added support for multiple music tracks for towns
 * Added support for multiple music tracks for terrains on adventure map
@@ -108,11 +169,12 @@
 * Town building can now define provided fortifications - health of walls, towers, presence of moat, identifier of creature shooter on tower
 * Added DISINTEGRATE bonus
 * Added INVINCIBLE bonus
+* Added PRISM_HEX_ATTACK_BREATH bonus
 * Added THIEVES_GUILD_ACCESS bonus that changes amount of information available in thieves guild
 * TimesStackLevelUpdater now supports commanders
 * Black market restock period setting now correctly restocks on specified date instead of restocking on all dates other than specified one
-* Game now supports vp8 and vp9 encoding for video files on all platforms
 * Json Validator will now attempt to detect typos when encountering unknown property in Json
+* Added `translate missing` command that will export only untranslated strings into `translationsMissing` directory, separated per mod
 
 # 1.5.6 -> 1.5.7
 

+ 1 - 0
Mods/vcmi/config/vcmi/chinese.json → Mods/vcmi/config/chinese.json

@@ -176,6 +176,7 @@
 	"vcmi.server.errors.modsToEnable"    : "{需要启用的mod列表}",
 	"vcmi.server.errors.modsToDisable"   : "{需要禁用的mod列表}",
 	"vcmi.server.errors.modNoDependency" : "读取mod包 {'%s'}失败!\n 需要的mod {'%s'} 没有安装或无效!\n",
+	"vcmi.server.errors.modDependencyLoop" : "读取mod包 {'%s'}失败!\n 这个mod可能存在循环(软)依赖!",
 	"vcmi.server.errors.modConflict" : "读取的mod包 {'%s'}无法运行!\n 与另一个mod {'%s'}冲突!\n",
 	"vcmi.server.errors.unknownEntity" : "加载保存失败! 在保存的游戏中发现未知实体'%s'! 保存可能与当前安装的mod版本不兼容!",
 

+ 48 - 14
Mods/vcmi/config/vcmi/czech.json → Mods/vcmi/config/czech.json

@@ -28,6 +28,13 @@
 	"vcmi.adventureMap.movementPointsHeroInfo" 			 : "(Body pohybu: %REMAINING / %POINTS)",
 	"vcmi.adventureMap.replayOpponentTurnNotImplemented" : "Omlouváme se, přehrání tahu soupeře ještě není implementováno!",
 
+	"vcmi.bonusSource.artifact" : "Artefakt",
+	"vcmi.bonusSource.creature" : "Schopnost",
+	"vcmi.bonusSource.spell" : "Kouzlo",
+	"vcmi.bonusSource.hero" : "Hrdina",
+	"vcmi.bonusSource.commander" : "Velitel",
+	"vcmi.bonusSource.other" : "Ostatní",
+
 	"vcmi.capitalColors.0" : "Červený",
 	"vcmi.capitalColors.1" : "Modrý",
 	"vcmi.capitalColors.2" : "Hnědý",
@@ -36,19 +43,25 @@
 	"vcmi.capitalColors.5" : "Fialový",
 	"vcmi.capitalColors.6" : "Tyrkysový",
 	"vcmi.capitalColors.7" : "Růžový",
-	
+
 	"vcmi.heroOverview.startingArmy" : "Počáteční jednotky",
 	"vcmi.heroOverview.warMachine" : "Bojové stroje",
 	"vcmi.heroOverview.secondarySkills" : "Druhotné schopnosti",
 	"vcmi.heroOverview.spells" : "Kouzla",
-	
+
+	"vcmi.quickExchange.moveUnit" : "Přesunout jednotku",
+	"vcmi.quickExchange.moveAllUnits" : "Přesunout všechny jednotky",
+	"vcmi.quickExchange.swapAllUnits" : "Vyměnit armády",
+	"vcmi.quickExchange.moveAllArtifacts" : "Přesunout všechny artefakty",
+	"vcmi.quickExchange.swapAllArtifacts" : "Vyměnit artefakt",
+
 	"vcmi.radialWheel.mergeSameUnit" : "Sloučit stejné jednotky",
 	"vcmi.radialWheel.fillSingleUnit" : "Vyplnit jednou jednotkou",
 	"vcmi.radialWheel.splitSingleUnit" : "Rozdělit jedinou jednotku",
 	"vcmi.radialWheel.splitUnitEqually" : "Rozdělit jednotky rovnoměrně",
 	"vcmi.radialWheel.moveUnit" : "Přesunout jednotky do jiného oddílu",
 	"vcmi.radialWheel.splitUnit" : "Rozdělit jednotku do jiné pozice",
-	
+
 	"vcmi.radialWheel.heroGetArmy" : "Získat armádu jiného hrdiny",
 	"vcmi.radialWheel.heroSwapArmy" : "Vyměnit armádu s jiným hrdinou",
 	"vcmi.radialWheel.heroExchange" : "Otevřít výměnu hrdinů",
@@ -61,7 +74,17 @@
 	"vcmi.radialWheel.moveDown" : "Posunout níže",
 	"vcmi.radialWheel.moveBottom" : "Přesunout dolů",
 
-	"vcmi.spellBook.search" : "Hledat kouzlo",
+	"vcmi.randomMap.description" : "Mapa vytvořená Generátorem náhodných map.\nŠablona: %s, rozměry: %dx%d, úroveň: %d, hráči: %d, AI hráči: %d, množství vody: %s, síla jednotek: %s, VCMI mapa",
+	"vcmi.randomMap.description.isHuman" : ", %s je lidský hráč",
+	"vcmi.randomMap.description.townChoice" : ", volba města pro %s je %s",
+	"vcmi.randomMap.description.water.none" : "žádná",
+	"vcmi.randomMap.description.water.normal" : "normální",
+	"vcmi.randomMap.description.water.islands" : "ostrovy",
+	"vcmi.randomMap.description.monster.weak" : "nízká",
+	"vcmi.randomMap.description.monster.normal" : "normální",
+	"vcmi.randomMap.description.monster.strong" : "vysoká",
+
+	"vcmi.spellBook.search" : "Hledat",
 
 	"vcmi.spellResearch.canNotAfford" : "Nemáte dostatek prostředků k nahrazení {%SPELL1} za {%SPELL2}. Stále však můžete toto kouzlo zrušit a pokračovat ve výzkumu kouzel.",
 	"vcmi.spellResearch.comeAgain" : "Výzkum už byl dnes proveden. Vraťte se zítra.",
@@ -90,14 +113,20 @@
 	"vcmi.lobby.handicap.resource" : "Dává hráčům odpovídající zdroje navíc k běžným startovním zdrojům. Jsou povoleny záporné hodnoty, ale jsou omezeny na celkovou hodnotu 0 (hráč nikdy nezačíná se zápornými zdroji).",
 	"vcmi.lobby.handicap.income" : "Mění různé příjmy hráče podle procent. Výsledek je zaokrouhlen nahoru.",
 	"vcmi.lobby.handicap.growth" : "Mění rychlost růstu jednotel v městech vlastněných hráčem. Výsledek je zaokrouhlen nahoru.",
-		
+	"vcmi.lobby.deleteUnsupportedSave" : "Nalezeny nepodporované uložené hry (např. z předchozích verzí).\n\nChcete je odstranit?",
+	"vcmi.lobby.deleteSaveGameTitle" : "Vyberte uloženou hru k odstranění",
+	"vcmi.lobby.deleteMapTitle" : "Vyberte scénář k odstranění",
+	"vcmi.lobby.deleteFile" : "Chcete smazat následující soubor?",
+	"vcmi.lobby.deleteFolder" : "Chcete smazat následující složku?",
+	"vcmi.lobby.deleteMode" : "Přepnout do režimu mazání a zpět",
+
 	"vcmi.lobby.login.title" : "Online lobby VCMI",
 	"vcmi.lobby.login.username" : "Uživatelské jméno:",
 	"vcmi.lobby.login.connecting" : "Připojování...",
 	"vcmi.lobby.login.error" : "Chyba při připojování: %s",
 	"vcmi.lobby.login.create" : "Nový účet",
 	"vcmi.lobby.login.login" : "Přihlásit se",
-	"vcmi.lobby.login.as" : "Přilásit se jako %s",
+	"vcmi.lobby.login.as" : "Přihlásit se jako %s",
 	"vcmi.lobby.header.rooms" : "Herní místnosti - %d",
 	"vcmi.lobby.header.channels" : "Kanály konverzace",
 	"vcmi.lobby.header.chat.global" : "Globální konverzace hry - %s", // %s -> language name
@@ -159,9 +188,10 @@
 	"vcmi.server.errors.modsToEnable"    : "{Následující modifikace jsou nutné pro načtení hry}",
 	"vcmi.server.errors.modsToDisable"   : "{Následující modifikace musí být zakázány}",
 	"vcmi.server.errors.modNoDependency" : "Nelze načíst modifikaci {'%s'}!\n Závisí na modifikaci {'%s'}, která není aktivní!\n",
+	"vcmi.server.errors.modDependencyLoop" : "Nelze načíst modifikaci {'%s'}!\n Modifikace může být součástí (nepřímé) závislostní smyčky.",
 	"vcmi.server.errors.modConflict" : "Nelze načíst modifikaci {'%s'}!\n Je v kolizi s aktivní modifikací {'%s'}!\n",
 	"vcmi.server.errors.unknownEntity" : "Nelze načíst uloženou pozici! Neznámá entita '%s' nalezena v uložené pozici! Uložná pozice nemusí být kompatibilní s aktuálními verzemi modifikací!",
-	
+
 	"vcmi.dimensionDoor.seaToLandError" : "Pomocí dimenzní brány není možné se teleportovat z moře na pevninu nebo naopak.",
 
 	"vcmi.settingsMainWindow.generalTab.hover" : "Obecné",
@@ -307,13 +337,13 @@
 	"vcmi.battleWindow.damageEstimation.damage.1" : "%d poškození",
 	"vcmi.battleWindow.damageEstimation.kills" : "%d zahyne",
 	"vcmi.battleWindow.damageEstimation.kills.1" : "%d zahyne",
-	
+
 	"vcmi.battleWindow.damageRetaliation.will" : "Provede odvetu ",
 	"vcmi.battleWindow.damageRetaliation.may" : "Může provést odvetu",
 	"vcmi.battleWindow.damageRetaliation.never" : "Neprovede odvetu.",
 	"vcmi.battleWindow.damageRetaliation.damage" : "(%DAMAGE).",
 	"vcmi.battleWindow.damageRetaliation.damageKills" : "(%DAMAGE, %KILLS).",
-	
+
 	"vcmi.battleWindow.killed" : "Zabito",
 	"vcmi.battleWindow.accurateShot.resultDescription.0" : "%d %s bylo zabito přesnými zásahy!",
 	"vcmi.battleWindow.accurateShot.resultDescription.1" : "%d %s byl zabit přesným zásahem!",
@@ -428,7 +458,7 @@
 	"vcmi.optionsTab.simturns.blocked1"       : "Souběžně: 1 týden, setkání zablokována",
 	"vcmi.optionsTab.simturns.blocked2"       : "Souběžně: 2 týdny, setkání zablokována",
 	"vcmi.optionsTab.simturns.blocked4"       : "Souběžně: 1 měsíc, setkání zablokována",
-	
+
 	// Translation note: translate strings below using form that is correct for "0 days", "1 day" and "2 days" in your language
 	// Using this information, VCMI will automatically select correct plural form for every possible amount
 	"vcmi.optionsTab.simturns.days.0" : " %d dní",
@@ -472,7 +502,7 @@
 	"vcmi.stackExperience.rank.8" : "Elitní",
 	"vcmi.stackExperience.rank.9" : "Mistr",
 	"vcmi.stackExperience.rank.10" : "Eso",
-	
+
 	// Strings for HotA Seer Hut / Quest Guards
 	"core.seerhut.quest.heroClass.complete.0" : "Ah, vy jste %s. Tady máte dárek. Přijmete ho?",
 	"core.seerhut.quest.heroClass.complete.1" : "Ah, vy jste %s. Tady máte dárek. Přijmete ho?",
@@ -504,7 +534,7 @@
 	"core.seerhut.quest.heroClass.visit.3" : "Stráže zde povolí průchod pouze %s.",
 	"core.seerhut.quest.heroClass.visit.4" : "Stráže zde povolí průchod pouze %s.",
 	"core.seerhut.quest.heroClass.visit.5" : "Stráže zde povolí průchod pouze %s.",
-	
+
 	"core.seerhut.quest.reachDate.complete.0" : "Jsem nyní volný. Tady máte, co jsem pro vás měl. Přijmete to?",
 	"core.seerhut.quest.reachDate.complete.1" : "Jsem nyní volný. Tady máte, co jsem pro vás měl. Přijmete to?",
 	"core.seerhut.quest.reachDate.complete.2" : "Jsem nyní volný. Tady máte, co jsem pro vás měl. Přijmete to?",
@@ -536,6 +566,8 @@
 	"core.seerhut.quest.reachDate.visit.4" : "Zavřeno do %s.",
 	"core.seerhut.quest.reachDate.visit.5" : "Zavřeno do %s.",
 
+	"mapObject.core.hillFort.object.description" : "Zde můžeš vylepšit jednotky. Vylepšení jednotek úrovně 1 až 4 je zde levnější než v jejich domovském městě.",
+
 	"core.bonus.ADDITIONAL_ATTACK.name": "Dvojitý útok",
 	"core.bonus.ADDITIONAL_ATTACK.description": "Útočí dvakrát",
 	"core.bonus.ADDITIONAL_RETALIATION.name": "Další odvetné útoky",
@@ -687,5 +719,7 @@
 	"core.bonus.DISINTEGRATE.name": "Rozpad",
 	"core.bonus.DISINTEGRATE.description": "Po smrti nezůstane žádné tělo",
 	"core.bonus.INVINCIBLE.name": "Neporazitelný",
-	"core.bonus.INVINCIBLE.description": "Nelze ovlivnit žádným efektem"
-}
+	"core.bonus.INVINCIBLE.description": "Nelze ovlivnit žádným efektem",
+	"core.bonus.PRISM_HEX_ATTACK_BREATH.name": "Trojitý dech",
+	"core.bonus.PRISM_HEX_ATTACK_BREATH.description": "Útok trojitým dechem (útok přes 3 směry)"
+}

+ 6 - 1
Mods/vcmi/config/vcmi/english.json → Mods/vcmi/config/english.json

@@ -176,6 +176,7 @@
 	"vcmi.server.errors.modsToEnable"    : "{Following mods are required}",
 	"vcmi.server.errors.modsToDisable"   : "{Following mods must be disabled}",
 	"vcmi.server.errors.modNoDependency" : "Failed to load mod {'%s'}!\n It depends on mod {'%s'} which is not active!\n",
+	"vcmi.server.errors.modDependencyLoop" : "Failed to load mod {'%s'}!\n It maybe in a (soft) dependency loop.",
 	"vcmi.server.errors.modConflict" : "Failed to load mod {'%s'}!\n Conflicts with active mod {'%s'}!\n",
 	"vcmi.server.errors.unknownEntity" : "Failed to load save! Unknown entity '%s' found in saved game! Save may not be compatible with currently installed version of mods!",
 	
@@ -552,7 +553,9 @@
 	"core.seerhut.quest.reachDate.visit.3" : "Closed till %s.",
 	"core.seerhut.quest.reachDate.visit.4" : "Closed till %s.",
 	"core.seerhut.quest.reachDate.visit.5" : "Closed till %s.",
-
+	
+	"mapObject.core.hillFort.object.description" : "Upgrades creatures. Levels 1 - 4 are less expensive than in associated town.",
+	
 	"core.bonus.ADDITIONAL_ATTACK.name": "Double Strike",
 	"core.bonus.ADDITIONAL_ATTACK.description": "Attacks twice",
 	"core.bonus.ADDITIONAL_RETALIATION.name": "Additional retaliations",
@@ -705,6 +708,8 @@
 	"core.bonus.DISINTEGRATE.description": "No corpse remains after death",
 	"core.bonus.INVINCIBLE.name": "Invincible",
 	"core.bonus.INVINCIBLE.description": "Cannot be affected by anything",
+	"core.bonus.MECHANICAL.name": "Mechanical",
+	"core.bonus.MECHANICAL.description": "Immunity to many effects, repairable",
 	"core.bonus.PRISM_HEX_ATTACK_BREATH.name": "Prism Breath",
 	"core.bonus.PRISM_HEX_ATTACK_BREATH.description": "Prism Breath Attack (three directions)"
 }

+ 0 - 0
Mods/vcmi/config/vcmi/french.json → Mods/vcmi/config/french.json


+ 0 - 0
Mods/vcmi/config/vcmi/german.json → Mods/vcmi/config/german.json


+ 3 - 1
Mods/vcmi/config/vcmi/polish.json → Mods/vcmi/config/polish.json

@@ -532,7 +532,9 @@
 	"core.seerhut.quest.reachDate.visit.3" : "Zamknięte do %s.",
 	"core.seerhut.quest.reachDate.visit.4" : "Zamknięte do %s.",
 	"core.seerhut.quest.reachDate.visit.5" : "Zamknięte do %s.",
-
+	
+	"mapObject.core.hillFort.object.description" : "Ulepsza jednostki. Koszt ulepszenia dla poziomów 1 - 4 jest bardziej korzystny niż w mieście.",
+	
 	"core.bonus.ADDITIONAL_ATTACK.name": "Podwójne Uderzenie",
 	"core.bonus.ADDITIONAL_ATTACK.description": "Atakuje dwa razy",
 	"core.bonus.ADDITIONAL_RETALIATION.name": "Dodatkowy odwet",

+ 83 - 37
Mods/vcmi/config/vcmi/portuguese.json → Mods/vcmi/config/portuguese.json

@@ -15,6 +15,8 @@
 	"vcmi.adventureMap.monsterLevel"            : "\n\nNível %LEVEL, unidade %TOWN de ataque %ATTACK_TYPE",
 	"vcmi.adventureMap.monsterMeleeType"        : "corpo a corpo",
 	"vcmi.adventureMap.monsterRangedType"       : "à distância",
+	"vcmi.adventureMap.search.hover"            : "Procurar objeto no mapa",
+	"vcmi.adventureMap.search.help"             : "Selecione o objeto para procurar no mapa.",
 
 	"vcmi.adventureMap.confirmRestartGame"               : "Tem certeza de que deseja reiniciar o jogo?",
 	"vcmi.adventureMap.noTownWithMarket"                 : "Não há mercados disponíveis!",
@@ -40,6 +42,12 @@
 	"vcmi.heroOverview.secondarySkills" : "Habilid. Secundárias",
 	"vcmi.heroOverview.spells" : "Feitiços",
 	
+	"vcmi.quickExchange.moveUnit" : "Mover Unidade",
+	"vcmi.quickExchange.moveAllUnits" : "Mover Todas as Unidades",
+	"vcmi.quickExchange.swapAllUnits" : "Trocar Exércitos",
+	"vcmi.quickExchange.moveAllArtifacts" : "Mover Todos os Artefatos",
+	"vcmi.quickExchange.swapAllArtifacts" : "Trocar Artefato",
+	
 	"vcmi.radialWheel.mergeSameUnit" : "Mesclar criaturas iguais",
 	"vcmi.radialWheel.fillSingleUnit" : "Preencher com criaturas únicas",
 	"vcmi.radialWheel.splitSingleUnit" : "Dividir uma criatura única",
@@ -58,6 +66,16 @@
 	"vcmi.radialWheel.moveUp" : "Mover para cima",
 	"vcmi.radialWheel.moveDown" : "Mover para baixo",
 	"vcmi.radialWheel.moveBottom" : "Mover para o fundo",
+	
+	"vcmi.randomMap.description" : "Mapa criado pelo Gerador de Mapas Aleatórios.\nO modelo foi %s, tamanho %dx%d, níveis %d, jogadores %d, computadores %d, água %s, monstros %s, mapa VCMI",
+	"vcmi.randomMap.description.isHuman" : ", %s é humano",
+	"vcmi.randomMap.description.townChoice" : ", a escolha de cidade de %s é %s",
+	"vcmi.randomMap.description.water.none" : "nenhuma",
+	"vcmi.randomMap.description.water.normal" : "normal",
+	"vcmi.randomMap.description.water.islands" : "ilhas",
+	"vcmi.randomMap.description.monster.weak" : "fraco",
+	"vcmi.randomMap.description.monster.normal" : "normal",
+	"vcmi.randomMap.description.monster.strong" : "forte",
 
 	"vcmi.spellBook.search" : "Procurar...",
 
@@ -94,8 +112,8 @@
 	"vcmi.lobby.login.connecting" : "Conectando...",
 	"vcmi.lobby.login.error" : "Erro de conexão: %s",
 	"vcmi.lobby.login.create" : "Nova Conta",
-	"vcmi.lobby.login.login" : "Login",
-	"vcmi.lobby.login.as" : "Logar como %s",
+	"vcmi.lobby.login.login" : "Entrar",
+	"vcmi.lobby.login.as" : "Entrar como %s",
 	"vcmi.lobby.header.rooms" : "Salas de Jogo - %d",
 	"vcmi.lobby.header.channels" : "Canais de Bate-papo",
 	"vcmi.lobby.header.chat.global" : "Bate-papo Global do Jogo - %s", // %s -> nome do idioma
@@ -156,9 +174,9 @@
 	"vcmi.server.errors.existingProcess" : "Outro processo do servidor VCMI está em execução. Por favor, termine-o antes de iniciar um novo jogo.",
 	"vcmi.server.errors.modsToEnable"    : "{Os seguintes mods são necessários}",
 	"vcmi.server.errors.modsToDisable"   : "{Os seguintes mods devem ser desativados}",
-	"vcmi.server.errors.modNoDependency" : "Falha ao carregar o mod {'%s'}!\n Ele depende do mod {'%s'} que não está ativo!\n",
-	"vcmi.server.errors.modConflict" : "Falha ao carregar o mod {'%s'}!\n Conflita com o mod ativo {'%s'}!\n",
-	"vcmi.server.errors.unknownEntity" : "Falha ao carregar o salvamento! Entidade desconhecida '%s' encontrada no jogo salvo! O salvamento pode não ser compatível com a versão atualmente instalada dos mods!",
+	"vcmi.server.errors.modNoDependency" : "Falha ao carregar o mod {'%s'}!\n Ele depende do mod {'%s'}, que não está ativo!\n",
+	"vcmi.server.errors.modConflict" : "Falha ao carregar o mod {'%s'}!\n Conflito com o mod ativo {'%s'}!\n",
+	"vcmi.server.errors.unknownEntity" : "Falha ao carregar o jogo salvo! Entidade desconhecida '%s' encontrada no jogo salvo! O jogo salvo pode não ser compatível com a versão atualmente instalada dos mods!",
 	
 	"vcmi.dimensionDoor.seaToLandError" : "Não é possível teleportar do mar para a terra ou vice-versa com uma Porta Dimensional.",
 
@@ -211,11 +229,11 @@
 	"vcmi.systemOptions.fullscreenExclusive.hover"  : "Tela Cheia (exclusiva)",
 	"vcmi.systemOptions.fullscreenExclusive.help"   : "{Tela Cheia}\n\nSe selecionado, o VCMI será executado em modo de tela cheia exclusiva. Neste modo, o jogo mudará a resolução do monitor para a resolução selecionada.",
 	"vcmi.systemOptions.resolutionButton.hover" : "Resolução: %wx%h",
-	"vcmi.systemOptions.resolutionButton.help"  : "{Selecionar Resolução}\n\nMuda a resolução da tela do jogo.",
+	"vcmi.systemOptions.resolutionButton.help"  : "{Seleciona a Resolução}\n\nMuda a resolução da tela do jogo.",
 	"vcmi.systemOptions.resolutionMenu.hover"   : "Selecionar Resolução",
 	"vcmi.systemOptions.resolutionMenu.help"    : "Muda a resolução da tela do jogo.",
 	"vcmi.systemOptions.scalingButton.hover"   : "Escala da Interface: %p%",
-	"vcmi.systemOptions.scalingButton.help"    : "{Escala da Interface}\n\nAlterar escala da interface do jogo.",
+	"vcmi.systemOptions.scalingButton.help"    : "{Escala da Interface}\n\nAltera a escala da interface do jogo.",
 	"vcmi.systemOptions.scalingMenu.hover"     : "Selecionar Escala da Interface",
 	"vcmi.systemOptions.scalingMenu.help"      : "Altera a escala da interface do jogo.",
 	"vcmi.systemOptions.longTouchButton.hover"   : "Intervalo de Toque Longo: %d ms", // Translation note: "ms" = "milliseconds"
@@ -224,15 +242,15 @@
 	"vcmi.systemOptions.longTouchMenu.help"      : "Muda a duração do intervalo de toque longo.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d milissegundos",
 	"vcmi.systemOptions.framerateButton.hover"  : "Mostrar FPS",
-	"vcmi.systemOptions.framerateButton.help"   : "{Mostrar FPS}\n\nAtiva ou desativa a visibilidade do contador de Quadros Por Segundo no canto da janela do jogo.",
-	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Resposta tátil",
-	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Resposta tátil}\n\nAtiva ou desativa a resposta tátil nos toques na tela.",
+	"vcmi.systemOptions.framerateButton.help"   : "{Mostra os Quadros Por Segundo}\n\nAtiva ou desativa a visibilidade do contador de Quadros Por Segundo no canto da janela do jogo.",
+	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Resposta Tátil",
+	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Resposta Tátil}\n\nAtiva ou desativa a resposta tátil nos toques na tela.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Aprimoramentos da Interface",
-	"vcmi.systemOptions.enableUiEnhancementsButton.help"   : "{Aprimoramentos da Interface}\n\nAtiva ou desativa várias melhorias de interface. Como um botão de mochila etc. Desative para ter uma experiência mais clássica.",
+	"vcmi.systemOptions.enableUiEnhancementsButton.help"   : "{Aprimoramentos da Interface}\n\nAtiva ou desativa várias melhorias de interface, como um botão de mochila etc. Desative para ter uma experiência mais clássica.",
 	"vcmi.systemOptions.enableLargeSpellbookButton.hover"  : "Grimório Grande",
 	"vcmi.systemOptions.enableLargeSpellbookButton.help"   : "{Grimório Grande}\n\nAtiva um grimório maior que comporta mais feitiços por página. A animação de mudança de página do grimório não funciona com esta configuração ativada.",
-	"vcmi.systemOptions.audioMuteFocus.hover"  : "Silenciar na inatividade",
-	"vcmi.systemOptions.audioMuteFocus.help"   : "{Silenciar na inatividade}\n\nSilencia o áudio quando a janela está inativa. As exceções são mensagens no jogo e som de novo turno.",
+	"vcmi.systemOptions.audioMuteFocus.hover"  : "Silenciar na Inatividade",
+	"vcmi.systemOptions.audioMuteFocus.help"   : "{Silencia o Áudio na Inatividade}\n\nSilencia o áudio quando a janela está inativa. As exceções são mensagens no jogo e som de novo turno.",
 
 	"vcmi.adventureOptions.infoBarPick.hover" : "Mensagens no Painel de Informações",
 	"vcmi.adventureOptions.infoBarPick.help" : "{Mostra as Mensagens no Painel de Informações}\n\nSempre que possível, as mensagens do jogo provenientes de objetos no mapa serão mostradas no painel de informações, em vez de aparecerem em uma janela separada.",
@@ -241,7 +259,7 @@
 	"vcmi.adventureOptions.forceMovementInfo.hover" : "Sempre Mostrar o Custo de Movimento",
 	"vcmi.adventureOptions.forceMovementInfo.help" : "{Sempre Mostrar o Custo de Movimento}\n\nSempre mostra os dados de pontos de movimento na barra de status (em vez de apenas visualizá-los enquanto você mantém pressionada a tecla ALT).",
 	"vcmi.adventureOptions.showGrid.hover" : "Mostrar Grade",
-	"vcmi.adventureOptions.showGrid.help" : "{Mostrar Grade}\n\nMostra a sobreposição da grade, destacando as fronteiras entre as telhas do mapa de aventura.",
+	"vcmi.adventureOptions.showGrid.help" : "{Mostra a Grade}\n\nMostra a sobreposição da grade, destacando as fronteiras entre os hexágonos do mapa de aventura.",
 	"vcmi.adventureOptions.borderScroll.hover" : "Rolagem de Borda",
 	"vcmi.adventureOptions.borderScroll.help" : "{Rolagem de Borda}\n\nFaz o mapa de aventura rolar quando o cursor está adjacente à borda da janela. Pode ser desativado mantendo pressionada a tecla CTRL.",
 	"vcmi.adventureOptions.infoBarCreatureManagement.hover" : "Gerenciar Criaturas no Painel de Info.",
@@ -253,7 +271,7 @@
 	"vcmi.adventureOptions.smoothDragging.hover" : "Arrastar Suavemente o Mapa",
 	"vcmi.adventureOptions.smoothDragging.help" : "{Arrasta o Mapa Suavemente}\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" : "{Omitir 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.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": "",
@@ -261,7 +279,7 @@
 	"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" : "{Ocultar Fundo}\n\nOculta o mapa de aventura no fundo e mostra uma textura em vez disso.",
+	"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.",
@@ -269,7 +287,7 @@
 	"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 o jogo em uma resolução com altura inferior a 700 pixels, o tamanho GRANDE é usado caso contrário).",
+	"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": "",
@@ -281,7 +299,7 @@
 	"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 o 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.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 feitiço.",
 	"vcmi.battleOptions.skipBattleIntroMusic.hover": "Pular Música de Introdução",
@@ -289,7 +307,7 @@
 	"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ço Rápido",
-	"vcmi.battleOptions.showQuickSpell.help": "{Mostrar Painel de Feitiço Rápido}\n\nMostra um painel para seleção rápida de feitiços",
+	"vcmi.battleOptions.showQuickSpell.help": "{Mostra o Painel de Feitiço Rápido}\n\nMostra um painel para seleção rápida de feitiços.",
 
 	"vcmi.adventureMap.revisitObject.hover" : "Revisitar Objeto",
 	"vcmi.adventureMap.revisitObject.help" : "{Revisitar Objeto}\n\nSe um herói estiver atualmente em um Objeto do Mapa, ele pode revisitar o local.",
@@ -334,9 +352,9 @@
 	"vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Mostrar Produção Semanal de Criaturas",
 	"vcmi.otherOptions.creatureGrowthAsDwellingLabel.help" : "{Mostrar Produção Semanal de Criaturas}\n\nMostra a produção semanal das criaturas em vez da quantidade disponível no resumo da cidade (canto inferior esquerdo da tela da cidade).",
 	"vcmi.otherOptions.compactTownCreatureInfo.hover" : "Informações Compactas de Criaturas",
-	"vcmi.otherOptions.compactTownCreatureInfo.help" : "{Informações Compactas de Criaturas}\n\nMostra informações menores para criaturas da cidade no resumo da cidade (canto inferior esquerdo da tela da cidade).",
+	"vcmi.otherOptions.compactTownCreatureInfo.help" : "{Informações Compactas de Criaturas}\n\nMostra informações reduzidas para criaturas da cidade no resumo da cidade (canto inferior esquerdo da tela da cidade).",
 
-	"vcmi.townHall.missingBase"             : "A construção base %s deve ser construída primeiro",
+	"vcmi.townHall.missingBase"             : "A construção base %s deve ser feita primeiro.",
 	"vcmi.townHall.noCreaturesToRecruit"    : "Não há criaturas para recrutar!",
 
 	"vcmi.townStructure.bank.borrow" : "Você entra no banco. Um banqueiro o vê e diz: \"Temos uma oferta especial para você. Você pode pegar um empréstimo de 2500 de ouro por 5 dias. Você terá que pagar 500 de ouro todos os dias.\"",
@@ -351,11 +369,12 @@
 	"vcmi.heroWindow.openBackpack.hover" : "Abrir janela da mochila de artefatos",
 	"vcmi.heroWindow.openBackpack.help" : "Abre a janela que facilita o gerenciamento da mochila de artefatos.",
 	"vcmi.heroWindow.sortBackpackByCost.hover"  : "Ordenar por custo",
-	"vcmi.heroWindow.sortBackpackByCost.help"   : "Ordenar artefatos na mochila por custo.",
+	"vcmi.heroWindow.sortBackpackByCost.help"   : "Ordena artefatos na mochila por custo.",
 	"vcmi.heroWindow.sortBackpackBySlot.hover"  : "Ordenar por espaço",
-	"vcmi.heroWindow.sortBackpackBySlot.help"   : "Ordenar artefatos na mochila por espaço equipado.",
+	"vcmi.heroWindow.sortBackpackBySlot.help"   : "Ordena artefatos na mochila por espaço equipado.",
 	"vcmi.heroWindow.sortBackpackByClass.hover" : "Ordenar por classe",
-	"vcmi.heroWindow.sortBackpackByClass.help"  : "Ordenar artefatos na mochila por classe de artefato. Tesouro, Menor, Maior, Relíquia",
+	"vcmi.heroWindow.sortBackpackByClass.help"  : "Ordena artefatos na mochila por classe de artefato. Tesouro, Menor, Maior, Relíquia.",
+	"vcmi.heroWindow.fusingArtifact.fusing" : "Você possui todos os componentes necessários para a fusão de %s. Deseja realizar a fusão? {Todos os componentes serão consumidos após a fusão.}",
 
 	"vcmi.tavernWindow.inviteHero" : "Convidar herói",
 
@@ -366,7 +385,7 @@
 	"vcmi.creatureWindow.showSkills.hover" : "Alternar para visualização de habilidades",
 	"vcmi.creatureWindow.showSkills.help" : "Exibe todas as habilidades aprendidas do comandante.",
 	"vcmi.creatureWindow.returnArtifact.hover" : "Devolver artefato",
-	"vcmi.creatureWindow.returnArtifact.help" : "Clique neste botão para devolver o artefato para a mochila do herói.",
+	"vcmi.creatureWindow.returnArtifact.help" : "Clique neste botão para devolver o artefato à mochila do herói.",
 
 	"vcmi.questLog.hideComplete.hover" : "Ocultar missões completas",
 	"vcmi.questLog.hideComplete.help" : "Oculta todas as missões completas.",
@@ -378,7 +397,7 @@
 	"vcmi.randomMapTab.widgets.roadTypesLabel" : "Tipos de Estrada",
 
 	"vcmi.optionsTab.turnOptions.hover" : "Opções de Turno",
-	"vcmi.optionsTab.turnOptions.help" : "Selecione as opções de cronômetro do turno e turnos simultâneos",
+	"vcmi.optionsTab.turnOptions.help" : "Selecione as opções de cronômetro do turno e turnos simultâneos.",
 
 	"vcmi.optionsTab.chessFieldBase.hover" : "Cronômetro Base",
 	"vcmi.optionsTab.chessFieldTurn.hover" : "Cronôm. Turno",
@@ -388,8 +407,8 @@
 	"vcmi.optionsTab.chessFieldTurnAccumulate.help" : "Usado fora de combate ou quando o {Cronômetro da Batalha} se esgota. Restaurado a cada turno. O tempo restante é adicionado ao {Tempo Base} no final do turno.",
 	"vcmi.optionsTab.chessFieldTurnDiscard.help" : "Usado fora de combate ou quando o {Cronômetro da Batalha} se esgota. Restaurado a cada turno. Qualquer tempo não utilizado é perdido.",
 	"vcmi.optionsTab.chessFieldBattle.help" : "Usado em batalhas com a IA ou em combates PvP quando o {Cronômetro da Unidade} se esgota. Restaurado no início de cada combate.",
-	"vcmi.optionsTab.chessFieldUnitAccumulate.help" : "Usado ao selecionar ação da unidade em combates PvP. O tempo restante é adicionado ao {Cronômetro da Batalha} no final do turno da unidade.",
-	"vcmi.optionsTab.chessFieldUnitDiscard.help" : "Usado ao selecionar ação da unidade em combates PvP. Restaurado no início do turno de cada unidade. Qualquer tempo não utilizado é perdido.",
+	"vcmi.optionsTab.chessFieldUnitAccumulate.help" : "Usado ao selecionar a ação da unidade em combates PvP. O tempo restante é adicionado ao {Cronômetro da Batalha} no final do turno da unidade.",
+	"vcmi.optionsTab.chessFieldUnitDiscard.help" : "Usado ao selecionar a ação da unidade em combates PvP. Restaurado no início do turno de cada unidade. Qualquer tempo não utilizado é perdido.",
 
 	"vcmi.optionsTab.accumulate" : "Acumular",
 
@@ -520,9 +539,9 @@
 	"core.seerhut.quest.reachDate.hover.3" : "(Não retorne antes de %s)",
 	"core.seerhut.quest.reachDate.hover.4" : "(Não retorne antes de %s)",
 	"core.seerhut.quest.reachDate.hover.5" : "(Não retorne antes de %s)",
-	"core.seerhut.quest.reachDate.receive.0" : "Estou ocupado. Não volte antes de %s",
-	"core.seerhut.quest.reachDate.receive.1" : "Estou ocupado. Não volte antes de %s",
-	"core.seerhut.quest.reachDate.receive.2" : "Estou ocupado. Não volte antes de %s",
+	"core.seerhut.quest.reachDate.receive.0" : "Estou ocupado. Não volte antes de %s.",
+	"core.seerhut.quest.reachDate.receive.1" : "Estou ocupado. Não volte antes de %s.",
+	"core.seerhut.quest.reachDate.receive.2" : "Estou ocupado. Não volte antes de %s.",
 	"core.seerhut.quest.reachDate.receive.3" : "Fechado até %s.",
 	"core.seerhut.quest.reachDate.receive.4" : "Fechado até %s.",
 	"core.seerhut.quest.reachDate.receive.5" : "Fechado até %s.",
@@ -532,7 +551,9 @@
 	"core.seerhut.quest.reachDate.visit.3" : "Fechado até %s.",
 	"core.seerhut.quest.reachDate.visit.4" : "Fechado até %s.",
 	"core.seerhut.quest.reachDate.visit.5" : "Fechado até %s.",
-
+	
+	"mapObject.core.hillFort.object.description" : "Atualiza criaturas. O custo de atualização para os níveis 1 a 4 é mais vantajoso do que na cidade associada.",
+	
 	"core.bonus.ADDITIONAL_ATTACK.name" : "Ataque Duplo",
 	"core.bonus.ADDITIONAL_ATTACK.description" : "Ataca duas vezes",
 	"core.bonus.ADDITIONAL_RETALIATION.name" : "Contra-ataques Adicionais",
@@ -570,7 +591,7 @@
 	"core.bonus.ENCHANTER.name" : "Encantador",
 	"core.bonus.ENCHANTER.description" : "Pode lançar ${subtype.spell} em massa a cada turno",
 	"core.bonus.ENCHANTED.name" : "Encantado",
-	"core.bonus.ENCHANTED.description" : "Afetado por ${subtype.spell} permanente",
+	"core.bonus.ENCHANTED.description" : "Afetado por ${subtype.spell} permanentemente",
 	"core.bonus.ENEMY_ATTACK_REDUCTION.name" : "Ignorar Ataque (${val}%)",
 	"core.bonus.ENEMY_ATTACK_REDUCTION.description" : "Ao ser atacado, ${val}% do ataque do agressor é ignorado",
 	"core.bonus.ENEMY_DEFENCE_REDUCTION.name" : "Ignorar Defesa (${val}%)",
@@ -662,7 +683,7 @@
 	"core.bonus.SPELL_LIKE_ATTACK.name" : "Ataque Similar a Feitiço",
 	"core.bonus.SPELL_LIKE_ATTACK.description" : "Ataques com ${subtype.spell}",
 	"core.bonus.SPELL_RESISTANCE_AURA.name" : "Aura de Resistência",
-	"core.bonus.SPELL_RESISTANCE_AURA.description" : "Pilhas próximas ganham ${val}% de resistência a magia",
+	"core.bonus.SPELL_RESISTANCE_AURA.description" : "Pilhas próximas ganham ${val}% de resistência à magia",
 	"core.bonus.SUMMON_GUARDIANS.name" : "Invocar Guardas",
 	"core.bonus.SUMMON_GUARDIANS.description" : "No início da batalha, invoca ${subtype.creature} (${val}%)",
 	"core.bonus.SYNERGY_TARGET.name" : "Alvo Sinergizável",
@@ -675,8 +696,8 @@
 	"core.bonus.TRANSMUTATION.description" : "${val}% de chance de transformar a unidade atacada em um tipo diferente",
 	"core.bonus.UNDEAD.name" : "Morto-vivo",
 	"core.bonus.UNDEAD.description" : "A criatura é um Morto-vivo",
-	"core.bonus.UNLIMITED_RETALIATIONS.name" : "Contra-ataques Ilimitadas",
-	"core.bonus.UNLIMITED_RETALIATIONS.description" : "Pode contra-atacar contra um número ilimitado de ataques",
+	"core.bonus.UNLIMITED_RETALIATIONS.name" : "Contra-ataques Ilimitados",
+	"core.bonus.UNLIMITED_RETALIATIONS.description" : "Pode contra-atacar um número ilimitado de vezes",
 	"core.bonus.WATER_IMMUNITY.name" : "Imunidade à Água",
 	"core.bonus.WATER_IMMUNITY.description" : "Imune a todos os feitiços da escola de magia da Água",
 	"core.bonus.WIDE_BREATH.name" : "Sopro Amplo",
@@ -684,5 +705,30 @@
 	"core.bonus.DISINTEGRATE.name": "Desintegrar",
 	"core.bonus.DISINTEGRATE.description": "Nenhum corpo permanece após a morte",
 	"core.bonus.INVINCIBLE.name": "Invencível",
-	"core.bonus.INVINCIBLE.description": "Não pode ser afetado por nada"
+	"core.bonus.INVINCIBLE.description": "Não pode ser afetado por nada",
+	"core.bonus.PRISM_HEX_ATTACK_BREATH.name" : "Sopro Prismático",
+	"core.bonus.PRISM_HEX_ATTACK_BREATH.description" : "Ataque de Sopro Prismático (três direções)",
+	"vcmi.server.errors.modDependencyLoop" : "Falha ao carregar o mod {'%s'}!\n Ele pode estar em um ciclo de dependência.",
+
+	"spell.core.castleMoat.name": "Fosso",
+	"spell.core.castleMoatTrigger.name": "Fosso",
+	"spell.core.catapultShot.name": "Disparo de Catapulta",
+	"spell.core.cyclopsShot.name": "Tiro de Cerco",
+	"spell.core.dungeonMoat.name": "Óleo Fervente",
+	"spell.core.dungeonMoatTrigger.name": "Óleo Fervente",
+	"spell.core.fireWallTrigger.name": "Parede de Fogo",
+	"spell.core.firstAid.name": "Primeiros Socorros",
+	"spell.core.fortressMoat.name": "Alcatrão Fervente",
+	"spell.core.fortressMoatTrigger.name": "Alcatrão Fervente",
+	"spell.core.infernoMoat.name": "Lava",
+	"spell.core.infernoMoatTrigger.name": "Lava",
+	"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.strongholdMoat.name": "Estacas de Madeira",
+	"spell.core.strongholdMoatTrigger.name": "Estacas de Madeira",
+	"spell.core.summonDemons.name": "Invocar Demônios",
+	"spell.core.towerMoat.name": "Mina Terrestre"
 }

+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/aroundamarsh.JSON → Mods/vcmi/config/rmg/hdmod/aroundamarsh.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/balance.JSON → Mods/vcmi/config/rmg/hdmod/balance.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/blockbuster.JSON → Mods/vcmi/config/rmg/hdmod/blockbuster.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/clashOfDragons.json → Mods/vcmi/config/rmg/hdmod/clashOfDragons.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/coldshadowsFantasy.json → Mods/vcmi/config/rmg/hdmod/coldshadowsFantasy.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/cube.JSON → Mods/vcmi/config/rmg/hdmod/cube.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/diamond.JSON → Mods/vcmi/config/rmg/hdmod/diamond.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/extreme.JSON → Mods/vcmi/config/rmg/hdmod/extreme.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/extreme2.JSON → Mods/vcmi/config/rmg/hdmod/extreme2.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/fear.JSON → Mods/vcmi/config/rmg/hdmod/fear.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/frozenDragons.JSON → Mods/vcmi/config/rmg/hdmod/frozenDragons.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/gimlisRevenge.JSON → Mods/vcmi/config/rmg/hdmod/gimlisRevenge.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/guerilla.JSON → Mods/vcmi/config/rmg/hdmod/guerilla.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/headquarters.JSON → Mods/vcmi/config/rmg/hdmod/headquarters.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/hypercube.JSON → Mods/vcmi/config/rmg/hdmod/hypercube.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/jebusCross.json → Mods/vcmi/config/rmg/hdmod/jebusCross.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/longRun.JSON → Mods/vcmi/config/rmg/hdmod/longRun.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/marathon.JSON → Mods/vcmi/config/rmg/hdmod/marathon.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/miniNostalgia.JSON → Mods/vcmi/config/rmg/hdmod/miniNostalgia.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/nostalgia.JSON → Mods/vcmi/config/rmg/hdmod/nostalgia.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/oceansEleven.JSON → Mods/vcmi/config/rmg/hdmod/oceansEleven.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/panic.JSON → Mods/vcmi/config/rmg/hdmod/panic.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/poorJebus.JSON → Mods/vcmi/config/rmg/hdmod/poorJebus.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/reckless.JSON → Mods/vcmi/config/rmg/hdmod/reckless.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/roadrunner.JSON → Mods/vcmi/config/rmg/hdmod/roadrunner.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/shaaafworld.JSON → Mods/vcmi/config/rmg/hdmod/shaaafworld.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/skirmish.JSON → Mods/vcmi/config/rmg/hdmod/skirmish.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/speed1.JSON → Mods/vcmi/config/rmg/hdmod/speed1.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/speed2.JSON → Mods/vcmi/config/rmg/hdmod/speed2.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/spider.JSON → Mods/vcmi/config/rmg/hdmod/spider.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/superslam.JSON → Mods/vcmi/config/rmg/hdmod/superslam.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/triad.JSON → Mods/vcmi/config/rmg/hdmod/triad.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmod/vortex.JSON → Mods/vcmi/config/rmg/hdmod/vortex.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmodUnused/anarchy.JSON → Mods/vcmi/config/rmg/hdmodUnused/anarchy.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmodUnused/balance m+u 200%.JSON → Mods/vcmi/config/rmg/hdmodUnused/balance m+u 200%.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmodUnused/midnightMix.JSON → Mods/vcmi/config/rmg/hdmodUnused/midnightMix.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmodUnused/skirmish m-u 200%.JSON → Mods/vcmi/config/rmg/hdmodUnused/skirmish m-u 200%.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/hdmodUnused/true random.JSON → Mods/vcmi/config/rmg/hdmodUnused/true random.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3/dwarvenTunnels.JSON → Mods/vcmi/config/rmg/heroes3/dwarvenTunnels.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3/golemsAplenty.JSON → Mods/vcmi/config/rmg/heroes3/golemsAplenty.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3/meetingInMuzgob.JSON → Mods/vcmi/config/rmg/heroes3/meetingInMuzgob.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3/monksRetreat.JSON → Mods/vcmi/config/rmg/heroes3/monksRetreat.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3/newcomers.JSON → Mods/vcmi/config/rmg/heroes3/newcomers.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3/readyOrNot.JSON → Mods/vcmi/config/rmg/heroes3/readyOrNot.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3/smallRing.JSON → Mods/vcmi/config/rmg/heroes3/smallRing.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3/southOfHell.JSON → Mods/vcmi/config/rmg/heroes3/southOfHell.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3/worldsAtWar.JSON → Mods/vcmi/config/rmg/heroes3/worldsAtWar.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3unused/dragon.json → Mods/vcmi/config/rmg/heroes3unused/dragon.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3unused/gauntlet.JSON → Mods/vcmi/config/rmg/heroes3unused/gauntlet.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3unused/ring.JSON → Mods/vcmi/config/rmg/heroes3unused/ring.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/heroes3unused/riseOfPhoenix.JSON → Mods/vcmi/config/rmg/heroes3unused/riseOfPhoenix.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm0k.JSON → Mods/vcmi/config/rmg/symmetric/2sm0k.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm2a.JSON → Mods/vcmi/config/rmg/symmetric/2sm2a.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm2b(2).JSON → Mods/vcmi/config/rmg/symmetric/2sm2b(2).json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm2b.JSON → Mods/vcmi/config/rmg/symmetric/2sm2b.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm2c.JSON → Mods/vcmi/config/rmg/symmetric/2sm2c.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm2f(2).JSON → Mods/vcmi/config/rmg/symmetric/2sm2f(2).json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm2f.JSON → Mods/vcmi/config/rmg/symmetric/2sm2f.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm2h(2).JSON → Mods/vcmi/config/rmg/symmetric/2sm2h(2).json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm2h.JSON → Mods/vcmi/config/rmg/symmetric/2sm2h.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm2i(2).JSON → Mods/vcmi/config/rmg/symmetric/2sm2i(2).json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm2i.JSON → Mods/vcmi/config/rmg/symmetric/2sm2i.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm4d(2).JSON → Mods/vcmi/config/rmg/symmetric/2sm4d(2).json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm4d(3).JSON → Mods/vcmi/config/rmg/symmetric/2sm4d(3).json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/2sm4d.JSON → Mods/vcmi/config/rmg/symmetric/2sm4d.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/3sb0b.JSON → Mods/vcmi/config/rmg/symmetric/3sb0b.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/3sb0c.JSON → Mods/vcmi/config/rmg/symmetric/3sb0c.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/3sm3d.JSON → Mods/vcmi/config/rmg/symmetric/3sm3d.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/4sm0d.JSON → Mods/vcmi/config/rmg/symmetric/4sm0d.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/4sm0f.JSON → Mods/vcmi/config/rmg/symmetric/4sm0f.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/4sm0g.JSON → Mods/vcmi/config/rmg/symmetric/4sm0g.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/4sm4e.JSON → Mods/vcmi/config/rmg/symmetric/4sm4e.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/5sb0a.JSON → Mods/vcmi/config/rmg/symmetric/5sb0a.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/5sb0b.JSON → Mods/vcmi/config/rmg/symmetric/5sb0b.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/6lm10.JSON → Mods/vcmi/config/rmg/symmetric/6lm10.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/6lm10a.JSON → Mods/vcmi/config/rmg/symmetric/6lm10a.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/6sm0b.JSON → Mods/vcmi/config/rmg/symmetric/6sm0b.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/6sm0d.JSON → Mods/vcmi/config/rmg/symmetric/6sm0d.json


+ 0 - 0
Mods/vcmi/config/vcmi/rmg/symmetric/6sm0e.JSON → Mods/vcmi/config/rmg/symmetric/6sm0e.json


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä