Kaynağa Gözat

Important fix for unreserving objects.

DjWarmonger 11 yıl önce
ebeveyn
işleme
8ce6659633
2 değiştirilmiş dosya ile 12 ekleme ve 5 silme
  1. 11 5
      AI/VCAI/VCAI.cpp
  2. 1 0
      AI/VCAI/VCAI.h

+ 11 - 5
AI/VCAI/VCAI.cpp

@@ -245,8 +245,7 @@ void VCAI::heroVisit(const CGHeroInstance *visitor, const CGObjectInstance *visi
 	if(start)
 	{
 		markObjectVisited (visitedObj);
-		erase_if_present(reservedObjs, visitedObj); //unreserve objects
-		erase_if_present(reservedHeroesMap[visitor], visitedObj);
+		unreserveObject(visitor, visitedObj);
 		completeGoal (sptr(Goals::GetObj(visitedObj->id.getNum()).sethero(visitor))); //we don't need to visit it anymore
 		//TODO: what if we visited one-time visitable object that was reserved by another hero (shouldn't, but..)
 	}
@@ -1249,10 +1248,11 @@ bool VCAI::canRecruitAnyHero (const CGTownInstance * t) const
 void VCAI::wander(HeroPtr h)
 {
 	//unclaim objects that are now dangerous for us
-	erase_if(reservedHeroesMap[h], [h](const CGObjectInstance * obj) -> bool
+	for (auto obj : reservedHeroesMap[h])
 	{
-		return !isSafeToVisit(h, obj->visitablePos());
-	});
+		if (!isSafeToVisit(h, obj->visitablePos()))
+			unreserveObject(h, obj);
+	}
 
 	TimeCheck tc("looking for wander destination");
 
@@ -1462,6 +1462,12 @@ void VCAI::reserveObject(HeroPtr h, const CGObjectInstance *obj)
 	logAi->debugStream() << "reserved object id=" << obj->id << "; address=" << (intptr_t)obj << "; name=" << obj->getHoverText();
 }
 
+void VCAI::unreserveObject(HeroPtr h, const CGObjectInstance *obj)
+{
+	erase_if_present(reservedObjs, obj); //unreserve objects
+	erase_if_present(reservedHeroesMap[h], obj);
+}
+
 void VCAI::validateVisitableObjs()
 {
 	std::vector<const CGObjectInstance *> hlp;

+ 1 - 0
AI/VCAI/VCAI.h

@@ -282,6 +282,7 @@ public:
 	void addVisitableObj(const CGObjectInstance *obj);
 	void markObjectVisited (const CGObjectInstance *obj);
 	void reserveObject (HeroPtr h, const CGObjectInstance *obj); //TODO: reserve all objects that heroes attempt to visit
+	void unreserveObject (HeroPtr h, const CGObjectInstance *obj); 
 	//void removeVisitableObj(const CGObjectInstance *obj);
 	void validateObject(const CGObjectInstance *obj); //checks if object is still visible and if not, removes references to it
 	void validateObject(ObjectIdRef obj); //checks if object is still visible and if not, removes references to it