#textdomain wesnoth ############################################################ # MODIFY_AI - ADD ############################################################ #define MODIFY_AI_ADD_ASPECT SIDE ASPECT_ID FACET_WML # modify ai, add facet to an aspect # # example: {MODIFY_AI_ADD_ASPECT 1 aggression ([facet] id=always value=0.5 [/facet])} # example: {MODIFY_AI_ADD_ASPECT 1 leader_goal ([facet] id=always [value]x=1 y=2[/value] [/facet])} [modify_ai] side={SIDE} action=add path=aspect[{ASPECT_ID}].facet[] {FACET_WML} [/modify_ai] #enddef #define MODIFY_AI_ADD_STAGE SIDE STAGE_WML # modify ai, add stage [modify_ai] side={SIDE} action=add path=stage[] {STAGE_WML} [/modify_ai] #enddef #define MODIFY_AI_ADD_GOAL SIDE GOAL_WML # modify ai, add goal [modify_ai] side={SIDE} action=add path=goal[] {GOAL_WML} [/modify_ai] #enddef #define MODIFY_AI_ADD_CANDIDATE_ACTION SIDE STAGE_ID CANDIDATE_ACTION_WML # modify ai, add candidate action to a stage [modify_ai] side={SIDE} action=add path=stage[{STAGE_ID}].candidate_action[] {CANDIDATE_ACTION_WML} [/modify_ai] #enddef ############################################################ # MODIFY_AI - DELETE ############################################################ #define MODIFY_AI_DELETE_ASPECT SIDE ASPECT_ID FACET_ID # modify ai, delete facet from aspect # # example: {MODIFY_AI_DELETE_ASPECT 1 aggression night} [modify_ai] side={SIDE} action=delete path=aspect[{ASPECT_ID}].facet[{FACET_ID}] [/modify_ai] #enddef #define MODIFY_AI_DELETE_STAGE SIDE STAGE_ID # modify ai, delete a stage # # example: {MODIFY_AI_DELETE_STAGE 1 fallback} # example: {MODIFY_AI_DELETE_STAGE 1 3} [modify_ai] side={SIDE} action=delete path=stage[{STAGE_ID}] [/modify_ai] #enddef #define MODIFY_AI_DELETE_GOAL SIDE GOAL_ID # modify ai, delete a goal # # example: {MODIFY_AI_DELETE_GOAL 1 kill_undead} # example: {MODIFY_AI_DELETE_GOAL 1 0} [modify_ai] side={SIDE} action=delete path=goal[{GOAL_ID}] [/modify_ai] #enddef #define MODIFY_AI_DELETE_CANDIDATE_ACTION SIDE STAGE_ID CANDIDATE_ACTION_ID # modify ai, delete candidate action from a stage # # example: {MODIFY_AI_DELETE_CANDIDATE_ACTION 1 main_loop special_poisoning_formula} # example: {MODIFY_AI_DELETE_CANDIDATE_ACTION 1 main_loop 0} [modify_ai] side={SIDE} action=delete path=stage[{STAGE_ID}].candidate_action[{CANDIDATE_ACTION_ID}] [/modify_ai] #enddef ############################################################ # MODIFY_AI - TRY_DELETE ############################################################ #define MODIFY_AI_TRY_DELETE_ASPECT SIDE ASPECT_ID FACET_ID # modify ai, delete facet from aspect # # example: {MODIFY_AI_TRY_DELETE_ASPECT 1 aggression night} [modify_ai] side={SIDE} action=try_delete path=aspect[{ASPECT_ID}].facet[{FACET_ID}] [/modify_ai] #enddef #define MODIFY_AI_TRY_DELETE_STAGE SIDE STAGE_ID # modify ai, delete a stage # # example: {MODIFY_AI_TRY_DELETE_STAGE 1 fallback} # example: {MODIFY_AI_TRY_DELETE_STAGE 1 3} [modify_ai] side={SIDE} action=try_delete path=stage[{STAGE_ID}] [/modify_ai] #enddef #define MODIFY_AI_TRY_DELETE_GOAL SIDE GOAL_ID # modify ai, delete a goal # # example: {MODIFY_AI_TRY_DELETE_GOAL 1 kill_undead} # example: {MODIFY_AI_TRY_DELETE_GOAL 2 *} # example: {MODIFY_AI_TRY_DELETE_GOAL 3 0} [modify_ai] side={SIDE} action=try_delete path=goal[{GOAL_ID}] [/modify_ai] #enddef #define MODIFY_AI_TRY_DELETE_CANDIDATE_ACTION SIDE STAGE_ID CANDIDATE_ACTION_ID # modify ai, delete candidate action from a stage # # example: {MODIFY_AI_TRY_DELETE_CANDIDATE_ACTION 1 main_loop special_poisoning_formula} # example: {MODIFY_AI_TRY_DELETE_CANDIDATE_ACTION 1 main_loop 0} [modify_ai] side={SIDE} action=try_delete path=stage[{STAGE_ID}].candidate_action[{CANDIDATE_ACTION_ID}] [/modify_ai] #enddef ############################################################ # ASPECTS - DECLARATION ############################################################ #define AI_ASPECT ASPECT_ID FACET_WML #macro to define a named facet of ai aspect [aspect] id={ASPECT_ID} {FACET_WML} [/aspect] #enddef ############################################################ # ASPECTS - SIMPLE - DECLARATION (NO PREAMBLE NEEDED) ############################################################ # note: simple aspects are supposed to be used without a preamble #define AI_SIMPLE_ASPECT ASPECT_ID FACET_ID VALUE # simple aspect with value=VALUE {AI_ASPECT {ASPECT_ID} ( [facet] id={FACET_ID} value={VALUE} [/facet] )} #enddef #define AI_SIMPLE_ALWAYS_ASPECT ASPECT_ID VALUE # simple aspect which is always active {AI_SIMPLE_ASPECT {ASPECT_ID} "always" {VALUE}} #enddef #define AI_SIMPLE_ASPECT_FOR_TIME_OF_DAY ASPECT_ID FACET_ID TIMEOFDAY_VALUE VALUE # simple aspect which is active during a specified time of day {AI_ASPECT {ASPECT_ID} ( [facet] id={FACET_ID} value={VALUE} time_of_day={TIMEOFDAY_VALUE} [/facet] )} #enddef #define AI_SIMPLE_NIGHT_ASPECT ASPECT_ID VALUE # simple aspect which is active during the night {AI_SIMPLE_ASPECT_FOR_TIME_OF_DAY {ASPECT_ID} "night" "dusk,first_watch,second_watch" {VALUE} } #enddef #define AI_SIMPLE_DAY_ASPECT ASPECT_ID VALUE # simple aspect which is active during the day {AI_SIMPLE_ASPECT_FOR_TIME_OF_DAY {ASPECT_ID} "day" "dawn,morning,afternoon" {VALUE} } #enddef #define AI_SIMPLE_ASPECT_VALUE ASPECT_ID FACET_ID VALUE # simple aspect {AI_ASPECT {ASPECT_ID} ( [facet] id={FACET_ID} [value] {VALUE} [/value] [/facet] )} #enddef #define AI_SIMPLE_ALWAYS_ASPECT_VALUE ASPECT_ID VALUE # simple aspect which is always active {AI_SIMPLE_ASPECT_VALUE {ASPECT_ID} "always" {VALUE}} #enddef #define AI_SIMPLE_ASPECT_FOR_TIME_OF_DAY_VALUE ASPECT_ID FACET_ID TIMEOFDAY_VALUE VALUE # simple aspect which is active during a specified time of day {AI_ASPECT {ASPECT_ID} ( [facet] id={FACET_ID} [value] {VALUE} [/value] time_of_day={TIMEOFDAY_VALUE} [/facet] )} #enddef #define AI_SIMPLE_NIGHT_ASPECT_VALUE ASPECT_ID VALUE # simple aspect which is active during the night {AI_SIMPLE_ASPECT_FOR_TIME_OF_DAY_VALUE {ASPECT_ID} "night" "dusk,first_watch,second_watch" {VALUE} } #enddef #define AI_SIMPLE_DAY_ASPECT_VALUE ASPECT_ID VALUE # simple aspect which is active during the day {AI_SIMPLE_ASPECT_FOR_TIME_OF_DAY_VALUE {ASPECT_ID} "day" "dawn,morning,afternoon" {VALUE} } #enddef ############################################################ # ASPECTS - SIMPLE - ADD (NO PREAMBLE NEEDED) ############################################################ #define MODIFY_AI_ADD_SIMPLE_ASPECT SIDE ASPECT_ID FACET_ID VALUE # modify ai, add simple facet to an aspect {MODIFY_AI_ADD_ASPECT {SIDE} {ASPECT_ID} ( [facet] id={FACET_ID} value={VALUE} [/facet] )} #enddef #define MODIFY_AI_ADD_SIMPLE_ALWAYS_ASPECT SIDE ASPECT_ID VALUE # modify ai, add simple aspect which is always active {MODIFY_AI_ADD_SIMPLE_ASPECT {SIDE} {ASPECT_ID} "always" {VALUE}} #enddef #define MODIFY_AI_ADD_SIMPLE_ASPECT_FOR_TIME_OF_DAY SIDE ASPECT_ID FACET_ID TIMEOFDAY_VALUE VALUE # modify ai, add simple aspect which is active during a specified time of day {MODIFY_AI_ADD_ASPECT {SIDE} {ASPECT_ID} ( [facet] id={FACET_ID} value={VALUE} time_of_day={TIMEOFDAY_VALUE} [/facet] )} #enddef #define MODIFY_AI_ADD_SIMPLE_NIGHT_ASPECT SIDE ASPECT_ID VALUE # modify ai, add simple aspect which is active during the night {MODIFY_AI_ADD_SIMPLE_ASPECT_FOR_TIME_OF_DAY {SIDE} {ASPECT_ID} "night" "dusk,first_watch,second_watch" {VALUE} } #enddef #define MODIFY_AI_ADD_SIMPLE_DAY_ASPECT SIDE ASPECT_ID VALUE # modify ai, add simple aspect which is active during the day {MODIFY_AI_ADD_SIMPLE_ASPECT_FOR_TIME_OF_DAY {SIDE} {ASPECT_ID} "day" "dawn,morning,afternoon" {VALUE} } #enddef #define MODIFY_AI_ADD_SIMPLE_ASPECT_VALUE SIDE ASPECT_ID FACET_ID VALUE # modify ai, add simple facet to an aspect {MODIFY_AI_ADD_ASPECT {SIDE} {ASPECT_ID} ( [facet] id={FACET_ID} [value] {VALUE} [/value] [/facet] )} #enddef #define MODIFY_AI_ADD_SIMPLE_ALWAYS_ASPECT_VALUE SIDE ASPECT_ID VALUE # modify ai, add simple aspect which is always active {MODIFY_AI_ADD_SIMPLE_ASPECT_VALUE {SIDE} {ASPECT_ID} "always" {VALUE}} #enddef #define MODIFY_AI_ADD_SIMPLE_ASPECT_FOR_TIME_OF_DAY_VALUE SIDE ASPECT_ID FACET_ID TIMEOFDAY_VALUE VALUE # modify ai, add simple aspect which is active during a specified time of day {MODIFY_AI_ADD_ASPECT {SIDE} {ASPECT_ID} ( [facet] id={FACET_ID} [value] {VALUE} [/value] time_of_day={TIMEOFDAY_VALUE} [/facet] )} #enddef #define MODIFY_AI_ADD_SIMPLE_NIGHT_ASPECT_VALUE SIDE ASPECT_ID VALUE # modify ai, add simple aspect which is active during the night {MODIFY_AI_ADD_SIMPLE_ASPECT_FOR_TIME_OF_DAY_VALUE {SIDE} {ASPECT_ID} "night" "dusk,first_watch,second_watch" {VALUE} } #enddef #define MODIFY_AI_ADD_SIMPLE_DAY_ASPECT_VALUE SIDE ASPECT_ID VALUE # modify ai, add simple aspect which is active during the day {MODIFY_AI_ADD_SIMPLE_ASPECT_FOR_TIME_OF_DAY_VALUE {SIDE} {ASPECT_ID} "day" "dawn,morning,afternoon" {VALUE} } #enddef #define AI_NO_SCOUTS # make the AI team not recruit scouts. {AI_SIMPLE_ALWAYS_ASPECT villages_per_scout 0} #enddef #define AI_NEW_SYNTAX # use stable 1.8 ai syntax # Deprecated; no longer does anything #enddef #define AI_SCALE_ATTACK_DEPTH_BY_DIFFICULTY #deprecated 3 1.17 The attack_depth aspect has no effect on the AI any more. #enddef ############################################################ # RECRUITMENT ASPECTS ############################################################ #define AI_DEACTIVATE_SAVE_GOLD # disable aspect recruitment_save_gold [facet] id="always" [value] active=0 [/value] [/facet] #enddef #define AI_NO_RECRUITMENT # disable recruitment [facet] id="always" [value] [recruit] importance=1 number=0 [/recruit] [/value] [/facet] #enddef #define AI_SAVE_GOLD ACTIVE BEGIN END # Enable AI recruitment gold saving. # ACTIVE: turn from which on gold saving will be active # BEGIN: begin gold saving when unit cost ratio rises above this value # END: end gold saving when unit cost ratio drops below this value # This goes directly into the [ai] tag. [aspect] id=recruitment_save_gold [facet] [value] active={ACTIVE} begin={BEGIN} end={END} [/value] [/facet] [/aspect] #enddef #define AI_SAVE_GOLD_DEFAULT # Enable AI recruitment gold saving with values set # to what was the default in Wesnoth 1.11.7 and 1.11.8. # This goes directly into the [ai] tag. {AI_SAVE_GOLD 2 1.5 1.1} #enddef ############################################################ # NEW FORMULA_AI RECRUITMENT BY Dragonking (experimental!) ############################################################ #define AI_FORMULA_AI_EXPERIMENTAL_RECRUITMENT [stage] engine=fai name=side_formulas move="{ai/formula/new_recruitment.fai}" [/stage] #enddef ############################################################ # CANDIDATE_ACTIONS ############################################################ ############################################################ # LEADER GOALS ( aspect[leader_goal] ) ############################################################ #### # internal macro # #define _AI_ASPECT_LEADER_GOAL_MOVE_TO X Y AUTOREMOVE_VALUE [facet] id="always" [value] id="always" x={X} y={Y} auto_remove={AUTOREMOVE_VALUE} [/value] [/facet] #enddef #### # internal macro # #define _AI_ASPECT_LEADER_GOAL_RISKY_MOVE_TO X Y AUTOREMOVE_VALUE [facet] id="always" [value] id="always" x={X} y={Y} max_risk=10000 auto_remove={AUTOREMOVE_VALUE} [/value] [/facet] #enddef #define AI_ASPECT_LEADER_GOAL_MOVE_TO X Y # leader goal: move to X Y and be free {_AI_ASPECT_LEADER_GOAL_MOVE_TO {X} {Y} "yes"} #enddef #define AI_ASPECT_LEADER_GOAL_MOVE_TO_AND_STAY_THERE X Y # leader goal: move to X Y and stay there {_AI_ASPECT_LEADER_GOAL_MOVE_TO {X} {Y} "no"} #enddef #define CLEAR_AI_ALWAYS_ASPECT_LEADER_GOAL SIDE # clear AI leader goal "always" {MODIFY_AI_DELETE_ASPECT {SIDE} leader_goal always} #enddef #define AI_ASPECT_LEADER_GOAL_RISKY_MOVE_TO X Y # leader goal: move to X Y and be free {_AI_ASPECT_LEADER_GOAL_RISKY_MOVE_TO {X} {Y} "yes"} #enddef #define AI_ASPECT_LEADER_GOAL_RISKY_MOVE_TO_AND_STAY_THERE X Y # leader goal: move to X Y and stay there {_AI_ASPECT_LEADER_GOAL_RISKY_MOVE_TO {X} {Y} "no"} #enddef ############################################################ # EXPERIMENTAL AI ############################################################ #define EXPERIMENTAL_AI #deprecated 2 1.15 Use ai_algorithm=experimental_ai in the [ai] tag instead # Note: The Experimental AI and the default AI are currently almost identical. # This is a placeholder for future development. # Put this into the [side][ai] tag. # Does not work in [modify_side][ai] or [modify_ai] at the moment. [stage] id=main_loop name=ai_default_rca::candidate_action_evaluation_loop {AI_CA_GOTO} {AI_CA_RECRUIT_RUSHERS} {AI_CA_CASTLE_SWITCH} {AI_CA_RETREAT_INJURED} {AI_CA_GRAB_VILLAGES} {AI_CA_SPREAD_POISON} #{AI_CA_RECRUITMENT} {AI_CA_MOVE_LEADER_TO_GOALS} {AI_CA_MOVE_LEADER_TO_KEEP} {AI_CA_HIGH_XP_ATTACK} {AI_CA_COMBAT} {AI_CA_PLACE_HEALERS} {AI_CA_HEALING} #{AI_CA_VILLAGES} {AI_CA_MOVE_TO_TARGETS} {AI_CA_LEADER_SHARES_KEEP} {AI_CA_MOVE_TO_ANY_ENEMY} [/stage] #enddef #define CUSTOMIZABLE_EXPERIMENTAL_AI ARGS # Note: The Experimental AI and the default AI are currently almost identical. # However, this macro allows the use of custom parameters. # Use the Experimental AI with custom parameter setting # Put this into the [side][ai] tag. # Does not work in [modify_side][ai] or [modify_ai] at the moment. [stage] id=main_loop name=ai_default_rca::candidate_action_evaluation_loop {AI_CA_GOTO} [candidate_action] engine=lua id=recruit_rushers name=recruit_rushers max_score=196000 location="ai/lua/ca_recruit_rushers.lua" [args] {ARGS} [/args] [/candidate_action] {AI_CA_CASTLE_SWITCH} {AI_CA_RETREAT_INJURED} {AI_CA_GRAB_VILLAGES} {AI_CA_SPREAD_POISON} #{AI_CA_RECRUITMENT} {AI_CA_MOVE_LEADER_TO_GOALS} {AI_CA_MOVE_LEADER_TO_KEEP} {AI_CA_HIGH_XP_ATTACK} {AI_CA_COMBAT} {AI_CA_PLACE_HEALERS} {AI_CA_HEALING} #{AI_CA_VILLAGES} {AI_CA_MOVE_TO_TARGETS} {AI_CA_LEADER_SHARES_KEEP} {AI_CA_MOVE_TO_ANY_ENEMY} [/stage] #enddef