Browse Source

Merge remote-tracking branch 'upstream/develop' into develop

Xilmi 11 tháng trước cách đây
mục cha
commit
a70f5de8c6
100 tập tin đã thay đổi với 65 bổ sung45 xóa
  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. 0 0
      Mods/vcmi/config/chinese.json
  14. 29 13
      Mods/vcmi/config/czech.json
  15. 2 0
      Mods/vcmi/config/english.json
  16. 0 0
      Mods/vcmi/config/french.json
  17. 0 0
      Mods/vcmi/config/german.json
  18. 0 0
      Mods/vcmi/config/polish.json
  19. 4 1
      Mods/vcmi/config/portuguese.json
  20. 0 0
      Mods/vcmi/config/rmg/hdmod/aroundamarsh.json
  21. 0 0
      Mods/vcmi/config/rmg/hdmod/balance.json
  22. 0 0
      Mods/vcmi/config/rmg/hdmod/blockbuster.json
  23. 0 0
      Mods/vcmi/config/rmg/hdmod/clashOfDragons.json
  24. 0 0
      Mods/vcmi/config/rmg/hdmod/coldshadowsFantasy.json
  25. 0 0
      Mods/vcmi/config/rmg/hdmod/cube.json
  26. 0 0
      Mods/vcmi/config/rmg/hdmod/diamond.json
  27. 0 0
      Mods/vcmi/config/rmg/hdmod/extreme.json
  28. 0 0
      Mods/vcmi/config/rmg/hdmod/extreme2.json
  29. 0 0
      Mods/vcmi/config/rmg/hdmod/fear.json
  30. 0 0
      Mods/vcmi/config/rmg/hdmod/frozenDragons.json
  31. 0 0
      Mods/vcmi/config/rmg/hdmod/gimlisRevenge.json
  32. 0 0
      Mods/vcmi/config/rmg/hdmod/guerilla.json
  33. 0 0
      Mods/vcmi/config/rmg/hdmod/headquarters.json
  34. 0 0
      Mods/vcmi/config/rmg/hdmod/hypercube.json
  35. 0 0
      Mods/vcmi/config/rmg/hdmod/jebusCross.json
  36. 0 0
      Mods/vcmi/config/rmg/hdmod/longRun.json
  37. 0 0
      Mods/vcmi/config/rmg/hdmod/marathon.json
  38. 0 0
      Mods/vcmi/config/rmg/hdmod/miniNostalgia.json
  39. 0 0
      Mods/vcmi/config/rmg/hdmod/nostalgia.json
  40. 0 0
      Mods/vcmi/config/rmg/hdmod/oceansEleven.json
  41. 0 0
      Mods/vcmi/config/rmg/hdmod/panic.json
  42. 0 0
      Mods/vcmi/config/rmg/hdmod/poorJebus.json
  43. 0 0
      Mods/vcmi/config/rmg/hdmod/reckless.json
  44. 0 0
      Mods/vcmi/config/rmg/hdmod/roadrunner.json
  45. 0 0
      Mods/vcmi/config/rmg/hdmod/shaaafworld.json
  46. 0 0
      Mods/vcmi/config/rmg/hdmod/skirmish.json
  47. 0 0
      Mods/vcmi/config/rmg/hdmod/speed1.json
  48. 0 0
      Mods/vcmi/config/rmg/hdmod/speed2.json
  49. 0 0
      Mods/vcmi/config/rmg/hdmod/spider.json
  50. 0 0
      Mods/vcmi/config/rmg/hdmod/superslam.json
  51. 0 0
      Mods/vcmi/config/rmg/hdmod/triad.json
  52. 0 0
      Mods/vcmi/config/rmg/hdmod/vortex.json
  53. 0 0
      Mods/vcmi/config/rmg/hdmodUnused/anarchy.json
  54. 0 0
      Mods/vcmi/config/rmg/hdmodUnused/balance m+u 200%.json
  55. 0 0
      Mods/vcmi/config/rmg/hdmodUnused/midnightMix.json
  56. 0 0
      Mods/vcmi/config/rmg/hdmodUnused/skirmish m-u 200%.json
  57. 0 0
      Mods/vcmi/config/rmg/hdmodUnused/true random.json
  58. 0 0
      Mods/vcmi/config/rmg/heroes3/dwarvenTunnels.json
  59. 0 0
      Mods/vcmi/config/rmg/heroes3/golemsAplenty.json
  60. 0 0
      Mods/vcmi/config/rmg/heroes3/meetingInMuzgob.json
  61. 0 0
      Mods/vcmi/config/rmg/heroes3/monksRetreat.json
  62. 0 0
      Mods/vcmi/config/rmg/heroes3/newcomers.json
  63. 0 0
      Mods/vcmi/config/rmg/heroes3/readyOrNot.json
  64. 0 0
      Mods/vcmi/config/rmg/heroes3/smallRing.json
  65. 0 0
      Mods/vcmi/config/rmg/heroes3/southOfHell.json
  66. 0 0
      Mods/vcmi/config/rmg/heroes3/worldsAtWar.json
  67. 0 0
      Mods/vcmi/config/rmg/heroes3unused/dragon.json
  68. 0 0
      Mods/vcmi/config/rmg/heroes3unused/gauntlet.json
  69. 0 0
      Mods/vcmi/config/rmg/heroes3unused/ring.json
  70. 0 0
      Mods/vcmi/config/rmg/heroes3unused/riseOfPhoenix.json
  71. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm0k.json
  72. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2a.json
  73. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2b(2).json
  74. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2b.json
  75. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2c.json
  76. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2f(2).json
  77. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2f.json
  78. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2h(2).json
  79. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2h.json
  80. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2i(2).json
  81. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm2i.json
  82. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm4d(2).json
  83. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm4d(3).json
  84. 0 0
      Mods/vcmi/config/rmg/symmetric/2sm4d.json
  85. 0 0
      Mods/vcmi/config/rmg/symmetric/3sb0b.json
  86. 0 0
      Mods/vcmi/config/rmg/symmetric/3sb0c.json
  87. 0 0
      Mods/vcmi/config/rmg/symmetric/3sm3d.json
  88. 0 0
      Mods/vcmi/config/rmg/symmetric/4sm0d.json
  89. 0 0
      Mods/vcmi/config/rmg/symmetric/4sm0f.json
  90. 0 0
      Mods/vcmi/config/rmg/symmetric/4sm0g.json
  91. 0 0
      Mods/vcmi/config/rmg/symmetric/4sm4e.json
  92. 0 0
      Mods/vcmi/config/rmg/symmetric/5sb0a.json
  93. 0 0
      Mods/vcmi/config/rmg/symmetric/5sb0b.json
  94. 0 0
      Mods/vcmi/config/rmg/symmetric/6lm10.json
  95. 0 0
      Mods/vcmi/config/rmg/symmetric/6lm10a.json
  96. 0 0
      Mods/vcmi/config/rmg/symmetric/6sm0b.json
  97. 0 0
      Mods/vcmi/config/rmg/symmetric/6sm0d.json
  98. 0 0
      Mods/vcmi/config/rmg/symmetric/6sm0e.json
  99. 0 0
      Mods/vcmi/config/rmg/symmetric/7sb0b.json
  100. 0 0
      Mods/vcmi/config/rmg/symmetric/7sb0c.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

@@ -170,10 +170,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
 		{
@@ -309,7 +309,7 @@ uint64_t RewardEvaluator::getArmyReward(
 	case Obj::SPELL_SCROLL:
 		//FALL_THROUGH
 	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;

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


+ 29 - 13
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,25 +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ů",
@@ -66,7 +73,7 @@
 	"vcmi.radialWheel.moveUp" : "Posunout výše",
 	"vcmi.radialWheel.moveDown" : "Posunout níže",
 	"vcmi.radialWheel.moveBottom" : "Přesunout dolů",
-	
+
 	"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",
@@ -106,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
@@ -175,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é",
@@ -323,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!",
@@ -444,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í",
@@ -488,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?",
@@ -520,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?",
@@ -552,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",

+ 2 - 0
Mods/vcmi/config/vcmi/english.json → Mods/vcmi/config/english.json

@@ -707,6 +707,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


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


+ 4 - 1
Mods/vcmi/config/vcmi/portuguese.json → Mods/vcmi/config/portuguese.json

@@ -706,7 +706,10 @@
 	"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.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",

+ 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


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


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


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