瀏覽代碼

Merge pull request #3057 from Laserlicht/rw_hero

Nordsoft91 2 年之前
父節點
當前提交
12b179ef1f

二進制
Mods/vcmi/Data/radialMenu/dismissHero.png


二進制
Mods/vcmi/Data/radialMenu/moveArtifacts.png


二進制
Mods/vcmi/Data/radialMenu/moveTroops.png


二進制
Mods/vcmi/Data/radialMenu/swapArtifacts.png


二進制
Mods/vcmi/Data/radialMenu/tradeHeroes.png


+ 7 - 0
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:",

+ 38 - 1
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<CHeroGSlot> 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<RadialMenuConfig> 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<void()> ony = [=](){ };
+			ony += [=](){ LOCPLINT->cb->dismissHero(hero); };
+			LOCPLINT->showYesNoDialog(CGI->generaltexth->allTexts[22], ony, nullptr);
+		} },
+	};
+
+	GH.windows().createAndPushWindow<RadialMenu>(pos.center(), menuElements);
+}
+
 void CHeroGSlot::hover(bool on)
 {
 	if(!on)

+ 1 - 0
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;