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

NKAI: fix patrolling heroes never retreat and town danger evaluation

This commit is contained in:
Andrii Danylchenko 2024-04-21 14:23:58 +03:00
parent 7aff0e63fc
commit 390136e536
3 changed files with 26 additions and 3 deletions

View File

@ -544,6 +544,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();

View File

@ -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)

View File

@ -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!