Author: dragonking
Date: Sat Aug  2 12:58:53 2008
New Revision: 28301

URL: http://svn.gna.org/viewcvs/wesnoth?rev=28301&view=rev
Log:
Move recruitment.fai to approppriate directory

Added:
    trunk/data/ai/formula/recruitment.fai
      - copied unchanged from r28300, trunk/data/recruitment.fai
Removed:
    trunk/data/recruitment.fai
Modified:
    trunk/data/scenario-formula-recruitment.cfg

Removed: trunk/data/recruitment.fai
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/recruitment.fai?rev=28300&view=auto
==============================================================================
--- trunk/data/recruitment.fai (original)
+++ trunk/data/recruitment.fai (removed)
@@ -1,579 +1,0 @@
-               # ===== Some general functions used later ==== #
-
-def sumarize_values( input_map )
-       sum(
-               values(input_map)
-       );
-
-def lowest_value( input_map )
-       choose( input_map, -value ).value;
-
-def highest_value( input_map )
-       choose( input_map, value ).value;
-
-def change_numbers_to_percents( input_map )
-       map( input_map, 
-               (value*100) / highest_value(input_map) 
-       );
-
-def add_number_to_values( input_map, number )
-       map( input_map, 
-               value + number 
-       );
-
-#make sure we have only positive values in a map #
-
-def make_positive_only( input_map )
-       if( lowest_value( input_map ) < 0, 
-               add_number_to_values( 
-                       input_map, 
-                       abs(lowest_value(input_map))
-               ), 
-               input_map 
-       );
-
-def sumarize_maps_values( map_A, map_B )
-       map( map_A + map_B, 
-               value + map_A[key]
-       );
-
-               #===== Evaluation how good unit is on a map ===== #
-
-# ==1==  evaluate average defense #
-#gives map where key is id of terrain, and value is number of hexes of that 
terrain on a gamemap#
-
-def locations_map(ai*) 
-       tomap( 
-               map( 
-                       map.terrain, 
-                       id 
-               ) 
-       );
-
-#filters terrain map, min_percent it minimal % of map that terrain has to 
occupy to be considered in later evaluations# 
-
-def filtered_locations_map(ai*, min_percent)
-       filter( 
-               locations_map(ai) , 
-               value >  (map.w * map.h) / ( 100 / min_percent ) 
-       );
-
-#returns average defense of the unit #
-
-def unit_average_defense(ai*, unit, terrain_min_percent )
-       sum( 
-               values( 
-                       map(
-                               filtered_locations_map(ai,terrain_min_percent), 
-                               defense_on( 
-                                       unit, 
-                                       find(map.terrain,id=key).loc
-                               ) *
-                               value
-                       ) 
-               ) 
-       ) / 
-       sum(
-               values(
-                       filtered_locations_map(
-                               ai,
-                               terrain_min_percent
-                       )
-               )
-       );
-
-#returns map of units from units_list and their average defense (more -> 
better) #
-
-def map_units_average_defense(ai*, units_list, terrain_min_percent) 
-       tomap(
-               map( 
-                       units_list, 
-                       id 
-               ), 
-               map( 
-                       units_list, 'unit', 
-                       unit_average_defense(
-                               ai, 
-                               unit, 
-                               terrain_min_percent 
-                       ) 
-               ) 
-       );
-
-def units_average_defense(ai*, units_list, terrain_min_percent)
-       sum(
-               map( 
-                       units_list, 'unit', 
-                       unit_average_defense(
-                               ai, 
-                               unit, 
-                               terrain_min_percent 
-                       ) 
-               ) 
-       ) /
-       size(
-               units_list
-       );
-
-
-# ==2== TODO: evaluate unit effectivness based on movement points and movement 
cost#
-
-
-               #===== Evaluation of game state - how good is ai doing ===== #
-
-# ==1== based on unit cost and current amount of gold #
-# returns number between 0 and 100 where: 0 we are losing, 100 we are winning #
-
-def units_cost_gold_eval(ai*)
-       min(
-               [
-                       (
-                               (
-                                       sum(
-                                               map(
-                                                       allies, 'team', 
-                                                       sum(
-                                                               map(
-                                                                       
units_of_side[team], 
-                                                                       cost
-                                                               )
-                                                       ) + 
-                                                       teams[team].gold 
-                                               )
-                                       ) * 
-                                       100
-                               ) / 
-                               sum(
-                                       map(
-                                               enemies, 'team', 
-                                               sum(
-                                                       map(
-                                                               
units_of_side[team], 
-                                                               cost
-                                                       )
-                                               ) + 
-                                               max(
-                                                       [teams[team].gold, 0]
-                                               ) 
-                                       )
-                               )
-                       ) / 2,
-                       100
-               ]
-       );
-
-# ==2== based on village possession #
-
-def count_allied_villages(ai*)
-       sum(
-               map(
-                       allies, 'side', 
-                       size(
-                               villages_of_side[side]
-                       )
-               )
-       );
-
-def count_enemy_villages(ai*)
-       sum(
-               map(
-                       enemies, 'side', 
-                       size(
-                               villages_of_side[side]
-                       )
-               )
-       );
-
-# multipled by 1000 to increase precision #
-
-def village_evaluation(ai*)
-       (
-               50000 + 
-               (
-                       count_allied_villages(ai) - 
-                       count_enemy_villages(ai)
-               ) * 
-               (
-                       50000 /
-                       size(
-                               villages
-                       )
-               )
-       ) /
-       1000;
-
-# ==3== combined 2 of the above #
-
-def eval(ai*)
-       ( 
-               units_cost_gold_eval(ai) + 
-               village_evaluation(ai)
-       ) / 
-       2;
-
-               #===== Evaluation how effective my units are against the enemy 
===== #
-
-#==1==  basic evaluation #
-
-# evaluate how much damage unit can inflict - how much damage unit can get#
-
-def evaluate_attacker_against_opponents(ai*, unit, enemy_units)
-       sum( 
-               map( 
-                       enemy_units, 'enemy_unit', 
-                       sum(
-                               map(
-                                       [
-                                               
max_possible_damage_with_retaliation( unit, enemy_unit )
-                                       ],
-                                       max(
-                                               [
-                                                       self[0] - self[2],
-                                                       self[1] - self[3]
-                                               ]
-                                       )
-                               ) 
-                       )
-               )
-       );
-
-def evaluate_defender_against_opponents(ai*, unit, enemy_units)
-       -sum( 
-               map( 
-                       enemy_units, 'enemy_unit', 
-                       sum(
-                               map(
-                                       [
-                                               
max_possible_damage_with_retaliation( enemy_unit, unit )
-                                       ],
-                                       max(
-                                               [
-                                                       self[0] - self[2],
-                                                       self[1] - self[3]
-                                               ]
-                                       )
-                               )
-                       )
-               )
-       );
-
-def units_hp_map(ai*, units)
-       tomap( 
-               map(
-                       units, 
-                       id
-               ), 
-               map( 
-                       units, 
-                       hitpoints
-               )
-       );
-
-#in case side's gold is more than 50, add units that side can recruit to the 
side's unit list#
-
-def create_side_unit_list(ai*, side)
-       if( 
-               teams[side].gold > 50, 
-               recruits_of_side[side], 
-               []
-       ) + 
-       units_of_side[side];
-
-def evaluate_my_recruits_as_attackers(ai*)
-       tomap( 
-               map(
-                       my_recruits, 
-                       id
-               ), 
-               map(
-                       my_recruits, 'my_unit',
-                       sum(
-                               map(
-                                       enemies, 'enemy_side',
-                                       evaluate_attacker_against_opponents(
-                                               ai,
-                                               my_unit,
-                                               create_side_unit_list(
-                                                       ai, 
-                                                       enemy_side
-                                               )
-                                       )
-                               )
-                       )
-               )
-       );
-
-def evaluate_my_recruits_as_defenders(ai*)
-       tomap(
-               map(
-                       my_recruits, 
-                       id
-               ),
-               map( 
-                       my_recruits, 'my_unit',
-                       sum(
-                               map(
-                                       enemies, 'enemy_side',
-                                       evaluate_defender_against_opponents(
-                                               ai,
-                                               my_unit,
-                                               create_side_unit_list(
-                                                       ai,
-                                                       enemy_side
-                                               )
-                                       )
-                               )
-                       )
-               )
-       );
-
-
-# === 2 ===  now consider abilities and weapon specials  #
-
-def abilities_weights()
-       ['skirmisher' -> 15, 'ambush' -> 10, 'nightstalk' -> 20, 'regenerates' 
-> 20, 'healing' -> 15, 'curing' -> 10, 'leadership' -> 20, 'illumination' -> 
15, 'teleport' -> 10, 'steadfast' -> 15 ];
-
-def weapon_specials_weights()
-       [ 'backstab' -> 20 ,'slow' -> 10 ,'berserk' -> 20 ,'stones' -> 60 
,'plague' -> 10 ,'marksman' -> 30 ,'magical' -> 40 ,'charge' -> 30 ,'drains' -> 
30,  'firststrike' -> 10, 'poison' -> 25 ];
-
-def apply_abilities_weights( units_map )
-       map( 
-               units_map, 
-               value +
-               (
-                       value * 
-                       max(
-                               map(
-                                       get_unit_type( key ).abilities, 
'ability',
-                                       abilities_weights()[ability]
-                               )
-                       )
-               ) / 100
-       );
-
-def apply_weapon_specials_weights( units_map )
-       map(
-               units_map, 
-               value +
-               (
-                       value *
-                       max(
-                               map(
-                                       get_unit_type( key ).attacks, 'attack',
-                                       vars.weapon_specials[attack.special]
-                               )
-                       )
-               ) / 100
-       );
-
-# since undead units don't get random traits and are balanced with that, we 
need to lower their evaluation a bit to match fairly the living units #
-
-def undead_malus( units_map )
-       map( 
-               units_map, 
-               if(
-                       get_unit_type(key).undead,
-                       ( value * 90 ) / 100,
-                       value 
-               )
-       );
-
-# === 3 ===  pit 1 and 2 together  #
-
-def evaluate_attackers(ai*)
-       change_numbers_to_percents(
-               apply_abilities_weights(
-                       apply_weapon_specials_weights(
-                               undead_malus( 
-                                       make_positive_only(
-                                               
evaluate_my_recruits_as_attackers( ai ) 
-                                       )
-                               )
-                       )
-               )
-       );
-
-def evaluate_defenders(ai*)
-       map(
-               map(
-                       change_numbers_to_percents(
-                               apply_abilities_weights(
-                                       apply_weapon_specials_weights(
-                                               undead_malus( 
-                                                       make_positive_only(
-                                                               
evaluate_my_recruits_as_defenders( ai ) 
-                                                       )
-                                               )
-                                       )
-                               )
-                       ),
-                       (
-                               value * 2
-                       ) / 3
-               ), 
-               value +
-               map(
-                       change_numbers_to_percents(
-                               units_hp_map(
-                                       ai,
-                                       my_recruits
-                               )
-                       ),
-               value / 3
-               )[key]
-       );
-
-       #=========== we have evaluation of game state and units, time to 
combine them: ==========#
-               #=========      recruitment_list_builder        =========#
-
-def rlb_apply_eval(eval, attackers_map, defenders_map, offset)
-       map(
-               sumarize_maps_values(
-                       map(
-                               attackers_map, 
-                               value * (eval+offset)
-                       ),
-                       map(
-                               defenders_map,
-                               value * ( (100 - eval) - offset )
-                       )
-               ),
-               value / 100
-       );
-
-def rlb_remove_lowest( input_map, percent)
-       filter(
-               input_map, 
-               value > 
-               (
-                       (
-                               percent * sumarize_values(input_map)
-                       ) / 100
-               )
-       );
-
-def rlb_first_step(eval, attackers_map, defenders_map, offset)
-       rlb_remove_lowest(
-               rlb_apply_eval(
-                       eval,
-                       attackers_map,
-                       defenders_map,
-                       offset
-               ),
-               10
-       );
-
-def recruitment_list_builder(eval, attackers_map, defenders_map)
-       map(
-               rlb_first_step(
-                       eval,
-                       attackers_map,
-                       defenders_map,
-                       40
-               ),
-               (
-                       (
-                               value * 100
-                       ) / 
-                       sumarize_values(
-                               rlb_first_step(
-                                       eval,
-                                       attackers_map,
-                                       defenders_map,
-                                       40
-                               )
-                       )
-               )
-       );
-
-               # ========== choose the unit to recruit now ========= #
-
-def unit_chooser(ai*,unit_map) 
-       choose(
-               keys(unit_map), 'unit_type',
-               unit_map[unit_type] - 
-               (
-                       (
-                               100 * 
-                               size(
-                                       filter(
-                                               my_units, 
-                                               id = unit_type
-                                       )
-                               )
-                       ) / 
-                       size(my_units)
-               )
-       );
-
-def unit_map_cost_filter(ai*, unit_map)
-       filter( unit_map,
-               get_unit_type(key).cost < my_side.gold
-       );
-
-               # ==========    Main formula section    ========== #
-
-def initialize_weapon_specials_map(ai*)
-       if(vars.weapon_specials_init != turn,
-               [
-                       set_var('weapon_specials_init', turn),
-                       set_var('weapon_specials',
-                               map(
-                                       weapon_specials_weights(),
-                                       if( key = 'magical',
-                                               units_average_defense(ai, 
enemy_units, 10),
-                                               if( key = 'marksman',
-                                                       
units_average_defense(ai, enemy_units, 10) - 10,
-                                                       value
-                                               )
-                                       )
-                               )
-                       )
-               ],
-               []
-       );
-
-def create_recruits_map(ai*)
-       if(vars.recruits_map_creator != turn,
-               [
-                       set_var('recruits_map_creator', turn ),
-                       set_var('recruits_map',
-                               recruitment_list_builder(
-                                       eval(ai),
-                                       evaluate_attackers(ai),
-                                       evaluate_defenders(ai)
-                               )
-                       )
-               ],
-               []
-       );
-
-if(vars.turn_initialized = turn,
-       if(my_leader.loc = loc(11,23),
-               if( 
-                       get_unit_type(
-                               choose(
-                                       vars.recruits_map,
-                                       -get_unit_type(key).cost
-                               ).key
-                       ).cost <
-                       my_side.gold,
-                       recruit(
-                               unit_chooser(
-                                       self,
-                                       unit_map_cost_filter(
-                                               self,
-                                               vars.recruits_map
-                                       )
-                               )
-                       ),
-                       fallback('') 
-               ),
-               if(vars.check = turn, 
-                       [set_var('check', 0), fallback('')], 
-                       [set_var('check', turn), move(my_leader.loc, 
nearest_keep(my_leader.loc))])
-       ),
-       [set_var('turn_initialized', turn)] +
-       initialize_weapon_specials_map(self) +
-       create_recruits_map(self)
-)

Modified: trunk/data/scenario-formula-recruitment.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/scenario-formula-recruitment.cfg?rev=28301&r1=28300&r2=28301&view=diff
==============================================================================
--- trunk/data/scenario-formula-recruitment.cfg (original)
+++ trunk/data/scenario-formula-recruitment.cfg Sat Aug  2 12:58:53 2008
@@ -60,7 +60,7 @@
                ai_algorithm=formula_ai
                [ai]
                [team_formula]
-                       rulebase="{recruitment.fai}"
+                       rulebase="{ai/formula/recruitment.fai}"
                [/team_formula]
                [/ai]
        [/side]


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to