mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
Merge pull request #3814 from vcmi/fixes
NKAI: fix patrolling heroes never retreat and town danger evaluation
This commit is contained in:
commit
b4abb3a56c
@ -545,6 +545,11 @@ std::optional<BattleAction> AIGateway::makeSurrenderRetreatDecision(const Battle
|
||||
LOG_TRACE(logAi);
|
||||
NET_EVENT_HANDLER;
|
||||
|
||||
if(battleState.ourHero && battleState.ourHero->patrol.patrolling)
|
||||
{
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
double ourStrength = battleState.getOurStrength();
|
||||
double fightRatio = ourStrength / (double)battleState.getEnemyStrength();
|
||||
|
||||
|
@ -130,7 +130,14 @@ void HeroManager::update()
|
||||
|
||||
for(auto hero : myHeroes)
|
||||
{
|
||||
heroRoles[hero] = (globalMainCount--) > 0 ? HeroRole::MAIN : HeroRole::SCOUT;
|
||||
if(hero->patrol.patrolling)
|
||||
{
|
||||
heroRoles[hero] = HeroRole::MAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
heroRoles[hero] = (globalMainCount--) > 0 ? HeroRole::MAIN : HeroRole::SCOUT;
|
||||
}
|
||||
}
|
||||
|
||||
for(auto hero : myHeroes)
|
||||
|
@ -53,15 +53,26 @@ ui64 FuzzyHelper::evaluateDanger(const int3 & tile, const CGHeroInstance * visit
|
||||
// in some scenarios hero happens to be "under" the object (eg town). Then we consider ONLY the hero.
|
||||
if(vstd::contains_if(visitableObjects, objWithID<Obj::HERO>))
|
||||
{
|
||||
vstd::erase_if(visitableObjects, [](const CGObjectInstance * obj)
|
||||
vstd::erase_if(visitableObjects, [](const CGObjectInstance * obj) -> bool
|
||||
{
|
||||
return !objWithID<Obj::HERO>(obj);
|
||||
return !objWithID<Obj::HERO>(obj);
|
||||
});
|
||||
}
|
||||
|
||||
if(const CGObjectInstance * dangerousObject = vstd::backOrNull(visitableObjects))
|
||||
{
|
||||
objectDanger = evaluateDanger(dangerousObject); //unguarded objects can also be dangerous or unhandled
|
||||
|
||||
if(objWithID<Obj::HERO>(dangerousObject))
|
||||
{
|
||||
auto hero = dynamic_cast<const CGHeroInstance *>(dangerousObject);
|
||||
|
||||
if(hero->visitedTown && !hero->visitedTown->garrisonHero)
|
||||
{
|
||||
objectDanger += evaluateDanger(hero->visitedTown.get());
|
||||
}
|
||||
}
|
||||
|
||||
if(objectDanger)
|
||||
{
|
||||
//TODO: don't downcast objects AI shouldn't know about!
|
||||
|
Loading…
Reference in New Issue
Block a user