Difference between revisions of "AI Recruitment"
(→Combat Analysis) |
(→Combat Analysis) |
||
Line 26: | Line 26: | ||
double value_of_a = damage_to_b / (b_max_hp * a_cost); | double value_of_a = damage_to_b / (b_max_hp * a_cost); | ||
double value_of_b = damage_to_a / (a_max_hp * b_cost); | double value_of_b = damage_to_a / (a_max_hp * b_cost); | ||
− | + | ||
if (value_of_a > value_of_b) { | if (value_of_a > value_of_b) { | ||
return value_of_a / value_of_b; | return value_of_a / value_of_b; |
Revision as of 11:46, 12 September 2013
This page is work in progress
The new Recruitment Candidate Action is highly configurable and supports multiple leader recruiting...
Contents
How it works
Map analyis
In a first step the CA will analyse the map and try to find "important hexes". Those are locations on the map where a fight will occur with high probability. The important hexes are used later in combat simulations to calculate a average defense for the combatants.
If the game runs in debug mode the important hexes will be displayed with a white circle on them.
Implementation details for interested readers: [...]
Score Map
For all leaders which are available for recruiting a score map will be created including all unit-types from the recruit- and recall lists. Then the scores are filled with values coming from different functions (see below).
Combat Analysis
For each unit-type our leaders can recruit the CA will simulate a fight with all enemy units on the map (If there are less then 5 enemy units, the enemies recruitment list(s) will be taken into account)
Implementation details for interested readers:
Combat Analysis will use the function compare_unit_types(a, b)
. It takes two unit-types and returns a positive value if unit-type a is better then b and a negative value if unit-type b is better then a. If the return value is 2.0 it means that unit-type a is twice as good as unit-type b.
Here is a important code-snipped of compare_unit_types()
:
double value_of_a = damage_to_b / (b_max_hp * a_cost); double value_of_b = damage_to_a / (a_max_hp * b_cost); if (value_of_a > value_of_b) { return value_of_a / value_of_b; } else if (value_of_a < value_of_b) { return -value_of_b / value_of_a; } else { return 0.; }
Aspect recruitment_instruction
Examples
Recruit 3 Grunts (and nothing more) in turn 3-5.
[ai] [aspect] id=recruitment-instructions [facet] turns=3-5 [value] [recruit] type=Orcish Grunt number=3 [/recruit] [/value] [/facet] [/aspect] [/ai]
Recruit so, that there are at least 4 scouts in total and then recruit other units.
[ai] [aspect] id=recruitment-instructions [facet] [value] [recruit] type=scout number=4 total=yes importance=1 [/recruit] [recruit] importance=0 [/recruit] [/value] [/facet] [/aspect] [/ai]
Recruit 6 Grunts or level 2 units (whatever seems better for the AI) and nothing more.
[ai] [aspect] id=recruitment-instructions [facet] [value] [recruit] type=Orcish Grunt, 2 number=6 [/recruit] [/value] [/facet] [/aspect] [/ai]
Recruit 5 scouts with leader1 and 5 Grunts with leader 2. Do even try to recruit the Grunts if leader1 can not recruit all of the scouts.
[ai] [aspect] id=recruitment-instructions [facet] [value] [recruit] type=scout number=5 importance=2 leader_id=leader1 blocker=no [/recruit] [recruit] type=Orcish Grunt number=5 importance=1 leader_id=leader2 [/recruit] [/value] [/facet] [/aspect] [/ai]
Do not recruit in turn 4.
[ai] [aspect] id=recruitment-instructions [facet] turns=4 [value] [recruit] importance=1 number=0 [/recruit] [/value] [/facet] [/aspect] [/ai]
This will not work. Only one facet can be active.
[ai] [aspect] id=recruitment-instructions [facet] turns=1-10 [value] [recruit] type=scout number=5 importance=1 [/recruit] [/value] [/facet] [facet] turns=3 [value] [recruit] type=Orcish Grunt number=3 importance=2 [/recruit] [/value] [/facet] [/aspect] [/ai]
To achieve this behavior one have to create a facet for turn 1-2, a facet for turn 3 and another facet for turn 4-10.