diff --git a/Mods/vcmi/config/vcmi/english.json b/Mods/vcmi/config/vcmi/english.json index 2c366799a..cc60502a6 100644 --- a/Mods/vcmi/config/vcmi/english.json +++ b/Mods/vcmi/config/vcmi/english.json @@ -81,6 +81,8 @@ "vcmi.battleOptions.animationsSpeed6.help": "Set animation speed to instantaneous", "vcmi.battleOptions.touchscreenMode.hover": "Touchscreen mode", "vcmi.battleOptions.touchscreenMode.help": "{Touchscreen mode}\n\nIf enabled, second click is required to confirm and execute action. This is more suitable for touchscreen devices.", + "vcmi.battleOptions.movementHighlightOnHover.hover": "Movement Highlight on Hover", + "vcmi.battleOptions.movementHighlightOnHover.help": "{Movement Highlight on Hover}\n\nHighlight unit's movement range when you hover over it.", "vcmi.battleOptions.skipBattleIntroMusic.hover": "Skip Intro Music", "vcmi.battleOptions.skipBattleIntroMusic.help": "{Skip Intro Music}\n\nAllow actions during the intro music that plays at the beginning of each battle", "vcmi.battleWindow.pressKeyToSkipIntro" : "Press any key to start battle immediately", diff --git a/Mods/vcmi/mod.json b/Mods/vcmi/mod.json index e24f67a5c..0b6172847 100644 --- a/Mods/vcmi/mod.json +++ b/Mods/vcmi/mod.json @@ -50,6 +50,7 @@ "description" : "Ключові файли необхідні для повноцінної роботи VCMI", "author" : "Команда VCMI", + "skipValidation" : true, "translations" : [ "config/vcmi/ukrainian.json" ] diff --git a/client/battle/BattleFieldController.cpp b/client/battle/BattleFieldController.cpp index 7eff5ed2b..f7ad4e2d5 100644 --- a/client/battle/BattleFieldController.cpp +++ b/client/battle/BattleFieldController.cpp @@ -174,7 +174,7 @@ void BattleFieldController::redrawBackgroundWithHexes() const CStack *activeStack = owner.stacksController->getActiveStack(); std::vector attackableHexes; if(activeStack) - occupyableHexes = owner.curInt->cb->battleGetAvailableHexes(activeStack, true, true, &attackableHexes); + occupiableHexes = owner.curInt->cb->battleGetAvailableHexes(activeStack, true, true, &attackableHexes); // prepare background graphic with hexes and shaded hexes backgroundWithHexes->draw(background, Point(0,0)); @@ -182,14 +182,14 @@ void BattleFieldController::redrawBackgroundWithHexes() if(owner.siegeController) owner.siegeController->showAbsoluteObstacles(*backgroundWithHexes); - // show shaded hexes for active's stackMovement valid movement and the hexes that it can attack + // show shaded hexes for active's stack valid movement and the hexes that it can attack if(settings["battle"]["stackRange"].Bool()) { - std::vector hexesToShade = occupyableHexes; + std::vector hexesToShade = occupiableHexes; hexesToShade.insert(hexesToShade.end(), attackableHexes.begin(), attackableHexes.end()); for(BattleHex hex : hexesToShade) { - backgroundWithHexes->draw(cellShade, hexPositionLocal(hex).topLeft()); + showHighlightedHex(*backgroundWithHexes, cellShade, hex, false); } } @@ -243,7 +243,7 @@ std::set BattleFieldController::getMovementRangeForHoveredStack() if (!owner.stacksController->getActiveStack()) return result; - if (!settings["battle"]["stackRange"].Bool()) + if (!settings["battle"]["movementHighlightOnHover"].Bool()) return result; auto hoveredHex = getHoveredHex(); @@ -266,7 +266,7 @@ std::set BattleFieldController::STUB_getMaxMovementRangeForHoveredSta if (!owner.stacksController->getActiveStack()) return result; - if (!settings["battle"]["stackRange"].Bool()) + if (!settings["battle"]["movementHighlightOnHover"].Bool()) return result; auto hoveredHex = getHoveredHex(); @@ -486,18 +486,18 @@ BattleHex::EDir BattleFieldController::selectAttackDirection(BattleHex myNumber, // | - - | - - | - - | - o o | o o - | - - | - - | o o for (size_t i : { 1, 2, 3}) - attackAvailability[i] = vstd::contains(occupyableHexes, neighbours[i]) && vstd::contains(occupyableHexes, neighbours[i].cloneInDirection(BattleHex::RIGHT, false)); + attackAvailability[i] = vstd::contains(occupiableHexes, neighbours[i]) && vstd::contains(occupiableHexes, neighbours[i].cloneInDirection(BattleHex::RIGHT, false)); for (size_t i : { 4, 5, 0}) - attackAvailability[i] = vstd::contains(occupyableHexes, neighbours[i]) && vstd::contains(occupyableHexes, neighbours[i].cloneInDirection(BattleHex::LEFT, false)); + attackAvailability[i] = vstd::contains(occupiableHexes, neighbours[i]) && vstd::contains(occupiableHexes, neighbours[i].cloneInDirection(BattleHex::LEFT, false)); - attackAvailability[6] = vstd::contains(occupyableHexes, neighbours[0]) && vstd::contains(occupyableHexes, neighbours[1]); - attackAvailability[7] = vstd::contains(occupyableHexes, neighbours[3]) && vstd::contains(occupyableHexes, neighbours[4]); + attackAvailability[6] = vstd::contains(occupiableHexes, neighbours[0]) && vstd::contains(occupiableHexes, neighbours[1]); + attackAvailability[7] = vstd::contains(occupiableHexes, neighbours[3]) && vstd::contains(occupiableHexes, neighbours[4]); } else { for (size_t i = 0; i < 6; ++i) - attackAvailability[i] = vstd::contains(occupyableHexes, neighbours[i]); + attackAvailability[i] = vstd::contains(occupiableHexes, neighbours[i]); attackAvailability[6] = false; attackAvailability[7] = false; @@ -609,7 +609,7 @@ BattleHex BattleFieldController::fromWhichHexAttack(BattleHex attackTarget) bool BattleFieldController::isTileAttackable(const BattleHex & number) const { - for (auto & elem : occupyableHexes) + for (auto & elem : occupiableHexes) { if (BattleHex::mutualPosition(elem, number) != -1 || elem == number) return true; diff --git a/client/battle/BattleFieldController.h b/client/battle/BattleFieldController.h index 4487513ad..94ed04860 100644 --- a/client/battle/BattleFieldController.h +++ b/client/battle/BattleFieldController.h @@ -43,7 +43,7 @@ class BattleFieldController : public CIntObject BattleHex attackingHex; /// hexes to which currently active stack can move - std::vector occupyableHexes; + std::vector occupiableHexes; /// hexes that when in front of a unit cause it's amount box to move back std::array stackCountOutsideHexes; diff --git a/client/windows/settings/BattleOptionsTab.cpp b/client/windows/settings/BattleOptionsTab.cpp index 69a4ffa22..c2992b3b4 100644 --- a/client/windows/settings/BattleOptionsTab.cpp +++ b/client/windows/settings/BattleOptionsTab.cpp @@ -34,6 +34,10 @@ BattleOptionsTab::BattleOptionsTab(BattleInterface * owner) { movementShadowChangedCallback(value, owner); }); + addCallback("movementHighlightOnHoverChanged", [this, owner](bool value) + { + movementHighlightOnHoverChangedCallback(value, owner); + }); addCallback("mouseShadowChanged", [this](bool value) { mouseShadowChangedCallback(value); @@ -72,6 +76,9 @@ BattleOptionsTab::BattleOptionsTab(BattleInterface * owner) std::shared_ptr movementShadowCheckbox = widget("movementShadowCheckbox"); movementShadowCheckbox->setSelected(settings["battle"]["stackRange"].Bool()); + std::shared_ptr movementHighlightOnHoverCheckbox = widget("movementHighlightOnHoverCheckbox"); + movementHighlightOnHoverCheckbox->setSelected(settings["battle"]["movementHighlightOnHover"].Bool()); + std::shared_ptr mouseShadowCheckbox = widget("mouseShadowCheckbox"); mouseShadowCheckbox->setSelected(settings["battle"]["mouseShadow"].Bool()); @@ -138,6 +145,14 @@ void BattleOptionsTab::movementShadowChangedCallback(bool value, BattleInterface parentBattleInterface->redrawBattlefield(); } +void BattleOptionsTab::movementHighlightOnHoverChangedCallback(bool value, BattleInterface * parentBattleInterface) +{ + Settings stackRange = settings.write["battle"]["movementHighlightOnHover"]; + stackRange->Bool() = value; + if(parentBattleInterface) + parentBattleInterface->redrawBattlefield(); +} + void BattleOptionsTab::mouseShadowChangedCallback(bool value) { Settings shadow = settings.write["battle"]["mouseShadow"]; diff --git a/client/windows/settings/BattleOptionsTab.h b/client/windows/settings/BattleOptionsTab.h index 77ef5e293..2afb7d958 100644 --- a/client/windows/settings/BattleOptionsTab.h +++ b/client/windows/settings/BattleOptionsTab.h @@ -24,6 +24,7 @@ private: std::string getQueueSizeStringFromId(int value) const; void viewGridChangedCallback(bool value, BattleInterface * parentBattleInterface); void movementShadowChangedCallback(bool value, BattleInterface * parentBattleInterface); + void movementHighlightOnHoverChangedCallback(bool value, BattleInterface * parentBattleInterface); void mouseShadowChangedCallback(bool value); void animationSpeedChangedCallback(int value); void showQueueChangedCallback(bool value, BattleInterface * parentBattleInterface); diff --git a/config/widgets/settings/battleOptionsTab.json b/config/widgets/settings/battleOptionsTab.json index 95bcd0d52..708ee1f2f 100644 --- a/config/widgets/settings/battleOptionsTab.json +++ b/config/widgets/settings/battleOptionsTab.json @@ -142,13 +142,17 @@ "position": {"x": 45, "y": 85} }, { - "text": "core.genrltxt.406", + "text": "vcmi.battleOptions.movementHighlightOnHover.hover", "position": {"x": 45, "y": 115} }, { - "text": "core.genrltxt.407", + "text": "core.genrltxt.406", "position": {"x": 45, "y": 145} }, + { + "text": "core.genrltxt.407", + "position": {"x": 45, "y": 175} + }, { "text": "vcmi.battleOptions.skipBattleIntroMusic.hover", "position": {"x": 45, "y": 175} @@ -176,26 +180,34 @@ "position": {"x": 10, "y": 83}, "callback": "movementShadowChanged" }, + { + "name": "movementHighlightOnHoverCheckbox", + "type": "toggleButton", + "image": "sysopchk.def", + "help": "vcmi.battleOptions.movementHighlightOnHover", + "position": {"x": 10, "y": 113}, + "callback": "movementHighlightOnHoverChanged" + }, { "name": "mouseShadowCheckbox", "type": "toggleButton", "image": "sysopchk.def", "help": "core.help.429", - "position": {"x": 10, "y": 113}, + "position": {"x": 10, "y": 143}, "callback": "mouseShadowChanged" }, { "name": "battleFieldCasualtiesPlaceholder", "type": "picture", "image": "settingsWindow/checkBoxEmpty", - "position": {"x": 10, "y": 143}, + "position": {"x": 10, "y": 173}, }, { "name": "skipBattleIntroMusicCheckbox", "type": "toggleButton", "image": "sysopchk.def", "help": "vcmi.battleOptions.skipBattleIntroMusic", - "position": {"x": 10, "y": 173}, + "position": {"x": 10, "y": 203}, "callback": "skipBattleIntroMusicChanged" }, {