浏览代码

Fix terrain tooltip

Ivan Savenko 2 年之前
父节点
当前提交
6196d538e7
共有 3 个文件被更改,包括 34 次插入44 次删除
  1. 16 18
      client/adventureMap/CAdvMapInt.cpp
  2. 17 25
      client/mapRenderer/mapHandler.cpp
  3. 1 1
      client/mapRenderer/mapHandler.h

+ 16 - 18
client/adventureMap/CAdvMapInt.cpp

@@ -1148,14 +1148,13 @@ void CAdvMapInt::onTileHovered(const int3 &mapPos)
 		std::string text = curHero() ? objAtTile->getHoverText(curHero()) : objAtTile->getHoverText(LOCPLINT->playerID);
 		boost::replace_all(text,"\n"," ");
 		statusbar->write(text);
-	}
-	else
-	{
-		std::string hlp;
-		CGI->mh->getTerrainDescr(mapPos, hlp, false);
-		statusbar->write(hlp);
-	}
-
+	}
+	else
+	{
+		std::string hlp = CGI->mh->getTerrainDescr(mapPos, false);
+		statusbar->write(hlp);
+	}
+
 	if(spellBeingCasted)
 	{
 		switch(spellBeingCasted->id)
@@ -1306,16 +1305,15 @@ void CAdvMapInt::onTileRightClicked(const int3 &mapPos)
 
 	const CGObjectInstance * obj = getActiveObject(mapPos);
 	if(!obj)
-	{
-		// Bare or undiscovered terrain
-		const TerrainTile * tile = LOCPLINT->cb->getTile(mapPos);
-		if (tile)
-		{
-			std::string hlp;
-			CGI->mh->getTerrainDescr(mapPos, hlp, true);
-			CRClickPopup::createAndPush(hlp);
-		}
-		return;
+	{
+		// Bare or undiscovered terrain
+		const TerrainTile * tile = LOCPLINT->cb->getTile(mapPos);
+		if(tile)
+		{
+			std::string hlp = CGI->mh->getTerrainDescr(mapPos, true);
+			CRClickPopup::createAndPush(hlp);
+		}
+		return;
 	}
 
 	CRClickPopup::createAndPush(obj, GH.getCursorPosition(), ETextAlignment::CENTER);

+ 17 - 25
client/mapRenderer/mapHandler.cpp

@@ -14,6 +14,7 @@
 
 #include "../CGameInfo.h"
 #include "../CPlayerInterface.h"
+#include "../CCallback.h"
 
 #include "../../lib/UnlockGuard.h"
 #include "../../lib/mapObjects/CGHeroInstance.h"
@@ -40,41 +41,32 @@ void CMapHandler::waitForOngoingAnimations()
 	}
 }
 
-void CMapHandler::getTerrainDescr(const int3 & pos, std::string & out, bool isRMB) const
+std::string CMapHandler::getTerrainDescr(const int3 & pos, bool rightClick) const
 {
 	const TerrainTile & t = map->getTile(pos);
 
 	if(t.hasFavorableWinds())
-	{
-		out = CGI->objtypeh->getObjectName(Obj::FAVORABLE_WINDS, 0);
-		return;
-	}
-	//const TerrainTile2 & tt = ttiles[pos.z][pos.x][pos.y];
-	bool isTile2Terrain = false;
-	out.clear();
+		return CGI->objtypeh->getObjectName(Obj::FAVORABLE_WINDS, 0);
 
-	//for(auto & elem : tt.objects)
-	//{
-	//	if(elem.obj)
-	//	{
-	//		out = elem.obj->getObjectName();
-	//		if(elem.obj->ID == Obj::HOLE)
-	//			return;
-
-	//		isTile2Terrain = elem.obj->isTile2Terrain();
-	//		break;
-	//	}
-	//}
+	std::string result = t.terType->getNameTranslated();
 
-	if(!isTile2Terrain || out.empty())
-		out = t.terType->getNameTranslated();
+	for(const auto & object : map->objects)
+	{
+		if(object->coveringAt(pos.x, pos.y) && object->pos.z == pos.z && object->isTile2Terrain())
+		{
+			result = object->getObjectName();
+			break;
+		}
+	}
 
-	if(t.getDiggingStatus(false) == EDiggingStatus::CAN_DIG)
+	if(LOCPLINT->cb->getTileDigStatus(pos, false) == EDiggingStatus::CAN_DIG)
 	{
-		out = boost::str(boost::format(isRMB ? "%s\r\n%s" : "%s %s") // New line for the Message Box, space for the Status Bar
-			% out 
+		return boost::str(boost::format(rightClick ? "%s\r\n%s" : "%s %s") // New line for the Message Box, space for the Status Bar
+			% result
 			% CGI->generaltexth->allTexts[330]); // 'digging ok'
 	}
+
+	return result;
 }
 
 bool CMapHandler::compareObjectBlitOrder(const CGObjectInstance * a, const CGObjectInstance * b)

+ 1 - 1
client/mapRenderer/mapHandler.h

@@ -72,7 +72,7 @@ public:
 	void removeMapObserver(IMapObjectObserver * observer);
 
 	/// returns string description for terrain interaction
-	void getTerrainDescr(const int3 & pos, std::string & out, bool isRMB) const;
+	std::string getTerrainDescr(const int3 & pos, bool rightClick) const;
 
 	/// returns list of ambient sounds for specified tile
 	std::vector<std::string> getAmbientSounds(const int3 & tile);