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.
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.
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.
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.
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'.
- 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,
[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] 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.
- 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 attacks
- 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
- formula: (Version 1.13.5 and later only) filter using Wesnoth Formula Language
[and], [or], and [not] subfilters are also supported.
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).
- 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 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.