1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

Add hotkey to track human player hero in MP. Fixed broken 'toggle grid'

hotkey
This commit is contained in:
Ivan Savenko
2024-04-30 19:10:10 +03:00
parent 74d3b4ab43
commit dd9e002031
6 changed files with 53 additions and 32 deletions

View File

@@ -64,6 +64,8 @@ std::vector<AdventureMapShortcutState> AdventureMapShortcuts::getShortcuts()
{ EShortcut::ADVENTURE_TOGGLE_MAP_LEVEL, optionCanToggleLevel(), [this]() { this->switchMapLevel(); } },
{ EShortcut::ADVENTURE_QUEST_LOG, optionCanViewQuests(), [this]() { this->showQuestlog(); } },
{ EShortcut::ADVENTURE_TOGGLE_SLEEP, optionHeroSelected(), [this]() { this->toggleSleepWake(); } },
{ EShortcut::ADVENTURE_TOGGLE_GRID, optionInMapView(), [this]() { this->toggleGrid(); } },
{ EShortcut::ADVENTURE_TRACK_HERO, optionInMapView(), [this]() { this->toggleTrackHero(); } },
{ EShortcut::ADVENTURE_SET_HERO_ASLEEP, optionHeroAwake(), [this]() { this->setHeroSleeping(); } },
{ EShortcut::ADVENTURE_SET_HERO_AWAKE, optionHeroSleeping(), [this]() { this->setHeroAwake(); } },
{ EShortcut::ADVENTURE_MOVE_HERO, optionHeroCanMove(), [this]() { this->moveHeroAlongPath(); } },
@@ -143,6 +145,18 @@ void AdventureMapShortcuts::showQuestlog()
LOCPLINT->showQuestLog();
}
void AdventureMapShortcuts::toggleTrackHero()
{
Settings s = settings.write["session"];
s["adventureTrackHero"].Bool() = !settings["session"]["adventureTrackHero"].Bool();
}
void AdventureMapShortcuts::toggleGrid()
{
Settings s = settings.write["gameTweaks"];
s["showGrid"].Bool() = !settings["gameTweaks"]["showGrid"].Bool();
}
void AdventureMapShortcuts::toggleSleepWake()
{
if (!optionHeroSelected())

View File

@@ -40,6 +40,8 @@ class AdventureMapShortcuts
void worldViewScale4x();
void switchMapLevel();
void showQuestlog();
void toggleTrackHero();
void toggleGrid();
void toggleSleepWake();
void setHeroSleeping();
void setHeroAwake();

View File

@@ -15,6 +15,7 @@
#include "../CPlayerInterface.h"
#include "../gui/CGuiHandler.h"
#include "../gui/EventDispatcher.h"
#include "../gui/Shortcut.h"
#include "../gui/ShortcutHandler.h"
#include "../CServerHandler.h"
#include "../globalLobby/GlobalLobbyClient.h"
@@ -57,37 +58,29 @@ void InputSourceKeyboard::handleEventKeyDown(const SDL_KeyboardEvent & key)
return; // ignore periodic event resends
}
if(key.keysym.sym == SDLK_TAB && isKeyboardCtrlDown())
{
CSH->getGlobalLobby().activateInterface();
}
if(key.keysym.sym >= SDLK_F1 && key.keysym.sym <= SDLK_F15 && settings["session"]["spectate"].Bool())
{
//TODO: we need some central place for all interface-independent hotkeys
Settings s = settings.write["session"];
switch(key.keysym.sym)
{
case SDLK_F6:
s["spectate-ignore-hero"].Bool() = !settings["session"]["spectate-ignore-hero"].Bool();
break;
case SDLK_F7:
s["spectate-skip-battle"].Bool() = !settings["session"]["spectate-skip-battle"].Bool();
break;
case SDLK_F8:
s["spectate-skip-battle-result"].Bool() = !settings["session"]["spectate-skip-battle-result"].Bool();
break;
default:
break;
}
return;
}
auto shortcutsVector = GH.shortcuts().translateKeycode(keyName);
if (vstd::contains(shortcutsVector, EShortcut::LOBBY_ACTIVATE_INTERFACE))
CSH->getGlobalLobby().activateInterface();
if (vstd::contains(shortcutsVector, EShortcut::SPECTATE_TRACK_HERO))
{
Settings s = settings.write["session"];
s["spectate-ignore-hero"].Bool() = !settings["session"]["spectate-ignore-hero"].Bool();
}
if (vstd::contains(shortcutsVector, EShortcut::SPECTATE_SKIP_BATTLE))
{
Settings s = settings.write["session"];
s["spectate-skip-battle"].Bool() = !settings["session"]["spectate-skip-battle"].Bool();
}
if (vstd::contains(shortcutsVector, EShortcut::SPECTATE_SKIP_BATTLE_RESULT))
{
Settings s = settings.write["session"];
s["spectate-skip-battle-result"].Bool() = !settings["session"]["spectate-skip-battle-result"].Bool();
}
GH.events().dispatchShortcutPressed(shortcutsVector);
}

View File

@@ -108,6 +108,7 @@ enum class EShortcut
ADVENTURE_VIEW_WORLD_X1,
ADVENTURE_VIEW_WORLD_X2,
ADVENTURE_VIEW_WORLD_X4,
ADVENTURE_TRACK_HERO,
ADVENTURE_TOGGLE_MAP_LEVEL,
ADVENTURE_KINGDOM_OVERVIEW,
ADVENTURE_QUEST_LOG,
@@ -145,6 +146,12 @@ enum class EShortcut
BATTLE_SELECT_ACTION, // Alternative actions toggle
BATTLE_TOGGLE_HEROES_STATS,
LOBBY_ACTIVATE_INTERFACE,
SPECTATE_TRACK_HERO,
SPECTATE_SKIP_BATTLE,
SPECTATE_SKIP_BATTLE_RESULT,
// Town screen
TOWN_OPEN_TAVERN,
TOWN_SWAP_ARMIES, // Swap garrisoned and visiting armies

View File

@@ -176,6 +176,7 @@ EShortcut ShortcutHandler::findShortcut(const std::string & identifier ) const
{"adventureViewWorld1", EShortcut::ADVENTURE_VIEW_WORLD_X1 },
{"adventureViewWorld2", EShortcut::ADVENTURE_VIEW_WORLD_X2 },
{"adventureViewWorld4", EShortcut::ADVENTURE_VIEW_WORLD_X4 },
{"adventureTrackHero", EShortcut::ADVENTURE_TRACK_HERO, },
{"adventureToggleMapLevel", EShortcut::ADVENTURE_TOGGLE_MAP_LEVEL},
{"adventureKingdomOverview", EShortcut::ADVENTURE_KINGDOM_OVERVIEW},
{"adventureQuestLog", EShortcut::ADVENTURE_QUEST_LOG },
@@ -200,6 +201,10 @@ EShortcut ShortcutHandler::findShortcut(const std::string & identifier ) const
{"battleTacticsNext", EShortcut::BATTLE_TACTICS_NEXT },
{"battleTacticsEnd", EShortcut::BATTLE_TACTICS_END },
{"battleSelectAction", EShortcut::BATTLE_SELECT_ACTION },
{"lobbyActivateInterface", EShortcut::LOBBY_ACTIVATE_INTERFACE },
{"spectateTrackHero", EShortcut::SPECTATE_TRACK_HERO },
{"spectateSkipBattle", EShortcut::SPECTATE_SKIP_BATTLE },
{"spectateSkipBattleResult", EShortcut::SPECTATE_SKIP_BATTLE_RESULT },
{"townOpenTavern", EShortcut::TOWN_OPEN_TAVERN },
{"townSwapArmies", EShortcut::TOWN_SWAP_ARMIES },
{"recruitmentMax", EShortcut::RECRUITMENT_MAX },

View File

@@ -302,7 +302,7 @@ bool MapViewController::isEventVisible(const CGObjectInstance * obj, const Playe
{
if (LOCPLINT->makingTurn)
return false;
if (LOCPLINT->cb->getStartInfo()->playerInfos.at(initiator).isControlledByHuman())
if (LOCPLINT->cb->getStartInfo()->playerInfos.at(initiator).isControlledByHuman() && !settings["session"]["adventureTrackHero"].Bool())
return false;
}
@@ -328,7 +328,7 @@ bool MapViewController::isEventVisible(const CGHeroInstance * obj, const int3 &
{
if (LOCPLINT->makingTurn)
return false;
if (LOCPLINT->cb->getStartInfo()->playerInfos.at(obj->getOwner()).isControlledByHuman())
if (LOCPLINT->cb->getStartInfo()->playerInfos.at(obj->getOwner()).isControlledByHuman() && !settings["session"]["adventureTrackHero"].Bool())
return false;
}