Procházet zdrojové kódy

- AI will now wander with all the heroes that have spare movement points. It should prevent stalling.
- Fixed #1030

DjWarmonger před 13 roky
rodič
revize
4c0537c420
2 změnil soubory, kde provedl 11 přidání a 6 odebrání
  1. 10 5
      AI/VCAI/VCAI.cpp
  2. 1 1
      lib/CObjectHandler.cpp

+ 10 - 5
AI/VCAI/VCAI.cpp

@@ -1073,7 +1073,7 @@ void VCAI::makeTurnInternal()
 bool VCAI::goVisitObj(const CGObjectInstance * obj, HeroPtr h)
 {
 	int3 dst = obj->visitablePos();
-	BNLOG("%s will try to visit %s at (%s)", h->name % obj->hoverName % strFromInt3(dst));
+	BNLOG("%s will try to visit %s at (%s)", h->name % obj->getHoverText() % strFromInt3(dst));
 	return moveHeroToTile(dst, h);
 }
 
@@ -1541,7 +1541,7 @@ void VCAI::retreiveVisitableObjs(std::vector<const CGObjectInstance *> &out, boo
 {
 	foreach_tile_pos([&](const int3 &pos)
 	{
-		BOOST_FOREACH(const CGObjectInstance *obj, cb->getVisitableObjs(pos, false))
+		BOOST_FOREACH(const CGObjectInstance *obj, myCb->getVisitableObjs(pos, false))
 		{
 			if(includeOwned || obj->tempOwner != playerID)
 				out.push_back(obj);
@@ -1916,7 +1916,8 @@ std::vector<HeroPtr> VCAI::getUnblockedHeroes() const
 
 	BOOST_FOREACH(auto h, lockedHeroes)
 	{
-		if (!h.second.invalid()) //we can use heroes without valid goal
+		//if (!h.second.invalid()) //we can use heroes without valid goal
+		if (h.second.goalType == DIG_AT_TILE || !h.first->movement) //experiment: use all heroes that have movement left, TODO: unlock heroes that couldn't realize their goals 
 			remove_if_present(ret, h.first);
 	}
 	return ret;
@@ -3241,6 +3242,7 @@ bool shouldVisit(HeroPtr h, const CGObjectInstance * obj)
 				}
 			}
 			return true; //we don't have this quest yet
+			break;
 		}
 		case Obj::CREATURE_GENERATOR1:
 		{
@@ -3257,13 +3259,15 @@ bool shouldVisit(HeroPtr h, const CGObjectInstance * obj)
 				}
 			}
 			return canRecruitCreatures;
+			break;
 		}
 		case Obj::MONOLITH1:
 		case Obj::MONOLITH2:
 		case Obj::MONOLITH3:
 		case Obj::WHIRLPOOL:
-			//TODO: mehcanism for handling monoliths
+			//TODO: mechanism for handling monoliths
 			return false;
+			break;
 		case Obj::SCHOOL_OF_MAGIC:
 		case Obj::SCHOOL_OF_WAR:
 			{
@@ -3275,6 +3279,7 @@ bool shouldVisit(HeroPtr h, const CGObjectInstance * obj)
 		case Obj::LIBRARY_OF_ENLIGHTENMENT:
 			if (h->level < 12)
 				return false;
+			break;
 		case Obj::TREE_OF_KNOWLEDGE:
 			{
 				TResources myRes = ai->myCb->getResourceAmount();
@@ -3284,7 +3289,7 @@ bool shouldVisit(HeroPtr h, const CGObjectInstance * obj)
 			break;
 	}
 
-	if (obj->wasVisited(h))
+	if (obj->wasVisited(*h)) //it must pointer to hero instance, heroPtr calls function wasVisited(ui8 player);
 		return false;
 
 	return true;

+ 1 - 1
lib/CObjectHandler.cpp

@@ -3530,7 +3530,7 @@ void CGVisitableOPW::newTurn() const
 }
 bool CGVisitableOPW::wasVisited(ui8 player) const
 {
-	return !visited; //TODO: other players should see object as unvisited
+	return visited; //TODO: other players should see object as unvisited
 }
 
 void CGVisitableOPW::onHeroVisit( const CGHeroInstance * h ) const