#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 (id=always value=0.5)}
    # example: {MODIFY_AI_ADD_ASPECT 1 leader_goal (id=always [value]x=1 y=2[/value])}

    [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 special_poisoning_formula}
    # example: {MODIFY_AI_DELETE_CANDIDATE_ACTION 1 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 special_poisoning_formula}
    # example: {MODIFY_AI_TRY_DELETE_CANDIDATE_ACTION 1 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
    version=10710
#enddef

#define AI_SCALE_ATTACK_DEPTH_BY_DIFFICULTY
    # change attack depth depending on difficulty
#ifdef EASY
    {AI_SIMPLE_ALWAYS_ASPECT attack_depth 3}
#endif

#ifdef MEDIUM
    {AI_SIMPLE_ALWAYS_ASPECT attack_depth 4}
#endif

#ifdef HARD
    {AI_SIMPLE_ALWAYS_ASPECT attack_depth 5}
#endif

#enddef

############################################################
# NO RECRUITMENT
############################################################

#define AI_NO_RECRUITMENT
    # disable recruitment
    [facet]
        id="always"
        [value]
            engine=cpp
            name=empty
        [/value]
    [/facet]
#enddef

############################################################
# NEW FORMULA_AI RECRUITMENT BY Dragonking (experimental!)
############################################################

#define AI_FORMULA_AI_EXPERIMENTAL_RECRUITMENT
    [facet]
        id="always"
        [value]
            engine=fai
            name=side_formulas
            move="{ai/formula/new_recruitment.fai}"
        [/value]
    [/facet]
#enddef

#define AI_SIMPLE_FORMULA_AI_EXPERIMENTAL_RECRUITMENT
    #enable new formula-ai recruitment made by Dragonking (experimental!)
    {AI_ASPECT recruitment {AI_FORMULA_AI_EXPERIMENTAL_RECRUITMENT} }
#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

#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

############################################################
# AI CONTROLLER SUPPORT
############################################################

#define AI_CONTROLLER_ALLOW_LEADER_CONTROL CONTROLLER_SIDE CONTROLLED_SIDE

    [store_unit]
        [filter]
            side={CONTROLLED_SIDE}
            canrecruit=yes
        [/filter]

        kill=no
        variable=ally_leader
    [/store_unit]

    [if]
        [variable]
            name=ally_leader.length
            greater_than=0
        [/variable]
        [then]
            [set_menu_item]
                id=ai_controller_leader_control_{CONTROLLED_SIDE}
                description= _ "Ask $ally_leader.name (leader of side $ally_leader.side) to move here"
                [show_if]
                    side={CONTROLLER_SIDE}
                    #TODO: show only if ally leader is alive
                [/show_if]
                [command]
                    {CLEAR_AI_ALWAYS_ASPECT_LEADER_GOAL {CONTROLLED_SIDE} }
                    {MODIFY_AI_ADD_ASPECT {CONTROLLED_SIDE} leader_goal {AI_ASPECT_LEADER_GOAL_MOVE_TO $x1 $y1} }
                [/command]
            [/set_menu_item]
        [/then]
    [/if]

    [event]
        name=victory #TODO: any scenario change
        [set_menu_item]
            id=ai_controller_leader_control_{CONTROLLED_SIDE}
            [show_if]
                [not]
                [/not]
            [/show_if]
        [/set_menu_item]
    [/event]

    {CLEAR_VARIABLE ally_leader}

#enddef
