Explorar o código

Block revisit object shortcut if no visit is possible

Ivan Savenko %!s(int64=2) %!d(string=hai) anos
pai
achega
d3ced6b703

+ 13 - 1
client/adventureMap/AdventureMapShortcuts.cpp

@@ -79,7 +79,7 @@ std::vector<AdventureMapShortcutState> AdventureMapShortcuts::getShortcuts()
 		{ EShortcut::ADVENTURE_DIG_GRAIL,        optionHeroSelected(),   [this]() { this->digGrail(); } },
 		{ EShortcut::ADVENTURE_VIEW_PUZZLE,      optionSidePanelActive(),[this]() { this->viewPuzzleMap(); } },
 		{ EShortcut::GAME_RESTART_GAME,          optionInMapView(),      [this]() { this->restartGame(); } },
-		{ EShortcut::ADVENTURE_VISIT_OBJECT,     optionHeroSelected(),   [this]() { this->visitObject(); } },
+		{ EShortcut::ADVENTURE_VISIT_OBJECT,     optionCanVisitObject(), [this]() { this->visitObject(); } },
 		{ EShortcut::ADVENTURE_VIEW_SELECTED,    optionInMapView(),      [this]() { this->openObject(); } },
 		{ EShortcut::GAME_OPEN_MARKETPLACE,      optionInMapView(),      [this]() { this->showMarketplace(); } },
 		{ EShortcut::ADVENTURE_ZOOM_IN,          optionSidePanelActive(),[this]() { this->zoom(+1); } },
@@ -422,6 +422,18 @@ bool AdventureMapShortcuts::optionHeroAwake()
 	return optionInMapView() && hero && !LOCPLINT->localState->isHeroSleeping(hero);
 }
 
+bool AdventureMapShortcuts::optionCanVisitObject()
+{
+	if (!optionHeroSelected())
+		return false;
+
+	auto * hero = LOCPLINT->localState->getCurrentHero();
+	auto objects = LOCPLINT->cb->getVisitableObjs(hero->visitablePos());
+
+	assert(vstd::contains(objects,hero));
+	return objects.size() > 1; // there is object other than our hero
+}
+
 bool AdventureMapShortcuts::optionHeroSelected()
 {
 	return optionInMapView() && LOCPLINT->localState->getCurrentHero() != nullptr;

+ 1 - 0
client/adventureMap/AdventureMapShortcuts.h

@@ -77,6 +77,7 @@ public:
 	bool optionHeroSelected();
 	bool optionHeroCanMove();
 	bool optionHasNextHero();
+	bool optionCanVisitObject();
 	bool optionSpellcasting();
 	bool optionInMapView();
 	bool optionInWorldView();