mirror of
https://github.com/vcmi/vcmi.git
synced 2025-01-12 02:28:11 +02:00
22222f0fba
Manarecoveryreward now uses float instead of unsigned int in order to avoid extremely high instead of negative scores when the hero has more mana than his mana-limit for example due to mana-vortex. Moved upgrading armies to a lower priority tier as otherwise the AI would go back to their cities all the time even though there were plenty of other things to do. Improved exploration logic by putting different kinds of exploration to different priority-tiers. Looking at the other side of a portal has high priority, visiting an observatory has medium priority and scouting by visiting nearby tiles has low priority.
147 lines
4.2 KiB
C++
147 lines
4.2 KiB
C++
/*
|
|
* PriorityEvaluator.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
|
|
#if __has_include(<fuzzylite/Headers.h>)
|
|
# include <fuzzylite/Headers.h>
|
|
#else
|
|
# include <fl/Headers.h>
|
|
#endif
|
|
#include "../Goals/CGoal.h"
|
|
#include "../Pathfinding/AIPathfinder.h"
|
|
|
|
VCMI_LIB_NAMESPACE_BEGIN
|
|
|
|
VCMI_LIB_NAMESPACE_END
|
|
|
|
namespace NKAI
|
|
{
|
|
|
|
class BuildingInfo;
|
|
class Nullkiller;
|
|
struct HitMapInfo;
|
|
|
|
class RewardEvaluator
|
|
{
|
|
public:
|
|
const Nullkiller * ai;
|
|
|
|
RewardEvaluator(const Nullkiller * ai) : ai(ai) {}
|
|
|
|
uint64_t getArmyReward(const CGObjectInstance * target, const CGHeroInstance * hero, const CCreatureSet * army, bool checkGold) const;
|
|
uint64_t getArmyGrowth(const CGObjectInstance * target, const CGHeroInstance * hero, const CCreatureSet * army) const;
|
|
int getGoldCost(const CGObjectInstance * target, const CGHeroInstance * hero, const CCreatureSet * army) const;
|
|
float getEnemyHeroStrategicalValue(const CGHeroInstance * enemy) const;
|
|
float getResourceRequirementStrength(int resType) const;
|
|
float getResourceRequirementStrength(const TResources & res) const;
|
|
float getStrategicalValue(const CGObjectInstance * target, const CGHeroInstance * hero = nullptr) const;
|
|
float getConquestValue(const CGObjectInstance* target) const;
|
|
float getTotalResourceRequirementStrength(int resType) const;
|
|
float evaluateWitchHutSkillScore(const CGObjectInstance * hut, const CGHeroInstance * hero, HeroRole role) const;
|
|
float getSkillReward(const CGObjectInstance * target, const CGHeroInstance * hero, HeroRole role) const;
|
|
int32_t getGoldReward(const CGObjectInstance * target, const CGHeroInstance * hero) const;
|
|
uint64_t getUpgradeArmyReward(const CGTownInstance * town, const BuildingInfo & bi) const;
|
|
const HitMapInfo & getEnemyHeroDanger(const int3 & tile, uint8_t turn) const;
|
|
uint64_t townArmyGrowth(const CGTownInstance * town) const;
|
|
float getManaRecoveryArmyReward(const CGHeroInstance * hero) const;
|
|
};
|
|
|
|
struct DLL_EXPORT EvaluationContext
|
|
{
|
|
float movementCost;
|
|
std::map<HeroRole, float> movementCostByRole;
|
|
int manaCost;
|
|
uint64_t danger;
|
|
float closestWayRatio;
|
|
float armyLossPersentage;
|
|
float armyReward;
|
|
uint64_t armyGrowth;
|
|
int32_t goldReward;
|
|
int32_t goldCost;
|
|
float skillReward;
|
|
float strategicalValue;
|
|
float conquestValue;
|
|
HeroRole heroRole;
|
|
uint8_t turn;
|
|
RewardEvaluator evaluator;
|
|
float enemyHeroDangerRatio;
|
|
float threat;
|
|
float armyInvolvement;
|
|
int defenseValue;
|
|
bool isDefend;
|
|
int threatTurns;
|
|
TResources buildingCost;
|
|
bool involvesSailing;
|
|
bool isTradeBuilding;
|
|
bool isExchange;
|
|
bool isArmyUpgrade;
|
|
int explorePriority;
|
|
|
|
EvaluationContext(const Nullkiller * ai);
|
|
|
|
void addNonCriticalStrategicalValue(float value);
|
|
};
|
|
|
|
class IEvaluationContextBuilder
|
|
{
|
|
public:
|
|
virtual ~IEvaluationContextBuilder() = default;
|
|
virtual void buildEvaluationContext(EvaluationContext & evaluationContext, Goals::TSubgoal goal) const = 0;
|
|
};
|
|
|
|
class Nullkiller;
|
|
|
|
class PriorityEvaluator
|
|
{
|
|
public:
|
|
PriorityEvaluator(const Nullkiller * ai);
|
|
~PriorityEvaluator();
|
|
void initVisitTile();
|
|
|
|
float evaluate(Goals::TSubgoal task, int priorityTier = BUILDINGS);
|
|
|
|
enum PriorityTier : int32_t
|
|
{
|
|
BUILDINGS = 0,
|
|
INSTAKILL,
|
|
INSTADEFEND,
|
|
KILL,
|
|
HUNTER_GATHER,
|
|
LOW_PRIO_EXPLORE,
|
|
DEFEND
|
|
};
|
|
|
|
private:
|
|
const Nullkiller * ai;
|
|
|
|
fl::Engine * engine;
|
|
fl::InputVariable * armyLossPersentageVariable;
|
|
fl::InputVariable * heroRoleVariable;
|
|
fl::InputVariable * mainTurnDistanceVariable;
|
|
fl::InputVariable * scoutTurnDistanceVariable;
|
|
fl::InputVariable * turnVariable;
|
|
fl::InputVariable * goldRewardVariable;
|
|
fl::InputVariable * armyRewardVariable;
|
|
fl::InputVariable * armyGrowthVariable;
|
|
fl::InputVariable * dangerVariable;
|
|
fl::InputVariable * skillRewardVariable;
|
|
fl::InputVariable * strategicalValueVariable;
|
|
fl::InputVariable * rewardTypeVariable;
|
|
fl::InputVariable * closestHeroRatioVariable;
|
|
fl::InputVariable * goldPressureVariable;
|
|
fl::InputVariable * goldCostVariable;
|
|
fl::InputVariable * fearVariable;
|
|
fl::OutputVariable * value;
|
|
std::vector<std::shared_ptr<IEvaluationContextBuilder>> evaluationContextBuilders;
|
|
|
|
EvaluationContext buildEvaluationContext(Goals::TSubgoal goal) const;
|
|
};
|
|
|
|
}
|