diff --git a/Mods/vcmi/Data/radialMenu/dismissHero.png b/Mods/vcmi/Data/radialMenu/dismissHero.png new file mode 100644 index 000000000..1fb2b1115 Binary files /dev/null and b/Mods/vcmi/Data/radialMenu/dismissHero.png differ diff --git a/Mods/vcmi/Data/radialMenu/moveArtifacts.png b/Mods/vcmi/Data/radialMenu/moveArtifacts.png new file mode 100644 index 000000000..3f2a9b2f4 Binary files /dev/null and b/Mods/vcmi/Data/radialMenu/moveArtifacts.png differ diff --git a/Mods/vcmi/Data/radialMenu/moveTroops.png b/Mods/vcmi/Data/radialMenu/moveTroops.png new file mode 100644 index 000000000..710657656 Binary files /dev/null and b/Mods/vcmi/Data/radialMenu/moveTroops.png differ diff --git a/Mods/vcmi/Data/radialMenu/swapArtifacts.png b/Mods/vcmi/Data/radialMenu/swapArtifacts.png new file mode 100644 index 000000000..6e513e94e Binary files /dev/null and b/Mods/vcmi/Data/radialMenu/swapArtifacts.png differ diff --git a/Mods/vcmi/Data/radialMenu/tradeHeroes.png b/Mods/vcmi/Data/radialMenu/tradeHeroes.png new file mode 100644 index 000000000..009b0cd41 Binary files /dev/null and b/Mods/vcmi/Data/radialMenu/tradeHeroes.png differ diff --git a/Mods/vcmi/config/vcmi/english.json b/Mods/vcmi/config/vcmi/english.json index f4c912f00..32d874339 100644 --- a/Mods/vcmi/config/vcmi/english.json +++ b/Mods/vcmi/config/vcmi/english.json @@ -41,6 +41,13 @@ "vcmi.radialWheel.splitUnitEqually" : "Split creatures equally", "vcmi.radialWheel.moveUnit" : "Move creatures to another army", "vcmi.radialWheel.splitUnit" : "Split creature to another slot", + + "vcmi.radialWheel.heroGetArmy" : "Get army from other hero", + "vcmi.radialWheel.heroSwapArmy" : "Swap army with other hero", + "vcmi.radialWheel.heroExchange" : "Open hero exchange", + "vcmi.radialWheel.heroGetArtifacts" : "Get artifacts from other hero", + "vcmi.radialWheel.heroSwapArtifacts" : "Swap artifacts with other hero", + "vcmi.radialWheel.heroDismiss" : "Dismiss hero", "vcmi.mainMenu.serverConnecting" : "Connecting...", "vcmi.mainMenu.serverAddressEnter" : "Enter address:", diff --git a/client/windows/CCastleInterface.cpp b/client/windows/CCastleInterface.cpp index 82784f6da..73487b1e9 100644 --- a/client/windows/CCastleInterface.cpp +++ b/client/windows/CCastleInterface.cpp @@ -29,6 +29,8 @@ #include "../widgets/CGarrisonInt.h" #include "../widgets/Buttons.h" #include "../widgets/TextControls.h" +#include "../widgets/RadialMenu.h" +#include "../widgets/CExchangeController.h" #include "../render/Canvas.h" #include "../render/IImage.h" #include "../render/IRenderHandler.h" @@ -322,11 +324,46 @@ CHeroGSlot::CHeroGSlot(int x, int y, int updown, const CGHeroInstance * h, HeroS set(h); - addUsedEvents(LCLICK | SHOW_POPUP | HOVER); + addUsedEvents(LCLICK | SHOW_POPUP | GESTURE | HOVER); } CHeroGSlot::~CHeroGSlot() = default; +void CHeroGSlot::gesture(bool on, const Point & initialPosition, const Point & finalPosition) +{ + if(!on) + return; + + if(!hero) + return; + + if (!settings["input"]["radialWheelGarrisonSwipe"].Bool()) + return; + + std::shared_ptr other = upg ? owner->garrisonedHero : owner->visitingHero; + + bool twoHeroes = hero && other->hero; + + ObjectInstanceID heroId = hero->id; + ObjectInstanceID heroOtherId = twoHeroes ? other->hero->id : ObjectInstanceID::NONE; + + std::vector menuElements = { + { RadialMenuConfig::ITEM_NW, twoHeroes, "moveTroops", "vcmi.radialWheel.heroGetArmy", [heroId, heroOtherId](){CExchangeController(heroId, heroOtherId).moveArmy(false, std::nullopt);} }, + { RadialMenuConfig::ITEM_NE, twoHeroes, "stackSplitDialog", "vcmi.radialWheel.heroSwapArmy", [heroId, heroOtherId](){CExchangeController(heroId, heroOtherId).swapArmy();} }, + { RadialMenuConfig::ITEM_EE, twoHeroes, "tradeHeroes", "vcmi.radialWheel.heroExchange", [heroId, heroOtherId](){LOCPLINT->showHeroExchange(heroId, heroOtherId);} }, + { RadialMenuConfig::ITEM_SW, twoHeroes, "moveArtifacts", "vcmi.radialWheel.heroGetArtifacts", [heroId, heroOtherId](){CExchangeController(heroId, heroOtherId).moveArtifacts(false, true, true);} }, + { RadialMenuConfig::ITEM_SE, twoHeroes, "swapArtifacts", "vcmi.radialWheel.heroSwapArtifacts", [heroId, heroOtherId](){CExchangeController(heroId, heroOtherId).swapArtifacts(true, true);} }, + { RadialMenuConfig::ITEM_WW, true, "dismissHero", "vcmi.radialWheel.heroDismiss", [this]() + { + CFunctionList ony = [=](){ }; + ony += [=](){ LOCPLINT->cb->dismissHero(hero); }; + LOCPLINT->showYesNoDialog(CGI->generaltexth->allTexts[22], ony, nullptr); + } }, + }; + + GH.windows().createAndPushWindow(pos.center(), menuElements); +} + void CHeroGSlot::hover(bool on) { if(!on) diff --git a/client/windows/CCastleInterface.h b/client/windows/CCastleInterface.h index 9e9e0b48d..4c4e6c8c2 100644 --- a/client/windows/CCastleInterface.h +++ b/client/windows/CCastleInterface.h @@ -113,6 +113,7 @@ public: void set(const CGHeroInstance * newHero); void hover (bool on) override; + void gesture(bool on, const Point & initialPosition, const Point & finalPosition) override; void clickPressed(const Point & cursorPosition) override; void showPopupWindow(const Point & cursorPosition) override; void deactivate() override;