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

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

This commit is contained in:
Ivan Savenko 2024-07-17 13:57:36 +00:00
commit 662254155a
19 changed files with 118 additions and 72 deletions

View File

@ -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 # 1.5.3 -> 1.5.4
### Stability ### Stability

View File

@ -33,7 +33,7 @@
"vcmi.heroOverview.startingArmy" : "Unidades Iniciais", "vcmi.heroOverview.startingArmy" : "Unidades Iniciais",
"vcmi.heroOverview.warMachine" : "Máquinas de Guerra", "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.heroOverview.spells" : "Feitiços",
"vcmi.radialWheel.mergeSameUnit" : "Mesclar criaturas iguais", "vcmi.radialWheel.mergeSameUnit" : "Mesclar criaturas iguais",
@ -259,7 +259,7 @@
"vcmi.battleWindow.damageRetaliation.damage" : "(%DAMAGE).", "vcmi.battleWindow.damageRetaliation.damage" : "(%DAMAGE).",
"vcmi.battleWindow.damageRetaliation.damageKills" : "(%DAMAGE, %KILLS).", "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.0" : "%d %s morreram por tiros precisos!",
"vcmi.battleWindow.accurateShot.resultDescription.1" : "%d %s morreu com um tiro preciso!", "vcmi.battleWindow.accurateShot.resultDescription.1" : "%d %s morreu com um tiro preciso!",
"vcmi.battleWindow.accurateShot.resultDescription.2" : "%d %s morreram por tiros precisos!", "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_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.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.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.SUMMON_GUARDIANS.description" : "No início da batalha, invoca ${subtype.creature} (${val}%)",
"core.bonus.SYNERGY_TARGET.name" : "Alvo Sinergizável", "core.bonus.SYNERGY_TARGET.name" : "Alvo Sinergizável",
"core.bonus.SYNERGY_TARGET.description" : "Esta criatura é vulnerável ao efeito de sinergia", "core.bonus.SYNERGY_TARGET.description" : "Esta criatura é vulnerável ao efeito de sinergia",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -40,6 +40,12 @@
"$ref" : "objectTemplate.json" "$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" : { "sounds" : {
"type" : "object", "type" : "object",
"additionalProperties" : false, "additionalProperties" : false,

View File

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

6
debian/changelog vendored
View File

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

View File

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

View File

@ -60,6 +60,9 @@ Full object consists from 3 parts:
// How valuable this object is to AI // How valuable this object is to AI
"aiValue" : 1000, "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 assigned to this object
"sounds" : { "sounds" : {
// Ambient sounds that plays when current hero is near this object // Ambient sounds that plays when current hero is near this object

View File

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

View File

@ -465,11 +465,11 @@
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="701"/> <location filename="../modManager/cmodlistview_moc.cpp" line="701"/>
<source>Downloading %1. %p% (%v MB out of %m MB) finished</source> <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>
<message> <message>
<source>Downloading %s%. %p% (%v MB out of %m MB) finished</source> <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>
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="726"/> <location filename="../modManager/cmodlistview_moc.cpp" line="726"/>
@ -738,12 +738,12 @@ Install successfully downloaded?</source>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="1152"/> <location filename="../settingsView/csettingsview_moc.ui" line="1152"/>
<source>Show Tutorial again</source> <source>Show Tutorial again</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="1159"/> <location filename="../settingsView/csettingsview_moc.ui" line="1159"/>
<source>Reset</source> <source>Reset</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="860"/> <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> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="330"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="330"/>
<source>File cannot opened</source> <source>File cannot opened</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="336"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="336"/>
@ -1324,23 +1324,24 @@ Please select directory with installed Heroes III data.</source>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="387"/> <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> <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>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="412"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="412"/>
<source>Stream error while extracting files! <source>Stream error while extracting files!
error reason: </source> error reason: </source>
<translation type="unfinished"></translation> <translation>
</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="425"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="425"/>
<source>Not a supported Inno Setup installer!</source> <source>Not a supported Inno Setup installer!</source>
<translation type="unfinished"></translation> <translation>Inno Setup安装器</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="436"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="436"/>
<source>Extracting error!</source> <source>Extracting error!</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="506"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="506"/>

View File

@ -461,7 +461,7 @@
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="701"/> <location filename="../modManager/cmodlistview_moc.cpp" line="701"/>
<source>Downloading %1. %p% (%v MB out of %m MB) finished</source> <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>
<message> <message>
<source>Downloading %s%. %p% (%v MB out of %m MB) finished</source> <source>Downloading %s%. %p% (%v MB out of %m MB) finished</source>
@ -733,12 +733,12 @@ Instalar o download realizado com sucesso?</translation>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="1152"/> <location filename="../settingsView/csettingsview_moc.ui" line="1152"/>
<source>Show Tutorial again</source> <source>Show Tutorial again</source>
<translation type="unfinished"></translation> <translation>Mostrar o Tutorial novamente</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="1159"/> <location filename="../settingsView/csettingsview_moc.ui" line="1159"/>
<source>Reset</source> <source>Reset</source>
<translation type="unfinished"></translation> <translation>Redefinir</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="860"/> <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> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="796"/> <location filename="../settingsView/csettingsview_moc.ui" line="796"/>
<source>Autosave</source> <source>Autosave</source>
<translation>Salvar automaticamente</translation> <translation>Salvamento automático</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="597"/> <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> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="330"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="330"/>
<source>File cannot opened</source> <source>File cannot opened</source>
<translation type="unfinished"></translation> <translation>O arquivo não pode ser aberto</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="336"/> <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> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="387"/> <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> <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>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="412"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="412"/>
<source>Stream error while extracting files! <source>Stream error while extracting files!
error reason: </source> error reason: </source>
<translation type="unfinished"></translation> <translation>Erro de fluxo ao extrair arquivos!
Motivo do erro: </translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="425"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="425"/>
<source>Not a supported Inno Setup installer!</source> <source>Not a supported Inno Setup installer!</source>
<translation type="unfinished"></translation> <translation>Instalador do Inno Setup não suportado!</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="436"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="436"/>
<source>Extracting error!</source> <source>Extracting error!</source>
<translation type="unfinished"></translation> <translation>Erro ao extrair!</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.cpp" line="506"/> <location filename="../firstLaunch/firstlaunch_moc.cpp" line="506"/>

View File

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

View File

@ -120,6 +120,11 @@ void CGameStateCampaign::trimCrossoverHeroesParameters(const CampaignTravel & tr
if(!info) if(!info)
return false; 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? // TODO: why would there be nullptr artifacts?
const CArtifactInstance *art = info->artifact; const CArtifactInstance *art = info->artifact;
if(!art) if(!art)

View File

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