Difference between revisions of "FilterWML"

From The Battle for Wesnoth Wiki
m
(Filtering Weapons)
(59 intermediate revisions by 25 users not shown)
Line 3: Line 3:
  
 
A ''filter'' is a special WML block.
 
A ''filter'' is a special WML block.
Filters are used to describe a set of units, hexes, or weapons.
+
Filters are used to describe a set of units, hexes, weapons or something else.
 
Filters are defined as matching something if all the keys in the filter match that thing.
 
Filters are defined as matching something if all the keys in the filter match that thing.
 
For example, if a unit filter contains two keys,
 
For example, if a unit filter contains two keys,
 
a unit must match both of the keys in order to match the filter.
 
a unit must match both of the keys in order to match the filter.
 +
 +
A StandardUnit(Location, Side, ...)Filter is the place where the set of such keys and tags can appear. A StandardFilter sometimes needs an according surrounding tag but often doesn't. It should be mentioned at the place in the wiki where it's said that you can use at a certain code position a StandardFilter whether you need a surrounding tag or not.
  
 
== Filtering Units ==
 
== Filtering Units ==
Line 21: Line 23:
 
and ''secondary unit'' must match the filter contained in '''[filter_second]'''.
 
and ''secondary unit'' must match the filter contained in '''[filter_second]'''.
  
When a unit filter is applied to a map, first it applies to all units on the field,
+
See [[StandardUnitFilter]] for details.
based on their coordinates.
 
Next it applies to units in the recall list.
 
This is important to remember as it means, for example,
 
that the tag '''[kill]''' can be used to kill units in the recall list.
 
 
 
You can access the filtered unit within the filter as the ''$this_unit'' variable, see [[SingleUnitWML]] for the possible content of these variables
 
 
 
 
 
Any number of the following key/tags can be used in a standard unit filter:
 
 
 
* '''description''': unit matches the given description. This is the same as ''description'' in the [unit] tag. Note that it is independent of ''user_description'', which can be internationalized independent of this. See [[SingleUnitWML]].
 
* '''speaker''': alias for description
 
* '''type''': matches the unit's type name (can be a list of types)
 
* '''race''': the race of the unit type.<br>Races are listed in the unit files ('''data/units/''')
 
* '''ability''': unit has a given ability; see [[AbilitiesWML]]
 
* '''side''': the unit is on the given side (can be a list)
 
* '''has_weapon''': the unit has a weapon with the given name
 
* '''canrecruit''': yes if the unit can recruit (i.e. is a leader)
 
* '''gender''': female if the unit is female rather than the default of male
 
* '''role''': the unit has been assigned the given role; see '''[role]''', [[InternalActionsWML]]
 
* '''level''': the level of the unit
 
* '''defense''': current defense of the unit on current tile (chance to hit %, like in movement type definitions)
 
* '''movement_cost''': current movement cost of the unit on current tile
 
* '''x,y''': the position of the unit
 
* '''find_in''': name of an array or container variable; if present, the unit will not match unless it is also found stored in the variable
 
* '''[filter_vision]''': this tests whether or not the unit is currently visible
 
** '''visible''': yes or no, default yes
 
** '''viewing_side''': the side(s) which you are checking if they are able to see (or not see) the unit. All sides listed here must pass the test. If no side is listed, it will check the visibility all enemy sides.
 
* '''[wml_filter]''': this is WML level filter for the unit. In it, you can filter on anything that is in the WML description of a unit. This description can be found in any savegame also in [[SingleUnitWML]].
 
* '''[and]''': an extra unit filter. Unless the unit also matches the [and] filter, then it will not count as a match. ''Note: [and],[or], and [not] filters are considered after the containing filter; they are then processed in the order encountered.''
 
* '''[or]''': an extra unit filter. If a unit matches the [or] filter, then it will count as a match regardless of conditions in previous filters or the containing filter.
 
* '''[not]''': an extra unit filter. If a unit matches the [not] filter, then that unit will not be considered a match by the containing filter.
 
* '''[filter_adjacent]''': standard unit filter; if present the correct number of adjacent units must match this filter
 
** '''count''': a number, range, or comma separated range; default "1-6"
 
** '''adjacent''': a comma separated list of directions; default "n,ne,se,s,sw,nw"
 
** '''is_enemy''': a boolean specifying whether the adjacent unit must be an enemy or an ally (optional)
 
* '''[filter_location]''': (standard location filter) - the tile that the unit is standing on matches the location filter.
 
** '''time_of_day''': filter matches only on a given time of day (one of lawful, chaotic or neutral).
 
** '''terrain''': comma separated list of terrains. If you are using terrain letters ([[TerrainCodesWML]]), then yes you must use commas to separate the terrains; this is different from the the '''[store_locations]''' tag or IF_TERRAIN macro (of utils.cfg)! So instead of "gfm", write "g,f,m" here.
 
** '''x,y''': the same as in the unit filter; supports any range
 
** '''[filter]''': a standard unit filter; if present a unit must also be there
 
** '''owner_side''': the side of the owner, if this location is an owned village.
 
** '''find_in''': name of an array or container variable; if present, the location will not match unless it is also found stored in the variable
 
** '''radius''': matches if any location within the radius matches this filter
 
:If you aren't storing any locations successfully, it may be because you put the radius or filters in the wrong place for them to combine correctly.
 
  [have_location]
 
  terrain=Gg^Vh
 
  [and]
 
    x=$x1
 
    y=$y1
 
    radius=1
 
  [/and]
 
  [/have_location]
 
 
 
** '''[filter_radius]''': a standard location filter; normally the radius extends outwards from matching locations one step at a time without checking any additional information-- however, if this tag is present, the radius will be restricted so that it can only expand outwards in the directions where it passes the given location filter
 
** '''[and]''': an extra location filter. Unless a location matches the [and] filter, then it will be excluded. ''Note: [and],[or],and [not] extra location filters are considered after everything else in the containing filter (except radius, which is considered last in 1.3.8 and greater); they are then processed in the order encountered.''
 
** '''[or]''': an extra location filter. If a location matches the [or] filter, then it will count as a match regardless of conditions in previous filters or the containing filter.
 
** '''[not]''': an extra location filter. If a location matches the [not] filter, then that location will be excluded.
 
** '''[filter_adjacent_location]''': a standard location filter; if present the correct number of adjacent locations must match this filter
 
*** '''count''': a number, range, or comma separated range; default "1-6"
 
*** '''adjacent''': a comma separated list of directions; default "n,ne,se,s,sw,nw"
 
 
 
* You are limited to having one '''description''', however this can be worked around. If you have several specific units you want excepted from matching, use a separate [not] subfilter for each one. If you want to match any of several specific units, you can apply DeMorgan's law and do the test by having a [not] subfilter and then below that another [not] subfilter for each unit you want included. For example to kill ([kill] uses the standard unit filter) all units except Gwiti Ha'atel and Tanar you can do the following:
 
  [kill]
 
    [not]
 
      description=Gwiti Ha'atel
 
    [/not]
 
    [not]
 
      description=Tanar
 
    [/not]
 
  [/kill]
 
:And similarly if you wanted to kill both Gwiti Ha'atel and Tanar, but no one else you could do the following:
 
  [kill]
 
    [not]
 
      [not]
 
        description=Gwiti Ha'atel
 
      [/not]
 
      [not]
 
        description=Tanar
 
      [/not]
 
    [/not]
 
  [/kill]
 
:although this is probably easier achieved using two tags:
 
  [kill]
 
    description=Gwiti Ha'atel
 
  [/kill]
 
  [kill]
 
    description=Tanar
 
  [/kill]
 
:although you would just do it like this:
 
  [kill]
 
    description=Gwiti Ha'atel
 
    [or]
 
      description=Tanar
 
    [/or]
 
  [/kill]
 
  
 
== Filtering Locations ==
 
== Filtering Locations ==
Line 124: Line 30:
 
Several actions, such as '''[terrain]''', also use location filters.
 
Several actions, such as '''[terrain]''', also use location filters.
 
Location filters are represented on this site by the phrase "standard location filter".
 
Location filters are represented on this site by the phrase "standard location filter".
 +
A common use for location filters is to check the terrain of a space.
  
The following keys are used:
+
See [[StandardLocationFilter]] for details.
* '''x''': the first coordinate
 
* '''y''': the second coordinate
 
(all the keys and tags found in [filter_location] above are part of the standard location filter)
 
 
 
While some locations should only be one hex (like the starting position of a unit),
 
others filter over multiple hexes.
 
The following syntax is used to filter over multiple hexes:
 
 
 
Dashes('''-''') are used to have the location be a range of hexes.
 
There must be values before and after the dash;
 
everything in between these numbers (inclusively) is part of the range.
 
  
Commas(''',''') are used to separate coordinates into a list.
+
== Filtering Sides ==
The '''x''' and '''y''' lists are then paired up, with each pair representing one hex or range.
+
Sometimes, it's needed to get a list of sides which satisfy certain criteria. For this, a side filter can be used.
 +
Side filters are represented on this site by the phrase "standard side filter".
  
Note: although the ordering of locations in a list generally does not matter,
+
See [[StandardSideFilter]] for details.
the action '''[move_unit_fake]''' takes in a list of hexes,
 
and moves an image onto each of those hexes in order.
 
  
 
== Filtering Weapons ==
 
== Filtering Weapons ==
  
Sometimes weapons are filtered on in WML.  See also [[EventWML]], [[EffectWML]], [[AnimationWML]].
+
Sometimes weapons/attacks are filtered on in WML.  See also [[EventWML]], [[EffectWML]], [[AnimationWML]].
  
These keys are used as filter input for weapon filters.
+
These keys are used as filter input for attack filters.
  
 
* '''range''': a range to filter
 
* '''range''': a range to filter
 
** '''melee''': only melee weapons pass  
 
** '''melee''': only melee weapons pass  
 
** '''ranged''': only ranged weapons pass  
 
** '''ranged''': only ranged weapons pass  
* '''name''': filter on the attack's name.
+
* '''name''': filter on the attack's name. See <code>data/units/</code> to find the name of a particular unit's attack.
See '''data/units/''' or http://wesnoth.slack.it/unitlist.cgi
+
* '''type''': filter on the attack's type. Values are 'blade', 'pierce', 'impact', 'fire', 'cold', and 'arcane' or customised type. {{DevFeature1.17|23}} [damage_type] can change the type of damage inflicted, and this change can be detected in the filter except when it is applied from a [damage_type] which affects the filtered attack, in this case only the type before any modification by a any [damage_type] will be detectable.
to find the name of a particular unit's attack.
+
* '''damage''': filter on damage value. Can be a specific number or a list of ranges like 'damage=0-5,7-99'
* '''type''': filter on the attack's type.
+
* '''special_id''': {{DevFeature1.15|2}} Filter on a weapon special by id, for example, <code>magical</code> in <code>[chance_to_hit] id=magical</code>. True if the unit has the special, whether or not it's currently active.
Values are 'blade', 'pierce', 'impact', 'fire', 'cold', and 'arcane'.
+
* '''special_type''': {{DevFeature1.15|2}} Filter on a weapon special by tag name for example, <code>chance_to_hit</code> in <code>[chance_to_hit] id=magical</code>. True if the unit has the special, whether or not it's currently active. For values see [[AbilitiesWML]].
* '''special''': filter on the attack's special power.
+
* '''special_id_active''': {{DevFeature1.15|2}} Like '''special_id''', but true if the special is active at the current location. Does not work in 1.16. {{DevFeature1.17|17}} Works again.
For values see [[AbilitiesWML]].
+
* '''special_type_active''': {{DevFeature1.15|2}} Like '''special_type''', but true if the special is active at the current location.
 +
* '''special''': filter on the attack's special power, matches both id and tag name. {{DevFeature1.15|2}} Deprecated, see '''special_id''' and '''special_type''' instead.
 +
* '''special_active''': {{DevFeature1.13|8}} Like '''special''', but true if the special is active at the current location. {{DevFeature1.15|2}} Deprecated, see '''special_id''' and '''special_type''' instead.
 +
* '''number''': {{DevFeature1.13|5}} filter on number of strikes
 +
* '''parry''': {{DevFeature1.13|5}} filter on parry value
 +
* '''accuracy''': {{DevFeature1.13|5}} filter on accuracy value
 +
* '''movement_used''': {{DevFeature1.13|5}} filter on attack's movement cost
 +
* '''attacks_used''': {{DevFeature1.17|13}} filter on attack's attack cost
 +
* '''formula''': {{DevFeature1.13|5}} filter using [[Wesnoth Formula Language]]. The context object for the formula is a '''weapon object''', which supports the following keys: '''name''', '''description''', '''type''', '''icon''', '''range''', '''damage''', '''number''', '''attack_weight''', '''defense_weight''', '''accuracy''', '''parry''', '''movement_used''', '''specials'''. The '''specials''' key is a list of all the special IDs the unit possesses. Do not surround the formula in <code>$(...)</code>, since that will erase the <tt>self</tt> variable. {{DevFeature1.17|13}} The '''attacks_used''' key is also supported.
 +
 
 +
'''[and]''', '''[or]''', and '''[not]''' subfilters are also supported.
 +
 
 +
== Filtering Vision ==
 +
 
 +
The '''[filter_vision]''' tag allows you to filter units or locations based on whether or not the hex is obscured by fog or shroud from the point-of-view of a viewing side, and (in the case of units) whether or not the unit is hidden (via the {{tag|AbilitiesWML|hides}} ability).
 +
 
 +
* '''visible''':
 +
** '''yes''' (default): matches when the location is not obscured by fog or shroud for the ''side'' and, when in a SUF, the unit is not hiding.
 +
** '''no''': matches when the location is obscured by fog or shroud for the ''side'' or, when in a SUF, the unit is hiding.
 +
* '''respect_fog''': yes or no, default yes. In a location filter (only), setting this to "no" will cause the test to ignore fog; it becomes a test for shrouded or not shrouded.
 +
** When multiple viewing sides are listed, all of the sides must pass the visibility check in order for the [filter_vision] filter to return a successful match.
 +
** When no viewing sides are listed, all enemy sides must pass the visibility check.
 +
*'''[[StandardSideFilter]]''' tags and keys; all matching sides must be able to see the unit/location. If an empty filter, all sides (instead of only all enemy sides) match. If there is *at least one* matching side which can see the unit / location (accounting for fog / hiding / shroud) then the filter matches, and otherwise it fails to match.
 +
 
 +
'''Example:''' This event will fire when the enemy (side 2) moves to a location within the player's (side 1's) field of vision:
 +
[event]
 +
    name=moveto
 +
    first_time_only=yes
 +
    [filter]
 +
        side=2
 +
        [filter_vision]
 +
            side=1
 +
        [/filter_vision]
 +
    [/filter]
 +
    [message]
 +
        speaker=unit
 +
        message="I am your enemy. I know that you can see me here."
 +
    [/message]
 +
[/event]
 +
 
 +
'''Note:''' In a location filter, this tag is only useful when the viewing side is under a fog or shroud. You ''can'' set a shroud over an AI side. This will allow you to use the vision filter from the point-of-view of an AI side. The fog/shroud does not currently affect AI movement patterns, but the AI algorithm may become constrained by fog/shroud in the future.
 +
 
 +
== Filtering on WML data ==
  
=== Filtering Terrains ===
+
Some places allow you to filter directly on WML data. WML filters are more free-form than other filters, allowing arbitrary WML data that is to be matched. The following conventions are possible:
  
At some places the terrains can be filtered with a  
+
* '''key=value''': Means that the key '''key''' must be present with the specified value.
match list. This list is only usable with the new terrain
+
* '''glob_on_key=glob''': {{DevFeature1.15|0}} Means that the key '''key''' must be present with a value that matches the specified glob. In a glob, the '''*''' character matches any sequence of characters, while the '''?''' character matches any single character. In addition to the obvious, this is useful for matching the absence of a key - just place '''glob_on_key=*''' in a '''[not]''' tag.
strings. The list is a comma separated list and matching will stop
+
* '''[some_tag]''': In a WML filter, all tags contain further WML filter data as children. The presence of a tag in the filter means that the WML must have at least one tag '''some_tag''' present, and at least one of the '''some_tag''' tags must match the WML filter contained in '''[some_tag]'''.
at the first matched terrain string. There's one special character
+
* '''[not]''': The WML filter contained in '''[not]''' ''must not'' match the WML.
''!'' which inverts the meaning of a match. Terrain strings can  
+
* '''[and]''': {{DevFeature1.15|0}} In addition to the main filter, the filter contained in '''[and]''' must also match the WML. In most cases this tag is not necessary (the two filters can simply be merged), but in some unusual cases (particularly when globs are involved) it might be needed to get the desired result.
use the wildcard * to match zero or more following letters, characters
+
* '''[or]''': {{DevFeature1.15|0}} Adds another filter that is allowed to match in place of the main filter. Note that when combining several WML filters with '''[or]''' tags, the first filter must not be wrapped in '''[or]''' tags - doing so would mean that the first filter is actually an empty filter, which matches everything, meaning the other '''[or]''' tags are irrelevant.
behind the * are not allowed and the result is undefined.
 
  
Eg: <br>
+
== Tutorial ==
ww* matches ww, www, wwW but not WWW <br>
+
* [[FilterWML/Examples_-_How_to_use_Filter|How To Use Filter (with examples)]]
!, ww returns false if ww found and true if not <br>
 
!, ww, wa, !, aa returns false if ww or wa found and true if aa found and false if none found.
 
  
 
== See Also ==
 
== See Also ==
  
* [[UnitWML]]
+
* [[UnitTypeWML]]
 
* [[EventWML]]
 
* [[EventWML]]
 
* [[ReferenceWML]]
 
* [[ReferenceWML]]
 +
* [[FilterWML/Examples - How to use Filter]]
  
 
[[Category: WML Reference]]
 
[[Category: WML Reference]]

Revision as of 10:39, 11 November 2023

[edit]WML Tags

A:

abilities, about, achievement, achievement_group, add_ai_behavior, advanced_preference, advancefrom, advancement, advances, affect_adjacent, ai, allied_with, allow_end_turn, allow_extra_recruit, allow_recruit, allow_undo, and, animate, animate_unit, animation, aspect, attack (replay, weapon), attack_anim, attacks (special, stats), avoid;

B:

base_unit, background_layer, berserk, binary_path, break, brush;

C:

campaign, cancel_action, candidate_action, capture_village, case, chance_to_hit, change_theme, chat, checkbox, choice, choose, clear_global_variable, clear_menu_item, clear_variable, color_adjust, color_palette, color_range, command (action, replay), continue, core, credits_group, criteria;

D:

damage, damage_type, death, deaths, default, defend, defends, defense, delay, deprecated_message, destination, difficulty, disable, disallow_end_turn, disallow_extra_recruit, disallow_recruit, do, do_command, drains, draw_weapon_anim;

E:

editor_group, editor_music, editor_times, effect, else (action, animation), elseif, endlevel, end_turn (action, replay), enemy_of, engine, entry (credits, options), era, event, experimental_filter_ability, experimental_filter_ability_active, experimental_filter_specials, extra_anim;

F:

facet, facing, fake_unit, false, feedback, female, filter (concept, event), filter_adjacent, filter_adjacent_location, filter_attack, filter_attacker, filter_base_value, filter_condition, filter_defender, filter_enemy, filter_location, filter_opponent, filter_own, filter_owner, filter_radius, filter_recall, filter_second, filter_second_attack, filter_self, filter_side, filter_student, filter_vision, filter_weapon, filter_wml, find_path, fire_event, firststrike, floating_text, fonts, for, foreach, found_item, frame;

G:

game_config, get_global_variable, goal, gold, gold_carryover;

H:

harm_unit, has_ally, has_attack, has_unit, has_achievement, have_location, have_unit, heal_on_hit, heal_unit, healed_anim, healing_anim, heals, hide_help, hide_unit, hides;

I:

idle_anim, if (action, animation, intro), illuminates, image (intro, terrain), init_side, insert_tag, inspect, item, item_group;

J:

jamming_costs, join;

K:

kill, killed;

L:

label, language, leader, leader_goal, leadership, leading_anim, levelin_anim, levelout_anim, lift_fog, limit, literal, load_resource, locale, lock_view, lua;

M:

male, menu_item, message, micro_ai, missile_frame, modification, modifications, modify_ai, modify_side, modify_turns, modify_unit, modify_unit_type, move, move_unit, move_unit_fake, move_units_fake, movement_anim, movement costs, movetype, multiplayer, multiplayer_side, music;

N:

not, note;

O:

object, objective, objectives, on_undo, open_help, option, options, or;

P:

part, petrifies, petrify, place_shroud, plague, poison, post_movement_anim, pre_movement_anim, primary_attack, primary_unit, print, progress_achievement, put_to_recall_list;

R:

race, random_placement, recall (action, replay), recalls, recruit, recruit_anim, recruiting_anim, recruits, redraw, regenerate, remove_event, remove_item, remove_object, remove_shroud, remove_sound_source, remove_time_area, remove_trait, remove_unit_overlay, repeat, replace_map, replace_schedule, replay, replay_start, reset_fog, resistance (ability, unit), resistance_defaults, resolution, resource, return, role, rule;

S:

save, scenario, screen_fade, scroll, scroll_to, scroll_to_unit, secondary_attack, secondary_unit, section, select_unit, sequence, set_achievement, set_extra_recruit, set_global_variable, set_menu_item, set_recruit, set_specials, set_variable, set_variables, sheath_weapon_anim, show_if (message, objective, set_menu_item), show_objectives, side, skirmisher, slider, slow, snapshot, sound, sound_source, source (replay, teleport), special_note, specials, split, stage, standing_anim, statistics, status, store_gold, store_items, store_locations, store_map_dimensions, store_reachable_locations, store_relative_direction, store_side, store_starting_location, store_time_of_day, store_turns, store_unit, store_unit_defense, store_unit_defense_on, store_unit_type, store_unit_type_ids, store_villages, story, swarm, sub_achievement, switch, sync_variable;

T:

target, team, teleport (ability, action), teleport_anim, terrain, terrain_defaults, terrain_graphics, terrain_mask, terrain_type, test, test_condition, test_do_attack_by_id, text_input, textdomain, theme, then, tile, time, time_area, topic, toplevel, trait, transform_unit, traveler, true, tunnel;

U:

unhide_unit, unit (action, scenario), unit_overlay, unit_type, unit_worth, units, unlock_view, unpetrify, unstore_unit, unsynced;

V:

value, variable, variables, variant, variation, victory_anim, village, vision_costs, volume;

W:

while, wml_message, wml_schema;

Z:

zoom;

Filtering in WML

A filter is a special WML block. Filters are used to describe a set of units, hexes, weapons or something else. Filters are defined as matching something if all the keys in the filter match that thing. For example, if a unit filter contains two keys, a unit must match both of the keys in order to match the filter.

A StandardUnit(Location, Side, ...)Filter is the place where the set of such keys and tags can appear. A StandardFilter sometimes needs an according surrounding tag but often doesn't. It should be mentioned at the place in the wiki where it's said that you can use at a certain code position a StandardFilter whether you need a surrounding tag or not.

Filtering Units

Filters are often used in action tags (see EventWML). In this case the phrase "standard unit filter" is used in place of the set of standard keys. Sometimes a filter is used to find the first unit that matches the filter; for example, the [recall] tag recalls that unit.

Standard unit filters are also used in the tags [filter] and [filter_second]. These are subtags of [event] which describe when the event should trigger. Most event names (see EventWML) have units related to them called "primary unit" and "secondary unit". In order for an event to be triggered, primary unit must match the filter contained in [filter], and secondary unit must match the filter contained in [filter_second].

See StandardUnitFilter for details.

Filtering Locations

As you have seen, standard unit filter can contain a location filter. Several actions, such as [terrain], also use location filters. Location filters are represented on this site by the phrase "standard location filter". A common use for location filters is to check the terrain of a space.

See StandardLocationFilter for details.

Filtering Sides

Sometimes, it's needed to get a list of sides which satisfy certain criteria. For this, a side filter can be used. Side filters are represented on this site by the phrase "standard side filter".

See StandardSideFilter for details.

Filtering Weapons

Sometimes weapons/attacks are filtered on in WML. See also EventWML, EffectWML, AnimationWML.

These keys are used as filter input for attack filters.

  • range: a range to filter
    • melee: only melee weapons pass
    • ranged: only ranged weapons pass
  • name: filter on the attack's name. See data/units/ to find the name of a particular unit's attack.
  • type: filter on the attack's type. Values are 'blade', 'pierce', 'impact', 'fire', 'cold', and 'arcane' or customised type. (Version 1.17.23 and later only) [damage_type] can change the type of damage inflicted, and this change can be detected in the filter except when it is applied from a [damage_type] which affects the filtered attack, in this case only the type before any modification by a any [damage_type] will be detectable.
  • damage: filter on damage value. Can be a specific number or a list of ranges like 'damage=0-5,7-99'
  • special_id: (Version 1.15.2 and later only) Filter on a weapon special by id, for example, magical in [chance_to_hit] id=magical. True if the unit has the special, whether or not it's currently active.
  • special_type: (Version 1.15.2 and later only) Filter on a weapon special by tag name for example, chance_to_hit in [chance_to_hit] id=magical. True if the unit has the special, whether or not it's currently active. For values see AbilitiesWML.
  • special_id_active: (Version 1.15.2 and later only) Like special_id, but true if the special is active at the current location. Does not work in 1.16. (Version 1.17.17 and later only) Works again.
  • special_type_active: (Version 1.15.2 and later only) Like special_type, but true if the special is active at the current location.
  • special: filter on the attack's special power, matches both id and tag name. (Version 1.15.2 and later only) Deprecated, see special_id and special_type instead.
  • special_active: (Version 1.13.8 and later only) Like special, but true if the special is active at the current location. (Version 1.15.2 and later only) Deprecated, see special_id and special_type instead.
  • number: (Version 1.13.5 and later only) filter on number of strikes
  • parry: (Version 1.13.5 and later only) filter on parry value
  • accuracy: (Version 1.13.5 and later only) filter on accuracy value
  • movement_used: (Version 1.13.5 and later only) filter on attack's movement cost
  • attacks_used: (Version 1.17.13 and later only) filter on attack's attack cost
  • formula: (Version 1.13.5 and later only) filter using Wesnoth Formula Language. The context object for the formula is a weapon object, which supports the following keys: name, description, type, icon, range, damage, number, attack_weight, defense_weight, accuracy, parry, movement_used, specials. The specials key is a list of all the special IDs the unit possesses. Do not surround the formula in $(...), since that will erase the self variable. (Version 1.17.13 and later only) The attacks_used key is also supported.

[and], [or], and [not] subfilters are also supported.

Filtering Vision

The [filter_vision] tag allows you to filter units or locations based on whether or not the hex is obscured by fog or shroud from the point-of-view of a viewing side, and (in the case of units) whether or not the unit is hidden (via the [hides] ability).

  • visible:
    • yes (default): matches when the location is not obscured by fog or shroud for the side and, when in a SUF, the unit is not hiding.
    • no: matches when the location is obscured by fog or shroud for the side or, when in a SUF, the unit is hiding.
  • respect_fog: yes or no, default yes. In a location filter (only), setting this to "no" will cause the test to ignore fog; it becomes a test for shrouded or not shrouded.
    • When multiple viewing sides are listed, all of the sides must pass the visibility check in order for the [filter_vision] filter to return a successful match.
    • When no viewing sides are listed, all enemy sides must pass the visibility check.
  • StandardSideFilter tags and keys; all matching sides must be able to see the unit/location. If an empty filter, all sides (instead of only all enemy sides) match. If there is *at least one* matching side which can see the unit / location (accounting for fog / hiding / shroud) then the filter matches, and otherwise it fails to match.

Example: This event will fire when the enemy (side 2) moves to a location within the player's (side 1's) field of vision:

[event]
    name=moveto
    first_time_only=yes
    [filter]
        side=2
        [filter_vision]
            side=1 
        [/filter_vision]
    [/filter]
    [message]
        speaker=unit
        message="I am your enemy. I know that you can see me here."
    [/message]
[/event]

Note: In a location filter, this tag is only useful when the viewing side is under a fog or shroud. You can set a shroud over an AI side. This will allow you to use the vision filter from the point-of-view of an AI side. The fog/shroud does not currently affect AI movement patterns, but the AI algorithm may become constrained by fog/shroud in the future.

Filtering on WML data

Some places allow you to filter directly on WML data. WML filters are more free-form than other filters, allowing arbitrary WML data that is to be matched. The following conventions are possible:

  • key=value: Means that the key key must be present with the specified value.
  • glob_on_key=glob: (Version 1.15.0 and later only) Means that the key key must be present with a value that matches the specified glob. In a glob, the * character matches any sequence of characters, while the ? character matches any single character. In addition to the obvious, this is useful for matching the absence of a key - just place glob_on_key=* in a [not] tag.
  • [some_tag]: In a WML filter, all tags contain further WML filter data as children. The presence of a tag in the filter means that the WML must have at least one tag some_tag present, and at least one of the some_tag tags must match the WML filter contained in [some_tag].
  • [not]: The WML filter contained in [not] must not match the WML.
  • [and]: (Version 1.15.0 and later only) In addition to the main filter, the filter contained in [and] must also match the WML. In most cases this tag is not necessary (the two filters can simply be merged), but in some unusual cases (particularly when globs are involved) it might be needed to get the desired result.
  • [or]: (Version 1.15.0 and later only) Adds another filter that is allowed to match in place of the main filter. Note that when combining several WML filters with [or] tags, the first filter must not be wrapped in [or] tags - doing so would mean that the first filter is actually an empty filter, which matches everything, meaning the other [or] tags are irrelevant.

Tutorial

See Also