1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-24 08:32:34 +02:00

Merge pull request #4282 from vcmi/beta

Merge beta -> master
This commit is contained in:
Ivan Savenko 2024-07-16 21:21:01 +03:00 committed by GitHub
commit c9fb2d6aab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 121 additions and 75 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
### Stability

View File

@ -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",

View File

@ -26,8 +26,8 @@ android {
minSdk = qtMinSdkVersion as Integer
targetSdk = qtTargetSdkVersion as Integer // ANDROID_TARGET_SDK_VERSION in the CMake project
versionCode 1540
versionName "1.5.4"
versionCode 1550
versionName "1.5.5"
setProperty("archivesBaseName", "vcmi")
}

View File

@ -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)

View File

@ -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());
}

View File

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

View File

@ -48,7 +48,7 @@
BattleWindow::BattleWindow(BattleInterface & owner):
owner(owner),
defaultAction(PossiblePlayerBattleAction::INVALID)
lastAlternativeAction(PossiblePlayerBattleAction::INVALID)
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
pos.w = 800;
@ -568,14 +568,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()
@ -670,23 +674,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());

View File

@ -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

View File

@ -428,7 +428,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);

View File

@ -1,6 +1,6 @@
set(VCMI_VERSION_MAJOR 1)
set(VCMI_VERSION_MINOR 5)
set(VCMI_VERSION_PATCH 4)
set(VCMI_VERSION_PATCH 5)
add_definitions(
-DVCMI_VERSION_MAJOR=${VCMI_VERSION_MAJOR}
-DVCMI_VERSION_MINOR=${VCMI_VERSION_MINOR}

View File

@ -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,

View File

@ -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
debian/changelog vendored
View File

@ -1,3 +1,9 @@
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
* 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)
[![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

View File

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

View File

@ -90,6 +90,7 @@
</screenshots>
<launchable type="desktop-id">vcmilauncher.desktop</launchable>
<releases>
<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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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

View File

@ -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)

View File

@ -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"/>