Explorar o código

TerrainTile: implement exclusion for topVisitable functions

For pathfinder we usually want to check what object hero staying on.
Hero is always top object so we need option to exclude it.
ArseniyShestakov %!s(int64=10) %!d(string=hai) anos
pai
achega
f145c82031
Modificáronse 2 ficheiros con 10 adicións e 6 borrados
  1. 8 4
      lib/mapping/CMap.cpp
  2. 2 2
      lib/mapping/CMap.h

+ 8 - 4
lib/mapping/CMap.cpp

@@ -125,14 +125,18 @@ bool TerrainTile::isClear(const TerrainTile *from /*= nullptr*/) const
 	return entrableTerrain(from) && !blocked;
 }
 
-int TerrainTile::topVisitableId() const
+Obj TerrainTile::topVisitableId(bool excludeTop) const
 {
-	return visitableObjects.size() ? visitableObjects.back()->ID : -1;
+	return topVisitableObj(excludeTop) ? topVisitableObj(excludeTop)->ID : Obj(Obj::NO_OBJ);
 }
 
-CGObjectInstance * TerrainTile::topVisitableObj() const
+CGObjectInstance * TerrainTile::topVisitableObj(bool excludeTop) const
 {
-	return visitableObjects.size() ? visitableObjects.back() : nullptr;
+	auto visitableObj = visitableObjects;
+	if(excludeTop && visitableObj.size())
+		visitableObj.pop_back();
+
+	return visitableObj.size() ? visitableObj.back() : nullptr;
 }
 
 bool TerrainTile::isCoastal() const

+ 2 - 2
lib/mapping/CMap.h

@@ -289,8 +289,8 @@ struct DLL_LINKAGE TerrainTile
 	/// Checks for blocking objects and terraint type (water / land).
 	bool isClear(const TerrainTile * from = nullptr) const;
 	/// Gets the ID of the top visitable object or -1 if there is none.
-	int topVisitableId() const;
-	CGObjectInstance * topVisitableObj() const;
+	Obj topVisitableId(bool excludeTop = false) const;
+	CGObjectInstance * topVisitableObj(bool excludeTop = false) const;
 	bool isWater() const;
 	bool isCoastal() const;
 	bool hasFavourableWinds() const;