wesnoth/data/core/macros/utils.cfg
2008-04-09 13:16:44 +00:00

481 lines
12 KiB
INI

#textdomain wesnoth
# This file contains general utility macros for WML authors.
#
# Later macros in this file are built using earlier ones, which
# is why they live hear rather than being broken out into topic-specific files.
# ! in comments is used in generating HTML documentation, ignore it otherwise.
#define QUANTITY NAME EASY_VALUE NORMAL_VALUE HARD_VALUE
# Macro to define a 'quantity' differently based on difficulty levels.
#ifdef EASY
{NAME}={EASY_VALUE}
#endif
#ifdef NORMAL
{NAME}={NORMAL_VALUE}
#endif
#ifdef HARD
{NAME}={HARD_VALUE}
#endif
#enddef
#define TURNS EASY_AMOUNT NORMAL_AMOUNT HARD_AMOUNT
# Macro to define number of turns for different difficulty levels.
{QUANTITY turns {EASY_AMOUNT} {NORMAL_AMOUNT} {HARD_AMOUNT}}
#enddef
#define GOLD EASY_AMOUNT NORMAL_AMOUNT HARD_AMOUNT
# Macro which will let you say {GOLD x y z} to set
# starting gold depending on easy/medium/hard - x/y/z
{QUANTITY gold {EASY_AMOUNT} {NORMAL_AMOUNT} {HARD_AMOUNT}}
#enddef
#define INCOME EASY_AMOUNT NORMAL_AMOUNT HARD_AMOUNT
# Macro which will let you say {GOLD x y z} to set
# per-turn income depending on easy/medium/hard - x/y/z
{QUANTITY income {EASY_AMOUNT} {NORMAL_AMOUNT} {HARD_AMOUNT}}
#enddef
#define ATTACK_DEPTH EASY_VALUE NORMAL_VALUE HARD_VALUE
# Macro to define AI attack depth for different difficulty levels
# (set it to 1-6)
{QUANTITY attack_depth {EASY_VALUE} {NORMAL_VALUE} {HARD_VALUE}}
#enddef
#define NO_SCOUTS
# Macro to make an AI team not recruit scouts.
villages_per_scout=0
#enddef
#define RANDOM THING
# Macro to quickly pick a random value (in the $random variable, to avoid
# cluttering up savegames with such temporary variables).
[set_variable]
name=random
rand={THING}
[/set_variable]
#enddef
#define VARIABLE VAR VALUE
# Macro to initialize a variable. Strictly a syntatic shortcut.
[set_variable]
name={VAR}
value={VALUE}
[/set_variable]
#enddef
#define VARIABLE_OP VAR OP_NAME VALUE
# Macro to do mathematical operations on variables.
[set_variable]
name={VAR}
{OP_NAME}={VALUE}
[/set_variable]
#enddef
#define CLEAR_VARIABLE VAR
# Macro to clear a variable previously set.
[clear_variable]
name={VAR}
[/clear_variable]
#enddef
# wmlindent: start ignoring
#define FOREACH ARRAY VAR
# Macro to begin a WML clause that iterates over an array.
{VARIABLE {VAR} 0}
[while]
[variable]
name={VAR}
less_than=${ARRAY}.length
[/variable]
[do]
#enddef
#define NEXT VAR
# Macro to end a WML clause that iterates over an array.
[set_variable]
name={VAR}
add=1
[/set_variable]
[/do]
[/while]
{CLEAR_VARIABLE {VAR}}
#enddef
# wmlindent: stop ignoring
#define REPEAT NUMBER BODY_WML
{VARIABLE REPEAT_i 0}
[while]
[variable]
name=REPEAT_i
less_than={NUMBER}
[/variable]
[do]
{BODY_WML}
{VARIABLE_OP REPEAT_i add 1}
[/do]
[/while]
{CLEAR_VARIABLE REPEAT_i}
#enddef
#define DEBUG_MSG MESSAGE
# Emit a debug message. Meant to be overridden with no-op definition
# of the same name for production use.
[message]
speaker=narrator
message={MESSAGE}
image=wesnoth-icon.png
[/message]
#enddef
#define MODIFY_UNIT FILTER VAR VALUE
# Alters a unit variable (such as unit.x, unit.type,
# unit.side), handling all the storing and unstoring.
#
# Example that flips all spearmen to side 2:
#! {MODIFY_UNIT type=Spearman side 2}
[store_unit]
[filter]
{FILTER}
[/filter]
variable=MODIFY_UNIT_store
kill=yes
[/store_unit]
{FOREACH MODIFY_UNIT_store MODIFY_UNIT_i}
[set_variable]
name=MODIFY_UNIT_store[$MODIFY_UNIT_i].{VAR}
value={VALUE}
[/set_variable]
[unstore_unit]
variable=MODIFY_UNIT_store[$MODIFY_UNIT_i]
find_vacant=no
[/unstore_unit]
{NEXT MODIFY_UNIT_i}
{CLEAR_VARIABLE MODIFY_UNIT_store}
#enddef
#define MOVE_UNIT FILTER TO_X TO_Y
# Moves a unit from its current location to the given location along a
# relatively straight line displaying the movement just like
# [move_unit_fake] does.
#
# Note that setting the destination on an existing unit does not kill either
# one, but causes the unit to move to the nearest vacant hex instead.
[store_unit]
[filter]
{FILTER}
[/filter]
variable=MOVE_UNIT_temp
kill=no
[/store_unit]
[scroll_to]
x=$MOVE_UNIT_temp.x
y=$MOVE_UNIT_temp.y
[/scroll_to]
{VARIABLE_OP MOVE_UNIT_path_coords_x format ("$MOVE_UNIT_temp.x|,{TO_X}")}
{VARIABLE_OP MOVE_UNIT_path_coords_y format ("$MOVE_UNIT_temp.y|,{TO_Y}")}
[if]
[variable]
name=MOVE_UNIT_temp.x
less_than={TO_X}
[/variable]
[then]
{VARIABLE MOVE_UNIT_temp.facing se}
[/then]
[else]
[if]
[variable]
name=MOVE_UNIT_temp.x
greater_than={TO_X}
[/variable]
[then]
{VARIABLE MOVE_UNIT_temp.facing sw}
[/then]
[/if]
[/else]
[/if]
{VARIABLE MOVE_UNIT_temp.x {TO_X}}
{VARIABLE MOVE_UNIT_temp.y {TO_Y}}
[kill]
{FILTER}
animate=no
fire_event=no
[/kill]
[move_unit_fake]
type=$MOVE_UNIT_temp.type
gender=$MOVE_UNIT_temp.gender
variation=$MOVE_UNIT_temp.variation
side=$MOVE_UNIT_temp.side
x=$MOVE_UNIT_path_coords_x
y=$MOVE_UNIT_path_coords_y
[/move_unit_fake]
[unstore_unit]
variable=MOVE_UNIT_temp
find_vacant=yes
[/unstore_unit]
[redraw][/redraw]
{CLEAR_VARIABLE MOVE_UNIT_temp}
{CLEAR_VARIABLE MOVE_UNIT_path_coords_x}
{CLEAR_VARIABLE MOVE_UNIT_path_coords_y}
#enddef
#define NO_SCROLL_TO_AI_LEADER SIDE
# Prevents the view from scrolling to the leader of a specific AI
# side at the beginning of its turn. Useful if that side doesn't
# really do anything and the scrolling distance would be long
# enough to be annoying every turn (for example on a big
# map). Does not work on human-controlled sides.
#
# Warning: in networked MP this will cause the game to think the
# leader of this side has been defeated when changing turns and
# thus might lead to victory/defeat being declared prematurely.
[event]
name=side turn
first_time_only=no
[if]
[variable]
name=side_number
numerical_equals={SIDE}
[/variable]
[then]
[store_unit]
[filter]
side={SIDE}
canrecruit=yes
[/filter]
kill=no
variable=stored_side_{SIDE}_leader
[/store_unit]
{MODIFY_UNIT (
side={SIDE}
canrecruit=yes
) canrecruit no}
[/then]
[/if]
[/event]
[event]
name=ai turn
first_time_only=no
[if]
[variable]
name=side_number
numerical_equals={SIDE}
[/variable]
[then]
[unstore_unit]
variable=stored_side_{SIDE}_leader
find_vacant=no
[/unstore_unit]
{CLEAR_VARIABLE stored_side_{SIDE}_leader}
[/then]
[/if]
[/event]
#enddef
#define FULL_HEAL FILTER
# This heals the specified unit(s) to full health. Does not work on units on
# a recall list.
[store_unit]
[filter]
{FILTER}
[/filter]
kill=no
variable=FULL_HEAL_temp
[/store_unit]
{FOREACH FULL_HEAL_temp FULL_HEAL_i}
[object]
silent=yes
[filter]
x,y=$FULL_HEAL_temp[$FULL_HEAL_i].x,$FULL_HEAL_temp[$FULL_HEAL_i].y
[/filter]
[effect]
apply_to=hitpoints
heal_full=yes
[/effect]
[/object]
{NEXT FULL_HEAL_i}
{CLEAR_VARIABLE FULL_HEAL_temp}
{CLEAR_VARIABLE FULL_HEAL_i}
#enddef
#define PUT_TO_RECALL_LIST FILTER
# This places a given unit back to the recall list of the side it is on.
# Note however, that the unit is not healed to full health, so when
# recalled (even if not until the next scenario) the unit may have less
# than his maximum hp left.
#
# An example that returns all units stepping on (20,38) back to the recall
# list:
#
#! [event]
#! name=moveto
#!
#! [filter]
#! x,y=20,38
#! [/filter]
#!
#! {PUT_TO_RECALL_LIST x,y=20,38}
#! [/event]
[store_unit]
[filter]
{FILTER}
[/filter]
variable=PUT_TO_RECALL_LIST_temp
kill=yes
[/store_unit]
{FOREACH PUT_TO_RECALL_LIST_temp i}
{VARIABLE PUT_TO_RECALL_LIST_temp[$i].x "recall"}
{VARIABLE PUT_TO_RECALL_LIST_temp[$i].y "recall"}
[unstore_unit]
variable=PUT_TO_RECALL_LIST_temp[$i]
find_vacant=no
[/unstore_unit]
{NEXT i}
#enddef
#define STARTING_VILLAGES SIDE RADIUS
# Macro to make a side start a scenario with villages
[event]
name=prestart
[store_starting_location]
side={SIDE}
variable=temp_starting_location
[/store_starting_location]
[store_locations]
terrain=*^V*
[and]
x,y=$temp_starting_location.x,$temp_starting_location.y
radius={RADIUS}
[/and]
variable=temp_starting_villages
[/store_locations]
{FOREACH temp_starting_villages i}
[capture_village]
side={SIDE}
x,y=$temp_starting_villages[$i].x,$temp_starting_villages[$i].y
[/capture_village]
{NEXT i}
{CLEAR_VARIABLE temp_starting_villages}
[/event]
#enddef
#define STARTING_VILLAGES_AREA SIDE X Y RADIUS
# Make a side start with ownership of villages in a given area.
[event]
name=prestart
[store_locations]
terrain=*^V*
[and]
x,y={X},{Y}
radius={RADIUS}
[/and]
variable=temp_starting_villages_area
[/store_locations]
{FOREACH temp_starting_villages_area i}
[capture_village]
side={SIDE}
x,y=$temp_starting_villages_area[$i].x,$temp_starting_villages_area[$i].y
[/capture_village]
{NEXT i}
{CLEAR_VARIABLE temp_starting_villages_area}
[/event]
#enddef
#define TRANSFER_VILLAGE_OWNERSHIP FROM_SIDE TO_SIDE
# Transfers ownership of all villages of one side to another side. Useful
# when you're for example moving all units of some side to another, and want
# to transfer the village ownership as well.
[store_villages]
owner_side={FROM_SIDE}
variable=TRANSFER_VILLAGE_OWNERSHIP_villages
[/store_villages]
{FOREACH TRANSFER_VILLAGE_OWNERSHIP_villages TRANSFER_VILLAGE_OWNERSHIP_i}
[capture_village]
x,y=$TRANSFER_VILLAGE_OWNERSHIP_villages[$TRANSFER_VILLAGE_OWNERSHIP_i].x,$TRANSFER_VILLAGE_OWNERSHIP_villages[$TRANSFER_VILLAGE_OWNERSHIP_i].y
side={TO_SIDE}
[/capture_village]
{NEXT TRANSFER_VILLAGE_OWNERSHIP_i}
{CLEAR_VARIABLE TRANSFER_VILLAGE_OWNERSHIP_villages}
{CLEAR_VARIABLE TRANSFER_VILLAGE_OWNERSHIP_i}
#enddef
# FIXME: Documentation for these is needed.
#define MENU_IMG_TXT IMG TXT
"&"+{IMG}+"="+{TXT}#enddef
#define MENU_IMG_TXT2 IMG TXT1 TXT2
"&"+{IMG}+"="+{TXT1}+"="+{TXT2}#enddef
#define TIME_ACTIONS CONTENT_WML
# Measure (in milliseconds) the time arbitrary event WML takes to
# execute. Afterwards, the time the enclosed WML took to execute
# is found in the variable $timed_actions_ms.
#
# Example:
#! [event]
#! name=start
#!
#! {TIME_ACTIONS (
#! {MODIFY_UNIT race=orc user_description ( _ "Azir")}
#! )}
#!
#! {DEBUG_MSG "Renaming all orcs to Azir took $timed_actions_ms|ms."}
#! [/event]
{VARIABLE_OP TIME_ACTIONS_time_begin time stamp}
{CONTENT_WML}
{VARIABLE_OP TIME_ACTIONS_time_end time stamp}
{VARIABLE timed_actions_ms $TIME_ACTIONS_time_end}
{VARIABLE_OP timed_actions_ms add "-$TIME_ACTIONS_time_begin"}
{CLEAR_VARIABLE TIME_ACTIONS_time_begin}
{CLEAR_VARIABLE TIME_ACTIONS_time_end}
#enddef