mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-16 10:19:47 +02:00
Going to town when nothing to do.
The StayAtTown-behavior now always creates tasks for all heroes to go and stay at a town. It will be treated differently than going to a town for mana in the sense that it is only considered at the lowest priority-tier. So it will only happen when the AI doesn't find anything else to do. It should resolve one of the two main-reasons for losing weak heros. The hunter-gather-priority-tier now goes strictly by distance for all taks that are considered above 0 in value.
This commit is contained in:
parent
099341e143
commit
0edc17b7d8
@ -39,9 +39,6 @@ Goals::TGoalVec StayAtTownBehavior::decompose(const Nullkiller * ai) const
|
|||||||
|
|
||||||
for(auto town : towns)
|
for(auto town : towns)
|
||||||
{
|
{
|
||||||
if(!town->hasBuilt(BuildingID::MAGES_GUILD_1))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ai->pathfinder->calculatePathInfo(paths, town->visitablePos());
|
ai->pathfinder->calculatePathInfo(paths, town->visitablePos());
|
||||||
|
|
||||||
for(auto & path : paths)
|
for(auto & path : paths)
|
||||||
@ -49,14 +46,8 @@ Goals::TGoalVec StayAtTownBehavior::decompose(const Nullkiller * ai) const
|
|||||||
if(town->visitingHero && town->visitingHero.get() != path.targetHero)
|
if(town->visitingHero && town->visitingHero.get() != path.targetHero)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(!path.targetHero->hasSpellbook() || path.targetHero->mana >= 0.75f * path.targetHero->manaLimit())
|
if(!path.getFirstBlockedAction() && path.exchangeCount <= 1)
|
||||||
continue;
|
|
||||||
|
|
||||||
if(path.turn() == 0 && !path.getFirstBlockedAction() && path.exchangeCount <= 1)
|
|
||||||
{
|
{
|
||||||
if(path.targetHero->mana == path.targetHero->manaLimit())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
Composition stayAtTown;
|
Composition stayAtTown;
|
||||||
|
|
||||||
stayAtTown.addNextSequence({
|
stayAtTown.addNextSequence({
|
||||||
|
@ -944,6 +944,8 @@ public:
|
|||||||
Goals::StayAtTown & stayAtTown = dynamic_cast<Goals::StayAtTown &>(*task);
|
Goals::StayAtTown & stayAtTown = dynamic_cast<Goals::StayAtTown &>(*task);
|
||||||
|
|
||||||
evaluationContext.armyReward += evaluationContext.evaluator.getManaRecoveryArmyReward(stayAtTown.getHero());
|
evaluationContext.armyReward += evaluationContext.evaluator.getManaRecoveryArmyReward(stayAtTown.getHero());
|
||||||
|
if (evaluationContext.armyReward == 0)
|
||||||
|
evaluationContext.isDefend = true;
|
||||||
evaluationContext.movementCostByRole[evaluationContext.heroRole] += stayAtTown.getMovementWasted();
|
evaluationContext.movementCostByRole[evaluationContext.heroRole] += stayAtTown.getMovementWasted();
|
||||||
evaluationContext.movementCost += stayAtTown.getMovementWasted();
|
evaluationContext.movementCost += stayAtTown.getMovementWasted();
|
||||||
}
|
}
|
||||||
@ -1365,7 +1367,7 @@ float PriorityEvaluator::evaluate(Goals::TSubgoal task, int priorityTier)
|
|||||||
float score = 0;
|
float score = 0;
|
||||||
float maxWillingToLose = ai->cb->getTownsInfo().empty() ? 1 : 0.25;
|
float maxWillingToLose = ai->cb->getTownsInfo().empty() ? 1 : 0.25;
|
||||||
#if NKAI_TRACE_LEVEL >= 2
|
#if NKAI_TRACE_LEVEL >= 2
|
||||||
logAi->trace("BEFORE: priorityTier %d, Evaluated %s, loss: %f, turn: %d, turns main: %f, scout: %f, gold: %f, cost: %d, army gain: %f, army growth: %f skill: %f danger: %d, threatTurns: %d, threat: %d, role: %s, strategical value: %f, conquest value: %f cwr: %f, fear: %f, isDefend: %d, fuzzy: %f",
|
logAi->trace("BEFORE: priorityTier %d, Evaluated %s, loss: %f, turn: %d, turns main: %f, scout: %f, gold: %f, cost: %d, army gain: %f, army growth: %f skill: %f danger: %d, threatTurns: %d, threat: %d, role: %s, strategical value: %f, conquest value: %f cwr: %f, fear: %f, isDefend: %d",
|
||||||
priorityTier,
|
priorityTier,
|
||||||
task->toString(),
|
task->toString(),
|
||||||
evaluationContext.armyLossPersentage,
|
evaluationContext.armyLossPersentage,
|
||||||
@ -1385,8 +1387,7 @@ float PriorityEvaluator::evaluate(Goals::TSubgoal task, int priorityTier)
|
|||||||
evaluationContext.conquestValue,
|
evaluationContext.conquestValue,
|
||||||
evaluationContext.closestWayRatio,
|
evaluationContext.closestWayRatio,
|
||||||
evaluationContext.enemyHeroDangerRatio,
|
evaluationContext.enemyHeroDangerRatio,
|
||||||
evaluationContext.isDefend,
|
evaluationContext.isDefend);
|
||||||
fuzzyResult);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (priorityTier)
|
switch (priorityTier)
|
||||||
@ -1443,6 +1444,7 @@ float PriorityEvaluator::evaluate(Goals::TSubgoal task, int priorityTier)
|
|||||||
score -= evaluationContext.armyInvolvement * evaluationContext.armyLossPersentage;
|
score -= evaluationContext.armyInvolvement * evaluationContext.armyLossPersentage;
|
||||||
if (score > 0)
|
if (score > 0)
|
||||||
{
|
{
|
||||||
|
score = 1000;
|
||||||
score *= evaluationContext.closestWayRatio;
|
score *= evaluationContext.closestWayRatio;
|
||||||
if (evaluationContext.enemyHeroDangerRatio > 1)
|
if (evaluationContext.enemyHeroDangerRatio > 1)
|
||||||
score /= evaluationContext.enemyHeroDangerRatio;
|
score /= evaluationContext.enemyHeroDangerRatio;
|
||||||
@ -1457,7 +1459,7 @@ float PriorityEvaluator::evaluate(Goals::TSubgoal task, int priorityTier)
|
|||||||
if (evaluationContext.enemyHeroDangerRatio > 1 && evaluationContext.isExchange)
|
if (evaluationContext.enemyHeroDangerRatio > 1 && evaluationContext.isExchange)
|
||||||
return 0;
|
return 0;
|
||||||
if (evaluationContext.isDefend)
|
if (evaluationContext.isDefend)
|
||||||
score = evaluationContext.armyInvolvement;
|
score = 1000;
|
||||||
score *= evaluationContext.closestWayRatio;
|
score *= evaluationContext.closestWayRatio;
|
||||||
score /= (evaluationContext.turn + 1);
|
score /= (evaluationContext.turn + 1);
|
||||||
break;
|
break;
|
||||||
@ -1516,7 +1518,7 @@ float PriorityEvaluator::evaluate(Goals::TSubgoal task, int priorityTier)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if NKAI_TRACE_LEVEL >= 2
|
#if NKAI_TRACE_LEVEL >= 2
|
||||||
logAi->trace("priorityTier %d, Evaluated %s, loss: %f, turn: %d, turns main: %f, scout: %f, gold: %f, cost: %d, army gain: %f, army growth: %f skill: %f danger: %d, threatTurns: %d, threat: %d, role: %s, strategical value: %f, conquest value: %f cwr: %f, fear: %f, fuzzy: %f, result %f",
|
logAi->trace("priorityTier %d, Evaluated %s, loss: %f, turn: %d, turns main: %f, scout: %f, gold: %f, cost: %d, army gain: %f, army growth: %f skill: %f danger: %d, threatTurns: %d, threat: %d, role: %s, strategical value: %f, conquest value: %f cwr: %f, fear: %f, result %f",
|
||||||
priorityTier,
|
priorityTier,
|
||||||
task->toString(),
|
task->toString(),
|
||||||
evaluationContext.armyLossPersentage,
|
evaluationContext.armyLossPersentage,
|
||||||
@ -1536,7 +1538,6 @@ float PriorityEvaluator::evaluate(Goals::TSubgoal task, int priorityTier)
|
|||||||
evaluationContext.conquestValue,
|
evaluationContext.conquestValue,
|
||||||
evaluationContext.closestWayRatio,
|
evaluationContext.closestWayRatio,
|
||||||
evaluationContext.enemyHeroDangerRatio,
|
evaluationContext.enemyHeroDangerRatio,
|
||||||
fuzzyResult,
|
|
||||||
result);
|
result);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -41,11 +41,6 @@ std::string StayAtTown::toString() const
|
|||||||
|
|
||||||
void StayAtTown::accept(AIGateway * ai)
|
void StayAtTown::accept(AIGateway * ai)
|
||||||
{
|
{
|
||||||
if(hero->visitedTown != town)
|
|
||||||
{
|
|
||||||
logAi->error("Hero %s expected visiting town %s", hero->getNameTranslated(), town->getNameTranslated());
|
|
||||||
}
|
|
||||||
|
|
||||||
ai->nullkiller->lockHero(hero, HeroLockedReason::DEFENCE);
|
ai->nullkiller->lockHero(hero, HeroLockedReason::DEFENCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user