Browse Source

Merge branch 'vcmi/master' into 'vcmi/develop'

Ivan Savenko 1 year ago
parent
commit
662254155a

+ 10 - 0
ChangeLog.md

@@ -1,3 +1,13 @@
+# 1.5.4 -> 1.5.5
+
+* Fixed crash when advancing to the next scenario in campaigns when the hero not transferring has a combination artefact that can be transferred to the next scenario.
+* Fixed game not updating information such as hero path and current music on new day
+* Changed default battle queue hotkey from Q to Z to match HD Mod / HotA
+* Changed default hotkey for finishing battle with quick combat from E to Z to match HD Mod / HotA
+* Creature casting now uses both F and G keyboard hotkeys
+* Shift+left click now directly opens the hero window when two heroes are in town
+* Fixed handling of alternative actions for creatures that have more than two potential actions, such as move, shoot, and cast spells.
+
 # 1.5.3 -> 1.5.4
 
 ### Stability

+ 3 - 3
Mods/vcmi/config/vcmi/portuguese.json

@@ -33,7 +33,7 @@
 	
 	"vcmi.heroOverview.startingArmy" : "Unidades Iniciais",
 	"vcmi.heroOverview.warMachine" : "Máquinas de Guerra",
-	"vcmi.heroOverview.secondarySkills" : "Habilidades Secundárias",
+	"vcmi.heroOverview.secondarySkills" : "Habilid. Secundárias",
 	"vcmi.heroOverview.spells" : "Feitiços",
 	
 	"vcmi.radialWheel.mergeSameUnit" : "Mesclar criaturas iguais",
@@ -259,7 +259,7 @@
 	"vcmi.battleWindow.damageRetaliation.damage" : "(%DAMAGE).",
 	"vcmi.battleWindow.damageRetaliation.damageKills" : "(%DAMAGE, %KILLS).",
 	
-	"vcmi.battleWindow.killed" : "Eliminados",
+	"vcmi.battleWindow.killed" : "Mortos",
 	"vcmi.battleWindow.accurateShot.resultDescription.0" : "%d %s morreram por tiros precisos!",
 	"vcmi.battleWindow.accurateShot.resultDescription.1" : "%d %s morreu com um tiro preciso!",
 	"vcmi.battleWindow.accurateShot.resultDescription.2" : "%d %s morreram por tiros precisos!",
@@ -612,7 +612,7 @@
 	"core.bonus.SPELL_LIKE_ATTACK.description" : "Ataques com ${subtype.spell}",
 	"core.bonus.SPELL_RESISTANCE_AURA.name" : "Aura de Resistência a Feitiços",
 	"core.bonus.SPELL_RESISTANCE_AURA.description" : "Pilhas próximas ganham ${val}% de resistência a magia",
-	"core.bonus.SUMMON_GUARDIANS.name" : "Invocar Guardiões",
+	"core.bonus.SUMMON_GUARDIANS.name" : "Invocar Guardas",
 	"core.bonus.SUMMON_GUARDIANS.description" : "No início da batalha, invoca ${subtype.creature} (${val}%)",
 	"core.bonus.SYNERGY_TARGET.name" : "Alvo Sinergizável",
 	"core.bonus.SYNERGY_TARGET.description" : "Esta criatura é vulnerável ao efeito de sinergia",

+ 1 - 1
client/adventureMap/AdventureMapInterface.cpp

@@ -444,7 +444,7 @@ void AdventureMapInterface::onPlayerTurnStarted(PlayerColor playerID)
 		LOCPLINT->localState->setSelection(LOCPLINT->localState->getWanderingHero(0));
 	}
 
-	centerOnObject(LOCPLINT->localState->getCurrentArmy());
+	onSelectionChanged(LOCPLINT->localState->getCurrentArmy());
 
 	//show new day animation and sound on infobar, except for 1st day of the game
 	if (LOCPLINT->cb->getDate(Date::DAY) != 1)

+ 25 - 19
client/battle/BattleActionsController.cpp

@@ -985,26 +985,27 @@ void BattleActionsController::activateStack()
 		std::list<PossiblePlayerBattleAction> actionsToSelect;
 		if(!possibleActions.empty())
 		{
-			switch(possibleActions.front().get())
+			auto primaryAction = possibleActions.front().get();
+
+			if(primaryAction == PossiblePlayerBattleAction::SHOOT || primaryAction == PossiblePlayerBattleAction::AIMED_SPELL_CREATURE
+				|| primaryAction == PossiblePlayerBattleAction::ANY_LOCATION || primaryAction == PossiblePlayerBattleAction::ATTACK_AND_RETURN)
 			{
-				case PossiblePlayerBattleAction::SHOOT:
-					actionsToSelect.push_back(possibleActions.front());
-					actionsToSelect.push_back(PossiblePlayerBattleAction::ATTACK);
-					break;
-					
-				case PossiblePlayerBattleAction::ATTACK_AND_RETURN:
-					actionsToSelect.push_back(possibleActions.front());
-					actionsToSelect.push_back(PossiblePlayerBattleAction::WALK_AND_ATTACK);
-					break;
-					
-				case PossiblePlayerBattleAction::AIMED_SPELL_CREATURE:
-					actionsToSelect.push_back(possibleActions.front());
-					actionsToSelect.push_back(PossiblePlayerBattleAction::ATTACK);
-					break;
-				case PossiblePlayerBattleAction::ANY_LOCATION:
-					actionsToSelect.push_back(possibleActions.front());
-					actionsToSelect.push_back(PossiblePlayerBattleAction::ATTACK);
-					break;
+				actionsToSelect.push_back(possibleActions.front());
+
+				auto shootActionPredicate = [](const PossiblePlayerBattleAction& action)
+				{
+					return action.get() == PossiblePlayerBattleAction::SHOOT;
+				};
+				bool hasShootSecondaryAction = std::any_of(possibleActions.begin() + 1, possibleActions.end(), shootActionPredicate);
+
+				if(hasShootSecondaryAction) //casters may have shooting capabilities, for example storm elementals
+					actionsToSelect.emplace_back(PossiblePlayerBattleAction::SHOOT);
+
+				/* TODO: maybe it would also make sense to check spellcast as non-top priority action ("NO_SPELLCAST_BY_DEFAULT" bonus)?
+				 * it would require going beyond this "if" block for melee casters
+				 * F button helps, but some mod creatures may have that bonus and more than 1 castable spell */
+
+				actionsToSelect.emplace_back(PossiblePlayerBattleAction::ATTACK); //always allow melee attack as last option
 			}
 		}
 		owner.windowObject->setAlternativeActions(actionsToSelect);
@@ -1071,3 +1072,8 @@ void BattleActionsController::pushFrontPossibleAction(PossiblePlayerBattleAction
 {
 	possibleActions.insert(possibleActions.begin(), action);
 }
+
+void BattleActionsController::resetCurrentStackPossibleActions()
+{
+	possibleActions = getPossibleActionsForStack(owner.stacksController->getActiveStack());
+}

+ 3 - 0
client/battle/BattleActionsController.h

@@ -122,4 +122,7 @@ public:
 	
 	/// inserts possible action in the beginning in order to prioritize it
 	void pushFrontPossibleAction(PossiblePlayerBattleAction);
+
+	/// resets possible actions to original state
+	void resetCurrentStackPossibleActions();
 };

+ 15 - 16
client/battle/BattleWindow.cpp

@@ -47,7 +47,7 @@
 
 BattleWindow::BattleWindow(BattleInterface & owner):
 	owner(owner),
-	defaultAction(PossiblePlayerBattleAction::INVALID)
+	lastAlternativeAction(PossiblePlayerBattleAction::INVALID)
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
 	pos.w = 800;
@@ -567,14 +567,18 @@ void BattleWindow::showAlternativeActionIcon(PossiblePlayerBattleAction action)
 
 void BattleWindow::setAlternativeActions(const std::list<PossiblePlayerBattleAction> & actions)
 {
+	assert(actions.size() != 1);
+
 	alternativeActions = actions;
-	defaultAction = PossiblePlayerBattleAction::INVALID;
+	lastAlternativeAction = PossiblePlayerBattleAction::INVALID;
+
 	if(alternativeActions.size() > 1)
-		defaultAction = alternativeActions.back();
-	if(!alternativeActions.empty())
+	{
+		lastAlternativeAction = alternativeActions.back();
 		showAlternativeActionIcon(alternativeActions.front());
+	}
 	else
-		showAlternativeActionIcon(defaultAction);
+		showAlternativeActionIcon(PossiblePlayerBattleAction::INVALID);
 }
 
 void BattleWindow::bAutofightf()
@@ -669,23 +673,18 @@ void BattleWindow::bSwitchActionf()
 {
 	if(alternativeActions.empty())
 		return;
-	
-	if(alternativeActions.front() == defaultAction)
-	{
-		alternativeActions.push_back(alternativeActions.front());
-		alternativeActions.pop_front();
-	}
-	
+
 	auto actions = owner.actionsController->getPossibleActions();
-	if(!actions.empty() && actions.front() == alternativeActions.front())
+
+	if(!actions.empty() && actions.front() != lastAlternativeAction)
 	{
 		owner.actionsController->removePossibleAction(alternativeActions.front());
-		showAlternativeActionIcon(defaultAction);
+		showAlternativeActionIcon(*std::next(alternativeActions.begin()));
 	}
 	else
 	{
-		owner.actionsController->pushFrontPossibleAction(alternativeActions.front());
-		showAlternativeActionIcon(alternativeActions.front());
+		owner.actionsController->resetCurrentStackPossibleActions();
+		showAlternativeActionIcon(owner.actionsController->getPossibleActions().front());
 	}
 	
 	alternativeActions.push_back(alternativeActions.front());

+ 1 - 1
client/battle/BattleWindow.h

@@ -65,7 +65,7 @@ class BattleWindow : public InterfaceObjectConfigurable
 	
 	/// management of alternative actions
 	std::list<PossiblePlayerBattleAction> alternativeActions;
-	PossiblePlayerBattleAction defaultAction;
+	PossiblePlayerBattleAction lastAlternativeAction;
 	void showAlternativeActionIcon(PossiblePlayerBattleAction);
 
 	/// flip battle queue visibility to opposite

+ 1 - 1
client/windows/CCastleInterface.cpp

@@ -430,7 +430,7 @@ void CHeroGSlot::clickPressed(const Point & cursorPosition)
 	{
 		setHighlight(false);
 
-		if(other->hero)
+		if(other->hero && !GH.isKeyboardShiftDown())
 			LOCPLINT->showHeroExchange(hero->id, other->hero->id);
 		else
 			LOCPLINT->openHeroWindow(hero);

+ 6 - 0
config/schemas/objectType.json

@@ -40,6 +40,12 @@
 				"$ref" : "objectTemplate.json"
 			}
 		},
+
+		"battleground" : {
+			"description" : "Battleground that will be used for combats in this object. Overrides terrain this object was placed on",
+			"type" : "string"
+		},
+
 		"sounds" : {
 			"type" : "object",
 			"additionalProperties" : false,

+ 3 - 3
config/shortcutsConfig.json

@@ -55,7 +55,7 @@
 		"adventureZoomOut":         "Keypad -",
 		"adventureZoomReset":       "Backspace",
 		"battleAutocombat":         "A",
-		"battleAutocombatEnd":      "E",
+		"battleAutocombatEnd":      "Q",
 		"battleCastSpell":          "C",
 		"battleConsoleDown":        "Down",
 		"battleConsoleUp":          "Up",
@@ -68,8 +68,8 @@
 		"battleTacticsEnd":         [ "Return", "Keypad Enter"],
 		"battleTacticsNext":        "Space",
 		"battleToggleHeroesStats":  [],
-		"battleToggleQueue":        "Q",
-		"battleUseCreatureSpell":   "F",
+		"battleToggleQueue":        "Z",
+		"battleUseCreatureSpell":   ["F", "G"],
 		"battleWait":               "W",
 		"exchangeArmySwap":         "F10",
 		"exchangeArmyToLeft":       [],

+ 6 - 0
debian/changelog

@@ -4,6 +4,12 @@ vcmi (1.6.0) jammy; urgency=medium
 
  -- Ivan Savenko <[email protected]>  Fri, 30 Aug 2024 12:00:00 +0200
 
+vcmi (1.5.5) jammy; urgency=medium
+
+  * New upstream release
+
+ -- Ivan Savenko <[email protected]>  Wed, 17 Jul 2024 12:00:00 +0200
+
 vcmi (1.5.4) jammy; urgency=medium
 
   * New upstream release

+ 1 - 1
docs/Readme.md

@@ -1,7 +1,7 @@
 [![VCMI](https://github.com/vcmi/vcmi/actions/workflows/github.yml/badge.svg?branch=develop&event=push)](https://github.com/vcmi/vcmi/actions/workflows/github.yml?query=branch%3Adevelop+event%3Apush)
 [![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.3/total)](https://github.com/vcmi/vcmi/releases/tag/1.5.3)
 [![Github Downloads](https://img.shields.io/github/downloads/vcmi/vcmi/1.5.4/total)](https://github.com/vcmi/vcmi/releases/tag/1.5.4)
+[![Github Downloads](https://img.shields.io/github/downloads/vcmi/vcmi/1.5.5/total)](https://github.com/vcmi/vcmi/releases/tag/1.5.5)
 [![Github Downloads](https://img.shields.io/github/downloads/vcmi/vcmi/total)](https://github.com/vcmi/vcmi/releases)
 
 # VCMI Project

+ 3 - 0
docs/modders/Map_Object_Format.md

@@ -60,6 +60,9 @@ Full object consists from 3 parts:
 		// How valuable this object is to AI
 		"aiValue" : 1000,
 		
+		// Battleground that will be used for combats in this object. Overrides terrain this object was placed on
+		"battleground" : "cursed_ground",
+		
 		// Sounds assigned to this object
 		"sounds" : {
 			// Ambient sounds that plays when current hero is near this object

+ 1 - 0
launcher/eu.vcmi.VCMI.metainfo.xml

@@ -91,6 +91,7 @@
 	<launchable type="desktop-id">vcmilauncher.desktop</launchable>
 	<releases>
 		<release version="1.6.0" date="2024-08-30" type="development"/>
+		<release version="1.5.5" date="2024-07-17" type="stable"/>
 		<release version="1.5.4" date="2024-07-12" type="stable"/>
 		<release version="1.5.3" date="2024-06-21" type="stable"/>
 		<release version="1.5.2" date="2024-05-31" type="stable"/>

+ 10 - 9
launcher/translation/chinese.ts

@@ -465,11 +465,11 @@
     <message>
         <location filename="../modManager/cmodlistview_moc.cpp" line="701"/>
         <source>Downloading %1. %p% (%v MB out of %m MB) finished</source>
-        <translation type="unfinished"></translation>
+        <translation>正在下载 %1. %p% (%v MB 共 %m MB) 已完成</translation>
     </message>
     <message>
         <source>Downloading %s%. %p% (%v MB out of %m MB) finished</source>
-        <translation type="vanished">下载进度 %s%. %p% (%v MB 共 %m MB) 已完成</translation>
+        <translation type="vanished">正在下载 %s%. %p% (%v MB 共 %m MB) 已完成</translation>
     </message>
     <message>
         <location filename="../modManager/cmodlistview_moc.cpp" line="726"/>
@@ -738,12 +738,12 @@ Install successfully downloaded?</source>
     <message>
         <location filename="../settingsView/csettingsview_moc.ui" line="1152"/>
         <source>Show Tutorial again</source>
-        <translation type="unfinished"></translation>
+        <translation>重新显示教程</translation>
     </message>
     <message>
         <location filename="../settingsView/csettingsview_moc.ui" line="1159"/>
         <source>Reset</source>
-        <translation type="unfinished"></translation>
+        <translation>重置</translation>
     </message>
     <message>
         <location filename="../settingsView/csettingsview_moc.ui" line="860"/>
@@ -1275,7 +1275,7 @@ Offline installer consists of two parts, .exe and .bin. Make sure you download b
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="330"/>
         <source>File cannot opened</source>
-        <translation type="unfinished"></translation>
+        <translation>打开文件失败</translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="336"/>
@@ -1324,23 +1324,24 @@ Please select directory with installed Heroes III data.</source>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="387"/>
         <source>You&apos;ve provided GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
-        <translation type="unfinished"></translation>
+        <translation>您提供的是GOG Galaxy安装器!这个文件不包含游戏内容,请下载离线游戏安装器!</translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="412"/>
         <source>Stream error while extracting files!
 error reason: </source>
-        <translation type="unfinished"></translation>
+        <translation>提取文件时遭遇文件流错误!
+错误原因: </translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="425"/>
         <source>Not a supported Inno Setup installer!</source>
-        <translation type="unfinished"></translation>
+        <translation>这不是一个支持的Inno Setup安装器!</translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="436"/>
         <source>Extracting error!</source>
-        <translation type="unfinished"></translation>
+        <translation>提取错误!</translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="506"/>

+ 10 - 9
launcher/translation/portuguese.ts

@@ -461,7 +461,7 @@
     <message>
         <location filename="../modManager/cmodlistview_moc.cpp" line="701"/>
         <source>Downloading %1. %p% (%v MB out of %m MB) finished</source>
-        <translation type="unfinished"></translation>
+        <translation>Baixando %1. %p% (%v MB de %m MB) concluído</translation>
     </message>
     <message>
         <source>Downloading %s%. %p% (%v MB out of %m MB) finished</source>
@@ -733,12 +733,12 @@ Instalar o download realizado com sucesso?</translation>
     <message>
         <location filename="../settingsView/csettingsview_moc.ui" line="1152"/>
         <source>Show Tutorial again</source>
-        <translation type="unfinished"></translation>
+        <translation>Mostrar o Tutorial novamente</translation>
     </message>
     <message>
         <location filename="../settingsView/csettingsview_moc.ui" line="1159"/>
         <source>Reset</source>
-        <translation type="unfinished"></translation>
+        <translation>Redefinir</translation>
     </message>
     <message>
         <location filename="../settingsView/csettingsview_moc.ui" line="860"/>
@@ -940,7 +940,7 @@ Modo de tela cheia exclusivo - o jogo cobrirá toda a sua tela e usará a resolu
     <message>
         <location filename="../settingsView/csettingsview_moc.ui" line="796"/>
         <source>Autosave</source>
-        <translation>Salvar automaticamente</translation>
+        <translation>Salvamento automático</translation>
     </message>
     <message>
         <location filename="../settingsView/csettingsview_moc.ui" line="597"/>
@@ -1268,7 +1268,7 @@ O instalador offline consiste em duas partes, .exe e .bin. Certifique-se de baix
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="330"/>
         <source>File cannot opened</source>
-        <translation type="unfinished"></translation>
+        <translation>O arquivo não pode ser aberto</translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="336"/>
@@ -1317,23 +1317,24 @@ Por favor, selecione o diretório com os dados do Heroes III instalados.</transl
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="387"/>
         <source>You&apos;ve provided GOG Galaxy installer! This file doesn&apos;t contain the game. Please download the offline backup game installer!</source>
-        <translation type="unfinished"></translation>
+        <translation>Você forneceu o instalador do GOG Galaxy! Este arquivo não contém o jogo. Por favor, faça o download do instalador offline de backup do jogo!</translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="412"/>
         <source>Stream error while extracting files!
 error reason: </source>
-        <translation type="unfinished"></translation>
+        <translation>Erro de fluxo ao extrair arquivos!
+Motivo do erro: </translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="425"/>
         <source>Not a supported Inno Setup installer!</source>
-        <translation type="unfinished"></translation>
+        <translation>Instalador do Inno Setup não suportado!</translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="436"/>
         <source>Extracting error!</source>
-        <translation type="unfinished"></translation>
+        <translation>Erro ao extrair!</translation>
     </message>
     <message>
         <location filename="../firstLaunch/firstlaunch_moc.cpp" line="506"/>

+ 5 - 0
lib/battle/PossiblePlayerBattleAction.h

@@ -74,6 +74,11 @@ public:
 	{
 		return action == other.action && spellToCast == other.spellToCast;
 	}
+
+	bool operator != (const PossiblePlayerBattleAction & other) const
+	{
+		return action != other.action || spellToCast != other.spellToCast;
+	}
 };
 
 VCMI_LIB_NAMESPACE_END

+ 5 - 0
lib/gameState/CGameStateCampaign.cpp

@@ -120,6 +120,11 @@ void CGameStateCampaign::trimCrossoverHeroesParameters(const CampaignTravel & tr
 				if(!info)
 					return false;
 
+				// FIXME: double-check how H3 handles case of transferring components of a combined artifact if entire combined artifact is not transferrable
+				// For example, what happens if hero has assembled Angelic Alliance, AA is not marked is transferrable, but Sandals can be transferred? Should artifact be disassembled?
+				if (info->locked)
+					return false;
+
 				// TODO: why would there be nullptr artifacts?
 				const CArtifactInstance *art = info->artifact;
 				if(!art)

+ 9 - 9
mapeditor/translation/portuguese.ts

@@ -6,17 +6,17 @@
     <message>
         <location filename="../inspector/armywidget.ui" line="23"/>
         <source>Army settings</source>
-        <translation>Configurações do Exército</translation>
+        <translation>Configurações do exército</translation>
     </message>
     <message>
         <location filename="../inspector/armywidget.ui" line="142"/>
         <source>Wide formation</source>
-        <translation>Formação Aberta</translation>
+        <translation>Formação aberta</translation>
     </message>
     <message>
         <location filename="../inspector/armywidget.ui" line="129"/>
         <source>Tight formation</source>
-        <translation>Formação Compacta</translation>
+        <translation>Formação compacta</translation>
     </message>
 </context>
 <context>
@@ -29,7 +29,7 @@
     <message>
         <location filename="../mapsettings/eventsettings.ui" line="34"/>
         <source>Timed events</source>
-        <translation>Eventos Temporizados</translation>
+        <translation>Eventos temporizados</translation>
     </message>
     <message>
         <location filename="../mapsettings/eventsettings.ui" line="60"/>
@@ -44,7 +44,7 @@
     <message>
         <location filename="../mapsettings/eventsettings.cpp" line="101"/>
         <source>New event</source>
-        <translation>Novo Evento</translation>
+        <translation>Novo evento</translation>
     </message>
 </context>
 <context>
@@ -57,12 +57,12 @@
     <message>
         <location filename="../mapsettings/generalsettings.ui" line="32"/>
         <source>Map name</source>
-        <translation>Nome do Mapa</translation>
+        <translation>Nome do mapa</translation>
     </message>
     <message>
         <location filename="../mapsettings/generalsettings.ui" line="42"/>
         <source>Map description</source>
-        <translation>Descrição do Mapa</translation>
+        <translation>Descrição do mapa</translation>
     </message>
     <message>
         <location filename="../mapsettings/generalsettings.ui" line="76"/>
@@ -88,7 +88,7 @@
     <message>
         <location filename="../inspector/heroskillswidget.ui" line="14"/>
         <source>Hero skills</source>
-        <translation>Habilidades do Herói</translation>
+        <translation>Habilidades do herói</translation>
     </message>
     <message>
         <location filename="../inspector/heroskillswidget.ui" line="28"/>
@@ -172,7 +172,7 @@
     <message>
         <location filename="../mapsettings/loseconditions.ui" line="40"/>
         <source>Defeat message</source>
-        <translation>Mensagem de Derrota</translation>
+        <translation>Mensagem de derrota</translation>
     </message>
     <message>
         <location filename="../mapsettings/loseconditions.ui" line="59"/>