<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wesnoth.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Shadowm</id>
	<title>The Battle for Wesnoth Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wesnoth.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Shadowm"/>
	<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/Special:Contributions/Shadowm"/>
	<updated>2026-05-16T21:19:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Testers&amp;diff=74991</id>
		<title>Testers</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Testers&amp;diff=74991"/>
		<updated>2026-04-23T08:17:45Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Add yourself here if you are available to test anything around wesnoth and mention what environment (OS, platform, windowing system, etc) you can test and/or debug issues in. Maybe also mention what kind of issues you're mostly interested in or when you're likely available and which way you can best be reached.&lt;br /&gt;
&lt;br /&gt;
* Soliton: can test+debug on macOS, ios, linux (flatpak, X11), android&lt;br /&gt;
** reachable via IRC/discord/forum/github&lt;br /&gt;
* Irydacea: can test+debug on macOS (arm64), Windows 11 (x86_64), Linux (x86_64: Fedora with KDE Wayland)&lt;br /&gt;
** reachable via Discord and IRC&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=LuaAPI/types/widget&amp;diff=74897</id>
		<title>LuaAPI/types/widget</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=LuaAPI/types/widget&amp;diff=74897"/>
		<updated>2026-03-11T02:19:45Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: unfolded is actually in 1.18&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;tright&amp;quot;&amp;gt; __TOC__ &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''widget''' userdata offers access to a widget of a GUI2 dialog. While there is only one type of widget userdata that covers all widgets including the window itself, the properties of a widget userdata are different for each type of widget. Indexing a widget's userdata can either be used to access a child widget or to set or get a property of a widget. Some properties are read-only or write-only; the properties depend on the type of the widget.&lt;br /&gt;
&lt;br /&gt;
An example of accessing a child widget:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
function preshow(dialog)&lt;br /&gt;
  local okay_button = dialog.okay_button&lt;br /&gt;
  -- okay_button is now a handle to the the widget's child with the id 'okay_button' &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.19|x}} Some fields are only available in newer versions of Wesnoth. However, even in this case it might be possible to set the attribute in question before the dialog is first shown by adjusting its definition WML accordingly. See [[GUIWidgetInstanceWML]] for more information on WML attributes available for each widget class.&lt;br /&gt;
&lt;br /&gt;
== Widget Attributes ==&lt;br /&gt;
&lt;br /&gt;
=== best_slider_length ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''best_slider_length''' &amp;amp;harr; ''length''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
Best length of the slider.&lt;br /&gt;
&lt;br /&gt;
=== characters_per_line ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''label''' &amp;amp;harr; ''int''&lt;br /&gt;
* Available on: '''[label]'''&lt;br /&gt;
Maximum characters this label should show per line.&lt;br /&gt;
&lt;br /&gt;
=== editable ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''enabled''' &amp;amp;harr; ''boolean''&lt;br /&gt;
* Available on: '''[text_box]'''&lt;br /&gt;
If this text box is editable, i.e., read-only. (Text can be selected/copied but not modified.)&lt;br /&gt;
&lt;br /&gt;
=== ellipsize_mode ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''ellipsize_mode''' &amp;amp;harr; ''ellipsization mode string''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
Sets the [https://docs.gtk.org/Pango/enum.EllipsizeMode.html Pango ellipsization mode] for the widget. Accepts only one of the special strings:&lt;br /&gt;
{| clasS=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! String value&lt;br /&gt;
|-&lt;br /&gt;
| none&lt;br /&gt;
|-&lt;br /&gt;
| start&lt;br /&gt;
|-&lt;br /&gt;
| end&lt;br /&gt;
|-&lt;br /&gt;
| middle&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== enabled ===&lt;br /&gt;
* ''widget''.'''enabled''' &amp;amp;harr; ''boolean''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
&lt;br /&gt;
=== help ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''enabled''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
Help text for this widget.&lt;br /&gt;
&lt;br /&gt;
=== hint_image ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''hint_image''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[text_box]''', '''[combobox]'''&lt;br /&gt;
A image that is shown on the widget when it is not focused and has no other text.&lt;br /&gt;
&lt;br /&gt;
=== hint_text ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''hint_text''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[text_box]''', '''[combobox]'''&lt;br /&gt;
A background text that is shown on the widget when it is not focused and has no other text.&lt;br /&gt;
&lt;br /&gt;
=== history ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''history''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: '''[text_box]'''&lt;br /&gt;
Input history of this text box.&lt;br /&gt;
&lt;br /&gt;
=== indentation_step_size ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''indentation_step_size''' &amp;amp;harr; ''int''&lt;br /&gt;
* Available on: '''[tree_view]'''&lt;br /&gt;
How much should child nodes be offset from their parent node.&lt;br /&gt;
&lt;br /&gt;
=== item_count ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''item_count''' &amp;amp;rarr; ''number of items''&lt;br /&gt;
* Available on: '''[multi_page]''', '''[listbox]''',  '''[combobox]''',  '''[stacked_widget]''', '''[tree_view]''',  '''[tree_view_node]''', '''[styled_widget]'''&lt;br /&gt;
The number of items in the container widget.&lt;br /&gt;
&lt;br /&gt;
=== label ===&lt;br /&gt;
* ''widget''.'''label''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]''', '''[image]'''&lt;br /&gt;
The widget's label. Technically this is a special string used in the widget's wml definition. It usually does what one would expect, but also sets the image for '''image''' widgets.  For '''[text_box]''', use '''text''' for initial values.&lt;br /&gt;
&lt;br /&gt;
=== link_aware ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''link_aware''' &amp;amp;rarr; ''boolean''&lt;br /&gt;
* Available on: '''[label]''', '''[rich_label]''', '''[scroll_label]''', '''[scroll_text]'''&lt;br /&gt;
Whether this widget recognizes inline links and allows clicking on them.&lt;br /&gt;
&lt;br /&gt;
=== link_color ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''link_color''' &amp;amp;rarr; ''color string''&lt;br /&gt;
* Available on: '''[label]''', '''[rich_label]'''&lt;br /&gt;
Color of the inline link, as an hex string.&lt;br /&gt;
&lt;br /&gt;
=== marked_up_text ===&lt;br /&gt;
* ''widget''.'''marked_up_text''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]'''&lt;br /&gt;
Shortcut for setting label and use_markup=yes.&lt;br /&gt;
&lt;br /&gt;
=== maximum_value_label ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''maximum_value_label''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
The text the slider's label shows when it is at maximum value position.&lt;br /&gt;
&lt;br /&gt;
=== max_input_length ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''max_input_length''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[text_box]''', '''[combobox]'''&lt;br /&gt;
Maximum number of character than can be input into this widget.&lt;br /&gt;
&lt;br /&gt;
=== minimum_value_label ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''minimum_value_label''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
The text the slider's label shows when it is at minimum value position.&lt;br /&gt;
&lt;br /&gt;
=== overflow_to_tooltip ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''overflow_to_tooltip''' &amp;amp;harr; ''boolean''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
&lt;br /&gt;
=== path ===&lt;br /&gt;
* ''widget''.'''path''' &amp;amp;rarr; ''array of indices''&lt;br /&gt;
* Available on: '''[tree_view_node]'''&lt;br /&gt;
A table describing this node in the overall treeview. See [[#selected_item_path|selected_item_path]] for the meaning of the table..&lt;br /&gt;
&lt;br /&gt;
=== percentage ===&lt;br /&gt;
* ''widget''.'''percentage''' &amp;amp;harr; ''position''&lt;br /&gt;
* Available on: '''[progress_bar]'''&lt;br /&gt;
The current position of the progress bar, between 0 and 100.&lt;br /&gt;
&lt;br /&gt;
=== selected ===&lt;br /&gt;
* ''widget''.'''selected''' &amp;amp;harr; ''boolean''&lt;br /&gt;
* Available on: '''[toggle_button]''', '''[toggle_panel]'''&lt;br /&gt;
Whether the item is selected or not. Note that this should only be used for widgets that have only 2 states. In particular, there exist 3-State toggle_buttons (for example in listbox headers). For those, selected_index must be used instead.&lt;br /&gt;
&lt;br /&gt;
=== selected_index ===&lt;br /&gt;
* ''widget''.'''selected_index''' &amp;amp;harr; ''index''&lt;br /&gt;
* Available on: '''[listbox]''', '''[multi_page]''', '''[stacked_widget]''', '''[menu_button]''', '''[toggle_button]''', '''[toggle_panel]'''&lt;br /&gt;
The selected index of the item. For '''[toggle_button]''' and '''[toggle_panel]''', this is the same as '''selected''' only encoded as a number (1 for false or 2 for true) instead of a boolean.&lt;br /&gt;
For a  '''[listbox]'''with '''has_maximum=false''' and more than one item selected, reading '''selected_index''' will return the first selected index.&lt;br /&gt;
For a '''[stacked_widget]''', only the layer specified by '''selected_index''' will be displayed and receive events (callbacks will only be triggered on the selected layer).&lt;br /&gt;
A '''selected_index''' of 0 represents all layers being selected, with events only being received by the layer with the highest index.  Note that term ''selected'' for the ''layer'' of a stacked_widget is not the same as the '''selected''' ''widget'' attribute.&lt;br /&gt;
&lt;br /&gt;
=== selected_item_path ===&lt;br /&gt;
* ''widget''.'''selected_item_path''' &amp;amp;rarr; ''array of indices''&lt;br /&gt;
* Available on: '''[tree_view]'''&lt;br /&gt;
A table describing the currently selected node. If for example, in the following treeview, Item 9 is selected, the result will be {2,1,3}.&lt;br /&gt;
 +Section1&lt;br /&gt;
  +Subsection11&lt;br /&gt;
   *Item1&lt;br /&gt;
   *Item2&lt;br /&gt;
   *Item3&lt;br /&gt;
  +Subsection12&lt;br /&gt;
   *Item4&lt;br /&gt;
   *Item5&lt;br /&gt;
   *Item6&lt;br /&gt;
 +Section2&lt;br /&gt;
  +Subsection21&lt;br /&gt;
   *Item7&lt;br /&gt;
   *Item8&lt;br /&gt;
   *Item9&lt;br /&gt;
  +Subsection22&lt;br /&gt;
   *Item10&lt;br /&gt;
   *Item11&lt;br /&gt;
   *Item12&lt;br /&gt;
&lt;br /&gt;
=== step_size ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''step_size''' &amp;amp;harr; ''int''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
&lt;br /&gt;
=== text ===&lt;br /&gt;
* ''widget''.'''text''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[text_box]'''&lt;br /&gt;
The text of the textbox.&lt;br /&gt;
&lt;br /&gt;
=== text_alignment ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''text_alignment''' &amp;amp;harr; ''text alignment string''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
Sets the [https://docs.gtk.org/Pango/enum.Alignment.html Pango text alignment] for the widget. Accepts only one of the special strings:&lt;br /&gt;
{| clasS=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! String value&lt;br /&gt;
|-&lt;br /&gt;
| left&lt;br /&gt;
|-&lt;br /&gt;
| right&lt;br /&gt;
|-&lt;br /&gt;
| center&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== tooltip ===&lt;br /&gt;
* ''widget''.'''tooltip''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
&lt;br /&gt;
=== type ===&lt;br /&gt;
* ''widget''.'''type''' &amp;amp;rarr; ''string''&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
Returns a string specifying the type of the widget.&lt;br /&gt;
&lt;br /&gt;
=== unfolded ===&lt;br /&gt;
* ''widget''.'''unfolded''' &amp;amp;larr; ''boolean''&lt;br /&gt;
* Available on: '''[tree_view_node]''', '''[tree_view]'''&lt;br /&gt;
Control whether a tree node is currently expanded or not.&lt;br /&gt;
&lt;br /&gt;
=== unit ===&lt;br /&gt;
* ''widget''.'''unit''' &amp;amp;larr; ''unit or unit type''&lt;br /&gt;
* Available on: '''[unit_preview_pane]'''&lt;br /&gt;
Change the displayed unit or unit type in the preview pane.&lt;br /&gt;
&lt;br /&gt;
=== use_markup ===&lt;br /&gt;
* ''widget''.'''use_markup''' &amp;amp;rarr; ''boolean''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]'''&lt;br /&gt;
Sets whether the widget's label will parse [[Pango formatting]].&lt;br /&gt;
&lt;br /&gt;
=== value ===&lt;br /&gt;
* ''widget''.'''value''' &amp;amp;harr; ''position''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
The current position of the slider.&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
* ''widget''.'''visible''' &amp;amp;harr; ''visibility string''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
Determines whether the widget is visible onscreen. The following visibility statuses are recognized:&lt;br /&gt;
{| clasS=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! String value !! Boolean shorthand !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| visible || true || The widget is visible and handles events.&lt;br /&gt;
|-&lt;br /&gt;
| hidden || || The widget is not visible, doesn't handle events, but still takes up space on the dialog grid.&lt;br /&gt;
|-&lt;br /&gt;
| invisible || false || The widget is not visible, doesn't handle events, and does not take up space on the dialog grid.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wrap ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''wrap''' &amp;amp;rarr; ''boolean''&lt;br /&gt;
* Available on: '''[label]'''&lt;br /&gt;
Whether the text content in this label can wrap.&lt;br /&gt;
&lt;br /&gt;
== Widget Callbacks ==&lt;br /&gt;
&lt;br /&gt;
=== on_button_click ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_button_click''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: '''[button]''', '''[repeating_button]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on the button. This can differ from '''on_left_click''', depending on the type of widget. For example, on a '''[repeating_button]''' it will fire multiple times if the user holds the mouse button down.&lt;br /&gt;
&lt;br /&gt;
=== on_double_click ===&lt;br /&gt;
{{DevFeature1.19|14}}&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_double_click''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: '''[toggle_panel]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user double clicks on the widget. Non-toggle panel widgets can be wrapped in a toggle panel to make use of this event handler.&lt;br /&gt;
&lt;br /&gt;
=== on_left_click ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_left_click''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on the widget.&lt;br /&gt;
&lt;br /&gt;
=== on_link_click ===&lt;br /&gt;
{{DevFeature1.19|9}}&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_link_click''' &amp;amp;larr; '''function'''(''dest'')&lt;br /&gt;
* Available on: '''[rich_label]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on a '''&amp;lt;ref&amp;gt;''' link inside a '''[rich_label]'''. The first argument '''dest''' is the target of the link.&lt;br /&gt;
&lt;br /&gt;
=== on_modified ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_modified''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: Most widgets, in particular '''[slider]''', '''[toggle_button]''', '''[listbox]''', '''[menu_button]''', '''[text_box]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user changes the value of the widget.&lt;br /&gt;
&lt;br /&gt;
== Widget Length ==&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.19|4}}&lt;br /&gt;
&lt;br /&gt;
* '''#'''''widget''&lt;br /&gt;
* Available on: '''[listbox]''', '''[multi_page]''', '''[tree_view]''', '''[tree_view_node]''', {{DevFeature1.19|6}} '''[stacked_widget]'''&lt;br /&gt;
&lt;br /&gt;
Returns the total number of children in the specified container widget – for example, the number of rows in a list box, or the number of pages in a multi-page.&lt;br /&gt;
&lt;br /&gt;
== Widget Methods ==&lt;br /&gt;
&lt;br /&gt;
Any function defined in the [[LuaAPI/gui/widget|gui.widget]] module and taking a widget as its first parameter can be called as a method of a widget. This includes any functions that are added to the module by user code. Note that these methods are available even if the widget itself doesn't support that function, so in some cases it may be necessary to check '''widget.type''' before calling the method.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=LuaAPI/types/widget&amp;diff=74896</id>
		<title>LuaAPI/types/widget</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=LuaAPI/types/widget&amp;diff=74896"/>
		<updated>2026-03-11T00:18:05Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Lots of things specific to 1.19.6+ were documented here without the necessary warnings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;tright&amp;quot;&amp;gt; __TOC__ &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''widget''' userdata offers access to a widget of a GUI2 dialog. While there is only one type of widget userdata that covers all widgets including the window itself, the properties of a widget userdata are different for each type of widget. Indexing a widget's userdata can either be used to access a child widget or to set or get a property of a widget. Some properties are read-only or write-only; the properties depend on the type of the widget.&lt;br /&gt;
&lt;br /&gt;
An example of accessing a child widget:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
function preshow(dialog)&lt;br /&gt;
  local okay_button = dialog.okay_button&lt;br /&gt;
  -- okay_button is now a handle to the the widget's child with the id 'okay_button' &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.19|x}} Some fields are only available in newer versions of Wesnoth. However, even in this case it might be possible to set the attribute in question before the dialog is first shown by adjusting its definition WML accordingly. See [[GUIWidgetInstanceWML]] for more information on WML attributes available for each widget class.&lt;br /&gt;
&lt;br /&gt;
== Widget Attributes ==&lt;br /&gt;
&lt;br /&gt;
=== best_slider_length ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''best_slider_length''' &amp;amp;harr; ''length''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
Best length of the slider.&lt;br /&gt;
&lt;br /&gt;
=== characters_per_line ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''label''' &amp;amp;harr; ''int''&lt;br /&gt;
* Available on: '''[label]'''&lt;br /&gt;
Maximum characters this label should show per line.&lt;br /&gt;
&lt;br /&gt;
=== editable ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''enabled''' &amp;amp;harr; ''boolean''&lt;br /&gt;
* Available on: '''[text_box]'''&lt;br /&gt;
If this text box is editable, i.e., read-only. (Text can be selected/copied but not modified.)&lt;br /&gt;
&lt;br /&gt;
=== ellipsize_mode ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''ellipsize_mode''' &amp;amp;harr; ''ellipsization mode string''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
Sets the [https://docs.gtk.org/Pango/enum.EllipsizeMode.html Pango ellipsization mode] for the widget. Accepts only one of the special strings:&lt;br /&gt;
{| clasS=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! String value&lt;br /&gt;
|-&lt;br /&gt;
| none&lt;br /&gt;
|-&lt;br /&gt;
| start&lt;br /&gt;
|-&lt;br /&gt;
| end&lt;br /&gt;
|-&lt;br /&gt;
| middle&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== enabled ===&lt;br /&gt;
* ''widget''.'''enabled''' &amp;amp;harr; ''boolean''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
&lt;br /&gt;
=== help ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''enabled''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
Help text for this widget.&lt;br /&gt;
&lt;br /&gt;
=== hint_image ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''hint_image''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[text_box]''', '''[combobox]'''&lt;br /&gt;
A image that is shown on the widget when it is not focused and has no other text.&lt;br /&gt;
&lt;br /&gt;
=== hint_text ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''hint_text''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[text_box]''', '''[combobox]'''&lt;br /&gt;
A background text that is shown on the widget when it is not focused and has no other text.&lt;br /&gt;
&lt;br /&gt;
=== history ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''history''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: '''[text_box]'''&lt;br /&gt;
Input history of this text box.&lt;br /&gt;
&lt;br /&gt;
=== indentation_step_size ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''indentation_step_size''' &amp;amp;harr; ''int''&lt;br /&gt;
* Available on: '''[tree_view]'''&lt;br /&gt;
How much should child nodes be offset from their parent node.&lt;br /&gt;
&lt;br /&gt;
=== item_count ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''item_count''' &amp;amp;rarr; ''number of items''&lt;br /&gt;
* Available on: '''[multi_page]''', '''[listbox]''',  '''[combobox]''',  '''[stacked_widget]''', '''[tree_view]''',  '''[tree_view_node]''', '''[styled_widget]'''&lt;br /&gt;
The number of items in the container widget.&lt;br /&gt;
&lt;br /&gt;
=== label ===&lt;br /&gt;
* ''widget''.'''label''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]''', '''[image]'''&lt;br /&gt;
The widget's label. Technically this is a special string used in the widget's wml definition. It usually does what one would expect, but also sets the image for '''image''' widgets.  For '''[text_box]''', use '''text''' for initial values.&lt;br /&gt;
&lt;br /&gt;
=== link_aware ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''link_aware''' &amp;amp;rarr; ''boolean''&lt;br /&gt;
* Available on: '''[label]''', '''[rich_label]''', '''[scroll_label]''', '''[scroll_text]'''&lt;br /&gt;
Whether this widget recognizes inline links and allows clicking on them.&lt;br /&gt;
&lt;br /&gt;
=== link_color ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''link_color''' &amp;amp;rarr; ''color string''&lt;br /&gt;
* Available on: '''[label]''', '''[rich_label]'''&lt;br /&gt;
Color of the inline link, as an hex string.&lt;br /&gt;
&lt;br /&gt;
=== marked_up_text ===&lt;br /&gt;
* ''widget''.'''marked_up_text''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]'''&lt;br /&gt;
Shortcut for setting label and use_markup=yes.&lt;br /&gt;
&lt;br /&gt;
=== maximum_value_label ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''maximum_value_label''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
The text the slider's label shows when it is at maximum value position.&lt;br /&gt;
&lt;br /&gt;
=== max_input_length ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''max_input_length''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[text_box]''', '''[combobox]'''&lt;br /&gt;
Maximum number of character than can be input into this widget.&lt;br /&gt;
&lt;br /&gt;
=== minimum_value_label ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''minimum_value_label''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
The text the slider's label shows when it is at minimum value position.&lt;br /&gt;
&lt;br /&gt;
=== overflow_to_tooltip ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''overflow_to_tooltip''' &amp;amp;harr; ''boolean''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
&lt;br /&gt;
=== path ===&lt;br /&gt;
* ''widget''.'''path''' &amp;amp;rarr; ''array of indices''&lt;br /&gt;
* Available on: '''[tree_view_node]'''&lt;br /&gt;
A table describing this node in the overall treeview. See [[#selected_item_path|selected_item_path]] for the meaning of the table..&lt;br /&gt;
&lt;br /&gt;
=== percentage ===&lt;br /&gt;
* ''widget''.'''percentage''' &amp;amp;harr; ''position''&lt;br /&gt;
* Available on: '''[progress_bar]'''&lt;br /&gt;
The current position of the progress bar, between 0 and 100.&lt;br /&gt;
&lt;br /&gt;
=== selected ===&lt;br /&gt;
* ''widget''.'''selected''' &amp;amp;harr; ''boolean''&lt;br /&gt;
* Available on: '''[toggle_button]''', '''[toggle_panel]'''&lt;br /&gt;
Whether the item is selected or not. Note that this should only be used for widgets that have only 2 states. In particular, there exist 3-State toggle_buttons (for example in listbox headers). For those, selected_index must be used instead.&lt;br /&gt;
&lt;br /&gt;
=== selected_index ===&lt;br /&gt;
* ''widget''.'''selected_index''' &amp;amp;harr; ''index''&lt;br /&gt;
* Available on: '''[listbox]''', '''[multi_page]''', '''[stacked_widget]''', '''[menu_button]''', '''[toggle_button]''', '''[toggle_panel]'''&lt;br /&gt;
The selected index of the item. For '''[toggle_button]''' and '''[toggle_panel]''', this is the same as '''selected''' only encoded as a number (1 for false or 2 for true) instead of a boolean.&lt;br /&gt;
For a  '''[listbox]'''with '''has_maximum=false''' and more than one item selected, reading '''selected_index''' will return the first selected index.&lt;br /&gt;
For a '''[stacked_widget]''', only the layer specified by '''selected_index''' will be displayed and receive events (callbacks will only be triggered on the selected layer).&lt;br /&gt;
A '''selected_index''' of 0 represents all layers being selected, with events only being received by the layer with the highest index.  Note that term ''selected'' for the ''layer'' of a stacked_widget is not the same as the '''selected''' ''widget'' attribute.&lt;br /&gt;
&lt;br /&gt;
=== selected_item_path ===&lt;br /&gt;
* ''widget''.'''selected_item_path''' &amp;amp;rarr; ''array of indices''&lt;br /&gt;
* Available on: '''[tree_view]'''&lt;br /&gt;
A table describing the currently selected node. If for example, in the following treeview, Item 9 is selected, the result will be {2,1,3}.&lt;br /&gt;
 +Section1&lt;br /&gt;
  +Subsection11&lt;br /&gt;
   *Item1&lt;br /&gt;
   *Item2&lt;br /&gt;
   *Item3&lt;br /&gt;
  +Subsection12&lt;br /&gt;
   *Item4&lt;br /&gt;
   *Item5&lt;br /&gt;
   *Item6&lt;br /&gt;
 +Section2&lt;br /&gt;
  +Subsection21&lt;br /&gt;
   *Item7&lt;br /&gt;
   *Item8&lt;br /&gt;
   *Item9&lt;br /&gt;
  +Subsection22&lt;br /&gt;
   *Item10&lt;br /&gt;
   *Item11&lt;br /&gt;
   *Item12&lt;br /&gt;
&lt;br /&gt;
=== step_size ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''step_size''' &amp;amp;harr; ''int''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
&lt;br /&gt;
=== text ===&lt;br /&gt;
* ''widget''.'''text''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[text_box]'''&lt;br /&gt;
The text of the textbox.&lt;br /&gt;
&lt;br /&gt;
=== text_alignment ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''text_alignment''' &amp;amp;harr; ''text alignment string''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
Sets the [https://docs.gtk.org/Pango/enum.Alignment.html Pango text alignment] for the widget. Accepts only one of the special strings:&lt;br /&gt;
{| clasS=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! String value&lt;br /&gt;
|-&lt;br /&gt;
| left&lt;br /&gt;
|-&lt;br /&gt;
| right&lt;br /&gt;
|-&lt;br /&gt;
| center&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== tooltip ===&lt;br /&gt;
* ''widget''.'''tooltip''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
&lt;br /&gt;
=== type ===&lt;br /&gt;
* ''widget''.'''type''' &amp;amp;rarr; ''string''&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
Returns a string specifying the type of the widget.&lt;br /&gt;
&lt;br /&gt;
=== unfolded ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''unfolded''' &amp;amp;larr; ''boolean''&lt;br /&gt;
* Available on: '''[tree_view_node]''', '''[tree_view]'''&lt;br /&gt;
Control whether a tree node is currently expanded or not.&lt;br /&gt;
&lt;br /&gt;
=== unit ===&lt;br /&gt;
* ''widget''.'''unit''' &amp;amp;larr; ''unit or unit type''&lt;br /&gt;
* Available on: '''[unit_preview_pane]'''&lt;br /&gt;
Change the displayed unit or unit type in the preview pane.&lt;br /&gt;
&lt;br /&gt;
=== use_markup ===&lt;br /&gt;
* ''widget''.'''use_markup''' &amp;amp;rarr; ''boolean''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]'''&lt;br /&gt;
Sets whether the widget's label will parse [[Pango formatting]].&lt;br /&gt;
&lt;br /&gt;
=== value ===&lt;br /&gt;
* ''widget''.'''value''' &amp;amp;harr; ''position''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
The current position of the slider.&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
* ''widget''.'''visible''' &amp;amp;harr; ''visibility string''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
Determines whether the widget is visible onscreen. The following visibility statuses are recognized:&lt;br /&gt;
{| clasS=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! String value !! Boolean shorthand !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| visible || true || The widget is visible and handles events.&lt;br /&gt;
|-&lt;br /&gt;
| hidden || || The widget is not visible, doesn't handle events, but still takes up space on the dialog grid.&lt;br /&gt;
|-&lt;br /&gt;
| invisible || false || The widget is not visible, doesn't handle events, and does not take up space on the dialog grid.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wrap ===&lt;br /&gt;
{{DevFeature1.19|6}}&lt;br /&gt;
* ''widget''.'''wrap''' &amp;amp;rarr; ''boolean''&lt;br /&gt;
* Available on: '''[label]'''&lt;br /&gt;
Whether the text content in this label can wrap.&lt;br /&gt;
&lt;br /&gt;
== Widget Callbacks ==&lt;br /&gt;
&lt;br /&gt;
=== on_button_click ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_button_click''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: '''[button]''', '''[repeating_button]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on the button. This can differ from '''on_left_click''', depending on the type of widget. For example, on a '''[repeating_button]''' it will fire multiple times if the user holds the mouse button down.&lt;br /&gt;
&lt;br /&gt;
=== on_double_click ===&lt;br /&gt;
{{DevFeature1.19|14}}&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_double_click''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: '''[toggle_panel]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user double clicks on the widget. Non-toggle panel widgets can be wrapped in a toggle panel to make use of this event handler.&lt;br /&gt;
&lt;br /&gt;
=== on_left_click ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_left_click''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on the widget.&lt;br /&gt;
&lt;br /&gt;
=== on_link_click ===&lt;br /&gt;
{{DevFeature1.19|9}}&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_link_click''' &amp;amp;larr; '''function'''(''dest'')&lt;br /&gt;
* Available on: '''[rich_label]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on a '''&amp;lt;ref&amp;gt;''' link inside a '''[rich_label]'''. The first argument '''dest''' is the target of the link.&lt;br /&gt;
&lt;br /&gt;
=== on_modified ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_modified''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: Most widgets, in particular '''[slider]''', '''[toggle_button]''', '''[listbox]''', '''[menu_button]''', '''[text_box]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user changes the value of the widget.&lt;br /&gt;
&lt;br /&gt;
== Widget Length ==&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.19|4}}&lt;br /&gt;
&lt;br /&gt;
* '''#'''''widget''&lt;br /&gt;
* Available on: '''[listbox]''', '''[multi_page]''', '''[tree_view]''', '''[tree_view_node]''', {{DevFeature1.19|6}} '''[stacked_widget]'''&lt;br /&gt;
&lt;br /&gt;
Returns the total number of children in the specified container widget – for example, the number of rows in a list box, or the number of pages in a multi-page.&lt;br /&gt;
&lt;br /&gt;
== Widget Methods ==&lt;br /&gt;
&lt;br /&gt;
Any function defined in the [[LuaAPI/gui/widget|gui.widget]] module and taking a widget as its first parameter can be called as a method of a widget. This includes any functions that are added to the module by user code. Note that these methods are available even if the widget itself doesn't support that function, so in some cases it may be necessary to check '''widget.type''' before calling the method.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Template:Lua_Functions&amp;diff=74287</id>
		<title>Template:Lua Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Template:Lua_Functions&amp;diff=74287"/>
		<updated>2025-05-06T15:43:46Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: r does not come before a&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;reference-sidebar&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;span class=&amp;quot;editlink&amp;quot;&amp;gt;&amp;amp;#91;[{{SERVER}}{{localurl:Template:Lua Functions|action=edit}} edit]&amp;amp;#93;&amp;lt;/span&amp;gt;'''Lua Functions'''&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth''&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.as_text|wesnoth.as_text]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.colors|wesnoth.colors]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.compile_formula|wesnoth.compile_formula]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.current|wesnoth.current]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.current_version|wesnoth.current_version]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.custom_synced_commands|wesnoth.custom_synced_commands]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.deprecate_api|wesnoth.deprecate_api]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.deprecated_message|wesnoth.deprecated_message]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.dofile|wesnoth.dofile]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.effects|wesnoth.effects]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.eval_formula|wesnoth.eval_formula]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.game_config|wesnoth.game_config]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.get_language|wesnoth.get_language]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.log|wesnoth.log]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.micro_ais|wesnoth.micro_ais]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.ms_since_init|wesnoth.ms_since_init]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.name_generator|wesnoth.name_generator]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.named_tuple|wesnoth.named_tuple]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.persistent_tags|wesnoth.persistent_tags]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.print_attributes|wesnoth.print_attributes]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.races|wesnoth.races]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.require|wesnoth.require]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.scenario|wesnoth.scenario]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.simulate_combat|wesnoth.simulate_combat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.terrain_types|wesnoth.terrain_types]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.textdomain|wesnoth.textdomain]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.type|wesnoth.type]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.unit_types|wesnoth.unit_types]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.version|wesnoth.version]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.wml_actions|wesnoth.wml_actions]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.wml_conditionals|wesnoth.wml_conditionals]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.achievements''&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.get|wesnoth.achievements.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.has|wesnoth.achievements.has]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.has_sub_achievement|wesnoth.achievements.has_sub_achievement]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.progress|wesnoth.achievements.progress]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.set|wesnoth.achievements.set]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.set_sub_achievement|wesnoth.achievements.set_sub_achievement]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.audio''&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list|wesnoth.audio.music_list]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.add|wesnoth.audio.music_list.add]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.all|wesnoth.audio.music_list.all]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.clear|wesnoth.audio.music_list.clear]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.current|wesnoth.audio.music_list.current]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.next|wesnoth.audio.music_list.next]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.play|wesnoth.audio.music_list.play]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.previous|wesnoth.audio.music_list.previous]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.remove|wesnoth.audio.music_list.remove]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.volume|wesnoth.audio.music_list.volume]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.play|wesnoth.audio.play]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.sources|wesnoth.audio.sources]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.volume|wesnoth.audio.volume]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.game_events''&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.add|wesnoth.game_events.add]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.add_menu|wesnoth.game_events.add_menu]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.add_repeating|wesnoth.game_events.add_repeating]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.add_wml|wesnoth.game_events.add_wml]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.fire|wesnoth.game_events.fire]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.fire_by_id|wesnoth.game_events.fire_by_id]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_event|wesnoth.game_events.on_event]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_load|wesnoth.game_events.on_load]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_mouse_action|wesnoth.game_events.on_mouse_action]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_mouse_button|wesnoth.game_events.on_mouse_button]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_mouse_move|wesnoth.game_events.on_mouse_move]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_save|wesnoth.game_events.on_save]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.remove|wesnoth.game_events.remove]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.interface''&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.add_chat_message|wesnoth.interface.add_chat_message]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.add_hex_overlay|wesnoth.interface.add_hex_overlay]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.add_item_halo|wesnoth.interface.add_item_halo]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.add_item_image|wesnoth.interface.add_item_image]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.add_overlay_text|wesnoth.interface.add_overlay_text]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.allow_end_turn|wesnoth.interface.allow_end_turn]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.clear_chat_messages|wesnoth.interface.clear_chat_messages]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.color_adjust|wesnoth.interface.color_adjust]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.delay|wesnoth.interface.delay]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.deselect_hex|wesnoth.interface.deselect_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.end_turn|wesnoth.interface.end_turn]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.float_label|wesnoth.interface.float_label]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.get_displayed_unit|wesnoth.interface.get_displayed_unit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.get_hovered_hex|wesnoth.interface.get_hovered_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.get_items|wesnoth.interface.get_items]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.get_selected_hex|wesnoth.interface.get_selected_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.get_viewing_side|wesnoth.interface.get_viewing_side]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.handle_user_interact|wesnoth.interface.handle_user_interact]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.highlight_hex|wesnoth.interface.highlight_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.is_locked|wesnoth.interface.is_locked]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.is_skipping_messages|wesnoth.interface.is_skipping_messages]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.lock|wesnoth.interface.lock]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.remove_hex_overlay|wesnoth.interface.remove_hex_overlay]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.remove_item|wesnoth.interface.remove_item]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.scroll|wesnoth.interface.scroll]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.scroll_to_hex|wesnoth.interface.scroll_to_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.select_unit|wesnoth.interface.select_unit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.skip_messages|wesnoth.interface.skip_messages]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.zoom|wesnoth.interface.zoom]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.map''&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.add_label|wesnoth.map.add_label]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.are_hexes_adjacent|wesnoth.map.are_hexes_adjacent]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.create|wesnoth.map.create]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.distance_between|wesnoth.map.distance_between]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.find|wesnoth.map.find]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.generate|wesnoth.map.generate]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.generate_height_map|wesnoth.map.generate_height_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get|wesnoth.map.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_adjacent_hexes|wesnoth.map.get_adjacent_hexes]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_area|wesnoth.map.get_area]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_direction|wesnoth.map.get_direction]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_hexes_in_radius|wesnoth.map.get_hexes_in_radius]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_label|wesnoth.map.get_label]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_owner|wesnoth.map.get_owner]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_relative_dir|wesnoth.map.get_relative_dir]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.iter|wesnoth.map.iter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.make_bitmap|wesnoth.map.make_bitmap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.matches|wesnoth.map.matches]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.on_board|wesnoth.map.on_board]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.on_border|wesnoth.map.on_border]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.parse_bitmap|wesnoth.map.parse_bitmap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.place_area|wesnoth.map.place_area]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.read_location|wesnoth.map.read_location]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.remove_area|wesnoth.map.remove_area]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.remove_label|wesnoth.map.remove_label]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.rotate_right_around_center|wesnoth.map.rotate_right_around_center]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.set_owner|wesnoth.map.set_owner]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.split_terrain_code|wesnoth.map.split_terrain_code]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.terrain_mask|wesnoth.map.terrain_mask]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.paths''&lt;br /&gt;
[[LuaAPI/wesnoth/paths#wesnoth.paths.find_cost_map|wesnoth.paths.find_cost_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/paths#wesnoth.paths.find_path|wesnoth.paths.find_path]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/paths#wesnoth.paths.find_reach|wesnoth.paths.find_reach]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/paths#wesnoth.paths.find_vacant_hex|wesnoth.paths.find_vacant_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/paths#wesnoth.paths.find_vision_range|wesnoth.paths.find_vision_range]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.schedule''&lt;br /&gt;
[[LuaAPI/wesnoth/schedule#wesnoth.schedule.get_illumination|wesnoth.schedule.get_illumination]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/schedule#wesnoth.schedule.get_time_of_day|wesnoth.schedule.get_time_of_day]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/schedule#wesnoth.schedule.replace|wesnoth.schedule.replace]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.sides''&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.add_ai_component|wesnoth.sides.add_ai_component]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.append_ai|wesnoth.sides.append_ai]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.change_ai_component|wesnoth.sides.change_ai_component]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.create|wesnoth.sides.create]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.debug_ai|wesnoth.sides.debug_ai]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.delete_ai_component|wesnoth.sides.delete_ai_component]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.find|wesnoth.sides.find]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.get|wesnoth.sides.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.is_enemy|wesnoth.sides.is_enemy]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.is_fogged|wesnoth.sides.is_fogged]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.is_shrouded|wesnoth.sides.is_shrouded]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.iter|wesnoth.sides.iter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.matches|wesnoth.sides.matches]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.override_shroud|wesnoth.sides.override_shroud]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.place_fog|wesnoth.sides.place_fog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.place_shroud|wesnoth.sides.place_shroud]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.remove_fog|wesnoth.sides.remove_fog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.remove_shroud|wesnoth.sides.remove_shroud]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.set_id|wesnoth.sides.set_id]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.switch_ai|wesnoth.sides.switch_ai]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.sync''&lt;br /&gt;
[[LuaAPI/wesnoth/sync#wesnoth.sync.evaluate_multiple|wesnoth.sync.evaluate_multiple]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sync#wesnoth.sync.evaluate_single|wesnoth.sync.evaluate_single]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sync#wesnoth.sync.invoke_command|wesnoth.sync.invoke_command]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sync#wesnoth.sync.run_unsynced|wesnoth.sync.run_unsynced]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.units''&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.ability|wesnoth.units.ability]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.add_modification|wesnoth.units.add_modification]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.advance|wesnoth.units.advance]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.chance_to_be_hit|wesnoth.units.chance_to_be_hit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.clone|wesnoth.units.clone]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.create|wesnoth.units.create]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.create_animator|wesnoth.units.create_animator]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.defense_on|wesnoth.units.defense_on]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.erase|wesnoth.units.erase]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.extract|wesnoth.units.extract]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.find|wesnoth.units.find]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.find_attack|wesnoth.units.find_attack]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.find_on_map|wesnoth.units.find_on_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.find_on_recall|wesnoth.units.find_on_recall]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.get|wesnoth.units.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.get_hovered|wesnoth.units.get_hovered]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.jamming_on|wesnoth.units.jamming_on]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.matches|wesnoth.units.matches]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.movement_on|wesnoth.units.movement_on]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.rebuild|wesnoth.units.rebuild]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.remove_modifications|wesnoth.units.remove_modifications]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.resistance_against|wesnoth.units.resistance_against]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.scroll_to|wesnoth.units.scroll_to]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.select|wesnoth.units.select]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.to_map|wesnoth.units.to_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.to_recall|wesnoth.units.to_recall]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.transform|wesnoth.units.transform]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.vision_on|wesnoth.units.vision_on]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''ai''&lt;br /&gt;
[[LuaAPI/ai#ai.aspects|ai.aspects]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.attack|ai.attack]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.check_attack|ai.check_attack]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.check_move|ai.check_move]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.check_recall|ai.check_recall]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.check_recruit|ai.check_recruit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.check_stopunit|ai.check_stopunit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.fallback_human|ai.fallback_human]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.get_attacks|ai.get_attacks]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.get_targets|ai.get_targets]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.move|ai.move]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.move_full|ai.move_full]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.read_only|ai.read_only]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.recall|ai.recall]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.recruit|ai.recruit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.side|ai.side]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.stopunit_all|ai.stopunit_all]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.stopunit_attacks|ai.stopunit_attacks]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.stopunit_moves|ai.stopunit_moves]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.suitable_keep|ai.suitable_keep]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''filesystem''&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.canonical_path|filesystem.canonical_path]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.have_asset|filesystem.have_asset]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.have_file|filesystem.have_file]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.image_size|filesystem.image_size]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.read_file|filesystem.read_file]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.resolve_asset|filesystem.resolve_asset]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''functional''&lt;br /&gt;
[[LuaAPI/functional#functional.choose|functional.choose]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.choose_map|functional.choose_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.filter|functional.filter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.filter_map|functional.filter_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.find|functional.find]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.find_map|functional.find_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.map|functional.map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.map_array|functional.map_array]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.reduce|functional.reduce]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.take_while|functional.take_while]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.zip|functional.zip]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''gui''&lt;br /&gt;
[[LuaAPI/gui#gui.add_widget_definition|gui.add_widget_definition]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.get_user_choice|gui.get_user_choice]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_dialog|gui.show_dialog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_help|gui.show_help]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_inspector|gui.show_inspector]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_lua_console|gui.show_lua_console]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_menu|gui.show_menu]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_narration|gui.show_narration]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_popup|gui.show_popup]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_prompt|gui.show_prompt]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_recruit_dialog|gui.show_recruit_dialog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_recall_dialog|gui.show_recall_dialog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_story|gui.show_story]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.switch_theme|gui.switch_theme]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.widget|gui.widget]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''location_set''&lt;br /&gt;
[[LuaAPI/location_set#location_set.clear|location_set.clear]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.clone|location_set.clone]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.create|location_set.create]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.diff|location_set.diff]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.empty|location_set.empty]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.filter|location_set.filter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.get|location_set.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.insert|location_set.insert]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.inter|location_set.inter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.inter_merge|location_set.inter_merge]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.invert|location_set.invert]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.iter|location_set.iter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_map|location_set.of_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_pairs|location_set.of_pairs]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_raw|location_set.of_raw]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_shroud_data|location_set.of_shroud_data]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_triples|location_set.of_triples]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_wml_var|location_set.of_wml_var]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.random|location_set.random]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.remove|location_set.remove]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.size|location_set.size]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.stable_iter|location_set.stable_iter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.symm|location_set.symm]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_map|location_set.to_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_pairs|location_set.to_pairs]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_shroud_data|location_set.to_shroud_data]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_stable_pairs|location_set.to_stable_pairs]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_triples|location_set.to_triples]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_wml_var|location_set.to_wml_var]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.union|location_set.union]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.union_merge|location_set.union_merge]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''mathx''&lt;br /&gt;
[[LuaAPI/mathx#mathx.clamp|mathx.clamp]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/mathx#mathx.lerp|mathx.lerp]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/mathx#mathx.random|mathx.random]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/mathx#mathx.random_choice|mathx.random_choice]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/mathx#mathx.round|mathx.round]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/mathx#mathx.shuffle|mathx.shuffle]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''stringx''&lt;br /&gt;
[[LuaAPI/stringx#stringx.anim_split|stringx.anim_split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.escaped_split|stringx.escaped_split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.format_conjunct_list|stringx.format_conjunct_list]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.format_disjunct_list|stringx.format_disjunct_list]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.iter_range|stringx.iter_range]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.iter_ranges|stringx.iter_ranges]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.join|stringx.join]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.join_map|stringx.join_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.map_split|stringx.map_split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.parenthetical_split|stringx.parenthetical_split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.parse_range|stringx.parse_range]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.quoted_split|stringx.quoted_split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.split|stringx.split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.trim|stringx.trim]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.vformat|stringx.vformat]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''unit_test''&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert|unit_test.assert]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_approx_equal|unit_test.assert_approx_equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_contains|unit_test.assert_contains]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_equal|unit_test.assert_equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_greater|unit_test.assert_greater]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_greater_equal|unit_test.assert_greater_equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_in_range|unit_test.assert_in_range]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_less|unit_test.assert_less]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_less_equal|unit_test.assert_less_equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_not_equal|unit_test.assert_not_equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_nothrow|unit_test.assert_nothrow]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_throws|unit_test.assert_throws]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_throws_with|unit_test.assert_throws_with]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.fail|unit_test.fail]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.finish|unit_test.finish]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.fire_wml_menu_item|unit_test.fire_wml_menu_item]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.log|unit_test.log]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.succeed|unit_test.succeed]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.tostring|unit_test.tostring]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wml''&lt;br /&gt;
[[LuaAPI/wml#wml.all_variables|wml.all_variables]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.array_access.get|wml.array_access.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.array_access.get_proxy|wml.array_access.get_proxy]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.array_access.set|wml.array_access.set]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.array_variables|wml.array_variables]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.attribute_count|wml.attribute_count]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.child_array|wml.child_array]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.child_count|wml.child_count]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.child_range|wml.child_range]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.clone|wml.clone]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.diff|wml.diff]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.equal|wml.equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.error|wml.error]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.eval_conditional|wml.eval_conditional]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.find_child|wml.find_child]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.fire|wml.fire]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.get_child|wml.get_child]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.get_nth_child|wml.get_nth_child]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.interpolate|wml.interpolate]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.literal|wml.literal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.load|wml.load]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.matches_filter|wml.matches_filter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.merge|wml.merge]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.parse|wml.parse]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.parsed|wml.parsed]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.patch|wml.patch]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.remove_child|wml.remove_child]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.remove_children|wml.remove_children]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.shallow_literal|wml.shallow_literal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.shallow_parsed|wml.shallow_parsed]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.tag|wml.tag]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.tostring|wml.tostring]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.tovconfig|wml.tovconfig]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.valid|wml.valid]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.variables|wml.variables]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.variables_proxy|wml.variables_proxy]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wml-utils''&lt;br /&gt;
[[LuaAPI/wml-utils#utils.check_key|utils.check_key]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.get_sides|utils.get_sides]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.handle_event_commands|utils.handle_event_commands]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.optional_side_filter|utils.optional_side_filter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.scoped_var|utils.scoped_var]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.set_exiting|utils.set_exiting]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.vwriter|utils.vwriter]]&amp;lt;br&amp;gt;&lt;br /&gt;
|}&amp;lt;includeonly&amp;gt;[[Category:Lua Reference]]&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;A box with all the Lua functions, each one linking to the page and section they are described in. It was generated using [[/Updating|this method]]. This box should be included in [[LuaAPI|Lua reference]] page.&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Template:Lua_Functions&amp;diff=74286</id>
		<title>Template:Lua Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Template:Lua_Functions&amp;diff=74286"/>
		<updated>2025-05-06T15:43:11Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Add wesnoth.units.rebuild to sidebar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;reference-sidebar&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;span class=&amp;quot;editlink&amp;quot;&amp;gt;&amp;amp;#91;[{{SERVER}}{{localurl:Template:Lua Functions|action=edit}} edit]&amp;amp;#93;&amp;lt;/span&amp;gt;'''Lua Functions'''&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth''&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.as_text|wesnoth.as_text]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.colors|wesnoth.colors]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.compile_formula|wesnoth.compile_formula]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.current|wesnoth.current]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.current_version|wesnoth.current_version]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.custom_synced_commands|wesnoth.custom_synced_commands]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.deprecate_api|wesnoth.deprecate_api]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.deprecated_message|wesnoth.deprecated_message]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.dofile|wesnoth.dofile]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.effects|wesnoth.effects]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.eval_formula|wesnoth.eval_formula]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.game_config|wesnoth.game_config]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.get_language|wesnoth.get_language]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.log|wesnoth.log]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.micro_ais|wesnoth.micro_ais]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.ms_since_init|wesnoth.ms_since_init]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.name_generator|wesnoth.name_generator]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.named_tuple|wesnoth.named_tuple]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.persistent_tags|wesnoth.persistent_tags]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.print_attributes|wesnoth.print_attributes]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.races|wesnoth.races]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.require|wesnoth.require]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.scenario|wesnoth.scenario]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.simulate_combat|wesnoth.simulate_combat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.terrain_types|wesnoth.terrain_types]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.textdomain|wesnoth.textdomain]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.type|wesnoth.type]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.unit_types|wesnoth.unit_types]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.version|wesnoth.version]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.wml_actions|wesnoth.wml_actions]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth#wesnoth.wml_conditionals|wesnoth.wml_conditionals]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.achievements''&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.get|wesnoth.achievements.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.has|wesnoth.achievements.has]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.has_sub_achievement|wesnoth.achievements.has_sub_achievement]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.progress|wesnoth.achievements.progress]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.set|wesnoth.achievements.set]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/achievements#wesnoth.achievements.set_sub_achievement|wesnoth.achievements.set_sub_achievement]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.audio''&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list|wesnoth.audio.music_list]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.add|wesnoth.audio.music_list.add]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.all|wesnoth.audio.music_list.all]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.clear|wesnoth.audio.music_list.clear]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.current|wesnoth.audio.music_list.current]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.next|wesnoth.audio.music_list.next]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.play|wesnoth.audio.music_list.play]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.previous|wesnoth.audio.music_list.previous]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.remove|wesnoth.audio.music_list.remove]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.music_list.volume|wesnoth.audio.music_list.volume]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.play|wesnoth.audio.play]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.sources|wesnoth.audio.sources]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/audio#wesnoth.audio.volume|wesnoth.audio.volume]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.game_events''&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.add|wesnoth.game_events.add]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.add_menu|wesnoth.game_events.add_menu]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.add_repeating|wesnoth.game_events.add_repeating]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.add_wml|wesnoth.game_events.add_wml]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.fire|wesnoth.game_events.fire]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.fire_by_id|wesnoth.game_events.fire_by_id]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_event|wesnoth.game_events.on_event]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_load|wesnoth.game_events.on_load]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_mouse_action|wesnoth.game_events.on_mouse_action]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_mouse_button|wesnoth.game_events.on_mouse_button]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_mouse_move|wesnoth.game_events.on_mouse_move]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.on_save|wesnoth.game_events.on_save]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/game_events#wesnoth.game_events.remove|wesnoth.game_events.remove]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.interface''&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.add_chat_message|wesnoth.interface.add_chat_message]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.add_hex_overlay|wesnoth.interface.add_hex_overlay]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.add_item_halo|wesnoth.interface.add_item_halo]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.add_item_image|wesnoth.interface.add_item_image]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.add_overlay_text|wesnoth.interface.add_overlay_text]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.allow_end_turn|wesnoth.interface.allow_end_turn]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.clear_chat_messages|wesnoth.interface.clear_chat_messages]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.color_adjust|wesnoth.interface.color_adjust]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.delay|wesnoth.interface.delay]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.deselect_hex|wesnoth.interface.deselect_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.end_turn|wesnoth.interface.end_turn]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.float_label|wesnoth.interface.float_label]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.get_displayed_unit|wesnoth.interface.get_displayed_unit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.get_hovered_hex|wesnoth.interface.get_hovered_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.get_items|wesnoth.interface.get_items]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.get_selected_hex|wesnoth.interface.get_selected_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.get_viewing_side|wesnoth.interface.get_viewing_side]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.handle_user_interact|wesnoth.interface.handle_user_interact]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.highlight_hex|wesnoth.interface.highlight_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.is_locked|wesnoth.interface.is_locked]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.is_skipping_messages|wesnoth.interface.is_skipping_messages]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.lock|wesnoth.interface.lock]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.remove_hex_overlay|wesnoth.interface.remove_hex_overlay]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.remove_item|wesnoth.interface.remove_item]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.scroll|wesnoth.interface.scroll]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.scroll_to_hex|wesnoth.interface.scroll_to_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.select_unit|wesnoth.interface.select_unit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.skip_messages|wesnoth.interface.skip_messages]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/interface#wesnoth.interface.zoom|wesnoth.interface.zoom]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.map''&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.add_label|wesnoth.map.add_label]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.are_hexes_adjacent|wesnoth.map.are_hexes_adjacent]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.create|wesnoth.map.create]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.distance_between|wesnoth.map.distance_between]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.find|wesnoth.map.find]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.generate|wesnoth.map.generate]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.generate_height_map|wesnoth.map.generate_height_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get|wesnoth.map.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_adjacent_hexes|wesnoth.map.get_adjacent_hexes]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_area|wesnoth.map.get_area]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_direction|wesnoth.map.get_direction]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_hexes_in_radius|wesnoth.map.get_hexes_in_radius]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_label|wesnoth.map.get_label]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_owner|wesnoth.map.get_owner]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.get_relative_dir|wesnoth.map.get_relative_dir]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.iter|wesnoth.map.iter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.make_bitmap|wesnoth.map.make_bitmap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.matches|wesnoth.map.matches]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.on_board|wesnoth.map.on_board]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.on_border|wesnoth.map.on_border]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.parse_bitmap|wesnoth.map.parse_bitmap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.place_area|wesnoth.map.place_area]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.read_location|wesnoth.map.read_location]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.remove_area|wesnoth.map.remove_area]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.remove_label|wesnoth.map.remove_label]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.rotate_right_around_center|wesnoth.map.rotate_right_around_center]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.set_owner|wesnoth.map.set_owner]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.split_terrain_code|wesnoth.map.split_terrain_code]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/map#wesnoth.map.terrain_mask|wesnoth.map.terrain_mask]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.paths''&lt;br /&gt;
[[LuaAPI/wesnoth/paths#wesnoth.paths.find_cost_map|wesnoth.paths.find_cost_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/paths#wesnoth.paths.find_path|wesnoth.paths.find_path]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/paths#wesnoth.paths.find_reach|wesnoth.paths.find_reach]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/paths#wesnoth.paths.find_vacant_hex|wesnoth.paths.find_vacant_hex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/paths#wesnoth.paths.find_vision_range|wesnoth.paths.find_vision_range]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.schedule''&lt;br /&gt;
[[LuaAPI/wesnoth/schedule#wesnoth.schedule.get_illumination|wesnoth.schedule.get_illumination]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/schedule#wesnoth.schedule.get_time_of_day|wesnoth.schedule.get_time_of_day]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/schedule#wesnoth.schedule.replace|wesnoth.schedule.replace]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.sides''&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.add_ai_component|wesnoth.sides.add_ai_component]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.append_ai|wesnoth.sides.append_ai]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.change_ai_component|wesnoth.sides.change_ai_component]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.create|wesnoth.sides.create]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.debug_ai|wesnoth.sides.debug_ai]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.delete_ai_component|wesnoth.sides.delete_ai_component]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.find|wesnoth.sides.find]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.get|wesnoth.sides.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.is_enemy|wesnoth.sides.is_enemy]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.is_fogged|wesnoth.sides.is_fogged]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.is_shrouded|wesnoth.sides.is_shrouded]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.iter|wesnoth.sides.iter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.matches|wesnoth.sides.matches]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.override_shroud|wesnoth.sides.override_shroud]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.place_fog|wesnoth.sides.place_fog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.place_shroud|wesnoth.sides.place_shroud]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.remove_fog|wesnoth.sides.remove_fog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.remove_shroud|wesnoth.sides.remove_shroud]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.set_id|wesnoth.sides.set_id]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sides#wesnoth.sides.switch_ai|wesnoth.sides.switch_ai]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.sync''&lt;br /&gt;
[[LuaAPI/wesnoth/sync#wesnoth.sync.evaluate_multiple|wesnoth.sync.evaluate_multiple]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sync#wesnoth.sync.evaluate_single|wesnoth.sync.evaluate_single]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sync#wesnoth.sync.invoke_command|wesnoth.sync.invoke_command]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/sync#wesnoth.sync.run_unsynced|wesnoth.sync.run_unsynced]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wesnoth.units''&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.resistance_against|wesnoth.units.resistance_against]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.ability|wesnoth.units.ability]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.add_modification|wesnoth.units.add_modification]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.advance|wesnoth.units.advance]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.chance_to_be_hit|wesnoth.units.chance_to_be_hit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.clone|wesnoth.units.clone]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.create|wesnoth.units.create]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.create_animator|wesnoth.units.create_animator]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.defense_on|wesnoth.units.defense_on]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.erase|wesnoth.units.erase]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.extract|wesnoth.units.extract]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.find|wesnoth.units.find]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.find_attack|wesnoth.units.find_attack]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.find_on_map|wesnoth.units.find_on_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.find_on_recall|wesnoth.units.find_on_recall]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.get|wesnoth.units.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.get_hovered|wesnoth.units.get_hovered]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.jamming_on|wesnoth.units.jamming_on]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.matches|wesnoth.units.matches]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.movement_on|wesnoth.units.movement_on]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.rebuild|wesnoth.units.rebuild]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.remove_modifications|wesnoth.units.remove_modifications]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.scroll_to|wesnoth.units.scroll_to]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.select|wesnoth.units.select]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.to_map|wesnoth.units.to_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.to_recall|wesnoth.units.to_recall]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.transform|wesnoth.units.transform]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wesnoth/units#wesnoth.units.vision_on|wesnoth.units.vision_on]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''ai''&lt;br /&gt;
[[LuaAPI/ai#ai.aspects|ai.aspects]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.attack|ai.attack]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.check_attack|ai.check_attack]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.check_move|ai.check_move]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.check_recall|ai.check_recall]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.check_recruit|ai.check_recruit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.check_stopunit|ai.check_stopunit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.fallback_human|ai.fallback_human]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.get_attacks|ai.get_attacks]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.get_targets|ai.get_targets]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.move|ai.move]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.move_full|ai.move_full]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.read_only|ai.read_only]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.recall|ai.recall]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.recruit|ai.recruit]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.side|ai.side]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.stopunit_all|ai.stopunit_all]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.stopunit_attacks|ai.stopunit_attacks]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.stopunit_moves|ai.stopunit_moves]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/ai#ai.suitable_keep|ai.suitable_keep]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''filesystem''&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.canonical_path|filesystem.canonical_path]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.have_asset|filesystem.have_asset]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.have_file|filesystem.have_file]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.image_size|filesystem.image_size]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.read_file|filesystem.read_file]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/filesystem#filesystem.resolve_asset|filesystem.resolve_asset]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''functional''&lt;br /&gt;
[[LuaAPI/functional#functional.choose|functional.choose]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.choose_map|functional.choose_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.filter|functional.filter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.filter_map|functional.filter_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.find|functional.find]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.find_map|functional.find_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.map|functional.map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.map_array|functional.map_array]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.reduce|functional.reduce]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.take_while|functional.take_while]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/functional#functional.zip|functional.zip]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''gui''&lt;br /&gt;
[[LuaAPI/gui#gui.add_widget_definition|gui.add_widget_definition]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.get_user_choice|gui.get_user_choice]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_dialog|gui.show_dialog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_help|gui.show_help]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_inspector|gui.show_inspector]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_lua_console|gui.show_lua_console]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_menu|gui.show_menu]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_narration|gui.show_narration]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_popup|gui.show_popup]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_prompt|gui.show_prompt]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_recruit_dialog|gui.show_recruit_dialog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_recall_dialog|gui.show_recall_dialog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.show_story|gui.show_story]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.switch_theme|gui.switch_theme]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/gui#gui.widget|gui.widget]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''location_set''&lt;br /&gt;
[[LuaAPI/location_set#location_set.clear|location_set.clear]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.clone|location_set.clone]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.create|location_set.create]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.diff|location_set.diff]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.empty|location_set.empty]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.filter|location_set.filter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.get|location_set.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.insert|location_set.insert]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.inter|location_set.inter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.inter_merge|location_set.inter_merge]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.invert|location_set.invert]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.iter|location_set.iter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_map|location_set.of_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_pairs|location_set.of_pairs]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_raw|location_set.of_raw]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_shroud_data|location_set.of_shroud_data]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_triples|location_set.of_triples]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.of_wml_var|location_set.of_wml_var]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.random|location_set.random]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.remove|location_set.remove]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.size|location_set.size]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.stable_iter|location_set.stable_iter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.symm|location_set.symm]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_map|location_set.to_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_pairs|location_set.to_pairs]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_shroud_data|location_set.to_shroud_data]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_stable_pairs|location_set.to_stable_pairs]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_triples|location_set.to_triples]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.to_wml_var|location_set.to_wml_var]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.union|location_set.union]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/location_set#location_set.union_merge|location_set.union_merge]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''mathx''&lt;br /&gt;
[[LuaAPI/mathx#mathx.clamp|mathx.clamp]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/mathx#mathx.lerp|mathx.lerp]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/mathx#mathx.random|mathx.random]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/mathx#mathx.random_choice|mathx.random_choice]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/mathx#mathx.round|mathx.round]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/mathx#mathx.shuffle|mathx.shuffle]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''stringx''&lt;br /&gt;
[[LuaAPI/stringx#stringx.anim_split|stringx.anim_split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.escaped_split|stringx.escaped_split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.format_conjunct_list|stringx.format_conjunct_list]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.format_disjunct_list|stringx.format_disjunct_list]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.iter_range|stringx.iter_range]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.iter_ranges|stringx.iter_ranges]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.join|stringx.join]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.join_map|stringx.join_map]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.map_split|stringx.map_split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.parenthetical_split|stringx.parenthetical_split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.parse_range|stringx.parse_range]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.quoted_split|stringx.quoted_split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.split|stringx.split]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.trim|stringx.trim]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/stringx#stringx.vformat|stringx.vformat]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''unit_test''&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert|unit_test.assert]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_approx_equal|unit_test.assert_approx_equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_contains|unit_test.assert_contains]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_equal|unit_test.assert_equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_greater|unit_test.assert_greater]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_greater_equal|unit_test.assert_greater_equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_in_range|unit_test.assert_in_range]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_less|unit_test.assert_less]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_less_equal|unit_test.assert_less_equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_not_equal|unit_test.assert_not_equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_nothrow|unit_test.assert_nothrow]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_throws|unit_test.assert_throws]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.assert_throws_with|unit_test.assert_throws_with]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.fail|unit_test.fail]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.finish|unit_test.finish]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.fire_wml_menu_item|unit_test.fire_wml_menu_item]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.log|unit_test.log]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.succeed|unit_test.succeed]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/unit_test#unit_test.tostring|unit_test.tostring]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wml''&lt;br /&gt;
[[LuaAPI/wml#wml.all_variables|wml.all_variables]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.array_access.get|wml.array_access.get]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.array_access.get_proxy|wml.array_access.get_proxy]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.array_access.set|wml.array_access.set]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.array_variables|wml.array_variables]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.attribute_count|wml.attribute_count]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.child_array|wml.child_array]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.child_count|wml.child_count]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.child_range|wml.child_range]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.clone|wml.clone]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.diff|wml.diff]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.equal|wml.equal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.error|wml.error]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.eval_conditional|wml.eval_conditional]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.find_child|wml.find_child]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.fire|wml.fire]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.get_child|wml.get_child]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.get_nth_child|wml.get_nth_child]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.interpolate|wml.interpolate]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.literal|wml.literal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.load|wml.load]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.matches_filter|wml.matches_filter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.merge|wml.merge]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.parse|wml.parse]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.parsed|wml.parsed]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.patch|wml.patch]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.remove_child|wml.remove_child]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.remove_children|wml.remove_children]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.shallow_literal|wml.shallow_literal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.shallow_parsed|wml.shallow_parsed]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.tag|wml.tag]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.tostring|wml.tostring]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.tovconfig|wml.tovconfig]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.valid|wml.valid]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.variables|wml.variables]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml#wml.variables_proxy|wml.variables_proxy]]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|''wml-utils''&lt;br /&gt;
[[LuaAPI/wml-utils#utils.check_key|utils.check_key]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.get_sides|utils.get_sides]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.handle_event_commands|utils.handle_event_commands]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.optional_side_filter|utils.optional_side_filter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.scoped_var|utils.scoped_var]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.set_exiting|utils.set_exiting]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[LuaAPI/wml-utils#utils.vwriter|utils.vwriter]]&amp;lt;br&amp;gt;&lt;br /&gt;
|}&amp;lt;includeonly&amp;gt;[[Category:Lua Reference]]&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;A box with all the Lua functions, each one linking to the page and section they are described in. It was generated using [[/Updating|this method]]. This box should be included in [[LuaAPI|Lua reference]] page.&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SingleUnitWML&amp;diff=74241</id>
		<title>SingleUnitWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SingleUnitWML&amp;diff=74241"/>
		<updated>2025-03-27T10:25:23Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* Unit Data */ Rewrite some confusing wording surrounding [modifications] [advancement]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
The '''[unit]''' tag describes a single unit on the map or in memory, for example Konrad.&lt;br /&gt;
It is different from the '''[unit_type]''' in '''[units]''', which describes a class of units. However it takes many of the same keys and thus can generally override the inherited properties from the associated '''[unit_type]'''.&lt;br /&gt;
&lt;br /&gt;
'''[unit]''' can be used inside '''[side]''' ([[SideWML]]) for units present at start of the scenario, or as [[DirectActionsWML]] for units created during the game. (It is also used in save-files.)&lt;br /&gt;
&lt;br /&gt;
This contains keys and tags which describe the unit's [[#Unit Data|persistent data]], as well as certain [[#Unit State|state variables]] which will also persist with the unit but will change frequently as gameplay progresses. Finally, there are some keys to set certain [[#Creation Options|one-time options]] for how the unit will be initially created, which will ''not'' persist beyond initial creation.&lt;br /&gt;
&lt;br /&gt;
== Unit Data ==&lt;br /&gt;
The following keys and tags describe the unit itself, and will persist with the unit (though some may change automatically when the unit advances):&lt;br /&gt;
* {{anchor|type|'''type'''}}: the ID of the unit's unit type. This key is mandatory. See [[UnitTypeWML]].&lt;br /&gt;
&lt;br /&gt;
* {{anchor|language_name|'''language_name'''}}: the name of the unit's unit type. See [[UnitTypeWML]].&lt;br /&gt;
&lt;br /&gt;
* '''variation''': the [variation] of the [unit_type] as which the unit will appear.&lt;br /&gt;
&lt;br /&gt;
* '''parent_type''': overrides '''type''' if this is present. This is likely of little use to WML authors; it is automatically generated when needed by the game (to keep track of some [unit_type][variation]s).&lt;br /&gt;
&lt;br /&gt;
* '''side''': the side that the unit is on. It has to be an existing side, even if the unit is created in a variable. Defaults to 1, except when the [unit] tag appears inside a [side], in which case the unit always belongs to that side, and this key is ignored.&lt;br /&gt;
&lt;br /&gt;
* '''id''': a unique identifier for the unit. This is (usually) not displayed to the player, but is to be used only for identifying and filtering units. If not specified, a random one will be generated for the unit to ensure that each unit has a unique '''id''' attribute (as will happen when a unit is recruited normally). In older versions, the '''description''' attribute specified a unique ID. (The one instance when an id is displayed to the player is when the leader's id is used as the default for a [[SideWML|side]]'s '''current_player''' attribute.) Note: While it IS technically possible to create multiple units with the same ID, doing so may produce unpredictable results in many cases. WML should therefore be structured in such a way that no two units in existence ever end up with the same ID.&lt;br /&gt;
&lt;br /&gt;
* '''gender''': can be set to male or female to designate the gender of the unit. Default is male (unless [[#random_gender|'''random_gender''']] is set to &amp;quot;yes&amp;quot;), but if the unit has only a female variant it will be female.&lt;br /&gt;
&lt;br /&gt;
* '''name''': the user-visible name of the unit. Note that the player may use the &amp;quot;rename unit&amp;quot; action to change this (unless '''unrenamable''' is also set). Although this is a translated string, see [[GettextForWesnothDevelopers#Proper_nouns_in_strings|proper nouns in strings]] before using it in a translatable string.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span id=&amp;quot;unrenamable&amp;quot;&amp;gt;'''unrenamable'''&amp;lt;/span&amp;gt;: if 'yes', the user-visible name of the unit cannot be changed by the player (which is only possible when the unit is on the player's side anyway).&lt;br /&gt;
&lt;br /&gt;
* '''canrecruit''': a special key for leaders.&lt;br /&gt;
** '''no''': default. Unit cannot recruit.&lt;br /&gt;
** '''yes''': unit can recruit.&lt;br /&gt;
: Normally when a team controls no units with '''canrecruit=yes''', that team loses. However, even if your team has lost you continue to play with whatever units you still have until the scenario is over. Usually scenarios end when only one team is left with a leader that can recruit, but special victory conditions can be set up in campaigns. Normally you want to set the leader of a side with '''canrecruit=yes'''. If you don't want the leader to recruit, it is usually better to just not give him any unit types to recruit, than to make a special victory condition. Units with '''canrecruit=yes''' are exempt from upkeep costs. So that leaders do not need to be given the ''loyal'' trait.&lt;br /&gt;
: More than one unit with '''canrecruit=yes''' for the same side (see [[SideWML]]) are allowed in single player, if the side is human-controlled.&lt;br /&gt;
&lt;br /&gt;
* '''extra_recruit''': a list of unit types which this unit can recruit in addition to the ones given by its [side]recruit= (only relevant for units with '''canrecruit=yes''').&lt;br /&gt;
&lt;br /&gt;
* {{anchor|filter_recall|'''[filter_recall]'''}}: A leader can only recall those units which pass the SUF. (Meaningful only if canrecruit=yes.)&lt;br /&gt;
**'''[[StandardUnitFilter]]''' tags and keys&lt;br /&gt;
&lt;br /&gt;
* '''level''': the unit's current level. Defaults to the level of the [unit_type] described by [[#type|'''type''']]. This is generally not set manually.&lt;br /&gt;
&lt;br /&gt;
* '''upkeep''': the amount of upkeep the unit will require each turn.&lt;br /&gt;
** '''loyal''': no upkeep cost. Can be changed by the effect 'loyal' (see [[EffectWML]])&lt;br /&gt;
** '''free''': synonymous with &amp;quot;loyal&amp;quot;.&lt;br /&gt;
** '''full''': unit costs ''level'' upkeep (see [[UnitTypeWML]]).&lt;br /&gt;
** An integer can be used to set the upkeep cost to that number.&lt;br /&gt;
** The default is &amp;quot;full&amp;quot;.&lt;br /&gt;
** Leaders (units with '''canrecruit=yes''') never pay upkeep no matter what upkeep is set to.&lt;br /&gt;
** Normally you don't want to muck with this value. If you want to give a side units without upkeep costs, give those units the 'loyal' trait.&lt;br /&gt;
&lt;br /&gt;
* {{DevFeature1.13|0}} '''recall_cost''': the recall cost of this unit. Overrides the values specified by the unit's type ([[UnitTypeWML|[unit_type]]]), its side ([[SideWML|[side]]]), and the global [[GameConfigWML|[game_config]]] value. A value of -1 is equivalent to not specifying this attribute. {{DevFeature1.15|0}} Units are now recalled for AI sides even if the recall_cost is larger than the unit's worth (essentially its cost, plus potentially a bonus for experience points). In 1.14 and earlier, units were not recalled by the AI in this case even if this was the only recall/recruit action possible to the AI.&lt;br /&gt;
&lt;br /&gt;
* '''overlays''': a comma-separated list of images that are overlayed on the unit.&lt;br /&gt;
** {{DevFeature1.15|0}} This key is supported when creating a unit from WML, but will be empty when writing the unit back to WML; the overlays will instead be stored as [modifications].&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span id=&amp;quot;max_hitpoints&amp;quot;&amp;gt;'''max_hitpoints'''&amp;lt;/span&amp;gt;: The maximum hitpoints the unit has when at full health. Default is the max HP set for the [unit_type] described by [[#type|'''type''']].&lt;br /&gt;
&lt;br /&gt;
* '''max_experience''': The experience the unit needs to advance. Default is the experience required for the [unit_type] described by [[#type|'''type''']].&lt;br /&gt;
&lt;br /&gt;
* {{anchor|max_moves|'''max_moves'''}}: The maximum number of movement points the unit has. Default is the number of movement specified for the [unit_type] described by [[#type|'''type''']].&lt;br /&gt;
&lt;br /&gt;
* '''vision''': The the number of vision points to calculate the unit's sight range. Default is the number of vision points specified for the [unit_type] described by [[#type|'''type''']].&lt;br /&gt;
&lt;br /&gt;
* '''jamming''': {{DevFeature1.15|0}} The number of jamming points for the unit. Default is the number of jamming points specified for the [unit_type] described by [[#type|'''type''']].&lt;br /&gt;
&lt;br /&gt;
* '''flying''': 'yes' if the unit's [[UnitsWML#.5Bmovetype.5D|movetype]] has flying=yes. For units that don't fly, the '''flying''' attribute is generally omitted rather than being recorded as 'no'. In SingleUnitWML, this attribute has been called '''flying''' since it was added in 1.11.2, it was never called 'flies'.&lt;br /&gt;
&lt;br /&gt;
* {{anchor|max_attacks|'''max_attacks'''}}: The number of attacks the unit can have per turn. Default is the number of attacks specified for the [unit_type] described by [[#type|'''type''']].&lt;br /&gt;
&lt;br /&gt;
* '''profile''': sets a portrait image for this unit. Default is the portrait image set for the [unit_type] described by [[#type|'''type''']]. When the unit advances, if the value of profile is different from the unit-type portrait, that value is preserved. If the profile field is empty or the same as the unit-type portrait, the level-advance changes the unit portrait to the default for the new level and type. See [[UnitTypeWML]] for the rules used for locating files.&lt;br /&gt;
** If &amp;quot;unit_image&amp;quot; is given instead of a filename, uses the unit's base image as the portrait (in the same manner that unit types without portraits do by default).&lt;br /&gt;
** If &amp;quot;none&amp;quot; is given instead of a filename, no image will be displayed.&lt;br /&gt;
&lt;br /&gt;
* '''small_profile''': sets a small portrait image for this unit. See the '''profile''' attribute above for advancement and special values. As with [[UnitTypeWML]], the location heuristic of the '''profile''' attribute is disabled when the '''small_profile''' attribute is provided.&lt;br /&gt;
&lt;br /&gt;
* '''role''': used in standard unit filter ([[FilterWML]]). Can be set using [role] (see [[InternalActionsWML]]).&lt;br /&gt;
&lt;br /&gt;
* '''dismissable''': {{DevFeature1.19|9}} If 'no', unit cannot be dismissed from the recall list using the ''Dismiss'' button in Unit Recall dialog. Default: 'yes'.&lt;br /&gt;
&lt;br /&gt;
* '''block_dismiss_message''': {{DevFeature1.19|9}} Sets the message to be shown when ''dismissable'' is ''no'' and the user presses the  ''Dismiss'' button in Unit Recall dialog. If not set, a default message will be shown instead.&lt;br /&gt;
&lt;br /&gt;
* {{anchor|variables|'''[variables]'''}}: a set of variables that will be stored when this unit is stored (See [store_unit], [[InternalActionsWML]]). The attribute '''variable'''='''value''' means that when the unit is stored in the array ''unit'', the variable '''unit'''.variables.''variable'' will have the value ''value'' (See [[VariablesWML]]). The subnode '''mods''' is special as it is deleted on every unit rebuild (for example when the unit advances or when an [object] is removed). This makes it possible to implement [effect]s that change variables, as those will also be reapplied whenever the unit is reset. (so in particular if your effect changes the variables mods.&amp;lt;whatever&amp;gt; [remove_object] will work properly for those objects.) For example the following code will define a apply_to=moves_on_recruits effect that gives units with that effect full movement when recruited&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='lua'&amp;gt;&lt;br /&gt;
function wesnoth.effects.move_on_recruit(u, cfg)&lt;br /&gt;
	-- maybe better use a status than a variable ?&lt;br /&gt;
	u.variables[&amp;quot;mods.move_on_recruit&amp;quot;] = true&lt;br /&gt;
end&lt;br /&gt;
on_event(&amp;quot;recruit,recall&amp;quot;, function(ec)&lt;br /&gt;
	local unit = wesnoth.get_unit(ec.x1, ec.y1)&lt;br /&gt;
	if unit and unit.variables[&amp;quot;mods.move_on_recruit&amp;quot;] then&lt;br /&gt;
		unit.attacks_left = 1&lt;br /&gt;
		unit.moves = unit.max_moves&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
And since we used the mods subtable, [remove_object] will work properly for objects that give this effect.&lt;br /&gt;
&lt;br /&gt;
* {{anchor|modifications|'''[modifications]'''}}: a collection of tags describing changes that have been made to the unit. Any number and combination of tags of each type may be specified.&lt;br /&gt;
** '''[trait]''': a trait the unit has. Same format as [[UnitsWML#.5Btrait.5D|[trait], UnitsWML]].&lt;br /&gt;
** '''[object]''': an object the unit has. Same format as [[DirectActionsWML#.5Bobject.5D|[object], DirectActionsWML]].&lt;br /&gt;
** '''[advancement]''': an advancement (AMLA) that has been applied to the unit. Same format as [[UnitTypeWML#After max level advancement (AMLA)|[advancement], UnitTypeWML]]. These are automatically added when the player confirms an AMLA in the Advance Unit dialog, but they can also be specified manually to indicate that the unit already has a particular advancement applied; by providing only an advancement ID with no effects, it is even possible to disable a future advancement. {{DevFeature1.13|2}} In versions prior to 1.13.2, this tag was named [advance].&lt;br /&gt;
&lt;br /&gt;
* '''[event]''' The event is copied from this unit's WML description into the scenario. The event is carried along with the unit (even during advancement) and inserted into a scenario whenever this unit is first included. A [unit][event] requires a non-empty id= attribute.&lt;br /&gt;
&lt;br /&gt;
* '''description''': overrides the unit type description for this unit. Note that this will be reset when the unit advances. To avoid this, one can either set up a ''post_advance'' [[EventWML|event]] to override the default description after promotion, or use an [object] with a profile [[EffectWML|effect]] to change the unit description.&lt;br /&gt;
&lt;br /&gt;
* '''[special_note]''' {{DevFeature1.15|2}} see [[UnitTypeWML#Special_Notes]].&lt;br /&gt;
&lt;br /&gt;
* '''ai_special''': causes the unit to act differently&lt;br /&gt;
** &amp;quot;guardian&amp;quot; the unit will not move, except to attack something in the turn it moves (so, it only can move if an enemy unit gets within range of it). Does the same as '''[status] guardian = 'yes''''.&lt;br /&gt;
&lt;br /&gt;
* {{anchor|ai|'''[ai]'''}}: This affects how the computer will control this unit (currently only used by [[FormulaAI]]).&lt;br /&gt;
** '''formula''': if set, the unit will execute this code during the &amp;quot;unit_formulas&amp;quot; stage, assuming that the &amp;quot;unit_formulas&amp;quot; stage has been enabled for this side&lt;br /&gt;
** '''priority''', '''loop_formula''', '''[vars]''': see the [[FormulaAI]] documentation for details&lt;br /&gt;
** {{DevFeature1.15|?}} '''[candidate_action]''': Add a candidate action that only applies to this unit; see [[Wesnoth_AI_Framework#The_.5Bcandidate_action.5D_Tag|here]] for details. The [filter_own] tag is not supported.&lt;br /&gt;
*** '''stage''': If specified, the candidate action is added to the stage with the given ID, instead of the default stage (which is main_loop).&lt;br /&gt;
** {{DevFeature1.15|?}} '''[micro_ai]''': Add a micro AI that only applies to this unit; see [[Micro AIs]] for details. This tag does not support side, action, or [filter].&lt;br /&gt;
&lt;br /&gt;
* '''traits_description''': the description of the unit's traits which is displayed. However if it is not specified explicitly, the unit's actual traits' names will be used instead, so it is normally not necessary to set this.&lt;br /&gt;
&lt;br /&gt;
*'''alignment''': one of lawful/neutral/chaotic/liminal (See [[TimeWML]]). Default is the alignment of the [unit_type] described by [[#type|'''type''']]. This is generally not set manually.&lt;br /&gt;
&lt;br /&gt;
*'''advances_to''': comma-separated list of unit types to which this unit can advance. Will override the default provided by the [unit_type]. This is generally not set manually.&lt;br /&gt;
&lt;br /&gt;
*'''race''': See {{tag|UnitsWML|race}}. Will override the default provided by the [unit_type]. This is generally not set manually.&lt;br /&gt;
&lt;br /&gt;
*'''undead_variation''': Will override the default provided by the [unit_type]. This is generally not set manually.&lt;br /&gt;
&lt;br /&gt;
*'''usage''': Will override the default provided by the [unit_type]. This is generally not set manually.&lt;br /&gt;
&lt;br /&gt;
*'''zoc''': whether the unit has a zone of control. Will override the default provided by the [unit_type]. This is generally not set manually.&lt;br /&gt;
&lt;br /&gt;
*'''[movement_costs]''', '''[vision_costs]''', '''[defense]''', and '''[resistance]''': Can be used to modify [[UnitsWML#.5Bmovetype.5D|existing values]].&lt;br /&gt;
&lt;br /&gt;
*'''[attack]''': Takes the same syntax as [[UnitTypeWML#Attacks|[unit_type][attack]]]. By default, the attacks from the [unit_type] will be included. '''Note:''' using this tag will replace ''all'' [attack] tags with the new one.&lt;br /&gt;
&lt;br /&gt;
*'''hidden''': Implementation detail of [[InterfaceActionsWML#%5Bhide_unit%5D|[hide_unit]]]. This should not be set manually.&lt;br /&gt;
&lt;br /&gt;
== Unit State ==&lt;br /&gt;
The following keys and tags describe the current state of the unit, and will change regularly as gameplay progresses:&lt;br /&gt;
* '''x''', '''y''': the location of the unit. By default (unless modified by [[#placement|'''placement''']] below) if a location isn't provided and the side the unit will belong to has a recall list, the unit will be created on the recall list. The recall list can also be explicitly specified as the location with &amp;quot;recall,recall&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* '''location_id''': {{DevFeature1.13|8}} the location of the unit, referencing one of the special locations defined by the map. This overrides '''x''' and '''y''' if present but otherwise has the same effect and can be modified by the placement options.&lt;br /&gt;
&lt;br /&gt;
* '''facing''': which way the unit is facing (this only affects how the unit is displayed).&lt;br /&gt;
** Possible values are '''se''', '''s''', '''sw''', '''nw''', '''n''', '''ne'''. Note that some unit types may not have distinct animations for each direction.&lt;br /&gt;
&lt;br /&gt;
* '''goto_x''':, '''goto_y''': the unit's current movement destination. Default is 0,0 i.e. the unit is not on a course.&lt;br /&gt;
&lt;br /&gt;
* '''hitpoints''': the HP of the unit. Default [[#max_hitpoints|'''max_hitpoints''']].&lt;br /&gt;
&lt;br /&gt;
* '''experience''': the XP of the unit. Default is 0.&lt;br /&gt;
&lt;br /&gt;
* '''moves''': number of movement points the unit has left. Default is [[#max_moves|'''max_moves''']].&lt;br /&gt;
: '''Note:''' Do not assume that moves=max_moves on turns when the unit doesn't move. The wesnoth AIs sometimes manipulate the moves variable during its turn, for internal reasons.&lt;br /&gt;
&lt;br /&gt;
* '''resting''': whether the unit has not moved yet this turn. Used to decide whether to give the unit rest healing. Note that this can be true even if moves is not equal to max_moves.&lt;br /&gt;
&lt;br /&gt;
* '''attacks_left''': number of attacks the unit has left. Default is '''max_attacks'''.&lt;br /&gt;
&lt;br /&gt;
* {{anchor|status|'''[status]'''}}: the status of the unit. This affects different features of the unit, for example whether the unit loses health each turn. Default for all keys is 'no', but this can be changed by the scenario or by special abilities (see [[AbilitiesWML]]). The Status Table displays the status of each unit using the three images '''misc/poisoned.png''', '''misc/slowed.png''' and '''misc/petrified.png'''; other keys do not appear in the Status Table.&lt;br /&gt;
** '''poisoned''': if 'yes', the unit loses 8 HP each turn. See also ''heals'', ''cures'', [[AbilitiesWML]].&lt;br /&gt;
** '''slowed''': if 'yes', the unit has 50% of its normal movement and does half damage. When the controller of the unit's turn is over, '''slowed''' is set to 'no'. &lt;br /&gt;
** '''petrified''': if 'yes', the unit cannot move, attack, or be attacked.&lt;br /&gt;
** '''uncovered''': if 'yes', the unit has performed an action (e.g. attacking) that causes it to no longer be hidden until the next turn. For cutscenes, it may be useful to set this manually.&lt;br /&gt;
** '''guardian''': if 'yes', the unit will not move, except to attack something in the turn it moves (so, it only can move if an enemy unit gets within range of it). Does the same as '''ai_special = &amp;quot;guardian&amp;quot;'''.&lt;br /&gt;
** '''unhealable''': if set to 'yes', the unit cannot be healed through normal game mechanics. This includes the healing by resting. It does ''not'' prevent the unit from being healed by WML or Lua code.&lt;br /&gt;
** '''unpoisonable''':  if set to 'yes', the unit cannot be poisoned.&lt;br /&gt;
** '''undrainable''':  if set to 'yes', the attacker can't gain health with drain ability attacking this unit.&lt;br /&gt;
** '''unplagueable''': if set to 'yes', the unit cannot be affected by plague attack.&lt;br /&gt;
** '''not_living''': Deprecated, this is automatically set when all three above are set and vice versa.&lt;br /&gt;
** '''unslowable''': if set to 'yes', the unit cannot be slowed.&lt;br /&gt;
** '''unpetrifiable''': if set to 'yes', the unit cannot be petrified.&lt;br /&gt;
** '''invulnerable''': {{DevFeature1.13|6}} if 'yes', attacks can't hit the unit. The AI and the attack dialog take it into account.&lt;br /&gt;
** One can add other keys to [status], but they must have boolean values, and they will not do anything meaningful on their own (but can be checked from events and acted upon accordingly). For example, a scenario can set unit.status.''my_custom_key'' to 'yes' or 'no'.&lt;br /&gt;
&lt;br /&gt;
* '''invulnerable''': {{DevFeature1.13|6}} a shorthand to set the ''invulnerable'' status. Useful in [[CommandMode]] for debugging purposes. It's recommended to use [status] in written code instead.&lt;br /&gt;
&lt;br /&gt;
== Creation Options ==&lt;br /&gt;
In addition to the unit's persistent data itself, there are several options for controlling how the unit will be created, as follows:&lt;br /&gt;
* &amp;lt;span id=&amp;quot;placement&amp;quot;&amp;gt;'''placement'''&amp;lt;/span&amp;gt;: How the unit should be placed: can be one value or a comma-separated list of values. Default value is  'map,leader' for a leader given directly in [side], &amp;quot;&amp;quot; otherwise. By default, 'map,recall' is implicitly appended to the end of the list.&lt;br /&gt;
** '''map''': If x,y (or location_id) are explicitly given and point to a valid on-map location - try to place the unit at the nearest free location to there, never overwriting existing units. Successful if x,y (or location_id) are given and a valid on-map vacant location near it can be found.&lt;br /&gt;
** '''leader''': Try to place unit near the leader, if leader is not present or is in recall list - try to place unit near the start location for this side. Successful if a valid on-map vacant location can be found near leader or near start location.&lt;br /&gt;
** '''recall''': Place unit on recall list. Always successful. &lt;br /&gt;
** '''map_overwrite''': If x,y are explicitly given and point to a valid on-map location - try to place unit at this location, if there was a unit there - overwriting it, without firing events. {{DevFeature1.13|8}} Deprecated, use placement=map and overwrite=yes instead.&lt;br /&gt;
** '''map_passable''': If x,y are explicitly given and point to a valid on-map location - try to place unit at this location; if the hex is of an impassable terrain for the unit being placed, or is already occupied by another unit, the new unit will be placed in the nearest vacant hex. {{DevFeature1.13|8}} Deprecated, use placement=map and passable=yes instead.&lt;br /&gt;
** '''leader_passable''': Similar to &amp;quot;leader&amp;quot;, with the additional restriction that the selected location is not impassable for the unit being placed. {{DevFeature1.13|8}} Deprecated, use placement=leader and passable=yes instead.&lt;br /&gt;
* '''passable''': {{DevFeature1.13|8}} (default=no) If yes, and the specified location is of an impassable terrain for the unit being placed, the new unit will be placed in the nearest hex that is of a passable terrain for it.&lt;br /&gt;
* '''overwrite''': {{DevFeature1.13|8}} (default=no) If yes, always place the unit at the exact specified location, overwriting the existing unit if there is one. Generally you don't want to use this together with placement=leader.&lt;br /&gt;
&lt;br /&gt;
* '''generate_name''': (default=yes) will generate a new '''name''' if there isn't one specified for the unit, as if the unit were a freshly-recruited one.&lt;br /&gt;
* '''random_traits''': &amp;quot;no&amp;quot; will prevent random trait generation for units. You should only need to set this for placed nonleaders in multiplayer games or if you want to give the unit fewer traits than it would normally get for its unit type. When generating traits for a unit, first traits the unit has already been given are excluded. Then &amp;quot;musthave&amp;quot; traits (undead, mechanical) for the unit type are given. Then for leaders ('''canrecruit=yes''') traits that are not available to &amp;quot;any&amp;quot; (currently that's all of them to avoid a multiplayer OOS issue, but later will be restricted based on multiplayer play balance issues) are removed from consideration. Then traits are added randomly until the maximum allowed for the unit type is reached or there are no more available traits. Random traits can now be used in MP games but only when spawned in an event, so not for leaders and other units in the [side] definition.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span id=&amp;quot;random_gender&amp;quot;&amp;gt;'''random_gender'''&amp;lt;/span&amp;gt;: &amp;quot;yes&amp;quot; will cause the gender of the unit with male and female variations to be male 50% of the time, female 50% of the time.  If the unit has only one gender variant it will always be given the correct one.&lt;br /&gt;
&lt;br /&gt;
* '''to_variable''': (only for [event][unit]) creates the unit into the given variable instead of placing it on the map.&lt;br /&gt;
&lt;br /&gt;
* '''animate''': whether to display the recruitment animation for this unit as if it were being recruited/recalled. Defaults to &amp;quot;no&amp;quot;. Irrelevant when the [unit] tag appears inside a [side].&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[UnitTypeWML]]&lt;br /&gt;
* [[InternalActionsWMLUnitTags]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category:WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=LuaAPI/types/widget&amp;diff=74206</id>
		<title>LuaAPI/types/widget</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=LuaAPI/types/widget&amp;diff=74206"/>
		<updated>2025-03-14T08:00:54Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* on_link_click */ Fix vague DevFeature&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;tright&amp;quot;&amp;gt; __TOC__ &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''widget''' userdata offers access to a widget of a GUI2 dialog. While there is only one type of widget userdata that covers all widgets including the window itself, the properties of a widget userdata are different for each type of widget. Indexing a widget's userdata can either be used to access a child widget or to set or get a property of a widget. Some properties are read-only or write-only; the properties depend on the type of the widget.&lt;br /&gt;
&lt;br /&gt;
An example of accessing a child widget:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
function preshow(dialog)&lt;br /&gt;
  local okay_button = dialog.okay_button&lt;br /&gt;
  -- okay_button is now a handle to the the widget's child with the id 'okay_button' &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Widget Attributes ==&lt;br /&gt;
&lt;br /&gt;
=== selected ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''selected''' &amp;amp;harr; ''boolean''&lt;br /&gt;
* Available on: '''[toggle_button]''', '''[toggle_panel]'''&lt;br /&gt;
&lt;br /&gt;
Whether the item is selected or not. Note that this should only be used for widgets that have only 2 states. In particular, there exist 3-State toggle_buttons (for example in listbox headers). For those, selected_index must be used instead.&lt;br /&gt;
&lt;br /&gt;
=== selected_index ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''selected_index''' &amp;amp;harr; ''index''&lt;br /&gt;
* Available on: '''[listbox]''', '''[multi_page]''', '''[stacked_widget]''', '''[menu_button]''', '''[toggle_button]''', '''[toggle_panel]'''&lt;br /&gt;
&lt;br /&gt;
The selected index of the item. For '''[toggle_button]''' and '''[toggle_panel]''', this is the same as '''selected''' only encoded as a number (1 for false or 2 for true) instead of a boolean.&lt;br /&gt;
&lt;br /&gt;
For a  '''[listbox]'''with '''has_maximum=false''' and more than one item selected, reading '''selected_index''' will return the first selected index.&lt;br /&gt;
&lt;br /&gt;
For a '''[stacked_widget]''', only the layer specified by '''selected_index''' will be displayed and receive events (callbacks will only be triggered on the selected layer).&lt;br /&gt;
A '''selected_index''' of 0 represents all layers being selected, with events only being received by the layer with the highest index.  Note that term ''selected'' for the ''layer'' of a stacked_widget is not the same as the '''selected''' ''widget'' attribute.&lt;br /&gt;
&lt;br /&gt;
=== text ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''text''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[text_box]'''&lt;br /&gt;
&lt;br /&gt;
The text of the textbox.&lt;br /&gt;
&lt;br /&gt;
=== value ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''value''' &amp;amp;harr; ''position''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
&lt;br /&gt;
The current position of the slider.&lt;br /&gt;
&lt;br /&gt;
=== percentage ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''percentage''' &amp;amp;harr; ''position''&lt;br /&gt;
* Available on: '''[progress_bar]'''&lt;br /&gt;
&lt;br /&gt;
The current position of the progress bar, between 0 and 100.&lt;br /&gt;
&lt;br /&gt;
=== selected_item_path ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''selected_item_path''' &amp;amp;rarr; ''array of indices''&lt;br /&gt;
* Available on: '''[tree_view]'''&lt;br /&gt;
&lt;br /&gt;
A table describing the currently selected node. If for example, in the following treeview, Item 9 is selected, the result will be {2,1,3}.&lt;br /&gt;
&lt;br /&gt;
 +Section1&lt;br /&gt;
  +Subsection11&lt;br /&gt;
   *Item1&lt;br /&gt;
   *Item2&lt;br /&gt;
   *Item3&lt;br /&gt;
  +Subsection12&lt;br /&gt;
   *Item4&lt;br /&gt;
   *Item5&lt;br /&gt;
   *Item6&lt;br /&gt;
 +Section2&lt;br /&gt;
  +Subsection21&lt;br /&gt;
   *Item7&lt;br /&gt;
   *Item8&lt;br /&gt;
   *Item9&lt;br /&gt;
  +Subsection22&lt;br /&gt;
   *Item10&lt;br /&gt;
   *Item11&lt;br /&gt;
   *Item12&lt;br /&gt;
&lt;br /&gt;
=== path ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''path''' &amp;amp;rarr; ''array of indices''&lt;br /&gt;
* Available on: '''[tree_view_node]'''&lt;br /&gt;
&lt;br /&gt;
A table describing this node in the overall treeview. See [[#selected_item_path|selected_item_path]] for the meaning of the table..&lt;br /&gt;
&lt;br /&gt;
=== unfolded ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''unfolded''' &amp;amp;larr; ''boolean''&lt;br /&gt;
* Available on: '''[tree_view_node]'''&lt;br /&gt;
&lt;br /&gt;
Control whether a tree node is currently expanded or not.&lt;br /&gt;
&lt;br /&gt;
=== unit ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''unit''' &amp;amp;larr; ''unit or unit type''&lt;br /&gt;
* Available on: '''[unit_preview_pane]'''&lt;br /&gt;
&lt;br /&gt;
Change the displayed unit or unit type in the preview pane.&lt;br /&gt;
&lt;br /&gt;
=== item_count ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''item_count''' &amp;amp;rarr; ''number of items''&lt;br /&gt;
* Available on: '''[multi_page]''', '''[listbox]'''&lt;br /&gt;
&lt;br /&gt;
The number of items in the container widget.&lt;br /&gt;
&lt;br /&gt;
=== use_markup ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''use_markup''' &amp;amp;rarr; ''boolean''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]'''&lt;br /&gt;
&lt;br /&gt;
Sets whether the widget's label will parse [[Pango formatting]].&lt;br /&gt;
&lt;br /&gt;
=== label ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''label''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]''', '''[image]'''&lt;br /&gt;
&lt;br /&gt;
The widget's label. Technically this is a special string used in the widget's wml definition. It usually does what one would expect, but also sets the image for '''image''' widgets.  For '''[text_box]''', use '''text''' for initial values.&lt;br /&gt;
&lt;br /&gt;
=== marked_up_text ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''marked_up_text''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]'''&lt;br /&gt;
&lt;br /&gt;
Shortcut for setting label and use_markup=yes.&lt;br /&gt;
&lt;br /&gt;
=== enabled ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''enabled''' &amp;amp;larr; ''boolean''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
&lt;br /&gt;
=== tooltip ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''tooltip''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''visible''' &amp;amp;larr; ''visibility string''&lt;br /&gt;
* Available on: Most widgets&lt;br /&gt;
&lt;br /&gt;
Determines whether the widget is visible onscreen. The following visibility statuses are recognized:&lt;br /&gt;
{| clasS=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! String value !! Boolean shorthand !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| visible || true || The widget is visible and handles events.&lt;br /&gt;
|-&lt;br /&gt;
| hidden || || The widget is not visible, doesn't handle events, but still takes up space on the dialog grid.&lt;br /&gt;
|-&lt;br /&gt;
| invisible || false || The widget is not visible, doesn't handle events, and does not take up space on the dialog grid.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== type ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''type''' &amp;amp;rarr; ''string''&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
&lt;br /&gt;
Returns a string specifying the type of the widget.&lt;br /&gt;
&lt;br /&gt;
== Widget callbacks ==&lt;br /&gt;
&lt;br /&gt;
=== on_modified ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_modified''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: Most widgets, in particular '''[slider]''', '''[toggle_button]''', '''[listbox]''', '''[menu_button]''', '''[text_box]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user changes the value of the widget.&lt;br /&gt;
&lt;br /&gt;
=== on_left_click ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_left_click''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on the widget.&lt;br /&gt;
&lt;br /&gt;
=== on_button_click ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_button_click''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: '''[button]''', '''[repeating_button]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on the button. This can differ from '''on_left_click''', depending on the type of widget. For example, on a '''[repeating_button]''' it will fire multiple times if the user holds the mouse button down.&lt;br /&gt;
&lt;br /&gt;
=== on_link_click ===&lt;br /&gt;
{{DevFeature1.19|9}}&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_link_click''' &amp;amp;larr; '''function'''(''dest'')&lt;br /&gt;
* Available on: '''[rich_label]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on a '''&amp;lt;ref&amp;gt;''' link inside a '''[rich_label]'''. The first argument '''dest''' is the target of the link.&lt;br /&gt;
&lt;br /&gt;
== Widget methods ==&lt;br /&gt;
&lt;br /&gt;
Any function defined in the [[LuaAPI/gui/widget|gui.widget]] module and taking a widget as its first parameter can be called as a method of a widget. This includes any functions that are added to the module by user code. Note that these methods are available even if the widget itself doesn't support that function, so in some cases it may be necessary to check '''widget.type''' before calling the method.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=LuaAPI/gui&amp;diff=74174</id>
		<title>LuaAPI/gui</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=LuaAPI/gui&amp;diff=74174"/>
		<updated>2025-02-27T22:07:15Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: gui.show_recruit/recall_dialog are dev-only, fix template position in gui.switch_theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevFeature1.15|0}}&lt;br /&gt;
&lt;br /&gt;
== Submodules ==&lt;br /&gt;
=== gui.widget ===&lt;br /&gt;
&lt;br /&gt;
A [[LuaAPI/gui/widget|submodule]] containing functions for working with widgets in custom dialogs.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== gui.add_widget_definition ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.add_widget_definition'''(''widget_type'', ''definition_id'', ''wml_content'')&lt;br /&gt;
&lt;br /&gt;
Creates a new WML widget definition for the specified widget type, which can be referenced from dialog WML in the '''definition''' key.&lt;br /&gt;
&lt;br /&gt;
=== gui.get_user_choice ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.get_user_choice'''(''attributes'', ''options'')&lt;br /&gt;
&lt;br /&gt;
Shows a message dialog (like the one used by the &amp;lt;tt&amp;gt;[[InterfaceActionsWML#.5Bmessage.5D|[message]]]&amp;lt;/tt&amp;gt; tag) with a series of options and returns the index (1-based) of the chosen option, which can be stored as a Lua variable.&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANT NOTE: this function is broken in Wesnoth 1.16.0 and 1.16.1.''' If you wish to use it, you should also use wesnoth.current_version to check that your code is being run on Wesnoth 1.16.2 or higher. Alternatively, you may try using [[#gui.show_narration|gui.show_narration]] instead, which has a similar function but a wider range of features.&lt;br /&gt;
&lt;br /&gt;
The first argument is a table of attributes which are directly passed to the underlying &amp;lt;tt&amp;gt;[message]&amp;lt;/tt&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
The second argument is a table of options, which are used to construct a series of underlying &amp;lt;tt&amp;gt;[option]&amp;lt;/tt&amp;gt; tags. Most Lua data types are supported, but a few aren't:&lt;br /&gt;
* If the option is a ''table'' or a ''WML table'', these fields are supported:&lt;br /&gt;
** ''image'': icon shown in the first column;&lt;br /&gt;
** ''label'': text shown in the second column;&lt;br /&gt;
** ''description'': text shown in the third column (''message'' is also supported as an alias);&lt;br /&gt;
** ''default'': whether this is option is the one selected when the dialog is shown (boolean).&lt;br /&gt;
* If the option can be cast to a string (''strings'', ''translatable strings'', ''numbers'', ''booleans''), it is used for the content of the description field, which means that the first two columns will be empty.&lt;br /&gt;
* Otherwise, it raises an &amp;quot;invalid data type&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
Example taken from the test scenario (if not used in an event then change the speaker):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='lua'&amp;gt;&lt;br /&gt;
local result = gui.get_user_choice(&lt;br /&gt;
    { speaker = &amp;quot;unit&amp;quot;, message = &amp;quot;Pick your poison&amp;quot; },&lt;br /&gt;
    { { image = &amp;quot;items/potion-red.png&amp;quot;,&lt;br /&gt;
        label = &amp;quot;Something red&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Take a sip and enjoy&amp;quot; },&lt;br /&gt;
      { image = &amp;quot;items/potion-blue.png&amp;quot;,&lt;br /&gt;
        label = &amp;quot;Nice blue&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Surely you’ll like that one&amp;quot;,&lt;br /&gt;
        default = true },&lt;br /&gt;
      { image = &amp;quot;items/potion-yellow.png&amp;quot;,&lt;br /&gt;
        label = &amp;quot;&amp;lt;span color='yellow'&amp;gt;Oh noes yellow&amp;lt;/span&amp;gt;&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Oh I’m sure you’ll love that one&amp;quot; },&lt;br /&gt;
      { image = &amp;quot;scenery/well.png&amp;quot;,&lt;br /&gt;
        label = &amp;quot;A nice well&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Grab a bucket and fetch some water&amp;quot; },&lt;br /&gt;
      { image = &amp;quot;items/holy-water.png&amp;quot;,&lt;br /&gt;
        label = &amp;quot;Oh nice bottle&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Feel the divinity&amp;quot; },&lt;br /&gt;
      -- Should have an empty first column and a second column on two lines.&lt;br /&gt;
      { label = &amp;quot;Well a nice and black drink.\nToo dark too see?&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Take a sip and pass the bottle along&amp;quot; }&lt;br /&gt;
    })&lt;br /&gt;
wesnoth.interface.add_chat_message(string.format(&amp;quot;User selected choice %d.&amp;quot;, result))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== gui.show_dialog ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_dialog'''(''dialog definition'', ''preshow'', ''postshow'') &amp;amp;rarr; ''retval''&lt;br /&gt;
&lt;br /&gt;
Displays a dialog box described by a WML table and returns an integer&lt;br /&gt;
* if the dialog was dismissed by a button click, the integer value associated to the button via the '''return_value''' keyword.&lt;br /&gt;
* if the dialog was closed with the enter key, -1.&lt;br /&gt;
* if the dialog was closed with the escape key, -2.&lt;br /&gt;
&lt;br /&gt;
The dialog box is equivalent to the '''[resolution]''' section of a GUI window as described in [[GUIToolkitWML]] and must therefore contain at least the following children: '''[tooltip]''', '''[helptip]''', and '''[grid]'''. The [grid] must contain nested [row], [column] and [grid] tags which describe the layout of the window. (More information can be found in GUIToolkit page's [[GUIToolkit#Layout|Layout]] section and [[GUILayout]]; suffice to say that the basic structure is grid -&amp;gt; row -&amp;gt; column -&amp;gt; widget, where the widget is considered to be in a cell defined by the row and column of the grid. A list of widgets can be found at [[GUIWidgetInstanceWML]].) For an overview of the GUI system, see [[GUIToolkit]].&lt;br /&gt;
&lt;br /&gt;
Two optional functions can be passed as second and third arguments; the function passed as ''preshow'' argument is called just before the dialog is shown; the second function (argument ''postshow'') is called once the dialog is closed. These functions are helpful in setting the initial values of the fields and in recovering the final user values. These functions take a single parameter, which is the [[LuaAPI/types/widget|widget userdata]] representing the window.&lt;br /&gt;
&lt;br /&gt;
For in-game dialogs that offer the player a choice and/or can change the game state, this function should be called in conjunction with [[LuaAPI/wesnoth/sync#evaluate_single|wesnoth.sync.evaluate_single]], in order to ensure that only one client displays the dialog and that the other ones recover the same input values from this single client. Though this is especially important in multiplayer scenarios, failing to do it in a single-player scenario will cause the replay to break, so it should be done in either case.&lt;br /&gt;
&lt;br /&gt;
See [[LuaAPI/gui/example|here]] for a fully-working example of a custom dialog.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_help ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_help'''([''topic''])&lt;br /&gt;
&lt;br /&gt;
Show the in-game help, optionally opening a specified topic directly.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_inspector ===&lt;br /&gt;
&lt;br /&gt;
* {{LuaGameOnly}} '''gui.show_inspector'''()&lt;br /&gt;
&lt;br /&gt;
Show the gamestate inspector.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_lua_console ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_lua_console'''()&lt;br /&gt;
&lt;br /&gt;
Shows the Lua console. This works even if debug mode is not enabled.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== gui.show_menu ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_menu'''(''items'', [''initial''], [''markup'']) &amp;amp;rarr; ''index''&lt;br /&gt;
&lt;br /&gt;
Shows a popup menu onscreen at the current mouse location. This could be used for example to produce a sort of submenu in a &amp;lt;tt&amp;gt;[set_menu_item]&amp;lt;/tt&amp;gt;. The items are specified as a Lua array of tables, each of which supports the following keys:&lt;br /&gt;
&lt;br /&gt;
* ''icon'': An icon to display in the leftmost column of the menu.&lt;br /&gt;
* ''image'': An image to display in the main column of the menu. If this is present, ''label'' is ignored.&lt;br /&gt;
* ''label'': A label to display in the main column of the menu.&lt;br /&gt;
* ''details'': A secondary label to display in the right column of the menu.&lt;br /&gt;
* ''tooltip'': Text to display when mousing over this option.&lt;br /&gt;
&lt;br /&gt;
The ''initial'' argument must be a valid index into the ''items'' array, or 0 to indicate that no element is initially selected (which is the default but typically not what you want).&lt;br /&gt;
&lt;br /&gt;
The ''markup'' argument specifies whether Pango markup will be parsed in the menuitems. It defaults to false.&lt;br /&gt;
&lt;br /&gt;
The ''initial'' and ''markup'' arguments can be passed in either order; the game will understand which is meant based on the type of the argument.&lt;br /&gt;
&lt;br /&gt;
This function returns the index of the selected item. If the user cancelled by clicking outside the menu's boundary, 0 is returned.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_narration ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_narration'''(''attributes'', [''options'', [''text_input_attributes'']]) &amp;amp;rarr; ''result_code'', [''entered_text'']&lt;br /&gt;
&lt;br /&gt;
Shows a message dialog, of the type used by the &amp;lt;tt&amp;gt;[message]&amp;lt;/tt&amp;gt; ActionWML tag. Unlike the &amp;lt;tt&amp;gt;[message]&amp;lt;/tt&amp;gt; tag, this is unsynced; if you need it synced, you must do it yourself. The first argument is a table describing the dialog with the following keys:&lt;br /&gt;
&lt;br /&gt;
* ''title'' - The title to show on the message. For example, the speaker's name.&lt;br /&gt;
* ''message'' - The message content.&lt;br /&gt;
* ''portrait'' - An image to show along with the message. By default, no image is shown.&lt;br /&gt;
* ''left_side'' - The default is true; set to false to show the image on the right.&lt;br /&gt;
* ''mirror'' - If true, the image will be flipped horizontally.&lt;br /&gt;
&lt;br /&gt;
The second argument is a list of options as a Lua array. Each option is either a (possibly-translatable) string or a config with [[DescriptionWML#WML_Format|DescriptionWML]] keys. The array itself can also have an optional '''default''' key which if present should be the index of the initially selected option (useful if you don't need full DescriptionWML but want to set a default). If present it overrides any defaults set in individual options.&lt;br /&gt;
&lt;br /&gt;
The third argument is a table describing the text input field with the following keys:&lt;br /&gt;
&lt;br /&gt;
* ''label'' - A label to show to the left of the text field.&lt;br /&gt;
* ''text'' - Initial contents of the text field.&lt;br /&gt;
* ''max_length'' - Maximum input length in characters (defaults to 256).&lt;br /&gt;
&lt;br /&gt;
You need at least one key for the text input to be shown. Both the second and third arguments are optional, but if you want text input with no options, you must pass nil for the second parameter.&lt;br /&gt;
&lt;br /&gt;
This function returns one or two values. The first value returned is the numeric result of the dialog:&lt;br /&gt;
&lt;br /&gt;
* If there are no options and no text input, the result is -2 if the user pressed Escape, or -1 if they closed by clicking or pressing Space.&lt;br /&gt;
* If there are options, the result is the index of the option chosen (starting from 1).&lt;br /&gt;
* If there is text input but no options, the first return value is 0.&lt;br /&gt;
&lt;br /&gt;
The second value returned is the text entered, if there was text input. Otherwise there is no second value (it is nil).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='lua'&amp;gt;&lt;br /&gt;
gui.show_narration({&lt;br /&gt;
    title = &amp;quot;Make your choice:&amp;quot;,&lt;br /&gt;
    message = &amp;quot;Select an option and enter some text.&amp;quot;,&lt;br /&gt;
    portrait = &amp;quot;wesnoth-icon.png&amp;quot;,&lt;br /&gt;
}, {&lt;br /&gt;
    &amp;quot;The first choice is always the best!&amp;quot;,&lt;br /&gt;
    &amp;quot;Pick me! Second choices are better!&amp;quot;,&lt;br /&gt;
    &amp;quot;You know you want the third option!&amp;quot;,&lt;br /&gt;
}, {&lt;br /&gt;
    label = &amp;quot;Text:&amp;quot;,&lt;br /&gt;
    text = &amp;quot;?&amp;quot;,&lt;br /&gt;
    max_length = 16&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(You don't have to format it like that, of course.)&lt;br /&gt;
&lt;br /&gt;
=== gui.show_popup ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_popup'''(''title'', ''message'', [''image''])&lt;br /&gt;
&lt;br /&gt;
Shows a simple popup dialog in the centre of the screen. Takes three arguments, which in order are:&lt;br /&gt;
&lt;br /&gt;
# A title string for the dialog&lt;br /&gt;
# The message content for the dialog.&lt;br /&gt;
# An image to show.&lt;br /&gt;
&lt;br /&gt;
Both the title and the message support Pango markup. The image is optional.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_prompt ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_prompt'''(''title'', ''message'', [''button''], [''markup'']) &amp;amp;rarr; ''result''&lt;br /&gt;
* '''gui.confirm'''([''title'',] ''message'') &amp;amp;rarr; ''result''&lt;br /&gt;
* '''gui.alert'''([''title''], ''message'')&lt;br /&gt;
&lt;br /&gt;
Shows a standard message box onscreen (similar to the quit confirmation message, for example). The button can be any arbitrary potentially-translatable string (in which case, there will be one button with that label), or it can be one of the following special string values:&lt;br /&gt;
&lt;br /&gt;
* ''ok'' or nil: A single OK button; this is the default&lt;br /&gt;
* ''cancel'': A single Cancel button&lt;br /&gt;
* ''close'': A single Close button&lt;br /&gt;
* ''ok_cancel'': Two buttons labelled OK and Cancel&lt;br /&gt;
* ''yes_no'': Two buttons labelled Yes and No&lt;br /&gt;
* an empty string: No buttons; the dialog automatically closes after a few seconds&lt;br /&gt;
&lt;br /&gt;
The alert and confirm functions are simpler wrappers for this function, using a single OK button and a pair of Yes/No buttons, respectively. Both confirm and show_prompt return false if No or Cancel was clicked, and true otherwise. The alert function returns nothing.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_recruit_dialog ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.19|8}}&lt;br /&gt;
&lt;br /&gt;
* {{LuaGameOnly}} '''gui.show_recruit_dialog'''(''unit_types_list'', [''unit_dialog_options''])&lt;br /&gt;
&lt;br /&gt;
Shows the recruit dialog with the given list of unit types and options. The first argument is a table of [[LuaAPI/types#Unit_Type|unit types]]. The second argument is an optional table that can be used to set various properties of the dialog shown. These are:&lt;br /&gt;
&lt;br /&gt;
* '''title''': the title of the dialog.&lt;br /&gt;
* '''ok_label''': caption of the button with id &amp;quot;ok&amp;quot;.&lt;br /&gt;
* '''cancel_label''': caption of the button with id &amp;quot;cancel&amp;quot;.&lt;br /&gt;
* '''help_topic''': the help topic that is to be opened when the '?' button is clicked.&lt;br /&gt;
* '''show_headers''': (boolean) whether to show column headers in the main list of the dialog. By default, the headers are not shown.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_recall_dialog ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.19|8}}&lt;br /&gt;
&lt;br /&gt;
* {{LuaGameOnly}} '''gui.show_recall_dialog'''(''units_list'', [''unit_dialog_options''])&lt;br /&gt;
&lt;br /&gt;
Shows the recall dialog with the given list of units and options. The first argument is a table of [[LuaAPI/types/unit|units]]. The second argument is an optional table that can be used to set various properties of the dialog shown. These are:&lt;br /&gt;
&lt;br /&gt;
* '''title''': the title of the dialog.&lt;br /&gt;
* '''ok_label''': caption of the button with id &amp;quot;ok&amp;quot;.&lt;br /&gt;
* '''cancel_label''': caption of the button with id &amp;quot;cancel&amp;quot;.&lt;br /&gt;
* '''help_topic''': the help topic that is to be opened when the '?' button is clicked.&lt;br /&gt;
* '''show_headers''': (boolean) whether to show column headers in the main list of the dialog. By default, the headers are shown.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_story ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_story'''(''story_config'', ''default_title'')&lt;br /&gt;
&lt;br /&gt;
Shows the storyscreen. The passed config is identical to the contents of [[IntroWML|[story]]]. The second parameter is the default title used if a part does not specify one — unlike intro storyscreens, a Lua-invoked one does not default to the scenario name.&lt;br /&gt;
&lt;br /&gt;
=== gui.switch_theme ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.19|4}}&lt;br /&gt;
&lt;br /&gt;
* '''gui.switch_theme'''(''theme_id'')&lt;br /&gt;
&lt;br /&gt;
Switch to the GUI2 theme with id ''theme_id''. Can only be used inside a scenario and does not replace the UI Theme selected by Preferences. The UI reverts to the theme selected in Preferences after exiting the in-game window, for example, by using the menu or by winning or losing a campaign.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=LuaAPI/gui&amp;diff=74173</id>
		<title>LuaAPI/gui</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=LuaAPI/gui&amp;diff=74173"/>
		<updated>2025-02-27T22:01:23Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* gui.switch_theme */ Dev-only feature&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevFeature1.15|0}}&lt;br /&gt;
&lt;br /&gt;
== Submodules ==&lt;br /&gt;
=== gui.widget ===&lt;br /&gt;
&lt;br /&gt;
A [[LuaAPI/gui/widget|submodule]] containing functions for working with widgets in custom dialogs.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== gui.add_widget_definition ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.add_widget_definition'''(''widget_type'', ''definition_id'', ''wml_content'')&lt;br /&gt;
&lt;br /&gt;
Creates a new WML widget definition for the specified widget type, which can be referenced from dialog WML in the '''definition''' key.&lt;br /&gt;
&lt;br /&gt;
=== gui.get_user_choice ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.get_user_choice'''(''attributes'', ''options'')&lt;br /&gt;
&lt;br /&gt;
Shows a message dialog (like the one used by the &amp;lt;tt&amp;gt;[[InterfaceActionsWML#.5Bmessage.5D|[message]]]&amp;lt;/tt&amp;gt; tag) with a series of options and returns the index (1-based) of the chosen option, which can be stored as a Lua variable.&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANT NOTE: this function is broken in Wesnoth 1.16.0 and 1.16.1.''' If you wish to use it, you should also use wesnoth.current_version to check that your code is being run on Wesnoth 1.16.2 or higher. Alternatively, you may try using [[#gui.show_narration|gui.show_narration]] instead, which has a similar function but a wider range of features.&lt;br /&gt;
&lt;br /&gt;
The first argument is a table of attributes which are directly passed to the underlying &amp;lt;tt&amp;gt;[message]&amp;lt;/tt&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
The second argument is a table of options, which are used to construct a series of underlying &amp;lt;tt&amp;gt;[option]&amp;lt;/tt&amp;gt; tags. Most Lua data types are supported, but a few aren't:&lt;br /&gt;
* If the option is a ''table'' or a ''WML table'', these fields are supported:&lt;br /&gt;
** ''image'': icon shown in the first column;&lt;br /&gt;
** ''label'': text shown in the second column;&lt;br /&gt;
** ''description'': text shown in the third column (''message'' is also supported as an alias);&lt;br /&gt;
** ''default'': whether this is option is the one selected when the dialog is shown (boolean).&lt;br /&gt;
* If the option can be cast to a string (''strings'', ''translatable strings'', ''numbers'', ''booleans''), it is used for the content of the description field, which means that the first two columns will be empty.&lt;br /&gt;
* Otherwise, it raises an &amp;quot;invalid data type&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
Example taken from the test scenario (if not used in an event then change the speaker):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='lua'&amp;gt;&lt;br /&gt;
local result = gui.get_user_choice(&lt;br /&gt;
    { speaker = &amp;quot;unit&amp;quot;, message = &amp;quot;Pick your poison&amp;quot; },&lt;br /&gt;
    { { image = &amp;quot;items/potion-red.png&amp;quot;,&lt;br /&gt;
        label = &amp;quot;Something red&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Take a sip and enjoy&amp;quot; },&lt;br /&gt;
      { image = &amp;quot;items/potion-blue.png&amp;quot;,&lt;br /&gt;
        label = &amp;quot;Nice blue&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Surely you’ll like that one&amp;quot;,&lt;br /&gt;
        default = true },&lt;br /&gt;
      { image = &amp;quot;items/potion-yellow.png&amp;quot;,&lt;br /&gt;
        label = &amp;quot;&amp;lt;span color='yellow'&amp;gt;Oh noes yellow&amp;lt;/span&amp;gt;&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Oh I’m sure you’ll love that one&amp;quot; },&lt;br /&gt;
      { image = &amp;quot;scenery/well.png&amp;quot;,&lt;br /&gt;
        label = &amp;quot;A nice well&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Grab a bucket and fetch some water&amp;quot; },&lt;br /&gt;
      { image = &amp;quot;items/holy-water.png&amp;quot;,&lt;br /&gt;
        label = &amp;quot;Oh nice bottle&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Feel the divinity&amp;quot; },&lt;br /&gt;
      -- Should have an empty first column and a second column on two lines.&lt;br /&gt;
      { label = &amp;quot;Well a nice and black drink.\nToo dark too see?&amp;quot;,&lt;br /&gt;
        description = &amp;quot;Take a sip and pass the bottle along&amp;quot; }&lt;br /&gt;
    })&lt;br /&gt;
wesnoth.interface.add_chat_message(string.format(&amp;quot;User selected choice %d.&amp;quot;, result))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== gui.show_dialog ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_dialog'''(''dialog definition'', ''preshow'', ''postshow'') &amp;amp;rarr; ''retval''&lt;br /&gt;
&lt;br /&gt;
Displays a dialog box described by a WML table and returns an integer&lt;br /&gt;
* if the dialog was dismissed by a button click, the integer value associated to the button via the '''return_value''' keyword.&lt;br /&gt;
* if the dialog was closed with the enter key, -1.&lt;br /&gt;
* if the dialog was closed with the escape key, -2.&lt;br /&gt;
&lt;br /&gt;
The dialog box is equivalent to the '''[resolution]''' section of a GUI window as described in [[GUIToolkitWML]] and must therefore contain at least the following children: '''[tooltip]''', '''[helptip]''', and '''[grid]'''. The [grid] must contain nested [row], [column] and [grid] tags which describe the layout of the window. (More information can be found in GUIToolkit page's [[GUIToolkit#Layout|Layout]] section and [[GUILayout]]; suffice to say that the basic structure is grid -&amp;gt; row -&amp;gt; column -&amp;gt; widget, where the widget is considered to be in a cell defined by the row and column of the grid. A list of widgets can be found at [[GUIWidgetInstanceWML]].) For an overview of the GUI system, see [[GUIToolkit]].&lt;br /&gt;
&lt;br /&gt;
Two optional functions can be passed as second and third arguments; the function passed as ''preshow'' argument is called just before the dialog is shown; the second function (argument ''postshow'') is called once the dialog is closed. These functions are helpful in setting the initial values of the fields and in recovering the final user values. These functions take a single parameter, which is the [[LuaAPI/types/widget|widget userdata]] representing the window.&lt;br /&gt;
&lt;br /&gt;
For in-game dialogs that offer the player a choice and/or can change the game state, this function should be called in conjunction with [[LuaAPI/wesnoth/sync#evaluate_single|wesnoth.sync.evaluate_single]], in order to ensure that only one client displays the dialog and that the other ones recover the same input values from this single client. Though this is especially important in multiplayer scenarios, failing to do it in a single-player scenario will cause the replay to break, so it should be done in either case.&lt;br /&gt;
&lt;br /&gt;
See [[LuaAPI/gui/example|here]] for a fully-working example of a custom dialog.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_help ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_help'''([''topic''])&lt;br /&gt;
&lt;br /&gt;
Show the in-game help, optionally opening a specified topic directly.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_inspector ===&lt;br /&gt;
&lt;br /&gt;
* {{LuaGameOnly}} '''gui.show_inspector'''()&lt;br /&gt;
&lt;br /&gt;
Show the gamestate inspector.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_lua_console ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_lua_console'''()&lt;br /&gt;
&lt;br /&gt;
Shows the Lua console. This works even if debug mode is not enabled.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== gui.show_menu ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_menu'''(''items'', [''initial''], [''markup'']) &amp;amp;rarr; ''index''&lt;br /&gt;
&lt;br /&gt;
Shows a popup menu onscreen at the current mouse location. This could be used for example to produce a sort of submenu in a &amp;lt;tt&amp;gt;[set_menu_item]&amp;lt;/tt&amp;gt;. The items are specified as a Lua array of tables, each of which supports the following keys:&lt;br /&gt;
&lt;br /&gt;
* ''icon'': An icon to display in the leftmost column of the menu.&lt;br /&gt;
* ''image'': An image to display in the main column of the menu. If this is present, ''label'' is ignored.&lt;br /&gt;
* ''label'': A label to display in the main column of the menu.&lt;br /&gt;
* ''details'': A secondary label to display in the right column of the menu.&lt;br /&gt;
* ''tooltip'': Text to display when mousing over this option.&lt;br /&gt;
&lt;br /&gt;
The ''initial'' argument must be a valid index into the ''items'' array, or 0 to indicate that no element is initially selected (which is the default but typically not what you want).&lt;br /&gt;
&lt;br /&gt;
The ''markup'' argument specifies whether Pango markup will be parsed in the menuitems. It defaults to false.&lt;br /&gt;
&lt;br /&gt;
The ''initial'' and ''markup'' arguments can be passed in either order; the game will understand which is meant based on the type of the argument.&lt;br /&gt;
&lt;br /&gt;
This function returns the index of the selected item. If the user cancelled by clicking outside the menu's boundary, 0 is returned.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_narration ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_narration'''(''attributes'', [''options'', [''text_input_attributes'']]) &amp;amp;rarr; ''result_code'', [''entered_text'']&lt;br /&gt;
&lt;br /&gt;
Shows a message dialog, of the type used by the &amp;lt;tt&amp;gt;[message]&amp;lt;/tt&amp;gt; ActionWML tag. Unlike the &amp;lt;tt&amp;gt;[message]&amp;lt;/tt&amp;gt; tag, this is unsynced; if you need it synced, you must do it yourself. The first argument is a table describing the dialog with the following keys:&lt;br /&gt;
&lt;br /&gt;
* ''title'' - The title to show on the message. For example, the speaker's name.&lt;br /&gt;
* ''message'' - The message content.&lt;br /&gt;
* ''portrait'' - An image to show along with the message. By default, no image is shown.&lt;br /&gt;
* ''left_side'' - The default is true; set to false to show the image on the right.&lt;br /&gt;
* ''mirror'' - If true, the image will be flipped horizontally.&lt;br /&gt;
&lt;br /&gt;
The second argument is a list of options as a Lua array. Each option is either a (possibly-translatable) string or a config with [[DescriptionWML#WML_Format|DescriptionWML]] keys. The array itself can also have an optional '''default''' key which if present should be the index of the initially selected option (useful if you don't need full DescriptionWML but want to set a default). If present it overrides any defaults set in individual options.&lt;br /&gt;
&lt;br /&gt;
The third argument is a table describing the text input field with the following keys:&lt;br /&gt;
&lt;br /&gt;
* ''label'' - A label to show to the left of the text field.&lt;br /&gt;
* ''text'' - Initial contents of the text field.&lt;br /&gt;
* ''max_length'' - Maximum input length in characters (defaults to 256).&lt;br /&gt;
&lt;br /&gt;
You need at least one key for the text input to be shown. Both the second and third arguments are optional, but if you want text input with no options, you must pass nil for the second parameter.&lt;br /&gt;
&lt;br /&gt;
This function returns one or two values. The first value returned is the numeric result of the dialog:&lt;br /&gt;
&lt;br /&gt;
* If there are no options and no text input, the result is -2 if the user pressed Escape, or -1 if they closed by clicking or pressing Space.&lt;br /&gt;
* If there are options, the result is the index of the option chosen (starting from 1).&lt;br /&gt;
* If there is text input but no options, the first return value is 0.&lt;br /&gt;
&lt;br /&gt;
The second value returned is the text entered, if there was text input. Otherwise there is no second value (it is nil).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='lua'&amp;gt;&lt;br /&gt;
gui.show_narration({&lt;br /&gt;
    title = &amp;quot;Make your choice:&amp;quot;,&lt;br /&gt;
    message = &amp;quot;Select an option and enter some text.&amp;quot;,&lt;br /&gt;
    portrait = &amp;quot;wesnoth-icon.png&amp;quot;,&lt;br /&gt;
}, {&lt;br /&gt;
    &amp;quot;The first choice is always the best!&amp;quot;,&lt;br /&gt;
    &amp;quot;Pick me! Second choices are better!&amp;quot;,&lt;br /&gt;
    &amp;quot;You know you want the third option!&amp;quot;,&lt;br /&gt;
}, {&lt;br /&gt;
    label = &amp;quot;Text:&amp;quot;,&lt;br /&gt;
    text = &amp;quot;?&amp;quot;,&lt;br /&gt;
    max_length = 16&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(You don't have to format it like that, of course.)&lt;br /&gt;
&lt;br /&gt;
=== gui.show_popup ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_popup'''(''title'', ''message'', [''image''])&lt;br /&gt;
&lt;br /&gt;
Shows a simple popup dialog in the centre of the screen. Takes three arguments, which in order are:&lt;br /&gt;
&lt;br /&gt;
# A title string for the dialog&lt;br /&gt;
# The message content for the dialog.&lt;br /&gt;
# An image to show.&lt;br /&gt;
&lt;br /&gt;
Both the title and the message support Pango markup. The image is optional.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_prompt ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_prompt'''(''title'', ''message'', [''button''], [''markup'']) &amp;amp;rarr; ''result''&lt;br /&gt;
* '''gui.confirm'''([''title'',] ''message'') &amp;amp;rarr; ''result''&lt;br /&gt;
* '''gui.alert'''([''title''], ''message'')&lt;br /&gt;
&lt;br /&gt;
Shows a standard message box onscreen (similar to the quit confirmation message, for example). The button can be any arbitrary potentially-translatable string (in which case, there will be one button with that label), or it can be one of the following special string values:&lt;br /&gt;
&lt;br /&gt;
* ''ok'' or nil: A single OK button; this is the default&lt;br /&gt;
* ''cancel'': A single Cancel button&lt;br /&gt;
* ''close'': A single Close button&lt;br /&gt;
* ''ok_cancel'': Two buttons labelled OK and Cancel&lt;br /&gt;
* ''yes_no'': Two buttons labelled Yes and No&lt;br /&gt;
* an empty string: No buttons; the dialog automatically closes after a few seconds&lt;br /&gt;
&lt;br /&gt;
The alert and confirm functions are simpler wrappers for this function, using a single OK button and a pair of Yes/No buttons, respectively. Both confirm and show_prompt return false if No or Cancel was clicked, and true otherwise. The alert function returns nothing.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_recruit_dialog ===&lt;br /&gt;
&lt;br /&gt;
* {{LuaGameOnly}} '''gui.show_recruit_dialog'''(''unit_types_list'', [''unit_dialog_options''])&lt;br /&gt;
&lt;br /&gt;
Shows the recruit dialog with the given list of unit types and options. The first argument is a table of [[LuaAPI/types#Unit_Type|unit types]]. The second argument is an optional table that can be used to set various properties of the dialog shown. These are:&lt;br /&gt;
&lt;br /&gt;
* '''title''': the title of the dialog.&lt;br /&gt;
* '''ok_label''': caption of the button with id &amp;quot;ok&amp;quot;.&lt;br /&gt;
* '''cancel_label''': caption of the button with id &amp;quot;cancel&amp;quot;.&lt;br /&gt;
* '''help_topic''': the help topic that is to be opened when the '?' button is clicked.&lt;br /&gt;
* '''show_headers''': (boolean) whether to show column headers in the main list of the dialog. By default, the headers are not shown.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_recall_dialog ===&lt;br /&gt;
&lt;br /&gt;
* {{LuaGameOnly}} '''gui.show_recall_dialog'''(''units_list'', [''unit_dialog_options''])&lt;br /&gt;
&lt;br /&gt;
Shows the recall dialog with the given list of units and options. The first argument is a table of [[LuaAPI/types/unit|units]]. The second argument is an optional table that can be used to set various properties of the dialog shown. These are:&lt;br /&gt;
&lt;br /&gt;
* '''title''': the title of the dialog.&lt;br /&gt;
* '''ok_label''': caption of the button with id &amp;quot;ok&amp;quot;.&lt;br /&gt;
* '''cancel_label''': caption of the button with id &amp;quot;cancel&amp;quot;.&lt;br /&gt;
* '''help_topic''': the help topic that is to be opened when the '?' button is clicked.&lt;br /&gt;
* '''show_headers''': (boolean) whether to show column headers in the main list of the dialog. By default, the headers are shown.&lt;br /&gt;
&lt;br /&gt;
=== gui.show_story ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.show_story'''(''story_config'', ''default_title'')&lt;br /&gt;
&lt;br /&gt;
Shows the storyscreen. The passed config is identical to the contents of [[IntroWML|[story]]]. The second parameter is the default title used if a part does not specify one — unlike intro storyscreens, a Lua-invoked one does not default to the scenario name.&lt;br /&gt;
&lt;br /&gt;
=== gui.switch_theme ===&lt;br /&gt;
&lt;br /&gt;
* '''gui.switch_theme'''(''theme_id'')&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.19|4}}&lt;br /&gt;
&lt;br /&gt;
Switch to the GUI2 theme with id ''theme_id''. Can only be used inside a scenario and does not replace the UI Theme selected by Preferences. The UI reverts to the theme selected in Preferences after exiting the in-game window, for example, by using the menu or by winning or losing a campaign.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=LuaAPI/types/widget&amp;diff=73401</id>
		<title>LuaAPI/types/widget</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=LuaAPI/types/widget&amp;diff=73401"/>
		<updated>2024-08-07T01:10:20Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* selected_item_path */ It's [tree_view], not [treeview]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;tright&amp;quot;&amp;gt; __TOC__ &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''widget''' userdata offers access to a widget of a GUI2 dialog. While there is only one type of widget userdata that covers all widgets including the window itself, the properties of a widget userdata are different for each type of widget. Indexing a widget's userdata can either be used to access a child widget or to set or get a property of a widget. Some properties are read-only or write-only; the properties depend on the type of the widget.&lt;br /&gt;
&lt;br /&gt;
An example of accessing a child widget:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
function preshow(dialog)&lt;br /&gt;
  local okay_button = dialog.okay_button&lt;br /&gt;
  -- okay_button is now a handle to the the widget's child with the id 'okay_button' &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Widget Attributes ==&lt;br /&gt;
&lt;br /&gt;
=== selected ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''selected''' &amp;amp;harr; ''boolean''&lt;br /&gt;
* Available on: '''[toggle_button]''', '''[toggle_panel]'''&lt;br /&gt;
&lt;br /&gt;
Whether the item is selected or not. Note that this should only be used for widgets that have only 2 states. In particular, there exist 3-State toggle_buttons (for example in listbox headers). For those, selected_index must be used instead.&lt;br /&gt;
&lt;br /&gt;
=== selected_index ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''selected_index''' &amp;amp;harr; ''index''&lt;br /&gt;
* Available on: '''[listbox]''', '''[multi_page]''', '''[stacked_widget]''', '''[menu_button]''', '''[toggle_button]''', '''[toggle_panel]'''&lt;br /&gt;
&lt;br /&gt;
The selected index of the item. For '''[toggle_button]''' and '''[toggle_panel]''', this is the same as '''selected''' only encoded as a number (1 for false or 2 for true) instead of a boolean.&lt;br /&gt;
&lt;br /&gt;
=== text ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''text''' &amp;amp;harr; ''text''&lt;br /&gt;
* Available on: '''[text_box]'''&lt;br /&gt;
&lt;br /&gt;
The text of the textbox.&lt;br /&gt;
&lt;br /&gt;
=== value ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''value''' &amp;amp;harr; ''position''&lt;br /&gt;
* Available on: '''[slider]'''&lt;br /&gt;
&lt;br /&gt;
The current position of the slider.&lt;br /&gt;
&lt;br /&gt;
=== percentage ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''percentage''' &amp;amp;harr; ''position''&lt;br /&gt;
* Available on: '''[progress_bar]'''&lt;br /&gt;
&lt;br /&gt;
The current position of the progress bar, between 0 and 100.&lt;br /&gt;
&lt;br /&gt;
=== selected_item_path ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''selected_item_path''' &amp;amp;rarr; ''array of indices''&lt;br /&gt;
* Available on: '''[tree_view]'''&lt;br /&gt;
&lt;br /&gt;
A table describing the currently selected node. If for example, in the following treeview, Item 9 is selected, the result will be {2,1,3}.&lt;br /&gt;
&lt;br /&gt;
 +Section1&lt;br /&gt;
  +Subsection11&lt;br /&gt;
   *Item1&lt;br /&gt;
   *Item2&lt;br /&gt;
   *Item3&lt;br /&gt;
  +Subsection12&lt;br /&gt;
   *Item4&lt;br /&gt;
   *Item5&lt;br /&gt;
   *Item6&lt;br /&gt;
 +Section2&lt;br /&gt;
  +Subsection21&lt;br /&gt;
   *Item7&lt;br /&gt;
   *Item8&lt;br /&gt;
   *Item9&lt;br /&gt;
  +Subsection22&lt;br /&gt;
   *Item10&lt;br /&gt;
   *Item11&lt;br /&gt;
   *Item12&lt;br /&gt;
&lt;br /&gt;
=== path ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''path''' &amp;amp;rarr; ''array of indices''&lt;br /&gt;
* Available on: '''[tree_view_node]'''&lt;br /&gt;
&lt;br /&gt;
A table describing this node in the overall treeview. See [[#selected_item_path|selected_item_path]] for the meaning of the table..&lt;br /&gt;
&lt;br /&gt;
=== unfolded ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''unfolded''' &amp;amp;larr; ''boolean''&lt;br /&gt;
* Available on: '''[tree_view_node]'''&lt;br /&gt;
&lt;br /&gt;
Control whether a tree node is currently expanded or not.&lt;br /&gt;
&lt;br /&gt;
=== unit ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''unit''' &amp;amp;larr; ''unit or unit type''&lt;br /&gt;
* Available on: '''[unit_preview_pane]'''&lt;br /&gt;
&lt;br /&gt;
Change the displayed unit or unit type in the preview pane.&lt;br /&gt;
&lt;br /&gt;
=== item_count ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''item_count''' &amp;amp;rarr; ''number of items''&lt;br /&gt;
* Available on: '''[multi_page]''', '''[listbox]'''&lt;br /&gt;
&lt;br /&gt;
The number of items in the container widget.&lt;br /&gt;
&lt;br /&gt;
=== use_markup ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''use_markup''' &amp;amp;rarr; ''boolean''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]'''&lt;br /&gt;
&lt;br /&gt;
Sets whether the widget's label will parse [[Pango formatting]].&lt;br /&gt;
&lt;br /&gt;
=== label ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''label''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]''', '''[image]'''&lt;br /&gt;
&lt;br /&gt;
The widget's label. Technically this is a special string used in the widget's wml definition. It usually does what one would expect, but also sets the image for '''image''' widgets.  For '''[text_box]''', use '''text''' for initial values.&lt;br /&gt;
&lt;br /&gt;
=== marked_up_text ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''marked_up_text''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: Most widgets, in particular '''[label]''', '''[button]'''&lt;br /&gt;
&lt;br /&gt;
Shortcut for setting label and use_markup=yes.&lt;br /&gt;
&lt;br /&gt;
=== enabled ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''enabled''' &amp;amp;larr; ''boolean''&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
&lt;br /&gt;
=== tooltip ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''tooltip''' &amp;amp;larr; ''text''&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''visible''' &amp;amp;larr; ''visibility string''&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
&lt;br /&gt;
Determines whether the widget is visible onscreen. The following visibility statuses are recognized:&lt;br /&gt;
{| clasS=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! String value !! Boolean shorthand !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| visible || true || The widget is visible and handles events.&lt;br /&gt;
|-&lt;br /&gt;
| hidden || || The widget is not visible, doesn't handle events, but still takes up space on the dialog grid.&lt;br /&gt;
|-&lt;br /&gt;
| invisible || false || The widget is not visible, doesn't handle events, and does not take up space on the dialog grid.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== type ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''type''' &amp;amp;rarr; ''string''&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
&lt;br /&gt;
Returns a string specifying the type of the widget.&lt;br /&gt;
&lt;br /&gt;
== Widget callbacks ==&lt;br /&gt;
&lt;br /&gt;
=== on_modified ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_modified''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: Most widgets, in particular '''[slider]''', '''[toggle_button]''', '''[listbox]''', '''[menu_button]''', '''[text_box]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user changes the value of the widget.&lt;br /&gt;
&lt;br /&gt;
=== on_left_click ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_left_click''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: All widgets&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on the widget.&lt;br /&gt;
&lt;br /&gt;
=== on_button_click ===&lt;br /&gt;
&lt;br /&gt;
* ''widget''.'''on_button_click''' &amp;amp;larr; '''function'''()&lt;br /&gt;
* Available on: '''[button]''', '''[repeating_button]'''&lt;br /&gt;
&lt;br /&gt;
Triggers when the user clicks on the button. This can differ from '''on_left_click''', depending on the type of widget. For example, on a '''[repeating_button]''' it will fire multiple times if the user holds the mouse button down.&lt;br /&gt;
&lt;br /&gt;
== Widget methods ==&lt;br /&gt;
&lt;br /&gt;
Any function defined in the [[LuaAPI/gui/widget|gui.widget]] module and taking a widget as its first parameter can be called as a method of a widget. This includes any functions that are added to the module by user code. Note that these methods are available even if the widget itself doesn't support that function, so in some cases it may be necessary to check '''widget.type''' befor calling the method.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=PblWML&amp;diff=72726</id>
		<title>PblWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=PblWML&amp;diff=72726"/>
		<updated>2024-04-19T08:08:02Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* icon */ Wesnoth RCX is now Wespal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
&lt;br /&gt;
To upload an add-on you have made, you need a '''_server.pbl''' file in your add-on's directory, at the same level as the '''_main.cfg''' file. When you upload the add-on, the entire directory and subdirectories containing the _server.pbl file will be published. Your add-on must be based entirely on these paths.&lt;br /&gt;
&lt;br /&gt;
See [[AddonStructure]] for more on setting up the add-on folder if you have not done so, and [[Distributing_content]] for more on uploading an add-on to the server with this file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Be aware that translations in the .pbl-files are '''not''' used, so don't mark these strings as translatable. {{DevFeature1.15|4}} The translations in the .pbl-files are used, but they are used as a plain text instead of Gettext strings, so don't mark these strings as translatable.&lt;br /&gt;
&lt;br /&gt;
== What goes into a .pbl file? ==&lt;br /&gt;
&lt;br /&gt;
'''Note:''' ''You should '''not''' use special formatting or coloring in any of these keys when uploading to the official server.'''''&lt;br /&gt;
&lt;br /&gt;
The following keys are recognized for .pbl files:&lt;br /&gt;
&lt;br /&gt;
=== icon ===&lt;br /&gt;
: An image, displayed leftmost in the add-ons download dialog. It must be a standard Wesnoth file and '''not a custom one'''. A custom file will only work for users who already have the relevant add-on installed. This is not related to the icon used for entries in the campaigns menu -- see [[CampaignWML]] for more information.&lt;br /&gt;
&lt;br /&gt;
: If the icon is a unit with magenta team-color bits, please use [[ImagePathFunctions]] to recolor it. For example: &lt;br /&gt;
&lt;br /&gt;
::icon=&amp;quot;units/elves-wood/archer+female-sword-1.png~RC(magenta&amp;gt;brightorange)&amp;quot;&lt;br /&gt;
:or&lt;br /&gt;
::icon=&amp;quot;units/human-peasants/peasant-ranged.png~RC(magenta&amp;gt;white)~CS(24,24,24)&amp;quot;&lt;br /&gt;
:or&lt;br /&gt;
::icon=&amp;quot;units/human-peasants/ruffian.png~RC(magenta&amp;gt;green)~BLIT(units/human-peasants/woodsman.png~RC(magenta&amp;gt;lightblue),18,12)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: Because the add-on manager's UI is dark, recoloring to light colors looks usually better. [https://irydacea.me/projects/wespal Wespal] is a tool that provides a convenient way to preview recolored unit sprites without needing to launch the game with specific WML or Lua edits.&lt;br /&gt;
&lt;br /&gt;
: {{DevFeature1.13|12}} Instead of a standard Wesnoth image, a [[DataURI]] can also be used. This way, an image can be directly included into the _server.pbl file. Take care to leave no trailing newline.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
: Displayed to the right of the icon, it is just text. It should usually be the same as the name of your add-on when it is played.&lt;br /&gt;
: '''This value is required'''.&lt;br /&gt;
&lt;br /&gt;
=== version ===&lt;br /&gt;
: Displayed to the right of the title; it is merely text. However, starting with Wesnoth 1.6, the required format is '''x.y.z''' where '''x''', '''y''' and '''z''' are numbers — and a value for '''x''' greater than ''0'' implies the add-on is complete, feature-wise. Trailing non-numeric elements are allowed, but nothing should appear before or between these numbers. The string of numbers will be modified on the server by inserting or appending zeros as neccesary to meet the required format. All this is necessary for the “Update All” button to work correctly. ([[#Version Key Examples|See Examples]])&lt;br /&gt;
: '''This value is required'''.&lt;br /&gt;
&lt;br /&gt;
=== author ===&lt;br /&gt;
: Displayed to the right of the version; it is merely text. Put your name or nickname here. If several people have contributed significantly to the add-on you may want to list all of their names.&lt;br /&gt;
: '''This value is required'''.&lt;br /&gt;
&lt;br /&gt;
=== passphrase ===&lt;br /&gt;
: Not displayed. It prevents others from modifying the version of your add-on on the server. You do not need to input a passphrase when initially publishing a add-on; if you do not, one will be randomly generated for you and replaced in your local copy of the .pbl file.&lt;br /&gt;
: '''SECURITY NOTE:''' If you do specify a passphrase of your own, note that it is stored in '''clear text''' form in the server; '''do NOT use a password you would normally use for any other services or web sites!'''&lt;br /&gt;
&lt;br /&gt;
: {{DevFeature1.15|12}}&lt;br /&gt;
&lt;br /&gt;
: It is no longer required to keep the passphrase in the .pbl file at all. If it is not present, then Wesnoth will prompt for it to be entered when uploading or deleting an add-on.&lt;br /&gt;
&lt;br /&gt;
=== description ===&lt;br /&gt;
: This can be used to provide a brief description of your add-on, and for pre-1.0 versions, let people know how playable it is. The description can be viewed by users by clicking on the Description button in the built-in client, or by moving their mouse over the add-on's icon in the web interface.&lt;br /&gt;
: '''This value is required'''.&lt;br /&gt;
&lt;br /&gt;
=== dependencies ===&lt;br /&gt;
: An optional list of dependencies (a comma separated list of ''addon-name'' – the directory names of the needed add-ons), which should be provided if your add-on relies on other user-made content to work properly. ([[#Dependency Key Example|See Example]])&lt;br /&gt;
&lt;br /&gt;
=== tags ===&lt;br /&gt;
{{DevFeature1.13|12}}&lt;br /&gt;
: An optional string including a comma-separated list of keywords used for matching add-ons when typing terms into the Filter box on the top left of the Add-ons Manager. There are no specific requirements on the syntax of the keywords listed here, but a general recommendation is to keep them relevant for players. For example, one might include the add-on's acronym in the tags, the names or acronyms of add-ons to which it is related, and so on.&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.15|13}} The in-game add-ons manager will show all the tags in the UI, and also includes a drop-down list of tags to filter by. Not all tags are listed in the filter box, and the exact list of tags supported may change before 1.16 is released, but the list is currently:&lt;br /&gt;
&lt;br /&gt;
* '''cooperative''': All human players are on the same team, versus the AI&lt;br /&gt;
* '''cosmetic''': These make the game look different, without changing gameplay&lt;br /&gt;
* '''difficulty''': Can make campaigns easier or harder&lt;br /&gt;
* '''rng''': Modify the randomness in the combat mechanics, or remove it entirely&lt;br /&gt;
* '''survival''': Fight against waves of enemies&lt;br /&gt;
* '''terraforming''': Players can change the terrain&lt;br /&gt;
&lt;br /&gt;
For example, if an A New Land style add-on had tags ''building'', ''terraforming'', ''anl'', ''city'', and ''survival'' then it would be shown if either ''Terraforming'' or ''Survival'' was selected in the drop-down; the other tags wouldn't affect the filtering.&lt;br /&gt;
&lt;br /&gt;
=== core ===&lt;br /&gt;
{{DevFeature1.13|0}}&lt;br /&gt;
: An optional string defining the id of the core which the addon is designed for. Defaults to &amp;quot;''default''&amp;quot;. Don't specify for an addon which is of type &amp;quot;''core''&amp;quot; itself. Note: DO NOT SET this unless you know why you need it! Giving it an invalid value can lead to mysterious errors with your campaign failing to load!&lt;br /&gt;
&lt;br /&gt;
=== translate ===&lt;br /&gt;
: If set to ''true'', the add-on would have been sent to and updated with [[WesCamp|WesCamp-i18n]], if that project were still active. However, as WesCamp is no longer active, this no longer does anything.&lt;br /&gt;
&lt;br /&gt;
: You should make sure your add-on complies with some very specific [[WesCamp#Preparing_your_add-on_for_WesCamp|conventions]] required to ease the process for translators as well as technical requirements.&lt;br /&gt;
&lt;br /&gt;
: Note: WesCamp was abandoned in 2014. Instead, please refer to:&lt;br /&gt;
* [[GettextForWesnothDevelopers]]&lt;br /&gt;
* [[GettextForTranslators#For_add-ons]]&lt;br /&gt;
* forum thread: [https://r.wesnoth.org/t46366 Guide: Translating your UMC without WesCamp].&lt;br /&gt;
&lt;br /&gt;
=== type ===&lt;br /&gt;
: Indicates the type of the add-on; used to filter listings in the downloads manager dialog. Acceptable values are:&lt;br /&gt;
&lt;br /&gt;
:* ''core'': replaces the whole wml tree. {{DevFeature1.13|0}}&lt;br /&gt;
:* ''campaign'': single player campaign.&lt;br /&gt;
:* ''scenario'': single player scenario.&lt;br /&gt;
:* ''campaign_sp_mp'': hybrid campaign.&lt;br /&gt;
:* ''era'': multiplayer era.&lt;br /&gt;
:* ''faction'': multiplayer stand-alone faction, or add-on for other available era.&lt;br /&gt;
:* ''map_pack'': multiplayer map-pack.&lt;br /&gt;
:* ''campaign_mp'': multiplayer campaign.&lt;br /&gt;
:* ''scenario_mp'': multiplayer scenario. (See the note below.)&lt;br /&gt;
:* ''mod_mp'': multiplayer modification ({{DevFeature1.13|11}} can also used for single-player modifications, although it's still called ''mod_mp'').&lt;br /&gt;
:* ''media'': miscellaneous resources for UMC authors/users, for example, music packs, packages of general-purpose WML, etc. &amp;lt;small&amp;gt;Note: Shows as Resources, not Media, in the add-ons interface&amp;lt;/small&amp;gt;&lt;br /&gt;
:* ''other'': The type to use when no other type fits.&lt;br /&gt;
: '''Note:''' If your add-on contains two or more separate multiplayer scenarios, use ''map_pack''.&lt;br /&gt;
&lt;br /&gt;
: '''This value is required'''.&lt;br /&gt;
&lt;br /&gt;
=== email ===&lt;br /&gt;
: Hidden e-mail address used by the server administrators to contact content authors in case of major issues. Again, this will only be seen by the server administrators and it is required that you provide one in case you need to be contacted about your add-on.&lt;br /&gt;
&lt;br /&gt;
: '''This value is required if forum_auth is not set to true'''.&lt;br /&gt;
&lt;br /&gt;
=== forum_auth ===&lt;br /&gt;
{{DevFeature1.17|3}}&lt;br /&gt;
: When set to ''true'', you will be prompted for your forum username and password when uploading your add-on. When set to true, the ''passphrase'' and ''email'' fields are also not required.&lt;br /&gt;
&lt;br /&gt;
=== secondary_authors ===&lt;br /&gt;
: A comma-delimited list of forum accounts that are allowed to upload new versions of the add-on, but aren't allowed to delete the add-on.&lt;br /&gt;
&lt;br /&gt;
=== [feedback] ===&lt;br /&gt;
: The [feedback] tag includes information used by the server to provide the client with a website URL for players to post feedback on an add-on and communicate with the maintainers. At this time, the official add-ons server is configured to take a single parameter described below.&lt;br /&gt;
&lt;br /&gt;
==== topic_id ====&lt;br /&gt;
: Topic id from the [http://forums.wesnoth.org/ Wesnoth.org forums] for the add-on's feedback or development topic maintained by the add-on uploader or author. For existing topics, this topic_id corresponds to the series of digits in the ''t=YYYYY'' portion of a URL like &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://forums.wesnoth.org/viewtopic.php?f=XX&amp;amp;t=YYYYY&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. You must take special care to ensure this information is valid before uploading if you want players to be able to reach you!&lt;br /&gt;
&lt;br /&gt;
=== [translation] ===&lt;br /&gt;
{{DevFeature1.15|4}}&lt;br /&gt;
: Multiple [translation] tags can be used to provide the addon with a localized title and description to be seen in the addons manager. However, it should be noted that the declared translations won't influence the list of supported locales as it depends only on the presence of .mo and .po files for corresponding languages.&lt;br /&gt;
&lt;br /&gt;
==== language ====&lt;br /&gt;
: The target language code for the translation. The codes for each language are given in the big table on [https://www.wesnoth.org/gettext/] . You can use either its contracted version (like ''sv'' for Swedish) or a more precise variety (like ''zh_CN'' or ''ca_ES@valencia'').&lt;br /&gt;
: '''This value is required'''.&lt;br /&gt;
&lt;br /&gt;
==== title ====&lt;br /&gt;
: The translation of addon's title for the target language.&lt;br /&gt;
: '''This value is required'''.&lt;br /&gt;
&lt;br /&gt;
==== description ====&lt;br /&gt;
: The translation of addon's description for the target language.&lt;br /&gt;
&lt;br /&gt;
The add-on server keeps track of some other information about uploaded content, including when they were uploaded, what languages they have been at least partly translated into, how large they are on the server and the number of times they have been downloaded. For more information about this you can read [[CampaignServerWML]].&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Dependency Key Example ===&lt;br /&gt;
&lt;br /&gt;
The following dependency key could be used when the add-on needs the ''Imperial_Era'' and ''Era_of_Myths'' to be installed before it will work properly:&lt;br /&gt;
&lt;br /&gt;
 dependencies=Imperial_Era,Era_of_Myths&lt;br /&gt;
&lt;br /&gt;
=== Version Key Examples ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.17|13}} the schema validation rejects many of the '''good''' examples. https://github.com/wesnoth/wesnoth/issues/7396&lt;br /&gt;
&lt;br /&gt;
The following are examples of '''good''' version values:&lt;br /&gt;
&lt;br /&gt;
 version=&amp;quot;1.5&amp;quot;&lt;br /&gt;
 version=&amp;quot;0.11.4&amp;quot;&lt;br /&gt;
 version=&amp;quot;0.1.4beta&amp;quot;&lt;br /&gt;
 version=&amp;quot;1.5c&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following are examples of '''bad''' version values:&lt;br /&gt;
&lt;br /&gt;
 version=&amp;quot;Beta1.5&amp;quot;&lt;br /&gt;
 version=&amp;quot;Incomplete (0.3.4)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In both of the above examples the version number as read by the server will be '''0.0.0Beta1.5''' and '''0.0.0Incomplete (0.3.4)'''. You can clearly see why this will not be a good thing with the ''Update add-ons'' feature.&lt;br /&gt;
&lt;br /&gt;
Finally, here are some example version numbers and how they will be interpreted by the ''Update add-ons'' button. The number on the left will be considered an earlier number than the number on the right in each example.&lt;br /&gt;
&lt;br /&gt;
 0.5 &amp;lt; 1.0&lt;br /&gt;
 1.5 &amp;lt; 1.5c&lt;br /&gt;
 1.0 &amp;lt; 1.0.1&lt;br /&gt;
 1.0c &amp;lt; 1.0.1a&lt;br /&gt;
 1.0.1a &amp;lt; 1.0.1c&lt;br /&gt;
 1.0 Final &amp;lt; 1.0.1 Beta&lt;br /&gt;
&lt;br /&gt;
=== Example .pbl File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=wml&amp;gt;&lt;br /&gt;
title=&amp;quot;My Campaign&amp;quot;&lt;br /&gt;
type=&amp;quot;campaign&amp;quot;&lt;br /&gt;
icon=&amp;quot;misc/ball.png&amp;quot;&lt;br /&gt;
version=&amp;quot;0.1.2&amp;quot;&lt;br /&gt;
author=&amp;quot;Me, artwork by myself&amp;quot;&lt;br /&gt;
passphrase=&amp;quot;This is like a password; see the security note in the documentation above before choosing a value of your own&amp;quot;&lt;br /&gt;
description=&amp;quot;You get to kill a lot of bad guys. But only the first map is done.&amp;quot;&lt;br /&gt;
email=&amp;quot;name@example.com&amp;quot;&lt;br /&gt;
[feedback]&lt;br /&gt;
    topic_id=12345&lt;br /&gt;
[/feedback]&lt;br /&gt;
# Note: the translation feature works on version 1.14.14, 1.15.4 and later only&lt;br /&gt;
[translation]&lt;br /&gt;
    language=&amp;quot;ru&amp;quot;&lt;br /&gt;
	title=&amp;quot;Моя Кампания&amp;quot;&lt;br /&gt;
    description=&amp;quot;Вам придётся завалить немало плохишей. Но пока что готова лишь первая карта.&amp;quot;&lt;br /&gt;
[/translation]&lt;br /&gt;
[translation]&lt;br /&gt;
    language=&amp;quot;zh_CN&amp;quot;&lt;br /&gt;
	title=&amp;quot;我的竞选&amp;quot;&lt;br /&gt;
    description=&amp;quot;你会杀死很多坏人。 但是只完成了第一张地图。(translated online)&amp;quot;&lt;br /&gt;
[/translation]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[IGNFileFormat]]&lt;br /&gt;
* [[FancyAddonIcons]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
* [[CampaignServerWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ImagePathFunctions&amp;diff=72725</id>
		<title>ImagePathFunctions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ImagePathFunctions&amp;diff=72725"/>
		<updated>2024-04-19T08:06:13Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* See Also */ Wesnoth RCX is now Wespal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image Path Functions provide a simple method for WML coders to alter the way their specified images will be displayed in the game. All of the function parameters are included at the end of an image path and should not contain any spaces or special characters (other than those specified here).&lt;br /&gt;
&lt;br /&gt;
If you need to practice it without having to reload all WML, you can use an add-on named ''Image loading tester''.  It is available on the 1.9, 1.10, 1.11, 1.12 and 1.14 add-on servers.&lt;br /&gt;
&lt;br /&gt;
All functions are applied in left-to-right order, with the exception of RC(), TC() and PAL() which are applied always before any other functions. Standard team coloring for a unit is applied after all custom RC(), TC() and PAL() functions but before any other functions.&lt;br /&gt;
That is, stuff like&lt;br /&gt;
 &amp;quot;units/elves-wood/fighter.png~CROP(20,20,40,40)~CROP(10,10,10,10)&amp;quot;&lt;br /&gt;
would result in taking a crop to a 40x40 rectangle whose top-left corner is x=20, y=20; and then taking a crop from ''that'' rectangle with x=10, y=10, w=10, h=10. The result is the area x=30, y=30, w=10, h=10 from the original graphic.&lt;br /&gt;
&lt;br /&gt;
== Changing the colors ==&lt;br /&gt;
&lt;br /&gt;
=== BLEND: Color-blend function ===&lt;br /&gt;
Blends the image with the given color to produce a more controlled tinting effect than color-shifting, independently of the image's contents.&lt;br /&gt;
&lt;br /&gt;
'''~BLEND(r,g,b,o)'''&lt;br /&gt;
&lt;br /&gt;
The color is defined by the ''r'', ''g'', and ''b'' parameters (integers ranging from 0 to 255). The ''o'' (opacity) parameter controls the amount by which the given color will be blended into the image, and may be specified either as a factor from 0.0 to 1.0, or percentage up to 100%. Thus, ~BLEND(r,g,b,0.5) and ~BLEND(r,g,b,50%) are equivalent.&lt;br /&gt;
&lt;br /&gt;
=== BW: Black and White function ===&lt;br /&gt;
{{devfeature1.13|1}}&lt;br /&gt;
May be used to convert the image to pure black and white, without grey pixels. &lt;br /&gt;
&lt;br /&gt;
'''~BW(threshold)'''&lt;br /&gt;
* ''threshold'': a value between 0 and 255 (both limits included). All pixels are converted as greyscale first, and if their average value is greater than the threshold they become white, otherwise they become black.&lt;br /&gt;
&lt;br /&gt;
=== CS: Color-shift function ===&lt;br /&gt;
Performs simple per-channel color shifts by adding the arguments to the respective color channels.&lt;br /&gt;
&lt;br /&gt;
''Multi-channel:'' '''~CS(r,g,b)'''&lt;br /&gt;
''Single-channel:'' '''~R(v)''', '''~G(v)''', '''~B(v)'''&lt;br /&gt;
&lt;br /&gt;
The multichannel syntax assumes all arguments are set to zero initially, so one can use, e.g. ~CS(2,4) to add +2 and +4 units to the red and green channels respectively, leaving the blue channel intact. Arguments may be negative to diminish a channel's value; this can be used to change an image's brightness. Checks for out-of-range arguments or results (less than 0 or greater than 255) are made, so the resultant values are truncated if necessary.&lt;br /&gt;
&lt;br /&gt;
The single channel syntax behaves exactly the same, except that only single-channel modifications are made per function. However, one can stack them to produce the same behavior as ~CS(), e.g. ~R(r)~G(g)~B(b), but that tends to be just a performance loss.&lt;br /&gt;
&lt;br /&gt;
=== GS: Greyscale function ===&lt;br /&gt;
May be used to greyscale the image (turn to black and white)&lt;br /&gt;
&lt;br /&gt;
'''~GS( )'''&lt;br /&gt;
&lt;br /&gt;
=== L: Lightmap color-shift function ===&lt;br /&gt;
Performs per-pixel and per-channel color shifts using another image (a &amp;quot;lightmap&amp;quot;) as source, allowing to create textured light effects.&lt;br /&gt;
&lt;br /&gt;
'''~L(lightmap)'''&lt;br /&gt;
&lt;br /&gt;
For each pixel of the original image, it checks the RGB values from the corresponding pixel of the lightmap, slightly transform them, then add these values to the original pixel.&lt;br /&gt;
&lt;br /&gt;
The transformation involved is done to convert the (0,255) spectrum to (-255,255), allowing to add or subtract color. The formula is (x-128)*2, which means that 0 gives -256, 128 gives 0 and 255 gives 254. So, the no-effect lightmap is a fully grey image (RGB = 128,128,128) and any non-grey pixel will shift the colors of the original.&lt;br /&gt;
&lt;br /&gt;
Note that the lightmap will be scaled to the same dimensions as the original image.&lt;br /&gt;
&lt;br /&gt;
=== NEG: Negative function ===&lt;br /&gt;
{{devfeature1.13|0}}&lt;br /&gt;
Also known as ''invert'', it negates all the RGB values of the image, giving it an effect similar to a photographic negative.&lt;br /&gt;
&lt;br /&gt;
'''~NEG( )'''&lt;br /&gt;
&lt;br /&gt;
Inverts the image, giving it an effect like a photographic negative.&lt;br /&gt;
&lt;br /&gt;
{{devfeature1.13|1}} '''~NEG(''' ''threshold'' ''')'''&lt;br /&gt;
&lt;br /&gt;
If a channel has a value greater than the threshold, the channel will be inverted, performing an effect known as ''solarization''.&lt;br /&gt;
Threshold must be between -1 and 255, with -1 equivalent to full inversion and 255 as no-op value.&lt;br /&gt;
&lt;br /&gt;
{{devfeature1.13|1}} '''~NEG(''' ''threshold_red, threshold_green, threshold_blue'' ''')'''&lt;br /&gt;
&lt;br /&gt;
If a channel has a value greater than the corresponding threshold, the channel will be inverted.&lt;br /&gt;
Each threshold must be between -1 and 255, with -1 equivalent to full inversion and 255 as no-op value.&lt;br /&gt;
&lt;br /&gt;
=== PAL: Palette-switch function ===&lt;br /&gt;
May be used to change colors in an image following the specifications of a source and target (new) palette.&lt;br /&gt;
&lt;br /&gt;
'''~PAL(''' ''source color palette'' '''&amp;gt;''' ''target color palette'' ''')'''&lt;br /&gt;
*''source color palette'' - the first parameter is a source color palette, such as magenta. Do not surround this parameter with quotes.&lt;br /&gt;
*''target color palette'' - the new palette to take the place of the source colors in the image.&lt;br /&gt;
&lt;br /&gt;
=== RC: Re-Color function ===&lt;br /&gt;
May be used to change some colors in an image. It is possible to use ''RC'' more than once on the same image, with different source palettes.&lt;br /&gt;
&lt;br /&gt;
'''~RC(''' ''source color palette'' '''&amp;gt;''' ''destination color range'' ''')'''&lt;br /&gt;
&lt;br /&gt;
==== source color palette ====&lt;br /&gt;
The first parameter is a set of colors, usually the magenta palette. Do not surround this parameter with quotes. The three standard palettes are:&lt;br /&gt;
&lt;br /&gt;
* '''magenta''' - the 19 colors described in [[Team_Color_Shifting]]&lt;br /&gt;
* '''ellipse_red''' - all 255 colors with RGB value (n,0,0)&lt;br /&gt;
* '''flag_green''' - all 255 colors with RGB value (0,n,0)&lt;br /&gt;
&lt;br /&gt;
The palette can also be given inline as a set of hexadecimal RGB values.&lt;br /&gt;
&lt;br /&gt;
The named palettes are defined using the '''[[GameConfigWML#Color_Palettes|[color_palette]]]''' tag, and you can also define your own custom color palette using that tag.&lt;br /&gt;
&lt;br /&gt;
Warning: the RC function will also accept (and not give a warning about) '''red''', '''green''' and any other defined '''[color_range]'''; however the set of RGB values for those aren't guaranteed. Using '''red''' instead of '''ellipse_red''' might be equivalent to the palette 030000,060000,0a0000,...,ff0000,ff0a0a,...,fff0f0.&lt;br /&gt;
&lt;br /&gt;
==== destination color range ====&lt;br /&gt;
This is the second parameter, signifying the ID of a color range defined in the file [http://github.com/wesnoth/wesnoth/blob/master/data/core/team-colors.cfg data/core/team-colors.cfg] (or it may be a custom ID for a color range defined locally). You can also define a custom color range inline (the rgb key from [[GameConfigWML#Color_Palettes]]; note that RC does not use the fourth color for anything).&lt;br /&gt;
&lt;br /&gt;
For this destination color range, using '''red''' or '''green''' makes sense.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
In the following example, the magenta regions in an elvish captain's image are turned a healthy shade of green:&lt;br /&gt;
&lt;br /&gt;
  [message]&lt;br /&gt;
      speaker=narrator&lt;br /&gt;
      image=units/elves-wood/captain.png~RC(magenta&amp;gt;green)&lt;br /&gt;
      message=_ &amp;quot;Now I am on the green team.&amp;quot;&lt;br /&gt;
  [/message]&lt;br /&gt;
&lt;br /&gt;
The following example replaces a few of the '''magenta''' pixels with green ones:&lt;br /&gt;
&lt;br /&gt;
  misc/orb.png~RC(690039,c30074,ec008c &amp;gt; 007f00,00ff00,000000,000000)&lt;br /&gt;
&lt;br /&gt;
The IDs of the color ranges may be the lowercased English name of the palette's base color (e.g. 'red', 'brown', etc.). They may also be numeric color indices from the palette WML included with the game, but this is not recommended.&lt;br /&gt;
&lt;br /&gt;
=== SEPIA: Sepia function ===&lt;br /&gt;
{{devfeature1.13|0}}&lt;br /&gt;
May be used to give to the image a sepia tint (like in old pictures).&lt;br /&gt;
&lt;br /&gt;
'''~SEPIA()'''&lt;br /&gt;
&lt;br /&gt;
=== SWAP: Channel Swap function ===&lt;br /&gt;
{{devfeature1.13|1}}&lt;br /&gt;
May be used to swap the RGBA channels of an image.&lt;br /&gt;
&lt;br /&gt;
'''~SWAP(''' ''r, g, b'' ''')'''&lt;br /&gt;
'''~SWAP(''' ''r, g, b, a'' ''')'''&lt;br /&gt;
* ''r'', ''g'', ''b'', ''a'': each of these arguments may have a value equal to ''red'', ''green'', ''blue'' or ''alpha''. The RGBA channels of the original image will be exchanged accordingly (for example, &amp;lt;tt&amp;gt;~SWAP(blue,green,red)&amp;lt;/tt&amp;gt; swaps the blue and red channels).&lt;br /&gt;
&lt;br /&gt;
=== TC: Team-Color function ===&lt;br /&gt;
In Wesnoth version 1.2, the only Image Path Function was '''~TC()''', which took two comma-separated parameters: the team number and the source color palette. The valid values for both of these parameters are defined in the file ''data/team-colors.cfg''&lt;br /&gt;
&lt;br /&gt;
'''~TC(''' ''team number'' ''',''' ''source color palette'' ''')'''&lt;br /&gt;
*''team number'' - this is the first parameter, a number 1-9 signifying the team number of a unit. Number 1 typically means the red team, 2 typically means the blue team, and so on (unless the scenario color settings for any side have been altered).&lt;br /&gt;
*''source color palette'' - the second parameter is a source color palette, usually magenta. Do not surround this parameter with quotes.&lt;br /&gt;
&lt;br /&gt;
== Transformations ==&lt;br /&gt;
&lt;br /&gt;
=== FL: Flip function ===&lt;br /&gt;
May be used to flip an image horizontally and/or vertically.&lt;br /&gt;
&lt;br /&gt;
'''~FL(''' ''optional argument list'' ''')'''&lt;br /&gt;
*''vertical'' - if the string &amp;quot;vert&amp;quot; is found anywhere in the argument list, the image will be flipped vertically.&lt;br /&gt;
*''horizontal'' - if the string &amp;quot;horiz&amp;quot; is found anywhere in the argument list, the image will be flipped horizontally.&lt;br /&gt;
*if the argument list is empty, the image will only be flipped horizontally.&lt;br /&gt;
&lt;br /&gt;
=== ROTATE: Rotate function ===&lt;br /&gt;
May be used to rotate an image.&lt;br /&gt;
&lt;br /&gt;
'''~ROTATE(''' ''degrees'' ''')'''&lt;br /&gt;
* ''degrees'' - The number of degrees by which the image will be rotated. Positive numbers indicate clockwise rotation, while negative numbers indicate counter-clockwise. (Zero indicates no rotation.)&lt;br /&gt;
If the number of degrees is omitted, a quarter turn (90 degrees) clockwise is assumed.&lt;br /&gt;
&lt;br /&gt;
=== SCALE: Image-scaling function ===&lt;br /&gt;
Scales a graphic up or down.&lt;br /&gt;
&lt;br /&gt;
'''~SCALE( ''new_width'', ''new_height'' )&lt;br /&gt;
&lt;br /&gt;
The ''new_width'' and ''new_height'' parameters are taken as the image's original width or height, respectively, if one of them happens to be zero. Negative values are treated in the same way, but an error is printed in stderr. This uses the bilinear interpolation algorithm.&lt;br /&gt;
&lt;br /&gt;
=== SCALE_INTO function ===&lt;br /&gt;
{{DevFeature1.13|5}}&lt;br /&gt;
&lt;br /&gt;
Similar to SCALE, but preserves aspect aspect ratio, scaling to the minimum extent required to fit into the specified area. The resulting image will have the specified width or the specified height, but not necessarily both.&lt;br /&gt;
&lt;br /&gt;
=== SCALE_SHARP function ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|0}}&lt;br /&gt;
&lt;br /&gt;
Scales functions using a nearest neighbor algorithm. Specify width and height. (It has the same syntax as ~SCALE.)&lt;br /&gt;
&lt;br /&gt;
'''~SCALE_SHARP(200,300)'''&lt;br /&gt;
&lt;br /&gt;
=== SCALE_INTO_SHARP function ===&lt;br /&gt;
{{DevFeature1.13|5}}&lt;br /&gt;
&lt;br /&gt;
Like SCALE_INTO, but uses nearest neighbor algorithm instead of bilinear interpolation.&lt;br /&gt;
&lt;br /&gt;
=== XBRZ function ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|0}}&lt;br /&gt;
&lt;br /&gt;
Scales functions using the XBRZ algorithm. You may scale things up either 2x, 3x, 4x, or 5x. The scaling tries to preserve the pixel art nature.&lt;br /&gt;
&lt;br /&gt;
'''~XBRZ(n)'''&lt;br /&gt;
&lt;br /&gt;
== Cut-and-paste ==&lt;br /&gt;
&lt;br /&gt;
=== BLIT: Blit function ===&lt;br /&gt;
Blit the parameter image on the main image. Example: peasant.png~BLIT(hat.png,30,10)&lt;br /&gt;
&lt;br /&gt;
'''~BLIT(src,x,y)'''&lt;br /&gt;
* ''src'': an image file used as source for the blit, other image path functions can be used there.&lt;br /&gt;
* ''x'',''y'': top-left corner coordinates where to blit. If missing assume (0,0).&lt;br /&gt;
&lt;br /&gt;
=== CROP: Crop function ===&lt;br /&gt;
Extracts a rectangular section of an image file.&lt;br /&gt;
&lt;br /&gt;
'''~CROP(x,y,width,height)'''&lt;br /&gt;
* ''x'',''y'': top-left corner coordinates for the rectangular section extracted. Must be greater or equal than zero, and inside the image's bounds.&lt;br /&gt;
* ''width'': width of the selected region. Must be less than or equal to the original image's width, and must not be negative.&lt;br /&gt;
* ''height'': height of the selected region. Must be less than or equal to the original image's height, and must not be negative.&lt;br /&gt;
&lt;br /&gt;
=== CROP_TRANSPARENT ===&lt;br /&gt;
{{devfeature1.17|26}}&lt;br /&gt;
Removes any transparent padding from around an image.&lt;br /&gt;
&lt;br /&gt;
'''~CROP_TRANSPARENT()'''&lt;br /&gt;
&lt;br /&gt;
=== MASK: Mask function ===&lt;br /&gt;
Remove parts of the main image using the parameter image as a mask. Example: grass.png~MASK(circle.png) will give a circle of grass.&lt;br /&gt;
&lt;br /&gt;
'''~MASK(mask,x,y)'''&lt;br /&gt;
* ''mask'': an image file used as mask, other image path functions can be used there.&lt;br /&gt;
* ''x'',''y'': top-left corner coordinates where to put the mask. Parts ouside of the mask are considered transparent. If missing assume (0,0).&lt;br /&gt;
&lt;br /&gt;
Only the alpha channel of the mask is used and each alpha value will be the maximum alpha of the resulting image. This means that the fully-transparent parts of the mask will erase the corresponding parts of the image, but also that a semi-transparent mask will create a semi-transparent image.&lt;br /&gt;
&lt;br /&gt;
== Opacity ==&lt;br /&gt;
&lt;br /&gt;
=== ADJUST_ALPHA ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|?}}&lt;br /&gt;
&lt;br /&gt;
Alters the alpha of the image according to a WFL formula. The formula must output an integer from 0 to 255 giving the alpha across the canvas. It is evaluated for every pixel and may use the following variables: x, y, red, green, blue, alpha, width, height. {{DevFeature1.15|0}} The variables u and v are also supported now, evaluating to normalized texture coordinates (in the range 0..1); these are equivalent to &amp;lt;tt&amp;gt;x/width&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;y/height&amp;lt;/tt&amp;gt; respectively.&lt;br /&gt;
&lt;br /&gt;
'''~ADJUST_ALPHA(formula)'''.&lt;br /&gt;
&lt;br /&gt;
The context object for the formula is a '''[[#CHAN:_General_function|pixel object]]'''.&lt;br /&gt;
&lt;br /&gt;
=== O: Opacity modifying function ===&lt;br /&gt;
Changes an image's opacity at render time.&lt;br /&gt;
&lt;br /&gt;
'''~O( ''factor or percentage%'' )'''&lt;br /&gt;
&lt;br /&gt;
If the argument includes the percentage symbol (''%''), it will be treated as a percentage of full (real) opacity; an image will be displayed at its native opacity with ~O(100%).&lt;br /&gt;
&lt;br /&gt;
Without the percentage symbol, the argument is assumed to be a factor by which the image's native opacity should be multiplied. Thus, ~O(0.5) and ~O(50%) are equivalent forms of specifying to reduce an image's opacity by half.&lt;br /&gt;
&lt;br /&gt;
=== PLOT_ALPHA ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|0}}&lt;br /&gt;
&lt;br /&gt;
At each pixel, the color is replaced with a grey-tone reflecting the alpha value at that pixel, and the new image is fully opaque. Useful for plotting the alpha to help debug an IPF or inspect a sprite.&lt;br /&gt;
&lt;br /&gt;
'''~PLOT_ALPHA()'''&lt;br /&gt;
&lt;br /&gt;
=== WIPE_ALPHA ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|0}}&lt;br /&gt;
&lt;br /&gt;
At each pixel, the alpha value is discarded and the pixel is made fully opaque. Useful again for diagnostics.&lt;br /&gt;
&lt;br /&gt;
'''~WIPE_ALPHA()'''&lt;br /&gt;
&lt;br /&gt;
=== Background coloring function ===&lt;br /&gt;
Sets the color of all the (semi-)transparent pixels of the image.&lt;br /&gt;
&lt;br /&gt;
'''~BG(r,g,b)'''&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
&lt;br /&gt;
=== BL: Blurring function ===&lt;br /&gt;
&lt;br /&gt;
Blurs a graphic at render time using the same algorithm used for in-game dialogs.&lt;br /&gt;
&lt;br /&gt;
'''~BL( ''radius'' )'''&lt;br /&gt;
&lt;br /&gt;
=== CHAN: General function ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|7}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to do pretty much anything. It takes up to four comma-separated formulas, one each for the red, green, blue, and alpha channels. Each formula functions exactly the same as the formula for '''ADJUST_ALPHA''', but the output integer is used for the corresponding channel rather than always the alpha channel. Do not surround the formula in &amp;lt;code&amp;gt;$(...)&amp;lt;/code&amp;gt;, since that will erase the &amp;lt;tt&amp;gt;self&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
&lt;br /&gt;
'''~CHAN(formula, formula, formula)'''&lt;br /&gt;
&lt;br /&gt;
The context object for each of the formulas is a '''pixel object''' with the following properties:&lt;br /&gt;
&lt;br /&gt;
* '''x''', '''y''': coordinates of the pixel, from the top left&lt;br /&gt;
* '''u''', '''v''': {{DevFeature1.15|0}} normalized coordinates in the range [0,1]&lt;br /&gt;
* '''width''', '''height''': size of the image canvas&lt;br /&gt;
* '''red''', '''green''', '''blue''', '''alpha''': components of the pixel colour&lt;br /&gt;
&lt;br /&gt;
=== DARKEN: Removed function ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|7}} This function has been removed. Use a ~BLIT(misc/tod-dark.png) call instead.&lt;br /&gt;
&lt;br /&gt;
Puts a time-of-day schedule overlay (misc/tod-dark.png) on the image, which must be large enough to accommodate it.&lt;br /&gt;
&lt;br /&gt;
'''~DARKEN()'''&lt;br /&gt;
&lt;br /&gt;
=== BRIGHTEN: Removed function ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|7}} This function has been removed. Use a ~BLIT(misc/tod-bright.png) call instead.&lt;br /&gt;
&lt;br /&gt;
Puts a time-of-day schedule overlay (misc/tod-bright.png) on the image, which must be large enough to accommodate it.&lt;br /&gt;
&lt;br /&gt;
'''~BRIGHTEN()'''&lt;br /&gt;
&lt;br /&gt;
=== NOP: Null function ===&lt;br /&gt;
&lt;br /&gt;
Does nothing.&lt;br /&gt;
&lt;br /&gt;
'''~NOP()'''&lt;br /&gt;
&lt;br /&gt;
=== Pseudo IPFs ===&lt;br /&gt;
&lt;br /&gt;
The following functions are ignored by the IPF image modification module, but used by other Wesnoth components. They only work in special areas.&lt;br /&gt;
&lt;br /&gt;
==== NO_TOD_SHIFT: Disabling ToD ====&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|8}}&lt;br /&gt;
&lt;br /&gt;
This is used by the terrain renderer and prevents terrain and item images from being affected by ToD lighting. This is in particular useful when placing unit images as items, as they will look the same as when placed as unit.&lt;br /&gt;
&lt;br /&gt;
'''~NO_TOD_SHIFT()'''&lt;br /&gt;
&lt;br /&gt;
==== RIGHT: Display portraits on the right ====&lt;br /&gt;
&lt;br /&gt;
'''''([[DevFeature|Version 1.5.8 and later only]])'''''&lt;br /&gt;
&lt;br /&gt;
This is used by the [[InterfaceActionsWML#.5Bmessage.5D|'''[message]''']] interface action and can be used to show a portrait on the right side of the screen.&lt;br /&gt;
&lt;br /&gt;
'''~RIGHT()'''&lt;br /&gt;
&lt;br /&gt;
== Creating an image file from IPFs ==&lt;br /&gt;
&lt;br /&gt;
The big advantage of Image Path Functions is that they allow you to alter an image without needing a new image file. However, you can also save the result into a new image file using Wesnoth's command line option ''--render-image'.&lt;br /&gt;
&lt;br /&gt;
Assuming you find a way to open your computer's terminal:&lt;br /&gt;
 wesnoth --render-image &amp;quot;units/human-peasants/ruffian.png~RC(magenta&amp;gt;green)~BLIT(units/human-peasants/woodsman.png~RC(magenta&amp;gt;lightblue),18,12)&amp;quot; /tmp/new_image_file.png&lt;br /&gt;
&lt;br /&gt;
Or on Windows:&lt;br /&gt;
 &amp;quot;C:\Path\to\Battle for Wesnoth\wesnoth.exe&amp;quot; --render-image &amp;quot;units/human-peasants/ruffian.png~RC(magenta&amp;gt;green)~BLIT(units/human-peasants/woodsman.png~RC(magenta&amp;gt;lightblue),18,12)&amp;quot; new_image_file.png&lt;br /&gt;
&lt;br /&gt;
Use cases include:&lt;br /&gt;
* Experimenting with Image Path Functions. If none of the images are from an add-on, adding ''--noaddons'' will speed this up.&lt;br /&gt;
* If a new Image Path Function is added to the development version of Wesnoth, add-ons for older Wesnoth versions can use a generated image instead.&lt;br /&gt;
* In case you want to use this anywhere out of Wesnoth. On a website, in Project Haldric, …&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[FancyAddonIcons]] - Tips and tricks for advanced Image Path Function manipulation&lt;br /&gt;
* [[DataURI]] - An image path may also contain the image directly, as a Base64 encoded string&lt;br /&gt;
* [https://irydacea.me/projects/wespal Wespal]  - Tool to preview unit recoloring. Covers the effects of the [[#RC:_Re-Color_Function|RC]], [[#TC: Team-Color Function|TC]] and [[#PAL:_Palette-switch_Function|PAL]] functions.&lt;br /&gt;
* [https://github.com/wesnoth/wesnoth/blob/master/src/image_modifications.cpp src/image_modifications.cpp] - file where IPFs are implemented &lt;br /&gt;
[[Category:WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=NotSoEasyCoding&amp;diff=72513</id>
		<title>NotSoEasyCoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=NotSoEasyCoding&amp;diff=72513"/>
		<updated>2024-03-21T23:00:58Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update outdated info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists projects which are considered a good idea by the developers but which have nobody working on them so far. If you think you've got the required skill for a task go on, implement it and you've got a high chance that it'll be accepted. The remaining barrier will only be that it's done well. :-)&lt;br /&gt;
&lt;br /&gt;
If you are such a person, you should feel free to edit this page.&lt;br /&gt;
&lt;br /&gt;
If you're not, you should post a feature request and discuss your idea on the forum or IRC or Discord. A coder with better knowledge of the code might give you the green light to add your feature here.&lt;br /&gt;
&lt;br /&gt;
Anybody should feel free to add &amp;quot;clues&amp;quot; to any tasks, that is entry points, traps to avoid, person to contact to discuss and so on.&lt;br /&gt;
&lt;br /&gt;
If you plan to work on a feature, write your name at the bottom of the feature, with the date. Note that if you spend too long at working on a feature we'll &amp;quot;free&amp;quot; it back (that is if you're not working on it. If you have problems implementing it, just tell us....). We sometimes forget to update this page so it is recommended that, before you start to work on a task, that you ask in irc/Discord whether its still considered a good idea.&lt;br /&gt;
&lt;br /&gt;
If you are  part of the Wesnoth dev team you can also add new entries to the list, a new entry must contain at least&lt;br /&gt;
&lt;br /&gt;
1) A description of the problem.&lt;br /&gt;
2) A motivation why or in which situations this is important.&lt;br /&gt;
3) A link to a corresponding ticket on our bugtracker for discussion, if there is no ticket yet then  make one.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Game engine ==&lt;br /&gt;
&lt;br /&gt;
=== [[OpenGL port]] ===&lt;br /&gt;
&lt;br /&gt;
While software rendering is all good and nice, Wesnoth's approach does not scale well as display resolutions increase and the need for supporting high DPI configurations is factored in. One can easily see that our zoom functionality is clunky and inefficient. Having support for OpenGL and shaders would also enable us to implement fancier graphical gimmicks such as particle effects and atmospheric lighting. The downside of adding OpenGL to the mix is that we'd need people with a specific skillset to help us maintain the graphics engine in the long term, as hardware and driver-specific quirks are inevitable. Some users are also concerned about changing Wesnoth's hardware requirements so that they would be unable to play using old or unsupported hardware/OS configurations.&lt;br /&gt;
&lt;br /&gt;
For hardware rendering to be effective, in particular, Wesnoth would necessitate a complete rewrite of the graphics rendering code (the display and game_display classes), the image cache manager (used to abstract the process of loading images from disk and applying image path functions), and potentially GUI2's canvas code. All three would have to limit the amount of textures they allocate to the absolute minimum, using larger textures instead. For example, the image cache could be reimplemented to load images from an internal spritesheet generated during the game loading process. (WML/Lua support for spritesheets would be nice would defining an API for it would only distract from the actual task at hand.)&lt;br /&gt;
&lt;br /&gt;
The greatest difficulty in handling this task probably lies in writing a new optimized rendering engine and updating all code that relies on the old display/game_display API and semantics accordingly. The GUI2 framework code is presently unmaintained and it would take some time for somebody to study and change the current implementation. Finally, as we don't have a graphics engine maintainer at this time, this task involves an implicit long-term commitment to the project that extends beyond whichever Wesnoth series that will see this project completed.&lt;br /&gt;
&lt;br /&gt;
One of the many issues related to switching from software rendering to hardware rendering is Wesnoth's [[ImagePathFunctions]] mini-language. There is already a proof of concept [https://github.com/CelticMinstrel/wesnoth-ipf here] that converts most IPFs to OpenGL shader code, but quite a bit more work would need to be done to make something usable out of it. In particular, the ability to compile arbitrary [[Wesnoth Formula Language]] code into shaders would be needed, since some IPFs embed the language.&lt;br /&gt;
&lt;br /&gt;
=== Improve WML error reporting ===&lt;br /&gt;
&lt;br /&gt;
There are many programming bugs that give very unclear or cryptic error messages when using WML. Here are some examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;When calling a macro with the wrong number of arguments, Wesnoth tells the number it expected, and the number it got, and at which line number it was instantiated. However, it would be helpful if it would also tell the line number of the definition of the macro. This might be helpful if someone is redefining macros.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* For places where a standard unit filter is expected, if one is not found, the game should point out a problem. For places where such a filter is expected but [filter] child should not appear, if one does it should report an error and a line number. Many users have a hard time with this kind of thing.&lt;br /&gt;
&lt;br /&gt;
* When doing scenario transitions in a campaign, if the side definitions don't match up exactly the game tends to give unintelligible error messages. For instance, if one is transitioning and there is an AI side which does not have a leader (but it has a starting location in the map) it must have &amp;quot;no_leader = yes&amp;quot; in its [side] tag, or else when the team_builder objects enter stage two, the game will try to create a unit with an empty type, and the constructor of class unit will fail giving the error message &amp;quot;game::game_error tried to create unit with empty type&amp;quot;. This really needs to be much better. For instance, giving a line number of a problem, or suggesting that no_leader should be used. (Note that, it is often possible to debug problems like this by turning on --log-debug=team_construction at commandline but I doubt that there are any users that know about this, you would only learn from reading the C++... without such debug info, fixing things like this can literally take hours.) For that matter it's some question why the team_builder doesn't just stop trying to build a unit when it sees it doesn't have enough info...&lt;br /&gt;
&lt;br /&gt;
* Recursive macros break the game, and not by stack overflow but by exhausting the heap (which usually takes forever on modern OSes and results in memory thrashing &amp;lt;i&amp;gt;before&amp;lt;/i&amp;gt; resource starvation). It would be nice if we could catch this and report an error.&lt;br /&gt;
&lt;br /&gt;
Many WML users are students or beginners to programming, so any improvements to WML error reporting are a big help for their learning process -- many veterans would appreciate the extra help as well. In part we need fixits here and there, but more broadly we need a smarter system that can figure out what's really wrong when things go wrong, and give helpful suggestions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Don't store all events in savefiles ===&lt;br /&gt;
&lt;br /&gt;
Currently all events in a scenario are stored twice in each savefile (in [snapshot] and it [replay_start]), specially on wml-heavy umc content this can make savefiles quite big, The proposed solution is that events are not stored in savefiles when they are the same as in the scenario/era/modification file (e.g. not dynamically added with actionwml).&lt;br /&gt;
In detail the savefile should for all events that have an id and are not generated dynamically ([event] actionwml), store dummy events like &lt;br /&gt;
 [event]&lt;br /&gt;
  id=event_id&lt;br /&gt;
  is_unchanged=yes&lt;br /&gt;
 [/event]&lt;br /&gt;
in the savefiles (instead of full events), where the event is then read from the scenario/era/modification tag when the scenario is loaded. This should only apply to campaigns/modifications/mp maps/eras that require download (which is usually the case for campaigns but not for mp maps)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/wesnoth/wesnoth/issues/1512&lt;br /&gt;
&lt;br /&gt;
== Multiplayer/replay features ==&lt;br /&gt;
&lt;br /&gt;
=== Gold graph ===&lt;br /&gt;
&lt;br /&gt;
Make a graph feature, presumably in a dialog, that helps depict the history of a Wesnoth match for the benefit of spectators of a live game or replay. For example it could display army value, army + bank value, number of villages tagged, luck swings... This would also be particularly helpful for AI tweaking development, by helping coders identify the AI's weaknesses and strengths in the context of a particular scenario.&lt;br /&gt;
&lt;br /&gt;
A possible nice feature for this purpose would be to allow the user to click on the graph at key points which would trigger the &amp;quot;back to turn&amp;quot; mechanism to jump back in the replay, or automatically play the replay forwards from the beginning to that point... etc.&lt;br /&gt;
&lt;br /&gt;
Related email on dev-talk: https://mail.gna.org/public/wesnoth-dev/2014-02/msg00089.html&lt;br /&gt;
&lt;br /&gt;
=== Automatically link up to wesnothd server on a local network ===&lt;br /&gt;
&lt;br /&gt;
The feature request was to use ZeroConf technology, if available, to publish info of a running wesnothd instance to other machines on a local network. Then when they are searching to connect to an unofficial server, they won't have to learn the IP address.&lt;br /&gt;
&lt;br /&gt;
The extra code should be guarded with preprocessor flags so that ZeroConf does not become a mandatory build dependency of Wesnoth.&lt;br /&gt;
&lt;br /&gt;
https://github.com/wesnoth/wesnoth/issues/1162&lt;br /&gt;
&lt;br /&gt;
=== Stock MP chat messages for language-independent communication ===&lt;br /&gt;
&lt;br /&gt;
Wesnoth has seen a large acceptance by international communities, and many players don't speak English. It would be nice we could have a set of messages that could be chatted, but which will be translated by our translators and displayed always in the current locale on each client, to make it easier to communicate in mp games / on the mp server.&lt;br /&gt;
&lt;br /&gt;
The easy part is adding the messages. They would ideally be stored in a WML file in the core data dir so they can be easily modified and translated like all other mainline WML. The hard part is devising the interaction mechanism so that a player can easily make use of these stock messages in the MP lobby or in game.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GUI2 framework ==&lt;br /&gt;
&lt;br /&gt;
As of 1.13.1+dev, GUI2's core and framework (including widgets and their APIs) are completely unmaintained. A prospective maintainer would have to be able to understand pretty advanced C++ making abundant use of template-based abstractions (most notably, the event handling code is almost completely implemented this way), multiple inheritance, and polymorphism. There is also some missing functionality (such as combo boxes and modeless dialogs) that the author did not get to implement, as well as work-in-progress functionality (new listbox and tooltip implementations, not enabled by default).&lt;br /&gt;
&lt;br /&gt;
=== Generic tab_container widget ===&lt;br /&gt;
&lt;br /&gt;
After 1.13.1 was released, Iris discovered a trick to implement tabbed dialogs in GUI2, involving a general widget bug fix to make children consider their parents' visibility when processing events, and an addition to the stacked_widget API enabling users to hide all but a single active layer.&lt;br /&gt;
&lt;br /&gt;
The About dialog introduced in version 1.13.2 will use a horizontal listbox in combination with a stacked_widget, but ideally we should be able to reuse this pattern in more places without having to clutter up dialog implementations with the requisite code to synchronize the listbox and the stacked_widget's states. This hypothetical tab_container widget would combine the listbox and the stacked_widget to implement tabs in a cleaner fashion without having to expose the implementation details to individual dialog instances.&lt;br /&gt;
&lt;br /&gt;
By all means, this should be an [[EasyCoding]] task, but GUI2's unusual code layout and API design conventions (compared to the rest of Wesnoth) ''may'' make it harder than it's supposed to be.&lt;br /&gt;
&lt;br /&gt;
=== GUI2 themable in-game UI ===&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;themable&amp;quot; in-game UI refers to the gameplay UI including the sidebar, menu/status bar, and map view. Most of it is not implemented using proper GUI1 widgets at all, except for the various interactive buttons, menus (which are floating GUI1 listboxes), and the command and chat input boxes (floating GUI1 textboxes).&lt;br /&gt;
&lt;br /&gt;
Moving the theme UI to GUI2 would probably require finishing up theme support in GUI2 (which is largely incomplete), and may benefit from a rendering engine redesign as is also required for porting the game to SDL 2; in particular so that the GUI aspects are more clearly separated from the game board rendering aspect.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This task is here solely for the sake of completeness, and only somebody very well versed in the intricacies of Wesnoth's game rendering code and GUI2 should '''ever''' try to take it up. (And even then, I would not want to be anywhere near that person when they inevitably break down and fling one or more tables around upon realizing the sheer complexity of the task. -- Iris)&lt;br /&gt;
&lt;br /&gt;
=== Rich Text Label Widget ===&lt;br /&gt;
&lt;br /&gt;
As of version 1.13.11, the one last dialog that hasn't yet been converted to GUI2 is the help dialog. In order to finish this conversion, a new type of widget is required. It needs to be able to support text with embedded images (both centered as a block and with text wrapped around them), clickable links that trigger a callback, and tab stops, on top of the regular Pango formatting stuff. This can probably all be done with Pango, but requires digging deeper into the API (particularly for the text wrap shapes). It would also need to parse markup, for example an extension of the standard Pango markup.&lt;br /&gt;
&lt;br /&gt;
== Add-ons server and client ==&lt;br /&gt;
&lt;br /&gt;
=== Passphrase hashing ===&lt;br /&gt;
&lt;br /&gt;
The add-ons server ([[campaignd]]) uses a very dumb authentication scheme for uploading add-ons where an author sets a passphrase (or gets a random passphrase assigned by the game) the first time they upload to the server, and subsequent uploads of the same add-on are only allowed if the passphrase matches. The passphrase is stored in clear text form both client and server-side, which has [http://forums.wesnoth.org/viewtopic.php?f=62&amp;amp;t=42663 various implications].&lt;br /&gt;
&lt;br /&gt;
Ideally, the server would store all passphrases in a hashed form.&lt;br /&gt;
&lt;br /&gt;
=== Port redirection ===&lt;br /&gt;
&lt;br /&gt;
Wesnoth's MP server (wesnothd) uses a single port (15000) for servicing most requests and redirects clients to different ports according to the game client's version number. This allows the server administrators to reassign ports freely without having to modify the game client.&lt;br /&gt;
&lt;br /&gt;
The add-ons server (campaignd) and client instead have a hardcoded default port number for a Wesnoth version series. For example, 1.12.x is hardcoded to default to 15006. This becomes a maintainability issue as add-on servers get decommissioned and their port numbers can't be reused for fear of misdirecting obsolete client versions to the wrong instance with incompatible add-ons.&lt;br /&gt;
&lt;br /&gt;
== Multiplayer server and client ==&lt;br /&gt;
&lt;br /&gt;
=== Improve server WML processing ===&lt;br /&gt;
&lt;br /&gt;
The server uses its own custom WML implementation separate from the main engine's to store and process WML objects for games -- see [[WesnothdDesign#simple_wml]]. This is intended to improve performance and reduce wesnothd's memory footprint with large numbers of games and complex scenarios. However, the simple_wml code sometimes messes up WML attribute translatability, resulting in MP scenarios/campaigns being untranslated for non-hosts in networked MP (https://github.com/wesnoth/wesnoth/issues/1420). Fixing this is not easy due to the aforementioned performance requirements.&lt;br /&gt;
&lt;br /&gt;
== WML-related features ==&lt;br /&gt;
=== Game Information ===&lt;br /&gt;
&lt;br /&gt;
* [query_location] - queries a location from the user&lt;br /&gt;
** variable&lt;br /&gt;
** [filter_location]&lt;br /&gt;
''Regarding [query_location]: probably a better name would be choose_location. This is used when a wml event is running and needs to get a target location hex from the user. For example, you right click on a catapult unit and choose the menu item &amp;quot;fire Catapult.&amp;quot; Now a [message] says to click on any target within 5 hexes. Now [choose_location] is encountered and the mouse cursor changes to a target sign (possibly customizable). If the user's mouse drifts outside of the allowed locations it changes to a cancel icon. If the operation is cancelled then the variable is cleared and no location stored. --Sapient''&lt;br /&gt;
&lt;br /&gt;
''This can be implemented in lua by using wesnoth.game_events.on_mouse_action and wesnoth.syncronize_choice''&lt;br /&gt;
&lt;br /&gt;
https://github.com/wesnoth/wesnoth/issues/2325&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Project&amp;diff=72512</id>
		<title>Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Project&amp;diff=72512"/>
		<updated>2024-03-21T22:59:16Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;tright&amp;quot;&amp;gt; __TOC__ &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;The Battle for Wesnoth&amp;lt;/i&amp;gt; is an [https://opensource.org/faq#osd open source] software project hosted on [https://github.com/wesnoth GitHub], created and maintained by &amp;lt;i&amp;gt;The Battle for Wesnoth Project&amp;lt;/i&amp;gt;, an [[Credits|international team of volunteers]] from diverse backgrounds. Conceived in 2003 by David White, &amp;lt;i&amp;gt;Wesnoth&amp;lt;/i&amp;gt; has caught the interest of a multitude of fans who have since contributed to different aspects of the game such as engine coding, content creation, art and music development, translation, packaging, testing, and community management.&lt;br /&gt;
&lt;br /&gt;
The Project is governed by the Project Manager and the Project Council as per the [https://www.wesnoth.org/constitution/ Project Constitution]. The current Project Manager [https://forums.wesnoth.org/viewtopic.php?t=55254 elected] by the development team for the Wesnoth 1.17.x development cycle is Pentarctagon. Past Project Managers include Charles Dang (vultraz), Iris Morelle (Irydacea), Nils Kneuper (Ivanovic) and Isaac Clerencia (isaac).&lt;br /&gt;
&lt;br /&gt;
The Wesnoth.org website, primary multiplayer server, and add-ons server facilities are managed by a few members of the project who staff the game's backend infrastructure.&lt;br /&gt;
&lt;br /&gt;
Funding for infrastructure and art and music commissions is provided by Wesnoth, Inc., a US-based company which manages revenue from donations made to Wesnoth through [https://liberapay.com/Wesnoth Liberapay] and [https://wesnoth.itch.io/battle-for-wesnoth itch.io]. While Wesnoth, Inc. financially supports the project, it does not have any involvement in its organization and direction. The current board of directors consists of Elvish_Hunter, Pentarctagon, and Soliton.&lt;br /&gt;
&lt;br /&gt;
== Content Creators ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth's great replay value mainly stems from the great abundance of custom-made content developed by our talented community. It only takes a copy of the game, a text editor, creativity, and patience to create your own campaign, era, or multiplayer scenario!&lt;br /&gt;
&lt;br /&gt;
See [[Create]] for more information on the subject of user-made content development.&lt;br /&gt;
&lt;br /&gt;
== Artists ==&lt;br /&gt;
&lt;br /&gt;
Graphic artists and musicians usually meet on the [https://forums.wesnoth.org/ Wesnoth.org forums]. While the main game is generally regarded as feature-complete, there is plenty of room for improvement in areas such as animations and sound effects. User-made content creators are also always in need of new art, music, and sounds for their own projects!&lt;br /&gt;
&lt;br /&gt;
* [https://forums.wesnoth.org/viewforum.php?f=9 Mainline art contributions forum]&lt;br /&gt;
* [https://forums.wesnoth.org/viewforum.php?f=18 Mainline art development forum] (restricted to established contributors)&lt;br /&gt;
* [https://forums.wesnoth.org/viewforum.php?f=23 User-made art development forum]&lt;br /&gt;
* [https://forums.wesnoth.org/viewforum.php?f=14 Music contributions forum]&lt;br /&gt;
&lt;br /&gt;
== Developers ==&lt;br /&gt;
&lt;br /&gt;
The project is always eager to welcome new contributors able to help by fixing [https://bugs.wesnoth.org/ bugs], cleaning up and improving on existing code, or implementing new and exciting features!&lt;br /&gt;
&lt;br /&gt;
* [[WesnothRepository]] — cloning and using our Git repository&lt;br /&gt;
* [[CodingStandards]] and [[HackingWesnoth]] — information on our C++ style and coding conventions&lt;br /&gt;
* [[PatchSubmissionGuidelines]] — instructions for submitting your code contributions&lt;br /&gt;
* [[DeveloperGuide]] — additional information on commit messages, unit tests, etc.&lt;br /&gt;
* [https://devdocs.wesnoth.org/ Source code documentation] — generated from the game's source code using Doxygen and updated daily.&lt;br /&gt;
* [[ReferenceWML]] — information on the Wesnoth Markup Language (WML) and the game's Lua API&lt;br /&gt;
* [[DeveloperResources]] — additional development-related links&lt;br /&gt;
&lt;br /&gt;
== Translators ==&lt;br /&gt;
&lt;br /&gt;
In order to better reach its audience, Wesnoth needs people able to translate the game into other languages from across the globe. If you consider yourself able to help, join the translation team for your language -- or if none has been established already, follow the instructions to start your own!&lt;br /&gt;
&lt;br /&gt;
* [[WesnothTranslations]] — includes a list of translation maintainers and useful links for prospective translators&lt;br /&gt;
* [http://gettext.wesnoth.org Statistics]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=IntroWML&amp;diff=72455</id>
		<title>IntroWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=IntroWML&amp;diff=72455"/>
		<updated>2024-03-06T04:37:17Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: linkies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
&lt;br /&gt;
The '''[story]''' tag is a series of images and text to display as the first part of the intro screen. It can appear in [[ScenarioWML]] or {{DevFeature1.13|8}} as [[InterfaceActionsWML#.5Bstory.5D|ActionWML]].&lt;br /&gt;
&lt;br /&gt;
The [[InterfaceActionsWML#.5Bdeprecated_message.5D|'''[deprecated_message]''']], [[InterfaceActionsWML#.5Bwml_message.5D|'''[wml_message]''']], and [[VariablesWML#.5Binsert_tag.5D|'''[insert_tag]''']] tags are allowed beneath '''[story]'''.  Most other WML tags will not be recognized in this context. Note, however, that messages produced by the first two tags will not appear in the game interface until the actual game map appears.&lt;br /&gt;
&lt;br /&gt;
The only other tags currently recognized within '''[story]''' and '''[part]''' are [[ConditionalActionsWML#.5Bif.5D|'''[if]'''/'''[then]'''/'''[else]''']] ({{DevFeature1.13|0}}: also [[ConditionalActionsWML#.5Bif.5D|'''[elseif]''']]) and [[ConditionalActionsWML#.5Bswitch.5D|'''[switch]'''/'''[case]''']]. These can be used to show parts conditionally on the values of variables.&lt;br /&gt;
&lt;br /&gt;
See also the journey and battle macros, in the [https://www.wesnoth.org/macro-reference.html#file:image-utils.cfg Macro Reference]&lt;br /&gt;
&lt;br /&gt;
== [part] ==&lt;br /&gt;
&lt;br /&gt;
Each '''[part]''' tag represents one &amp;quot;page&amp;quot; of a story sequence, with its own text and images. The player advances through parts by clicking on the '''Next'''/'''→''' button to advance one part, the '''Back'''/'''←''' button to go back one part, and the '''Skip''' button to leave the story sequence and start/return to the game.&lt;br /&gt;
&lt;br /&gt;
The following keys/tags are recognized for '''[part]'''.&lt;br /&gt;
&lt;br /&gt;
=== Main text keys ===&lt;br /&gt;
&lt;br /&gt;
* '''story''': (translatable) the text to display below the image.&lt;br /&gt;
* '''text_alignment''': specifies the alignment of the story text. It must be one of ''left'' (default), ''center'' or ''right''.&lt;br /&gt;
* '''text_layout''': specifies the vertical portion of the screen where the story text will be displayed. It must be one of ''top'', ''middle'' or ''bottom'' (default).&lt;br /&gt;
&lt;br /&gt;
=== Title text keys ===&lt;br /&gt;
&lt;br /&gt;
* '''show_title''': whether to display the title of the scenario at the top&lt;br /&gt;
* '''title''': specifies a custom title to display instead of the name of the scenario. If specified, it implies '''show_title=yes'''. If parent the '''[story]''' is used through [[InterfaceActionsWML#.5Bstory.5D|ActionWML]] with '''show_title=yes''', the '''title''' key must be explicitly specified as it does not default to the scenario title and leads to a missing title error if omitted.&lt;br /&gt;
* '''title_alignment''': specifies the alignment of the title box. It must be one of ''left'' (default), ''center'' or ''right''.&lt;br /&gt;
&lt;br /&gt;
=== Image and sound keys ===&lt;br /&gt;
&lt;br /&gt;
* '''background''': the image to display. Story images are usually created specially for this purpose, except for the map.&lt;br /&gt;
* '''scale_background''': Whether to scale the background, default yes.&lt;br /&gt;
* '''music''': change to this music&lt;br /&gt;
* '''sound''': a list of sound files; the engine will choose one at random and play it once while displaying the story part.&lt;br /&gt;
* '''voice''': a list of sound files; the engine will choose one at random and play it on a sound channel intended for voice overs once while displaying the story part.&lt;br /&gt;
&lt;br /&gt;
=== [background_layer] ===&lt;br /&gt;
&lt;br /&gt;
A layer of the background of the story screen.&lt;br /&gt;
&lt;br /&gt;
* '''image''': path to the image file.&lt;br /&gt;
* '''scale_vertically''': whether the image should be scaled to fill the screen in the vertical dimension. Default yes.&lt;br /&gt;
* '''scale_horizontally''': whether the image should be scaled to fill the screen in the horizontal dimension. Default yes.&lt;br /&gt;
* '''scale''': a shortcut to set scale_vertically and scale_horizontally at once. If specified, the values of the former two keys will be ignored.&lt;br /&gt;
* '''keep_aspect_ratio''': whether the aspect ratio of the image should be preserved while scaling. Default yes.&lt;br /&gt;
* '''tile_vertically''': whether the image should be tiled in the vertical direction. Tiling happens after aligning the image to the center of the screen. Default no.&lt;br /&gt;
* '''tile_horizontally''': whether the image should be tiled in the horizontal direction. Tiling happens after aligning the image to the center of the screen. Default no.&lt;br /&gt;
* '''tile''': a shortcut to set tile_vertically and tile_horizontally at once. If specified, the values of the former two keys will be ignored.&lt;br /&gt;
* '''base_layer''': whether is this the layer to align the overlay images to. Default no.&lt;br /&gt;
&lt;br /&gt;
=== [image] ===&lt;br /&gt;
&lt;br /&gt;
An image to display.&lt;br /&gt;
&lt;br /&gt;
* '''x''', '''y''': the location to draw the image, using the pixels of the '''base_layer''' background image as the coordinate system.&lt;br /&gt;
* '''centered''': If &amp;quot;yes&amp;quot;, use the center of the image as the anchor point when placing at the x,y coordinates, if &amp;quot;no&amp;quot; then use the top-left corner.&lt;br /&gt;
* '''file''': the image to display.&lt;br /&gt;
* '''delay''': the time to delay drawing this image.&lt;br /&gt;
* '''resize_with_background''': {{DevFeature1.15|7}} if &amp;quot;yes&amp;quot;, apply the same scaling as applied to the '''base_layer'''&lt;br /&gt;
&lt;br /&gt;
Each image is placed using the pixels of the background_layer as the coordinate system; each image's location moves to compensate when the background image is scaled. Example: my background image is a map with a city at pixel 160,100; I put a battle marker on that city using '''x,y,centered=160,100,yes'''. When a user plays the game they will see the map enlarged to fill the window (regardless of its size), and the battle marker will still be on top of the city.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=IntroWML&amp;diff=72454</id>
		<title>IntroWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=IntroWML&amp;diff=72454"/>
		<updated>2024-03-06T04:33:50Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: [image] has never been a direct descendant of [story]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
&lt;br /&gt;
The '''[story]''' tag is a series of images and text to display as the first part of the intro screen. It can appear in [[ScenarioWML]] or {{DevFeature1.13|8}} as [[InterfaceActionsWML#.5Bstory.5D|ActionWML]].&lt;br /&gt;
&lt;br /&gt;
The '''[deprecated_message]''', '''[wml_message]''', and '''[insert_tag]''' tags are allowed beneath '''[story]'''.  Most other WML tags will not be recognized in this context. Note, however, that messages produced by the first two tags will not appear in the game interface until the actual game map appears.&lt;br /&gt;
&lt;br /&gt;
The only other tags currently recognized within '''[story]''' and '''[part]''' are '''[if]'''/'''[then]'''/'''[else]''' ({{DevFeature1.13|0}}: also '''[elseif]''') and '''[switch]'''/'''[case]'''. These can be used to show parts conditionally on the values of variables.&lt;br /&gt;
&lt;br /&gt;
See also the journey and battle macros, in the [https://www.wesnoth.org/macro-reference.html#file:image-utils.cfg Macro Reference]&lt;br /&gt;
&lt;br /&gt;
== [part] ==&lt;br /&gt;
&lt;br /&gt;
Each '''[part]''' tag represents one &amp;quot;page&amp;quot; of a story sequence, with its own text and images. The player advances through parts by clicking on the '''Next'''/'''→''' button to advance one part, the '''Back'''/'''←''' button to go back one part, and the '''Skip''' button to leave the story sequence and start/return to the game.&lt;br /&gt;
&lt;br /&gt;
The following keys/tags are recognized for '''[part]'''.&lt;br /&gt;
&lt;br /&gt;
=== Main text keys ===&lt;br /&gt;
&lt;br /&gt;
* '''story''': (translatable) the text to display below the image.&lt;br /&gt;
* '''text_alignment''': specifies the alignment of the story text. It must be one of ''left'' (default), ''center'' or ''right''.&lt;br /&gt;
* '''text_layout''': specifies the vertical portion of the screen where the story text will be displayed. It must be one of ''top'', ''middle'' or ''bottom'' (default).&lt;br /&gt;
&lt;br /&gt;
=== Title text keys ===&lt;br /&gt;
&lt;br /&gt;
* '''show_title''': whether to display the title of the scenario at the top&lt;br /&gt;
* '''title''': specifies a custom title to display instead of the name of the scenario. If specified, it implies '''show_title=yes'''. If parent the '''[story]''' is used through [[InterfaceActionsWML#.5Bstory.5D|ActionWML]] with '''show_title=yes''', the '''title''' key must be explicitly specified as it does not default to the scenario title and leads to a missing title error if omitted.&lt;br /&gt;
* '''title_alignment''': specifies the alignment of the title box. It must be one of ''left'' (default), ''center'' or ''right''.&lt;br /&gt;
&lt;br /&gt;
=== Image and sound keys ===&lt;br /&gt;
&lt;br /&gt;
* '''background''': the image to display. Story images are usually created specially for this purpose, except for the map.&lt;br /&gt;
* '''scale_background''': Whether to scale the background, default yes.&lt;br /&gt;
* '''music''': change to this music&lt;br /&gt;
* '''sound''': a list of sound files; the engine will choose one at random and play it once while displaying the story part.&lt;br /&gt;
* '''voice''': a list of sound files; the engine will choose one at random and play it on a sound channel intended for voice overs once while displaying the story part.&lt;br /&gt;
&lt;br /&gt;
=== [background_layer] ===&lt;br /&gt;
&lt;br /&gt;
A layer of the background of the story screen.&lt;br /&gt;
&lt;br /&gt;
* '''image''': path to the image file.&lt;br /&gt;
* '''scale_vertically''': whether the image should be scaled to fill the screen in the vertical dimension. Default yes.&lt;br /&gt;
* '''scale_horizontally''': whether the image should be scaled to fill the screen in the horizontal dimension. Default yes.&lt;br /&gt;
* '''scale''': a shortcut to set scale_vertically and scale_horizontally at once. If specified, the values of the former two keys will be ignored.&lt;br /&gt;
* '''keep_aspect_ratio''': whether the aspect ratio of the image should be preserved while scaling. Default yes.&lt;br /&gt;
* '''tile_vertically''': whether the image should be tiled in the vertical direction. Tiling happens after aligning the image to the center of the screen. Default no.&lt;br /&gt;
* '''tile_horizontally''': whether the image should be tiled in the horizontal direction. Tiling happens after aligning the image to the center of the screen. Default no.&lt;br /&gt;
* '''tile''': a shortcut to set tile_vertically and tile_horizontally at once. If specified, the values of the former two keys will be ignored.&lt;br /&gt;
* '''base_layer''': whether is this the layer to align the overlay images to. Default no.&lt;br /&gt;
&lt;br /&gt;
=== [image] ===&lt;br /&gt;
&lt;br /&gt;
An image to display.&lt;br /&gt;
&lt;br /&gt;
* '''x''', '''y''': the location to draw the image, using the pixels of the '''base_layer''' background image as the coordinate system.&lt;br /&gt;
* '''centered''': If &amp;quot;yes&amp;quot;, use the center of the image as the anchor point when placing at the x,y coordinates, if &amp;quot;no&amp;quot; then use the top-left corner.&lt;br /&gt;
* '''file''': the image to display.&lt;br /&gt;
* '''delay''': the time to delay drawing this image.&lt;br /&gt;
* '''resize_with_background''': {{DevFeature1.15|7}} if &amp;quot;yes&amp;quot;, apply the same scaling as applied to the '''base_layer'''&lt;br /&gt;
&lt;br /&gt;
Each image is placed using the pixels of the background_layer as the coordinate system; each image's location moves to compensate when the background image is scaled. Example: my background image is a map with a city at pixel 160,100; I put a battle marker on that city using '''x,y,centered=160,100,yes'''. When a user plays the game they will see the map enlarged to fill the window (regardless of its size), and the battle marker will still be on top of the city.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&amp;diff=72453</id>
		<title>InterfaceActionsWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&amp;diff=72453"/>
		<updated>2024-03-06T04:32:28Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* [story] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
== Interface actions ==&lt;br /&gt;
&lt;br /&gt;
Part of [[ActionWML]], interface actions are actions that do not have a direct effect on gameplay;&lt;br /&gt;
instead, they show something to the player.  The main interface tags&lt;br /&gt;
are '''[message]''' and '''[objectives]''', but several other tags affect&lt;br /&gt;
the interface also.&lt;br /&gt;
&lt;br /&gt;
== [inspect] ==&lt;br /&gt;
This user interface instantly displays the gamestate inspector dialog at the current scenario state (the same one that can be brought up with [[CommandMode|the ''':inspect''' command]]), which can be used to inspect the values of WML variables, AI configuration, recall lists, and more.&lt;br /&gt;
&lt;br /&gt;
* '''name''': optional attribute to specify the name of this gamestate inspector dialog. It is just a label to help differentiate between different invocations of gamestate inspector dialog.&lt;br /&gt;
&lt;br /&gt;
== [message] ==&lt;br /&gt;
The most commonly used interface action is [message], which displays a message to the user in a dialog box. It can also be used to take input from the user.&lt;br /&gt;
&lt;br /&gt;
The following key/tags are accepted for [message]:&lt;br /&gt;
* [[StandardUnitFilter]]: The unit whose profile and name are displayed. Do not use a [filter] tag. If no unit matching this filter is found, the message is not displayed (The unit has probably been killed).&amp;lt;br&amp;gt;[message] elements should be constructed so that it is either guaranteed that a certain unit is alive, or so that dialog flows smoothly even if the message isn't displayed.&lt;br /&gt;
&lt;br /&gt;
* '''speaker''': an alternative to standard unit filter. You may specify as the value of the speaker attribute a unit id or any of the following special values:&lt;br /&gt;
** '''narrator''': the dialog box is displayed without a caption for the unit speaking or a unit image&lt;br /&gt;
** '''unit''': the primary unit for the event is speaking&lt;br /&gt;
** '''second_unit''': the secondary unit for the event is speaking&lt;br /&gt;
&lt;br /&gt;
* '''message''': (translatable) the text to display to the right of the image. ''message'' is sometimes multiple lines; if it is, be sure to use quotes(''' ' ''' or ''' &amp;quot; ''')&lt;br /&gt;
* '''male_message''', '''female_message''': {{DevFeature1.13|2}} (translatable) Used instead of ''message'' if the unit's gender matches. Never used if there is no unit (ie ''speaker=narrator''). {{DevFeature1.13|6}} This matches the primary unit, not the secondary unit.&lt;br /&gt;
* '''wait_description''': {{DevFeature1.13|2}} the description of this message displayed when other players in a mp game wait for one player doing input in a [message] (with [option]s or [text_input]).&lt;br /&gt;
* '''[show_if]''': if present then this message will only be displayed if the conditional statement in this tag is passed (see [[ConditionalActionsWML#Condition_Tags|ConditionalActionsWML]])&lt;br /&gt;
* '''side_for''': (default: all sides) comma-separated list of sides for who message is shown. This will &amp;lt;b&amp;gt;not&amp;lt;/b&amp;gt; work with messages that take user input ([option]/[text_input]), which can only ever be shown to the current player. {{DevFeature1.13|0}} side_for= is now also accepted for messages with user input, it specifies on which side the message is shown (defaults to the currently playing side). For messages with input it does not accept a comma seperated list only a single number.&lt;br /&gt;
* '''image''': (default: profile image of speaker) the image to display to the left of the message text. Append ~RIGHT() if you want the image to appear on the right side. &lt;br /&gt;
** {{DevFeature1.13|0}} &amp;lt;b&amp;gt;none:&amp;lt;/b&amp;gt; display no image&lt;br /&gt;
* '''mirror''': {{DevFeature1.13|5}}whether to mirror the image specified by the '''image''' attribute.&lt;br /&gt;
* '''second_image''': {{DevFeature1.13|6}}same as the '''image''' attribute, but the image is displayed on the right of the message text.&lt;br /&gt;
* '''second_mirror''': {{DevFeature1.13|6}}same as '''mirror''', but for the '''second_image''' attribute.&lt;br /&gt;
* '''image_pos''': {{DevFeature1.13|5}} whether to show the image on the left or right; supercedes the use of ~RIGHT() described above&lt;br /&gt;
* '''caption''': (default: name of speaker) the caption to display beside the image. Name to be displayed. Note: use a translation mark to avoid wmllint errors.&lt;br /&gt;
* '''scroll''': Boolean specifying whether the game view should scroll to the speaking unit. Defaults to ''yes''.&lt;br /&gt;
* '''highlight''': {{DevFeature1.13|5}} Boolean specifying whether to highlight the speaker. Defaults to ''yes''.&lt;br /&gt;
* '''sound''': a sound effect (wav file) to play as the message is displayed. This can be a comma-separated list, from which one will be randomly chosen.&lt;br /&gt;
* '''voice''': {{DevFeature1.13|?}} a sound to be played as the message is displayed. This can also be a comma-separated list, from which one will be randomly chosen. This is intended for voiceovers for the message.&lt;br /&gt;
* {{anchor|message-option|'''[option]'''}}: No '''[option]''' elements have to be used. If '''[option]''' elements are present, then each option will be displayed in a menu for the user to select one option. ''Note: Messages with options will not be shown at all in prestart events''&lt;br /&gt;
** '''message''': (translatable) the text displayed for the option. {{DevFeature1.15|1}} This is now a synonym for '''description='''.&lt;br /&gt;
** '''image''', '''label''', '''description''', '''default''': See [[DescriptionWML#WML_Format|DescriptionWML]].&lt;br /&gt;
** '''value''': {{DevFeature1.13|?}} Gives the option a value to be stored in a variable.&lt;br /&gt;
** '''[show_if]''': if present then this option will only be displayed if the conditional statement in this tag is passed (see [[ConditionalActionsWML#Condition_Tags|ConditionalActionsWML]])&lt;br /&gt;
** '''[command]''': an element containing actions which are executed if the option is selected.&lt;br /&gt;
* '''variable''': {{DevFeature1.13|?}} If present, either the index or the value of the chosen option will be stored in the specified variable. Option indexing starts from 1. If option has '''[show_if]''' condition evaluated as false, then it is hidden and excluded from the indexing.&lt;br /&gt;
* {{anchor|message-text_input|'''[text_input]'''}}: there can be only one [text_input] tag. this adds a text input field to the message. ''Note: Messages with text_input will not be shown at all in prestart events''&lt;br /&gt;
** '''variable''': the variable that the user's input will be written to&lt;br /&gt;
** '''label''': a text label to the left of the input field&lt;br /&gt;
** '''max_length''': the maximum number of characters that may be typed into the field&lt;br /&gt;
** '''text''': text that is written into the field in the beginning&lt;br /&gt;
* Check [[EventWML#Multiplayer_safety]] to find out in which events you can safely use '''[option]''' and '''[text_input]''' without causing OOS.&lt;br /&gt;
&lt;br /&gt;
=== Formatting ===&lt;br /&gt;
'''[message]''' and other tags such as unit names (user_description), objectives, and floating text can make use of [https://docs.gtk.org/Pango/pango_markup.html#pango-markup Pango markup formatting codes].&lt;br /&gt;
&lt;br /&gt;
Prefer to use single quotes (') instead of double quotes (&amp;quot;) within the formatting string, as double quotes would need to be escaped in WML (&amp;quot;&amp;quot;). Escaping markup can be done with [https://github.com/wesnoth/wesnoth/blob/9daa10a9f27c5a95520e871417bbd72aa52aa688/src/font/pango/escape.hpp#L38-L42 HTML entities].&lt;br /&gt;
&lt;br /&gt;
For example, if you wanted to write &amp;quot;You are victorious!&amp;quot; in large, italic, gold letters, you might write it this way:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;span color='#BCB088' size='large' font-style='italic'&amp;gt;You are victorious!&amp;lt;/span&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are the codes taken from the Pango markup formatting guide:&lt;br /&gt;
&lt;br /&gt;
*'''font''', '''font_desc''': A font description string, such as &amp;quot;Sans Italic 12&amp;quot;.&lt;br /&gt;
*'''font_family''', '''face''': A font family name.&lt;br /&gt;
*'''font_size''', '''size''': Font size in 1024ths of a point, or one of the absolute sizes 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', or one of the relative sizes 'smaller' or 'larger'.&lt;br /&gt;
*'''font_style''', '''style''': One of 'normal', 'oblique', 'italic'.&lt;br /&gt;
*'''font_weight''', '''weight''': One of 'ultralight', 'light', 'normal', 'bold', 'ultrabold', 'heavy', or a numeric weight.&lt;br /&gt;
*'''font_variant''', '''variant''': One of 'normal' or 'smallcaps'.&lt;br /&gt;
*'''font_stretch''', '''stretch''': One of 'ultracondensed', 'extracondensed', 'condensed', 'semicondensed', 'normal', 'semiexpanded', 'expanded', 'extraexpanded', 'ultraexpanded'.&lt;br /&gt;
*'''foreground''', '''fgcolor''', '''color''': An RGB color specification such as '#00FF00' or a color name such as 'red'. The full list of color names may be found in Pango's [https://github.com/GNOME/pango/blob/main/tools/rgb.txt rgb.txt] file.&lt;br /&gt;
*'''background, bgcolor''': An RGB color specification such as '#00FF00' or a color name such as 'red'.&lt;br /&gt;
*'''underline''': One of 'none', 'single', 'double', 'low', 'error'.&lt;br /&gt;
*'''underline_color''': The color of underlines; an RGB color specification such as '#00FF00' or a color name such as 'red'.&lt;br /&gt;
*'''rise''': Vertical displacement, in 10000ths of an em. Can be negative for subscript, positive for superscript.&lt;br /&gt;
*'''strikethrough''': 'true' or 'false' whether to strike through the text.&lt;br /&gt;
*'''strikethrough_color''': The color of strikethrough lines; an RGB color specification such as '#00FF00' or a color name such as 'red'&lt;br /&gt;
*'''fallback''': 'true' or 'false' whether to enable fallback. If disabled, then characters will only be used from the closest matching font on the system. No fallback will be done to other fonts on the system that might contain the characters in the text. Fallback is enabled by default. Most applications should not disable fallback.&lt;br /&gt;
*'''letter_spacing''': Inter-letter spacing in 1024ths of a point.&lt;br /&gt;
*'''gravity''': One of 'south', 'east', 'north', 'west', 'auto'.&lt;br /&gt;
*'''gravity_hint''': One of 'natural', 'strong', 'line'.&lt;br /&gt;
&lt;br /&gt;
The following pango attributes are also available directly as attributes of the '''[message]''' tag:&lt;br /&gt;
{{DevFeature1.13|4}}&lt;br /&gt;
&lt;br /&gt;
*'''font'''&lt;br /&gt;
*'''font_family'''&lt;br /&gt;
*'''font_size'''&lt;br /&gt;
*'''font_style'''&lt;br /&gt;
*'''font_weight'''&lt;br /&gt;
*'''font_variant'''&lt;br /&gt;
*'''font_stretch'''&lt;br /&gt;
*'''color'''&lt;br /&gt;
*'''bgcolor'''&lt;br /&gt;
*'''underline'''&lt;br /&gt;
*'''underline_color'''&lt;br /&gt;
*'''rise'''&lt;br /&gt;
*'''strikethrough'''&lt;br /&gt;
*'''strikethrough_color'''&lt;br /&gt;
*'''fallback'''&lt;br /&gt;
*'''letter_spacing'''&lt;br /&gt;
*'''gravity'''&lt;br /&gt;
*'''gravity_hint'''&lt;br /&gt;
&lt;br /&gt;
== [objectives] ==&lt;br /&gt;
The other tag used for plot development is '''[objectives]'''.&lt;br /&gt;
The '''[objectives]''' tag overwrites any previously set objectives,&lt;br /&gt;
and displays text which should describe the objectives of the scenario.&lt;br /&gt;
Scenario objectives are displayed on the player's first turn after the tag is used,&lt;br /&gt;
or as part of the event if it triggers during that player's turn.&lt;br /&gt;
Objectives can also be accessed at any time in a scenario using the&lt;br /&gt;
&amp;quot;Scenario Objectives&amp;quot; game menu option, making this tag useful for&lt;br /&gt;
scenario-specific information that the player may need to refer to during play.&lt;br /&gt;
&lt;br /&gt;
Attributes of '''[objectives]''':&lt;br /&gt;
* '''side''': Default '0'. The side to set the objectives for. A value of 0 sets objectives for all sides. note: There are side-specific objectives and default objectives, which are used in case a side doesn't have specific ones. Specifying 0 sets the default ones.&lt;br /&gt;
* '''[[StandardSideFilter]]''' tags and keys: Sets the objectives of all matching sides to these passed specifications (the rest of this [objectives] tag). If no sides (such as when passing side=0) or all sides match, sets the default objectives, and the side specific ones for the matching sides otherwise.&lt;br /&gt;
* '''bullet''': Default '• '. Replaces the default bullet, with whatever is passed, for all objectives, gold carryover notes, and notes defined with [note].&lt;br /&gt;
* '''summary''': Displayed first in the objectives text, this should describe the basic objective for the overall scenario.  Can be omitted.&lt;br /&gt;
* '''note''': Displayed last in the objectives text, this is sometimes used for hints or additional information.  Can be omitted.&lt;br /&gt;
* '''victory_string''': Default ' _ &amp;quot;Victory:&amp;quot;', this text precedes the victory objectives. Can be set to &amp;quot;&amp;quot; too.&lt;br /&gt;
* '''defeat_string''': Default ' _ &amp;quot;Defeat:&amp;quot;', this text precedes the defeat objectives. Can be set to &amp;quot;&amp;quot; too.&lt;br /&gt;
* '''gold_carryover_string''': Default ' _ &amp;quot;Gold carryover:&amp;quot;', this text precedes the gold carryover information.&lt;br /&gt;
* '''notes_string''': Default ' _ &amp;quot;Notes:&amp;quot;', this text precedes the notes.&lt;br /&gt;
* '''silent''': Default: not present. If set to &amp;quot;yes&amp;quot;, the objectives are silently changed. Else, they will be shown to the user when appropriate.&lt;br /&gt;
* '''delayed_variable_substitution''': {{DevFeature1.13|8}} If set to yes, any variables or [insert_tag] are not substituted right away. Instead, they are substituted whenever the objectives are actually viewed.&lt;br /&gt;
&lt;br /&gt;
Tags of '''[objectives]''':&lt;br /&gt;
* {{anchor|objectives-objective|'''[objective]'''}}: describes a win or loss condition. Most scenarios have multiple win or loss conditions, so use a separate [objective] subtag for each line; this helps with translations.&lt;br /&gt;
** '''bullet''': Default '• ' or whatever is set in the parent [objectives] block. Replaces the default bullet, with whatever is provided, for the objective defined by the [objective] block.&lt;br /&gt;
** '''red''': Default '0' for winning objectives, '255' for losing objectives. Overrides the default red coloring of the entire objective, including the bullet.&lt;br /&gt;
** '''green''': Default '255' for winning objectives, '0' for losing objectives. Overrides the default green coloring of the entire objective, including the bullet.&lt;br /&gt;
** '''blue''': Default '0'. Overrides the default blue coloring of the entire objective, including the bullet.&lt;br /&gt;
** '''description''': text for the specific win or loss condition.&lt;br /&gt;
** '''caption''': a text which will be displayed above the ''description''. This can be used to display a subcategory of objectives below ''victory_string'' or ''defeat_string''.&lt;br /&gt;
** '''condition''': The color and placement of the text. Values are 'win'(colored green, placed after ''victory_string'') and 'lose'(colored red, placed after ''defeat_string'').&lt;br /&gt;
** '''show_turn_counter''': If set to yes, displays the number of turns remaining in the scenario. Default is no.&lt;br /&gt;
** '''[show_if]''': A condition that disables the objective if it doesn't hold. Conditional objectives are refreshed at '''[show_objectives]''' time only, or when manually opening the scenario objectives.&lt;br /&gt;
* {{anchor|objectives-gold_carryover|'''[gold_carryover]'''}}: describes how the gold carryover works in this scenario. This is intended to be a more convenient way of displaying carryover information than using the note= key in [objectives].&lt;br /&gt;
** '''bullet''': Default '• ' or whatever is set in the parent [objectives] block. Replaces the default bullet with whatever is provided.&lt;br /&gt;
** '''red''': Default '255'. Overrides the default red coloring of the entire objective, including the bullet.&lt;br /&gt;
** '''green''': Default '255'. Overrides the default green coloring of the entire objective, including the bullet.&lt;br /&gt;
** '''blue''': Default '192'. Overrides the default blue coloring of the entire objective, including the bullet.&lt;br /&gt;
** '''bonus''' (boolean): whether an early finish bonus is granted. If omitted, early finish bonus is not mentioned.&lt;br /&gt;
** '''carryover_percentage''': the amount of carryover gold. If omitted, the amount is not mentioned.&lt;br /&gt;
** '''[show_if]''': {{DevFeature1.13|11}} Gold carryover will not be shown if the specified condition isn't met. Conditional gold carryover is refreshed at '''[show_objectives]''' time only.&lt;br /&gt;
* {{anchor|objectives-note|'''[note]'''}}: describes a note, usually used for hints or additional information. This is an easier way of adding several notes than concatenating them together into a single string to use with the ''note='' key.&lt;br /&gt;
** '''bullet''': Default '• ' or whatever is set in the parent [objectives] block. Replaces the default bullet with whatever is provided for the note defined by the [note] block.&lt;br /&gt;
** '''red''': Default '255'. Overrides the default red coloring of the entire note, including the bullet.&lt;br /&gt;
** '''green''': Default '255'. Overrides the default green coloring of the entire note, including the bullet.&lt;br /&gt;
** '''blue''': Default '255'. Overrides the default blue coloring of the entire note, including the bullet.&lt;br /&gt;
** '''description''': the text of the note.&lt;br /&gt;
** '''[show_if]''': The note will not be shown if the specified condition isn't met. Conditional notes are refreshed at '''[show_objectives]''' time only.&lt;br /&gt;
&lt;br /&gt;
== [set_menu_item] ==&lt;br /&gt;
This tag is used to add a custom option in the right-click context menu which can then be used to trigger arbitrary WML commands. The menu items can be set and modified during any event, for example during &amp;quot;start&amp;quot; or &amp;quot;prestart&amp;quot; events. The user can also assign hotkeys to these WML commands unless specified otherwise. When the hotkey is pressed the event will be fired/filtered at the current mouse position.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Due to limitations in portable devices where there are no scroll bars for context menus, there is a hard-coded limit of 7 custom WML menu items. If you really need to have more than 7 menu items, try combining some of them in a submenu. {{DevFeature1.13|0}} This limitation is being removed in a [http://forums.wesnoth.org/viewtopic.php?p=572554#p572554 future version] of Wesnoth.&lt;br /&gt;
&lt;br /&gt;
* '''id''': the unique id for this menu item. If a menu item with this id already exists, it allows you to set specific changes to that item. All menus will be sorted lexicographically by the id string. The ordering is underscores, digits, and finally letters.&lt;br /&gt;
* '''description''': the in-game text that will appear for this item in the menu.&lt;br /&gt;
* '''image''': the image to display next to this item.&lt;br /&gt;
* '''needs_select''': if ''yes'' (default ''no''), then the latest select event (see [[EventWML]]) that triggered before this menu item was chosen will be transmitted over the network before this menu item action will be. This only has any effect in networked multiplayer, and is intended to allow more elaborate menu item behaviour there without causing out of sync errors. If you don't know what this means, just leave it. {{DevFeature1.13|6}} ''needs_select=yes'' is deprecated, consider using manual variable syncing with [sync_variable].&lt;br /&gt;
* '''synced''' {{DevFeature1.13|1}}: if ''no'' (default ''yes'') the command handler will only be run on the client that invoked the menu item; this means that changing the gamestate in a command handler of a menu item with ''synced=no'' will cause OOS&lt;br /&gt;
* '''use_hotkey''': if ''no'' (default ''yes''), then the user cannot assign hotkeys to this menu item. If ''only'', the menu item is only accessible via hotkeys, not via right-click context; you can use this in combination with [default_hotkey] if you want custom hotkeys in your campaign/mp. &lt;br /&gt;
* '''[show_if]''': If present, the menu item will only be available if the conditional statement (see [[ConditionalActionsWML#Condition_Tags|ConditionalActionsWML]]) within evaluates to true. When this is evaluated, the WML variables ''$x1'' and ''$y1'' will point to the location on which the context menu was invoked, so it's possible to for example only enable the option on empty hexes or on a particular unit.&lt;br /&gt;
* '''[filter_location]''': contains a [[StandardLocationFilter]] similar to the one found inside Single Unit Filters. The menu item will only be available on matching locations.&lt;br /&gt;
* '''[default_hotkey]''': contains a hotkey WML to specify what hotkey to assign to this, '''if the user has no hotkey assigned to this yet'''. (Unlike the rest of a menu item definition, modifying this tag has no effect on the game; it is only effective when initially defining a menu item.) Hotkey WML matches the format in the preferences file and contains the following keys:&lt;br /&gt;
** '''key''': a string that contains the key to assign to this.&lt;br /&gt;
** '''alt''', '''shift''', '''cmd'''(apple only), '''ctrl''':  boolean values.&lt;br /&gt;
** '''repeat_on_hold''' {{DevFeature1.13|12}}: if ''yes'' (default ''no''), holding the hotkey will repeat the action continuously, unless it blocks input with something like '''[message]'''. Due to a bug, versions older than 1.13.12 always repeat the action, with no way to disable it.&lt;br /&gt;
* '''[command]''': contains the WML actions to be executed when the menu item is selected. Again, the WML variables ''$x1'' and ''$y1'' will point to the location on which the context menu was invoked on.&lt;br /&gt;
** '''delayed_variable_substitution ''' (boolean yes|no, default: yes): If no, forces a variable substitution run onto the wml included in this [command] block. Use this, if you want variables which are to substitute to get the values they have at execution time of the event where this set_menu_item appears. Other than that, they get the values they have at invocation time of the menu item.&lt;br /&gt;
&lt;br /&gt;
== [clear_menu_item] ==&lt;br /&gt;
&lt;br /&gt;
Removes a menu item from the scenario.&lt;br /&gt;
Normally menu items are, including all their defining wml, automatically carried over between scenarios. This tag prevents this. (The behavior is comparable to set_variable/clear_variable).&lt;br /&gt;
* '''id''': (string): id of the menu item to clear. Can be a comma-separated list.&lt;br /&gt;
&lt;br /&gt;
== Other interface tags ==&lt;br /&gt;
&lt;br /&gt;
The following tags are also action tags:&lt;br /&gt;
&lt;br /&gt;
=== [change_theme] ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|8}}&lt;br /&gt;
&lt;br /&gt;
Change the current interface theme.&lt;br /&gt;
&lt;br /&gt;
* '''theme''': The ID of the new theme. Use &amp;lt;code&amp;gt;theme=&amp;lt;/code&amp;gt; (empty key) to switch back to the theme that the player has selected in Preferences. On &amp;lt;b&amp;gt;1.14.2&amp;lt;/b&amp;gt; and later it is also possible to omit the key entirely to achieve the same effect (on previous versions this will crash the Lua engine).&lt;br /&gt;
&lt;br /&gt;
=== [item] ===&lt;br /&gt;
Makes a graphical item appear on a certain hex. Note this only places the graphics for an item. It does not make the item do anything. Use a moveto event to make moving onto the item do something. &amp;lt;tt&amp;gt;''('''Hint:''' There are a number of predefined items that are used in various campaigns that you can make use of. You can find [http://www.wesnoth.org/macro-reference.xhtml#file:items.cfg a list of them] if you look into the items.cfg file in the wesnoth install directory (under /data/core/macros).)''&amp;lt;/tt&amp;gt;&lt;br /&gt;
* '''x''', '''y''': the location to place the item. (only for [event][item]: full [[StandardLocationFilter|SLF]] support)&lt;br /&gt;
* '''image''': the image (in ''images/'' as .png) to place on the hex. This image is aligned with the top-left of the hex (which is 72 pixels wide and 72 pixels tall). It is drawn underneath units. ''('''Hint:''' If using an image smaller than 72x72, then it might be useful to [[ImagePathFunctions#Blit_Function|BLIT]] the image onto &amp;lt;tt&amp;gt;misc/blank-hex.png&amp;lt;/tt&amp;gt; (a blank 72x72 image).)''&lt;br /&gt;
* '''halo''': an image to place centered on the hex. It is drawn on top of units. Use this instead of ''image'' if the image is bigger than the hex or if you want to animate an image (https://github.com/wesnoth/wesnoth/issues/1219).&lt;br /&gt;
* '''name''' an id that can be used to remove the item.&lt;br /&gt;
''Example (where the integer after the colon is the duration of each frame or square bracket expansion as per AnimationWML is used): halo=scenery/fire1.png:100,scenery/fire2.png:100,scenery/fire3.png:100,scenery/fire4.png:100,scenery/fire5.png:100,scenery/fire6.png:100,scenery/fire7.png:100,scenery/fire8.png:100''&lt;br /&gt;
or equivalently (requires Wesnoth 1.11.2+):&lt;br /&gt;
''halo=scenery/fire[1~8].png:100''&lt;br /&gt;
* '''team_name''': name of the team for which the item is to be displayed (hidden for others). For multiple teams just put all the names in one string, for example separated by commas. {{DevFeature1.15|0}} In 1.14 the '''[side]team_name''' attribute was expected to be a substring of this '''team_name'''. In 1.15 both are expected to be comma-separated lists of names and the item is visible if the lists intersect. ([[https://github.com/wesnoth/wesnoth/pull/3533|#3533]])&lt;br /&gt;
* '''visible_in_fog''': whether the item should be visible through fog or not. Default yes.&lt;br /&gt;
* '''redraw''': (boolean yes|no, default: yes): If no, disables implicit calls to [[InterfaceActionsWML#.5Bredraw.5D|[redraw]]] when placing the items.&lt;br /&gt;
* '''[filter_team]''': {{DevFeature1.15|0}} A [[StandardSideFilter]]. Set '''team_name''' to the union of all '''[side]team_name''' attributes of all sides that match the SSF. ([[https://github.com/wesnoth/wesnoth/pull/3533|#3533]])&lt;br /&gt;
* {{DevFeature1.15|0}} If both '''team_name''' and '''[filter_team]''' are set, '''team_name''' is ignored.&lt;br /&gt;
&lt;br /&gt;
=== [remove_item] ===&lt;br /&gt;
Removes any graphical items on a given hex.&lt;br /&gt;
* [[StandardLocationFilter]]: the hexes to remove items from&lt;br /&gt;
* '''image''': if specified, only removes the given item if one of its 'image', 'halo' or 'name' attributes is exactly this value. (for 'halo' and 'image' this in particular means that the image name must include any [[ImagePathFunctions|image path functions]] appended to the original image name.)&lt;br /&gt;
&lt;br /&gt;
=== [print] ===&lt;br /&gt;
Displays a message across the screen. The message will disappear after a certain time, or when another [print] tag is encountered.&lt;br /&gt;
* '''text''': (translatable) the text to display. Can be an empty string to remove a previous message without showing a new one.&lt;br /&gt;
* '''size''': (default=12) the pointsize of the font to use&lt;br /&gt;
* '''duration''': the length of time to display the text for.&lt;br /&gt;
** (Before 1.15.4) This is measured in the number of 'frames', and the default is 50. A frame in Wesnoth is usually displayed for around 30ms.&lt;br /&gt;
** {{DevFeature1.15|4}} This is measured in milliseconds. Don't use the default value, because it's a mere 50ms.&lt;br /&gt;
** {{DevFeature1.15|14}} The default is 5000 milliseconds.&lt;br /&gt;
** {{DevFeature1.15|14}} The string '''unlimited''' displays the text until it's removed by another [print] tag.&lt;br /&gt;
* '''color''': (default '''0,0,0''') three comma-separated values giving the red, green and blue values (0-255).&lt;br /&gt;
* '''red''', '''green''', '''blue''': deprecated, use color=0,0,0 instead.&lt;br /&gt;
&lt;br /&gt;
=== [move_unit_fake] ===&lt;br /&gt;
Moves an image of a unit along a certain path on the map. The path does not need to be a continuous list of adjacent hexes, so for example only the start and end points can be given, in which case the straightest line between those points will be calculated and used.&lt;br /&gt;
* '''type''': the type of the unit whose image to use&lt;br /&gt;
* '''x''': a comma-separated list of x locations to move along&lt;br /&gt;
* '''y''': a comma-separated list of y locations to move along (x and y values are matched pairs)&lt;br /&gt;
* '''side''': the side of the fake unit, used for team-coloring the fake unit&lt;br /&gt;
* '''gender''': the gender of the fake unit. Example: gender=female&lt;br /&gt;
* '''variation''': the variation of the fake unit. Example: variation=undead&lt;br /&gt;
* '''image_mods''': [[ImagePathFunctions|image path functions]] sequence to be applied on the fake unit.&lt;br /&gt;
* '''force_scroll''':  Whether to scroll the map or not even when [[#.5Block_view.5D|[lock_view]]] is in effect or ''Follow Unit Actions'' is disabled in ''Advanced Preferences''. Defaults to ''yes'' starting with version '''1.11.6'''; the attribute did not exist in previous versions and this action behaved as if ''no'' was passed instead.&lt;br /&gt;
&lt;br /&gt;
=== [move_units_fake] ===&lt;br /&gt;
moves multiple images of units along paths on the map. These units are moved in lockstep.&lt;br /&gt;
* '''force_scroll''': {{DevFeature1.15|0}} Has the same meaning as in [move_unit_fake] but a different default.&lt;br /&gt;
* '''[fake_unit]''': A fake unit to move&lt;br /&gt;
** '''type''': the type of unit whose image to use&lt;br /&gt;
** '''x''': a comma-separated list of x locations to move along&lt;br /&gt;
** '''y''': a comma-separated list of y locations to move along (x and y values are matched pairs)&lt;br /&gt;
** '''side''': the side of the fake unit, used for team-coloring the fake unit&lt;br /&gt;
** '''skip_steps''': the number of steps to skip before this unit starts moving&lt;br /&gt;
&lt;br /&gt;
=== [hide_unit] ===&lt;br /&gt;
Temporarily prevents the engine from displaying the given unit. The unit does not become invisible, as it would be with the '''[hides]''' ability; it is still the same plain unit, but without an image. Useful in conjunction with '''[move_unit_fake]''': to move a leader unit into position on-screen. Until 1.8 each '''[hide_unit]''' tag only hides one unit.&lt;br /&gt;
* [[StandardUnitFilter]]: All matching units will be hidden&lt;br /&gt;
&lt;br /&gt;
=== [unhide_unit] ===&lt;br /&gt;
Stops the currently hidden units from being hidden.&lt;br /&gt;
* [[StandardUnitFilter]]: Only the matching units will be unhidden&lt;br /&gt;
&lt;br /&gt;
=== [lock_view] ===&lt;br /&gt;
Locks gamemap view scrolling for human players, so they cannot scroll the gamemap view until it is unlocked. WML or Lua actions such as '''[scroll_to]''' will continue to work normally, as they ignore this restriction; the locked/unlocked state is preserved when saving the current game.&lt;br /&gt;
&lt;br /&gt;
This feature is generally intended to be used in cutscenes to prevent the player scrolling away from scripted actions.&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|8}} This now also blocks the player from zooming the gamemap view. WML or Lua zoom will continue to work normally.&lt;br /&gt;
&lt;br /&gt;
=== [unlock_view] ===&lt;br /&gt;
Unlocks gamemap view scrolling for human players.&lt;br /&gt;
&lt;br /&gt;
=== [scroll] ===&lt;br /&gt;
Scroll a certain number of pixels in a given direction. Useful for earthquake/shaking effects.&lt;br /&gt;
* '''x''', '''y''': the number of pixels to scroll along the x and y axis&lt;br /&gt;
* '''side''': the side or sides for which this should happen. By default, the [scroll] happens for everyone.&lt;br /&gt;
* '''[filter_side]''': a [[StandardSideFilter]] to select the sides for which this should happen. By default, the [scroll] happens for everyone.&lt;br /&gt;
&lt;br /&gt;
=== [scroll_to] ===&lt;br /&gt;
Scroll to a given hex&lt;br /&gt;
* [[StandardLocationFilter]], do not use a [filter_location] sub-tag. If more than one location matches the filter, only the first matching location will be used.&lt;br /&gt;
* '''check_fogged''': whether to scroll even to locations covered in fog or shroud. Possible values ''yes'' (don't scroll to fog) and ''no'' (scroll even to fog), with ''no'' as the default.&lt;br /&gt;
* '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''no'').&lt;br /&gt;
* '''highlight''': {{DevFeature1.13|5}} Whether to highlight the hex being scrolled to (defaults to ''no'').&lt;br /&gt;
* '''side''': the side or sides for which this should happen. By default, the [scroll_to] happens for everyone.&lt;br /&gt;
* '''[filter_side]''': a [[StandardSideFilter]] to select the sides for which this should happen. By default, the [scroll_to] happens for everyone.&lt;br /&gt;
&lt;br /&gt;
=== [scroll_to_unit] ===&lt;br /&gt;
Scroll to a given unit&lt;br /&gt;
* [[StandardUnitFilter]]; do not use a [filter] subtag.&lt;br /&gt;
* '''check_fogged''': whether to scroll even to locations covered in fog or shroud. Possible values ''yes'' (don't scroll to fog) and ''no'' (scroll even to fog), with ''no'' as the default.&lt;br /&gt;
* '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''no'').&lt;br /&gt;
* '''highlight''': {{DevFeature1.13|5}} Whether to highlight the hex the unit is on (defaults to ''no'').&lt;br /&gt;
* '''for_side''': the side or sides for which this should happen. By default, the [scroll_to_unit] happens for everyone.&lt;br /&gt;
* '''[for_side]''': a [[StandardSideFilter]] to select the sides for which this should happen. By default, the [scroll_to_unit] happens for everyone.&lt;br /&gt;
&lt;br /&gt;
=== [select_unit] ===&lt;br /&gt;
Selects a given unit.&lt;br /&gt;
* [[StandardUnitFilter]]: The first unit found will be selected.&lt;br /&gt;
* '''fire_event''': whether a ''select'' event should be triggered or not (def. ''no''). (Note that select events aren't multiplayer save.)&lt;br /&gt;
* '''highlight''': whether the unit's current hex should be highlighted (def. ''yes'').&lt;br /&gt;
&lt;br /&gt;
'''Note:''' fire_event does not appear to work in 1.14 or 1.16.&lt;br /&gt;
&lt;br /&gt;
=== [sound]===&lt;br /&gt;
Plays a sound&lt;br /&gt;
* '''name''': the filename of the sound to play (in ''sounds/'' as .wav or .ogg). This can be a comma-separated list, from which one sound will be chosen randomly.&lt;br /&gt;
* '''repeat''': repeats the sound for a specified additional number of times (default=0)&lt;br /&gt;
&lt;br /&gt;
=== [sound_source] ===&lt;br /&gt;
Creates a sound source. &amp;quot;Sound sources&amp;quot; is a general name for a mechanism which makes possible for map elements to emit sounds according to some rules, where &amp;quot;map elements&amp;quot; can be specific locations or terrain types. For now, only sound sources tied to locations are supported.&lt;br /&gt;
* '''id''': a unique identification key of the sound source&lt;br /&gt;
* '''sounds''': a list of comma separated, randomly played sounds associated with the sound source&lt;br /&gt;
* '''delay''': a numerical value (in milliseconds) of the minimal delay between two playbacks of the source's sound if the source remains visible on the screen; if one scrolls out and back in, the source will be considered as ready to play&lt;br /&gt;
* '''chance''': a percentage (a value from 0 to 100) describing the chance of the source being activated every second after the delay has passed or when the source's location appears on the screen (note that it cannot play more than one file at the same time)&lt;br /&gt;
* '''check_fogged''': possible values ''yes'' and ''no'' - ''yes'' means the source will not play if its locations are fogged&lt;br /&gt;
* '''check_shrouded''': possible values ''yes'' and ''no'' - ''yes'' means the source will not play if its locations are shrouded&lt;br /&gt;
* '''x,y''': similar to x,y as found in a [[StandardLocationFilter]], these are the locations associated with the sound source&lt;br /&gt;
* '''fade_range''' (default = 3): distance in hexes that determines a &amp;quot;circular&amp;quot; area around the one specified by '''full_range''' where sound volume fades out linearly&lt;br /&gt;
* '''full_range''' (default = 14): distance in hexes that determines a &amp;quot;circular&amp;quot; area where source plays with full volume, relative to screen center&lt;br /&gt;
* '''loop''': number of times a sound sample should be looped if it stays visible. -1 means infinite (~65000)&lt;br /&gt;
&lt;br /&gt;
=== [story] ===&lt;br /&gt;
{{DevFeature1.13|8}}&lt;br /&gt;
&lt;br /&gt;
Shows the story screen.&lt;br /&gt;
* '''title''': Default title used if a part does not specify one — unlike the intro storyscreen, the scenario name is not used as a default title.&lt;br /&gt;
* '''[part]''', '''[if]''', '''[switch]''', '''[wml_message]''', '''[deprecated_message]''' : See [[IntroWML]].&lt;br /&gt;
&lt;br /&gt;
=== [remove_sound_source] ===&lt;br /&gt;
Removes a previously defined sound source.&lt;br /&gt;
* '''id''': the identification key of the sound source to remove&lt;br /&gt;
&lt;br /&gt;
=== [music] ===&lt;br /&gt;
Switches to playing different music&lt;br /&gt;
* '''name''': the filename of the music to play (in ''music/'' as .ogg)&lt;br /&gt;
* see [[MusicListWML]] for the correct syntax&lt;br /&gt;
&lt;br /&gt;
=== [volume] ===&lt;br /&gt;
Changes the game volume to a percent of the preferences volume for the game being played. Values can go from 0 to 100:  &lt;br /&gt;
* '''music''':  Changes the music volume.&lt;br /&gt;
* '''sound''':  Changes the sound volume.&lt;br /&gt;
&lt;br /&gt;
=== [color_adjust] ===&lt;br /&gt;
Adjust the color tint of terrain, by adjusting time-of-day coloring.&lt;br /&gt;
* '''red''', '''green''', '''blue''': values from -255 to 255, the amount to tint by for each color&lt;br /&gt;
&lt;br /&gt;
=== [screen_fade] ===&lt;br /&gt;
{{DevFeature1.17|6}}&lt;br /&gt;
&lt;br /&gt;
Overlay the game display with the given color, fading over the specified duration. This can be used for screen fade effects.&lt;br /&gt;
* '''red''', '''green''', '''blue''': values from 0 to 255, the final overlay color (defaults to 0,0,0)&lt;br /&gt;
* '''alpha''': value from 0 to 255, the strength of the effect. 0 means no effect and can be used to fade in. 255 means fully opaque and can be used to fully fade out to the given color. Intermediate values will end up with a partial overlay tint on the game screen.&lt;br /&gt;
* '''duration''': the length of time it will take to complete the fade, in milliseconds. If 0 the effect is immediate.&lt;br /&gt;
&lt;br /&gt;
=== [delay] ===&lt;br /&gt;
Pauses the game.&lt;br /&gt;
* '''time''': the time to pause in milliseconds&lt;br /&gt;
* '''accelerate ''' (boolean yes|no, default no): {{DevFeature1.13|0}} whether the delay is affected by acceleration. When [delay] is used to make an animation, this should be set to yes so that your animation matches the ones generated by the game.&lt;br /&gt;
&lt;br /&gt;
=== [redraw] ===&lt;br /&gt;
Redraws the screen (this normally isn't done during events, although some of the other interface actions cause the screen or parts of it to be redrawn).&lt;br /&gt;
* '''clear_shroud''' (boolean yes|no, default no): If yes, clears fog and shroud around existing units. Useful if you, for example, spawn friendly units in the middle of an event and want the shroud to update accordingly (otherwise units that spawn inside fog would remain invisible for the duration of the event, since the fog would not automatically get cleared around them).&lt;br /&gt;
* '''[[StandardSideFilter]]''': the sides for which to recalculate fog and shroud.&lt;br /&gt;
* '''side''': If used (forces clear_shroud=yes), clears fog and shroud for that side.&lt;br /&gt;
&lt;br /&gt;
=== [unit_overlay] ===&lt;br /&gt;
Sets an image that will be drawn over a particular unit, and follow it around&lt;br /&gt;
* [[StandardUnitFilter]]: All matching units will get the overlay (do not use [filter])&lt;br /&gt;
* '''image''': the image to place on the unit&lt;br /&gt;
* '''object_id''': object id to use, defaults to the '''image''' key with an &amp;quot;overlay_&amp;quot; prefix; this allows using [[DirectActionsWML#.5Bremove_object.5D|'''[remove_object]''']]&lt;br /&gt;
* '''duration''': object duration&lt;br /&gt;
&lt;br /&gt;
=== [remove_unit_overlay] ===&lt;br /&gt;
Removes a particular overlayed image from a unit&lt;br /&gt;
* [[StandardUnitFilter]]: The overlay will get removed from all matching units (do not use [filter])&lt;br /&gt;
* '''image''': the image to remove from the unit&lt;br /&gt;
* '''object_id''': object id to use&lt;br /&gt;
Using [[DirectActionsWML#.5Bremove_object.5D|'''[remove_object]''']] is also possible, see https://github.com/wesnoth/wesnoth/commit/26c2f941f2bcdd89528481e114c0375ad2a46271&lt;br /&gt;
&lt;br /&gt;
=== [animate_unit] ===&lt;br /&gt;
Uses an animation of a unit to animate it on screen (if the unit has the corresponding animation).&lt;br /&gt;
* '''flag''': The key to find the custom animation in the unit description (see the '''[extra_anim]''' description in [[AnimationWML]]). Standard animations can be triggered with the following keywords: ''leading recruited standing idling levelout levelin healing healed poisoned movement defend attack death victory pre_teleport post_teleport''&lt;br /&gt;
* '''[filter]''' with a [[StandardUnitFilter]] as argument, see [[FilterWML]]. By default, the unit at the event location will be animated. You can use this tag to choose any other unit to animate.&lt;br /&gt;
* '''[primary_attack]''': If this tag is not present, the filter for animation will be triggered with no attack. If it is here, all attacks from the unit will be filtered, and a matching one will be used to filter the animation. Takes a weapon filter as argument, see [[FilterWML]].&lt;br /&gt;
* '''[secondary_attack]''': Similar to '''[primary_attack]'''. May be needed to trigger a defense animation correctly, if there are more than one animations available for the defending unit.&lt;br /&gt;
* '''hits''': yes/no/hit/miss/kill: which according variation of a attack/defense animation shall be chosen (required)&lt;br /&gt;
* '''text''': a text to hover during the animation &lt;br /&gt;
* '''male_text''', '''female_text''': {{DevFeature1.13|2}} (translatable) gender-specific versions of the above&lt;br /&gt;
* '''red''': red value for the text color (0-255)&lt;br /&gt;
* '''green''': green value for the text color&lt;br /&gt;
* '''blue''': blue value for the text color&lt;br /&gt;
* '''with_bars''': yes/no: whether to display the status bars during the animation (e.g. the hitpoint bar)&lt;br /&gt;
* '''[animate]''': a sub block with the same syntax as '''[animate_unit]''' except that the '''[filter]''' block is mandatory to find the unit. This block will find and animate another unit simultaneously.&lt;br /&gt;
* '''[facing]''': a [[StandardLocationFilter]] specifying what hex the unit should be facing when animated&lt;br /&gt;
&lt;br /&gt;
=== [label] ===&lt;br /&gt;
Places a label on the map.&lt;br /&gt;
* '''x''', '''y''': the location of the label. {{DevFeature1.13|1}} (only for [event][label]: full [[StandardLocationFilter|SLF]] support)&lt;br /&gt;
* '''text''': what the label should say. If you put an empty string &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; as an argument, the label will be completely removed. Use this method if you want to remove a specific label from any location.&lt;br /&gt;
* '''team_name''': if specified, the label will only be visible to the given team.&lt;br /&gt;
* '''color''': color of the label. The format is r,g,b; r, g and b are numbers between 0 and 255.&lt;br /&gt;
* '''visible_in_fog''': whether the label should be visible through fog or not. Default yes.&lt;br /&gt;
* '''visible_in_shroud''': whether the label should be visible through shroud or not. Default no.&lt;br /&gt;
* '''immutable''': whether this label is protected from being removed or changed by players. Default yes.&lt;br /&gt;
* '''category''': the Show/Hide Labels dialog allows showing/hiding all labels of a given category by toggling a checkbox.&lt;br /&gt;
* '''tooltip''': A tooltip visible when mouseovering the hex the label is on&lt;br /&gt;
* '''side''': the number of the side that placed the label. Can be 0 for labels placed by WML.&lt;br /&gt;
&lt;br /&gt;
=== [floating_text]===&lt;br /&gt;
Floats text (similar to the damage and healing numbers) on the given locations.&lt;br /&gt;
* [[StandardLocationFilter]]: the text will be floated on all matching locations simultaneously (do not use [filter] unless you intend to match one or more units).&lt;br /&gt;
* '''text''': the text to display.&lt;br /&gt;
&lt;br /&gt;
The default text color is &amp;lt;span style=&amp;quot;color: #6b8cff;&amp;quot;&amp;gt;'''#6b8cff'''&amp;lt;/span&amp;gt;. To change the color, use [[#Formatting|Pango markup]]. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Float some golden yellow text at 20,20.&lt;br /&gt;
[floating_text]&lt;br /&gt;
   x,y=20,20&lt;br /&gt;
   text=&amp;quot;&amp;lt;span color='#cccc33'&amp;gt;&amp;quot; + _ &amp;quot;Your text here&amp;quot; + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
[/floating_text]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [deprecated_message] ===&lt;br /&gt;
Shows a deprecated message in the message area, this feature is only intended to be used to warn about deprecated macros in mainline. The message is not translatable.&lt;br /&gt;
* '''message''': the message to show.&lt;br /&gt;
* '''level''': {{DevFeature1.13|10}} The deprecation level, a number from 1 to 3.&lt;br /&gt;
* '''what''': {{DevFeature1.13|10}} The name of the thing being deprecated. Use this instead of '''message''' if possible; a stock message will be generated from it. Use '''message''' only if more information is required; it will be appended to the stock message. This should not be translatable&lt;br /&gt;
* '''version''': {{DevFeature1.13|10}} For deprecation levels 2 and 3, this indicates the version in which the feature could be removed. It does ''not'' indicate the version in which it became deprecated. &lt;br /&gt;
&lt;br /&gt;
The meanings of the deprecation levels are as follows:&lt;br /&gt;
&lt;br /&gt;
# Deprecated, but will only be removed if absolutely necessary. The '''version''' key is ignored.&lt;br /&gt;
# It will be removed no earlier than a specified version.&lt;br /&gt;
# It will be removed in the next stable version&lt;br /&gt;
# It has already been removed, leaving just a stub to inform users of how to update their code.&lt;br /&gt;
&lt;br /&gt;
Note that as of 1.13.11, deprecation messages show only in the log, not in the chat message area. The '''message''' can be translatable, but does not need to be.&lt;br /&gt;
&lt;br /&gt;
=== [wml_message] ===&lt;br /&gt;
Outputs a message to Wesnoth's console output. Intended for campaign designers to output silent text to the console, without annoying the player; then, that text might contain information useful for later bug-reporting. The log domain for it is '''wml''', and the '''debug/dbg''' log level is available for use with the '''logger''' attribute. Depending on the current log level ('''error''' by default), which may be changed with the in-game :log command, or the --log-&amp;lt;level&amp;gt;=wml command line switch, the messages are echoed to the in-game chat.&lt;br /&gt;
* '''message''': the message to show.&lt;br /&gt;
* '''logger''': the Wesnoth engine output logger that should catch the text; this might be 'err' (the errors log level), 'warn'/'wrn' (the warnings log level) or anything else (the information log level). Not all information will be displayed depending on the log level chosen when starting Wesnoth.&lt;br /&gt;
&lt;br /&gt;
Note: As of 1.9.4/1.9.5 (r48805) the following &amp;quot;loggers&amp;quot; should work: If in [wml_message]: err/error, warn/wrn/warning, debug/dbg; using the :log command: Only the long forms error, warning, info and debug (this part gathered by trying rather than source inspecting). The long forms are most likely also the only ones working when starting wesnoth with --log-&amp;lt;level&amp;gt;=wml.&lt;br /&gt;
For log level warning or error (as during normal play), only wml_messages with logger error or warning display (for both). With logger info or debug, additionally wml_messages with logger info or debug display (for both).&lt;br /&gt;
&lt;br /&gt;
=== [test_condition] ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|2}}&lt;br /&gt;
&lt;br /&gt;
Evaluates the contained conditional tags. If they evaluate to the expected value, it prints out a message to the console explaining which part of the condition caused this result in a way similar to [wml_message]. This can be used if your conditional test is failing and you're not sure why.&lt;br /&gt;
&lt;br /&gt;
* '''result''': Whether you expect the conditions to fail or succeed. If no (the default), a message will be printed if the conditional tags fail. If yes, a message will instead be printed if the conditional tags pass.&lt;br /&gt;
* '''logger''': Same as for [wml_message]. Defaults to &amp;quot;warning&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== [open_help] ===&lt;br /&gt;
Opens the in-game help.&lt;br /&gt;
* '''topic''': the id of the topic to open&lt;br /&gt;
&lt;br /&gt;
Examples of ids:&lt;br /&gt;
* unit_Mage&lt;br /&gt;
* unit_Dark Adept&lt;br /&gt;
* weaponspecial_charge&lt;br /&gt;
* terrain_human_castle&lt;br /&gt;
&lt;br /&gt;
The engine will print the topic ids if run from the command line with the ''--log-debug=help'' option.&lt;br /&gt;
&lt;br /&gt;
=== [show_objectives] ===&lt;br /&gt;
refreshes the objectives defined by [objectives] and its [show_if] tags, and displays them. (It is also called whenever the user explicitly asks for the objectives; this matters only if the tag was overridden by a [[LuaWML#register_wml_action|Lua]] script.)&lt;br /&gt;
* '''side''': the side to show the objectives. If not set, all sides are used.&lt;br /&gt;
* '''[[StandardSideFilter]]''' tags and keys: Tag affects the matching sides instead of just all or the one given by the integer value of the side= key.&lt;br /&gt;
&lt;br /&gt;
=== [chat] ===&lt;br /&gt;
Displays a message in the chat area, not visible for observers. Alternative unconditionally visible for everyone: [[LuaWML:Display#wesnoth.message]]. {{DevFeature1.13|9}} can be visible for observers.&lt;br /&gt;
* '''speaker''': (default=&amp;quot;WML&amp;quot;) A string for the name of the sender of the message.&lt;br /&gt;
* '''message''': The message that should be displayed.&lt;br /&gt;
* '''observable''' (boolean yes|no, default yes): {{DevFeature1.13|9}} Whether the message is displayed for observers.&lt;br /&gt;
* '''[[StandardSideFilter]]''' tags and keys as argument; if the same client controls multiple sides that match, then the message will only be displayed once.&lt;br /&gt;
&lt;br /&gt;
=== [zoom] ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|8}}&lt;br /&gt;
&lt;br /&gt;
Changes the zoom level of the map.&lt;br /&gt;
&lt;br /&gt;
* '''factor''': The new zoom factor, measured as a multiple of the base zoom.&lt;br /&gt;
* '''relative''': If yes, zoom relative to current zoom level. Otherwise, set the absolute zoom level. Default no.&lt;br /&gt;
&lt;br /&gt;
== Useful Macros ==&lt;br /&gt;
There are some predefined macros that you find useful for interface actions. You can find a complete list along with a detailed explanation of how they work [http://www.wesnoth.org/macro-reference.xhtml here].&lt;br /&gt;
* '''{HIGHLIGHT_UNIT}''' Highlight a unit on the map. Use this to show important units&lt;br /&gt;
* '''{HIGHLIGHT_IMAGE}''' Places and highlights an image on the map. Use this to show important items or locations&lt;br /&gt;
* '''{SET_IMAGE}''' Places an image on the map which has no other function.&lt;br /&gt;
* '''{QUAKE &amp;lt;soundfile&amp;gt;}''' Creates a tremor-like screenshake and plays &amp;lt;soundfile&amp;gt;. For example, '''{QUAKE (rumble.ogg)}'''.&lt;br /&gt;
* '''{FLASH_WHITE}''' Flash the screen white momentarily. You can also replace WHITE with RED, BLUE or GREEN for a different colour.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[DirectActionsWML]]&lt;br /&gt;
* [[InternalActionsWML]]&lt;br /&gt;
* [[EventWML]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;br /&gt;
[[Category: ActionsWML]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Template:WML_Tags&amp;diff=72452</id>
		<title>Template:WML Tags</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Template:WML_Tags&amp;diff=72452"/>
		<updated>2024-03-06T04:28:39Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;reference-sidebar&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;span class=&amp;quot;editlink&amp;quot;&amp;gt;&amp;amp;#91;[{{SERVER}}{{localurl:Template:WML Tags|action=edit}} edit]&amp;amp;#93;&amp;lt;/span&amp;gt;'''WML Tags'''&lt;br /&gt;
|-&lt;br /&gt;
|''A:'' &lt;br /&gt;
[[AbilitiesWML#The .5Babilities.5D tag|abilities]],&lt;br /&gt;
[[CreditsWML#.5Babout.5D|about]],&lt;br /&gt;
[[AchievementsWML#.5Bachievement.5D|achievement]],&lt;br /&gt;
[[AchievementsWML#.5Bachievement_group.5D|achievement_group]],&lt;br /&gt;
[[Lua_AI_Legacy_Methods_Howto#Behavior_.28Sticky.29_Candidate_Actions|add_ai_behavior]],&lt;br /&gt;
[[AdvancedPreferenceWML|advanced_preference]],&lt;br /&gt;
[[UnitTypeWML#advancefrom|advancefrom]],&lt;br /&gt;
[[UnitTypeWML#After_max_level_advancement_.28AMLA.29|advancement]],&lt;br /&gt;
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|advances]],&lt;br /&gt;
[[AbilitiesWML#affect_adjacent|affect_adjacent]],&lt;br /&gt;
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Top-level_Elements|ai]],&lt;br /&gt;
[[StandardSideFilter#allied_with|allied_with]], &lt;br /&gt;
[[DirectActionsWML#.5Ballow_end_turn.5D|allow_end_turn]],&lt;br /&gt;
[[DirectActionsWML#.5Ballow_extra_recruit.5D|allow_extra_recruit]],&lt;br /&gt;
[[DirectActionsWML#.5Ballow_recruit.5D|allow_recruit]],&lt;br /&gt;
[[DirectActionsWML#.5Ballow_undo.5D|allow_undo]],&lt;br /&gt;
[[ConditionalActionsWML#Meta-Condition_Tags|and]],&lt;br /&gt;
[[InterfaceActionsWML#.5Banimate_unit.5D|animate]],&lt;br /&gt;
[[InterfaceActionsWML#.5Banimate_unit.5D|animate_unit]],&lt;br /&gt;
[[AnimationWML#The .5Banimation.5D tag|animation]],&lt;br /&gt;
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|aspect]],&lt;br /&gt;
attack ([[ReplayWML#attack|replay]], [[UnitTypeWML#Attacks|weapon]]),&lt;br /&gt;
[[AnimationWML#short-attack|attack_anim]],&lt;br /&gt;
attacks ([[AbilitiesWML#The_.5Bspecials.5D_tag|special]], [[StatisticalScenarioWML#The_.5Bteam.5D_tag|stats]]),&lt;br /&gt;
[[AiWML#avoid|avoid]];&lt;br /&gt;
|-&lt;br /&gt;
|''B:'' &lt;br /&gt;
[[UnitTypeWML#base_unit|base_unit]], &lt;br /&gt;
[[IntroWML#.5Bbackground_layer.5D|background_layer]],&lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|berserk]], &lt;br /&gt;
[[BinaryPathWML|binary_path]],&lt;br /&gt;
[[InternalActionsWML#Flow_control_actions|break]],&lt;br /&gt;
[[EditorWML#The_.5Bbrush.5D_tag|brush]];&lt;br /&gt;
|-&lt;br /&gt;
|''C:'' &lt;br /&gt;
[[CampaignWML#The_.5Bcampaign.5D_tag|campaign]],&lt;br /&gt;
[[DirectActionsWML#.5Bcancel_action.5D|cancel_action]],&lt;br /&gt;
[[Wesnoth_AI_Framework#The_.5Bcandidate_action.5D_Tag|candidate_action]], &lt;br /&gt;
[[DirectActionsWML#.5Bcapture_village.5D|capture_village]],&lt;br /&gt;
[[ConditionalActionsWML#.5Bswitch.5D|case]],&lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|chance_to_hit]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bchange_theme.5D|change_theme]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bchat.5D|chat]],&lt;br /&gt;
[[OptionWML#checkbox|checkbox]],&lt;br /&gt;
[[OptionWML#choice|choice]],&lt;br /&gt;
[[ReplayWML#choose|choose]],&lt;br /&gt;
[[PersistenceWML#WML Syntax|clear_global_variable]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bclear_menu_item.5D|clear_menu_item]],&lt;br /&gt;
[[InternalActionsWML#.5Bclear_variable.5D|clear_variable]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bcolor_adjust.5D|color_adjust]],&lt;br /&gt;
[[GameConfigWML#Color_Palettes|color_palette]],&lt;br /&gt;
[[GameConfigWML#Color_Palettes|color_range]],&lt;br /&gt;
command&amp;amp;nbsp;([[ConditionalActionsWML#.5Bcommand.5D|action]], [[ReplayWML|replay]]),&lt;br /&gt;
[[InternalActionsWML#Flow_control_actions|continue]],&lt;br /&gt;
[[CreditsWML#.5Bcredits_group.5D|credits_group]],&lt;br /&gt;
[[AiWML#The_.5Bgoal.5D_Tag|criteria]];&lt;br /&gt;
|-&lt;br /&gt;
|''D:'' &lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|damage]],&lt;br /&gt;
[[AnimationWML#short-death|death]], &lt;br /&gt;
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|deaths]],&lt;br /&gt;
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|default]], &lt;br /&gt;
[[AnimationWML#short-defend|defend]],&lt;br /&gt;
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|defends]],&lt;br /&gt;
[[UnitsWML#defense|defense]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bdelay.5D|delay]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bdeprecated_message.5D|deprecated_message]],&lt;br /&gt;
[[ReplayWML#attack|destination]],&lt;br /&gt;
[[CampaignWML#difficulty|difficulty]],&lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|disable]],&lt;br /&gt;
[[DirectActionsWML#.5Bdisallow_end_turn.5D|disallow_end_turn]],&lt;br /&gt;
[[DirectActionsWML#.5Bdisallow_extra_recruit.5D|disallow_extra_recruit]],&lt;br /&gt;
[[DirectActionsWML#.5Bdisallow_recruit.5D|disallow_recruit]],&lt;br /&gt;
[[ConditionalActionsWML#.5Bwhile.5D|do]], &lt;br /&gt;
[[DirectActionsWML#.5Bdo_command.5D|do_command]],&lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|drains]], &lt;br /&gt;
[[AnimationWML#short-draw_weapon|draw_weapon_anim]];&lt;br /&gt;
|-&lt;br /&gt;
|''E:'' &lt;br /&gt;
[[EditorWML#The_.5Beditor_group.5D_tag|editor_group]],&lt;br /&gt;
[[EditorWML#The_.5Beditor_music.5D_tag|editor_music]],&lt;br /&gt;
[[EditorWML#The_.5Beditor_times.5D_tag|editor_times]],&lt;br /&gt;
[[EffectWML|effect]],&lt;br /&gt;
else&amp;amp;nbsp;([[ConditionalActionsWML#.5Bif.5D|action]], [[AnimationWML#Conditional Branches|animation]]), [[ConditionalActionsWML#.5Bif.5D|elseif]],&lt;br /&gt;
[[DirectActionsWML#.5Bendlevel.5D|endlevel]],&lt;br /&gt;
end_turn&amp;amp;nbsp;([[DirectActionsWML#.5Bend_turn.5D|action]], [[ReplayWML#end_turn|replay]]),&lt;br /&gt;
[[StandardSideFilter#enemy_of|enemy_of]], &lt;br /&gt;
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Engines|engine]], &lt;br /&gt;
entry&amp;amp;nbsp;([[CreditsWML#.5Bentry.5D|credits]], [[OptionWML#entry|options]]),&lt;br /&gt;
[[EraWML|era]],&lt;br /&gt;
[[EventWML|event]],&lt;br /&gt;
[[StandardUnitFilter#filter_ability|experimental_filter_ability]],&lt;br /&gt;
[[StandardUnitFilter#filter_ability_active|experimental_filter_ability_active]],&lt;br /&gt;
[[AbilitiesWML#filter_specials|experimental_filter_specials]],&lt;br /&gt;
[[AnimationWML#short-extra|extra_anim]];&lt;br /&gt;
|-&lt;br /&gt;
|''F:''&lt;br /&gt;
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|facet]],&lt;br /&gt;
[[InterfaceActionsWML#.5Banimate_unit.5D|facing]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bmove_units_fake.5D|fake_unit]], &lt;br /&gt;
[[ConditionalActionsWML#.5Bfalse.5D|false]],&lt;br /&gt;
[[PblWML#.5Bfeedback.5D|feedback]],&lt;br /&gt;
[[UnitTypeWML#variation|female]], &lt;br /&gt;
filter ([[FilterWML|concept]], [[EventWML#.5Bfilter.5D|event]]),&lt;br /&gt;
[[StandardUnitFilter#filter_adjacent|filter_adjacent]], &lt;br /&gt;
[[StandardLocationFilter#filter_adjacent_location|filter_adjacent_location]], &lt;br /&gt;
[[FilterWML#Filtering_Weapons|filter_attack]],&lt;br /&gt;
[[AbilitiesWML#filter_attacker|filter_attacker]], &lt;br /&gt;
[[AbilitiesWML#filter_base_value|filter_base_value]], &lt;br /&gt;
[[EventWML#.5Bfilter_condition.5D|filter_condition]],&lt;br /&gt;
[[AbilitiesWML#filter_defender|filter_defender]], &lt;br /&gt;
[[AiWML#Filtering_Combat_with_the_attacks_Aspect|filter_enemy]],&lt;br /&gt;
[[StandardLocationFilter|filter_location]],&lt;br /&gt;
[[AbilitiesWML#filter_opponent|filter_opponent]], &lt;br /&gt;
[[AiWML#Filtering_Combat_with_the_attacks_Aspect|filter_own]],&lt;br /&gt;
[[StandardLocationFilter#filter_owner|filter_owner]], &lt;br /&gt;
[[StandardLocationFilter#filter_radius|filter_radius]], &lt;br /&gt;
[[SingleUnitWML#filter_recall|filter_recall]], &lt;br /&gt;
[[StandardUnitFilter|filter_second]],&lt;br /&gt;
[[FilterWML#Filtering_Weapons|filter_second_attack]],&lt;br /&gt;
[[AbilitiesWML#filter_self|filter_self]], &lt;br /&gt;
[[StandardSideFilter|filter_side]],&lt;br /&gt;
[[AbilitiesWML#filter_student|filter_student]], &lt;br /&gt;
[[FilterWML#Filtering_Vision|filter_vision]],&lt;br /&gt;
[[FilterWML#Filtering_Weapons|filter_weapon]], &lt;br /&gt;
[[FilterWML#Filtering_on_WML_data|filter_wml]],&lt;br /&gt;
[[InternalActionsWML#.5Bfind_path.5D|find_path]],&lt;br /&gt;
[[InternalActionsWML#.5Bfire_event.5D|fire_event]],&lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|firststrike]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bfloating_text.5D|floating_text]],&lt;br /&gt;
[[ConditionalActionsWML#.5Bfound_item.5D|found_item]],&lt;br /&gt;
[[ConditionalActionsWML#.5Bfor.5D|for]],&lt;br /&gt;
[[ConditionalActionsWML#.5Bforeach.5D|foreach]],&lt;br /&gt;
[[AnimationWML#The .5Bframe.5D tag|frame]];&lt;br /&gt;
|-&lt;br /&gt;
|''G:'' &lt;br /&gt;
[[GameConfigWML|game_config]],&lt;br /&gt;
[[PersistenceWML#WML Syntax|get_global_variable]],&lt;br /&gt;
[[AiWML#The_.5Bgoal.5D_Tag|goal]],&lt;br /&gt;
[[DirectActionsWML#.5Bgold.5D|gold]],&lt;br /&gt;
[[InterfaceActionsWML#objectives-gold_carryover|gold_carryover]];&lt;br /&gt;
|-&lt;br /&gt;
|''H:'' &lt;br /&gt;
[[DirectActionsWML#.5Bharm_unit.5D|harm_unit]],&lt;br /&gt;
[[StandardSideFilter#has_ally|has_ally]], &lt;br /&gt;
[[StandardUnitFilter#has_attack|has_attack]],&lt;br /&gt;
[[StandardSideFilter#has_unit|has_unit]], &lt;br /&gt;
[[ConditionalActionsWML#.5Bhas_achievement.5D|has_achievement]],&lt;br /&gt;
[[ConditionalActionsWML#.5Bhave_location.5D|have_location]],&lt;br /&gt;
[[ConditionalActionsWML#.5Bhave_unit.5D|have_unit]],&lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|heal_on_hit]], &lt;br /&gt;
[[DirectActionsWML#.5Bheal_unit.5D|heal_unit]],&lt;br /&gt;
[[AnimationWML#short-healed|healed_anim]], &lt;br /&gt;
[[AnimationWML#short-healing|healing_anim]], &lt;br /&gt;
[[AbilitiesWML#The_.5Babilities.5D_tag|heals]], &lt;br /&gt;
[[UnitsWML#.5Bhide_help.5D|hide_help]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bhide_unit.5D|hide_unit]],&lt;br /&gt;
[[AbilitiesWML#The_.5Babilities.5D_tag|hides]];&lt;br /&gt;
|-&lt;br /&gt;
|''I:'' &lt;br /&gt;
[[AnimationWML#short-idle|idle_anim]], &lt;br /&gt;
if&amp;amp;nbsp;([[ConditionalActionsWML#.5Bif.5D|action]], [[AnimationWML#Conditional Branches|animation]], [[IntroWML|intro]]),&lt;br /&gt;
[[AbilitiesWML#The_.5Babilities.5D_tag|illuminates]], &lt;br /&gt;
image&amp;amp;nbsp;([[IntroWML#.5Bimage.5D|intro]], [[TerrainGraphicsWML#The_.5Bimage.5D_subtag|terrain]]),&lt;br /&gt;
[[ReplayWML#init_side|init_side]],&lt;br /&gt;
[[VariablesWML#.5Binsert_tag.5D|insert_tag]],&lt;br /&gt;
[[InterfaceActionsWML#.5Binspect.5D|inspect]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bitem.5D|item]],&lt;br /&gt;
[[EditorWML#The_.5Bitem_group.5D_tag|item_group]];&lt;br /&gt;
|-&lt;br /&gt;
|''J:''&lt;br /&gt;
[[UnitsWML#jamming_costs|jamming_costs]],&lt;br /&gt;
[[InternalActionsWML#join|join]];&lt;br /&gt;
|-&lt;br /&gt;
|''K:'' &lt;br /&gt;
[[DirectActionsWML#.5Bkill.5D|kill]],&lt;br /&gt;
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|killed]];&lt;br /&gt;
|-&lt;br /&gt;
|''L:'' &lt;br /&gt;
[[InterfaceActionsWML#.5Blabel.5D|label]],&lt;br /&gt;
[[LanguageWML|language]],&lt;br /&gt;
[[SideWML#leader|leader]],&lt;br /&gt;
[[AiWML#leader_goal|leader_goal]],&lt;br /&gt;
[[AbilitiesWML#The_.5Babilities.5D_tag|leadership]], &lt;br /&gt;
[[AnimationWML#short-leading|leading_anim]], &lt;br /&gt;
[[AnimationWML#short-levelin|levelin_anim]],&lt;br /&gt;
[[AnimationWML#short-levelout|levelout_anim]], &lt;br /&gt;
[[DirectActionsWML#.5Blift_fog.5D|lift_fog]],&lt;br /&gt;
[[AI_Recruitment#instructions-limit|limit]],&lt;br /&gt;
[[InternalActionsWML#set_variables-literal|literal]],&lt;br /&gt;
[[AddonsWML#load_resource|load_resource]],&lt;br /&gt;
[[LocaleWML|locale]],&lt;br /&gt;
[[InterfaceActionsWML#.5Block_view.5D|lock_view]],&lt;br /&gt;
[[LuaWML|lua]];&lt;br /&gt;
|-&lt;br /&gt;
|''M:'' &lt;br /&gt;
[[UnitTypeWML#variation|male]], &lt;br /&gt;
[[SavefileWML|menu_item]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bmessage.5D|message]],&lt;br /&gt;
[[Micro AIs|micro_ai]],&lt;br /&gt;
[[AnimationWML#The .5Bframe.5D tag|missile_frame]],&lt;br /&gt;
[[ModificationWML|modification]],&lt;br /&gt;
[[SingleUnitWML#modifications|modifications]],&lt;br /&gt;
[[DirectActionsWML#.5Bmodify_ai.5D|modify_ai]],&lt;br /&gt;
[[DirectActionsWML#.5Bmodify_side.5D|modify_side]],&lt;br /&gt;
[[DirectActionsWML#.5Bmodify_turns.5D|modify_turns]],&lt;br /&gt;
[[DirectActionsWML#.5Bmodify_unit.5D|modify_unit]],&lt;br /&gt;
[[AddonsWML#modify_unit_type|modify_unit_type]],&lt;br /&gt;
[[ReplayWML#move|move]],&lt;br /&gt;
[[DirectActionsWML#.5Bmove_unit.5D|move_unit]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bmove_unit_fake.5D|move_unit_fake]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bmove_units_fake.5D|move_units_fake]],&lt;br /&gt;
[[AnimationWML#short-movement|movement_anim]], &lt;br /&gt;
[[UnitsWML#movement_costs|movement costs]],&lt;br /&gt;
[[UnitsWML#.5Bmovetype.5D|movetype]],&lt;br /&gt;
[[ScenarioWML#The_.5Bmultiplayer.5D_tag|multiplayer]],&lt;br /&gt;
[[EraWML#Defining_Factions|multiplayer_side]],&lt;br /&gt;
[[MusicListWML#.5Bmusic.5D|music]];&lt;br /&gt;
|-&lt;br /&gt;
|''N:'' &lt;br /&gt;
[[ConditionalActionsWML#Meta-Condition_Tags|not]], &lt;br /&gt;
[[InterfaceActionsWML#objectives-note|note]];&lt;br /&gt;
|-&lt;br /&gt;
|''O:'' &lt;br /&gt;
[[DirectActionsWML#.5Bobject.5D|object]],&lt;br /&gt;
[[InterfaceActionsWML#objectives-objective|objective]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bobjectives.5D|objectives]],&lt;br /&gt;
[[DirectActionsWML#.5Bon_undo.5D|on_undo]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bopen_help.5D|open_help]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bmessage.5D|option]],&lt;br /&gt;
[[OptionWML|options]],&lt;br /&gt;
[[ConditionalActionsWML#Meta-Condition_Tags|or]];&lt;br /&gt;
|-&lt;br /&gt;
|''P:'' &lt;br /&gt;
[[IntroWML#.5Bpart.5D|part]], &lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|petrifies]], &lt;br /&gt;
[[DirectActionsWML#.5Bpetrify.5D|petrify]], &lt;br /&gt;
[[DirectActionsWML#.5Bplace_shroud.5D|place_shroud]], &lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|plague]], &lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|poison]], &lt;br /&gt;
[[AnimationWML#short-post_movement|post_movement_anim]], &lt;br /&gt;
[[AnimationWML#short-pre_movement|pre_movement_anim]], &lt;br /&gt;
[[InternalActionsWML#.5Bfire_event.5D|primary_attack]], &lt;br /&gt;
[[InternalActionsWML#.5Bfire_event.5D|primary_unit]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bprint.5D|print]], &lt;br /&gt;
[[DirectActionsWML#.5Bprogress_achievement.5D|progress_achievement]], &lt;br /&gt;
[[DirectActionsWML#.5Bput_to_recall_list.5D|put_to_recall_list]];&lt;br /&gt;
|-&lt;br /&gt;
|''R:'' &lt;br /&gt;
[[UnitsWML#.5Brace.5D|race]], &lt;br /&gt;
[[InternalActionsWML#.5Brandom_placement.5D|random_placement]], &lt;br /&gt;
recall&amp;amp;nbsp;([[DirectActionsWML#.5Brecall.5D|action]], [[ReplayWML#recall|replay]]), &lt;br /&gt;
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|recalls]],&lt;br /&gt;
[[ReplayWML#recruit|recruit]], &lt;br /&gt;
[[AnimationWML#short-recruit|recruit_anim]], &lt;br /&gt;
[[AnimationWML#short-recruiting|recruiting_anim]], &lt;br /&gt;
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|recruits]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bredraw.5D|redraw]],&lt;br /&gt;
[[AbilitiesWML#The_.5Babilities.5D_tag|regenerate]],&lt;br /&gt;
[[InternalActionsWML#.5Bremove_event.5D|remove_event]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bremove_item.5D|remove_item]], &lt;br /&gt;
[[DirectActionsWML#.5Bremove_object.5D|remove_object]], &lt;br /&gt;
[[DirectActionsWML#.5Bremove_shroud.5D|remove_shroud]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bremove_sound_source.5D|remove_sound_source]], &lt;br /&gt;
[[DirectActionsWML#.5Bremove_time_area.5D|remove_time_area]], &lt;br /&gt;
[[DirectActionsWML#.5Bremove_trait.5D|remove_trait]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bremove_unit_overlay.5D|remove_unit_overlay]],&lt;br /&gt;
[[ConditionalActionsWML#.5Brepeat.5D|repeat]],&lt;br /&gt;
[[DirectActionsWML#.5Breplace_map.5D|replace_map]], &lt;br /&gt;
[[DirectActionsWML#.5Breplace_schedule.5D|replace_schedule]], &lt;br /&gt;
[[ReplayWML|replay]], &lt;br /&gt;
[[SavefileWML|replay_start]],&lt;br /&gt;
[[DirectActionsWML#.5Breset_fog.5D|reset_fog]], &lt;br /&gt;
resistance&amp;amp;nbsp;([[AbilitiesWML#The_.5Babilities.5D_tag|ability]], [[UnitsWML#resistance|unit]]),&lt;br /&gt;
[[UnitsWML#.5Bresistance_defaults.5D|resistance_defaults]],&lt;br /&gt;
[[ModificationWML#The_.5Bresource.5D_toplevel_tag|resource]],&lt;br /&gt;
[[InternalActionsWML#Flow_control_actions|return]],&lt;br /&gt;
[[InternalActionsWML#.5Brole.5D|role]], &lt;br /&gt;
[[TerrainMaskWML#rule|rule]];&lt;br /&gt;
|-&lt;br /&gt;
|''S:'' &lt;br /&gt;
[[SavefileWML|save]], &lt;br /&gt;
[[ScenarioWML#The_.5Bscenario.5D_tag|scenario]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bscreen_fade.5D|screen_fade]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bscroll.5D|scroll]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bscroll_to.5D|scroll_to]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bscroll_to_unit.5D|scroll_to_unit]], &lt;br /&gt;
[[InternalActionsWML#.5Bfire_event.5D|secondary_attack]], &lt;br /&gt;
[[InternalActionsWML#.5Bfire_event.5D|secondary_unit]], &lt;br /&gt;
[[HelpWML#section|section]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bselect_unit.5D|select_unit]], &lt;br /&gt;
[[ReplayWML#sequence|sequence]], &lt;br /&gt;
[[DirectActionsWML#.5Bset_achievement.5D|set_achievement]],&lt;br /&gt;
[[DirectActionsWML#.5Bset_extra_recruit.5D|set_extra_recruit]],&lt;br /&gt;
[[PersistenceWML#WML_Syntax|set_global_variable]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bset_menu_item.5D|set_menu_item]], &lt;br /&gt;
[[DirectActionsWML#.5Bset_recruit.5D|set_recruit]],&lt;br /&gt;
[[EffectWML#set_specials|set_specials]], &lt;br /&gt;
[[InternalActionsWML#.5Bset_variable.5D|set_variable]], &lt;br /&gt;
[[InternalActionsWML#.5Bset_variables.5D|set_variables]], &lt;br /&gt;
[[AnimationWML#short-sheath_weapon|sheath_weapon_anim]], &lt;br /&gt;
show_if&amp;amp;nbsp;([[InterfaceActionsWML#.5Bmessage.5D|message]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bobjectives.5D|objective]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bset_menu_item.5D|set_menu_item]]),&lt;br /&gt;
[[InterfaceActionsWML#.5Bshow_objectives.5D|show_objectives]],&lt;br /&gt;
[[SideWML|side]], &lt;br /&gt;
[[AbilitiesWML#The_.5Babilities.5D_tag|skirmisher]], &lt;br /&gt;
[[OptionWML#slider|slider]],&lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|slow]], &lt;br /&gt;
[[SavefileWML|snapshot]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bsound.5D|sound]], &lt;br /&gt;
[[InterfaceActionsWML#.5Bsound_source.5D|sound_source]], &lt;br /&gt;
source&amp;amp;nbsp;([[ReplayWML#attack|replay]], [[DirectActionsWML#.5Btunnel.5D|teleport]]),&lt;br /&gt;
[[UnitTypeWML#Special Notes|special_note]],&lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|specials]], &lt;br /&gt;
[[InternalActionsWML#set_variables-split|split]],&lt;br /&gt;
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Stages|stage]], &lt;br /&gt;
[[AnimationWML#short-standing|standing_anim]], &lt;br /&gt;
[[StatisticalScenarioWML#The_.5Bstatistics.5D_tag|statistics]],&lt;br /&gt;
[[SingleUnitWML#status|status]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_gold.5D|store_gold]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_items.5D|store_items]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_locations.5D|store_locations]],&lt;br /&gt;
[[InternalActionsWML#.5Bstore_map_dimensions.5D|store_map_dimensions]],&lt;br /&gt;
[[InternalActionsWML#.5Bstore_reachable_locations.5D|store_reachable_locations]],&lt;br /&gt;
[[InternalActionsWML#.5Bstore_relative_direction.5D|store_relative_direction]],&lt;br /&gt;
[[InternalActionsWML#.5Bstore_side.5D|store_side]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_starting_location.5D|store_starting_location]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_time_of_day.5D|store_time_of_day]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_turns.5D|store_turns]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_unit.5D|store_unit]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_unit_defense.5D|store_unit_defense]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_unit_defense_on.5D|store_unit_defense_on]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_unit_type.5D|store_unit_type]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_unit_type_ids.5D|store_unit_type_ids]], &lt;br /&gt;
[[InternalActionsWML#.5Bstore_villages.5D|store_villages]], &lt;br /&gt;
[[IntroWML|story]], &lt;br /&gt;
[[AbilitiesWML#The_.5Bspecials.5D_tag|swarm]], &lt;br /&gt;
[[AchievementsWML#.5Bsub_achievement.5D|sub_achievement]],&lt;br /&gt;
[[ConditionalActionsWML#.5Bswitch.5D|switch]],&lt;br /&gt;
[[InternalActionsWML#.5Bsync_variable.5D|sync_variable]];&lt;br /&gt;
|-&lt;br /&gt;
|''T:'' &lt;br /&gt;
[[DirectActionsWML#.5Btunnel.5D|target]], &lt;br /&gt;
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|team]],&lt;br /&gt;
teleport&amp;amp;nbsp;([[AbilitiesWML|ability]], [[DirectActionsWML#.5Bteleport.5D|action]]),&lt;br /&gt;
[[AnimationWML#short-teleport|teleport_anim]],&lt;br /&gt;
[[DirectActionsWML#.5Bterrain.5D|terrain]], &lt;br /&gt;
[[UnitsWML#.5Bterrain_defaults.5D|terrain_defaults]],&lt;br /&gt;
[[TerrainGraphicsWML|terrain_graphics]], &lt;br /&gt;
[[TerrainMaskWML|terrain_mask]], &lt;br /&gt;
[[TerrainWML|terrain_type]], &lt;br /&gt;
[[ScenarioWML#The_.5Btest.5D_tag|test]],&lt;br /&gt;
[[InterfaceActionsWML#.5Btest_condition.5D|test_condition]],&lt;br /&gt;
[[TestWML#The_.5Btest_do_attack_by_id.5D_tag|test_do_attack_by_id]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bmessage.5D|text_input]], &lt;br /&gt;
[[GettextForWesnothDevelopers#The_textdomain_tag|textdomain]],&lt;br /&gt;
[[ThemeWML|theme]],&lt;br /&gt;
[[ConditionalActionsWML#.5Bif.5D|then]],&lt;br /&gt;
[[TerrainGraphicsWML|tile]], &lt;br /&gt;
[[TimeWML|time]], &lt;br /&gt;
[[DirectActionsWML#.5Btime_area.5D|time_area]], &lt;br /&gt;
[[HelpWML|topic]], &lt;br /&gt;
[[HelpWML|toplevel]], &lt;br /&gt;
[[UnitsWML#.5Btrait.5D|trait]], &lt;br /&gt;
[[DirectActionsWML#.5Btransform_unit.5D|transform_unit]], &lt;br /&gt;
[[InternalActionsWML#.5Bfind_path.5D|traveler]], &lt;br /&gt;
[[ConditionalActionsWML#.5Btrue.5D|true]],&lt;br /&gt;
[[DirectActionsWML#.5Btunnel.5D|tunnel]];&lt;br /&gt;
|-&lt;br /&gt;
|''U:'' &lt;br /&gt;
[[InterfaceActionsWML#.5Bunhide_unit.5D|unhide_unit]], &lt;br /&gt;
[[SingleUnitWML|unit]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bunit_overlay.5D|unit_overlay]], &lt;br /&gt;
[[UnitTypeWML|unit_type]], &lt;br /&gt;
[[InternalActionsWML#.5Bunit_worth.5D|unit_worth]], &lt;br /&gt;
[[UnitsWML|units]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bunlock_view.5D|unlock_view]],&lt;br /&gt;
[[DirectActionsWML#.5Bunpetrify.5D|unpetrify]], &lt;br /&gt;
[[DirectActionsWML#.5Bunstore_unit.5D|unstore_unit]],&lt;br /&gt;
[[InternalActionsWML#.5Bunsynced.5D|unsynced]];&lt;br /&gt;
|-&lt;br /&gt;
| ''V:'' &lt;br /&gt;
[[InternalActionsWML#.5Bset_variables.5D|value]], &lt;br /&gt;
[[ConditionalActionsWML#.5Bvariable.5D|variable]],&lt;br /&gt;
[[VariablesWML#The_.5Bvariables.5D_tag|variables]],&lt;br /&gt;
[[TerrainGraphicsWML|variant]],&lt;br /&gt;
[[UnitTypeWML#Other_tags|variation]], &lt;br /&gt;
[[AnimationWML#short-victory|victory_anim]], &lt;br /&gt;
[[SideWML|village]],&lt;br /&gt;
[[UnitsWML#.5Bmovetype.5D|vision_costs]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bvolume.5D|volume]];&lt;br /&gt;
|-&lt;br /&gt;
| ''W:'' &lt;br /&gt;
[[ConditionalActionsWML#.5Bwhile.5D|while]],&lt;br /&gt;
[[InterfaceActionsWML#.5Bwml_message.5D|wml_message]],&lt;br /&gt;
[[SchemaWML|wml_schema]];&lt;br /&gt;
|-&lt;br /&gt;
| ''Z:''&lt;br /&gt;
[[InterfaceActionsWML#.5Bzoom.5D|zoom]];&lt;br /&gt;
|}&amp;lt;includeonly&amp;gt;[[Category:WML Reference]]&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;A box with all the WML tags, each one linking to the page and section they are described in. This box should be included in each of the WML reference pages.&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=IntroWML&amp;diff=72451</id>
		<title>IntroWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=IntroWML&amp;diff=72451"/>
		<updated>2024-03-06T04:28:03Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* [part] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
&lt;br /&gt;
The '''[story]''' tag is a series of images and text to display as the first part of the intro screen. It can appear in [[ScenarioWML]] or {{DevFeature1.13|8}} as [[InterfaceActionsWML#.5Bstory.5D|ActionWML]].&lt;br /&gt;
&lt;br /&gt;
The '''[deprecated_message]''', '''[wml_message]''', '''[image]''', and '''[insert_tag]''' tags are allowed beneath '''[story]'''.  Most other WML tags will not be recognized in this context. Note, however, that messages produced by the first two tags will not appear in the game interface until the actual game map appears.&lt;br /&gt;
&lt;br /&gt;
The only other tags currently recognized within '''[story]''' and '''[part]''' are '''[if]'''/'''[then]'''/'''[else]''' ({{DevFeature1.13|0}}: also '''[elseif]''') and '''[switch]'''/'''[case]'''. These can be used to show parts conditionally on the values of variables.&lt;br /&gt;
&lt;br /&gt;
See also the journey and battle macros, in the [https://www.wesnoth.org/macro-reference.html#file:image-utils.cfg Macro Reference]&lt;br /&gt;
&lt;br /&gt;
== [part] ==&lt;br /&gt;
&lt;br /&gt;
Each '''[part]''' tag represents one &amp;quot;page&amp;quot; of a story sequence, with its own text and images. The player advances through parts by clicking on the '''Next'''/'''→''' button to advance one part, the '''Back'''/'''←''' button to go back one part, and the '''Skip''' button to leave the story sequence and start/return to the game.&lt;br /&gt;
&lt;br /&gt;
The following keys/tags are recognized for '''[part]'''.&lt;br /&gt;
&lt;br /&gt;
=== Main text keys ===&lt;br /&gt;
&lt;br /&gt;
* '''story''': (translatable) the text to display below the image.&lt;br /&gt;
* '''text_alignment''': specifies the alignment of the story text. It must be one of ''left'' (default), ''center'' or ''right''.&lt;br /&gt;
* '''text_layout''': specifies the vertical portion of the screen where the story text will be displayed. It must be one of ''top'', ''middle'' or ''bottom'' (default).&lt;br /&gt;
&lt;br /&gt;
=== Title text keys ===&lt;br /&gt;
&lt;br /&gt;
* '''show_title''': whether to display the title of the scenario at the top&lt;br /&gt;
* '''title''': specifies a custom title to display instead of the name of the scenario. If specified, it implies '''show_title=yes'''. If parent the '''[story]''' is used through [[InterfaceActionsWML#.5Bstory.5D|ActionWML]] with '''show_title=yes''', the '''title''' key must be explicitly specified as it does not default to the scenario title and leads to a missing title error if omitted.&lt;br /&gt;
* '''title_alignment''': specifies the alignment of the title box. It must be one of ''left'' (default), ''center'' or ''right''.&lt;br /&gt;
&lt;br /&gt;
=== Image and sound keys ===&lt;br /&gt;
&lt;br /&gt;
* '''background''': the image to display. Story images are usually created specially for this purpose, except for the map.&lt;br /&gt;
* '''scale_background''': Whether to scale the background, default yes.&lt;br /&gt;
* '''music''': change to this music&lt;br /&gt;
* '''sound''': a list of sound files; the engine will choose one at random and play it once while displaying the story part.&lt;br /&gt;
* '''voice''': a list of sound files; the engine will choose one at random and play it on a sound channel intended for voice overs once while displaying the story part.&lt;br /&gt;
&lt;br /&gt;
=== [background_layer] ===&lt;br /&gt;
&lt;br /&gt;
A layer of the background of the story screen.&lt;br /&gt;
&lt;br /&gt;
* '''image''': path to the image file.&lt;br /&gt;
* '''scale_vertically''': whether the image should be scaled to fill the screen in the vertical dimension. Default yes.&lt;br /&gt;
* '''scale_horizontally''': whether the image should be scaled to fill the screen in the horizontal dimension. Default yes.&lt;br /&gt;
* '''scale''': a shortcut to set scale_vertically and scale_horizontally at once. If specified, the values of the former two keys will be ignored.&lt;br /&gt;
* '''keep_aspect_ratio''': whether the aspect ratio of the image should be preserved while scaling. Default yes.&lt;br /&gt;
* '''tile_vertically''': whether the image should be tiled in the vertical direction. Tiling happens after aligning the image to the center of the screen. Default no.&lt;br /&gt;
* '''tile_horizontally''': whether the image should be tiled in the horizontal direction. Tiling happens after aligning the image to the center of the screen. Default no.&lt;br /&gt;
* '''tile''': a shortcut to set tile_vertically and tile_horizontally at once. If specified, the values of the former two keys will be ignored.&lt;br /&gt;
* '''base_layer''': whether is this the layer to align the overlay images to. Default no.&lt;br /&gt;
&lt;br /&gt;
=== [image] ===&lt;br /&gt;
&lt;br /&gt;
An image to display.&lt;br /&gt;
&lt;br /&gt;
* '''x''', '''y''': the location to draw the image, using the pixels of the '''base_layer''' background image as the coordinate system.&lt;br /&gt;
* '''centered''': If &amp;quot;yes&amp;quot;, use the center of the image as the anchor point when placing at the x,y coordinates, if &amp;quot;no&amp;quot; then use the top-left corner.&lt;br /&gt;
* '''file''': the image to display.&lt;br /&gt;
* '''delay''': the time to delay drawing this image.&lt;br /&gt;
* '''resize_with_background''': {{DevFeature1.15|7}} if &amp;quot;yes&amp;quot;, apply the same scaling as applied to the '''base_layer'''&lt;br /&gt;
&lt;br /&gt;
Each image is placed using the pixels of the background_layer as the coordinate system; each image's location moves to compensate when the background image is scaled. Example: my background image is a map with a city at pixel 160,100; I put a battle marker on that city using '''x,y,centered=160,100,yes'''. When a user plays the game they will see the map enlarged to fill the window (regardless of its size), and the battle marker will still be on top of the city.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=IntroWML&amp;diff=72450</id>
		<title>IntroWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=IntroWML&amp;diff=72450"/>
		<updated>2024-03-06T04:24:03Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Various documentation changes to reflect 1.16 and 1.18 WML better, including fixing misinformation regarding text_alignment and text_layout that was never true (my bad)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
&lt;br /&gt;
The '''[story]''' tag is a series of images and text to display as the first part of the intro screen. It can appear in [[ScenarioWML]] or {{DevFeature1.13|8}} as [[InterfaceActionsWML#.5Bstory.5D|ActionWML]].&lt;br /&gt;
&lt;br /&gt;
The '''[deprecated_message]''', '''[wml_message]''', '''[image]''', and '''[insert_tag]''' tags are allowed beneath '''[story]'''.  Most other WML tags will not be recognized in this context. Note, however, that messages produced by the first two tags will not appear in the game interface until the actual game map appears.&lt;br /&gt;
&lt;br /&gt;
The only other tags currently recognized within '''[story]''' and '''[part]''' are '''[if]'''/'''[then]'''/'''[else]''' ({{DevFeature1.13|0}}: also '''[elseif]''') and '''[switch]'''/'''[case]'''. These can be used to show parts conditionally on the values of variables.&lt;br /&gt;
&lt;br /&gt;
See also the journey and battle macros, in the [https://www.wesnoth.org/macro-reference.html#file:image-utils.cfg Macro Reference]&lt;br /&gt;
&lt;br /&gt;
== [part] ==&lt;br /&gt;
&lt;br /&gt;
'''[part]''' is a special tag recognized only beneath '''[story]'''. Each '''[part]''' represents one image and text.&lt;br /&gt;
The part is displayed until the user clicks on the &amp;quot;Next&amp;gt;&amp;gt;&amp;gt;&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
The following key/tags are recognized for '''[part]''':&lt;br /&gt;
&lt;br /&gt;
=== Main text options ===&lt;br /&gt;
&lt;br /&gt;
* '''story''': (translatable) the text to display below the image.&lt;br /&gt;
* '''text_alignment''': specifies the alignment of the story text. It must be one of ''left'' (default), ''center'' or ''right''.&lt;br /&gt;
* '''text_layout''': specifies the vertical portion of the screen where the story text will be displayed. It must be one of ''top'', ''middle'' or ''bottom'' (default).&lt;br /&gt;
&lt;br /&gt;
=== Title text options ===&lt;br /&gt;
&lt;br /&gt;
* '''show_title''': whether to display the title of the scenario at the top&lt;br /&gt;
* '''title''': specifies a custom title to display instead of the name of the scenario. If specified, it implies '''show_title=yes'''. If parent the '''[story]''' is used through [[InterfaceActionsWML#.5Bstory.5D|ActionWML]] with '''show_title=yes''', the '''title''' key must be explicitly specified as it does not default to the scenario title and leads to a missing title error if omitted.&lt;br /&gt;
* '''title_alignment''': specifies the alignment of the title box. It must be one of ''left'' (default), ''center'' or ''right''.&lt;br /&gt;
&lt;br /&gt;
=== Image and sound options ===&lt;br /&gt;
&lt;br /&gt;
* '''background''': the image to display. Story images are usually created specially for this purpose, except for the map.&lt;br /&gt;
* '''scale_background''': Whether to scale the background, default yes.&lt;br /&gt;
* '''music''': change to this music&lt;br /&gt;
* '''sound''': a list of sound files; the engine will choose one at random and play it once while displaying the story part.&lt;br /&gt;
* '''voice''': a list of sound files; the engine will choose one at random and play it on a sound channel intended for voice overs once while displaying the story part.&lt;br /&gt;
&lt;br /&gt;
=== [background_layer] ===&lt;br /&gt;
&lt;br /&gt;
A layer of the background of the story screen.&lt;br /&gt;
&lt;br /&gt;
* '''image''': path to the image file.&lt;br /&gt;
* '''scale_vertically''': whether the image should be scaled to fill the screen in the vertical dimension. Default yes.&lt;br /&gt;
* '''scale_horizontally''': whether the image should be scaled to fill the screen in the horizontal dimension. Default yes.&lt;br /&gt;
* '''scale''': a shortcut to set scale_vertically and scale_horizontally at once. If specified, the values of the former two keys will be ignored.&lt;br /&gt;
* '''keep_aspect_ratio''': whether the aspect ratio of the image should be preserved while scaling. Default yes.&lt;br /&gt;
* '''tile_vertically''': whether the image should be tiled in the vertical direction. Tiling happens after aligning the image to the center of the screen. Default no.&lt;br /&gt;
* '''tile_horizontally''': whether the image should be tiled in the horizontal direction. Tiling happens after aligning the image to the center of the screen. Default no.&lt;br /&gt;
* '''tile''': a shortcut to set tile_vertically and tile_horizontally at once. If specified, the values of the former two keys will be ignored.&lt;br /&gt;
* '''base_layer''': whether is this the layer to align the overlay images to. Default no.&lt;br /&gt;
&lt;br /&gt;
=== [image] ===&lt;br /&gt;
&lt;br /&gt;
An image to display.&lt;br /&gt;
&lt;br /&gt;
* '''x''', '''y''': the location to draw the image, using the pixels of the '''base_layer''' background image as the coordinate system.&lt;br /&gt;
* '''centered''': If &amp;quot;yes&amp;quot;, use the center of the image as the anchor point when placing at the x,y coordinates, if &amp;quot;no&amp;quot; then use the top-left corner.&lt;br /&gt;
* '''file''': the image to display.&lt;br /&gt;
* '''delay''': the time to delay drawing this image.&lt;br /&gt;
* '''resize_with_background''': {{DevFeature1.15|7}} if &amp;quot;yes&amp;quot;, apply the same scaling as applied to the '''base_layer'''&lt;br /&gt;
&lt;br /&gt;
Each image is placed using the pixels of the background_layer as the coordinate system; each image's location moves to compensate when the background image is scaled. Example: my background image is a map with a city at pixel 160,100; I put a battle marker on that city using '''x,y,centered=160,100,yes'''. When a user plays the game they will see the map enlarged to fill the window (regardless of its size), and the battle marker will still be on top of the city.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Credits&amp;diff=68599</id>
		<title>Credits</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Credits&amp;diff=68599"/>
		<updated>2021-10-25T19:40:35Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update translation credits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;tright&amp;quot;&amp;gt; __TOC__ &amp;lt;/div&amp;gt;&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
In July 2003, '''David White''' released the first version of Wesnoth. Since&lt;br /&gt;
then, many people have joined the project, contributing in very different ways.&lt;br /&gt;
&lt;br /&gt;
To make any changes to this list, please modify&lt;br /&gt;
&amp;lt;code class=&amp;quot;noframe&amp;quot;&amp;gt;about.cfg&amp;lt;/code&amp;gt; in the repo or ask any developer to do&lt;br /&gt;
it for you.&lt;br /&gt;
&lt;br /&gt;
== Core Contributors ==&lt;br /&gt;
=== Programming ===&lt;br /&gt;
* [mailto:dave&amp;amp;#x40;whitevine&amp;amp;#x2E;net David White] (Sirp) &amp;amp;#8212; Founding Developer&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* [mailto:AI0867&amp;amp;#x40;gmail&amp;amp;#x2E;com Alexander van Gessel] (AI/AI0867)&lt;br /&gt;
* Alfredo Beaumont (ziberpunk) &amp;amp;#8212; autotools&lt;br /&gt;
* Ali El Gariani ([[User:Alink|alink]]) &amp;amp;#8212; coder, bug fixes, optimizations, interface usability&lt;br /&gt;
* András Salamon ([[User:Ott|ott]]) &amp;amp;#8212; QA, bug fixing, subediting, game mechanics&lt;br /&gt;
* Andreas Löf (Aginor)&lt;br /&gt;
* Anonymissimus &amp;amp;#8212; bug fixes and features mostly related to the wml engine or lua interface&lt;br /&gt;
* [mailto:artemkhrapov2001ATyandexDOTru Artem Khrapov] ([[User:Kabachuha|kabachuha]]) &amp;amp;#8212; addons server rework, incremental updates and uploads feature; i18n, UI and quality of life improvements; bugfixes&lt;br /&gt;
* [mailto:dragonking&amp;amp;#x40;o2&amp;amp;#x2E;pl Bartek Waresiak] (Dragonking) &amp;amp;#8212; unit balancing, Formula AI&lt;br /&gt;
* Benoît Timbert ([[User:Noyga|Noyga]])&lt;br /&gt;
* Bram Ridder (Morloth) &amp;amp;#8212; editor improvements&lt;br /&gt;
* [mailto:bruno&amp;amp;#x40;wolff&amp;amp;#x2E;to Bruno Wolff III] ([[User:bruno|bruno]]) &amp;amp;#8212; campaign web interface, bug fixing, minor coder&lt;br /&gt;
* Cameron Morland&lt;br /&gt;
* Cédric Duval &amp;amp;#8212; coder, internationalization manager&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; General fixes, cleanup and improvements to various areas.&lt;br /&gt;
* Chris Beck (iceiceice/involution) &amp;amp;#8212; Bug fixes and features esp. engine-related or multiplayer-related. Added WML unit testing system, improvements to travis-CI.&lt;br /&gt;
* Celtic Minstrel&lt;br /&gt;
* Daniel Franke (dfranke)&lt;br /&gt;
* Daniel (gfgtdf)&lt;br /&gt;
* David Hilton&lt;br /&gt;
* Dominic Bolin (Xan)&lt;br /&gt;
* Elias Pschernig (allefant)&lt;br /&gt;
* Elvish_Hunter&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Macro library reorganization, major UI makeover introducing lightweight transparent popups and linger mode, maintenance tools for WML, eight campaigns lifted from UMC, one all-original campaign, editor refactoring, many many code cleanups, and svn-to-git migration.&lt;br /&gt;
* Eugen Jiresch (euschn) &amp;amp;#8212; savegame improvements&lt;br /&gt;
* [mailto:fabianmueller5_at_gmx&amp;amp;#x2E;de Fabian Müller] ([[User:fabi|fabi/fendrin]])&lt;br /&gt;
* [mailto:gabrielmorin~_-AT-_~gmail&amp;amp;#x2E;com Gabriel Morin] (gabba) &amp;amp;#8212; Whiteboard project, naming hotseat players, delay shroud updates on game start.&lt;br /&gt;
* Greg Copeland (Oracle) &amp;amp;#8212; coding; Server optimizations.&lt;br /&gt;
* Gregory Lundberg (TadCarlucci) &amp;amp;#8212; Cleanup of campaigns code&lt;br /&gt;
* [mailto:cornmander&amp;amp;#x40;cornmander&amp;amp;#x2E;com Gregory Shikhman] (corn) &amp;amp;#8212; coding; upload log maintenance/improvements&lt;br /&gt;
* Guillaume Melquiond (silene) &amp;amp;#8212; coding, bug fixes&lt;br /&gt;
* [mailto:billybiset&amp;amp;#x40;gmail&amp;amp;#x2E;com Guillermo Biset] (billynux) &amp;amp;#8212; Bug fixer, remover of upload stats, network module rewrite, ANA, boost::asio&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]]) &amp;amp;#8212; Miscellaneous WML, i18n and UI features, improvements and bugfixes; refactoring and extension of add-ons management code; features and refactoring of image-path functions mechanism; cache manager UI and paths/game version dialog; campaignd refactoring and maintenance&lt;br /&gt;
* Jérémy Rosen ([[User:Boucman|Boucman]]) &amp;amp;#8212; coder&lt;br /&gt;
* [mailto:mcnabb&amp;amp;#x40;gravity&amp;amp;#x2E;psu&amp;amp;#x2E;edu John W. C. McNabb] (Darth Fool) &amp;amp;#8212; coder, graphics&lt;br /&gt;
* Jon Daniel (worduk) &amp;amp;#8212; coder, bug fixes&lt;br /&gt;
* Jörg Hinrichs (Yogi Bear/YogiHH)&lt;br /&gt;
* [mailto:justin&amp;amp;#x2E;zaun&amp;amp;#x40;gmail&amp;amp;#x2E;com Justin Zaun] (jzaun) &amp;amp;#8212; coder, scenario designer&lt;br /&gt;
* Jyrki Vesterinen&lt;br /&gt;
* Karol Nowak (grzywacz) &amp;amp;#8212; bug fixes, sound sources, gp2x port&lt;br /&gt;
* [mailto:erl&amp;amp;#x40;erl&amp;amp;#x2E;se Kristoffer Erlandsson] (erl) &amp;amp;#8212; help system, editor&lt;br /&gt;
* [mailto:lao&amp;amp;#x2E;geek&amp;amp;#x40;gmail&amp;amp;#x2E;com Lao] ([[User:lao|lao]]) &amp;amp;#8212; bug fixes and candidate to GSoC 2008&lt;br /&gt;
* Mark de Wever ([[User:SkeletonCrew|Mordante/SkeletonCrew]]) &amp;amp;#8212; coder, bug fixes, various features, multi-letter terrain system, gui system.&lt;br /&gt;
* Martin Renold (maxy/martinxyz) &amp;amp;#8212; performance and gui bug fixes&lt;br /&gt;
* Matthias Kretz &amp;amp;#8212; optimizations&lt;br /&gt;
* Moritz Göbelbecker (mog) &amp;amp;#8212; Work on the terrain engine&lt;br /&gt;
* Nicolas Weeger (Ryo) &amp;amp;#8212; Python API&lt;br /&gt;
* [mailto:patrick_x99&amp;amp;#x40;hotmail&amp;amp;#x2E;com Patrick Parker] ([[User:Sapient|Sapient]]) &amp;amp;#8212; improvements to user interface, WML engine, various features&lt;br /&gt;
* [mailto:paniemin&amp;amp;#x40;cc&amp;amp;#x2E;hut&amp;amp;#x2E;fi Pauli Nieminen] (suokko) &amp;amp;#8212; Bug fixing; usually targeting MP or WML engine&lt;br /&gt;
* [mailto:philippe&amp;amp;#x2E;plantier&amp;amp;#x40;naema&amp;amp;#x2E;org Philippe Plantier] ([[User:Ayin|Ayin]]) &amp;amp;#8212; several parts of the code, notably terrain graphics code&lt;br /&gt;
* Rusty Russell (rusty)&lt;br /&gt;
* Sergey Popov (loonycyborg) &amp;amp;#8212; scons&lt;br /&gt;
* singalen &amp;amp;#8212; iOS port&lt;br /&gt;
* Soliton &amp;amp;#8212; bug fixes and various small features usually in multiplayer context&lt;br /&gt;
* Steve Cotton (octalot)&lt;br /&gt;
* Steven Oxley (xonev)&lt;br /&gt;
* Thomas Baumhauer (Baufo)&lt;br /&gt;
* [mailto:timotei21&amp;amp;#x40;gmail&amp;amp;#x2E;com Timotei Dolean] (timotei) &amp;amp;#8212; Eclipse UMC plugin&lt;br /&gt;
* Tomasz Śniatowski (ilor) &amp;amp;#8212; Editor&lt;br /&gt;
* [mailto:ydirson&amp;amp;#x40;altern&amp;amp;#x2E;org Yann Dirson] &amp;amp;#8212; gettext support, tinygui&lt;br /&gt;
* [mailto:terraninfo&amp;amp;#x40;terraninfo&amp;amp;#x2E;net Yurii Chernyi] (Crab) &amp;amp;#8212; AI&lt;br /&gt;
=== General Purpose Administration and Coordination ===&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; Current release manager (1.13.3-present)&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Crossbow/Miyo &amp;amp;#8212; Past release manager&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]]) &amp;amp;#8212; Past release manager (1.12.1-1.12.6 / 1.13.0-1.13.2)&lt;br /&gt;
* [mailto:isaac&amp;amp;#x40;sindominio&amp;amp;#x2E;net Isaac Clerencia] &amp;amp;#8212; Past release manager, Debian packager&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; Past release manager, internationalization manager, OpenPandora packager, A Tale of Two Brothers, German translation&lt;br /&gt;
* Noy &amp;amp;#8212; General purpose administration, unit balancing&lt;br /&gt;
* Pentarctagon&lt;br /&gt;
=== Internationalization Managers ===&lt;br /&gt;
* Cédric Duval &amp;amp;#8212; coder, internationalization manager&lt;br /&gt;
* David Philippi (Torangan) &amp;amp;#8212; internationalization manager, wescamp&lt;br /&gt;
* Mark Michelsen (skovbaer) &amp;amp;#8212; Slackware packager&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; administrator, release manager, internationalization manager, OpenPandora packager, A Tale of Two Brothers, german translation&lt;br /&gt;
* [mailto:susanna&amp;amp;#x2E;bjorverud&amp;amp;#x40;telia&amp;amp;#x2E;com Susanna Björverud] (sanna)&lt;br /&gt;
=== Trailers ===&lt;br /&gt;
* ancestral &amp;amp;#8212; 1.12 trailer&lt;br /&gt;
* Pedro Caseiro (Kasdel) &amp;amp;#8212; 1.14 trailer&lt;br /&gt;
* Felix Merveille (felixmerveille) &amp;amp;#8212; 1.16 trailer edits and additions&lt;br /&gt;
=== Artwork and Graphics ===&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; portrait director - focus on loyalists, trolls, monsters&lt;br /&gt;
* Francisco Muñoz (fmunoz) &amp;amp;#8212; founding artist and former lead artist, worked consistently on all aspects till around v0.7-0.9.&lt;br /&gt;
* Hogne Håskjold (frame/freim) &amp;amp;#8212; terrain art director, made much of the current terrains (esp. mountains)&lt;br /&gt;
* J.W. Bjerk ([[User:Eleazar|Eleazar]]) &amp;amp;#8212; terrain art director (esp. Chasm, Cave, Water), sprite animations, various visual tweaks&lt;br /&gt;
* James Woo (Pickslide) &amp;amp;#8212; portraits (major focus on orcs and campaigns, especially UtBS, TEI, TSoF)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portrait director - focus on mages/necromancers, elvish, naga, merfolk, and troll unit trees&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; sprite animation, various visual tweaks, titlescreen and campaign maps (v1.11+), water animations (v1.13+)&lt;br /&gt;
* Neoriceisgood &amp;amp;#8212; sprite creator and animator (major focus on drakes, dwarves, saurians)&lt;br /&gt;
* Pekka Aikio (pekka) &amp;amp;#8212; tiles, esp. castles, and attack icons&lt;br /&gt;
* Phil Barber (thespaceinvader) &amp;amp;#8212; Dwarf and Saurian portraits, most of the drake animations, and a large amount on other stuff, esp. the dwarves.&lt;br /&gt;
* Richard Kettering ([[User:Jetryl|Jetrel]]) &amp;amp;#8212; art director/slave, major focus on sprites, portraits, buildings, and icons&lt;br /&gt;
* Timo Honkasalo (Sgt. Groovy) &amp;amp;#8212; New high-res logo for the game&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Alex Jarocha-Ernst (Jormungandr) &amp;amp;#8212; portraits&lt;br /&gt;
* Christophe Anjard (Christophe33) &amp;amp;#8212; made many of the old (c. v0.6) terrains, and some sprites for the dwarves&lt;br /&gt;
* Erkki Lonkainen (Eternal) &amp;amp;#8212; created and animated many replacement sprites (esp. ogre, orc assassin &amp;amp; spear units, and cockatrice)&lt;br /&gt;
* Jason Lutes &amp;amp;#8212; portraits (major focus on humans, some campaign portraits)&lt;br /&gt;
* Johann de Venecia (Johann) &amp;amp;#8212; drew the new campaign story art for HttT&lt;br /&gt;
* Leonhard &amp;amp;#8212; made several of the new attack icons&lt;br /&gt;
* Marcus Rosén (sleepwalker) &amp;amp;#8212; Animations (esp. Saurians, Dwarves, Horseman), dunefolk sprites, and portraits (Mermaid Initiate &amp;amp; Dune Herbalist)&lt;br /&gt;
* Mark Goodenough (Ranger M) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Maximiliano Buis (Redeth) &amp;amp;#8212; Made nearly all of the idle animations, and some death animations (as of 1.3.1)&lt;br /&gt;
* Michael Gil de Muro (grp21) &amp;amp;#8212; portraits (for the campaign 'The Rise of Wesnoth')&lt;br /&gt;
* Moritz Göbelbecker (mog) &amp;amp;#8212; tiles, esp. swamp, encampment, ice, and work with lava/chasm&lt;br /&gt;
* Niall Burton (Leonard03) &amp;amp;#8212; Minimalistic logo render&lt;br /&gt;
* Peter Geinitz (Shadow/Wayfarer) &amp;amp;#8212; sprite creator and animator&lt;br /&gt;
* Robert Bolin (Zebulon) &amp;amp;#8212; tiles, sprite editing and animations&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Andrew James Patterson (Kamahawk) &amp;amp;#8212; sprites&lt;br /&gt;
* antwerpz &amp;amp;#8212; sprite creator/animator for old saurian units&lt;br /&gt;
* Diego Brea (Cobretti) &amp;amp;#8212; sprite creator/animator&lt;br /&gt;
* EEL (EELuminatus) &amp;amp;#8212; sprite animator, provided death animations for the woses, some of the orcs, and an attack animation for the revenant&lt;br /&gt;
* Eli Dupree (Elvish Pillager) &amp;amp;#8212; sprites and animations&lt;br /&gt;
* Eric Holdos (Rev. V!)&lt;br /&gt;
* Gareth Miller (Gafgarion) &amp;amp;#8212; made some early sprites/tiles&lt;br /&gt;
* Gerald Clears (Smok'em Jags) &amp;amp;#8212; sprite animator&lt;br /&gt;
* James Barton (Sangel) &amp;amp;#8212; sprites&lt;br /&gt;
* Jami &amp;amp;#8212; rogue death and red mage idle animations&lt;br /&gt;
* Jerzy Brzozowski (Mefisto) &amp;amp;#8212; Various sprites and animations, tropical forests.&lt;br /&gt;
* Jesse Holland (Kestenvarn) &amp;amp;#8212; map illustrator of old titlescreen and campaign maps (v1.1 - v1.10)&lt;br /&gt;
* Johanna Manninen (lohari) &amp;amp;#8212; edited tiles, ported freeciv tiles used in very early versions of wesnoth&lt;br /&gt;
* John Muccigrosso (Eponymous Archon) &amp;amp;#8212; made some early sprites, such as the human bowmen&lt;br /&gt;
* Kuno Raffin (lurker) &amp;amp;#8212; Various terrain artwork&lt;br /&gt;
* Michael Mielewczik (Mille) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Mikko Kraft (Deserter) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Musketaquid &amp;amp;#8212; animated windmill / stone path&lt;br /&gt;
* Slainte &amp;amp;#8212; made sprites for c. v0.6 mages, also made many of the old attack icons&lt;br /&gt;
* Simon Forsyth (Alarantalara) &amp;amp;#8212; cave terrain&lt;br /&gt;
* Stephen Metcalf (Neoskel) &amp;amp;#8212; major help with shadow standardization (over half the units), made some missing zombie variants&lt;br /&gt;
* Stephen Stone (Disto) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Svetac &amp;amp;#8212; made many of the old attack icons&lt;br /&gt;
* Tristan Millner (tatmf) &amp;amp;#8212; made old portrait of dwarven fighter&lt;br /&gt;
* Zhukov &amp;amp;#8212; sprite animator&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Aaron Redfern (A-Red) &amp;amp;#8212; Sprites and animations&lt;br /&gt;
* Adrian Sheehy (Major) &amp;amp;#8212; various sprites animations&lt;br /&gt;
* Alexander Brown (Cloud) &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Anton Ecker (Kaldred) &amp;amp;#8212; burnt villages&lt;br /&gt;
* battlestar &amp;amp;#8212; - some scenery graphics including burnt tent.&lt;br /&gt;
* Ben Wenzel (artisticdude) &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; New storm trident, staff and ankh item pictures, various attack icons, river ford tiles, drake and human city villages&lt;br /&gt;
* Bora Orcal (bera) &amp;amp;#8212; Goblin portrait sketches&lt;br /&gt;
* Cernunnos &amp;amp;#8212; merfolk villages&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; Icons for new editor and updated terrain icons&lt;br /&gt;
* Chris Wilson (Valkier) &amp;amp;#8212; portraits&lt;br /&gt;
* Christian Sirviö (Girgistian) &amp;amp;#8212; portraits (sketches), and some attack animations for the orcs&lt;br /&gt;
* Clinton Bell &amp;amp;#8212; various animations&lt;br /&gt;
* Dan Gerhards (beetlenaut) &amp;amp;#8212; various sprites and animations&lt;br /&gt;
* Daniel Borgmann (dborg) &amp;amp;#8212; semi-transparent map grid&lt;br /&gt;
* Daniel Foerster (pydsigner/pyndragon) &amp;amp;#8212; Icon overlays for the About dialog button&lt;br /&gt;
* Kwandulin &amp;amp;#8212; Standing animations (Skeleton Archer, Bone Shooter, Orcish Archer, Dwarvish Fighter, Ulfserker, Stalwart, Runesmith), minor fixes&lt;br /&gt;
* doofus-01 &amp;amp;#8212; orcish fort and villages, desert mountains, mine walls, sea forts, portraits for walking corpse and soulless&lt;br /&gt;
* Elena Astanina (ayona) &amp;amp;#8212; log-cabin villages&lt;br /&gt;
* Eric Butler (Erk) &amp;amp;#8212; desert and merfolk villages&lt;br /&gt;
* Evan Crook (Flametrooper) &amp;amp;#8212; sprite animator (TC conversion)&lt;br /&gt;
* Garrett Wessner (Stilgar) &amp;amp;#8212; gold coin pile&lt;br /&gt;
* Gideon Chia (Deonjo) &amp;amp;#8212; new 'units' icon for general status bar&lt;br /&gt;
* Guangcong Luo (Zarel) &amp;amp;#8212; Multiplayer status icons for 1.7.x&lt;br /&gt;
* Highhole &amp;amp;#8212; revised storm trident&lt;br /&gt;
* Homunculus &amp;amp;#8212; dead great tree terrain&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]]) &amp;amp;#8212; Minor item/unit edits; animated lit brazier; ported gryphon rider animation to generic gryphon; Ancient Lich for 1.12.x&lt;br /&gt;
* Irrevenant &amp;amp;#8212; Skeleton archer death and recruit animations, new ankh touch ups, new dark adept touch ups, elvish marshal standing animation&lt;br /&gt;
* Irwin Ismail (Swordy) &amp;amp;#8212; original projectile/attack icon for chakram&lt;br /&gt;
* Jason Frailey (Valdroni) &amp;amp;#8212; scorpion portrait&lt;br /&gt;
* Jimmy Olsson (Azlan) &amp;amp;#8212; made old icons for windows version&lt;br /&gt;
* Joakim Persson (JAP) &amp;amp;#8212; Knalgan flag set&lt;br /&gt;
* John Mercer (Stern) &amp;amp;#8212; Giant Rat graphics&lt;br /&gt;
* John-Robert Funck (XJaPaN) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Jonatan Alamà (tin) &amp;amp;#8212; made red logo used until before v1.0&lt;br /&gt;
* Justin Nichols (JustinOperable) &amp;amp;#8212; Portrait artwork&lt;br /&gt;
* Kim Holm (DUHH) &amp;amp;#8212; Portrait artwork&lt;br /&gt;
* Lukasz Wawrowski (inferno8) &amp;amp;#8212; Drake attack icons with fmunoz and map backgrounds for Isar’s Cross&lt;br /&gt;
* Lordlewis &amp;amp;#8212; mace item sprite&lt;br /&gt;
* Mattias Westlund (West) &amp;amp;#8212; new color cursors&lt;br /&gt;
* Nicholas Kerpan (Thrawn) &amp;amp;#8212; human thief portrait&lt;br /&gt;
* Pixelmind &amp;amp;#8212; various animations&lt;br /&gt;
* Randall Walls (slightcrazed) &amp;amp;#8212; sprite animator&lt;br /&gt;
* rhyging5 &amp;amp;#8212; various animations&lt;br /&gt;
* RusHHouR &amp;amp;#8212; New signpost (1.4.1)&lt;br /&gt;
* Samuel Wilson (megane) &amp;amp;#8212; random dice icon fix after 1.4.0&lt;br /&gt;
* Santiago Iborra (Quellion) &amp;amp;#8212; Portrait artwork&lt;br /&gt;
* Simeon Dear (Trilby) &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Zoomo &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Zaggy1024 &amp;amp;#8212; Wolf rider death animation&lt;br /&gt;
* Eisfrei &amp;amp;#8212; Elvish shaman idle animations&lt;br /&gt;
* Happy Wose &amp;amp;#8212; Wose idle frames and Elder wose death animation&lt;br /&gt;
* Wolfy &amp;amp;#8212; Female arch mage idle animation&lt;br /&gt;
* mystic x the unknown &amp;amp;#8212; Mage death animation&lt;br /&gt;
* Sonny T Yamada (SkyOne) &amp;amp;#8212; shadow standardization of many campaign units&lt;br /&gt;
* Vincent Langner (Vyncyn) &amp;amp;#8212; Walking Corpse and Soulless wolf variations, young roc base and attack sprite&lt;br /&gt;
* ZygoUgo &amp;amp;#8212; Giant Rat portrait&lt;br /&gt;
* ghype &amp;amp;#8212; sprite animation and dunefolk base frames&lt;br /&gt;
=== Music ===&lt;br /&gt;
* Aleksi Aubry-Carlson (Aleksi)&lt;br /&gt;
* Doug Kaufman (dkaufman) &amp;amp;#8212; http://dougkaufman.net/&lt;br /&gt;
* Gianmarco Leone (gmlion)&lt;br /&gt;
* Jeremy Nicoll (jeremy2/eltiare)&lt;br /&gt;
* Joseph Toscano (ZhayTee) &amp;amp;#8212; zhaymusic.com&lt;br /&gt;
* Mattias Westlund (West) &amp;amp;#8212; music coordinator/composer&lt;br /&gt;
* Ryan Reilly (Rain)&lt;br /&gt;
* Stephen Rozanc (TreizeCouleurs)&lt;br /&gt;
* Timothy Pinkham (TimothyP)&lt;br /&gt;
* Tyler Johnson&lt;br /&gt;
=== Sound Effects ===&lt;br /&gt;
* Corey Woodworth (woodwizzle) &amp;amp;#8212; hit and die sounds&lt;br /&gt;
* J.W. Bjerk ([[User:Eleazar|Eleazar]])&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; focus on attack, weapon and user interface sounds&lt;br /&gt;
* Adam Rinsky (Action Jack) &amp;amp;#8212; dwarf hit and die sounds&lt;br /&gt;
* Leonardo Magno Sampaio (leorock116) &amp;amp;#8212; mace, staff and club sounds&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Asa Swain (quartex) &amp;amp;#8212; Under the Burning Suns&lt;br /&gt;
* Astrid Halberkamp &amp;amp;#8212; Campaign maintenance and various improvements&lt;br /&gt;
* Benjamin Drieu&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; Campaign maintenance and various improvements&lt;br /&gt;
* Dacyn&lt;br /&gt;
* Dan Gerhards (beetlenaut) &amp;amp;#8212; Dead Water, Secrets of the Ancients&lt;br /&gt;
* David White (Sirp) &amp;amp;#8212; Heir to the Throne&lt;br /&gt;
* Eric J. Mesoy (Circon) &amp;amp;#8212; A Tale of Two Brothers&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; The Hammer of Thursagan&lt;br /&gt;
* esci &amp;amp;#8212; Descent into Darkness&lt;br /&gt;
* Francisco Muñoz (fmunoz) &amp;amp;#8212; founding artist and former lead artist, worked consistently on all aspects till around v0.7-0.9.&lt;br /&gt;
* James Spencer (Shade) &amp;amp;#8212; The Rise of Wesnoth&lt;br /&gt;
* Jeffrey 'Sigurd' Westcoat (SigurdFireDragon)&lt;br /&gt;
* Joseph Simmons (Turin) &amp;amp;#8212; The Eastern Invasion, The Sceptre of Fire&lt;br /&gt;
* Justin Zaun (jzaun) &amp;amp;#8212; coder, scenario designer&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; redesign of various scenarios and other enhancement&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; A Tale of Two Brothers&lt;br /&gt;
* Santi/fnaek &amp;amp;#8212; The Legend of Wesmere&lt;br /&gt;
* Scott Klempner &amp;amp;#8212; Heir to the Throne, The Rise of Wesnoth, Liberty&lt;br /&gt;
* Taurus &amp;amp;#8212; Northern Rebirth, Son of the Black-Eye&lt;br /&gt;
* William Carey (aelius) &amp;amp;#8212; The South Guard&lt;br /&gt;
=== Multiplayer Maps and Balancing ===&lt;br /&gt;
* George Birthisel (happygrue/Wintermute) &amp;amp;#8212; Unit balancing, Dunefolk Era&lt;br /&gt;
* Hejnewar &amp;amp;#8212; balancing for Age of Heroes, revised dunefolk&lt;br /&gt;
* Jake Bailey (jb) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* Joshua Northey (Becephalus) &amp;amp;#8212; multiplayer maps (mostly 2vs2 and up)&lt;br /&gt;
* Mike Quiñones (Doc Paterson) &amp;amp;#8212; multiplayer maps (mostly 1vs1)&lt;br /&gt;
* Noy &amp;amp;#8212; general purpose administration, unit balancing&lt;br /&gt;
* Peter Groen (pg) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* Ruben Philipp Wickenhäuser (The Very Uhu) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* Soliton &amp;amp;#8212; unit balancing&lt;br /&gt;
* Tom Chance (telex4) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* [mailto:kleinfel&amp;amp;#x40;wpi&amp;amp;#x2E;edu Zack Kleinfeld] &amp;amp;#8212; multiplayer maps, unit balancing&lt;br /&gt;
=== Packagers ===&lt;br /&gt;
* ancestral &amp;amp;#8212; Apple OS X packager (1.12.1 and later)&lt;br /&gt;
* [mailto:hrubymar10&amp;amp;#x40;gmail&amp;amp;#x2E;com Martin Hrubý] ([[User:hrubymar10|hrubymar10]]) &amp;amp;#8212; Apple macOS packager (1.13.11 and later)&lt;br /&gt;
* Matthias Schoeck (mattsc) &amp;amp;#8212; Apple OS X packager (1.11.8 and later)&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; OpenPandora packager&lt;br /&gt;
* Rhonda D'Vine (Rhonda) &amp;amp;#8212; Debian/Ubuntu packager&lt;br /&gt;
* Sebastian Kölle (aquileia) &amp;amp;#8212; Visual Studio SDK maintainer&lt;br /&gt;
* Sergey Popov (loonycyborg) &amp;amp;#8212; Microsoft Windows packager and MinGW SDK maintainer&lt;br /&gt;
* [mailto:ports&amp;amp;#x40;toco-domains&amp;amp;#x2E;de Torsten Zühlsdorff] &amp;amp;#8212; FreeBSD Packager&lt;br /&gt;
* Vincent Cheng (vincent_c) &amp;amp;#8212; Debian/Ubuntu packager&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* [mailto:ben&amp;amp;#x40;happyspork&amp;amp;#x2E;com Ben Anderman] (crimson_penguin) &amp;amp;#8212; Apple OS X packager (for 1.5.6 and later)&lt;br /&gt;
* Cyril Bouthors (CyrilB) &amp;amp;#8212; Debian packager, patron&lt;br /&gt;
* Darryl Dixon&lt;br /&gt;
* edge&lt;br /&gt;
* Isaac Clerencia &amp;amp;#8212; Debian packager&lt;br /&gt;
* Jay Hopping&lt;br /&gt;
* Jörg Hinrichs (Yogi Bear/YogiHH) &amp;amp;#8212; Microsoft Windows packager&lt;br /&gt;
* Laurent Wacrenier (lwa) &amp;amp;#8212; Apple OS X packager (for v1.4 and before)&lt;br /&gt;
* Marcin Konicki (ahwayakchih) &amp;amp;#8212; BeOS packager&lt;br /&gt;
* Marcus Phillips (Sithrandel) &amp;amp;#8212; Apple OS X packager (for v1.0 and before)&lt;br /&gt;
* Mark Michelsen (skovbaer) &amp;amp;#8212; Slackware packager&lt;br /&gt;
* Muhammad Amir Ayub (anakayub) &amp;amp;#8212; Apple OS X packager&lt;br /&gt;
* Piotr Cychowski (Mist/cycholka) &amp;amp;#8212; Microsoft Windows packager&lt;br /&gt;
* singalen &amp;amp;#8212; iOS port&lt;br /&gt;
* Simon Forsyth (Alarantalara) &amp;amp;#8212; Apple OS X Packager (1.9.6 and later)&lt;br /&gt;
* Vlad Glagolev (Stealth) &amp;amp;#8212; OpenBSD packager&lt;br /&gt;
=== Miscellaneous Contributors ===&lt;br /&gt;
* Aaron Keisch-Walter (Exasperation)&lt;br /&gt;
* Aaron Winter (Byteron)&lt;br /&gt;
* Adam Leffew&lt;br /&gt;
* Adrian Iosif (Zappaman)&lt;br /&gt;
* Aishiko &amp;amp;#8212; Unit instance recall cost implementation&lt;br /&gt;
* Alek Bollig (binarycoder)&lt;br /&gt;
* Alesis Novik&lt;br /&gt;
* Aline Riss (akihara)&lt;br /&gt;
* Amir Hassan (kallaballa)&lt;br /&gt;
* Andris Szell (bandita137)&lt;br /&gt;
* André Knispel&lt;br /&gt;
* Andrea Palmatè (afxgroup)&lt;br /&gt;
* Andrius Šilinskas (thunderstruck)&lt;br /&gt;
* Andrius Štikonas&lt;br /&gt;
* Anja Keicher (ayne)&lt;br /&gt;
* Astrid Halberkamp&lt;br /&gt;
* Ben Anderman (crimson_penguin) &amp;amp;#8212; unit list&lt;br /&gt;
* Boldizsár Lipka (lipk)&lt;br /&gt;
* Brilliand&lt;br /&gt;
* Burkay Özdemir (Velory) &amp;amp;#8212; Poisoning improvement for Formula AI&lt;br /&gt;
* chisquare130&lt;br /&gt;
* Chris Carpenter (mordocai)&lt;br /&gt;
* Chris Hopman (cjhopman)&lt;br /&gt;
* Chris Mann (WildPenguin) &amp;amp;#8212; Emacs WML-mode&lt;br /&gt;
* Chusslove Illich (caslav.ilic) &amp;amp;#8212; wmlxgetext improvements&lt;br /&gt;
* David Slabý (blaf)&lt;br /&gt;
* Daniel Bruegmann&lt;br /&gt;
* David Mikos (Coffee) &amp;amp;#8212; Coder, animation framework improvements.&lt;br /&gt;
* Denny Vaccaro (endercoaster)&lt;br /&gt;
* Derek (Gambit)&lt;br /&gt;
* devnexen&lt;br /&gt;
* DisherProject&lt;br /&gt;
* Dmitry K. (nephro)&lt;br /&gt;
* Doug Rosvick ([[User:dlr365|dlr365]])&lt;br /&gt;
* dorng&lt;br /&gt;
* dreamer-88&lt;br /&gt;
* Dugi &amp;amp;#8212; Context-free name generator&lt;br /&gt;
* Duthlet&lt;br /&gt;
* EarthCake&lt;br /&gt;
* Edward Chernenko&lt;br /&gt;
* Ekdohibs&lt;br /&gt;
* elvish_sovereign&lt;br /&gt;
* Ely Levy (Nakee)&lt;br /&gt;
* Étienne Simon (ejls)&lt;br /&gt;
* Etkin Baris Ozgul (pokhbocee) &amp;amp;#8212; Lua AI&lt;br /&gt;
* Eugene Kosov (kevg)&lt;br /&gt;
* [mailto:eugeni&amp;amp;#x2E;stepanov&amp;amp;#x40;gmail&amp;amp;#x2E;com Evgeniy Stepanov] &amp;amp;#8212; NativeClient port&lt;br /&gt;
* Evgeny Kapun&lt;br /&gt;
* FAAB&lt;br /&gt;
* Federico Pasco (neverEnough)&lt;br /&gt;
* Fedor Khod'kov (teddy/fkhodkov)&lt;br /&gt;
* Felix Bauer (flix)&lt;br /&gt;
* Fernando Carmona (Ferk)&lt;br /&gt;
* Floris Kint (Grimling)&lt;br /&gt;
* Francesco Gigli (Jaramir)&lt;br /&gt;
* Frank Richter (res)&lt;br /&gt;
* Frédéric Wagner&lt;br /&gt;
* Fredrik Wikstrom (salass00)&lt;br /&gt;
* galegosimpatico&lt;br /&gt;
* Galen Brooks (fluffbeast)&lt;br /&gt;
* gh0st &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* Gregory Gauthier (rjaguar3)&lt;br /&gt;
* Groggy Dice (groggydice) &amp;amp;#8212; wmllint enhancements&lt;br /&gt;
* [mailto:kevin&amp;amp;#x2E;xgr&amp;amp;#x40;gmail&amp;amp;#x2E;com Guorui Xi] (Kevin_Xi)&lt;br /&gt;
* Hans-Joachim Gurt (HaJo)&lt;br /&gt;
* Herb Pah (haiz)&lt;br /&gt;
* holius-fr&lt;br /&gt;
* IceTyp&lt;br /&gt;
* ilyapopov&lt;br /&gt;
* J. Tyne (JaMiT)&lt;br /&gt;
* J.R. Blain (Cowboy)&lt;br /&gt;
* jstitch&lt;br /&gt;
* Jacek Kominek (BroodKiller)&lt;br /&gt;
* [mailto:benetnash&amp;amp;#x40;icpnet&amp;amp;#x2E;pl Jan Polak] (benetnash) &amp;amp;#8212; Formula AI contributions&lt;br /&gt;
* Jan Zvánovec (jaz)&lt;br /&gt;
* [mailto:babataz&amp;amp;#x40;gmail&amp;amp;#x2E;com Jean-Baptiste Poittevin] (BBT)&lt;br /&gt;
* Jeff Breidenbach (jab) &amp;amp;#8212; Bilinear interpolation&lt;br /&gt;
* [mailto:jleldridge27&amp;amp;#x40;gmail&amp;amp;#x2E;com Jeffrey Eldridge] (jleldridge)&lt;br /&gt;
* Jérôme (segfault)&lt;br /&gt;
* Jim Carroll (Jimm)&lt;br /&gt;
* Jody Northup (Upthorn) &amp;amp;#8212; Prospective student (world persistence)&lt;br /&gt;
* Joeri Melis&lt;br /&gt;
* Joey L. Maalouf (JDog)&lt;br /&gt;
* [mailto:john&amp;amp;#x40;jo&amp;amp;#x2E;hnanthony&amp;amp;#x2E;com John Anthony] &amp;amp;#8212; campaignd work, mainly security-based&lt;br /&gt;
* John B. Messerly (jbm)&lt;br /&gt;
* John Harvey (johndh) &amp;amp;#8212; minor race descriptions; bats, goblins, mechanical, merfolk, monster, naga, ogre&lt;br /&gt;
* Jonathan Combs (ScegfOd) &amp;amp;#8212; log activating dialog&lt;br /&gt;
* Jonas Lihnell (Roze)&lt;br /&gt;
* Jonas Kölker&lt;br /&gt;
* [mailto:jorda&amp;amp;#x40;ettin&amp;amp;#x2E;org Jordà Polo] (ettin) &amp;amp;#8212; website, i18n, ui&lt;br /&gt;
* Josef Reidinger (qk)&lt;br /&gt;
* Joseph Gelfand&lt;br /&gt;
* Joshua Hudson&lt;br /&gt;
* josteph&lt;br /&gt;
* Jozrael&lt;br /&gt;
* Justin DiSabatino (Turuk)&lt;br /&gt;
* Kamil Kaczmarczyk (lampak)&lt;br /&gt;
* [mailto:karl&amp;amp;#x2E;miller&amp;amp;#x2E;km&amp;amp;#x40;gmail&amp;amp;#x2E;com Karl Miller] (karlm)&lt;br /&gt;
* Karol Kozub (automagic)&lt;br /&gt;
* Kevin Montalva (Ryckes)&lt;br /&gt;
* Kevin Yap (iKevinY)&lt;br /&gt;
* Konrad Schwede (Konrad2)&lt;br /&gt;
* Kristoffer Grönlund (kegie)&lt;br /&gt;
* Krogen&lt;br /&gt;
* Laurent Birtz&lt;br /&gt;
* legoktm&lt;br /&gt;
* leonardoInf&lt;br /&gt;
* lilinitsy&lt;br /&gt;
* Lovens Weche (LovCAPONE)&lt;br /&gt;
* Luiz Fernando de Faria Pereira (lfernando)&lt;br /&gt;
* [mailto:lutheroto&amp;amp;#x40;gmail&amp;amp;#x2E;com Luther Thompson]&lt;br /&gt;
* lv-zheng&lt;br /&gt;
* [mailto:code&amp;amp;#x40;hryniuk&amp;amp;#x2E;pl Łukasz Hryniuk]&lt;br /&gt;
* Maksim Orlovich (SadEagle)&lt;br /&gt;
* Mark McGuire (TronPaul)&lt;br /&gt;
* Martin Bede &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* [mailto:hrubymar10&amp;amp;#x40;gmail&amp;amp;#x2E;com Martin Hrubý] ([[User:hrubymar10|hrubymar10]])&lt;br /&gt;
* Mateusz Kolaczek (PL_kolek)&lt;br /&gt;
* Matt Renfer (Des) &amp;amp;#8212; Prose revision&lt;br /&gt;
* Matthias Schoeck (mattsc) &amp;amp;#8212; AI improvements&lt;br /&gt;
* matthiaskrgr &amp;amp;#8212; Running address sanitizer to catch leaks&lt;br /&gt;
* Maxim Biro (nurupo)&lt;br /&gt;
* Maximilian Fricke (madmax28)&lt;br /&gt;
* Maximilian Lupke (malumalu)&lt;br /&gt;
* Marius Spix (spixi)&lt;br /&gt;
* Michael Flowers (MJ)&lt;br /&gt;
* Michael Schmahl&lt;br /&gt;
* Michael Strebel (Nostromus)&lt;br /&gt;
* midzer&lt;br /&gt;
* Miguel Zapico (elricz)&lt;br /&gt;
* mstrebel&lt;br /&gt;
* [mailto:greywhind&amp;amp;#x40;users&amp;amp;#x2E;sourceforge&amp;amp;#x2E;net Nathan Partlan] ([[User:Greywhind|Greywhind]])&lt;br /&gt;
* [mailto:nathan&amp;amp;#x2E;b&amp;amp;#x2E;walker&amp;amp;#x40;vanderbilt&amp;amp;#x2E;edu Nathan Walker] (RiftWalker)&lt;br /&gt;
* neoedmund&lt;br /&gt;
* newfrenchy83&lt;br /&gt;
* Niall Burton (Leonard03)&lt;br /&gt;
* niegenug&lt;br /&gt;
* Nobun &amp;amp;#8212; wmlxgettext&lt;br /&gt;
* [mailto:zabivator&amp;amp;#x40;gmail&amp;amp;#x2E;com Oleg Tsarev]&lt;br /&gt;
* Olivier Faure (PoignardAzur)&lt;br /&gt;
* [mailto:asqueados&amp;amp;#x40;gmail&amp;amp;#x2E;com Pablo J. Urbano Santos] ([[User:Lord Ork|Lord Ork]])&lt;br /&gt;
* Patryk Obara (dreamer_)&lt;br /&gt;
* Paul Smedley (Creeping)&lt;br /&gt;
* Paŭlo Ebermann ([[User:Pauxlo|Pauxlo]])&lt;br /&gt;
* PBechon&lt;br /&gt;
* Peter Elmers&lt;br /&gt;
* Peter Mawhorter ([[User:solsword|solsword]]) &amp;amp;#8212; Python TC script upgrade&lt;br /&gt;
* Petr Sobotka (Pietro)&lt;br /&gt;
* [mailto:root&amp;amp;#x40;delroth&amp;amp;#x2E;is-a-geek&amp;amp;#x2E;org Pierre Bourdon] (delroth)&lt;br /&gt;
* pquentin&lt;br /&gt;
* Pranav Deshpande (universecoder)&lt;br /&gt;
* Priit Laes (plaes)&lt;br /&gt;
* Pubudu Gunawardena (ugudu)&lt;br /&gt;
* Qi Mo (qmo2015)&lt;br /&gt;
* Quetzalcoatl&lt;br /&gt;
* Randy Kostiuk (Randypk) &amp;amp;#8212; Bug fixes&lt;br /&gt;
* RatArmy (fujimo-t)&lt;br /&gt;
* Reuben Rakete (rocketbang)&lt;br /&gt;
* Richard Yao (srk9) &amp;amp;#8212; Bug fixes&lt;br /&gt;
* Rikard Falkeborn&lt;br /&gt;
* Robert Spencer &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* Robert Wallace (Robertdebrus)&lt;br /&gt;
* Rocco J Carello (rogue)&lt;br /&gt;
* Roland Hautz (duncan_shriek)&lt;br /&gt;
* Rolf Sievers (Lizard)&lt;br /&gt;
* Ronny Standtke&lt;br /&gt;
* rrigby&lt;br /&gt;
* Ryan Frame&lt;br /&gt;
* Ryan Henszey&lt;br /&gt;
* Ryan Roden-Corrent (rcorre) &amp;amp;#8212; Hotkey release and scroll key rebinding&lt;br /&gt;
* [mailto:sachith500&amp;amp;#x40;gmail&amp;amp;#x2E;com Sachith Seneviratne] (sachith500) &amp;amp;#8212; Bug fixes at the moment. GSoC Aspirant&lt;br /&gt;
* Samuel Kim &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* Sean Yeh&lt;br /&gt;
* Sebastian Goll (afran)&lt;br /&gt;
* Sebastian Kölle (aquileia)&lt;br /&gt;
* Serge Martin (EdB)&lt;br /&gt;
* [mailto:stomasortiz&amp;amp;#x40;gmail&amp;amp;#x2E;com Sergio Tomás Ortiz]&lt;br /&gt;
* Severin Glöckner (Shiki, Sevu)&lt;br /&gt;
* Simon Forsyth (Alarantalara)&lt;br /&gt;
* [mailto:simon_smith&amp;amp;#x40;zen&amp;amp;#x2E;co&amp;amp;#x2E;uk Simon Smith] ([[User:Simons_Mith|Simons Mith]]) &amp;amp;#8212; Style guide, help with the application of the style guide, and some tips&lt;br /&gt;
* SoapGentoo&lt;br /&gt;
* starius&lt;br /&gt;
* Stéphane Gimenez (gim)&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* [mailto:sylecn&amp;amp;#x40;gmail&amp;amp;#x2E;com sylecn]&lt;br /&gt;
* [mailto:nsytyi&amp;amp;#x40;gmail&amp;amp;#x2E;com Sytyi Nick] (Sytyi) &amp;amp;#8212; WML validation&lt;br /&gt;
* [mailto:ptablot&amp;amp;#x40;mopong&amp;amp;#x2E;net Talbot Pierre] (Trademark)&lt;br /&gt;
* Tamas K. (negusnyul)&lt;br /&gt;
* techtonik&lt;br /&gt;
* the_beagle &amp;amp;#8212; Wose race description&lt;br /&gt;
* The Gnat&lt;br /&gt;
* Thibault Févry (iwontbecreative) &amp;amp;#8212; Some GCI tasks and utils/wiki_grabber.py cleanup.&lt;br /&gt;
* Thom Diment (UnwiseOwl)&lt;br /&gt;
* [mailto:hankerspace&amp;amp;#x40;gmail&amp;amp;#x2E;com Thomas Martinet] (hankerspace)&lt;br /&gt;
* [mailto:thomas&amp;amp;#x2E;prevost&amp;amp;#x40;gmail&amp;amp;#x2E;com Thomas Prevost] (zancdar)&lt;br /&gt;
* Thonsew&lt;br /&gt;
* Thorny23&lt;br /&gt;
* Tobias Frei (ToBeFree)&lt;br /&gt;
* Tomasz Sikorski (Tomsik)&lt;br /&gt;
* Tommy Schmitz&lt;br /&gt;
* Tommy (yobbo)&lt;br /&gt;
* Toom Lõhmus (Ravana)&lt;br /&gt;
* tsr&lt;br /&gt;
* Valentin Deschaintre (Zazweda, Epyde) &amp;amp;#8212; Zone guardian Micro AI&lt;br /&gt;
* vitiv &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* [mailto:viy&amp;amp;#x40;altlinux&amp;amp;#x2E;org viy]&lt;br /&gt;
* Vladimír Slávik &amp;amp;#8212; Miscellaneous text formatting and translation engine related help&lt;br /&gt;
* vn971, vgaming&lt;br /&gt;
* Wedge009&lt;br /&gt;
* Yang Yifan (Xara)&lt;br /&gt;
* Zas&lt;br /&gt;
=== Bots ===&lt;br /&gt;
* CIA&lt;br /&gt;
* irker&lt;br /&gt;
* janebot&lt;br /&gt;
* shikadibot&lt;br /&gt;
* wesbot&lt;br /&gt;
== Translators ==&lt;br /&gt;
=== Afrikaans Translation ===&lt;br /&gt;
* András Salamon (ott)&lt;br /&gt;
* Erhard Eiselen&lt;br /&gt;
* Len van Dalsen (Numbers13) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Nico Oliver (nicoza)&lt;br /&gt;
* Renier Maritz&lt;br /&gt;
=== Ancient Greek Translation ===&lt;br /&gt;
=== Arabic Translation ===&lt;br /&gt;
* Amnay Mokhtari&lt;br /&gt;
=== Asturian Translation ===&lt;br /&gt;
=== Basque Translation ===&lt;br /&gt;
* Alfredo Beaumont (ziberpunk)&lt;br /&gt;
* Julen Landa (genars)&lt;br /&gt;
* Mikel Olasagasti (Hey_neken)&lt;br /&gt;
=== Bulgarian Translation ===&lt;br /&gt;
* Anton Tsigularov (Atilla)&lt;br /&gt;
* Bono Nonchev&lt;br /&gt;
* Denica Mincheva (Deni)&lt;br /&gt;
* Georgi Dimitrov (oblak)&lt;br /&gt;
* Ivan Petrov (TheWhiteKnight) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Nikolay Vladimirov (Turki)&lt;br /&gt;
* Steven Genchev (blademaster83) &lt;br /&gt;
* Valentin Yankov  (kartacha) &lt;br /&gt;
=== Catalan Translation ===&lt;br /&gt;
* Carles Company (brrr)&lt;br /&gt;
* Dan Rosàs Garcia (focks)&lt;br /&gt;
* Daniel López (Azazelo)&lt;br /&gt;
* Joan Queralt&lt;br /&gt;
* Jonatan Alamà (tin)&lt;br /&gt;
* [mailto:jorda&amp;amp;#x40;ettin&amp;amp;#x2E;org Jordà Polo] (ettin)&lt;br /&gt;
* Jose Gordillo (kilder)&lt;br /&gt;
* J.R. Dolcet Castro (Malin Keshar)&lt;br /&gt;
* Marc Orcau&lt;br /&gt;
* Mark Recasens&lt;br /&gt;
* [mailto:miquel&amp;amp;#x2E;angel&amp;amp;#x2E;burgos&amp;amp;#x40;gmail&amp;amp;#x2E;com Miquel-Àngel Burgos i Fradeja] &amp;amp;#8212; current maintainer&lt;br /&gt;
* Pau Rul·lan Ferragut&lt;br /&gt;
* Roberto Garcia (Motxales)&lt;br /&gt;
=== Chinese Translation ===&lt;br /&gt;
* AxalaraFlameheart (AxalaraFlame)&lt;br /&gt;
* Brian lee&lt;br /&gt;
* chisquare130&lt;br /&gt;
* [mailto:cloudidust&amp;amp;#x40;gmail&amp;amp;#x2E;com CloudiDust] ([[User:CloudiDust|CloudiDust]]) &amp;amp;#8212; current maintainer&lt;br /&gt;
* cryaciccl&lt;br /&gt;
* Dionysus&lt;br /&gt;
* 逆天的高级菜鸟 (Gaojicainiao)&lt;br /&gt;
* Henry Zhu (Hardwood) &amp;amp;#8212; iOS announcements translation into Chinese&lt;br /&gt;
* Huang Hongye (Dugucloud) &amp;amp;#8212; translation and image localization&lt;br /&gt;
* Huang Huan&lt;br /&gt;
* Huang Lechuan&lt;br /&gt;
* leaf&lt;br /&gt;
* Luojie-dune&lt;br /&gt;
* MrKing&lt;br /&gt;
* 网上佳公子&lt;br /&gt;
* Owlet&lt;br /&gt;
* pianton&lt;br /&gt;
* SealMe&lt;br /&gt;
* spider5&lt;br /&gt;
* StephDC&lt;br /&gt;
* [mailto:sylecn&amp;amp;#x40;gmail&amp;amp;#x2E;com sylecn]&lt;br /&gt;
* Teamzhangmeng&lt;br /&gt;
* vinneymail&lt;br /&gt;
* wind&lt;br /&gt;
* Yifan&lt;br /&gt;
* yym514&lt;br /&gt;
* zen&lt;br /&gt;
=== Chinese (Taiwan) Translation ===&lt;br /&gt;
* 楊綮銘&lt;br /&gt;
* 李昆融&lt;br /&gt;
* 李信融&lt;br /&gt;
=== Croatian Translation ===&lt;br /&gt;
* Ivica Đurenec (charlieh65)&lt;br /&gt;
* Nino Gunjača&lt;br /&gt;
=== Czech Translation ===&lt;br /&gt;
* Alexander Slávik (Olin)&lt;br /&gt;
* Anežka Bubeníčková (Bubu)&lt;br /&gt;
* Čestmír Houska&lt;br /&gt;
* David Nečas (Yeti)&lt;br /&gt;
* David Novotný (Draqen)&lt;br /&gt;
* [mailto:jan&amp;amp;#x2E;dedic&amp;amp;#x40;gmail&amp;amp;#x2E;com Jaromír Dědič]&lt;br /&gt;
* Karel Doleček&lt;br /&gt;
* Lukáš Faltýnek&lt;br /&gt;
* [mailto:hrubymar10&amp;amp;#x40;gmail&amp;amp;#x2E;com Martin Hrubý] ([[User:hrubymar10|hrubymar10]])&lt;br /&gt;
* Martin Šín&lt;br /&gt;
* Michal Žejdl&lt;br /&gt;
* Mintaka&lt;br /&gt;
* [mailto:tapik&amp;amp;#x40;buchtovi&amp;amp;#x2E;cz Oto Buchta] ([[User:Tapik|tapik]])&lt;br /&gt;
* Petr Kopač (Ferda)&lt;br /&gt;
* Petr Kovár (Juans)&lt;br /&gt;
* Rudolf Orság&lt;br /&gt;
* Septim&lt;br /&gt;
* Sofronius&lt;br /&gt;
* Vít Komárek&lt;br /&gt;
* Vít Krčál&lt;br /&gt;
* Vladimír Slávik&lt;br /&gt;
=== Danish Translation ===&lt;br /&gt;
* Anders K. Madsen (madsen)&lt;br /&gt;
* Ask Hjorth Larsen&lt;br /&gt;
* Bjarke Sørensen (basher)&lt;br /&gt;
* Jesper Fuglsang Wolff (ulven)&lt;br /&gt;
* Joe Hansen&lt;br /&gt;
* Kenneth Nielsen&lt;br /&gt;
* Mark Michelsen (skovbaer)&lt;br /&gt;
* Mathias Bundgaard Svensson (freaken)&lt;br /&gt;
* Ole Laursen&lt;br /&gt;
=== Dutch Translation ===&lt;br /&gt;
* [mailto:AI0867&amp;amp;#x40;gmail&amp;amp;#x2E;com Alexander van Gessel] (AI/AI0867) &amp;amp;#8212; previous translation maintainer&lt;br /&gt;
* Arne Deprez&lt;br /&gt;
* Astrid Halberkamp&lt;br /&gt;
* Floris Kint (Grimling)&lt;br /&gt;
* Foppe Benedictus&lt;br /&gt;
* [mailto:oudshoorn&amp;amp;#x40;eitri&amp;amp;#x2E;nl IJsbrand Oudshoorn]&lt;br /&gt;
* Joeri Melis&lt;br /&gt;
* Jon Jacobs&lt;br /&gt;
* Koen Douterloigne&lt;br /&gt;
* Koen Vervloesem (koan)&lt;br /&gt;
* Lala&lt;br /&gt;
* Maarten Albrecht&lt;br /&gt;
* Merijn de Vet &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Pieter Vermeylen (Onne)&lt;br /&gt;
* Rico van Coevorden&lt;br /&gt;
* Rob van der Vleugel&lt;br /&gt;
* Roel Thijs (Roel)&lt;br /&gt;
* Roger Koot&lt;br /&gt;
* Thomas Hugo de Groot&lt;br /&gt;
* Tobe Deprez&lt;br /&gt;
* WimPapa&lt;br /&gt;
=== English (GB) Translation ===&lt;br /&gt;
* András Salamon (ott)&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
* pjr&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* Thomas Hockings ([[User:Deusite|Deusite]])&lt;br /&gt;
* Wedge009&lt;br /&gt;
=== English (Shaw) Translation ===&lt;br /&gt;
* [mailto:arcriley&amp;amp;#x40;ubuntu&amp;amp;#x2E;com Arc Riley] ([[User:ArcRiley|ArcRiley]]) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* [mailto:reportingsjr&amp;amp;#x40;gmail&amp;amp;#x2E;com Jon Neal] (reportingsjr)&lt;br /&gt;
* [mailto:thomas&amp;amp;#x40;thurman&amp;amp;#x2E;org&amp;amp;#x2E;uk Thomas Thurman] (marnanel)&lt;br /&gt;
=== Esperanto Translation ===&lt;br /&gt;
* Aleksej Korgenkov (Grimpanto)&lt;br /&gt;
* Francesco Lorenzon (Likso)&lt;br /&gt;
* Ľubo Fajth&lt;br /&gt;
* Maarten Albrecht&lt;br /&gt;
* Rastislav Šarišský (Asto)&lt;br /&gt;
=== Estonian Translation ===&lt;br /&gt;
* Kaido Kikkas (UncleOwl)&lt;br /&gt;
* Mart Tõnso&lt;br /&gt;
=== Filipino Translation ===&lt;br /&gt;
* Joset Anthony Zamora (eradicus)&lt;br /&gt;
* Karen Eve Eso (keeve)&lt;br /&gt;
=== Finnish Translation ===&lt;br /&gt;
* Ankka&lt;br /&gt;
* Jaakko Saarikko &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Jarkko Patteri (Jarkko)&lt;br /&gt;
* Juhana Uuttu&lt;br /&gt;
* Jussi Rautio (jgrr)&lt;br /&gt;
* kko&lt;br /&gt;
* Matias Parmala&lt;br /&gt;
* Matias Pigg&lt;br /&gt;
* Mikko Nikkilä (Miccoh)&lt;br /&gt;
* Mikko Kraft (deserter)&lt;br /&gt;
* Miriam Green&lt;br /&gt;
* Niklas Laxström (Nikerabbit)&lt;br /&gt;
* Otto Oikarinen&lt;br /&gt;
* paxed&lt;br /&gt;
* Samu Voutilainen (Smar)&lt;br /&gt;
* Santtu Pajukanta (Japsu)&lt;br /&gt;
* Simo Sutela&lt;br /&gt;
* Veikko Pukkila (swege)&lt;br /&gt;
=== French Translation ===&lt;br /&gt;
* Antoine Garnier&lt;br /&gt;
* Antoine Imboden&lt;br /&gt;
* Aurélien Brevers (Breversa)&lt;br /&gt;
* Aurélien Paulus&lt;br /&gt;
* Arnaud Garoux (La vie en wose)&lt;br /&gt;
* Benoit Astruc&lt;br /&gt;
* [mailto:benoit&amp;amp;#x2E;timbert&amp;amp;#x40;free&amp;amp;#x2E;fr Benoît Timbert] ([[User:Noyga|Noyga]]) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Bruno Fève (PP)&lt;br /&gt;
* Cédric Duval&lt;br /&gt;
* Damian Gryski (dmg)&lt;br /&gt;
* [[User:Damien|Damien Jacquot]] &amp;amp;#8212; lead translator&lt;br /&gt;
* DaringTremayne&lt;br /&gt;
* David Pradier&lt;br /&gt;
* Éric Pierre (Gari)&lt;br /&gt;
* Fabrice Boulakia&lt;br /&gt;
* Florence Guettaa (inflow)&lt;br /&gt;
* François Mariage (Paquito)&lt;br /&gt;
* François Orieux&lt;br /&gt;
* Geoffroy Douillié ([[User:Gdou|gdou]])&lt;br /&gt;
* Gérard Bodin (Gnork)&lt;br /&gt;
* Guillaume Delacourt&lt;br /&gt;
* Guillaume Duwelz-Rebert&lt;br /&gt;
* Guillaume Guigou&lt;br /&gt;
* [mailto:massart&amp;amp;#x2E;guillaume&amp;amp;#x40;wanadoo&amp;amp;#x2E;fr Guillaume Massart] (Piou2fois)&lt;br /&gt;
* Guillaume Melquiond (silene)&lt;br /&gt;
* Guillaume Pascal&lt;br /&gt;
* Jean Privat (Tout)&lt;br /&gt;
* Jean-Louis Passerin (Zoltic)&lt;br /&gt;
* Jean-Luc Menut&lt;br /&gt;
* Jean-Luc Richard (Le Gnome)&lt;br /&gt;
* Jean-Joseph Paget&lt;br /&gt;
* Jehan Hysseo (Jey)&lt;br /&gt;
* Jérémy Rosen (Boucman)&lt;br /&gt;
* Julien Moncel&lt;br /&gt;
* Julien Tailleur&lt;br /&gt;
* Marc Scheffer&lt;br /&gt;
* Mathieu Guilbaud&lt;br /&gt;
* Mendes Oulamara&lt;br /&gt;
* Michel Poléni (Thanatloc)&lt;br /&gt;
* Nicolas Boudin (Blurgk)&lt;br /&gt;
* [mailto:philippe&amp;amp;#x2E;plantier&amp;amp;#x40;naema&amp;amp;#x2E;org Philippe Plantier] ([[User:Ayin|Ayin]])&lt;br /&gt;
* Philippe Rasquinet&lt;br /&gt;
* Pierre Rudloff&lt;br /&gt;
* Sébastien Raynaud (Galactic turkey)&lt;br /&gt;
* Sylvain Jeanne&lt;br /&gt;
* Thierry Bothorel&lt;br /&gt;
* Solena Le Moigne&lt;br /&gt;
* William Dupré&lt;br /&gt;
* [mailto:ydirson&amp;amp;#x40;altern&amp;amp;#x2E;org Yann Dirson]&lt;br /&gt;
=== Friulian Translation ===&lt;br /&gt;
=== Galician Translation ===&lt;br /&gt;
* [mailto:adriyetichaves&amp;amp;#x40;gmail&amp;amp;#x2E;com Adrián Chaves Fernández] (Gallaecio)&lt;br /&gt;
* Fran Diéguez&lt;br /&gt;
* Jacobo Abel Fernández García &amp;amp;#8212; inactive&lt;br /&gt;
* Javier Pico&lt;br /&gt;
* Manuel Meixide&lt;br /&gt;
* Marce Villarino&lt;br /&gt;
* [mailto:leandro&amp;amp;#x2E;regueiro&amp;amp;#x40;gmail&amp;amp;#x2E;com Leandro Regueiro] (unho) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Victor Portela&lt;br /&gt;
* Proxecto Trasno &amp;amp;#8212; translation project (http://trasno.net)&lt;br /&gt;
=== German Translation ===&lt;br /&gt;
* Aaron Winter (Bitron)&lt;br /&gt;
* Alexander Ginschel (mcpgal)&lt;br /&gt;
* Alexander Laux&lt;br /&gt;
* Alexander Zurek (Alresu)&lt;br /&gt;
* Andre Schmidt (schmidta)&lt;br /&gt;
* Boris Stumm (quijote_)&lt;br /&gt;
* Celina Mainz (Mailina)&lt;br /&gt;
* Chewan&lt;br /&gt;
* Christoph Berg (chrber) &amp;amp;#8212; former translation maintainer&lt;br /&gt;
* Christoph Lange (madelgijs)&lt;br /&gt;
* Drakefriend&lt;br /&gt;
* Elias Fromm (Karpadorsch)&lt;br /&gt;
* Elias Pschernig (allefant)&lt;br /&gt;
* ghype&lt;br /&gt;
* Lennard&lt;br /&gt;
* Lorenzo Hardt (HeroOfGaming)&lt;br /&gt;
* Rhonda D'Vine (Rhonda)&lt;br /&gt;
* Jan Greve (Jan)&lt;br /&gt;
* Jan Heiner Laberenz (jan-heiner)&lt;br /&gt;
* Kai Ensenbach&lt;br /&gt;
* Konrad Schwede (Konrad2)&lt;br /&gt;
* [mailto:marcel_miebach&amp;amp;#x40;gmx&amp;amp;#x2E;de Marcel Miebach] (retr0virus)&lt;br /&gt;
* Mark de Wever ([[User:SkeletonCrew|Mordante/SkeletonCrew]])&lt;br /&gt;
* Matthias Gianfelice (MatthiasG)&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic)&lt;br /&gt;
* Oliver Lange (Crommy)&lt;br /&gt;
* Ronny Standtke&lt;br /&gt;
* Ruben Philipp Wickenhäuser (The Very Uhu)&lt;br /&gt;
* Severin Glöckner (Shiki, Sevu) &amp;amp;#8212; current translation maintainer&lt;br /&gt;
* Stephan Grochtmann (Schattenstephan)&lt;br /&gt;
* Tobias Schönau (SonIcco)&lt;br /&gt;
* Uz-Valentin Friedrich&lt;br /&gt;
* vonHalenbach&lt;br /&gt;
=== Greek Translation ===&lt;br /&gt;
* Alexander Alexiou (Santi/fnaek)&lt;br /&gt;
* Evangelos Papakirikou&lt;br /&gt;
* Harry Kaimenas&lt;br /&gt;
* Katerina Sykioti&lt;br /&gt;
* Konstantinos Egarhos&lt;br /&gt;
* Konstantinos Karasavvas&lt;br /&gt;
* Mik2303&lt;br /&gt;
* Nikos Astroylakis (Greek Dubbings Maker)&lt;br /&gt;
* Nikos Papadopoulos (galicae)&lt;br /&gt;
* Nikos the Great&lt;br /&gt;
* Panagiotis Famelis (Kesnar)&lt;br /&gt;
* Papadopoulos Themistoklis&lt;br /&gt;
* Spiros, Giorgis&lt;br /&gt;
=== Hebrew Translation ===&lt;br /&gt;
* Ariel Ben-Yehuda&lt;br /&gt;
* Oron Peled&lt;br /&gt;
* Ely Levy (Nakee)&lt;br /&gt;
=== Hungarian Translation ===&lt;br /&gt;
* Barthalos Márton (Aldebaran Ghrelin)&lt;br /&gt;
* Czakó Csaba (Horus)&lt;br /&gt;
* Erdélyi Kristóf&lt;br /&gt;
* Fábián Balázs (nermal93)&lt;br /&gt;
* Hamar Krisztián&lt;br /&gt;
* Kádár-Németh Krisztián (Rudanar Firmus)&lt;br /&gt;
* Kékkői László (BlackEvil)&lt;br /&gt;
* Kelemen Zoltán (kele)&lt;br /&gt;
* Kovács Dániel (Consalamander)&lt;br /&gt;
* Majsa Norbert (wias)&lt;br /&gt;
* Máthé Katalin (katkadu)&lt;br /&gt;
* Németh Tamás (nTOMasz)&lt;br /&gt;
* Pintér Csaba (piere)&lt;br /&gt;
* Salamon András (ott)&lt;br /&gt;
* Soltész Adrián (majominia)&lt;br /&gt;
* Széll Tamás (TomJoad)&lt;br /&gt;
* Udvari Gábor (Udi)&lt;br /&gt;
* Udvari Zsolt&lt;br /&gt;
* Vasvári Péter (honorshark)&lt;br /&gt;
=== Icelandic Translation ===&lt;br /&gt;
* Arngrímur Stefánsson&lt;br /&gt;
* Gabríel A. Pétursson&lt;br /&gt;
=== Indonesian Translation ===&lt;br /&gt;
* Ardhi (earthboy)&lt;br /&gt;
* Benny Lin&lt;br /&gt;
* [mailto:sevennightmare&amp;amp;#x40;tutanota&amp;amp;#x2E;de Irsyad Musthafa] &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Iwan&lt;br /&gt;
* [mailto:inkraiswitras&amp;amp;#x40;yahoo&amp;amp;#x2E;com Nicky Inkrais Witras] &amp;amp;#8212; previous translation maintainer&lt;br /&gt;
* [mailto:yuris_wicaksana&amp;amp;#x40;yahoo&amp;amp;#x2E;com Yuristyawan Pambudi Wicaksana] &amp;amp;#8212; previous translation maintainer&lt;br /&gt;
=== Irish Translation ===&lt;br /&gt;
* Mountain_King &amp;amp;#8212; translation maintainer&lt;br /&gt;
=== Italian Translation ===&lt;br /&gt;
* Alessandro Barbazza&lt;br /&gt;
* Alessio D'Ascanio (otaku)&lt;br /&gt;
* Americo Iacovizzi (DarkAmex)&lt;br /&gt;
* [mailto:arosella&amp;amp;#x40;yahoo&amp;amp;#x2E;com Antonio Rosella]&lt;br /&gt;
* crys0000&lt;br /&gt;
* Elvish_Hunter&lt;br /&gt;
* Eugenio Favalli (ElvenProgrammer)&lt;br /&gt;
* Federico Tomassetti&lt;br /&gt;
* Filippo Abbruzzo (Gwain)&lt;br /&gt;
* isazi&lt;br /&gt;
* Luciano Montanaro (Luciano)&lt;br /&gt;
* Michele Maresi (mich)&lt;br /&gt;
* RokStar&lt;br /&gt;
* Stefano Coccato (BioHazardX)&lt;br /&gt;
=== Japanese Translation ===&lt;br /&gt;
* BlueStar&lt;br /&gt;
* clearpotion&lt;br /&gt;
* h22&lt;br /&gt;
* [mailto:broadbarredfirefish&amp;amp;#x40;gmail&amp;amp;#x2E;com Hironori Fujimoto] (RatArmy) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* [mailto:iwaim&amp;amp;#x2E;sub&amp;amp;#x40;gmail&amp;amp;#x2E;com IWAI, Masaharu] ([[User:Iwaim|iwaim]])&lt;br /&gt;
* [mailto:kateitekino_hito&amp;amp;#x40;yahoo&amp;amp;#x2E;co&amp;amp;#x2E;jp kateiteki]&lt;br /&gt;
* kudoh&lt;br /&gt;
* Maxwell Stibbard Hawkes&lt;br /&gt;
* [mailto:mishanhideaki88&amp;amp;#x40;gmail&amp;amp;#x2E;com mishan]&lt;br /&gt;
* いいむらなおき (amatubu) - Naoki Iimura&lt;br /&gt;
* [mailto:okyada&amp;amp;#x40;gmail&amp;amp;#x2E;com 岡田信人 - Nobuhito Okada]&lt;br /&gt;
* np&lt;br /&gt;
* [mailto:pasta0915[at]gmail&amp;amp;#x2E;com Shoot MORII] (pastak)&lt;br /&gt;
* OOTA, Masato(oo)&lt;br /&gt;
* Q&lt;br /&gt;
* R.N&lt;br /&gt;
* rouiza&lt;br /&gt;
* [mailto:le&amp;amp;#x2E;sahara&amp;amp;#x40;gmail&amp;amp;#x2E;com sahara]&lt;br /&gt;
* Shigerello&lt;br /&gt;
* [mailto:suto3suto3&amp;amp;#x40;gmail&amp;amp;#x2E;com suto3]&lt;br /&gt;
* 瀟湘夜雨&lt;br /&gt;
* Taigaku Okuiso&lt;br /&gt;
* Takanobu Hirai&lt;br /&gt;
* tamanegi&lt;br /&gt;
* [mailto:yma9yma&amp;amp;#x40;gmail&amp;amp;#x2E;com yma]&lt;br /&gt;
* Yuji Matsumoto&lt;br /&gt;
=== Korean Translation ===&lt;br /&gt;
* mistzone &amp;amp;#8212; current maintainer&lt;br /&gt;
=== Latin Translation ===&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; general semantician&lt;br /&gt;
* Mark Polo (mpolo) &amp;amp;#8212; original maintainer&lt;br /&gt;
* Michael Babich ([[User:Aethaeryn|Aethaeryn]]) &amp;amp;#8212; current maintainer&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* Thomas Hockings ([[User:Deusite|Deusite]])&lt;br /&gt;
=== Latvian Translation ===&lt;br /&gt;
* Artis Rozentāls&lt;br /&gt;
* Gvido Bruveris &amp;amp;#8212; Maintainer&lt;br /&gt;
* [mailto:rei4dan&amp;amp;#x40;gmail&amp;amp;#x2E;com Reinis Danne]&lt;br /&gt;
=== Lithuanian Translation ===&lt;br /&gt;
* Andrius Štikonas&lt;br /&gt;
* Deimantė Tankus (Diamond)&lt;br /&gt;
* Jurgis Sūdžius (Dievas)&lt;br /&gt;
* Lukas Gasiūnas (LucasLT)&lt;br /&gt;
* Marius Tauba (morlock)&lt;br /&gt;
* Raimundas Zabarauskas&lt;br /&gt;
* Vytautas Šaltenis (rtfb)&lt;br /&gt;
=== Macedonian Translation ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
=== Marathi Translation ===&lt;br /&gt;
* [mailto:sujitrjadhav&amp;amp;#x40;gmail&amp;amp;#x2E;com सुजित जाधव] ([[User:sujitrjadhav|Sujit R Jadhav]])&lt;br /&gt;
=== Norwegian Translation ===&lt;br /&gt;
* Asgeir Aakre (YbeRn00b)&lt;br /&gt;
* Erik J. Mesoy (Circon)&lt;br /&gt;
* Gaute Jao (Gauteamus)&lt;br /&gt;
* Hallvard Norheim Bø (Lysander)&lt;br /&gt;
* Håvard Korsvoll&lt;br /&gt;
* Pål Inge Larsen (PsyBird)&lt;br /&gt;
* Susanne Mesoy (Rarlgland)&lt;br /&gt;
=== Old English Translation ===&lt;br /&gt;
* [mailto:eirikvw&amp;amp;#x40;aim&amp;amp;#x2E;com Eirik Westcoat]&lt;br /&gt;
* [mailto:axonfifty&amp;amp;#x40;gmail&amp;amp;#x2E;com Gottweiß]&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]]) &amp;amp;#8212; Maintainer&lt;br /&gt;
=== Polish Translation ===&lt;br /&gt;
* Agata Chmiel&lt;br /&gt;
* Arkadiusz Danilecki (szopen)&lt;br /&gt;
* Bartek Waresiak (Dragonking)&lt;br /&gt;
* Kamil Matuszewski (LiamTailor)&lt;br /&gt;
* Karol Nowak (grzywacz)&lt;br /&gt;
* Magdalena Chmiel (Ryouko)&lt;br /&gt;
* Marek Kalnik (wdev)&lt;br /&gt;
* Michał Hartliński&lt;br /&gt;
* Michał Jedynak (Artanis)&lt;br /&gt;
* Michał Ligowski (misiorysio)&lt;br /&gt;
* Paweł Albecki (gidgnulur)&lt;br /&gt;
* Paweł Jackowski (fatality)&lt;br /&gt;
* Piotr Kruszewski (Hejnewar)&lt;br /&gt;
* Piotr Makarewicz (ForPeace) &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Robert Wolniak (Szkodnix)&lt;br /&gt;
* Roman Polesek (rimskij)&lt;br /&gt;
* Sebastian Basierski&lt;br /&gt;
* Tadeusz Kopeć&lt;br /&gt;
* Zbigniew Banach (vonBureck)&lt;br /&gt;
=== Portuguese Translation ===&lt;br /&gt;
* Carlos Sousa&lt;br /&gt;
* Luis Passos&lt;br /&gt;
* trewe &amp;amp;#8212; Current maintainer&lt;br /&gt;
=== Portuguese (Brazil) Translation ===&lt;br /&gt;
* Ambra Viviani Loos&lt;br /&gt;
* Andrei Machado &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Antonio Vildes Barbosa&lt;br /&gt;
* Bruno Macabeus&lt;br /&gt;
* Celso Goya&lt;br /&gt;
* [mailto:cbterra&amp;amp;#x40;gmail&amp;amp;#x2E;com Claudio Terra]&lt;br /&gt;
* Claus Aranha&lt;br /&gt;
* Di Teixeira (Moroder)&lt;br /&gt;
* Diego Inácio Goergen&lt;br /&gt;
* [mailto:fred&amp;amp;#x2E;maranhao&amp;amp;#x40;gmail&amp;amp;#x2E;com Fred Maranhão]&lt;br /&gt;
* Hugo Neiva de Melo&lt;br /&gt;
* Michel Loos&lt;br /&gt;
* Renato Cunha&lt;br /&gt;
* Ricardo Sodré Andrade&lt;br /&gt;
* Romero Gonçalves&lt;br /&gt;
* Sérgio de Miranda Costa&lt;br /&gt;
* Tiago Souza (Salvador)&lt;br /&gt;
=== Romanian Translation ===&lt;br /&gt;
* Unknown&lt;br /&gt;
=== Russian Translation ===&lt;br /&gt;
* Aldarisvet &amp;amp;#8212; Previous maintainer&lt;br /&gt;
* [mailto:allryn&amp;amp;#x40;pisem&amp;amp;#x2E;net Aleksandr Aleks]&lt;br /&gt;
* Alexandr Gridnev&lt;br /&gt;
* Alexandr Menovchicov&lt;br /&gt;
* Alexey Remizov&lt;br /&gt;
* Alexey Zakharchenko&lt;br /&gt;
* Andrey Tikhonov ([[User:tiandrey|tiandrey]])&lt;br /&gt;
* Anthony Kolesov&lt;br /&gt;
* Artem Khrapov ([[User:Kabachuha|kabachuha]]) &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Azamat Hackimov ([[User:Winterheart|winterheart]])&lt;br /&gt;
* [mailto:BabylonASАТyandexDОTru BabylonAS] ([[User:BabylonAS|BabylonAS]])&lt;br /&gt;
* [[User:catbegemot|catbegemot]]&lt;br /&gt;
* Danila Evstifeyev (MyOtheHedgeFox)&lt;br /&gt;
* Denis Revin (Dut_Norshi)&lt;br /&gt;
* Dmitry Brilev (dobryl)&lt;br /&gt;
* Fardeil&lt;br /&gt;
* Fedor Gavrilov (gallowzbird)&lt;br /&gt;
* Fedor Khod'kov (teddy/fkhodkov)&lt;br /&gt;
* Ilya Kaznacheev&lt;br /&gt;
* Ilya Kotov&lt;br /&gt;
* Ishayahu Lastov (Ishayahu)&lt;br /&gt;
* Kirill Baranov&lt;br /&gt;
* Mikhail Melnik (ZumZoom)&lt;br /&gt;
* Nikita Ushkin&lt;br /&gt;
* Roman Tuchin (Sankt)&lt;br /&gt;
* Sergey Popov (loonycyborg)&lt;br /&gt;
* Valentina Mukhamedzhanova (umirra)&lt;br /&gt;
* Victor Sergienko (singalen)&lt;br /&gt;
* [mailto:vicza&amp;amp;#x40;zmail&amp;amp;#x2E;ru Victor Zabavin]&lt;br /&gt;
* Vlad Glagolev&lt;br /&gt;
* Yellow Horror&lt;br /&gt;
=== Scottish Gaelic Translation ===&lt;br /&gt;
* [mailto:fios&amp;amp;#x40;foramnagaidhlig&amp;amp;#x2E;net GunChleoc] &amp;amp;#8212; Current maintainer&lt;br /&gt;
=== Serbian Translation ===&lt;br /&gt;
* Branko Kokanovic (kokan)&lt;br /&gt;
* [mailto:caslav&amp;amp;#x2E;ilic&amp;amp;#x40;gmx&amp;amp;#x2E;net Caslav Ilic]&lt;br /&gt;
* [mailto:daliborddjuric&amp;amp;#x40;gmail&amp;amp;#x2E;com Dalibor Djuric]&lt;br /&gt;
* [mailto:sreckotoroman&amp;amp;#x40;gmail&amp;amp;#x2E;com Srecko Toroman] (FreeCraft)&lt;br /&gt;
=== Slovak Translation ===&lt;br /&gt;
* Aceman&lt;br /&gt;
* Ivan Kovacs&lt;br /&gt;
* Ján Sučan (Bhujanga)&lt;br /&gt;
* Marian Kluvanec&lt;br /&gt;
* Martin Dzbor&lt;br /&gt;
* Martin Plávala (Empy)&lt;br /&gt;
* Stano Hoferek (Elven)&lt;br /&gt;
* [[User:Viliam|Viliam Bur]]&lt;br /&gt;
=== Slovenian Translation ===&lt;br /&gt;
* Gregor Petrin&lt;br /&gt;
* Jaka Kranjc (lynx)&lt;br /&gt;
* Klemen Košir (nNa)&lt;br /&gt;
* Matej Repinc&lt;br /&gt;
=== Spanish Translation ===&lt;br /&gt;
* Alvin Eloy Luna Castro&lt;br /&gt;
* Chucho Pulgoso&lt;br /&gt;
* David Martínez Moreno&lt;br /&gt;
* Diego Grande Rodríguez (Buhako)&lt;br /&gt;
* Diego J.&lt;br /&gt;
* Fernando Cerezal&lt;br /&gt;
* Flamma&lt;br /&gt;
* Francisco Muñoz (fmunoz)&lt;br /&gt;
* Gabriel Rodríguez (Chewie)&lt;br /&gt;
* [mailto:gusgins&amp;amp;#x40;gmail&amp;amp;#x2E;com Gustavo Gingins] (gins)&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]])&lt;br /&gt;
* Iván Herrero (navitux)&lt;br /&gt;
* Javier C.H. (perseo)&lt;br /&gt;
* Jose Gordillo (kilder)&lt;br /&gt;
* Jose Manuel Gomez (joseg)&lt;br /&gt;
* Josu Díaz de Arcaya&lt;br /&gt;
* Masacroso&lt;br /&gt;
* Martín R. Dapás&lt;br /&gt;
* Pedro Llorens (PeterPorty)&lt;br /&gt;
* Roberto Romero (sildur)&lt;br /&gt;
* Sergi March (sergi34)&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* [mailto:quianaaelonin&amp;amp;#x40;gmail&amp;amp;#x2E;com Víctor M. Estrada] (Aelonin/Darkmage)&lt;br /&gt;
* Xavier Novella Sinde (XavierNovella)&lt;br /&gt;
=== Swedish Translation ===&lt;br /&gt;
* Alex Alowersson &amp;amp;#8212; current maintainer&lt;br /&gt;
* Alexander Kjäll (capitol)&lt;br /&gt;
* Andreas Tyrberg&lt;br /&gt;
* Åse Petersson (tintin)&lt;br /&gt;
* Elias Sevelin (aXidal)&lt;br /&gt;
* Gustav Tiger&lt;br /&gt;
* Hugo Gerlach (Entrimo)&lt;br /&gt;
* Leo Danielson (Lugo Moll)&lt;br /&gt;
* Niklas Bolmdahl&lt;br /&gt;
* Stefan Bergström (tephlon)&lt;br /&gt;
* [mailto:susanna&amp;amp;#x2E;bjorverud&amp;amp;#x40;telia&amp;amp;#x2E;com Susanna Björverud] (sanna)&lt;br /&gt;
* Ulrika Uddeborg&lt;br /&gt;
* wint3r&lt;br /&gt;
=== Turkish Translation ===&lt;br /&gt;
* Ali Erdem Karaçay(Arsivnet)&lt;br /&gt;
* Enes Akın (yekialem)&lt;br /&gt;
* İhsan Akın&lt;br /&gt;
* Kosif&lt;br /&gt;
* Nilgün Belma Bugüner&lt;br /&gt;
* Pınar Yanardağ (moonquelle)&lt;br /&gt;
* Selim Farsakoğlu&lt;br /&gt;
=== Ukrainian Translation ===&lt;br /&gt;
* Anton Okhrimenko (AncientGeneral)&lt;br /&gt;
* [mailto:mansonigor&amp;amp;#x40;gmail&amp;amp;#x2E;com Igor Paliychuk]&lt;br /&gt;
* [mailto:arobson&amp;amp;#x40;yandex&amp;amp;#x2E;ru robson] ([[User:Robson|Robson]])&lt;br /&gt;
=== Valencian (southern Catalan) Translation ===&lt;br /&gt;
* Bernardo Arlandis&lt;br /&gt;
* Robert Millan&lt;br /&gt;
* Tomás Roig&lt;br /&gt;
=== Vietnamese Translation ===&lt;br /&gt;
* Huynh Yen Loc&lt;br /&gt;
* Le Ngoc Nguyen Chinh&lt;br /&gt;
* Pham Hoang Duy&lt;br /&gt;
* Pham Thanh Nam&lt;br /&gt;
* Pham Thi Yen&lt;br /&gt;
=== RACV’s Translation ===&lt;br /&gt;
* Mario Rodríguez (Mavorte)&lt;br /&gt;
== Sceptre of Fire ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Joseph Simmons (turin)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* doofus-01&lt;br /&gt;
* nemaara&lt;br /&gt;
=== WML Assistance ===&lt;br /&gt;
* David Simmons (Dacyn)&lt;br /&gt;
* Eli Dupree (Elvish Pillager)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* MadMax&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Asereje&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; the new Dwarvish Miner sprite&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; new portraits&lt;br /&gt;
* James Woo (Pickslide) &amp;amp;#8212; old portraits&lt;br /&gt;
* John-Robert Funck (XJaPaN)&lt;br /&gt;
* JonasNL &amp;amp;#8212; Dwarvish Miner attack and defense animations&lt;br /&gt;
* Peter Geinitz (Wayfarer)&lt;br /&gt;
* Pixelmind &amp;amp;#8212; Khrakrahs portrait&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
* RusHHouR &amp;amp;#8212; old gold and coal piles&lt;br /&gt;
* doofus-01&lt;br /&gt;
== Son Of The Black Eye ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Benjamin Drieu (Benj) &amp;amp;#8212; conception and original design&lt;br /&gt;
* Taurus &amp;amp;#8212; completion&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Taurus&lt;br /&gt;
=== Prose, Grammatical and WML Assistance ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Artwork and Graphics ===&lt;br /&gt;
* Christian Sirviö (Girgistian) &amp;amp;#8212; portraits (sketches)&lt;br /&gt;
* Phil Barber (thespaceinvader) &amp;amp;#8212; portraits (coloring)&lt;br /&gt;
* Sonny T Yamada (SkyOne) &amp;amp;#8212; Sprite animations (defense and magic) of orcish shamans&lt;br /&gt;
== Northern Rebirth ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Taurus&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Battlesquid&lt;br /&gt;
* Nicholas Kerpan (Thrawn)&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
* Xandar86&lt;br /&gt;
=== Prose, Grammatical and WML Assistance ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Code and Translation Assistance ===&lt;br /&gt;
* David Philippi (Torangan)&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Charles Dang (vultraz)&lt;br /&gt;
== Liberty ==&lt;br /&gt;
=== Original Campaign Design ===&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Latest Rewrite ===&lt;br /&gt;
* nemaara&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Original prose-doctoring and preparation for mainline&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Brendan Sellner&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portraits&lt;br /&gt;
* Shadow&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; story images, Rogue Mage line sprites&lt;br /&gt;
* Sonny T Yamada (SkyOne) &amp;amp;#8212; Sprite animations (defense and attack) of Rogue Mage line&lt;br /&gt;
== Delfadors Memoirs ==&lt;br /&gt;
=== Creator and Original Designer ===&lt;br /&gt;
* [[User:jp30|Josh Parsons]] &amp;amp;#8212; Original designer, responsible for first scenarios 2-10; maintained it up to 0.5.2&lt;br /&gt;
=== Co-Authors ===&lt;br /&gt;
* Oto 'tapik' Buchta &amp;amp;#8212; First scenario, various improvements&lt;br /&gt;
* Spiros Alexiou (Santi/fnaek) &amp;amp;#8212; Scenarios 12 and following.&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Prose- and script-doctoring, Wesnoth continuity fixes.&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Jeffrey 'Sigurd' Westcoat (SigurdFireDragon) &amp;amp;#8212; former maintainer&lt;br /&gt;
=== WML Programming and Assistance ===&lt;br /&gt;
* Fabi &amp;amp;#8212; WML bug fixing and polishing.&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Side-mutation and recall-list handling.&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm) &amp;amp;#8212; WML help&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* Kathrin Polikeit (Kitty)&lt;br /&gt;
=== Additional thanks to ===&lt;br /&gt;
* Arkadiusz D. Danilecki &amp;amp;#8212; Inspiration and borrowings from his 'A New Order'&lt;br /&gt;
== Heir To The Throne ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* David White (Sirp)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* doofus-01 &amp;amp;#8212; new sprites and animations (Princess, Battle Princess, Dark Queen, Sea Orc)&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; portraits (Delfador, Asheviere, Moremirmu)&lt;br /&gt;
* Francisco Muñoz (fmunoz)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portraits (Konrad, Li'sar, Kalenz, Chantal)&lt;br /&gt;
* Neoriceisgood&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Patrick Parker (Sapient) &amp;amp;#8212; WML assistance&lt;br /&gt;
== Secrets of the Ancients ==&lt;br /&gt;
=== Campaign Design, Programming, and Artwork ===&lt;br /&gt;
* Dan Gerhards (beetlenaut)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Jeffrey 'Sigurd' Westcoat (SigurdFireDragon) &amp;amp;#8212; former maintainer&lt;br /&gt;
=== Additional Artwork ===&lt;br /&gt;
* Wussel &amp;amp;#8212; Some improvements to the ship.&lt;br /&gt;
== Legend of Wesmere ==&lt;br /&gt;
=== Creator and Lead Designer ===&lt;br /&gt;
* [mailto:moka1&amp;amp;#x40;otenet&amp;amp;#x2E;gr Spiros, George and Alexander Alexiou] ([[User:Santi|Santi/fnaek]]) &amp;amp;#8212; Main designers, former maintainers.&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Fabi/Fendrin &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Spiros, George and Alexander Alexiou (Santi/fnaek)&lt;br /&gt;
=== Prose-doctoring and adaptation for mainline ===&lt;br /&gt;
* Eric S. Raymond (esr)&lt;br /&gt;
* Fabi/Fendrin &amp;amp;#8212; Major WML rewrite for mainline&lt;br /&gt;
=== WML Assistance ===&lt;br /&gt;
* Alexander van Gessel (AI/AI0867) &amp;amp;#8212; bugfixing and general WML cleanups&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm) &amp;amp;#8212; for A LOT of help with WML and interesting campaign suggestions&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; for A LOT of help with WML&lt;br /&gt;
=== Artificial Intelligence ===&lt;br /&gt;
* Yurii Chernyi (crab) &amp;amp;#8212; coding of the new ai and help with corresponding redesigns&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* Bora Orcal (bera) &amp;amp;#8212; goblin horn rouser&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; who did a great job with portraits and other graphics&lt;br /&gt;
-the main reason for having a polished campaign&lt;br /&gt;
* Steven Panek (Espreon) &amp;amp;#8212; map artist&lt;br /&gt;
=== Additional thanks to ===&lt;br /&gt;
* Scott &amp;amp;#8212; for help with WML, especially the use of store/unstore&lt;br /&gt;
* WhiteWizard &amp;amp;#8212; Initial porting to 1.2&lt;br /&gt;
* Disto &amp;amp;#8212; for elvish units&lt;br /&gt;
* RedLTeut &amp;amp;#8212; for great improvements to the initial invisible elvish units&lt;br /&gt;
* Dacyn &amp;amp;#8212; who was of great help in the beginning of this project&lt;br /&gt;
* Big Bad Joe&lt;br /&gt;
* breversa&lt;br /&gt;
* Invisible Philosopher&lt;br /&gt;
* js138&lt;br /&gt;
* l'ultimo cruco&lt;br /&gt;
* Mad Max&lt;br /&gt;
* Rhuvaen&lt;br /&gt;
* SelfishWeirdo&lt;br /&gt;
* Scott&lt;br /&gt;
* Sly&lt;br /&gt;
* Teldar&lt;br /&gt;
* Turin&lt;br /&gt;
* And the rest of the Wesnoth community for feedback,&lt;br /&gt;
criticism, help with WML code and graphics.&lt;br /&gt;
== The South Guard ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* William Carey (aelius)&lt;br /&gt;
=== Latest Campaign Revision ===&lt;br /&gt;
* nemaara&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* nemaara &amp;amp;#8212; current maintainer&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
* Wintermute&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* J.W. Bjerk (eleazar)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portraits&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Scavenger &amp;amp;#8212; new story images and Mal M'Brin portrait&lt;br /&gt;
* rhyging5&lt;br /&gt;
* Shadow&lt;br /&gt;
* William Carey (aelius)&lt;br /&gt;
== Two Brothers ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Eric J. Mesoy (Circon)&lt;br /&gt;
* Nils Kneuper (Ivanovic)&lt;br /&gt;
=== Prose and Story Edits ===&lt;br /&gt;
* Eric S. Raymond (esr)&lt;br /&gt;
* A-Red&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Nils Kneuper (Ivanovic)&lt;br /&gt;
* Charles Dang (vultraz)&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Arkadiusz Danileki (szopen)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; current portraits&lt;br /&gt;
* MadMax&lt;br /&gt;
* Stefan&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Bartek Waresiak (Dragonking)&lt;br /&gt;
* Christoph Berg (chrber)&lt;br /&gt;
* Daravel&lt;br /&gt;
* Jozrael&lt;br /&gt;
* And special thanks to everyone else who I forgot to mention.&lt;br /&gt;
== Under the Burning Suns ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Asa Swain&lt;br /&gt;
* Piotr Cychowski (Mist/cycholka)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm)&lt;br /&gt;
* Jan Rietema (Rhuvaen)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Piotr Cychowski (Mist/cycholka)&lt;br /&gt;
* Simon Forsyth (Alarantalara)&lt;br /&gt;
* Steven Panek (Espreon)&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Dan Gerhards (beetlenaut) &amp;amp;#8212; new Flesh Golem sprites&lt;br /&gt;
* Kwandulin &amp;amp;#8212; New Kaleh and Nym sprites&lt;br /&gt;
* doofus-01 &amp;amp;#8212; Monster Crab sprite&lt;br /&gt;
* Hogne Haskjold (Frame)&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm)&lt;br /&gt;
* J.W. Bjerk (Eleazar)&lt;br /&gt;
* James Woo (Pickslide)&lt;br /&gt;
* Javier Hoyos (Vendanna)&lt;br /&gt;
* Marcus Rosén (sleepwalker) &amp;amp;#8212; Dark Assassin sprite and animations&lt;br /&gt;
* Mark Goodenough (Ranger M)&lt;br /&gt;
* Mikolaj Machowski (Emdot)&lt;br /&gt;
* Murray Cook (Zhukov)&lt;br /&gt;
* Peter Geinitz (Shadow)&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
* Sangel&lt;br /&gt;
* Samuel Wilson (megane)&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
* Vincent Langner (Vyncyn) &amp;amp;#8212; Spider Lich and Human Commander sprites&lt;br /&gt;
* Zerovirus &amp;amp;#8212; Naga Hunter sprite&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Fabian Müller (Fabi/Fendrin)&lt;br /&gt;
* Mark Polo&lt;br /&gt;
* Matthias Schoeck (mattsc) &amp;amp;#8212; Messenger AI&lt;br /&gt;
* Isaac&lt;br /&gt;
* Ringcaat (Thorin N. Tatge)&lt;br /&gt;
* And special thanks to everyone else who I forgot to mention.&lt;br /&gt;
== Descent Into Darkness ==&lt;br /&gt;
=== Original Campaign Design ===&lt;br /&gt;
* esci&lt;br /&gt;
=== Latest Campaign Revision ===&lt;br /&gt;
* nemaara&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; story images&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; current portraits&lt;br /&gt;
* theycallmerooster &amp;amp;#8212; old portraits&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* josteph &amp;amp;#8212; dialogue comments and revisions&lt;br /&gt;
== Dead Water ==&lt;br /&gt;
=== Campaign design and programming ===&lt;br /&gt;
* Dan Gerhards (beetlenaut)&lt;br /&gt;
=== Script-doctoring and cleanup for mainline ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Artwork ===&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; Portraits for brawler, Kai Krellis, Gwabbo, and Caladon&lt;br /&gt;
* Justin Nichols (JustinOperable) &amp;amp;#8212; Portrait for Cylanna&lt;br /&gt;
* Zerovirus &amp;amp;#8212; Kai Krellis sprites&lt;br /&gt;
* Francisco Muñoz (fmunoz) &amp;amp;#8212; Attack icons&lt;br /&gt;
== The Rise Of Wesnoth ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* James Spencer (Shade)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; the new Vampire Lady sprite&lt;br /&gt;
* J.W. Bjerk (eleazar)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; new portraits and story art&lt;br /&gt;
* Michael Gil de Muro (grp21) &amp;amp;#8212; old portraits&lt;br /&gt;
* pixelmind &amp;amp;#8212; Shek'kahan portrait&lt;br /&gt;
=== WML Contributors ===&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
== The Hammer of Thursagan ==&lt;br /&gt;
=== Author ===&lt;br /&gt;
* Eric S. Raymond (esr)&lt;br /&gt;
=== Special Guest Designer ===&lt;br /&gt;
* Taurus&lt;br /&gt;
=== Art ===&lt;br /&gt;
* Kim Holm (DUHH)&lt;br /&gt;
* Phil Barber (thespaceinvader)&lt;br /&gt;
* Vincent Langner (Vyncyn) &amp;amp;#8212; New Dwarvish Witness line sprites and animations&lt;br /&gt;
=== Brainstorming, playtesting, and spousal support ===&lt;br /&gt;
* Cathy O. Raymond&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Charles Dang (vultraz)&lt;br /&gt;
== Eastern Invasion ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Joseph Simmons (turin)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Astrid Halberkamp&lt;br /&gt;
=== Campaign Epilogue and Continuity ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Prose and Story Edits ===&lt;br /&gt;
* Loci&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Aaron Redfern (A-Red) &amp;amp;#8212; New Owaec sprites&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; new portraits&lt;br /&gt;
* James Woo (Pickslide) &amp;amp;#8212; old portraits&lt;br /&gt;
* Neoriceisgood&lt;br /&gt;
[[Category:Generated]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Download&amp;diff=68591</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Download&amp;diff=68591"/>
		<updated>2021-10-25T17:55:54Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: space&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the ''Battle for Wesnoth'' downloads page. The BfW project team officially releases the source code and builds for Windows, macOS, and various Linux distributions.&lt;br /&gt;
&lt;br /&gt;
If the latest binaries are not currently available for your OS, please check back in a few days to see if they have been placed here. Packagers have been informed of the release, please be patient.  In the meantime, read the [[FAQ#A_new_version_is_out.2C_but_where_is_the_download_for_.5BWindows.2C_Mac_OS_X.2C_etc..5D.3F|FAQ]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Stable (1.16 branch) ==&lt;br /&gt;
&amp;lt;b&amp;gt;1.16.x&amp;lt;/b&amp;gt; is the current stable branch. These releases are recommended for most players, as they provide a well-tested and balanced game experience with only occasional bug-fix updates. Each version of this branch is compatible with each other. The online player community for it is also the largest and the add-ons server has a vast selection of content.&lt;br /&gt;
{{StableDownload}}&lt;br /&gt;
&lt;br /&gt;
==== GNU/Linux ====&lt;br /&gt;
* There are binaries for many different GNU/Linux distributions. Not all are always up to date with the current release. Please have a look at the [[WesnothBinariesLinux|Linux binary page]] for more information about the binaries for your distribution.&lt;br /&gt;
&lt;br /&gt;
==== Miscellaneous ====&lt;br /&gt;
* [https://sourceforge.net/projects/wesnoth/files/ SourceForge page for current and all previous versions]&lt;br /&gt;
&lt;br /&gt;
== Development (1.15 branch) ==&lt;br /&gt;
&amp;lt;b&amp;gt;1.15.x&amp;lt;/b&amp;gt; is the current development branch, boasting new exciting features. However, there may be occasional bugs or performance problems in these releases. Content creators, coders, and players who want to preview the future of Wesnoth may be interested in checking out our work in this branch.&lt;br /&gt;
&lt;br /&gt;
People familiar with version control systems and building the game from source may follow Wesnoth development even more closely using the [[WesnothRepository|Git repository]] instead.&lt;br /&gt;
{{DevDownload}}&lt;br /&gt;
&lt;br /&gt;
==== GNU/Linux ====&lt;br /&gt;
* There are binaries for many different GNU/Linux distributions. Not all are always up to date with the current release. Please have a look at the [[WesnothBinariesLinux|Linux binary page]] for more information about the binaries for your distribution.&lt;br /&gt;
&lt;br /&gt;
==== Miscellaneous ====&lt;br /&gt;
* [https://sourceforge.net/projects/wesnoth/files/ SourceForge page for current and all previous versions]&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
''Main article: [[Wesnoth:Copyrights]]''&lt;br /&gt;
&lt;br /&gt;
This program is free software; you can redistribute it and/or modify it under the terms of the [https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License version 2], as published by the [https://www.fsf.org Free Software Foundation], or at your option, any later version.&lt;br /&gt;
&lt;br /&gt;
This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See the GNU General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
Some assets included with the game are provided under the terms of the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0 license].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [https://changelog.wesnoth.org/1.14 Changelog for the stable version]&lt;br /&gt;
* [https://changelog.wesnoth.org Changelog for the development version]&lt;br /&gt;
* [[WesnothRepository]] - bleeding edge version from the repository&lt;br /&gt;
&lt;br /&gt;
[[Category:Building and Installing]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Screenshots&amp;diff=68582</id>
		<title>Screenshots</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Screenshots&amp;diff=68582"/>
		<updated>2021-10-24T06:56:18Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Wesnoth 1.16 ==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-1-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-2.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-2-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-3.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-3-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-4.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-4-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-5.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-5-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-6.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-6-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-7.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-7-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-8.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-8-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-9.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.16.0-9-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wesnoth 1.14 ==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-1-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-2.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-2-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-3.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-3-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-4.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-4-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-5.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-5-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-6.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-6-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-7.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-7-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-8.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-8-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-9.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-9-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-10.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-10-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-11.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-11-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-12.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.14.0-12-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wesnoth 1.12 ==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-1-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-2.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-2-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-3.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-3-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-4.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-4-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-5.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-5-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-6.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-6-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-7.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-7-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-8.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-8-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-9.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-9-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-11.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-11-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-12.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-12-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-13.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.0-13-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.4-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.4-1-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.4-2.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.4-2-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.4-3.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.4-3-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.4-4.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.4-4-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.5-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.5-1-192.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.12.5-2.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.12.5-2-192.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wesnoth 1.11.8 ==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-1-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-2.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-2-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-3.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-3-175.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-4.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-4-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-5.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-5-175.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wesnoth 1.11.7 ==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.7-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.7-1-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.7-2.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.7-2-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.7-3.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.7-3-175.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.7-4.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.7-4-175.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wesnoth 1.11.6 ==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.6-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.6-1-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.6-2.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.6-2-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.6-3.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.6-3-175.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.6-4.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.6-4-175.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wesnoth 1.10 ==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.10-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.10-1-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.10-2.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.10-2-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.10-3.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.10-3-175.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.10-4.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.10-4-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.10-5.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.10-5-175.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wesnoth 1.9.0 ==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-1-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-2.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-2-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-3.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-3-175.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-4.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-4-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-5.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-5-175.jpg]&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-6.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.9.0-6-175.jpg]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Older Screenshots]]&lt;br /&gt;
* [[Ancient Screenshots]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category:Art and Screenshots]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Credits&amp;diff=68579</id>
		<title>Credits</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Credits&amp;diff=68579"/>
		<updated>2021-10-23T06:14:34Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Credits update in preparation for the 1.16.0 release&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;tright&amp;quot;&amp;gt; __TOC__ &amp;lt;/div&amp;gt;&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
In July 2003, '''David White''' released the first version of Wesnoth. Since&lt;br /&gt;
then, many people have joined the project, contributing in very different ways.&lt;br /&gt;
&lt;br /&gt;
To make any changes to this list, please modify&lt;br /&gt;
&amp;lt;code class=&amp;quot;noframe&amp;quot;&amp;gt;about.cfg&amp;lt;/code&amp;gt; in the repo or ask any developer to do&lt;br /&gt;
it for you.&lt;br /&gt;
&lt;br /&gt;
== Core Contributors ==&lt;br /&gt;
=== Programming ===&lt;br /&gt;
* [mailto:dave&amp;amp;#x40;whitevine&amp;amp;#x2E;net David White] (Sirp) &amp;amp;#8212; Founding Developer&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* [mailto:AI0867&amp;amp;#x40;gmail&amp;amp;#x2E;com Alexander van Gessel] (AI/AI0867)&lt;br /&gt;
* Alfredo Beaumont (ziberpunk) &amp;amp;#8212; autotools&lt;br /&gt;
* Ali El Gariani ([[User:Alink|alink]]) &amp;amp;#8212; coder, bug fixes, optimizations, interface usability&lt;br /&gt;
* András Salamon ([[User:Ott|ott]]) &amp;amp;#8212; QA, bug fixing, subediting, game mechanics&lt;br /&gt;
* Andreas Löf (Aginor)&lt;br /&gt;
* Anonymissimus &amp;amp;#8212; bug fixes and features mostly related to the wml engine or lua interface&lt;br /&gt;
* [mailto:artemkhrapov2001ATyandexDOTru Artem Khrapov] ([[User:Kabachuha|kabachuha]]) &amp;amp;#8212; addons server rework, incremental updates and uploads feature; i18n, UI and quality of life improvements; bugfixes&lt;br /&gt;
* [mailto:dragonking&amp;amp;#x40;o2&amp;amp;#x2E;pl Bartek Waresiak] (Dragonking) &amp;amp;#8212; unit balancing, Formula AI&lt;br /&gt;
* Benoît Timbert ([[User:Noyga|Noyga]])&lt;br /&gt;
* Bram Ridder (Morloth) &amp;amp;#8212; editor improvements&lt;br /&gt;
* [mailto:bruno&amp;amp;#x40;wolff&amp;amp;#x2E;to Bruno Wolff III] ([[User:bruno|bruno]]) &amp;amp;#8212; campaign web interface, bug fixing, minor coder&lt;br /&gt;
* Cameron Morland&lt;br /&gt;
* Cédric Duval &amp;amp;#8212; coder, internationalization manager&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; General fixes, cleanup and improvements to various areas.&lt;br /&gt;
* Chris Beck (iceiceice/involution) &amp;amp;#8212; Bug fixes and features esp. engine-related or multiplayer-related. Added WML unit testing system, improvements to travis-CI.&lt;br /&gt;
* Celtic Minstrel&lt;br /&gt;
* Daniel Franke (dfranke)&lt;br /&gt;
* Daniel (gfgtdf)&lt;br /&gt;
* David Hilton&lt;br /&gt;
* Dominic Bolin (Xan)&lt;br /&gt;
* Elias Pschernig (allefant)&lt;br /&gt;
* Elvish_Hunter&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Macro library reorganization, major UI makeover introducing lightweight transparent popups and linger mode, maintenance tools for WML, eight campaigns lifted from UMC, one all-original campaign, editor refactoring, many many code cleanups, and svn-to-git migration.&lt;br /&gt;
* Eugen Jiresch (euschn) &amp;amp;#8212; savegame improvements&lt;br /&gt;
* [mailto:fabianmueller5_at_gmx&amp;amp;#x2E;de Fabian Müller] ([[User:fabi|fabi/fendrin]])&lt;br /&gt;
* [mailto:gabrielmorin~_-AT-_~gmail&amp;amp;#x2E;com Gabriel Morin] (gabba) &amp;amp;#8212; Whiteboard project, naming hotseat players, delay shroud updates on game start.&lt;br /&gt;
* Greg Copeland (Oracle) &amp;amp;#8212; coding; Server optimizations.&lt;br /&gt;
* Gregory Lundberg (TadCarlucci) &amp;amp;#8212; Cleanup of campaigns code&lt;br /&gt;
* [mailto:cornmander&amp;amp;#x40;cornmander&amp;amp;#x2E;com Gregory Shikhman] (corn) &amp;amp;#8212; coding; upload log maintenance/improvements&lt;br /&gt;
* Guillaume Melquiond (silene) &amp;amp;#8212; coding, bug fixes&lt;br /&gt;
* [mailto:billybiset&amp;amp;#x40;gmail&amp;amp;#x2E;com Guillermo Biset] (billynux) &amp;amp;#8212; Bug fixer, remover of upload stats, network module rewrite, ANA, boost::asio&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]]) &amp;amp;#8212; Miscellaneous WML, i18n and UI features, improvements and bugfixes; refactoring and extension of add-ons management code; features and refactoring of image-path functions mechanism; cache manager UI and paths/game version dialog; campaignd refactoring and maintenance&lt;br /&gt;
* Jérémy Rosen ([[User:Boucman|Boucman]]) &amp;amp;#8212; coder&lt;br /&gt;
* [mailto:mcnabb&amp;amp;#x40;gravity&amp;amp;#x2E;psu&amp;amp;#x2E;edu John W. C. McNabb] (Darth Fool) &amp;amp;#8212; coder, graphics&lt;br /&gt;
* Jon Daniel (worduk) &amp;amp;#8212; coder, bug fixes&lt;br /&gt;
* Jörg Hinrichs (Yogi Bear/YogiHH)&lt;br /&gt;
* [mailto:justin&amp;amp;#x2E;zaun&amp;amp;#x40;gmail&amp;amp;#x2E;com Justin Zaun] (jzaun) &amp;amp;#8212; coder, scenario designer&lt;br /&gt;
* Jyrki Vesterinen&lt;br /&gt;
* Karol Nowak (grzywacz) &amp;amp;#8212; bug fixes, sound sources, gp2x port&lt;br /&gt;
* [mailto:erl&amp;amp;#x40;erl&amp;amp;#x2E;se Kristoffer Erlandsson] (erl) &amp;amp;#8212; help system, editor&lt;br /&gt;
* [mailto:lao&amp;amp;#x2E;geek&amp;amp;#x40;gmail&amp;amp;#x2E;com Lao] ([[User:lao|lao]]) &amp;amp;#8212; bug fixes and candidate to GSoC 2008&lt;br /&gt;
* Mark de Wever ([[User:SkeletonCrew|Mordante/SkeletonCrew]]) &amp;amp;#8212; coder, bug fixes, various features, multi-letter terrain system, gui system.&lt;br /&gt;
* Martin Renold (maxy/martinxyz) &amp;amp;#8212; performance and gui bug fixes&lt;br /&gt;
* Matthias Kretz &amp;amp;#8212; optimizations&lt;br /&gt;
* Moritz Göbelbecker (mog) &amp;amp;#8212; Work on the terrain engine&lt;br /&gt;
* Nicolas Weeger (Ryo) &amp;amp;#8212; Python API&lt;br /&gt;
* [mailto:patrick_x99&amp;amp;#x40;hotmail&amp;amp;#x2E;com Patrick Parker] ([[User:Sapient|Sapient]]) &amp;amp;#8212; improvements to user interface, WML engine, various features&lt;br /&gt;
* [mailto:paniemin&amp;amp;#x40;cc&amp;amp;#x2E;hut&amp;amp;#x2E;fi Pauli Nieminen] (suokko) &amp;amp;#8212; Bug fixing; usually targeting MP or WML engine&lt;br /&gt;
* [mailto:philippe&amp;amp;#x2E;plantier&amp;amp;#x40;naema&amp;amp;#x2E;org Philippe Plantier] ([[User:Ayin|Ayin]]) &amp;amp;#8212; several parts of the code, notably terrain graphics code&lt;br /&gt;
* Rusty Russell (rusty)&lt;br /&gt;
* Sergey Popov (loonycyborg) &amp;amp;#8212; scons&lt;br /&gt;
* singalen &amp;amp;#8212; iOS port&lt;br /&gt;
* Soliton &amp;amp;#8212; bug fixes and various small features usually in multiplayer context&lt;br /&gt;
* Steve Cotton (octalot)&lt;br /&gt;
* Steven Oxley (xonev)&lt;br /&gt;
* Thomas Baumhauer (Baufo)&lt;br /&gt;
* [mailto:timotei21&amp;amp;#x40;gmail&amp;amp;#x2E;com Timotei Dolean] (timotei) &amp;amp;#8212; Eclipse UMC plugin&lt;br /&gt;
* Tomasz Śniatowski (ilor) &amp;amp;#8212; Editor&lt;br /&gt;
* [mailto:ydirson&amp;amp;#x40;altern&amp;amp;#x2E;org Yann Dirson] &amp;amp;#8212; gettext support, tinygui&lt;br /&gt;
* [mailto:terraninfo&amp;amp;#x40;terraninfo&amp;amp;#x2E;net Yurii Chernyi] (Crab) &amp;amp;#8212; AI&lt;br /&gt;
=== General Purpose Administration and Coordination ===&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; Current release manager (1.13.3-present)&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Crossbow/Miyo &amp;amp;#8212; Past release manager&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]]) &amp;amp;#8212; Past release manager (1.12.1-1.12.6 / 1.13.0-1.13.2)&lt;br /&gt;
* [mailto:isaac&amp;amp;#x40;sindominio&amp;amp;#x2E;net Isaac Clerencia] &amp;amp;#8212; Past release manager, Debian packager&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; Past release manager, internationalization manager, OpenPandora packager, A Tale of Two Brothers, German translation&lt;br /&gt;
* Noy &amp;amp;#8212; General purpose administration, unit balancing&lt;br /&gt;
* Pentarctagon&lt;br /&gt;
=== Internationalization Managers ===&lt;br /&gt;
* Cédric Duval &amp;amp;#8212; coder, internationalization manager&lt;br /&gt;
* David Philippi (Torangan) &amp;amp;#8212; internationalization manager, wescamp&lt;br /&gt;
* Mark Michelsen (skovbaer) &amp;amp;#8212; Slackware packager&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; administrator, release manager, internationalization manager, OpenPandora packager, A Tale of Two Brothers, german translation&lt;br /&gt;
* [mailto:susanna&amp;amp;#x2E;bjorverud&amp;amp;#x40;telia&amp;amp;#x2E;com Susanna Björverud] (sanna)&lt;br /&gt;
=== Trailers ===&lt;br /&gt;
* ancestral &amp;amp;#8212; 1.12 trailer&lt;br /&gt;
* Pedro Caseiro (Kasdel) &amp;amp;#8212; 1.14 trailer&lt;br /&gt;
* Felix Merveille (felixmerveille) &amp;amp;#8212; 1.16 trailer edits and additions&lt;br /&gt;
=== Artwork and Graphics ===&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; portrait director - focus on loyalists, trolls, monsters&lt;br /&gt;
* Francisco Muñoz (fmunoz) &amp;amp;#8212; founding artist and former lead artist, worked consistently on all aspects till around v0.7-0.9.&lt;br /&gt;
* Hogne Håskjold (frame/freim) &amp;amp;#8212; terrain art director, made much of the current terrains (esp. mountains)&lt;br /&gt;
* J.W. Bjerk ([[User:Eleazar|Eleazar]]) &amp;amp;#8212; terrain art director (esp. Chasm, Cave, Water), sprite animations, various visual tweaks&lt;br /&gt;
* James Woo (Pickslide) &amp;amp;#8212; portraits (major focus on orcs and campaigns, especially UtBS, TEI, TSoF)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portrait director - focus on mages/necromancers, elvish, naga, merfolk, and troll unit trees&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; sprite animation, various visual tweaks, titlescreen and campaign maps (v1.11+), water animations (v1.13+)&lt;br /&gt;
* Neoriceisgood &amp;amp;#8212; sprite creator and animator (major focus on drakes, dwarves, saurians)&lt;br /&gt;
* Pekka Aikio (pekka) &amp;amp;#8212; tiles, esp. castles, and attack icons&lt;br /&gt;
* Phil Barber (thespaceinvader) &amp;amp;#8212; Dwarf and Saurian portraits, most of the drake animations, and a large amount on other stuff, esp. the dwarves.&lt;br /&gt;
* Richard Kettering ([[User:Jetryl|Jetrel]]) &amp;amp;#8212; art director/slave, major focus on sprites, portraits, buildings, and icons&lt;br /&gt;
* Timo Honkasalo (Sgt. Groovy) &amp;amp;#8212; New high-res logo for the game&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Alex Jarocha-Ernst (Jormungandr) &amp;amp;#8212; portraits&lt;br /&gt;
* Christophe Anjard (Christophe33) &amp;amp;#8212; made many of the old (c. v0.6) terrains, and some sprites for the dwarves&lt;br /&gt;
* Erkki Lonkainen (Eternal) &amp;amp;#8212; created and animated many replacement sprites (esp. ogre, orc assassin &amp;amp; spear units, and cockatrice)&lt;br /&gt;
* Jason Lutes &amp;amp;#8212; portraits (major focus on humans, some campaign portraits)&lt;br /&gt;
* Johann de Venecia (Johann) &amp;amp;#8212; drew the new campaign story art for HttT&lt;br /&gt;
* Leonhard &amp;amp;#8212; made several of the new attack icons&lt;br /&gt;
* Marcus Rosén (sleepwalker) &amp;amp;#8212; Animations (esp. Saurians, Dwarves, Horseman), dunefolk sprites, and portraits (Mermaid Initiate &amp;amp; Dune Herbalist)&lt;br /&gt;
* Mark Goodenough (Ranger M) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Maximiliano Buis (Redeth) &amp;amp;#8212; Made nearly all of the idle animations, and some death animations (as of 1.3.1)&lt;br /&gt;
* Michael Gil de Muro (grp21) &amp;amp;#8212; portraits (for the campaign 'The Rise of Wesnoth')&lt;br /&gt;
* Moritz Göbelbecker (mog) &amp;amp;#8212; tiles, esp. swamp, encampment, ice, and work with lava/chasm&lt;br /&gt;
* Niall Burton (Leonard03) &amp;amp;#8212; Minimalistic logo render&lt;br /&gt;
* Peter Geinitz (Shadow/Wayfarer) &amp;amp;#8212; sprite creator and animator&lt;br /&gt;
* Robert Bolin (Zebulon) &amp;amp;#8212; tiles, sprite editing and animations&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Andrew James Patterson (Kamahawk) &amp;amp;#8212; sprites&lt;br /&gt;
* antwerpz &amp;amp;#8212; sprite creator/animator for old saurian units&lt;br /&gt;
* Diego Brea (Cobretti) &amp;amp;#8212; sprite creator/animator&lt;br /&gt;
* EEL (EELuminatus) &amp;amp;#8212; sprite animator, provided death animations for the woses, some of the orcs, and an attack animation for the revenant&lt;br /&gt;
* Eli Dupree (Elvish Pillager) &amp;amp;#8212; sprites and animations&lt;br /&gt;
* Eric Holdos (Rev. V!)&lt;br /&gt;
* Gareth Miller (Gafgarion) &amp;amp;#8212; made some early sprites/tiles&lt;br /&gt;
* Gerald Clears (Smok'em Jags) &amp;amp;#8212; sprite animator&lt;br /&gt;
* James Barton (Sangel) &amp;amp;#8212; sprites&lt;br /&gt;
* Jami &amp;amp;#8212; rogue death and red mage idle animations&lt;br /&gt;
* Jerzy Brzozowski (Mefisto) &amp;amp;#8212; Various sprites and animations, tropical forests.&lt;br /&gt;
* Jesse Holland (Kestenvarn) &amp;amp;#8212; map illustrator of old titlescreen and campaign maps (v1.1 - v1.10)&lt;br /&gt;
* Johanna Manninen (lohari) &amp;amp;#8212; edited tiles, ported freeciv tiles used in very early versions of wesnoth&lt;br /&gt;
* John Muccigrosso (Eponymous Archon) &amp;amp;#8212; made some early sprites, such as the human bowmen&lt;br /&gt;
* Kuno Raffin (lurker) &amp;amp;#8212; Various terrain artwork&lt;br /&gt;
* Michael Mielewczik (Mille) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Mikko Kraft (Deserter) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Musketaquid &amp;amp;#8212; animated windmill / stone path&lt;br /&gt;
* Slainte &amp;amp;#8212; made sprites for c. v0.6 mages, also made many of the old attack icons&lt;br /&gt;
* Simon Forsyth (Alarantalara) &amp;amp;#8212; cave terrain&lt;br /&gt;
* Stephen Metcalf (Neoskel) &amp;amp;#8212; major help with shadow standardization (over half the units), made some missing zombie variants&lt;br /&gt;
* Stephen Stone (Disto) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Svetac &amp;amp;#8212; made many of the old attack icons&lt;br /&gt;
* Tristan Millner (tatmf) &amp;amp;#8212; made old portrait of dwarven fighter&lt;br /&gt;
* Zhukov &amp;amp;#8212; sprite animator&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Aaron Redfern (A-Red) &amp;amp;#8212; Sprites and animations&lt;br /&gt;
* Adrian Sheehy (Major) &amp;amp;#8212; various sprites animations&lt;br /&gt;
* Alexander Brown (Cloud) &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Anton Ecker (Kaldred) &amp;amp;#8212; burnt villages&lt;br /&gt;
* battlestar &amp;amp;#8212; - some scenery graphics including burnt tent.&lt;br /&gt;
* Ben Wenzel (artisticdude) &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; New storm trident, staff and ankh item pictures, various attack icons, river ford tiles, drake and human city villages&lt;br /&gt;
* Bora Orcal (bera) &amp;amp;#8212; Goblin portrait sketches&lt;br /&gt;
* Cernunnos &amp;amp;#8212; merfolk villages&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; Icons for new editor and updated terrain icons&lt;br /&gt;
* Chris Wilson (Valkier) &amp;amp;#8212; portraits&lt;br /&gt;
* Christian Sirviö (Girgistian) &amp;amp;#8212; portraits (sketches), and some attack animations for the orcs&lt;br /&gt;
* Clinton Bell &amp;amp;#8212; various animations&lt;br /&gt;
* Dan Gerhards (beetlenaut) &amp;amp;#8212; various sprites and animations&lt;br /&gt;
* Daniel Borgmann (dborg) &amp;amp;#8212; semi-transparent map grid&lt;br /&gt;
* Daniel Foerster (pydsigner/pyndragon) &amp;amp;#8212; Icon overlays for the About dialog button&lt;br /&gt;
* Kwandulin &amp;amp;#8212; Standing animations (Skeleton Archer, Bone Shooter, Orcish Archer, Dwarvish Fighter, Ulfserker, Stalwart, Runesmith), minor fixes&lt;br /&gt;
* doofus-01 &amp;amp;#8212; orcish fort and villages, desert mountains, mine walls, sea forts, portraits for walking corpse and soulless&lt;br /&gt;
* Elena Astanina (ayona) &amp;amp;#8212; log-cabin villages&lt;br /&gt;
* Eric Butler (Erk) &amp;amp;#8212; desert and merfolk villages&lt;br /&gt;
* Evan Crook (Flametrooper) &amp;amp;#8212; sprite animator (TC conversion)&lt;br /&gt;
* Garrett Wessner (Stilgar) &amp;amp;#8212; gold coin pile&lt;br /&gt;
* Gideon Chia (Deonjo) &amp;amp;#8212; new 'units' icon for general status bar&lt;br /&gt;
* Guangcong Luo (Zarel) &amp;amp;#8212; Multiplayer status icons for 1.7.x&lt;br /&gt;
* Highhole &amp;amp;#8212; revised storm trident&lt;br /&gt;
* Homunculus &amp;amp;#8212; dead great tree terrain&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]]) &amp;amp;#8212; Minor item/unit edits; animated lit brazier; ported gryphon rider animation to generic gryphon; Ancient Lich for 1.12.x&lt;br /&gt;
* Irrevenant &amp;amp;#8212; Skeleton archer death and recruit animations, new ankh touch ups, new dark adept touch ups, elvish marshal standing animation&lt;br /&gt;
* Irwin Ismail (Swordy) &amp;amp;#8212; original projectile/attack icon for chakram&lt;br /&gt;
* Jason Frailey (Valdroni) &amp;amp;#8212; scorpion portrait&lt;br /&gt;
* Jimmy Olsson (Azlan) &amp;amp;#8212; made old icons for windows version&lt;br /&gt;
* Joakim Persson (JAP) &amp;amp;#8212; Knalgan flag set&lt;br /&gt;
* John Mercer (Stern) &amp;amp;#8212; Giant Rat graphics&lt;br /&gt;
* John-Robert Funck (XJaPaN) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Jonatan Alamà (tin) &amp;amp;#8212; made red logo used until before v1.0&lt;br /&gt;
* Justin Nichols (JustinOperable) &amp;amp;#8212; Portrait artwork&lt;br /&gt;
* Kim Holm (DUHH) &amp;amp;#8212; Portrait artwork&lt;br /&gt;
* Lukasz Wawrowski (inferno8) &amp;amp;#8212; Drake attack icons with fmunoz and map backgrounds for Isar’s Cross&lt;br /&gt;
* Lordlewis &amp;amp;#8212; mace item sprite&lt;br /&gt;
* Mattias Westlund (West) &amp;amp;#8212; new color cursors&lt;br /&gt;
* Nicholas Kerpan (Thrawn) &amp;amp;#8212; human thief portrait&lt;br /&gt;
* Pixelmind &amp;amp;#8212; various animations&lt;br /&gt;
* Randall Walls (slightcrazed) &amp;amp;#8212; sprite animator&lt;br /&gt;
* rhyging5 &amp;amp;#8212; various animations&lt;br /&gt;
* RusHHouR &amp;amp;#8212; New signpost (1.4.1)&lt;br /&gt;
* Samuel Wilson (megane) &amp;amp;#8212; random dice icon fix after 1.4.0&lt;br /&gt;
* Santiago Iborra (Quellion) &amp;amp;#8212; Portrait artwork&lt;br /&gt;
* Simeon Dear (Trilby) &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Zoomo &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Zaggy1024 &amp;amp;#8212; Wolf rider death animation&lt;br /&gt;
* Eisfrei &amp;amp;#8212; Elvish shaman idle animations&lt;br /&gt;
* Happy Wose &amp;amp;#8212; Wose idle frames and Elder wose death animation&lt;br /&gt;
* Wolfy &amp;amp;#8212; Female arch mage idle animation&lt;br /&gt;
* mystic x the unknown &amp;amp;#8212; Mage death animation&lt;br /&gt;
* Sonny T Yamada (SkyOne) &amp;amp;#8212; shadow standardization of many campaign units&lt;br /&gt;
* Vincent Langner (Vyncyn) &amp;amp;#8212; Walking Corpse and Soulless wolf variations, young roc base and attack sprite&lt;br /&gt;
* ZygoUgo &amp;amp;#8212; Giant Rat portrait&lt;br /&gt;
* ghype &amp;amp;#8212; sprite animation and dunefolk base frames&lt;br /&gt;
=== Music ===&lt;br /&gt;
* Aleksi Aubry-Carlson (Aleksi)&lt;br /&gt;
* Doug Kaufman (dkaufman) &amp;amp;#8212; http://dougkaufman.net/&lt;br /&gt;
* Gianmarco Leone (gmlion)&lt;br /&gt;
* Jeremy Nicoll (jeremy2/eltiare)&lt;br /&gt;
* Joseph Toscano (ZhayTee) &amp;amp;#8212; zhaymusic.com&lt;br /&gt;
* Mattias Westlund (West) &amp;amp;#8212; music coordinator/composer&lt;br /&gt;
* Ryan Reilly (Rain)&lt;br /&gt;
* Stephen Rozanc (TreizeCouleurs)&lt;br /&gt;
* Timothy Pinkham (TimothyP)&lt;br /&gt;
* Tyler Johnson&lt;br /&gt;
=== Sound Effects ===&lt;br /&gt;
* Corey Woodworth (woodwizzle) &amp;amp;#8212; hit and die sounds&lt;br /&gt;
* J.W. Bjerk ([[User:Eleazar|Eleazar]])&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; focus on attack, weapon and user interface sounds&lt;br /&gt;
* Adam Rinsky (Action Jack) &amp;amp;#8212; dwarf hit and die sounds&lt;br /&gt;
* Leonardo Magno Sampaio (leorock116) &amp;amp;#8212; mace, staff and club sounds&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Asa Swain (quartex) &amp;amp;#8212; Under the Burning Suns&lt;br /&gt;
* Astrid Halberkamp &amp;amp;#8212; Campaign maintenance and various improvements&lt;br /&gt;
* Benjamin Drieu&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; Campaign maintenance and various improvements&lt;br /&gt;
* Dacyn&lt;br /&gt;
* Dan Gerhards (beetlenaut) &amp;amp;#8212; Dead Water, Secrets of the Ancients&lt;br /&gt;
* David White (Sirp) &amp;amp;#8212; Heir to the Throne&lt;br /&gt;
* Eric J. Mesoy (Circon) &amp;amp;#8212; A Tale of Two Brothers&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; The Hammer of Thursagan&lt;br /&gt;
* esci &amp;amp;#8212; Descent into Darkness&lt;br /&gt;
* Francisco Muñoz (fmunoz) &amp;amp;#8212; founding artist and former lead artist, worked consistently on all aspects till around v0.7-0.9.&lt;br /&gt;
* James Spencer (Shade) &amp;amp;#8212; The Rise of Wesnoth&lt;br /&gt;
* Jeffrey 'Sigurd' Westcoat (SigurdFireDragon)&lt;br /&gt;
* Joseph Simmons (Turin) &amp;amp;#8212; The Eastern Invasion, The Sceptre of Fire&lt;br /&gt;
* Justin Zaun (jzaun) &amp;amp;#8212; coder, scenario designer&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; redesign of various scenarios and other enhancement&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; A Tale of Two Brothers&lt;br /&gt;
* Santi/fnaek &amp;amp;#8212; The Legend of Wesmere&lt;br /&gt;
* Scott Klempner &amp;amp;#8212; Heir to the Throne, The Rise of Wesnoth, Liberty&lt;br /&gt;
* Taurus &amp;amp;#8212; Northern Rebirth, Son of the Black-Eye&lt;br /&gt;
* William Carey (aelius) &amp;amp;#8212; The South Guard&lt;br /&gt;
=== Multiplayer Maps and Balancing ===&lt;br /&gt;
* George Birthisel (happygrue/Wintermute) &amp;amp;#8212; Unit balancing, Dunefolk Era&lt;br /&gt;
* Hejnewar &amp;amp;#8212; balancing for Age of Heroes, revised dunefolk&lt;br /&gt;
* Jake Bailey (jb) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* Joshua Northey (Becephalus) &amp;amp;#8212; multiplayer maps (mostly 2vs2 and up)&lt;br /&gt;
* Mike Quiñones (Doc Paterson) &amp;amp;#8212; multiplayer maps (mostly 1vs1)&lt;br /&gt;
* Noy &amp;amp;#8212; general purpose administration, unit balancing&lt;br /&gt;
* Peter Groen (pg) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* Ruben Philipp Wickenhäuser (The Very Uhu) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* Soliton &amp;amp;#8212; unit balancing&lt;br /&gt;
* Tom Chance (telex4) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* [mailto:kleinfel&amp;amp;#x40;wpi&amp;amp;#x2E;edu Zack Kleinfeld] &amp;amp;#8212; multiplayer maps, unit balancing&lt;br /&gt;
=== Packagers ===&lt;br /&gt;
* ancestral &amp;amp;#8212; Apple OS X packager (1.12.1 and later)&lt;br /&gt;
* [mailto:hrubymar10&amp;amp;#x40;gmail&amp;amp;#x2E;com Martin Hrubý] ([[User:hrubymar10|hrubymar10]]) &amp;amp;#8212; Apple macOS packager (1.13.11 and later)&lt;br /&gt;
* Matthias Schoeck (mattsc) &amp;amp;#8212; Apple OS X packager (1.11.8 and later)&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; OpenPandora packager&lt;br /&gt;
* Rhonda D'Vine (Rhonda) &amp;amp;#8212; Debian/Ubuntu packager&lt;br /&gt;
* Sebastian Kölle (aquileia) &amp;amp;#8212; Visual Studio SDK maintainer&lt;br /&gt;
* Sergey Popov (loonycyborg) &amp;amp;#8212; Microsoft Windows packager and MinGW SDK maintainer&lt;br /&gt;
* [mailto:ports&amp;amp;#x40;toco-domains&amp;amp;#x2E;de Torsten Zühlsdorff] &amp;amp;#8212; FreeBSD Packager&lt;br /&gt;
* Vincent Cheng (vincent_c) &amp;amp;#8212; Debian/Ubuntu packager&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* [mailto:ben&amp;amp;#x40;happyspork&amp;amp;#x2E;com Ben Anderman] (crimson_penguin) &amp;amp;#8212; Apple OS X packager (for 1.5.6 and later)&lt;br /&gt;
* Cyril Bouthors (CyrilB) &amp;amp;#8212; Debian packager, patron&lt;br /&gt;
* Darryl Dixon&lt;br /&gt;
* edge&lt;br /&gt;
* Isaac Clerencia &amp;amp;#8212; Debian packager&lt;br /&gt;
* Jay Hopping&lt;br /&gt;
* Jörg Hinrichs (Yogi Bear/YogiHH) &amp;amp;#8212; Microsoft Windows packager&lt;br /&gt;
* Laurent Wacrenier (lwa) &amp;amp;#8212; Apple OS X packager (for v1.4 and before)&lt;br /&gt;
* Marcin Konicki (ahwayakchih) &amp;amp;#8212; BeOS packager&lt;br /&gt;
* Marcus Phillips (Sithrandel) &amp;amp;#8212; Apple OS X packager (for v1.0 and before)&lt;br /&gt;
* Mark Michelsen (skovbaer) &amp;amp;#8212; Slackware packager&lt;br /&gt;
* Muhammad Amir Ayub (anakayub) &amp;amp;#8212; Apple OS X packager&lt;br /&gt;
* Piotr Cychowski (Mist/cycholka) &amp;amp;#8212; Microsoft Windows packager&lt;br /&gt;
* singalen &amp;amp;#8212; iOS port&lt;br /&gt;
* Simon Forsyth (Alarantalara) &amp;amp;#8212; Apple OS X Packager (1.9.6 and later)&lt;br /&gt;
* Vlad Glagolev (Stealth) &amp;amp;#8212; OpenBSD packager&lt;br /&gt;
=== Miscellaneous Contributors ===&lt;br /&gt;
* Aaron Keisch-Walter (Exasperation)&lt;br /&gt;
* Aaron Winter (Byteron)&lt;br /&gt;
* Adam Leffew&lt;br /&gt;
* Adrian Iosif (Zappaman)&lt;br /&gt;
* Aishiko &amp;amp;#8212; Unit instance recall cost implementation&lt;br /&gt;
* Alek Bollig (binarycoder)&lt;br /&gt;
* Alesis Novik&lt;br /&gt;
* Aline Riss (akihara)&lt;br /&gt;
* Amir Hassan (kallaballa)&lt;br /&gt;
* Andris Szell (bandita137)&lt;br /&gt;
* André Knispel&lt;br /&gt;
* Andrea Palmatè (afxgroup)&lt;br /&gt;
* Andrius Šilinskas (thunderstruck)&lt;br /&gt;
* Andrius Štikonas&lt;br /&gt;
* Anja Keicher (ayne)&lt;br /&gt;
* Astrid Halberkamp&lt;br /&gt;
* Ben Anderman (crimson_penguin) &amp;amp;#8212; unit list&lt;br /&gt;
* Boldizsár Lipka (lipk)&lt;br /&gt;
* Brilliand&lt;br /&gt;
* Burkay Özdemir (Velory) &amp;amp;#8212; Poisoning improvement for Formula AI&lt;br /&gt;
* chisquare130&lt;br /&gt;
* Chris Carpenter (mordocai)&lt;br /&gt;
* Chris Hopman (cjhopman)&lt;br /&gt;
* Chris Mann (WildPenguin) &amp;amp;#8212; Emacs WML-mode&lt;br /&gt;
* Chusslove Illich (caslav.ilic) &amp;amp;#8212; wmlxgetext improvements&lt;br /&gt;
* David Slabý (blaf)&lt;br /&gt;
* Daniel Bruegmann&lt;br /&gt;
* David Mikos (Coffee) &amp;amp;#8212; Coder, animation framework improvements.&lt;br /&gt;
* Denny Vaccaro (endercoaster)&lt;br /&gt;
* Derek (Gambit)&lt;br /&gt;
* devnexen&lt;br /&gt;
* DisherProject&lt;br /&gt;
* Dmitry K. (nephro)&lt;br /&gt;
* Doug Rosvick ([[User:dlr365|dlr365]])&lt;br /&gt;
* dorng&lt;br /&gt;
* dreamer-88&lt;br /&gt;
* Dugi &amp;amp;#8212; Context-free name generator&lt;br /&gt;
* Duthlet&lt;br /&gt;
* EarthCake&lt;br /&gt;
* Edward Chernenko&lt;br /&gt;
* Ekdohibs&lt;br /&gt;
* elvish_sovereign&lt;br /&gt;
* Ely Levy (Nakee)&lt;br /&gt;
* Étienne Simon (ejls)&lt;br /&gt;
* Etkin Baris Ozgul (pokhbocee) &amp;amp;#8212; Lua AI&lt;br /&gt;
* Eugene Kosov (kevg)&lt;br /&gt;
* [mailto:eugeni&amp;amp;#x2E;stepanov&amp;amp;#x40;gmail&amp;amp;#x2E;com Evgeniy Stepanov] &amp;amp;#8212; NativeClient port&lt;br /&gt;
* Evgeny Kapun&lt;br /&gt;
* FAAB&lt;br /&gt;
* Federico Pasco (neverEnough)&lt;br /&gt;
* Fedor Khod'kov (teddy/fkhodkov)&lt;br /&gt;
* Felix Bauer (flix)&lt;br /&gt;
* Fernando Carmona (Ferk)&lt;br /&gt;
* Floris Kint (Grimling)&lt;br /&gt;
* Francesco Gigli (Jaramir)&lt;br /&gt;
* Frank Richter (res)&lt;br /&gt;
* Frédéric Wagner&lt;br /&gt;
* Fredrik Wikstrom (salass00)&lt;br /&gt;
* galegosimpatico&lt;br /&gt;
* Galen Brooks (fluffbeast)&lt;br /&gt;
* gh0st &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* Gregory Gauthier (rjaguar3)&lt;br /&gt;
* Groggy Dice (groggydice) &amp;amp;#8212; wmllint enhancements&lt;br /&gt;
* [mailto:kevin&amp;amp;#x2E;xgr&amp;amp;#x40;gmail&amp;amp;#x2E;com Guorui Xi] (Kevin_Xi)&lt;br /&gt;
* Hans-Joachim Gurt (HaJo)&lt;br /&gt;
* Herb Pah (haiz)&lt;br /&gt;
* holius-fr&lt;br /&gt;
* IceTyp&lt;br /&gt;
* ilyapopov&lt;br /&gt;
* J. Tyne (JaMiT)&lt;br /&gt;
* J.R. Blain (Cowboy)&lt;br /&gt;
* jstitch&lt;br /&gt;
* Jacek Kominek (BroodKiller)&lt;br /&gt;
* [mailto:benetnash&amp;amp;#x40;icpnet&amp;amp;#x2E;pl Jan Polak] (benetnash) &amp;amp;#8212; Formula AI contributions&lt;br /&gt;
* Jan Zvánovec (jaz)&lt;br /&gt;
* [mailto:babataz&amp;amp;#x40;gmail&amp;amp;#x2E;com Jean-Baptiste Poittevin] (BBT)&lt;br /&gt;
* Jeff Breidenbach (jab) &amp;amp;#8212; Bilinear interpolation&lt;br /&gt;
* [mailto:jleldridge27&amp;amp;#x40;gmail&amp;amp;#x2E;com Jeffrey Eldridge] (jleldridge)&lt;br /&gt;
* Jérôme (segfault)&lt;br /&gt;
* Jim Carroll (Jimm)&lt;br /&gt;
* Jody Northup (Upthorn) &amp;amp;#8212; Prospective student (world persistence)&lt;br /&gt;
* Joeri Melis&lt;br /&gt;
* Joey L. Maalouf (JDog)&lt;br /&gt;
* [mailto:john&amp;amp;#x40;jo&amp;amp;#x2E;hnanthony&amp;amp;#x2E;com John Anthony] &amp;amp;#8212; campaignd work, mainly security-based&lt;br /&gt;
* John B. Messerly (jbm)&lt;br /&gt;
* John Harvey (johndh) &amp;amp;#8212; minor race descriptions; bats, goblins, mechanical, merfolk, monster, naga, ogre&lt;br /&gt;
* Jonathan Combs (ScegfOd) &amp;amp;#8212; log activating dialog&lt;br /&gt;
* Jonas Lihnell (Roze)&lt;br /&gt;
* Jonas Kölker&lt;br /&gt;
* [mailto:jorda&amp;amp;#x40;ettin&amp;amp;#x2E;org Jordà Polo] (ettin) &amp;amp;#8212; website, i18n, ui&lt;br /&gt;
* Josef Reidinger (qk)&lt;br /&gt;
* Joseph Gelfand&lt;br /&gt;
* Joshua Hudson&lt;br /&gt;
* josteph&lt;br /&gt;
* Jozrael&lt;br /&gt;
* Justin DiSabatino (Turuk)&lt;br /&gt;
* Kamil Kaczmarczyk (lampak)&lt;br /&gt;
* [mailto:karl&amp;amp;#x2E;miller&amp;amp;#x2E;km&amp;amp;#x40;gmail&amp;amp;#x2E;com Karl Miller] (karlm)&lt;br /&gt;
* Karol Kozub (automagic)&lt;br /&gt;
* Kevin Montalva (Ryckes)&lt;br /&gt;
* Kevin Yap (iKevinY)&lt;br /&gt;
* Konrad Schwede (Konrad2)&lt;br /&gt;
* Kristoffer Grönlund (kegie)&lt;br /&gt;
* Krogen&lt;br /&gt;
* Laurent Birtz&lt;br /&gt;
* legoktm&lt;br /&gt;
* leonardoInf&lt;br /&gt;
* lilinitsy&lt;br /&gt;
* Lovens Weche (LovCAPONE)&lt;br /&gt;
* Luiz Fernando de Faria Pereira (lfernando)&lt;br /&gt;
* [mailto:lutheroto&amp;amp;#x40;gmail&amp;amp;#x2E;com Luther Thompson]&lt;br /&gt;
* lv-zheng&lt;br /&gt;
* [mailto:code&amp;amp;#x40;hryniuk&amp;amp;#x2E;pl Łukasz Hryniuk]&lt;br /&gt;
* Maksim Orlovich (SadEagle)&lt;br /&gt;
* Mark McGuire (TronPaul)&lt;br /&gt;
* Martin Bede &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* [mailto:hrubymar10&amp;amp;#x40;gmail&amp;amp;#x2E;com Martin Hrubý] ([[User:hrubymar10|hrubymar10]])&lt;br /&gt;
* Mateusz Kolaczek (PL_kolek)&lt;br /&gt;
* Matt Renfer (Des) &amp;amp;#8212; Prose revision&lt;br /&gt;
* Matthias Schoeck (mattsc) &amp;amp;#8212; AI improvements&lt;br /&gt;
* matthiaskrgr &amp;amp;#8212; Running address sanitizer to catch leaks&lt;br /&gt;
* Maxim Biro (nurupo)&lt;br /&gt;
* Maximilian Fricke (madmax28)&lt;br /&gt;
* Maximilian Lupke (malumalu)&lt;br /&gt;
* Marius Spix (spixi)&lt;br /&gt;
* Michael Flowers (MJ)&lt;br /&gt;
* Michael Schmahl&lt;br /&gt;
* Michael Strebel (Nostromus)&lt;br /&gt;
* midzer&lt;br /&gt;
* Miguel Zapico (elricz)&lt;br /&gt;
* mstrebel&lt;br /&gt;
* [mailto:greywhind&amp;amp;#x40;users&amp;amp;#x2E;sourceforge&amp;amp;#x2E;net Nathan Partlan] ([[User:Greywhind|Greywhind]])&lt;br /&gt;
* [mailto:nathan&amp;amp;#x2E;b&amp;amp;#x2E;walker&amp;amp;#x40;vanderbilt&amp;amp;#x2E;edu Nathan Walker] (RiftWalker)&lt;br /&gt;
* neoedmund&lt;br /&gt;
* newfrenchy83&lt;br /&gt;
* Niall Burton (Leonard03)&lt;br /&gt;
* niegenug&lt;br /&gt;
* Nobun &amp;amp;#8212; wmlxgettext&lt;br /&gt;
* [mailto:zabivator&amp;amp;#x40;gmail&amp;amp;#x2E;com Oleg Tsarev]&lt;br /&gt;
* Olivier Faure (PoignardAzur)&lt;br /&gt;
* [mailto:asqueados&amp;amp;#x40;gmail&amp;amp;#x2E;com Pablo J. Urbano Santos] ([[User:Lord Ork|Lord Ork]])&lt;br /&gt;
* Patryk Obara (dreamer_)&lt;br /&gt;
* Paul Smedley (Creeping)&lt;br /&gt;
* Paŭlo Ebermann ([[User:Pauxlo|Pauxlo]])&lt;br /&gt;
* PBechon&lt;br /&gt;
* Peter Elmers&lt;br /&gt;
* Peter Mawhorter ([[User:solsword|solsword]]) &amp;amp;#8212; Python TC script upgrade&lt;br /&gt;
* Petr Sobotka (Pietro)&lt;br /&gt;
* [mailto:root&amp;amp;#x40;delroth&amp;amp;#x2E;is-a-geek&amp;amp;#x2E;org Pierre Bourdon] (delroth)&lt;br /&gt;
* pquentin&lt;br /&gt;
* Pranav Deshpande (universecoder)&lt;br /&gt;
* Priit Laes (plaes)&lt;br /&gt;
* Pubudu Gunawardena (ugudu)&lt;br /&gt;
* Qi Mo (qmo2015)&lt;br /&gt;
* Quetzalcoatl&lt;br /&gt;
* Randy Kostiuk (Randypk) &amp;amp;#8212; Bug fixes&lt;br /&gt;
* RatArmy (fujimo-t)&lt;br /&gt;
* Reuben Rakete (rocketbang)&lt;br /&gt;
* Richard Yao (srk9) &amp;amp;#8212; Bug fixes&lt;br /&gt;
* Rikard Falkeborn&lt;br /&gt;
* Robert Spencer &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* Robert Wallace (Robertdebrus)&lt;br /&gt;
* Rocco J Carello (rogue)&lt;br /&gt;
* Roland Hautz (duncan_shriek)&lt;br /&gt;
* Rolf Sievers (Lizard)&lt;br /&gt;
* Ronny Standtke&lt;br /&gt;
* rrigby&lt;br /&gt;
* Ryan Frame&lt;br /&gt;
* Ryan Henszey&lt;br /&gt;
* Ryan Roden-Corrent (rcorre) &amp;amp;#8212; Hotkey release and scroll key rebinding&lt;br /&gt;
* [mailto:sachith500&amp;amp;#x40;gmail&amp;amp;#x2E;com Sachith Seneviratne] (sachith500) &amp;amp;#8212; Bug fixes at the moment. GSoC Aspirant&lt;br /&gt;
* Samuel Kim &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* Sean Yeh&lt;br /&gt;
* Sebastian Goll (afran)&lt;br /&gt;
* Sebastian Kölle (aquileia)&lt;br /&gt;
* Serge Martin (EdB)&lt;br /&gt;
* [mailto:stomasortiz&amp;amp;#x40;gmail&amp;amp;#x2E;com Sergio Tomás Ortiz]&lt;br /&gt;
* Severin Glöckner (Shiki, Sevu)&lt;br /&gt;
* Simon Forsyth (Alarantalara)&lt;br /&gt;
* [mailto:simon_smith&amp;amp;#x40;zen&amp;amp;#x2E;co&amp;amp;#x2E;uk Simon Smith] ([[User:Simons_Mith|Simons Mith]]) &amp;amp;#8212; Style guide, help with the application of the style guide, and some tips&lt;br /&gt;
* SoapGentoo&lt;br /&gt;
* starius&lt;br /&gt;
* Stéphane Gimenez (gim)&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* [mailto:sylecn&amp;amp;#x40;gmail&amp;amp;#x2E;com sylecn]&lt;br /&gt;
* [mailto:nsytyi&amp;amp;#x40;gmail&amp;amp;#x2E;com Sytyi Nick] (Sytyi) &amp;amp;#8212; WML validation&lt;br /&gt;
* [mailto:ptablot&amp;amp;#x40;mopong&amp;amp;#x2E;net Talbot Pierre] (Trademark)&lt;br /&gt;
* Tamas K. (negusnyul)&lt;br /&gt;
* techtonik&lt;br /&gt;
* the_beagle &amp;amp;#8212; Wose race description&lt;br /&gt;
* The Gnat&lt;br /&gt;
* Thibault Févry (iwontbecreative) &amp;amp;#8212; Some GCI tasks and utils/wiki_grabber.py cleanup.&lt;br /&gt;
* Thom Diment (UnwiseOwl)&lt;br /&gt;
* [mailto:hankerspace&amp;amp;#x40;gmail&amp;amp;#x2E;com Thomas Martinet] (hankerspace)&lt;br /&gt;
* [mailto:thomas&amp;amp;#x2E;prevost&amp;amp;#x40;gmail&amp;amp;#x2E;com Thomas Prevost] (zancdar)&lt;br /&gt;
* Thonsew&lt;br /&gt;
* Thorny23&lt;br /&gt;
* Tobias Frei (ToBeFree)&lt;br /&gt;
* Tomasz Sikorski (Tomsik)&lt;br /&gt;
* Tommy Schmitz&lt;br /&gt;
* Tommy (yobbo)&lt;br /&gt;
* Toom Lõhmus (Ravana)&lt;br /&gt;
* tsr&lt;br /&gt;
* Valentin Deschaintre (Zazweda, Epyde) &amp;amp;#8212; Zone guardian Micro AI&lt;br /&gt;
* vitiv &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* [mailto:viy&amp;amp;#x40;altlinux&amp;amp;#x2E;org viy]&lt;br /&gt;
* Vladimír Slávik &amp;amp;#8212; Miscellaneous text formatting and translation engine related help&lt;br /&gt;
* vn971, vgaming&lt;br /&gt;
* Wedge009&lt;br /&gt;
* Yang Yifan (Xara)&lt;br /&gt;
* Zas&lt;br /&gt;
=== Bots ===&lt;br /&gt;
* CIA&lt;br /&gt;
* irker&lt;br /&gt;
* janebot&lt;br /&gt;
* shikadibot&lt;br /&gt;
* wesbot&lt;br /&gt;
== Translators ==&lt;br /&gt;
=== Afrikaans Translation ===&lt;br /&gt;
* András Salamon (ott)&lt;br /&gt;
* Erhard Eiselen&lt;br /&gt;
* Len van Dalsen (Numbers13) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Nico Oliver (nicoza)&lt;br /&gt;
* Renier Maritz&lt;br /&gt;
=== Ancient Greek Translation ===&lt;br /&gt;
=== Arabic Translation ===&lt;br /&gt;
* Amnay Mokhtari&lt;br /&gt;
=== Asturian Translation ===&lt;br /&gt;
=== Basque Translation ===&lt;br /&gt;
* Alfredo Beaumont (ziberpunk)&lt;br /&gt;
* Julen Landa (genars)&lt;br /&gt;
* Mikel Olasagasti (Hey_neken)&lt;br /&gt;
=== Bulgarian Translation ===&lt;br /&gt;
* Anton Tsigularov (Atilla)&lt;br /&gt;
* Bono Nonchev&lt;br /&gt;
* Denica Mincheva (Deni)&lt;br /&gt;
* Georgi Dimitrov (oblak)&lt;br /&gt;
* Ivan Petrov (TheWhiteKnight) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Nikolay Vladimirov (Turki)&lt;br /&gt;
* Steven Genchev (blademaster83) &lt;br /&gt;
* Valentin Yankov  (kartacha) &lt;br /&gt;
=== Catalan Translation ===&lt;br /&gt;
* Carles Company (brrr)&lt;br /&gt;
* Dan Rosàs Garcia (focks)&lt;br /&gt;
* Daniel López (Azazelo)&lt;br /&gt;
* Joan Queralt&lt;br /&gt;
* Jonatan Alamà (tin)&lt;br /&gt;
* [mailto:jorda&amp;amp;#x40;ettin&amp;amp;#x2E;org Jordà Polo] (ettin)&lt;br /&gt;
* Jose Gordillo (kilder)&lt;br /&gt;
* J.R. Dolcet Castro (Malin Keshar)&lt;br /&gt;
* Marc Orcau&lt;br /&gt;
* Mark Recasens&lt;br /&gt;
* [mailto:miquel&amp;amp;#x2E;angel&amp;amp;#x2E;burgos&amp;amp;#x40;gmail&amp;amp;#x2E;com Miquel-Àngel Burgos i Fradeja] &amp;amp;#8212; current maintainer&lt;br /&gt;
* Pau Rul·lan Ferragut&lt;br /&gt;
* Roberto Garcia (Motxales)&lt;br /&gt;
=== Chinese Translation ===&lt;br /&gt;
* AxalaraFlameheart (AxalaraFlame)&lt;br /&gt;
* Brian lee&lt;br /&gt;
* chisquare130&lt;br /&gt;
* [mailto:cloudidust&amp;amp;#x40;gmail&amp;amp;#x2E;com CloudiDust] ([[User:CloudiDust|CloudiDust]]) &amp;amp;#8212; current maintainer&lt;br /&gt;
* cryaciccl&lt;br /&gt;
* Dionysus&lt;br /&gt;
* 逆天的高级菜鸟 (Gaojicainiao)&lt;br /&gt;
* Henry Zhu (Hardwood) &amp;amp;#8212; iOS announcements translation into Chinese&lt;br /&gt;
* Huang Hongye (Dugucloud) &amp;amp;#8212; translation and image localization&lt;br /&gt;
* Huang Huan&lt;br /&gt;
* Huang Lechuan&lt;br /&gt;
* leaf&lt;br /&gt;
* Luojie-dune&lt;br /&gt;
* MrKing&lt;br /&gt;
* 网上佳公子&lt;br /&gt;
* Owlet&lt;br /&gt;
* pianton&lt;br /&gt;
* SealMe&lt;br /&gt;
* spider5&lt;br /&gt;
* StephDC&lt;br /&gt;
* [mailto:sylecn&amp;amp;#x40;gmail&amp;amp;#x2E;com sylecn]&lt;br /&gt;
* Teamzhangmeng&lt;br /&gt;
* vinneymail&lt;br /&gt;
* wind&lt;br /&gt;
* Yifan&lt;br /&gt;
* yym514&lt;br /&gt;
* zen&lt;br /&gt;
=== Chinese (Taiwan) Translation ===&lt;br /&gt;
* 楊綮銘&lt;br /&gt;
* 李昆融&lt;br /&gt;
* 李信融&lt;br /&gt;
=== Croatian Translation ===&lt;br /&gt;
* Ivica Đurenec (charlieh65)&lt;br /&gt;
* Nino Gunjača&lt;br /&gt;
=== Czech Translation ===&lt;br /&gt;
* Alexander Slávik (Olin)&lt;br /&gt;
* Anežka Bubeníčková (Bubu)&lt;br /&gt;
* Čestmír Houska&lt;br /&gt;
* David Nečas (Yeti)&lt;br /&gt;
* David Novotný (Draqen)&lt;br /&gt;
* [mailto:jan&amp;amp;#x2E;dedic&amp;amp;#x40;gmail&amp;amp;#x2E;com Jaromír Dědič]&lt;br /&gt;
* Karel Doleček&lt;br /&gt;
* Lukáš Faltýnek&lt;br /&gt;
* [mailto:hrubymar10&amp;amp;#x40;gmail&amp;amp;#x2E;com Martin Hrubý] ([[User:hrubymar10|hrubymar10]])&lt;br /&gt;
* Martin Šín&lt;br /&gt;
* Michal Žejdl&lt;br /&gt;
* Mintaka&lt;br /&gt;
* [mailto:tapik&amp;amp;#x40;buchtovi&amp;amp;#x2E;cz Oto Buchta] ([[User:Tapik|tapik]])&lt;br /&gt;
* Petr Kopač (Ferda)&lt;br /&gt;
* Petr Kovár (Juans)&lt;br /&gt;
* Rudolf Orság&lt;br /&gt;
* Septim&lt;br /&gt;
* Sofronius&lt;br /&gt;
* Vít Komárek&lt;br /&gt;
* Vít Krčál&lt;br /&gt;
* Vladimír Slávik&lt;br /&gt;
=== Danish Translation ===&lt;br /&gt;
* Anders K. Madsen (madsen)&lt;br /&gt;
* Ask Hjorth Larsen&lt;br /&gt;
* Bjarke Sørensen (basher)&lt;br /&gt;
* Jesper Fuglsang Wolff (ulven)&lt;br /&gt;
* Joe Hansen&lt;br /&gt;
* Kenneth Nielsen&lt;br /&gt;
* Mark Michelsen (skovbaer)&lt;br /&gt;
* Mathias Bundgaard Svensson (freaken)&lt;br /&gt;
* Ole Laursen&lt;br /&gt;
=== Dutch Translation ===&lt;br /&gt;
* [mailto:AI0867&amp;amp;#x40;gmail&amp;amp;#x2E;com Alexander van Gessel] (AI/AI0867) &amp;amp;#8212; previous translation maintainer&lt;br /&gt;
* Arne Deprez&lt;br /&gt;
* Astrid Halberkamp&lt;br /&gt;
* Floris Kint (Grimling)&lt;br /&gt;
* Foppe Benedictus&lt;br /&gt;
* [mailto:oudshoorn&amp;amp;#x40;eitri&amp;amp;#x2E;nl IJsbrand Oudshoorn]&lt;br /&gt;
* Joeri Melis&lt;br /&gt;
* Jon Jacobs&lt;br /&gt;
* Koen Douterloigne&lt;br /&gt;
* Koen Vervloesem (koan)&lt;br /&gt;
* Lala&lt;br /&gt;
* Maarten Albrecht&lt;br /&gt;
* Merijn de Vet &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Pieter Vermeylen (Onne)&lt;br /&gt;
* Rico van Coevorden&lt;br /&gt;
* Rob van der Vleugel&lt;br /&gt;
* Roel Thijs (Roel)&lt;br /&gt;
* Roger Koot&lt;br /&gt;
* Thomas Hugo de Groot&lt;br /&gt;
* Tobe Deprez&lt;br /&gt;
* WimPapa&lt;br /&gt;
=== English (GB) Translation ===&lt;br /&gt;
* András Salamon (ott)&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
* pjr&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* Thomas Hockings ([[User:Deusite|Deusite]])&lt;br /&gt;
* Wedge009&lt;br /&gt;
=== English (Shaw) Translation ===&lt;br /&gt;
* [mailto:arcriley&amp;amp;#x40;ubuntu&amp;amp;#x2E;com Arc Riley] ([[User:ArcRiley|ArcRiley]]) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* [mailto:reportingsjr&amp;amp;#x40;gmail&amp;amp;#x2E;com Jon Neal] (reportingsjr)&lt;br /&gt;
* [mailto:thomas&amp;amp;#x40;thurman&amp;amp;#x2E;org&amp;amp;#x2E;uk Thomas Thurman] (marnanel)&lt;br /&gt;
=== Esperanto Translation ===&lt;br /&gt;
* Aleksej Korgenkov (Grimpanto)&lt;br /&gt;
* Francesco Lorenzon (Likso)&lt;br /&gt;
* Ľubo Fajth&lt;br /&gt;
* Maarten Albrecht&lt;br /&gt;
* Rastislav Šarišský (Asto)&lt;br /&gt;
=== Estonian Translation ===&lt;br /&gt;
* Kaido Kikkas (UncleOwl)&lt;br /&gt;
* Mart Tõnso&lt;br /&gt;
=== Filipino Translation ===&lt;br /&gt;
* Joset Anthony Zamora (eradicus)&lt;br /&gt;
* Karen Eve Eso (keeve)&lt;br /&gt;
=== Finnish Translation ===&lt;br /&gt;
* Ankka&lt;br /&gt;
* Jarkko Patteri (Jarkko)&lt;br /&gt;
* Jussi Rautio (jgrr)&lt;br /&gt;
* kko&lt;br /&gt;
* Matias Parmala&lt;br /&gt;
* Matias Pigg&lt;br /&gt;
* Mikko Nikkilä (Miccoh)&lt;br /&gt;
* Mikko Kraft (deserter)&lt;br /&gt;
* Miriam Green&lt;br /&gt;
* Niklas Laxström (Nikerabbit)&lt;br /&gt;
* paxed&lt;br /&gt;
* Samu Voutilainen (Smar)&lt;br /&gt;
* Santtu Pajukanta (Japsu)&lt;br /&gt;
* Simo Sutela&lt;br /&gt;
* Veikko Pukkila (swege)&lt;br /&gt;
=== French Translation ===&lt;br /&gt;
* Antoine Garnier&lt;br /&gt;
* Antoine Imboden&lt;br /&gt;
* Aurélien Brevers (Breversa)&lt;br /&gt;
* Aurélien Paulus&lt;br /&gt;
* Arnaud Garoux (La vie en wose)&lt;br /&gt;
* Benoit Astruc&lt;br /&gt;
* [mailto:benoit&amp;amp;#x2E;timbert&amp;amp;#x40;free&amp;amp;#x2E;fr Benoît Timbert] ([[User:Noyga|Noyga]]) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Bruno Fève (PP)&lt;br /&gt;
* Cédric Duval&lt;br /&gt;
* Damian Gryski (dmg)&lt;br /&gt;
* [[User:Damien|Damien Jacquot]] &amp;amp;#8212; lead translator&lt;br /&gt;
* DaringTremayne&lt;br /&gt;
* David Pradier&lt;br /&gt;
* Éric Pierre (Gari)&lt;br /&gt;
* Fabrice Boulakia&lt;br /&gt;
* Florence Guettaa (inflow)&lt;br /&gt;
* François Mariage (Paquito)&lt;br /&gt;
* François Orieux&lt;br /&gt;
* Geoffroy Douillié ([[User:Gdou|gdou]])&lt;br /&gt;
* Gérard Bodin (Gnork)&lt;br /&gt;
* Guillaume Delacourt&lt;br /&gt;
* Guillaume Duwelz-Rebert&lt;br /&gt;
* Guillaume Guigou&lt;br /&gt;
* [mailto:massart&amp;amp;#x2E;guillaume&amp;amp;#x40;wanadoo&amp;amp;#x2E;fr Guillaume Massart] (Piou2fois)&lt;br /&gt;
* Guillaume Melquiond (silene)&lt;br /&gt;
* Guillaume Pascal&lt;br /&gt;
* Jean Privat (Tout)&lt;br /&gt;
* Jean-Louis Passerin (Zoltic)&lt;br /&gt;
* Jean-Luc Menut&lt;br /&gt;
* Jean-Luc Richard (Le Gnome)&lt;br /&gt;
* Jean-Joseph Paget&lt;br /&gt;
* Jehan Hysseo (Jey)&lt;br /&gt;
* Jérémy Rosen (Boucman)&lt;br /&gt;
* Julien Moncel&lt;br /&gt;
* Julien Tailleur&lt;br /&gt;
* Marc Scheffer&lt;br /&gt;
* Mathieu Guilbaud&lt;br /&gt;
* Mendes Oulamara&lt;br /&gt;
* Michel Poléni (Thanatloc)&lt;br /&gt;
* Nicolas Boudin (Blurgk)&lt;br /&gt;
* [mailto:philippe&amp;amp;#x2E;plantier&amp;amp;#x40;naema&amp;amp;#x2E;org Philippe Plantier] ([[User:Ayin|Ayin]])&lt;br /&gt;
* Philippe Rasquinet&lt;br /&gt;
* Pierre Rudloff&lt;br /&gt;
* Sébastien Raynaud (Galactic turkey)&lt;br /&gt;
* Sylvain Jeanne&lt;br /&gt;
* Thierry Bothorel&lt;br /&gt;
* Solena Le Moigne&lt;br /&gt;
* William Dupré&lt;br /&gt;
* [mailto:ydirson&amp;amp;#x40;altern&amp;amp;#x2E;org Yann Dirson]&lt;br /&gt;
=== Friulian Translation ===&lt;br /&gt;
=== Galician Translation ===&lt;br /&gt;
* [mailto:adriyetichaves&amp;amp;#x40;gmail&amp;amp;#x2E;com Adrián Chaves Fernández] (Gallaecio)&lt;br /&gt;
* Fran Diéguez&lt;br /&gt;
* Jacobo Abel Fernández García &amp;amp;#8212; inactive&lt;br /&gt;
* Javier Pico&lt;br /&gt;
* Manuel Meixide&lt;br /&gt;
* Marce Villarino&lt;br /&gt;
* [mailto:leandro&amp;amp;#x2E;regueiro&amp;amp;#x40;gmail&amp;amp;#x2E;com Leandro Regueiro] (unho) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Victor Portela&lt;br /&gt;
* Proxecto Trasno &amp;amp;#8212; translation project (http://trasno.net)&lt;br /&gt;
=== German Translation ===&lt;br /&gt;
* Aaron Winter (Bitron)&lt;br /&gt;
* Alexander Ginschel (mcpgal)&lt;br /&gt;
* Alexander Laux&lt;br /&gt;
* Alexander Zurek (Alresu)&lt;br /&gt;
* Andre Schmidt (schmidta)&lt;br /&gt;
* Boris Stumm (quijote_)&lt;br /&gt;
* Celina Mainz (Mailina)&lt;br /&gt;
* Chewan&lt;br /&gt;
* Christoph Berg (chrber) &amp;amp;#8212; former translation maintainer&lt;br /&gt;
* Christoph Lange (madelgijs)&lt;br /&gt;
* Drakefriend&lt;br /&gt;
* Elias Fromm (Karpadorsch)&lt;br /&gt;
* Elias Pschernig (allefant)&lt;br /&gt;
* ghype&lt;br /&gt;
* Lennard&lt;br /&gt;
* Lorenzo Hardt (HeroOfGaming)&lt;br /&gt;
* Rhonda D'Vine (Rhonda)&lt;br /&gt;
* Jan Greve (Jan)&lt;br /&gt;
* Jan Heiner Laberenz (jan-heiner)&lt;br /&gt;
* Kai Ensenbach&lt;br /&gt;
* Konrad Schwede (Konrad2)&lt;br /&gt;
* [mailto:marcel_miebach&amp;amp;#x40;gmx&amp;amp;#x2E;de Marcel Miebach] (retr0virus)&lt;br /&gt;
* Mark de Wever ([[User:SkeletonCrew|Mordante/SkeletonCrew]])&lt;br /&gt;
* Matthias Gianfelice (MatthiasG)&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic)&lt;br /&gt;
* Oliver Lange (Crommy)&lt;br /&gt;
* Ronny Standtke&lt;br /&gt;
* Ruben Philipp Wickenhäuser (The Very Uhu)&lt;br /&gt;
* Severin Glöckner (Shiki, Sevu) &amp;amp;#8212; current translation maintainer&lt;br /&gt;
* Stephan Grochtmann (Schattenstephan)&lt;br /&gt;
* Tobias Schönau (SonIcco)&lt;br /&gt;
* Uz-Valentin Friedrich&lt;br /&gt;
* vonHalenbach&lt;br /&gt;
=== Greek Translation ===&lt;br /&gt;
* Alexander Alexiou (Santi/fnaek)&lt;br /&gt;
* Evangelos Papakirikou&lt;br /&gt;
* Harry Kaimenas&lt;br /&gt;
* Katerina Sykioti&lt;br /&gt;
* Konstantinos Egarhos&lt;br /&gt;
* Konstantinos Karasavvas&lt;br /&gt;
* Mik2303&lt;br /&gt;
* Nikos Astroylakis (Greek Dubbings Maker)&lt;br /&gt;
* Nikos Papadopoulos (galicae)&lt;br /&gt;
* Nikos the Great&lt;br /&gt;
* Panagiotis Famelis (Kesnar)&lt;br /&gt;
* Papadopoulos Themistoklis&lt;br /&gt;
* Spiros, Giorgis&lt;br /&gt;
=== Hebrew Translation ===&lt;br /&gt;
* Ariel Ben-Yehuda&lt;br /&gt;
* Oron Peled&lt;br /&gt;
* Ely Levy (Nakee)&lt;br /&gt;
=== Hungarian Translation ===&lt;br /&gt;
* Barthalos Márton (Aldebaran Ghrelin)&lt;br /&gt;
* Czakó Csaba (Horus)&lt;br /&gt;
* Erdélyi Kristóf&lt;br /&gt;
* Fábián Balázs (nermal93)&lt;br /&gt;
* Hamar Krisztián&lt;br /&gt;
* Kádár-Németh Krisztián (Rudanar Firmus)&lt;br /&gt;
* Kékkői László (BlackEvil)&lt;br /&gt;
* Kelemen Zoltán (kele)&lt;br /&gt;
* Kovács Dániel (Consalamander)&lt;br /&gt;
* Majsa Norbert (wias)&lt;br /&gt;
* Máthé Katalin (katkadu)&lt;br /&gt;
* Németh Tamás (nTOMasz)&lt;br /&gt;
* Pintér Csaba (piere)&lt;br /&gt;
* Salamon András (ott)&lt;br /&gt;
* Soltész Adrián (majominia)&lt;br /&gt;
* Széll Tamás (TomJoad)&lt;br /&gt;
* Udvari Gábor (Udi)&lt;br /&gt;
* Udvari Zsolt&lt;br /&gt;
* Vasvári Péter (honorshark)&lt;br /&gt;
=== Icelandic Translation ===&lt;br /&gt;
* Arngrímur Stefánsson&lt;br /&gt;
* Gabríel A. Pétursson&lt;br /&gt;
=== Indonesian Translation ===&lt;br /&gt;
* Ardhi (earthboy)&lt;br /&gt;
* Benny Lin&lt;br /&gt;
* [mailto:sevennightmare&amp;amp;#x40;tutanota&amp;amp;#x2E;de Irsyad Musthafa] &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Iwan&lt;br /&gt;
* [mailto:inkraiswitras&amp;amp;#x40;yahoo&amp;amp;#x2E;com Nicky Inkrais Witras] &amp;amp;#8212; previous translation maintainer&lt;br /&gt;
* [mailto:yuris_wicaksana&amp;amp;#x40;yahoo&amp;amp;#x2E;com Yuristyawan Pambudi Wicaksana] &amp;amp;#8212; previous translation maintainer&lt;br /&gt;
=== Irish Translation ===&lt;br /&gt;
* Mountain_King &amp;amp;#8212; translation maintainer&lt;br /&gt;
=== Italian Translation ===&lt;br /&gt;
* Alessandro Barbazza&lt;br /&gt;
* Alessio D'Ascanio (otaku)&lt;br /&gt;
* Americo Iacovizzi (DarkAmex)&lt;br /&gt;
* [mailto:arosella&amp;amp;#x40;yahoo&amp;amp;#x2E;com Antonio Rosella]&lt;br /&gt;
* crys0000&lt;br /&gt;
* Elvish_Hunter&lt;br /&gt;
* Eugenio Favalli (ElvenProgrammer)&lt;br /&gt;
* Federico Tomassetti&lt;br /&gt;
* Filippo Abbruzzo (Gwain)&lt;br /&gt;
* isazi&lt;br /&gt;
* Luciano Montanaro (Luciano)&lt;br /&gt;
* Michele Maresi (mich)&lt;br /&gt;
* RokStar&lt;br /&gt;
* Stefano Coccato (BioHazardX)&lt;br /&gt;
=== Japanese Translation ===&lt;br /&gt;
* BlueStar&lt;br /&gt;
* clearpotion&lt;br /&gt;
* h22&lt;br /&gt;
* [mailto:broadbarredfirefish&amp;amp;#x40;gmail&amp;amp;#x2E;com Hironori Fujimoto] (RatArmy) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* [mailto:iwaim&amp;amp;#x2E;sub&amp;amp;#x40;gmail&amp;amp;#x2E;com IWAI, Masaharu] ([[User:Iwaim|iwaim]])&lt;br /&gt;
* [mailto:kateitekino_hito&amp;amp;#x40;yahoo&amp;amp;#x2E;co&amp;amp;#x2E;jp kateiteki]&lt;br /&gt;
* kudoh&lt;br /&gt;
* Maxwell Stibbard Hawkes&lt;br /&gt;
* [mailto:mishanhideaki88&amp;amp;#x40;gmail&amp;amp;#x2E;com mishan]&lt;br /&gt;
* いいむらなおき (amatubu) - Naoki Iimura&lt;br /&gt;
* [mailto:okyada&amp;amp;#x40;gmail&amp;amp;#x2E;com 岡田信人 - Nobuhito Okada]&lt;br /&gt;
* np&lt;br /&gt;
* [mailto:pasta0915[at]gmail&amp;amp;#x2E;com Shoot MORII] (pastak)&lt;br /&gt;
* OOTA, Masato(oo)&lt;br /&gt;
* Q&lt;br /&gt;
* R.N&lt;br /&gt;
* rouiza&lt;br /&gt;
* [mailto:le&amp;amp;#x2E;sahara&amp;amp;#x40;gmail&amp;amp;#x2E;com sahara]&lt;br /&gt;
* Shigerello&lt;br /&gt;
* [mailto:suto3suto3&amp;amp;#x40;gmail&amp;amp;#x2E;com suto3]&lt;br /&gt;
* 瀟湘夜雨&lt;br /&gt;
* Taigaku Okuiso&lt;br /&gt;
* Takanobu Hirai&lt;br /&gt;
* tamanegi&lt;br /&gt;
* [mailto:yma9yma&amp;amp;#x40;gmail&amp;amp;#x2E;com yma]&lt;br /&gt;
* Yuji Matsumoto&lt;br /&gt;
=== Korean Translation ===&lt;br /&gt;
* mistzone &amp;amp;#8212; current maintainer&lt;br /&gt;
=== Latin Translation ===&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; general semantician&lt;br /&gt;
* Mark Polo (mpolo) &amp;amp;#8212; original maintainer&lt;br /&gt;
* Michael Babich ([[User:Aethaeryn|Aethaeryn]]) &amp;amp;#8212; current maintainer&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* Thomas Hockings ([[User:Deusite|Deusite]])&lt;br /&gt;
=== Latvian Translation ===&lt;br /&gt;
* Artis Rozentāls&lt;br /&gt;
* Gvido Bruveris &amp;amp;#8212; Maintainer&lt;br /&gt;
* [mailto:rei4dan&amp;amp;#x40;gmail&amp;amp;#x2E;com Reinis Danne]&lt;br /&gt;
=== Lithuanian Translation ===&lt;br /&gt;
* Andrius Štikonas&lt;br /&gt;
* Deimantė Tankus (Diamond)&lt;br /&gt;
* Jurgis Sūdžius (Dievas)&lt;br /&gt;
* Lukas Gasiūnas (LucasLT)&lt;br /&gt;
* Marius Tauba (morlock)&lt;br /&gt;
* Raimundas Zabarauskas&lt;br /&gt;
* Vytautas Šaltenis (rtfb)&lt;br /&gt;
=== Macedonian Translation ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
=== Marathi Translation ===&lt;br /&gt;
* [mailto:sujitrjadhav&amp;amp;#x40;gmail&amp;amp;#x2E;com सुजित जाधव] ([[User:sujitrjadhav|Sujit R Jadhav]])&lt;br /&gt;
=== Norwegian Translation ===&lt;br /&gt;
* Asgeir Aakre (YbeRn00b)&lt;br /&gt;
* Erik J. Mesoy (Circon)&lt;br /&gt;
* Gaute Jao (Gauteamus)&lt;br /&gt;
* Hallvard Norheim Bø (Lysander)&lt;br /&gt;
* Håvard Korsvoll&lt;br /&gt;
* Pål Inge Larsen (PsyBird)&lt;br /&gt;
* Susanne Mesoy (Rarlgland)&lt;br /&gt;
=== Old English Translation ===&lt;br /&gt;
* [mailto:eirikvw&amp;amp;#x40;aim&amp;amp;#x2E;com Eirik Westcoat]&lt;br /&gt;
* [mailto:axonfifty&amp;amp;#x40;gmail&amp;amp;#x2E;com Gottweiß]&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]]) &amp;amp;#8212; Maintainer&lt;br /&gt;
=== Polish Translation ===&lt;br /&gt;
* Agata Chmiel&lt;br /&gt;
* Arkadiusz Danilecki (szopen)&lt;br /&gt;
* Bartek Waresiak (Dragonking)&lt;br /&gt;
* Kamil Matuszewski (LiamTailor)&lt;br /&gt;
* Karol Nowak (grzywacz)&lt;br /&gt;
* Magdalena Chmiel (Ryouko)&lt;br /&gt;
* Marek Kalnik (wdev)&lt;br /&gt;
* Michał Hartliński&lt;br /&gt;
* Michał Jedynak (Artanis)&lt;br /&gt;
* Michał Ligowski (misiorysio)&lt;br /&gt;
* Paweł Albecki (gidgnulur)&lt;br /&gt;
* Paweł Jackowski (fatality)&lt;br /&gt;
* Piotr Kruszewski (Hejnewar)&lt;br /&gt;
* Piotr Makarewicz (ForPeace) &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Robert Wolniak (Szkodnix)&lt;br /&gt;
* Roman Polesek (rimskij)&lt;br /&gt;
* Sebastian Basierski&lt;br /&gt;
* Tadeusz Kopeć&lt;br /&gt;
* Zbigniew Banach (vonBureck)&lt;br /&gt;
=== Portuguese Translation ===&lt;br /&gt;
* Carlos Sousa&lt;br /&gt;
* Luis Passos&lt;br /&gt;
* trewe &amp;amp;#8212; Current maintainer&lt;br /&gt;
=== Portuguese (Brazil) Translation ===&lt;br /&gt;
* Ambra Viviani Loos&lt;br /&gt;
* Andrei Machado &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Antonio Vildes Barbosa&lt;br /&gt;
* Bruno Macabeus&lt;br /&gt;
* Celso Goya&lt;br /&gt;
* [mailto:cbterra&amp;amp;#x40;gmail&amp;amp;#x2E;com Claudio Terra]&lt;br /&gt;
* Claus Aranha&lt;br /&gt;
* Di Teixeira (Moroder)&lt;br /&gt;
* Diego Inácio Goergen&lt;br /&gt;
* [mailto:fred&amp;amp;#x2E;maranhao&amp;amp;#x40;gmail&amp;amp;#x2E;com Fred Maranhão]&lt;br /&gt;
* Hugo Neiva de Melo&lt;br /&gt;
* Michel Loos&lt;br /&gt;
* Renato Cunha&lt;br /&gt;
* Ricardo Sodré Andrade&lt;br /&gt;
* Romero Gonçalves&lt;br /&gt;
* Sérgio de Miranda Costa&lt;br /&gt;
* Tiago Souza (Salvador)&lt;br /&gt;
=== Romanian Translation ===&lt;br /&gt;
* Unknown&lt;br /&gt;
=== Russian Translation ===&lt;br /&gt;
* Aldarisvet &amp;amp;#8212; Previous maintainer&lt;br /&gt;
* [mailto:allryn&amp;amp;#x40;pisem&amp;amp;#x2E;net Aleksandr Aleks]&lt;br /&gt;
* Alexandr Gridnev&lt;br /&gt;
* Alexandr Menovchicov&lt;br /&gt;
* Alexey Remizov&lt;br /&gt;
* Alexey Zakharchenko&lt;br /&gt;
* Andrey Tikhonov ([[User:tiandrey|tiandrey]])&lt;br /&gt;
* Anthony Kolesov&lt;br /&gt;
* Artem Khrapov ([[User:Kabachuha|kabachuha]]) &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Azamat Hackimov ([[User:Winterheart|winterheart]])&lt;br /&gt;
* [mailto:BabylonASАТyandexDОTru BabylonAS] ([[User:BabylonAS|BabylonAS]])&lt;br /&gt;
* [[User:catbegemot|catbegemot]]&lt;br /&gt;
* Danila Evstifeyev (MyOtheHedgeFox)&lt;br /&gt;
* Denis Revin (Dut_Norshi)&lt;br /&gt;
* Dmitry Brilev (dobryl)&lt;br /&gt;
* Fardeil&lt;br /&gt;
* Fedor Gavrilov (gallowzbird)&lt;br /&gt;
* Fedor Khod'kov (teddy/fkhodkov)&lt;br /&gt;
* Ilya Kaznacheev&lt;br /&gt;
* Ilya Kotov&lt;br /&gt;
* Ishayahu Lastov (Ishayahu)&lt;br /&gt;
* Kirill Baranov&lt;br /&gt;
* Mikhail Melnik (ZumZoom)&lt;br /&gt;
* Nikita Ushkin&lt;br /&gt;
* Roman Tuchin (Sankt)&lt;br /&gt;
* Sergey Popov (loonycyborg)&lt;br /&gt;
* Valentina Mukhamedzhanova (umirra)&lt;br /&gt;
* Victor Sergienko (singalen)&lt;br /&gt;
* [mailto:vicza&amp;amp;#x40;zmail&amp;amp;#x2E;ru Victor Zabavin]&lt;br /&gt;
* Vlad Glagolev&lt;br /&gt;
* Yellow Horror&lt;br /&gt;
=== Scottish Gaelic Translation ===&lt;br /&gt;
* [mailto:fios&amp;amp;#x40;foramnagaidhlig&amp;amp;#x2E;net GunChleoc] &amp;amp;#8212; Current maintainer&lt;br /&gt;
=== Serbian Translation ===&lt;br /&gt;
* Branko Kokanovic (kokan)&lt;br /&gt;
* [mailto:caslav&amp;amp;#x2E;ilic&amp;amp;#x40;gmx&amp;amp;#x2E;net Caslav Ilic]&lt;br /&gt;
* [mailto:daliborddjuric&amp;amp;#x40;gmail&amp;amp;#x2E;com Dalibor Djuric]&lt;br /&gt;
* [mailto:sreckotoroman&amp;amp;#x40;gmail&amp;amp;#x2E;com Srecko Toroman] (FreeCraft)&lt;br /&gt;
=== Slovak Translation ===&lt;br /&gt;
* Aceman&lt;br /&gt;
* Ivan Kovacs&lt;br /&gt;
* Ján Sučan (Bhujanga)&lt;br /&gt;
* Marian Kluvanec&lt;br /&gt;
* Martin Dzbor&lt;br /&gt;
* Martin Plávala (Empy)&lt;br /&gt;
* Stano Hoferek (Elven)&lt;br /&gt;
* [[User:Viliam|Viliam Bur]]&lt;br /&gt;
=== Slovenian Translation ===&lt;br /&gt;
* Gregor Petrin&lt;br /&gt;
* Jaka Kranjc (lynx)&lt;br /&gt;
* Klemen Košir (nNa)&lt;br /&gt;
* Matej Repinc&lt;br /&gt;
=== Spanish Translation ===&lt;br /&gt;
* Alvin Eloy Luna Castro&lt;br /&gt;
* Chucho Pulgoso&lt;br /&gt;
* David Martínez Moreno&lt;br /&gt;
* Diego Grande Rodríguez (Buhako)&lt;br /&gt;
* Diego J.&lt;br /&gt;
* Fernando Cerezal&lt;br /&gt;
* Flamma&lt;br /&gt;
* Francisco Muñoz (fmunoz)&lt;br /&gt;
* Gabriel Rodríguez (Chewie)&lt;br /&gt;
* [mailto:gusgins&amp;amp;#x40;gmail&amp;amp;#x2E;com Gustavo Gingins] (gins)&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]])&lt;br /&gt;
* Iván Herrero (navitux)&lt;br /&gt;
* Javier C.H. (perseo)&lt;br /&gt;
* Jose Gordillo (kilder)&lt;br /&gt;
* Jose Manuel Gomez (joseg)&lt;br /&gt;
* Josu Díaz de Arcaya&lt;br /&gt;
* Masacroso&lt;br /&gt;
* Martín R. Dapás&lt;br /&gt;
* Pedro Llorens (PeterPorty)&lt;br /&gt;
* Roberto Romero (sildur)&lt;br /&gt;
* Sergi March (sergi34)&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* [mailto:quianaaelonin&amp;amp;#x40;gmail&amp;amp;#x2E;com Víctor M. Estrada] (Aelonin/Darkmage)&lt;br /&gt;
* Xavier Novella Sinde (XavierNovella)&lt;br /&gt;
=== Swedish Translation ===&lt;br /&gt;
* Alex Alowersson &amp;amp;#8212; current maintainer&lt;br /&gt;
* Alexander Kjäll (capitol)&lt;br /&gt;
* Andreas Tyrberg&lt;br /&gt;
* Åse Petersson (tintin)&lt;br /&gt;
* Elias Sevelin (aXidal)&lt;br /&gt;
* Gustav Tiger&lt;br /&gt;
* Hugo Gerlach (Entrimo)&lt;br /&gt;
* Leo Danielson (Lugo Moll)&lt;br /&gt;
* Niklas Bolmdahl&lt;br /&gt;
* Stefan Bergström (tephlon)&lt;br /&gt;
* [mailto:susanna&amp;amp;#x2E;bjorverud&amp;amp;#x40;telia&amp;amp;#x2E;com Susanna Björverud] (sanna)&lt;br /&gt;
* Ulrika Uddeborg&lt;br /&gt;
* wint3r&lt;br /&gt;
=== Turkish Translation ===&lt;br /&gt;
* Ali Erdem Karaçay(Arsivnet)&lt;br /&gt;
* Enes Akın (yekialem)&lt;br /&gt;
* İhsan Akın&lt;br /&gt;
* Kosif&lt;br /&gt;
* Nilgün Belma Bugüner&lt;br /&gt;
* Pınar Yanardağ (moonquelle)&lt;br /&gt;
* Selim Farsakoğlu&lt;br /&gt;
=== Ukrainian Translation ===&lt;br /&gt;
* Anton Okhrimenko (AncientGeneral)&lt;br /&gt;
* [mailto:mansonigor&amp;amp;#x40;gmail&amp;amp;#x2E;com Igor Paliychuk]&lt;br /&gt;
* [mailto:arobson&amp;amp;#x40;yandex&amp;amp;#x2E;ru robson] ([[User:Robson|Robson]])&lt;br /&gt;
=== Valencian (southern Catalan) Translation ===&lt;br /&gt;
* Bernardo Arlandis&lt;br /&gt;
* Robert Millan&lt;br /&gt;
* Tomás Roig&lt;br /&gt;
=== Vietnamese Translation ===&lt;br /&gt;
* Huynh Yen Loc&lt;br /&gt;
* Le Ngoc Nguyen Chinh&lt;br /&gt;
* Pham Hoang Duy&lt;br /&gt;
* Pham Thanh Nam&lt;br /&gt;
* Pham Thi Yen&lt;br /&gt;
=== RACV’s Translation ===&lt;br /&gt;
* Mario Rodríguez (Mavorte)&lt;br /&gt;
== Sceptre of Fire ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Joseph Simmons (turin)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* doofus-01&lt;br /&gt;
* nemaara&lt;br /&gt;
=== WML Assistance ===&lt;br /&gt;
* David Simmons (Dacyn)&lt;br /&gt;
* Eli Dupree (Elvish Pillager)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* MadMax&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Asereje&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; the new Dwarvish Miner sprite&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; new portraits&lt;br /&gt;
* James Woo (Pickslide) &amp;amp;#8212; old portraits&lt;br /&gt;
* John-Robert Funck (XJaPaN)&lt;br /&gt;
* JonasNL &amp;amp;#8212; Dwarvish Miner attack and defense animations&lt;br /&gt;
* Peter Geinitz (Wayfarer)&lt;br /&gt;
* Pixelmind &amp;amp;#8212; Khrakrahs portrait&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
* RusHHouR &amp;amp;#8212; old gold and coal piles&lt;br /&gt;
* doofus-01&lt;br /&gt;
== Son Of The Black Eye ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Benjamin Drieu (Benj) &amp;amp;#8212; conception and original design&lt;br /&gt;
* Taurus &amp;amp;#8212; completion&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Taurus&lt;br /&gt;
=== Prose, Grammatical and WML Assistance ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Artwork and Graphics ===&lt;br /&gt;
* Christian Sirviö (Girgistian) &amp;amp;#8212; portraits (sketches)&lt;br /&gt;
* Phil Barber (thespaceinvader) &amp;amp;#8212; portraits (coloring)&lt;br /&gt;
* Sonny T Yamada (SkyOne) &amp;amp;#8212; Sprite animations (defense and magic) of orcish shamans&lt;br /&gt;
== Northern Rebirth ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Taurus&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Battlesquid&lt;br /&gt;
* Nicholas Kerpan (Thrawn)&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
* Xandar86&lt;br /&gt;
=== Prose, Grammatical and WML Assistance ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Code and Translation Assistance ===&lt;br /&gt;
* David Philippi (Torangan)&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Charles Dang (vultraz)&lt;br /&gt;
== Liberty ==&lt;br /&gt;
=== Original Campaign Design ===&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Latest Rewrite ===&lt;br /&gt;
* nemaara&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Original prose-doctoring and preparation for mainline&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Brendan Sellner&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portraits&lt;br /&gt;
* Shadow&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; story images, Rogue Mage line sprites&lt;br /&gt;
* Sonny T Yamada (SkyOne) &amp;amp;#8212; Sprite animations (defense and attack) of Rogue Mage line&lt;br /&gt;
== Delfadors Memoirs ==&lt;br /&gt;
=== Creator and Original Designer ===&lt;br /&gt;
* [[User:jp30|Josh Parsons]] &amp;amp;#8212; Original designer, responsible for first scenarios 2-10; maintained it up to 0.5.2&lt;br /&gt;
=== Co-Authors ===&lt;br /&gt;
* Oto 'tapik' Buchta &amp;amp;#8212; First scenario, various improvements&lt;br /&gt;
* Spiros Alexiou (Santi/fnaek) &amp;amp;#8212; Scenarios 12 and following.&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Prose- and script-doctoring, Wesnoth continuity fixes.&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Jeffrey 'Sigurd' Westcoat (SigurdFireDragon) &amp;amp;#8212; former maintainer&lt;br /&gt;
=== WML Programming and Assistance ===&lt;br /&gt;
* Fabi &amp;amp;#8212; WML bug fixing and polishing.&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Side-mutation and recall-list handling.&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm) &amp;amp;#8212; WML help&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* Kathrin Polikeit (Kitty)&lt;br /&gt;
=== Additional thanks to ===&lt;br /&gt;
* Arkadiusz D. Danilecki &amp;amp;#8212; Inspiration and borrowings from his 'A New Order'&lt;br /&gt;
== Heir To The Throne ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* David White (Sirp)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* doofus-01 &amp;amp;#8212; new sprites and animations (Princess, Battle Princess, Dark Queen, Sea Orc)&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; portraits (Delfador, Asheviere, Moremirmu)&lt;br /&gt;
* Francisco Muñoz (fmunoz)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portraits (Konrad, Li'sar, Kalenz, Chantal)&lt;br /&gt;
* Neoriceisgood&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Patrick Parker (Sapient) &amp;amp;#8212; WML assistance&lt;br /&gt;
== Secrets of the Ancients ==&lt;br /&gt;
=== Campaign Design, Programming, and Artwork ===&lt;br /&gt;
* Dan Gerhards (beetlenaut)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Jeffrey 'Sigurd' Westcoat (SigurdFireDragon) &amp;amp;#8212; former maintainer&lt;br /&gt;
=== Additional Artwork ===&lt;br /&gt;
* Wussel &amp;amp;#8212; Some improvements to the ship.&lt;br /&gt;
== Legend of Wesmere ==&lt;br /&gt;
=== Creator and Lead Designer ===&lt;br /&gt;
* [mailto:moka1&amp;amp;#x40;otenet&amp;amp;#x2E;gr Spiros, George and Alexander Alexiou] ([[User:Santi|Santi/fnaek]]) &amp;amp;#8212; Main designers, former maintainers.&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Fabi/Fendrin &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Spiros, George and Alexander Alexiou (Santi/fnaek)&lt;br /&gt;
=== Prose-doctoring and adaptation for mainline ===&lt;br /&gt;
* Eric S. Raymond (esr)&lt;br /&gt;
* Fabi/Fendrin &amp;amp;#8212; Major WML rewrite for mainline&lt;br /&gt;
=== WML Assistance ===&lt;br /&gt;
* Alexander van Gessel (AI/AI0867) &amp;amp;#8212; bugfixing and general WML cleanups&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm) &amp;amp;#8212; for A LOT of help with WML and interesting campaign suggestions&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; for A LOT of help with WML&lt;br /&gt;
=== Artificial Intelligence ===&lt;br /&gt;
* Yurii Chernyi (crab) &amp;amp;#8212; coding of the new ai and help with corresponding redesigns&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* Bora Orcal (bera) &amp;amp;#8212; goblin horn rouser&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; who did a great job with portraits and other graphics&lt;br /&gt;
-the main reason for having a polished campaign&lt;br /&gt;
* Steven Panek (Espreon) &amp;amp;#8212; map artist&lt;br /&gt;
=== Additional thanks to ===&lt;br /&gt;
* Scott &amp;amp;#8212; for help with WML, especially the use of store/unstore&lt;br /&gt;
* WhiteWizard &amp;amp;#8212; Initial porting to 1.2&lt;br /&gt;
* Disto &amp;amp;#8212; for elvish units&lt;br /&gt;
* RedLTeut &amp;amp;#8212; for great improvements to the initial invisible elvish units&lt;br /&gt;
* Dacyn &amp;amp;#8212; who was of great help in the beginning of this project&lt;br /&gt;
* Big Bad Joe&lt;br /&gt;
* breversa&lt;br /&gt;
* Invisible Philosopher&lt;br /&gt;
* js138&lt;br /&gt;
* l'ultimo cruco&lt;br /&gt;
* Mad Max&lt;br /&gt;
* Rhuvaen&lt;br /&gt;
* SelfishWeirdo&lt;br /&gt;
* Scott&lt;br /&gt;
* Sly&lt;br /&gt;
* Teldar&lt;br /&gt;
* Turin&lt;br /&gt;
* And the rest of the Wesnoth community for feedback,&lt;br /&gt;
criticism, help with WML code and graphics.&lt;br /&gt;
== The South Guard ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* William Carey (aelius)&lt;br /&gt;
=== Latest Campaign Revision ===&lt;br /&gt;
* nemaara&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* nemaara &amp;amp;#8212; current maintainer&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
* Wintermute&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* J.W. Bjerk (eleazar)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portraits&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Scavenger &amp;amp;#8212; new story images and Mal M'Brin portrait&lt;br /&gt;
* rhyging5&lt;br /&gt;
* Shadow&lt;br /&gt;
* William Carey (aelius)&lt;br /&gt;
== Two Brothers ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Eric J. Mesoy (Circon)&lt;br /&gt;
* Nils Kneuper (Ivanovic)&lt;br /&gt;
=== Prose and Story Edits ===&lt;br /&gt;
* Eric S. Raymond (esr)&lt;br /&gt;
* A-Red&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Nils Kneuper (Ivanovic)&lt;br /&gt;
* Charles Dang (vultraz)&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Arkadiusz Danileki (szopen)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; current portraits&lt;br /&gt;
* MadMax&lt;br /&gt;
* Stefan&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Bartek Waresiak (Dragonking)&lt;br /&gt;
* Christoph Berg (chrber)&lt;br /&gt;
* Daravel&lt;br /&gt;
* Jozrael&lt;br /&gt;
* And special thanks to everyone else who I forgot to mention.&lt;br /&gt;
== Under the Burning Suns ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Asa Swain&lt;br /&gt;
* Piotr Cychowski (Mist/cycholka)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm)&lt;br /&gt;
* Jan Rietema (Rhuvaen)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Piotr Cychowski (Mist/cycholka)&lt;br /&gt;
* Simon Forsyth (Alarantalara)&lt;br /&gt;
* Steven Panek (Espreon)&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Dan Gerhards (beetlenaut) &amp;amp;#8212; new Flesh Golem sprites&lt;br /&gt;
* Kwandulin &amp;amp;#8212; New Kaleh and Nym sprites&lt;br /&gt;
* doofus-01 &amp;amp;#8212; Monster Crab sprite&lt;br /&gt;
* Hogne Haskjold (Frame)&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm)&lt;br /&gt;
* J.W. Bjerk (Eleazar)&lt;br /&gt;
* James Woo (Pickslide)&lt;br /&gt;
* Javier Hoyos (Vendanna)&lt;br /&gt;
* Marcus Rosén (sleepwalker) &amp;amp;#8212; Dark Assassin sprite and animations&lt;br /&gt;
* Mark Goodenough (Ranger M)&lt;br /&gt;
* Mikolaj Machowski (Emdot)&lt;br /&gt;
* Murray Cook (Zhukov)&lt;br /&gt;
* Peter Geinitz (Shadow)&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
* Sangel&lt;br /&gt;
* Samuel Wilson (megane)&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
* Vincent Langner (Vyncyn) &amp;amp;#8212; Spider Lich and Human Commander sprites&lt;br /&gt;
* Zerovirus &amp;amp;#8212; Naga Hunter sprite&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Fabian Müller (Fabi/Fendrin)&lt;br /&gt;
* Mark Polo&lt;br /&gt;
* Matthias Schoeck (mattsc) &amp;amp;#8212; Messenger AI&lt;br /&gt;
* Isaac&lt;br /&gt;
* Ringcaat (Thorin N. Tatge)&lt;br /&gt;
* And special thanks to everyone else who I forgot to mention.&lt;br /&gt;
== Descent Into Darkness ==&lt;br /&gt;
=== Original Campaign Design ===&lt;br /&gt;
* esci&lt;br /&gt;
=== Latest Campaign Revision ===&lt;br /&gt;
* nemaara&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; story images&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; current portraits&lt;br /&gt;
* theycallmerooster &amp;amp;#8212; old portraits&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* josteph &amp;amp;#8212; dialogue comments and revisions&lt;br /&gt;
== Dead Water ==&lt;br /&gt;
=== Campaign design and programming ===&lt;br /&gt;
* Dan Gerhards (beetlenaut)&lt;br /&gt;
=== Script-doctoring and cleanup for mainline ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Artwork ===&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; Portraits for brawler, Kai Krellis, Gwabbo, and Caladon&lt;br /&gt;
* Justin Nichols (JustinOperable) &amp;amp;#8212; Portrait for Cylanna&lt;br /&gt;
* Zerovirus &amp;amp;#8212; Kai Krellis sprites&lt;br /&gt;
* Francisco Muñoz (fmunoz) &amp;amp;#8212; Attack icons&lt;br /&gt;
== The Rise Of Wesnoth ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* James Spencer (Shade)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; the new Vampire Lady sprite&lt;br /&gt;
* J.W. Bjerk (eleazar)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; new portraits and story art&lt;br /&gt;
* Michael Gil de Muro (grp21) &amp;amp;#8212; old portraits&lt;br /&gt;
* pixelmind &amp;amp;#8212; Shek'kahan portrait&lt;br /&gt;
=== WML Contributors ===&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
== The Hammer of Thursagan ==&lt;br /&gt;
=== Author ===&lt;br /&gt;
* Eric S. Raymond (esr)&lt;br /&gt;
=== Special Guest Designer ===&lt;br /&gt;
* Taurus&lt;br /&gt;
=== Art ===&lt;br /&gt;
* Kim Holm (DUHH)&lt;br /&gt;
* Phil Barber (thespaceinvader)&lt;br /&gt;
* Vincent Langner (Vyncyn) &amp;amp;#8212; New Dwarvish Witness line sprites and animations&lt;br /&gt;
=== Brainstorming, playtesting, and spousal support ===&lt;br /&gt;
* Cathy O. Raymond&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Charles Dang (vultraz)&lt;br /&gt;
== Eastern Invasion ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Joseph Simmons (turin)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Astrid Halberkamp&lt;br /&gt;
=== Campaign Epilogue and Continuity ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Prose and Story Edits ===&lt;br /&gt;
* Loci&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Aaron Redfern (A-Red) &amp;amp;#8212; New Owaec sprites&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; new portraits&lt;br /&gt;
* James Woo (Pickslide) &amp;amp;#8212; old portraits&lt;br /&gt;
* Neoriceisgood&lt;br /&gt;
[[Category:Generated]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Credits&amp;diff=68578</id>
		<title>Credits</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Credits&amp;diff=68578"/>
		<updated>2021-10-23T02:40:06Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Credits update in preparation for the 1.16.0 release&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;tright&amp;quot;&amp;gt; __TOC__ &amp;lt;/div&amp;gt;&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
In July 2003, '''David White''' released the first version of Wesnoth. Since&lt;br /&gt;
then, many people have joined the project, contributing in very different ways.&lt;br /&gt;
&lt;br /&gt;
To make any changes to this list, please modify&lt;br /&gt;
&amp;lt;code class=&amp;quot;noframe&amp;quot;&amp;gt;about.cfg&amp;lt;/code&amp;gt; in the repo or ask any developer to do&lt;br /&gt;
it for you.&lt;br /&gt;
&lt;br /&gt;
== Core Contributors ==&lt;br /&gt;
=== Programming ===&lt;br /&gt;
* [mailto:dave&amp;amp;#x40;whitevine&amp;amp;#x2E;net David White] (Sirp) &amp;amp;#8212; Founding Developer&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* [mailto:AI0867&amp;amp;#x40;gmail&amp;amp;#x2E;com Alexander van Gessel] (AI/AI0867)&lt;br /&gt;
* Alfredo Beaumont (ziberpunk) &amp;amp;#8212; autotools&lt;br /&gt;
* Ali El Gariani ([[User:Alink|alink]]) &amp;amp;#8212; coder, bug fixes, optimizations, interface usability&lt;br /&gt;
* András Salamon ([[User:Ott|ott]]) &amp;amp;#8212; QA, bug fixing, subediting, game mechanics&lt;br /&gt;
* Andreas Löf (Aginor)&lt;br /&gt;
* Anonymissimus &amp;amp;#8212; bug fixes and features mostly related to the wml engine or lua interface&lt;br /&gt;
* [mailto:artemkhrapov2001ATyandexDOTru Artem Khrapov] ([[User:Kabachuha|kabachuha]]) &amp;amp;#8212; addons server rework, incremental updates and uploads feature; i18n, UI and quality of life improvements; bugfixes&lt;br /&gt;
* [mailto:dragonking&amp;amp;#x40;o2&amp;amp;#x2E;pl Bartek Waresiak] (Dragonking) &amp;amp;#8212; unit balancing, Formula AI&lt;br /&gt;
* Benoît Timbert ([[User:Noyga|Noyga]])&lt;br /&gt;
* Bram Ridder (Morloth) &amp;amp;#8212; editor improvements&lt;br /&gt;
* [mailto:bruno&amp;amp;#x40;wolff&amp;amp;#x2E;to Bruno Wolff III] ([[User:bruno|bruno]]) &amp;amp;#8212; campaign web interface, bug fixing, minor coder&lt;br /&gt;
* Cameron Morland&lt;br /&gt;
* Cédric Duval &amp;amp;#8212; coder, internationalization manager&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; General fixes, cleanup and improvements to various areas.&lt;br /&gt;
* Chris Beck (iceiceice/involution) &amp;amp;#8212; Bug fixes and features esp. engine-related or multiplayer-related. Added WML unit testing system, improvements to travis-CI.&lt;br /&gt;
* Celtic Minstrel&lt;br /&gt;
* Daniel Franke (dfranke)&lt;br /&gt;
* Daniel (gfgtdf)&lt;br /&gt;
* David Hilton&lt;br /&gt;
* Dominic Bolin (Xan)&lt;br /&gt;
* Elias Pschernig (allefant)&lt;br /&gt;
* Elvish_Hunter&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Macro library reorganization, major UI makeover introducing lightweight transparent popups and linger mode, maintenance tools for WML, eight campaigns lifted from UMC, one all-original campaign, editor refactoring, many many code cleanups, and svn-to-git migration.&lt;br /&gt;
* Eugen Jiresch (euschn) &amp;amp;#8212; savegame improvements&lt;br /&gt;
* [mailto:fabianmueller5_at_gmx&amp;amp;#x2E;de Fabian Müller] ([[User:fabi|fabi/fendrin]])&lt;br /&gt;
* [mailto:gabrielmorin~_-AT-_~gmail&amp;amp;#x2E;com Gabriel Morin] (gabba) &amp;amp;#8212; Whiteboard project, naming hotseat players, delay shroud updates on game start.&lt;br /&gt;
* Greg Copeland (Oracle) &amp;amp;#8212; coding; Server optimizations.&lt;br /&gt;
* Gregory Lundberg (TadCarlucci) &amp;amp;#8212; Cleanup of campaigns code&lt;br /&gt;
* [mailto:cornmander&amp;amp;#x40;cornmander&amp;amp;#x2E;com Gregory Shikhman] (corn) &amp;amp;#8212; coding; upload log maintenance/improvements&lt;br /&gt;
* Guillaume Melquiond (silene) &amp;amp;#8212; coding, bug fixes&lt;br /&gt;
* [mailto:billybiset&amp;amp;#x40;gmail&amp;amp;#x2E;com Guillermo Biset] (billynux) &amp;amp;#8212; Bug fixer, remover of upload stats, network module rewrite, ANA, boost::asio&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]]) &amp;amp;#8212; Miscellaneous WML, i18n and UI features, improvements and bugfixes; refactoring and extension of add-ons management code; features and refactoring of image-path functions mechanism; cache manager UI and paths/game version dialog; campaignd refactoring and maintenance&lt;br /&gt;
* Jérémy Rosen ([[User:Boucman|Boucman]]) &amp;amp;#8212; coder&lt;br /&gt;
* [mailto:mcnabb&amp;amp;#x40;gravity&amp;amp;#x2E;psu&amp;amp;#x2E;edu John W. C. McNabb] (Darth Fool) &amp;amp;#8212; coder, graphics&lt;br /&gt;
* Jon Daniel (worduk) &amp;amp;#8212; coder, bug fixes&lt;br /&gt;
* Jörg Hinrichs (Yogi Bear/YogiHH)&lt;br /&gt;
* [mailto:justin&amp;amp;#x2E;zaun&amp;amp;#x40;gmail&amp;amp;#x2E;com Justin Zaun] (jzaun) &amp;amp;#8212; coder, scenario designer&lt;br /&gt;
* Jyrki Vesterinen&lt;br /&gt;
* Karol Nowak (grzywacz) &amp;amp;#8212; bug fixes, sound sources, gp2x port&lt;br /&gt;
* [mailto:erl&amp;amp;#x40;erl&amp;amp;#x2E;se Kristoffer Erlandsson] (erl) &amp;amp;#8212; help system, editor&lt;br /&gt;
* [mailto:lao&amp;amp;#x2E;geek&amp;amp;#x40;gmail&amp;amp;#x2E;com Lao] ([[User:lao|lao]]) &amp;amp;#8212; bug fixes and candidate to GSoC 2008&lt;br /&gt;
* Mark de Wever ([[User:SkeletonCrew|Mordante/SkeletonCrew]]) &amp;amp;#8212; coder, bug fixes, various features, multi-letter terrain system, gui system.&lt;br /&gt;
* Martin Renold (maxy/martinxyz) &amp;amp;#8212; performance and gui bug fixes&lt;br /&gt;
* Matthias Kretz &amp;amp;#8212; optimizations&lt;br /&gt;
* Moritz Göbelbecker (mog) &amp;amp;#8212; Work on the terrain engine&lt;br /&gt;
* Nicolas Weeger (Ryo) &amp;amp;#8212; Python API&lt;br /&gt;
* [mailto:patrick_x99&amp;amp;#x40;hotmail&amp;amp;#x2E;com Patrick Parker] ([[User:Sapient|Sapient]]) &amp;amp;#8212; improvements to user interface, WML engine, various features&lt;br /&gt;
* [mailto:paniemin&amp;amp;#x40;cc&amp;amp;#x2E;hut&amp;amp;#x2E;fi Pauli Nieminen] (suokko) &amp;amp;#8212; Bug fixing; usually targeting MP or WML engine&lt;br /&gt;
* [mailto:philippe&amp;amp;#x2E;plantier&amp;amp;#x40;naema&amp;amp;#x2E;org Philippe Plantier] ([[User:Ayin|Ayin]]) &amp;amp;#8212; several parts of the code, notably terrain graphics code&lt;br /&gt;
* Rusty Russell (rusty)&lt;br /&gt;
* Sergey Popov (loonycyborg) &amp;amp;#8212; scons&lt;br /&gt;
* singalen &amp;amp;#8212; iOS port&lt;br /&gt;
* Soliton &amp;amp;#8212; bug fixes and various small features usually in multiplayer context&lt;br /&gt;
* Steve Cotton (octalot)&lt;br /&gt;
* Steven Oxley (xonev)&lt;br /&gt;
* Thomas Baumhauer (Baufo)&lt;br /&gt;
* [mailto:timotei21&amp;amp;#x40;gmail&amp;amp;#x2E;com Timotei Dolean] (timotei) &amp;amp;#8212; Eclipse UMC plugin&lt;br /&gt;
* Tomasz Śniatowski (ilor) &amp;amp;#8212; Editor&lt;br /&gt;
* [mailto:ydirson&amp;amp;#x40;altern&amp;amp;#x2E;org Yann Dirson] &amp;amp;#8212; gettext support, tinygui&lt;br /&gt;
* [mailto:terraninfo&amp;amp;#x40;terraninfo&amp;amp;#x2E;net Yurii Chernyi] (Crab) &amp;amp;#8212; AI&lt;br /&gt;
=== General Purpose Administration and Coordination ===&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; Current release manager (1.13.3-present)&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Crossbow/Miyo &amp;amp;#8212; Past release manager&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]]) &amp;amp;#8212; Past release manager (1.12.1-1.12.6 / 1.13.0-1.13.2)&lt;br /&gt;
* [mailto:isaac&amp;amp;#x40;sindominio&amp;amp;#x2E;net Isaac Clerencia] &amp;amp;#8212; Past release manager, Debian packager&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; Past release manager, internationalization manager, OpenPandora packager, A Tale of Two Brothers, German translation&lt;br /&gt;
* Noy &amp;amp;#8212; General purpose administration, unit balancing&lt;br /&gt;
* Pentarctagon&lt;br /&gt;
=== Internationalization Managers ===&lt;br /&gt;
* Cédric Duval &amp;amp;#8212; coder, internationalization manager&lt;br /&gt;
* David Philippi (Torangan) &amp;amp;#8212; internationalization manager, wescamp&lt;br /&gt;
* Mark Michelsen (skovbaer) &amp;amp;#8212; Slackware packager&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; administrator, release manager, internationalization manager, OpenPandora packager, A Tale of Two Brothers, german translation&lt;br /&gt;
* [mailto:susanna&amp;amp;#x2E;bjorverud&amp;amp;#x40;telia&amp;amp;#x2E;com Susanna Björverud] (sanna)&lt;br /&gt;
=== Trailers ===&lt;br /&gt;
* ancestral &amp;amp;#8212; 1.12 trailer&lt;br /&gt;
* Pedro Caseiro (Kasdel) &amp;amp;#8212; 1.14 trailer&lt;br /&gt;
=== Artwork and Graphics ===&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; portrait director - focus on loyalists, trolls, monsters&lt;br /&gt;
* Francisco Muñoz (fmunoz) &amp;amp;#8212; founding artist and former lead artist, worked consistently on all aspects till around v0.7-0.9.&lt;br /&gt;
* Hogne Håskjold (frame/freim) &amp;amp;#8212; terrain art director, made much of the current terrains (esp. mountains)&lt;br /&gt;
* J.W. Bjerk ([[User:Eleazar|Eleazar]]) &amp;amp;#8212; terrain art director (esp. Chasm, Cave, Water), sprite animations, various visual tweaks&lt;br /&gt;
* James Woo (Pickslide) &amp;amp;#8212; portraits (major focus on orcs and campaigns, especially UtBS, TEI, TSoF)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portrait director - focus on mages/necromancers, elvish, naga, merfolk, and troll unit trees&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; sprite animation, various visual tweaks, titlescreen and campaign maps (v1.11+), water animations (v1.13+)&lt;br /&gt;
* Neoriceisgood &amp;amp;#8212; sprite creator and animator (major focus on drakes, dwarves, saurians)&lt;br /&gt;
* Pekka Aikio (pekka) &amp;amp;#8212; tiles, esp. castles, and attack icons&lt;br /&gt;
* Phil Barber (thespaceinvader) &amp;amp;#8212; Dwarf and Saurian portraits, most of the drake animations, and a large amount on other stuff, esp. the dwarves.&lt;br /&gt;
* Richard Kettering ([[User:Jetryl|Jetrel]]) &amp;amp;#8212; art director/slave, major focus on sprites, portraits, buildings, and icons&lt;br /&gt;
* Timo Honkasalo (Sgt. Groovy) &amp;amp;#8212; New high-res logo for the game&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Alex Jarocha-Ernst (Jormungandr) &amp;amp;#8212; portraits&lt;br /&gt;
* Christophe Anjard (Christophe33) &amp;amp;#8212; made many of the old (c. v0.6) terrains, and some sprites for the dwarves&lt;br /&gt;
* Erkki Lonkainen (Eternal) &amp;amp;#8212; created and animated many replacement sprites (esp. ogre, orc assassin &amp;amp; spear units, and cockatrice)&lt;br /&gt;
* Jason Lutes &amp;amp;#8212; portraits (major focus on humans, some campaign portraits)&lt;br /&gt;
* Johann de Venecia (Johann) &amp;amp;#8212; drew the new campaign story art for HttT&lt;br /&gt;
* Leonhard &amp;amp;#8212; made several of the new attack icons&lt;br /&gt;
* Marcus Rosén (sleepwalker) &amp;amp;#8212; Animations (esp. Saurians, Dwarves, Horseman), dunefolk sprites, and portraits (Mermaid Initiate &amp;amp; Dune Herbalist)&lt;br /&gt;
* Mark Goodenough (Ranger M) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Maximiliano Buis (Redeth) &amp;amp;#8212; Made nearly all of the idle animations, and some death animations (as of 1.3.1)&lt;br /&gt;
* Michael Gil de Muro (grp21) &amp;amp;#8212; portraits (for the campaign 'The Rise of Wesnoth')&lt;br /&gt;
* Moritz Göbelbecker (mog) &amp;amp;#8212; tiles, esp. swamp, encampment, ice, and work with lava/chasm&lt;br /&gt;
* Niall Burton (Leonard03) &amp;amp;#8212; Minimalistic logo render&lt;br /&gt;
* Peter Geinitz (Shadow/Wayfarer) &amp;amp;#8212; sprite creator and animator&lt;br /&gt;
* Robert Bolin (Zebulon) &amp;amp;#8212; tiles, sprite editing and animations&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Andrew James Patterson (Kamahawk) &amp;amp;#8212; sprites&lt;br /&gt;
* antwerpz &amp;amp;#8212; sprite creator/animator for old saurian units&lt;br /&gt;
* Diego Brea (Cobretti) &amp;amp;#8212; sprite creator/animator&lt;br /&gt;
* EEL (EELuminatus) &amp;amp;#8212; sprite animator, provided death animations for the woses, some of the orcs, and an attack animation for the revenant&lt;br /&gt;
* Eli Dupree (Elvish Pillager) &amp;amp;#8212; sprites and animations&lt;br /&gt;
* Eric Holdos (Rev. V!)&lt;br /&gt;
* Gareth Miller (Gafgarion) &amp;amp;#8212; made some early sprites/tiles&lt;br /&gt;
* Gerald Clears (Smok'em Jags) &amp;amp;#8212; sprite animator&lt;br /&gt;
* James Barton (Sangel) &amp;amp;#8212; sprites&lt;br /&gt;
* Jami &amp;amp;#8212; rogue death and red mage idle animations&lt;br /&gt;
* Jerzy Brzozowski (Mefisto) &amp;amp;#8212; Various sprites and animations, tropical forests.&lt;br /&gt;
* Jesse Holland (Kestenvarn) &amp;amp;#8212; map illustrator of old titlescreen and campaign maps (v1.1 - v1.10)&lt;br /&gt;
* Johanna Manninen (lohari) &amp;amp;#8212; edited tiles, ported freeciv tiles used in very early versions of wesnoth&lt;br /&gt;
* John Muccigrosso (Eponymous Archon) &amp;amp;#8212; made some early sprites, such as the human bowmen&lt;br /&gt;
* Kuno Raffin (lurker) &amp;amp;#8212; Various terrain artwork&lt;br /&gt;
* Michael Mielewczik (Mille) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Mikko Kraft (Deserter) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Musketaquid &amp;amp;#8212; animated windmill / stone path&lt;br /&gt;
* Slainte &amp;amp;#8212; made sprites for c. v0.6 mages, also made many of the old attack icons&lt;br /&gt;
* Simon Forsyth (Alarantalara) &amp;amp;#8212; cave terrain&lt;br /&gt;
* Stephen Metcalf (Neoskel) &amp;amp;#8212; major help with shadow standardization (over half the units), made some missing zombie variants&lt;br /&gt;
* Stephen Stone (Disto) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Svetac &amp;amp;#8212; made many of the old attack icons&lt;br /&gt;
* Tristan Millner (tatmf) &amp;amp;#8212; made old portrait of dwarven fighter&lt;br /&gt;
* Zhukov &amp;amp;#8212; sprite animator&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* Aaron Redfern (A-Red) &amp;amp;#8212; Sprites and animations&lt;br /&gt;
* Adrian Sheehy (Major) &amp;amp;#8212; various sprites animations&lt;br /&gt;
* Alexander Brown (Cloud) &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Anton Ecker (Kaldred) &amp;amp;#8212; burnt villages&lt;br /&gt;
* battlestar &amp;amp;#8212; - some scenery graphics including burnt tent.&lt;br /&gt;
* Ben Wenzel (artisticdude) &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; New storm trident, staff and ankh item pictures, various attack icons, river ford tiles, drake and human city villages&lt;br /&gt;
* Bora Orcal (bera) &amp;amp;#8212; Goblin portrait sketches&lt;br /&gt;
* Cernunnos &amp;amp;#8212; merfolk villages&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; Icons for new editor and updated terrain icons&lt;br /&gt;
* Chris Wilson (Valkier) &amp;amp;#8212; portraits&lt;br /&gt;
* Christian Sirviö (Girgistian) &amp;amp;#8212; portraits (sketches), and some attack animations for the orcs&lt;br /&gt;
* Clinton Bell &amp;amp;#8212; various animations&lt;br /&gt;
* Dan Gerhards (beetlenaut) &amp;amp;#8212; various sprites and animations&lt;br /&gt;
* Daniel Borgmann (dborg) &amp;amp;#8212; semi-transparent map grid&lt;br /&gt;
* Daniel Foerster (pydsigner/pyndragon) &amp;amp;#8212; Icon overlays for the About dialog button&lt;br /&gt;
* Kwandulin &amp;amp;#8212; Standing animations (Skeleton Archer, Bone Shooter, Orcish Archer, Dwarvish Fighter, Ulfserker, Stalwart, Runesmith), minor fixes&lt;br /&gt;
* doofus-01 &amp;amp;#8212; orcish fort and villages, desert mountains, mine walls, sea forts, portraits for walking corpse and soulless&lt;br /&gt;
* Elena Astanina (ayona) &amp;amp;#8212; log-cabin villages&lt;br /&gt;
* Eric Butler (Erk) &amp;amp;#8212; desert and merfolk villages&lt;br /&gt;
* Evan Crook (Flametrooper) &amp;amp;#8212; sprite animator (TC conversion)&lt;br /&gt;
* Garrett Wessner (Stilgar) &amp;amp;#8212; gold coin pile&lt;br /&gt;
* Gideon Chia (Deonjo) &amp;amp;#8212; new 'units' icon for general status bar&lt;br /&gt;
* Guangcong Luo (Zarel) &amp;amp;#8212; Multiplayer status icons for 1.7.x&lt;br /&gt;
* Highhole &amp;amp;#8212; revised storm trident&lt;br /&gt;
* Homunculus &amp;amp;#8212; dead great tree terrain&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]]) &amp;amp;#8212; Minor item/unit edits; animated lit brazier; ported gryphon rider animation to generic gryphon; Ancient Lich for 1.12.x&lt;br /&gt;
* Irrevenant &amp;amp;#8212; Skeleton archer death and recruit animations, new ankh touch ups, new dark adept touch ups, elvish marshal standing animation&lt;br /&gt;
* Irwin Ismail (Swordy) &amp;amp;#8212; original projectile/attack icon for chakram&lt;br /&gt;
* Jason Frailey (Valdroni) &amp;amp;#8212; scorpion portrait&lt;br /&gt;
* Jimmy Olsson (Azlan) &amp;amp;#8212; made old icons for windows version&lt;br /&gt;
* Joakim Persson (JAP) &amp;amp;#8212; Knalgan flag set&lt;br /&gt;
* John Mercer (Stern) &amp;amp;#8212; Giant Rat graphics&lt;br /&gt;
* John-Robert Funck (XJaPaN) &amp;amp;#8212; sprite animator&lt;br /&gt;
* Jonatan Alamà (tin) &amp;amp;#8212; made red logo used until before v1.0&lt;br /&gt;
* Justin Nichols (JustinOperable) &amp;amp;#8212; Portrait artwork&lt;br /&gt;
* Kim Holm (DUHH) &amp;amp;#8212; Portrait artwork&lt;br /&gt;
* Lukasz Wawrowski (inferno8) &amp;amp;#8212; Drake attack icons with fmunoz and map backgrounds for Isar’s Cross&lt;br /&gt;
* Lordlewis &amp;amp;#8212; mace item sprite&lt;br /&gt;
* Mattias Westlund (West) &amp;amp;#8212; new color cursors&lt;br /&gt;
* Nicholas Kerpan (Thrawn) &amp;amp;#8212; human thief portrait&lt;br /&gt;
* Pixelmind &amp;amp;#8212; various animations&lt;br /&gt;
* Randall Walls (slightcrazed) &amp;amp;#8212; sprite animator&lt;br /&gt;
* rhyging5 &amp;amp;#8212; various animations&lt;br /&gt;
* RusHHouR &amp;amp;#8212; New signpost (1.4.1)&lt;br /&gt;
* Samuel Wilson (megane) &amp;amp;#8212; random dice icon fix after 1.4.0&lt;br /&gt;
* Santiago Iborra (Quellion) &amp;amp;#8212; Portrait artwork&lt;br /&gt;
* Simeon Dear (Trilby) &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Zoomo &amp;amp;#8212; Sprite animations&lt;br /&gt;
* Zaggy1024 &amp;amp;#8212; Wolf rider death animation&lt;br /&gt;
* Eisfrei &amp;amp;#8212; Elvish shaman idle animations&lt;br /&gt;
* Happy Wose &amp;amp;#8212; Wose idle frames and Elder wose death animation&lt;br /&gt;
* Wolfy &amp;amp;#8212; Female arch mage idle animation&lt;br /&gt;
* mystic x the unknown &amp;amp;#8212; Mage death animation&lt;br /&gt;
* Sonny T Yamada (SkyOne) &amp;amp;#8212; shadow standardization of many campaign units&lt;br /&gt;
* Vincent Langner (Vyncyn) &amp;amp;#8212; Walking Corpse and Soulless wolf variations, young roc base and attack sprite&lt;br /&gt;
* ZygoUgo &amp;amp;#8212; Giant Rat portrait&lt;br /&gt;
* ghype &amp;amp;#8212; sprite animation and dunefolk base frames&lt;br /&gt;
=== Music ===&lt;br /&gt;
* Aleksi Aubry-Carlson (Aleksi)&lt;br /&gt;
* Doug Kaufman (dkaufman) &amp;amp;#8212; http://dougkaufman.net/&lt;br /&gt;
* Gianmarco Leone (gmlion)&lt;br /&gt;
* Jeremy Nicoll (jeremy2/eltiare)&lt;br /&gt;
* Joseph Toscano (ZhayTee) &amp;amp;#8212; zhaymusic.com&lt;br /&gt;
* Mattias Westlund (West) &amp;amp;#8212; music coordinator/composer&lt;br /&gt;
* Ryan Reilly (Rain)&lt;br /&gt;
* Stephen Rozanc (TreizeCouleurs)&lt;br /&gt;
* Timothy Pinkham (TimothyP)&lt;br /&gt;
* Tyler Johnson&lt;br /&gt;
=== Sound Effects ===&lt;br /&gt;
* Corey Woodworth (woodwizzle) &amp;amp;#8212; hit and die sounds&lt;br /&gt;
* J.W. Bjerk ([[User:Eleazar|Eleazar]])&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; focus on attack, weapon and user interface sounds&lt;br /&gt;
* Adam Rinsky (Action Jack) &amp;amp;#8212; dwarf hit and die sounds&lt;br /&gt;
* Leonardo Magno Sampaio (leorock116) &amp;amp;#8212; mace, staff and club sounds&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Asa Swain (quartex) &amp;amp;#8212; Under the Burning Suns&lt;br /&gt;
* Astrid Halberkamp &amp;amp;#8212; Campaign maintenance and various improvements&lt;br /&gt;
* Benjamin Drieu&lt;br /&gt;
* Charles Dang (vultraz) &amp;amp;#8212; Campaign maintenance and various improvements&lt;br /&gt;
* Dacyn&lt;br /&gt;
* Dan Gerhards (beetlenaut) &amp;amp;#8212; Dead Water, Secrets of the Ancients&lt;br /&gt;
* David White (Sirp) &amp;amp;#8212; Heir to the Throne&lt;br /&gt;
* Eric J. Mesoy (Circon) &amp;amp;#8212; A Tale of Two Brothers&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; The Hammer of Thursagan&lt;br /&gt;
* esci &amp;amp;#8212; Descent into Darkness&lt;br /&gt;
* Francisco Muñoz (fmunoz) &amp;amp;#8212; founding artist and former lead artist, worked consistently on all aspects till around v0.7-0.9.&lt;br /&gt;
* James Spencer (Shade) &amp;amp;#8212; The Rise of Wesnoth&lt;br /&gt;
* Jeffrey 'Sigurd' Westcoat (SigurdFireDragon)&lt;br /&gt;
* Joseph Simmons (Turin) &amp;amp;#8212; The Eastern Invasion, The Sceptre of Fire&lt;br /&gt;
* Justin Zaun (jzaun) &amp;amp;#8212; coder, scenario designer&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; redesign of various scenarios and other enhancement&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; A Tale of Two Brothers&lt;br /&gt;
* Santi/fnaek &amp;amp;#8212; The Legend of Wesmere&lt;br /&gt;
* Scott Klempner &amp;amp;#8212; Heir to the Throne, The Rise of Wesnoth, Liberty&lt;br /&gt;
* Taurus &amp;amp;#8212; Northern Rebirth, Son of the Black-Eye&lt;br /&gt;
* William Carey (aelius) &amp;amp;#8212; The South Guard&lt;br /&gt;
=== Multiplayer Maps and Balancing ===&lt;br /&gt;
* George Birthisel (happygrue/Wintermute) &amp;amp;#8212; Unit balancing, Dunefolk Era&lt;br /&gt;
* Hejnewar &amp;amp;#8212; balancing for Age of Heroes, revised dunefolk&lt;br /&gt;
* Jake Bailey (jb) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* Joshua Northey (Becephalus) &amp;amp;#8212; multiplayer maps (mostly 2vs2 and up)&lt;br /&gt;
* Mike Quiñones (Doc Paterson) &amp;amp;#8212; multiplayer maps (mostly 1vs1)&lt;br /&gt;
* Noy &amp;amp;#8212; general purpose administration, unit balancing&lt;br /&gt;
* Peter Groen (pg) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* Ruben Philipp Wickenhäuser (The Very Uhu) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* Soliton &amp;amp;#8212; unit balancing&lt;br /&gt;
* Tom Chance (telex4) &amp;amp;#8212; multiplayer maps&lt;br /&gt;
* [mailto:kleinfel&amp;amp;#x40;wpi&amp;amp;#x2E;edu Zack Kleinfeld] &amp;amp;#8212; multiplayer maps, unit balancing&lt;br /&gt;
=== Packagers ===&lt;br /&gt;
* ancestral &amp;amp;#8212; Apple OS X packager (1.12.1 and later)&lt;br /&gt;
* [mailto:hrubymar10&amp;amp;#x40;gmail&amp;amp;#x2E;com Martin Hrubý] ([[User:hrubymar10|hrubymar10]]) &amp;amp;#8212; Apple macOS packager (1.13.11 and later)&lt;br /&gt;
* Matthias Schoeck (mattsc) &amp;amp;#8212; Apple OS X packager (1.11.8 and later)&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic) &amp;amp;#8212; OpenPandora packager&lt;br /&gt;
* Rhonda D'Vine (Rhonda) &amp;amp;#8212; Debian/Ubuntu packager&lt;br /&gt;
* Sebastian Kölle (aquileia) &amp;amp;#8212; Visual Studio SDK maintainer&lt;br /&gt;
* Sergey Popov (loonycyborg) &amp;amp;#8212; Microsoft Windows packager and MinGW SDK maintainer&lt;br /&gt;
* [mailto:ports&amp;amp;#x40;toco-domains&amp;amp;#x2E;de Torsten Zühlsdorff] &amp;amp;#8212; FreeBSD Packager&lt;br /&gt;
* Vincent Cheng (vincent_c) &amp;amp;#8212; Debian/Ubuntu packager&lt;br /&gt;
&amp;lt;hr style='clear:none'&amp;gt;&lt;br /&gt;
* [mailto:ben&amp;amp;#x40;happyspork&amp;amp;#x2E;com Ben Anderman] (crimson_penguin) &amp;amp;#8212; Apple OS X packager (for 1.5.6 and later)&lt;br /&gt;
* Cyril Bouthors (CyrilB) &amp;amp;#8212; Debian packager, patron&lt;br /&gt;
* Darryl Dixon&lt;br /&gt;
* edge&lt;br /&gt;
* Isaac Clerencia &amp;amp;#8212; Debian packager&lt;br /&gt;
* Jay Hopping&lt;br /&gt;
* Jörg Hinrichs (Yogi Bear/YogiHH) &amp;amp;#8212; Microsoft Windows packager&lt;br /&gt;
* Laurent Wacrenier (lwa) &amp;amp;#8212; Apple OS X packager (for v1.4 and before)&lt;br /&gt;
* Marcin Konicki (ahwayakchih) &amp;amp;#8212; BeOS packager&lt;br /&gt;
* Marcus Phillips (Sithrandel) &amp;amp;#8212; Apple OS X packager (for v1.0 and before)&lt;br /&gt;
* Mark Michelsen (skovbaer) &amp;amp;#8212; Slackware packager&lt;br /&gt;
* Muhammad Amir Ayub (anakayub) &amp;amp;#8212; Apple OS X packager&lt;br /&gt;
* Piotr Cychowski (Mist/cycholka) &amp;amp;#8212; Microsoft Windows packager&lt;br /&gt;
* singalen &amp;amp;#8212; iOS port&lt;br /&gt;
* Simon Forsyth (Alarantalara) &amp;amp;#8212; Apple OS X Packager (1.9.6 and later)&lt;br /&gt;
* Vlad Glagolev (Stealth) &amp;amp;#8212; OpenBSD packager&lt;br /&gt;
=== Miscellaneous Contributors ===&lt;br /&gt;
* Aaron Keisch-Walter (Exasperation)&lt;br /&gt;
* Aaron Winter (Byteron)&lt;br /&gt;
* Adam Leffew&lt;br /&gt;
* Adrian Iosif (Zappaman)&lt;br /&gt;
* Aishiko &amp;amp;#8212; Unit instance recall cost implementation&lt;br /&gt;
* Alek Bollig (binarycoder)&lt;br /&gt;
* Alesis Novik&lt;br /&gt;
* Aline Riss (akihara)&lt;br /&gt;
* Amir Hassan (kallaballa)&lt;br /&gt;
* Andris Szell (bandita137)&lt;br /&gt;
* André Knispel&lt;br /&gt;
* Andrea Palmatè (afxgroup)&lt;br /&gt;
* Andrius Šilinskas (thunderstruck)&lt;br /&gt;
* Andrius Štikonas&lt;br /&gt;
* Anja Keicher (ayne)&lt;br /&gt;
* Astrid Halberkamp&lt;br /&gt;
* Ben Anderman (crimson_penguin) &amp;amp;#8212; unit list&lt;br /&gt;
* Boldizsár Lipka (lipk)&lt;br /&gt;
* Brilliand&lt;br /&gt;
* Burkay Özdemir (Velory) &amp;amp;#8212; Poisoning improvement for Formula AI&lt;br /&gt;
* chisquare130&lt;br /&gt;
* Chris Carpenter (mordocai)&lt;br /&gt;
* Chris Hopman (cjhopman)&lt;br /&gt;
* Chris Mann (WildPenguin) &amp;amp;#8212; Emacs WML-mode&lt;br /&gt;
* Chusslove Illich (caslav.ilic) &amp;amp;#8212; wmlxgetext improvements&lt;br /&gt;
* David Slabý (blaf)&lt;br /&gt;
* Daniel Bruegmann&lt;br /&gt;
* David Mikos (Coffee) &amp;amp;#8212; Coder, animation framework improvements.&lt;br /&gt;
* Denny Vaccaro (endercoaster)&lt;br /&gt;
* Derek (Gambit)&lt;br /&gt;
* devnexen&lt;br /&gt;
* DisherProject&lt;br /&gt;
* Dmitry K. (nephro)&lt;br /&gt;
* Doug Rosvick ([[User:dlr365|dlr365]])&lt;br /&gt;
* dorng&lt;br /&gt;
* dreamer-88&lt;br /&gt;
* Dugi &amp;amp;#8212; Context-free name generator&lt;br /&gt;
* Duthlet&lt;br /&gt;
* EarthCake&lt;br /&gt;
* Edward Chernenko&lt;br /&gt;
* Ekdohibs&lt;br /&gt;
* elvish_sovereign&lt;br /&gt;
* Ely Levy (Nakee)&lt;br /&gt;
* Étienne Simon (ejls)&lt;br /&gt;
* Etkin Baris Ozgul (pokhbocee) &amp;amp;#8212; Lua AI&lt;br /&gt;
* Eugene Kosov (kevg)&lt;br /&gt;
* [mailto:eugeni&amp;amp;#x2E;stepanov&amp;amp;#x40;gmail&amp;amp;#x2E;com Evgeniy Stepanov] &amp;amp;#8212; NativeClient port&lt;br /&gt;
* Evgeny Kapun&lt;br /&gt;
* FAAB&lt;br /&gt;
* Federico Pasco (neverEnough)&lt;br /&gt;
* Fedor Khod'kov (teddy/fkhodkov)&lt;br /&gt;
* Felix Bauer (flix)&lt;br /&gt;
* Fernando Carmona (Ferk)&lt;br /&gt;
* Floris Kint (Grimling)&lt;br /&gt;
* Francesco Gigli (Jaramir)&lt;br /&gt;
* Frank Richter (res)&lt;br /&gt;
* Frédéric Wagner&lt;br /&gt;
* Fredrik Wikstrom (salass00)&lt;br /&gt;
* galegosimpatico&lt;br /&gt;
* Galen Brooks (fluffbeast)&lt;br /&gt;
* gh0st &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* Gregory Gauthier (rjaguar3)&lt;br /&gt;
* Groggy Dice (groggydice) &amp;amp;#8212; wmllint enhancements&lt;br /&gt;
* [mailto:kevin&amp;amp;#x2E;xgr&amp;amp;#x40;gmail&amp;amp;#x2E;com Guorui Xi] (Kevin_Xi)&lt;br /&gt;
* Hans-Joachim Gurt (HaJo)&lt;br /&gt;
* Herb Pah (haiz)&lt;br /&gt;
* holius-fr&lt;br /&gt;
* IceTyp&lt;br /&gt;
* ilyapopov&lt;br /&gt;
* J. Tyne (JaMiT)&lt;br /&gt;
* J.R. Blain (Cowboy)&lt;br /&gt;
* jstitch&lt;br /&gt;
* Jacek Kominek (BroodKiller)&lt;br /&gt;
* [mailto:benetnash&amp;amp;#x40;icpnet&amp;amp;#x2E;pl Jan Polak] (benetnash) &amp;amp;#8212; Formula AI contributions&lt;br /&gt;
* Jan Zvánovec (jaz)&lt;br /&gt;
* [mailto:babataz&amp;amp;#x40;gmail&amp;amp;#x2E;com Jean-Baptiste Poittevin] (BBT)&lt;br /&gt;
* Jeff Breidenbach (jab) &amp;amp;#8212; Bilinear interpolation&lt;br /&gt;
* [mailto:jleldridge27&amp;amp;#x40;gmail&amp;amp;#x2E;com Jeffrey Eldridge] (jleldridge)&lt;br /&gt;
* Jérôme (segfault)&lt;br /&gt;
* Jim Carroll (Jimm)&lt;br /&gt;
* Jody Northup (Upthorn) &amp;amp;#8212; Prospective student (world persistence)&lt;br /&gt;
* Joeri Melis&lt;br /&gt;
* Joey L. Maalouf (JDog)&lt;br /&gt;
* [mailto:john&amp;amp;#x40;jo&amp;amp;#x2E;hnanthony&amp;amp;#x2E;com John Anthony] &amp;amp;#8212; campaignd work, mainly security-based&lt;br /&gt;
* John B. Messerly (jbm)&lt;br /&gt;
* John Harvey (johndh) &amp;amp;#8212; minor race descriptions; bats, goblins, mechanical, merfolk, monster, naga, ogre&lt;br /&gt;
* Jonathan Combs (ScegfOd) &amp;amp;#8212; log activating dialog&lt;br /&gt;
* Jonas Lihnell (Roze)&lt;br /&gt;
* Jonas Kölker&lt;br /&gt;
* [mailto:jorda&amp;amp;#x40;ettin&amp;amp;#x2E;org Jordà Polo] (ettin) &amp;amp;#8212; website, i18n, ui&lt;br /&gt;
* Josef Reidinger (qk)&lt;br /&gt;
* Joseph Gelfand&lt;br /&gt;
* Joshua Hudson&lt;br /&gt;
* josteph&lt;br /&gt;
* Jozrael&lt;br /&gt;
* Justin DiSabatino (Turuk)&lt;br /&gt;
* Kamil Kaczmarczyk (lampak)&lt;br /&gt;
* [mailto:karl&amp;amp;#x2E;miller&amp;amp;#x2E;km&amp;amp;#x40;gmail&amp;amp;#x2E;com Karl Miller] (karlm)&lt;br /&gt;
* Karol Kozub (automagic)&lt;br /&gt;
* Kevin Montalva (Ryckes)&lt;br /&gt;
* Kevin Yap (iKevinY)&lt;br /&gt;
* Konrad Schwede (Konrad2)&lt;br /&gt;
* Kristoffer Grönlund (kegie)&lt;br /&gt;
* Krogen&lt;br /&gt;
* Laurent Birtz&lt;br /&gt;
* legoktm&lt;br /&gt;
* leonardoInf&lt;br /&gt;
* lilinitsy&lt;br /&gt;
* Lovens Weche (LovCAPONE)&lt;br /&gt;
* Luiz Fernando de Faria Pereira (lfernando)&lt;br /&gt;
* [mailto:lutheroto&amp;amp;#x40;gmail&amp;amp;#x2E;com Luther Thompson]&lt;br /&gt;
* lv-zheng&lt;br /&gt;
* [mailto:code&amp;amp;#x40;hryniuk&amp;amp;#x2E;pl Łukasz Hryniuk]&lt;br /&gt;
* Maksim Orlovich (SadEagle)&lt;br /&gt;
* Mark McGuire (TronPaul)&lt;br /&gt;
* Martin Bede &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* [mailto:hrubymar10&amp;amp;#x40;gmail&amp;amp;#x2E;com Martin Hrubý] ([[User:hrubymar10|hrubymar10]])&lt;br /&gt;
* Mateusz Kolaczek (PL_kolek)&lt;br /&gt;
* Matt Renfer (Des) &amp;amp;#8212; Prose revision&lt;br /&gt;
* Matthias Schoeck (mattsc) &amp;amp;#8212; AI improvements&lt;br /&gt;
* matthiaskrgr &amp;amp;#8212; Running address sanitizer to catch leaks&lt;br /&gt;
* Maxim Biro (nurupo)&lt;br /&gt;
* Maximilian Fricke (madmax28)&lt;br /&gt;
* Maximilian Lupke (malumalu)&lt;br /&gt;
* Marius Spix (spixi)&lt;br /&gt;
* Michael Flowers (MJ)&lt;br /&gt;
* Michael Schmahl&lt;br /&gt;
* Michael Strebel (Nostromus)&lt;br /&gt;
* midzer&lt;br /&gt;
* Miguel Zapico (elricz)&lt;br /&gt;
* mstrebel&lt;br /&gt;
* [mailto:greywhind&amp;amp;#x40;users&amp;amp;#x2E;sourceforge&amp;amp;#x2E;net Nathan Partlan] ([[User:Greywhind|Greywhind]])&lt;br /&gt;
* [mailto:nathan&amp;amp;#x2E;b&amp;amp;#x2E;walker&amp;amp;#x40;vanderbilt&amp;amp;#x2E;edu Nathan Walker] (RiftWalker)&lt;br /&gt;
* neoedmund&lt;br /&gt;
* newfrenchy83&lt;br /&gt;
* Niall Burton (Leonard03)&lt;br /&gt;
* niegenug&lt;br /&gt;
* Nobun &amp;amp;#8212; wmlxgettext&lt;br /&gt;
* [mailto:zabivator&amp;amp;#x40;gmail&amp;amp;#x2E;com Oleg Tsarev]&lt;br /&gt;
* Olivier Faure (PoignardAzur)&lt;br /&gt;
* [mailto:asqueados&amp;amp;#x40;gmail&amp;amp;#x2E;com Pablo J. Urbano Santos] ([[User:Lord Ork|Lord Ork]])&lt;br /&gt;
* Patryk Obara (dreamer_)&lt;br /&gt;
* Paul Smedley (Creeping)&lt;br /&gt;
* Paŭlo Ebermann ([[User:Pauxlo|Pauxlo]])&lt;br /&gt;
* PBechon&lt;br /&gt;
* Peter Elmers&lt;br /&gt;
* Peter Mawhorter ([[User:solsword|solsword]]) &amp;amp;#8212; Python TC script upgrade&lt;br /&gt;
* Petr Sobotka (Pietro)&lt;br /&gt;
* [mailto:root&amp;amp;#x40;delroth&amp;amp;#x2E;is-a-geek&amp;amp;#x2E;org Pierre Bourdon] (delroth)&lt;br /&gt;
* pquentin&lt;br /&gt;
* Pranav Deshpande (universecoder)&lt;br /&gt;
* Priit Laes (plaes)&lt;br /&gt;
* Pubudu Gunawardena (ugudu)&lt;br /&gt;
* Qi Mo (qmo2015)&lt;br /&gt;
* Quetzalcoatl&lt;br /&gt;
* Randy Kostiuk (Randypk) &amp;amp;#8212; Bug fixes&lt;br /&gt;
* RatArmy (fujimo-t)&lt;br /&gt;
* Reuben Rakete (rocketbang)&lt;br /&gt;
* Richard Yao (srk9) &amp;amp;#8212; Bug fixes&lt;br /&gt;
* Rikard Falkeborn&lt;br /&gt;
* Robert Spencer &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* Robert Wallace (Robertdebrus)&lt;br /&gt;
* Rocco J Carello (rogue)&lt;br /&gt;
* Roland Hautz (duncan_shriek)&lt;br /&gt;
* Rolf Sievers (Lizard)&lt;br /&gt;
* Ronny Standtke&lt;br /&gt;
* rrigby&lt;br /&gt;
* Ryan Frame&lt;br /&gt;
* Ryan Henszey&lt;br /&gt;
* Ryan Roden-Corrent (rcorre) &amp;amp;#8212; Hotkey release and scroll key rebinding&lt;br /&gt;
* [mailto:sachith500&amp;amp;#x40;gmail&amp;amp;#x2E;com Sachith Seneviratne] (sachith500) &amp;amp;#8212; Bug fixes at the moment. GSoC Aspirant&lt;br /&gt;
* Samuel Kim &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* Sean Yeh&lt;br /&gt;
* Sebastian Goll (afran)&lt;br /&gt;
* Sebastian Kölle (aquileia)&lt;br /&gt;
* Serge Martin (EdB)&lt;br /&gt;
* [mailto:stomasortiz&amp;amp;#x40;gmail&amp;amp;#x2E;com Sergio Tomás Ortiz]&lt;br /&gt;
* Severin Glöckner (Shiki, Sevu)&lt;br /&gt;
* Simon Forsyth (Alarantalara)&lt;br /&gt;
* [mailto:simon_smith&amp;amp;#x40;zen&amp;amp;#x2E;co&amp;amp;#x2E;uk Simon Smith] ([[User:Simons_Mith|Simons Mith]]) &amp;amp;#8212; Style guide, help with the application of the style guide, and some tips&lt;br /&gt;
* SoapGentoo&lt;br /&gt;
* starius&lt;br /&gt;
* Stéphane Gimenez (gim)&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* [mailto:sylecn&amp;amp;#x40;gmail&amp;amp;#x2E;com sylecn]&lt;br /&gt;
* [mailto:nsytyi&amp;amp;#x40;gmail&amp;amp;#x2E;com Sytyi Nick] (Sytyi) &amp;amp;#8212; WML validation&lt;br /&gt;
* [mailto:ptablot&amp;amp;#x40;mopong&amp;amp;#x2E;net Talbot Pierre] (Trademark)&lt;br /&gt;
* Tamas K. (negusnyul)&lt;br /&gt;
* techtonik&lt;br /&gt;
* the_beagle &amp;amp;#8212; Wose race description&lt;br /&gt;
* The Gnat&lt;br /&gt;
* Thibault Févry (iwontbecreative) &amp;amp;#8212; Some GCI tasks and utils/wiki_grabber.py cleanup.&lt;br /&gt;
* Thom Diment (UnwiseOwl)&lt;br /&gt;
* [mailto:hankerspace&amp;amp;#x40;gmail&amp;amp;#x2E;com Thomas Martinet] (hankerspace)&lt;br /&gt;
* [mailto:thomas&amp;amp;#x2E;prevost&amp;amp;#x40;gmail&amp;amp;#x2E;com Thomas Prevost] (zancdar)&lt;br /&gt;
* Thonsew&lt;br /&gt;
* Thorny23&lt;br /&gt;
* Tobias Frei (ToBeFree)&lt;br /&gt;
* Tomasz Sikorski (Tomsik)&lt;br /&gt;
* Tommy Schmitz&lt;br /&gt;
* Tommy (yobbo)&lt;br /&gt;
* Toom Lõhmus (Ravana)&lt;br /&gt;
* tsr&lt;br /&gt;
* Valentin Deschaintre (Zazweda, Epyde) &amp;amp;#8212; Zone guardian Micro AI&lt;br /&gt;
* vitiv &amp;amp;#8212; 2012 Google Code-in Students' Micro AI development&lt;br /&gt;
* [mailto:viy&amp;amp;#x40;altlinux&amp;amp;#x2E;org viy]&lt;br /&gt;
* Vladimír Slávik &amp;amp;#8212; Miscellaneous text formatting and translation engine related help&lt;br /&gt;
* vn971, vgaming&lt;br /&gt;
* Wedge009&lt;br /&gt;
* Yang Yifan (Xara)&lt;br /&gt;
* Zas&lt;br /&gt;
=== Bots ===&lt;br /&gt;
* CIA&lt;br /&gt;
* irker&lt;br /&gt;
* janebot&lt;br /&gt;
* shikadibot&lt;br /&gt;
* wesbot&lt;br /&gt;
== Translators ==&lt;br /&gt;
=== Afrikaans Translation ===&lt;br /&gt;
* András Salamon (ott)&lt;br /&gt;
* Erhard Eiselen&lt;br /&gt;
* Len van Dalsen (Numbers13) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Nico Oliver (nicoza)&lt;br /&gt;
* Renier Maritz&lt;br /&gt;
=== Ancient Greek Translation ===&lt;br /&gt;
=== Arabic Translation ===&lt;br /&gt;
* Amnay Mokhtari&lt;br /&gt;
=== Asturian Translation ===&lt;br /&gt;
=== Basque Translation ===&lt;br /&gt;
* Alfredo Beaumont (ziberpunk)&lt;br /&gt;
* Julen Landa (genars)&lt;br /&gt;
* Mikel Olasagasti (Hey_neken)&lt;br /&gt;
=== Bulgarian Translation ===&lt;br /&gt;
* Anton Tsigularov (Atilla)&lt;br /&gt;
* Bono Nonchev&lt;br /&gt;
* Denica Mincheva (Deni)&lt;br /&gt;
* Georgi Dimitrov (oblak)&lt;br /&gt;
* Ivan Petrov (TheWhiteKnight) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Nikolay Vladimirov (Turki)&lt;br /&gt;
* Steven Genchev (blademaster83) &lt;br /&gt;
* Valentin Yankov  (kartacha) &lt;br /&gt;
=== Catalan Translation ===&lt;br /&gt;
* Carles Company (brrr)&lt;br /&gt;
* Dan Rosàs Garcia (focks)&lt;br /&gt;
* Daniel López (Azazelo)&lt;br /&gt;
* Joan Queralt&lt;br /&gt;
* Jonatan Alamà (tin)&lt;br /&gt;
* [mailto:jorda&amp;amp;#x40;ettin&amp;amp;#x2E;org Jordà Polo] (ettin)&lt;br /&gt;
* Jose Gordillo (kilder)&lt;br /&gt;
* J.R. Dolcet Castro (Malin Keshar)&lt;br /&gt;
* Marc Orcau&lt;br /&gt;
* Mark Recasens&lt;br /&gt;
* [mailto:miquel&amp;amp;#x2E;angel&amp;amp;#x2E;burgos&amp;amp;#x40;gmail&amp;amp;#x2E;com Miquel-Àngel Burgos i Fradeja] &amp;amp;#8212; current maintainer&lt;br /&gt;
* Pau Rul·lan Ferragut&lt;br /&gt;
* Roberto Garcia (Motxales)&lt;br /&gt;
=== Chinese Translation ===&lt;br /&gt;
* AxalaraFlameheart (AxalaraFlame)&lt;br /&gt;
* Brian lee&lt;br /&gt;
* chisquare130&lt;br /&gt;
* [mailto:cloudidust&amp;amp;#x40;gmail&amp;amp;#x2E;com CloudiDust] ([[User:CloudiDust|CloudiDust]]) &amp;amp;#8212; current maintainer&lt;br /&gt;
* cryaciccl&lt;br /&gt;
* Dionysus&lt;br /&gt;
* 逆天的高级菜鸟 (Gaojicainiao)&lt;br /&gt;
* Henry Zhu (Hardwood) &amp;amp;#8212; iOS announcements translation into Chinese&lt;br /&gt;
* Huang Hongye (Dugucloud) &amp;amp;#8212; translation and image localization&lt;br /&gt;
* Huang Huan&lt;br /&gt;
* Huang Lechuan&lt;br /&gt;
* leaf&lt;br /&gt;
* Luojie-dune&lt;br /&gt;
* MrKing&lt;br /&gt;
* 网上佳公子&lt;br /&gt;
* Owlet&lt;br /&gt;
* pianton&lt;br /&gt;
* SealMe&lt;br /&gt;
* spider5&lt;br /&gt;
* StephDC&lt;br /&gt;
* [mailto:sylecn&amp;amp;#x40;gmail&amp;amp;#x2E;com sylecn]&lt;br /&gt;
* Teamzhangmeng&lt;br /&gt;
* vinneymail&lt;br /&gt;
* wind&lt;br /&gt;
* Yifan&lt;br /&gt;
* yym514&lt;br /&gt;
* zen&lt;br /&gt;
=== Chinese (Taiwan) Translation ===&lt;br /&gt;
* 楊綮銘&lt;br /&gt;
* 李昆融&lt;br /&gt;
* 李信融&lt;br /&gt;
=== Croatian Translation ===&lt;br /&gt;
* Ivica Đurenec (charlieh65)&lt;br /&gt;
* Nino Gunjača&lt;br /&gt;
=== Czech Translation ===&lt;br /&gt;
* Alexander Slávik (Olin)&lt;br /&gt;
* Anežka Bubeníčková (Bubu)&lt;br /&gt;
* Čestmír Houska&lt;br /&gt;
* David Nečas (Yeti)&lt;br /&gt;
* David Novotný (Draqen)&lt;br /&gt;
* [mailto:jan&amp;amp;#x2E;dedic&amp;amp;#x40;gmail&amp;amp;#x2E;com Jaromír Dědič]&lt;br /&gt;
* Karel Doleček&lt;br /&gt;
* Lukáš Faltýnek&lt;br /&gt;
* [mailto:hrubymar10&amp;amp;#x40;gmail&amp;amp;#x2E;com Martin Hrubý] ([[User:hrubymar10|hrubymar10]])&lt;br /&gt;
* Martin Šín&lt;br /&gt;
* Michal Žejdl&lt;br /&gt;
* Mintaka&lt;br /&gt;
* [mailto:tapik&amp;amp;#x40;buchtovi&amp;amp;#x2E;cz Oto Buchta] ([[User:Tapik|tapik]])&lt;br /&gt;
* Petr Kopač (Ferda)&lt;br /&gt;
* Petr Kovár (Juans)&lt;br /&gt;
* Rudolf Orság&lt;br /&gt;
* Septim&lt;br /&gt;
* Sofronius&lt;br /&gt;
* Vít Komárek&lt;br /&gt;
* Vít Krčál&lt;br /&gt;
* Vladimír Slávik&lt;br /&gt;
=== Danish Translation ===&lt;br /&gt;
* Anders K. Madsen (madsen)&lt;br /&gt;
* Ask Hjorth Larsen&lt;br /&gt;
* Bjarke Sørensen (basher)&lt;br /&gt;
* Jesper Fuglsang Wolff (ulven)&lt;br /&gt;
* Joe Hansen&lt;br /&gt;
* Kenneth Nielsen&lt;br /&gt;
* Mark Michelsen (skovbaer)&lt;br /&gt;
* Mathias Bundgaard Svensson (freaken)&lt;br /&gt;
* Ole Laursen&lt;br /&gt;
=== Dutch Translation ===&lt;br /&gt;
* [mailto:AI0867&amp;amp;#x40;gmail&amp;amp;#x2E;com Alexander van Gessel] (AI/AI0867) &amp;amp;#8212; previous translation maintainer&lt;br /&gt;
* Arne Deprez&lt;br /&gt;
* Astrid Halberkamp&lt;br /&gt;
* Floris Kint (Grimling)&lt;br /&gt;
* Foppe Benedictus&lt;br /&gt;
* [mailto:oudshoorn&amp;amp;#x40;eitri&amp;amp;#x2E;nl IJsbrand Oudshoorn]&lt;br /&gt;
* Joeri Melis&lt;br /&gt;
* Jon Jacobs&lt;br /&gt;
* Koen Douterloigne&lt;br /&gt;
* Koen Vervloesem (koan)&lt;br /&gt;
* Lala&lt;br /&gt;
* Maarten Albrecht&lt;br /&gt;
* Merijn de Vet &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Pieter Vermeylen (Onne)&lt;br /&gt;
* Rico van Coevorden&lt;br /&gt;
* Rob van der Vleugel&lt;br /&gt;
* Roel Thijs (Roel)&lt;br /&gt;
* Roger Koot&lt;br /&gt;
* Thomas Hugo de Groot&lt;br /&gt;
* Tobe Deprez&lt;br /&gt;
* WimPapa&lt;br /&gt;
=== English (GB) Translation ===&lt;br /&gt;
* András Salamon (ott)&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
* pjr&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* Thomas Hockings ([[User:Deusite|Deusite]])&lt;br /&gt;
* Wedge009&lt;br /&gt;
=== English (Shaw) Translation ===&lt;br /&gt;
* [mailto:arcriley&amp;amp;#x40;ubuntu&amp;amp;#x2E;com Arc Riley] ([[User:ArcRiley|ArcRiley]]) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* [mailto:reportingsjr&amp;amp;#x40;gmail&amp;amp;#x2E;com Jon Neal] (reportingsjr)&lt;br /&gt;
* [mailto:thomas&amp;amp;#x40;thurman&amp;amp;#x2E;org&amp;amp;#x2E;uk Thomas Thurman] (marnanel)&lt;br /&gt;
=== Esperanto Translation ===&lt;br /&gt;
* Aleksej Korgenkov (Grimpanto)&lt;br /&gt;
* Francesco Lorenzon (Likso)&lt;br /&gt;
* Ľubo Fajth&lt;br /&gt;
* Maarten Albrecht&lt;br /&gt;
* Rastislav Šarišský (Asto)&lt;br /&gt;
=== Estonian Translation ===&lt;br /&gt;
* Kaido Kikkas (UncleOwl)&lt;br /&gt;
* Mart Tõnso&lt;br /&gt;
=== Filipino Translation ===&lt;br /&gt;
* Joset Anthony Zamora (eradicus)&lt;br /&gt;
* Karen Eve Eso (keeve)&lt;br /&gt;
=== Finnish Translation ===&lt;br /&gt;
* Ankka&lt;br /&gt;
* Jarkko Patteri (Jarkko)&lt;br /&gt;
* Jussi Rautio (jgrr)&lt;br /&gt;
* kko&lt;br /&gt;
* Matias Parmala&lt;br /&gt;
* Matias Pigg&lt;br /&gt;
* Mikko Nikkilä (Miccoh)&lt;br /&gt;
* Mikko Kraft (deserter)&lt;br /&gt;
* Miriam Green&lt;br /&gt;
* Niklas Laxström (Nikerabbit)&lt;br /&gt;
* paxed&lt;br /&gt;
* Samu Voutilainen (Smar)&lt;br /&gt;
* Santtu Pajukanta (Japsu)&lt;br /&gt;
* Simo Sutela&lt;br /&gt;
* Veikko Pukkila (swege)&lt;br /&gt;
=== French Translation ===&lt;br /&gt;
* Antoine Garnier&lt;br /&gt;
* Antoine Imboden&lt;br /&gt;
* Aurélien Brevers (Breversa)&lt;br /&gt;
* Aurélien Paulus&lt;br /&gt;
* Arnaud Garoux (La vie en wose)&lt;br /&gt;
* Benoit Astruc&lt;br /&gt;
* [mailto:benoit&amp;amp;#x2E;timbert&amp;amp;#x40;free&amp;amp;#x2E;fr Benoît Timbert] ([[User:Noyga|Noyga]]) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Bruno Fève (PP)&lt;br /&gt;
* Cédric Duval&lt;br /&gt;
* Damian Gryski (dmg)&lt;br /&gt;
* [[User:Damien|Damien Jacquot]] &amp;amp;#8212; lead translator&lt;br /&gt;
* DaringTremayne&lt;br /&gt;
* David Pradier&lt;br /&gt;
* Éric Pierre (Gari)&lt;br /&gt;
* Fabrice Boulakia&lt;br /&gt;
* Florence Guettaa (inflow)&lt;br /&gt;
* François Mariage (Paquito)&lt;br /&gt;
* François Orieux&lt;br /&gt;
* Geoffroy Douillié ([[User:Gdou|gdou]])&lt;br /&gt;
* Gérard Bodin (Gnork)&lt;br /&gt;
* Guillaume Delacourt&lt;br /&gt;
* Guillaume Duwelz-Rebert&lt;br /&gt;
* Guillaume Guigou&lt;br /&gt;
* [mailto:massart&amp;amp;#x2E;guillaume&amp;amp;#x40;wanadoo&amp;amp;#x2E;fr Guillaume Massart] (Piou2fois)&lt;br /&gt;
* Guillaume Melquiond (silene)&lt;br /&gt;
* Guillaume Pascal&lt;br /&gt;
* Jean Privat (Tout)&lt;br /&gt;
* Jean-Louis Passerin (Zoltic)&lt;br /&gt;
* Jean-Luc Menut&lt;br /&gt;
* Jean-Luc Richard (Le Gnome)&lt;br /&gt;
* Jean-Joseph Paget&lt;br /&gt;
* Jehan Hysseo (Jey)&lt;br /&gt;
* Jérémy Rosen (Boucman)&lt;br /&gt;
* Julien Moncel&lt;br /&gt;
* Julien Tailleur&lt;br /&gt;
* Marc Scheffer&lt;br /&gt;
* Mathieu Guilbaud&lt;br /&gt;
* Mendes Oulamara&lt;br /&gt;
* Michel Poléni (Thanatloc)&lt;br /&gt;
* Nicolas Boudin (Blurgk)&lt;br /&gt;
* [mailto:philippe&amp;amp;#x2E;plantier&amp;amp;#x40;naema&amp;amp;#x2E;org Philippe Plantier] ([[User:Ayin|Ayin]])&lt;br /&gt;
* Philippe Rasquinet&lt;br /&gt;
* Pierre Rudloff&lt;br /&gt;
* Sébastien Raynaud (Galactic turkey)&lt;br /&gt;
* Sylvain Jeanne&lt;br /&gt;
* Thierry Bothorel&lt;br /&gt;
* Solena Le Moigne&lt;br /&gt;
* William Dupré&lt;br /&gt;
* [mailto:ydirson&amp;amp;#x40;altern&amp;amp;#x2E;org Yann Dirson]&lt;br /&gt;
=== Friulian Translation ===&lt;br /&gt;
=== Galician Translation ===&lt;br /&gt;
* [mailto:adriyetichaves&amp;amp;#x40;gmail&amp;amp;#x2E;com Adrián Chaves Fernández] (Gallaecio)&lt;br /&gt;
* Fran Diéguez&lt;br /&gt;
* Jacobo Abel Fernández García &amp;amp;#8212; inactive&lt;br /&gt;
* Javier Pico&lt;br /&gt;
* Manuel Meixide&lt;br /&gt;
* Marce Villarino&lt;br /&gt;
* [mailto:leandro&amp;amp;#x2E;regueiro&amp;amp;#x40;gmail&amp;amp;#x2E;com Leandro Regueiro] (unho) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Victor Portela&lt;br /&gt;
* Proxecto Trasno &amp;amp;#8212; translation project (http://trasno.net)&lt;br /&gt;
=== German Translation ===&lt;br /&gt;
* Aaron Winter (Bitron)&lt;br /&gt;
* Alexander Ginschel (mcpgal)&lt;br /&gt;
* Alexander Laux&lt;br /&gt;
* Alexander Zurek (Alresu)&lt;br /&gt;
* Andre Schmidt (schmidta)&lt;br /&gt;
* Boris Stumm (quijote_)&lt;br /&gt;
* Celina Mainz (Mailina)&lt;br /&gt;
* Chewan&lt;br /&gt;
* Christoph Berg (chrber) &amp;amp;#8212; former translation maintainer&lt;br /&gt;
* Christoph Lange (madelgijs)&lt;br /&gt;
* Drakefriend&lt;br /&gt;
* Elias Fromm (Karpadorsch)&lt;br /&gt;
* Elias Pschernig (allefant)&lt;br /&gt;
* ghype&lt;br /&gt;
* Lennard&lt;br /&gt;
* Lorenzo Hardt (HeroOfGaming)&lt;br /&gt;
* Rhonda D'Vine (Rhonda)&lt;br /&gt;
* Jan Greve (Jan)&lt;br /&gt;
* Jan Heiner Laberenz (jan-heiner)&lt;br /&gt;
* Kai Ensenbach&lt;br /&gt;
* Konrad Schwede (Konrad2)&lt;br /&gt;
* [mailto:marcel_miebach&amp;amp;#x40;gmx&amp;amp;#x2E;de Marcel Miebach] (retr0virus)&lt;br /&gt;
* Mark de Wever ([[User:SkeletonCrew|Mordante/SkeletonCrew]])&lt;br /&gt;
* Matthias Gianfelice (MatthiasG)&lt;br /&gt;
* [mailto:Crazy-Ivanovic&amp;amp;#x40;gmx&amp;amp;#x2E;net Nils Kneuper] (Ivanovic)&lt;br /&gt;
* Oliver Lange (Crommy)&lt;br /&gt;
* Ronny Standtke&lt;br /&gt;
* Ruben Philipp Wickenhäuser (The Very Uhu)&lt;br /&gt;
* Severin Glöckner (Shiki, Sevu) &amp;amp;#8212; current translation maintainer&lt;br /&gt;
* Stephan Grochtmann (Schattenstephan)&lt;br /&gt;
* Tobias Schönau (SonIcco)&lt;br /&gt;
* Uz-Valentin Friedrich&lt;br /&gt;
* vonHalenbach&lt;br /&gt;
=== Greek Translation ===&lt;br /&gt;
* Alexander Alexiou (Santi/fnaek)&lt;br /&gt;
* Evangelos Papakirikou&lt;br /&gt;
* Harry Kaimenas&lt;br /&gt;
* Katerina Sykioti&lt;br /&gt;
* Konstantinos Egarhos&lt;br /&gt;
* Konstantinos Karasavvas&lt;br /&gt;
* Mik2303&lt;br /&gt;
* Nikos Astroylakis (Greek Dubbings Maker)&lt;br /&gt;
* Nikos Papadopoulos (galicae)&lt;br /&gt;
* Nikos the Great&lt;br /&gt;
* Panagiotis Famelis (Kesnar)&lt;br /&gt;
* Papadopoulos Themistoklis&lt;br /&gt;
* Spiros, Giorgis&lt;br /&gt;
=== Hebrew Translation ===&lt;br /&gt;
* Ariel Ben-Yehuda&lt;br /&gt;
* Oron Peled&lt;br /&gt;
* Ely Levy (Nakee)&lt;br /&gt;
=== Hungarian Translation ===&lt;br /&gt;
* Barthalos Márton (Aldebaran Ghrelin)&lt;br /&gt;
* Czakó Csaba (Horus)&lt;br /&gt;
* Erdélyi Kristóf&lt;br /&gt;
* Fábián Balázs (nermal93)&lt;br /&gt;
* Hamar Krisztián&lt;br /&gt;
* Kádár-Németh Krisztián (Rudanar Firmus)&lt;br /&gt;
* Kékkői László (BlackEvil)&lt;br /&gt;
* Kelemen Zoltán (kele)&lt;br /&gt;
* Kovács Dániel (Consalamander)&lt;br /&gt;
* Majsa Norbert (wias)&lt;br /&gt;
* Máthé Katalin (katkadu)&lt;br /&gt;
* Németh Tamás (nTOMasz)&lt;br /&gt;
* Pintér Csaba (piere)&lt;br /&gt;
* Salamon András (ott)&lt;br /&gt;
* Soltész Adrián (majominia)&lt;br /&gt;
* Széll Tamás (TomJoad)&lt;br /&gt;
* Udvari Gábor (Udi)&lt;br /&gt;
* Udvari Zsolt&lt;br /&gt;
* Vasvári Péter (honorshark)&lt;br /&gt;
=== Icelandic Translation ===&lt;br /&gt;
* Arngrímur Stefánsson&lt;br /&gt;
* Gabríel A. Pétursson&lt;br /&gt;
=== Indonesian Translation ===&lt;br /&gt;
* Ardhi (earthboy)&lt;br /&gt;
* Benny Lin&lt;br /&gt;
* [mailto:sevennightmare&amp;amp;#x40;tutanota&amp;amp;#x2E;de Irsyad Musthafa] &amp;amp;#8212; translation maintainer&lt;br /&gt;
* Iwan&lt;br /&gt;
* [mailto:inkraiswitras&amp;amp;#x40;yahoo&amp;amp;#x2E;com Nicky Inkrais Witras] &amp;amp;#8212; previous translation maintainer&lt;br /&gt;
* [mailto:yuris_wicaksana&amp;amp;#x40;yahoo&amp;amp;#x2E;com Yuristyawan Pambudi Wicaksana] &amp;amp;#8212; previous translation maintainer&lt;br /&gt;
=== Irish Translation ===&lt;br /&gt;
* Mountain_King &amp;amp;#8212; translation maintainer&lt;br /&gt;
=== Italian Translation ===&lt;br /&gt;
* Alessandro Barbazza&lt;br /&gt;
* Alessio D'Ascanio (otaku)&lt;br /&gt;
* Americo Iacovizzi (DarkAmex)&lt;br /&gt;
* [mailto:arosella&amp;amp;#x40;yahoo&amp;amp;#x2E;com Antonio Rosella]&lt;br /&gt;
* crys0000&lt;br /&gt;
* Elvish_Hunter&lt;br /&gt;
* Eugenio Favalli (ElvenProgrammer)&lt;br /&gt;
* Federico Tomassetti&lt;br /&gt;
* Filippo Abbruzzo (Gwain)&lt;br /&gt;
* isazi&lt;br /&gt;
* Luciano Montanaro (Luciano)&lt;br /&gt;
* Michele Maresi (mich)&lt;br /&gt;
* RokStar&lt;br /&gt;
* Stefano Coccato (BioHazardX)&lt;br /&gt;
=== Japanese Translation ===&lt;br /&gt;
* BlueStar&lt;br /&gt;
* clearpotion&lt;br /&gt;
* h22&lt;br /&gt;
* [mailto:broadbarredfirefish&amp;amp;#x40;gmail&amp;amp;#x2E;com Hironori Fujimoto] (RatArmy) &amp;amp;#8212; translation maintainer&lt;br /&gt;
* [mailto:iwaim&amp;amp;#x2E;sub&amp;amp;#x40;gmail&amp;amp;#x2E;com IWAI, Masaharu] ([[User:Iwaim|iwaim]])&lt;br /&gt;
* [mailto:kateitekino_hito&amp;amp;#x40;yahoo&amp;amp;#x2E;co&amp;amp;#x2E;jp kateiteki]&lt;br /&gt;
* kudoh&lt;br /&gt;
* Maxwell Stibbard Hawkes&lt;br /&gt;
* [mailto:mishanhideaki88&amp;amp;#x40;gmail&amp;amp;#x2E;com mishan]&lt;br /&gt;
* いいむらなおき (amatubu) - Naoki Iimura&lt;br /&gt;
* [mailto:okyada&amp;amp;#x40;gmail&amp;amp;#x2E;com 岡田信人 - Nobuhito Okada]&lt;br /&gt;
* np&lt;br /&gt;
* [mailto:pasta0915[at]gmail&amp;amp;#x2E;com Shoot MORII] (pastak)&lt;br /&gt;
* OOTA, Masato(oo)&lt;br /&gt;
* Q&lt;br /&gt;
* R.N&lt;br /&gt;
* rouiza&lt;br /&gt;
* [mailto:le&amp;amp;#x2E;sahara&amp;amp;#x40;gmail&amp;amp;#x2E;com sahara]&lt;br /&gt;
* Shigerello&lt;br /&gt;
* [mailto:suto3suto3&amp;amp;#x40;gmail&amp;amp;#x2E;com suto3]&lt;br /&gt;
* 瀟湘夜雨&lt;br /&gt;
* Taigaku Okuiso&lt;br /&gt;
* Takanobu Hirai&lt;br /&gt;
* tamanegi&lt;br /&gt;
* [mailto:yma9yma&amp;amp;#x40;gmail&amp;amp;#x2E;com yma]&lt;br /&gt;
* Yuji Matsumoto&lt;br /&gt;
=== Korean Translation ===&lt;br /&gt;
* mistzone &amp;amp;#8212; current maintainer&lt;br /&gt;
=== Latin Translation ===&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; general semantician&lt;br /&gt;
* Mark Polo (mpolo) &amp;amp;#8212; original maintainer&lt;br /&gt;
* Michael Babich ([[User:Aethaeryn|Aethaeryn]]) &amp;amp;#8212; current maintainer&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* Thomas Hockings ([[User:Deusite|Deusite]])&lt;br /&gt;
=== Latvian Translation ===&lt;br /&gt;
* Artis Rozentāls&lt;br /&gt;
* Gvido Bruveris &amp;amp;#8212; Maintainer&lt;br /&gt;
* [mailto:rei4dan&amp;amp;#x40;gmail&amp;amp;#x2E;com Reinis Danne]&lt;br /&gt;
=== Lithuanian Translation ===&lt;br /&gt;
* Andrius Štikonas&lt;br /&gt;
* Deimantė Tankus (Diamond)&lt;br /&gt;
* Jurgis Sūdžius (Dievas)&lt;br /&gt;
* Lukas Gasiūnas (LucasLT)&lt;br /&gt;
* Marius Tauba (morlock)&lt;br /&gt;
* Raimundas Zabarauskas&lt;br /&gt;
* Vytautas Šaltenis (rtfb)&lt;br /&gt;
=== Macedonian Translation ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
=== Marathi Translation ===&lt;br /&gt;
* [mailto:sujitrjadhav&amp;amp;#x40;gmail&amp;amp;#x2E;com सुजित जाधव] ([[User:sujitrjadhav|Sujit R Jadhav]])&lt;br /&gt;
=== Norwegian Translation ===&lt;br /&gt;
* Asgeir Aakre (YbeRn00b)&lt;br /&gt;
* Erik J. Mesoy (Circon)&lt;br /&gt;
* Gaute Jao (Gauteamus)&lt;br /&gt;
* Hallvard Norheim Bø (Lysander)&lt;br /&gt;
* Håvard Korsvoll&lt;br /&gt;
* Pål Inge Larsen (PsyBird)&lt;br /&gt;
* Susanne Mesoy (Rarlgland)&lt;br /&gt;
=== Old English Translation ===&lt;br /&gt;
* [mailto:eirikvw&amp;amp;#x40;aim&amp;amp;#x2E;com Eirik Westcoat]&lt;br /&gt;
* [mailto:axonfifty&amp;amp;#x40;gmail&amp;amp;#x2E;com Gottweiß]&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]]) &amp;amp;#8212; Maintainer&lt;br /&gt;
=== Polish Translation ===&lt;br /&gt;
* Agata Chmiel&lt;br /&gt;
* Arkadiusz Danilecki (szopen)&lt;br /&gt;
* Bartek Waresiak (Dragonking)&lt;br /&gt;
* Kamil Matuszewski (LiamTailor)&lt;br /&gt;
* Karol Nowak (grzywacz)&lt;br /&gt;
* Magdalena Chmiel (Ryouko)&lt;br /&gt;
* Marek Kalnik (wdev)&lt;br /&gt;
* Michał Hartliński&lt;br /&gt;
* Michał Jedynak (Artanis)&lt;br /&gt;
* Michał Ligowski (misiorysio)&lt;br /&gt;
* Paweł Albecki (gidgnulur)&lt;br /&gt;
* Paweł Jackowski (fatality)&lt;br /&gt;
* Piotr Kruszewski (Hejnewar)&lt;br /&gt;
* Piotr Makarewicz (ForPeace) &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Robert Wolniak (Szkodnix)&lt;br /&gt;
* Roman Polesek (rimskij)&lt;br /&gt;
* Sebastian Basierski&lt;br /&gt;
* Tadeusz Kopeć&lt;br /&gt;
* Zbigniew Banach (vonBureck)&lt;br /&gt;
=== Portuguese Translation ===&lt;br /&gt;
* Carlos Sousa&lt;br /&gt;
* Luis Passos&lt;br /&gt;
* trewe &amp;amp;#8212; Current maintainer&lt;br /&gt;
=== Portuguese (Brazil) Translation ===&lt;br /&gt;
* Ambra Viviani Loos&lt;br /&gt;
* Andrei Machado &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Antonio Vildes Barbosa&lt;br /&gt;
* Bruno Macabeus&lt;br /&gt;
* Celso Goya&lt;br /&gt;
* [mailto:cbterra&amp;amp;#x40;gmail&amp;amp;#x2E;com Claudio Terra]&lt;br /&gt;
* Claus Aranha&lt;br /&gt;
* Di Teixeira (Moroder)&lt;br /&gt;
* Diego Inácio Goergen&lt;br /&gt;
* [mailto:fred&amp;amp;#x2E;maranhao&amp;amp;#x40;gmail&amp;amp;#x2E;com Fred Maranhão]&lt;br /&gt;
* Hugo Neiva de Melo&lt;br /&gt;
* Michel Loos&lt;br /&gt;
* Renato Cunha&lt;br /&gt;
* Ricardo Sodré Andrade&lt;br /&gt;
* Romero Gonçalves&lt;br /&gt;
* Sérgio de Miranda Costa&lt;br /&gt;
* Tiago Souza (Salvador)&lt;br /&gt;
=== Romanian Translation ===&lt;br /&gt;
* Unknown&lt;br /&gt;
=== Russian Translation ===&lt;br /&gt;
* Aldarisvet &amp;amp;#8212; Previous maintainer&lt;br /&gt;
* [mailto:allryn&amp;amp;#x40;pisem&amp;amp;#x2E;net Aleksandr Aleks]&lt;br /&gt;
* Alexandr Gridnev&lt;br /&gt;
* Alexandr Menovchicov&lt;br /&gt;
* Alexey Remizov&lt;br /&gt;
* Alexey Zakharchenko&lt;br /&gt;
* Andrey Tikhonov ([[User:tiandrey|tiandrey]])&lt;br /&gt;
* Anthony Kolesov&lt;br /&gt;
* Artem Khrapov ([[User:Kabachuha|kabachuha]]) &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Azamat Hackimov ([[User:Winterheart|winterheart]])&lt;br /&gt;
* [mailto:BabylonASАТyandexDОTru BabylonAS] ([[User:BabylonAS|BabylonAS]])&lt;br /&gt;
* [[User:catbegemot|catbegemot]]&lt;br /&gt;
* Danila Evstifeyev (MyOtheHedgeFox)&lt;br /&gt;
* Denis Revin (Dut_Norshi)&lt;br /&gt;
* Dmitry Brilev (dobryl)&lt;br /&gt;
* Fardeil&lt;br /&gt;
* Fedor Gavrilov (gallowzbird)&lt;br /&gt;
* Fedor Khod'kov (teddy/fkhodkov)&lt;br /&gt;
* Ilya Kaznacheev&lt;br /&gt;
* Ilya Kotov&lt;br /&gt;
* Ishayahu Lastov (Ishayahu)&lt;br /&gt;
* Kirill Baranov&lt;br /&gt;
* Mikhail Melnik (ZumZoom)&lt;br /&gt;
* Nikita Ushkin&lt;br /&gt;
* Roman Tuchin (Sankt)&lt;br /&gt;
* Sergey Popov (loonycyborg)&lt;br /&gt;
* Valentina Mukhamedzhanova (umirra)&lt;br /&gt;
* Victor Sergienko (singalen)&lt;br /&gt;
* [mailto:vicza&amp;amp;#x40;zmail&amp;amp;#x2E;ru Victor Zabavin]&lt;br /&gt;
* Vlad Glagolev&lt;br /&gt;
* Yellow Horror&lt;br /&gt;
=== Scottish Gaelic Translation ===&lt;br /&gt;
* [mailto:fios&amp;amp;#x40;foramnagaidhlig&amp;amp;#x2E;net GunChleoc] &amp;amp;#8212; Current maintainer&lt;br /&gt;
=== Serbian Translation ===&lt;br /&gt;
* Branko Kokanovic (kokan)&lt;br /&gt;
* [mailto:caslav&amp;amp;#x2E;ilic&amp;amp;#x40;gmx&amp;amp;#x2E;net Caslav Ilic]&lt;br /&gt;
* [mailto:daliborddjuric&amp;amp;#x40;gmail&amp;amp;#x2E;com Dalibor Djuric]&lt;br /&gt;
* [mailto:sreckotoroman&amp;amp;#x40;gmail&amp;amp;#x2E;com Srecko Toroman] (FreeCraft)&lt;br /&gt;
=== Slovak Translation ===&lt;br /&gt;
* Aceman&lt;br /&gt;
* Ivan Kovacs&lt;br /&gt;
* Ján Sučan (Bhujanga)&lt;br /&gt;
* Marian Kluvanec&lt;br /&gt;
* Martin Dzbor&lt;br /&gt;
* Martin Plávala (Empy)&lt;br /&gt;
* Stano Hoferek (Elven)&lt;br /&gt;
* [[User:Viliam|Viliam Bur]]&lt;br /&gt;
=== Slovenian Translation ===&lt;br /&gt;
* Gregor Petrin&lt;br /&gt;
* Jaka Kranjc (lynx)&lt;br /&gt;
* Klemen Košir (nNa)&lt;br /&gt;
* Matej Repinc&lt;br /&gt;
=== Spanish Translation ===&lt;br /&gt;
* Alvin Eloy Luna Castro&lt;br /&gt;
* Chucho Pulgoso&lt;br /&gt;
* David Martínez Moreno&lt;br /&gt;
* Diego Grande Rodríguez (Buhako)&lt;br /&gt;
* Diego J.&lt;br /&gt;
* Fernando Cerezal&lt;br /&gt;
* Flamma&lt;br /&gt;
* Francisco Muñoz (fmunoz)&lt;br /&gt;
* Gabriel Rodríguez (Chewie)&lt;br /&gt;
* [mailto:gusgins&amp;amp;#x40;gmail&amp;amp;#x2E;com Gustavo Gingins] (gins)&lt;br /&gt;
* [mailto:shadowm2006&amp;amp;#x40;gmail&amp;amp;#x2E;com Iris Morelle] ([[User:Shadowm|Irydacea/shadowm]])&lt;br /&gt;
* Iván Herrero (navitux)&lt;br /&gt;
* Javier C.H. (perseo)&lt;br /&gt;
* Jose Gordillo (kilder)&lt;br /&gt;
* Jose Manuel Gomez (joseg)&lt;br /&gt;
* Josu Díaz de Arcaya&lt;br /&gt;
* Masacroso&lt;br /&gt;
* Martín R. Dapás&lt;br /&gt;
* Pedro Llorens (PeterPorty)&lt;br /&gt;
* Roberto Romero (sildur)&lt;br /&gt;
* Sergi March (sergi34)&lt;br /&gt;
* [mailto:Majora700&amp;amp;#x40;gmail&amp;amp;#x2E;com Steven Panek] ([[User:Espreon|Espreon]])&lt;br /&gt;
* [mailto:quianaaelonin&amp;amp;#x40;gmail&amp;amp;#x2E;com Víctor M. Estrada] (Aelonin/Darkmage)&lt;br /&gt;
* Xavier Novella Sinde (XavierNovella)&lt;br /&gt;
=== Swedish Translation ===&lt;br /&gt;
* Alex Alowersson &amp;amp;#8212; current maintainer&lt;br /&gt;
* Alexander Kjäll (capitol)&lt;br /&gt;
* Andreas Tyrberg&lt;br /&gt;
* Åse Petersson (tintin)&lt;br /&gt;
* Elias Sevelin (aXidal)&lt;br /&gt;
* Gustav Tiger&lt;br /&gt;
* Hugo Gerlach (Entrimo)&lt;br /&gt;
* Leo Danielson (Lugo Moll)&lt;br /&gt;
* Niklas Bolmdahl&lt;br /&gt;
* Stefan Bergström (tephlon)&lt;br /&gt;
* [mailto:susanna&amp;amp;#x2E;bjorverud&amp;amp;#x40;telia&amp;amp;#x2E;com Susanna Björverud] (sanna)&lt;br /&gt;
* Ulrika Uddeborg&lt;br /&gt;
* wint3r&lt;br /&gt;
=== Turkish Translation ===&lt;br /&gt;
* Ali Erdem Karaçay(Arsivnet)&lt;br /&gt;
* Enes Akın (yekialem)&lt;br /&gt;
* İhsan Akın&lt;br /&gt;
* Kosif&lt;br /&gt;
* Nilgün Belma Bugüner&lt;br /&gt;
* Pınar Yanardağ (moonquelle)&lt;br /&gt;
* Selim Farsakoğlu&lt;br /&gt;
=== Ukrainian Translation ===&lt;br /&gt;
* Anton Okhrimenko (AncientGeneral)&lt;br /&gt;
* [mailto:mansonigor&amp;amp;#x40;gmail&amp;amp;#x2E;com Igor Paliychuk]&lt;br /&gt;
* [mailto:arobson&amp;amp;#x40;yandex&amp;amp;#x2E;ru robson] ([[User:Robson|Robson]])&lt;br /&gt;
=== Valencian (southern Catalan) Translation ===&lt;br /&gt;
* Bernardo Arlandis&lt;br /&gt;
* Robert Millan&lt;br /&gt;
* Tomás Roig&lt;br /&gt;
=== Vietnamese Translation ===&lt;br /&gt;
* Huynh Yen Loc&lt;br /&gt;
* Le Ngoc Nguyen Chinh&lt;br /&gt;
* Pham Hoang Duy&lt;br /&gt;
* Pham Thanh Nam&lt;br /&gt;
* Pham Thi Yen&lt;br /&gt;
=== RACV’s Translation ===&lt;br /&gt;
* Mario Rodríguez (Mavorte)&lt;br /&gt;
== Sceptre of Fire ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Joseph Simmons (turin)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* doofus-01&lt;br /&gt;
* nemaara&lt;br /&gt;
=== WML Assistance ===&lt;br /&gt;
* David Simmons (Dacyn)&lt;br /&gt;
* Eli Dupree (Elvish Pillager)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* MadMax&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Asereje&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; the new Dwarvish Miner sprite&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; new portraits&lt;br /&gt;
* James Woo (Pickslide) &amp;amp;#8212; old portraits&lt;br /&gt;
* John-Robert Funck (XJaPaN)&lt;br /&gt;
* JonasNL &amp;amp;#8212; Dwarvish Miner attack and defense animations&lt;br /&gt;
* Peter Geinitz (Wayfarer)&lt;br /&gt;
* Pixelmind &amp;amp;#8212; Khrakrahs portrait&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
* RusHHouR &amp;amp;#8212; old gold and coal piles&lt;br /&gt;
* doofus-01&lt;br /&gt;
== Son Of The Black Eye ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Benjamin Drieu (Benj) &amp;amp;#8212; conception and original design&lt;br /&gt;
* Taurus &amp;amp;#8212; completion&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Taurus&lt;br /&gt;
=== Prose, Grammatical and WML Assistance ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Artwork and Graphics ===&lt;br /&gt;
* Christian Sirviö (Girgistian) &amp;amp;#8212; portraits (sketches)&lt;br /&gt;
* Phil Barber (thespaceinvader) &amp;amp;#8212; portraits (coloring)&lt;br /&gt;
* Sonny T Yamada (SkyOne) &amp;amp;#8212; Sprite animations (defense and magic) of orcish shamans&lt;br /&gt;
== Northern Rebirth ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Taurus&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Battlesquid&lt;br /&gt;
* Nicholas Kerpan (Thrawn)&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
* Xandar86&lt;br /&gt;
=== Prose, Grammatical and WML Assistance ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Code and Translation Assistance ===&lt;br /&gt;
* David Philippi (Torangan)&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Charles Dang (vultraz)&lt;br /&gt;
== Liberty ==&lt;br /&gt;
=== Original Campaign Design ===&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Latest Rewrite ===&lt;br /&gt;
* nemaara&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Original prose-doctoring and preparation for mainline&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Brendan Sellner&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portraits&lt;br /&gt;
* Shadow&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; story images, Rogue Mage line sprites&lt;br /&gt;
* Sonny T Yamada (SkyOne) &amp;amp;#8212; Sprite animations (defense and attack) of Rogue Mage line&lt;br /&gt;
== Delfadors Memoirs ==&lt;br /&gt;
=== Creator and Original Designer ===&lt;br /&gt;
* [[User:jp30|Josh Parsons]] &amp;amp;#8212; Original designer, responsible for first scenarios 2-10; maintained it up to 0.5.2&lt;br /&gt;
=== Co-Authors ===&lt;br /&gt;
* Oto 'tapik' Buchta &amp;amp;#8212; First scenario, various improvements&lt;br /&gt;
* Spiros Alexiou (Santi/fnaek) &amp;amp;#8212; Scenarios 12 and following.&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Prose- and script-doctoring, Wesnoth continuity fixes.&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Jeffrey 'Sigurd' Westcoat (SigurdFireDragon) &amp;amp;#8212; former maintainer&lt;br /&gt;
=== WML Programming and Assistance ===&lt;br /&gt;
* Fabi &amp;amp;#8212; WML bug fixing and polishing.&lt;br /&gt;
* Eric S. Raymond (ESR) &amp;amp;#8212; Side-mutation and recall-list handling.&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm) &amp;amp;#8212; WML help&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* Kathrin Polikeit (Kitty)&lt;br /&gt;
=== Additional thanks to ===&lt;br /&gt;
* Arkadiusz D. Danilecki &amp;amp;#8212; Inspiration and borrowings from his 'A New Order'&lt;br /&gt;
== Heir To The Throne ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* David White (Sirp)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* doofus-01 &amp;amp;#8212; new sprites and animations (Princess, Battle Princess, Dark Queen, Sea Orc)&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; portraits (Delfador, Asheviere, Moremirmu)&lt;br /&gt;
* Francisco Muñoz (fmunoz)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portraits (Konrad, Li'sar, Kalenz, Chantal)&lt;br /&gt;
* Neoriceisgood&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Patrick Parker (Sapient) &amp;amp;#8212; WML assistance&lt;br /&gt;
== Secrets of the Ancients ==&lt;br /&gt;
=== Campaign Design, Programming, and Artwork ===&lt;br /&gt;
* Dan Gerhards (beetlenaut)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Jeffrey 'Sigurd' Westcoat (SigurdFireDragon) &amp;amp;#8212; former maintainer&lt;br /&gt;
=== Additional Artwork ===&lt;br /&gt;
* Wussel &amp;amp;#8212; Some improvements to the ship.&lt;br /&gt;
== Legend of Wesmere ==&lt;br /&gt;
=== Creator and Lead Designer ===&lt;br /&gt;
* [mailto:moka1&amp;amp;#x40;otenet&amp;amp;#x2E;gr Spiros, George and Alexander Alexiou] ([[User:Santi|Santi/fnaek]]) &amp;amp;#8212; Main designers, former maintainers.&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Fabi/Fendrin &amp;amp;#8212; Current maintainer&lt;br /&gt;
* Spiros, George and Alexander Alexiou (Santi/fnaek)&lt;br /&gt;
=== Prose-doctoring and adaptation for mainline ===&lt;br /&gt;
* Eric S. Raymond (esr)&lt;br /&gt;
* Fabi/Fendrin &amp;amp;#8212; Major WML rewrite for mainline&lt;br /&gt;
=== WML Assistance ===&lt;br /&gt;
* Alexander van Gessel (AI/AI0867) &amp;amp;#8212; bugfixing and general WML cleanups&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm) &amp;amp;#8212; for A LOT of help with WML and interesting campaign suggestions&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; for A LOT of help with WML&lt;br /&gt;
=== Artificial Intelligence ===&lt;br /&gt;
* Yurii Chernyi (crab) &amp;amp;#8212; coding of the new ai and help with corresponding redesigns&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* Bora Orcal (bera) &amp;amp;#8212; goblin horn rouser&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; who did a great job with portraits and other graphics&lt;br /&gt;
-the main reason for having a polished campaign&lt;br /&gt;
* Steven Panek (Espreon) &amp;amp;#8212; map artist&lt;br /&gt;
=== Additional thanks to ===&lt;br /&gt;
* Scott &amp;amp;#8212; for help with WML, especially the use of store/unstore&lt;br /&gt;
* WhiteWizard &amp;amp;#8212; Initial porting to 1.2&lt;br /&gt;
* Disto &amp;amp;#8212; for elvish units&lt;br /&gt;
* RedLTeut &amp;amp;#8212; for great improvements to the initial invisible elvish units&lt;br /&gt;
* Dacyn &amp;amp;#8212; who was of great help in the beginning of this project&lt;br /&gt;
* Big Bad Joe&lt;br /&gt;
* breversa&lt;br /&gt;
* Invisible Philosopher&lt;br /&gt;
* js138&lt;br /&gt;
* l'ultimo cruco&lt;br /&gt;
* Mad Max&lt;br /&gt;
* Rhuvaen&lt;br /&gt;
* SelfishWeirdo&lt;br /&gt;
* Scott&lt;br /&gt;
* Sly&lt;br /&gt;
* Teldar&lt;br /&gt;
* Turin&lt;br /&gt;
* And the rest of the Wesnoth community for feedback,&lt;br /&gt;
criticism, help with WML code and graphics.&lt;br /&gt;
== The South Guard ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* William Carey (aelius)&lt;br /&gt;
=== Latest Campaign Revision ===&lt;br /&gt;
* nemaara&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* nemaara &amp;amp;#8212; current maintainer&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
* Wintermute&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* J.W. Bjerk (eleazar)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; portraits&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Scavenger &amp;amp;#8212; new story images and Mal M'Brin portrait&lt;br /&gt;
* rhyging5&lt;br /&gt;
* Shadow&lt;br /&gt;
* William Carey (aelius)&lt;br /&gt;
== Two Brothers ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Eric J. Mesoy (Circon)&lt;br /&gt;
* Nils Kneuper (Ivanovic)&lt;br /&gt;
=== Prose and Story Edits ===&lt;br /&gt;
* Eric S. Raymond (esr)&lt;br /&gt;
* A-Red&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Nils Kneuper (Ivanovic)&lt;br /&gt;
* Charles Dang (vultraz)&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Arkadiusz Danileki (szopen)&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; current portraits&lt;br /&gt;
* MadMax&lt;br /&gt;
* Stefan&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Bartek Waresiak (Dragonking)&lt;br /&gt;
* Christoph Berg (chrber)&lt;br /&gt;
* Daravel&lt;br /&gt;
* Jozrael&lt;br /&gt;
* And special thanks to everyone else who I forgot to mention.&lt;br /&gt;
== Under the Burning Suns ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Asa Swain&lt;br /&gt;
* Piotr Cychowski (Mist/cycholka)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm)&lt;br /&gt;
* Jan Rietema (Rhuvaen)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Piotr Cychowski (Mist/cycholka)&lt;br /&gt;
* Simon Forsyth (Alarantalara)&lt;br /&gt;
* Steven Panek (Espreon)&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Dan Gerhards (beetlenaut) &amp;amp;#8212; new Flesh Golem sprites&lt;br /&gt;
* Kwandulin &amp;amp;#8212; New Kaleh and Nym sprites&lt;br /&gt;
* doofus-01 &amp;amp;#8212; Monster Crab sprite&lt;br /&gt;
* Hogne Haskjold (Frame)&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm)&lt;br /&gt;
* J.W. Bjerk (Eleazar)&lt;br /&gt;
* James Woo (Pickslide)&lt;br /&gt;
* Javier Hoyos (Vendanna)&lt;br /&gt;
* Marcus Rosén (sleepwalker) &amp;amp;#8212; Dark Assassin sprite and animations&lt;br /&gt;
* Mark Goodenough (Ranger M)&lt;br /&gt;
* Mikolaj Machowski (Emdot)&lt;br /&gt;
* Murray Cook (Zhukov)&lt;br /&gt;
* Peter Geinitz (Shadow)&lt;br /&gt;
* Richard Kettering (Jetrel)&lt;br /&gt;
* Sangel&lt;br /&gt;
* Samuel Wilson (megane)&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
* Vincent Langner (Vyncyn) &amp;amp;#8212; Spider Lich and Human Commander sprites&lt;br /&gt;
* Zerovirus &amp;amp;#8212; Naga Hunter sprite&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Fabian Müller (Fabi/Fendrin)&lt;br /&gt;
* Mark Polo&lt;br /&gt;
* Matthias Schoeck (mattsc) &amp;amp;#8212; Messenger AI&lt;br /&gt;
* Isaac&lt;br /&gt;
* Ringcaat (Thorin N. Tatge)&lt;br /&gt;
* And special thanks to everyone else who I forgot to mention.&lt;br /&gt;
== Descent Into Darkness ==&lt;br /&gt;
=== Original Campaign Design ===&lt;br /&gt;
* esci&lt;br /&gt;
=== Latest Campaign Revision ===&lt;br /&gt;
* nemaara&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; story images&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; current portraits&lt;br /&gt;
* theycallmerooster &amp;amp;#8212; old portraits&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* josteph &amp;amp;#8212; dialogue comments and revisions&lt;br /&gt;
== Dead Water ==&lt;br /&gt;
=== Campaign design and programming ===&lt;br /&gt;
* Dan Gerhards (beetlenaut)&lt;br /&gt;
=== Script-doctoring and cleanup for mainline ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Artwork ===&lt;br /&gt;
* Kathrin Polikeit (Kitty) &amp;amp;#8212; Portraits for brawler, Kai Krellis, Gwabbo, and Caladon&lt;br /&gt;
* Justin Nichols (JustinOperable) &amp;amp;#8212; Portrait for Cylanna&lt;br /&gt;
* Zerovirus &amp;amp;#8212; Kai Krellis sprites&lt;br /&gt;
* Francisco Muñoz (fmunoz) &amp;amp;#8212; Attack icons&lt;br /&gt;
== The Rise Of Wesnoth ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* James Spencer (Shade)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Blarumyrran &amp;amp;#8212; the new Vampire Lady sprite&lt;br /&gt;
* J.W. Bjerk (eleazar)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; new portraits and story art&lt;br /&gt;
* Michael Gil de Muro (grp21) &amp;amp;#8212; old portraits&lt;br /&gt;
* pixelmind &amp;amp;#8212; Shek'kahan portrait&lt;br /&gt;
=== WML Contributors ===&lt;br /&gt;
* Iris Morelle (Irydacea/shadowm)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
== The Hammer of Thursagan ==&lt;br /&gt;
=== Author ===&lt;br /&gt;
* Eric S. Raymond (esr)&lt;br /&gt;
=== Special Guest Designer ===&lt;br /&gt;
* Taurus&lt;br /&gt;
=== Art ===&lt;br /&gt;
* Kim Holm (DUHH)&lt;br /&gt;
* Phil Barber (thespaceinvader)&lt;br /&gt;
* Vincent Langner (Vyncyn) &amp;amp;#8212; New Dwarvish Witness line sprites and animations&lt;br /&gt;
=== Brainstorming, playtesting, and spousal support ===&lt;br /&gt;
* Cathy O. Raymond&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Charles Dang (vultraz)&lt;br /&gt;
== Eastern Invasion ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Joseph Simmons (turin)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
* Lari Nieminen (zookeeper) &amp;amp;#8212; current maintainer&lt;br /&gt;
* Astrid Halberkamp&lt;br /&gt;
=== Campaign Epilogue and Continuity ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Prose and Story Edits ===&lt;br /&gt;
* Loci&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Aaron Redfern (A-Red) &amp;amp;#8212; New Owaec sprites&lt;br /&gt;
* Emilien Rotival (LordBob) &amp;amp;#8212; new portraits&lt;br /&gt;
* James Woo (Pickslide) &amp;amp;#8212; old portraits&lt;br /&gt;
* Neoriceisgood&lt;br /&gt;
[[Category:Generated]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=LuaAPI/UpdatingFrom14&amp;diff=68552</id>
		<title>LuaAPI/UpdatingFrom14</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=LuaAPI/UpdatingFrom14&amp;diff=68552"/>
		<updated>2021-10-06T19:15:57Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Fix a couple of mistakes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
This page contains a summary of the major Lua API changes between 1.12 and 1.15, to help make updating older code simpler.&lt;br /&gt;
&lt;br /&gt;
In general, when it says &amp;quot;renamed&amp;quot;, the new function is a drop-in replacement for the old one. When it says &amp;quot;replaced&amp;quot;, the new function probably has a different API (such as different arguments) or might not even be a function at all.&lt;br /&gt;
&lt;br /&gt;
For some of these that are more than just a simple rename, an example is given where the old, pre-1.16 code is shown commented out and the new code is shown below it.&lt;br /&gt;
&lt;br /&gt;
=== Functions in wesnoth namespace ===&lt;br /&gt;
&lt;br /&gt;
* '''weesnoth.remove_fog''' renamed to '''wesnoth.sides.remove_fog'''&lt;br /&gt;
* '''wesnoth.add_ai_component''' renamed to '''wesnoth.sides.add_ai_component'''&lt;br /&gt;
* '''wesnoth.add_fog''' renamed to '''wesnoth.sides.place_fog'''&lt;br /&gt;
* '''wesnoth.add_modification''' renamed to '''wesnoth.units.add_modification'''&lt;br /&gt;
* '''wesnoth.add_sound_source''' replaced with '''wesnoth.audio.sources''' mapping (write to key)&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- wesnoth.add_sound_source{id=my_id, x=15, y=22, sound='my-sound.ogg'}&lt;br /&gt;
wesnoth.audio.sources.my_id = {x=15, y=22, sound='my-sound.ogg'}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.add_tile_overlay''' renamed to '''wesnoth.interface.add_hex_overlay'''&lt;br /&gt;
* '''wesnoth.add_widget_definition''' renamed to '''gui.add_widget_definition'''&lt;br /&gt;
* '''wesnoth.advance_unit''' renamed to '''wesnoth.units.advance'''&lt;br /&gt;
* '''wesnoth.alert''' renamed to '''gui.alert'''&lt;br /&gt;
* '''wesnoth.allow_end_turn''' renamed to '''wesnoth.interface.allow_end_turn'''&lt;br /&gt;
* '''wesnoth.append_ai''' renamed to '''wesnoth.sides.append_ai'''&lt;br /&gt;
* '''wesnoth.canonical_path''' renamed to '''filesystem.canonical_path'''&lt;br /&gt;
* '''wesnoth.change_ai_component''' renamed to '''wesnoth.sides.change_ai_component'''&lt;br /&gt;
* '''wesnoth.clear_messages''' renamed to '''wesnoth.interface.clear_chat_messages'''&lt;br /&gt;
* '''wesnoth.color_adjust''' replaced with '''wesnoth.interface.color_adjust'''&lt;br /&gt;
* '''wesnoth.compare_versions''' replaced with '''wesnoth.version''', which creates a version object that can be compared with standard comparison operators&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- if wesnoth.compare_versions(wesnoth.game_config.version, '&amp;lt;=', '1.13') then&lt;br /&gt;
if wesnoth.current_version() &amp;lt;= wesnoth.version '1.13' then&lt;br /&gt;
    -- do version-specific stuff&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.confirm''' renamed to '''gui.confirm'''&lt;br /&gt;
* '''wesnoth.copy_unit''' renamed to '''wesnoth.units.clone'''&lt;br /&gt;
* '''wesnoth.create_animator''' renamed to '''wesnoth.units.create_animator'''&lt;br /&gt;
* '''wesnoth.create_side''' renamed to '''wesnoth.sides.create'''&lt;br /&gt;
* '''wesnoth.create_unit''' renamed to '''wesnoth.units.create'''&lt;br /&gt;
* '''wesnoth.create_weapon''' renamed to '''wesnoth.units.create_weapon'''&lt;br /&gt;
* '''wesnoth.debug_ai''' renamed to '''wesnoth.sides.debug_ai'''&lt;br /&gt;
* '''wesnoth.debug''' renamed to '''wml.tostring'''; in addition, it now produces an output that is valid WML, meaning that &amp;lt;syntaxhighlight lang=lua inline&amp;gt;wml.parse(wml.tostring(wml_table))&amp;lt;/syntaxhighlight&amp;gt; will output a clone of '''wml_table''' (though for this purpose there's a separate '''wml.clone''' function which is probably faster).&lt;br /&gt;
* '''wesnoth.delay''' renamed to '''wesnoth.interface.delay'''&lt;br /&gt;
* '''wesnoth.delete_ai_component''' renamed to '''wesnoth.sides.delete_ai_component'''&lt;br /&gt;
* '''wesnoth.deselect_hex''' renamed to '''wesnoth.interface.deselect_hex'''&lt;br /&gt;
* '''wesnoth.end_level''' replaced with assignable '''wesnoth.scenario.end_level_data'''&lt;br /&gt;
* '''wesnoth.end_turn''' renamed to '''wesnoth.interface.end_turn'''&lt;br /&gt;
* '''wesnoth.erase_unit''' renamed to '''wesnoth.units.erase'''&lt;br /&gt;
* '''wesnoth.eval_conditional''' renamed to '''wml.eval_conditional'''&lt;br /&gt;
* '''wesnoth.extract_unit''' renamed to '''wesnoth.units.extract'''&lt;br /&gt;
* '''wesnoth.find_cost_map''' renamed to '''wesnoth.paths.find_cost_map'''&lt;br /&gt;
* '''wesnoth.find_path''' renamed to '''wesnoth.paths.find_path'''&lt;br /&gt;
* '''wesnoth.find_reach''' renamed to '''wesnoth.paths.find_reach'''&lt;br /&gt;
* '''wesnoth.find_vacant_tile''' renamed to '''wesnoth.paths.find_vacant_hex'''&lt;br /&gt;
* '''wesnoth.find_vision_range''' renamed to '''wesnoth.paths.find_vision_range'''&lt;br /&gt;
* '''wesnoth.float_label''' renamed to '''wesnoth.interface.float_label'''&lt;br /&gt;
* '''wesnoth.format_conjunct_list''' renamed to '''stringx.format_conjunct_list'''&lt;br /&gt;
* '''wesnoth.format_disjunct_list''' renamed to '''stringx.format_disjunct_list'''&lt;br /&gt;
* '''wesnoth.format''' renamed to '''stringx.vformat''' and can also be called directly on a string literal&lt;br /&gt;
* '''wesnoth.gamestate_inspector''' renamed to '''gui.show_inspector'''&lt;br /&gt;
* '''wesnoth.get_all_vars''' replaced with read-only variable '''wml.all_variables''' (but it should still be used sparingly)&lt;br /&gt;
* '''wesnoth.get_displayed_unit''' renamed to '''wesnoth.interface.get_displayed_unit'''&lt;br /&gt;
* '''wesnoth.get_end_level_data''' replaced with readable '''wesnoth.scenario.end_level_data'''&lt;br /&gt;
* '''wesnoth.get_image_size''' renamed to '''filesystem.image_size'''&lt;br /&gt;
* '''wesnoth.get_max_liminal_bonus''' replaced with read-only '''wesnoth.current.schedule.liminal_bonus'''&lt;br /&gt;
* '''wesnoth.get_mouseover_tile''' renamed to '''wesnoth.interface.get_hovered_hex'''&lt;br /&gt;
* '''wesnoth.get_recall_units''' renamed to '''wesnoth.units.find_on_recall'''&lt;br /&gt;
* '''wesnoth.get_selected_tile''' renamed to '''wesnoth.interface.get_selected_hex'''&lt;br /&gt;
* '''wesnoth.get_side_variable''' and '''wesnoth.set_side_variable''' replaced by '''variables''' member in side data (found in '''wesnoth.sides''' array). This otherwise works the same as '''wml.variables'''.&lt;br /&gt;
** &amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- local old_value = wesnoth.get_side_variable(1, 'my_value')&lt;br /&gt;
local old_value = wesnoth.sides[1].variables['my_value'] -- or variables.myvalue&lt;br /&gt;
local new_value = old_value * 2&lt;br /&gt;
-- wesnoth.set_side_variable(1, 'my_value', new_value)&lt;br /&gt;
wesnoth.sides[1].variables['my_value'] = new_value&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.get_sides''' renamed to '''wesnoth.sides.find'''&lt;br /&gt;
* '''wesnoth.get_sound_source''' replaced with '''wesnoth.audio.sources''' mapping (read key)&lt;br /&gt;
* '''wesnoth.get_starting_location''' replaced by '''starting_location''' member in side data&lt;br /&gt;
* '''wesnoth.get_time_of_day''' replaced with '''wesnoth.schedule.get_time_of_day''' and '''wesnoth.schedule.get_illumination''' as well as '''wesnoth.current.schedule.time_of_day'''&lt;br /&gt;
** &amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- local global_tod = wesnoth.get_time_of_day(wesnoth.current.turn + 1)&lt;br /&gt;
local global_tod = wesnoth.schedule.get_time_of_day(nil, wesnoth.current.turn + 1)&lt;br /&gt;
-- local base_tod = wesnoth.get_time_of_day(wesnoth.current.turn + 1, {44, 23})&lt;br /&gt;
local base_tod = wesnoth.schedule.get_time_of_day({44, 23}, wesnoth.current.turn + 1)&lt;br /&gt;
-- local final_tod = wesnoth.get_time_of_day(wesnoth.current.turn + 1, {44, 23, true})&lt;br /&gt;
local final_tod = wesnoth.schedule.get_illumination({44, 24}, wesnoth.current.turn + 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.get_time_stamp''' renamed to '''wesnoth.ms_since_init'''&lt;br /&gt;
* '''wesnoth.get_traits''' replaced with '''wesnoth.game_config.global_traits''', which is the table it formerly returned&lt;br /&gt;
* '''wesnoth.get_unit''' renamed to '''wesnoth.units.get'''&lt;br /&gt;
* '''wesnoth.get_units''' renamed to '''wesnoth.units.find_on_map'''&lt;br /&gt;
* '''wesnoth.get_variable''' and '''wesnoth.set_variable''' are replaced by '''wml.variables''' which can be indexed with a variable path - set a variable by assigning to it&lt;br /&gt;
** &amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- local old_value = wesnoth.get_variable('my_array[2].value')&lt;br /&gt;
local old_value = wesnoth.variables['my_array[2].value']&lt;br /&gt;
local new_value = old_value * 2&lt;br /&gt;
-- wesnoth.set_variable('my_array[2].value', new_value)&lt;br /&gt;
wesnoth.variables['my_array[2].value'] = new_value&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.have_file''' renamed to '''filesystem.have_file'''&lt;br /&gt;
* '''wesnoth.highlight_hex''' renamed to '''wesnoth.interface.highlight_hex'''&lt;br /&gt;
* '''wesnoth.invoke_synced_command''' renamed to '''wesnoth.sync.invoke_command'''&lt;br /&gt;
* '''wesnoth.is_enemy''' renamed to '''wesnoth.sides.is_enemy'''&lt;br /&gt;
* '''wesnoth.is_fogged''' renamed to '''wesnoth.sides.is_fogged'''&lt;br /&gt;
* '''wesnoth.is_shrouded''' renamed to '''wesnoth.sides.is_shrouded'''&lt;br /&gt;
* '''wesnoth.is_skipping_messages''' renamed to '''wesnoth.interface.is_skipping_messages'''&lt;br /&gt;
* '''wesnoth.lock_view''' renamed to '''wesnoth.interface.lock'''&lt;br /&gt;
* '''wesnoth.match_side''' renamed to '''wesnoth.sides.matches'''&lt;br /&gt;
* '''wesnoth.match_unit''' renamed to '''wesnoth.units.matches'''&lt;br /&gt;
* '''wesnoth.message''' renamed to '''wesnoth.interface.add_chat_message'''&lt;br /&gt;
* '''wesnoth.music_list''' renamed to '''wesnoth.audio.music_list'''&lt;br /&gt;
* '''wesnoth.open_help''' renamed to '''gui.show_help'''&lt;br /&gt;
* '''wesnoth.place_shroud''' replaced with '''wesnoth.sides.place_shroud''' and '''wesnoth.sides.override_shroud'''&lt;br /&gt;
* '''wesnoth.play_sound''' renamed to '''wesnoth.audio.play'''&lt;br /&gt;
* '''wesnoth.put_recall_unit''' renamed to '''wesnoth.units.to_recall'''&lt;br /&gt;
* '''wesnoth.put_unit''' renamed to '''wesnoth.units.to_map'''&lt;br /&gt;
* '''wesnoth.random''' renamed to '''mathx.random'''&lt;br /&gt;
* '''wesnoth.read_file''' renamed to '''filesystem.read_file'''&lt;br /&gt;
* '''wesnoth.remove_modifications''' renamed to '''wesnoth.units.remove_modifications'''&lt;br /&gt;
* '''wesnoth.remove_sound_source''' replaced with '''wesnoth.audio.sources''' mapping (assign nil to key)&lt;br /&gt;
* '''wesnoth.remove_tile_overlay''' renamed to '''wesnoth.interface.remove_hex_overlay'''&lt;br /&gt;
* '''wesnoth.replace_schedule''' renamed to '''wesnoth.schedule.replace'''&lt;br /&gt;
* '''wesnoth.scroll_to_tile''' renamed to '''wesnoth.interface.scroll_to_hex'''&lt;br /&gt;
* '''wesnoth.scroll''' renamed to '''wesnoth.interface.scroll'''&lt;br /&gt;
* '''wesnoth.select_unit''' renamed to '''wesnoth.units.select''' (also available as wesnoth.interface.select_unit)&lt;br /&gt;
* '''wesnoth.set_end_campaign_credits''' replaced with assignable '''wesnoth.scenario.show_credits'''&lt;br /&gt;
* '''wesnoth.set_end_campaign_text''' replaced with assignable '''wesnoth.scenario.end_text''' and '''wesnoth.scenario.end_text_duration'''&lt;br /&gt;
* '''wesnoth.set_next_scenario''' replaced with assignable '''wesnoth.scenario.next'''&lt;br /&gt;
* '''wesnoth.set_side_id''' renamed to '''wesnoth.sides.set_id'''&lt;br /&gt;
* '''wesnoth.set_time_of_day''' (which was undocumented and unofficial) replaced with assigning '''wesnoth.current.schedule.time_of_day''', though that only covers part of the original functionality&lt;br /&gt;
* '''wesnoth.show_lua_console''' renamed to '''gui.show_lua_console'''&lt;br /&gt;
* '''wesnoth.show_menu''' renamed to '''gui.show_menu'''&lt;br /&gt;
* '''wesnoth.show_message_box''' renamed to '''gui.show_prompt'''&lt;br /&gt;
* '''wesnoth.show_message_dialog''' renamed to '''gui.show_narration'''&lt;br /&gt;
* '''wesnoth.show_popup_dialog''' renamed to '''gui.show_popup'''&lt;br /&gt;
* '''wesnoth.show_story''' renamed to '''gui.show_story'''&lt;br /&gt;
* '''wesnoth.skip_messages''' renamed to '''wesnoth.interface.skip_messages'''&lt;br /&gt;
* '''wesnoth.sound_volume''' replaced with read-write '''wesnoth.audio.volume'''&lt;br /&gt;
* '''wesnoth.switch_ai''' renamed to '''wesnoth.sides.switch_ai'''&lt;br /&gt;
* '''wesnoth.synchronize_choice''' renamed to '''wesnoth.sync.evaluate_single'''&lt;br /&gt;
* '''wesnoth.synchronize_choices''' renamed to '''wesnoth.sync.evaluate_multiple'''&lt;br /&gt;
* '''wesnoth.teleport''' renamed to '''wesnoth.units.teleport'''&lt;br /&gt;
* '''wesnoth.theme_items''' renamed to '''wesnoth.interface.game_display''' - it's still a table with the same keys as before&lt;br /&gt;
* '''wesnoth.tovconfig''' renamed to '''wml.tovconfig'''&lt;br /&gt;
* '''wesnoth.transform_unit''' renamed to '''wesnoth.units.transform'''&lt;br /&gt;
* '''wesnoth.unit_ability''' renamed to '''wesnoth.units.ability'''&lt;br /&gt;
* '''wesnoth.unit_defense''' renamed to '''wesnoth.units.chance_to_be_hit'''&lt;br /&gt;
* '''wesnoth.unit_jamming_cost''' renamed to '''wesnoth.units.jamming_on'''&lt;br /&gt;
* '''wesnoth.unit_movement_cost''' renamed to '''wesnoth.units.movement_on'''&lt;br /&gt;
* '''wesnoth.unit_resistance''' renamed to '''wesnoth.units.resistance'''&lt;br /&gt;
* '''wesnoth.unit_vision_cost''' renamed to '''wesnoth.units.vision_on'''&lt;br /&gt;
* '''wesnoth.unsynced''' renamed to '''wesnoth.sync.run_unsynced'''&lt;br /&gt;
* '''wesnoth.view_locked''' renamed to '''wesnoth.interface.is_locked'''&lt;br /&gt;
* '''wesnoth.wml_matches_filter''' renamed to '''wml.matches_filter'''&lt;br /&gt;
* '''wesnoth.zoom''' renamed to '''wesnoth.interface.zoom'''&lt;br /&gt;
&lt;br /&gt;
==== wesnoth.tovconfig and related functions in plugins ====&lt;br /&gt;
&lt;br /&gt;
The '''wesnoth.tovconfig''' function has been removed from the plugin context. This will have no effect on most people, as the plugin context is rarely used. A plugin context is any Lua script loaded using the &amp;lt;tt&amp;gt;--plugin&amp;lt;/tt&amp;gt; command-line parameter, primarily intended for creating bots on the multiplayer server.&lt;br /&gt;
&lt;br /&gt;
If you were calling '''wesnoth.tovconfig''' in a plugin, then you have several options for updating your code. If you simply needed to verify that a variable holds a valid WML table, you can use '''wml.valid''' instead. If you need to substitute variables into a WML table, you can also use '''wml.interpolate''' to replicate the behaviour of '''wml.tovconfig''', supplying the variables themselves as an extra argument (another WML table).&lt;br /&gt;
&lt;br /&gt;
In addition, the helper functions '''parsed''', '''literal''', '''shallow_parsed''', and '''shallow_literal''' are not available in the plugin context.&lt;br /&gt;
&lt;br /&gt;
==== GUI2 API ====&lt;br /&gt;
&lt;br /&gt;
There has been a major rehaul of the GUI2 API for arbitrary custom dialogs. See [[LuaAPI/types/widget]] and [[LuaAPI/gui/widget]] for details; the changes are also summarized below.&lt;br /&gt;
&lt;br /&gt;
* '''wesnoth.add_dialog_tree_node''' renamed to '''gui.widget.add_item_of_type''' and now takes a reference to the widget instead of a path to it; use '''gui.widget.find''' to convert a path to a reference&lt;br /&gt;
* '''wesnoth.get_dialog_value''' and '''wesnoth.set_dialog_value''' removed; instead access the appropriate member of the widget, such as '''selected_index''' or '''selected''' or '''text''' or '''value''' or '''percentage''' or '''selected_item_path''' or '''unfolded''' or '''unit''' or '''label'''. Some of these may be write-only.&lt;br /&gt;
* '''wesnoth.remove_dialog_item''' renamed to '''gui.widget.remove_items_at''' and now takes a reference to the widget instead of a path to it; use '''gui.widget.find''' to convert a path to a reference.&lt;br /&gt;
* '''wesnoth.set_dialog_active''' removed; instead assign the '''enabled''' member of a widget&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua &amp;gt;&lt;br /&gt;
-- local function preshow()&lt;br /&gt;
local function preshow(self)&lt;br /&gt;
    local var_a = true&lt;br /&gt;
    -- whatever you are doing to determine if button should be active&lt;br /&gt;
    -- wesnoth.set_dialog_active(var_a, &amp;quot;my_button_id&amp;quot;)&lt;br /&gt;
    local widget_handle = self:find('my_button_id') -- or just self.my_button_id&lt;br /&gt;
    widget_handle.enabled = var_a&lt;br /&gt;
    -- ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.set_dialog_callback''' removed; instead simply assign to a widget's callback handler, eg &amp;lt;syntaxhighlight lang=lua inline&amp;gt;my_widget.on_modified = function() end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua &amp;gt;&lt;br /&gt;
-- local function preshow()&lt;br /&gt;
local function preshow(self)&lt;br /&gt;
    local function on_text_modified()&lt;br /&gt;
        -- Do whatever you need to do&lt;br /&gt;
    end&lt;br /&gt;
    -- This example shows an on_modified event; there's also on_left_click and on_button_click&lt;br /&gt;
    -- Use one of the click events if you were setting the callback on a button.&lt;br /&gt;
    -- wesnoth.set_dialog_callback(on_text_modified, &amp;quot;my_text_id&amp;quot;)&lt;br /&gt;
    local widget_handle = self:find('my_text_id') -- or just self.my_text_id&lt;br /&gt;
    widget_handle.on_modified = set_dialog_callback&lt;br /&gt;
    -- Or you could have defined the function here like this:&lt;br /&gt;
    -- function widget_handle.on_modified()&lt;br /&gt;
    -- ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.set_dialog_canvas''' renamed to '''gui.widget.set_canvas''' and now takes a reference to the widget instead of a path to it; use '''gui.widget.find''' to convert a path to a reference&lt;br /&gt;
* '''wesnoth.set_dialog_focus''' renamed to '''gui.widget.focus''' and now takes a reference to the widget instead of a path to it; use '''gui.widget.find''' to convert a path to a reference&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua &amp;gt;&lt;br /&gt;
-- local function preshow()&lt;br /&gt;
local function preshow(self)&lt;br /&gt;
    -- wesnoth.set_dialog_focus(&amp;quot;my_text_id&amp;quot;)&lt;br /&gt;
    local widget_handle = self:find('my_text_id') -- or just self.my_text_id&lt;br /&gt;
    widget_handle:focus()&lt;br /&gt;
    -- ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.set_dialog_markup''' removed; instead assign the '''use_markup''' member of a widget&lt;br /&gt;
* '''wesnoth.set_dialog_tooltip''' removed; instead assign the '''tooltip''' member of a widget&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua &amp;gt;&lt;br /&gt;
-- local function preshow()&lt;br /&gt;
local function preshow(self)&lt;br /&gt;
    local var_a = 'Some explanation'&lt;br /&gt;
    -- whatever you are doing to determine the button's tooltip&lt;br /&gt;
    -- wesnoth.set_dialog_tooltip(var_a, &amp;quot;my_button_id&amp;quot;)&lt;br /&gt;
    local widget_handle = self:find('my_button_id') -- or just self.my_button_id&lt;br /&gt;
    widget_handle.tooltip = var_a&lt;br /&gt;
    -- ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.set_dialog_visible''' removed; instead assign the '''visible''' member of a widget&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua &amp;gt;&lt;br /&gt;
-- local function preshow()&lt;br /&gt;
local function preshow(self)&lt;br /&gt;
    local var_a = true&lt;br /&gt;
    -- whatever you are doing to determine if button should be visible&lt;br /&gt;
    -- wesnoth.set_dialog_visible(var_a, &amp;quot;my_button_id&amp;quot;)&lt;br /&gt;
    local widget_handle = self:find('my_button_id') -- or just self.my_button_id&lt;br /&gt;
    widget_handle.visible = var_a&lt;br /&gt;
    -- ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.show_dialog''' renamed to '''gui.show_dialog'''&lt;br /&gt;
* The '''preshow''' and '''postshow''' functions passed to '''gui.show_dialog''' now take a single parameter, which is a reference to the dialog's root widget (a widget of type &amp;quot;window&amp;quot;). This can be passed to '''gui.widget.find''' to look up widgets by their path. You can also access direct child widgets by simply indexing the root widget.&lt;br /&gt;
&lt;br /&gt;
==== Map API ====&lt;br /&gt;
&lt;br /&gt;
Due to a major rehaul of the map API, many map functions are now methods on the map object, available as '''wesnoth.current.map''' (abbreviated in the below listing to just '''map''').&lt;br /&gt;
&lt;br /&gt;
* '''wesnoth.add_time_area''' renamed to '''wesnoth.map.place_area'''&lt;br /&gt;
* '''wesnoth.get_locations''' renamed to '''wesnoth.map.find'''&lt;br /&gt;
* '''wesnoth.get_map_size''' replaced with '''map.playable_width''', '''map.playable_height''', and '''map.border_size'''&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- local width, height, border_size = wesnoth.get_map_size()&lt;br /&gt;
local width, height = wesnoth.current.map.playable_width, wesnoth.current.map.playable_height&lt;br /&gt;
local border_size = wesnoth.current.map.border_size&lt;br /&gt;
-- local width_with_border, height_with_border = width + border_size * 2, height + border_size * 2&lt;br /&gt;
local width_with_border, height_with_border = wesnoth.current.map.width and wesnoth.current.map.height&lt;br /&gt;
&amp;lt;/syntaxhighlight&lt;br /&gt;
* '''wesnoth.get_terrain_info''' replaced with '''wesnoth.terrain_types'''&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- local info = wesnoth.get_terrain_info('Gg')&lt;br /&gt;
local info = wesnoth.terrain_types['Gg']&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.get_terrain''' replaced with '''map[{x,y}]'''&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- local terrain = wesnoth.get_terrain(x, y)&lt;br /&gt;
local terrain = wesnoth.current.map[{x,y}]&lt;br /&gt;
-- local terrain_under_unit = wesnoth.get_terrain(unit.x, unit.y)&lt;br /&gt;
local terrain_under_unit = wesnoth.current.map[unit]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.get_village_owner''' renamed to '''wesnoth.map.get_owner'''&lt;br /&gt;
* '''wesnoth.get_villages''' replaced with '''wesnoth.map.find''' (with '''gives_income = true''')&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- For example, get all villages in [time_area]id=shadowed&lt;br /&gt;
-- local villages = wesnoth.get_villages{area = 'shadowed'}&lt;br /&gt;
local villages = wesnoth.map.find{area = 'shadowed', gives_income = true}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.label''' renamed to '''wesnoth.map.add_label'''&lt;br /&gt;
* '''wesnoth.match_location''' renamed to '''wesnoth.map.matches'''&lt;br /&gt;
* '''wesnoth.remove_time_area''' renamed to '''wesnoth.map.remove_area'''&lt;br /&gt;
* '''wesnoth.set_terrain''' replaced with assigning '''map[{x,y}]''' - helper functions in '''wesnoth.map''' expose the more advanced assignment operations ('''replace_overlay''', '''replace_both''', '''replace_if_failed''') - just assign the result of one of these functions to the hex&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- wesnoth.set_terrain(x, y, 'Gg')&lt;br /&gt;
wesnoth.current.map[{x,y}] = 'Gg'&lt;br /&gt;
-- Or be explicit about layer:&lt;br /&gt;
wesnoth.current.map[{x,y}] = wesnoth.map.replace_both 'Gg'&lt;br /&gt;
-- wesnoth.set_terrain(x, y, 'Gg', 'base')&lt;br /&gt;
wesnoth.current.map[{x,y}] = wesnoth.map.replace_base 'Gg'&lt;br /&gt;
-- wesnoth.set_terrain(x, y, '^Vh', 'overlay')&lt;br /&gt;
wesnoth.current.map[{x,y}] = wesnoth.map.relace_overlay '^Vh'&lt;br /&gt;
-- wesnoth.set_terrain(x, y, 'Gg^Vh', 'overlay', true)&lt;br /&gt;
wesnoth.current.map[{x,y}] = wesnoth.map.replace_if_failed('Gg^Vh', 'overlay')&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''wesnoth.set_village_owner''' renamed to '''wesnoth.map.set_owner'''&lt;br /&gt;
* '''wesnoth.special_locations''' renamed to '''map.special_locations'''  (note: the length operator is no longer supported)&lt;br /&gt;
* '''wesnoth.terrain_mask''' replaced with '''map:terrain_mask'''&lt;br /&gt;
&lt;br /&gt;
The following functions are only available in map generation scripts:&lt;br /&gt;
&lt;br /&gt;
* '''wesnoth.create_filter''' renamed to '''wesnoth.map.filter'''&lt;br /&gt;
* '''wesnoth.create_map''' renamed to '''wesnoth.map.create'''&lt;br /&gt;
* '''wesnoth.default_generate_height_map''' renamed to '''wesnoth.map.generate_height_map'''&lt;br /&gt;
* '''wesnoth.generate_default_map''' renamed to '''wesnoth.map.generate'''&lt;br /&gt;
* '''map:get_locations''' renamed to '''map:find'''&lt;br /&gt;
* '''map:get_tiles_radius''' replaced with '''map::find_in_radius''' (and the order of arguments changed)&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- This example assumes you have a variable f defined as in World Conquest (engine.lua)&lt;br /&gt;
-- local in_radius = map:get_tiles_radius(12, 22, f.terrain 'Gg', 5)&lt;br /&gt;
local in_radius = map:find_in_radius(12, 22, 5, f.terrain 'Gg')&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== helper module ===&lt;br /&gt;
&lt;br /&gt;
The helper module is being phased out, so quite a lot of things have been moved out of it. This section is written under the assumption that you loaded it with &amp;lt;syntaxhighlight lang=lua inline&amp;gt;local helper = wesnoth.require &amp;quot;helper&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; or the like, but many people call it '''H''' instead of '''helper''', so keep that in mind.&lt;br /&gt;
&lt;br /&gt;
* '''helper.child_array''' renamed to '''wml.child_array'''&lt;br /&gt;
* '''helper.child_count''' renamed to '''wml.child_count'''&lt;br /&gt;
* '''helper.child_range''' renamed to '''wml.child_range'''&lt;br /&gt;
* '''helper.distance_between''' renamed to '''wesnoth.map.distance_between'''&lt;br /&gt;
* '''helper.find_attack''' renamed to '''wesnoth.units.find_attack'''&lt;br /&gt;
* '''helper.get_child''' renamed to '''wml.get_child'''&lt;br /&gt;
* '''helper.get_nth_child''' renamed to '''wml.get_nth_child'''&lt;br /&gt;
* '''helper.get_user_choice''' renamed to '''gui.get_user_choice'''&lt;br /&gt;
* '''helper.get_variable_array''' renamed to '''wml.array_access.get'''&lt;br /&gt;
* '''helper.get_variable_proxy_array''' renamed to '''wml.array_access.get_proxy'''&lt;br /&gt;
* '''helper.literal''' renamed to '''wml.literal'''&lt;br /&gt;
* '''helper.modify_unit''' renamed to '''wesnoth.units.modify'''&lt;br /&gt;
* '''helper.move_unit_fake''' renamed to '''wesnoth.interface.move_unit_fake'''&lt;br /&gt;
* '''helper.parsed''' renamed to '''wml.parsed'''&lt;br /&gt;
* '''helper.rand''' renamed to '''mathx.random_choice'''&lt;br /&gt;
* '''helper.round''' renamed to '''mathx.round'''&lt;br /&gt;
* '''helper.set_variable_array''' renamed to '''wml.array_access.set'''&lt;br /&gt;
* '''helper.set_wml_tag_metatable''' replaced with '''wml.tag''', which is a table that works exactly the same as what this function would return&lt;br /&gt;
**&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
-- local T = helper.set_wml_tag_metatable{}&lt;br /&gt;
local T = wml.tag -- Or you can dispense with T and use wml.tag directly&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* '''helper.set_wml_var_metatable''' replaced with '''wml.variable.proxy''', which is a table that works exactly the same as what this function would return&lt;br /&gt;
* '''helper.shallow_literal''' renamed to '''wml.shallow_literal'''&lt;br /&gt;
* '''helper.shallow_parsed''' renamed to '''wml.shallow_parsed'''&lt;br /&gt;
* '''helper.shuffle''' renamed to '''mathx.shuffle'''&lt;br /&gt;
* '''helper.wml_error''' renamed to '''wml.error'''&lt;br /&gt;
&lt;br /&gt;
=== items module ===&lt;br /&gt;
&lt;br /&gt;
There were also a few things in an &amp;quot;items&amp;quot; module that have been moved into the main API.&lt;br /&gt;
&lt;br /&gt;
* '''items.place_halo''' renamed to '''wesnoth.interface.add_item_halo'''&lt;br /&gt;
* '''items.place_image''' renamed to '''wesnoth.interface.add_item_image'''&lt;br /&gt;
* '''items.remove''' renamed to '''wesnoth.interface.remove_item'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=BuildingScenarios/es&amp;diff=68457</id>
		<title>BuildingScenarios/es</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=BuildingScenarios/es&amp;diff=68457"/>
		<updated>2021-08-24T08:27:51Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update links to macro-reference.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Translations}}&lt;br /&gt;
{| style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
__NOTOC__&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;navtemplate&amp;quot;&amp;gt;Enlaces de creación: [[BuildingMaps/es | Mapas]] | [[BuildingScenarios/es | Escenarios]] | [[BuildingCampaigns/es | Campañas]] | [[MultiplayerContent| Multijugadores]] | [[BuildingUnits | Unidades]] &amp;lt;/div class=&amp;quot;navtemplate&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{| style=&amp;quot;right; margin-left:1em;&amp;quot;&lt;br /&gt;
|__TOC__&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= Escenarios =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p align=justify&amp;gt;Los escenarios de Wesnoth son niveles individuales que forman parte de las campañas. También pueden ser mapas avanzados, con personajes y elementos adicionales, que pueden ser jugados por múltiples jugadores.  Cada escenario contiene dos archivos: el primero es un mapa (vea [[BuildingMaps]]; y el segundo, es el archivo de configuración (conocido como archivo «config»).   Este último, se utiliza para describir todo sobre el escenario.  Ambos archivos tienen que estar escritos en el código de carácteres ASCII (acrónimo en inglés para «código estándar estadounidense para el intercambio de información») y deben poder editarse en cualquier editor de texto (e.g. vi, notepad, etc.).  No se recomienda utilizar un procesador de textos (e.g. Microsoft Word; OpenOffice Writer; etc.), pero si aún así decide hacerlo, no olvide guardar el archivo como un tipo texto (e.i. .txt).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;p align=justify&amp;gt;'''Nota:''' los escenarios siempre son escritos en el [[ReferenceWML | lenguaje de marcado de Wesnoth]] (mejor conocido por sus siglas en inglés «WML», que significan «Wesnoth Markup Language»).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p align=justify&amp;gt;Esta sección se divide en varias partes, que incluyen un tutorial básico y la explicación del uso de técnicas avanzadas y complejas.  Se espera que, al finalizar la lectura de todas las partes de esta sección, usted tenga el conocimiento necesario para crear su propios escenarios para «La Batalla por Wesnoth».&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''&amp;lt;i&amp;gt;(La mayoría de los enlaces llevan a sitios completamente en el idioma inglés, salvo aquellos que indican lo contrario.)&amp;lt;/i&amp;gt;'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;navtemplate&amp;quot;&amp;gt;&lt;br /&gt;
==== Índice ====&lt;br /&gt;
===== Creando escenarios =====&lt;br /&gt;
:* [[BuildingScenariosSimple|Simple]] - [[BuildingScenariosIntermediate | Intermedio]] - [[BuildingScenariosAdvanced|Avanzado]]&lt;br /&gt;
:* [[BuildingScenariosSamples|Código de ejemplo]] - ejemplo básico de un código&lt;br /&gt;
:* [[ShroudDataWML|Tutorial SHROUD_DATA]] - un tutorial en «shroud_data»&lt;br /&gt;
:* [[BuildingScenariosBalancing|Creando un balance]] - cómo balancear su escenario&lt;br /&gt;
&amp;lt;/div class=&amp;quot;navtemplate&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;navtemplate&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Índice de etiqueta rápida ====&lt;br /&gt;
[[ScenarioWML]] - las etiquetas de nivel superior: [scenario], [multiplayer], [test] y [tutorial]&lt;br /&gt;
:* [[EventWML]] - cómo describir un evento&lt;br /&gt;
:** [[FilterWML]]&lt;br /&gt;
:** [[DirectActionsWML]], [[InterfaceActionsWML]], [[InternalActionsWML]]&lt;br /&gt;
:* [[SideWML]] - cómo describir una facción&lt;br /&gt;
:** [[SingleUnitWML]]&lt;br /&gt;
:** [[ShroudDataWML]]&lt;br /&gt;
:* [[MapGeneratorWML]] - el generador de mapas al azar&lt;br /&gt;
:* [[TimeWML]] - cómo describir un día&lt;br /&gt;
:* [[IntroWML]] - cómo describir la pantalla de introducción &lt;br /&gt;
:* [https://www.wesnoth.org/macro-reference.html Macro Reference] - un conjunto de preprocesadores que puede utilizar&lt;br /&gt;
&amp;lt;/div class=&amp;quot;navtemplate&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== También vea ==&lt;br /&gt;
&lt;br /&gt;
* [[Create | Crear]] '''&amp;lt;i&amp;gt;(en español)&amp;lt;/i&amp;gt;'''&lt;br /&gt;
* [[ReferenceWML]] - referencias para el lenguaje de marcado de Wesnoth («WML»)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;navtemplate&amp;quot;&amp;gt;Enlaces de creación: [[BuildingMaps/es | Mapas]] | [[BuildingScenarios/es | Escenarios]] | [[BuildingCampaigns/es | Campañas]] | [[MultiplayerContent| Multijugadores]] | [[BuildingUnits | Unidades]] &amp;lt;/div class=&amp;quot;navtemplate&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Create]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DescriptionWML&amp;diff=68456</id>
		<title>DescriptionWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DescriptionWML&amp;diff=68456"/>
		<updated>2021-08-24T08:23:57Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update links to macro-reference.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
== Description texts ==&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.15|1}} '''Support for the image-icon plus text format in this section has been removed.  See the WML Format section further down on this page for the supported format.'''&lt;br /&gt;
&lt;br /&gt;
A description is a part of the value of a menu attribute.&lt;br /&gt;
It represents a single option in the difficulty selection menu for a campaign, which consists of an image (called the ''icon'') followed by text. When appropriate, the icon should use [[ImagePathFunctions]] to replace any magenta with a team color.&lt;br /&gt;
&lt;br /&gt;
The description tag uses a special format:&lt;br /&gt;
&lt;br /&gt;
* ''';''' if another description precedes it&lt;br /&gt;
&lt;br /&gt;
* '''*''' if it should be the default selection&lt;br /&gt;
&lt;br /&gt;
* '''&amp;amp;''image''=''text''''' image with one text description&lt;br /&gt;
&lt;br /&gt;
* '''&amp;amp;''image''=''text''=''text2''''' image with two text descriptions&lt;br /&gt;
&lt;br /&gt;
Single text items are always enclosed in '''&amp;quot;''', and can be joined together (concatenated) with '''+'''. This allows the text to contain translatable items and span multiple lines. (Marking text with '''_''' indicates that it is translatable.)&lt;br /&gt;
&lt;br /&gt;
A sample difficulty description tag might look like this:&lt;br /&gt;
&lt;br /&gt;
 difficulty_descriptions=&amp;quot;&amp;amp;&amp;quot; + &amp;quot;units/elves-wood/elvish-fighter.png~TC(1,magenta)&amp;quot; + &amp;quot;=&amp;quot; + _&amp;quot;Fighter&amp;quot; + &amp;quot;=&amp;quot; + _&amp;quot;(easiest)&amp;quot; +&lt;br /&gt;
 	&amp;quot;;*&amp;quot; + &amp;quot;&amp;amp;&amp;quot; + &amp;quot;units/elves-wood/elvish-hero.png~TC(1,magenta)&amp;quot; + &amp;quot;=&amp;quot; + _&amp;quot;Hero&amp;quot; +&lt;br /&gt;
 	&amp;quot;;&amp;quot; + &amp;quot;&amp;amp;&amp;quot; + &amp;quot;units/elves-wood/elvish-champion.png~TC(1,magenta)&amp;quot; + &amp;quot;=&amp;quot; + _&amp;quot;Champion&amp;quot; + &amp;quot;=&amp;quot; + _&amp;quot;(hardest)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The utility macros (see the [https://www.wesnoth.org/macro-reference.html#file:utils.cfg Macro Reference]) '''{MENU_IMG_TXT ''icon'' ''text''}'''&lt;br /&gt;
and '''{MENU_IMG_TXT2 ''icon'' ''text'' ''text-2''}'''&lt;br /&gt;
can be used to create descriptions more easily. The above example would become:&lt;br /&gt;
&lt;br /&gt;
 difficulty_descriptions={MENU_IMG_TXT2 &amp;quot;units/elves-wood/elvish-fighter.png~TC(1,magenta)&amp;quot; _&amp;quot;Fighter&amp;quot; _&amp;quot;(easiest)&amp;quot;} +&lt;br /&gt;
 	&amp;quot;;*&amp;quot; + {MENU_IMG_TXT &amp;quot;units/elves-wood/elvish-hero.png~TC(1,magenta)&amp;quot; _&amp;quot;Hero&amp;quot;} + &amp;quot;;&amp;quot; +&lt;br /&gt;
 	{MENU_IMG_TXT2 &amp;quot;units/elves-wood/elvish-champion.png~TC(1,magenta)&amp;quot; _&amp;quot;Champion&amp;quot; _&amp;quot;(hardest)&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
====Alternative Description Implementation====&lt;br /&gt;
&lt;br /&gt;
For still greater clarity, I have the following suggestion:&lt;br /&gt;
Before the start of the [campaign] tag, create a set of #define commands as follows:&lt;br /&gt;
 # Image definitions&lt;br /&gt;
 # NB Don't forget the trailing + symbols for all but the last entry.&lt;br /&gt;
 #define EASY_IMAGE&lt;br /&gt;
 &amp;quot;&amp;amp;units/elves-wood/elvish-fighter.png~TC(1,magenta)&amp;quot;+&lt;br /&gt;
 #enddef&lt;br /&gt;
 &lt;br /&gt;
 #define NORMAL_IMAGE&lt;br /&gt;
 &amp;quot;;*&amp;amp;units/elves-wood/elvish-hero.png~TC(1,magenta)&amp;quot;+&lt;br /&gt;
 #enddef&lt;br /&gt;
 &lt;br /&gt;
 #define HARD_IMAGE&lt;br /&gt;
 &amp;quot;;&amp;amp;units/elves-wood/elvish-champion.png~TC(1,magenta)&amp;quot;+&lt;br /&gt;
 #enddef&lt;br /&gt;
 &lt;br /&gt;
 # Difficulty ratings&lt;br /&gt;
 #po: NB be sure to retain the = signs in the translated text.&lt;br /&gt;
 #define EASY_TEXT&lt;br /&gt;
 _&amp;quot;=Fighter=(easiest)&amp;quot;+&lt;br /&gt;
 #enddef&lt;br /&gt;
 &lt;br /&gt;
 #define NORMAL_TEXT&lt;br /&gt;
 _&amp;quot;=Hero&amp;quot;+&lt;br /&gt;
 #enddef&lt;br /&gt;
 &lt;br /&gt;
 #define HARD_TEXT&lt;br /&gt;
 _&amp;quot;=Champion=(hardest)&amp;quot;&lt;br /&gt;
 #enddef&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The above example assumes three difficulty levels, which gives six difficulty entries – three for the pictures and three for the text. If you have more or fewer than three difficulty levels, make sure that the last entry does ''not'' have a trailing plus sign and that all the others do. Note also that the first image description ''doesn't'' start with a semicolon, whereas the second and subsequent ones do. Finally, only the default difficulty entry is marked with a * character.&lt;br /&gt;
&lt;br /&gt;
If you set up your difficulty strings in this way you can then use a standard difficulty_descriptions tag that you will rarely need to alter. Note that this string does ''not'' contain any plus signs. You have to have them in the difficulty ratings strings instead to avoid upsetting the Wesnoth preprocessor:&lt;br /&gt;
&lt;br /&gt;
 difficulty_descriptions={EASY_IMAGE}{EASY_TEXT}{NORMAL_IMAGE}{NORMAL_TEXT}{HARD_IMAGE}{HARD_TEXT}&lt;br /&gt;
&lt;br /&gt;
The only time you would need to alter this string is if you have more or fewer than three difficulty levels for your campaign.&lt;br /&gt;
&lt;br /&gt;
[[User:Simons Mith|Simons Mith]] 20:16, 18 November 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== WML Format ==&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|2}}&lt;br /&gt;
&lt;br /&gt;
As of 1.13.2, the DescriptionWML format has changed to use WML tags. It goes in either a '''[difficulty]''' tag within '''[campaign]''' or an '''[option]''' tag within '''[message]''' and comprises the following attributes:&lt;br /&gt;
&lt;br /&gt;
* '''default''': If yes, this item is the default selection (assuming no other items also have default=yes).&lt;br /&gt;
* '''image''': Optional path to an image file to display.&lt;br /&gt;
* '''label''': Text to display in the first text column.&lt;br /&gt;
* '''description''': Text to display in the second text column.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[CampaignWML]]&lt;br /&gt;
* [[EraWML]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=PreprocessorRef&amp;diff=68455</id>
		<title>PreprocessorRef</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=PreprocessorRef&amp;diff=68455"/>
		<updated>2021-08-24T08:21:36Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* Built-in macros */ fix english&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth loads just one configuration file directly: '''data/_main.cfg'''. However the '''WML preprocessor''' allows to include more files. Whenever a WML file is read by Wesnoth, it is passed through the preprocessor.&lt;br /&gt;
&lt;br /&gt;
The preprocessor can interpret a simple language of string expansions known as ''macros''. A macro should always be defined '''before''' the place where it needs to be used.&lt;br /&gt;
&lt;br /&gt;
The preprocessor is applied recursively, so included files will be parsed for macros, and after macro expansion will be parsed for macros again, and so on. As a result, you should not write a recursive macro that references itself, because it will cause errors (but, alas, not necessarily error messages).&lt;br /&gt;
&lt;br /&gt;
== Preprocessor directives ==&lt;br /&gt;
&lt;br /&gt;
The following directives are used to create and use ''macros'', i.e. shortcuts which reduce repetition of information. See [https://www.wesnoth.org/macro-reference.html the macro reference] for the list of predefined core macros.&lt;br /&gt;
&lt;br /&gt;
The preprocessor has changed several times, so don't expect old Wesnoth versions to behave exactly the same as the current stable and development series.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' In multiplayer scenarios, these directives will appear to work only for the host and not for other clients. This is because the preprocessor is run only on the host, and the clients receive the resultant WML from the server. It's particularly important to keep this in mind before using preprocessor conditionals.&lt;br /&gt;
&lt;br /&gt;
=== #define ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax: #define ''symbol'' [''parameters''] ''&amp;lt;newline&amp;gt;'' ''substitution'' #enddef'''&lt;br /&gt;
&lt;br /&gt;
All subsequent occurences of '''{''symbol'' [''arguments'']}''' (see below) will be replaced by the contents of the ''substitution'' block, with all occurrences of any parameter {''parameter''} within ''substitution'' replaced by the corresponding value in ''arguments''. For example, the ENEMY_UNIT macro for the [[#Macro inclusions|macro inclusion]] example below could be defined as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#define ENEMY_UNIT TYPE X Y&lt;br /&gt;
## the ordering above is important, since the preprocessor does not distinguish&lt;br /&gt;
## data into different types; only the ordering is used to determine which&lt;br /&gt;
## arguments apply to which parameters.&lt;br /&gt;
[unit]&lt;br /&gt;
    type={TYPE} ## the unit will be of type TYPE, so different&lt;br /&gt;
                ## instantiations&lt;br /&gt;
                ## of this macro can create different units.&lt;br /&gt;
    x={X}&lt;br /&gt;
    y={Y}&lt;br /&gt;
    side=2 ## the unit will be an enemy, regardless of the parameter&lt;br /&gt;
           ## values. This reduces &amp;quot;repetition of information&amp;quot;,&lt;br /&gt;
           ## since it is no longer necessary to specify&lt;br /&gt;
           ## each created unit as an enemy.&lt;br /&gt;
[/unit]&lt;br /&gt;
#enddef&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(See [[SingleUnitWML]] for further information on creating units using WML.)&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The final line break before #enddef is included in the expansion. This means that if the symbol is used in the middle of a line, you should place the #enddef immediately after the value has ended, without a line break in between. &lt;br /&gt;
&lt;br /&gt;
'''Important note:''' Although macros may look like they're simplifying the code, they do not help with wml bloating. Macros are very good at ''disguising'' WML bloat, but they do nothing to ''alleviate'' it. So instead of using macros to generate redundant and repetitive instructions, you should be considering how to eliminate redundancy through programming techniques of abstraction. The most popular way to improve your code is using custom [[EventWML|events]] and [[InternalActionsWML#.5Bfire_event.5D|fire_event]] tags. See also: [[Wml_optimisation]].&lt;br /&gt;
&lt;br /&gt;
=== #arg ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|7}} &lt;br /&gt;
&lt;br /&gt;
'''Syntax: #arg ''symbol'' ''&amp;lt;newline&amp;gt;'' ''default value'' #endarg'''&lt;br /&gt;
&lt;br /&gt;
Defines an optional argument for a macro along with its default value. Optional arguments can be used to make a macro more flexible and to allow its user to specify certain parameters only when necessary.&lt;br /&gt;
&lt;br /&gt;
For example, one could define a shortcut macro for [message] with only one required argument (the text displayed), but several optional ones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#define MESSAGE TEXT&lt;br /&gt;
&lt;br /&gt;
#arg SPEAKER_ID&lt;br /&gt;
narrator&lt;br /&gt;
#endarg&lt;br /&gt;
&lt;br /&gt;
#arg CAPTION&lt;br /&gt;
#endarg&lt;br /&gt;
&lt;br /&gt;
#arg SOUND&lt;br /&gt;
#endarg&lt;br /&gt;
&lt;br /&gt;
#arg IMG&lt;br /&gt;
#endarg&lt;br /&gt;
&lt;br /&gt;
[message]&lt;br /&gt;
    speaker={SPEAKER_ID}&lt;br /&gt;
    message={TEXT}&lt;br /&gt;
    caption={CAPTION}&lt;br /&gt;
    sound={SOUND}&lt;br /&gt;
    image={IMG}&lt;br /&gt;
[/message]&lt;br /&gt;
#enddef&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The caller of the macro can then decide which, if any, of the default values to override:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
{MESSAGE _&amp;quot;Halt!&amp;quot; SPEAKER_ID=&amp;quot;Guard Captain&amp;quot;}&lt;br /&gt;
{MESSAGE _&amp;quot;Two days pass...&amp;quot; IMG=wesnoth-icon.png SOUND=ambient/morning.ogg}&lt;br /&gt;
{MESSAGE _&amp;quot;...&amp;quot;}&lt;br /&gt;
{MESSAGE _&amp;quot;Welcome!&amp;quot; CAPTION=_&amp;quot;Elóndra's shop of wonders&amp;quot; IMG=portraits/elves/shyde.png}&lt;br /&gt;
{MESSAGE _&amp;quot;*smash*&amp;quot; SPEAKER_ID=&amp;quot;Bridge Troll&amp;quot; SOUND=mace.ogg}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' As with #enddef, the final line break before #endarg is included in the default value. This means that if the symbol is used in the middle of a line, you should place the #endarg immediately after the value has ended, without a line break in between.&lt;br /&gt;
&lt;br /&gt;
=== #undef ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#undef ''symbol'' '''&lt;br /&gt;
&lt;br /&gt;
Removes the previous definition of the macro named ''symbol''.&lt;br /&gt;
&lt;br /&gt;
=== Inclusion directive {} ===&lt;br /&gt;
&lt;br /&gt;
This directive can be used to include macros, single files or sets of files from a target directory.&lt;br /&gt;
&lt;br /&gt;
==== File/directory inclusions ====&lt;br /&gt;
&lt;br /&gt;
'''Syntax: {''path''}'''&lt;br /&gt;
&lt;br /&gt;
Includes the file with the specified ''path'', which will in turn run the preprocessor on it and perform any required substitutions or inclusions within it. The ''path'' may not contain ''..'' or the inclusion will be skipped.&lt;br /&gt;
&lt;br /&gt;
The exact location in which the ''path'' will be resolved will depend on its prefix:&lt;br /&gt;
&lt;br /&gt;
* '''{''path''}''': If ''path'' isn't a known macro (see below), the game will assume it's a relative path to a file in the main game '''data/''' directory and include it.&lt;br /&gt;
* '''{~''path''}''': As above, but instead of the game data directory, the path is resolved relative to the user '''data/''' directory, where user made add-ons can normally be found.&lt;br /&gt;
* '''{./''path''}''': The path is resolved relative to the location of the current file containing this inclusion.&lt;br /&gt;
&lt;br /&gt;
Information for locating the user data and game data directories can be found in [[EditingWesnoth]].&lt;br /&gt;
&lt;br /&gt;
Forward slashes ('''/''') should '''always''' be used as the path delimiter, even if your platform uses a different symbol such as colons (''':''') or backslashes ('''\''')! It is also very important to respect the '''actual letter case''' used to name files and directories for compatibility with case-sensitive filesystems on Unix-based operating systems.&lt;br /&gt;
&lt;br /&gt;
When ''path'' points to a directory instead of a file, the preprocessor will include all files found within with the '''.cfg''' extension, in alphabetical order; files without this extension (such as '''.map''' or '''.png''' files) are ignored.&lt;br /&gt;
&lt;br /&gt;
Some directories are handled in a special fashion according to their contents:&lt;br /&gt;
&lt;br /&gt;
* If there's a file named '''_main.cfg''' in the target directory, only that file will be included and preprocessed. It may include other files from its own directory or subdirectories within it, of course. This is used for managing WML directories as self-contained packages, like user made add-ons.&lt;br /&gt;
* If there are files named '''_main.cfg''' in subdirectories of the target and there isn't one in the target itself, they will be all preprocessed. Given the following layout:&lt;br /&gt;
 dir/&lt;br /&gt;
 dir/a/_main.cfg&lt;br /&gt;
 dir/a/other.cfg&lt;br /&gt;
 dir/b/_main.cfg&lt;br /&gt;
 dir/b/other.cfg&lt;br /&gt;
 dir/other.cfg&lt;br /&gt;
Using '''{dir}''' will cause dir/a/_main.cfg, dir/b/_main.cfg and dir/other.cfg to be included.&lt;br /&gt;
* If there's a file named '''_final.cfg''' but no '''_main.cfg''', the file is guaranteed to be included and processed ''after'' all the other files in the directory.&lt;br /&gt;
* If there's a file named '''_initial.cfg''' but no '''_main.cfg''', the file is guaranteed to be included and processed ''before'' all the other files in the directory.&lt;br /&gt;
&lt;br /&gt;
==== Macro inclusions ====&lt;br /&gt;
&lt;br /&gt;
'''Syntax: {''symbol'' [''arguments''] [''optional arguments'']}'''&lt;br /&gt;
&lt;br /&gt;
If the macro named ''symbol'' is defined, the preprocessor will replace this instruction by the expression ''symbol'' was previously defined as, using ''arguments'' as parameters. The number of normal arguments must be exactly the same as in the original definition or an error will occur. Optional arguments can only be placed '''after''' all normal arguments, however they can be specified in any order desired.&lt;br /&gt;
&lt;br /&gt;
You can create multiple word arguments by using parentheses to delimit the contents. For example, in '''{ENEMY_UNIT Wolf Rider 18 24}''' the four words will be interpreted as separate arguments and cause the preprocessor to fail since the macro was defined above with only three; instead, you should use '''{ENEMY_UNIT (Wolf Rider) 18 24}'''.&lt;br /&gt;
&lt;br /&gt;
Optional arguments can also be delimited by placing parentheses, however they must be placed around both the argument name '''and''' content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
{MESSAGE _&amp;quot;I'll smash you!&amp;quot; (SPEAKER_ID=Bridge Troll) } # Correct&lt;br /&gt;
{MESSAGE _&amp;quot;I'll smash you!&amp;quot; SPEAKER_ID=(Bridge Troll) } # Wrong&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This way even complex arguments can be passed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
{MODIFY_UNIT (&lt;br /&gt;
    [filter_adjacent]&lt;br /&gt;
        canrecruit=yes&lt;br /&gt;
    [/filter_adjacent]&lt;br /&gt;
    ) side 2}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using the name of an existing macro as the name of a macro argument is possible, but the argument will always take precedence over the original macro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#define VARIABLE&lt;br /&gt;
#enddef&lt;br /&gt;
#define MACRO VARIABLE&lt;br /&gt;
    {VARIABLE} # is calling for the argument, not for the macro above&lt;br /&gt;
#enddef&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== #ifdef and #ifndef ===&lt;br /&gt;
&lt;br /&gt;
Unlike the other preprocessor directives, '''#ifdef''' and '''#ifndef''' are not mere conveniences. They are often necessary to distinguish between different gameplay modes or difficulties (see [[#Built-in macros|Built-in macros]] below).&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifdef ''symbol'' ''substitution-if-defined'' [#else ''substitution-if-not-defined'' ] #endif'''&lt;br /&gt;
&lt;br /&gt;
If ''symbol'' has been defined with '''#define''' or as a built-in macro, the whole block will be replaced by ''substitution-if-defined''.  If not, it will be replaced by ''substitution-if-not-defined'' if it is available.&lt;br /&gt;
&lt;br /&gt;
'''#ifndef''' is the exact opposite of '''#ifdef''', reversing the logic:&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifndef ''symbol'' ''substitution-if-not-defined''  [#else ''substitution-if-defined''] #endif'''&lt;br /&gt;
&lt;br /&gt;
=== #ifhave and #ifnhave ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifhave ''path'' ''substitution-if-path-exists'' [#else ''substitution-if-path-does-not-exist''] #endif'''&lt;br /&gt;
&lt;br /&gt;
Checks for the existence of a file. Uses the same relative paths as include directives (see below).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#ifhave ~add-ons/My_Addon/_main.cfg&lt;br /&gt;
    {MY_ADDON_MACROS}&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''#ifnhave'''  does the opposite of '''#ifhave''':&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifnhave ''path'' ''substitution-if-path-does-not-exist'' [#else ''substitution-if-path-exists''] #endif'''&lt;br /&gt;
&lt;br /&gt;
=== #ifver and #ifnver ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifver ''symbol'' ''operator'' ''version-number'' ''&amp;lt;newline&amp;gt;'' ''substitution-if-condition-met'' [#else ''substitution-if-condition-not-met''] #endif'''&lt;br /&gt;
&lt;br /&gt;
Compares a version number defined in a macro against an argument for conditional block inclusions, like ''#ifdef'' and ''#ifhave''. ''operator'' is one of ''=='' (equal), ''!='' (not equal), ''&amp;lt;'' (less), ''&amp;lt;='' (less or equal), ''&amp;gt;'' (greater), ''&amp;gt;='' (greater or equal). The specified ''symbol'' should have been previously defined as plain text without more macro inclusions within it, and it must not require any arguments.&lt;br /&gt;
&lt;br /&gt;
Versions with text suffixes are sorted in binary order and come after all versions with the same number. The most common suffixes begin with &amp;quot;+&amp;quot;, but as this represents multiple possible versions, comparing versions against it is not recommended.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#ifver WESNOTH_VERSION &amp;gt;= 1.9.7+&lt;br /&gt;
    [message]&lt;br /&gt;
        speaker=narrator&lt;br /&gt;
        message= _ &amp;quot;I’m on Wesnoth 1.9.7+, 1.9.8 or later!&amp;quot;&lt;br /&gt;
    [/message]&lt;br /&gt;
#else&lt;br /&gt;
#ifver WESNOTH_VERSION == 1.9.7&lt;br /&gt;
    [message]&lt;br /&gt;
        speaker=narrator&lt;br /&gt;
        message= _ &amp;quot;I’m on Wesnoth 1.9.7, and I’ll include some workaround code for bug #9001!&amp;quot;&lt;br /&gt;
    [/message]&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''#ifnver'''  does the opposite of '''#ifver''':&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifnver ''symbol'' ''operator'' ''version-number'' ''&amp;lt;newline&amp;gt;'' ''substitution-if-condition-not-met'' [#else ''substitution-if-condition-met''] #endif'''&lt;br /&gt;
&lt;br /&gt;
=== #error ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#error [''message'']'''&lt;br /&gt;
&lt;br /&gt;
Causes the WML preprocessor to fail unconditionally upon encountering the line. For add-ons, this will cause the game to display an error and return to the titlescreen if the add-on is required for the user's action (such as playing a campaign or loading a saved game). For core WML, this will cause the game to quit entirely.&lt;br /&gt;
&lt;br /&gt;
Please note that in spite of the example below, it is '''not''' advisable to use this mechanism in published add-ons for version or feature-checking, since the message is not displayed in a form that permits translation and the additional trace information may confuse players. This directive is only intended as a debugging aid for content creators.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#ifver WESNOTH_VERSION &amp;lt; 1.11.10&lt;br /&gt;
#error This add-on does not support Wesnoth 1.11.10!&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== #warning ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#warning [''message'']'''&lt;br /&gt;
&lt;br /&gt;
Causes the WML preprocessor to emit a warning upon encountering the line. The message will '''only''' be relayed to stderr, not to the player in the game UI. This directive is only intended as a debugging aid for content creators.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#ifver WESNOTH_VERSION &amp;lt; 1.11.10&lt;br /&gt;
#warning On Wesnoth 1.11.9 or earlier, bug workarounds enabled!&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== #deprecated ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|11}}&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#deprecated 1 ''message'''''&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#deprecated 2 ''version'' ''message'''''&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#deprecated 3 ''version'' ''message'''''&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#deprecated 4 ''message'''''&lt;br /&gt;
&lt;br /&gt;
The effect of this directive depends on whether it appears within a macro definition.&lt;br /&gt;
&lt;br /&gt;
* If it appears at file level, outside any macro definition, then it immediately outputs a warning saying that the file is deprecated, with the provided message. Multiple '''#deprecated''' directives at toplevel in a single file will result in separate messages.&lt;br /&gt;
* If it appears inside a macro definition ('''#define ... #enddef'''), then it doesn't output anything. Instead, it marks the macro as deprecated. When that macro is later used, only then will the preprocessor output a warning saying that the macro is deprecated, with the provided message. Multiple '''#deprecated''' directives within a single macro will be merged into one message.&lt;br /&gt;
&lt;br /&gt;
Note that deprecation messages will only appear if they have been set to. {{DevFeature1.13|12}} This can be done by enabling debug mode, or by going to Advanced Preferences and setting the log-level for the deprecation logdomain. (This can also be done on the command-line.)&lt;br /&gt;
&lt;br /&gt;
If you provide a deprecation level of 2 or 3, it is required to indicate the earliest version in which the feature could be removed. However, if you provide a deprecation level of 1 or 4, any provided ''version'' will instead be parsed as part of the message, so you will probably not want to provide one at all. Other deprecation levels are not valid. See the documentation for [[InterfaceActionsWML#.5Bdeprecated_message.5D|[deprecated_message]]] for the meaning of the various ''level'' values.&lt;br /&gt;
&lt;br /&gt;
== Built-in macros ==&lt;br /&gt;
&lt;br /&gt;
The following macros are automatically defined with empty contents (unless specified otherwise) by the game engine depending on the configuration or gameplay mode.&lt;br /&gt;
&lt;br /&gt;
* A campaign define symbol (see ''define'' in [[CampaignWML]]): defined when playing a single-player campaign.&lt;br /&gt;
* A campaign difficulty level, usually '''EASY''', '''NORMAL''' or '''HARD''' (see ''difficulties'' in [[CampaignWML]]): defined according to the chosen difficulty when starting a single-player campaign, also stored in saved games.&lt;br /&gt;
* '''MULTIPLAYER''': defined when in multiplayer mode.&lt;br /&gt;
* '''TUTORIAL''': defined when playing the tutorial campaign.&lt;br /&gt;
* '''EDITOR''': defined when running the built-in map editor.&lt;br /&gt;
* '''DEBUG_MODE''': defined when the game has been launched in debug mode (i.e. with '''-d''' or '''--debug''' in the command line).&lt;br /&gt;
* '''APPLE''': defined while processing the main game data when running on Mac OS X.&lt;br /&gt;
* '''WESNOTH_VERSION''': defined containing just the game version number when running the WML preprocessor.&lt;br /&gt;
* '''CURRENT_FILE''': Expands to the name of the current WML file.&lt;br /&gt;
* '''CURRENT_DIRECTORY''': Expands to the preprocessor path of the parent directory for the current WML file (e.g. for &amp;lt;code&amp;gt;&amp;amp;lt;user data dir&amp;amp;gt;/data/add-ons/My_Addon/_main.cfg&amp;lt;/code&amp;gt; this evaluates to &amp;lt;code&amp;gt;~add-ons/My_Addon&amp;lt;/code&amp;gt;). &lt;br /&gt;
* '''LEFT_BRACE''': {{DevFeature1.15|2}} Expands to &amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''RIGHT_BRACE''': {{DevFeature1.15|2}} Expands to &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A ''very large'' number of additional macros are provided as part of the default game core WML. For a full list of those, check the [https://www.wesnoth.org/macro-reference.html macro reference].&lt;br /&gt;
&lt;br /&gt;
== Command-line preprocessor ==&lt;br /&gt;
&lt;br /&gt;
'''Syntax: --preprocess ''&amp;amp;lt;source file/directory&amp;gt;'' ''&amp;lt;target directory&amp;gt;'' '''&lt;br /&gt;
&lt;br /&gt;
Or the short form:&lt;br /&gt;
&lt;br /&gt;
'''Syntax: -p ''&amp;amp;lt;source file/directory&amp;gt;'' ''&amp;lt;target directory&amp;gt;'' '''&lt;br /&gt;
&lt;br /&gt;
You can specify a list of predefined defines with:&lt;br /&gt;
&lt;br /&gt;
'''Syntax: --preprocess-defines=DEFINE1,DEFINE2,etc'''&lt;br /&gt;
&lt;br /&gt;
comma separated list of defines to be used by '--preprocess' command. If 'SKIP_CORE' is in the define list the data/core won't be preprocessed.&lt;br /&gt;
&lt;br /&gt;
The command will preprocess first the common config files in the main game ''data/'' directory, and afterwards the specified ones. You can specify a single file to be preprocessed (if you want to preprocess multiple separate files, you'll need to run a different command line for each one), or an entire directory, which will be preprocessed according to the rules used by the inclusion directive above.&lt;br /&gt;
&lt;br /&gt;
The resulted preprocessed files will be written in the target directory. There will be two types of files: .cfg files --- the normal ones, and .plain files containing line markers and textdomain changes.&lt;br /&gt;
&lt;br /&gt;
If by chance, the simple macro define doesn't suffice, you can use:&lt;br /&gt;
&lt;br /&gt;
'''Syntax: --preprocess-input-macros &amp;lt;file&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
To import an existing file that contains macros, and they will be available in the defines database before processing the specified files.&lt;br /&gt;
&lt;br /&gt;
There is also the possibility to export the preprocessed defines/macro list with:&lt;br /&gt;
&lt;br /&gt;
'''Syntax: --preprocess-output-macros [&amp;lt;target file&amp;gt;]'''&lt;br /&gt;
&lt;br /&gt;
This file could be fed to the 'input-macros' argument next time you run it. For example, a scenario  would be: parsing just the core first time, and for the intended target files, you would add SKIP_CORE but import the generated macros file - that will be faster than preprocessing the core again. If the target file is not specified, the output file will be _MACROS_.cfg in the target directory of the preprocess's command.&lt;br /&gt;
&lt;br /&gt;
If ''file/directory'' and ''target directory'' are not absolute paths, they will be considered relative to the game's executable path.&lt;br /&gt;
&lt;br /&gt;
Some examples:&lt;br /&gt;
&lt;br /&gt;
* Preprocess the entire tutorial dir, and write the results in the ~/result folder:&lt;br /&gt;
 -p ~/wesnoth/data/campaigns/tutorial ~/result&lt;br /&gt;
* Add the MULTIPLAYER define to the list and preprocess a scenario's config file:&lt;br /&gt;
 -p ~/.wesnoth/data/add-ons/My_Campaign/scenarios/01_First_Scenario.cfg ~/result --preprocess-defines=MULTIPLAYER&lt;br /&gt;
* Add the MY_CAMPAIGN and HARD defines before preprocessing a campaign's files:&lt;br /&gt;
 -p ~/.wesnoth/data/add-ons/My_Campaign ~/result --preprocess-defines=MY_CAMPAIGN,HARD&lt;br /&gt;
&lt;br /&gt;
If you want a more detailed (and potentially overwhelming) log, you can simply add the switches '''--log-debug=all''' or '''--log-info=all''' to the command line, so you can see how things are preprocessed in detail.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[SyntaxWML]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=PreprocessorRef&amp;diff=68454</id>
		<title>PreprocessorRef</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=PreprocessorRef&amp;diff=68454"/>
		<updated>2021-08-24T08:18:56Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update links to macro-reference.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth loads just one configuration file directly: '''data/_main.cfg'''. However the '''WML preprocessor''' allows to include more files. Whenever a WML file is read by Wesnoth, it is passed through the preprocessor.&lt;br /&gt;
&lt;br /&gt;
The preprocessor can interpret a simple language of string expansions known as ''macros''. A macro should always be defined '''before''' the place where it needs to be used.&lt;br /&gt;
&lt;br /&gt;
The preprocessor is applied recursively, so included files will be parsed for macros, and after macro expansion will be parsed for macros again, and so on. As a result, you should not write a recursive macro that references itself, because it will cause errors (but, alas, not necessarily error messages).&lt;br /&gt;
&lt;br /&gt;
== Preprocessor directives ==&lt;br /&gt;
&lt;br /&gt;
The following directives are used to create and use ''macros'', i.e. shortcuts which reduce repetition of information. See [https://www.wesnoth.org/macro-reference.html the macro reference] for the list of predefined core macros.&lt;br /&gt;
&lt;br /&gt;
The preprocessor has changed several times, so don't expect old Wesnoth versions to behave exactly the same as the current stable and development series.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' In multiplayer scenarios, these directives will appear to work only for the host and not for other clients. This is because the preprocessor is run only on the host, and the clients receive the resultant WML from the server. It's particularly important to keep this in mind before using preprocessor conditionals.&lt;br /&gt;
&lt;br /&gt;
=== #define ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax: #define ''symbol'' [''parameters''] ''&amp;lt;newline&amp;gt;'' ''substitution'' #enddef'''&lt;br /&gt;
&lt;br /&gt;
All subsequent occurences of '''{''symbol'' [''arguments'']}''' (see below) will be replaced by the contents of the ''substitution'' block, with all occurrences of any parameter {''parameter''} within ''substitution'' replaced by the corresponding value in ''arguments''. For example, the ENEMY_UNIT macro for the [[#Macro inclusions|macro inclusion]] example below could be defined as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#define ENEMY_UNIT TYPE X Y&lt;br /&gt;
## the ordering above is important, since the preprocessor does not distinguish&lt;br /&gt;
## data into different types; only the ordering is used to determine which&lt;br /&gt;
## arguments apply to which parameters.&lt;br /&gt;
[unit]&lt;br /&gt;
    type={TYPE} ## the unit will be of type TYPE, so different&lt;br /&gt;
                ## instantiations&lt;br /&gt;
                ## of this macro can create different units.&lt;br /&gt;
    x={X}&lt;br /&gt;
    y={Y}&lt;br /&gt;
    side=2 ## the unit will be an enemy, regardless of the parameter&lt;br /&gt;
           ## values. This reduces &amp;quot;repetition of information&amp;quot;,&lt;br /&gt;
           ## since it is no longer necessary to specify&lt;br /&gt;
           ## each created unit as an enemy.&lt;br /&gt;
[/unit]&lt;br /&gt;
#enddef&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(See [[SingleUnitWML]] for further information on creating units using WML.)&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The final line break before #enddef is included in the expansion. This means that if the symbol is used in the middle of a line, you should place the #enddef immediately after the value has ended, without a line break in between. &lt;br /&gt;
&lt;br /&gt;
'''Important note:''' Although macros may look like they're simplifying the code, they do not help with wml bloating. Macros are very good at ''disguising'' WML bloat, but they do nothing to ''alleviate'' it. So instead of using macros to generate redundant and repetitive instructions, you should be considering how to eliminate redundancy through programming techniques of abstraction. The most popular way to improve your code is using custom [[EventWML|events]] and [[InternalActionsWML#.5Bfire_event.5D|fire_event]] tags. See also: [[Wml_optimisation]].&lt;br /&gt;
&lt;br /&gt;
=== #arg ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|7}} &lt;br /&gt;
&lt;br /&gt;
'''Syntax: #arg ''symbol'' ''&amp;lt;newline&amp;gt;'' ''default value'' #endarg'''&lt;br /&gt;
&lt;br /&gt;
Defines an optional argument for a macro along with its default value. Optional arguments can be used to make a macro more flexible and to allow its user to specify certain parameters only when necessary.&lt;br /&gt;
&lt;br /&gt;
For example, one could define a shortcut macro for [message] with only one required argument (the text displayed), but several optional ones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#define MESSAGE TEXT&lt;br /&gt;
&lt;br /&gt;
#arg SPEAKER_ID&lt;br /&gt;
narrator&lt;br /&gt;
#endarg&lt;br /&gt;
&lt;br /&gt;
#arg CAPTION&lt;br /&gt;
#endarg&lt;br /&gt;
&lt;br /&gt;
#arg SOUND&lt;br /&gt;
#endarg&lt;br /&gt;
&lt;br /&gt;
#arg IMG&lt;br /&gt;
#endarg&lt;br /&gt;
&lt;br /&gt;
[message]&lt;br /&gt;
    speaker={SPEAKER_ID}&lt;br /&gt;
    message={TEXT}&lt;br /&gt;
    caption={CAPTION}&lt;br /&gt;
    sound={SOUND}&lt;br /&gt;
    image={IMG}&lt;br /&gt;
[/message]&lt;br /&gt;
#enddef&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The caller of the macro can then decide which, if any, of the default values to override:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
{MESSAGE _&amp;quot;Halt!&amp;quot; SPEAKER_ID=&amp;quot;Guard Captain&amp;quot;}&lt;br /&gt;
{MESSAGE _&amp;quot;Two days pass...&amp;quot; IMG=wesnoth-icon.png SOUND=ambient/morning.ogg}&lt;br /&gt;
{MESSAGE _&amp;quot;...&amp;quot;}&lt;br /&gt;
{MESSAGE _&amp;quot;Welcome!&amp;quot; CAPTION=_&amp;quot;Elóndra's shop of wonders&amp;quot; IMG=portraits/elves/shyde.png}&lt;br /&gt;
{MESSAGE _&amp;quot;*smash*&amp;quot; SPEAKER_ID=&amp;quot;Bridge Troll&amp;quot; SOUND=mace.ogg}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' As with #enddef, the final line break before #endarg is included in the default value. This means that if the symbol is used in the middle of a line, you should place the #endarg immediately after the value has ended, without a line break in between.&lt;br /&gt;
&lt;br /&gt;
=== #undef ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#undef ''symbol'' '''&lt;br /&gt;
&lt;br /&gt;
Removes the previous definition of the macro named ''symbol''.&lt;br /&gt;
&lt;br /&gt;
=== Inclusion directive {} ===&lt;br /&gt;
&lt;br /&gt;
This directive can be used to include macros, single files or sets of files from a target directory.&lt;br /&gt;
&lt;br /&gt;
==== File/directory inclusions ====&lt;br /&gt;
&lt;br /&gt;
'''Syntax: {''path''}'''&lt;br /&gt;
&lt;br /&gt;
Includes the file with the specified ''path'', which will in turn run the preprocessor on it and perform any required substitutions or inclusions within it. The ''path'' may not contain ''..'' or the inclusion will be skipped.&lt;br /&gt;
&lt;br /&gt;
The exact location in which the ''path'' will be resolved will depend on its prefix:&lt;br /&gt;
&lt;br /&gt;
* '''{''path''}''': If ''path'' isn't a known macro (see below), the game will assume it's a relative path to a file in the main game '''data/''' directory and include it.&lt;br /&gt;
* '''{~''path''}''': As above, but instead of the game data directory, the path is resolved relative to the user '''data/''' directory, where user made add-ons can normally be found.&lt;br /&gt;
* '''{./''path''}''': The path is resolved relative to the location of the current file containing this inclusion.&lt;br /&gt;
&lt;br /&gt;
Information for locating the user data and game data directories can be found in [[EditingWesnoth]].&lt;br /&gt;
&lt;br /&gt;
Forward slashes ('''/''') should '''always''' be used as the path delimiter, even if your platform uses a different symbol such as colons (''':''') or backslashes ('''\''')! It is also very important to respect the '''actual letter case''' used to name files and directories for compatibility with case-sensitive filesystems on Unix-based operating systems.&lt;br /&gt;
&lt;br /&gt;
When ''path'' points to a directory instead of a file, the preprocessor will include all files found within with the '''.cfg''' extension, in alphabetical order; files without this extension (such as '''.map''' or '''.png''' files) are ignored.&lt;br /&gt;
&lt;br /&gt;
Some directories are handled in a special fashion according to their contents:&lt;br /&gt;
&lt;br /&gt;
* If there's a file named '''_main.cfg''' in the target directory, only that file will be included and preprocessed. It may include other files from its own directory or subdirectories within it, of course. This is used for managing WML directories as self-contained packages, like user made add-ons.&lt;br /&gt;
* If there are files named '''_main.cfg''' in subdirectories of the target and there isn't one in the target itself, they will be all preprocessed. Given the following layout:&lt;br /&gt;
 dir/&lt;br /&gt;
 dir/a/_main.cfg&lt;br /&gt;
 dir/a/other.cfg&lt;br /&gt;
 dir/b/_main.cfg&lt;br /&gt;
 dir/b/other.cfg&lt;br /&gt;
 dir/other.cfg&lt;br /&gt;
Using '''{dir}''' will cause dir/a/_main.cfg, dir/b/_main.cfg and dir/other.cfg to be included.&lt;br /&gt;
* If there's a file named '''_final.cfg''' but no '''_main.cfg''', the file is guaranteed to be included and processed ''after'' all the other files in the directory.&lt;br /&gt;
* If there's a file named '''_initial.cfg''' but no '''_main.cfg''', the file is guaranteed to be included and processed ''before'' all the other files in the directory.&lt;br /&gt;
&lt;br /&gt;
==== Macro inclusions ====&lt;br /&gt;
&lt;br /&gt;
'''Syntax: {''symbol'' [''arguments''] [''optional arguments'']}'''&lt;br /&gt;
&lt;br /&gt;
If the macro named ''symbol'' is defined, the preprocessor will replace this instruction by the expression ''symbol'' was previously defined as, using ''arguments'' as parameters. The number of normal arguments must be exactly the same as in the original definition or an error will occur. Optional arguments can only be placed '''after''' all normal arguments, however they can be specified in any order desired.&lt;br /&gt;
&lt;br /&gt;
You can create multiple word arguments by using parentheses to delimit the contents. For example, in '''{ENEMY_UNIT Wolf Rider 18 24}''' the four words will be interpreted as separate arguments and cause the preprocessor to fail since the macro was defined above with only three; instead, you should use '''{ENEMY_UNIT (Wolf Rider) 18 24}'''.&lt;br /&gt;
&lt;br /&gt;
Optional arguments can also be delimited by placing parentheses, however they must be placed around both the argument name '''and''' content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
{MESSAGE _&amp;quot;I'll smash you!&amp;quot; (SPEAKER_ID=Bridge Troll) } # Correct&lt;br /&gt;
{MESSAGE _&amp;quot;I'll smash you!&amp;quot; SPEAKER_ID=(Bridge Troll) } # Wrong&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This way even complex arguments can be passed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
{MODIFY_UNIT (&lt;br /&gt;
    [filter_adjacent]&lt;br /&gt;
        canrecruit=yes&lt;br /&gt;
    [/filter_adjacent]&lt;br /&gt;
    ) side 2}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using the name of an existing macro as the name of a macro argument is possible, but the argument will always take precedence over the original macro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#define VARIABLE&lt;br /&gt;
#enddef&lt;br /&gt;
#define MACRO VARIABLE&lt;br /&gt;
    {VARIABLE} # is calling for the argument, not for the macro above&lt;br /&gt;
#enddef&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== #ifdef and #ifndef ===&lt;br /&gt;
&lt;br /&gt;
Unlike the other preprocessor directives, '''#ifdef''' and '''#ifndef''' are not mere conveniences. They are often necessary to distinguish between different gameplay modes or difficulties (see [[#Built-in macros|Built-in macros]] below).&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifdef ''symbol'' ''substitution-if-defined'' [#else ''substitution-if-not-defined'' ] #endif'''&lt;br /&gt;
&lt;br /&gt;
If ''symbol'' has been defined with '''#define''' or as a built-in macro, the whole block will be replaced by ''substitution-if-defined''.  If not, it will be replaced by ''substitution-if-not-defined'' if it is available.&lt;br /&gt;
&lt;br /&gt;
'''#ifndef''' is the exact opposite of '''#ifdef''', reversing the logic:&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifndef ''symbol'' ''substitution-if-not-defined''  [#else ''substitution-if-defined''] #endif'''&lt;br /&gt;
&lt;br /&gt;
=== #ifhave and #ifnhave ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifhave ''path'' ''substitution-if-path-exists'' [#else ''substitution-if-path-does-not-exist''] #endif'''&lt;br /&gt;
&lt;br /&gt;
Checks for the existence of a file. Uses the same relative paths as include directives (see below).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#ifhave ~add-ons/My_Addon/_main.cfg&lt;br /&gt;
    {MY_ADDON_MACROS}&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''#ifnhave'''  does the opposite of '''#ifhave''':&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifnhave ''path'' ''substitution-if-path-does-not-exist'' [#else ''substitution-if-path-exists''] #endif'''&lt;br /&gt;
&lt;br /&gt;
=== #ifver and #ifnver ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifver ''symbol'' ''operator'' ''version-number'' ''&amp;lt;newline&amp;gt;'' ''substitution-if-condition-met'' [#else ''substitution-if-condition-not-met''] #endif'''&lt;br /&gt;
&lt;br /&gt;
Compares a version number defined in a macro against an argument for conditional block inclusions, like ''#ifdef'' and ''#ifhave''. ''operator'' is one of ''=='' (equal), ''!='' (not equal), ''&amp;lt;'' (less), ''&amp;lt;='' (less or equal), ''&amp;gt;'' (greater), ''&amp;gt;='' (greater or equal). The specified ''symbol'' should have been previously defined as plain text without more macro inclusions within it, and it must not require any arguments.&lt;br /&gt;
&lt;br /&gt;
Versions with text suffixes are sorted in binary order and come after all versions with the same number. The most common suffixes begin with &amp;quot;+&amp;quot;, but as this represents multiple possible versions, comparing versions against it is not recommended.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#ifver WESNOTH_VERSION &amp;gt;= 1.9.7+&lt;br /&gt;
    [message]&lt;br /&gt;
        speaker=narrator&lt;br /&gt;
        message= _ &amp;quot;I’m on Wesnoth 1.9.7+, 1.9.8 or later!&amp;quot;&lt;br /&gt;
    [/message]&lt;br /&gt;
#else&lt;br /&gt;
#ifver WESNOTH_VERSION == 1.9.7&lt;br /&gt;
    [message]&lt;br /&gt;
        speaker=narrator&lt;br /&gt;
        message= _ &amp;quot;I’m on Wesnoth 1.9.7, and I’ll include some workaround code for bug #9001!&amp;quot;&lt;br /&gt;
    [/message]&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''#ifnver'''  does the opposite of '''#ifver''':&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#ifnver ''symbol'' ''operator'' ''version-number'' ''&amp;lt;newline&amp;gt;'' ''substitution-if-condition-not-met'' [#else ''substitution-if-condition-met''] #endif'''&lt;br /&gt;
&lt;br /&gt;
=== #error ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#error [''message'']'''&lt;br /&gt;
&lt;br /&gt;
Causes the WML preprocessor to fail unconditionally upon encountering the line. For add-ons, this will cause the game to display an error and return to the titlescreen if the add-on is required for the user's action (such as playing a campaign or loading a saved game). For core WML, this will cause the game to quit entirely.&lt;br /&gt;
&lt;br /&gt;
Please note that in spite of the example below, it is '''not''' advisable to use this mechanism in published add-ons for version or feature-checking, since the message is not displayed in a form that permits translation and the additional trace information may confuse players. This directive is only intended as a debugging aid for content creators.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#ifver WESNOTH_VERSION &amp;lt; 1.11.10&lt;br /&gt;
#error This add-on does not support Wesnoth 1.11.10!&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== #warning ===&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#warning [''message'']'''&lt;br /&gt;
&lt;br /&gt;
Causes the WML preprocessor to emit a warning upon encountering the line. The message will '''only''' be relayed to stderr, not to the player in the game UI. This directive is only intended as a debugging aid for content creators.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wml&amp;quot;&amp;gt;&lt;br /&gt;
#ifver WESNOTH_VERSION &amp;lt; 1.11.10&lt;br /&gt;
#warning On Wesnoth 1.11.9 or earlier, bug workarounds enabled!&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== #deprecated ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|11}}&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#deprecated 1 ''message'''''&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#deprecated 2 ''version'' ''message'''''&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#deprecated 3 ''version'' ''message'''''&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' '''#deprecated 4 ''message'''''&lt;br /&gt;
&lt;br /&gt;
The effect of this directive depends on whether it appears within a macro definition.&lt;br /&gt;
&lt;br /&gt;
* If it appears at file level, outside any macro definition, then it immediately outputs a warning saying that the file is deprecated, with the provided message. Multiple '''#deprecated''' directives at toplevel in a single file will result in separate messages.&lt;br /&gt;
* If it appears inside a macro definition ('''#define ... #enddef'''), then it doesn't output anything. Instead, it marks the macro as deprecated. When that macro is later used, only then will the preprocessor output a warning saying that the macro is deprecated, with the provided message. Multiple '''#deprecated''' directives within a single macro will be merged into one message.&lt;br /&gt;
&lt;br /&gt;
Note that deprecation messages will only appear if they have been set to. {{DevFeature1.13|12}} This can be done by enabling debug mode, or by going to Advanced Preferences and setting the log-level for the deprecation logdomain. (This can also be done on the command-line.)&lt;br /&gt;
&lt;br /&gt;
If you provide a deprecation level of 2 or 3, it is required to indicate the earliest version in which the feature could be removed. However, if you provide a deprecation level of 1 or 4, any provided ''version'' will instead be parsed as part of the message, so you will probably not want to provide one at all. Other deprecation levels are not valid. See the documentation for [[InterfaceActionsWML#.5Bdeprecated_message.5D|[deprecated_message]]] for the meaning of the various ''level'' values.&lt;br /&gt;
&lt;br /&gt;
== Built-in macros ==&lt;br /&gt;
&lt;br /&gt;
The following macros are automatically defined with empty contents (unless specified otherwise) by the game engine depending on the configuration or gameplay mode.&lt;br /&gt;
&lt;br /&gt;
* A campaign define symbol (see ''define'' in [[CampaignWML]]): defined when playing a single-player campaign.&lt;br /&gt;
* A campaign difficulty level, usually '''EASY''', '''NORMAL''' or '''HARD''' (see ''difficulties'' in [[CampaignWML]]): defined according to the chosen difficulty when starting a single-player campaign, also stored in saved games.&lt;br /&gt;
* '''MULTIPLAYER''': defined when in multiplayer mode.&lt;br /&gt;
* '''TUTORIAL''': defined when playing the tutorial campaign.&lt;br /&gt;
* '''EDITOR''': defined when running the built-in map editor.&lt;br /&gt;
* '''DEBUG_MODE''': defined when the game has been launched in debug mode (i.e. with '''-d''' or '''--debug''' in the command line).&lt;br /&gt;
* '''APPLE''': defined while processing the main game data when running on Mac OS X.&lt;br /&gt;
* '''WESNOTH_VERSION''': defined containing just the game version number when running the WML preprocessor.&lt;br /&gt;
* '''CURRENT_FILE''': Expands to the name of the current WML file.&lt;br /&gt;
* '''CURRENT_DIRECTORY''': Expands to the preprocessor path of the parent directory for the current WML file (e.g. for &amp;lt;code&amp;gt;&amp;amp;lt;user data dir&amp;amp;gt;/data/add-ons/My_Addon/_main.cfg&amp;lt;/code&amp;gt; this evaluates to &amp;lt;code&amp;gt;~add-ons/My_Addon&amp;lt;/code&amp;gt;). &lt;br /&gt;
* '''LEFT_BRACE''': {{DevFeature1.15|2}} Expands to &amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''RIGHT_BRACE''': {{DevFeature1.15|2}} Expands to &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that the macros above are only those generated by wesnoth engine itself. For a list of macros defined outside engine, see here: https://www.wesnoth.org/macro-reference.html&lt;br /&gt;
&lt;br /&gt;
== Command-line preprocessor ==&lt;br /&gt;
&lt;br /&gt;
'''Syntax: --preprocess ''&amp;amp;lt;source file/directory&amp;gt;'' ''&amp;lt;target directory&amp;gt;'' '''&lt;br /&gt;
&lt;br /&gt;
Or the short form:&lt;br /&gt;
&lt;br /&gt;
'''Syntax: -p ''&amp;amp;lt;source file/directory&amp;gt;'' ''&amp;lt;target directory&amp;gt;'' '''&lt;br /&gt;
&lt;br /&gt;
You can specify a list of predefined defines with:&lt;br /&gt;
&lt;br /&gt;
'''Syntax: --preprocess-defines=DEFINE1,DEFINE2,etc'''&lt;br /&gt;
&lt;br /&gt;
comma separated list of defines to be used by '--preprocess' command. If 'SKIP_CORE' is in the define list the data/core won't be preprocessed.&lt;br /&gt;
&lt;br /&gt;
The command will preprocess first the common config files in the main game ''data/'' directory, and afterwards the specified ones. You can specify a single file to be preprocessed (if you want to preprocess multiple separate files, you'll need to run a different command line for each one), or an entire directory, which will be preprocessed according to the rules used by the inclusion directive above.&lt;br /&gt;
&lt;br /&gt;
The resulted preprocessed files will be written in the target directory. There will be two types of files: .cfg files --- the normal ones, and .plain files containing line markers and textdomain changes.&lt;br /&gt;
&lt;br /&gt;
If by chance, the simple macro define doesn't suffice, you can use:&lt;br /&gt;
&lt;br /&gt;
'''Syntax: --preprocess-input-macros &amp;lt;file&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
To import an existing file that contains macros, and they will be available in the defines database before processing the specified files.&lt;br /&gt;
&lt;br /&gt;
There is also the possibility to export the preprocessed defines/macro list with:&lt;br /&gt;
&lt;br /&gt;
'''Syntax: --preprocess-output-macros [&amp;lt;target file&amp;gt;]'''&lt;br /&gt;
&lt;br /&gt;
This file could be fed to the 'input-macros' argument next time you run it. For example, a scenario  would be: parsing just the core first time, and for the intended target files, you would add SKIP_CORE but import the generated macros file - that will be faster than preprocessing the core again. If the target file is not specified, the output file will be _MACROS_.cfg in the target directory of the preprocess's command.&lt;br /&gt;
&lt;br /&gt;
If ''file/directory'' and ''target directory'' are not absolute paths, they will be considered relative to the game's executable path.&lt;br /&gt;
&lt;br /&gt;
Some examples:&lt;br /&gt;
&lt;br /&gt;
* Preprocess the entire tutorial dir, and write the results in the ~/result folder:&lt;br /&gt;
 -p ~/wesnoth/data/campaigns/tutorial ~/result&lt;br /&gt;
* Add the MULTIPLAYER define to the list and preprocess a scenario's config file:&lt;br /&gt;
 -p ~/.wesnoth/data/add-ons/My_Campaign/scenarios/01_First_Scenario.cfg ~/result --preprocess-defines=MULTIPLAYER&lt;br /&gt;
* Add the MY_CAMPAIGN and HARD defines before preprocessing a campaign's files:&lt;br /&gt;
 -p ~/.wesnoth/data/add-ons/My_Campaign ~/result --preprocess-defines=MY_CAMPAIGN,HARD&lt;br /&gt;
&lt;br /&gt;
If you want a more detailed (and potentially overwhelming) log, you can simply add the switches '''--log-debug=all''' or '''--log-info=all''' to the command line, so you can see how things are preprocessed in detail.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[SyntaxWML]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=InternalActionsWML&amp;diff=68453</id>
		<title>InternalActionsWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=InternalActionsWML&amp;diff=68453"/>
		<updated>2021-08-24T08:18:25Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update links to macro-reference.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
&lt;br /&gt;
Part of [[ActionWML]], Internal actions are actions that WML uses internally that do not directly affect game play (or, at least, are not readily apparent to the player). For example, storing a variable is an internal action.&lt;br /&gt;
&lt;br /&gt;
== Variable Actions ==&lt;br /&gt;
&lt;br /&gt;
These actions are focused, in one way or another, on [[VariablesWML|variables]]. Creating them, modifying them, capturing game data to them, you name it, these actions are all about the variables.&lt;br /&gt;
&lt;br /&gt;
=== [set_variable] ===&lt;br /&gt;
&lt;br /&gt;
The '''[set_variable]''' tag is used to create and manipulate WML variables. The [https://www.wesnoth.org/macro-reference.html#VARIABLE VARIABLE] macro is a quick syntactic shortcut for simple variable creation and the [https://www.wesnoth.org/macro-reference.html#VARIABLE_OP VARIABLE_OP] macro is a quick syntactic shortcut for performing simple mathematical operations on variables.&lt;br /&gt;
&lt;br /&gt;
* '''name''': the name of the variable to manipulate&lt;br /&gt;
&lt;br /&gt;
* '''value''': set the variable to the given value (can be numeric or string).Use literal for no substitution. (see [[VariablesWML]])&lt;br /&gt;
&lt;br /&gt;
* '''literal''': set the variable to the given value (can be numeric or string). This does not interpret any dollar signs.&lt;br /&gt;
&lt;br /&gt;
* '''to_variable''': set the variable to the value of the given variable, e.g. 'to_variable=temp' would be equivalent to 'value=$temp'.&lt;br /&gt;
&lt;br /&gt;
* '''add''': add the given amount to the variable.&lt;br /&gt;
&lt;br /&gt;
* '''sub''': subtract the given amount from the variable.&lt;br /&gt;
&lt;br /&gt;
* '''multiply''': multiply the variable by the given number. The result is a float.&amp;lt;br /&amp;gt;To negate a number, multiply by -1. If you negate 0, the result is a floating-point negative zero -0. To display -0 as 0, use a second tag with add=0; it will flip -0 to 0 but not affect other numbers.&lt;br /&gt;
&lt;br /&gt;
* '''divide''': divide the variable by the given number. The result is a float. Wesnoth 1.9 and later no longer uses integer division. Use a second tag with round=floor if you relied on this.&lt;br /&gt;
&lt;br /&gt;
* '''modulo''': returns the remainder of a division.&lt;br /&gt;
&lt;br /&gt;
* '''abs''': Returns the absolute value of the variable.&lt;br /&gt;
&lt;br /&gt;
* '''root''': Use '''root=square''' to calculate the square root. {{DevFeature1.15|0}} Also supports '''root=cube''' and arbitrary integer roots.&lt;br /&gt;
&lt;br /&gt;
* '''power''': Raise the variable to some power.&lt;br /&gt;
&lt;br /&gt;
* '''rand''': the variable will be randomly set.&amp;lt;br&amp;gt;You may provide a comma separated list of possibilities, e.g. 'rand=Bob,Bill,Bella'.&amp;lt;br&amp;gt;You may provide a range of numbers (integers), e.g. 'rand=3..5'.&amp;lt;br&amp;gt;You may combine these, e.g. 'rand=100,1..9', in which case there would be 1/10th chance of getting 100, just like for each of 1 to 9. If a number or item is repeated, it is sampled more frequently as appropriate. See [[MultiplayerContent]] for more info on the MP case.&amp;lt;br&amp;gt;Using rand= will automatically result in the current action being non undoable. Ignoring possible [allow_undo].&lt;br /&gt;
&lt;br /&gt;
* '''time=stamp''': Retrieves a timestamp in milliseconds since wesnoth was started, can be used as timing aid. Don't try to use this as random value in MP since it will cause an OOS.&lt;br /&gt;
&lt;br /&gt;
* '''string_length''': Retrieves the length in characters of the string passed as this attribute's value; such string is parsed and variable substitution applied automatically (see [[VariablesWML]] for details).&lt;br /&gt;
&lt;br /&gt;
* '''[join]''' joins an array of strings to create a textual list&lt;br /&gt;
** '''variable''': name of the array&lt;br /&gt;
** '''key''': the key of each array element(array[$i].foo) in which the strings are stored&lt;br /&gt;
** '''separator''': separator to connect the elements&lt;br /&gt;
** '''remove_empty''': whether to ignore empty elements&lt;br /&gt;
&lt;br /&gt;
* '''ipart''': Assigns the integer part (the part to the left of the decimal point) of the referenced variable.&lt;br /&gt;
&lt;br /&gt;
* '''fpart''': Assigns the decimal part (the part to the right of the decimal point) of the referenced variable.&lt;br /&gt;
&lt;br /&gt;
* '''round''': Rounds the variable to the specified number of digits of precision. Negative precision works as expected (rounding 19517 to -2 = 19500). Special values:&lt;br /&gt;
**'''round=ceil''': Rounds upward to the nearest integer.&lt;br /&gt;
**'''round=floor''': Rounds down to the nearest integer.&lt;br /&gt;
**'''round=trunc''': {{DevFeature1.15|0}} Rounds towards zero; this is the same operation as '''ipart''', but operating on the value already contained in the variable rather than the value assigned to the key.&lt;br /&gt;
&lt;br /&gt;
* '''min''', '''max''': {{DevFeature1.15|9}} Specify a comma-separated list of numbers; either the smallest or largest number in the list will be assigned to the variable.&lt;br /&gt;
&lt;br /&gt;
* '''reverse=yes''': {{DevFeature1.15|9}} Reverses the string value of the variable. For example, &amp;quot;delfador&amp;quot; becomes &amp;quot;rodafled&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* '''formula''': Calculate the new value of the variable from a [[Wesnoth_Formula_Language|WFL]] formula operating on the old value. This is similar to using the '''$(...)''' syntax but avoids the possibility of WFL syntax errors if a referenced variable is empty.&lt;br /&gt;
&lt;br /&gt;
=== [set_variables] ===&lt;br /&gt;
&lt;br /&gt;
Manipulates a WML array or container&lt;br /&gt;
&lt;br /&gt;
* '''name''': the name of the array or container to manipulate&lt;br /&gt;
&lt;br /&gt;
* '''mode''': one of the following values:&lt;br /&gt;
** ''replace'': will clean the array '''name''' and replace it with given data&lt;br /&gt;
** ''append'': will append given data to the current array&lt;br /&gt;
** ''merge'': will merge in the given data into '''name'''. Attributes in '''[value]''' will overwrite any existing already in '''name'''. Tags in '''[value]''' modify the corresponding tag of the original value of '''name''', so for example the first '''[attack]''' tag in '''[value]''' would modify the first '''[attack]''' tag of '''name''' rather than appending a new '''[attack]''' tag. A few special syntaxes are supported:&lt;br /&gt;
*** ''__remove=yes'': When used in a subtag, causes the corresponding subtag in '''name''' to be deleted rather than merged. Deletion happens after any other subtags have been merged.&lt;br /&gt;
*** ''add_to_xxx'': Adds its integer value to the integer value of '''xxx''' in '''name''', and sets '''xxx''' in '''name''' to the result. {{DevFeature1.13|8}} Now adds as real numbers rather than integers.&lt;br /&gt;
*** ''concat_to_xxx'': {{DevFeature1.13|8}} Similar to '''add_to_xxx''', but does string concatenation instead of numerical addition.&lt;br /&gt;
** ''insert'': will insert the given data at the index specified in the '''name''' attribute, such as name=my_array[1]. The default index is zero, which will insert to the front of the array. '''Note:''' if an invalid index is used, empty containers will be created before the insertion is performed. In other words, do not attempt to insert at an index greater than (or equal to) the array's current length. This limitation may be removed in future versions.&lt;br /&gt;
&lt;br /&gt;
* '''to_variable''': data will be set to the given array&lt;br /&gt;
&lt;br /&gt;
* '''[value]''': the WML inside the [value] tags will be stored in data, variables will be interpolated directly, use $| in order to escape the $ sign, you can store arrays of WML by supplying multiple [value] tags. ([[#Using_.5Bset_variables.5D_to_Create_Arrays_of_WML|See Example]])&lt;br /&gt;
&lt;br /&gt;
* '''[literal]''': same as '''[value]''', but variables will not be substituted, '''[literal]''' and '''[value]''' can not be used in the same [set_variables] tag, i.e. you can not create arrays by piling a mix of '''[value]''' and '''[literal]''' tags&lt;br /&gt;
&lt;br /&gt;
*'''[split]''' splits a textual list into an array which will then be set to data&lt;br /&gt;
** '''list''': textual list to split&lt;br /&gt;
** '''key''': the key of each array element(array[$i].foo) in which the strings are stored&lt;br /&gt;
** '''separator''': separator to separate the elements&lt;br /&gt;
** '''remove_empty''': whether to ignore empty elements&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|4}} You can now mix '''[value]''', '''[literal]''', and '''[split]''' in the same '''[set_variables]''' tag. They will be processed in order of appearance. Multiple instances of [split] are also supported now.&lt;br /&gt;
&lt;br /&gt;
=== Capturing Game Data ===&lt;br /&gt;
&lt;br /&gt;
These actions capture different bits of game data and store them to variables so they can be examined and/or manipulated.&lt;br /&gt;
&lt;br /&gt;
==== [store_gold] ====&lt;br /&gt;
&lt;br /&gt;
Stores a side's gold into a variable.&lt;br /&gt;
&lt;br /&gt;
* '''[[StandardSideFilter]]''': The first matching side's gold will be stored in the variable &amp;quot;variable&amp;quot;.&lt;br /&gt;
* '''variable''': (default='gold') the name of the variable to store the gold in&lt;br /&gt;
&lt;br /&gt;
==== [store_locations] ====&lt;br /&gt;
&lt;br /&gt;
Stores a series of locations that pass certain criteria into an array. Each member of the array has members 'x' and 'y' (the position) and 'terrain' (the terrain type) and 'owner_side' (villages only). The array will include any unreachable border hexes, if applicable.&lt;br /&gt;
&lt;br /&gt;
* [[StandardLocationFilter]]: a location or location range which specifies the locations to store. By default, all locations on the map are stored.&lt;br /&gt;
&lt;br /&gt;
* '''variable''': the name of the variable (array) into which to store the locations.&lt;br /&gt;
&lt;br /&gt;
* '''mode''': {{DevFeature1.13|0}} defaults to ''always_clear'', which clears the variable, whether or not a match is found. If mode is set to ''replace'', the variable will not be cleared, and locations which match the filter will overwrite existing elements at the start of the array, leaving any additional elements intact if the original array contained more elements than there are locations matching the filter. If mode is set to ''append'', the variable will not be cleared, and locations which match the filter will be added to the array after the existing elements.&lt;br /&gt;
&lt;br /&gt;
==== [store_reachable_locations] ====&lt;br /&gt;
&lt;br /&gt;
Stores locations reachable by the given units. Can store either the movement, attack or vision ranges.&lt;br /&gt;
&lt;br /&gt;
* '''[filter]''': a [[StandardUnitFilter]]. The locations reachable by any of the matching units will be stored.&lt;br /&gt;
* '''[filter_location]''': (optional) a [[StandardLocationFilter]]. Only locations which also match this filter will be stored.&lt;br /&gt;
* '''range''': possible values ''movement'' (default), ''attack'', ''vision''. If ''movement'', stores the locations within the movement range of the unit, taking Zone of Control into account. If ''attack'', stores the attack range (movement range + 1 hex). See note below for ''vision''.&lt;br /&gt;
* '''moves''':  possible values ''current'' (default), ''max''. For ''movement'' and ''attack'', specifies whether to use the current or maximum movement points when calculating the range. Ignored for ''vision''.&lt;br /&gt;
* '''viewing_side''': If left unset then fog and shroud are ignored, hidden ambushers are not ignored, and the real reach of the units is stored. If set to a non-zero number, then the area stored for each unit matching the SUF is based on the information visible to that unit's side; it doesn't matter which non-zero number is given. Ignored completely for ''vision''.&lt;br /&gt;
* '''variable''': the name of the variable (array) into which to store the locations.&lt;br /&gt;
&lt;br /&gt;
In 1.14 and before, the ''vision'' range is calculated as max movement range ignoring ZoC + 1 hex.&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.15|12}} ''vision'' uses the same calculations as the fog and shroud, and handles:&lt;br /&gt;
* units with vision costs different to movement costs&lt;br /&gt;
* units whose vision points aren't the same as their max movement points&lt;br /&gt;
* jamming by enemy units&lt;br /&gt;
&lt;br /&gt;
==== [store_map_dimensions] ====&lt;br /&gt;
&lt;br /&gt;
Stores the map dimensions in a variable.&lt;br /&gt;
&lt;br /&gt;
* '''variable''': the name of the variable where the values will be saved into. If it is skipped, a variable 'map_size' is used, and its contents overridden, if they existed already. The result is a container variable, with members ''width'' and ''height''.&lt;br /&gt;
&lt;br /&gt;
==== [store_side] ====&lt;br /&gt;
&lt;br /&gt;
Stores information about a certain side in a variable.&lt;br /&gt;
&lt;br /&gt;
'''Keys:'''&lt;br /&gt;
* '''[[StandardSideFilter]]''': All matching sides are stored. (An array is created if several sides match - access it with side[2].team_name and so on.)&lt;br /&gt;
* '''variable''': the name of the variable to store the information in (default: &amp;quot;side&amp;quot;)&lt;br /&gt;
* '''mode''':{{DevFeature1.13|0}} defaults to ''always_clear'', which clears the variable, whether or not a match is found. If mode is set to ''replace'', the variable will not be cleared, and sides which match the filter will overwrite existing elements at the start of the array, leaving any additional elements intact if the original array contained more elements than there are sides matching the filter. If mode is set to ''append'', the variable will not be cleared, and sides which match the filter will be added to the array after the existing elements.&lt;br /&gt;
'''Result'''&lt;br /&gt;
&lt;br /&gt;
Variable will contain following members:&lt;br /&gt;
* '''color''': Team color used for ellipses, sprites, and flags. Will be one of the id's found in data/core/team-colors.cfg or a custom color defined by [[GameConfigWML#Color_Palettes|[color_range]]].&lt;br /&gt;
* '''controller''': Indicates type of player that control this side. ''Note: In networked multiplayer, the controller attribute may not be the same on all clients. Be very careful or you have OOS errors.''&lt;br /&gt;
** '''human''': Human player&lt;br /&gt;
** '''ai''': If players assigns &amp;quot;Computer Player&amp;quot; to &amp;quot;Player/Type&amp;quot; in game lobby&lt;br /&gt;
** '''null''': If players assigns &amp;quot;Empty&amp;quot; to &amp;quot;Player/Type&amp;quot; in game lobby&lt;br /&gt;
* '''fog''': Indicates whether this side is affected by fog of war.&lt;br /&gt;
* '''gold''': The amount of gold the side has.&lt;br /&gt;
* '''hidden''': (boolean) If 'yes', side is not shown in status table.&lt;br /&gt;
* '''income''': Income for this side (base income + all village income. AKA gross income. Note that this is different from the [side] income key).&lt;br /&gt;
* '''name''': Name of player.&lt;br /&gt;
* '''recruit''': A comma-separated list of unit types that can be recruited by this side.&lt;br /&gt;
* '''shroud''': Whether this side is affected by shroud.&lt;br /&gt;
* '''side''': The $side_number of the side belonging to this container&lt;br /&gt;
* '''team_name''': String representing the team's description.&lt;br /&gt;
* '''user_team_name''': Translated string representing the team's description.&lt;br /&gt;
* '''village_gold''': The amount of gold given to this side per village it controls per turn.&lt;br /&gt;
* '''scroll_to_leader''': (boolean) Whether the game view scrolls to the side leader at the start of their turn.&lt;br /&gt;
* '''flag''': Flag animation for villages owned by this side (see [[SideWML|[side]]]). Unless previously specified in [side] or changed with WML (see [[DirectActionsWML#.5Bmodify_side.5D|[modify_side]]]), this value may be empty for the default flag animation.&lt;br /&gt;
* '''flag_icon''': Flag icon for the status bar for this side (see [[SideWML|[side]]]). Unless previously specified in [side] or changed with WML (see [[DirectActionsWML#.5Bmodify_side.5D|[modify_side]]]), this value may be empty for the default flag icon.&lt;br /&gt;
* '''village_support''': The number of unit levels this side is able to support (does not pay upkeep on) per village it controls.&lt;br /&gt;
* '''defeat_condition''': {{DevFeature1.13|7}} When the side will be considered defeated. See description at [[SideWML]], [[ScenarioWML#Scenario_End_Conditions]]&lt;br /&gt;
* '''faction''': {{DevFeature1.13|7}} id of the selected faction, string (multiplayer-only)&lt;br /&gt;
* '''faction_name''': {{DevFeature1.13|7}} Name of the selected faction, string (multiplayer-only)&lt;br /&gt;
* '''num_units''' {{DevFeature1.13|7}}: The number of units the side currently has on the map.&lt;br /&gt;
* '''num_villages''' {{DevFeature1.13|7}}: The number of villages the side currently controls.&lt;br /&gt;
* '''total_upkeep''' {{DevFeature1.13|7}}: The number of unit levels the side is currently supporting.&lt;br /&gt;
* '''expenses''' {{DevFeature1.13|7}}: The amount of gold the side is currently spending to support units.&lt;br /&gt;
* '''net_income''' {{DevFeature1.13|7}}: The income the side gains per turn after expenses.&lt;br /&gt;
* '''base_income''' {{DevFeature1.13|8}}: The income the side gains per turn (same as [side] income key)&lt;br /&gt;
&lt;br /&gt;
* {{DevFeature1.13|7}} All other keys and tags of the side that are contained in [[LuaWML:Sides#wesnoth.sides|wesnoth.sides]] .__cfg&lt;br /&gt;
&lt;br /&gt;
==== [store_starting_location] ====&lt;br /&gt;
&lt;br /&gt;
Stores the starting location of a side's leader in a variable. The variable is a composite type which will have members 'x', 'y', 'terrain' and 'owner_side' (villages only)&lt;br /&gt;
&lt;br /&gt;
* [[StandardSideFilter]]: The starting locations of all matching sides will be stored. If multiple sides are matched, a WML array will be created.&lt;br /&gt;
* '''variable''': (default='location'): the name of the variable to store the location in&lt;br /&gt;
* '''mode''':{{DevFeature1.13|0}} defaults to ''always_clear'', which clears the variable, whether or not a match is found. If mode is set to ''replace'', the variable will not be cleared, and the starting locations of the sides which match the filter will overwrite existing elements at the start of the array, leaving any additional elements intact if the original array contained more elements than there are locations matching the filter. If mode is set to ''append'', the variable will not be cleared, and the starting locations of the matching sides will be added to the array after the existing elements.&lt;br /&gt;
&lt;br /&gt;
==== [store_time_of_day] ====&lt;br /&gt;
&lt;br /&gt;
Stores time of day information from the current scenario into a WML variable container.&lt;br /&gt;
&lt;br /&gt;
* '''x, y''': Location to store the time for. [[DirectActionsWML#.5Btime_area.5D|Time areas]] matter; illumination does not. If this is omitted, the global (location-independent) time is stored.&lt;br /&gt;
&lt;br /&gt;
* '''variable''': (default='time_of_day') name of the container on which to store the information. The container will be filled with the same attributes found on [[TimeWML]].&lt;br /&gt;
&lt;br /&gt;
* '''turn''': (defaults to the current turn number) changes the turn number for which time of day information should be retrieved.&lt;br /&gt;
&lt;br /&gt;
==== [store_turns] ====&lt;br /&gt;
&lt;br /&gt;
Stores the turn limit (the maximum number of turns). If there is no limit, this stores ''-1''.&lt;br /&gt;
&lt;br /&gt;
* '''variable''': (default='turns') the name of the variable in which to store the turn limit.&lt;br /&gt;
&lt;br /&gt;
==== [store_unit] ====&lt;br /&gt;
&lt;br /&gt;
Stores details about units into a [[VariablesWML#Container|container]] variable. When a unit is stored, all keys and tags in the unit definition may be manipulated, including some others, with [[InternalActionsWML#.5Bset_variable.5D|[set_variable]]]. A sample '''list of these tags and keys''' can be found at [[InternalActionsWMLUnitTags]].&lt;br /&gt;
&lt;br /&gt;
If you have a doubt about what keys are valid or what the valid value range is for each key, code a [store_unit] event, save the game, and examine what keys are in the file (or just examine the '''[unit]''' tag(s) in any save file). One can also use the [[CommandMode|:inspect]] command or the [[InterfaceActionsWML#.5Binspect.5D|[inspect]]] tag to open a game-state inspector dialog, which can be used to view unit properties.&lt;br /&gt;
&lt;br /&gt;
Common usage is to manipulate a unit by using '''[store_unit]''' to store it into a variable, followed by manipulation of the variable, and then [[DirectActionsWML#.5Bunstore_unit.5D|[unstore_unit]]] to re-create the unit with the modified variables.&lt;br /&gt;
&lt;br /&gt;
''Note: stored units also exist on the field, and modifying the stored variable will not automatically change the stats of the units. You need to use [unstore_unit]. See also [[DirectActionsWML#.5Bunstore_unit.5D|[unstore_unit]]] and [[ConditionalActionsWML#.5Bforeach.5D|[foreach]]].&lt;br /&gt;
&lt;br /&gt;
* '''[filter]''' with a [[StandardUnitFilter]] as argument. All units matching this filter will be stored. If there are multiple units, they will be stored into an array of variables. The units will be stored in order of their internal ''underlying_id'' attribute, which is usually in creation order (but you normally should not depend on the order).&lt;br /&gt;
&lt;br /&gt;
* '''variable''': the name of the variable into which to store the unit(s)&lt;br /&gt;
&lt;br /&gt;
* '''mode''': defaults to ''always_clear'', which clears the variable, whether or not a match is found. If mode is set to ''replace'', the variable will not be cleared, and units which match the filter will overwrite existing elements at the start of the array, leaving any additional elements intact if the original array contained more elements than there are units matching the filter. If mode is set to ''append'', the variable will not be cleared, and units which match the filter will be added to the array after the existing elements.&lt;br /&gt;
&lt;br /&gt;
* '''kill''': if 'yes' the units that are stored will be removed from play. This is useful for instance to remove access to a player's recall list, with the intent to restore the recall list later.&lt;br /&gt;
&lt;br /&gt;
==== [store_unit_defense] ====&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|9}}&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.15|7}} Fixed, was broken in 1.15.3&lt;br /&gt;
&lt;br /&gt;
Stores in a variable the defense of a unit on a particular terrain. If terrain or location is not specified, the terrain on which the unit currently stands is used. (Note: it is a WML defense, so the higher it is, the weaker unit's defense is. A footpad on castle has 70% defense, so this function stores the value 30.)&lt;br /&gt;
&lt;br /&gt;
* StandardUnitFilter&lt;br /&gt;
* '''loc_x''', '''loc_y''': x and y of a valid map location. The terrain on this location will be used for the defense calculation.&lt;br /&gt;
* '''terrain''': The terrain code for which unit defense should be calculated. If '''terrain''' is specified, '''loc_x''' and '''loc_y''' are ignored.&lt;br /&gt;
* '''variable''': the name of the variable into which to store the defense. default: &amp;quot;terrain_defense&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== [store_unit_defense_on] ====&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.15|7}} Similar to [store_unit_defense], but stores the same number that would be shown in the UI. For example, a footpad on castle has 70% defense, so this stores the value 70.&lt;br /&gt;
&lt;br /&gt;
Takes the same attributes as [store_unit_defense], and defaults to storing the value in &amp;quot;terrain_defense&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== [store_unit_type] ====&lt;br /&gt;
&lt;br /&gt;
Stores a unit type definition into a variable.&lt;br /&gt;
&lt;br /&gt;
* '''type''': (required) the defined ID of the unit type, for example &amp;quot;Goblin Knight&amp;quot;. Do not use a translation mark or it will not work correctly for different languages. A comma-separated list of IDs may also be used to store an array of unit types.&lt;br /&gt;
&lt;br /&gt;
* '''variable''': the name of the variable into which to store the unit type information (default &amp;quot;unit_type&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* '''mode''':{{DevFeature1.13|0}} defaults to ''always_clear'', which clears the variable. If mode is set to ''replace'', the variable will not be cleared, and the unit type will overwrite the existing element at the start of the array, leaving any additional elements intact if the original array contained more elements. If mode is set to ''append'', the variable will not be cleared, and the unit type will be added to the array after the existing elements.&lt;br /&gt;
&lt;br /&gt;
==== [store_unit_type_ids] ====&lt;br /&gt;
&lt;br /&gt;
* '''variable''': the name of the variable into which to store a comma-separated list of all unit type IDs including all from all loaded addons&lt;br /&gt;
&lt;br /&gt;
==== [store_villages] ====&lt;br /&gt;
&lt;br /&gt;
Stores a series of locations of villages that pass certain criteria into an array. Each member of the result array will have members 'x' and 'y' (the position) and 'terrain' (the terrain type) and 'owner_side'.&lt;br /&gt;
&lt;br /&gt;
Note: This differs from using [store_locations] only in that the hexes considered for match are restricted to those with villages (those whose terrain type has its 'gives_income' flag set to true), in the same way that use of either the 'owner_side' key or the '[filter_owner]' will. In fact, if either of these are present, [store_villages] and [store_locations] will behave identically.&lt;br /&gt;
&lt;br /&gt;
* '''variable''': the name of the variable (array) into which to store the locations (default: &amp;quot;location&amp;quot;)&lt;br /&gt;
* '''[[StandardLocationFilter]]''' tags and keys as arguments&lt;br /&gt;
&lt;br /&gt;
==== [store_items] ====&lt;br /&gt;
&lt;br /&gt;
Stores current items in the scenario into an array. Each entry has at least members x and y and can have all of the other keys listed in the documentation of [[InterfaceActionsWML#.5Bitem.5D|[item]]] (depending on what was set during creating the item).&lt;br /&gt;
&lt;br /&gt;
*'''variable''': name of the wml variable array to use (default &amp;quot;items&amp;quot;)&lt;br /&gt;
*'''[[StandardLocationFilter]]''' keys as arguments: only items on locations matching this [[StandardLocationFilter]] will be stored&lt;br /&gt;
*'''item_name''': {{DevFeature1.15|0}} if given, only items created with a matching '''[item]name=''' will be stored. As of 1.15.0, this does not support comma-separated lists.&lt;br /&gt;
&lt;br /&gt;
==== [store_relative_direction] ====&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|0}}&lt;br /&gt;
&lt;br /&gt;
Gets the relative direction from one hex to another. This is an interface to the function wesnoth uses to decide how a unit will face while it is moving / attacking / defending.&lt;br /&gt;
&lt;br /&gt;
* '''[source]''' x and y must describe a map location&lt;br /&gt;
* '''[destination]''' similar&lt;br /&gt;
* '''variable''' name of the variable to store string result in (one of 'n', 'nw', 'ne', 's', 'sw', 'se')&lt;br /&gt;
* '''mode''' optional. 0 is the default setting corresponding to default wesnoth implementation used in animations. 1 is an alternate &amp;quot;radially symmetric&amp;quot; mode. The default mode breaks ties in the direction of south, since this makes more units face the player directly on screen. The radially symmetric mode breaks ties in the direction of counter-clockwise, and might be more appropriate in some cases.&lt;br /&gt;
&lt;br /&gt;
==== [find_path] ====&lt;br /&gt;
&lt;br /&gt;
A WML interface to the pathfinder. Calculates the path between a unit and a location and returns the result in a WML variable, that contains also an array for every step of the path (including the starting hex).&lt;br /&gt;
&lt;br /&gt;
*'''[traveler]''': [[StandardUnitFilter]], only the first matching unit will be used for calculation&lt;br /&gt;
*'''[destination]''': [[StandardLocationFilter]]&lt;br /&gt;
*'''variable''': the variable name where the result will be stored, if no value is supplied 'path' will be used as default name. Each step will be stored in a [step] array inside that variable.&lt;br /&gt;
*'''allow_multiple_turns''': default no, if yes also moves that require more than one turn will be calculated.&lt;br /&gt;
*'''check_visibility''': default no, if yes the path will not be computed if some hexes are not visible due to shroud.&lt;br /&gt;
*'''check_teleport''': default yes; if no, teleport won't be taken in account while computing path.&lt;br /&gt;
*'''check_zoc''': default yes; if no, unit ZOCs won't be considered while calculating the path.&lt;br /&gt;
*'''nearest_by''': {{DevFeature1.15|2}} possible values &amp;quot;movement_cost&amp;quot; (default), &amp;quot;steps&amp;quot;, &amp;quot;hexes&amp;quot;; if the [destination] SLF matches multiple hexes, the one that would need the least movement points to reach may not be the one that's closest as measured by '''hexes''', or closest as measured by steps, from the starting point. This option chooses which measurement to prefer.&lt;br /&gt;
&lt;br /&gt;
More detail about multiple destinations and the return structure is on [[FindPathExplanation]] (moved out of this page because it has an image in it).&lt;br /&gt;
&lt;br /&gt;
This is the structure of the variable returned by [find_path]:&lt;br /&gt;
 [path]&lt;br /&gt;
 	hexes = non-zero if a path was successfully found.&lt;br /&gt;
 		if the path is calculated to an impassable hex, or the move requires multiple turns&lt;br /&gt;
 		and allow_multiple_turns is no, its value will be 0.&lt;br /&gt;
 	from_x, from_y = location of the unit&lt;br /&gt;
 	to_x, to_y = destination&lt;br /&gt;
 	movement_cost = total movement cost required by unit to reach that hex&lt;br /&gt;
 	required_turns = total turns required by unit to reach that hex&lt;br /&gt;
 	[step]&lt;br /&gt;
 		x, y = location of the step&lt;br /&gt;
 		terrain = terrain of the step&lt;br /&gt;
 		movement_cost = movement cost required by unit to reach that hex&lt;br /&gt;
 		required_turns = turns required by unit to reach that hex&lt;br /&gt;
 	[/step]&lt;br /&gt;
 [/path]&lt;br /&gt;
&lt;br /&gt;
==== [unit_worth] ====&lt;br /&gt;
Takes only an inline [[StandardUnitFilter]] (only the first matching unit will be used for calculation) and outputs the following variables: &lt;br /&gt;
*''cost'', the current unit cost;&lt;br /&gt;
*''next_cost'', the cost of the most expensive advancement;&lt;br /&gt;
*''health'', the health of the unit in percentage;&lt;br /&gt;
*''experience'', current experience in percentage;&lt;br /&gt;
*''unit_worth'', how much the unit is worth.&lt;br /&gt;
&lt;br /&gt;
Mainly used for internal AI checks, but one could in theory just do anything with it.&lt;br /&gt;
&lt;br /&gt;
 [event]&lt;br /&gt;
     name=moveto&lt;br /&gt;
     [unit_worth]&lt;br /&gt;
        x,y=$x1,$y1&lt;br /&gt;
     [/unit_worth]&lt;br /&gt;
     [message]&lt;br /&gt;
         id=$unit.id&lt;br /&gt;
         message=_&amp;quot;I cost $cost gold, with $health|% of my hitpoints and $experience|% on the way to cost $next_cost|.&lt;br /&gt;
 I am estimated to be worth $unit_worth&amp;quot;&lt;br /&gt;
     [/message]&lt;br /&gt;
     [clear_variable]&lt;br /&gt;
         name=cost,next_cost,health,experience,unit_worth&lt;br /&gt;
     [/clear_variable]&lt;br /&gt;
 [/event]&lt;br /&gt;
&lt;br /&gt;
=== [clear_variable] ===&lt;br /&gt;
&lt;br /&gt;
This will delete the given variable. This tag can delete a scalar or an entire array; it can also delete one container at an array index. The macro [https://www.wesnoth.org/macro-reference.html#CLEAR_VARIABLE CLEAR_VARIABLE] is a shortcut for this tag.&lt;br /&gt;
&lt;br /&gt;
This action is good to use to clean up the set of variables; for example, a well-behaved scenario will delete any variables that should not be kept for the next scenario before the end of the scenario. One can also clear tags and variables of stored units; for example, one can remove [trait]s and [object]s.&lt;br /&gt;
&lt;br /&gt;
* '''name''': the name of the variable to clear. This can also be a comma-separated list of multiple variable names.&lt;br /&gt;
** If a name ends with an array index, then it deletes that one container, and shifts the indexes of all subsequent containers. For example, &amp;lt;code&amp;gt;{CLEAR_VARIABLE my_awesome_array[2]}&amp;lt;/code&amp;gt; deletes &amp;lt;code&amp;gt;my_awesome_array[2]&amp;lt;/code&amp;gt;, but then moves &amp;lt;code&amp;gt;my_awesome_array[3]&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;my_awesome_array[2]&amp;lt;/code&amp;gt;, moves &amp;lt;code&amp;gt;my_awesome_array[4]&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;my_awesome_array[3]&amp;lt;/code&amp;gt;, and so on until the end of the array.&lt;br /&gt;
** Note that &amp;lt;code&amp;gt;{CLEAR_VARIABLE my_awesome_array}&amp;lt;/code&amp;gt; deletes the entire array, but &amp;lt;code&amp;gt;{CLEAR_VARIABLE my_awesome_array[0]}&amp;lt;/code&amp;gt; deletes only the first container.&lt;br /&gt;
&lt;br /&gt;
=== [sync_variable] ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|0}}&lt;br /&gt;
&lt;br /&gt;
Sets one or multiple variables to the same value as on all clients and also on replays, it uses the value from the currently active side.&lt;br /&gt;
* '''name''' the name of the variable to synchonize this can be a comma seperated list.&lt;br /&gt;
&lt;br /&gt;
== Other Internal Actions ==&lt;br /&gt;
&lt;br /&gt;
Believe it or not, there are some internal actions that are not focused primarily on variables. They are all grouped here.&lt;br /&gt;
&lt;br /&gt;
=== [fire_event] ===&lt;br /&gt;
&lt;br /&gt;
Trigger a WML event (used often for [[EventWML#Custom_events|custom events]])&lt;br /&gt;
&lt;br /&gt;
* '''name''': the name of event to trigger&lt;br /&gt;
** ''(Optional)'' {{DevFeature1.13|6}}&lt;br /&gt;
&lt;br /&gt;
* '''id''': ''(Optional)'' the id of a single event to trigger {{DevFeature1.13|6}}&lt;br /&gt;
&lt;br /&gt;
* '''[primary_unit]''': ''(Optional)'' Primary unit for the event. Will never match on a recall list unit. The first unit matching the filter will be chosen.&lt;br /&gt;
**[[StandardUnitFilter]] as argument. Do not use a [filter] tag.&lt;br /&gt;
&lt;br /&gt;
* '''[secondary_unit]''': ''(Optional)'' Same as '''[primary_unit]''' except for the secondary unit.&lt;br /&gt;
**[[StandardUnitFilter]] as argument. Do not use a [filter] tag.&lt;br /&gt;
&lt;br /&gt;
* '''[primary_attack]''': Information passed to the primary attack filter and $weapon variable on the new event.&lt;br /&gt;
&lt;br /&gt;
* '''[secondary_attack]''': Information passed to the second attack filter and $second_weapon variable on the new event.&lt;br /&gt;
&lt;br /&gt;
=== [remove_event] ===&lt;br /&gt;
{{DevFeature1.13|0}} Removes the event with the specified id.&lt;br /&gt;
&lt;br /&gt;
* '''id''': the id of the event to remove. May be a comma separated list.&lt;br /&gt;
&lt;br /&gt;
=== [insert_tag] ===&lt;br /&gt;
&lt;br /&gt;
Inserts a variable as WML. In other words, the value of the passed [[VariablesWML#Container|container variable]] will be injected into the game as if they had been written out in WML form. ([[#.5Binsert_tag.5D_Example|See Example]]).&lt;br /&gt;
&lt;br /&gt;
Tag insertion is a special case in that it can be used in places where other ActionWML cannot be used. The basic rule is that anywhere that $variable syntax works, tag insertion will also work. In practice this means pretty much everywhere except directly within top-level scenario tags.&lt;br /&gt;
&lt;br /&gt;
*'''name''': The [&amp;quot;name&amp;quot;] to be given to the tag. This must be a tag which would be valid at the place where [insert_tag] is used, for anything to happen. (For example, if used as ActionWML, it should be a [[ActionWML]] tag name, and it may be a recognized subtag such as &amp;quot;option&amp;quot; when used within a [message]).&lt;br /&gt;
&lt;br /&gt;
*'''variable''': Name of the container variable which will have its value inserted into the tag. If the container variable is a WML array, [insert_tag] will insert a different tag for each of its elements.&lt;br /&gt;
&lt;br /&gt;
=== [role] ===&lt;br /&gt;
&lt;br /&gt;
Tries to find a unit to assign a role to.&amp;lt;br&amp;gt;This is useful if you want to choose a non-major character to say some things during the game. Once a role is assigned, you can use '''role=''' in a unit filter to identify the unit with that role (See [[FilterWML]]).&amp;lt;br&amp;gt;However, there is no guarantee that roles will ever be assigned. You can use '''[have_unit]''' (see [[ConditionalActionsWML#Condition_Tags|Condition Tags]]) to see whether a role was assigned. This tag uses a [[StandardUnitFilter]] (without [filter]) with the modification to order the search by type, mark only the first unit found with the role, and the role attribute is not used in the search. If for some reason you want to search for units that have or don't have existing roles, you can use one or more [not] filters. The will check recall lists in addition to units on the map. In normal use, you will probably want to include a ''side'' attribute to force the unit to be on a particular side.&lt;br /&gt;
&lt;br /&gt;
* '''role''': the value to store as the unit's role. This role is not used in the [[StandardUnitFilter]] when doing the search for the unit to assign this role to.&lt;br /&gt;
&lt;br /&gt;
* '''type''': a comma-separated list of possible types the unit can be. If any types are given, then units will be searched by type in the order listed. If no type is given, then no particular order with respect to type is guaranteed.&lt;br /&gt;
&lt;br /&gt;
* '''search_recall_list''': {{DevFeature1.13|5}} whether to consider units on the recall list when assigning the role. Can be either yes or no, defaults to yes. {{DevFeature1.13|6}} If set to 'only', then units on the map are not considered when assigning the role - only units on the recall list can receive it.&lt;br /&gt;
&lt;br /&gt;
* '''[else]''' {{DevFeature1.13|5}} ActionWML to execute if the game is unable to find a unit to assign the role to. For example, this could be used to create a new unit satisfying the role.&lt;br /&gt;
&lt;br /&gt;
* '''[auto_recall]''' {{DevFeature1.13|6}} If present, and the role is assigned to a unit on the recall list, then that unit is recalled. Supports all unique keys of [[DirectActionsWML#.5Brecall.5D|&amp;amp;#x5b;recall&amp;amp;#x5d;]], but no [[StandardUnitFilter]].&lt;br /&gt;
&lt;br /&gt;
* [[StandardUnitFilter]], do not use a [filter] sub-tag. SUF's role= and type= keys are not used: if you want to use them, use a nested SUF wrapped inside a [and] tag.&lt;br /&gt;
&lt;br /&gt;
=== [random_placement] ===&lt;br /&gt;
{{DevFeature1.13|2}}&lt;br /&gt;
&lt;br /&gt;
Selects randomly a given number of locations from a given set of locations and exectutes the given code for each of those locations.&lt;br /&gt;
&lt;br /&gt;
* '''[filter_location]''': a [[StandardLocationFilter]].&lt;br /&gt;
* '''[command]''': contains ActionWml that is executed for each of the locations.&lt;br /&gt;
* '''num_items''': the number of locations that should be selected. There are several ways of specifying this:&lt;br /&gt;
** An integer, giving the exact number of locations to use. (Variable substitution is supported too.)&lt;br /&gt;
** {{DevFeature1.15|0}} A percentage, meaning that fraction of the total available spaces.&lt;br /&gt;
** {{DevFeature1.15|0}} A [[Wesnoth_Formula_Language|WFL]] formula. It has access to one variable, ''size'', which is the total number of available spaces. In order to identify it as a WFL formula, the entire expression must be enclosed in parentheses. (Do not use a '''$''', as that will cause it to see ''size'' as zero.)&lt;br /&gt;
** A Lua expression. As with a WFL expression, it can access the ''size'' variable. {{DevFeature1.15|0}} This is now deprecated.&lt;br /&gt;
* '''variable''': The name of the variable that contains the current location during the execution of [command]. This is a container with the attributes x, y, n and terrain.&lt;br /&gt;
* '''min_distance''': The minimum distance of 2 chosen locations, a value less than 0 means that the same locations can be chosen more than one time.&lt;br /&gt;
* '''allow_less''': If yes, the tag will not show an error in case there were less than num_items locations available.&lt;br /&gt;
&lt;br /&gt;
=== Flow control actions ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|2}}&lt;br /&gt;
&lt;br /&gt;
There are three actions that alter the flow of execution. They are '''[break]''', '''[continue]''', and '''[return]'''. All of them take no arguments.&lt;br /&gt;
&lt;br /&gt;
* '''[break]''': The nearest enclosing loop immediately stops executing, and control continues with the next action after the end of that loop. If there is no enclosing loop, this is equivalent to '''[return]'''.&lt;br /&gt;
* '''[continue]''': The nearest enclosing loop immediately stops executing, and control continues at the beginning of that loop, with any iteration variables updated for the next iteration. If there is no enclosing loop, this is an error.&lt;br /&gt;
* '''[return]''': Control immediately returns to the Wesnoth engine. This completely exits the current event, including any nested events, such that the [message] will not be displayed in the below example. No further WML actions are executed in this context. Any separate, subsequent events will be run as usual.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=wml&amp;gt;&lt;br /&gt;
[event]&lt;br /&gt;
   name=moveto&lt;br /&gt;
   [fire_event]&lt;br /&gt;
      name=return_please&lt;br /&gt;
   [/fire_event]&lt;br /&gt;
   [message]&lt;br /&gt;
     message=&amp;quot;Made it back&amp;quot;&lt;br /&gt;
   [/message]&lt;br /&gt;
[/event]&lt;br /&gt;
[event]&lt;br /&gt;
   name=return_please&lt;br /&gt;
   [return][/return]&lt;br /&gt;
[/event]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [unsynced] ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|?}}&lt;br /&gt;
&lt;br /&gt;
Runs the contained actionwml in a unsynced context, that means actions performed inside [unsynced] are not synced over the network. for example &lt;br /&gt;
&amp;lt;syntaxhighlight lang=wml&amp;gt;&lt;br /&gt;
[event]&lt;br /&gt;
   name=moveto&lt;br /&gt;
   {VARIABLE_OP message rand &amp;quot;Hi,Hello,How are you?&amp;quot;}&lt;br /&gt;
   [message]&lt;br /&gt;
      message = $message&lt;br /&gt;
   [/message]&lt;br /&gt;
   {CLEAR_VARIABLE message}&lt;br /&gt;
   [allow_undo]&lt;br /&gt;
   [/allow_undo]&lt;br /&gt;
[/event]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
will print the same message to all clients, but also disallow undoing (regardless of [allow_undo]) for that moveto becasue it requests a synced random seed form the server. However this code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=wml&amp;gt;&lt;br /&gt;
[event]&lt;br /&gt;
   name=moveto&lt;br /&gt;
   [unsynced]&lt;br /&gt;
      {VARIABLE_OP message rand &amp;quot;Hi,Hello,How are you?&amp;quot;}&lt;br /&gt;
      [message]&lt;br /&gt;
         message = $message&lt;br /&gt;
      [/message]&lt;br /&gt;
      {CLEAR_VARIABLE message}&lt;br /&gt;
   [/unsynced]&lt;br /&gt;
   [allow_undo]&lt;br /&gt;
   [/allow_undo]&lt;br /&gt;
[/event]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
will not prevent undoing, but might print a different message for each client in a multiplayer game (or during a sp replay), so `[unsynced]` should not be used for actions that actually change the gamestate otherwise you'll get OOS&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Using [set_variables] to Create Arrays of WML ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=wml&amp;gt;&lt;br /&gt;
[set_variables]&lt;br /&gt;
    name=arr&lt;br /&gt;
    mode=replace&lt;br /&gt;
    [value]&lt;br /&gt;
        foo=bar&lt;br /&gt;
    [/value]&lt;br /&gt;
    [value]&lt;br /&gt;
       foo=more&lt;br /&gt;
    [/value]&lt;br /&gt;
[/set_variables]&lt;br /&gt;
{DEBUG_MSG $arr[0].foo}&lt;br /&gt;
{DEBUG_MSG $arr[1].foo}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will produce two output messages, first one saying '''bar''' and next one saying '''more'''.&lt;br /&gt;
&lt;br /&gt;
=== [insert_tag] Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=wml&amp;gt;&lt;br /&gt;
[event]&lt;br /&gt;
    name=moveto&lt;br /&gt;
    &lt;br /&gt;
    [set_variable]&lt;br /&gt;
        name=temp.speaker&lt;br /&gt;
        value=Konrad&lt;br /&gt;
    [/set_variable]&lt;br /&gt;
    &lt;br /&gt;
    [set_variable]&lt;br /&gt;
        name=temp.message&lt;br /&gt;
        value= _ &amp;quot;Yo Kalenz!&amp;quot;&lt;br /&gt;
    [/set_variable]    &lt;br /&gt;
    &lt;br /&gt;
    [insert_tag]&lt;br /&gt;
        name=message&lt;br /&gt;
        variable=temp&lt;br /&gt;
    [/insert_tag]&lt;br /&gt;
[/event]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is effectively identical to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=wml&amp;gt;&lt;br /&gt;
[event]&lt;br /&gt;
    name=moveto&lt;br /&gt;
    &lt;br /&gt;
    [message]&lt;br /&gt;
        speaker=Konrad&lt;br /&gt;
        message= _ &amp;quot;Yo Kalenz!&amp;quot;&lt;br /&gt;
    [/message]&lt;br /&gt;
[/event]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[VariablesWML]]&lt;br /&gt;
* [[ActionWML]]&lt;br /&gt;
** [[ConditionalWML]]&lt;br /&gt;
** [[DirectActionsWML]]&lt;br /&gt;
** [[InterfaceActionsWML]]&lt;br /&gt;
* [[EventWML]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;br /&gt;
[[Category: ActionsWML]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=BuildingScenarios&amp;diff=68452</id>
		<title>BuildingScenarios</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=BuildingScenarios&amp;diff=68452"/>
		<updated>2021-08-24T08:17:44Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: https links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Translations}}&lt;br /&gt;
{| style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
__NOTOC__&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Create}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-1.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-1-175.jpg]&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbcaption&amp;quot;&amp;gt;The Elves Besieged&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wesnoth scenarios are the individual levels within the game. They can be as simple or advanced as you choose, ranging from two sides who must fight each other to multiple sides with different characters, custom items, and complicated events. This page is split into several sections, starting with the basics and moving into more complex techniques. When you're done, you should have all the knowledge necessary to create your own scenarios.&lt;br /&gt;
&lt;br /&gt;
Each scenario is made up of two files: the map file and the configuration file. The former, the map itself, is discussed in [[BuildingMaps]]. The latter describes everything about, and what occurs in, a scenario, from the setup of sides, units, music, events, and so on. Both files are plaintext are can be edited in any standard text editor. If you decide to use a wordprocessor, please make sure to &amp;lt;i&amp;gt;Save As&amp;lt;/i&amp;gt; text (preferably with a &amp;lt;i&amp;gt;.cfg&amp;lt;/i&amp;gt; extension), not as rich text.&lt;br /&gt;
&lt;br /&gt;
Remember that you can use the scenarios that ship with the game for reference should you get stuck. They cover a wide range of techniques, so it's likely you'll find an example of what you need.&lt;br /&gt;
&lt;br /&gt;
If you still don't understand something or can't get it to work, feel free to ask for assistance in the [https://forums.wesnoth.org/viewforum.php?f=23 WML Workshop] on the forums.&lt;br /&gt;
&lt;br /&gt;
== The Wesnoth Markup Language ==&lt;br /&gt;
&lt;br /&gt;
Scenarios are written in the [[ReferenceWML|Wesnoth Markup Language]] (WML), a custom language written specially to work with the game. It sports a relatively simple tag/key-based syntax, a complete guide to which can be found on the [[SyntaxWML]] page.&lt;br /&gt;
&lt;br /&gt;
=== Quick Tag Index ===&lt;br /&gt;
&lt;br /&gt;
Below follows an index of the basic WML tags used to create scenarios.&lt;br /&gt;
&lt;br /&gt;
:* [[ScenarioWML]]: The top level tags [scenario], [multiplayer], [test], and [tutorial]&lt;br /&gt;
:* [[IntroWML]]: Setting up the intro screen&lt;br /&gt;
:* [[TimeWML]]: Setting up the time schedule&lt;br /&gt;
:* [[SideWML]]: Describing a side&lt;br /&gt;
:** [[SingleUnitWML]]: The syntax of a single unit&lt;br /&gt;
:** [[ShroudDataWML]]&lt;br /&gt;
:* [[EventWML]]: An event that happens in the scenario&lt;br /&gt;
:** [[FilterWML]]: All about filters&lt;br /&gt;
:** [[DirectActionsWML]], [[InterfaceActionsWML]], [[InternalActionsWML]]&lt;br /&gt;
:* [[MapGeneratorWML]]: The random map generator&lt;br /&gt;
:* [https://www.wesnoth.org/macro-reference.html Macro Reference]: A set of useful macro shortcuts you can use&lt;br /&gt;
&lt;br /&gt;
=== Sample Code ===&lt;br /&gt;
&lt;br /&gt;
A nice collection of simple beginner code to look at is documented on the [[BuildingScenariosSamples | Samples]] page, showcasing the basic usage and structure of WML in an actual coding sense.&lt;br /&gt;
&lt;br /&gt;
== Scenarios and the Map Editor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&lt;br /&gt;
[https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-5.jpg https://www.wesnoth.org/images/sshots/wesnoth-1.11.8-5-175.jpg]&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbcaption&amp;quot;&amp;gt;Scenario Data&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of Wesnoth 1.12, the Map Editor has become more fully featured, and includes options to define more basic scenario-related content for your scenario, such as name, unit placement, graphical items, time of day schedules, etc, without having to manually write the code yourself. However, the editor cannot create more complex WML. Those interesting snippets still have to be written by hand. These functions are most useful for creating a simple scenario from a map, or streamlining your workflow in creating a more complicated scenario.&lt;br /&gt;
&lt;br /&gt;
In order to edit scenario metadata, select &amp;lt;i&amp;gt;File → New Scenario&amp;lt;/i&amp;gt;. By default, the editor opens with a blank map file open only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;NOTE: Scenario-specific content will not be saved unless you also select the &amp;lt;i&amp;gt;File → Save Scenario&amp;lt;/i&amp;gt; option before exit. Otherwise, you will simply get a map file.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building Your Scenario ==&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;b&amp;gt;• [[BuildingScenariosSimple|Simple]] • [[BuildingScenariosIntermediate|Intermediate]] • [[BuildingScenariosAdvanced|Advanced]]&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creating a scenario is no simple task. Generally, you should have a premise mapped out for the scenario before you begin. Who will your protagonists face? What events will occur? How long will it be? You might decide to revise your plans as you code and test them. It will generally take many iterations of writing, coding, and playtesting until your scenario reaches a product you are satisfied with.&lt;br /&gt;
&lt;br /&gt;
A discussion on tweaking and balancing your scenario to make it more fun is found on the [[BuildingScenariosBalancing|Balancing]] page. ESR has more handy tips in his [http://catb.org/~esr/wesnoth/campaign-design-howto.html Campaign Design How-To] article, and as mentioned before, don't hesitate to ask for help in the [https://forums.wesnoth.org/viewforum.php?f=23 WML Workshop].&lt;br /&gt;
&lt;br /&gt;
A handy breakdown of the code of a scenario, line-by-line, is available on the three pages linked here. Each explores gradually more complex WML concepts.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ReferenceWML]] - WML master reference&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=BuildingScenarios&amp;diff=68451</id>
		<title>BuildingScenarios</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=BuildingScenarios&amp;diff=68451"/>
		<updated>2021-08-24T08:16:51Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update links to macro-reference.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Translations}}&lt;br /&gt;
{| style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
__NOTOC__&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Create}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&lt;br /&gt;
[http://www.wesnoth.org/images/sshots/wesnoth-1.11.8-1.jpg http://www.wesnoth.org/images/sshots/wesnoth-1.11.8-1-175.jpg]&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbcaption&amp;quot;&amp;gt;The Elves Besieged&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wesnoth scenarios are the individual levels within the game. They can be as simple or advanced as you choose, ranging from two sides who must fight each other to multiple sides with different characters, custom items, and complicated events. This page is split into several sections, starting with the basics and moving into more complex techniques. When you're done, you should have all the knowledge necessary to create your own scenarios.&lt;br /&gt;
&lt;br /&gt;
Each scenario is made up of two files: the map file and the configuration file. The former, the map itself, is discussed in [[BuildingMaps]]. The latter describes everything about, and what occurs in, a scenario, from the setup of sides, units, music, events, and so on. Both files are plaintext are can be edited in any standard text editor. If you decide to use a wordprocessor, please make sure to &amp;lt;i&amp;gt;Save As&amp;lt;/i&amp;gt; text (preferably with a &amp;lt;i&amp;gt;.cfg&amp;lt;/i&amp;gt; extension), not as rich text.&lt;br /&gt;
&lt;br /&gt;
Remember that you can use the scenarios that ship with the game for reference should you get stuck. They cover a wide range of techniques, so it's likely you'll find an example of what you need.&lt;br /&gt;
&lt;br /&gt;
If you still don't understand something or can't get it to work, feel free to ask for assistance in the [http://forums.wesnoth.org/viewforum.php?f=23 WML Workshop] on the forums.&lt;br /&gt;
&lt;br /&gt;
== The Wesnoth Markup Language ==&lt;br /&gt;
&lt;br /&gt;
Scenarios are written in the [[ReferenceWML|Wesnoth Markup Language]] (WML), a custom language written specially to work with the game. It sports a relatively simple tag/key-based syntax, a complete guide to which can be found on the [[SyntaxWML]] page.&lt;br /&gt;
&lt;br /&gt;
=== Quick Tag Index ===&lt;br /&gt;
&lt;br /&gt;
Below follows an index of the basic WML tags used to create scenarios.&lt;br /&gt;
&lt;br /&gt;
:* [[ScenarioWML]]: The top level tags [scenario], [multiplayer], [test], and [tutorial]&lt;br /&gt;
:* [[IntroWML]]: Setting up the intro screen&lt;br /&gt;
:* [[TimeWML]]: Setting up the time schedule&lt;br /&gt;
:* [[SideWML]]: Describing a side&lt;br /&gt;
:** [[SingleUnitWML]]: The syntax of a single unit&lt;br /&gt;
:** [[ShroudDataWML]]&lt;br /&gt;
:* [[EventWML]]: An event that happens in the scenario&lt;br /&gt;
:** [[FilterWML]]: All about filters&lt;br /&gt;
:** [[DirectActionsWML]], [[InterfaceActionsWML]], [[InternalActionsWML]]&lt;br /&gt;
:* [[MapGeneratorWML]]: The random map generator&lt;br /&gt;
:* [https://www.wesnoth.org/macro-reference.html Macro Reference]: A set of useful macro shortcuts you can use&lt;br /&gt;
&lt;br /&gt;
=== Sample Code ===&lt;br /&gt;
&lt;br /&gt;
A nice collection of simple beginner code to look at is documented on the [[BuildingScenariosSamples | Samples]] page, showcasing the basic usage and structure of WML in an actual coding sense.&lt;br /&gt;
&lt;br /&gt;
== Scenarios and the Map Editor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb tright&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&lt;br /&gt;
[http://www.wesnoth.org/images/sshots/wesnoth-1.11.8-5.jpg http://www.wesnoth.org/images/sshots/wesnoth-1.11.8-5-175.jpg]&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbcaption&amp;quot;&amp;gt;Scenario Data&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of Wesnoth 1.12, the Map Editor has become more fully featured, and includes options to define more basic scenario-related content for your scenario, such as name, unit placement, graphical items, time of day schedules, etc, without having to manually write the code yourself. However, the editor cannot create more complex WML. Those interesting snippets still have to be written by hand. These functions are most useful for creating a simple scenario from a map, or streamlining your workflow in creating a more complicated scenario.&lt;br /&gt;
&lt;br /&gt;
In order to edit scenario metadata, select &amp;lt;i&amp;gt;File → New Scenario&amp;lt;/i&amp;gt;. By default, the editor opens with a blank map file open only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;NOTE: Scenario-specific content will not be saved unless you also select the &amp;lt;i&amp;gt;File → Save Scenario&amp;lt;/i&amp;gt; option before exit. Otherwise, you will simply get a map file.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building Your Scenario ==&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;b&amp;gt;• [[BuildingScenariosSimple|Simple]] • [[BuildingScenariosIntermediate|Intermediate]] • [[BuildingScenariosAdvanced|Advanced]]&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creating a scenario is no simple task. Generally, you should have a premise mapped out for the scenario before you begin. Who will your protagonists face? What events will occur? How long will it be? You might decide to revise your plans as you code and test them. It will generally take many iterations of writing, coding, and playtesting until your scenario reaches a product you are satisfied with.&lt;br /&gt;
&lt;br /&gt;
A discussion on tweaking and balancing your scenario to make it more fun is found on the [[BuildingScenariosBalancing|Balancing]] page. ESR has more handy tips in his [http://catb.org/~esr/wesnoth/campaign-design-howto.html Campaign Design How-To] article, and as mentioned before, don't hesitate to ask for help in the [http://forums.wesnoth.org/viewforum.php?f=23 WML Workshop].&lt;br /&gt;
&lt;br /&gt;
A handy breakdown of the code of a scenario, line-by-line, is available on the three pages linked here. Each explores gradually more complex WML concepts.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ReferenceWML]] - WML master reference&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ConventionsWML&amp;diff=68450</id>
		<title>ConventionsWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ConventionsWML&amp;diff=68450"/>
		<updated>2021-08-24T08:16:20Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update links to macro-reference.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this page is to list conventions of WML --&lt;br /&gt;
that is, things that make WML more readable and flexible.&lt;br /&gt;
&lt;br /&gt;
== Use wmlscope, wmllint, and wmlindent ==&lt;br /&gt;
&lt;br /&gt;
The WML [[Maintenance_tools|maintenance tools]] will help you ensure that your WML is clean, up-to-date, and correct.  Use them early and often; they will save you a lot of trouble later by catching entire classes of WML bugs before a user can ever see them.&lt;br /&gt;
&lt;br /&gt;
== Macros ==&lt;br /&gt;
&lt;br /&gt;
Using macros is useful for decreasing the size of a file,&lt;br /&gt;
and for making it clear that you are doing the same thing several times.&lt;br /&gt;
It is economical to use '''[https://www.wesnoth.org/macro-reference.html macros from the standard library]''' rather than writing your own whenever you can, but don't hesitate to write your own when the standard library does not do what you need.&lt;br /&gt;
&lt;br /&gt;
A good rule for when to write a macro is to use them whenever information or code is being duplicated and all the duplications might have to be changed in the same way later. For information on how to create and use macros, see [[PreprocessorRef]].&lt;br /&gt;
&lt;br /&gt;
Conventionally, your macro definitions should live in one or more files within a directory called utils under your main campaign directory.  Be sure to&lt;br /&gt;
include that directory in your _main.cfg.&lt;br /&gt;
&lt;br /&gt;
== Indentation ==&lt;br /&gt;
&lt;br /&gt;
We used to have complicated recommendations for indentation.  Now we have a WML indenting program and much simpler rules.&lt;br /&gt;
&lt;br /&gt;
Be aware that no matter how you indent your WML, if it's accepted into mainline we are going to run &amp;lt;tt&amp;gt;wmlindent&amp;lt;/tt&amp;gt; on it and smash it into the house style. We do this so our WML maintainers won't have to cope with lots of idiosyncratic indentation variants.  You can make your WML more readable by writing in the house style to begin with.&lt;br /&gt;
&lt;br /&gt;
# Indent each level with '''4 spaces'''. &lt;br /&gt;
# Indent attributes a level deeper than their parent tag.&lt;br /&gt;
# Indent macros as though the &amp;lt;tt&amp;gt;#define/#enddef&amp;lt;/tt&amp;gt; are an outermost level; that is, the macro body starts with one level of indenting. Same applies to &amp;lt;tt&amp;gt;#undef&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Don't indent &amp;lt;tt&amp;gt;#ifdef&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;#ifndef&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;#else&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;#endif&amp;lt;/tt&amp;gt; at all&lt;br /&gt;
# Indent comments at the same level as the text they go with.&lt;br /&gt;
&lt;br /&gt;
When in doubt, run &amp;lt;tt&amp;gt;wmlindent&amp;lt;/tt&amp;gt; on your code.  See [[Maintenance tools]] for more description of this program.&lt;br /&gt;
&lt;br /&gt;
:'''Note:''' Although 4 spaces is the mainline style, there's absolutely ''nothing'' wrong with tabs either. Those of you who prefer a simpler Notepad program should not feel compelled to use spacebar and/or delete key four times the necessary amount when you can simply use tabs. In any case, it is very easy to convert these to the standard convention using &amp;lt;tt&amp;gt;wmlindent&amp;lt;/tt&amp;gt;, so don't be scared to use your preferred method of indentation when working with WML. The most important thing to keep in mind is that your code should be uniformly indented, nested to the proper level, and using a form of whitespace that is easy for you to read, work with, and debug.&lt;br /&gt;
&lt;br /&gt;
== Naming files ==&lt;br /&gt;
&lt;br /&gt;
First of all, don't put spaces in filenames;&lt;br /&gt;
this causes errors on some systems.&lt;br /&gt;
Use underscores('''_''') instead.&lt;br /&gt;
&lt;br /&gt;
If the IDs of your scenarios are different from their names,&lt;br /&gt;
name the files after the IDs, not the names.&lt;br /&gt;
That way it is easier to tell which scenario is next.&lt;br /&gt;
&lt;br /&gt;
On some systems, filenames are case-sensitive. This means that if the ID has capital or lowercase letters, then the files must have identical capital or lowercase letters. &lt;br /&gt;
&lt;br /&gt;
Use the scenario number and an underscore as a name prefix of your scenario files, and if you have more than 9 of these put 0 at the beginning of single-digit numbers. This will make them list in order, which is convenient for people trying to read your campaign.&lt;br /&gt;
&lt;br /&gt;
While many campaigns use the same sort of number prefixing for their map files, it's better not to if (as sometimes happens) your campaign needs to use the same map twice.&lt;br /&gt;
&lt;br /&gt;
== WML variables ==&lt;br /&gt;
&lt;br /&gt;
(For information about what WML variables are, see [[VariablesWML]].)&lt;br /&gt;
These shouldn't be used except when necessary.&lt;br /&gt;
[have_unit] tags can often be used instead.&lt;br /&gt;
Also, make sure that your scenarios&lt;br /&gt;
clear meaningless variables using [clear_variable].&lt;br /&gt;
&lt;br /&gt;
For variable values, use 'yes' and 'no' for boolean values. (Wesnoth does not accept 1 or 0 as boolean values; see [[ConditionalActionsWML#Boolean Values]].&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category:WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DirectActionsWML&amp;diff=68449</id>
		<title>DirectActionsWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DirectActionsWML&amp;diff=68449"/>
		<updated>2021-08-24T08:13:36Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update links to macro-reference.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
== Direct actions ==&lt;br /&gt;
&lt;br /&gt;
Direct actions are actions that have a direct effect on gameplay. They can be used inside of [[EventWML|events]].&lt;br /&gt;
&lt;br /&gt;
The following tags are actions:&lt;br /&gt;
&lt;br /&gt;
=== [endlevel] ===&lt;br /&gt;
Ends the scenario.&lt;br /&gt;
* '''result''': before the scenario is over, all events with ''name=result'' are triggered. If ''result=victory'', the player progresses to the next level (i.e., the next scenario in single player); if ''result=defeat'', the game returns to the main menu. &lt;br /&gt;
&lt;br /&gt;
When the result is &amp;quot;victory&amp;quot; the following keys can be used:&lt;br /&gt;
* '''bonus''': whether the player should get bonus gold (maximum possible gold that could have been earned by waiting the level out). The default is bonus=yes. {{DevFeature1.13|2}} Alternatively, a number, defining the bonus multiple (1.0 meaning full).&lt;br /&gt;
* '''carryover_report''': whether the player should receive a summary of the scenario outcome, the default is carryover_report=yes.&lt;br /&gt;
* '''save''': whether a start-of-scenario save should be created for the next scenario, the default is save=yes. Do not confuse this with saving of replays for the current scenario.&lt;br /&gt;
* '''replay_save''': whether a replay save for the current scenario is allowed, the default is replay_save=yes. If yes, the player's settings in preferences will be used to determine if a replay is saved. If no, will override and not save a replay.&lt;br /&gt;
* '''linger_mode''': If ...=yes, the screen is greyed out and there's the possibility to save before advancing to the next scenario, the default is linger_mode=yes.&lt;br /&gt;
* '''reveal_map''': (Multiplayer only) (Default is 'yes') If 'no', shroud doesn't disappear when game ended.&lt;br /&gt;
* '''next_scenario''': (default specified in '''[scenario]''' tag) the ID of the next scenario that should be played.  All units that side 1 controls at this point become available for recall in ''next_scenario''.&lt;br /&gt;
* '''carryover_percentage''': by default 80% of the gold is carried over to the next scenario, with this key the amount can be changed.&lt;br /&gt;
* '''carryover_add''': if yes the gold will be added to the starting gold the next scenario, if no the next scenario will start with the amount of the current scenario (after taxes) or the minimum in the next scenario. Default is no.&lt;br /&gt;
* '''music''': (default specified in '''[scenario]''' or '''[game_config]''' tags) a comma-separated list of music tracks from which one will be chosen and played once after any events related to the end of level result are executed; by default, victory_music is used on victory, and defeat_music on defeat.&lt;br /&gt;
* '''end_credits''': Whether to display the credits screen at the end of a single-player campaign. Defaults to ''yes''. Note that this has cumulative effects over the campaign - it persists even if the endlevel does not trigger the end of the campaign. See also [[CampaignWML]].&lt;br /&gt;
* '''end_text''': (translatable) Text that is shown centered in a black screen at the end of a campaign. Defaults to &amp;quot;The End&amp;quot;. Note that this has cumulative effects over the campaign - it persists even if the endlevel does not trigger the end of the campaign. See also [[CampaignWML]].&lt;br /&gt;
* '''end_text_duration''': Delay, in milliseconds, before displaying the game credits at the end of a campaign. In other words, for how much time '''end_text''' is displayed on screen. Defaults to 3500. Note that this has cumulative effects over the campaign - it persists even if the endlevel does not trigger the end of the campaign. See also [[CampaignWML]].&lt;br /&gt;
* &amp;lt;strike&amp;gt;'''[next_scenario_settings]''': Any tags or attribute children of this optional argument to [endlevel] are merged into the scenario/multiplayer tag of the *next* scenario. This allows you to e.g. reconfigure the [side] tags or settings, just before load. &amp;lt;/strike&amp;gt; This feature was removed in 1.11.17, it might be redesigned and reintroduced.&lt;br /&gt;
* &amp;lt;strike&amp;gt;'''[next_scenario_append]''': Any tags of this optional argument are appended at high level to the next scenario. This is most appropriate for [event] tags, although you may find other uses. Example test scenario for these features: https://gna.org/support/download.php?file_id=20119 &amp;lt;/strike&amp;gt; This feature was removed in 1.11.17, it might be redesigned and reintroduced.&lt;br /&gt;
* '''[result]''' {{DevFeature1.13|0}} Allows specification of a side specific result, this is for competitive multiplayer scenarios/campaigns where it might happen that one player wins but another player loses.  The following attributes are accepted and have the same effect as in '''[endlevel]''':&lt;br /&gt;
** '''result'''&lt;br /&gt;
** '''bonus'''&lt;br /&gt;
** '''carryover_percentage'''&lt;br /&gt;
** '''carryover_add'''&lt;br /&gt;
&lt;br /&gt;
And there is also&lt;br /&gt;
** '''side''' The number of the side for which these results should apply.&lt;br /&gt;
&lt;br /&gt;
=== [unit] ===&lt;br /&gt;
Creates a unit (either on the map, on a recall list, or into a variable for later use.)  For syntax see [[SingleUnitWML]].&lt;br /&gt;
* {{Short Note:Predefined Macro|GENERIC_UNIT}}&lt;br /&gt;
&lt;br /&gt;
This tag can also recall an existing unit, which happens when:&lt;br /&gt;
* the '''id=''' attribute is used&lt;br /&gt;
* a unit with that '''id=''' already exists&lt;br /&gt;
* (might be unnecessary) the existing unit is on the side's recall list&lt;br /&gt;
in this case, the unit is recalled at the '''x,y=''' or '''location_id=''' given, and any other data in the tag is ignored.&lt;br /&gt;
&lt;br /&gt;
Campaign authors: a usual way to recall plot-necessary heroes is to use a macro with the data for creating that hero. This helps during debugging, because you can skip to scenarios and the recall-or-create functionality means that any units which are normally met in a previous scenario are automatically created (otherwise some scenarios may be an instant loss). This can only be used for units that must survive the previous scenarios, as it would recreate units if they died in a previous scenario.&lt;br /&gt;
For example,&lt;br /&gt;
[https://github.com/wesnoth/wesnoth/blob/1.14.7/data/campaigns/Heir_To_The_Throne/utils/httt_utils.cfg#L685 HttT's NEED_DELFADOR macro].&lt;br /&gt;
&lt;br /&gt;
=== [recall] ===&lt;br /&gt;
Recalls a unit taking into account any [http://wiki.wesnoth.org/SingleUnitWML filter_recall] of the leader.   The unit is recalled free of charge, and is placed near its leader, e.g., if multiple leaders are present, near the first found which would be able to normally recall it.&lt;br /&gt;
&lt;br /&gt;
If neither a valid map location is provided nor a leader on the map would be able to recall it, the tag is ignored.&lt;br /&gt;
 &lt;br /&gt;
* [[StandardUnitFilter]]: the first matching unit will be recalled.  If no units match this tag is ignored. Do not use a [filter] tag. If a comma separated list is given, every unit currently considered for recall is checked against all the types (not each single one of the types against all units).&lt;br /&gt;
* '''x,y''': the unit is placed here instead of next to the leader.&lt;br /&gt;
* '''location_id''': {{DevFeature1.15|0}} the name of a special map location to recall to. Used instead of '''x,y'''.&lt;br /&gt;
* '''show''': yes/no, default yes: whether the unit is animated (faded in) or instantly displayed&lt;br /&gt;
* '''fire_event''': boolean yes|no (default no); whether any according prerecall or recall events shall be fired.&lt;br /&gt;
* '''check_passability''': (boolean yes|no, default yes): If yes, checks for terrain passability when placing the unit (a nearby passable hex is chosen).&lt;br /&gt;
* '''[secondary_unit]''': {{DevFeature1.13|?}} If present and show=yes, a matching unit will be chosen and their recruiting animation played.&lt;br /&gt;
&lt;br /&gt;
=== [teleport] ===&lt;br /&gt;
Teleports a unit on map. {{Short Note:Predefined Macro|TELEPORT_UNIT}}&lt;br /&gt;
* '''[filter]''': [[StandardUnitFilter]] the first unit matching this filter will be teleported.&lt;br /&gt;
* '''x,y''': the hex to teleport to. If that hex is occupied, the closest unoccupied hex will be used instead.&lt;br /&gt;
* '''location_id''': {{DevFeature1.15|0}} the name of a special map location to teleport to. Used instead of '''x,y'''.&lt;br /&gt;
* '''clear_shroud''': should shroud be cleared on arrival&lt;br /&gt;
* '''animate''': should a teleport animation be played (if the unit doesn't have a teleport animation, it will fade out/fade in)&lt;br /&gt;
* '''check_passability''': (boolean yes|no, default yes): normally, units will not be teleported into terrain that is impassable for them. Setting this attribute to &amp;quot;no&amp;quot; permits it.&lt;br /&gt;
&lt;br /&gt;
(Note: There is also a ability named teleport, see [[AbilitiesWML]].)&lt;br /&gt;
&lt;br /&gt;
=== [terrain_mask] ===&lt;br /&gt;
Changes the terrain on the map.  See [[TerrainMaskWML]].&lt;br /&gt;
&lt;br /&gt;
=== [terrain] ===&lt;br /&gt;
Changes the terrain on the map.&lt;br /&gt;
* '''terrain''': the character of the terrain to use.  See [[TerrainCodesWML]] to see what letter a type of terrain uses.&lt;br /&gt;
* [[StandardLocationFilter]]. This [[StandardLocationFilter]]'s terrain= key is used for the new terrain, filtering by terrain can be done with a nested [[StandardLocationFilter]]: [and]terrain=terrain_string_to_be_filtered_for.&lt;br /&gt;
* '''layer''': (overlay|base|both, default=both) only change the specified layer.&lt;br /&gt;
* '''replace_if_failed''': (default=no) When replacing just one layer failed, try to replace the whole terrain. If '''terrain''' is an overlay only terrain, use the default_base as base layer. If the terrain has no default base, do nothing.&lt;br /&gt;
&lt;br /&gt;
If you want to remove the overlays from a terrain and leave only the base, use:&lt;br /&gt;
 layer=overlay&lt;br /&gt;
 terrain=&amp;quot;^&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; When a hex changes from a village terrain to a non-village terrain, and a team owned that village it loses that village. When a hex changes from a non-village terrain to a village terrain and there is a unit on that hex it does not automatically capture the village. The reason for not capturing villages is that there are too many choices to make; should a unit lose its movement points, should capture events be fired. It is easier to do this as wanted by the author in WML.&lt;br /&gt;
&lt;br /&gt;
=== [gold] ===&lt;br /&gt;
Gives sides gold.&lt;br /&gt;
* '''amount''': the amount of gold to give.&lt;br /&gt;
* '''side''': (default=1) the number of the side to give the gold to. Can be a comma-separated list of sides. note: Default side=1 for empty side= is deprecated.&lt;br /&gt;
* [[StandardSideFilter]] tags and keys; default for empty side= is all sides, as usual in a SSF.&lt;br /&gt;
&lt;br /&gt;
=== [unstore_unit] ===&lt;br /&gt;
Creates a unit from a game variable, and activates it on the playing field or recall list.  This must be a specific variable describing a unit, and may not be an array (if it is, only the first unit will be unstored).&lt;br /&gt;
&lt;br /&gt;
This may be useful in different contexts:&lt;br /&gt;
* To update a unit on the map after having edited its WML. This usage is common, but discouraged - if possible, you should use [[#.5Bmodify_unit.5B|[modify_unit]]] or [[#.5Bobject.5B|[object]]] instead.&lt;br /&gt;
* To place a previously-defined unit into the scenario, if it was directly defined in a WML variable, using [unit] with the key '''to_variable'''. This usage is rather uncommon.&lt;br /&gt;
* To place a unit back into the game that was removed earlier, for example a hero that leaves the party for awhile and then comes back.&lt;br /&gt;
&lt;br /&gt;
The variable is not cleared. To unstore units from an array variable, iterate over the array. See [[SyntaxWML]] and [[VariablesWML/How to use variables]] for more information about variable usage. See also [[InternalActionsWML#.5Bstore_unit.5D|[store_unit]]], [[ConditionalActionsWML|For]], [[ConditionalActionsWML#.5Bwhile.5D|[while]]] and [[InternalActionsWML#.5Bclear_variable.5D|[clear_variable]]].&lt;br /&gt;
&lt;br /&gt;
The tag takes the following keys:&lt;br /&gt;
* '''variable''': This is required to indicate the name of the variable to read the unit from.&lt;br /&gt;
* '''Placement keys''':&lt;br /&gt;
** '''x''' ,'''y''': By default, the unit will be placed at the location specified in the variable, but if these keys are present, the unit will be placed at that location instead. To place the unit on the recall list of its side, use '''x,y=recall,recall'''. (If you want to change the said, you need to first update ''$unit.side'' in the variable before unstoring.)&lt;br /&gt;
** '''location_id''': {{DevFeature1.15|0}} The name of a special map location to unstore to. Used instead of '''x,y'''.&lt;br /&gt;
** '''find_vacant''' (yes|no, default no): Whether the unit should be placed on the nearest vacant tile to its specified location. If this is set to 'no' (default), then any unit on the same tile as the unit being unstored will be destroyed.&lt;br /&gt;
** '''check_passability''' (yes|no, default yes): Only relevant if '''find_vacant=yes'''. In that case, this determines whether game will try to find a passable tile for the unit. If set to no, the unit may be placed on an impassable tile. Note that if both '''find_vacant''' and '''check_passability''' are set, then the unit's position may be shifted even if there is not a unit on the target space, if that space is not passable for the unit.&lt;br /&gt;
* '''Animation keys''' (these determine the visual effect of how the unit is placed or updated):&lt;br /&gt;
** '''text''': (translatable) A floating text to display above the unit, such as a damage amount.&lt;br /&gt;
** '''male_text''', '''female_text''': {{DevFeature1.13|2}} (translatable) gender-specific versions of the above&lt;br /&gt;
** '''red''', '''green''', '''blue''': (default=0,0,0) the color of the text. Values vary from 0-255. You may find it convenient to use the {COLOR_HARM} or {COLOR_HEAL} macro instead. (Use {COLOR_HARM} or {COLOR_HEAL} instead of the whole red,green,blue= line.)&lt;br /&gt;
** '''animate''': (boolean yes|no, default yes) Determines whether to play any animations associated with the unstore. Currently this only affects the advancement animation (&amp;quot;levelout&amp;quot; and &amp;quot;levelin&amp;quot;, defaulting to a fade to white and back) if the unit ends up advancing.&lt;br /&gt;
* '''Side-effect keys''' (these directly modify the behaviour of the action):&lt;br /&gt;
** '''advance''': (default=yes) if yes the unit is advanced if it has enough XP. When modifying XP, make sure to do it from inside a [[EventWML#Multiplayer_safety|synchronized event]] or it may lead to OOS errors, especially when several advancement paths exist. Note that advance and post advance events are called, so infinite loops can happen.&lt;br /&gt;
** '''fire_event''' (yes|no, default no): Whether any advance/post advance events shall be fired if an advancement takes place. This also affects whether the unit placed event is fired.&lt;br /&gt;
&lt;br /&gt;
Units can be unstored with negative (or zero) hit points. This can be useful if modifying a unit in its last_breath event (as the unit's death is already the next step), but tends to look wrong in other cases. In particular, it is possible to have units with negative hit points in play. Such units are aberrations, subject to unusual behavior as the game compensates for them. (For example, such units are currently automatically hit&amp;amp;ndash;and killed&amp;amp;ndash;in combat.) The details of the unusual behavior are subject to change between stable releases without warning.&lt;br /&gt;
&lt;br /&gt;
=== [allow_recruit] ===&lt;br /&gt;
Allows a side to recruit units it couldn't previously recruit.&lt;br /&gt;
* '''type''': the types of units that the side can now recruit.&lt;br /&gt;
* '''side''': (default=1) the number of the side that is being allowed to recruit the units. This can be a comma-separated list note: Default side=1 for empty side= is deprecated.&lt;br /&gt;
* [[StandardSideFilter]] tags and keys; default for empty side= is all sides, as usual in a SSF.&lt;br /&gt;
&lt;br /&gt;
=== [allow_extra_recruit] ===&lt;br /&gt;
Allows a leader to recruit units it couldn't previously recruit.&lt;br /&gt;
These types add to the types the leader can recruit because of [side]recruit=.&lt;br /&gt;
* '''extra_recruit''': the types of units that the unit can now recruit.&lt;br /&gt;
* '''[[StandardUnitFilter]]''': All units matching this filter are modified. Does not match on recall list units.&lt;br /&gt;
&lt;br /&gt;
=== [disallow_recruit] ===&lt;br /&gt;
Prevents a side from recruiting units it could previously recruit.&lt;br /&gt;
* '''type''': the types of units that the side can no longer recruit. {{DevFeature1.13|0}} If omitted, all recruits for matching sides will be disallowed.&lt;br /&gt;
* '''side''': (default=1) the number of the side that may no longer recruit the units. This can be a comma-separated list note: Default side=1 for empty side= is deprecated.&lt;br /&gt;
* [[StandardSideFilter]] tags and keys; default for empty side= is all sides, as usual in a SSF.&lt;br /&gt;
&lt;br /&gt;
=== [disallow_extra_recruit] ===&lt;br /&gt;
Prevents a leader from recruiting units it could previously recruit.&lt;br /&gt;
* '''extra_recruit''': the types of units that the side can no longer recruit.&lt;br /&gt;
* '''[[StandardUnitFilter]]''': All units matching this filter are modified. Does not match on recall list units.&lt;br /&gt;
&lt;br /&gt;
=== [set_recruit] ===&lt;br /&gt;
Sets the units a side can recruit.&lt;br /&gt;
* '''recruit''': the types of units that the side can now recruit.&lt;br /&gt;
* '''side''': The number of the side that is having its recruitment set. This can be a comma-separated list.&lt;br /&gt;
* [[StandardSideFilter]] tags and keys; default for empty side= is all sides, as usual in a SSF.&lt;br /&gt;
&lt;br /&gt;
=== [set_extra_recruit] === &lt;br /&gt;
Sets the units a leader can recruit.&lt;br /&gt;
* '''extra_recruit''': the types of units that the leader can now recruit.&lt;br /&gt;
* '''[[StandardUnitFilter]]''': All units matching this filter are modified. Does not match on recall list units.&lt;br /&gt;
&lt;br /&gt;
=== [modify_side] ===&lt;br /&gt;
Modifies some details of a given side in the middle of a scenario.  '''The following listed properties are the only properties that [modify_side] can affect!'''&lt;br /&gt;
* '''side''': (default=1) the number of the side that is to be changed. note: Default side=1 for empty side= is deprecated.&lt;br /&gt;
* '''[filter_side]''' with a [[StandardSideFilter]] as argument&lt;br /&gt;
* '''income''': the income given at the begining of each turn.&lt;br /&gt;
* '''recruit''': a list of unit types, replacing the side's current recruitment list.&lt;br /&gt;
* '''team_name''': the team in which the side plays the scenario.&lt;br /&gt;
* '''user_team_name''': a translatable string representing the team's description. This has no effect on alliances. Defaults to ''team_name''.&lt;br /&gt;
* '''side_name''': {{DevFeature1.13|?}} a translatable string representing the side leader's description.&lt;br /&gt;
* '''gold''': the amount of gold the side owns.&lt;br /&gt;
* '''village_gold''': the income setting per village for the side.&lt;br /&gt;
* '''controller''': the identifier string of the side's controller. Uses the same syntax of the ''controller'' key in the [[SideWML|[side]]] tag. warning: in multiplayer, changing the controller of a side might result in OOS during some events like, for example 'side_turn_end'; see [https://github.com/wesnoth/wesnoth/issues/2563 issue #2563].&lt;br /&gt;
* '''fog''': a boolean string (yes/no) describing the status of Fog for the side.&lt;br /&gt;
* '''shroud''': a boolean string describing the status of Shroud for the side.&lt;br /&gt;
* '''hidden''': a boolean string specifying whether side is shown in status table.&lt;br /&gt;
* '''color''': a team color range specification, name (e.g. &amp;quot;red&amp;quot;, &amp;quot;blue&amp;quot;), or number (e.g. &amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;) for this side. The default color range names, numbers, and definitions can be found in data/core/team_colors.cfg.&lt;br /&gt;
* '''[ai]''': sets/changes AI parameters for the side. Only parameters that are specified in the tag are changed, this does not reset others to their default values. Uses the same syntax as described in [[AiWML]].  Note that [modify_side][ai] works for all simple AI parameters and some, but not all, of the composite ones. If in doubt, use [http://wiki.wesnoth.org/AiWML#Adding_and_Deleting_Aspects_with_the_.5Bmodify_ai.5D_Tag [modify_ai]] instead, which always works. {{DevFeature1.13|?}} If this contains an '''ai_algorithm''', the AI parameters will be reset to those of the indicated AI before adding any additional parameters included in the tag. In other words, this allows replacing the AI config rather than appending to it.&lt;br /&gt;
* '''switch_ai''': replaces a side ai with a new AI from specified file(ignoring those AI parameters above). Path to file follows the usual WML convention.&lt;br /&gt;
* '''reset_maps''': If set to &amp;quot;yes&amp;quot;, then the shroud is spread to all hexes, covering the parts of the map that had already been explored by the side, including hexes currently seen. (Seen hexes will be cleared at the end of most events; they can also be manually cleared with {{tag|InterfaceActionsWML|redraw}}.) This is only effective if shroud is on, but this is evaluated after shroud= (and before shroud_data=).&lt;br /&gt;
* '''reset_view''': If set to &amp;quot;yes&amp;quot;, then the fog of war is spread to all hexes, covering the parts of the map that had already been seen this turn by the side, including hexes currently seen, excluding hexes affected by multi-turn {{tag|DirectActionsWML|lift_fog}}. (Seen hexes will be cleared at the end of most events; they can also be manually cleared with {{tag|InterfaceActionsWML|redraw}}.) This is only effective if fog is on, but this is evaluated after fog=.&lt;br /&gt;
* '''share_maps''': change the share_maps side attribute. Be sure to use shroud=yes for that side and have it as an ally&lt;br /&gt;
* '''share_view''': change the share_view side attribute. Be sure to use fog=yes for that side and have it as an ally&lt;br /&gt;
* '''share_vision''': change both the above at the same time&lt;br /&gt;
* '''shroud_data''': changes to the side's shroud, using the same format as when defining the [side].&lt;br /&gt;
* '''suppress_end_turn_confirmation''': Boolean value controlling whether or not a player is asked for confirmation when skipping a turn.&lt;br /&gt;
* '''scroll_to_leader''': Boolean value controlling whether or not the game view scrolls to the side leader at the start of their turn when present.&lt;br /&gt;
* '''flag''': Flag animation for villages owned by this side (see [[SideWML|[side]]]).&lt;br /&gt;
* '''flag_icon''': Flag icon used for this side in the status bar (see [[SideWML|[side]]]).&lt;br /&gt;
* '''village_support''': The number of unit levels this side is able to support (does not pay upkeep on) per village it controls.&lt;br /&gt;
* '''defeat_condition''' {{DevFeature1.13|0}}: When the side is considered defeated (see [[SideWML|[side]]]).&lt;br /&gt;
* '''[set_variable]''', '''[clear_variable]''' {{DevFeature1.15|3}} Sets or clears a variable within the side; uses the same syntax as [[InternalActionsWML#.5Bset_variable.5D|[set_variable]]] or [[InternalActionsWML#.5Bclear_variable.5D|[clear_variable]]] in ActionWML.&lt;br /&gt;
* '''[variables]''' {{DevFeature1.15|3}} The contents of this tag is merged into the side's variables.&lt;br /&gt;
&lt;br /&gt;
=== [modify_turns] ===&lt;br /&gt;
Modifies the turn limit in the middle of a scenario.&lt;br /&gt;
* '''value''': the new turn limit.&lt;br /&gt;
* '''add''': if used instead of ''value'', specifies the number of turns to add to the current limit (can be negative).&lt;br /&gt;
* '''current''': changes the current turn number after applying turn limit modifications, if any. It is not possible to change the turn number to exceed the turn limit (1 &amp;lt;= current turns &amp;lt;= max turns).&lt;br /&gt;
&lt;br /&gt;
=== [allow_end_turn] ===&lt;br /&gt;
Allows human players to end their turn through the user interface if they were previously affected by the '''[disallow_end_turn]''' action. This action doesn't take any arguments.&lt;br /&gt;
&lt;br /&gt;
=== [disallow_end_turn] ===&lt;br /&gt;
Disallows human players to end their turn through the user interface. This action doesn't require arguments.&lt;br /&gt;
* '''reason''' (translatable): {{DevFeature1.15|0}} Allows to optionally specify a reason.&lt;br /&gt;
&lt;br /&gt;
=== [capture_village] ===&lt;br /&gt;
Changes the ownership of a village.&lt;br /&gt;
* [[StandardLocationFilter]]: all village locations matching the filter are affected.&lt;br /&gt;
* '''side''': the side that takes control of the village. This side needs to have a leader (canrecruit=yes). If the side key is not given, the village will become neutral (unless [filter_side] is present, in which case that side fiter decides, see below).&lt;br /&gt;
* '''[filter_side]''' with [[StandardSideFilter]] tags and keys as arguments; if both this tag and inline side= are present it's an error. Otherwise, the first matching side gets ownership (or the village becomes neutral if none match).&lt;br /&gt;
* '''fire_event''' (boolean yes|no, default: no): Whether any capture events shall be fired.&lt;br /&gt;
&lt;br /&gt;
=== [kill] ===&lt;br /&gt;
Removes all units (including units in a recall list) that match the filter from the game.&lt;br /&gt;
* [[StandardUnitFilter]]: Selection criterion; do not use a [filter] tag.&lt;br /&gt;
* '''animate''' (default 'no'): if 'yes', displays the unit dying (fading away). {{DevFeature1.13|8}} If '''[secondary_unit]''' is given, also plays the victory animation of that unit.&lt;br /&gt;
* '''fire_event''' (default 'no'): if 'yes', triggers any appropriate 'die' events (See [[EventWML]]). Note that events are only fired for killed units that have been on the map (as opposed to recall list).&lt;br /&gt;
* '''[secondary_unit]''' with a [[StandardUnitFilter]] as argument. Do not use a [filter] tag. Has an effect only if fire_event=yes ({{DevFeature1.13|8}} or if it has a victory animation and animate=yes). The first on-map unit matching the filter becomes second_unit in any fired die and last breath events. If an on-map unit matches and if there are several units killed with a single [kill] tag, second_unit is this same unit for all of them. If no on-map unit matches or [secondary_unit] isn't present, the variable second_unit in each of the die and last breath events is always the same as the variable unit (the dying unit).&lt;br /&gt;
* '''[primary_attack]''', '''[secondary_attack]''' {{DevFeature1.13|8}} The attacks to use for matching the animation. Useful for example on the wose, whose death animation depends on the damage type it was killed by.&lt;br /&gt;
&lt;br /&gt;
=== [move_unit] ===&lt;br /&gt;
Moves a unit along a path on the map. The path can be specified exactly, or as a series of waypoints that the unit will pass through.&lt;br /&gt;
* [[StandardUnitFilter]] as argument; do not use a [filter] tag. All units matching the filter are moved. If the target location is occupied, the nearest free location is chosen.&lt;br /&gt;
* '''to_x''' (unsigned integer): The units are moved to this x coordinate. Can be a comma-separated list, in which case the unit follows this given path during the move.&lt;br /&gt;
* '''to_y''' (unsigned integer): The units are moved to this y coordinate. Can be a comma-separated list.&lt;br /&gt;
* '''dir''' (string): {{DevFeature1.15|0}} Performs a relative movement instead of an absolute movement. For example, dir=n,n,nw will move two spaces north and then one space to the northwest. This is used instead of '''to_x''' and '''to_y'''.&lt;br /&gt;
* '''to_location''': {{DevFeature1.15|0}} Moves matching units to locations placed in the map editor with the &amp;quot;New Location&amp;quot; button. Can be a comma-separated list. This is used instead of '''to_x''' and '''to_y'''.&lt;br /&gt;
* '''check_passability''' (boolean yes|no, default yes): Whether the terrain the unit is moved to should be checked for suiting the unit. (If it does not, a nearby suitable hex is chosen.)&lt;br /&gt;
* '''force_scroll''': Whether to scroll the map or not even when [[InterfaceActionsWML#.5Block_view.5D|[lock_view]]] is in effect or ''Follow Unit Actions'' is disabled in ''Advanced Preferences''. Defaults to using [[InterfaceActionsWML#.5Bmove_unit_fake.5D|[move_unit_fake]]]'s default value.&lt;br /&gt;
* '''clear_shroud''': {{DevFeature1.15|0}} (boolean yes|no, default no) Whether to remove shroud and fog after the unit was moved, but before events are fired. It will not clear all alongside the path, only around the target destination.&lt;br /&gt;
* '''fire_event''' (boolean yes|no, default no): Whether any according moveto events shall be fired. The target location ($x1, $y1 in the event) may not be the same location that the unit was tried to be moved to, if the original target location is occupied or impassable.&lt;br /&gt;
&lt;br /&gt;
=== [modify_ai] ===&lt;br /&gt;
Changes AI objects (aspects, goals, candidate actions or stages) for a specified side. See [[Modifying_AI_Components#The_.5Bmodify_ai.5D_Tag|Modifying AI Components]] for full description.&lt;br /&gt;
&lt;br /&gt;
* '''action''' (string): Takes values 'add', 'change', 'delete' or 'try_delete' to do just that for the AI object.&lt;br /&gt;
* '''path''' (string): Describes which AI object is to be modified.  &lt;br /&gt;
* '''[facet]''', '''[goal]''', '''[candidate_action]''' or '''[stage]''': Details about the AI object to be modified.&lt;br /&gt;
* [[StandardSideFilter]] tags and keys; default for empty side= is all sides, as usual in a SSF.&lt;br /&gt;
&lt;br /&gt;
=== [modify_unit] ===&lt;br /&gt;
works similar to the MODIFY_UNIT macro.&lt;br /&gt;
* '''[filter]''' with a [[StandardUnitFilter]] as argument. All units matching this filter are modified. Matches on recall list units too.&lt;br /&gt;
* '''[object]''', '''[trait]''', {{DevFeature1.13|5}} '''[advancement]''' - The given modifications will be immediately applied to all units matching the filter. ([object] is described further below)&lt;br /&gt;
** '''delayed_variable_substitution''' {{DevFeature1.13|5}} (boolean yes|no, default no): If set to &amp;quot;yes&amp;quot;, the wml block contained in this [object], [trait], or [advancement] is not variable-substituted at execution time of the event containing this [modify_unit]. You need this for any effect that uses variable substitution or when using [effect][filter] with a $this_unit. {{DevFeature1.13|9}} This is no longer needed when adding ABILITY_TELEPORT, ABILITY_LEADERSHIP or SPECIAL_BACKSTAB.&lt;br /&gt;
** Do not use a '''[modifications]''' tag, as this may skip some of the special-case handling for newly added objects, traits and advancements.&lt;br /&gt;
* '''[effect]''' {{DevFeature1.13|6}} Applies the effect directly to the unit. See [[EffectWML]].&lt;br /&gt;
* '''[set_variable]''', '''[clear_variable]''' {{DevFeature1.15|3}} Sets or clears a variable within the unit; uses the same syntax as [[InternalActionsWML#.5Bset_variable.5D|[set_variable]]] or [[InternalActionsWML#.5Bclear_variable.5D|[clear_variable]]] in ActionWML.&lt;br /&gt;
* Accepts generally the syntax inside of wml unit variables created by [store_unit] which can be viewed in a savefile or by using the [[CommandMode|inspect command]]. Cannot remove things or add/alter unit animations. Subtags with the same name must be written in the correct order to match them with the tag they are supposed to modify. Note that keys will be processed in arbitrary order, which may cause problems if you use formulas that depend on other formulas. To work around this you may need to use the tag twice with the same filter.&lt;br /&gt;
example usage (see also the test scenario):&lt;br /&gt;
&amp;lt;syntaxhighlight lang='wml'&amp;gt;&lt;br /&gt;
[modify_unit]&lt;br /&gt;
  [filter]&lt;br /&gt;
    x,y=38,6&lt;br /&gt;
  [/filter]&lt;br /&gt;
  hitpoints=10&lt;br /&gt;
  {TRAIT_HEALTHY}&lt;br /&gt;
[/modify_unit]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The unit which is currently modified is accessible via $this_unit, e.g. hitpoints = &amp;quot;$($this_unit.hitpoints / 2)&amp;quot; to set the hitpoints of all units to half of their particular maxima. This this_unit variable is independent from the this_unit variable available in the SUF used to determine which units to modify (first all matching units are gathered, and then all those are modified).&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Some some properties of the units are reset sometimes (for example when the unit advances or when [remove_object] is called), so it's usually better to change them with [object] ([object] inside [modify_unit]) than to change those properties directly via [modify_unit]. The following properties are _not_ reset in [remove_object] and are thus safe to use directly in [modify_unit]:&lt;br /&gt;
* '''side'''&lt;br /&gt;
* '''gender'''&lt;br /&gt;
* '''name'''&lt;br /&gt;
* '''canrecruit'''&lt;br /&gt;
* '''unrenamable'''&lt;br /&gt;
* '''extra_recruit'''&lt;br /&gt;
* '''[variables]'''&lt;br /&gt;
* '''facing'''&lt;br /&gt;
* '''goto_x, goto_y'''&lt;br /&gt;
* '''hitpoints'''&lt;br /&gt;
* '''experience'''&lt;br /&gt;
* '''moves'''&lt;br /&gt;
* '''[status]''' (not sure on this one)&lt;br /&gt;
* '''attacks_left'''&lt;br /&gt;
* '''role'''&lt;br /&gt;
&lt;br /&gt;
=== [transform_unit] ===&lt;br /&gt;
Transforms every unit on the map matching the filter to the given unit type. Keeps intact hit points, experience and status. If the unit is transformed to a non-living type (undead or mechanical), it will be also unpoisoned. Hit points will be changed if necessary to respect the transformed unit's maximum hit points.&lt;br /&gt;
* [[StandardUnitFilter]]: do not use a [filter] tag.&lt;br /&gt;
* '''transform_to''': the unit type in which all the units matching the filter will be transformed. If missing, the units will follow their normal advancement.&lt;br /&gt;
&lt;br /&gt;
=== [petrify] ===&lt;br /&gt;
&lt;br /&gt;
* [[StandardUnitFilter]] as an argument. Do not use a [filter] tag. All units matching this filter are petrified. Recall list units are included.&lt;br /&gt;
&lt;br /&gt;
=== [unpetrify] ===&lt;br /&gt;
* [[StandardUnitFilter]] as an argument. Do not use a [filter] tag. All units matching this filter are unpetrified. Recall list units are included.&lt;br /&gt;
&lt;br /&gt;
=== [object] ===&lt;br /&gt;
Gives some unit an object which modifies their stats in some way.&lt;br /&gt;
* '''id''': (Optional) allows the item to be removed later. By default, an object with a defined ID can only be picked up once per scenario, even if it is removed later or first_time_only=no is set for the event. You can remove this restriction by setting take_only_once=no. For filtering objects, it might be simpler to use a custom key such as item_id. The id string can contain only letters, numbers and underscores.&lt;br /&gt;
* '''take_only_once''': (default yes) {{DevFeature1.13|6}} If set to &amp;quot;no&amp;quot;, the object's ID does not prevent it from being taken more than once.&lt;br /&gt;
* '''delayed_variable_substitution''' (boolean yes|no, default no): If set to &amp;quot;yes&amp;quot;, the wml block contained in this [object] is not variable-substituted at execution time of the event where this [object] is within.  You need this for any effect that uses variable substitution or when using [effect][filter] with a $this_unit. {{DevFeature1.13|9}} This is no longer needed when adding ABILITY_TELEPORT, ABILITY_LEADERSHIP or SPECIAL_BACKSTAB.&lt;br /&gt;
* '''[effect]''': one or more effect elements may be listed.  See [[EffectWML]] for a description of [effect].&lt;br /&gt;
* '''duration''':&lt;br /&gt;
**if 'scenario', effects only last until the end of the scenario.&lt;br /&gt;
**if 'forever' or not set, effects never wear off.&lt;br /&gt;
** if 'turn', effects only last until the start of the unit's next turn (when the unit refreshes movement and attacks). (Like other start-of-turn behavior, objects with a duration of &amp;quot;turn&amp;quot; won't expire before turn 2.)&lt;br /&gt;
** {{DevFeature1.13|1}} if 'turn end' or 'turn_end', effects only last until the end of the unit's next turn (exactly like the slowed status).&lt;br /&gt;
* '''[filter]''' with a [[StandardUnitFilter]] as argument. The first unit found that matches the filter will be given the object. Only on-map units are considered. If no unit matches or no [filter] is supplied, it is tried to apply the object to the unit at the $x1,$y1 location of the event where this [object] is in. The case of no unit being at that spot is handled in the same way as no unit matching a given filter ([else] commands executed, cannot_use_message displayed). Note that units on the recall list will not be checked. To add an [object] to a unit on the recall list you have to use '''[modify_unit][object]'''.&lt;br /&gt;
* '''[then]''': a subtag that lets you execute actions if the filter conditions are met.  The most common action that should be inside here is a '''[remove_item]''' tag, but you could probably put any tags that otherwise work in a [then] tag.&lt;br /&gt;
* '''[else]''': a subtag that lets you execute actions if the filter conditions are *not* met.&lt;br /&gt;
* '''silent''': whether or not messages should be suppressed. Default is &amp;quot;no&amp;quot;. {{DevFeature1.13|2}} If no description is provided, this defaults to yes, but can still be overridden.&lt;br /&gt;
* '''image''': the displayed image of the object.&lt;br /&gt;
* '''name''': (translatable) displayed as a caption of the image.&lt;br /&gt;
&lt;br /&gt;
* '''description''': (translatable) displayed as a message of the image.&lt;br /&gt;
* '''cannot_use_message''': (translatable) displayed instead of '''description''' if no unit passes the filter test.&lt;br /&gt;
&lt;br /&gt;
=== [remove_object] ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|6}}&lt;br /&gt;
&lt;br /&gt;
Removes an object from matching units.&lt;br /&gt;
&lt;br /&gt;
* [[StandardUnitFilter]]: All units matching the filter have matching objects removed. Use no [filter] tag.&lt;br /&gt;
* '''object_id''': The id of the object to be removed.&lt;br /&gt;
&lt;br /&gt;
Note that some unit properties are not restored ideally, e.g. current unit's health reversion might not work as expected (max_hitpoints will though). {{DevFeature1.15|0}} This was fixed.&lt;br /&gt;
&lt;br /&gt;
Note that remove_object worked the following way: Step1) remove thos objects from the unit wml, Step2) Rebuild the unit to make the changes effective. Step2 implies that changes done for example via [modify_unit] (or via the [store_unit] + [set_variable] + [unstore_unit] technique) will be reset if those changes change a property that is a property of the unit type. See the note under [modify_unit] to get a list of properties that can safely be changes via [modify_unit]&lt;br /&gt;
&lt;br /&gt;
=== [remove_shroud] ===&lt;br /&gt;
Removes some shroud from the map for a certain side (only relevant for sides that have shroud=yes).&lt;br /&gt;
* '''side''': (default=1) the side for which to remove shroud. This can be a comma-separated list of sides. note: Default side=1 for empty side= is deprecated.&lt;br /&gt;
* '''[filter_side]''' with a [[StandardSideFilter]] as argument&lt;br /&gt;
* [[StandardLocationFilter]]: the range of tiles for which shroud should be removed&lt;br /&gt;
&lt;br /&gt;
=== [place_shroud] ===&lt;br /&gt;
Places some shroud on the map for a certain side (only relevant for sides that have shroud=yes).&lt;br /&gt;
* '''side''': (default=1) the side for which to place shroud. This can be a comma-separated list. note: Default side=1 for empty side= is deprecated.&lt;br /&gt;
* '''[filter_side]''' with a [[StandardSideFilter]] as argument&lt;br /&gt;
* [[StandardLocationFilter]]: the range of tiles on which shroud should be placed&lt;br /&gt;
&lt;br /&gt;
=== [lift_fog] ===&lt;br /&gt;
Lifts the fog of war from parts of the map for a certain side (only relevant for sides that have fog=yes), allowing a player to witness what occurs there even if that player has no units within vision range.&lt;br /&gt;
* '''[filter_side]''' with a [[StandardSideFilter]] indicating which sides should be affected.&lt;br /&gt;
* [[StandardLocationFilter]]: the tiles from which fog should be lifted.&lt;br /&gt;
* '''multiturn''': ''yes/no, default:no''. The default (not multiturn) causes fog to be removed in the same way that normal vision works; the cleared tiles will remain cleared until fog is recalculated (which normally happens when a side ends its turn). When multiturn is set to &amp;quot;yes&amp;quot;, the cleared tiles remain clear until {{tag||reset_fog}} cancels the clearing. This allows tiles to remain clear for multiple turns, or to be refogged before the end of the current turn (without also refogging all tiles). Multiturn lifted fog is not shared with allies (even when share_vision=all).&lt;br /&gt;
&lt;br /&gt;
=== [reset_fog] ===&lt;br /&gt;
The primary use of this tag is to remove multiturn lifted fog (created by {{tag||lift_fog}}), which causes the fog to reset to what it would have been had WML not interfered. (That is, hexes that a side's units could not see at any point this turn will be re-fogged, while seen hexes remain defogged.)&lt;br /&gt;
* '''[filter_side]''' with a [[StandardSideFilter]] indicating which sides should be affected.&lt;br /&gt;
* [[StandardLocationFilter]]: the fog reset will be restricted to these tiles.&lt;br /&gt;
* '''reset_view''': ''yes/no, default: no'' If set to &amp;quot;yes&amp;quot;, then in addition to removing multiturn fog, the side's current view is canceled (independent of the SLF). This means that all hexes will become fogged for the side unless multiturn fog exists outside the tiles selected by the SLF. Normally, one would want the currently seen hexes to become clear of fog; this is done automatically at the end of many events, and it can be done manually with {{tag|InterfaceActionsWML|redraw}}.&lt;br /&gt;
Omitting both the SSF and the SLF would cancel all earlier uses of [lift_fog].&lt;br /&gt;
Additionally setting reset_view=&amp;quot;yes&amp;quot; would cause the side's entire map to be fogged (unless an ally keeps hexes clear by sharing its view).&lt;br /&gt;
&lt;br /&gt;
=== [allow_undo] ===&lt;br /&gt;
Normally when an event with a handler fires, the player's undo stack is cleared, preventing all actions performed so far from being undone. Including this tag in the event handler prevents the stack from being cleared for this reason, allowing the player to undo actions. (However, the stack might still be cleared for other reasons, such as fog being cleared or combat occurring.) In the common cases, this means '''[allow_undo]''' allows the current action to be undone even though an event was handled. There is a less common case, though &amp;amp;mdash; specifically when handling a menu item, where there is no current action &amp;amp;mdash; and in this case, '''[allow_undo]''' means merely that earlier actions can still be undone.&lt;br /&gt;
* Using this tag in a menu item has an additional side effect in 1.11. Starting with version 1.11.1, executing a WML menu item normally counts as doing something as far as the &amp;quot;you have not started your turn yet&amp;quot; dialog is concerned. However, a menu item whose handler includes '''[allow_undo]''' will not count.&lt;br /&gt;
&lt;br /&gt;
The types of actions that can be undone are movement, recalling, and dismissing a unit from the recall list. If an action is undone, only the position (or existence) of the involved unit will be restored; any altered variables or changes to the game will remain changed after the action is undone.  It is up to the scenario designer to avoid abusing this command.&lt;br /&gt;
* Technically, if '''[allow_undo]''' is inside an '''[event]''' with ''first_time_only=yes'' (the default setting), and the user undoes the event, then the state of the game has changed in this way: the event will not fire a second time, even though the user undid the action the first time.&lt;br /&gt;
* Although recalling can be undone, recruitment can not be undone; this seems to apply even when the recruit's traits are not randomly-generated (tested on 1.12.6 and 1.14.4+dev).&lt;br /&gt;
&lt;br /&gt;
If an '''[event]''' uses both '''[allow_undo]''' and [[InternalActionsWML#.5Bfire_event.5D|'''[fire_event]''']] then the '''[allow_undo]''' must be after the '''[fire_event]'''.&lt;br /&gt;
&lt;br /&gt;
Due to a bug in 1.12 (https://gna.org/bugs/?23323) '''[allow_undo]''' should not be used in events that use one of the following things because it might cause OOS: &lt;br /&gt;
* [message] with [option]s&lt;br /&gt;
* [get_global_variable]&lt;br /&gt;
* wesnoth.synchronize_choice&lt;br /&gt;
&lt;br /&gt;
While in 1.13 using '''[allow_undo]''' together with those things won't give you a guaranteed OOS, there are some non-obvious situations where it will, for example assume the following event:&lt;br /&gt;
&lt;br /&gt;
   [event]&lt;br /&gt;
     name=&amp;quot;moveto&amp;quot;&lt;br /&gt;
     [message]&lt;br /&gt;
       message = &amp;quot;message&amp;quot;&lt;br /&gt;
       [option]&lt;br /&gt;
         label = &amp;quot;option 1&amp;quot;&lt;br /&gt;
         [command]&lt;br /&gt;
         [/command]&lt;br /&gt;
       [/option]&lt;br /&gt;
       [option]&lt;br /&gt;
         label = &amp;quot;option 2&amp;quot;&lt;br /&gt;
         [command]&lt;br /&gt;
         [/command]&lt;br /&gt;
       [/option]&lt;br /&gt;
     [/message]&lt;br /&gt;
     [allow_undo]&lt;br /&gt;
     [/allow_undo]&lt;br /&gt;
   [/event]&lt;br /&gt;
&lt;br /&gt;
It will cause OOS when the message is undone: since the event is already executed (erased) on one client only , the clients will disagree about how many choices happen during the next moveto action.&lt;br /&gt;
&lt;br /&gt;
=== [on_undo] ===&lt;br /&gt;
{{DevFeature1.13|2}}&lt;br /&gt;
Contains commands to execute when the player undoes the action which triggered the parent event.&lt;br /&gt;
*'''delayed_variable_substitution''' {{DevFeature1.13|5}}: ''yes/no, default no (always no before 1.13.5)'' As in [[EventWML]], specifies whether to perform variable substitution when the parent event is run, or when the contents are run. If delayed substitution is used, [[SyntaxWML#Automatically_Stored_Variables|automatically stored variables]] from the parent event context are available, but may occasionally have unexpected values. (In particular, $unit.x and $unit.y may not have the expected value when undoing a move event, though $x1 and $y1 should be correct.)&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
It is not clear where whether the actionwml in [on_undo] in executed before or after the action is undone. Also, specially for enter/leave_hex events the units position when executing the [on_undo] code is usually different than when executing the original event. The recommended way to work around these issues is to refer to the unit by id instead of position and store all other needed information variables as 'upvalues'. You can also move the actual undo code to an external event. For example&lt;br /&gt;
 [event]&lt;br /&gt;
   name=&amp;quot;undo_blah&amp;quot;&lt;br /&gt;
   first_time_only=no&lt;br /&gt;
   [store_unit]&lt;br /&gt;
     id=&amp;quot;$moved_unit_id&amp;quot;&lt;br /&gt;
   [/store_unit]&lt;br /&gt;
   ... do undo stuff stuff&lt;br /&gt;
 [/event]&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 ... in some other event&lt;br /&gt;
   [on_undo]&lt;br /&gt;
     # store ''upvalues&lt;br /&gt;
     {VARIABLE moved_unit_id $unit.id}&lt;br /&gt;
     # call actual undo handler&lt;br /&gt;
     [fire_event]&lt;br /&gt;
       name = &amp;quot;undo_blah&amp;quot;&lt;br /&gt;
     [/fire_event]&lt;br /&gt;
   [on_undo]&lt;br /&gt;
&lt;br /&gt;
=== [on_redo] ===&lt;br /&gt;
{{DevFeature1.13|2}}&lt;br /&gt;
Same as [on_undo], except executes the commands on redo. Note that the parent event is not triggered again on a redo.&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|8}} [on_redo] is deprecated and has no effect anymore.&lt;br /&gt;
&lt;br /&gt;
Note that [on_redo] is not guaranteed to be called when redoing an action, the engine might also decide to just fire the original events again.&lt;br /&gt;
&lt;br /&gt;
=== [cancel_action] ===&lt;br /&gt;
Although Wesnoth 1.12 does not have this tag, it is the default behavior of {{tag|EventWML|enter_hex}}/{{tag|EventWML|leave_hex}} events in that version.&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|9}} In this version, [cancel_action] is recognised, but has no effect (a bug).&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|11}}&lt;br /&gt;
In an {{tag|EventWML|enter_hex}}/{{tag|EventWML|leave_hex}} event, interrupt the movement, leaving the unit where it is. This is intended to be used with an event that gives the player new information, to let the player choose whether to change their plans. For example, if the player has commanded a unit to move from (1,1) to (3,3) and attack a unit on (4,4); then a [cancel_action] inside an [enter_hex] event on (2,2) would make the unit stop on (2,2). A [cancel_action] inside an [enter_hex] on (3,3) would let the player choose whether to attack.&lt;br /&gt;
&lt;br /&gt;
=== [heal_unit] ===&lt;br /&gt;
Heal a unit. The variable '''$heal_amount''' will be set to the exact number of points healed (i.e can be less than the parameter '''amount''' if the unit is fully healed). $heal_amount contains only the number of hitpoints the first unit that was found got healed. When the variable is not needed, use {CLEAR_VARIABLE heal_amount} after this tag.&lt;br /&gt;
*  '''[filter]''': [[StandardUnitFilter]] All matching on-map units are healed. If no filter is supplied, it is tried to take the unit at $x1, $y1.&lt;br /&gt;
*  '''[filter_second]''': [[StandardUnitFilter]] all the units matching the filter ''and'' having the ''heals'' ability will have their animation played (if ''animate'' is set to yes) for each of the units healed.&lt;br /&gt;
*  '''amount''': (integer, default full) the maximum points the unit(s) will be healed. This can't be used to set the unit's hitpoints below 1 or above the unit's maximum hitpoints. If &amp;quot;full&amp;quot;, it fully heals the unit.&lt;br /&gt;
*  '''animate''': a boolean which indicate if the healing animations must be played. (default no)&lt;br /&gt;
*  '''moves''': (integer, default 0) The maximum current movement points the units will be &amp;quot;healed&amp;quot;. Can't set below 0 or above max_moves. If &amp;quot;full&amp;quot;, sets moves to max_moves.&lt;br /&gt;
* '''restore_attacks''': (boolean, default no) Whether the units' attacks_left should be reset to their max_attacks (usually 1).&lt;br /&gt;
* '''restore_statuses''': (boolean, default yes) Whether standard statuses should be reset to &amp;quot;no&amp;quot;. This affects poisoned, slowed, petrified and unhealable.&lt;br /&gt;
&lt;br /&gt;
=== [harm_unit] ===&lt;br /&gt;
Harms every unit matching the filter, for the specific damage amount.&lt;br /&gt;
*  '''[filter]''': [[StandardUnitFilter]] all matching units will be harmed (required).&lt;br /&gt;
*  '''[filter_second]''': [[StandardUnitFilter]] if present, the first matching unit will attack all the units matching the filter above.&lt;br /&gt;
*  '''amount''': the amount of damage that will be done (required).&lt;br /&gt;
*  '''alignment''': (default neutral) applies an alignment to the damage, this means that if alignment=chaotic, the damage will be increased at night and reduced at day.&lt;br /&gt;
*  '''damage_type''': if present, amount will be altered by unit resistance to the damage type specified.&lt;br /&gt;
*  '''kill''': (default yes) if yes, when a harmed unit goes to or below 0 HP, it is killed; if no its HP are set to 1.&lt;br /&gt;
*  '''fire_event''': (default no) if yes, when a unit is killed by harming, the corresponding events are fired.  If yes, also the corresponding advance and post advance events are fired.&lt;br /&gt;
*  '''animate''': (default no) if yes, scrolls to each unit before harming it and plays its defense (or attack, if it's the harmer) and death animations. Special values supported, other than the usual yes and no, are &amp;quot;attacker&amp;quot;, that means only the harmer will be animated, and &amp;quot;defender&amp;quot;, that means only the harmed units will be animated. If the supplied value is yes, attacker or defender also advancement animations are played.&lt;br /&gt;
*  '''[primary_attack], [secondary_attack]''': these set the weapon against which the harmed units will defend, and that the harming unit will use to attack, respectively (notice this is the opposite of '''[filter]''' and '''[filter_second]''' above). This allows for playing specific defense and attack animations. Both tags are expected to contain a [[FilterWML#Filtering_Weapons|Standard Weapon Filter]].&lt;br /&gt;
*  '''delay''': if animate=yes, sets the delay (in milliseconds, default 500) between each unit harming.&lt;br /&gt;
*  '''variable''': if present, the damage caused to the unit, altered by resistances, will be stored in a WML array with the given name, under the &amp;quot;harm_amount&amp;quot; key.&lt;br /&gt;
*  '''poisoned, slowed, petrified, unhealable''': (default no) if yes, every harmed unit that doesn't already have such status will have it set.&lt;br /&gt;
*  '''experience''': if yes, and there is a harmer, experience will be attributed like in regular combat.&lt;br /&gt;
*  '''resistance_multiplier''': the harmed unit's resistance is multiplied by the supplied value; this means that a value lower than 1 increases it, and a value greater than 1 decreases it. Default value is 1, that means no modification.&lt;br /&gt;
&lt;br /&gt;
=== [time_area] ===&lt;br /&gt;
How a day should progress in a given area. Everywhere not specified in a [time_area] tag is affected by the [time] tags in the [scenario] tag.&lt;br /&gt;
* [[StandardLocationFilter]]: the locations to affect. ''note: only for [event][time_area]s - at scenario toplevel [time_area] does not support [[StandardLocationFilter]], only location ranges''&lt;br /&gt;
* '''[time]''': one or more tags describing the new schedule, see [[TimeWML]].&lt;br /&gt;
* '''id''': an unique identifier assigned to a time_area. Optional, unless you want to remove the time_area later or reference it from a location filter elsewhere. Can be a comma-separated list when removing time_areas, see below.&lt;br /&gt;
* '''remove''': (boolean) yes/no value. Indicates whether the specified time_area should be removed. Requires an identifier. If no identifier is used, however, all time_areas are removed.&lt;br /&gt;
* '''current_time''': The time slot number (starting with zero) active at the creation of the area.&lt;br /&gt;
&lt;br /&gt;
''Example:'' (caves in parts of a map)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=wml&amp;gt;&lt;br /&gt;
[time_area]&lt;br /&gt;
    id = cave_area&lt;br /&gt;
    x = 1-2,4-5&lt;br /&gt;
    y = 1-2,1-2&lt;br /&gt;
    {UNDERGROUND}&lt;br /&gt;
[/time_area]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Specifying an id allows the area to be referenced from location filters. Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=wml&amp;gt;&lt;br /&gt;
    [time_area]&lt;br /&gt;
        id = glyphs&lt;br /&gt;
        x = 9,14&lt;br /&gt;
        y = 11,3&lt;br /&gt;
    [/time_area]&lt;br /&gt;
    [event]&lt;br /&gt;
        name = moveto&lt;br /&gt;
        first_time_only=no&lt;br /&gt;
        [filter]&lt;br /&gt;
            side = 1&lt;br /&gt;
            [filter_location]&lt;br /&gt;
                area = glyphs&lt;br /&gt;
            [/filter_location]&lt;br /&gt;
        [/filter]&lt;br /&gt;
        # Do something, for example healing the unit&lt;br /&gt;
    [/event]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [remove_time_area] ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|2}}&lt;br /&gt;
&lt;br /&gt;
This is a syntactic shortcut for [time_area] remove=.&lt;br /&gt;
* '''id''': Comma-separated list of time area ids to remove.&lt;br /&gt;
&lt;br /&gt;
=== [end_turn] ===&lt;br /&gt;
End the current side's turn. The current event is finished before the turn is ended. Also, if the current event (where the tag appears) has been fired by another event, that event (and the complete stack of other possible parent events) is ended before [end_turn] comes into affect. Also, events following the event stack that fired [end_turn] are not omitted (e.g. [end_turn] is used by a side turn event and a turn refresh event does something afterwards).&lt;br /&gt;
&lt;br /&gt;
=== [replace_map] ===&lt;br /&gt;
&lt;br /&gt;
Replaces the entire map.&lt;br /&gt;
* '''map''': Content of a wesnoth map file. Example:&lt;br /&gt;
 map=&amp;quot;{campaigns/Heir_To_The_Throne/maps/01_The_Elves_Besieged.map}&amp;quot;&lt;br /&gt;
* '''map_file''': {{DevFeature1.13|?}} Path to a Wesnoth map file; can be used instead of '''map'''. The file will be loaded when the tag is executed, rather than being embedded wholesale in the preprocessed WML. Example:&lt;br /&gt;
 map_file=campaigns/Heir_To_The_Throne/maps/01_The_Elves_Besieged.map&lt;br /&gt;
{{DevFeature1.15|3}} If the file is not found directly, it will be searched for in the [[BinaryPathWML|[binary_path]]]. Assuming a standard campaign or add-on layout, the example above can be replaced by:&lt;br /&gt;
 map_file=01_The_Elves_Besieged.map&lt;br /&gt;
* '''expand''': if 'yes', allows the map size to increase. The expansion direction is currently always bottom-right.&lt;br /&gt;
* '''shrink''': if 'yes', allows the map size to decrease. If the map size is reduced, any units that would no longer be on the map due to its coordinates no longer existing will be put into the recall list.&lt;br /&gt;
Note: When a hex changes from a village terrain to a non-village terrain, and a team owned that village it loses that village. When a hex changes from a non-village terrain to a village terrain and there is a unit on that hex it does not automatically capture the village. The reason for not capturing villages it that there are too many choices to make; should a unit lose its movement points, should capture events be fired. It is easier to do this as wanted by the author in WML.&lt;br /&gt;
&lt;br /&gt;
=== [replace_schedule] ===&lt;br /&gt;
Replace the time of day schedule of the entire scenario.&lt;br /&gt;
* [[TimeWML]]: the new schedule.&lt;br /&gt;
* '''current_time''': The time slot number (starting with zero) active at schedule replacement.&lt;br /&gt;
&lt;br /&gt;
=== [tunnel] ===&lt;br /&gt;
&lt;br /&gt;
Create a tunnel between some locations, later usable by units to move from source hex to target hex (using the movement cost of unit on the target terrain).&lt;br /&gt;
&lt;br /&gt;
'''Behavior Change as of Wesnoth 1.13.6:''' Vision is now possible (and enabled by default) through tunnels and allied units on the exit hex do not block a tunnel by default any more. This is done in order for moves through tunnels to be consistent with other moves. The previous behavior can still be accomplished by using the new optional keys listed below.&lt;br /&gt;
&lt;br /&gt;
* '''[filter]''': (required) [[StandardUnitFilter]] the units which can use the tunnel. Leave empty for &amp;quot;all units&amp;quot;.&lt;br /&gt;
* '''[source]''': (required) [[StandardLocationFilter]] the source hex(es).&lt;br /&gt;
* '''[target]''': (required) [[StandardLocationFilter]] the target hex(es).&lt;br /&gt;
* '''id''': (optional) identifier for the tunnel, to allow removing.&lt;br /&gt;
* '''remove''': (boolean, default: no)  If yes, removes all defined tunnels with the same ID (then only id= is necessary).&lt;br /&gt;
* '''bidirectional''': (boolean, default: yes) If yes, creates also a tunnel in the other direction. &lt;br /&gt;
* '''always_visible''': (boolean, default: no) If yes, the possible movement of enemies under fog can be seen.&lt;br /&gt;
* '''allow_vision''': (boolean, default: yes) {{DevFeature1.13|6}} If no, vision through a tunnel is not possible. Note that in that case the tunnel cannot be used if the tunnel exit is under shroud (which previously was ''always'' the case).&lt;br /&gt;
* '''pass_allied_units''': (boolean, default: yes) {{DevFeature1.13|6}} If no, allied (including own) units on the exit hex block a tunnel.&lt;br /&gt;
* '''delayed_variable_substitution''' (boolean, default: yes): If yes, the WML block contained in this [tunnel] is not variable-substituted at execution time of the event where this [tunnel] is within. Instead, variables are substituted when the tunnel is used by a unit. See [[EventWML#Nested_Events]]&lt;br /&gt;
&lt;br /&gt;
(Note: The tunnel tag can also be used inside the [[AbilitiesWML|[teleport]]] ability, without remove= and id=).&lt;br /&gt;
&lt;br /&gt;
=== [do_command] ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|0}}&lt;br /&gt;
&lt;br /&gt;
Executes a command, specified using the same syntax as a [command] tag in [[ReplayWML]]. Not all [command]'s are valid: only these are accepted&lt;br /&gt;
&lt;br /&gt;
* [attack]&lt;br /&gt;
* [move]&lt;br /&gt;
* [recruit]&lt;br /&gt;
* [recall]&lt;br /&gt;
* [disband]&lt;br /&gt;
* [fire_event]&lt;br /&gt;
* [lua_ai] {{DevFeature1.13|12}} This has been removed and is replaced with [custom_command]&lt;br /&gt;
&lt;br /&gt;
The tags corresponding to player actions generally use the same codepath as if a player had ordered it. That means for example that only moves that player would be allowed to do are possible, and movement is interrupted when sighting enemy unit.&lt;br /&gt;
&lt;br /&gt;
One purpose of this tag is to allow scripting of noninteractive scenarios -- without a tag like this, this might require elaborate mechanisms to coerce ais in order to test these code paths.&lt;br /&gt;
&lt;br /&gt;
This command should be replay safe if it is either invoked in a synced context, ''or'' invoked in code that is never synced, like AI code, a select event, or a menu item with `synced = false`. However, if you use desynchronized logic ''during'' an event that is otherwise synced, invoking [do_command] based on that desynchronized logic will result in out-of-sync errors during the replay; in this case, you must explicitly synchronize which command to do using something like the lua function wesnoth.sync.evaluate_single.&lt;br /&gt;
&lt;br /&gt;
=== [put_to_recall_list] ===&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.13|0}}&lt;br /&gt;
&lt;br /&gt;
Puts a unit to the recall list of its side.&lt;br /&gt;
* '''[[StandardUnitFilter]]''': the unit(s) to get put to the recall list.&lt;br /&gt;
* '''heal''': (default=no) Whether the unit should be refreshed, similar to the unit moving to the recall list at the end of a scenario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Useful Macros ==&lt;br /&gt;
There are some predefined macros that you find useful for direct actions. You can find a complete list along with a detailed explanation of how they work [https://www.wesnoth.org/macro-reference.html here].&lt;br /&gt;
* '''{MOVE_UNIT}''': Moves a unit to another location in the map and the player sees the movement (unlike [teleport])&lt;br /&gt;
* '''{FULL_HEAL}''': Brings a unit to full HP&lt;br /&gt;
* '''{LOYAL_UNIT}''': Create a loyal unit&lt;br /&gt;
* '''{MODIFY_TERRAIN_MASK}''': Modify an area of terrain&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[InternalActionsWML]]&lt;br /&gt;
* [[InterfaceActionsWML]]&lt;br /&gt;
* [[EventWML]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;br /&gt;
[[Category: ActionsWML]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=CampaignWML&amp;diff=68448</id>
		<title>CampaignWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=CampaignWML&amp;diff=68448"/>
		<updated>2021-08-24T08:11:18Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update links to macro-reference.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Dacyn and/or Invisible Philosopher -- please be careful&lt;br /&gt;
you don't reduce the signal-to-noise ratio on the WML pages&lt;br /&gt;
when editing!  Eg. knowing that a tag is translatable is _important_&lt;br /&gt;
for the 29 translations we have in progress. -- ott&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This page describes how the campaign is displayed in the &amp;quot;Campaign&amp;quot; menu, and how it starts.&lt;br /&gt;
&lt;br /&gt;
==The [campaign] Tag==&lt;br /&gt;
&lt;br /&gt;
The following keys and tags are recognized in '''[campaign]''' tags:&lt;br /&gt;
* '''id''': the internal campaign identifier used to classify saved games&lt;br /&gt;
* '''icon''': the image displayed in the campaign selection menu&lt;br /&gt;
* '''name''': (translatable) name displayed in the campaign selection menu&lt;br /&gt;
* '''abbrev''': (translatable) abbreviation used as a prefix for savefile names made from this campaign&lt;br /&gt;
* '''image''': the image shown in the information pane when this campaign is selected in the campaign selection menu (typically a transparent, 350×350 pixels portrait)&lt;br /&gt;
* '''background''': {{DevFeature1.15|9}} the image used as a backdrop for the Campaigns menu (typically a high resolution image intended for displaying fullscreen in story screens). If blank or unspecified, a stock story background from core is used.&lt;br /&gt;
* '''description''': (translatable) text shown in the information pane when this campaign is selected in the campaign selection menu&lt;br /&gt;
* '''description_alignment''': {{DevFeature1.13|3}} The text alignment of the description. Choose between &amp;quot;left&amp;quot; (default), &amp;quot;center&amp;quot;, or &amp;quot;right&amp;quot;.&lt;br /&gt;
* '''type''': campaign's type to specify if it should be visible in singleplayer, multiplayer or both. Possible values are &amp;quot;sp&amp;quot;, &amp;quot;mp&amp;quot; and &amp;quot;hybrid&amp;quot;. Defaults to &amp;quot;sp&amp;quot;.&lt;br /&gt;
* '''define'''='''''CAMPAIGN_SYMBOL''''' when this campaign is started, the preprocessor symbol '''''CAMPAIGN_SYMBOL''''' will be defined. See '''#ifdef''' in [[PreprocessorRef]] for how this can be used to isolate parts of the campaign file from other campaigns. Only the tags '''[campaign]''' and '''[binary_path]''' (see [[BinaryPathWML]]) should go outside of '''#ifdef ''CAMPAIGN_SYMBOL'''''. This symbol will be defined ''before'' any .cfg is preprocessed. Important note: starting with 1.7.13, [binary_path] does no longer need to be outside of the '''#ifdef ''CAMPAIGN_SYMBOL''''' block to make custom binary data available, which could easily cause overwrites. E.g. icon=data/add-ons/whatever/something.png is supposed to work. This seems to have been a bug since at least BfW 1.0 which means that practically all available examples of user made add-ons are wrong in this aspect.&lt;br /&gt;
* '''extra_defines''': a comma(''',''') separated list of preprocessor symbols. Those symbols will be defined ''before'' any .cfg is preprocessed. Currently supported extra_defines are:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
;ENABLE_ARMAGEDDON_DRAKE&lt;br /&gt;
:allows the advancement ''Inferno Drake'' -&amp;gt; ''Armageddon Drake''&lt;br /&gt;
;ENABLE_DWARVISH_ARCANISTER&lt;br /&gt;
:allows the advancement ''Dwarvish Runemaster'' -&amp;gt; ''Dwarvish Arcanister''&lt;br /&gt;
;ENABLE_DWARVISH_RUNESMITH&lt;br /&gt;
:allows the advancement ''Dwarvish Fighter'' -&amp;gt; ''Dwarvish Runesmith''&lt;br /&gt;
;DISABLE_GRAND_MARSHAL&lt;br /&gt;
:disallows the advancement ''General'' -&amp;gt; ''Grand Marshal''&lt;br /&gt;
;ENABLE_ANCIENT_LICH&lt;br /&gt;
:allows the advancement ''Lich'' -&amp;gt; ''Ancient Lich''&lt;br /&gt;
;ENABLE_DEATH_KNIGHT&lt;br /&gt;
:allows the advancement ''Revenant'' -&amp;gt; ''Death Knight'&lt;br /&gt;
;ENABLE_TROLL_SHAMAN&lt;br /&gt;
:allows the advancement ''Troll Whelp'' -&amp;gt; ''Troll Shaman''&lt;br /&gt;
;ENABLE_WOLF_ADVANCEMENT&lt;br /&gt;
:allows the advancements ''Wolf'' -&amp;gt; ''Great Wolf'' -&amp;gt; ''Direwolf''&lt;br /&gt;
;ENABLE_NIGHTBLADE {{DevFeature1.13|0}}&lt;br /&gt;
:allows the advancement ''Orcish Slayer'' -&amp;gt; ''Orcish Nightblade''&lt;br /&gt;
;ENABLE_PARAGON {{DevFeature1.15|1}}&lt;br /&gt;
:allows the advancement ''Dune Blademaster'' -&amp;gt; ''Dune Paragon''&lt;br /&gt;
;ENABLE_WOSE_SHAMAN {{DevFeature1.15|1}}&lt;br /&gt;
:allows the advancement ''Wose'' -&amp;gt; ''Wose Shaman''&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
* '''difficulties''': a comma(''',''') separated list of preprocessor symbols, exactly one of which will be stored depending on the difficulty setting chosen when the campaign is started. The symbols '''EASY''', '''NORMAL''', and '''HARD''' are usually used, and there are several macros in utils.cfg (see [https://www.wesnoth.org/macro-reference.html#file:utils.cfg| Macro Reference]) which check for these values to set WML keys to different values depending on difficulty.  If you use different difficulty symbols, you may need to define your own versions of these macros. {{DevFeature1.13|2}} This key has been deprecated in favor of [difficulty] define=.&lt;br /&gt;
* '''difficulty_descriptions''': the menu of difficulties; this is a list of descriptions (see [[DescriptionWML]]) that correspond to different difficulty levels. Since each description is a menu option for a difficulty level, this must provide the same number of descriptions as there are levels in the ''difficulties'' list. {{DevFeature1.13|2}} This key has been deprecated in favor of [difficulty] define=&lt;br /&gt;
* '''[difficulty]''':  {{DevFeature1.13|2}} specifies a single campaign difficulty. The following keys are accepted:&lt;br /&gt;
** '''define''': the preprocessor symbol defined when this difficulty is selected. Uses the same format as an entry in the old ''difficulties'' list.&lt;br /&gt;
** '''image''': the image to display for this difficulty in the selection menu&lt;br /&gt;
** '''label''': a flavor label describing this difficulty. Displayed second after the image&lt;br /&gt;
** '''description''': a description of the difficulty, usually along the lines of &amp;quot;Beginner&amp;quot; or &amp;quot;Challenging&amp;quot;. Displayed third after the image.&lt;br /&gt;
** '''default''': whether this is the difficulty which will be selected by default when the difficulty selection menu is displayed.&lt;br /&gt;
** '''auto_markup''': {{DevFeature1.15|0}} By default, the description is shown in small, gray text within parentheses. Setting '''auto_markup=no''' disables these, so no markup will be applied implicitly. Any markup in '''description''' will be honored regardless of this setting.&lt;br /&gt;
* '''allow_difficulty_change''': Allows difficulty switching during an ongoing campaign. Default:yes&lt;br /&gt;
* '''first_scenario''': the ID of the first scenario in the campaign; see ''id'' in [[ScenarioWML]]&lt;br /&gt;
* '''[options]''':  {{DevFeature1.13|1}} Allows configuration options to be displayed to  the user, see [[OptionWML]]&lt;br /&gt;
* '''rank''': a number that determines the order of campaigns in the campaign selection menu.  Lower ''rank'' campaigns appear earlier, with unranked campaigns at the end. Currently the mainline campaigns use multiples of 10 from 0 to 399, with 0-99 for Novice campaigns, 100-199 for Intermediate campaigns, and 200-399 for Expert campaigns; if you specify this, it should not be less than 400.  (Note: This replaces an older convention that topped out at 50.) {{DevFeature1.14|6}} a number that determines the order of campaigns in the campaign selection menu. Lower rank campaigns appear earlier, with unranked campaigns at the end. Currently the mainline campaigns use multiples of 5 from 0 to 249, with 0-49 for Rookie campaigns, 50-99 for Novice campaigns, 100-149 for Intermediate campaigns, 150-199 for Hard campaigns, and 200-249 for Expert campaigns; if you specify this, it should not be less than 300.&lt;br /&gt;
* '''start_year''': a string that determines the order of campaigns when the campaign selection menu is sorted by date. The date needs a year number and an epoch, for example '''20 BW''', '''20 YW''', '''20 BF''' or '''20 AF'''. In Wesnoth 1.14, this is the only place in which this date-parsing is used.&lt;br /&gt;
* '''end_year''': a string that helps determine the order of campaigns when two campaigns have the same '''start_year'''. Ignored if '''start_year''' is not set.&lt;br /&gt;
* '''year''': shortcut for specifying both '''start_year''' and '''end_year''', for campaigns that happen inside a single calendar year. Ignored if '''start_year''' is given. &lt;br /&gt;
* '''[about]''': inserts your own credits into the game's list of credits. See [[CreditsWML]] for syntax.&lt;br /&gt;
* '''end_credits''': Whether to display the credits screen at the end of the campaign. Defaults to ''yes''.&lt;br /&gt;
* '''end_text''': (translatable) Text that is shown centered in a black screen at the end of a campaign. Defaults to &amp;quot;The End&amp;quot;.&lt;br /&gt;
* '''end_text_duration''': Delay, in milliseconds, before displaying the game credits at the end of a campaign. In other words, for how much time '''end_text''' is displayed on screen. Defaults to 3500. {{DevFeature1.15|6}} This value is capped at 5000 (5 seconds).&lt;br /&gt;
* '''[event]''': {{DevFeature1.13|2}} events placed here will be automatically inserted into all scenarios of the campaign.&lt;br /&gt;
&lt;br /&gt;
The following keys are additionally recognized in multiplayer:&lt;br /&gt;
* '''min_players''': Minimum number of players which the campaign supports. This only serves to inform users when choosing a campaign. Defaults to 2.&lt;br /&gt;
* '''max_players''': Maximum number of players which the campaign supports. This only serves to inform users when choosing a campaign. Defaults to either '''min_players''' or 2, whichever is higher.&lt;br /&gt;
* '''allow_era_choice''': Whether to allow era selection (when set to ''yes'') or hide it and use a default one when creating a game (when set to ''no''). Defaults to ''yes''.&lt;br /&gt;
* '''require_campaign''': Whether clients are required to have this campaign installed beforehand to be allowed join a game using this campaign. Possible values 'yes' (the default) and 'no'.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[PreprocessorRef]]&lt;br /&gt;
* [[ScenarioWML]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
* [[PblWML]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wml_optimisation&amp;diff=68447</id>
		<title>Wml optimisation</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wml_optimisation&amp;diff=68447"/>
		<updated>2021-08-24T08:10:02Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update links to macro-reference.html, other links too&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==The basics==&lt;br /&gt;
The first thing you need to know: '''If you have no problems with performance, then don't bother'''.&lt;br /&gt;
Any optimisation is supposed to help you in following situations:&lt;br /&gt;
* The game freezes for several seconds after each user action&lt;br /&gt;
* Your scenario loading time is longer than several minutes&lt;br /&gt;
* Your add-on codebase is larger than 5 megabytes&lt;br /&gt;
&lt;br /&gt;
===What you should know next===&lt;br /&gt;
*[[PreprocessorRef#Preprocessor_directives|Macros]]&lt;br /&gt;
*[[EventWML]]&lt;br /&gt;
*[[EventWML#Custom_events|Custom events]]&lt;br /&gt;
*[[ConditionalActionsWML#.5Bwhile.5D|While loops]]&lt;br /&gt;
&lt;br /&gt;
===How do I optimise my code?===&lt;br /&gt;
&lt;br /&gt;
So, you've written your campaign, scenario or era and it works. Congratulations, but your work is far from over! If your campaign or scenario is big enough, you'll often notice that it runs very slowly, and you need to do something about it. Or maybe you have a powerful computer and you'd like to make sure that other, weaker machines won't have troubles with running your content. Or perhaps, you just want to learn how to write code that not only works, but is also efficient.&lt;br /&gt;
&lt;br /&gt;
The first thing to know, since apparently it's not stressed enough, macros '''do not''' improve performance! Macros only make your code more readable and easier to maintain. Try to refrain from using big macros, and more importantly, avoid using macros inside macros (inside macros, inside macros... yes, I've seen it happen, and yes I've tried doing it myself when I was new to wml). Under the covers, WML macros are replaced by the code they represent, and if there are macros inside macros (especially big ones), lines of code multiply horribly fast.&lt;br /&gt;
&lt;br /&gt;
What's a better way to write code that appears often? ''Custom events''' and ''while loops''! By defining a '''custom event''', and firing it when needed, you'll save a lot of code lines, make your code nicer to read and much more efficient. Same goes for the '''while loop''': instead of copy/pasting your code, try to use a loop, whenever you can. Let's take a look at this example problem: whenever side 1 unit enters a village, you want to place 5 walking corpses around this village. Let's say there are 6 villages in question with coordinates (1,1), (2,2), (3,3), (4,4), (5,5), (6,6).&lt;br /&gt;
&lt;br /&gt;
====Inefficient example====&lt;br /&gt;
&lt;br /&gt;
    #NOTE: remember, this should work alright, but it is not efficient! Imagine if you have much more villages in mind, or you want to spawn more zombies&lt;br /&gt;
    &lt;br /&gt;
    #define SPAWN_ZOMBIES X Y SIDE&lt;br /&gt;
    [unit]&lt;br /&gt;
    side={SIDE}&lt;br /&gt;
    type=Walking Corpse&lt;br /&gt;
    x,y={X},{Y}&lt;br /&gt;
    placement=map_passable&lt;br /&gt;
    [unit]&lt;br /&gt;
    [unit]&lt;br /&gt;
    side={SIDE}&lt;br /&gt;
    type=Walking Corpse&lt;br /&gt;
    x,y={X},{Y}&lt;br /&gt;
    placement=map_passable&lt;br /&gt;
    [unit]&lt;br /&gt;
    [unit]&lt;br /&gt;
    side={SIDE}&lt;br /&gt;
    type=Walking Corpse&lt;br /&gt;
    x,y={X},{Y}&lt;br /&gt;
    placement=map_passable&lt;br /&gt;
    [unit]&lt;br /&gt;
    [unit]&lt;br /&gt;
    side={SIDE}&lt;br /&gt;
    type=Walking Corpse&lt;br /&gt;
    x,y={X},{Y}&lt;br /&gt;
    placement=map_passable&lt;br /&gt;
    [unit]&lt;br /&gt;
    [unit]&lt;br /&gt;
    side={SIDE}&lt;br /&gt;
    type=Walking Corpse&lt;br /&gt;
    x,y={X},{Y}&lt;br /&gt;
    placement=map_passable&lt;br /&gt;
    [unit]&lt;br /&gt;
    #enddef&lt;br /&gt;
    &lt;br /&gt;
    [event]&lt;br /&gt;
    name=moveto&lt;br /&gt;
        [filter]&lt;br /&gt;
        side=1&lt;br /&gt;
        x,y=1,1&lt;br /&gt;
        [or]&lt;br /&gt;
        x,y=2,2&lt;br /&gt;
        [/or]&lt;br /&gt;
        [or]&lt;br /&gt;
        x,y=3,3&lt;br /&gt;
        [/or]&lt;br /&gt;
        [or]&lt;br /&gt;
        x,y=4,4&lt;br /&gt;
        [/or]&lt;br /&gt;
        [or]&lt;br /&gt;
        x,y=5,5&lt;br /&gt;
        [/or]&lt;br /&gt;
        [or]&lt;br /&gt;
        x,y=6,6&lt;br /&gt;
        [/or]&lt;br /&gt;
        [/filter]&lt;br /&gt;
    &lt;br /&gt;
        {SPAWN_ZOMBIES $unit.x $unit.y 2}&lt;br /&gt;
    [/event]&lt;br /&gt;
&lt;br /&gt;
Looks pretty innocent, right? But imagine that there are more villages. Or better yet, imagine you want to increase the amount of zombies, you'll have to copy/paste even more, and it's easy to make a mistake while doing it. &lt;br /&gt;
&lt;br /&gt;
====More efficient example====&lt;br /&gt;
&lt;br /&gt;
    #first, let's define our custom event:&lt;br /&gt;
    [event]&lt;br /&gt;
    name=spawn_zombies&lt;br /&gt;
    first_time_only=no&lt;br /&gt;
    #it's easy to forget, but you have to set first_time_only in custom events too&lt;br /&gt;
    {VARIABLE i 0}&lt;br /&gt;
    [while]&lt;br /&gt;
        [variable]&lt;br /&gt;
        name=i&lt;br /&gt;
        less_than_equal_to=5&lt;br /&gt;
    #repeating the loop 5 times for 5 zombies, note how easy it is now to change the amount of zombies you want to spawn!&lt;br /&gt;
        [/variable]&lt;br /&gt;
        [do]&lt;br /&gt;
            [unit]&lt;br /&gt;
            side=2&lt;br /&gt;
            type=Walking Corpse&lt;br /&gt;
            x,y=$unit.x,$unit.y&lt;br /&gt;
    #unit variable is passed to this event from the parent event. &lt;br /&gt;
            placement=map_passable&lt;br /&gt;
            [unit]&lt;br /&gt;
            {VARIABLE_OP i add 1}&lt;br /&gt;
        [/do]&lt;br /&gt;
    [/while]&lt;br /&gt;
    {CLEAR_VARIABLE i}&lt;br /&gt;
    [/event]&lt;br /&gt;
    &lt;br /&gt;
    [event]&lt;br /&gt;
    name=moveto&lt;br /&gt;
        [filter]&lt;br /&gt;
        side=1&lt;br /&gt;
        x,y=1,1&lt;br /&gt;
        [or]&lt;br /&gt;
        x,y=2,2&lt;br /&gt;
        [/or]&lt;br /&gt;
        [or]&lt;br /&gt;
        x,y=3,3&lt;br /&gt;
        [/or]&lt;br /&gt;
        [or]&lt;br /&gt;
        x,y=4,4&lt;br /&gt;
        [/or]&lt;br /&gt;
        [or]&lt;br /&gt;
        x,y=5,5&lt;br /&gt;
        [/or]&lt;br /&gt;
        [or]&lt;br /&gt;
        x,y=6,6&lt;br /&gt;
        [/or]&lt;br /&gt;
        [/filter]&lt;br /&gt;
    &lt;br /&gt;
        [fire_event]&lt;br /&gt;
        name=spawn_zombies&lt;br /&gt;
        [/fire_event]&lt;br /&gt;
    [/event]&lt;br /&gt;
&lt;br /&gt;
===Fired events vs macros===&lt;br /&gt;
&lt;br /&gt;
But if ''fire events'' are so cool and efficient, what is the advantage of using ''macros''? Good question. As you can see, custom events have one issue: ''it's harder to set dynamic variables in fired events''. When defining macros, you specify arguments and those arguments are declared ''whenever we're using that macro'' and can be changed in any way you, and more importantly, someone else wants. Remember, that you might want to start a bigger project and invite someone to help you with the code. '''Macros are obvious and transparent in usage''' - when reading a macro definition you always know what is the changing variable and what is a constant. In custom events, it is not so obvious.&lt;br /&gt;
&lt;br /&gt;
Let's take a look at one of the default macros included with wesnoth:&lt;br /&gt;
&lt;br /&gt;
    #define ABILITY_REGENERATES&lt;br /&gt;
    # Canned definition of the Regenerate ability to be included in an [abilities]&lt;br /&gt;
    # clause.&lt;br /&gt;
    [regenerate]&lt;br /&gt;
        value=8&lt;br /&gt;
        id=regenerates&lt;br /&gt;
        name= _ &amp;quot;regenerates&amp;quot;&lt;br /&gt;
        female_name= _ &amp;quot;female^regenerates&amp;quot;&lt;br /&gt;
        description= _ &amp;quot;Regenerates:&lt;br /&gt;
    The unit will heal itself 8 HP per turn. If it is poisoned, it will remove the poison instead of healing.&amp;quot;&lt;br /&gt;
        affect_self=yes&lt;br /&gt;
        poison=cured&lt;br /&gt;
    [/regenerate]&lt;br /&gt;
    #enddef&lt;br /&gt;
&lt;br /&gt;
This is a good macro, because replacing it by a custom event would be complicated and messy and it wouldn't save a lot of code, anyway. Another example is&lt;br /&gt;
&lt;br /&gt;
    #define GENERIC_UNIT SIDE TYPE X Y&lt;br /&gt;
    # Creates a generic unit of TYPE belonging to SIDE at X,Y, which has a&lt;br /&gt;
    # random name, gender and traits (just like a recruited unit).&lt;br /&gt;
    [unit]&lt;br /&gt;
        side={SIDE}&lt;br /&gt;
        type={TYPE}&lt;br /&gt;
        x={X}&lt;br /&gt;
        y={Y}&lt;br /&gt;
        generate_name=yes&lt;br /&gt;
        random_traits=yes&lt;br /&gt;
        random_gender=yes&lt;br /&gt;
        upkeep=full&lt;br /&gt;
    [/unit]&lt;br /&gt;
    #enddef&lt;br /&gt;
&lt;br /&gt;
This time, making a custom event would be fairly easy, but it would be much less transparent in usage. The code {GENERIC_UNIT 1 Spearman 12 3} is self-explanatory, simple and versatile.&lt;br /&gt;
&lt;br /&gt;
==Macros that are included in multiple scenarios==&lt;br /&gt;
If you have a macro that's included in every scenario of a campaign, in every map of a map-pack, or in multiple units of an era, then the macro will be expanded multiple times. If macro is an '''[event]''' and the expanded version is huge (for example, if it uses nested macros), then using the '''[[ModificationWML#The_.5Bresource.5D_toplevel_tag|[resource]]]''' tag can reduce it to a single copy.&lt;br /&gt;
&lt;br /&gt;
This can be an easy and quick optimisation, as the old macro can be replaced with one that just contains the '''[load_resource]''' tag.&lt;br /&gt;
&lt;br /&gt;
==Do not treat macroses as functions==&lt;br /&gt;
Main advantage of macroses is that they allow you to reuse your code with less effort. But you need to take into account how ''exactly'' they are used by Wesnoth. Look at the example&lt;br /&gt;
&lt;br /&gt;
    #define CREATE_REINFORCMENT SIDE &lt;br /&gt;
    {VARIABLE temp_side {SIDE}}&lt;br /&gt;
    [variable]&lt;br /&gt;
        name = temp_side&lt;br /&gt;
        value = 1&lt;br /&gt;
    [/variable]&lt;br /&gt;
    [if]&lt;br /&gt;
        {VARIABLE_CONDITIONAL temp_side equals 1}&lt;br /&gt;
        [then]&lt;br /&gt;
            {GENERIC_UNIT 1 &amp;quot;Walking Corpse&amp;quot; 12 3}&lt;br /&gt;
        [/then]&lt;br /&gt;
    [/if]&lt;br /&gt;
    [if]&lt;br /&gt;
        {VARIABLE_CONDITIONAL temp_side equals 2}&lt;br /&gt;
        [then]&lt;br /&gt;
            {GENERIC_UNIT 2 &amp;quot;Spearman&amp;quot; 3 16}&lt;br /&gt;
        [/then]&lt;br /&gt;
    [/if]&lt;br /&gt;
    {CLEAR_VARIABLE temp_side}&lt;br /&gt;
    #enddef&lt;br /&gt;
    [event]&lt;br /&gt;
    name=turn 10&lt;br /&gt;
        {CREATE_REINFORCMENT 1}&lt;br /&gt;
        {CREATE_REINFORCMENT 2}&lt;br /&gt;
    [/event]&lt;br /&gt;
&lt;br /&gt;
In this example I wanted to create additional units for each side at turn 10. Side 1 is undeads and side 2 is loyalists. Everything looks good, but there is a mistake. When Wesnoth loads scenario, all macroses are substituted with their meaning. This example becomes:&lt;br /&gt;
    &lt;br /&gt;
    [event]&lt;br /&gt;
        name=&amp;quot;turn 10&amp;quot;&lt;br /&gt;
        [set_variable]&lt;br /&gt;
            name=&amp;quot;temp_side&amp;quot;&lt;br /&gt;
            value=1&lt;br /&gt;
        [/set_variable]&lt;br /&gt;
        [if]&lt;br /&gt;
            [variable]&lt;br /&gt;
                equals=1&lt;br /&gt;
                name=&amp;quot;temp_side&amp;quot;&lt;br /&gt;
            [/variable]&lt;br /&gt;
            [then]&lt;br /&gt;
                [unit]&lt;br /&gt;
                    generate_name=yes&lt;br /&gt;
                    random_gender=yes&lt;br /&gt;
                    random_traits=yes&lt;br /&gt;
                    side=1&lt;br /&gt;
                    type=&amp;quot;Walking Corpse&amp;quot;&lt;br /&gt;
                    upkeep=&amp;quot;full&amp;quot;&lt;br /&gt;
                    x=12&lt;br /&gt;
                    y=3&lt;br /&gt;
                [/unit]&lt;br /&gt;
            [/then]&lt;br /&gt;
        [/if]&lt;br /&gt;
        [if]&lt;br /&gt;
            [variable]&lt;br /&gt;
                equals=2&lt;br /&gt;
                name=&amp;quot;temp_side&amp;quot;&lt;br /&gt;
            [/variable]&lt;br /&gt;
            [then]&lt;br /&gt;
        # PART 1 BEGINS&lt;br /&gt;
                [unit]&lt;br /&gt;
                    generate_name=yes&lt;br /&gt;
                    random_gender=yes&lt;br /&gt;
                    random_traits=yes&lt;br /&gt;
                    side=2&lt;br /&gt;
                    type=&amp;quot;Spearman&amp;quot;&lt;br /&gt;
                    upkeep=&amp;quot;full&amp;quot;&lt;br /&gt;
                    x=3&lt;br /&gt;
                    y=16&lt;br /&gt;
                [/unit]&lt;br /&gt;
        # PART 1 ENDS&lt;br /&gt;
            [/then]&lt;br /&gt;
        [/if]&lt;br /&gt;
        [clear_variable]&lt;br /&gt;
            name=&amp;quot;temp_side&amp;quot;&lt;br /&gt;
        [/clear_variable]&lt;br /&gt;
        [set_variable]&lt;br /&gt;
            name=&amp;quot;temp_side&amp;quot;&lt;br /&gt;
            value=2&lt;br /&gt;
        [/set_variable]&lt;br /&gt;
        [if]&lt;br /&gt;
            [variable]&lt;br /&gt;
                equals=1&lt;br /&gt;
                name=&amp;quot;temp_side&amp;quot;&lt;br /&gt;
            [/variable]&lt;br /&gt;
            [then]&lt;br /&gt;
        # PART 2 BEGINS&lt;br /&gt;
                [unit]&lt;br /&gt;
                    generate_name=yes&lt;br /&gt;
                    random_gender=yes&lt;br /&gt;
                    random_traits=yes&lt;br /&gt;
                    side=1&lt;br /&gt;
                    type=&amp;quot;Walking Corpse&amp;quot;&lt;br /&gt;
                    upkeep=&amp;quot;full&amp;quot;&lt;br /&gt;
                    x=12&lt;br /&gt;
                    y=3&lt;br /&gt;
                [/unit]&lt;br /&gt;
        # PART 2 ENDS&lt;br /&gt;
            [/then]&lt;br /&gt;
        [/if]&lt;br /&gt;
        [if]&lt;br /&gt;
            [variable]&lt;br /&gt;
                equals=2&lt;br /&gt;
                name=&amp;quot;temp_side&amp;quot;&lt;br /&gt;
            [/variable]&lt;br /&gt;
            [then]&lt;br /&gt;
                [unit]&lt;br /&gt;
                    generate_name=yes&lt;br /&gt;
                    random_gender=yes&lt;br /&gt;
                    random_traits=yes&lt;br /&gt;
                    side=2&lt;br /&gt;
                    type=&amp;quot;Spearman&amp;quot;&lt;br /&gt;
                    upkeep=&amp;quot;full&amp;quot;&lt;br /&gt;
                    x=3&lt;br /&gt;
                    y=16&lt;br /&gt;
                [/unit]&lt;br /&gt;
            [/then]&lt;br /&gt;
        [/if]&lt;br /&gt;
        [clear_variable]&lt;br /&gt;
            name=&amp;quot;temp_side&amp;quot;&lt;br /&gt;
        [/clear_variable]&lt;br /&gt;
    [/event]&lt;br /&gt;
&lt;br /&gt;
Obviously part 1 and part 2 will never happen. It makes conditional check useless while you code becomes more complex. This is very common mistake even in advanced scenarios and add-ons. To avoid this problem, you need to follow the rule: '''Do not make conditional actions based on values of arguments'''. If you need to do this, then you need to think over situation again. In our example it might be:&lt;br /&gt;
&lt;br /&gt;
    [event]&lt;br /&gt;
    name=turn 10&lt;br /&gt;
        {GENERIC_UNIT 1 &amp;quot;Walking Corpse&amp;quot; 12 3}&lt;br /&gt;
        {GENERIC_UNIT 2 &amp;quot;Spearman&amp;quot; 3 16}&lt;br /&gt;
    [/event]&lt;br /&gt;
&lt;br /&gt;
==Analogies to &amp;quot;real&amp;quot; programming==&lt;br /&gt;
&lt;br /&gt;
Now that you know how to use macros and custom events to optimise your code, let's take a moment to think how you could use your knowledge outside Wesnoth. You've probably heard about c++, python, lua or any other programming language. Just like them, WML has some common features but under slightly different names. For example, instead of making custom ''events'', you're making custom ''functions'' and ''procedures'' that can be used further in your code in a very similar way. That's why understanding optimisation is so important - it'll help you understand real programming problems, and develop good habits!&lt;br /&gt;
&lt;br /&gt;
==Further reading==&lt;br /&gt;
&lt;br /&gt;
*[[Advanced_Optimisations_and_Hacks|More complex optimisations]] - read this only if you believe you know everything!&lt;br /&gt;
*[https://www.wesnoth.org/macro-reference.html Macro reference]&lt;br /&gt;
*[[LuaWML]]&lt;br /&gt;
*[[ConventionsWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category:WML_Tips]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=IntroWML&amp;diff=68446</id>
		<title>IntroWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=IntroWML&amp;diff=68446"/>
		<updated>2021-08-24T08:08:57Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Update links to macro-reference.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
== IntroWML ==&lt;br /&gt;
&lt;br /&gt;
The '''[story]''' tag is a series of images and text to display as the first part of the intro screen. It can appear in [[ScenarioWML]] or {{DevFeature1.13|8}} as [[InterfaceActionsWML#.5Bstory.5D|ActionWML]].&lt;br /&gt;
&lt;br /&gt;
The '''[deprecated_message]''', '''[wml_message]''', '''[image]''', and '''[insert_tag]''' tags are allowed beneath '''[story]'''.  Most other WML tags will not be recognized in this context. Note, however, that messages produced by the first two tags will not appear in the game interface until the actual game map appears.&lt;br /&gt;
&lt;br /&gt;
The only other tags currently recognized within '''[story]''' and '''[part]''' are '''[if]'''/'''[then]'''/'''[else]''' ({{DevFeature1.13|0}}: also '''[elseif]''') and '''[switch]'''/'''[case]'''. These can be used to show parts conditionally on the values of variables.&lt;br /&gt;
&lt;br /&gt;
See also the journey and battle macros, in the [https://www.wesnoth.org/macro-reference.html#file:image-utils.cfg Macro Reference]&lt;br /&gt;
&lt;br /&gt;
=== [story] ===&lt;br /&gt;
&lt;br /&gt;
* '''text_layout''': specifies the area of the screen where the story text will be displayed. It allows the ''top'', ''middle'' and ''bottom'' values; the latter is used by default.&lt;br /&gt;
* '''title_alignment''': specifies the alignment of the title box. It allows the ''left'', ''center'' and ''right'' values; the first is used by default.&lt;br /&gt;
&lt;br /&gt;
=== [part] ===&lt;br /&gt;
&lt;br /&gt;
'''[part]''' is a special tag recognized only beneath '''[story]'''. Each '''[part]''' represents one image and text.&lt;br /&gt;
The part is displayed until the user clicks on the &amp;quot;Next&amp;gt;&amp;gt;&amp;gt;&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
The following key/tags are recognized for '''[part]''':&lt;br /&gt;
* '''background''': the image to display. Story images are usually created specially for this purpose, except for the map.&lt;br /&gt;
* '''scale_background''': Whether to scale the background, default yes.&lt;br /&gt;
* '''story''': (translatable) the text to display below the image.&lt;br /&gt;
* '''show_title''': whether to display the title of the scenario at the top&lt;br /&gt;
* '''title''': specifies a custom title to display instead of the name of the scenario. If specified, it implies '''show_title=yes'''. If parent '''[story]''' is used through [[InterfaceActionsWML#.5Bstory.5D|ActionWML]] with '''show_title=yes''', the '''title''' key must be explicitly specified, it does not default to scenario title and leads to missing-title error if omitted.&lt;br /&gt;
* '''music''': change to this music&lt;br /&gt;
* '''sound''': a list of sound files; the engine will choose one at random and play it once while displaying the story part.&lt;br /&gt;
&lt;br /&gt;
=== [background_layer] ===&lt;br /&gt;
&lt;br /&gt;
A layer of the background of the story screen.&lt;br /&gt;
&lt;br /&gt;
* '''image''': path to the image file.&lt;br /&gt;
* '''scale_vertically''': whether the image should be scaled to fill the screen in the vertical dimension. Default yes.&lt;br /&gt;
* '''scale_horizontally''': whether the image should be scaled to fill the screen in the horizontal dimension. Default yes.&lt;br /&gt;
* '''scale''': a shortcut to set scale_vertically and scale_horizontally at once. If specified, the values of the former two keys will be ignored.&lt;br /&gt;
* '''keep_aspect_ratio''': whether the aspect ratio of the image should be preserved while scaling. Default yes.&lt;br /&gt;
* '''tile_vertically''': whether the image should be tiled in the vertical direction. Tiling happens after aligning the image to the center of the screen. Default no.&lt;br /&gt;
* '''tile_horizontally''': whether the image should be tiled in the horizontal direction. Tiling happens after aligning the image to the center of the screen. Default no.&lt;br /&gt;
* '''tile''': a shortcut to set tile_vertically and tile_horizontally at once. If specified, the values of the former two keys will be ignored.&lt;br /&gt;
* '''base_layer''': whether is this the layer to align the overlay images to. Default no.&lt;br /&gt;
&lt;br /&gt;
=== [image] ===&lt;br /&gt;
&lt;br /&gt;
An image to display.&lt;br /&gt;
&lt;br /&gt;
* '''x''', '''y''': the location to draw the image, using the pixels of the '''base_layer''' background image as the coordinate system.&lt;br /&gt;
* '''centered''': If &amp;quot;yes&amp;quot;, use the center of the image as the anchor point when placing at the x,y coordinates, if &amp;quot;no&amp;quot; then use the top-left corner.&lt;br /&gt;
* '''file''': the image to display.&lt;br /&gt;
* '''delay''': the time to delay drawing this image.&lt;br /&gt;
* '''resize_with_background''': {{DevFeature1.15|7}} if &amp;quot;yes&amp;quot;, apply the same scaling as applied to the '''base_layer'''&lt;br /&gt;
&lt;br /&gt;
Each image is placed using the pixels of the background_layer as the coordinate system; each image's location moves to compensate when the background image is scaled. Example: my background image is a map with a city at pixel 160,100; I put a battle marker on that city using '''x,y,centered=160,100,yes'''. When a user plays the game they will see the map enlarged to fill the window (regardless of its size), and the battle marker will still be on top of the city.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=UnderTheBurningSuns&amp;diff=68151</id>
		<title>UnderTheBurningSuns</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=UnderTheBurningSuns&amp;diff=68151"/>
		<updated>2021-06-25T20:03:58Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: remove random bit of fanon that might actually have been the page starter's own invention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
This campaign takes place eons after the others.  At the height of Wesnoth's power, an additional sun was created and magically raised into the sky.  Millennia later, entropy has its due: The fertile plains of Wesnoth have turned to desert.  There are few survivors from the age of the empire. The focus of these scenarios are the Quenoth Elves, who are particularly well adapted to living on the sands.&lt;br /&gt;
&lt;br /&gt;
In terms of gameplay, Under the Burning Suns' scenarios tend to be somewhat longer than in other campaigns. They are not boring, though, as victory conditions typically change several times before the scenario is 'won'.&lt;br /&gt;
&lt;br /&gt;
== Campaign-Level Strategy ==&lt;br /&gt;
&lt;br /&gt;
=== Gameplay ===&lt;br /&gt;
&lt;br /&gt;
Under the Burning Suns changes several of the rules you may be used to from other scenarios.  Here is a list of the most crucial changes:&lt;br /&gt;
* regarding movement and defense, sand is the new forest&lt;br /&gt;
* Elves' movement cost in caves is 2 (not 3)&lt;br /&gt;
* Your elves are lawful and subject to the day-night cycle, which has changed quite a bit:&lt;br /&gt;
** First Dawn&lt;br /&gt;
** First Morning, Midday, Afternoon (3 turns of daylight)&lt;br /&gt;
** First Dusk&lt;br /&gt;
** The Short Dark (Night)&lt;br /&gt;
** Second Dawn&lt;br /&gt;
** Second Morning, Midday, Afternoon (3 turns of daylight)&lt;br /&gt;
** Second Dusk&lt;br /&gt;
** The Long Dark 1-4&lt;br /&gt;
* Most known units still work the same way, however:&lt;br /&gt;
** Sorceress line has been removed&lt;br /&gt;
** Healers may become level-4 (Illuminates, also slightly improved damage &amp;amp; resistances)&lt;br /&gt;
** Ranger and above can backstab&lt;br /&gt;
** a new type of level-2 skirmishing cavalry&lt;br /&gt;
** a new type of infantry, Desert Hunters: slowing ranged attack, skirmishers from level 2&lt;br /&gt;
&lt;br /&gt;
===Kaleh and Nym ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;As Quenoth elves (Wesnoth 1.14.x and later)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These characters don't level up like ordinary units. Every time they reach maximum XP, their HP and attack damage will improve a bit, and you're asked what else you want them to learn on top of that, like &amp;quot;become a better warrior&amp;quot; or &lt;br /&gt;
&amp;quot;become a better hunter&amp;quot;. You needn't worry about the choice: none of the abilities is game-breaking in one way or another, and eventually they'll learn almost all of them.&lt;br /&gt;
&lt;br /&gt;
* On the first level-up, you'll have three choices &amp;quot;warrior&amp;quot;, &amp;quot;hunter&amp;quot; or &amp;quot;leader&amp;quot;. Whichever you choose, you'll still be able to choose the other two on later level ups.&lt;br /&gt;
* On the second level-up and later, you'll also be able to choose specializations that say &amp;quot;choose only one&amp;quot;. You'll be able to choose one for each of Warrior, Hunter and Leader.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;As Desert elves (Wesnoth 1.13.x and earlier)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The skill tree is different to the Quenoth version, for example &amp;quot;become a better swordsman&amp;quot; or &amp;quot;learn to use the bolas&amp;quot;. The two most important things to know are:&lt;br /&gt;
&lt;br /&gt;
* the very first swordsman&amp;lt;-&amp;gt;archer choice defines his later field of excellence (he'll be merely good in the other)&lt;br /&gt;
* bolas and leadership are mutually exclusive&lt;br /&gt;
&lt;br /&gt;
=== Unit advancement ===&lt;br /&gt;
&lt;br /&gt;
There's no way to know this beforehand, but you'll have to fight a some big underground battles. The army you build during the first scenarios should be capable of fighting in caves. There are two main variables to consider for underground battles:&lt;br /&gt;
# Can each unit move at least 3 cave hexes per turn?&lt;br /&gt;
# How can I maximize damage in narrow corridors?&lt;br /&gt;
&lt;br /&gt;
Because of these two priorities, deciding which units to level in early campaigns is very important.  For instance, the following units are not as effective:&lt;br /&gt;
* Marksman/Sharpshooter (marksmanship ain't necessary, and besides they're too brittle)&lt;br /&gt;
* Hero/Champion (unless they're quick)&lt;br /&gt;
* Scout/Rider/Outrider (as slow as infantry, but weaker)&lt;br /&gt;
&lt;br /&gt;
There are more effective units:&lt;br /&gt;
* Ranger/Avenger have range attack (anti-troll) and backstab (+damage)&lt;br /&gt;
* Captain/Marshal have leadership (+damage)&lt;br /&gt;
* Sentinel's &amp;quot;slow&amp;quot; attack minimizes the damage taken; skirmish may break deadlocks&lt;br /&gt;
&lt;br /&gt;
== The Morning After ==&lt;br /&gt;
&lt;br /&gt;
* '''Objectives''': &lt;br /&gt;
** Rescue (all?) surviving elves in villages&lt;br /&gt;
** Defeat the Necromancer (L2) leader to the North&lt;br /&gt;
* '''Must survive''': Kaleh, Nym, Zhul, Garak&lt;br /&gt;
* '''Turn limit''': ?? / 32 / ?? (Easy/Medium/Hard)&lt;br /&gt;
* '''Starting units''': Kaleh, Nym&lt;br /&gt;
* '''Starting gold''': 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some strange meteors have destroyed the homes of our heroes.  Kaleh and Nym must search for survivors by capturing all villages.  Landing on an empty village will sometimes flush out a few elves.  In the beginning, they will be battling Mud-crawlers.  Since you have no keep in which to recruit, put the Mud-crawlers to the sword and save all the new units.  Note that, unlike other campaigns, Giant Mud-crawlers here will not spawn smaller Mud-crawlers upon their death.  Also note that the grey brown trail around the lake is not as good defensively for you as the sand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The villages will lead you counter-clockwise around the lake.  At the southernmost portion of the lake you'll find a shattered bridge leading to a shrine in the center of the lake.  You don't have to go there right away, but the scenario won't complete until you rescue the Druid and both Shamans there.  Be aware that stepping off the island will trigger the obligatory Cuttlefish.  If you don't yet have Garak, I'd wait on the island until dawn - this thing will be a bit tough for any of the other characters you currently possess.&lt;br /&gt;
&lt;br /&gt;
Garak the Captain will be found with a few recruits on the Training Ground, which is just to the East of the bridge.  It's possible that your people headed for the bridge will trigger this encounter - you'll find a bigger mob of Mud-crawlers than you've seen so far, and likely get some bruises cleaning them out.  However, don't go out of your way to level Garak up.  He has his own... destiny.&lt;br /&gt;
&lt;br /&gt;
After dealing with the Mud-crawlers and Cuttlefish, keep heading around the lake.  The villages on the East side represent the remains of the stables - capturing them will give you Scouts.  If the Scouts explore the outer edges of the map, they will find more a few more villages and units, though no more Mud-crawlers.  You're now ready for bigger game!&lt;br /&gt;
&lt;br /&gt;
Completing the circuit around the lake reveals the destroyed keep on the North side.  The tribe leader Tanuil is pronounced dead, Kaleh now leads the tribe.  On turn 11, a Necromancer Xanthos will show up to lead the Undead against the elves.  Head north to take the battle to his keep.  On turn 16 the Quenoth hunting party returns on the North edge of the map, somewhat westward of Xanthos.&lt;br /&gt;
&lt;br /&gt;
== Across the Harsh Sands ==&lt;br /&gt;
&lt;br /&gt;
* '''Objectives''': &lt;br /&gt;
** Kaleh must reach &amp;quot;Pinnacle Rock&amp;quot; at the North end of the map. &lt;br /&gt;
** Defeat the Outlaw leader.&lt;br /&gt;
* '''Must survive''': Kaleh, Nym, Zhul, Garak&lt;br /&gt;
* '''Turn limit''': ?? / 60 / ?? (Easy / Medium / Hard)&lt;br /&gt;
* '''Starting units''': Kaleh, Nym, Zhul, Garak&lt;br /&gt;
* '''Starting gold''': 300&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Scenario-specific gameplay rules&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to the two-sun daily cycle for this entire campaign, this particular scenario has more particular rules involving water economy, which make it play quite differently than usual: Your refugees are traveling through an &amp;quot;extra-barren&amp;quot; area and they are short on water-skins and even food. They are therefore at risk of ''dehydrating''. The rule for this effect triggering is:&lt;br /&gt;
&lt;br /&gt;
If a unit is:&lt;br /&gt;
&lt;br /&gt;
* At the ''beginning'' of a turn,&lt;br /&gt;
* during the ''day'': any of Dawn, Morning, Midday, Afternoon, Dusk;&lt;br /&gt;
* On a ''sandy'' hex: sand, road, rubble or sand-dunes;&lt;br /&gt;
* ''Without a nearby healer'' - a Shaman, Mystic etc. standing in an adjacent hex;&lt;br /&gt;
&lt;br /&gt;
Then the unit will experience &amp;quot;thirst&amp;quot; and lose:&lt;br /&gt;
&lt;br /&gt;
* - 4 / 5 / 6 HP (Easy / Medium / Hard)&lt;br /&gt;
* -1 point of damage on each attack (melee and ranged)&lt;br /&gt;
&lt;br /&gt;
with the effects being cumulative. The HP loss may be healed by any healer, during the day or the night - but the attack degradation is only healed at an oasis, i.e. by being located on a water hex at the beginning of a turn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may be wondering &amp;quot;What about staying in villages?&amp;quot; - well, there are effectively no villages along your way. Instead, the water hexes of oases heal 8 points of damage, regardless of the source of damage, in addition to removing the effects of dehydration. Thus, an oasis becomes a point of healing, surrounded by no-damage grasland hexes where you can roam free without a healer buddy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Map Layout&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a long vertical map. You start at the South end and move North. At your destination there's the headquarters The Black Hand, a band of outlaws. (Not that it's clear what being an &amp;quot;outlaw&amp;quot; even means in a tribal, stateless, semi-nomadic society and in the middle of the desert, but whatever.) Between you and them, other than desert, dunes and mountains, are 4 oases; these are located at east and west edges of the level, with occasional short stretches of road peeking out of the sands, indicating the direction of the next one. The oases are (in order):&lt;br /&gt;
&lt;br /&gt;
# The small oasis you start in.&lt;br /&gt;
# An oasis with Giant Scoprions.&lt;br /&gt;
# An oasis with a contigent from an outlaw band, The Black Hand ().&lt;br /&gt;
# An oasis surrounded by a castle (complete with a keep and a leader), inhabited either by:&lt;br /&gt;
## A colony of Ogres, or&lt;br /&gt;
## A Wight with his undead minions&lt;br /&gt;
# A &amp;quot;mirage oasis&amp;quot; which disappears as you near it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Recruitment and formation&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
While 60 turns might sound like a lot, your navigation in this level is quite constrained: In the day, by the risk of dehydration, and at night by roving Ghosts (see below). So, don't stay in the keep too long; you should be able to handle everything you'll run across with a single castle's worth of troops (6 units) if you're careful. If you're not careful, it doesn't matter how many troops you get. Also, remember there are no villages on your way, and all of your recruits are supported &amp;quot;out-of-pocket&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
All your recalled/recruited units can become dehydrated - including healers, therefore you should keep your healers in pairs. A reasonable formation is a &amp;quot;hedgehog&amp;quot; around Zhul and a Quenoth Mystic:&lt;br /&gt;
&lt;br /&gt;
      __&lt;br /&gt;
   __/U \__&lt;br /&gt;
  /U \__/U \&lt;br /&gt;
  \__/H \__/&lt;br /&gt;
  /U \__/U \&lt;br /&gt;
  \__/H \__/&lt;br /&gt;
  /U \__/U \&lt;br /&gt;
  \__/U \__/&lt;br /&gt;
     \__/&lt;br /&gt;
&lt;br /&gt;
or along a diagonal axis:&lt;br /&gt;
         __   &lt;br /&gt;
      __/U \__&lt;br /&gt;
   __/U \__/U \&lt;br /&gt;
  /U \__/H \__/&lt;br /&gt;
  \__/H \__/U \&lt;br /&gt;
  /U \__/U \__/&lt;br /&gt;
  \__/U \__/&lt;br /&gt;
     \__/ &lt;br /&gt;
&lt;br /&gt;
this is 10 units: 2 healers ('H') + 8 any other ('U') = 4 starting units + 6 recalls/recruits. Out of those six, make one the Mystic/Shaman; another - a Quenoth Scout, and the other four could be, say, two Quenoth Fighters and two Tuaroch Riders.&lt;br /&gt;
&lt;br /&gt;
Why place the two healers adjacent to each other? Because a healer, by him/herself,  is ''not'' in itself safe from dehydration, so the healers must support each other.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Strategy&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your hedgehog will begin following the remains of the old road East-North-East.  You won't be able to keep the hedgehog together if the group travels faster than 5 hexes per turn - the speed of the slowest unit - so that Scout you got will not be very effective right now beyond increasing you range of view.  That's okay, we'll be able to let it loose soon. At night, of course, you can break this formation - but you must reform it before Dawn to avoid dehydration.&lt;br /&gt;
&lt;br /&gt;
One reason you might break formation at night is your being attacked by roving ghosts: Indeed, in most areas (outside oases), and at every turn of night (including dusk but excluding dawn), one or two Ghosts will appear near to your units, to &amp;quot;prey on the weak&amp;quot;. You're not all that weak, but a Ghost may be able to pick off a wounded character of yours if you just keep the hedgehog formation. If your characters have high HP, you have the option of just ignoring the Ghosts' harassment - after all, your units are ineffective against them (except for Garak), and they against you with your good sand defense; they will spontaneously disappear at dawn. &lt;br /&gt;
&lt;br /&gt;
You should arrive at the second oasis at about first-dusk, and promptly be attacked by the Scorpions - who have decent desert movement and vision range - plus the roving Ghosts. Focus on the Scorpions first, unless you can land a terminal blow on a low-HP ghost; in fact, the Ghosts might even attack some Scorpions for you.  After you take out the Scorpions, you'll find a Traveler's Ring.  This artifact will make the designated unit invulnerable to hunger and thirst.  Give it to your Scout; it can take off on its own without getting dehydrated.&lt;br /&gt;
&lt;br /&gt;
If you somehow got dehydrated on day 1, or took a really bad beating - you might wish to rest in the oasis (remember: +8 HP in the water) before reforming your hedgehog; the bandit bathers' oasis is due West-by-Northwest.&lt;br /&gt;
&lt;br /&gt;
As you approach the midline of the level, you'll find it a hilly region infested by several Ogres. Despite their high HP, they're not so difficult to beat, since they're slow in sand and will not all gang up on you; they're not Chaotic, so they won't get a bonus when you're able to break formation; they have no ranged attack; and - if you catch them on sand hexes, you'll have twice their chance to hit. A Pathfinder (leveled Scout), Nym, or Kaleh - with the hunting skill - can slow them down to make sure even their relaliation loses its sting. The issue you may have here is your formation, which will likely break up (unless you go very slowly), and in daytime will result in some dehydration - that will be a handicap in your next encounter.&lt;br /&gt;
&lt;br /&gt;
If you dispose of the entire group of Ogres, you'll receive a special treat: A Loyal [http://units.wesnoth.org/1.15/mainline/en_US/Dust%20Devil.html Dust Devil] - an elemental earth spirit. It has a respectable arcane-type melee attack, and a nice impact-type swarm ranged attack - both effective against the Undead. If that's not enough - it has 8 MP and low movement cost over most terrain, _and_ it has at least 50% defense everywhere, _and_ it recovers 6 HP per turn on sand or dirt hexes; so it's an excellent scout. It won't be your &amp;quot;tank&amp;quot; against the Undead, though, due to limited HP and its vulnerability to cold and arcane attacks.&lt;br /&gt;
&lt;br /&gt;
The Black Hand's pool outing oasis is next: You'll find a mixed bag of Bandits, Thugs, Poachers and Trappers enjoying the pool (after all, it's not like they have a lot of crime to attend to). If you had your Scout in their sights before, they might have even joined the fray against the Ogres and yourself. By now should have some extra leveled-up units, so it won't be anything you can't handle - especially if you make sure to fight in daytime. The main issue here being the hills and the Ogres having impeded your formation. Depending on how effective you are in keeping everybody together, you might have some units go into battle wounded rather than wait for the healers to attend to them. When you are done here tack East-by-Northeast towards the castle oasis.&lt;br /&gt;
&lt;br /&gt;
Close to the castle, you'll chance upon a Red Mage named Elyssa, who is being changed by a force of skeletal units. You'll obviously save her - you just let her fill the empty spot in your hedgehog formation (with the scout no longer needing its former spot). Remember she's very effective against the Undead - but you need to keep her safe from the counter-attacks of Skeletons and Revenants.&lt;br /&gt;
&lt;br /&gt;
As for the castle itself - there is some random roll-of-the-dice which decides whether you'll find Ogres or the Undead in it. If it's the Wight leader (an L2), it will have an &amp;quot;honor guard&amp;quot; of four units (Ghosts on Medium difficulty), and will have amassed some money for recruiting (it has a high base-income despite the lack of villages). Remember that Wights are quite mobile, and this one won't hesitate to leave its castle to target someone vulnerable.&lt;br /&gt;
&lt;br /&gt;
The last (non-)oasis has a signpost at its entrance, announcing you've reached the home of the Black Hand of (existentially-unemployed) outlaws. When you cross some horizontal line, they will have already begun recruiting in earnest - and between the leader's basic income and their tent villages, they can recruit two units each turn without any gold reserves... So, hurry North. The leader of bandits is named Thorn, an L2 Outlaw (on Medium; probably a fugitive on Hard); when you take him out, he bargains for his life - and when you accept, he takes all of the remaining bandits with him. &lt;br /&gt;
&lt;br /&gt;
The bandit leader's offering in exchange for his life is a vial of Holy Water. As you may recall from other campaigns, the unit which picks it up has its melee attack change type to arcane. Choose carefully - you probably want to give this to a unit with a pierce-type attack, add&lt;br /&gt;
Now you have a second unit with a highly-effective attack against the Undead (in addition to the trampling Tuaroch riders).&lt;br /&gt;
&lt;br /&gt;
When you complete your objectives, you get a 20-per-turn early finish bonus (which doesn't correspond to the number of villages), before carryover deduction.&lt;br /&gt;
&lt;br /&gt;
== A Stirring in the Night ==&lt;br /&gt;
&lt;br /&gt;
* '''Alternative Objectives''': &lt;br /&gt;
** Survive until the (elongated) night is over with no more than 6 villages lost, or&lt;br /&gt;
** Defeat both Undead leaders&lt;br /&gt;
* '''Must survive''': Kaleh, Nym, Zhul, Garak&lt;br /&gt;
* '''Starting units''': Kaleh, Nym, Zhul, Garak&lt;br /&gt;
* '''Turn limit''': ?? / 12 / ?? (Easy / Medium / Hard)&lt;br /&gt;
* '''Starting gold''': 200&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Layout&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This map is on the small side compared to the last scenario - it's just the surroundings of the Elves' encampment for a single night: Tents/villages and some bonfires, on sand and sandy hills, at the edge of proper hills with a bit of forest. The right of the level is a North-South path between the (5-hex + keep) castles of two Undead leaders: A Lich and a Death Knight. They are, in fact, each other's enemies, and you are just in the way: One of your villages is almost smack on the path; and four more are close to it (one turn for a Ghost, two turns at most for other Undead, from the path). Your castle is on the left of the level, with an oasis blocking the way - meaning it takes a few turns to get from there to where the action is.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Strategy&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This scenario has a special consequence for the rest of the campaign: Whenever you lose a tent/village to enemy forces in this scenario, its inhabitants are turned to un-death, i.e. part of the group Elvish survivors from your village is lost. The consequence: Higher recruitment price for units, for the rest of the ''entire campaign'', if more than 3 tents/villages are lost. And it doesn't help if you regain a village - those inhabitants are just gone. So - protecting villages from the Undead is job #1. &lt;br /&gt;
&lt;br /&gt;
Seeing how the rival Undead forces are fighting each other, not you - you would expect that such protection shouldn't be that big of a deal. Unfortunately, they seem to be rather fond of tents... Undead units will opportunistically leave the N-S path to capture a tent/village - particularly the high-mobility units like Ghosts and Bats. On the other hand, the Undead also crave mortal flesh (a little retroactive pun there), so when faced with a choice between a village + sentry and an empty village - they won't always go for the village, especially if it's farther away from the N-S path. Still, play it safe and try to man villages that are within an enemy's movement range, whenever this is tenable.&lt;br /&gt;
&lt;br /&gt;
This scenario feels quite different depending of how frugal and speedy you were in your voyage North. If you were reasonable and kept a tight formation with ~10 or a few more units, and didn't meander too much - you should be awash in gold. If that's the case, you will probably want to aim for the two Undead leaders; three rounds of recruitment/recall should be sufficient in this case. on Hard, that might be less feasible even with the extra gold, or require much more cannon fodder. If you've started this scenario with a lot less gold then you're in for more of a challenge, and will be hard-pressed to take the maximalist stance of &amp;quot;no village left behind&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The first couple of turns of the level, though, are not effected by your recruitment - since even scouts will take until turn 3 to even arrive at the Eastern villages. An important first dilemma is whether to protect that easternmost village in &amp;quot;no-man's land&amp;quot;, in the middle of the path. Do that, and you've guaranteed most of the Undead's attention will be directed at _you_: They have to go through you to get to their rivals anyway. &lt;br /&gt;
&lt;br /&gt;
As for recruitment and recall - bear in mind that all fighting will be at night - a major disadvantage for you vis-a-vis the Undead. That means it is even more important to utilize their movement impairment in the sand, to isolate and gang up on them. And you will have a lot of switching-of-positions, to get to villages which come into danger: The Bats and Ghosts will fly around you, and later there's another surprise (see below). Fighters will be rather un-useful for this purpose - slow (even the quick ones) and with the wrong attack types (except if one of your fighters took the holy water potion); Tuaroch riders have Impact attacks, and if you have L2 stalwarts they'll defend pretty well from the skeletal units - but they're even slower; when you recall or recruit some on turn X, they will come into play on turn X+3 or X+4 (!), and will be mostly limited to one region of the map. &lt;br /&gt;
&lt;br /&gt;
This means that, in this scenario, the Dustbok riders - the Scout line of units - must shine. You'll need quite a bunch of them to support and replace your early-turn front-line units. They bruise easy, but remember that, after being attacked, they can retaliate and retreat on he same turn (their Disengage ability) - this will come in very handy. You will likely find yourself attacking with a wounder Scout, moving it away, then replacing it with a fresh one, on the same village, and attacking again. When leveling Scouts on this level, Pathfinders will be much more useful than Archers, due to their ability to Slow. This is important to reduce your losses against the damage-bonus-enhanced Undead.&lt;br /&gt;
&lt;br /&gt;
If you plan on disposing of the Undead leaders, try moving in earlier rather than later, even at the price of unit losses, because both leaders make 20 gold per turn before any income from villages, and will often recruit a pair of units per turn. Keep in mind that voodoo ceremony Garak undertook before this battle: If you keep him in good health, he can repeat his attack on an enemy target again and again: The Lich is where you should send him, since its melee is much weaker than the Death Knight's.&lt;br /&gt;
&lt;br /&gt;
On Hard, you're more likely to be on the defensive throughout the scenario - requiring some good luck, as well judicious use of slowing and leadership. If any of your Archers have leveled-up to be Desert Rangers, their Backstab ability may also come in handy.&lt;br /&gt;
&lt;br /&gt;
On turn 7, a contingent of Orcs - a patrol? - moves down the path from the Northwestern outcropping. These are certainly easier to deal with - you can properly stab them; but that doesn't make their weapons sting any less. Make sure and keep your terrain benefit by sticking to the sand. Their leader, Ganthos, has no keep - but he does have an income; so if you let him, he will sneak down the Western edge of the map and use your own keep while his minions ravage the encampment. Finally, note that the Orcs are quite willing to attack the Undead, not just your own units, and may do so if a lot of the Death Knight (Northeast leader)'s minions remain.&lt;br /&gt;
&lt;br /&gt;
Garak will meet his demise at the end of this scenario, in a rather arbitrary way (which, even after being foreshadowed, seems rather arbitrary). But - you can't let him die earlier.&lt;br /&gt;
&lt;br /&gt;
== Descending Into Darkness ==&lt;br /&gt;
&lt;br /&gt;
Starting now, you lose the comfort and protection of the sand. The terrain here is primarily hills and mountains, interlaced with river and swamp.  When you initially step into the mountains, Goblins will appear.  The mountain road forks West or North.  The western fork leads you to a bridge over the river that has a village on either side.  Stepping anywhere close to here triggers the appearance of more Goblins and some Naga led by an Orcish Slayer [or Assassin on Easy difficulty].  It's probably more fight than the two villages are worth.  However, if you're playing on Medium or Hard, you have to fight these sooner or later - may as well face them now before you get too busy.  Plus, you can choose to face them during daylight.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The northern fork takes you over another bridge to the keep of Panok the Direwolf Rider.  He moves ridiculously fast, so you might have a hard time pinning him down.  His troops are mostly Goblins, so consider him to be a warmup for the tougher foes you'll face in the caverns.  Upon his death, he drops a ring and possibly triggers the Naga and the Slayer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From here, there are two roads: the North, and the West.  Both lead to tunnels into the mountains, and each ends in the keep of an Orcish Warlord [Orcish Warrior on Easy].  The exit tunnel could randomly be behind either keep.  Though the two keeps are linked by paths inside the mountain, it might be quicker overall to leave Kaleh outside until you determine whether he needs to go East or West.  You could either split your troops and tackle the entrances separately, or send the whole bunch down the closest hole.  In that case, expect a pitched battle as the furthest Orc reinforces the nearest.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The turn after Kaleh first enters either cavern, he will be pursued by a Cloaked Figure/Dark Assassin.  It doesn't matter if Kaleh is surrounded, the Assassin will temporarily displace any Elf or Orc that is in his way when he appears.  Other findings:&lt;br /&gt;
*If you follow the river where it enters the mountain, it will lead you to a Goblin Impaler guarding a treasure chest.  Not exceptionally tough, but he will fight from solid ground while you stand in the water.  The chest contains 40 to 80 gold.&lt;br /&gt;
*Continuing around the river, there is a passageway [coordinates 18,10] that ends in a pool.  If you step into the pool, you will find a glowing blade.  You may choose to either take it or leave it.  If you take it, that character's melee attack will now deal cold damage, but a monster will appear to block your escape.  It's only level one [and cute at that!], but again it will be on dry land while you will be starting in water.  It's kind of a long trip, so you'd be unlikely to finish it before the end of the scenario unless you send a Scout or other fast unit.  Alternately, if Nym didn't get the Holy Water, have her get it.&lt;br /&gt;
&lt;br /&gt;
== A Subterranean Struggle ==&lt;br /&gt;
&lt;br /&gt;
You're in a tunnel headed East.  Soon you will see a squad of Giant Ants in front of you, while a Cave Spider tries to sneak up behind you.  You can ignore the Ants for now, as the Spider is more dangerous: it poisons with its melee attack and slows with its ranged attack.  Eventually you find yourself in a great chamber where Dwarves and Trolls are doing battle.  You are forced to choose which side to ally with, and then you will be required to eliminate the other side.  Your choice will stay with you for a few more scenarios, as the campaign forks after this.  Fortunately, there is a keep right in front of you, though the battle is currently raging in it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Soon after choosing sides [probably about the time you get your keep clear], your opponent will pull a sneak attack that nearly wipes out your allies.  Most of the rest retreat.  The ball is now in your hands.  Three turns later, they make it up to you by giving some of their troops for you to command.  Finally, some loyal troops.  If you are allied with the Dwarves, the two tribes of Trolls are Southeast and Southwest from your keep.  If you are allied with the Trolls, the two tribes of Dwarves are Northeast and Northwest from your keep.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Guard Kaleh well: some time after receiving your reinforcements, the Cloaked Assassin will reappear.  This time s/he will Slow Kaleh and take up to half his hit points.  There's some more crazy talk, and the Slow effect lasts until the Assassin has been removed again.  Note that even if your troops now succeed in destroying the enemy tribes, this scenario won't end until the Assassin has been dealt with.&lt;br /&gt;
&lt;br /&gt;
==Diverging Campaign Path==&lt;br /&gt;
===In the Tunnels of the Trolls===&lt;br /&gt;
You start in a small keep with few places to go.  The tunnel leading West is where you just came from.  To kick things off, move a unit to the East-most dirt hex.  At the end of the turn, Dwarven demolitions will make this wall an entrance to the Troll kingdom.  You will immediately see a Troll leader and his minions in a keep.  Don't get too excited; he's not your target, merely an outpost.  However, the clock is ticking, so finish them off quickly.  Afterward you might wish to use his keep to recruit an additional healer to support Zhul, and if you have a unit with the cold blade bring them as well.. Since it costs no upkeep, you may as well recall all the Dwarves that you've been given by your allies.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This cavern has exits leading North, East, and South.  North only goes to the edge of the map.  East leads to some Trolls interrogating some Dwarves.  Play your cards right and you'll be able to rescue a Dwarvish Stalwart, who joins your party out of gratitude [though he's not grateful enough to be Loyal...].  South is the exit going toward the objective.  This leads into a large lava cavern.  Similar to the second scenario, you'll need to keep as many troops as possible gathered around a healer.  However, the lava hexes are not safe for your units to end their turns on, other than the flying units.  This is going to slow down your progress, as most units will not be able to use all their movement points.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Troll Shamen blow up the bridge going directly to them, so you'll have to take an alternate route clockwise around the rim of the lava pit.  They will conjure up a fire elemental to slow your progress; after you kill it, it will periodically regenerate.  Additionally, as you reach certain checkpoints the Shamen will create more Fire Guardians, though these don't regenerate.  When you reach the southern part of the rim, you'll be rewarded by a small pool of water that will heal whomever is standing in it by ten points per turn.  The rim is interrupted here by a rock projection sticking out to bar your way.  After this, you have to proceed by &amp;quot;island hopping&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By the way, there are two passages on the western side of the lava pit that aren't strictly necessary to get to, but might be worth exploring [flying units only].  The lower is blocked by the ghost of a Dwarf who died in the upper.  Burying the remains of the Dwarf allows you to proceed further down the lower passageway to a Troll crypt guarded by a Zombie Troll Whelp.  Flying over the Chasm allows you to loot the crypt for the poison wand it contains.  Whomever picks it up will add poison damage to their melee attacks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When you reach the spit of land that the Shamen are standing on, one will run to the boss.  I got lucky in that the other chose to stand in the lava to get around me.  He was a lot easier to finish off then.  ;^)  After that, follow South and East.  The tunnel quickly narrows down to a single lane, and your progress will be impeded by some Whelps.  The lair has a pair of alcoves containing Troll dead, who will eventually be turned into Zombies to further slow you down.  By the time you deal with these and the army of Trolls the boss is recruiting, you might not have much time left.  Finally take out the other Shaman and the Chieftain.  Good luck!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Big&amp;gt;Dealing With Dwarves&amp;lt;/Big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is mostly just dialog, though if you have kept Elyssa alive she will decide to stay and study the Dwarves.  As a parting gift, she presents you with a flaming sword, and you can recruit/recall any unit to take and deal out fire damage.  Too bad she'll be drowning soon.  The other bad news is that all of your loyal troops will also be staying down here when you go up into the outer world.  Only one Dwarf will volunteer to guide you.  If you saved the Stalwart, it'll be him.&lt;br /&gt;
&lt;br /&gt;
=== In the Domain of the Dwarves ===&lt;br /&gt;
You start in a small keep with few places to go.  The tunnel leading East is where you just came from.  To kick things off, move a unit to the West-most dirt hex.  At the end of the turn, Troll fire magic will make this wall an entrance to the Dwarven kingdom.  You will immediately see a small contingent of Dwarves in a fortress.  Since it costs no upkeep, you may as well recall all the Trolls that you've been given by your allies.  If you're going the send Zhul after the hidden bonus, you might also want to bring in another healer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The area around the fortress has several tunnels.  Going clockwise from your current position, the South-East avenue only goes to the edge of the map.  South-West leads to a humorous scene of a Dwarven drill instructor berating his troops.  Bring two mid-level Trolls, preferrably a mix of melee and ranged types to deal with these.  Past this will be a Troll being tortured by a Dwarf.  He pretty much rescues himself, but joins your party out of gratitude.  North-West is the exit going toward the objective.  North is a Dwarf guarding what will become a dead end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The main path crosses two single hex wide bridges over a chasm.  After you push the Dwarves back to the bridges you can fly Zhul over the chasm to support your front line.  The leader of this Dwarven contingent challenges you to get up close and personal.  After you do, however, he blows up the main entrance to the Dwarven Keep.  Now you'll have to make a right turn detour through the Black Lake.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By the time you get your feet wet, you'll see a Dread Bat and some Giant Tentacles.  If Zhul hasn't been upgraded to Desert Star yet, the Bat might be a tough match for her.  Maybe have her hang back until the bat has been fireballed or rocklobbed.  After the rest of your troops finish wading through the lake, they'll take the left.  If you're going after the goody, have Zhul perhaps assisted by a Troll companion occupy the island in the northern part of the lake.  There is a Dwarven Hermit speaking some Gollum-like speech.  When he dies all your troops will have access to his amulet, which is basically a key.  Send somebody to the South-East portion of the lake, where the amulet will get you past the concealed door to reveal a Dwarven crypt.  Avoid the Dread Bat in his keep on the East side of the lake.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anybody can do it, but wading through the water will take prohibitively long for characters who can't fly.  If it were appropriate to the topic, i'd question why somebody who can easily fly over a Chasm can't fly over Deep Water, but it's not.  Anyway, looting the crypt gets you a belt of strength that is supposedly good for 12 additional hit points.  I say &amp;quot;supposedly&amp;quot; because I've repeatedly seen Zhul end up with 52 hits, not 53.  Zhul could really use this, as she gets no additional hit points when levelling up to Desert Star.  You won't be able to see the crypt, but it's in the center of the chamber at the end of the tunnel.  Even with flying here, i had a hard time getting there before the Dwarf Chieftain was dead.  I had to replay the end of the turn several times, as he repeatedly kept suiciding himself on my Druid.  Anyway, upon putting on the belt your exit will be blocked by a ghost.  It'll be kind of tough, but hopefully the chieftain will be dead before you're on the ropes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Back to the mainland, the Chieftain and his troops will be almost directly west of where your people get back on land.  There's a wall in the way, though, with entrances on both the North and South portions of it.  The southern route is slightly closer, but is also a chokepoint.  Send some faster troops the northern way to attack the Dwarves' rear.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Big&amp;gt;Talking With Trolls&amp;lt;/Big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is mostly just dialog, though if you have kept Elyssa alive she will decide to stay and study the Trolls.  As a parting gift, she presents you with a flaming sword, and you can recruit/recall any unit to take it and deal out fire damage.  Too bad she'll be drowning soon.  The other bad news is that all of your loyal troops will also be staying down here when you go up into the outer world.  Only one Troll will volunteer to guide you.  If you saved the victim of Vengeful Dwarf, it'll be him.&lt;br /&gt;
&lt;br /&gt;
== Out Of The Frying Pan ==&lt;br /&gt;
Thankfully, this is the last of the underground fighting.  It's too bad you can't recruit more of the Dwarves/Trolls you've allied with, as they could really help here.  Your opponents have dammed the river and the whole tunnel system is being flooded.  This is bad: every turn you will lose several hexes of floor.  Recruit/recall no more than a single castle's worth of troops, as you'll lose more to drowning than to fighting.  Actually, it's best to not recruit any units, though you should recall the Dust Devil, since it is loyal; you are going to need your gold later at a second keep, and you don't want to pay upkeep until then.&lt;br /&gt;
&lt;br /&gt;
It is best to play this similar to &amp;quot;The Elves Beseiged&amp;quot;.  Don't fight any more than you absolutely have to, prefer to instead move past the enemies and let them drown behind you.  Water areas that you haven't seen yet won't rise, so don't send fast scouts ahead of your slower troops (an exception: the Dust Devil doesn't trigger the &amp;quot;more water&amp;quot; events, except for the one at the end of the secret passage).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The first cavern will have your exit blocked by three of your opponents, be they Dwarf or Troll.  Next is a scattering of Giant Ants.  They don't put up much of a fight.  The exit is the North West tunnel.  The following cavern is populated by three humans who decide  to attack you.  The tunnel behind them is also flooding, so you need to make haste to the western tunnel.  The next cavern is marked by a magical warding [looks like clouds] that blocks passage except through the red rune 'gate'.  It won't hurt to step onto the rune, but upon leaving it the lead character will be burned for 25%-35% of their total hit points while both gates disappear.  Also, a variety mix of undead will suddenly appear in the chamber.  Some of them will gather around around the entrance chokehold, so you'll need skirmish ability to effectively assist the now lonely lead character.  If you have Grog, best to send him in first, as he can heal up the damage by the time the battle is over.  Also, his impact weapon is best used against the skeletons in the back of the room.  The same goes for Rogrimir, naturally, but he'll need healing afterward.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is a secret door at 24,49 that will lead you around the red rune room.  It has more water there, though [not to mention the Soulless], so it's another opportunity to have good troops drowned.  The cavern where this tunnel connects back behind the red runed room has two blue runes that will heal whomever steps upon them to 100%, but not cure poison.  They are also only good for a few uses, so probably just use it to heal Zhul and your badly bruised ally.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The exits out of the blue runed room are thus: South is back to the red runed room.  South-West is the water-logged Soulless.  North-West is the 'Training Room'.  A ghostly teacher in back of the room runs his ghostly students through weapons drills with you as targets.  Destroying the students is not helpful, as the master keeps reanimating them.  You need to take him out, but the Zone of Control of the students keeps you from getting to him.  Yet another call for the Skirmish ability.  I don't bother going in there, as there's no real gain for the amount of time you'll have to spend here.  What i like to think of as the 'main exit' from the blue runed room is due north.  This leads to a sleeping area where you will be assaulted by the skeletal remains of its former inhabitants.  Your ally should have half of them cleaned up by the time the last of your troops gets in.  This route is slightly longer in terms of hexes than going through the Training Room, but i still get through in fewer turns.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besides, there is a goody to be had this way: North of the skeletons is the lab area.  You'll find the secret door at 17,36.  Inside, you'll find a red rune blocking the way, then two more further up.  Stepping upon the first rune causes the character to suffer the usual 25%-35% damage PLUS poison.  Then the other two runes are covered by angry monsters [failed experiments].  Both are first level.  Behind them is a Frankenstein-style monster trapped in a ring of fire.  If you Skirmish past the two, you can break the ring to release the second level Flesh Golem.  It will fight for you.  You have to be careful, as its Berserk fighting style can be a double edged weapon.  Nonetheless, it can be useful to have another Chaotic fighter on your side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next room beyond either the Training Room or sleeping area is the sacrificial altar.  Setting foot in here conjures two second-level fire demons the next turn.  Bring out your Cold Blade and whatever ranged weapons you have handy.  Note that every time you step on the tiled floor around the altar you are given the chance to pull a lever.  Do not pull the lever until all your people are in this room and ready to leave.  Pulling the lever opens two secret passages behind the Altar.  The eastern is your exit; the western is flooded.  Six turns after you pull the lever, the entire temple area will be Deep Water.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The exit goes through a Crypt area that is guarded by a Spider Lich.  It is tough, but vulnerable to Fire and impact damage; you should still have both.  After you leave the Crypt, you will again be stopped by: the ever mysterious Cloaked Assassin.  This time you are able to capture him and get his whole sad story.  I think it was about turn 30 or so that i got my people past the dangers of the raging waters.  Woo-hoo!: you've made it out into the sand again, and are ready for some real fighting!!  Fortunately there's a rather haughty group of humans who seem to think your people are meant to be sacrificed to their 'Dark Lady'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By all means, start recalling troops to teach them a lesson.  You probably need to spend all your gold.  Figure the opposition is 20-something in Sergeant Durstrag's tribe plus five messengers and periodic visits by vengeful undead.  These will mostly just bother your troops who are near the South end of the valley.  Don't bother looking for the messenger; it isn't on the map yet.  At some point, a messenger will materialize just East of the oasis.  After taking him out, you only have a half dozen or so turns to finish off Sergeant Durstrag or another messenger will be created, along with his escorts.  Don't forget the chest of gold just South of your Keep.  If the battle goes on long enough, the flood waters will eventually come out of the side of mountain on the West end of the valley and make a new river.&lt;br /&gt;
&lt;br /&gt;
== Blood is Thicker than Water ==&lt;br /&gt;
Out of the frying pan, into hot water!  Let's break this down into parts for each objective:&lt;br /&gt;
===Free the Mermen===&lt;br /&gt;
If you click too rapidly through the introductory text you will miss some crucial details: Namely that your enemies lie to the northwest, and that you're looking for ''five'' merfolk.  It's worthwhile to get them all, as each will become a loyal troop once freed from the cage.  The humans are Loyalist factioned in three tribes.  They are not the mysterious 'Iron Council', just followers.  The leader is a third level commander while the other two are second level lieutenants.  Depending on the level of difficulty, you could be seeing things like Shock Troopers, Swordsmen and Cavaliers.  Probably about three keeps worth should be good.  If you wipe out all the bad guys before the sacrifice, but don't free all five merfolk, your troops will just wander idly until the time of the sacrifice.  Freeing the fifth mermaid starts the rebellion, thus potentially saving a few turns for the end of scenario bonus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's easy to miss the the fifth Mermaid, as she is hidden in the small cave just north of the eastmost humans' keep.  This is in deep water, so the land lubbers won't be able to help.  Have the Mermaid Priestess and another Merman approach the island from the East side.  The cage there holds a Mermaid Enchantress and is guarded by a few Walking Corpses/Souless.  The other large island in the Northwest is closed off, you won't be able to get there yet.  If it isn't obvious, use your freed merpeople very sparingly on land.  Unless the humans are standing on the shore, or otherwise making themselves easy targets, just park your finny allies in the water.  Sometimes they can jump on a village to prevent a wounded bad guy from getting a rest.  If you have dealt with all the humans before turn 16, don't just stand around.  Start shifting all the elves where they will next be needed next: the east side of the mainland and the eastmost island.  Dwarves, Trolls, and Golems move slowly enough that they probably won't make it to the rebels before the rebellion is over.  May as well leave them on the North-West island [the village at 20,23 is a good location] in readiness for the third objective, possibly accompanied by any of your elves with a move of 5.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On turn 16, any merpeople still caught will be pan-fried in a little butter as an offering to the Dark Lady.  This is performed by a briefly seen Necromancer named Hekuba.  He is a member of the Iron Council.  Or is that an Iron Chef?  Should any leaders of the Loyalists still remain, they will depart to prepare 'Plan B'.  Sigh.  It was so much easier to get to them on the mainland.  If they are all dead, the Iron Council will then begin 'Plan C'.&lt;br /&gt;
===The Rebellion===&lt;br /&gt;
After the Dark Lady is newly invigorated by the sacrifice, the apparition of Eloh appears to (and appeals to) one of your elves.  He expresses his faith in the apparition, and challenges you for leadership of the elves.  You'll have to fight him for supremacy, and you won't be able to recruit new troops until this is over.  Zhul will be torn between her admiration of Kaleh and Eloh.  She will go to Eloh and sell Kaleh's goodness.  The apparition rebuffs Zhul and petrifies her.  If you don't have any other healers you might wish to recall some before making the long trek East.  The rebel base is the northeast island.  This was inaccessible to non-swimmers, but the merfolk will show you some Shallow Water paths to the island.  If you're feeling shorthanded, you can wait offshore (backed up by a healer, of course) and hammer the defenders in the water.  They seem quite eager to rush out to you.  It might take a little longer this way, though.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As you approach the island, some Crab Men will appear and attempt to eat you.  They're not terribly tough, but they're in their natural element and you're not.  As insurance, have the ranged attack merfolk provide a screen in the deep water around you.  The melee attack merfolk could perhaps approach the island from the north side.  There is a river that goes right to where Eloh is standing.  Four successful hits from Merman Warrior can do it...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have Kromph, the Flesh Golem, it will soon fall under the sway of the Dark Lady.  It talks to itself for a few turns as a warning.  When that happens, best surround it with ranged attacks.  It changes sides on the beginning of your turn, so you can blast it before it gets a chance to attack.  If you manage to strike down Eloh before she complete's Kromph's sub&amp;amp;shy;&amp;amp;&amp;amp;shy;&amp;amp;shy;shy;version, her final command to it causes it to collapse into a heap of confusion.  Oh, but we barely knew ye...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If your costs to recruit are high as a result of the battle between the Spectres, it might interest you to know that the rebel elves are not your target - Eloh and Tanstafaal are.  Whenever you destroy the apparition and capture Tanstafaal, the remaining elves will automatically switch over to your side.  You might not want the extra overhead for the rest of this scenario, though.  Besides, they screen Tanstafaal so well that most of them will have to be done in to get to him.  Oh, and Zhul comes around after the apparition is gone.&lt;br /&gt;
&lt;br /&gt;
===Capture Ships===&lt;br /&gt;
The next fight will take place on the formerly closed northwest island.  This is the home of the Iron Council - a trio of Necromancers.  Hekuba is their leader and stays on his keep.  The other two are free to move and not even shy about stepping into the water.  Nevertheless, they can hold their own out there at night.  Plan C is the Necromancers raising the seabed to provide Shallow Water paths from the island - they actually think they're attacking YOU.  Well, pride goeth before a fall.  With the settling of the rebellion, you are able to recruit again.  If you find yourself needing to do that, you have to chose whether it is better to use Tanstafaal's keep and march them all the way back West, or detour Kaleh down to one of the humans' keeps south of the action.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The troops of the Iron Council include a mixed bag of skeletal types and if plan B is place the human leaders will also be here.  Hekuba can recruit the same troops as the humans did, plus more Necromancers, Skeletons/Revenants and Skeletal Archers/Bone Shooters.  You'll have quite a fight on your hands to make landfall.  After you do get on solid ground things aren't so bad.  Of course, if the enemy captures the island at 20,23, you'll have to fight them through the water twice.  It's probably better to continue to press them at night to prevent that.  It'll be a little easier to take on the Necromancers if you can level up the Enchantress and the Priestess.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The bad guys won't be able to destroy the ships.  For game purposes, the ships are actually villages.  Thus, the worst thing that can happen to the ships is they get recaptured.  The merfolk can't cross or occupy ship terrain - not even after they've been captured.  I suppose they would have a hard time climbing ladders.  When you have all four, the scenario immediately ends.  You might wish to finish off any of your opponents that are close before capturing the last ship.&lt;br /&gt;
&lt;br /&gt;
== Speaking With The Fishes ==&lt;br /&gt;
Just dialog.  A curiosity is that the queen of the Merfolk - Melusand - is giving all your people a seashell brooch, but doesn't say what they're good for other than they enable her to track your progress!&lt;br /&gt;
&lt;br /&gt;
== The Battle for Zocthanol Isle ==&lt;br /&gt;
Wow!  This time around you'll have to battle five tribes, plus bats.  You immediately have to head West along the southern shore of the island, searching for a keep.  You'll soon find a Saurian Oracle who looks like he doesn't really need the keep he's sitting in.  It's not a particularly tough fight, but you're under time pressure to immediately begin churning out units.  As soon as Kaleh takes his seat in the center of the keep, your loyal merfolk return bringing the remaining ships and a group of merfolk you can recruit.  They also capture the villages South of you, so you can immediately begin sending the troops North.  Zhul makes a comment about not needing gold if you lose.  I will simplify: this is the last scenario in which you do any recruiting, so you may as well bust the budget.  You still have to face down four tribes. From left to right:&lt;br /&gt;
&lt;br /&gt;
* '''Naga #1:''' If you follow the Shallow Water from your keep North, it'll lead to a small keep with a Naga Myrmidon.  His tribe is not heavily populated, but you'll see them first due to closeness.  Send half your loyal merfolk up there to deal with them, and recruit some new merfolk to assist.&lt;br /&gt;
* '''Undead:''' Not too far North of your keep will be a Draug recruiting a fairly strong assortment of undead: Blood Bats, Ghosts/Wraiths, various second level skeletal types, Soul Shooters, and Necrophages.  On higher levels of difficulty, there will be Spectres and Draugs as well.&lt;br /&gt;
* '''Orcs:''' On the northeast corner of the island will be a peninsula.  There you'll find a Orcish Sovereign recruiting a stiff mix of Orcs and leveled Wolf Riders, nothing under second level.&lt;br /&gt;
* '''Naga #2:''' On the east side of the island is more shallow water leading to another Naga Myrmidon.  He is a twin to the western Naga, but he'll have more time to recruit before you get to him.  Packs of Naga Hunters shooting poison can be deadly day or night.  You can take them out with a mix of fast Elves supported by Mermen and a healer.  If you're not used to recruiting merfolk, please note that the Mermaid Initiate is not capable of any healing or curing until she's levelled up.&lt;br /&gt;
&lt;br /&gt;
The other threat you'll face are the bats that show up every dusk and harry you until morning.  Easy difficulty gives you five Vampire Bats every night.  Higher levels of difficulty take away two of those, but add Blood Bats.  Like the Ghosts in the second scenario, these are not worth chasing after.  They will, however, pick off the weakest of your troops.  Anybody who is below 20 hit points is vulnerable at night.  Hedgehog like crazy at night, if you don't have enough units for a massive line.  If the bats don't see any likely targets, they will unflag any of your unguarded villages.  You don't need the money, however, so who cares?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As soon as you have the keep, victory conditions change to reaching the black citadel.  However, that'll take some work, as hordes of undead will soon begin pouring down your way.  If you dally in recruiting/recalling, you might get flanked by Direwolf Riders and packs of Naga on your eastern side.  Send the Dwarf/Troll (You ''do'' still have him, don't you?) along with Nym, Zhul and what's left of your initial landing to deal with the undead while the faster troops you recall head East along the beach.  By all means also send whomever has the holy water North. Your merfolk can nail down your watery flanks, both west and east. You'll also need some sturdy elves to block the gap between the lagoons.  You'll need another healer for the eastern front, and ideally a third to support the middle.  If you don't have the Mermaid Priestess/Diviner in the eastern group, better send along a Shyde/Star.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Melusand told you that the black citadel was in the center of the island.  It is, if by &amp;quot;center&amp;quot; you mean &amp;quot;north side&amp;quot;.  However, it is surrounded by mountains, so merfolk will be of no help there.  If any undead come to the coast, then merfolk spellcasters could be helpful.  There's a secret area off the northwest shore of the island that the merfolk could explore if they have nothing better to do.  A wrecked ship is guarded by a Sea Serpent.  Just South of the ship is a sunken treasure worth a little gold.  We're really not worried about gold anymore, however.  Northwest of the wreck is a sandbar containing another merman in a cage.  Inside is a badly wounded Merman Triton. You can send him and the rest of your mermen east across the top of the board and then down to the orc leader.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You might reach the black citadel before finishing off the Orc.  If so, victory conditions change: you will need to kill both the undead and orcish leaders before being able to open the door.  After finishing them off, victory conditions change again: now get any unit to the door of the black citadel.  Since you probably won't need ''everybody'' to take on the Orc, you may as well leave somebody near the citadel.  When the door is open, there's some drama that ends up in having Kaleh, Nym, and Zhul go into the citadel to again face the apparition of Eloh.  If your ally is still alive, he comes along as well.&lt;br /&gt;
&lt;br /&gt;
== The Final Confrontation ==&lt;br /&gt;
Earlier I alluded to the fact that during this battle you won't be able to recruit.  You come into a hexagonal cave/chamber that is partially paved and partly rock floor.  It somewhat reminded me of &amp;quot;The Duel&amp;quot; scenario ending the Eastern Invasion campaign.  It's just the people I mentioned in the last paragraph of the Zocthanol scenario: Kaleh, Nym, Zhul and possibly Grog or Rogrimir. The Apparition of Eloh will be in the front of you, and she will have charmed some of your young troops to use against you.  The objective is to defeat the apparition, quite possibly the easiest objective ever.  By all means have the ally go first, since he will move faster and defend better on the cavern floor.  When i did it, Grog the Troll Warrior took her out in a single move: both swings connected and she was done.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While this may not be as emotionally satisfying as having Kaleh or Zhul finish her off, it has the beneficial effect of leaving more characters able to move to fulfill the second objective.  The two recruits are freed from their charm, if you are able to keep them alive in this pit of despair.  After the apparition is gone you get to see &amp;quot;the man behind the curtain&amp;quot; so to speak.  The evil creature doing all this isn't a standard brand demon, but some relation to Cthulhu.  Yechnagoth is composed of a brain (Central Body), energy source (Pulsing Spires), and multiple fists (Crawling Horrors.)  Don't even waste your time attacking the Central Body yet.  Note that the Spires are a different team than the others.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As long as the Pulsing Spires are alive, the Central Body has 100% resistance to any attack AND it fully heals every turn.  Every turn it can attack any adjacent unit, spray slime [hurts 10-12 points and slows] on any unit in the cavern, AND summon one or more new Crawlers.  There is no turn limit, but you want to hurry before you get overwhelmed by Crawling Horrors.  Due to my lucky start, I was able to finish before turn 5.  The Spires have no melee attack, so hammer them as you reach them. (Well, even their ranged attack is nothing to write home about.)  Even though the paved parts of the floor all lead to the Central Body, try not to have any character end their turn next to it until the Pulsing Spires are gone.  You might find yourself using the hedgehog again, with characters not actively attacking surrounding Zhul to heal up from the constant depredations of the Crawlers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After you have taken out the third Spire, the Central Body becomes a Weakened Central Body, which is a much more reasonable opponent.  The healing stops, and the hit points, resistances and attack damages drop.  Again, two mighty hammer blows could finish it off.  Congratulations!  You've just won yourself a tropical paradise island!!&lt;br /&gt;
&lt;br /&gt;
[[Category:Campaigns - Walkthroughs]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=User:Shadowm&amp;diff=68061</id>
		<title>User:Shadowm</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=User:Shadowm&amp;diff=68061"/>
		<updated>2021-06-11T16:44:57Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: Replaced content with &amp;quot;== Subpages ==  These are mostly new or updated pages I'm working on at the moment (assuming I didn't forget about them), although they may also include other content of m...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Subpages ==&lt;br /&gt;
&lt;br /&gt;
These are mostly new or updated pages I'm working on at the moment (assuming I didn't forget about them), although they may also include other content of my own.&lt;br /&gt;
&lt;br /&gt;
{{Special:PrefixIndex/{{FULLPAGENAME}}/}}&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Support&amp;diff=68002</id>
		<title>Support</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Support&amp;diff=68002"/>
		<updated>2021-05-28T10:27:44Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
There are many ways to get help — from online documentation to support from the community on Discord, IRC or forums. If you are experiencing problems, you should consider [[ReportingBugs|reporting a bug]].&lt;br /&gt;
&lt;br /&gt;
== Forums ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul style=&amp;quot;-moz-column-count:2;-webkit-column-count:2;column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;[//forums.wesnoth.org/ Official Wesnoth forums]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Glossary|Wesnoth Acronyms]] - forum lingo&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnoth.cn Chinese wesnoth forums]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://wif.altervista.org/index.php  Wesnoth Italian Forums (W.I.F)]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnothlife.ru/forum/ Russian Wesnoth Forums (WesnothLife)]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnoth.com.pl/news.php Polish Wesnoth Website]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://wesnoth.fsf.hu/ Hungarian Wesnoth Website]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www35.atwiki.jp/weswiki/ Japanese Wesnoth Website]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discord ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth maintains a presence on Discord through its own &amp;lt;b&amp;gt;[https://discord.gg/battleforwesnoth official Discord server]&amp;lt;/b&amp;gt;. Several channels are bridged to IRC in order to allow Discord and IRC users to interact with each other.&lt;br /&gt;
&lt;br /&gt;
== IRC ==&lt;br /&gt;
&lt;br /&gt;
IRC (Internet Relay Chat) is a time-tested communications system that offers greater flexibility and extensibility than modern chat platforms. For more information, check out [//en.wikipedia.org/wiki/Internet_Relay_Chat Wikipedia's article] and [http://www.irchelp.org/ IRCHelp.org].&lt;br /&gt;
&lt;br /&gt;
Unless otherwise noted, all channels are hosted at the [https://libera.chat/ Libera.Chat] IRC network. If you don't have an IRC client installed or your firewall blocks ports 6667, 6697, and other [https://libera.chat/guides/connect supported ports], you can use [https://web.libera.chat Libera.Chat's web client] instead.&lt;br /&gt;
&lt;br /&gt;
=== Main channels ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;[irc://irc.libera.chat/%23wesnoth #wesnoth]&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;This channel is for general conversation amongst Wesnoth players and developers.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-umc-dev #wesnoth-umc-dev]&amp;lt;br/&amp;gt;The channel for questions and conversations related to Wesnoth content development, including WML and Lua coding.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-offtopic #wesnoth-offtopic]&amp;lt;br/&amp;gt;The channel for social talk and discussion of subjects unrelated to Wesnoth.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-dev #wesnoth-dev]&amp;lt;br/&amp;gt;The development discussion channel. Most contributors and developers (including artists, WML/Lua and C++ coders, and Wesnoth.org staff) hang around here, exchanging ideas and patches.&lt;br /&gt;
&lt;br /&gt;
=== International channels ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-ang #wesnoth-ang (Old English channel)] --&amp;gt;&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-de #wesnoth-de]&amp;lt;br/&amp;gt;The German language channel, used mainly by players and translators.&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-es #wesnoth-es (Spanish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-fi #wesnoth-fi (Finnish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-gl #wesnoth-gl (Galician channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-la #wesnoth-la (Latin channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-pl #wesnoth-pl (Polish channel)]: As above, but Polish.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth.cn #wesnoth.cn (Chinese Channel)] &lt;br /&gt;
* [irc://irc.tweakers.net/%23wesnoth #wesnoth (Dutch channel)] at the irc.tweakers.net network&lt;br /&gt;
* [irc://irc.syrolnet.org/%23WIF #WIF (Italian channel)] at the irc.syrolnet.org network&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-ja #wesnoth-ja (Japanese channel/日本語チャンネル)] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; All public conversations on official Wesnoth channels are permanently logged at [https://irclogs.wesnoth.org/ &amp;lt;code&amp;gt;irclogs.wesnoth.org&amp;lt;/code&amp;gt;]. This includes messages sent to IRC through the Discord bridge.&lt;br /&gt;
&lt;br /&gt;
== Mailing Lists ==&lt;br /&gt;
&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/dev Dev] ([https://mailman.wesnoth.org/pipermail/dev/ archives])&amp;lt;br/&amp;gt;The mailing list for discussing mainline development issues; it is not intended for bug reports or feature requests. See [[ReportingBugs]] for those.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/commits/ Commits] ([https://mailman.wesnoth.org/pipermail/commits/ archives])&amp;lt;br/&amp;gt;All commits made to the mainline source repository are automatically posted to this list for those who want or need to keep track of them.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/i18n/ i18n] ([https://mailman.wesnoth.org/pipermail/i18n/ archives])&amp;lt;br/&amp;gt;The internationalization (i18n) mailing list; all translation team maintainers and the i18n managers should subscribe and keep track of announcements and discussions taking place in this list.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/packagers/ Packagers] ([https://mailman.wesnoth.org/pipermail/packagers/ archives])&amp;lt;br/&amp;gt;The packagers mailing list is used by the development team to notify packagers and distributors of new releases, along with information about changes to the processes of building or obtaining Wesnoth's source code.&lt;br /&gt;
&lt;br /&gt;
[[Category:Troubleshooting and Bugs]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Support&amp;diff=68001</id>
		<title>Support</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Support&amp;diff=68001"/>
		<updated>2021-05-28T10:22:34Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
There are many ways to get help — from online documentation to support from the community on Discord, IRC or forums. If you are experiencing problems, you should consider [[ReportingBugs|reporting a bug]].&lt;br /&gt;
&lt;br /&gt;
== Forums ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul style=&amp;quot;-moz-column-count:2;-webkit-column-count:2;column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;[//forums.wesnoth.org/ Official Wesnoth forums]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Glossary|Wesnoth Acronyms]] - forum lingo&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnoth.cn Chinese wesnoth forums]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://wif.altervista.org/index.php  Wesnoth Italian Forums (W.I.F)]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnothlife.ru/forum/ Russian Wesnoth Forums (WesnothLife)]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnoth.com.pl/news.php Polish Wesnoth Website]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://wesnoth.fsf.hu/ Hungarian Wesnoth Website]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www35.atwiki.jp/weswiki/ Japanese Wesnoth Website]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discord ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth maintains a presence on Discord through its own &amp;lt;b&amp;gt;[https://discord.gg/battleforwesnoth official Discord server]&amp;lt;/b&amp;gt;. Several channels are bridged to IRC in order to allow Discord and IRC users to interact with each other.&lt;br /&gt;
&lt;br /&gt;
== IRC ==&lt;br /&gt;
&lt;br /&gt;
IRC (Internet Relay Chat) is a time-tested communications system that offers greater flexibility and extensibility than modern chat platforms. For more information, check out [//en.wikipedia.org/wiki/Internet_Relay_Chat Wikipedia's article] and [http://www.irchelp.org/ IRCHelp.org].&lt;br /&gt;
&lt;br /&gt;
Unless otherwise noted, all channels are hosted at the [https://libera.chat/ Libera.Chat] IRC network. If you don't have an IRC client installed or your firewall blocks ports 6667, 6697, and other [https://libera.chat/guides/connect supported ports], you can use [https://web.libera.chat Libera.Chat's web client] instead.&lt;br /&gt;
&lt;br /&gt;
=== Main channels ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;[irc://irc.libera.chat/%23wesnoth #wesnoth]&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;This channel is for general conversation amongst Wesnoth players and developers.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-umc-dev #wesnoth-umc-dev]&amp;lt;br/&amp;gt;The channel for questions and conversations related to Wesnoth content development, including WML and Lua coding.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-offtopic #wesnoth-offtopic]&amp;lt;br/&amp;gt;The social and off-topic channel for miscellaneous talk and discussion of subjects not directly related to Wesnoth.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-dev #wesnoth-dev]&amp;lt;br/&amp;gt;The development discussion channel. Most contributors and developers (including artists, WML/Lua and C++ coders, and Wesnoth.org staff) hang around here, exchanging ideas and patches.&lt;br /&gt;
&lt;br /&gt;
=== International channels ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-ang #wesnoth-ang (Old English channel)] --&amp;gt;&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-de #wesnoth-de]&amp;lt;br/&amp;gt;The German language channel, used mainly by players and translators.&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-es #wesnoth-es (Spanish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-fi #wesnoth-fi (Finnish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-gl #wesnoth-gl (Galician channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-la #wesnoth-la (Latin channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-pl #wesnoth-pl (Polish channel)]: As above, but Polish.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth.cn #wesnoth.cn (Chinese Channel)] &lt;br /&gt;
* [irc://irc.tweakers.net/%23wesnoth #wesnoth (Dutch channel)] at the irc.tweakers.net network&lt;br /&gt;
* [irc://irc.syrolnet.org/%23WIF #WIF (Italian channel)] at the irc.syrolnet.org network&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-ja #wesnoth-ja (Japanese channel/日本語チャンネル)] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; All public conversations on official Wesnoth channels are permanently logged at [https://irclogs.wesnoth.org/ &amp;lt;code&amp;gt;irclogs.wesnoth.org&amp;lt;/code&amp;gt;]. This includes messages sent to IRC through the Discord bridge.&lt;br /&gt;
&lt;br /&gt;
== Mailing Lists ==&lt;br /&gt;
&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/dev Dev] ([https://mailman.wesnoth.org/pipermail/dev/ archives])&amp;lt;br/&amp;gt;The mailing list for discussing mainline development issues; it is not intended for bug reports or feature requests. See [[ReportingBugs]] for those.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/commits/ Commits] ([https://mailman.wesnoth.org/pipermail/commits/ archives])&amp;lt;br/&amp;gt;All commits made to the mainline source repository are automatically posted to this list for those who want or need to keep track of them.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/i18n/ i18n] ([https://mailman.wesnoth.org/pipermail/i18n/ archives])&amp;lt;br/&amp;gt;The internationalization (i18n) mailing list; all translation team maintainers and the i18n managers should subscribe and keep track of announcements and discussions taking place in this list.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/packagers/ Packagers] ([https://mailman.wesnoth.org/pipermail/packagers/ archives])&amp;lt;br/&amp;gt;The packagers mailing list is used by the development team to notify packagers and distributors of new releases, along with information about changes to the processes of building or obtaining Wesnoth's source code.&lt;br /&gt;
&lt;br /&gt;
[[Category:Troubleshooting and Bugs]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Support&amp;diff=68000</id>
		<title>Support</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Support&amp;diff=68000"/>
		<updated>2021-05-28T10:21:07Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
There are many ways to get help — from online documentation to support from the community on Discord, IRC or forums. If you are experiencing problems, you should consider [[ReportingBugs|reporting a bug]].&lt;br /&gt;
&lt;br /&gt;
== Forums ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul style=&amp;quot;-moz-column-count:2;-webkit-column-count:2;column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;[//forums.wesnoth.org/ Official Wesnoth forums]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Glossary|Wesnoth Acronyms]] - forum lingo&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnoth.cn Chinese wesnoth forums]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://wif.altervista.org/index.php  Wesnoth Italian Forums (W.I.F)]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnothlife.ru/forum/ Russian Wesnoth Forums (WesnothLife)]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnoth.com.pl/news.php Polish Wesnoth Website]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://wesnoth.fsf.hu/ Hungarian Wesnoth Website]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www35.atwiki.jp/weswiki/ Japanese Wesnoth Website]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discord ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth maintains a presence on Discord through its own [https://discord.gg/battleforwesnoth official Discord server]. Several channels are bridged to IRC in order to allow Discord and IRC users to interact with each other.&lt;br /&gt;
&lt;br /&gt;
== IRC ==&lt;br /&gt;
&lt;br /&gt;
IRC (Internet Relay Chat) is a time-tested communications system that offers greater flexibility and extensibility than modern chat platforms. For more information, check out [//en.wikipedia.org/wiki/Internet_Relay_Chat Wikipedia's article] and [http://www.irchelp.org/ IRCHelp.org].&lt;br /&gt;
&lt;br /&gt;
Unless otherwise noted, all channels are hosted at the [https://libera.chat/ Libera.Chat] IRC network. If you don't have an IRC client installed or your firewall blocks ports 6667, 6697, and other [https://libera.chat/guides/connect supported ports], you can use [https://web.libera.chat Libera.Chat's web client] instead.&lt;br /&gt;
&lt;br /&gt;
=== Main channels ===&lt;br /&gt;
&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth #wesnoth]&amp;lt;br/&amp;gt;This channel is for general conversation amongst Wesnoth players and developers.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-umc-dev #wesnoth-umc-dev]&amp;lt;br/&amp;gt;The channel for questions and conversations related to Wesnoth content development, including WML and Lua coding.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-offtopic #wesnoth-offtopic]&amp;lt;br/&amp;gt;The social and off-topic channel for miscellaneous talk and discussion of subjects not directly related to Wesnoth.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-dev #wesnoth-dev]&amp;lt;br/&amp;gt;The development discussion channel. Most contributors and developers (including artists, WML/Lua and C++ coders, and Wesnoth.org staff) hang around here, exchanging ideas and patches.&lt;br /&gt;
&lt;br /&gt;
=== International channels ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-ang #wesnoth-ang (Old English channel)] --&amp;gt;&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-de #wesnoth-de]&amp;lt;br/&amp;gt;The German language channel, used mainly by players and translators.&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-es #wesnoth-es (Spanish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-fi #wesnoth-fi (Finnish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-gl #wesnoth-gl (Galician channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-la #wesnoth-la (Latin channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-pl #wesnoth-pl (Polish channel)]: As above, but Polish.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth.cn #wesnoth.cn (Chinese Channel)] &lt;br /&gt;
* [irc://irc.tweakers.net/%23wesnoth #wesnoth (Dutch channel)] at the irc.tweakers.net network&lt;br /&gt;
* [irc://irc.syrolnet.org/%23WIF #WIF (Italian channel)] at the irc.syrolnet.org network&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-ja #wesnoth-ja (Japanese channel/日本語チャンネル)] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Public conversations on official Wesnoth channels are logged at [https://irclogs.wesnoth.org/ &amp;lt;code&amp;gt;irclogs.wesnoth.org&amp;lt;/code&amp;gt;]. This includes messages sent to IRC through the Discord bridge.&lt;br /&gt;
&lt;br /&gt;
== Mailing Lists ==&lt;br /&gt;
&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/dev Dev] ([https://mailman.wesnoth.org/pipermail/dev/ archives])&amp;lt;br/&amp;gt;The mailing list for discussing mainline development issues; it is not intended for bug reports or feature requests. See [[ReportingBugs]] for those.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/commits/ Commits] ([https://mailman.wesnoth.org/pipermail/commits/ archives])&amp;lt;br/&amp;gt;All commits made to the mainline source repository are automatically posted to this list for those who want or need to keep track of them.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/i18n/ i18n] ([https://mailman.wesnoth.org/pipermail/i18n/ archives])&amp;lt;br/&amp;gt;The internationalization (i18n) mailing list; all translation team maintainers and the i18n managers should subscribe and keep track of announcements and discussions taking place in this list.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/packagers/ Packagers] ([https://mailman.wesnoth.org/pipermail/packagers/ archives])&amp;lt;br/&amp;gt;The packagers mailing list is used by the development team to notify packagers and distributors of new releases, along with information about changes to the processes of building or obtaining Wesnoth's source code.&lt;br /&gt;
&lt;br /&gt;
[[Category:Troubleshooting and Bugs]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Support&amp;diff=67999</id>
		<title>Support</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Support&amp;diff=67999"/>
		<updated>2021-05-28T10:11:55Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
There are many ways to get help — from online documentation to support from the community on Discord, IRC or forums. If you are experiencing problems, you should consider [[ReportingBugs|reporting a bug]].&lt;br /&gt;
&lt;br /&gt;
== Forums ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul style=&amp;quot;-moz-column-count:2;-webkit-column-count:2;column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;[//forums.wesnoth.org/ Official Wesnoth forums]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Glossary|Wesnoth Acronyms]] - forum lingo&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnoth.cn Chinese wesnoth forums]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://wif.altervista.org/index.php  Wesnoth Italian Forums (W.I.F)]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnothlife.ru/forum/ Russian Wesnoth Forums (WesnothLife)]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www.wesnoth.com.pl/news.php Polish Wesnoth Website]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://wesnoth.fsf.hu/ Hungarian Wesnoth Website]&lt;br /&gt;
&amp;lt;li&amp;gt;[http://www35.atwiki.jp/weswiki/ Japanese Wesnoth Website]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discord ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth maintains a presence on Discord through its own [https://discord.gg/battleforwesnoth official Discord server]. Several channels are bridged to IRC in order to allow Discord and IRC users to interact with each other.&lt;br /&gt;
&lt;br /&gt;
== IRC ==&lt;br /&gt;
&lt;br /&gt;
IRC (Internet Relay Chat) is a time-tested communications system that offers greater flexibility and extensibility than modern chat platforms. For more information, check out [//en.wikipedia.org/wiki/Internet_Relay_Chat Wikipedia's article] and [http://www.irchelp.org/ IRCHelp.org].&lt;br /&gt;
&lt;br /&gt;
All of the following channels are hosted at the [https://libera.chat/ Libera.Chat] IRC network unless otherwise noted. If you don't have an IRC client installed on your machine or are behind a firewall that blocks ports 6667, 6697, and other [https://libera.chat/guides/connect supported ports], you can use [https://web.libera.chat Libera.Chat's web client] instead.&lt;br /&gt;
&lt;br /&gt;
=== Main channels ===&lt;br /&gt;
&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth #wesnoth]: This channel is for general conversation amongst Wesnoth players and developers.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-umc-dev #wesnoth-umc-dev]: The channel for questions and conversations related to Wesnoth content development, including WML and Lua coding.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-offtopic #wesnoth-offtopic]: The social and off-topic channel for miscellaneous talk and discussion of subjects not directly related to Wesnoth.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-dev #wesnoth-dev]: The development discussion channel. Most contributors and developers (WML, C++ and art people alike) hang around here, exchanging ideas and code patches.&lt;br /&gt;
&lt;br /&gt;
=== International channels ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-ang #wesnoth-ang (Old English channel)] --&amp;gt;&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-de #wesnoth-de (German channel)]: The German look-alike of #wesnoth, mainly used by German-speaking players and translators.&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-es #wesnoth-es (Spanish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-fi #wesnoth-fi (Finnish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-gl #wesnoth-gl (Galician channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-la #wesnoth-la (Latin channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-pl #wesnoth-pl (Polish channel)]: As above, but Polish.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth.cn #wesnoth.cn (Chinese Channel)] &lt;br /&gt;
* [irc://irc.tweakers.net/%23wesnoth #wesnoth (Dutch channel)] at the irc.tweakers.net network&lt;br /&gt;
* [irc://irc.syrolnet.org/%23WIF #WIF (Italian channel)] at the irc.syrolnet.org network&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-ja #wesnoth-ja (Japanese channel/日本語チャンネル)] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Public conversations on official Wesnoth channels are logged at [https://irclogs.wesnoth.org/ &amp;lt;code&amp;gt;irclogs.wesnoth.org&amp;lt;/code&amp;gt;]. This includes messages sent to IRC through the Discord bridge.&lt;br /&gt;
&lt;br /&gt;
== Mailing Lists ==&lt;br /&gt;
&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/dev Dev] ([https://mailman.wesnoth.org/pipermail/dev/ archives]): the mailing list for discussing mainline development issues; it is not intended for bug reports or feature requests. See [[ReportingBugs]] for those.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/commits/ Commits] ([https://mailman.wesnoth.org/pipermail/commits/ archives]): all commits made to the mainline source repository are automatically echoed in this list for those who want or need to keep track of them. &amp;lt;b&amp;gt;This list is currently unused.&amp;lt;/b&amp;gt;&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/i18n/ i18n] ([https://mailman.wesnoth.org/pipermail/i18n/ archives]): the internationalization (i18n) mailing list; all translation team maintainers and the i18n managers should subscribe and keep track of announcements and discussions taking place in this list.&lt;br /&gt;
&lt;br /&gt;
[[Category:Troubleshooting and Bugs]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Support&amp;diff=67962</id>
		<title>Support</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Support&amp;diff=67962"/>
		<updated>2021-05-23T03:14:27Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* Main channels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
There are many ways to get help. From online documentation to support from the community on IRC or forums.&lt;br /&gt;
&lt;br /&gt;
== Wiki Resources ==&lt;br /&gt;
* [[Play|Online Players Guide]] - Game manual, walkthroughs, strategy guides, and more.&lt;br /&gt;
* [[Create|Content-Creation Guide]] - Manual showing how to create new campaigns for Wesnoth.&lt;br /&gt;
* [[StartingPoints|Starting Points]] - List of pages to serve as starting point for diving deeply into the wiki...&lt;br /&gt;
* [https://r.wesnoth.org/rules#w0mp Multiplayer Information] - Info about server moderators, useful MP commands, and our online Code of Conduct.&lt;br /&gt;
* [http://wiki.wesnothlife.ru/ Russian Wesnoth Wiki]&lt;br /&gt;
&lt;br /&gt;
== Reporting Bugs ==&lt;br /&gt;
If you are experiencing problems, you should consider [[ReportingBugs|reporting a bug]].&lt;br /&gt;
&lt;br /&gt;
== Community ==&lt;br /&gt;
&lt;br /&gt;
Before asking for help with some technical problem in the official forums, please read [//forums.wesnoth.org/viewtopic.php?t=25660 How to report a bug properly] for instructions and pointers.&lt;br /&gt;
&lt;br /&gt;
=== Forums ===&lt;br /&gt;
* [//forums.wesnoth.org/ Official Wesnoth forums]&lt;br /&gt;
* [[Glossary|Wesnoth Acronyms]] - forum lingo&lt;br /&gt;
* [http://www.wesnoth.cn Chinese wesnoth forums]&lt;br /&gt;
* [http://wif.altervista.org/index.php  Wesnoth Italian Forums (W.I.F)]&lt;br /&gt;
* [http://www.wesnothlife.ru/forum/ Russian Wesnoth Forums (WesnothLife)]&lt;br /&gt;
* [http://www.wesnoth.com.pl/news.php Polish Wesnoth Website]&lt;br /&gt;
* [http://wesnoth.fsf.hu/ Hungarian Wesnoth Website]&lt;br /&gt;
* [http://www35.atwiki.jp/weswiki/ Japanese Wesnoth Website]&lt;br /&gt;
&lt;br /&gt;
=== IRC ===&lt;br /&gt;
If you don't know what Internet Relay Chat (IRC) is, check out [//en.wikipedia.org/wiki/Internet_Relay_Chat Wikipedia's article] and [http://www.irchelp.org/ IRCHelp.org].&lt;br /&gt;
&lt;br /&gt;
All of the following channels are hosted at the [https://libera.chat/ Libera.Chat] IRC network unless otherwise noted. If you don't have an IRC client installed on your machine or are behind a strict firewall that blocks [https://libera.chat/guides/connect Libera.Chat's supported ports], you can use a compatible Web IRC service such as [https://kiwiirc.com/nextclient/irc.libera.chat:+6697/ Kiwi IRC].&lt;br /&gt;
&lt;br /&gt;
==== Main channels ====&lt;br /&gt;
&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth #wesnoth]: This channel is for general conversation amongst Wesnoth players and developers.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-umc-dev #wesnoth-umc-dev]: The channel for questions and conversations related to Wesnoth content development, including WML and Lua coding.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-offtopic #wesnoth-offtopic]: The social and off-topic channel for miscellaneous talk and discussion of subjects not directly related to Wesnoth.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-dev #wesnoth-dev]: The development discussion channel. Most contributors and developers (WML, C++ and art people alike) hang around here, exchanging ideas and code patches.&lt;br /&gt;
&lt;br /&gt;
==== International channels ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-ang #wesnoth-ang (Old English channel)] --&amp;gt;&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-de #wesnoth-de (German channel)]: The German look-alike of #wesnoth, mainly used by German-speaking players and translators.&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-es #wesnoth-es (Spanish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-fi #wesnoth-fi (Finnish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-gl #wesnoth-gl (Galician channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-la #wesnoth-la (Latin channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-pl #wesnoth-pl (Polish channel)]: As above, but Polish.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth.cn #wesnoth.cn (Chinese Channel)] &lt;br /&gt;
* [irc://irc.tweakers.net/%23wesnoth #wesnoth (Dutch channel)] at the irc.tweakers.net network&lt;br /&gt;
* [irc://irc.syrolnet.org/%23WIF #WIF (Italian channel)] at the irc.syrolnet.org network&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-ja #wesnoth-ja (Japanese channel/日本語チャンネル)] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also see the [http://irclog.wesnoth.org/ logs] of some official Wesnoth channels.&lt;br /&gt;
&lt;br /&gt;
=== Mailing Lists ===&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/dev Dev] ([https://mailman.wesnoth.org/pipermail/dev/ archives]): the mailing list for discussing mainline development issues; it is not intended for bug reports or feature requests. See [[ReportingBugs]] for those.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/commits/ Commits] ([https://mailman.wesnoth.org/pipermail/commits/ archives]): all commits made to the mainline source repository are automatically echoed in this list for those who want or need to keep track of them. &amp;lt;b&amp;gt;This list is currently unused.&amp;lt;/b&amp;gt;&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/i18n/ i18n] ([https://mailman.wesnoth.org/pipermail/i18n/ archives]): the internationalization (i18n) mailing list; all translation team maintainers and the i18n managers should subscribe and keep track of announcements and discussions taking place in this list.&lt;br /&gt;
&lt;br /&gt;
[[Category:Troubleshooting and Bugs]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Support&amp;diff=67961</id>
		<title>Support</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Support&amp;diff=67961"/>
		<updated>2021-05-23T00:17:17Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: /* IRC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
There are many ways to get help. From online documentation to support from the community on IRC or forums.&lt;br /&gt;
&lt;br /&gt;
== Wiki Resources ==&lt;br /&gt;
* [[Play|Online Players Guide]] - Game manual, walkthroughs, strategy guides, and more.&lt;br /&gt;
* [[Create|Content-Creation Guide]] - Manual showing how to create new campaigns for Wesnoth.&lt;br /&gt;
* [[StartingPoints|Starting Points]] - List of pages to serve as starting point for diving deeply into the wiki...&lt;br /&gt;
* [https://r.wesnoth.org/rules#w0mp Multiplayer Information] - Info about server moderators, useful MP commands, and our online Code of Conduct.&lt;br /&gt;
* [http://wiki.wesnothlife.ru/ Russian Wesnoth Wiki]&lt;br /&gt;
&lt;br /&gt;
== Reporting Bugs ==&lt;br /&gt;
If you are experiencing problems, you should consider [[ReportingBugs|reporting a bug]].&lt;br /&gt;
&lt;br /&gt;
== Community ==&lt;br /&gt;
&lt;br /&gt;
Before asking for help with some technical problem in the official forums, please read [//forums.wesnoth.org/viewtopic.php?t=25660 How to report a bug properly] for instructions and pointers.&lt;br /&gt;
&lt;br /&gt;
=== Forums ===&lt;br /&gt;
* [//forums.wesnoth.org/ Official Wesnoth forums]&lt;br /&gt;
* [[Glossary|Wesnoth Acronyms]] - forum lingo&lt;br /&gt;
* [http://www.wesnoth.cn Chinese wesnoth forums]&lt;br /&gt;
* [http://wif.altervista.org/index.php  Wesnoth Italian Forums (W.I.F)]&lt;br /&gt;
* [http://www.wesnothlife.ru/forum/ Russian Wesnoth Forums (WesnothLife)]&lt;br /&gt;
* [http://www.wesnoth.com.pl/news.php Polish Wesnoth Website]&lt;br /&gt;
* [http://wesnoth.fsf.hu/ Hungarian Wesnoth Website]&lt;br /&gt;
* [http://www35.atwiki.jp/weswiki/ Japanese Wesnoth Website]&lt;br /&gt;
&lt;br /&gt;
=== IRC ===&lt;br /&gt;
If you don't know what Internet Relay Chat (IRC) is, check out [//en.wikipedia.org/wiki/Internet_Relay_Chat Wikipedia's article] and [http://www.irchelp.org/ IRCHelp.org].&lt;br /&gt;
&lt;br /&gt;
All of the following channels are hosted at the [https://libera.chat/ Libera.Chat] IRC network unless otherwise noted. If you don't have an IRC client installed on your machine or are behind a strict firewall that blocks [https://libera.chat/guides/connect Libera.Chat's supported ports], you can use a compatible Web IRC service such as [https://kiwiirc.com/nextclient/irc.libera.chat:+6697/ Kiwi IRC].&lt;br /&gt;
&lt;br /&gt;
==== Main channels ====&lt;br /&gt;
&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth #wesnoth]: This channel is for general conversation amongst Wesnoth players and developers.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-dev #wesnoth-dev]: The development discussion channel. Most contributors and developers (WML, C++ and art people alike) hang around here, exchanging ideas and code patches.&lt;br /&gt;
&lt;br /&gt;
==== International channels ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-ang #wesnoth-ang (Old English channel)] --&amp;gt;&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-de #wesnoth-de (German channel)]: The German look-alike of #wesnoth, mainly used by German-speaking players and translators.&lt;br /&gt;
&amp;lt;!-- * [irc://irc.libera.chat/%23wesnoth-es #wesnoth-es (Spanish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-fi #wesnoth-fi (Finnish channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-gl #wesnoth-gl (Galician channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-la #wesnoth-la (Latin channel)]&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-pl #wesnoth-pl (Polish channel)]: As above, but Polish.&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth.cn #wesnoth.cn (Chinese Channel)] &lt;br /&gt;
* [irc://irc.tweakers.net/%23wesnoth #wesnoth (Dutch channel)] at the irc.tweakers.net network&lt;br /&gt;
* [irc://irc.syrolnet.org/%23WIF #WIF (Italian channel)] at the irc.syrolnet.org network&lt;br /&gt;
* [irc://irc.libera.chat/%23wesnoth-ja #wesnoth-ja (Japanese channel/日本語チャンネル)] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also see the [http://irclog.wesnoth.org/ logs] of some official Wesnoth channels.&lt;br /&gt;
&lt;br /&gt;
=== Mailing Lists ===&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/dev Dev] ([https://mailman.wesnoth.org/pipermail/dev/ archives]): the mailing list for discussing mainline development issues; it is not intended for bug reports or feature requests. See [[ReportingBugs]] for those.&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/commits/ Commits] ([https://mailman.wesnoth.org/pipermail/commits/ archives]): all commits made to the mainline source repository are automatically echoed in this list for those who want or need to keep track of them. &amp;lt;b&amp;gt;This list is currently unused.&amp;lt;/b&amp;gt;&lt;br /&gt;
* [https://mailman.wesnoth.org/listinfo/i18n/ i18n] ([https://mailman.wesnoth.org/pipermail/i18n/ archives]): the internationalization (i18n) mailing list; all translation team maintainers and the i18n managers should subscribe and keep track of announcements and discussions taking place in this list.&lt;br /&gt;
&lt;br /&gt;
[[Category:Troubleshooting and Bugs]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DevelopersHome&amp;diff=67960</id>
		<title>DevelopersHome</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DevelopersHome&amp;diff=67960"/>
		<updated>2021-05-22T23:53:43Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Information ==&lt;br /&gt;
* Links&lt;br /&gt;
** [http://changelog.wesnoth.org Changelog] - the most recent changes made to the game&lt;br /&gt;
** [https://github.com/wesnoth/wesnoth/commits/master Latest commits] - Up-to-date commit messages&lt;br /&gt;
&lt;br /&gt;
* Coding Guidelines&lt;br /&gt;
** [[Git_for_Wesnoth_Crash_Course]] - guide for contributors who are new to git&lt;br /&gt;
** [[HackingWesnoth]] - guide for programmers&lt;br /&gt;
** [[CodingStandards]] - for programmers&lt;br /&gt;
** [[DeveloperGuide]] - for those who received repository commit rights&lt;br /&gt;
** [[SoftwareTesting]] - for programmers&lt;br /&gt;
&lt;br /&gt;
* Library documentation&lt;br /&gt;
** [http://cppreference.com C++ Reference]&lt;br /&gt;
** [http://www.boost.org/doc/ Boost documentation]&lt;br /&gt;
&lt;br /&gt;
* Debugging Tips&lt;br /&gt;
** [[DebuggingWesnoth]]&lt;br /&gt;
&lt;br /&gt;
== Tools and Packaging ==&lt;br /&gt;
* Supporting Websites&lt;br /&gt;
** [[WesnothRepository]] - accessing the source code&lt;br /&gt;
** http://gettext.wesnoth.org/ - gettext status&lt;br /&gt;
* Compiling and Building&lt;br /&gt;
** [https://github.com/wesnoth/wesnoth/blob/master/INSTALL.md Compiling Wesnoth] - how to compile Battle for Wesnoth (it's not hard)&lt;br /&gt;
* Packaging and Releasing&lt;br /&gt;
** [[ReleasingWesnoth]] - steps to follow to release a new version&lt;br /&gt;
* Documentation&lt;br /&gt;
** Doxygen - Documentation generator&lt;br /&gt;
* More stuff&lt;br /&gt;
** [[MaintenanceTools]] WMLLint, WMLIndent and WMLScope&lt;br /&gt;
** [[UsingGooglePerformanceTools]] to profile Wesnoth CPU and memory usage.&lt;br /&gt;
&lt;br /&gt;
== I want to start coding, what can I do? ==&lt;br /&gt;
* [[EasyCoding]] - Bugs and features that are easy to implement for new coders&lt;br /&gt;
* [[NotSoEasyCoding]] - Bugs and features which are doable but lacking someone working on them&lt;br /&gt;
* [[GettingStarted]]&lt;br /&gt;
* [https://forums.wesnoth.org/viewtopic.php?f=12&amp;amp;t=34904 Frequently Proposed Ideas] - summary of past often-repeated forum discussions&lt;br /&gt;
* [[Glossary]]&lt;br /&gt;
&lt;br /&gt;
== Game - Create content ==&lt;br /&gt;
* [[BuildingScenarios]] and related useful forum discussions: &lt;br /&gt;
** [http://www.wesnoth.org/forum/viewtopic.php?t=4188 Beginning Campaign Development]&lt;br /&gt;
** [http://www.wesnoth.org/forum/viewtopic.php?t=4301 A Balancing Act]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
* [[CompatibilityStandards#Deprecation_levels_-_When_to_remove_deprecated_features|DeprecationLevels]]&lt;br /&gt;
&lt;br /&gt;
== Code documentation ==&lt;br /&gt;
* http://devdocs.wesnoth.org - generated code documentation&lt;br /&gt;
* AI&lt;br /&gt;
** [[Wesnoth_AI]] - Starting point for AI documentation&lt;br /&gt;
* Themes&lt;br /&gt;
** [[ThemeSystem]] - customizing the screen layout for the game and the editor&lt;br /&gt;
* Multiplayer&lt;br /&gt;
** [[WesnothdDesign]] - Guide to the design of wesnothd, the multiplayer server.&lt;br /&gt;
* Gui2 - The new Gui-Framework&lt;br /&gt;
** [https://devdocs.wesnoth.org/group__GUIWidgetWML.html Widgets]&lt;br /&gt;
** [[GUIToolkit]]&lt;br /&gt;
** [https://devdocs.wesnoth.org/GUILayout.html Layout]&lt;br /&gt;
** Gui2 WML&lt;br /&gt;
*** [https://devdocs.wesnoth.org/group__GUICanvasWML.html GUICanvas]&lt;br /&gt;
*** [https://devdocs.wesnoth.org/GUIToolkitWML.html GUIToolkit]&lt;br /&gt;
*** [https://devdocs.wesnoth.org/group__GUIWindowDefinitionWML.html WindowDefinitionWML]&lt;br /&gt;
&lt;br /&gt;
== Communication, Feedback, Events ==&lt;br /&gt;
* http://bugs.wesnoth.org/ - bug reports and feature requests&lt;br /&gt;
* http://patches.wesnoth.org/ - patches/pull requests&lt;br /&gt;
&lt;br /&gt;
* Mailing lists&lt;br /&gt;
** https://mailman.wesnoth.org&lt;br /&gt;
&lt;br /&gt;
* IRC&lt;br /&gt;
** [irc://irc.wesnoth.org/#wesnoth-dev Libera.Chat/#wesnoth-dev] - IRC (alias to irc.libera.chat)&lt;br /&gt;
** http://irclog.wesnoth.org/ - IRC logs&lt;br /&gt;
&lt;br /&gt;
* Forum - http://forum.wesnoth.org&lt;br /&gt;
&lt;br /&gt;
* This wiki - http://www.wesnoth.org/wiki/Main_Page &lt;br /&gt;
&lt;br /&gt;
* FOSDEM&lt;br /&gt;
** [[Fosdem2008]]&lt;br /&gt;
** [[Fosdem2009]]&lt;br /&gt;
** [[Fosdem2010]]&lt;br /&gt;
** [[Fosdem2011]]&lt;br /&gt;
** [[Fosdem2012]]&lt;br /&gt;
&lt;br /&gt;
* Google Summer of Code&lt;br /&gt;
** [[SummerOfCodeIdeas]] - Ideas for GSoC&lt;br /&gt;
** [[SoC_Information_for_Google]] - Our organization profile for Google&lt;br /&gt;
** [[SoC_People_to_bug_on_IRC]] - Who GSoC students can ask for help&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* [[DebugMode]] and [[CommandMode]] - in game debugging commands&lt;br /&gt;
* [http://www.wesnoth.org/units/trunk/animations.html Missing unit animations] - what's available and what's missing&lt;br /&gt;
* http://units.wesnoth.org/ - Unit reference&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=UsefulLinks&amp;diff=67959</id>
		<title>UsefulLinks</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=UsefulLinks&amp;diff=67959"/>
		<updated>2021-05-22T23:47:43Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
{|class=wikitable&lt;br /&gt;
!colspan=2 style='text-align:left'|&lt;br /&gt;
=== Battle for Wesnoth ===&lt;br /&gt;
|-&lt;br /&gt;
|Home Page || http://www.wesnoth.org/&lt;br /&gt;
|-&lt;br /&gt;
|GitHub Project Page || https://github.com/wesnoth/&lt;br /&gt;
|-&lt;br /&gt;
|Page on TheLinuxGameTome || http://happypenguin.org/show?Battle%20for%20Wesnoth&lt;br /&gt;
|-&lt;br /&gt;
|Freshmeat entry || http://freshmeat.net/projects/wesnoth/&lt;br /&gt;
|-&lt;br /&gt;
|Changelog || http://changelog.wesnoth.org/ [http://stable-changelog.wesnoth.org stable]&lt;br /&gt;
|-&lt;br /&gt;
|This wiki || http://wiki.wesnoth.org/&lt;br /&gt;
|-&lt;br /&gt;
|The manual || http://manual.wesnoth.org/&lt;br /&gt;
|-&lt;br /&gt;
|Translation statistics || http://gettext.wesnoth.org/&lt;br /&gt;
|-&lt;br /&gt;
|Add-on server web interface || http://addonlist.wesnoth.org/ [http://stable-addons.wesnoth.org stable] [http://dev-addons.wesnoth.org dev]&lt;br /&gt;
|-&lt;br /&gt;
|Multiplayer server statistics || http://wesnothd.wesnoth.org/&lt;br /&gt;
|-&lt;br /&gt;
|Multiplayer replays || http://replays.wesnoth.org&lt;br /&gt;
|-&lt;br /&gt;
|Unit advancement tree || http://units.wesnoth.org/&lt;br /&gt;
|-&lt;br /&gt;
|Forum for users and developers || http://forums.wesnoth.org/ [http://forums.wesnoth.org/search.php?search_id=newposts new posts]&lt;br /&gt;
|-&lt;br /&gt;
|List of Frequently Proposed Ideas || https://forums.wesnoth.org/viewtopic.php?f=12&amp;amp;t=34904&lt;br /&gt;
|-&lt;br /&gt;
|IRC channel (Libera.Chat) || ircs://irc.libera.chat/#wesnoth&lt;br /&gt;
|-&lt;br /&gt;
|Discord server || https://discord.gg/battleforwesnoth&lt;br /&gt;
|-&lt;br /&gt;
|IRC logs || https://wesnoth.org/irclogs/&lt;br /&gt;
|-&lt;br /&gt;
|Twitter Account || https://twitter.com/Wesnoth&lt;br /&gt;
|-&lt;br /&gt;
!colspan=2 style='text-align:left'|&lt;br /&gt;
=== Developers ===&lt;br /&gt;
|-|Git web interface || https://github.com/wesnoth/wesnoth&lt;br /&gt;
|-&lt;br /&gt;
|Git homepage || http://git-scm.com/&lt;br /&gt;
|-&lt;br /&gt;
|Git documentation || http://git-scm.com/documentation&lt;br /&gt;
|-&lt;br /&gt;
|Code documentation || http://devdocs.wesnoth.org/&lt;br /&gt;
|-&lt;br /&gt;
|Mailing lists || https://mailman.wesnoth.org/&lt;br /&gt;
|-&lt;br /&gt;
|Bug/Feature tracker || http://bugs.wesnoth.org/&lt;br /&gt;
|-&lt;br /&gt;
|Patch tracker || http://patches.wesnoth.org/&lt;br /&gt;
|-&lt;br /&gt;
|ohloh statistics || http://www.ohloh.net/p/wesnoth&lt;br /&gt;
|-&lt;br /&gt;
|wesnoth.org server stats || http://collectd.wesnoth.org&lt;br /&gt;
|-&lt;br /&gt;
|IRC channel (Libera.Chat) || ircs://irc.libera.chat/wesnoth-dev&lt;br /&gt;
|-&lt;br /&gt;
!colspan=2 style='text-align:left'|&lt;br /&gt;
&lt;br /&gt;
=== Other Links ===&lt;br /&gt;
|-&lt;br /&gt;
|1vs1 Wesnoth ladder || http://wesnoth.gamingladder.info/&lt;br /&gt;
|-&lt;br /&gt;
|Wesnoth matches with commentary || http://www.youtube.com/user/NekisBrutalWesnoth&lt;br /&gt;
|-&lt;br /&gt;
|Wesnoth campaign with commentary in german || https://www.youtube.com/playlist?list=PLc3DmuDuA2imW1vg9xXMNjGHm8VaXvEaz&lt;br /&gt;
|-&lt;br /&gt;
|WSNPP || http://wiki.wesnoth.org/WSNPP&lt;br /&gt;
|-&lt;br /&gt;
|Run Wesnoth online (Windows) || http://spoon.net/the-battle-for-wesnoth&lt;br /&gt;
|-&lt;br /&gt;
!colspan=2 style='text-align:left'|&lt;br /&gt;
=== Multilingual Players' Sites ===&lt;br /&gt;
|-&lt;br /&gt;
|Community in China || http://wesnoth.cn/&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Wesnoth Wiki]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesCamp&amp;diff=67958</id>
		<title>WesCamp</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesCamp&amp;diff=67958"/>
		<updated>2021-05-22T23:43:55Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Note: WesCamp was a translation project, but activity stopped around 2014. Please follow the links in the See Also section for updated documentation.''&lt;br /&gt;
&lt;br /&gt;
== If you are someone who just wants to translate  ==&lt;br /&gt;
&lt;br /&gt;
Then, simply go to http://gettext.wesnoth.org, and download the .po file of your chosen add-on and language. Then read the information '''for translators''' on this page here to know whom to tell what you are working on, and where to submit your translations.&lt;br /&gt;
&lt;br /&gt;
=== Translators ===&lt;br /&gt;
&lt;br /&gt;
Translating add-ons works the same as translating mainline. All of the information about this already exists in the wiki (see the links below). The files you need are located in the project’s [https://github.com/wescamp Github repositories] (they might take a bit of effort to locate. Alternatively, you can use [http://gettext.wesnoth.org gettext.wesnoth.org]). When they are translated, send them to [mailto:AI0867_AT_gmail.com AI/AI0867].&lt;br /&gt;
&lt;br /&gt;
Before you start translating you should:&lt;br /&gt;
* Look at the subpage of the add-on you wish to translate to see if someone is already working on it.&lt;br /&gt;
* Contact the translation team for your target language for guidance.&lt;br /&gt;
&lt;br /&gt;
If you have questions, join the [irc://irc.libera.chat/wesnoth #wesnoth] channel on the Libera.Chat IRC network and ask in there. Of course, you will also get answers if you ask your questions in the [http://forums.wesnoth.org/viewforum.php?f=7 Translations &amp;amp; Internationalization forum], or e-mail [mailto:AI0867_AT_gmail.com AI/AI0867].&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[GettextForWesnothDevelopers|GetText for Developers]] - how make code translatable (both mainline and UMC)&lt;br /&gt;
* [[GettextForTranslators|GetText for Translators]] - how to translate Wesnoth using [[GetText]]&lt;br /&gt;
* [[WesnothTranslations|Wesnoth Translations]]&lt;br /&gt;
* [[TranslatorsGuide|Translators' Guide]]&lt;br /&gt;
* [http://gettext.wesnoth.org Translation statistics]&lt;br /&gt;
* [https://github.com/wescamp WesCamp project at Github]&lt;br /&gt;
* [[Wescamp.py_Instructions|Wescamp for Maintainers]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;br /&gt;
[[Category:Campaigns]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesnothManual&amp;diff=67957</id>
		<title>WesnothManual</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesnothManual&amp;diff=67957"/>
		<updated>2021-05-22T23:43:06Z</updated>

		<summary type="html">&lt;p&gt;Shadowm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document is identical to the manual shipped with the game, thus it is protected from editing.  To suggest improvements to the manual, make your changes to the [[ManualSuggestions|Manual Suggestions]].&lt;br /&gt;
&lt;br /&gt;
== Available Languages ==&lt;br /&gt;
&lt;br /&gt;
The HTML manual is available in various languages. To read the manual, just click the link of the language of your choice.&lt;br /&gt;
&lt;br /&gt;
=== Stable version ===&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.id.html Bahasa Indonesian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.zh_TW.html Chinese (Traditional)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.zh_CN.html Chinese (Zhongwen)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.cs.html Czech]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.en_GB.html English (GB)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.en.html English (US)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.et.html Estonian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.fi.html Finnish]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.fr.html French]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.gl.html Galician]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.de.html German]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.hu.html Hungarian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.it.html Italian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.ja.html Japanese]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.pl.html Polish]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.pt.html Portuguese]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.pt_BR.html Portuguese (Brazil)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.ru.html Russian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.sr.html Serbian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.sr@latin.html Serbian (Latin transliteration)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.sr@ijekavian.html Serbian (Ijekavian transliteration)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.sr@ijekavianlatin.html Serbian (Ijekavian Latin transliteration)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.sk.html Slovak]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.es.html Spanish]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.uk.html Ukrainian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/stable/manual.vi.html Vietnamese]&lt;br /&gt;
&lt;br /&gt;
=== Development version ===&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.id.html Bahasa Indonesian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.zh_TW.html Chinese (Traditional)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.zh_CN.html Chinese (Zhongwen)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.cs.html Czech]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.en_GB.html English (GB)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.en.html English (US)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.et.html Estonian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.fi.html Finnish]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.fr.html French]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.gl.html Galician]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.de.html German]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.hu.html Hungarian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.it.html Italian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.ja.html Japanese]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.pl.html Polish]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.pt.html Portuguese]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.pt_BR.html Portuguese (Brazil)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.ru.html Russian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.sr.html Serbian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.sr@latin.html Serbian (Latin transliteration)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.sr@ijekavian.html Serbian (Ijekavian transliteration)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.sr@ijekavianlatin.html Serbian (Ijekavian Latin transliteration)]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.sk.html Slovak]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.es.html Spanish]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.uk.html Ukrainian]&lt;br /&gt;
* [https://www.wesnoth.org/manual/dev/manual.vi.html Vietnamese]&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [https://forum.wesnoth.org/ Official Wesnoth Forums]&lt;br /&gt;
* [https://discord.gg/battleforwesnoth Official Wesnoth Discord]&lt;br /&gt;
* [ircs://irc.libera.chat/wesnoth Official #wesnoth IRC channel on Libera.Chat]&lt;br /&gt;
* [[WesnothMan|wesnoth(6) man page]]&lt;br /&gt;
* [[ManualSuggestions|Manual Suggestions]] - If you have any ideas for improvements, post them here&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Play}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Review on Release]]&lt;/div&gt;</summary>
		<author><name>Shadowm</name></author>
		
	</entry>
</feed>