2018-08-10 18:27:57 +02:00
/*
* FuzzyEngines . 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
2018-12-30 23:03:31 +02:00
# include <fl/Headers.h>
2018-12-01 10:30:37 +02:00
# include "Goals/AbstractGoal.h"
2018-08-10 18:27:57 +02:00
2022-07-26 15:07:42 +02:00
VCMI_LIB_NAMESPACE_BEGIN
2018-08-10 18:27:57 +02:00
class CArmedInstance ;
2022-07-26 15:07:42 +02:00
VCMI_LIB_NAMESPACE_END
2018-08-10 18:27:57 +02:00
class engineBase //subclasses create fuzzylite variables with "new" that are not freed - this is desired as fl::Engine wants to destroy these...
{
protected :
fl : : Engine engine ;
2019-03-30 20:19:36 +02:00
fl : : RuleBlock * rules ;
2018-08-10 18:27:57 +02:00
virtual void configure ( ) ;
void addRule ( const std : : string & txt ) ;
public :
engineBase ( ) ;
} ;
2019-02-13 01:28:39 +02:00
class TacticalAdvantageEngine : public engineBase //TODO: rework this engine, it does not work well (example: AI hero with 140 beholders attacked 150 beholders - engine lowered danger 50000 -> 35000)
2018-08-10 18:27:57 +02:00
{
public :
TacticalAdvantageEngine ( ) ;
float getTacticalAdvantage ( const CArmedInstance * we , const CArmedInstance * enemy ) ; //returns factor how many times enemy is stronger than us
private :
fl : : InputVariable * ourWalkers , * ourShooters , * ourFlyers , * enemyWalkers , * enemyShooters , * enemyFlyers ;
fl : : InputVariable * ourSpeed , * enemySpeed ;
fl : : InputVariable * bankPresent ;
fl : : InputVariable * castleWalls ;
fl : : OutputVariable * threat ;
} ;
class HeroMovementGoalEngineBase : public engineBase //in future - maybe derive from some (GoalEngineBase : public engineBase) class for handling non-movement goals with common utility for goal engines
{
public :
HeroMovementGoalEngineBase ( ) ;
protected :
void setSharedFuzzyVariables ( Goals : : AbstractGoal & goal ) ;
fl : : InputVariable * strengthRatio ;
fl : : InputVariable * heroStrength ;
fl : : InputVariable * turnDistance ;
fl : : InputVariable * missionImportance ;
fl : : OutputVariable * value ;
private :
2018-10-09 21:31:44 +02:00
float calculateTurnDistanceInputValue ( const Goals : : AbstractGoal & goal ) const ;
2018-08-10 18:27:57 +02:00
} ;
class VisitTileEngine : public HeroMovementGoalEngineBase
{
public :
VisitTileEngine ( ) ;
2018-08-10 20:36:42 +02:00
float evaluate ( Goals : : VisitTile & goal ) ;
2018-08-10 18:27:57 +02:00
} ;
2018-08-10 20:36:42 +02:00
class VisitObjEngine : public HeroMovementGoalEngineBase
2018-08-10 18:27:57 +02:00
{
public :
2018-08-10 20:36:42 +02:00
VisitObjEngine ( ) ;
float evaluate ( Goals : : VisitObj & goal ) ;
2018-08-10 18:27:57 +02:00
protected :
fl : : InputVariable * objectValue ;
2018-12-30 23:03:31 +02:00
} ;