1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Improvements for AI speed (#1760)

AI heroes will be excluded from exploration if:
- There is no clear way to next exploration point or
- There is no possible exploration point at all
AI heroes will be erased from the list above if:
- FoW changes
- New object is added
- To prevent lock, primary hero will be erased at the start of each turn
This commit is contained in:
DjWarmonger 2014-03-23 16:00:43 +00:00
parent 9c0df68cb8
commit 441e4b2cb2
3 changed files with 45 additions and 7 deletions

View File

@ -567,6 +567,9 @@ TGoalVec Explore::getAllPossibleSubgoals()
if (ai->getGoal(h)->goalType == Goals::EXPLORE) //do not reassign hero who is already explorer
return true;
if (!ai->isAbleToExplore(h))
return true;
return !h->movement; //saves time, immobile heroes are useless anyway
});
}
@ -603,11 +606,17 @@ TGoalVec Explore::getAllPossibleSubgoals()
{
ret.push_back (sptr (Goals::VisitTile(t).sethero(h)));
}
else if (hero.h == h || (!hero && h == ai->primaryHero().h)) //check this only ONCE, high cost
else
{
t = ai->explorationDesperate(h);
if (t.valid()) //don't waste time if we are completely blocked
ret.push_back (sptr(Goals::ClearWayTo(t, h).setisAbstract(true)));
ai->markHeroUnableToExplore (h); //there is no freely accessible tile, do not poll this hero anymore
//possible issues when gathering army to break
if (hero.h == h || (!hero && h == ai->primaryHero().h)) //check this only ONCE, high cost
{
t = ai->explorationDesperate(h);
if (t.valid()) //don't waste time if we are completely blocked
ret.push_back (sptr(Goals::ClearWayTo(t, h).setisAbstract(true)));
}
}
}
//we either don't have hero yet or none of heroes can explore

View File

@ -282,6 +282,8 @@ void VCAI::tileRevealed(const std::unordered_set<int3, ShashInt3> &pos)
for(int3 tile : pos)
for(const CGObjectInstance *obj : myCb->getVisitableObjs(tile))
addVisitableObj(obj);
clearHeroesUnableToExplore();
}
void VCAI::heroExchangeStarted(ObjectInstanceID hero1, ObjectInstanceID hero2, QueryID query)
@ -361,6 +363,8 @@ void VCAI::newObject(const CGObjectInstance * obj)
NET_EVENT_HANDLER;
if(obj->isVisitable())
addVisitableObj(obj);
clearHeroesUnableToExplore();
}
void VCAI::objectRemoved(const CGObjectInstance *obj)
@ -661,6 +665,8 @@ void VCAI::makeTurn()
if(cb->getSelectedHero())
cb->recalculatePaths();
markHeroAbleToExplore (primaryHero());
makeTurnInternal();
makingTurn.reset();
@ -1469,6 +1475,23 @@ void VCAI::unreserveObject(HeroPtr h, const CGObjectInstance *obj)
erase_if_present(reservedHeroesMap[h], obj);
}
void VCAI::markHeroUnableToExplore (HeroPtr h)
{
heroesUnableToExplore.insert(h);
}
void VCAI::markHeroAbleToExplore (HeroPtr h)
{
erase_if_present(heroesUnableToExplore, h);
}
bool VCAI::isAbleToExplore (HeroPtr h)
{
return !vstd::contains (heroesUnableToExplore, h);
}
void VCAI::clearHeroesUnableToExplore()
{
heroesUnableToExplore.clear();
}
void VCAI::validateVisitableObjs()
{
std::vector<const CGObjectInstance *> hlp;

View File

@ -149,6 +149,7 @@ public:
std::map<HeroPtr, Goals::TSubgoal> lockedHeroes; //TODO: allow non-elementar objectives
std::map<HeroPtr, std::set<const CGObjectInstance *> > reservedHeroesMap; //objects reserved by specific heroes
std::set<HeroPtr> heroesUnableToExplore; //these heroes will not be polled for exploration in current state of game
//sets are faster to search, also do not contain duplicates
std::set<const CGObjectInstance *> visitableObjs;
@ -282,8 +283,13 @@ 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 unreserveObject (HeroPtr h, const CGObjectInstance *obj);
void markHeroUnableToExplore (HeroPtr h);
void markHeroAbleToExplore (HeroPtr h);
bool isAbleToExplore (HeroPtr h);
void clearHeroesUnableToExplore();
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
void validateVisitableObjs();
@ -344,7 +350,7 @@ public:
h & knownSubterraneanGates & townVisitsThisWeek & lockedHeroes & reservedHeroesMap; //FIXME: cannot instantiate abstract class
h & visitableObjs & alreadyVisited & reservedObjs;
h & saving & status & battlename;
h & heroesUnableToExplore;
//myCB is restored after load by init call
}