mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-22 22:13:35 +02:00
df21a77857
When defending the AI is now much smarter to use their defensive-structures like walls, towers and the moat to their advantage instead of allowing them to be lured out and killed in the open. A penalty-multiplier is now applied when deciding which units to walk towards. If an ally is closer than us to the enemy unit in question, we reduce our score for walking towards that unit too. This shall help against baiting a whole flock of AI-stacks to overcommit on chasing an inferior stack of the enemy.
84 lines
2.3 KiB
C++
84 lines
2.3 KiB
C++
/*
|
|
* BattleEvaluator.h, part of VCMI engine
|
|
*
|
|
* Authors: listed in file AUTHORS in main folder
|
|
*
|
|
* License: GNU General Public License v2.0 or later
|
|
* Full text of license available in license.txt file, in main folder
|
|
*
|
|
*/
|
|
#pragma once
|
|
#include "../../lib/AI_Base.h"
|
|
#include "../../lib/battle/ReachabilityInfo.h"
|
|
#include "PossibleSpellcast.h"
|
|
#include "PotentialTargets.h"
|
|
#include "BattleExchangeVariant.h"
|
|
|
|
VCMI_LIB_NAMESPACE_BEGIN
|
|
|
|
class CSpell;
|
|
|
|
VCMI_LIB_NAMESPACE_END
|
|
|
|
class EnemyInfo;
|
|
|
|
struct CachedAttack
|
|
{
|
|
std::optional<AttackPossibility> ap;
|
|
float score = EvaluationResult::INEFFECTIVE_SCORE;
|
|
uint8_t turn = 255;
|
|
bool waited = false;
|
|
};
|
|
|
|
class BattleEvaluator
|
|
{
|
|
std::unique_ptr<PotentialTargets> targets;
|
|
std::shared_ptr<HypotheticBattle> hb;
|
|
BattleExchangeEvaluator scoreEvaluator;
|
|
std::shared_ptr<CBattleCallback> cb;
|
|
std::shared_ptr<Environment> env;
|
|
bool activeActionMade = false;
|
|
CachedAttack cachedAttack;
|
|
PlayerColor playerID;
|
|
BattleID battleID;
|
|
BattleSide side;
|
|
DamageCache damageCache;
|
|
float strengthRatio;
|
|
int simulationTurnsCount;
|
|
|
|
public:
|
|
BattleAction selectStackAction(const CStack * stack);
|
|
bool attemptCastingSpell(const CStack * stack);
|
|
bool canCastSpell();
|
|
std::optional<PossibleSpellcast> findBestCreatureSpell(const CStack * stack);
|
|
BattleAction goTowardsNearest(const CStack * stack, std::vector<BattleHex> hexes, const PotentialTargets & targets);
|
|
std::vector<BattleHex> getBrokenWallMoatHexes() const;
|
|
static std::vector<BattleHex> getCastleHexes();
|
|
bool hasWorkingTowers() const;
|
|
void evaluateCreatureSpellcast(const CStack * stack, PossibleSpellcast & ps); //for offensive damaging spells only
|
|
void print(const std::string & text) const;
|
|
BattleAction moveOrAttack(const CStack * stack, BattleHex hex, const PotentialTargets & targets);
|
|
|
|
BattleEvaluator(
|
|
std::shared_ptr<Environment> env,
|
|
std::shared_ptr<CBattleCallback> cb,
|
|
const battle::Unit * activeStack,
|
|
PlayerColor playerID,
|
|
BattleID battleID,
|
|
BattleSide side,
|
|
float strengthRatio,
|
|
int simulationTurnsCount);
|
|
|
|
BattleEvaluator(
|
|
std::shared_ptr<Environment> env,
|
|
std::shared_ptr<CBattleCallback> cb,
|
|
std::shared_ptr<HypotheticBattle> hb,
|
|
DamageCache & damageCache,
|
|
const battle::Unit * activeStack,
|
|
PlayerColor playerID,
|
|
BattleID battleID,
|
|
BattleSide side,
|
|
float strengthRatio,
|
|
int simulationTurnsCount);
|
|
};
|