1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-02 00:10:22 +02:00

Merge pull request #4166 from IvanSavenko/release_153

Preparation for 1.5.3 release
This commit is contained in:
Ivan Savenko 2024-06-20 14:07:44 +03:00 committed by GitHub
commit 650dfcbed8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 123 additions and 98 deletions

View File

@ -621,6 +621,9 @@ BattleScore BattleExchangeEvaluator::calculateExchange(
if(!exchangeBattle->getForUpdate(u->unitId())->alive()) if(!exchangeBattle->getForUpdate(u->unitId())->alive())
return false; 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 vstd::contains_if(reachabilityMap.at(u->getPosition()), [&attacker](const battle::Unit * other) -> bool
{ {
return attacker->unitId() == other->unitId(); return attacker->unitId() == other->unitId();

View File

@ -9,6 +9,8 @@
* Game should now generate crash dump on uncaught c++ exception throw * Game should now generate crash dump on uncaught c++ exception throw
* Fixed crash when player finishes game with negative score * Fixed crash when player finishes game with negative score
* Fixed crash when opening tavern window in some localisations * 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 ### Mechanics
* Transport Artefact victory condition will no longer trigger if another player has completed it. * 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. * 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. * 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. * 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 ### Interface
* Fixed reversed button functions in Exchange Window * 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 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. * Fixed potential crash when Battle AI selects a spell to cast from a hero with summon spells.
* Several fixes to Nullkiller AI exploration logic * Several fixes to Nullkiller AI exploration logic
* Fixed bug leading to Battle AI doing nothing if targeted unit is unreachable
### Random Maps Generator ### 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. * 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.

View File

@ -55,7 +55,7 @@
"vcmi.radialWheel.moveDown" : "Mover para baixo", "vcmi.radialWheel.moveDown" : "Mover para baixo",
"vcmi.radialWheel.moveBottom" : "Mover para o fundo", "vcmi.radialWheel.moveBottom" : "Mover para o fundo",
"vcmi.spellBook.search" : "procurar...", "vcmi.spellBook.search" : "Procurar...",
"vcmi.mainMenu.serverConnecting" : "Conectando...", "vcmi.mainMenu.serverConnecting" : "Conectando...",
"vcmi.mainMenu.serverAddressEnter" : "Insira o endereço:", "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.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.modsToEnable" : "{Os seguintes mods são necessários}",
"vcmi.server.errors.modsToDisable" : "{Os seguintes mods devem ser desativados}", "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.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 mod {'%s'}!\n Conflita com o mod ativo {'%s'}!\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 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.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.", "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.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.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.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.hover" : "Sempre Mostrar 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.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.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" : "{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", "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.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.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.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.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.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.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.", "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.tutorialWindow.decription.AbortSpell" : "Toque e mantenha pressionado para cancelar um feitiço.",
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Mostrar Criaturas Disponíveis", "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.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 Crescimento Semanal de Criaturas", "vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Mostrar Produção 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.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.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 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.select" : "Selecionar cronômetro do turno",
"vcmi.optionsTab.turnTime.unlimited" : "Tempo de turno ilimitado", "vcmi.optionsTab.turnTime.unlimited" : "Tempo de turno ilimitado",
"vcmi.optionsTab.turnTime.classic.1" : "Cronômetro clássico: 1 minuto", "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.2" : "Cronômetro clássico 2 minutos",
"vcmi.optionsTab.turnTime.classic.5" : "Cronômetro clássico: 5 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.10" : "Cronômetro clássico 10 minutos",
"vcmi.optionsTab.turnTime.classic.20" : "Cronômetro clássico: 20 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.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.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.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.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.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.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.chess.1" : "Xadrez 01:00 + 01:00 + 00:00 + 00:00",
"vcmi.optionsTab.simturns.select" : "Selecionar turnos simultâneos", "vcmi.optionsTab.simturns.select" : "Selecionar turnos simultâneos",
"vcmi.optionsTab.simturns.none" : "Sem 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.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.name" : "Ataque em Todas as Direções",
"core.bonus.ATTACKS_ALL_ADJACENT.description" : "Ataca todos os inimigos adjacentes", "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_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.BLOCKS_RANGED_RETALIATION.description" : "O inimigo não pode contra-atacar usando um ataque à distância",
"core.bonus.CATAPULT.name" : "Catapulta", "core.bonus.CATAPULT.name" : "Catapulta",
"core.bonus.CATAPULT.description" : "Ataca as muralhas de cerco", "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_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.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}", "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.name" : "Olhar da Morte (${val}%)",
"core.bonus.DEATH_STARE.description" : "Tem ${val}% de chance de matar uma única criatura", "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.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.name" : "Destruição",
"core.bonus.DESTRUCTION.description" : "Tem ${val}% de chance de matar unidades extras após o ataque", "core.bonus.DESTRUCTION.description" : "Tem ${val}% de chance de matar unidades extras após o ataque",
"core.bonus.DOUBLE_DAMAGE_CHANCE.name" : "Golpe Mortal", "core.bonus.DOUBLE_DAMAGE_CHANCE.name" : "Golpe Mortal",
@ -521,7 +521,7 @@
"core.bonus.ENCHANTED.name" : "Encantado", "core.bonus.ENCHANTED.name" : "Encantado",
"core.bonus.ENCHANTED.description" : "Afetado por ${subtype.spell} permanente", "core.bonus.ENCHANTED.description" : "Afetado por ${subtype.spell} permanente",
"core.bonus.ENEMY_ATTACK_REDUCTION.name" : "Ignorar Ataque (${val}%)", "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.name" : "Ignorar Defesa (${val}%)",
"core.bonus.ENEMY_DEFENCE_REDUCTION.description" : "Ao atacar, ${val}% da defesa do defensor é ignorada", "core.bonus.ENEMY_DEFENCE_REDUCTION.description" : "Ao atacar, ${val}% da defesa do defensor é ignorada",
"core.bonus.FIRE_IMMUNITY.name" : "Imunidade ao Fogo", "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.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.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.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.name" : "Curandeiro",
"core.bonus.HEALER.description" : "Cura unidades aliadas", "core.bonus.HEALER.description" : "Cura unidades aliadas",
"core.bonus.HP_REGENERATION.name" : "Regeneração", "core.bonus.HP_REGENERATION.name" : "Regeneração",

View File

@ -208,7 +208,14 @@ int main(int argc, char * argv[])
logGlobal->info("The log file will be saved to %s", logPath); logGlobal->info("The log file will be saved to %s", logPath);
// Init filesystem and settings // Init filesystem and settings
preinitDLL(::console, false); try
{
preinitDLL(::console, false);
}
catch (const DataLoadingException & e)
{
handleFatalError(e.what(), true);
}
Settings session = settings.write["session"]; Settings session = settings.write["session"];
auto setSettingBool = [&](std::string key, std::string arg) { auto setSettingBool = [&](std::string key, std::string arg) {

View File

@ -1540,6 +1540,9 @@ CHallInterface::CHallInterface(const CGTownInstance * Town):
const CBuilding * building = nullptr; const CBuilding * building = nullptr;
for(auto & buildingID : boxList[row][col])//we are looking for the first not built structure 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); const CBuilding * current = town->town->buildings.at(buildingID);
if(vstd::contains(town->builtBuildings, buildingID)) if(vstd::contains(town->builtBuildings, buildingID))
{ {

View File

@ -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.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.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.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) [![Github Downloads](https://img.shields.io/github/downloads/vcmi/vcmi/total)](https://github.com/vcmi/vcmi/releases)
# VCMI Project # VCMI Project

View File

@ -349,10 +349,10 @@ Negates all natural immunities for affected stacks. (Orb of Vulnerability)
### OPENING_BATTLE_SPELL ### 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 - subtype: spell identifer
- val: spell mastery level - val: duration of the spell, in rounds
### FREE_SHIP_BOARDING ### FREE_SHIP_BOARDING

View File

@ -79,7 +79,7 @@
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="234"/> <location filename="../aboutProject/aboutproject_moc.ui" line="234"/>
<source>Configuration files directory</source> <source>Configuration files directory</source>
<translation type="unfinished"></translation> <translation>Diretório de arquivos de configuração</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="297"/> <location filename="../aboutProject/aboutproject_moc.ui" line="297"/>
@ -294,7 +294,7 @@
<message> <message>
<location filename="../modManager/cmodlistview_moc.ui" line="105"/> <location filename="../modManager/cmodlistview_moc.ui" line="105"/>
<source>Reload repositories</source> <source>Reload repositories</source>
<translation type="unfinished"></translation> <translation>Recarregar repositórios</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistview_moc.ui" line="340"/> <location filename="../modManager/cmodlistview_moc.ui" line="340"/>
@ -574,7 +574,7 @@ Instalar o download realizado com sucesso?</translation>
<message> <message>
<location filename="../modManager/cmodmanager.cpp" line="204"/> <location filename="../modManager/cmodmanager.cpp" line="204"/>
<source>Required mod %1 is not enabled</source> <source>Required mod %1 is not enabled</source>
<translation>O mod necessário %1 não está habilitado</translation> <translation>O mod necessário %1 não está ativado</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodmanager.cpp" line="213"/> <location filename="../modManager/cmodmanager.cpp" line="213"/>
@ -664,132 +664,132 @@ Instalar o download realizado com sucesso?</translation>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="507"/> <location filename="../settingsView/csettingsview_moc.ui" line="507"/>
<source>Adventure Map Allies</source> <source>Adventure Map Allies</source>
<translation>Aliados do mapa de aventura</translation> <translation>Aliados do Mapa de Aventura</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="59"/> <location filename="../settingsView/csettingsview_moc.ui" line="59"/>
<source>Online Lobby port</source> <source>Online Lobby port</source>
<translation type="unfinished"></translation> <translation>Porta da Sala de Espera On-line</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="66"/> <location filename="../settingsView/csettingsview_moc.ui" line="66"/>
<source>Autocombat AI in battles</source> <source>Autocombat AI in battles</source>
<translation type="unfinished"></translation> <translation>IA de combate automático nas batalhas</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="73"/> <location filename="../settingsView/csettingsview_moc.ui" line="73"/>
<source>Sticks Sensitivity</source> <source>Sticks Sensitivity</source>
<translation type="unfinished"></translation> <translation>Sensibilidade dos Analógicos</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="87"/> <location filename="../settingsView/csettingsview_moc.ui" line="87"/>
<source>Haptic Feedback</source> <source>Haptic Feedback</source>
<translation type="unfinished"></translation> <translation>Resposta Tátil</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="94"/> <location filename="../settingsView/csettingsview_moc.ui" line="94"/>
<source>Software Cursor</source> <source>Software Cursor</source>
<translation type="unfinished"></translation> <translation>Cursor por Software</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="108"/> <location filename="../settingsView/csettingsview_moc.ui" line="108"/>
<source>Online Lobby address</source> <source>Online Lobby address</source>
<translation type="unfinished"></translation> <translation>Endereço da Sala de Espera On-line</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="115"/> <location filename="../settingsView/csettingsview_moc.ui" line="115"/>
<source>Upscaling Filter</source> <source>Upscaling Filter</source>
<translation type="unfinished"></translation> <translation>Filtro de Aumento de Escala</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="122"/> <location filename="../settingsView/csettingsview_moc.ui" line="122"/>
<source>Use Relative Pointer Mode</source> <source>Use Relative Pointer Mode</source>
<translation type="unfinished"></translation> <translation>Usar Modo de Ponteiro Relativo</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="195"/> <location filename="../settingsView/csettingsview_moc.ui" line="195"/>
<source>Nearest</source> <source>Nearest</source>
<translation type="unfinished"></translation> <translation>Mais Próximo</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="200"/> <location filename="../settingsView/csettingsview_moc.ui" line="200"/>
<source>Linear</source> <source>Linear</source>
<translation type="unfinished"></translation> <translation>Linear</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="205"/> <location filename="../settingsView/csettingsview_moc.ui" line="205"/>
<source>Best (Linear)</source> <source>Best (Linear)</source>
<translation type="unfinished"></translation> <translation>Melhor (Linear)</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="231"/> <location filename="../settingsView/csettingsview_moc.ui" line="231"/>
<source>Input - Touchscreen</source> <source>Input - Touchscreen</source>
<translation type="unfinished"></translation> <translation>Entrada - Tela de Toque</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="440"/> <location filename="../settingsView/csettingsview_moc.ui" line="440"/>
<source>Adventure Map Enemies</source> <source>Adventure Map Enemies</source>
<translation>Inimigos do mapa de aventura</translation> <translation>Inimigos do Mapa de Aventura</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="474"/> <location filename="../settingsView/csettingsview_moc.ui" line="474"/>
<source>Network</source> <source>Network</source>
<translation type="unfinished"></translation> <translation>Linear</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="540"/> <location filename="../settingsView/csettingsview_moc.ui" line="540"/>
<source>Audio</source> <source>Audio</source>
<translation type="unfinished"></translation> <translation>Áudio</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="578"/> <location filename="../settingsView/csettingsview_moc.ui" line="578"/>
<source>Relative Pointer Speed</source> <source>Relative Pointer Speed</source>
<translation type="unfinished"></translation> <translation>Velocidade do Ponteiro Relativo</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="585"/> <location filename="../settingsView/csettingsview_moc.ui" line="585"/>
<source>Music Volume</source> <source>Music Volume</source>
<translation type="unfinished"></translation> <translation>Volume da Música</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="606"/> <location filename="../settingsView/csettingsview_moc.ui" line="606"/>
<source>Ignore SSL errors</source> <source>Ignore SSL errors</source>
<translation type="unfinished"></translation> <translation>Ignorar erros SSL</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="618"/> <location filename="../settingsView/csettingsview_moc.ui" line="618"/>
<source>Input - Mouse</source> <source>Input - Mouse</source>
<translation type="unfinished"></translation> <translation>Entrada - Mouse</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="628"/> <location filename="../settingsView/csettingsview_moc.ui" line="628"/>
<source>Long Touch Duration</source> <source>Long Touch Duration</source>
<translation type="unfinished"></translation> <translation>Duração do Toque Longo</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="635"/> <location filename="../settingsView/csettingsview_moc.ui" line="635"/>
<source>%</source> <source>%</source>
<translation type="unfinished"></translation> <translation>%</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="658"/> <location filename="../settingsView/csettingsview_moc.ui" line="658"/>
<source>Controller Click Tolerance</source> <source>Controller Click Tolerance</source>
<translation type="unfinished"></translation> <translation>Tolerância de Clique do Controle</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="665"/> <location filename="../settingsView/csettingsview_moc.ui" line="665"/>
<source>Touch Tap Tolerance</source> <source>Touch Tap Tolerance</source>
<translation type="unfinished"></translation> <translation>Tolerância de Toque Tátil</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="704"/> <location filename="../settingsView/csettingsview_moc.ui" line="704"/>
<source>Input - Controller</source> <source>Input - Controller</source>
<translation type="unfinished"></translation> <translation>Entrada - Controle</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="771"/> <location filename="../settingsView/csettingsview_moc.ui" line="771"/>
<source>Sound Volume</source> <source>Sound Volume</source>
<translation type="unfinished"></translation> <translation>Volume do Som</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="801"/> <location filename="../settingsView/csettingsview_moc.ui" line="801"/>
@ -818,7 +818,7 @@ Instalar o download realizado com sucesso?</translation>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="514"/> <location filename="../settingsView/csettingsview_moc.ui" line="514"/>
<source>Framerate Limit</source> <source>Framerate Limit</source>
<translation>Limite de taxa de quadros</translation> <translation>Limite de Taxa de Quadros</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="778"/> <location filename="../settingsView/csettingsview_moc.ui" line="778"/>
@ -828,12 +828,12 @@ Instalar o download realizado com sucesso?</translation>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="839"/> <location filename="../settingsView/csettingsview_moc.ui" line="839"/>
<source>Mouse Click Tolerance</source> <source>Mouse Click Tolerance</source>
<translation type="unfinished"></translation> <translation>Tolerância de Clique do Mouse</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="853"/> <location filename="../settingsView/csettingsview_moc.ui" line="853"/>
<source>Sticks Acceleration</source> <source>Sticks Acceleration</source>
<translation type="unfinished"></translation> <translation>Aceleração dos Analógicos</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="995"/> <location filename="../settingsView/csettingsview_moc.ui" line="995"/>
@ -1064,12 +1064,12 @@ Heroes® of Might and Magic® III HD atualmente não é suportado!</translation>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="304"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="304"/>
<source>Use offline installer from gog.com</source> <source>Use offline installer from gog.com</source>
<translation type="unfinished"></translation> <translation>Usar instalador offline do gog.com</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="317"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="317"/>
<source>You can manually copy directories Maps, Data and Mp3 from the original game directory to VCMI data directory that you can see on top of this page</source> <source>You can manually copy directories Maps, Data and Mp3 from the original game directory to VCMI data directory that you can see on top of this page</source>
<translation type="unfinished"></translation> <translation>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</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="336"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="336"/>
@ -1106,23 +1106,24 @@ Heroes® of Might and Magic® III HD atualmente não é suportado!</translation>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="395"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="395"/>
<source>Installing... %p%</source> <source>Installing... %p%</source>
<translation type="unfinished"></translation> <translation>Instalando... %p%</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="424"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="424"/>
<source>If you already have Heroes III files on your device, you can select this directory and VCMI will copy the existing data automatically.</source> <source>If you already have Heroes III files on your device, you can select this directory and VCMI will copy the existing data automatically.</source>
<translation type="unfinished"></translation> <translation>Se você tem arquivos do Heroes III no seu dispositivo, você pode selecionar este diretório e o VCMI irá copiar os dados existentes automaticamente.</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="466"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="466"/>
<source>Copy existing files</source> <source>Copy existing files</source>
<translation type="unfinished"></translation> <translation>Copiar arquivos existentes</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="511"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="511"/>
<source>If you own Heroes III on gog.com you can download backup offline installer from gog.com, and VCMI will import Heroes III data using offline installer. <source>If you own Heroes III on gog.com you can download backup offline installer from gog.com, and VCMI will import Heroes III data using offline installer.
Offline installer consists of two parts, .exe and .bin. Make sure you download both of them.</source> Offline installer consists of two parts, .exe and .bin. Make sure you download both of them.</source>
<translation type="unfinished"></translation> <translation>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.</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="696"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="696"/>
@ -1173,7 +1174,7 @@ Offline installer consists of two parts, .exe and .bin. Make sure you download b
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="354"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="354"/>
<source>Manual Installation</source> <source>Manual Installation</source>
<translation type="unfinished"></translation> <translation>Instalação Manual</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="367"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="367"/>
@ -1487,13 +1488,14 @@ Por favor, selecione o diretório com Heroes III: Complete Edition ou Heroes III
<message> <message>
<location filename="../main.cpp" line="121"/> <location filename="../main.cpp" line="121"/>
<source>Error starting executable</source> <source>Error starting executable</source>
<translation type="unfinished"></translation> <translation>Erro ao iniciar o executável</translation>
</message> </message>
<message> <message>
<location filename="../main.cpp" line="122"/> <location filename="../main.cpp" line="122"/>
<source>Failed to start %1 <source>Failed to start %1
Reason: %2</source> Reason: %2</source>
<translation type="unfinished"></translation> <translation>Falha ao iniciar %1
Motivo: %2</translation>
</message> </message>
</context> </context>
<context> <context>

View File

@ -10,6 +10,8 @@
#include "StdInc.h" #include "StdInc.h"
#include "CFileInputStream.h" #include "CFileInputStream.h"
#include "../ExceptionsCommon.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
CFileInputStream::CFileInputStream(const boost::filesystem::path & file, si64 start, si64 size) 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} fileStream{file.c_str(), std::ios::in | std::ios::binary}
{ {
if (fileStream.fail()) 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) if (dataSize == 0)
{ {

View File

@ -12,14 +12,22 @@
#include "CFileInputStream.h" #include "CFileInputStream.h"
#include "../ExceptionsCommon.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
CFilesystemLoader::CFilesystemLoader(std::string _mountPoint, boost::filesystem::path baseDirectory, size_t depth, bool initial): CFilesystemLoader::CFilesystemLoader(std::string _mountPoint, boost::filesystem::path baseDirectory, size_t depth, bool initial):
baseDirectory(std::move(baseDirectory)), baseDirectory(std::move(baseDirectory)),
mountPoint(std::move(_mountPoint)), mountPoint(std::move(_mountPoint)),
fileList(listFiles(mountPoint, depth, initial)),
recursiveDepth(depth) 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()); logGlobal->trace("File system loaded, %d files found", fileList.size());
} }

View File

@ -226,10 +226,7 @@ void CModHandler::loadOneMod(std::string modName, const std::string & parent, co
if(CResourceHandler::get("initial")->existsResource(CModInfo::getModFile(modFullName))) if(CResourceHandler::get("initial")->existsResource(CModInfo::getModFile(modFullName)))
{ {
JsonParsingSettings settings; CModInfo mod(modFullName, modSettings[modName], JsonNode(CModInfo::getModFile(modFullName)));
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));
if (!parent.empty()) // this is submod, add parent to dependencies if (!parent.empty()) // this is submod, add parent to dependencies
mod.dependencies.insert(parent); mod.dependencies.insert(parent);

View File

@ -129,37 +129,37 @@
<message> <message>
<location filename="../inspector/herospellwidget.ui" line="29"/> <location filename="../inspector/herospellwidget.ui" line="29"/>
<source>Spells</source> <source>Spells</source>
<translation type="unfinished">Feitiços</translation> <translation>Feitiços</translation>
</message> </message>
<message> <message>
<location filename="../inspector/herospellwidget.ui" line="47"/> <location filename="../inspector/herospellwidget.ui" line="47"/>
<source>Customize spells</source> <source>Customize spells</source>
<translation type="unfinished"></translation> <translation>Personalizar feitiços</translation>
</message> </message>
<message> <message>
<location filename="../inspector/herospellwidget.ui" line="76"/> <location filename="../inspector/herospellwidget.ui" line="76"/>
<source>Level 1</source> <source>Level 1</source>
<translation type="unfinished"></translation> <translation>Nível 1</translation>
</message> </message>
<message> <message>
<location filename="../inspector/herospellwidget.ui" line="114"/> <location filename="../inspector/herospellwidget.ui" line="114"/>
<source>Level 2</source> <source>Level 2</source>
<translation type="unfinished"></translation> <translation>Nível 2</translation>
</message> </message>
<message> <message>
<location filename="../inspector/herospellwidget.ui" line="152"/> <location filename="../inspector/herospellwidget.ui" line="152"/>
<source>Level 3</source> <source>Level 3</source>
<translation type="unfinished"></translation> <translation>Nível 3</translation>
</message> </message>
<message> <message>
<location filename="../inspector/herospellwidget.ui" line="190"/> <location filename="../inspector/herospellwidget.ui" line="190"/>
<source>Level 4</source> <source>Level 4</source>
<translation type="unfinished"></translation> <translation>Nível 4</translation>
</message> </message>
<message> <message>
<location filename="../inspector/herospellwidget.ui" line="228"/> <location filename="../inspector/herospellwidget.ui" line="228"/>
<source>Level 5</source> <source>Level 5</source>
<translation type="unfinished"></translation> <translation>Nível 5</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1555,12 +1555,12 @@
<message> <message>
<location filename="../validator.cpp" line="146"/> <location filename="../validator.cpp" line="146"/>
<source>Spell scroll %1 is prohibited by map settings</source> <source>Spell scroll %1 is prohibited by map settings</source>
<translation>O pergaminho de feitiço %1 é proibido pelas configurações do mapa</translation> <translation>O pergaminho mágico %1 é proibido pelas configurações do mapa</translation>
</message> </message>
<message> <message>
<location filename="../validator.cpp" line="149"/> <location filename="../validator.cpp" line="149"/>
<source>Spell scroll %1 doesn&apos;t have instance assigned and must be removed</source> <source>Spell scroll %1 doesn&apos;t have instance assigned and must be removed</source>
<translation>O pergaminho de feitiço %1 não tem instância atribuída e deve ser removido</translation> <translation>O pergaminho mágico %1 não tem instância atribuída e deve ser removido</translation>
</message> </message>
<message> <message>
<location filename="../validator.cpp" line="155"/> <location filename="../validator.cpp" line="155"/>
@ -1738,32 +1738,32 @@
<message> <message>
<location filename="../windownewmap.ui" line="164"/> <location filename="../windownewmap.ui" line="164"/>
<source>S (36x36)</source> <source>S (36x36)</source>
<translation type="unfinished"></translation> <translation>S (36x36)</translation>
</message> </message>
<message> <message>
<location filename="../windownewmap.ui" line="169"/> <location filename="../windownewmap.ui" line="169"/>
<source>M (72x72)</source> <source>M (72x72)</source>
<translation type="unfinished"></translation> <translation>M (72x72)</translation>
</message> </message>
<message> <message>
<location filename="../windownewmap.ui" line="174"/> <location filename="../windownewmap.ui" line="174"/>
<source>L (108x108)</source> <source>L (108x108)</source>
<translation type="unfinished"></translation> <translation>L (108x108)</translation>
</message> </message>
<message> <message>
<location filename="../windownewmap.ui" line="184"/> <location filename="../windownewmap.ui" line="184"/>
<source>H (180x180)</source> <source>H (180x180)</source>
<translation type="unfinished"></translation> <translation>H (180x180)</translation>
</message> </message>
<message> <message>
<location filename="../windownewmap.ui" line="189"/> <location filename="../windownewmap.ui" line="189"/>
<source>XH (216x216)</source> <source>XH (216x216)</source>
<translation type="unfinished"></translation> <translation>XH (216x216)</translation>
</message> </message>
<message> <message>
<location filename="../windownewmap.ui" line="194"/> <location filename="../windownewmap.ui" line="194"/>
<source>G (252x252)</source> <source>G (252x252)</source>
<translation type="unfinished"></translation> <translation>G (252x252)</translation>
</message> </message>
<message> <message>
<location filename="../windownewmap.ui" line="248"/> <location filename="../windownewmap.ui" line="248"/>

View File

@ -313,10 +313,8 @@ void TurnTimerHandler::onBattleLoop(const BattleID & battleID, int waitTime)
} }
else else
{ {
BattleAction retreat; // battle vs neutrals - no-op, let battle run till the end
retreat.side = side; // once battle is over player turn will be over due to running out of timer on adventure map
retreat.actionType = EActionType::RETREAT; //harsh punishment
gameHandler.battles->makePlayerBattleAction(battleID, player, retreat);
} }
} }
} }