diff --git a/AI/BattleAI/BattleExchangeVariant.cpp b/AI/BattleAI/BattleExchangeVariant.cpp
index 29ed104ea..1f83b58e8 100644
--- a/AI/BattleAI/BattleExchangeVariant.cpp
+++ b/AI/BattleAI/BattleExchangeVariant.cpp
@@ -621,6 +621,9 @@ BattleScore BattleExchangeEvaluator::calculateExchange(
if(!exchangeBattle->getForUpdate(u->unitId())->alive())
return false;
+ if (!u->getPosition().isValid())
+ return false; // e.g. tower shooters
+
return vstd::contains_if(reachabilityMap.at(u->getPosition()), [&attacker](const battle::Unit * other) -> bool
{
return attacker->unitId() == other->unitId();
diff --git a/ChangeLog.md b/ChangeLog.md
index 6087d8940..e604c3be4 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -9,6 +9,8 @@
* Game should now generate crash dump on uncaught c++ exception throw
* Fixed crash when player finishes game with negative score
* Fixed crash when opening tavern window in some localisations
+* Fixed crash on loading previously generated random map when mods that add object with same name are used
+* Game will now display an error message instead of silent crash if game data directory is not accessible
### Mechanics
* Transport Artefact victory condition will no longer trigger if another player has completed it.
@@ -18,6 +20,7 @@
* Fixed hero not being able to learn spells from a mod in some cases, even if they are available from the town's mage guild.
* The game will now actually take resources from seers' huts with the Gather Resources mission instead of awarding them.
* Heroes with double spell points will no longer trigger the Mana Vortex.
+* If turn timer runs out during pve battle game will end player turn after a battle instead of forcing retreat
### Interface
* Fixed reversed button functions in Exchange Window
@@ -58,6 +61,7 @@
* Fixed potential crash when Nullkiller AI has access to Town Portal spell
* Fixed potential crash when Battle AI selects a spell to cast from a hero with summon spells.
* Several fixes to Nullkiller AI exploration logic
+* Fixed bug leading to Battle AI doing nothing if targeted unit is unreachable
### Random Maps Generator
* Fixed crash when player selects a random number of players and selects a different colour to play, resulting in a non-continuous list of players.
diff --git a/Mods/vcmi/config/vcmi/portuguese.json b/Mods/vcmi/config/vcmi/portuguese.json
index 8fa1d5286..4405870fc 100644
--- a/Mods/vcmi/config/vcmi/portuguese.json
+++ b/Mods/vcmi/config/vcmi/portuguese.json
@@ -55,7 +55,7 @@
"vcmi.radialWheel.moveDown" : "Mover para baixo",
"vcmi.radialWheel.moveBottom" : "Mover para o fundo",
- "vcmi.spellBook.search" : "procurar...",
+ "vcmi.spellBook.search" : "Procurar...",
"vcmi.mainMenu.serverConnecting" : "Conectando...",
"vcmi.mainMenu.serverAddressEnter" : "Insira o endereço:",
@@ -139,9 +139,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 mod {'%s'}!\n Ele depende do mod {'%s'} que não está ativo!\n",
- "vcmi.server.errors.modConflict" : "Falha ao carregar mod {'%s'}!\n Conflita com o mod ativo {'%s'}!\n",
- "vcmi.server.errors.unknownEntity" : "Falha ao carregar 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 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.dimensionDoor.seaToLandError" : "Não é possível teleportar do mar para a terra ou vice-versa com uma Porta Dimensional.",
@@ -189,8 +189,8 @@
"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.",
"vcmi.adventureOptions.numericQuantities.hover" : "Quantidades Numéricas de Criaturas",
"vcmi.adventureOptions.numericQuantities.help" : "{Quantidades Numéricas de Criaturas}\n\nMostra as quantidades aproximadas de criaturas inimigas no formato numérico A-B.",
- "vcmi.adventureOptions.forceMovementInfo.hover" : "Mostrar Sempre o Custo de Movimento",
- "vcmi.adventureOptions.forceMovementInfo.help" : "{Mostrar Sempre 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.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.borderScroll.hover" : "Rolagem de Borda",
@@ -235,8 +235,8 @@
"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",
"vcmi.battleOptions.skipBattleIntroMusic.help": "{Pula a Música de Introdução}\n\nPermite ações durante a música de introdução que toca no início de cada batalha.",
- "vcmi.battleOptions.endWithAutocombat.hover": "Terminar a Batalha",
- "vcmi.battleOptions.endWithAutocombat.help": "{Termina a Batalha}\n\nO Combate Automático reproduz a batalha até o final instantâneo.",
+ "vcmi.battleOptions.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.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.",
@@ -277,9 +277,9 @@
"vcmi.tutorialWindow.decription.AbortSpell" : "Toque e mantenha pressionado para cancelar um feitiço.",
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Mostrar Criaturas Disponíveis",
- "vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Mostrar Criaturas Disponíveis}\n\nMostra o número de criaturas disponíveis para compra em vez de seu crescimento no resumo da cidade (canto inferior esquerdo da tela da cidade).",
- "vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Mostrar Crescimento Semanal de Criaturas",
- "vcmi.otherOptions.creatureGrowthAsDwellingLabel.help" : "{Mostrar Crescimento Semanal de Criaturas}\n\nMostra o crescimento semanal das criaturas em vez da quantidade disponível no resumo da cidade (canto inferior esquerdo da tela da cidade).",
+ "vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Mostrar Criaturas Disponíveis}\n\nMostra o número de criaturas disponíveis para compra em vez de sua produção no resumo da cidade (canto inferior esquerdo da tela da cidade).",
+ "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).",
@@ -352,18 +352,18 @@
"vcmi.optionsTab.turnTime.select" : "Selecionar cronômetro do turno",
"vcmi.optionsTab.turnTime.unlimited" : "Tempo de turno ilimitado",
- "vcmi.optionsTab.turnTime.classic.1" : "Cronômetro clássico: 1 minuto",
- "vcmi.optionsTab.turnTime.classic.2" : "Cronômetro clássico: 2 minutos",
- "vcmi.optionsTab.turnTime.classic.5" : "Cronômetro clássico: 5 minutos",
- "vcmi.optionsTab.turnTime.classic.10" : "Cronômetro clássico: 10 minutos",
- "vcmi.optionsTab.turnTime.classic.20" : "Cronômetro clássico: 20 minutos",
- "vcmi.optionsTab.turnTime.classic.30" : "Cronômetro clássico: 30 minutos",
- "vcmi.optionsTab.turnTime.chess.20" : "Xadrez: 20:00 + 10:00 + 02:00 + 00:00",
- "vcmi.optionsTab.turnTime.chess.16" : "Xadrez: 16:00 + 08:00 + 01:30 + 00:00",
- "vcmi.optionsTab.turnTime.chess.8" : "Xadrez: 08:00 + 04:00 + 01:00 + 00:00",
- "vcmi.optionsTab.turnTime.chess.4" : "Xadrez: 04:00 + 02:00 + 00:30 + 00:00",
- "vcmi.optionsTab.turnTime.chess.2" : "Xadrez: 02:00 + 01:00 + 00:15 + 00:00",
- "vcmi.optionsTab.turnTime.chess.1" : "Xadrez: 01:00 + 01:00 + 00:00 + 00:00",
+ "vcmi.optionsTab.turnTime.classic.1" : "Cronômetro clássico 1 minuto",
+ "vcmi.optionsTab.turnTime.classic.2" : "Cronômetro clássico 2 minutos",
+ "vcmi.optionsTab.turnTime.classic.5" : "Cronômetro clássico 5 minutos",
+ "vcmi.optionsTab.turnTime.classic.10" : "Cronômetro clássico 10 minutos",
+ "vcmi.optionsTab.turnTime.classic.20" : "Cronômetro clássico 20 minutos",
+ "vcmi.optionsTab.turnTime.classic.30" : "Cronômetro clássico 30 minutos",
+ "vcmi.optionsTab.turnTime.chess.20" : "Xadrez 20:00 + 10:00 + 02:00 + 00:00",
+ "vcmi.optionsTab.turnTime.chess.16" : "Xadrez 16:00 + 08:00 + 01:30 + 00:00",
+ "vcmi.optionsTab.turnTime.chess.8" : "Xadrez 08:00 + 04:00 + 01:00 + 00:00",
+ "vcmi.optionsTab.turnTime.chess.4" : "Xadrez 04:00 + 02:00 + 00:30 + 00:00",
+ "vcmi.optionsTab.turnTime.chess.2" : "Xadrez 02:00 + 01:00 + 00:15 + 00:00",
+ "vcmi.optionsTab.turnTime.chess.1" : "Xadrez 01:00 + 01:00 + 00:00 + 00:00",
"vcmi.optionsTab.simturns.select" : "Selecionar turnos simultâneos",
"vcmi.optionsTab.simturns.none" : "Sem turnos simultâneos",
@@ -490,13 +490,13 @@
"core.bonus.AIR_IMMUNITY.description" : "Imune a todos os feitiços da escola de magia do Ar",
"core.bonus.ATTACKS_ALL_ADJACENT.name" : "Ataque em Todas as Direções",
"core.bonus.ATTACKS_ALL_ADJACENT.description" : "Ataca todos os inimigos adjacentes",
- "core.bonus.BLOCKS_RETALIATION.name" : "Sem Contra-ataques",
+ "core.bonus.BLOCKS_RETALIATION.name" : "Evita Contra-ataques",
"core.bonus.BLOCKS_RETALIATION.description" : "O inimigo não pode contra-atacar",
- "core.bonus.BLOCKS_RANGED_RETALIATION.name" : "Sem Contra-ataques à Distância",
+ "core.bonus.BLOCKS_RANGED_RETALIATION.name" : "Evita Contra-ataques à Distância",
"core.bonus.BLOCKS_RANGED_RETALIATION.description" : "O inimigo não pode contra-atacar usando um ataque à distância",
"core.bonus.CATAPULT.name" : "Catapulta",
"core.bonus.CATAPULT.description" : "Ataca as muralhas de cerco",
- "core.bonus.CHANGES_SPELL_COST_FOR_ALLY.name" : "Reduz Custo de Conjuração (${val})",
+ "core.bonus.CHANGES_SPELL_COST_FOR_ALLY.name" : "Custo de Conjuração (${val})",
"core.bonus.CHANGES_SPELL_COST_FOR_ALLY.description" : "Reduz o custo de conjuração de feitiços para o herói em ${val}",
"core.bonus.CHANGES_SPELL_COST_FOR_ENEMY.name" : "Absorvedor Mágico (${val})",
"core.bonus.CHANGES_SPELL_COST_FOR_ENEMY.description" : "Aumenta o custo de conjuração dos feitiços inimigos em ${val}",
@@ -507,7 +507,7 @@
"core.bonus.DEATH_STARE.name" : "Olhar da Morte (${val}%)",
"core.bonus.DEATH_STARE.description" : "Tem ${val}% de chance de matar uma única criatura",
"core.bonus.DEFENSIVE_STANCE.name" : "Bônus de Defesa",
- "core.bonus.DEFENSIVE_STANCE.description" : "+${val} de defesa ao se defender",
+ "core.bonus.DEFENSIVE_STANCE.description" : "+${val} de Defesa ao se defender",
"core.bonus.DESTRUCTION.name" : "Destruição",
"core.bonus.DESTRUCTION.description" : "Tem ${val}% de chance de matar unidades extras após o ataque",
"core.bonus.DOUBLE_DAMAGE_CHANCE.name" : "Golpe Mortal",
@@ -521,7 +521,7 @@
"core.bonus.ENCHANTED.name" : "Encantado",
"core.bonus.ENCHANTED.description" : "Afetado por ${subtype.spell} permanente",
"core.bonus.ENEMY_ATTACK_REDUCTION.name" : "Ignorar Ataque (${val}%)",
- "core.bonus.ENEMY_ATTACK_REDUCTION.description" : "Ao ser atacado, ${val}% do ataque do atacante é ignorado",
+ "core.bonus.ENEMY_ATTACK_REDUCTION.description" : "Ao ser atacado, ${val}% do ataque do agressor é ignorado",
"core.bonus.ENEMY_DEFENCE_REDUCTION.name" : "Ignorar Defesa (${val}%)",
"core.bonus.ENEMY_DEFENCE_REDUCTION.description" : "Ao atacar, ${val}% da defesa do defensor é ignorada",
"core.bonus.FIRE_IMMUNITY.name" : "Imunidade ao Fogo",
@@ -545,7 +545,7 @@
"core.bonus.GENERAL_DAMAGE_REDUCTION.name" : "Redução de Dano (${val}%)",
"core.bonus.GENERAL_DAMAGE_REDUCTION.description" : "Reduz o dano físico de ataques à distância ou corpo a corpo",
"core.bonus.HATE.name" : "Odeia ${subtype.creature}",
- "core.bonus.HATE.description" : "Causa ${val}% a mais de dano a ${subtype.creature}",
+ "core.bonus.HATE.description" : "${val}% a mais de dano a ${subtype.creature}",
"core.bonus.HEALER.name" : "Curandeiro",
"core.bonus.HEALER.description" : "Cura unidades aliadas",
"core.bonus.HP_REGENERATION.name" : "Regeneração",
diff --git a/client/CMT.cpp b/client/CMT.cpp
index fc6885136..c54d27e2d 100644
--- a/client/CMT.cpp
+++ b/client/CMT.cpp
@@ -208,7 +208,14 @@ int main(int argc, char * argv[])
logGlobal->info("The log file will be saved to %s", logPath);
// Init filesystem and settings
- preinitDLL(::console, false);
+ try
+ {
+ preinitDLL(::console, false);
+ }
+ catch (const DataLoadingException & e)
+ {
+ handleFatalError(e.what(), true);
+ }
Settings session = settings.write["session"];
auto setSettingBool = [&](std::string key, std::string arg) {
diff --git a/client/windows/CCastleInterface.cpp b/client/windows/CCastleInterface.cpp
index eb90d6a0e..588effed9 100644
--- a/client/windows/CCastleInterface.cpp
+++ b/client/windows/CCastleInterface.cpp
@@ -1540,6 +1540,9 @@ CHallInterface::CHallInterface(const CGTownInstance * Town):
const CBuilding * building = nullptr;
for(auto & buildingID : boxList[row][col])//we are looking for the first not built structure
{
+ if (town->town->buildings.count(buildingID) == 0)
+ throw std::runtime_error("Town " + Town->town->faction->getJsonKey() + " has no building with ID " + std::to_string(buildingID.getNum()));
+
const CBuilding * current = town->town->buildings.at(buildingID);
if(vstd::contains(town->builtBuildings, buildingID))
{
diff --git a/docs/Readme.md b/docs/Readme.md
index 0f8d5fcbc..e5f16ac7f 100644
--- a/docs/Readme.md
+++ b/docs/Readme.md
@@ -2,6 +2,7 @@
[![Github Downloads](https://img.shields.io/github/downloads/vcmi/vcmi/1.5.0/total)](https://github.com/vcmi/vcmi/releases/tag/1.5.0)
[![Github Downloads](https://img.shields.io/github/downloads/vcmi/vcmi/1.5.1/total)](https://github.com/vcmi/vcmi/releases/tag/1.5.1)
[![Github Downloads](https://img.shields.io/github/downloads/vcmi/vcmi/1.5.2/total)](https://github.com/vcmi/vcmi/releases/tag/1.5.2)
+[![Github Downloads](https://img.shields.io/github/downloads/vcmi/vcmi/1.5.3/total)](https://github.com/vcmi/vcmi/releases/tag/1.5.3)
[![Github Downloads](https://img.shields.io/github/downloads/vcmi/vcmi/total)](https://github.com/vcmi/vcmi/releases)
# VCMI Project
diff --git a/docs/modders/Bonus/Bonus_Types.md b/docs/modders/Bonus/Bonus_Types.md
index 8232599b5..b94c81bfc 100644
--- a/docs/modders/Bonus/Bonus_Types.md
+++ b/docs/modders/Bonus/Bonus_Types.md
@@ -349,10 +349,10 @@ Negates all natural immunities for affected stacks. (Orb of Vulnerability)
### OPENING_BATTLE_SPELL
-In battle, army affected by this bonus will cast spell at the very start of the battle
+In battle, army affected by this bonus will cast spell at the very start of the battle. Spell is always cast at expert level.
- subtype: spell identifer
-- val: spell mastery level
+- val: duration of the spell, in rounds
### FREE_SHIP_BOARDING
diff --git a/launcher/translation/portuguese.ts b/launcher/translation/portuguese.ts
index 14702f883..a30e0b25e 100644
--- a/launcher/translation/portuguese.ts
+++ b/launcher/translation/portuguese.ts
@@ -79,7 +79,7 @@
-
+ Diretório de arquivos de configuração
@@ -294,7 +294,7 @@
-
+ Recarregar repositórios
@@ -574,7 +574,7 @@ Instalar o download realizado com sucesso?
- O mod necessário %1 não está habilitado
+ O mod necessário %1 não está ativado
@@ -664,132 +664,132 @@ Instalar o download realizado com sucesso?
- Aliados do mapa de aventura
+ Aliados do Mapa de Aventura
-
+ Porta da Sala de Espera On-line
-
+ IA de combate automático nas batalhas
-
+ Sensibilidade dos Analógicos
-
+ Resposta Tátil
-
+ Cursor por Software
-
+ Endereço da Sala de Espera On-line
-
+ Filtro de Aumento de Escala
-
+ Usar Modo de Ponteiro Relativo
-
+ Mais Próximo
-
+ Linear
-
+ Melhor (Linear)
-
+ Entrada - Tela de Toque
- Inimigos do mapa de aventura
+ Inimigos do Mapa de Aventura
-
+ Linear
-
+ Áudio
-
+ Velocidade do Ponteiro Relativo
-
+ Volume da Música
-
+ Ignorar erros SSL
-
+ Entrada - Mouse
-
+ Duração do Toque Longo
-
+ %
-
+ Tolerância de Clique do Controle
-
+ Tolerância de Toque Tátil
-
+ Entrada - Controle
-
+ Volume do Som
@@ -818,7 +818,7 @@ Instalar o download realizado com sucesso?
- Limite de taxa de quadros
+ Limite de Taxa de Quadros
@@ -828,12 +828,12 @@ Instalar o download realizado com sucesso?
-
+ Tolerância de Clique do Mouse
-
+ Aceleração dos Analógicos
@@ -1064,12 +1064,12 @@ Heroes® of Might and Magic® III HD atualmente não é suportado!
-
+ Usar instalador offline do gog.com
-
+ Você pode copiar manualmente os diretórios Mapas, Dados e Mp3 do diretório do jogo original para o diretório de dados do VCMI que você pode ver no topo desta página
@@ -1106,23 +1106,24 @@ Heroes® of Might and Magic® III HD atualmente não é suportado!
-
+ Instalando... %p%
-
+ Se você já tem arquivos do Heroes III no seu dispositivo, você pode selecionar este diretório e o VCMI irá copiar os dados existentes automaticamente.
-
+ Copiar arquivos existentes
-
+ Se você possui o Heroes III no gog.com, você pode baixar o instalador offline de backup do gog.com, e o VCMI irá importar os dados do Heroes III usando o instalador offline.
+O instalador offline consiste em duas partes, .exe e .bin. Certifique-se de baixar ambas.
@@ -1173,7 +1174,7 @@ Offline installer consists of two parts, .exe and .bin. Make sure you download b
-
+ Instalação Manual
@@ -1487,13 +1488,14 @@ Por favor, selecione o diretório com Heroes III: Complete Edition ou Heroes III
-
+ Erro ao iniciar o executável
-
+ Falha ao iniciar %1
+Motivo: %2
diff --git a/lib/filesystem/CFileInputStream.cpp b/lib/filesystem/CFileInputStream.cpp
index 8f10d0d36..f777669de 100644
--- a/lib/filesystem/CFileInputStream.cpp
+++ b/lib/filesystem/CFileInputStream.cpp
@@ -10,6 +10,8 @@
#include "StdInc.h"
#include "CFileInputStream.h"
+#include "../ExceptionsCommon.h"
+
VCMI_LIB_NAMESPACE_BEGIN
CFileInputStream::CFileInputStream(const boost::filesystem::path & file, si64 start, si64 size)
@@ -18,7 +20,7 @@ CFileInputStream::CFileInputStream(const boost::filesystem::path & file, si64 st
fileStream{file.c_str(), std::ios::in | std::ios::binary}
{
if (fileStream.fail())
- throw std::runtime_error("File " + file.string() + " isn't available.");
+ throw DataLoadingException("Failed to open file '" + file.string() + "'. Reason: " + strerror(errno) );
if (dataSize == 0)
{
diff --git a/lib/filesystem/CFilesystemLoader.cpp b/lib/filesystem/CFilesystemLoader.cpp
index 09073660c..8086989e3 100644
--- a/lib/filesystem/CFilesystemLoader.cpp
+++ b/lib/filesystem/CFilesystemLoader.cpp
@@ -12,14 +12,22 @@
#include "CFileInputStream.h"
+#include "../ExceptionsCommon.h"
+
VCMI_LIB_NAMESPACE_BEGIN
CFilesystemLoader::CFilesystemLoader(std::string _mountPoint, boost::filesystem::path baseDirectory, size_t depth, bool initial):
baseDirectory(std::move(baseDirectory)),
mountPoint(std::move(_mountPoint)),
- fileList(listFiles(mountPoint, depth, initial)),
recursiveDepth(depth)
{
+ try {
+ fileList = listFiles(mountPoint, depth, initial);
+ }
+ catch (const boost::filesystem::filesystem_error & e) {
+ throw DataLoadingException("Failed to load content of '" + baseDirectory.string() + "'. Reason: " + e.what());
+ }
+
logGlobal->trace("File system loaded, %d files found", fileList.size());
}
diff --git a/lib/modding/CModHandler.cpp b/lib/modding/CModHandler.cpp
index 173fd921a..1cf7b7ba9 100644
--- a/lib/modding/CModHandler.cpp
+++ b/lib/modding/CModHandler.cpp
@@ -226,10 +226,7 @@ void CModHandler::loadOneMod(std::string modName, const std::string & parent, co
if(CResourceHandler::get("initial")->existsResource(CModInfo::getModFile(modFullName)))
{
- JsonParsingSettings settings;
- settings.mode = JsonParsingSettings::JsonFormatMode::JSON; // TODO: remove once Android launcher with its strict parser is gone
-
- CModInfo mod(modFullName, modSettings[modName], JsonNode(CModInfo::getModFile(modFullName), settings));
+ CModInfo mod(modFullName, modSettings[modName], JsonNode(CModInfo::getModFile(modFullName)));
if (!parent.empty()) // this is submod, add parent to dependencies
mod.dependencies.insert(parent);
diff --git a/mapeditor/translation/portuguese.ts b/mapeditor/translation/portuguese.ts
index d713fc3c0..15353214c 100644
--- a/mapeditor/translation/portuguese.ts
+++ b/mapeditor/translation/portuguese.ts
@@ -129,37 +129,37 @@
- Feitiços
+ Feitiços
-
+ Personalizar feitiços
-
+ Nível 1
-
+ Nível 2
-
+ Nível 3
-
+ Nível 4
-
+ Nível 5
@@ -1555,12 +1555,12 @@
- O pergaminho de feitiço %1 é proibido pelas configurações do mapa
+ O pergaminho mágico %1 é proibido pelas configurações do mapa
- O pergaminho de feitiço %1 não tem instância atribuída e deve ser removido
+ O pergaminho mágico %1 não tem instância atribuída e deve ser removido
@@ -1738,32 +1738,32 @@
-
+ S (36x36)
-
+ M (72x72)
-
+ L (108x108)
-
+ H (180x180)
-
+ XH (216x216)
-
+ G (252x252)
diff --git a/server/TurnTimerHandler.cpp b/server/TurnTimerHandler.cpp
index c6d46b142..b8dd196ed 100644
--- a/server/TurnTimerHandler.cpp
+++ b/server/TurnTimerHandler.cpp
@@ -313,10 +313,8 @@ void TurnTimerHandler::onBattleLoop(const BattleID & battleID, int waitTime)
}
else
{
- BattleAction retreat;
- retreat.side = side;
- retreat.actionType = EActionType::RETREAT; //harsh punishment
- gameHandler.battles->makePlayerBattleAction(battleID, player, retreat);
+ // battle vs neutrals - no-op, let battle run till the end
+ // once battle is over player turn will be over due to running out of timer on adventure map
}
}
}