<?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=AI</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=AI"/>
	<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/Special:Contributions/AI"/>
	<updated>2026-04-05T04:07:24Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74548</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74548"/>
		<updated>2025-10-03T05:09:34Z</updated>

		<summary type="html">&lt;p&gt;AI: /* MMMPPpxxVA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This pages contains some specific information about the Battle for Wesnoth new Android port (1.19+)&lt;br /&gt;
&lt;br /&gt;
== Playing controls ==&lt;br /&gt;
* Tap a unit to select/deselect it.&lt;br /&gt;
* Tap a unit, then tap the target hex to show defense stats of that unit and footsteps. (Similar to hover on PC)&lt;br /&gt;
* Tap a unit, then double tap on the target hex to move it. Alternative, you can drag along the path to choose the exact path which the unit is supposed to move by.&lt;br /&gt;
* Drag from attacker unit towards attacked unit to attack.&lt;br /&gt;
&lt;br /&gt;
== The Settings menu (Splash screen) ==&lt;br /&gt;
&lt;br /&gt;
== Logs and debugging steps ==&lt;br /&gt;
* Install adb (Android Debug Bridge) on your computer. Search internet for information about your OS. Install drivers for your phone/tablet if necessary.&lt;br /&gt;
* Enable Developer Mode on your Android device (phone/tablet). Again, the internet is your friend. On newer devices, you need tap Settings &amp;gt; About Phone &amp;gt; Build Number 7 times until it says &amp;quot;You are now a developer&amp;quot;, then go into the Setting &amp;gt; System &amp;gt; Developer Options (newly appeared), and find &amp;quot;USB Debugging&amp;quot; in the menu and turn that on.&lt;br /&gt;
* Connect phone to PC. Do &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; or similar from a terminal/command prompt to see if your device appears on the list and is authorized. Tap ok on your phone if any permission request appears.&lt;br /&gt;
* Run &amp;lt;code&amp;gt;adb logcat -c&amp;lt;/code&amp;gt; (clears existing logs), then &amp;lt;code&amp;gt;adb logcat &amp;gt; log.txt&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; and copy from terminal). Run Wesnoth on phone. Reproduce the crash.&lt;br /&gt;
* stop &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; on PC, and attach the &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt; to your issue report on github along with detailed steps of the bug, and use the Android label.&lt;br /&gt;
&lt;br /&gt;
(Note: adb can be &amp;lt;code&amp;gt;./adb.exe&amp;lt;/code&amp;gt; on Windows. Use internet for help on any of the steps if needed, this is supposed to be a preliminary guideline. Steps might slightly differ based on manufacturer or Android version.)&lt;br /&gt;
&lt;br /&gt;
=== Enabling taps ===&lt;br /&gt;
It is useful for debugging purposes, especially if you're sharing a screen recording of your bug, to show where you're tapping on the screen in the screen recording. See [https://discussio.zendesk.com/hc/en-gb/articles/4625151970065-How-to-Show-Taps-for-Mobile-Screen-Sharing-on-Android here] for how to enable that.&lt;br /&gt;
&lt;br /&gt;
=== Turning off Developer Mode ===&lt;br /&gt;
Go to System &amp;gt; Developer Options and turn off  the '''Use developer options''' toggle.&lt;br /&gt;
&lt;br /&gt;
=== Dev Notes ===&lt;br /&gt;
==== Version Code scheme (1191601001 - post 1.19.16 fixup) ====&lt;br /&gt;
&amp;lt;code&amp;gt;MmmPPppVVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; - Major version code, so far at 1; since the max versionCode is 21000000 it can go up to 2&lt;br /&gt;
* &amp;lt;code&amp;gt;mm&amp;lt;/code&amp;gt; - Minor version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;PP&amp;lt;/code&amp;gt; - Patch version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; - Android patch version/any other use.&lt;br /&gt;
* &amp;lt;code&amp;gt;VVV&amp;lt;/code&amp;gt; - Reserved for ABI/Variants.&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Rest unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
==== New Version Code scheme draft ====&lt;br /&gt;
This is but one possible idea among many, and is not final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MSUUmmPPppVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* 1 - Major version code. Wesnoth's version's first digit is almost always 1, but the max versionCode is 21000000 so it can go upto 2 if needed.&lt;br /&gt;
* S - store identifier (must be greater than 2 to allow upgrade from previous scheme.) For example:&lt;br /&gt;
** &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - F-Droid&lt;br /&gt;
** &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; - Google Play&lt;br /&gt;
** Others if needed.&lt;br /&gt;
* UU - unused/unspecified.&lt;br /&gt;
* mm - Minor version&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* pp - Android Patch version&lt;br /&gt;
* VV - ABI/Variants&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Last but one digit - Unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
E.g., 1.20.14 with hotfix 1, Fdroid, arm64 ABI would be: &amp;lt;code&amp;gt;120020140102&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Other version code scheme drafts ====&lt;br /&gt;
&lt;br /&gt;
Given that we only have 10 digits to work with (max being 2.1e9, which is signed INT_MAX with some margin), the above scheme is not possible. The PR to remove/disable the existing version codes on f-droid has been rejected, so we're probably stuck with version codes &amp;gt; 1.19e9. &lt;br /&gt;
The highest version code currently (2025-10-02) in use is 1191601002.&lt;br /&gt;
&lt;br /&gt;
Further constraints are:&lt;br /&gt;
* version codes should go up&lt;br /&gt;
* each ABI needs its own version code&lt;br /&gt;
* we may have multiple APK releases for one &amp;quot;regular wesnoth version&amp;quot; to fix android-only issues (android patch version)&lt;br /&gt;
* we may have builds that differ per store (F-droid creates the file /data/dist with contents &amp;quot;F-Droid&amp;quot; during the build process)&lt;br /&gt;
* we may want various variants of builds, that is, a &amp;quot;clean&amp;quot; build, a build with google play integrations, a build with a different integration, and so on. This may or may not be tied to the store the APK is distributed on&lt;br /&gt;
&lt;br /&gt;
Drafts of possible approaches:&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;MMMPPpxxVA&amp;lt;/code&amp;gt; =====&lt;br /&gt;
* MMM - Combined Major/Minor: 1.19 = 119, but each subsequent minor *or* major bump increases this number by 1. This remains visually the same until 2.0 happens.&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* p - Android patch version&lt;br /&gt;
* V - Build variant (0 is clean, 1 might be google play integrations. Could be a bitfield or an enum)&lt;br /&gt;
* A - ABI (as above)&lt;br /&gt;
* x - Unspecified, available for expanding these fields or adding other flags&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1220320002&amp;lt;/code&amp;gt; would be version 1.22 (or 2.0 or 2.2, but 2 stables from 1.18), patch 3, android patch 2, default (clean) variant, arm64&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMMPPpVA&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Basically the same thing, just shifted to the right by eating up the unspecified digits, and with the first digits fixed to 12. Leaves 8 &amp;quot;additional epochs&amp;quot; available for future expansion.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1212203202&amp;lt;/code&amp;gt; would be version 1.22.3.2 clean arm64, as above.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMPPpxVA&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Removes the major version digit, freeing up 1 digit. Not functionally different from the major-minor scheme, but reduces the number of available version bumps until epoch change.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1222032002&amp;lt;/code&amp;gt; would be version 1.22.3.2 clean arm64, as above.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74546</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74546"/>
		<updated>2025-10-02T10:17:46Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Other version code scheme drafts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This pages contains some specific information about the Battle for Wesnoth new Android port (1.19+)&lt;br /&gt;
&lt;br /&gt;
== Playing controls ==&lt;br /&gt;
* Tap a unit to select/deselect it.&lt;br /&gt;
* Tap a unit, then tap the target hex to show defense stats of that unit and footsteps. (Similar to hover on PC)&lt;br /&gt;
* Tap a unit, then double tap on the target hex to move it. Alternative, you can drag along the path to choose the exact path which the unit is supposed to move by.&lt;br /&gt;
* Drag from attacker unit towards attacked unit to attack.&lt;br /&gt;
&lt;br /&gt;
== The Settings menu (Splash screen) ==&lt;br /&gt;
&lt;br /&gt;
== Logs and debugging steps ==&lt;br /&gt;
* Install adb (Android Debug Bridge) on your computer. Search internet for information about your OS. Install drivers for your phone/tablet if necessary.&lt;br /&gt;
* Enable Developer Mode on your Android device (phone/tablet). Again, the internet is your friend. On newer devices, you need tap Settings &amp;gt; About Phone &amp;gt; Build Number 7 times until it says &amp;quot;You are now a developer&amp;quot;, then go into the Setting &amp;gt; System &amp;gt; Developer Options (newly appeared), and find &amp;quot;USB Debugging&amp;quot; in the menu and turn that on.&lt;br /&gt;
* Connect phone to PC. Do &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; or similar from a terminal/command prompt to see if your device appears on the list and is authorized. Tap ok on your phone if any permission request appears.&lt;br /&gt;
* Run &amp;lt;code&amp;gt;adb logcat -c&amp;lt;/code&amp;gt; (clears existing logs), then &amp;lt;code&amp;gt;adb logcat &amp;gt; log.txt&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; and copy from terminal). Run Wesnoth on phone. Reproduce the crash.&lt;br /&gt;
* stop &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; on PC, and attach the &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt; to your issue report on github along with detailed steps of the bug, and use the Android label.&lt;br /&gt;
&lt;br /&gt;
(Note: adb can be &amp;lt;code&amp;gt;./adb.exe&amp;lt;/code&amp;gt; on Windows. Use internet for help on any of the steps if needed, this is supposed to be a preliminary guideline. Steps might slightly differ based on manufacturer or Android version.)&lt;br /&gt;
&lt;br /&gt;
=== Enabling taps ===&lt;br /&gt;
It is useful for debugging purposes, especially if you're sharing a screen recording of your bug, to show where you're tapping on the screen in the screen recording. See [https://discussio.zendesk.com/hc/en-gb/articles/4625151970065-How-to-Show-Taps-for-Mobile-Screen-Sharing-on-Android here] for how to enable that.&lt;br /&gt;
&lt;br /&gt;
=== Turning off Developer Mode ===&lt;br /&gt;
Go to System &amp;gt; Developer Options and turn off  the '''Use developer options''' toggle.&lt;br /&gt;
&lt;br /&gt;
=== Dev Notes ===&lt;br /&gt;
==== Version Code scheme (1191601001 - post 1.19.16 fixup) ====&lt;br /&gt;
&amp;lt;code&amp;gt;MmmPPppVVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; - Major version code, so far at 1; since the max versionCode is 21000000 it can go up to 2&lt;br /&gt;
* &amp;lt;code&amp;gt;mm&amp;lt;/code&amp;gt; - Minor version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;PP&amp;lt;/code&amp;gt; - Patch version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; - Android patch version/any other use.&lt;br /&gt;
* &amp;lt;code&amp;gt;VVV&amp;lt;/code&amp;gt; - Reserved for ABI/Variants.&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Rest unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
==== New Version Code scheme draft ====&lt;br /&gt;
This is but one possible idea among many, and is not final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MSUUmmPPppVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* 1 - Major version code. Wesnoth's version's first digit is almost always 1, but the max versionCode is 21000000 so it can go upto 2 if needed.&lt;br /&gt;
* S - store identifier (must be greater than 2 to allow upgrade from previous scheme.) For example:&lt;br /&gt;
** &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - F-Droid&lt;br /&gt;
** &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; - Google Play&lt;br /&gt;
** Others if needed.&lt;br /&gt;
* UU - unused/unspecified.&lt;br /&gt;
* mm - Minor version&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* pp - Android Patch version&lt;br /&gt;
* VV - ABI/Variants&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Last but one digit - Unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
E.g., 1.20.14 with hotfix 1, Fdroid, arm64 ABI would be: &amp;lt;code&amp;gt;120020140102&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Other version code scheme drafts ====&lt;br /&gt;
&lt;br /&gt;
Given that we only have 10 digits to work with (max being 2.1e9, which is signed INT_MAX with some margin), the above scheme is not possible. The PR to remove/disable the existing version codes on f-droid has been rejected, so we're probably stuck with version codes &amp;gt; 1.19e9. &lt;br /&gt;
The highest version code currently (2025-10-02) in use is 1191601002.&lt;br /&gt;
&lt;br /&gt;
Further constraints are:&lt;br /&gt;
* version codes should go up&lt;br /&gt;
* each ABI needs its own version code&lt;br /&gt;
* we may have multiple APK releases for one &amp;quot;regular wesnoth version&amp;quot; to fix android-only issues (android patch version)&lt;br /&gt;
* we may have builds that differ per store (F-droid creates the file /data/Dist with contents &amp;quot;F-Droid&amp;quot; during the build process)&lt;br /&gt;
* we may want various variants of builds, that is, a &amp;quot;clean&amp;quot; build, a build with google play integrations, a build with a different integration, and so on. This may or may not be tied to the store the APK is distributed on&lt;br /&gt;
&lt;br /&gt;
Drafts of possible approaches:&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;MMMPPpxxVA&amp;lt;/code&amp;gt; =====&lt;br /&gt;
* MMM - Combined Major/Minor: 1.19 = 119, but each subsequent minor *or* major bump increases this number by 1. This remains visually the same until 2.0 happens.&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* p - Android patch version&lt;br /&gt;
* V - Build variant (0 is clean, 1 might be google play integrations. Could be a bitfield or an enum)&lt;br /&gt;
* A - ABI (as above)&lt;br /&gt;
* x - Unspecified, available for expanding these fields or adding other flags (like store and/or integrations)&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1220320002&amp;lt;/code&amp;gt; would be version 1.22 (or 2.0 or 2.2, but 2 stables from 1.18), patch 3, android patch 2, default (clean) variant, arm64&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMMPPpVA&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Basically the same thing, just shifted to the right by eating up the unspecified digits, and with the first digits fixed to 12. Leaves 8 &amp;quot;additional epochs&amp;quot; available for future expansion.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1212203202&amp;lt;/code&amp;gt; would be version 1.22.3.2 clean arm64, as above.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMPPpxVA&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Removes the major version digit, freeing up 1 digit. Not functionally different from the major-minor scheme, but reduces the number of available version bumps until epoch change.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1222032002&amp;lt;/code&amp;gt; would be version 1.22.3.2 clean arm64, as above.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74545</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74545"/>
		<updated>2025-10-02T09:21:50Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Other version code scheme drafts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This pages contains some specific information about the Battle for Wesnoth new Android port (1.19+)&lt;br /&gt;
&lt;br /&gt;
== Playing controls ==&lt;br /&gt;
* Tap a unit to select/deselect it.&lt;br /&gt;
* Tap a unit, then tap the target hex to show defense stats of that unit and footsteps. (Similar to hover on PC)&lt;br /&gt;
* Tap a unit, then double tap on the target hex to move it. Alternative, you can drag along the path to choose the exact path which the unit is supposed to move by.&lt;br /&gt;
* Drag from attacker unit towards attacked unit to attack.&lt;br /&gt;
&lt;br /&gt;
== The Settings menu (Splash screen) ==&lt;br /&gt;
&lt;br /&gt;
== Logs and debugging steps ==&lt;br /&gt;
* Install adb (Android Debug Bridge) on your computer. Search internet for information about your OS. Install drivers for your phone/tablet if necessary.&lt;br /&gt;
* Enable Developer Mode on your Android device (phone/tablet). Again, the internet is your friend. On newer devices, you need tap Settings &amp;gt; About Phone &amp;gt; Build Number 7 times until it says &amp;quot;You are now a developer&amp;quot;, then go into the Setting &amp;gt; System &amp;gt; Developer Options (newly appeared), and find &amp;quot;USB Debugging&amp;quot; in the menu and turn that on.&lt;br /&gt;
* Connect phone to PC. Do &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; or similar from a terminal/command prompt to see if your device appears on the list and is authorized. Tap ok on your phone if any permission request appears.&lt;br /&gt;
* Run &amp;lt;code&amp;gt;adb logcat -c&amp;lt;/code&amp;gt; (clears existing logs), then &amp;lt;code&amp;gt;adb logcat &amp;gt; log.txt&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; and copy from terminal). Run Wesnoth on phone. Reproduce the crash.&lt;br /&gt;
* stop &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; on PC, and attach the &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt; to your issue report on github along with detailed steps of the bug, and use the Android label.&lt;br /&gt;
&lt;br /&gt;
(Note: adb can be &amp;lt;code&amp;gt;./adb.exe&amp;lt;/code&amp;gt; on Windows. Use internet for help on any of the steps if needed, this is supposed to be a preliminary guideline. Steps might slightly differ based on manufacturer or Android version.)&lt;br /&gt;
&lt;br /&gt;
=== Enabling taps ===&lt;br /&gt;
It is useful for debugging purposes, especially if you're sharing a screen recording of your bug, to show where you're tapping on the screen in the screen recording. See [https://discussio.zendesk.com/hc/en-gb/articles/4625151970065-How-to-Show-Taps-for-Mobile-Screen-Sharing-on-Android here] for how to enable that.&lt;br /&gt;
&lt;br /&gt;
=== Turning off Developer Mode ===&lt;br /&gt;
Go to System &amp;gt; Developer Options and turn off  the '''Use developer options''' toggle.&lt;br /&gt;
&lt;br /&gt;
=== Dev Notes ===&lt;br /&gt;
==== Version Code scheme (1191601001 - post 1.19.16 fixup) ====&lt;br /&gt;
&amp;lt;code&amp;gt;MmmPPppVVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; - Major version code, so far at 1; since the max versionCode is 21000000 it can go up to 2&lt;br /&gt;
* &amp;lt;code&amp;gt;mm&amp;lt;/code&amp;gt; - Minor version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;PP&amp;lt;/code&amp;gt; - Patch version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; - Android patch version/any other use.&lt;br /&gt;
* &amp;lt;code&amp;gt;VVV&amp;lt;/code&amp;gt; - Reserved for ABI/Variants.&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Rest unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
==== New Version Code scheme draft ====&lt;br /&gt;
This is but one possible idea among many, and is not final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MSUUmmPPppVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* 1 - Major version code. Wesnoth's version's first digit is almost always 1, but the max versionCode is 21000000 so it can go upto 2 if needed.&lt;br /&gt;
* S - store identifier (must be greater than 2 to allow upgrade from previous scheme.) For example:&lt;br /&gt;
** &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - F-Droid&lt;br /&gt;
** &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; - Google Play&lt;br /&gt;
** Others if needed.&lt;br /&gt;
* UU - unused/unspecified.&lt;br /&gt;
* mm - Minor version&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* pp - Android Patch version&lt;br /&gt;
* VV - ABI/Variants&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Last but one digit - Unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
E.g., 1.20.14 with hotfix 1, Fdroid, arm64 ABI would be: &amp;lt;code&amp;gt;120020140102&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Other version code scheme drafts ====&lt;br /&gt;
&lt;br /&gt;
Given that we only have 10 digits to work with (max being 2.1e9, which is signed INT_MAX with some margin), the above scheme is not possible. The PR to remove/disable the existing version codes on f-droid has been rejected, so we're probably stuck with version codes &amp;gt; 1.19e9. &lt;br /&gt;
The highest version code currently (2025-10-02) in use is 1191601002.&lt;br /&gt;
&lt;br /&gt;
Further constraints are:&lt;br /&gt;
* version codes should go up&lt;br /&gt;
* each ABI needs its own version code&lt;br /&gt;
* we may have multiple APK releases for one &amp;quot;regular wesnoth version&amp;quot; to fix android-only issues (android patch version)&lt;br /&gt;
* we may have builds that differ per store (F-droid creates the file /data/Dist with contents &amp;quot;F-Droid&amp;quot; during the build process)&lt;br /&gt;
* we may want various variants of builds, that is, a &amp;quot;clean&amp;quot; build, a build with google play integrations, a build with a different integration, and so on. This may or may not be tied to the store the APK is distributed on&lt;br /&gt;
&lt;br /&gt;
Drafts of possible approaches:&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;MMMPPpxxxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
* MMM - Combined Major/Minor: 1.19 = 119, but each subsequent minor *or* major bump increases this number by 1. This remains visually the same until 2.0 happens.&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* p - Android patch version&lt;br /&gt;
* V - ABI&lt;br /&gt;
* x - Unspecified, available for expanding these fields or adding other flags (like store and/or integrations)&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1220320002&amp;lt;/code&amp;gt; would be version 1.22 (or 2.0 or 2.2, but 2 stables from 1.18), patch 3, android patch 2, arm64&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMMPPpxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Basically the same thing, just shifted to the right by eating up unspecified digits, and with the first digits fixed to 12. Leaves 8 &amp;quot;additional epochs&amp;quot; available for future expansion.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1212203202&amp;lt;/code&amp;gt; would be version 1.22.3.2 arm64, as above.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMPPpxxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Removes the major version digit, freeing up 1 digit. Not functionally different from the major-minor scheme, but reduces the number of available version bumps until epoch change.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1222032002&amp;lt;/code&amp;gt; would be version 1.22.3.2 arm64, as above.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74544</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74544"/>
		<updated>2025-10-02T09:01:21Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Other version code scheme drafts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This pages contains some specific information about the Battle for Wesnoth new Android port (1.19+)&lt;br /&gt;
&lt;br /&gt;
== Playing controls ==&lt;br /&gt;
* Tap a unit to select/deselect it.&lt;br /&gt;
* Tap a unit, then tap the target hex to show defense stats of that unit and footsteps. (Similar to hover on PC)&lt;br /&gt;
* Tap a unit, then double tap on the target hex to move it. Alternative, you can drag along the path to choose the exact path which the unit is supposed to move by.&lt;br /&gt;
* Drag from attacker unit towards attacked unit to attack.&lt;br /&gt;
&lt;br /&gt;
== The Settings menu (Splash screen) ==&lt;br /&gt;
&lt;br /&gt;
== Logs and debugging steps ==&lt;br /&gt;
* Install adb (Android Debug Bridge) on your computer. Search internet for information about your OS. Install drivers for your phone/tablet if necessary.&lt;br /&gt;
* Enable Developer Mode on your Android device (phone/tablet). Again, the internet is your friend. On newer devices, you need tap Settings &amp;gt; About Phone &amp;gt; Build Number 7 times until it says &amp;quot;You are now a developer&amp;quot;, then go into the Setting &amp;gt; System &amp;gt; Developer Options (newly appeared), and find &amp;quot;USB Debugging&amp;quot; in the menu and turn that on.&lt;br /&gt;
* Connect phone to PC. Do &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; or similar from a terminal/command prompt to see if your device appears on the list and is authorized. Tap ok on your phone if any permission request appears.&lt;br /&gt;
* Run &amp;lt;code&amp;gt;adb logcat -c&amp;lt;/code&amp;gt; (clears existing logs), then &amp;lt;code&amp;gt;adb logcat &amp;gt; log.txt&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; and copy from terminal). Run Wesnoth on phone. Reproduce the crash.&lt;br /&gt;
* stop &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; on PC, and attach the &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt; to your issue report on github along with detailed steps of the bug, and use the Android label.&lt;br /&gt;
&lt;br /&gt;
(Note: adb can be &amp;lt;code&amp;gt;./adb.exe&amp;lt;/code&amp;gt; on Windows. Use internet for help on any of the steps if needed, this is supposed to be a preliminary guideline. Steps might slightly differ based on manufacturer or Android version.)&lt;br /&gt;
&lt;br /&gt;
=== Enabling taps ===&lt;br /&gt;
It is useful for debugging purposes, especially if you're sharing a screen recording of your bug, to show where you're tapping on the screen in the screen recording. See [https://discussio.zendesk.com/hc/en-gb/articles/4625151970065-How-to-Show-Taps-for-Mobile-Screen-Sharing-on-Android here] for how to enable that.&lt;br /&gt;
&lt;br /&gt;
=== Turning off Developer Mode ===&lt;br /&gt;
Go to System &amp;gt; Developer Options and turn off  the '''Use developer options''' toggle.&lt;br /&gt;
&lt;br /&gt;
=== Dev Notes ===&lt;br /&gt;
==== Version Code scheme (1191601001 - post 1.19.16 fixup) ====&lt;br /&gt;
&amp;lt;code&amp;gt;MmmPPppVVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; - Major version code, so far at 1; since the max versionCode is 21000000 it can go up to 2&lt;br /&gt;
* &amp;lt;code&amp;gt;mm&amp;lt;/code&amp;gt; - Minor version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;PP&amp;lt;/code&amp;gt; - Patch version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; - Android patch version/any other use.&lt;br /&gt;
* &amp;lt;code&amp;gt;VVV&amp;lt;/code&amp;gt; - Reserved for ABI/Variants.&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Rest unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
==== New Version Code scheme draft ====&lt;br /&gt;
This is but one possible idea among many, and is not final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MSUUmmPPppVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* 1 - Major version code. Wesnoth's version's first digit is almost always 1, but the max versionCode is 21000000 so it can go upto 2 if needed.&lt;br /&gt;
* S - store identifier (must be greater than 2 to allow upgrade from previous scheme.) For example:&lt;br /&gt;
** &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - F-Droid&lt;br /&gt;
** &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; - Google Play&lt;br /&gt;
** Others if needed.&lt;br /&gt;
* UU - unused/unspecified.&lt;br /&gt;
* mm - Minor version&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* pp - Android Patch version&lt;br /&gt;
* VV - ABI/Variants&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Last but one digit - Unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
E.g., 1.20.14 with hotfix 1, Fdroid, arm64 ABI would be: &amp;lt;code&amp;gt;120020140102&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Other version code scheme drafts ====&lt;br /&gt;
&lt;br /&gt;
Given that we only have 10 digits to work with (max being 2.1e9, which is signed INT_MAX with some margin), the above scheme is not possible. The PR to remove/disable the existing version codes on f-droid has been rejected, so we're probably stuck with version codes &amp;gt; 1.19e9. &lt;br /&gt;
The highest version code currently (2025-10-02) in use is 1191601002.&lt;br /&gt;
&lt;br /&gt;
Further constraints are:&lt;br /&gt;
* version codes should go up&lt;br /&gt;
* each ABI needs its own version code&lt;br /&gt;
* we may have multiple APK releases for one &amp;quot;regular wesnoth version&amp;quot; to fix android-only issues (android patch version)&lt;br /&gt;
* we may have builds that differ per store (F-droid adds an identifier in its build process)&lt;br /&gt;
* we may want builds with or without certain integrations (like google play integrations). This may or may not be tied to the store&lt;br /&gt;
&lt;br /&gt;
Drafts of possible approaches:&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;MMMPPpxxxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
* MMM - Combined Major/Minor: 1.19 = 119, but each subsequent minor *or* major bump increases this number by 1. This remains visually the same until 2.0 happens.&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* p - Android patch version&lt;br /&gt;
* V - ABI&lt;br /&gt;
* x - Unspecified, available for expanding these fields or adding other flags (like store and/or integrations)&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1220320002&amp;lt;/code&amp;gt; would be version 1.22 (or 2.0 or 2.2, but 2 stables from 1.18), patch 3, android patch 2, arm64&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMMPPpxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Basically the same thing, just shifted to the right by eating up unspecified digits, and with the first digits fixed to 12. Leaves 8 &amp;quot;additional epochs&amp;quot; available for future expansion.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1212203202&amp;lt;/code&amp;gt; would be version 1.22.3.2 arm64, as above.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMPPpxxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Removes the major version digit, freeing up 1 digit. Not functionally different from the major-minor scheme, but reduces the number of available version bumps until epoch change.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1222032002&amp;lt;/code&amp;gt; would be version 1.22.3.2 arm64, as above.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74543</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74543"/>
		<updated>2025-10-02T09:00:22Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Other version code scheme drafts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This pages contains some specific information about the Battle for Wesnoth new Android port (1.19+)&lt;br /&gt;
&lt;br /&gt;
== Playing controls ==&lt;br /&gt;
* Tap a unit to select/deselect it.&lt;br /&gt;
* Tap a unit, then tap the target hex to show defense stats of that unit and footsteps. (Similar to hover on PC)&lt;br /&gt;
* Tap a unit, then double tap on the target hex to move it. Alternative, you can drag along the path to choose the exact path which the unit is supposed to move by.&lt;br /&gt;
* Drag from attacker unit towards attacked unit to attack.&lt;br /&gt;
&lt;br /&gt;
== The Settings menu (Splash screen) ==&lt;br /&gt;
&lt;br /&gt;
== Logs and debugging steps ==&lt;br /&gt;
* Install adb (Android Debug Bridge) on your computer. Search internet for information about your OS. Install drivers for your phone/tablet if necessary.&lt;br /&gt;
* Enable Developer Mode on your Android device (phone/tablet). Again, the internet is your friend. On newer devices, you need tap Settings &amp;gt; About Phone &amp;gt; Build Number 7 times until it says &amp;quot;You are now a developer&amp;quot;, then go into the Setting &amp;gt; System &amp;gt; Developer Options (newly appeared), and find &amp;quot;USB Debugging&amp;quot; in the menu and turn that on.&lt;br /&gt;
* Connect phone to PC. Do &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; or similar from a terminal/command prompt to see if your device appears on the list and is authorized. Tap ok on your phone if any permission request appears.&lt;br /&gt;
* Run &amp;lt;code&amp;gt;adb logcat -c&amp;lt;/code&amp;gt; (clears existing logs), then &amp;lt;code&amp;gt;adb logcat &amp;gt; log.txt&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; and copy from terminal). Run Wesnoth on phone. Reproduce the crash.&lt;br /&gt;
* stop &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; on PC, and attach the &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt; to your issue report on github along with detailed steps of the bug, and use the Android label.&lt;br /&gt;
&lt;br /&gt;
(Note: adb can be &amp;lt;code&amp;gt;./adb.exe&amp;lt;/code&amp;gt; on Windows. Use internet for help on any of the steps if needed, this is supposed to be a preliminary guideline. Steps might slightly differ based on manufacturer or Android version.)&lt;br /&gt;
&lt;br /&gt;
=== Enabling taps ===&lt;br /&gt;
It is useful for debugging purposes, especially if you're sharing a screen recording of your bug, to show where you're tapping on the screen in the screen recording. See [https://discussio.zendesk.com/hc/en-gb/articles/4625151970065-How-to-Show-Taps-for-Mobile-Screen-Sharing-on-Android here] for how to enable that.&lt;br /&gt;
&lt;br /&gt;
=== Turning off Developer Mode ===&lt;br /&gt;
Go to System &amp;gt; Developer Options and turn off  the '''Use developer options''' toggle.&lt;br /&gt;
&lt;br /&gt;
=== Dev Notes ===&lt;br /&gt;
==== Version Code scheme (1191601001 - post 1.19.16 fixup) ====&lt;br /&gt;
&amp;lt;code&amp;gt;MmmPPppVVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; - Major version code, so far at 1; since the max versionCode is 21000000 it can go up to 2&lt;br /&gt;
* &amp;lt;code&amp;gt;mm&amp;lt;/code&amp;gt; - Minor version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;PP&amp;lt;/code&amp;gt; - Patch version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; - Android patch version/any other use.&lt;br /&gt;
* &amp;lt;code&amp;gt;VVV&amp;lt;/code&amp;gt; - Reserved for ABI/Variants.&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Rest unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
==== New Version Code scheme draft ====&lt;br /&gt;
This is but one possible idea among many, and is not final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MSUUmmPPppVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* 1 - Major version code. Wesnoth's version's first digit is almost always 1, but the max versionCode is 21000000 so it can go upto 2 if needed.&lt;br /&gt;
* S - store identifier (must be greater than 2 to allow upgrade from previous scheme.) For example:&lt;br /&gt;
** &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - F-Droid&lt;br /&gt;
** &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; - Google Play&lt;br /&gt;
** Others if needed.&lt;br /&gt;
* UU - unused/unspecified.&lt;br /&gt;
* mm - Minor version&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* pp - Android Patch version&lt;br /&gt;
* VV - ABI/Variants&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Last but one digit - Unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
E.g., 1.20.14 with hotfix 1, Fdroid, arm64 ABI would be: &amp;lt;code&amp;gt;120020140102&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Other version code scheme drafts ====&lt;br /&gt;
&lt;br /&gt;
Given that we only have 10 digits to work with (max being 2.1e9, which is signed INT_MAX with some margin), the above scheme is not possible. The PR to remove/disable the existing version codes on f-droid has been rejected, so we're probably stuck with version codes &amp;gt; 1.19e9&lt;br /&gt;
The highest version code currently (2025-10-02) in use is 1191601002.&lt;br /&gt;
Further constraints are:&lt;br /&gt;
* version codes should go up&lt;br /&gt;
* each ABI needs its own version code&lt;br /&gt;
* we may have multiple APK releases for one &amp;quot;regular wesnoth version&amp;quot; to fix android-only issues (android patch version)&lt;br /&gt;
* we may have builds that differ per store (F-droid adds an identifier in its build process)&lt;br /&gt;
* we may want builds with or without certain integrations (like google play integrations). This may or may not be tied to the store&lt;br /&gt;
&lt;br /&gt;
Drafts of possible approaches:&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;MMMPPpxxxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
* MMM - Combined Major/Minor: 1.19 = 119, but each subsequent minor *or* major bump increases this number by 1. This remains visually the same until 2.0 happens.&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* p - Android patch version&lt;br /&gt;
* V - ABI&lt;br /&gt;
* x - Unspecified, available for expanding these fields or adding other flags (like store and/or integrations)&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1220320002&amp;lt;/code&amp;gt; would be version 1.22 (or 2.0 or 2.2, but 2 stables from 1.18), patch 3, android patch 2, arm64&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMMPPpxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Basically the same thing, just shifted to the right by eating up unspecified digits, and with the first digits fixed to 12. Leaves 8 &amp;quot;additional epochs&amp;quot; available for future expansion.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1212203202&amp;lt;/code&amp;gt; would be version 1.22.3.2 arm64, as above.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMPPpxxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Removes the major version digit, freeing up 1 digit. Not functionally different from the major-minor scheme, but reduces the number of available version bumps until epoch change.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1222032002&amp;lt;/code&amp;gt; would be version 1.22.3.2 arm64, as above.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74542</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Android&amp;diff=74542"/>
		<updated>2025-10-02T08:58:42Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This pages contains some specific information about the Battle for Wesnoth new Android port (1.19+)&lt;br /&gt;
&lt;br /&gt;
== Playing controls ==&lt;br /&gt;
* Tap a unit to select/deselect it.&lt;br /&gt;
* Tap a unit, then tap the target hex to show defense stats of that unit and footsteps. (Similar to hover on PC)&lt;br /&gt;
* Tap a unit, then double tap on the target hex to move it. Alternative, you can drag along the path to choose the exact path which the unit is supposed to move by.&lt;br /&gt;
* Drag from attacker unit towards attacked unit to attack.&lt;br /&gt;
&lt;br /&gt;
== The Settings menu (Splash screen) ==&lt;br /&gt;
&lt;br /&gt;
== Logs and debugging steps ==&lt;br /&gt;
* Install adb (Android Debug Bridge) on your computer. Search internet for information about your OS. Install drivers for your phone/tablet if necessary.&lt;br /&gt;
* Enable Developer Mode on your Android device (phone/tablet). Again, the internet is your friend. On newer devices, you need tap Settings &amp;gt; About Phone &amp;gt; Build Number 7 times until it says &amp;quot;You are now a developer&amp;quot;, then go into the Setting &amp;gt; System &amp;gt; Developer Options (newly appeared), and find &amp;quot;USB Debugging&amp;quot; in the menu and turn that on.&lt;br /&gt;
* Connect phone to PC. Do &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; or similar from a terminal/command prompt to see if your device appears on the list and is authorized. Tap ok on your phone if any permission request appears.&lt;br /&gt;
* Run &amp;lt;code&amp;gt;adb logcat -c&amp;lt;/code&amp;gt; (clears existing logs), then &amp;lt;code&amp;gt;adb logcat &amp;gt; log.txt&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; and copy from terminal). Run Wesnoth on phone. Reproduce the crash.&lt;br /&gt;
* stop &amp;lt;code&amp;gt;adb logcat&amp;lt;/code&amp;gt; on PC, and attach the &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt; to your issue report on github along with detailed steps of the bug, and use the Android label.&lt;br /&gt;
&lt;br /&gt;
(Note: adb can be &amp;lt;code&amp;gt;./adb.exe&amp;lt;/code&amp;gt; on Windows. Use internet for help on any of the steps if needed, this is supposed to be a preliminary guideline. Steps might slightly differ based on manufacturer or Android version.)&lt;br /&gt;
&lt;br /&gt;
=== Enabling taps ===&lt;br /&gt;
It is useful for debugging purposes, especially if you're sharing a screen recording of your bug, to show where you're tapping on the screen in the screen recording. See [https://discussio.zendesk.com/hc/en-gb/articles/4625151970065-How-to-Show-Taps-for-Mobile-Screen-Sharing-on-Android here] for how to enable that.&lt;br /&gt;
&lt;br /&gt;
=== Turning off Developer Mode ===&lt;br /&gt;
Go to System &amp;gt; Developer Options and turn off  the '''Use developer options''' toggle.&lt;br /&gt;
&lt;br /&gt;
=== Dev Notes ===&lt;br /&gt;
==== Version Code scheme (1191601001 - post 1.19.16 fixup) ====&lt;br /&gt;
&amp;lt;code&amp;gt;MmmPPppVVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; - Major version code, so far at 1; since the max versionCode is 21000000 it can go up to 2&lt;br /&gt;
* &amp;lt;code&amp;gt;mm&amp;lt;/code&amp;gt; - Minor version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;PP&amp;lt;/code&amp;gt; - Patch version code.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; - Android patch version/any other use.&lt;br /&gt;
* &amp;lt;code&amp;gt;VVV&amp;lt;/code&amp;gt; - Reserved for ABI/Variants.&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Rest unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
==== New Version Code scheme draft ====&lt;br /&gt;
This is but one possible idea among many, and is not final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MSUUmmPPppVV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
* 1 - Major version code. Wesnoth's version's first digit is almost always 1, but the max versionCode is 21000000 so it can go upto 2 if needed.&lt;br /&gt;
* S - store identifier (must be greater than 2 to allow upgrade from previous scheme.) For example:&lt;br /&gt;
** &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - F-Droid&lt;br /&gt;
** &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; - Google Play&lt;br /&gt;
** Others if needed.&lt;br /&gt;
* UU - unused/unspecified.&lt;br /&gt;
* mm - Minor version&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* pp - Android Patch version&lt;br /&gt;
* VV - ABI/Variants&lt;br /&gt;
** Last digit - ABI (&amp;lt;code&amp;gt;['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Last but one digit - Unused (variants if we need them)&lt;br /&gt;
&lt;br /&gt;
E.g., 1.20.14 with hotfix 1, Fdroid, arm64 ABI would be: &amp;lt;code&amp;gt;120020140102&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Other version code scheme drafts ====&lt;br /&gt;
&lt;br /&gt;
Given that we only have 10 digits to work with (max being 2.1e9, which is signed INT_MAX with some margin), the above scheme is not possible.&lt;br /&gt;
The highest version code currently (2025-10-02) in use is 1191601002.&lt;br /&gt;
Further constraints are:&lt;br /&gt;
* version codes should go up&lt;br /&gt;
* each ABI needs its own version code&lt;br /&gt;
* we may have multiple APK releases for one &amp;quot;regular wesnoth version&amp;quot; to fix android-only issues (android patch version)&lt;br /&gt;
* we may have builds that differ per store (F-droid adds an identifier in its build process)&lt;br /&gt;
* we may want builds with or without certain integrations (like google play integrations). This may or may not be tied to the store&lt;br /&gt;
&lt;br /&gt;
Drafts of a possible approaches:&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;MMMPPpxxxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
* MMM - Combined Major/Minor: 1.19 = 119, but each subsequent minor *or* major bump increases this number by 1. This remains visually the same until 2.0 happens.&lt;br /&gt;
* PP - Patch version&lt;br /&gt;
* p - Android patch version&lt;br /&gt;
* V - ABI&lt;br /&gt;
* x - Unspecified, available for expanding these fields or adding other flags (like store and/or integrations)&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1220320002&amp;lt;/code&amp;gt; would be version 1.22 (or 2.0 or 2.2, but 2 stables from 1.18), patch 3, android patch 2, arm64&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMMPPpxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Basically the same thing, just shifted to the right by eating up unspecified digits, and with the first digits fixed to 12. Leaves 8 &amp;quot;additional epochs&amp;quot; available for future expansion.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1212203202&amp;lt;/code&amp;gt; would be version 1.22.3.2 arm64, as above.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;12MMPPpxxV&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Removes the major version digit, freeing up 1 digit. Not functionally different from the major-minor scheme, but reduces the number of available version bumps until epoch change.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;1222032002&amp;lt;/code&amp;gt; would be version 1.22.3.2 arm64, as above.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Eastern_History&amp;diff=61128</id>
		<title>Eastern History</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Eastern_History&amp;diff=61128"/>
		<updated>2019-06-14T15:05:52Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is to describe history that occurred in the Silver Lands, the region east of what is on the main map. Currently, it also describes some things to the south of wesnoth. This should eventually be moved, or we could rename the page.&lt;br /&gt;
&lt;br /&gt;
[https://sourceforge.net/p/wesnoth-umc-dev/code/HEAD/tree/branches/resources/images/maps/wesnoth-north-silver_lands.jpg?format=raw Best map as of 2019-06-14].&lt;br /&gt;
Relevant part is everything to the south-east of Lin-Elens.&lt;br /&gt;
&lt;br /&gt;
== Prehistory ==&lt;br /&gt;
* Elves inhabit Lin-Elens.&lt;br /&gt;
* Minotaurs live on the plains around the Lake Aoir. (named Minotaur's Lake on the map) &lt;br /&gt;
* Dwarves live in the mountains around Firecloud Peak. They are prohibited by treaty with the elves from claiming the hills south of the great river.&lt;br /&gt;
* The Eltireans live in floating isles hidden above the eastern side of the Flamebreath Desert.&lt;br /&gt;
* Saurians live in the Ssyuriss Fenn.&lt;br /&gt;
&lt;br /&gt;
== 20 BW - 200 YW: Drakes and Dwarves ==&lt;br /&gt;
&lt;br /&gt;
=== 20 BW ===&lt;br /&gt;
* Dwarves from Firecloud Peak cross the Great River and colonize the hills of Triththa.&lt;br /&gt;
&lt;br /&gt;
=== 181 YW ===&lt;br /&gt;
* The Silver Drakes attack Firecloud peak and the surrounding area, drafting most of the saurians from Ssyuriss Fenn into their ranks.&lt;br /&gt;
* The dwarvish defenses crumble under the combined offensive. When it becomes clear that the war is lost, the survivors evacuate to Triththa.&lt;br /&gt;
* The saurians suffer the brunt of the casualties in the war. The remainder are enslaved by the drakes.&lt;br /&gt;
&lt;br /&gt;
=== 182 YW ===&lt;br /&gt;
* The saurians remaining in Ssyuriss Fenn are soundly defeated by a Triththan offensive. The remnants of their civilization are a number of disorganised tribes.&lt;br /&gt;
&lt;br /&gt;
== 20-400 YW: Arrival of humans ==&lt;br /&gt;
The period in which humans first entered the Silver Lands, and carved out their own nations.&lt;br /&gt;
&lt;br /&gt;
=== 23 YW ===&lt;br /&gt;
* Human settlement of the Estmarks begins.&lt;br /&gt;
&lt;br /&gt;
=== 99-127 YW ===&lt;br /&gt;
* Large increase in the use of magic in the Estmarks.&lt;br /&gt;
&lt;br /&gt;
=== 127 YW ===&lt;br /&gt;
* An orcish invasion pushes the settlers south, out of the Estmarks, before the Grand Army of Wesnoth can arrive.&lt;br /&gt;
* The settlers found a number of new settlements on the edge of the Kerlath hills and the Sandy Wastes.&lt;br /&gt;
* The orcish horde is driven out by the numerically superior Grand Army of Wesnoth, but some tribes desert and settle the areas furthest from wesnoth.&lt;br /&gt;
* Contact between the settlers and the Kingdom of Wesnoth is lost completely.&lt;br /&gt;
* The settlers acquire a distaste for magic, thinking its use brought on the orcish horde.&lt;br /&gt;
&lt;br /&gt;
=== 171-300 YW ===&lt;br /&gt;
* The settlers expand around the edge of the desert, eventually reaching the mountains south of Lake Aoir.&lt;br /&gt;
&lt;br /&gt;
=== 336 YW ===&lt;br /&gt;
* A large group of magic-using settlers leaves the desert, heading north.&lt;br /&gt;
&lt;br /&gt;
=== 337-368 YW ===&lt;br /&gt;
* The exiles settle in the plains near the Lin-Elens.&lt;br /&gt;
* The exiles rapidly expand their territory.&lt;br /&gt;
* Ideological conflict about types of magic starts fracturing the new nation.&lt;br /&gt;
* The sides eventually consolidate around the cities of Noct and Diurna, on opposite sides of the river.&lt;br /&gt;
&lt;br /&gt;
=== 395-398 YW ===&lt;br /&gt;
* The various tribes around the desert are unified as the Khalifate. Magic is outlawed&lt;br /&gt;
&lt;br /&gt;
== ? ==&lt;br /&gt;
&lt;br /&gt;
=== 546-550 YW ===&lt;br /&gt;
* Contact between the Khalifate and Wesnoth is reestablished, trade flourishes.&lt;br /&gt;
&lt;br /&gt;
=== 551 YW ===&lt;br /&gt;
* Ravanal is banished from the Khalifate for the use of magic.&lt;br /&gt;
&lt;br /&gt;
== 1283-? YW: the Era of Strife ==&lt;br /&gt;
=== 1283 YW ===&lt;br /&gt;
* Start of the great war in the Silver Lands, thus marking the beginning of the Era of Strife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under construction...&lt;br /&gt;
&lt;br /&gt;
For that reason, no category tags have yet been added.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DataURI&amp;diff=59288</id>
		<title>DataURI</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DataURI&amp;diff=59288"/>
		<updated>2018-03-20T12:14:18Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Instead of referring to an image included in an add-on, an image path may also contain the image directly as a [https://en.wikipedia.org/wiki/Data_URI_scheme Data URI (wikipedia)]. This can be useful for add-on icons in the [[PblWML]] (which may otherwise only contain core images) or for single-file scenarios.&lt;br /&gt;
&lt;br /&gt;
Beyond these cases, Data URIs are less useful, as they are larger than the images themselves, and clutter up the files that include them.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
A Data URI appears as follows: &amp;lt;code&amp;gt;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be split into the following sections:&lt;br /&gt;
&amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;image/png;base64&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Schema ====&lt;br /&gt;
The &amp;lt;code&amp;gt;data:&amp;lt;/code&amp;gt; part specifies that this is a Data URI.&lt;br /&gt;
&lt;br /&gt;
==== Mime type ====&lt;br /&gt;
The &amp;lt;code&amp;gt;image/png&amp;lt;/code&amp;gt; part specifies that this is a PNG image. Also supported is &amp;lt;code&amp;gt;image/jpeg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== base64 =====&lt;br /&gt;
Technically part of the mime type, this specifies that the image data is encoded using Base64.&lt;br /&gt;
&lt;br /&gt;
==== Data ====&lt;br /&gt;
The random-looking characters following the comma are the actual image data.&lt;br /&gt;
&lt;br /&gt;
== Creating a Data URI ==&lt;br /&gt;
Wesnoth does not yet support generating a Data URI for you, but there are alternatives.&lt;br /&gt;
&lt;br /&gt;
=== Websites ===&lt;br /&gt;
There are a large number of Data URI generator websites. Googling for [https://google.com/search?q=data+uri+generator data uri generator] will find them.&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
Creating a data URI by hand can be accomplished by taking your image, Base64-encoding it and formatting it as shown above.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DataURI&amp;diff=59264</id>
		<title>DataURI</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DataURI&amp;diff=59264"/>
		<updated>2018-03-15T14:14:35Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Instead of referring to an image included in an add-on, an image path may also contain the image directly as a [https://en.wikipedia.org/wiki/Data_URI_scheme Data URI (wikipedia)]. This can be useful for add-on icons in the [[PblWML]] (which may otherwise only contain core images) or for single-file scenarios.&lt;br /&gt;
&lt;br /&gt;
Beyond these cases, Data URIs are less useful, as they are larger than the images themselves, and clutter up the files that include them.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
A Data URI appears as follows: &amp;lt;code&amp;gt;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be split into the following sections:&lt;br /&gt;
&amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;image/png;base64&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Schema ====&lt;br /&gt;
The `data:` part specifies that this is a Data URI.&lt;br /&gt;
&lt;br /&gt;
==== Mime type ====&lt;br /&gt;
The `image/png` part specifies that this is a PNG image. Also supported is `image/jpeg`.&lt;br /&gt;
&lt;br /&gt;
===== base64 =====&lt;br /&gt;
Technically part of the mime type, this specifies that the image data is encoded using Base64.&lt;br /&gt;
&lt;br /&gt;
==== Data ====&lt;br /&gt;
The random-looking characters following the comma are the actual image data.&lt;br /&gt;
&lt;br /&gt;
== Creating a Data URI ==&lt;br /&gt;
Wesnoth does not yet support generating a Data URI for you, but there are alternatives.&lt;br /&gt;
&lt;br /&gt;
=== Websites ===&lt;br /&gt;
There are a large number of Data URI generator websites. Googling for [https://google.com/search?q=data+uri+generator data uri generator] will find them.&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
Creating a data URI by hand can be accomplished by taking your image, Base64-encoding it and formatting it as shown above.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=FancyAddonIcons&amp;diff=59263</id>
		<title>FancyAddonIcons</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=FancyAddonIcons&amp;diff=59263"/>
		<updated>2018-03-15T14:14:22Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An add-on's icon is the first thing a player is going to look at when picking add-ons. A good add-on icon can attract many players, so it should not be neglected. However, custom images cannot be used, they will be seen only by people who have it installed, that usually means that the author will think it's correct, although it is not. Despite this limitation, there is a way to create quite cool add-on icons. It is called [[ImagePathFunctionWML]]. Another method that can be used is a [[DataURI]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Of course, you can create a code like (careful, it is long!):&lt;br /&gt;
 items/bonestack.png~BLIT(items/bonestack.png~CROP(20,0,52,52),0,20)~BLIT(items/bonestack.png~CROP(0,0,52,52),20,20)~BLIT(items/burial.png~CROP(20,0,52,72),0,0)~BLIT(items/burial.png~CROP(0,0,52,62),20,10)~BLIT(units/undead-skeletal/archer-die2-6.png~CROP(10,0,62,62)~RC(magenta&amp;gt;black),0,10)~BLIT(units/orcs/sovereign-lead-2.png~RC(magenta&amp;gt;black))~BLIT(items/burial.png~CROP(0,0,62,52),10,20)&lt;br /&gt;
&lt;br /&gt;
But testing this will be very tedious and annoying, reloading the entire add-on to view it somewhere, or even uploading it to test it every time. To make this easier, download an add-on named ''Image loading tester'', it will help you a lot with this. The add-on is absolutely minimalistic, and has no obvious effect anywhere. To use it, either execute this WML chunk:&lt;br /&gt;
 [lua]&lt;br /&gt;
   code=&amp;lt;&amp;lt;wesnoth.image_test()&amp;gt;&amp;gt;&lt;br /&gt;
 [/lua]&lt;br /&gt;
&lt;br /&gt;
Or activate the debug mode (:debug in [[CommandMode]]), and use this command:&lt;br /&gt;
 lua wesnoth.image_test()&lt;br /&gt;
The second option is probably more convenient.&lt;br /&gt;
&lt;br /&gt;
A window will show up, there will be a text box and two buttons. Type your image code into the text box and click on the Show button (or hit Enter instead). This way, you will be able to verify it very quickly. It is recommended to do this while running wesnoth from command prompt (on Windows) or Terminal (on Linux), it will notice you about some errors in your code (on Windows, you can also read stderr.txt afterwards).&lt;br /&gt;
&lt;br /&gt;
Because the code on a single line possibly with many nested brackets is almost unreadable for humans, it is recommended to write it in a text file with indentation and new lines, then to use Find&amp;amp;Replace to remove all tabs, spaces and new lines and paste it into the text box. I will use indented codes later, for better readability, and it will be necessary to remove all spaces and new lines from it or copying the version when it is already removed bellow it if you want to try it out.&lt;br /&gt;
&lt;br /&gt;
To understand better the numeric values that look like just made up to fit, you might want to learn the coordinates needed in an image editor like GIMP.&lt;br /&gt;
&lt;br /&gt;
It is also recommended to use wesnoth 1.12 or later wesnoth 1.11, 1.10 tends to randomly crash when copying stuff from the textbox and that annoys a lot, even if it happens only sometimes. I have written the examples to work with these versions.&lt;br /&gt;
&lt;br /&gt;
Now, you can verify your codes easily, and you can progress to the next step.&lt;br /&gt;
&lt;br /&gt;
== Step by step tutorial ==&lt;br /&gt;
Let us think about creating an add-on image for a campaign where elves attack undead. It would consist of an Elvish Hero chopping undead to pieces, supported by spells of an Elvish Sorceress behind him. We will create an image for it in several steps. Try out each one of them to see what is changed.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Image showing an Elvish Hero in an attacking position is units/elves-wood/hero-melee-3.png. So we start with it:&lt;br /&gt;
 units/elves-wood/hero-melee-3.png&lt;br /&gt;
&lt;br /&gt;
'''2.''' Nothing interesting so far. Let us add a skeleton he is slashing. The image units/undead-skeletal/skeleton/skeleton-se-melee3.png is in a good fighting position, also exposing his belly to our hero. We will use the ~BLIT function of [[ImagePathFunctionWML]] to add him to the picture. Now we have:&lt;br /&gt;
 units/elves-wood/hero-melee-3.png&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png&lt;br /&gt;
 )&lt;br /&gt;
Note that the new lines and indentation are added only for readability, it will not work in game, you'll have to remove all new lines and breaks. Here it is without indents:&lt;br /&gt;
 units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png)&lt;br /&gt;
&lt;br /&gt;
'''3.''' However, they are quite in an awkward position. We will need to add some offset to the skeleton. ~BLIT accepts two additional arguments that mean the offset of the image. However, it would not fit on the image then (this prints an error message into the command line, Termina or stderr.txt), so we need to crop it. The ~CROP function accepts four arguments, the first two are the coordinates where the selected part of the image should start (pixels to the right first, pixels down second), the second two is the desired size of the result (width and height respectively). In this case, we start cropping on the top left corner, therefore the first two coordinates will be 0 and 0. The offset will be 20,20 (pixels to left first, pixels down second), so we need the resolution of the image to be 52x52 (original is 72x72, we subtract 20 from both numbers). The four arguments of crop will be therefore 0,0,52,52, and the two additional arguments of ~BLIT will be 20,20. Together, it should look like this:&lt;br /&gt;
 units/elves-wood/hero-melee-3.png&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(0,0,52,52)&lt;br /&gt;
 ,20,20)&lt;br /&gt;
Or without indentation:&lt;br /&gt;
 units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(0,0,52,52),20,20)&lt;br /&gt;
&lt;br /&gt;
'''4.''' Now, the skeleton needs to be headed differently, because he isn't attacking the hero. The ~FLIP function is designed for this. Use ~FLIP(horizontal) for this. We will also need to adjust the offset in CROP and BLIT, because it would look bad:&lt;br /&gt;
 units/elves-wood/hero-melee-3.png&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,47)~FL(horizontal)&lt;br /&gt;
 ,40,20)&lt;br /&gt;
Or without indentation:&lt;br /&gt;
 units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,47)~FL(horizontal),40,20)&lt;br /&gt;
&lt;br /&gt;
'''5.''' However, we want the skeleton to be chopped in half by the Hero's sword. We can do this by placing two conveniently cropped images of skeleton one above another.&lt;br /&gt;
 units/elves-wood/hero-melee-3.png&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)&lt;br /&gt;
 ,40,10)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)&lt;br /&gt;
 ,40,47)&lt;br /&gt;
Or without indentation:&lt;br /&gt;
 units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal),40,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal),40,47)&lt;br /&gt;
&lt;br /&gt;
'''6.''' We want our heroes to be also teamcoloured, so we can change the default colour (magenta) to some other colour. The colours you can change it to can be found in the data/core/team_colors.cfg file. The colours are changed using the ~RC function. Because our heroes are good and the undead are bad, let's team-colour the undead black and the heroes white.&lt;br /&gt;
 units/elves-wood/hero-melee-3.png~RC(magenta&amp;gt;white)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,40,10)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,40,47)&lt;br /&gt;
Or without indentation:&lt;br /&gt;
 units/elves-wood/hero-melee-3.png~RC(magenta&amp;gt;white)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta&amp;gt;black),40,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)~RC(magenta&amp;gt;black),40,47)&lt;br /&gt;
&lt;br /&gt;
'''7.''' Now, we want to add the Sorceress casting a spell to the background. She should be behind the Elvish Hero, and she should have an offset, but that can be done by cropping. To make sure that she won't be hid behind the Hero too badly, the hero and the skeleton will have to be offset too. Because we need an image of dimensions 72x72 as background, and a cropped Sorceress does not have such dimensions, we will have to use misc/blank-hex.png as background (it is a blank image) and place the sorceress on it. The offsets were adjusted to make it look better.&lt;br /&gt;
 misc/blank-hex.png&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/sorceress-magic-3.png~RC(magenta&amp;gt;white)~CROP(10,15,57,62)&lt;br /&gt;
 ,0,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/hero-melee-3.png~RC(magenta&amp;gt;white)~CROP(0,0,72,62)&lt;br /&gt;
 ,0,10)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,40,20)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,40,57)&lt;br /&gt;
Or without indentation:&lt;br /&gt;
 misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta&amp;gt;white)~CROP(15,10,57,62),0,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta&amp;gt;white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta&amp;gt;black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta&amp;gt;black),40,57)&lt;br /&gt;
&lt;br /&gt;
'''8.''' Now, we need to add some halo to her, she is casting a spell, no? A suitable halo can be halo/elven/faerie-fire-halo4.png, let's use it. Its resolution is 96x96, that is quite awkward because it is larger than our image, but we can crop it easily.&lt;br /&gt;
 misc/blank-hex.png&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/sorceress-magic-3.png~RC(magenta&amp;gt;white)~CROP(10,15,57,62)&lt;br /&gt;
 ,0,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)&lt;br /&gt;
 ,0,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/hero-melee-3.png~RC(magenta&amp;gt;white)~CROP(0,0,72,62)&lt;br /&gt;
 ,0,10)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,40,20)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,40,57)&lt;br /&gt;
Or without indentation:&lt;br /&gt;
 misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta&amp;gt;white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta&amp;gt;white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta&amp;gt;black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta&amp;gt;black),40,57)&lt;br /&gt;
&lt;br /&gt;
'''9.''' Now, to add the homing missile of the spell. halo/elven/ice-halo3.png looks convenient. Placing it on the image together with a skeleton that would be the victim of this spell is analogical to things done previously.&lt;br /&gt;
 misc/blank-hex.png&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/sorceress-magic-3.png~RC(magenta&amp;gt;white)~CROP(10,15,57,62)&lt;br /&gt;
 ,0,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)&lt;br /&gt;
 ,0,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,30,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   halo/elven/ice-halo3.png~CROP(0,20,62,52)&lt;br /&gt;
 ,10,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/hero-melee-3.png~RC(magenta&amp;gt;white)~CROP(0,0,72,62)&lt;br /&gt;
 ,0,10)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,40,20)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,40,57)&lt;br /&gt;
Or without indentation:&lt;br /&gt;
 misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta&amp;gt;white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(halo/elven/ice-halo3.png~CROP(0,20,62,52),10,0)~BLIT(units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta&amp;gt;black),30,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta&amp;gt;white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta&amp;gt;black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta&amp;gt;black),40,57)&lt;br /&gt;
&lt;br /&gt;
'''10.''' We might colourise the skeleton blue, to make him appear frozen. There are two functions for this, ~CS and ~GS. ~GS removes all colour, transforming all colours into shades of gray. ~CS is used to change the colour, it accepts three arguments, the change to the red colour, the change to the green colour and the change to the blue colour. Negative numbers (from -1 to -255) mean removing the colour from all pixels (respecting transparency), so ~CS(0,-255,-255) will remove all colours except red, so that only the red part of the light will remain. Positive numbers (from 1 to 255) will add the colour to all pixels (unless invisible), so ~CS(255,0,0) will set the red fraction of the colour to maximum. ~CS(255,-255,-255) will remove all colours but red, and add a maximum of red everywhere, creating a single-colour image. To create the effect of frozen, we first use ~GS and then we use ~CS to make it bluer.&lt;br /&gt;
 misc/blank-hex.png&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/sorceress-magic-3.png~RC(magenta&amp;gt;white)~CROP(10,15,57,62)&lt;br /&gt;
 ,0,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)&lt;br /&gt;
 ,0,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta&amp;gt;black)~GS()~CS(50,50,150)&lt;br /&gt;
 ,30,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   halo/elven/ice-halo3.png~CROP(0,20,62,52)&lt;br /&gt;
 ,10,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/hero-melee-3.png~RC(magenta&amp;gt;white)~CROP(0,0,72,62)&lt;br /&gt;
 ,0,10)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,40,20)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,40,57)&lt;br /&gt;
Or without indentation:&lt;br /&gt;
 misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta&amp;gt;white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta&amp;gt;black)~GS()~CS(50,50,150),30,0)~BLIT(halo/elven/ice-halo3.png~CROP(0,20,62,52),10,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta&amp;gt;white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta&amp;gt;black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta&amp;gt;black),40,57)&lt;br /&gt;
&lt;br /&gt;
Now, we are done with this image.&lt;br /&gt;
&lt;br /&gt;
== More examples ==&lt;br /&gt;
Here are more examples of stuff you can do using these methods. They don't contain precise information how it is done, but it should be clear if you have read the tutorial.&lt;br /&gt;
&lt;br /&gt;
=== The Spellsword ===&lt;br /&gt;
The purpose of this example is to show the usage of the opacity ~O function. When called on magical halo, it can be used to make the halo partially before and partially behind the unit (place the image there twice with 50% opacity, once under him, once above him). It can be also used to create motion blur.&lt;br /&gt;
&lt;br /&gt;
 halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/high-lord-attack-sword-2.png~CROP(6,6,66,66)~O(25%)~RC(magenta&amp;gt;blue)&lt;br /&gt;
 )&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/high-lord-attack-sword-2.png~CROP(3,3,69,69)~O(50%)~RC(magenta&amp;gt;blue)&lt;br /&gt;
 )&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/elves-wood/high-lord-attack-sword-2.png~RC(magenta&amp;gt;blue)&lt;br /&gt;
 )&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)&lt;br /&gt;
 )&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   halo/elven/faerie-fire-halo3.png~CROP(0,5,57,72)&lt;br /&gt;
 ,15,0)&lt;br /&gt;
Without indentation:&lt;br /&gt;
 halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)~BLIT(units/elves-wood/high-lord-attack-sword-2.png~CROP(6,6,66,66)~O(25%)~RC(magenta&amp;gt;blue))~BLIT(units/elves-wood/high-lord-attack-sword-2.png~CROP(3,3,69,69)~O(50%)~RC(magenta&amp;gt;blue))~BLIT(units/elves-wood/high-lord-attack-sword-2.png~RC(magenta&amp;gt;blue))~BLIT(halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%))~BLIT(halo/elven/faerie-fire-halo3.png~CROP(0,5,57,72),15,0)&lt;br /&gt;
&lt;br /&gt;
=== Zorro ===&lt;br /&gt;
The purpose of this example is to show that some body parts can be taken from the original body (provided that they can be selected easily), modified and placed back. Or placed on to different place. Or to a completely different sprite.&lt;br /&gt;
&lt;br /&gt;
 units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta&amp;gt;black)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/human-loyalists/master-at-arms-crossbow-2.png~CROP(2,27,18,14)~FL(horiz)&lt;br /&gt;
 ,48,27)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/human-outlaws/assassin-throwknife1.png~CROP(29,17,11,13)~RC(magenta&amp;gt;black)&lt;br /&gt;
 ,26,21)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   halo/misc/leadership-flare-7.png~CROP(0,5,46,67)&lt;br /&gt;
 ,26,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   halo/misc/leadership-flare-6.png~CROP(33,7,39,65)&lt;br /&gt;
 ,0,0)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta&amp;gt;black)~CROP(20,11,20,17)~CS(-100,-100,-100)&lt;br /&gt;
 ,20,11)&lt;br /&gt;
Without indentation:&lt;br /&gt;
 units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta&amp;gt;black)~BLIT(units/human-loyalists/master-at-arms-crossbow-2.png~CROP(2,27,18,14)~FL(horiz),48,27)~BLIT(units/human-outlaws/assassin-throwknife1.png~CROP(29,17,11,13)~RC(magenta&amp;gt;black),26,21)~BLIT(halo/misc/leadership-flare-7.png~CROP(0,5,46,67),26,0)~BLIT(halo/misc/leadership-flare-6.png~CROP(33,7,39,65),0,0)~BLIT(units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta&amp;gt;black)~CROP(20,11,20,17)~CS(-100,-100,-100),20,11)&lt;br /&gt;
&lt;br /&gt;
=== Lich Wars ===&lt;br /&gt;
The purpose of this is to show how can text be used in the graphics. It mostly revolves around the misc/font8x8.png file (it is not in core, but in another images folder belonging to the game, next to the data folder that contains the core folder; using it causes no trouble).&lt;br /&gt;
&lt;br /&gt;
 misc/blank-hex.png&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/deathblade-dying-2.png~FL(horiz)~RC(magenta&amp;gt;red)~CROP(0,0,62,62)~O(50%)&lt;br /&gt;
 ,10,10)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-skeletal/deathblade-dying-1.png~FL(horiz)~RC(magenta&amp;gt;red)~CROP(0,0,62,62)&lt;br /&gt;
 ,10,10)&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   units/undead-necromancers/ancient-lich-melee.png~RC(magenta&amp;gt;red)~CROP(20,10,52,62)&lt;br /&gt;
 )&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   halo/undead/black-magic-3.png~FL(vert)~CROP(15,40,72,60)~O(70%)&lt;br /&gt;
 )&lt;br /&gt;
 ~BLIT(&lt;br /&gt;
   misc/blank-hex.png&lt;br /&gt;
   ~BLIT(&lt;br /&gt;
     misc/font8x8.png~CROP(39,33,8,8)&lt;br /&gt;
   ,16,56)&lt;br /&gt;
   ~BLIT(&lt;br /&gt;
     misc/font8x8.png~CROP(16,32,8,8)&lt;br /&gt;
   ,24,56)&lt;br /&gt;
   ~BLIT(&lt;br /&gt;
     misc/font8x8.png~CROP(47,24,8,8)&lt;br /&gt;
   ,32,56)&lt;br /&gt;
   ~BLIT(&lt;br /&gt;
     misc/font8x8.png~CROP(8,33,8,8)&lt;br /&gt;
   ,40,56)&lt;br /&gt;
   ~BLIT(&lt;br /&gt;
     misc/font8x8.png~CROP(48,41,8,8)&lt;br /&gt;
   ,16,64)&lt;br /&gt;
   ~BLIT(&lt;br /&gt;
     misc/font8x8.png~CROP(32,25,8,8)&lt;br /&gt;
   ,24,64)&lt;br /&gt;
   ~BLIT(&lt;br /&gt;
     misc/font8x8.png~CROP(8,40,8,8)&lt;br /&gt;
   ,32,64)&lt;br /&gt;
   ~BLIT(&lt;br /&gt;
     misc/font8x8.png~CROP(16,41,8,8)&lt;br /&gt;
   ,40,64)&lt;br /&gt;
   ~CS(-255,0,-255)&lt;br /&gt;
 )&lt;br /&gt;
Without indentation:&lt;br /&gt;
 misc/blank-hex.png~BLIT(units/undead-skeletal/deathblade-dying-2.png~FL(horiz)~RC(magenta&amp;gt;red)~CROP(0,0,62,62)~O(50%),10,10)~BLIT(units/undead-skeletal/deathblade-dying-1.png~FL(horiz)~RC(magenta&amp;gt;red)~CROP(0,0,62,62),10,10)~BLIT(units/undead-necromancers/ancient-lich-melee.png~RC(magenta&amp;gt;red)~CROP(20,10,52,62))~BLIT(halo/undead/black-magic-3.png~FL(vert)~CROP(15,40,72,60)~O(70%))~BLIT(misc/blank-hex.png~BLIT(misc/font8x8.png~CROP(39,33,8,8),16,56)~BLIT(misc/font8x8.png~CROP(16,32,8,8),24,56)~BLIT(misc/font8x8.png~CROP(47,24,8,8),32,56)~BLIT(misc/font8x8.png~CROP(8,33,8,8),40,56)~BLIT(misc/font8x8.png~CROP(48,41,8,8),16,64)~BLIT(misc/font8x8.png~CROP(32,25,8,8),24,64)~BLIT(misc/font8x8.png~CROP(8,40,8,8),32,64)~BLIT(misc/font8x8.png~CROP(16,41,8,8),40,64)~CS(-255,0,-255))&lt;br /&gt;
&lt;br /&gt;
[[Category:WML_Tips]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=PblWML&amp;diff=59262</id>
		<title>PblWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=PblWML&amp;diff=59262"/>
		<updated>2018-03-15T14:10:23Z</updated>

		<summary type="html">&lt;p&gt;AI: &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.&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 [[ImagePathFunctionWML]] to recolor it.&lt;br /&gt;
&lt;br /&gt;
: 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.&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;
=== 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;
=== 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.&lt;br /&gt;
&lt;br /&gt;
=== translate ===&lt;br /&gt;
: If set to ''true'', the add-on will be sent to and updated with [[WesCamp|WesCamp-i18n]]. (NOTE: this is a new and experimental function, which will automatically update the translations in your add-on. Make sure you make backups of your add-on in case of problems.)&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;
=== 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.&lt;br /&gt;
:* ''media'': miscellaneous resources for UMC authors/users, for example, music packs, packages of general-purpose WML, etc.&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;
: '''This value is required'''.&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;
&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;
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;
# The following tag is only used by Wesnoth 1.11.8 and later!&lt;br /&gt;
[feedback]&lt;br /&gt;
    topic_id=12345&lt;br /&gt;
[/feedback]&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>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DataURI&amp;diff=59261</id>
		<title>DataURI</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DataURI&amp;diff=59261"/>
		<updated>2018-03-15T14:09:57Z</updated>

		<summary type="html">&lt;p&gt;AI: Created page with &amp;quot;Instead of referring to an image included in an add-on, an image path may also contain the image directly as a [https://en.wikipedia.org/wiki/Data_URI_scheme Data URI (wikiped...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Instead of referring to an image included in an add-on, an image path may also contain the image directly as a [https://en.wikipedia.org/wiki/Data_URI_scheme Data URI (wikipedia)]. This can be useful for add-on icons in the [[PblWML]] (which may otherwise only contain core images) or for single-file scenarios. Beyond these cases, Data URIs are less useful, as they are larger than the images themselves, and clutter up the files that include them.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
A Data URI appears as follows: &amp;lt;code&amp;gt;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be split into the following sections:&lt;br /&gt;
&amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;image/png;base64&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Schema ====&lt;br /&gt;
The `data:` part specifies that this is a Data URI.&lt;br /&gt;
&lt;br /&gt;
==== Mime type ====&lt;br /&gt;
The `image/png` part specifies that this is a PNG image. Also supported is `image/jpeg`.&lt;br /&gt;
&lt;br /&gt;
===== base64 =====&lt;br /&gt;
Technically part of the mime type, this specifies that the image data is encoded using Base64.&lt;br /&gt;
&lt;br /&gt;
==== Data ====&lt;br /&gt;
The random-looking characters following the comma are the actual image data.&lt;br /&gt;
&lt;br /&gt;
== Creating a Data URI ==&lt;br /&gt;
Wesnoth does not yet support generating a Data URI for you, but there are alternatives.&lt;br /&gt;
&lt;br /&gt;
=== Websites ===&lt;br /&gt;
There are a large number of Data URI generator websites. Googling for [https://google.com/search?q=data+uri+generator data uri generator] will find them.&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
Creating a data URI by hand can be accomplished by taking your image, Base64-encoding it and formatting it as shown above.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Eastern_History&amp;diff=54834</id>
		<title>Eastern History</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Eastern_History&amp;diff=54834"/>
		<updated>2014-04-25T00:37:33Z</updated>

		<summary type="html">&lt;p&gt;AI: Remove from candidates for deletion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is to describe history that occurred in the Silver Lands, the region east of what is on the main map. Currently, it also describes some things to the south of wesnoth. This should eventually be moved, or we could rename the page.&lt;br /&gt;
&lt;br /&gt;
[http://postimage.org/image/amrz0frzz/ Best map as of 2011-11-01].&lt;br /&gt;
Relevant part is everything to the south-east of Lin-Elens.&lt;br /&gt;
&lt;br /&gt;
== Prehistory ==&lt;br /&gt;
* Elves inhabit Lin-Elens.&lt;br /&gt;
* Minotaurs live on the plains around the Lake Aoir. (named Minotaur's Lake on the map) &lt;br /&gt;
* Dwarves live in the mountains around Firecloud Peak. They are prohibited by treaty with the elves from claiming the hills south of the great river.&lt;br /&gt;
* The Eltireans live in floating isles hidden above the eastern side of the Flamebreath Desert.&lt;br /&gt;
* Saurians live in the Ssyuriss Fenn.&lt;br /&gt;
&lt;br /&gt;
== 20 BW - 200 YW: Drakes and Dwarves ==&lt;br /&gt;
&lt;br /&gt;
=== 20 BW ===&lt;br /&gt;
* Dwarves from Firecloud Peak cross the Great River and colonize the hills of Triththa.&lt;br /&gt;
&lt;br /&gt;
=== 181 YW ===&lt;br /&gt;
* The Silver Drakes attack Firecloud peak and the surrounding area, drafting most of the saurians from Ssyuriss Fenn into their ranks.&lt;br /&gt;
* The dwarvish defenses crumble under the combined offensive. When it becomes clear that the war is lost, the survivors evacuate to Triththa.&lt;br /&gt;
* The saurians suffer the brunt of the casualties in the war. The remainder are enslaved by the drakes.&lt;br /&gt;
&lt;br /&gt;
=== 182 YW ===&lt;br /&gt;
* The saurians remaining in Ssyuriss Fenn are soundly defeated by a Triththan offensive. The remnants of their civilization are a number of disorganised tribes.&lt;br /&gt;
&lt;br /&gt;
== 20-400 YW: Arrival of humans ==&lt;br /&gt;
The period in which humans first entered the Silver Lands, and carved out their own nations.&lt;br /&gt;
&lt;br /&gt;
=== 23 YW ===&lt;br /&gt;
* Human settlement of the Estmarks begins.&lt;br /&gt;
&lt;br /&gt;
=== 99-127 YW ===&lt;br /&gt;
* Large increase in the use of magic in the Estmarks.&lt;br /&gt;
&lt;br /&gt;
=== 127 YW ===&lt;br /&gt;
* An orcish invasion pushes the settlers south, out of the Estmarks, before the Grand Army of Wesnoth can arrive.&lt;br /&gt;
* The settlers found a number of new settlements on the edge of the Kerlath hills and the Sandy Wastes.&lt;br /&gt;
* The orcish horde is driven out by the numerically superior Grand Army of Wesnoth, but some tribes desert and settle the areas furthest from wesnoth.&lt;br /&gt;
* Contact between the settlers and the Kingdom of Wesnoth is lost completely.&lt;br /&gt;
* The settlers acquire a distaste for magic, thinking its use brought on the orcish horde.&lt;br /&gt;
&lt;br /&gt;
=== 171-300 YW ===&lt;br /&gt;
* The settlers expand around the edge of the desert, eventually reaching the mountains south of Lake Aoir.&lt;br /&gt;
&lt;br /&gt;
=== 336 YW ===&lt;br /&gt;
* A large group of magic-using settlers leaves the desert, heading north.&lt;br /&gt;
&lt;br /&gt;
=== 337-368 YW ===&lt;br /&gt;
* The exiles settle in the plains near the Lin-Elens.&lt;br /&gt;
* The exiles rapidly expand their territory.&lt;br /&gt;
* Ideological conflict about types of magic starts fracturing the new nation.&lt;br /&gt;
* The sides eventually consolidate around the cities of Noct and Diurna, on opposite sides of the river.&lt;br /&gt;
&lt;br /&gt;
=== 395-398 YW ===&lt;br /&gt;
* The various tribes around the desert are unified as the Khalifate. Magic is outlawed&lt;br /&gt;
&lt;br /&gt;
== ? ==&lt;br /&gt;
&lt;br /&gt;
=== 546-550 YW ===&lt;br /&gt;
* Contact between the Khalifate and Wesnoth is reestablished, trade flourishes.&lt;br /&gt;
&lt;br /&gt;
=== 551 YW ===&lt;br /&gt;
* Ravanal is banished from the Khalifate for the use of magic.&lt;br /&gt;
&lt;br /&gt;
== 1283-? YW: the Era of Strife ==&lt;br /&gt;
=== 1283 YW ===&lt;br /&gt;
* Start of the great war in the Silver Lands, thus marking the beginning of the Era of Strife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under construction...&lt;br /&gt;
&lt;br /&gt;
For that reason, no category tags have yet been added.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DutchTranslation&amp;diff=53541</id>
		<title>DutchTranslation</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DutchTranslation&amp;diff=53541"/>
		<updated>2014-03-09T22:50:01Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Dutch translation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==  Dutch translation  ==&lt;br /&gt;
&lt;br /&gt;
=== Status 2014-03-09 ===&lt;br /&gt;
1.12 is in beta en verdere 1.10 releases zijn onwaarschijnlijk. Alle versies op [http://gettext.wesnoth.org] wijzen naar de 1.11 branch. [[TextdomainStatus]] kan een indicatie geven van welke textdomains beter geschikts zijn om nu te vertalen. (maar de stringfreeze is al begonnen, dus alles moet nu klaar staan.&lt;br /&gt;
&lt;br /&gt;
=== Vertalers ===&lt;br /&gt;
Deze informatie is verouderd.&lt;br /&gt;
&lt;br /&gt;
==== Actieve vertalers ====&lt;br /&gt;
* Alexander van Gessel (AI/AI0867) - [mailto:AI0867_AT_gmail.com]&lt;br /&gt;
* Ijsbrand Oudshoorn - [mailto:oudshoorn_AT_eitri_DOT_nl]&lt;br /&gt;
* Foppe Benedictus (Fopper) - [mailto:foppeDOTbenedictusATgmailDOTcom]&lt;br /&gt;
* LightFighter&lt;br /&gt;
* Jon Jacobs&lt;br /&gt;
* Koen Vervloesem (koan) - [mailto:koenATvervloesemDOTeu]&lt;br /&gt;
&lt;br /&gt;
==== Inactieve vertalers ====&lt;br /&gt;
* Joeri Melis&lt;br /&gt;
* Thomas Hugo de Groot&lt;br /&gt;
* Thijs van der Spek&lt;br /&gt;
* Rob van der Vleugel - [mailto:vleugelATgmailDOTcom]&lt;br /&gt;
* Pieter Vermeylen (Onne) - [mailto:pitoeATinameDOTcom]&lt;br /&gt;
* Roel Thijs (Roel) - [mailto:roel.thijsATgmailDOTcom]&lt;br /&gt;
* Tobe Deprez - [mailto:tobedeprezATscarletDOTbe]&lt;br /&gt;
* Arne Deprez - [mailto:arnedeprezATscarletDOTbe]&lt;br /&gt;
* Julien Rossi (Tux2b) - [mailto:julienATrossiDOTbiz]&lt;br /&gt;
* Ernst Segers - [mailto:ernst1700ATgmailDOTcom]&lt;br /&gt;
* Roger Koot - [mailto:rDOThDOThDOTkootATmedDOTuuDOTnl]&lt;br /&gt;
* Maarten Albrecht (bloom) - [mailto:maartenalbrechtATgmailDOTcom]&lt;br /&gt;
* Koen Douterloigne - [mailto:hagnorATyahooDOTcom]&lt;br /&gt;
&lt;br /&gt;
=== Afspraken ===&lt;br /&gt;
Probeer consistent te zijn tussen verschillende textdomains. Als bijvoorbeeld een eenheid in een veldtocht en in wesnoth-units een andere naam heeft is dat erg onduidelijk.&lt;br /&gt;
&lt;br /&gt;
====Vertaling van allianties====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Engels !! Nederlands&lt;br /&gt;
|-&lt;br /&gt;
| Lawful || Gezagsgetrouw&lt;br /&gt;
|-&lt;br /&gt;
| Neutral || Neutraal&lt;br /&gt;
|-&lt;br /&gt;
| Chaotic || Wetteloos&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Vertaling van rassen====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Engels!!Nederlands&lt;br /&gt;
|-&lt;br /&gt;
|Drakes||Draaklingen&lt;br /&gt;
|-&lt;br /&gt;
|Dwarves||Dwergen&lt;br /&gt;
|-&lt;br /&gt;
|Elfs||Elfen&lt;br /&gt;
|-&lt;br /&gt;
|Goblins||Kobolds&lt;br /&gt;
|-&lt;br /&gt;
|Gryphons||Griffioenen&lt;br /&gt;
|-&lt;br /&gt;
|Human||Mensen&lt;br /&gt;
|-&lt;br /&gt;
|Orcs||Orks&lt;br /&gt;
|-&lt;br /&gt;
|Saurians||Saurianen&lt;br /&gt;
|-&lt;br /&gt;
|Troll||Trollen&lt;br /&gt;
|-&lt;br /&gt;
|Undead||Ondoden&lt;br /&gt;
|-&lt;br /&gt;
|Ogres||Boemannen&lt;br /&gt;
|-&lt;br /&gt;
|Mermen||Meermannen&lt;br /&gt;
|-&lt;br /&gt;
|Monsters||Monsters&lt;br /&gt;
|-&lt;br /&gt;
|Nagas||Nagas&lt;br /&gt;
|-&lt;br /&gt;
|Wose||Enten&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eenheden zijn te vinden in de [http://units.wesnoth.org eenhedenboom]&lt;br /&gt;
&lt;br /&gt;
==== Aanpassingsvoorstellen ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Engels !! Nederlands !! Voorstel&lt;br /&gt;
|-&lt;br /&gt;
| Alignment || Alliantie || Iets anders, mogelijk gebaseerd op activiteitscyclus&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Claims ===&lt;br /&gt;
&lt;br /&gt;
De nieuwe manier om bij te houden waar je mee bezig bent. Als het engels van een groene vertaling is aangepast of de tijdsduur is verstreken, kan je de taak zelf claimen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Textdomain||Vertaler||Claimdatum||Deadline/Tijdsduur&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;| Core&lt;br /&gt;
|- style=&amp;quot;text-decoration:line-through; color:green;&amp;quot;&lt;br /&gt;
|wesnoth||GCI||27 December 2010||10 januari 2011&lt;br /&gt;
|- style=&amp;quot;text-decoration:line-through; color:green;&amp;quot;&lt;br /&gt;
|wesnoth-anl||AI||27 December 2010||een paar dagen&lt;br /&gt;
|- style=&amp;quot;text-decoration:line-through; color:green;&amp;quot;&lt;br /&gt;
|wesnoth-editor||AI||27 December 2010||een paar dagen&lt;br /&gt;
|- style=&amp;quot;text-decoration:line-through; color:green;&amp;quot;&lt;br /&gt;
|wesnoth-help||GCI||27 December 2010||10 januari 2011&lt;br /&gt;
|- style=&amp;quot;text-decoration:line-through; color:green;&amp;quot;&lt;br /&gt;
|wesnoth-units||GCI||27 December 2010||10 januari 2011&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;| Mainline veldtochten&lt;br /&gt;
|- style=&amp;quot;text-decoration:line-through; color:green;&amp;quot;&lt;br /&gt;
|wesnoth-aoi||GCI||27 December 2010||10 januari 2011&lt;br /&gt;
|- style=&amp;quot;text-decoration:line-through; color:green;&amp;quot;&lt;br /&gt;
|wesnoth-thot||GCI||27 December 2010||10 januari 2011&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;| UMC&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Legenda&lt;br /&gt;
! Status !! Vertalen?&lt;br /&gt;
|- style=&amp;quot;color:blue;&amp;quot;&lt;br /&gt;
| Geclaimd || Nee&lt;br /&gt;
|- style=&amp;quot;color:green;&amp;quot;&lt;br /&gt;
| Af || Nee&lt;br /&gt;
|- style=&amp;quot;color:orange;&amp;quot;&lt;br /&gt;
| Verouderd || Ja&lt;br /&gt;
|- style=&amp;quot;color:black;&amp;quot;&lt;br /&gt;
| Ongeclaimd || Ja&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Translations]]&lt;br /&gt;
&lt;br /&gt;
=== See Also ===&lt;br /&gt;
&lt;br /&gt;
* [[WesnothTranslations]]&lt;br /&gt;
* [http://gettext.wesnoth.org Translation statistics]&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Timeline_of_Wesnoth&amp;diff=53516</id>
		<title>Timeline of Wesnoth</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Timeline_of_Wesnoth&amp;diff=53516"/>
		<updated>2014-03-07T05:39:28Z</updated>

		<summary type="html">&lt;p&gt;AI: /* 21 YW */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a chronological history of the country of Wesnoth and surrounding regions, gleaned from written accounts and verbal histories passed down through the generations.  Portions of entries surrounded by parentheses and containing a question mark are assumed or unconfirmed information.  The history is sorted by era, and within the era by date, using the Foundation of Wesnoth as a base.  BW=Before Wesnoth, YW=Years Wesnoth.  They function the same way as BC and AD do in our timekeeping system. Each of the eras is summarized before the timeline for that era begins.  This history of the Great Continent is a subject of active scholarship.&lt;br /&gt;
&lt;br /&gt;
The world that Wesnoth resides in is called Irdya.  Before the Fall and the (unchronicled) technological age, this name is only rarely used. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Spoiler warning!'''&lt;br /&gt;
This page contains plot spoilers to several campaigns.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
[[#Prehistory - 20 YW: The Founding of Wesnoth|The Founding of Wesnoth]]&lt;br /&gt;
&lt;br /&gt;
[[#20-130 YW: The Taming of the Wild|The Taming of the Wild]]&lt;br /&gt;
&lt;br /&gt;
[[#200-350 YW: The Golden Age of Wesnoth|The Golden Age of Wesnoth]]&lt;br /&gt;
&lt;br /&gt;
[[#350-417 YW: The First Dark Age of Wesnoth|The First Dark Age of Wesnoth]]&lt;br /&gt;
&lt;br /&gt;
[[#417-530 YW: The Turmoil of Asheviere|The Turmoil of Asheviere]]&lt;br /&gt;
&lt;br /&gt;
[[#530-630 YW: The Age of Fear|The Age of Fear]]&lt;br /&gt;
&lt;br /&gt;
[[#628-673 YW: The Silver Age of Wesnoth|The Silver Age of Wesnoth]]&lt;br /&gt;
&lt;br /&gt;
[[#761-816 YW: The Legacy of Black-Eye Karun|The Legacy of Black-Eye Karun]]&lt;br /&gt;
&lt;br /&gt;
[[#After the Fall|After the Fall]]&lt;br /&gt;
&lt;br /&gt;
== Prehistory - 20 YW: The Founding of Wesnoth ==&lt;br /&gt;
During the age of the Founding of Wesnoth, there were two important geographic locations, these being the Green Isle and the Great Continent. Haldric is the main historical figure at this time. This age ends with the founding of Wesnoth as a country in the Great Continent, and with Orcs attacking both elves and men from the sea.&lt;br /&gt;
&lt;br /&gt;
=== Prehistory ===&lt;br /&gt;
* Elves and Dwarves inhabit the Great Continent.&lt;br /&gt;
* Humans inhabit the distant West.&lt;br /&gt;
* Haldric's people colonise the [http://wiki.wesnoth.org/Geography_of_Wesnoth#The_Green_Isle Green Isle] from a continent further to the west.&lt;br /&gt;
&lt;br /&gt;
=== 200 BW ===&lt;br /&gt;
* The Lich-Lords arrive on the Green Isle after losing a war in the distant West.&lt;br /&gt;
* After a long war Haldric's people come to dominate the Green Isle.&lt;br /&gt;
* The 'Wesfolk' and their Lich-Lords are pushed onto marginal lands.&lt;br /&gt;
&lt;br /&gt;
=== 12 BW ===&lt;br /&gt;
* The Crown Prince of Southbay discovers the Great Continent.&lt;br /&gt;
&lt;br /&gt;
=== 11-7 BW ===&lt;br /&gt;
* The Crown Prince makes several voyages between the Green Isle and the Great Continent.&lt;br /&gt;
&lt;br /&gt;
=== 6 BW ===&lt;br /&gt;
* Following these voyages to the Great Continent, the elder Crown Prince falls ill and dies.&lt;br /&gt;
* His younger brother is implicated in a plot to kill him.&lt;br /&gt;
* As a distraction the younger Prince starts a war with the Wesfolk and their Lich-Lords.&lt;br /&gt;
* The Lich-Lords sense they will be destroyed and open gates to the homeland of the Orcs in the West.&lt;br /&gt;
&lt;br /&gt;
=== 5-2 BW ===&lt;br /&gt;
* The Green Isle is overrun with Orcs.&lt;br /&gt;
* The Wesfolk desert their Lich-Lords as they fear becoming prey for the Orcs.&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Prince_HaldricPrince  Haldric] leads the evacuation of the survivors to the Great Continent. [http://wiki.wesnoth.org/Mainline_Campaigns#The_Rise_of_Wesnoth '''The Rise of Wesnoth'''] begins.&lt;br /&gt;
&lt;br /&gt;
=== 1 BW ===&lt;br /&gt;
* Human settlers, led by Prince Haldric, arrive at the western coast of the Great Continent (the landfall occurs in the future Bay of Pearls) in large numbers.&lt;br /&gt;
* Humans arrive in the middle of a simmering dispute between the Elves and Dwarves.&lt;br /&gt;
* The Elves and Dwarves are distrustful of humans, and there is a small skirmish.&lt;br /&gt;
* Messengers from Wesmere Forest come and ask Haldric to come before the Ka'lian.&lt;br /&gt;
* Prince Haldric asks the Four Elvish Lords ([http://wiki.wesnoth.org/CharactersStorys#Lady_Dionli Dionli], [http://wiki.wesnoth.org/CharactersStorys#Lord_Logalmier Logalmier], Aryad, and El'Isomithir) for help and land.&lt;br /&gt;
* They set before him four quests to prove his worth, which he completes.&lt;br /&gt;
&lt;br /&gt;
=== 1 YW ===&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Prince_Haldric Haldric] is granted the plains north and south of the Great River.&lt;br /&gt;
* Haldric agrees to a Pact of Mutual Defence with the Elves, but the Ka'lian decides it will betray him and allow humans and orcs to exhaust each other in war if the opportunity presents. Haldric, learning of this, considers the Pact a dead letter.&lt;br /&gt;
* The Ruby of Fire is temporarily hidden, and the [http://wiki.wesnoth.org/CharactersStorys#Lich-Lord_Jevyan lich-lord Jevyan] is deceived into believing it is held by the Elves. &lt;br /&gt;
* Haldric founds the country of [http://wiki.wesnoth.org/Geography_of_Wesnoth#Wesnoth Wesnoth] in the central plain south of the great River.&lt;br /&gt;
* Reign of Haldric I (formerly prince Haldric) begins.  [http://wiki.wesnoth.org/Geography_of_Wesnoth#Wesnoth '''The Rise of Wesnoth'''] ends.&lt;br /&gt;
&lt;br /&gt;
=== 2 YW ===&lt;br /&gt;
* Orcs, following the ships fleeing from the Green Isle, begin to arrive on the Great Continent.&lt;br /&gt;
* These Orcs are defeated by Haldric's forces.&lt;br /&gt;
* Some of the Orcish survivors flee back to the Green Isle, others move to attack the Elves.&lt;br /&gt;
* King Haldric helps the Elves fight the surviving Orcs.&lt;br /&gt;
&lt;br /&gt;
=== 8 YW ===&lt;br /&gt;
* A second wave of Orcs arrive from the Green Isle; these Orcs begin claiming large portions of the northern Great Continent for themselves.&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Erlornas Erlornas] of Wesmere is involved in the first direct elvish clash with orcs ([http://wiki.wesnoth.org/Mainline_Campaigns#An_Orcish_Incursion '''An Orcish Incursion'''] takes place in 8-9YW).&lt;br /&gt;
* Haldric I publicly repudiates the Pact he spoke with the Elves, refusing to give aid.&lt;br /&gt;
&lt;br /&gt;
=== 9-11 YW ===&lt;br /&gt;
* Many Elves are killed in battle by the Orcs.&lt;br /&gt;
* Elvish emissaries are turned away from Wesnoth.&lt;br /&gt;
&lt;br /&gt;
=== 12 YW ===&lt;br /&gt;
* Orcs fail to take the Wesmere Forest and instead march down the coast, devastating human settlements there.&lt;br /&gt;
* Elves refuse to aid the Humans in confronting the Orcs.&lt;br /&gt;
* Human refugees from the coastal settlements relocate in what will become known as the Great Central Plain.  Dan'Tonk, which will become Wesnoth's largest city, is founded.&lt;br /&gt;
&lt;br /&gt;
=== 20 YW ===&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Prince_Haldric Haldric I] dies.&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Haldric_II Haldric II] ascends to the throne.&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Kalenz_2 Kalenz] and [http://wiki.wesnoth.org/CharactersStorys#Landar Landar] escape an orcish invasion of their home in Lintanir Forest. [http://wiki.wesnoth.org/Mainline_Campaigns#Legend_of_Wesmere '''The Legend of Wesmere'''] begins.&lt;br /&gt;
* Humans and elves decisively defeat the orcs at Tath, thus halting the orcish advance.&lt;br /&gt;
* A new treaty between humans and elves is signed and King Haldric II allows emissaries of the Elves to return to Wesnoth.&lt;br /&gt;
* Elves inform [http://wiki.wesnoth.org/CharactersStorys#Haldric_II Haldric II] of the danger posed by the unshielded Ruby of Fire.&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Kalenz_2 Kalenz] and [http://wiki.wesnoth.org/CharactersStorys#Landar Landar], later to become successive High Lords of the Elves, are able to sneak into an orcish camp by stealth and assassinate the Great Chief Brurbar. A long orcish civil war for succession follows. The orcs are unable to undertake action against any other race during this period and Wesnoth enjoys a long period during which it can expand with little opposition.&lt;br /&gt;
&lt;br /&gt;
== 20-130 YW: The Taming of the Wild ==&lt;br /&gt;
This era is that in which the kingdom of [http://wiki.wesnoth.org/Geography_of_Wesnoth#Wesnoth Wesnoth] expanded and defined its borders, and settled the area which it had claimed for its own. The Taming of the Wild refers to the settling of the unsettled lands, as well as to the colonization of the Northlands. The end of this era is marked by friction between the city-state of [http://wiki.wesnoth.org/Geography_of_Wesnoth#Elensefar Elensefar] and the country of Wesnoth, which will continue for the next several hundred years.&lt;br /&gt;
&lt;br /&gt;
=== 21 YW ===&lt;br /&gt;
* Founding of the Great Academy on Alduin.&lt;br /&gt;
&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Kalenz Kalenz] is relieved of command by the Ka'lian.  He retires to Lintanir Forest with [http://wiki.wesnoth.org/CharactersStorys#Cleodil Cleodil].  A faction of xenophobic elves begins to gather around [http://wiki.wesnoth.org/CharactersStorys#Landar Landar].&lt;br /&gt;
&lt;br /&gt;
=== 25-40 YW ===&lt;br /&gt;
* In 25 YW [http://wiki.wesnoth.org/CharactersStorys#Haldric_II Haldric II] sends an expedition to retrieve the Ruby of Fire from its place of concealment.&lt;br /&gt;
* Haldric II commissions a Dwarven tribe to build the Scepter of Fire with the Ruby of Fire as its centerpiece; Elves associated with [http://wiki.wesnoth.org/CharactersStorys#Landar Landar's] faction attack during the transfer. [http://wiki.wesnoth.org/Mainline_Campaigns#Sceptre_of_Fire '''Scepter of Fire'''] begins.&lt;br /&gt;
* Action of '''The Scepter of Fire''' takes place.  Haldric II is informed that the Scepter was both completed and lost in the year 40.  It will not be recovered for nearly 500 years.&lt;br /&gt;
* With the death of [http://wiki.wesnoth.org/CharactersStorys#Thursagan Thursagan], the Runemaster, all runemasters are killed and runesmithing is lost for several centuries.&lt;br /&gt;
&lt;br /&gt;
=== 26-50 YW ===&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Landar Landar] declares himself High Lord of the Elves, leading to civil war.&lt;br /&gt;
&lt;br /&gt;
=== 51 YW ===&lt;br /&gt;
* Wesnothian New Writing (the script later called &amp;quot;steel-hand&amp;quot;, to distinguish it from the more complex &amp;quot;brush-hand&amp;quot; cursive brought from the [http://wiki.wesnoth.org/Geography_of_Wesnoth#The_Green_Isle Green Isle]) is promulgated by royal decree.  From this date all royal documents and public inscriptions are in New Writing. It spreads rapidly via the mercantile class. The older brush-hand writing continues to be used for magical purposes, scholarship, and in certain elevated literary forms.&lt;br /&gt;
&lt;br /&gt;
=== 50-93 YW ===&lt;br /&gt;
* Elvish civil war (and [http://wiki.wesnoth.org/Mainline_Campaigns#Legend_of_Wesmere '''The Legend of Wesmere''']) ends.  [http://wiki.wesnoth.org/CharactersStorys#Kalenz_2 Kalenz] declared High Lord, begins reorganizing and militarizing Elvish society to fight the orcs.  In late 93 YW he cedes control to a reconstituted Ka'lian and retires again to the Forest of Lintanir.&lt;br /&gt;
&lt;br /&gt;
=== 121 YW ===&lt;br /&gt;
* Orcish civil war sputters to a halt. Raids on elves and humans resume.  Period of uncontested human expansion ends, but the [http://wiki.wesnoth.org/Geography_of_Wesnoth#Wesnoth Wesnothian] Army is more than equal to any of its opponents in battle.&lt;br /&gt;
&lt;br /&gt;
=== 122 YW ===&lt;br /&gt;
* City of [http://wiki.wesnoth.org/Geography_of_Wesnoth#Elensefar Elensefar] is sacked by orcs.&lt;br /&gt;
* Meneldur, a sailor of Elensefar, sets out on a quest to regain the city. UMC '''Saving Elensefar''' begins.&lt;br /&gt;
&lt;br /&gt;
=== 123 YW ===&lt;br /&gt;
* Elensefar is retaken by Meneldur along with Undead from the Green Isle.&lt;br /&gt;
* Elensefar becomes an independent city-state for the first time. UMC '''Saving Elensefar''' ends.&lt;br /&gt;
&lt;br /&gt;
=== 161-164 YW ===&lt;br /&gt;
* The newly crowned king sought to make safe once and for all the wildlands that separated the human cities surrounding Weldyn and the coastal regions of Elensefar.&lt;br /&gt;
* The grand army of Wesnoth, personally led by the High Council of Archmagi, destroyed all enemies residing within Wesnoth.&lt;br /&gt;
* The city-state of Elensefar is formally united to the kingdom. Settlements from it spread north of the river into the new frontier province of Annuvin, carefully avoiding the margins of Wesmere Forest.&lt;br /&gt;
&lt;br /&gt;
=== 164-176 YW ===&lt;br /&gt;
* During this twelve year span, the western fortress of Halstead was erected in the very heart of the western wilderlands.&lt;br /&gt;
&lt;br /&gt;
=== 199 YW ===&lt;br /&gt;
* Emboldened by the far-reaching arm of Halstead's protection, settlement in the west explodes&lt;br /&gt;
* The settlements of Aldril and Carcyn grow to become major cities, the first as an important port due to its position on the Bay of Pearls, and the second as a stop on the road to Elensefar and military outpost along the Great River&lt;br /&gt;
* Settlers from Carcyn cross the Great River to establish the first settlements north of it and east of Wesmere.&lt;br /&gt;
&lt;br /&gt;
== 200-350 YW: The Golden Age of Wesnoth ==&lt;br /&gt;
The Golden Age of Wesnoth was the time of the great kings, and of peace and prosperity within the kingdom. The Orcs had suffered a grave defeat at the hands of Wesnoth and Elensefar seventy-five years earlier, so they did not pose much of a threat, and whenever they did attack they were quickly defeated. This allowed the army to lessen in size, and the kings of this age to undertake the great public works they are renowned for. The era ends when the king of Wesnoth dies without an heir, and a new dynasty begins.&lt;br /&gt;
&lt;br /&gt;
=== 251 YW ===&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Cleodil Cleodil], wife of [http://wiki.wesnoth.org/CharactersStorys#Kalenz_2 Kalenz], dies.&lt;br /&gt;
&lt;br /&gt;
=== 350 YW ===&lt;br /&gt;
* Disintegration of the Kingdom follows the death of Haldric IV.&lt;br /&gt;
* [http://wiki.wesnoth.org/Geography_of_Wesnoth#Elensefar Elensefar] remains a province of Wesnoth but exerts increasing independence due to isolation.&lt;br /&gt;
* Treaty between lord of Elensefar and king of Wesnoth signed.&lt;br /&gt;
&lt;br /&gt;
== 350-417 YW: The First Dark Age of Wesnoth ==&lt;br /&gt;
The first Dark Age was a time of strife and invasion. When Haldric IV died, he left Wesnoth without a king, and the next 70 years were marked by short-lived dynasties, attacks by ever more aggressive orcs, and the further separation of Wesnoth and Elensefar. The Dark Age ended when Garard I took the throne, and began a new dynasty that would last for several hundred years.&lt;br /&gt;
&lt;br /&gt;
=== 360 YW ===&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Malin_Keshar Malin Keshar] born in Parthyn.&lt;br /&gt;
&lt;br /&gt;
=== 363 YW ===&lt;br /&gt;
* Last of [http://wiki.wesnoth.org/CharactersStorys#Kalenz Kalenz's] children dies.  Kalenz, condemned to outlive his offspring by the potion of Crelanu, leaves the Forest of Lintanir and begins wandering the Great Continent.&lt;br /&gt;
&lt;br /&gt;
* Village of Maghre terrorized by a minor necromancer. Action of [http://wiki.wesnoth.org/Mainline_Campaigns#A_Tale_Of_Two_Brothers '''A Tale of Two Brothers'''] takes place.&lt;br /&gt;
&lt;br /&gt;
=== 389 YW ===&lt;br /&gt;
* Garard, a future king of Wesnoth, is born.&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Malin_Keshar Malin Keshar] returns to Parthyn from the Academy at Alduin. [http://wiki.wesnoth.org/Mainline_Campaigns#Descent_into_Darkness '''Descent Into Darkness'''] begins.&lt;br /&gt;
&lt;br /&gt;
== 417-530 YW: The Turmoil of Asheviere ==&lt;br /&gt;
King Garard's dynasty was long-lived and productive, but it was also punctuated by significant turmoil: the end of the first king's reign was marred by orcish and undead raids, and the second was murdered by his own wife and son. It was not until 517 YW that the usurpation of the throne by Queen Mother Asheviere was ended.&lt;br /&gt;
&lt;br /&gt;
=== 417 YW ===&lt;br /&gt;
* Ending years of strife and division, Garard I seizes the throne and becomes king of Wesnoth, beginning the [[Garardine Dynasty]].&lt;br /&gt;
&lt;br /&gt;
=== 440 YW ===&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Garard_II Crown Prince Garard II] is born.&lt;br /&gt;
&lt;br /&gt;
=== 442 YW ===&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Delfador Delfador], later called &amp;quot;the Great&amp;quot;, is born.&lt;br /&gt;
&lt;br /&gt;
=== 450 YW ===&lt;br /&gt;
* Prince Arand is born.&lt;br /&gt;
&lt;br /&gt;
=== 468 YW ===&lt;br /&gt;
* Zorlan becomes Great Chief of the northern orcs&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Delfador Delfador] graduates from the Great Academy. [http://wiki.wesnoth.org/Mainline_Campaigns#Delfador.27s_Memoirs '''Delfador's Memoirs'''] begins.&lt;br /&gt;
&lt;br /&gt;
=== 470 YW ===&lt;br /&gt;
* Garard I dies; [http://wiki.wesnoth.org/CharactersStorys#Garard_II Garard II] ascends to the throne of Wesnoth&lt;br /&gt;
* Orcs under Great Chief Zorlan and undead raised by the necromancer [http://wiki.wesnoth.org/CharactersStorys#Iliah-Malal Iliah-Malal] raid Wesnoth's borders. All but the first and the last three scenarios of [http://wiki.wesnoth.org/Mainline_Campaigns#Delfador.27s_Memoirs'''Delfador's Memoirs''' ] take place in this year.&lt;br /&gt;
* Control of the Estmarks is effectively lost during this war, not to be regained for decades.  Outposts are built on the near side of the Weldyn to repel orc raids.  The long watch of the River Guard begins.&lt;br /&gt;
&lt;br /&gt;
=== 478 YW ===&lt;br /&gt;
* Garard II marries Asheviere.&lt;br /&gt;
* Garard issues the Edict of the Scepter, providing that the crown shall settle after his death on whichever member of the royal family successfully retrieves it from the Caverns of Flame.&lt;br /&gt;
&lt;br /&gt;
=== 480 YW ===&lt;br /&gt;
* Crown Prince Eldred is born.&lt;br /&gt;
&lt;br /&gt;
=== 483 YW ===&lt;br /&gt;
* Erain and Ethyn, identical twins and brothers of Eldred, are born.&lt;br /&gt;
&lt;br /&gt;
=== 498 YW ===&lt;br /&gt;
* Princess Li'sar is born.&lt;br /&gt;
&lt;br /&gt;
=== 500 YW ===&lt;br /&gt;
* Prince Konrad is born, the youngest of several sons of Prince Arand.&lt;br /&gt;
* Wesnoth and the orcs of the north go to war.&lt;br /&gt;
&lt;br /&gt;
=== 501 YW ===&lt;br /&gt;
&lt;br /&gt;
===== Betrayal on the battlefield =====&lt;br /&gt;
* Garard leads his army to orc encampment at Galcadar by the Ford of Abez.&lt;br /&gt;
* Garard's forces split into two groups, one led by himself and the other by his son Eldred.&lt;br /&gt;
* Eldred betrays his father and attacks him with the troops under his control.&lt;br /&gt;
* Eldred slays King Garard and his uncle Prince Arand on the battlefield of Abez.&lt;br /&gt;
&lt;br /&gt;
===== Reprisal =====&lt;br /&gt;
* Delfador escapes the battle and heads to Weldyn.&lt;br /&gt;
* Eldred gives tribute to the Orcish king, who stops his attacks.&lt;br /&gt;
* Delfador gathers a force of Loyalists to avenge Garard's Death.&lt;br /&gt;
* Eldred's forces confront Delfador's Loyalists at Weldyn.&lt;br /&gt;
* The Loyalists are defeated, but Eldred is slain by Delfador in the fight.&lt;br /&gt;
&lt;br /&gt;
===== Asheviere seizes power =====&lt;br /&gt;
* Asheviere orders the slaughter of Garard's nephews and declares herself Queen of Wesnoth.&lt;br /&gt;
* Hearing of the news Delfador infiltrates the palace.&lt;br /&gt;
* Delfador finds the youngest prince Konrad as he is slain.&lt;br /&gt;
* Delfador flees, taking Konrad's body for burial to the land of the Elves.&lt;br /&gt;
* While traveling through Wesnoth, Elf Lady Parandra finds an orphaned human child.&lt;br /&gt;
* Parandra and Delfador agree to give the orphan the identity of Prince Konrad.&lt;br /&gt;
* Delfador and Konrad flee to live in refuge with the Wood Elves of the great southwestern forest.&lt;br /&gt;
&lt;br /&gt;
===== The country resists Asheviere =====&lt;br /&gt;
* Elensefar refuses to submit to Asheviere and declares itself an independent city-state.&lt;br /&gt;
* After several defeats, Wesnoth's army retreats from the remote areas of the kingdom.  The western Wesnothian border recedes, is fixed, and remains heavily defended.&lt;br /&gt;
* As a result of the loyalist withdrawal, several small human communities on the west coast of the Great Continent live in relative independence while elves flourish in the great forest to the southwest of Wesnoth.&lt;br /&gt;
* A band of Wesnoth citizens organizes resistance to Asheviere's siezure of power.  They are eventually forced to abandon their home and settle in the Three Sisters ('''Liberty''').&lt;br /&gt;
&lt;br /&gt;
=== 502-517 YW ===&lt;br /&gt;
* Delfador raises Konrad under the protection of the Elves.&lt;br /&gt;
&lt;br /&gt;
=== 517 YW ===&lt;br /&gt;
* Asheviere hires Orcish forces to hunt down her nephew-in-law Konrad.&lt;br /&gt;
* Orcish forces converge on Delfador's refuge.&lt;br /&gt;
* Konrad flees his home with the elves and embark upon a quest to regain the throne of Wesnoth.  '''Heir To The Throne''' begins.&lt;br /&gt;
&lt;br /&gt;
=== 518 YW ===&lt;br /&gt;
* Konrad crosses the Great River into the Northlands on a search for the Sceptre of Fire.&lt;br /&gt;
* They enter the Caves of Knalga, allied with Princess Li'sar, and find it.&lt;br /&gt;
* They return to Wesnoth and claim the throne.  '''Heir to the Throne''' ends.&lt;br /&gt;
&lt;br /&gt;
=== 522 YW ===&lt;br /&gt;
* Birth of Princess Ana'sar.&lt;br /&gt;
&lt;br /&gt;
=== 530 YW ===&lt;br /&gt;
* Wesnothian colonists begin reclaiming the Estmarks.&lt;br /&gt;
&lt;br /&gt;
=== 544 YW ===&lt;br /&gt;
* With both sides of the lower Weldyn River again civilized territory, the River Guard posts south of Soradoc are abandoned.  Wesnothian military activity shifts eastward into the Estmarks.&lt;br /&gt;
&lt;br /&gt;
== 530-630 YW: The Age of Fear ==&lt;br /&gt;
The Age of Fear takes its names from the events of the end of the era. On the surface, the first 90 years were very uneventful. However, during this time unexplainable magical events took place, especially in the eastern lands. Previously tamed lands were slowly claimed by wilderness as fear and paranoia gradually overshadowed the spirit of pioneering and adventure displayed earlier in Wesnoth's history. In the last 10 years of the age, Wesnoth bore the brunt of the most powerful Undead attack ever and was nearly destroyed. By the end of the era, most of Wesnoth had been made barren, most of the great buildings inside and outside of Weldyn were razed, and the population of Wesnoth was half of what it had been.&lt;br /&gt;
&lt;br /&gt;
It was in this era that certain areas of the chaotic Northlands were for the first time put into any kind of law and order. A small group of humans and dwarves, accepting anyone of any race who wished to join, formed themselves into the &amp;quot;Northern Alliance”, with the vision of making the Northlands safe to live in. Over time, this alliance grew slowly but steadily in power. By the end of the era, the alliance had succeeded in making a few small areas, including Knalga and the surrounding regions, stable and prosperous. Consequently, many people evacuated from the wasteland that most of Wesnoth had become and moved north - depleting the population of Wesnoth still further.&lt;br /&gt;
&lt;br /&gt;
=== 533 YW ===&lt;br /&gt;
* Delfador succumbs to old age and dies, his body is entombed alongside his staff in Eregonor.&lt;br /&gt;
* The next great sage of Wesnoth, [http://wiki.wesnoth.org/CharactersStorys#Dacyn Dacyn], is born.&lt;br /&gt;
&lt;br /&gt;
=== 534 YW ===&lt;br /&gt;
&lt;br /&gt;
* The small community of Dwarven Doors, in the Northlands just outside Knalga, rebels against the Orcish overlords.  '''Northern Rebirth''' begins.&lt;br /&gt;
* The residents, led by Tallin, head underground and find dwarves, whom they ally with.&lt;br /&gt;
* Their combined forces destroy a lich who is attempting to claim Knalga as his own.&lt;br /&gt;
* Abhai finds the [http://wiki.wesnoth.org/CampaignDialogue:NR#Abhai_Finds_Rod_of_Justice Rod of Justice]&lt;br /&gt;
&lt;br /&gt;
=== 535 YW ===&lt;br /&gt;
&lt;br /&gt;
* The warlord-aspirant Rakshas attacks Tallin and his forces, but does not penetrate the dwarves' defences.&lt;br /&gt;
* To help defeat the orcs, Tallin secures the help of two Liches, and rescues an elvish princess to secure the help of the elves.&lt;br /&gt;
* Assisted by his new allies, Tallin smashes the forces of Rakshas.&lt;br /&gt;
* According to some historians, Tallin and the elvish princess are married; others say they parted in bad blood.&lt;br /&gt;
* To preserve the new-found peace in the Northlands, Tallin and his allies form the Northern Alliance.  '''Northern Rebirth''' ends.&lt;br /&gt;
&lt;br /&gt;
=== 550 YW ===&lt;br /&gt;
&lt;br /&gt;
* Lord Hamel of Knalga sends an expedition to Kal Kartha to determine the fate of the Hammer of Thursagan ('''The Hammer of Thursagan''' takes place in late 550 YW to early 551 YW.).&lt;br /&gt;
* Dwarves at Knalga and elsewhere  begin to reclaim the lost art of runesmithing.&lt;br /&gt;
* Wesnothian colonization expands southward past Fort Tahn.&lt;br /&gt;
&lt;br /&gt;
=== 563 YW ===&lt;br /&gt;
* Konrad and Li'sar die after an extraordinarily long reign.&lt;br /&gt;
* Princess Ana'sar becomes queen.&lt;br /&gt;
* The seer Galdren becomes prominent at the court of Weldyn.&lt;br /&gt;
&lt;br /&gt;
=== 585 YW ===&lt;br /&gt;
* Queen Ana'sar retires.&lt;br /&gt;
* Haldric VII becomes king of Wesnoth.&lt;br /&gt;
&lt;br /&gt;
=== 589 YW ===&lt;br /&gt;
* Dacyn the White Mage and Ravanal, an eastern wizard, compete to be the king's advisor.&lt;br /&gt;
* The seer Galdren dies after advising Haldric VII to choose Dacyn.&lt;br /&gt;
* The king does as Galdren advises.&lt;br /&gt;
&lt;br /&gt;
=== 593 YW ===&lt;br /&gt;
* Ravanal reveals that he has turned to evil, and flees from Weldyn.&lt;br /&gt;
* Konrad II is born.&lt;br /&gt;
* Certain southern frontier regions are formally annexed to the Kingdom of Wesnoth as the Province of Kerlath.&lt;br /&gt;
&lt;br /&gt;
=== 598 YW ===&lt;br /&gt;
* South Guard organized as  a semi-detached formation of the Royal Army, to protect the inhabitants of the frontier province of Kerlath.&lt;br /&gt;
&lt;br /&gt;
=== 605 YW ===&lt;br /&gt;
Gweddry born ???&lt;br /&gt;
&lt;br /&gt;
=== 607 YW ===&lt;br /&gt;
* South Guard ceases reporting.  Haldric VII sends Deoran, son of Haldiel, to investigate.  '''The South Guard''' takes place in 607-608 YW.  &lt;br /&gt;
&lt;br /&gt;
=== 612 YW ===&lt;br /&gt;
* Haldric VII dies. Konrad II is crowned King of Wesnoth.&lt;br /&gt;
* Dacyn continues his duties as advisor with Konrad II.&lt;br /&gt;
&lt;br /&gt;
=== 625 YW ===&lt;br /&gt;
* Mysterious disappearances of livestock and peasants cause partial evacuation of the the '''Estmark Hills'''.  Lords of the Horse Plains report increased banditry from there.&lt;br /&gt;
* Konrad II sends [http://wiki.wesnoth.org/CharactersStorys#Dacyn Dacyn] with [http://wiki.wesnoth.org/CharactersStorys#Owaec Owaec] and [http://wiki.wesnoth.org/CharactersStorys#Gweddry Gweddry] to man the old River Guard strongpoints. [http://wiki.wesnoth.org/Mainline_Campaigns#The_Eastern_Invasion '''Eastern Invasion'''] begins.&lt;br /&gt;
&lt;br /&gt;
=== 626 YW ===&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Mal-Ravanal Mal-Ravanal] attacks the middle outpost where [http://wiki.wesnoth.org/CharactersStorys#Gweddry Gweddry] and [http://wiki.wesnoth.org/CharactersStorys#Dacyn Dacyn] are stationed.&lt;br /&gt;
* Dacyn and Gweddry travel to the northern outpost, and, with [http://wiki.wesnoth.org/CharactersStorys#Owaec Owaec], retreat into the northlands.&lt;br /&gt;
* In the Far North, the wife of Kai Laudiss slain in a large raid by the orcs of Tirigaz on Jotha&lt;br /&gt;
* Kai Laudiss slain by poisoned orcish dart during failed attack on the Port of Tirigaz orcs. His son, [http://wiki.wesnoth.org/CharactersStorys#Kai_Krellis Krellis] suceeds him as Kai and relies on the wisdom of [http://wiki.wesnoth.org/CharactersStorys#Cylanna Cylanna], a priestess.&lt;br /&gt;
* The merfolk city of Jotha is overrun by undead (Mal Kevek and others).  The action of [http://wiki.wesnoth.org/Mainline_Campaigns#Dead_Water '''Dead Water'''] takes place.&lt;br /&gt;
&lt;br /&gt;
=== 627 YW ===&lt;br /&gt;
* Wesnoth's last defences are broken and the undead march on Wesnoth&lt;br /&gt;
* In the northlands, the orcs drive [http://wiki.wesnoth.org/CharactersStorys#Gweddry Gweddry's] army back across the river.&lt;br /&gt;
* Weldyn is besieged.&lt;br /&gt;
* Gweddry breaks through undead lines to reach Weldyn and a council is held.&lt;br /&gt;
* Gweddry's army is fortunate and kills [http://wiki.wesnoth.org/CharactersStorys#Mal-Ravanal Mal-Ravanal].  [http://wiki.wesnoth.org/Mainline_Campaigns#The_Eastern_Invasion '''Eastern Invasion''' ] ends. [http://wiki.wesnoth.org/Mainline_Campaigns#Dead_water '''Dead Water'''] ends (about this time).&lt;br /&gt;
* Wesnoth is saved, but large portions have been laid waste by the undead.&lt;br /&gt;
* After destroying [http://wiki.wesnoth.org/CharactersStorys#Mal-Ravanal Mal-Ravanal's] henchmen the mermen relaxed and began rebuilding in earnest, and soon Jotha was restored.&lt;br /&gt;
&lt;br /&gt;
== 628-673 YW: The Silver Age of Wesnoth ==&lt;br /&gt;
&lt;br /&gt;
The Silver Age, or restoration of the Wesnothian kingdom, essentially coincides with the rest of the long and successful reign of [http://wiki.wesnoth.org/CharactersStorys#Konrad_II Konrad II].  During this period Wesnoth largely recovered from the damage that Mal-Ravanal's undead attack had done. It would, however, never quite regain the majesty it had at the height of its power.&lt;br /&gt;
&lt;br /&gt;
The Northlands, aided by a second wave of colonization north from Wesnoth, become more civilised and stable. Although nowhere near as prosperous as Wesnoth was during its Golden Age, the Northlands developed towns of significant size and a thriving - if somewhat dangerous - trade network. &lt;br /&gt;
&lt;br /&gt;
Four major powers soon came to dominate much of the Northlands. First there were the dwarves, who controlled most of the mountains and a vast array of underground tunnels and caverns. To the east, shrouded in mystery, lay the Elvish forests which continued to be inaccessible to anyone not of elvish blood. The remaining landscape was dominated either by orcish tribes, or independent human earldoms. As competition for the land grew fierce, wars smoldered between human and orcish forces. &lt;br /&gt;
&lt;br /&gt;
=== 628-635 YW ===&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Konrad_II Konrad II] begins his attempt to rebuild Wesnoth.&lt;br /&gt;
&lt;br /&gt;
=== 673 YW ===&lt;br /&gt;
* [http://wiki.wesnoth.org/CharactersStorys#Konrad_II Konrad II] dies, bringing the [[Garardine Dynasty]] to an end.  Second Wesnothian civil war begins.&lt;br /&gt;
&lt;br /&gt;
== 761-816 YW: The Legacy of Black-Eye Karun ==&lt;br /&gt;
&lt;br /&gt;
After decades of struggle, Black-Eye Karun becomes the first warlord since the assassination of Great Chief Brurbar in 20 YW to unite all the different squabbling orcish tribes under his banner. Among his many accomplishments as a Sovereign, his most famous is the creation of the Great Council. &lt;br /&gt;
&lt;br /&gt;
Karun was a far-sighted individual and he knew that after his death the orcish tribes would once again turn to fighting among themselves, with little he could do to prevent that and consequent peril from the Wesnothians and elves.&lt;br /&gt;
&lt;br /&gt;
Consequently, Karun selected from among all the different tribes six of the most sober and wisest orcs and thus created the Great Council. It was the Great Council's job to stay aloof from any tribal or territorial squabbling amongst the orcs, but yet always remain there to give advice to whomever came to seek it. In order to preserve the orcish race in the event of an emergency, he invested in them the power to call up The Great Horde. It was established that every orc, no matter what tribe he came from, must obey the summons of The Great Horde and follow wholeheartedly the leader that the Great Council put at the head of The Great Horde.&lt;br /&gt;
&lt;br /&gt;
===812 YW===&lt;br /&gt;
Rahul I becomes Lord Protector of the Northern Alliance&lt;br /&gt;
&lt;br /&gt;
===816 YW===&lt;br /&gt;
* Rahul I (Lord Protector of the Northern Alliance) and Black Eye Karun sign a peace treaty ending a 15 year war between the humans and the orcs. Soon after this Karun, is ambushed and killed in mysterious circumstances.&lt;br /&gt;
&lt;br /&gt;
===829===&lt;br /&gt;
Howgarth III succeeds Rahul I as Lord Protector of the Northern Alliance&lt;br /&gt;
&lt;br /&gt;
===842 YW===&lt;br /&gt;
* Famine in the Northlands. Famine led humans to colonize some orcish lands and push orcs into desolated hill country. The few orcish tribes who had remained part of the Alliance, feeling the pressure, either left Alliance territory or revolted and were destroyed.&lt;br /&gt;
* Retaliating, the orcs systematically slaughtered human colonies and villages on their lands. Then, Earl Lanbec'h — the most powerful human warlord of the North — determined to abolish the orcish menace raised an army and conferred leadership of it to his son-in-law Baron Alber.&lt;br /&gt;
* In response, the Great Council set up by the Black Eye Karun calls upon The Great Horde and bestows leadership of it upon [http://wiki.wesnoth.org/CharactersStorys#Kapou.27e Kapou’e]; [http://wiki.wesnoth.org/Mainline_Campaigns#Son_of_the_Black_Eye '''Son of the Black Eye'''] begins.&lt;br /&gt;
&lt;br /&gt;
===843 YW===&lt;br /&gt;
* Half of the Great Council is treacherously slain by the allied human forces and orcish unity disintegrates. Faced with the extermination of all the orcs on the Great Continent, [http://wiki.wesnoth.org/CharactersStorys#Kapou.27e Kapou’e] forcibly asserts his control over the orcish territories and defeats the enemy forces. The Northern Alliance arrives on the scene in time for the final battle and helps Kapou’e defeat the forces of the northern earldoms, who had broken the treaty. Kapou’e then assumes the position of Sovereign over the northern tribes, and his rule ushers in an unprecedented era of unity and prosperity for the orcs.&lt;br /&gt;
* After 843: Portions of Kapou'e's army act as mercenaries in foreign struggles with other races which keeps them from attacking their nearest neighbors.&lt;br /&gt;
&lt;br /&gt;
===852 YW===&lt;br /&gt;
*[http://wiki.wesnoth.org/CharactersStorys#Kapou.27e Kapou’e] repels a large elvish invasion.&lt;br /&gt;
&lt;br /&gt;
===858 YW===&lt;br /&gt;
&lt;br /&gt;
*The humans once again stage an invasion but prove to be no match for the united orcish forces under the leadership of [http://wiki.wesnoth.org/CharactersStorys#Kapou.27e Kapou’e].  [http://wiki.wesnoth.org/Mainline_Campaigns#Son_of_the_Black_Eye '''Son of the Black Eye'''] ends.&lt;br /&gt;
&lt;br /&gt;
==After the Fall==&lt;br /&gt;
At some unknown point in the future, an unspeakable cataclysm scorched the surface of the lands. The Wesnoth magicians try to raise up a 3rd sun in the sky, but they fail and the 'sun' falls down over Weldyn. The capital is no more. The King and his family are dead and there is no heir. The local leaders tear apart Wesnoth. The nights become longer, days hotter. Evil creatures show up.  Forests die, hills turn into rocky wastelands and fields become barren deserts. In the apocalypse allies turn against each other and friends fight over what few resources remain. The great nations were destroyed, and huge numbers of people died. Still amidst the chaos somehow small groups of people survived, sheltered in hidden places. In this post-apocalyptic world survival is a daily struggle as a few remaining tribes eke out an existence among the ruins of fallen empires. Heroic bands of elves, nomadic refugee humans, savage hordes of orcs and dark necromancers all forge new lives under the merciless dual suns, Sela and Naia, of this new Wesnoth.&lt;br /&gt;
&lt;br /&gt;
===??? Post-Wesnoth===&lt;br /&gt;
&lt;br /&gt;
* The Quenoth elves adapt to life in barren world of the Great Southern Desert. Over time they lost their affinity for the woodlands of their ancestry and embrace life in the sandy wastelands.&lt;br /&gt;
* Under the leadership of Tanuil, the Quenoth elves build and sustain a fortified village around a rare oasis. The village thrives amidst the hostilities of the desert.&lt;br /&gt;
* One night, a meteor storm rains from the sky and destroys the village of the Quenoth elves. '''Under the Burning Suns''' begins. The next day, Tanuil, like many others, is missing and presumed dead. Kalehssar (Kaleh), nephew of Tanuil, takes leadership of the remaining Quenoth elves as the surviving next of kin.&lt;br /&gt;
* Kaleh, heeding the voice of his god Eloh in his dreams, gathers the remaining Quenoth elves and leads them north to a new promised land, foregoing rebuilding of their desert village.&lt;br /&gt;
* The Quenoth elves battle their way north through Undead, Orcs, Bandits and other evil, venturing underground beneath a large mountain range at the command of Eloh.&lt;br /&gt;
* Befriending unexpected allies underground, Kaleh's forces survive to the other side of the mountain.&lt;br /&gt;
* Keratur, son of Tanuil and survivor of the cataclysm, insane with fright attacks Kaleh. Kaleh defeats Keratur.&lt;br /&gt;
* Kaleh defies commands given him by a vision of Eloh.&lt;br /&gt;
* The Quenoth reach the ocean. Aided by Merfolk, they escape the mainland and head for a newly discovered island, a place where the Quenoth may settle in peace.&lt;br /&gt;
* On the island, the Quenoth confront Yechnagoth, the Eater of Souls and impersonator of Eloh. Yechnagoth and army are destroyed by the Quenoth.&lt;br /&gt;
* Kaleh and the elves settle on their newfound, and newly named, Quenoth Isle. '''Under the Burning Suns''' ends.&lt;br /&gt;
&lt;br /&gt;
== History Credits ==&lt;br /&gt;
&lt;br /&gt;
* Timelined by Kamahawk and Turin.  Revised to incorporate material from later version of Legend of Wesmere and reconcile different versions of the history of the Scepter of Fire by Eric S. Raymond.&lt;br /&gt;
&lt;br /&gt;
* History derived from:&lt;br /&gt;
** Eastern Invasion&lt;br /&gt;
** Heir to the Throne&lt;br /&gt;
** Legend of Wesmere&lt;br /&gt;
** Liberty&lt;br /&gt;
** Northern Rebirth&lt;br /&gt;
** The Hammer of Thursagan&lt;br /&gt;
** The Rise of Wesnoth&lt;br /&gt;
** Under the Burning Suns&lt;br /&gt;
** Dead Water&lt;br /&gt;
** Delfador's Memoirs&lt;br /&gt;
&lt;br /&gt;
* Setting details derived from:&lt;br /&gt;
** Invasion from the Unknown&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Geography of Wesnoth]]&lt;br /&gt;
* [[Poetry of Wesnoth]]&lt;br /&gt;
* [[Races]]&lt;br /&gt;
* [[FactionHistory]]&lt;br /&gt;
* [[Future History]] '''(unofficial)'''&lt;br /&gt;
&lt;br /&gt;
[[Category:World of Wesnoth]]&lt;br /&gt;
[[Category:History]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&amp;diff=52509</id>
		<title>InterfaceActionsWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&amp;diff=52509"/>
		<updated>2013-11-25T19:30:59Z</updated>

		<summary type="html">&lt;p&gt;AI: /* [scroll_to] */&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 action only works in debug mode. It displays the gamestate inspector dialog (the same one which can be brought up with '':inspect'' ), 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;
* '''[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. (Note: Don't use this if the message has options, as such message can only be shown to the current player.)&lt;br /&gt;
* '''image''': (default: profile image of speaker) the image to display next to the message. Append ~RIGHT() if you want the image to appear on the right side.&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;
* '''duration''': (default: 10) the minimum number of frames for this message to be displayed. (A frame lasts about 30 milliseconds.) During this time any dialog decisions will be disregarded.&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;
* '''[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.&lt;br /&gt;
** '''message''': (translatable) the text displayed for the option (see [[DescriptionWML]])&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;
* '''[text_input]''': there can be only one [text_input] tag. this adds a text input field to the message.&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;
In 1.8, [http://developer.gnome.org/pango/unstable/PangoMarkupFormat.html Pango markup formatting codes] have been adopted for '''[message]'''. These can also be used in unit names (user_description), objectives, and such. Note that you'll probably want to use a single quote ' instead of a double quote &amp;quot; as double quotes cannot be escaped, otherwise the string will appear fragmented and you may also encounter errors. Running wmllint on your campaign will up-convert it, warning you about unusual cases you must fix by hand.&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'.&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;
&lt;br /&gt;
In 1.6, Wesnoth uses older text formatting options&lt;br /&gt;
* A tilde (~) as the first character causes the line to be boldfaced.&lt;br /&gt;
* An at symbol (@) as the first character causes the line to be green, as done with victory conditions.&lt;br /&gt;
* A pound symbol (#) as the first character causes the line to be red, as done with defeat conditions.&lt;br /&gt;
* An asterisk (*) as the first character causes the line to be bigger.&lt;br /&gt;
* A backquote (`) as the first character causes the line to be smaller.&lt;br /&gt;
* If used, the caption key text is boldfaced.&lt;br /&gt;
* An RGB colour code in the beginning causes the line to be the given colour. This can still be preceded by the above characters. Example: ''message=_&amp;quot;&amp;lt;255,0,0&amp;gt;Red!&amp;quot;''&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]]''' {{DevFeature1.11}} 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.&lt;br /&gt;
* '''defeat_string''': Default ' _ &amp;quot;Defeat:&amp;quot;', this text precedes the defeat objectives.&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;
&lt;br /&gt;
Tags of '''[objectives]''':&lt;br /&gt;
* '''[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;
** '''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.&lt;br /&gt;
* '''[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;
* '''[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;
** {{DevFeature1.11}} '''[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.&lt;br /&gt;
The user can also assign hotkeys to these WML commands unless specified otherwise. When the hotkey is pressed the event fill 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.&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.&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 false.&lt;br /&gt;
* '''use_hotkey''' {{DevFeature1.11}}: 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 location filter similar to the one found inside Single Unit Filters (see [[FilterWML]]). The menu item will only be available on matching locations.&lt;br /&gt;
* '''[default_hotkey]''' {{DevFeature1.11}}: 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;
* '''[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 ''' {{DevFeature1.11}} (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;
{{DevFeature1.11}}&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;
=== [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 [[ImagePathFunctionWML#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.&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.&lt;br /&gt;
* '''visible_in_fog''': whether the item should be visible through fog or not. Default yes.&lt;br /&gt;
* '''redraw''': {{DevFeature1.11}}(boolean yes|no, default: yes): If no, disables implicit calls to [[InterfaceActionsWML#.5Bredraw.5D|[redraw]]] when placing the items.&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 off&lt;br /&gt;
* '''image''' if specified, only removes the given image item (This image name must include any [[ImagePathFunctionWML|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.&lt;br /&gt;
* '''text''': (translatable) the text to display.&lt;br /&gt;
* '''size''': (default=12) the pointsize of the font to use&lt;br /&gt;
* '''duration''': (default=50) the length of time to display the text for. This is measured in the number of 'frames'. A frame in Wesnoth is usually displayed for around 30ms.&lt;br /&gt;
* '''red''', '''green''', '''blue''': (default=0,0,0) the color to display the text in. Values vary from 0-255.&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''': [[ImagePathFunctionWML|image path functions]] sequence to be applied on the fake unit.&lt;br /&gt;
* {{DevFeature1.11}} '''force_scrolling''':  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;
* '''[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;
=== [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;
{{DevFeature1.11}} 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;
=== [unlock_view] ===&lt;br /&gt;
{{DevFeature1.11}} 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;
* {{DevFeature1.11}} '''side''': the side or sides for which this should happen. By default, the [scroll] happens for everyone.&lt;br /&gt;
* {{DevFeature1.11}} '''[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;
* '''x''', '''y''': the hex to scroll to&lt;br /&gt;
* {{DevFeature1.11}} [[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 ''true'' (don't scroll to fog) and ''false'' (scroll even to fog), with ''false'' as the default.&lt;br /&gt;
* {{DevFeature1.11}} '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''false'').&lt;br /&gt;
* {{DevFeature1.11}} '''side''': the side or sides for which this should happen. By default, the [scroll_to] happens for everyone.&lt;br /&gt;
* {{DevFeature1.11}} '''[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]]&lt;br /&gt;
* '''check_fogged''': whether to scroll even to locations covered in fog or shroud. Possible values ''true'' (don't scroll to fog) and ''false'' (scroll even to fog), with ''false'' as the default.&lt;br /&gt;
* {{DevFeature1.11}} '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''false'').&lt;br /&gt;
* {{DevFeature1.11}} '''for_side''': the side or sides for which this should happen. By default, the [scroll_to_unit] happens for everyone.&lt;br /&gt;
* {{DevFeature1.11}} '''[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;
=== [sound]===&lt;br /&gt;
Plays a sound&lt;br /&gt;
* '''name''': the filename of the sound to play (in ''sounds/'' as .wav or .ogg)&lt;br /&gt;
* '''repeat''': repeats the sound for a specified additional number of times (default=0)&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 &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; - if true the source will not play if its locations are fogged&lt;br /&gt;
* '''check_shrouded''': possible values &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; - if true 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;
=== [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;
===[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;
=== [color_adjust]===&lt;br /&gt;
Tints the color of the screen.&lt;br /&gt;
* '''red''', '''green''', '''blue''': values from -255 to 255, the amount to tint by for each color&lt;br /&gt;
=== [delay] ===&lt;br /&gt;
Pauses the game.&lt;br /&gt;
* '''time''': the time to pause in milliseconds&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;
&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;
&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;
* '''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 direction 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&lt;br /&gt;
* '''text''': what the label should say&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;
=== [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.&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;
=== [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;
=== [open_help] ===&lt;br /&gt;
Opens the in-game help.&lt;br /&gt;
* '''topic''': the id of the topic to open&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]]''' {{DevFeature1.11}} 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.&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;
* '''[[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;
== 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>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&amp;diff=52508</id>
		<title>InterfaceActionsWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&amp;diff=52508"/>
		<updated>2013-11-25T19:30:42Z</updated>

		<summary type="html">&lt;p&gt;AI: /* [scroll_to_unit] */&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 action only works in debug mode. It displays the gamestate inspector dialog (the same one which can be brought up with '':inspect'' ), 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;
* '''[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. (Note: Don't use this if the message has options, as such message can only be shown to the current player.)&lt;br /&gt;
* '''image''': (default: profile image of speaker) the image to display next to the message. Append ~RIGHT() if you want the image to appear on the right side.&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;
* '''duration''': (default: 10) the minimum number of frames for this message to be displayed. (A frame lasts about 30 milliseconds.) During this time any dialog decisions will be disregarded.&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;
* '''[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.&lt;br /&gt;
** '''message''': (translatable) the text displayed for the option (see [[DescriptionWML]])&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;
* '''[text_input]''': there can be only one [text_input] tag. this adds a text input field to the message.&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;
In 1.8, [http://developer.gnome.org/pango/unstable/PangoMarkupFormat.html Pango markup formatting codes] have been adopted for '''[message]'''. These can also be used in unit names (user_description), objectives, and such. Note that you'll probably want to use a single quote ' instead of a double quote &amp;quot; as double quotes cannot be escaped, otherwise the string will appear fragmented and you may also encounter errors. Running wmllint on your campaign will up-convert it, warning you about unusual cases you must fix by hand.&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'.&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;
&lt;br /&gt;
In 1.6, Wesnoth uses older text formatting options&lt;br /&gt;
* A tilde (~) as the first character causes the line to be boldfaced.&lt;br /&gt;
* An at symbol (@) as the first character causes the line to be green, as done with victory conditions.&lt;br /&gt;
* A pound symbol (#) as the first character causes the line to be red, as done with defeat conditions.&lt;br /&gt;
* An asterisk (*) as the first character causes the line to be bigger.&lt;br /&gt;
* A backquote (`) as the first character causes the line to be smaller.&lt;br /&gt;
* If used, the caption key text is boldfaced.&lt;br /&gt;
* An RGB colour code in the beginning causes the line to be the given colour. This can still be preceded by the above characters. Example: ''message=_&amp;quot;&amp;lt;255,0,0&amp;gt;Red!&amp;quot;''&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]]''' {{DevFeature1.11}} 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.&lt;br /&gt;
* '''defeat_string''': Default ' _ &amp;quot;Defeat:&amp;quot;', this text precedes the defeat objectives.&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;
&lt;br /&gt;
Tags of '''[objectives]''':&lt;br /&gt;
* '''[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;
** '''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.&lt;br /&gt;
* '''[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;
* '''[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;
** {{DevFeature1.11}} '''[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.&lt;br /&gt;
The user can also assign hotkeys to these WML commands unless specified otherwise. When the hotkey is pressed the event fill 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.&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.&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 false.&lt;br /&gt;
* '''use_hotkey''' {{DevFeature1.11}}: 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 location filter similar to the one found inside Single Unit Filters (see [[FilterWML]]). The menu item will only be available on matching locations.&lt;br /&gt;
* '''[default_hotkey]''' {{DevFeature1.11}}: 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;
* '''[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 ''' {{DevFeature1.11}} (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;
{{DevFeature1.11}}&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;
=== [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 [[ImagePathFunctionWML#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.&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.&lt;br /&gt;
* '''visible_in_fog''': whether the item should be visible through fog or not. Default yes.&lt;br /&gt;
* '''redraw''': {{DevFeature1.11}}(boolean yes|no, default: yes): If no, disables implicit calls to [[InterfaceActionsWML#.5Bredraw.5D|[redraw]]] when placing the items.&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 off&lt;br /&gt;
* '''image''' if specified, only removes the given image item (This image name must include any [[ImagePathFunctionWML|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.&lt;br /&gt;
* '''text''': (translatable) the text to display.&lt;br /&gt;
* '''size''': (default=12) the pointsize of the font to use&lt;br /&gt;
* '''duration''': (default=50) the length of time to display the text for. This is measured in the number of 'frames'. A frame in Wesnoth is usually displayed for around 30ms.&lt;br /&gt;
* '''red''', '''green''', '''blue''': (default=0,0,0) the color to display the text in. Values vary from 0-255.&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''': [[ImagePathFunctionWML|image path functions]] sequence to be applied on the fake unit.&lt;br /&gt;
* {{DevFeature1.11}} '''force_scrolling''':  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;
* '''[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;
=== [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;
{{DevFeature1.11}} 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;
=== [unlock_view] ===&lt;br /&gt;
{{DevFeature1.11}} 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;
* {{DevFeature1.11}} '''side''': the side or sides for which this should happen. By default, the [scroll] happens for everyone.&lt;br /&gt;
* {{DevFeature1.11}} '''[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;
* '''x''', '''y''': the hex to scroll to&lt;br /&gt;
* {{DevFeature1.11}} [[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 ''true'' (don't scroll to fog) and ''false'' (scroll even to fog), with ''false'' as the default.&lt;br /&gt;
* {{DevFeature1.11}} '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''false'').&lt;br /&gt;
* {{DevFeature1.11}} '''side''': the side or sides for which this should happen. By default, the [scroll] happens for everyone.&lt;br /&gt;
* {{DevFeature1.11}} '''[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_unit] ===&lt;br /&gt;
Scroll to a given unit&lt;br /&gt;
* [[StandardUnitFilter]]&lt;br /&gt;
* '''check_fogged''': whether to scroll even to locations covered in fog or shroud. Possible values ''true'' (don't scroll to fog) and ''false'' (scroll even to fog), with ''false'' as the default.&lt;br /&gt;
* {{DevFeature1.11}} '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''false'').&lt;br /&gt;
* {{DevFeature1.11}} '''for_side''': the side or sides for which this should happen. By default, the [scroll_to_unit] happens for everyone.&lt;br /&gt;
* {{DevFeature1.11}} '''[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;
=== [sound]===&lt;br /&gt;
Plays a sound&lt;br /&gt;
* '''name''': the filename of the sound to play (in ''sounds/'' as .wav or .ogg)&lt;br /&gt;
* '''repeat''': repeats the sound for a specified additional number of times (default=0)&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 &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; - if true the source will not play if its locations are fogged&lt;br /&gt;
* '''check_shrouded''': possible values &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; - if true 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;
=== [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;
===[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;
=== [color_adjust]===&lt;br /&gt;
Tints the color of the screen.&lt;br /&gt;
* '''red''', '''green''', '''blue''': values from -255 to 255, the amount to tint by for each color&lt;br /&gt;
=== [delay] ===&lt;br /&gt;
Pauses the game.&lt;br /&gt;
* '''time''': the time to pause in milliseconds&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;
&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;
&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;
* '''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 direction 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&lt;br /&gt;
* '''text''': what the label should say&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;
=== [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.&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;
=== [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;
=== [open_help] ===&lt;br /&gt;
Opens the in-game help.&lt;br /&gt;
* '''topic''': the id of the topic to open&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]]''' {{DevFeature1.11}} 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.&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;
* '''[[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;
== 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>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&amp;diff=52507</id>
		<title>InterfaceActionsWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&amp;diff=52507"/>
		<updated>2013-11-25T19:29:54Z</updated>

		<summary type="html">&lt;p&gt;AI: /* [scroll_to] */&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 action only works in debug mode. It displays the gamestate inspector dialog (the same one which can be brought up with '':inspect'' ), 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;
* '''[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. (Note: Don't use this if the message has options, as such message can only be shown to the current player.)&lt;br /&gt;
* '''image''': (default: profile image of speaker) the image to display next to the message. Append ~RIGHT() if you want the image to appear on the right side.&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;
* '''duration''': (default: 10) the minimum number of frames for this message to be displayed. (A frame lasts about 30 milliseconds.) During this time any dialog decisions will be disregarded.&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;
* '''[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.&lt;br /&gt;
** '''message''': (translatable) the text displayed for the option (see [[DescriptionWML]])&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;
* '''[text_input]''': there can be only one [text_input] tag. this adds a text input field to the message.&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;
In 1.8, [http://developer.gnome.org/pango/unstable/PangoMarkupFormat.html Pango markup formatting codes] have been adopted for '''[message]'''. These can also be used in unit names (user_description), objectives, and such. Note that you'll probably want to use a single quote ' instead of a double quote &amp;quot; as double quotes cannot be escaped, otherwise the string will appear fragmented and you may also encounter errors. Running wmllint on your campaign will up-convert it, warning you about unusual cases you must fix by hand.&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'.&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;
&lt;br /&gt;
In 1.6, Wesnoth uses older text formatting options&lt;br /&gt;
* A tilde (~) as the first character causes the line to be boldfaced.&lt;br /&gt;
* An at symbol (@) as the first character causes the line to be green, as done with victory conditions.&lt;br /&gt;
* A pound symbol (#) as the first character causes the line to be red, as done with defeat conditions.&lt;br /&gt;
* An asterisk (*) as the first character causes the line to be bigger.&lt;br /&gt;
* A backquote (`) as the first character causes the line to be smaller.&lt;br /&gt;
* If used, the caption key text is boldfaced.&lt;br /&gt;
* An RGB colour code in the beginning causes the line to be the given colour. This can still be preceded by the above characters. Example: ''message=_&amp;quot;&amp;lt;255,0,0&amp;gt;Red!&amp;quot;''&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]]''' {{DevFeature1.11}} 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.&lt;br /&gt;
* '''defeat_string''': Default ' _ &amp;quot;Defeat:&amp;quot;', this text precedes the defeat objectives.&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;
&lt;br /&gt;
Tags of '''[objectives]''':&lt;br /&gt;
* '''[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;
** '''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.&lt;br /&gt;
* '''[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;
* '''[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;
** {{DevFeature1.11}} '''[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.&lt;br /&gt;
The user can also assign hotkeys to these WML commands unless specified otherwise. When the hotkey is pressed the event fill 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.&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.&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 false.&lt;br /&gt;
* '''use_hotkey''' {{DevFeature1.11}}: 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 location filter similar to the one found inside Single Unit Filters (see [[FilterWML]]). The menu item will only be available on matching locations.&lt;br /&gt;
* '''[default_hotkey]''' {{DevFeature1.11}}: 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;
* '''[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 ''' {{DevFeature1.11}} (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;
{{DevFeature1.11}}&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;
=== [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 [[ImagePathFunctionWML#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.&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.&lt;br /&gt;
* '''visible_in_fog''': whether the item should be visible through fog or not. Default yes.&lt;br /&gt;
* '''redraw''': {{DevFeature1.11}}(boolean yes|no, default: yes): If no, disables implicit calls to [[InterfaceActionsWML#.5Bredraw.5D|[redraw]]] when placing the items.&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 off&lt;br /&gt;
* '''image''' if specified, only removes the given image item (This image name must include any [[ImagePathFunctionWML|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.&lt;br /&gt;
* '''text''': (translatable) the text to display.&lt;br /&gt;
* '''size''': (default=12) the pointsize of the font to use&lt;br /&gt;
* '''duration''': (default=50) the length of time to display the text for. This is measured in the number of 'frames'. A frame in Wesnoth is usually displayed for around 30ms.&lt;br /&gt;
* '''red''', '''green''', '''blue''': (default=0,0,0) the color to display the text in. Values vary from 0-255.&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''': [[ImagePathFunctionWML|image path functions]] sequence to be applied on the fake unit.&lt;br /&gt;
* {{DevFeature1.11}} '''force_scrolling''':  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;
* '''[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;
=== [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;
{{DevFeature1.11}} 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;
=== [unlock_view] ===&lt;br /&gt;
{{DevFeature1.11}} 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;
* {{DevFeature1.11}} '''side''': the side or sides for which this should happen. By default, the [scroll] happens for everyone.&lt;br /&gt;
* {{DevFeature1.11}} '''[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;
* '''x''', '''y''': the hex to scroll to&lt;br /&gt;
* {{DevFeature1.11}} [[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 ''true'' (don't scroll to fog) and ''false'' (scroll even to fog), with ''false'' as the default.&lt;br /&gt;
* {{DevFeature1.11}} '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''false'').&lt;br /&gt;
* {{DevFeature1.11}} '''side''': the side or sides for which this should happen. By default, the [scroll] happens for everyone.&lt;br /&gt;
* {{DevFeature1.11}} '''[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_unit] ===&lt;br /&gt;
Scroll to a given unit&lt;br /&gt;
* [[StandardUnitFilter]]&lt;br /&gt;
* '''check_fogged''': whether to scroll even to locations covered in fog or shroud. Possible values ''true'' (don't scroll to fog) and ''false'' (scroll even to fog), with ''false'' as the default.&lt;br /&gt;
* {{DevFeature1.11}} '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''false'').&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;
=== [sound]===&lt;br /&gt;
Plays a sound&lt;br /&gt;
* '''name''': the filename of the sound to play (in ''sounds/'' as .wav or .ogg)&lt;br /&gt;
* '''repeat''': repeats the sound for a specified additional number of times (default=0)&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 &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; - if true the source will not play if its locations are fogged&lt;br /&gt;
* '''check_shrouded''': possible values &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; - if true 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;
=== [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;
===[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;
=== [color_adjust]===&lt;br /&gt;
Tints the color of the screen.&lt;br /&gt;
* '''red''', '''green''', '''blue''': values from -255 to 255, the amount to tint by for each color&lt;br /&gt;
=== [delay] ===&lt;br /&gt;
Pauses the game.&lt;br /&gt;
* '''time''': the time to pause in milliseconds&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;
&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;
&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;
* '''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 direction 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&lt;br /&gt;
* '''text''': what the label should say&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;
=== [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.&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;
=== [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;
=== [open_help] ===&lt;br /&gt;
Opens the in-game help.&lt;br /&gt;
* '''topic''': the id of the topic to open&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]]''' {{DevFeature1.11}} 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.&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;
* '''[[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;
== 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>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&amp;diff=52506</id>
		<title>InterfaceActionsWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&amp;diff=52506"/>
		<updated>2013-11-25T19:28:51Z</updated>

		<summary type="html">&lt;p&gt;AI: /* [scroll] */&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 action only works in debug mode. It displays the gamestate inspector dialog (the same one which can be brought up with '':inspect'' ), 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;
* '''[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. (Note: Don't use this if the message has options, as such message can only be shown to the current player.)&lt;br /&gt;
* '''image''': (default: profile image of speaker) the image to display next to the message. Append ~RIGHT() if you want the image to appear on the right side.&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;
* '''duration''': (default: 10) the minimum number of frames for this message to be displayed. (A frame lasts about 30 milliseconds.) During this time any dialog decisions will be disregarded.&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;
* '''[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.&lt;br /&gt;
** '''message''': (translatable) the text displayed for the option (see [[DescriptionWML]])&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;
* '''[text_input]''': there can be only one [text_input] tag. this adds a text input field to the message.&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;
In 1.8, [http://developer.gnome.org/pango/unstable/PangoMarkupFormat.html Pango markup formatting codes] have been adopted for '''[message]'''. These can also be used in unit names (user_description), objectives, and such. Note that you'll probably want to use a single quote ' instead of a double quote &amp;quot; as double quotes cannot be escaped, otherwise the string will appear fragmented and you may also encounter errors. Running wmllint on your campaign will up-convert it, warning you about unusual cases you must fix by hand.&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'.&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;
&lt;br /&gt;
In 1.6, Wesnoth uses older text formatting options&lt;br /&gt;
* A tilde (~) as the first character causes the line to be boldfaced.&lt;br /&gt;
* An at symbol (@) as the first character causes the line to be green, as done with victory conditions.&lt;br /&gt;
* A pound symbol (#) as the first character causes the line to be red, as done with defeat conditions.&lt;br /&gt;
* An asterisk (*) as the first character causes the line to be bigger.&lt;br /&gt;
* A backquote (`) as the first character causes the line to be smaller.&lt;br /&gt;
* If used, the caption key text is boldfaced.&lt;br /&gt;
* An RGB colour code in the beginning causes the line to be the given colour. This can still be preceded by the above characters. Example: ''message=_&amp;quot;&amp;lt;255,0,0&amp;gt;Red!&amp;quot;''&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]]''' {{DevFeature1.11}} 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.&lt;br /&gt;
* '''defeat_string''': Default ' _ &amp;quot;Defeat:&amp;quot;', this text precedes the defeat objectives.&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;
&lt;br /&gt;
Tags of '''[objectives]''':&lt;br /&gt;
* '''[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;
** '''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.&lt;br /&gt;
* '''[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;
* '''[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;
** {{DevFeature1.11}} '''[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.&lt;br /&gt;
The user can also assign hotkeys to these WML commands unless specified otherwise. When the hotkey is pressed the event fill 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.&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.&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 false.&lt;br /&gt;
* '''use_hotkey''' {{DevFeature1.11}}: 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 location filter similar to the one found inside Single Unit Filters (see [[FilterWML]]). The menu item will only be available on matching locations.&lt;br /&gt;
* '''[default_hotkey]''' {{DevFeature1.11}}: 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;
* '''[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 ''' {{DevFeature1.11}} (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;
{{DevFeature1.11}}&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;
=== [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 [[ImagePathFunctionWML#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.&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.&lt;br /&gt;
* '''visible_in_fog''': whether the item should be visible through fog or not. Default yes.&lt;br /&gt;
* '''redraw''': {{DevFeature1.11}}(boolean yes|no, default: yes): If no, disables implicit calls to [[InterfaceActionsWML#.5Bredraw.5D|[redraw]]] when placing the items.&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 off&lt;br /&gt;
* '''image''' if specified, only removes the given image item (This image name must include any [[ImagePathFunctionWML|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.&lt;br /&gt;
* '''text''': (translatable) the text to display.&lt;br /&gt;
* '''size''': (default=12) the pointsize of the font to use&lt;br /&gt;
* '''duration''': (default=50) the length of time to display the text for. This is measured in the number of 'frames'. A frame in Wesnoth is usually displayed for around 30ms.&lt;br /&gt;
* '''red''', '''green''', '''blue''': (default=0,0,0) the color to display the text in. Values vary from 0-255.&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''': [[ImagePathFunctionWML|image path functions]] sequence to be applied on the fake unit.&lt;br /&gt;
* {{DevFeature1.11}} '''force_scrolling''':  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;
* '''[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;
=== [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;
{{DevFeature1.11}} 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;
=== [unlock_view] ===&lt;br /&gt;
{{DevFeature1.11}} 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;
* {{DevFeature1.11}} '''side''': the side or sides for which this should happen. By default, the [scroll] happens for everyone.&lt;br /&gt;
* {{DevFeature1.11}} '''[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;
* '''x''', '''y''': the hex to scroll to&lt;br /&gt;
* {{DevFeature1.11}} [[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 ''true'' (don't scroll to fog) and ''false'' (scroll even to fog), with ''false'' as the default.&lt;br /&gt;
* {{DevFeature1.11}} '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''false'').&lt;br /&gt;
&lt;br /&gt;
=== [scroll_to_unit] ===&lt;br /&gt;
Scroll to a given unit&lt;br /&gt;
* [[StandardUnitFilter]]&lt;br /&gt;
* '''check_fogged''': whether to scroll even to locations covered in fog or shroud. Possible values ''true'' (don't scroll to fog) and ''false'' (scroll even to fog), with ''false'' as the default.&lt;br /&gt;
* {{DevFeature1.11}} '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''false'').&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;
=== [sound]===&lt;br /&gt;
Plays a sound&lt;br /&gt;
* '''name''': the filename of the sound to play (in ''sounds/'' as .wav or .ogg)&lt;br /&gt;
* '''repeat''': repeats the sound for a specified additional number of times (default=0)&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 &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; - if true the source will not play if its locations are fogged&lt;br /&gt;
* '''check_shrouded''': possible values &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; - if true 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;
=== [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;
===[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;
=== [color_adjust]===&lt;br /&gt;
Tints the color of the screen.&lt;br /&gt;
* '''red''', '''green''', '''blue''': values from -255 to 255, the amount to tint by for each color&lt;br /&gt;
=== [delay] ===&lt;br /&gt;
Pauses the game.&lt;br /&gt;
* '''time''': the time to pause in milliseconds&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;
&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;
&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;
* '''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 direction 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&lt;br /&gt;
* '''text''': what the label should say&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;
=== [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.&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;
=== [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;
=== [open_help] ===&lt;br /&gt;
Opens the in-game help.&lt;br /&gt;
* '''topic''': the id of the topic to open&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]]''' {{DevFeature1.11}} 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.&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;
* '''[[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;
== 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>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesnothRepository&amp;diff=52353</id>
		<title>WesnothRepository</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesnothRepository&amp;diff=52353"/>
		<updated>2013-11-03T17:23:41Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Compiling Wesnoth}}&lt;br /&gt;
&lt;br /&gt;
The Battle for Wesnoth code base is stored in a version control repository. Version control allows the entire dev team to edit files concurrently. The software tracks revisions, stores a record of all edits, revents simultaneous editing from causing clashes. All changes are stored in the version control repository. &lt;br /&gt;
&lt;br /&gt;
When a release is planned, the current set of the files in the repository is frozen, given a release number, and shipped out to the world at large. Then, as files continue to be edited by the developers, the repository code advances past that point. The repository (or &amp;quot;repo&amp;quot;) version is by definition the most up-to-date version of the code.&lt;br /&gt;
&lt;br /&gt;
The Wesnoth repository uses Git and lives at https://github.com/wesnoth/wesnoth-old&lt;br /&gt;
&lt;br /&gt;
==  Git ==&lt;br /&gt;
&lt;br /&gt;
Git is the most widely used open-source version-control system. You can learn more about it at the Git home page, http://git-scm.com/.&lt;br /&gt;
&lt;br /&gt;
Git replaced Sub&amp;amp;shy;&amp;amp;shy;version as Wesnoth's version control system in March 2013. Sub&amp;amp;shy;&amp;amp;shy;version had itself previously replaced an older program called &amp;quot;CVS&amp;quot; or &amp;quot;concurrent versioning system&amp;quot; in 2005. These earlier systems have left a few traces in the version history which you might encounter; some older documentation and a few files refer to them.&lt;br /&gt;
&lt;br /&gt;
==  Browse the code  ==&lt;br /&gt;
&lt;br /&gt;
There are currently two main streams of development: trunk (1.11.x) and stable branch (1.10.x). Most other branches are only used for a short time to do some testing without disturbing the main development. You can use your web browser to navigate through the source code:&lt;br /&gt;
&lt;br /&gt;
https://github.com/wesnoth/wesnoth-old&lt;br /&gt;
&lt;br /&gt;
==  Download  ==&lt;br /&gt;
&lt;br /&gt;
To check out a read-only copy into a directory called ''wesnoth'',&lt;br /&gt;
&lt;br /&gt;
 git clone git://github.com/wesnoth/wesnoth-old.git wesnoth&lt;br /&gt;
&lt;br /&gt;
==  Commit access  ==&lt;br /&gt;
&lt;br /&gt;
For commit access, you must have a developer account on GitHub, it must be registered as part of the Wesnoth group, and you must check out with:&lt;br /&gt;
&lt;br /&gt;
 git clone git@github.com:wesnoth/wesnoth-old.git wesnoth&lt;br /&gt;
&lt;br /&gt;
==  Update  ==&lt;br /&gt;
&lt;br /&gt;
Do this from inside the ''wesnoth'' directory &lt;br /&gt;
&lt;br /&gt;
 git pull&lt;br /&gt;
&lt;br /&gt;
== Reviewing your changes ==&lt;br /&gt;
&lt;br /&gt;
Before committing, it's always wise to run&lt;br /&gt;
&lt;br /&gt;
 git diff&lt;br /&gt;
&lt;br /&gt;
and look at the output. Some kinds of mistakes that are hard to see embedded in all the code you have modified are more easily spotted in the isolated diff lines.&lt;br /&gt;
&lt;br /&gt;
== Generating patches ==&lt;br /&gt;
&lt;br /&gt;
Under Git on a Unix-like operating system, you'll typically do&lt;br /&gt;
&lt;br /&gt;
  git format-patch HEAD~1..HEAD&lt;br /&gt;
&lt;br /&gt;
or something similar; &amp;quot;HEAD~1&amp;quot; may be replaced by a hash or symbolic reference to any earlier revision. This will produce one or more patch files, numbered and endingth with the extension &amp;quot;.patch&amp;quot;.  See [[PatchSubmissionGuidelines]] for more on how to get these merged into the public repository.&lt;br /&gt;
&lt;br /&gt;
== Push to your own fork ==&lt;br /&gt;
&lt;br /&gt;
If you have an account on github, you can fork the repository and add your fork as a remote to your clone.&lt;br /&gt;
&lt;br /&gt;
  git remote add fork git@github.com:YOUR_USERNAME/wesnoth-old.git&lt;br /&gt;
&lt;br /&gt;
You can then push your feature branches to your fork.&lt;br /&gt;
&lt;br /&gt;
  git push fork local_branch_name:remote_branch_name&lt;br /&gt;
&lt;br /&gt;
Feature branches can be used to base pull requests on using github's webinterface.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[CompilingWesnoth]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesnothRepository&amp;diff=52352</id>
		<title>WesnothRepository</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesnothRepository&amp;diff=52352"/>
		<updated>2013-11-03T17:09:33Z</updated>

		<summary type="html">&lt;p&gt;AI: Get rid of the &amp;quot;-code&amp;quot; suffix sourceforge artifact&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Compiling Wesnoth}}&lt;br /&gt;
&lt;br /&gt;
The Battle for Wesnoth code base is stored in a version control repository. Version control allows the entire dev team to edit files concurrently. The software tracks revisions, stores a record of all edits, revents simultaneous editing from causing clashes. All changes are stored in the version control repository. &lt;br /&gt;
&lt;br /&gt;
When a release is planned, the current set of the files in the repository is frozen, given a release number, and shipped out to the world at large. Then, as files continue to be edited by the developers, the repository code advances past that point. The repository (or &amp;quot;repo&amp;quot;) version is by definition the most up-to-date version of the code.&lt;br /&gt;
&lt;br /&gt;
The Wesnoth repository uses Git and lives at https://github.com/wesnoth/wesnoth-old&lt;br /&gt;
&lt;br /&gt;
==  Git ==&lt;br /&gt;
&lt;br /&gt;
Git is the most widely used open-source version-control system. You can learn more about it at the Git home page, http://git-scm.com/.&lt;br /&gt;
&lt;br /&gt;
Git replaced Sub&amp;amp;shy;&amp;amp;shy;version as Wesnoth's version control system in March 2013. Sub&amp;amp;shy;&amp;amp;shy;version had itself previously replaced an older program called &amp;quot;CVS&amp;quot; or &amp;quot;concurrent versioning system&amp;quot; in 2005. These earlier systems have left a few traces in the version history which you might encounter; some older documentation and a few files refer to them.&lt;br /&gt;
&lt;br /&gt;
==  Browse the code  ==&lt;br /&gt;
&lt;br /&gt;
There are currently two main streams of development: trunk (1.11.x) and stable branch (1.10.x). Most other branches are only used for a short time to do some testing without disturbing the main development. You can use your web browser to navigate through the source code:&lt;br /&gt;
&lt;br /&gt;
https://github.com/wesnoth/wesnoth-old&lt;br /&gt;
&lt;br /&gt;
==  Download  ==&lt;br /&gt;
&lt;br /&gt;
To check out a read-only copy into a directory called ''wesnoth'',&lt;br /&gt;
&lt;br /&gt;
 git clone git://github.com/wesnoth/wesnoth-old.git wesnoth&lt;br /&gt;
&lt;br /&gt;
==  Commit access  ==&lt;br /&gt;
&lt;br /&gt;
For commit access, you must have a developer account on GitHub, it must be registered as part of the Wesnoth group, and you must check out with:&lt;br /&gt;
&lt;br /&gt;
 git clone git@github.com:wesnoth/wesnoth-old.git wesnoth&lt;br /&gt;
&lt;br /&gt;
==  Update  ==&lt;br /&gt;
&lt;br /&gt;
Do this from inside the ''wesnoth'' directory &lt;br /&gt;
&lt;br /&gt;
 git pull&lt;br /&gt;
&lt;br /&gt;
== Reviewing your changes ==&lt;br /&gt;
&lt;br /&gt;
Before committing, it's always wise to run&lt;br /&gt;
&lt;br /&gt;
 git diff&lt;br /&gt;
&lt;br /&gt;
and look at the output. Some kinds of mistakes that are hard to see embedded in all the code you have modified are more easily spotted in the isolated diff lines.&lt;br /&gt;
&lt;br /&gt;
== Generating patches ==&lt;br /&gt;
&lt;br /&gt;
Under Git on a Unix-like operating system, you'll typically do&lt;br /&gt;
&lt;br /&gt;
  git format-patch HEAD~1..HEAD&lt;br /&gt;
&lt;br /&gt;
or something similar; &amp;quot;HEAD~1&amp;quot; may be replaced by a hash or symbolic reference to any earlier revision. This will produce one or more patch files, numbered and endingth with the extension &amp;quot;.patch&amp;quot;.  See [[PatchSubmissionGuidelines]] for more on how to get these merged into the public repository.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[CompilingWesnoth]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=UnitTypeWML&amp;diff=51726</id>
		<title>UnitTypeWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=UnitTypeWML&amp;diff=51726"/>
		<updated>2013-08-03T17:33:13Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Each '''[unit_type]''' tag defines one unit type. (for the use of [unit] to create a unit, see [[SingleUnitWML]])&lt;br /&gt;
&lt;br /&gt;
Unit animation syntax is described in [[AnimationWML]]. In addition to the animation tags described there, the following key/tags are recognized:&lt;br /&gt;
* '''[advancefrom]''': Defines the previous unit type on the advancement tree. Allows a campaign-specific unit to be spliced into an already existing advancement tree.  It should generally be used only inside a campaign ifdef, to prevent changes to other campaigns.  This tag makes changes to the ''advances_to'' and ''experience'' keys of a base unit to make it advance into this unit.  It takes these keys:&lt;br /&gt;
** ''unit'': the id of the base unit from which this unit advances.  This adds the unit into the list of units which ''unit'' can advance into.&lt;br /&gt;
** ''experience'': (optional) If present the experience needed to advance is set to this value. If there are more than one [advancefrom] tags referencing the same base unit within the same preprocessor scope (e.g. a campaign #ifdef) with experience= keys, the lowest value of these is chosen.  Note: this will also lower the experience required to advance to other units which the base unit can advance into.&lt;br /&gt;
: If the previous unit type makes use of '''[male]''' and/or '''[female]''' tags, then the current (new) unit type is expected to also. That is, the subtypes defined by those tags will only receive this advancement if the new type has a corresponding tag.&lt;br /&gt;
* '''advances_to''': When this unit has ''experience'' greater than or equal to ''experience'', it is replaced by a unit of the type that the value of ''advances_to'' refers to. All modifications that have been done to the unit are applied to the unit it is replaced by. The special value 'null' says that the unit does not advance but gets an AMLA instead. Can be a comma-separated list of units that can be chosen from upon advancing.&lt;br /&gt;
* '''alignment''': one of lawful/neutral/chaotic/liminal (See [[TimeWML]]). Default is &amp;quot;neutral&amp;quot;.&lt;br /&gt;
* '''attacks''': the number of times that this unit can attack each turn.&lt;br /&gt;
* '''cost''': when a player recruits a unit of this type, the player loses ''cost'' gold. If this would cause gold to drop below 0,  the unit cannot be recruited.&lt;br /&gt;
* '''description''': (translatable) the text displayed in the unit descriptor box for this unit. Default 'No description available...'. &lt;br /&gt;
* '''do_not_list''': Not used by the game, but by tools for browsing and listing the unit tree. If this is 'yes', the unit will be ignored by these tools. &lt;br /&gt;
* '''ellipse''': the ellipse image to display under the unit, which is normally team-colored. Default is the normal ellipse; &amp;quot;misc/ellipse-nozoc&amp;quot; is a dashed ellipse that should be used for units without zone of control. {{DevFeature1.11}} Default is &amp;quot;misc/ellipse&amp;quot;; &amp;quot;-nozoc&amp;quot; and &amp;quot;-leader&amp;quot; are automatically appended for units without zone of control and with canrecruit=yes respectively. The [http://www.wesnoth.org/macro-reference.xhtml#IS_HERO IS_HERO]/[http://www.wesnoth.org/macro-reference.xhtml#MAKE_HERO MAKE_HERO]/[http://www.wesnoth.org/macro-reference.xhtml#UNMAKE_HERO UNMAKE_HERO] macros change the ellipse to/back from &amp;quot;misc/ellipse-hero&amp;quot;.&lt;br /&gt;
* '''experience''': When this unit has experience greater than or equal to ''experience'', it is replaced by a unit with 0 experience of the type that the value of ''advances_to'' refers to. All modifications that have been done to the unit are applied to the unit it is replaced by.&lt;br /&gt;
* '''flag_rgb''': usually set by [http://www.wesnoth.org/macro-reference.xhtml#MAGENTA_IS_THE_TEAM_COLOR MAGENTA_IS_THE_TEAM_COLOR]; specifies the colours in the base flag to use for team-colouring the unit, expressed as a colour name (such as magenta) or a comma-separated list of RGB values (in hex format).&lt;br /&gt;
* '''gender''': has a value of either ''male'' or ''female'', and determines which of the keys ''male_names'' and ''female_names''  should be read. When a unit of this type is recruited, it will be randomly assigned a name by the random name generator, which will use these names as a base.&lt;br /&gt;
* '''hide_help''': determines if the unit type will appear in the in-game help. Possible values ''true'' and ''false'', defaults to ''false''.&lt;br /&gt;
* '''hitpoints''': the maximum HP that the unit has, and the HP it has when it is created.&lt;br /&gt;
* '''id''': the value of the ''type'' key for units of this type. This is required and must be unique among all [unit_type] tags. An ''id'' should consist only of alphanumerics and spaces (or underscores). ''type'' keys are found in [[SingleUnitWML]] and [[FilterWML]]. For example, id=Drake Flare&lt;br /&gt;
::WARNING : characters &amp;quot;$&amp;quot;, &amp;quot;&amp;amp;&amp;quot;, &amp;quot;*&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;(&amp;quot; and &amp;quot;)&amp;quot; are illegal for use in the unit type id and must be avoided because they might lead to corrupted saved games&lt;br /&gt;
*'''ignore_race_traits''': 'yes' or 'no' (default). Determines whether racial traits (see [[UnitsWML]]) are applied. &lt;br /&gt;
* '''image''': sets the base image of the unit, which is used on the map.&lt;br /&gt;
* '''image_icon''': sets the image used to represent the unit in areas such as the attack dialog and the unit image box in the sidebar&lt;br /&gt;
* '''level''': the amount of upkeep the unit costs.  After this unit fights, its opponent gains ''level'' experience. See also kill_experience ([[GameConfigWML]]), and leadership ([[AbilitiesWML]]).&lt;br /&gt;
* '''movement''': the number of move points that this unit receives each turn.&lt;br /&gt;
* '''movement_type''': See [[UnitsWML#.5Bmovetype.5D|movetype]]. Note that the tags '''[movement_costs]''', '''[vision_costs]''', '''[defense]''', and '''[resistance]''' can be used to modify this movetype.&lt;br /&gt;
* '''name''':(translatable) displayed in the Status Table for units of this type.&lt;br /&gt;
* '''num_traits''': the number of traits that units of this type should receive when they are recruited, overriding the value set in the [race] tag.&lt;br /&gt;
* '''profile''': the portrait image to use for this unit type. You can also set a portrait for an individual unit instead of the whole unit type (see [[SingleUnitWML]]). The engine first looks for the image in the transparent subdirectory and if found that image is used. If not found it will use the image as-is. Depending on the size the engine will or will not scale the image, the cutoff currently is at 300x300. For images which should only be shown on the right side in the dialog append ~RIGHT() to the image.&lt;br /&gt;
* '''small_profile''': the image to use when a smaller portrait is needed than the one used for messages (e.g., in the help system). When this attribute is missing, the value of the '''profile''' attribute is used instead. When present, the heuristic for finding a transparent portrait is disabled for the '''profile''' attribute, so the correct '''profile''' should be set too. Note that image modifiers are allowed; they might be useful for cropping and rescaling a portrait:&lt;br /&gt;
 small_profile=&amp;quot;portraits/elves/transparent/marksman+female.png~CROP(0,20,380,380)~SCALE(205,205)&amp;quot;&lt;br /&gt;
 profile=&amp;quot;portraits/elves/transparent/marksman+female.png&amp;quot;&lt;br /&gt;
* '''race''': See {{tag|UnitsWML|race}}.  Also used in standard unit filter (see [[FilterWML]]).&lt;br /&gt;
* '''undead_variation''': When a unit of this type is killed by a weapon with the plague special, this variation is applied to the new plague unit that is created, whatever its type. For example, if the plague special creates Walking Corpses and undead_variation is set to &amp;quot;troll&amp;quot;, you'll get a troll Walking Corpse. Defaults to the undead_variation set in this unit type's race.&lt;br /&gt;
* '''usage''': the way that the AI should recruit this unit, as determined by the scenario designer. (See ''recruitment_pattern'', [[AiWML]]).  The following are conventions on usage:&amp;lt;br&amp;gt; ** ''scout'': Fast, mobile unit meant for exploration and village grabbing.&amp;lt;br&amp;gt; ** ''fighter'': Melee fighter, melee attack substantially more powerful than ranged.&amp;lt;br&amp;gt; ** ''archer'': Ranged fighter, ranged attack substantially more powerful than melee.&amp;lt;br&amp;gt; ** ''mixed fighter'': Melee and ranged fighter, melee and ranged attacks roughly equal.&amp;lt;br&amp;gt; ** ''healer'': Specialty 'heals' or 'cures'.&amp;lt;br&amp;gt;Note that this field primarily affects recruitment.  It also has a small effect on unit movement (the AI tries to keep scouts away from enemies, to some extent).  It does not affect the AI's behavior in combat; that is always computed from attack power and hitpoints. Non-standard usages may be used as well.&lt;br /&gt;
* '''vision''': the number of vision points to calculate the unit's sight range. Defaults to ''movement'' if not present.{{DevFeature1.11}}&lt;br /&gt;
* '''zoc''': if &amp;quot;yes&amp;quot; the unit will have a zone of control regardless of level.  If present but set to anything other than &amp;quot;yes,&amp;quot; the unit will have no zone of control.  If the tag is omitted, zone of control is dictated by unit level (level 0 = no zoc, level 1+ = has zoc).&lt;br /&gt;
&lt;br /&gt;
== After max level advancement (AMLA) ==&lt;br /&gt;
* '''[advancement]''': describes what happens to a unit when it reaches the XP required for advancement.  It is considered as an advancement in the same way as advancement described by '''advances_to'''; however, if the player chooses this advancement, the unit will have one or more effects applied to it instead of advancing.&lt;br /&gt;
** '''id''': unique identifier for this advancement; ''Required'' if there are multiple advancement options, or if ''strict_amla=no''.&lt;br /&gt;
** '''always_display''': if set to true displays the AMLA option even if it is the only available one.&lt;br /&gt;
** '''description''': a description (see [[DescriptionWML]]) displayed as the option for this advancement if there is another advancement option that the player must choose from; otherwise, the advancement is chosen automatically and this key is irrelevant.&lt;br /&gt;
** '''image''': an image to display next to the description in the advancement menu.&lt;br /&gt;
** '''max_times''': default 1.  The maximum times the unit can be awarded this advancement. Pass -1 for &amp;quot;unlimited&amp;quot;.&lt;br /&gt;
** '''strict_amla''':  (yes|no) default=no. Disable the AMLA if the unit can advance to another unit.&lt;br /&gt;
** '''require_amla''': An optional list of AMLA ''id'' keys that act as prerequisites for this advancement to become available.  Order is not important, and an AMLA id can be repeated any number of times to indicate that another advancement must be chosen several times before this advancement option will become available.&lt;br /&gt;
*** example: &amp;lt;tt&amp;gt;require_amla=tough,tough,incr_damage&amp;lt;/tt&amp;gt; assumes there exist other [advancement] options called ''id=tough'' and ''id=incr_damage''.  Once ''tough'' is chosen twice and ''incr_damage'' is chosen once, then the current [advancement] will become available.&lt;br /&gt;
*** ''require_amla=tough,incr_damage,tough'' is an equivalent way of expressing this.&lt;br /&gt;
** '''[effect]''': A modification applied to the unit whenever this advancement is chosen.  See [[EffectWML]]&lt;br /&gt;
&lt;br /&gt;
== Attacks ==&lt;br /&gt;
* '''[attack]''': one of the unit's attacks.&lt;br /&gt;
** '''description''': a translatable text for name of the attack, to be displayed to the user.&lt;br /&gt;
** '''name''': the name of the attack. Used as a default description, if ''description'' is not present, and to determine the default icon, if ''icon'' is not present (if ''name=x'' then ''icon=attacks/x.png'' is assumed unless present).  Non-translatable.  Used for the ''has_weapon'' key and animation filters; see [[StandardUnitFilter]] and [[AnimationWML]]&lt;br /&gt;
** '''type''': the damage type of the attack.  Used in determining resistance to this attack (see {{tag|UnitsWML|movetype|resistance}}).&lt;br /&gt;
** '''[specials]''': contains the specials of the attack. See [[AbilitiesWML#The_.5Bspecials.5D_tag|AbilitiesWML]].&lt;br /&gt;
** '''icon''': the image to use as an icon for the attack in the attack choice menu, as a path relative to the images directory.&lt;br /&gt;
** '''range''': the range of the attack.  Used to determine the enemy's retaliation, which will be of the same type.  Also displayed on the status table in parentheses; 'melee'(default) displays &amp;quot;melee&amp;quot;, while 'ranged' displays &amp;quot;ranged&amp;quot;. Range can be anything. Standard values are now &amp;quot;melee&amp;quot; and &amp;quot;ranged&amp;quot;. From now on, ''short'' and ''long'' will be treated as totally different ranges. You can create any number of ranges now (with any name), and units can only retaliate against attacks for which they have a corresponding attack of the same range. This value is translatable.&lt;br /&gt;
** '''damage''': the damage of this attack&lt;br /&gt;
** '''number''': the number of strikes per attack this weapon has&lt;br /&gt;
** '''movement_used''': determines how many movement points using this attack expends. By default all movement is used up, set this to 0 to make attacking with this attack expend no movement.&lt;br /&gt;
** '''attack_weight''': helps the AI to choose which attack to use when attacking; highly weighted attacks are more likely to be used. Setting it to 0 disables the attack on attack&lt;br /&gt;
** '''defense_weight''': used to determine which attack is used for retaliation. This affects gameplay, as the player is not allowed to determine his unit's retaliation weapon. Setting it to 0 disable the attacks on defense &lt;br /&gt;
For the weight settings, the engine usually chooses the attack with the best average total damages * weight (default weight = 1.0).&lt;br /&gt;
&lt;br /&gt;
== Other tags ==&lt;br /&gt;
* '''[base_unit]''': Contains one attribute, '''id''', which must be the ID of a unit type.  If specified, the UnitTypeWML for that unit is copied into this one.  Attributes in this unit overwrite the copy. Tags modify the corresponding tag of the original, so for example the first '''[attack]''' tag in the derived unit would modify the first attack of the base unit rather than defining a new attack.&lt;br /&gt;
&lt;br /&gt;
* '''[portrait]''': Describes a unit portrait for dialogue. However, generally you should use the profile key instead; [portrait] is mostly for internal use.&lt;br /&gt;
** '''size''': The size of the portrait, in pixels.&lt;br /&gt;
** '''side''': One of left or right.&lt;br /&gt;
** '''mirror''': Whether to flip the image horizontally.&lt;br /&gt;
** '''image''': The image path.&lt;br /&gt;
&lt;br /&gt;
* '''[abilities]''': Defines the abilities of a unit. See [[AbilitiesWML]]&lt;br /&gt;
&lt;br /&gt;
* '''[event]''': Any [event] written inside the [unit_type] tag will get included into any scenario where a unit of this type appears in. Note that such events get included when a unit of this type first appears in the scenario, not automatically when the scenario begins (meaning that ''name=prestart'' events, for example, would usually never trigger). See [[EventWML]] and [[WML_Abilities]]&lt;br /&gt;
&lt;br /&gt;
* '''[variation]''': Defines a variation of a unit. Variations are invoked with an [effect] tag or the variation= attribute in [[SingleUnitWML]]. They are currently used for graphical variations (giving character sprites new weapons) but theoretically you could do anything with it.&lt;br /&gt;
** '''variation_name''': The name of the variation.&lt;br /&gt;
** '''inherit''': if ''yes'', inherits all the properties of the base unit, which are then overwritten by the keys and tags of this variation. Defaults to no.&lt;br /&gt;
*** {{DevFeature1.11}} The '''id''' key is always inherited, regardless of the value of '''inherit'''.&lt;br /&gt;
** All keys and tags of '''[unit_type]''', except ''[advancefrom]'', ''[base_unit]'', ''[female]'', ''[male]'', and ''[variation]''. A special case is the '''id''' key, for which support is incomplete. If '''id''' is set for a variation, then it applies when filtering existing units (including the breakdown of units in the &amp;quot;damage versus&amp;quot; tooltip), but it cannot be used to create a new unit. For reliable behavior, '''id''' should match the parent type's id. {{DevFeature1.11}} Changing the id for a variation is fully supported starting in 1.11.2.&lt;br /&gt;
&lt;br /&gt;
* '''[male]''', '''[female]''': These can specify a variation based on gender for a unit. If these are provided, they will automatically apply based upon the gender of a unit.&lt;br /&gt;
** '''inherit''': if ''yes'', inherits all the properties of the base unit. Defaults to yes.&lt;br /&gt;
*** {{DevFeature1.11}} The '''id''' key is always inherited, regardless of the value of '''inherit'''.&lt;br /&gt;
** All '''[unit_type]''' tags and keys, excluding ''[advancefrom]'', ''[base_unit]'', ''[female]'', and ''[male]''. A special case is the '''id''' key, for which support is incomplete. If '''id''' is set for a variation, then it applies when filtering existing units (including the breakdown of units in the &amp;quot;damage versus&amp;quot; tooltip), but it cannot be used to create a new unit. For reliable behavior, '''id''' should match the parent type's id. {{DevFeature1.11}} Changing the id for a variation is fully supported starting in 1.11.2.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[AnimationWML]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
* [[TerrainWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=UnitTypeWML&amp;diff=51725</id>
		<title>UnitTypeWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=UnitTypeWML&amp;diff=51725"/>
		<updated>2013-08-03T17:31:07Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Each '''[unit_type]''' tag defines one unit type. (for the use of [unit] to create a unit, see [[SingleUnitWML]])&lt;br /&gt;
&lt;br /&gt;
Unit animation syntax is described in [[AnimationWML]]. In addition to the animation tags described there, the following key/tags are recognized:&lt;br /&gt;
* '''[advancefrom]''': Defines the previous unit type on the advancement tree. Allows a campaign-specific unit to be spliced into an already existing advancement tree.  It should generally be used only inside a campaign ifdef, to prevent changes to other campaigns.  This tag makes changes to the ''advances_to'' and ''experience'' keys of a base unit to make it advance into this unit.  It takes these keys:&lt;br /&gt;
** ''unit'': the id of the base unit from which this unit advances.  This adds the unit into the list of units which ''unit'' can advance into.&lt;br /&gt;
** ''experience'': (optional) If present the experience needed to advance is set to this value. If there are more than one [advancefrom] tags referencing the same base unit within the same preprocessor scope (e.g. a campaign #ifdef) with experience= keys, the lowest value of these is chosen.  Note: this will also lower the experience required to advance to other units which the base unit can advance into.&lt;br /&gt;
: If the previous unit type makes use of '''[male]''' and/or '''[female]''' tags, then the current (new) unit type is expected to also. That is, the subtypes defined by those tags will only receive this advancement if the new type has a corresponding tag.&lt;br /&gt;
* '''advances_to''': When this unit has ''experience'' greater than or equal to ''experience'', it is replaced by a unit of the type that the value of ''advances_to'' refers to. All modifications that have been done to the unit are applied to the unit it is replaced by. The special value 'null' says that the unit does not advance but gets an AMLA instead. Can be a comma-separated list of units that can be chosen from upon advancing.&lt;br /&gt;
* '''alignment''': one of lawful/neutral/chaotic/liminal (See [[TimeWML]]). Default is &amp;quot;neutral&amp;quot;.&lt;br /&gt;
* '''attacks''': the number of times that this unit can attack each turn.&lt;br /&gt;
* '''cost''': when a player recruits a unit of this type, the player loses ''cost'' gold. If this would cause gold to drop below 0,  the unit cannot be recruited.&lt;br /&gt;
* '''description''': (translatable) the text displayed in the unit descriptor box for this unit. Default 'No description available...'. &lt;br /&gt;
* '''do_not_list''': Not used by the game, but by tools for browsing and listing the unit tree. If this is 'yes', the unit will be ignored by these tools. &lt;br /&gt;
* '''ellipse''': the ellipse image to display under the unit, which is normally team-colored. Default is &amp;quot;misc/ellipse&amp;quot;; &amp;quot;-nozoc&amp;quot; and &amp;quot;-leader&amp;quot; are automatically appended for units without zone of control and with canrecruit=yes respectively. The [http://www.wesnoth.org/macro-reference.xhtml#IS_HERO IS_HERO]/[http://www.wesnoth.org/macro-reference.xhtml#MAKE_HERO MAKE_HERO]/[http://www.wesnoth.org/macro-reference.xhtml#UNMAKE_HERO UNMAKE_HERO] macros change the ellipse to/back from &amp;quot;misc/ellipse-hero&amp;quot;.&lt;br /&gt;
* '''experience''': When this unit has experience greater than or equal to ''experience'', it is replaced by a unit with 0 experience of the type that the value of ''advances_to'' refers to. All modifications that have been done to the unit are applied to the unit it is replaced by.&lt;br /&gt;
* '''flag_rgb''': usually set by [http://www.wesnoth.org/macro-reference.xhtml#MAGENTA_IS_THE_TEAM_COLOR MAGENTA_IS_THE_TEAM_COLOR]; specifies the colours in the base flag to use for team-colouring the unit, expressed as a colour name (such as magenta) or a comma-separated list of RGB values (in hex format).&lt;br /&gt;
* '''gender''': has a value of either ''male'' or ''female'', and determines which of the keys ''male_names'' and ''female_names''  should be read. When a unit of this type is recruited, it will be randomly assigned a name by the random name generator, which will use these names as a base.&lt;br /&gt;
* '''hide_help''': determines if the unit type will appear in the in-game help. Possible values ''true'' and ''false'', defaults to ''false''.&lt;br /&gt;
* '''hitpoints''': the maximum HP that the unit has, and the HP it has when it is created.&lt;br /&gt;
* '''id''': the value of the ''type'' key for units of this type. This is required and must be unique among all [unit_type] tags. An ''id'' should consist only of alphanumerics and spaces (or underscores). ''type'' keys are found in [[SingleUnitWML]] and [[FilterWML]]. For example, id=Drake Flare&lt;br /&gt;
::WARNING : characters &amp;quot;$&amp;quot;, &amp;quot;&amp;amp;&amp;quot;, &amp;quot;*&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;(&amp;quot; and &amp;quot;)&amp;quot; are illegal for use in the unit type id and must be avoided because they might lead to corrupted saved games&lt;br /&gt;
*'''ignore_race_traits''': 'yes' or 'no' (default). Determines whether racial traits (see [[UnitsWML]]) are applied. &lt;br /&gt;
* '''image''': sets the base image of the unit, which is used on the map.&lt;br /&gt;
* '''image_icon''': sets the image used to represent the unit in areas such as the attack dialog and the unit image box in the sidebar&lt;br /&gt;
* '''level''': the amount of upkeep the unit costs.  After this unit fights, its opponent gains ''level'' experience. See also kill_experience ([[GameConfigWML]]), and leadership ([[AbilitiesWML]]).&lt;br /&gt;
* '''movement''': the number of move points that this unit receives each turn.&lt;br /&gt;
* '''movement_type''': See [[UnitsWML#.5Bmovetype.5D|movetype]]. Note that the tags '''[movement_costs]''', '''[vision_costs]''', '''[defense]''', and '''[resistance]''' can be used to modify this movetype.&lt;br /&gt;
* '''name''':(translatable) displayed in the Status Table for units of this type.&lt;br /&gt;
* '''num_traits''': the number of traits that units of this type should receive when they are recruited, overriding the value set in the [race] tag.&lt;br /&gt;
* '''profile''': the portrait image to use for this unit type. You can also set a portrait for an individual unit instead of the whole unit type (see [[SingleUnitWML]]). The engine first looks for the image in the transparent subdirectory and if found that image is used. If not found it will use the image as-is. Depending on the size the engine will or will not scale the image, the cutoff currently is at 300x300. For images which should only be shown on the right side in the dialog append ~RIGHT() to the image.&lt;br /&gt;
* '''small_profile''': the image to use when a smaller portrait is needed than the one used for messages (e.g., in the help system). When this attribute is missing, the value of the '''profile''' attribute is used instead. When present, the heuristic for finding a transparent portrait is disabled for the '''profile''' attribute, so the correct '''profile''' should be set too. Note that image modifiers are allowed; they might be useful for cropping and rescaling a portrait:&lt;br /&gt;
 small_profile=&amp;quot;portraits/elves/transparent/marksman+female.png~CROP(0,20,380,380)~SCALE(205,205)&amp;quot;&lt;br /&gt;
 profile=&amp;quot;portraits/elves/transparent/marksman+female.png&amp;quot;&lt;br /&gt;
* '''race''': See {{tag|UnitsWML|race}}.  Also used in standard unit filter (see [[FilterWML]]).&lt;br /&gt;
* '''undead_variation''': When a unit of this type is killed by a weapon with the plague special, this variation is applied to the new plague unit that is created, whatever its type. For example, if the plague special creates Walking Corpses and undead_variation is set to &amp;quot;troll&amp;quot;, you'll get a troll Walking Corpse. Defaults to the undead_variation set in this unit type's race.&lt;br /&gt;
* '''usage''': the way that the AI should recruit this unit, as determined by the scenario designer. (See ''recruitment_pattern'', [[AiWML]]).  The following are conventions on usage:&amp;lt;br&amp;gt; ** ''scout'': Fast, mobile unit meant for exploration and village grabbing.&amp;lt;br&amp;gt; ** ''fighter'': Melee fighter, melee attack substantially more powerful than ranged.&amp;lt;br&amp;gt; ** ''archer'': Ranged fighter, ranged attack substantially more powerful than melee.&amp;lt;br&amp;gt; ** ''mixed fighter'': Melee and ranged fighter, melee and ranged attacks roughly equal.&amp;lt;br&amp;gt; ** ''healer'': Specialty 'heals' or 'cures'.&amp;lt;br&amp;gt;Note that this field primarily affects recruitment.  It also has a small effect on unit movement (the AI tries to keep scouts away from enemies, to some extent).  It does not affect the AI's behavior in combat; that is always computed from attack power and hitpoints. Non-standard usages may be used as well.&lt;br /&gt;
* '''vision''': the number of vision points to calculate the unit's sight range. Defaults to ''movement'' if not present.{{DevFeature1.11}}&lt;br /&gt;
* '''zoc''': if &amp;quot;yes&amp;quot; the unit will have a zone of control regardless of level.  If present but set to anything other than &amp;quot;yes,&amp;quot; the unit will have no zone of control.  If the tag is omitted, zone of control is dictated by unit level (level 0 = no zoc, level 1+ = has zoc).&lt;br /&gt;
&lt;br /&gt;
== After max level advancement (AMLA) ==&lt;br /&gt;
* '''[advancement]''': describes what happens to a unit when it reaches the XP required for advancement.  It is considered as an advancement in the same way as advancement described by '''advances_to'''; however, if the player chooses this advancement, the unit will have one or more effects applied to it instead of advancing.&lt;br /&gt;
** '''id''': unique identifier for this advancement; ''Required'' if there are multiple advancement options, or if ''strict_amla=no''.&lt;br /&gt;
** '''always_display''': if set to true displays the AMLA option even if it is the only available one.&lt;br /&gt;
** '''description''': a description (see [[DescriptionWML]]) displayed as the option for this advancement if there is another advancement option that the player must choose from; otherwise, the advancement is chosen automatically and this key is irrelevant.&lt;br /&gt;
** '''image''': an image to display next to the description in the advancement menu.&lt;br /&gt;
** '''max_times''': default 1.  The maximum times the unit can be awarded this advancement. Pass -1 for &amp;quot;unlimited&amp;quot;.&lt;br /&gt;
** '''strict_amla''':  (yes|no) default=no. Disable the AMLA if the unit can advance to another unit.&lt;br /&gt;
** '''require_amla''': An optional list of AMLA ''id'' keys that act as prerequisites for this advancement to become available.  Order is not important, and an AMLA id can be repeated any number of times to indicate that another advancement must be chosen several times before this advancement option will become available.&lt;br /&gt;
*** example: &amp;lt;tt&amp;gt;require_amla=tough,tough,incr_damage&amp;lt;/tt&amp;gt; assumes there exist other [advancement] options called ''id=tough'' and ''id=incr_damage''.  Once ''tough'' is chosen twice and ''incr_damage'' is chosen once, then the current [advancement] will become available.&lt;br /&gt;
*** ''require_amla=tough,incr_damage,tough'' is an equivalent way of expressing this.&lt;br /&gt;
** '''[effect]''': A modification applied to the unit whenever this advancement is chosen.  See [[EffectWML]]&lt;br /&gt;
&lt;br /&gt;
== Attacks ==&lt;br /&gt;
* '''[attack]''': one of the unit's attacks.&lt;br /&gt;
** '''description''': a translatable text for name of the attack, to be displayed to the user.&lt;br /&gt;
** '''name''': the name of the attack. Used as a default description, if ''description'' is not present, and to determine the default icon, if ''icon'' is not present (if ''name=x'' then ''icon=attacks/x.png'' is assumed unless present).  Non-translatable.  Used for the ''has_weapon'' key and animation filters; see [[StandardUnitFilter]] and [[AnimationWML]]&lt;br /&gt;
** '''type''': the damage type of the attack.  Used in determining resistance to this attack (see {{tag|UnitsWML|movetype|resistance}}).&lt;br /&gt;
** '''[specials]''': contains the specials of the attack. See [[AbilitiesWML#The_.5Bspecials.5D_tag|AbilitiesWML]].&lt;br /&gt;
** '''icon''': the image to use as an icon for the attack in the attack choice menu, as a path relative to the images directory.&lt;br /&gt;
** '''range''': the range of the attack.  Used to determine the enemy's retaliation, which will be of the same type.  Also displayed on the status table in parentheses; 'melee'(default) displays &amp;quot;melee&amp;quot;, while 'ranged' displays &amp;quot;ranged&amp;quot;. Range can be anything. Standard values are now &amp;quot;melee&amp;quot; and &amp;quot;ranged&amp;quot;. From now on, ''short'' and ''long'' will be treated as totally different ranges. You can create any number of ranges now (with any name), and units can only retaliate against attacks for which they have a corresponding attack of the same range. This value is translatable.&lt;br /&gt;
** '''damage''': the damage of this attack&lt;br /&gt;
** '''number''': the number of strikes per attack this weapon has&lt;br /&gt;
** '''movement_used''': determines how many movement points using this attack expends. By default all movement is used up, set this to 0 to make attacking with this attack expend no movement.&lt;br /&gt;
** '''attack_weight''': helps the AI to choose which attack to use when attacking; highly weighted attacks are more likely to be used. Setting it to 0 disables the attack on attack&lt;br /&gt;
** '''defense_weight''': used to determine which attack is used for retaliation. This affects gameplay, as the player is not allowed to determine his unit's retaliation weapon. Setting it to 0 disable the attacks on defense &lt;br /&gt;
For the weight settings, the engine usually chooses the attack with the best average total damages * weight (default weight = 1.0).&lt;br /&gt;
&lt;br /&gt;
== Other tags ==&lt;br /&gt;
* '''[base_unit]''': Contains one attribute, '''id''', which must be the ID of a unit type.  If specified, the UnitTypeWML for that unit is copied into this one.  Attributes in this unit overwrite the copy. Tags modify the corresponding tag of the original, so for example the first '''[attack]''' tag in the derived unit would modify the first attack of the base unit rather than defining a new attack.&lt;br /&gt;
&lt;br /&gt;
* '''[portrait]''': Describes a unit portrait for dialogue. However, generally you should use the profile key instead; [portrait] is mostly for internal use.&lt;br /&gt;
** '''size''': The size of the portrait, in pixels.&lt;br /&gt;
** '''side''': One of left or right.&lt;br /&gt;
** '''mirror''': Whether to flip the image horizontally.&lt;br /&gt;
** '''image''': The image path.&lt;br /&gt;
&lt;br /&gt;
* '''[abilities]''': Defines the abilities of a unit. See [[AbilitiesWML]]&lt;br /&gt;
&lt;br /&gt;
* '''[event]''': Any [event] written inside the [unit_type] tag will get included into any scenario where a unit of this type appears in. Note that such events get included when a unit of this type first appears in the scenario, not automatically when the scenario begins (meaning that ''name=prestart'' events, for example, would usually never trigger). See [[EventWML]] and [[WML_Abilities]]&lt;br /&gt;
&lt;br /&gt;
* '''[variation]''': Defines a variation of a unit. Variations are invoked with an [effect] tag or the variation= attribute in [[SingleUnitWML]]. They are currently used for graphical variations (giving character sprites new weapons) but theoretically you could do anything with it.&lt;br /&gt;
** '''variation_name''': The name of the variation.&lt;br /&gt;
** '''inherit''': if ''yes'', inherits all the properties of the base unit, which are then overwritten by the keys and tags of this variation. Defaults to no.&lt;br /&gt;
*** {{DevFeature1.11}} The '''id''' key is always inherited, regardless of the value of '''inherit'''.&lt;br /&gt;
** All keys and tags of '''[unit_type]''', except ''[advancefrom]'', ''[base_unit]'', ''[female]'', ''[male]'', and ''[variation]''. A special case is the '''id''' key, for which support is incomplete. If '''id''' is set for a variation, then it applies when filtering existing units (including the breakdown of units in the &amp;quot;damage versus&amp;quot; tooltip), but it cannot be used to create a new unit. For reliable behavior, '''id''' should match the parent type's id. {{DevFeature1.11}} Changing the id for a variation is fully supported starting in 1.11.2.&lt;br /&gt;
&lt;br /&gt;
* '''[male]''', '''[female]''': These can specify a variation based on gender for a unit. If these are provided, they will automatically apply based upon the gender of a unit.&lt;br /&gt;
** '''inherit''': if ''yes'', inherits all the properties of the base unit. Defaults to yes.&lt;br /&gt;
*** {{DevFeature1.11}} The '''id''' key is always inherited, regardless of the value of '''inherit'''.&lt;br /&gt;
** All '''[unit_type]''' tags and keys, excluding ''[advancefrom]'', ''[base_unit]'', ''[female]'', and ''[male]''. A special case is the '''id''' key, for which support is incomplete. If '''id''' is set for a variation, then it applies when filtering existing units (including the breakdown of units in the &amp;quot;damage versus&amp;quot; tooltip), but it cannot be used to create a new unit. For reliable behavior, '''id''' should match the parent type's id. {{DevFeature1.11}} Changing the id for a variation is fully supported starting in 1.11.2.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[AnimationWML]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
* [[TerrainWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ModificationWML&amp;diff=51378</id>
		<title>ModificationWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ModificationWML&amp;diff=51378"/>
		<updated>2013-06-10T15:16:31Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
== The [modification] toplevel tag ==&lt;br /&gt;
&lt;br /&gt;
{{DevFeature1.11}} This tag describes a multiplayer modification. A modification is practically a bunch of events which get included into the scenario if the modification is enabled.&lt;br /&gt;
&lt;br /&gt;
The following keys/tags are recognized for '''[modification]''':&lt;br /&gt;
&lt;br /&gt;
* '''id''': identifier for the modification. Must be unique.&lt;br /&gt;
* '''name''': the name of the modification, as displayed to the user.&lt;br /&gt;
* '''description''': a brief description for the modification.&lt;br /&gt;
* '''allow_scenario''': a list of scenario ids. Only the scenarios with matching ids will be allowed to be played with this modification.&lt;br /&gt;
* '''disallow_scenario''': a list of scenario ids. Only the scenarios with matching ids will not be allowed to be played with this modification. Cannot be used in parallel with allow_scenario.&lt;br /&gt;
* '''allow_era''': same as allow_scenario, but for eras.&lt;br /&gt;
* '''disallow_era''': same as disallow_scenario, but for eras. Can't be used with allow_era.&lt;br /&gt;
* '''allow_modification''': same as allow_scenario, but for modifications.&lt;br /&gt;
* '''disallow_modification''': same as disallow_scenario, but for modifications. Can't be used with allow_modification.&lt;br /&gt;
* '''ignore_incompatible_scenario''': a list of scenario ids. The scenarios with matching ids will be considered compatible with this modification regardless their dependencies.&lt;br /&gt;
* '''ignore_incompatible_era''': same as ignore_incompatible_scenario, but for eras.&lt;br /&gt;
* '''ignore_incompatible_modification''': same as ignore_incompatible_scenario, but for modifications.&lt;br /&gt;
* '''require_modification''': a boolean value; if set to yes, all players have to have this modification installed to join the game. Default no.&lt;br /&gt;
* '''[event]''': any [event] children written inside the [modification] tag will get included into scenarios that are played with this modification enabled. See [[EventWML]].&lt;br /&gt;
* '''[options]''': custom options. See [[OptionWML]] for details.&lt;br /&gt;
* '''[ai]''': See [[AiWML]] for details.&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=EraWML&amp;diff=51377</id>
		<title>EraWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=EraWML&amp;diff=51377"/>
		<updated>2013-06-10T14:16:44Z</updated>

		<summary type="html">&lt;p&gt;AI: /* The [era] top level tag */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{WML Tags}}&lt;br /&gt;
== The [era] top level tag ==&lt;br /&gt;
&lt;br /&gt;
This tag describes one era. An era is a set of teams to play in multiplayer.&lt;br /&gt;
&lt;br /&gt;
In the multiplayer game creation screen, an era is chosen by the host by the 'Era' option button.&lt;br /&gt;
&lt;br /&gt;
The following key/tags are recognized for '''[era]'''&lt;br /&gt;
* '''id''': ID of the era - must be unique. No gameplay effect&lt;br /&gt;
* '''name''': displayed name of the era.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;require_era&amp;quot;&amp;gt;'''require_era'''&amp;lt;/span&amp;gt;: whether clients are required to have this era installed beforehand to be allowed join a game using this era. Possible values 'yes' (the default) and 'no'.&lt;br /&gt;
* '''allow_scenario''': {{DevFeature1.11}} a list of scenario ids. Only the scenarios with matching ids will be allowed to be played with this era.&lt;br /&gt;
* '''disallow_scenario''': {{DevFeature1.11}} a list of scenario ids. Only the scenarios with matching ids will not be allowed to be played with this era. Cannot be used in parallel with allow_scenario.&lt;br /&gt;
* '''ignore_incompatible_scenario''': {{DevFeature1.11}} a list of scenario ids. The scenarios with matching ids will be considered compatible with this era regardless their dependencies.&lt;br /&gt;
* '''allow_modification''': {{DevFeature1.11}} same as allow_scenario, but for modifications.&lt;br /&gt;
* '''disallow_modification''': {{DevFeature1.11}} same as disallow_scenario, but for modifications. Cannot be used in parallel with allow_modification.&lt;br /&gt;
* '''ignore_incompatible_modification''': {{DevFeature1.11}} same as ignore_incompatible_scenario, but for modifications.&lt;br /&gt;
* '''force_modification''': {{DevFeature1.11}} a list of modification ids. The specified modifications must be enabled to play this era.&lt;br /&gt;
* '''[multiplayer_side]''': a faction in the era. This tag contains many of the same keys as a [side] tag (A description of the [side] tag can be found in [[SideWML]]). When a multiplayer game is played, then the [side] tag for the scenario is merged with the keys(currently, not tags) of the [multiplayer_side] tag of the faction which the side chose.&lt;br /&gt;
** '''id''': faction ID - must be unique to your era. No gameplay effect&lt;br /&gt;
** '''name''': a description that Wesnoth displays as the option selecting that faction; see [[DescriptionWML]]. Any image in this description will ''not'' use the team color.&lt;br /&gt;
** '''image''': an image to display in the option. This image will use the team color.&lt;br /&gt;
** '''flag_rgb''': often set by [http://www.wesnoth.org/macro-reference.xhtml#MAGENTA_IS_THE_TEAM_COLOR MAGENTA_IS_THE_TEAM_COLOR]&lt;br /&gt;
** '''leader''': a list of unit types. When this faction is chosen, the side can choose any of these unit types to be the side's leader (i.e. &amp;quot;Choose your Leader&amp;quot;). They will also have the option of having one of these types being chosen randomly.&lt;br /&gt;
** '''random_leader''': if this list of types is present, it would use this list to instead to choose a random leader. If not it would use '''leader'''&lt;br /&gt;
** '''random_faction''': default 'no'. If 'yes', then when this faction is chosen, another non random faction will be randomly chosen instead. The leader will also be chosen randomly.&lt;br /&gt;
** '''choices''': Empty by default. If non-empty and the faction has '''random_faction=yes''', it is the list of the IDs of the non random factions that will be choosen randomly. If empty, any faction can be chosen.&lt;br /&gt;
** '''except''': Empty by default. If the faction has random_faction=yes, it is the list of the IDs of the non random factions that will not be choosen randomly.&lt;br /&gt;
** '''type''': the unit type of the default leader for the side. This must be present. 'random' is a valid value here and will cause a random leader choice by default.&lt;br /&gt;
** '''recruit''': a comma-separated list of unit types this faction can recruit.&lt;br /&gt;
** '''terrain_liked''': an unseparated list of terrains (see [[TerrainCodesWML]]). On random maps, these terrains will determine which keep the side is assigned, attempting to put it near the listed terrains.&lt;br /&gt;
* '''[event]''': any [event]s written inside the [era] tag will get included into scenarios that are played using this era. See [[EventWML]].&lt;br /&gt;
* '''[options]''': {{DevFeature1.11}} custom options. See [[OptionWML]] for details.&lt;br /&gt;
* '''[ai]''': See [[AiWML]] for details.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
* [[SideWML]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=50977</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=50977"/>
		<updated>2013-05-10T19:30:27Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt (for everything except -C, which uses a read-only checkout)&lt;br /&gt;
* Administrator rights on github.com/wescamp (if you need to create new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the s&amp;amp;shy;&amp;amp;shy;v&amp;amp;shy;&amp;amp;shy;n invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the s&amp;amp;shy;&amp;amp;shy;v&amp;amp;shy;&amp;amp;shy;n version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
* -u ADDON uploads a single add-on to wescamp.&lt;br /&gt;
* -U uploads all translatable add-ons.&lt;br /&gt;
* -l lists all add-ons.&lt;br /&gt;
* -L lists all translatable add-ons.&lt;br /&gt;
* -c creates a normal checkout&lt;br /&gt;
* -C creates a read-only checkout (doesn't require any github credentials)&lt;br /&gt;
* -s SERVER is the hostname of the add-on server&lt;br /&gt;
* -p PORT is the port of the add-on server&lt;br /&gt;
* -w WESCAMP_CHECKOUT specifies the directory of the wescamp checkout (or where it will be created)&lt;br /&gt;
* -G USER:PASSWORD is your login to github. This argument is required if an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
** You can also use a github OAuth2 token instead of your username and password. This token must have the 'repo' scope.&lt;br /&gt;
** This option can still be useful if no repositories are created. Github has a limit of 60 API requests per hour if you are not logged in, or 5000 if you are.&lt;br /&gt;
* -b BUILD_SYSTEM_CHECKOUT can be used to specify a build-system checkout&lt;br /&gt;
* -B BRANCH can be used to specify the version we're syncing. This overrides the -w derived branch. It can also be used as a fallback for when -p isn't given, but there are some issues with that (see below).&lt;br /&gt;
* -e ERROR_LOG can be used to specify a file to save all errors to. This is useful for log storage and automated runs.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp/branch-1.10/ -c&lt;br /&gt;
This makes a fresh checkout of all translatable 1.10 add-ons in the specified directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown&lt;br /&gt;
An existing checkout of the Invasion_from_the_Unknown-1.10 repository in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/ is updated.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -G USER:PASSWORD&lt;br /&gt;
The directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github. After this command it will be on github and a checkout will be in the directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/branch-1.10/ -U -G longhexadecimalstringthatisanoath2bearertoken&lt;br /&gt;
Updates all 1.10 add-ons. If they are not yet on wescamp, a new repository will be created for them.&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
GitHub has a 60 requests per hour limit if you do not pass authentication info. If you do, this limit is raised to 5000. It is possible to hit the 60-requests limit doing read-only operations, so it's a good habit to always use -G.&lt;br /&gt;
&lt;br /&gt;
The -B option will override the -w derived github version just fine, but doesn't work well as a addon-server version. This is because addon-server development version uses the development branch version (e.g. 1.11), while on github we use the version of the stable it will become (e.g. 1.12). So when using -B, you should still use -p.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=50976</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=50976"/>
		<updated>2013-05-10T19:24:34Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Invocation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt (for everything except -C, which uses a read-only checkout)&lt;br /&gt;
* Administrator rights on github.com/wescamp (if you need to create new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the s&amp;amp;shy;&amp;amp;shy;v&amp;amp;shy;&amp;amp;shy;n invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the s&amp;amp;shy;&amp;amp;shy;v&amp;amp;shy;&amp;amp;shy;n version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
* -u ADDON uploads a single add-on to wescamp.&lt;br /&gt;
* -U uploads all translatable add-ons.&lt;br /&gt;
* -l lists all add-ons.&lt;br /&gt;
* -L lists all translatable add-ons.&lt;br /&gt;
* -c creates a normal checkout&lt;br /&gt;
* -C creates a read-only checkout (doesn't require any github credentials)&lt;br /&gt;
* -s SERVER is the hostname of the add-on server&lt;br /&gt;
* -p PORT is the port of the add-on server&lt;br /&gt;
* -w WESCAMP_CHECKOUT specifies the directory of the wescamp checkout (or where it will be created)&lt;br /&gt;
* -G USER:PASSWORD is your login to github. This argument is required if an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
** You can also use a github OAuth2 token instead of your username and password. This token must have the 'repo' scope.&lt;br /&gt;
** This option can still be useful if no repositories are created. Github has a limit of 60 API requests per hour if you are not logged in, or 5000 if you are.&lt;br /&gt;
* -b BUILD_SYSTEM_CHECKOUT can be used to specify a build-system checkout&lt;br /&gt;
* -B BRANCH can be used to specify the version we're syncing. This overrides the -w derived branch. It can also be used as a fallback for when -p isn't given, but there are some issues with that (see below).&lt;br /&gt;
* -e ERROR_LOG can be used to specify a file to save all errors to. This is useful for log storage and automated runs.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp/branch-1.10/ -c&lt;br /&gt;
This makes a fresh checkout of all translatable 1.10 add-ons in the specified directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown&lt;br /&gt;
An existing checkout of the Invasion_from_the_Unknown-1.10 repository in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/ is updated.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -G USER:PASSWORD&lt;br /&gt;
The directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github. After this command it will be on github and a checkout will be in the directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/branch-1.10/ -U -G longhexadecimalstringthatisanoath2bearertoken&lt;br /&gt;
Updates all 1.10 add-ons. If they are not yet on wescamp, a new repository will be created for them.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=EasyCoding&amp;diff=47941</id>
		<title>EasyCoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=EasyCoding&amp;diff=47941"/>
		<updated>2012-11-28T00:48:12Z</updated>

		<summary type="html">&lt;p&gt;AI: Already done&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Foreword ==&lt;br /&gt;
This page is here to document easy to do coding tasks. It is not here to double the feature request database, and should only be filled by people that know the code well enough to judge the difficulty of a given task. &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. 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 are too long at working on a feature I'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....)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Boucman|Boucman]] 20:48, 3 October 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since bugs are sometimes a good opportunity to get a first idea of the code, i will add some here that are easy to fix as soon as i stumble upon them (the one i had in mind is fixed already ;-).&lt;br /&gt;
&lt;br /&gt;
--Yogi Bear, 28 February 2008&lt;br /&gt;
&lt;br /&gt;
== MP related features ==&lt;br /&gt;
=== Add possibility to give reason for &amp;quot;ignore&amp;quot; ===&lt;br /&gt;
As per FR #16001 [https://gna.org/bugs/?16001]&lt;br /&gt;
&lt;br /&gt;
on it - uzyszkodnik 31.03.2012&lt;br /&gt;
&lt;br /&gt;
== WML related features ==&lt;br /&gt;
&lt;br /&gt;
=== WML configurable village income / upkeep ===&lt;br /&gt;
Preferably as a [scenario], [side] or [campaign] keys. As per FR #6301 [https://gna.org/bugs/?6301].&lt;br /&gt;
&lt;br /&gt;
--[[User:Gabba|Gabba]] 19 March 2012 : This is currently assigned to me, but as I lack time and interest to finish integrating this, GSoC students or other interested coders are welcome to take up the current patch and finish the job: https://gna.org/patch/?1381&lt;br /&gt;
&lt;br /&gt;
=== Add support of [if] for [scenario] ===&lt;br /&gt;
As per FR #4539 [https://gna.org/bugs/?4539]&lt;br /&gt;
&lt;br /&gt;
=== Side-specific results ===&lt;br /&gt;
Giving result=defeat or result=victory for specific sides. ([http://gna.org/bugs/index.php?4960 FR #4960]) -- [[User:dlr365|dlr365]] -- patch submitted [https://gna.org/bugs/index.php?4960]&lt;br /&gt;
&lt;br /&gt;
--[[User:Boucman|Boucman]] 08:58, 28 February 2010 (UTC) Patch seems abandonned, but can be used for further work feel free to take over the FR&lt;br /&gt;
&lt;br /&gt;
=== Support for leaderless multiplayergames ===&lt;br /&gt;
Add support for the WML key victory_when_enemies_defeated= in the scenario tag during multiplayergames. ([https://gna.org/bugs/index.php?8106 FR #8106])&lt;br /&gt;
--[[User:Endercoaster|endercoaster]] 30, March 2010. I'm gonna give this one a try.&lt;br /&gt;
&lt;br /&gt;
=== Support for standalone multiplayer scenarios ===&lt;br /&gt;
There used to be support for standalone scenarios in the userdata tree, in reorganising the trees this feature got lost and an add-on is now required to add a scenario.&lt;br /&gt;
Re-add this feature. It is probably a good idea to mirror the mainline multiplayer tree.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Support variable recall cost in wml ===&lt;br /&gt;
see https://gna.org/bugs/?16538&lt;br /&gt;
&lt;br /&gt;
the syntax needs to be discussed and refined, but the overall idea is good&lt;br /&gt;
&lt;br /&gt;
make sure to update whiteboard to handle this correctly&lt;br /&gt;
&lt;br /&gt;
Ask Boucman&lt;br /&gt;
&lt;br /&gt;
=== Other Ideas ===&lt;br /&gt;
See [[FutureWML]]; some ideas there are easier than others.&lt;br /&gt;
&lt;br /&gt;
== Improvements to AI ==&lt;br /&gt;
&lt;br /&gt;
Fix some todos, add new formula functions, or do minor improvements to the formula language. Make it easier to debug the formula language, add more ai components.&lt;br /&gt;
&lt;br /&gt;
Please discuss these with Crab, Dragonking, Sirp or Boucman&lt;br /&gt;
&lt;br /&gt;
=== Add more ai actions ===&lt;br /&gt;
&lt;br /&gt;
Add an ai action (and add lua function to do that) to set a goto on a unit&lt;br /&gt;
&lt;br /&gt;
--[[User:Teugon|Teugon]] 00:32, 4 April 2012 (UTC) &lt;br /&gt;
&lt;br /&gt;
Add an ai action (and add lua function to do that) to send a chat message to a player&lt;br /&gt;
&lt;br /&gt;
--[[User:Tyrannodogg|Tyrannodogg]] 11:48, 5 April 2012 (UTC) &lt;br /&gt;
&lt;br /&gt;
Add an ai action  (and add lua function to do that) to use a right-click menu item.&lt;br /&gt;
&lt;br /&gt;
There is also [[Practical_Guide_to_Modifying_AI_Behavior#Ideas_for_Potentially_Easy_AI_Patches|this list]] of (unapproved) and (potentially) easy AI feature requests.&lt;br /&gt;
&lt;br /&gt;
=== write a (fai or c++ or lua) candidate action for leader control ===&lt;br /&gt;
&lt;br /&gt;
== GUI related features ==&lt;br /&gt;
-------------------&lt;br /&gt;
&lt;br /&gt;
Note at the moment Mordante is working on a new GUI system, these &lt;br /&gt;
changes will probably affect the way these items need to be implemented.&lt;br /&gt;
Contact Mordante on IRC before starting to work on these.&lt;br /&gt;
  &lt;br /&gt;
--[[User:SkeletonCrew|SkeletonCrew]] 14:04, 9 March 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Theme Changes ===&lt;br /&gt;
&lt;br /&gt;
* allow custom themes to display values of WML variables ([http://gna.org/bugs/index.php?6209 FR #6209])&lt;br /&gt;
* hide the hourglass item from the statusbar when there is no timer&lt;br /&gt;
&lt;br /&gt;
=== Widget Changes ===&lt;br /&gt;
* show side number, name and team association information in the status table &lt;br /&gt;
* make games sortable in the lobby (open slots, total number of players, era, XP modifier, gold per village, fog/shroud) &lt;br /&gt;
* input history (chat, commands, ..) - note: rujasu is working on this feature&lt;br /&gt;
=== Story Screen improvements ===&lt;br /&gt;
see http://www.wesnoth.org/forum/viewtopic.php?p=439346#p439346 for the suggestion and https://gna.org/patch/?1587 for a patch that already touched that area heavily&lt;br /&gt;
&lt;br /&gt;
== GUI2 related features ==&lt;br /&gt;
GUI2 is the new gui engine Mordante/SkeletonCrew is working on. &lt;br /&gt;
* Information on the wiki can be found here http://www.wesnoth.org/wiki/GUIToolkit&lt;br /&gt;
* The source code is under src/gui/&lt;br /&gt;
* The configuration config files are under data/gui/default&lt;br /&gt;
&lt;br /&gt;
Some tasks need the --new-widgets since the code is only shown in the experimental mode. Tasks which need this switch have the * in the title.&lt;br /&gt;
&lt;br /&gt;
At the moment there are no easy tasks available.&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
&lt;br /&gt;
=== More powerful village naming ===&lt;br /&gt;
'''Adding mountain names and other features to village names, having a second random name in village names'''&lt;br /&gt;
&lt;br /&gt;
Currently the village naming engine has a very good structure that could allow &lt;br /&gt;
more powerfull names to be generated. &lt;br /&gt;
Understanding how it works should be quite easy, and a few usefull improvements could be added.&lt;br /&gt;
&lt;br /&gt;
* Currently villages can use lake names and river names, this should be extended to other features like bridges, swamps, mountains etc...&lt;br /&gt;
* It would be nice to have a separate list of &amp;quot;first sylabus&amp;quot; and &amp;quot;last sylabus&amp;quot; for naming. That's not really needed in english, but some translations could use it&lt;br /&gt;
* Again, it is common to have villages with more than one &amp;quot;random&amp;quot; word in them. having a $name2 variable would be nice&lt;br /&gt;
&lt;br /&gt;
Euschn 24/03/2009&lt;br /&gt;
&lt;br /&gt;
=== Debug Mode ===&lt;br /&gt;
* New debug command functionality (setting additional status.variables, possibly terrain)&lt;br /&gt;
&lt;br /&gt;
=== Add a cycle parameter to the unit animation WML ===&lt;br /&gt;
&lt;br /&gt;
Animations have a &amp;quot;cycle&amp;quot; internal parameter that decides if the animation loops when it finishes. &lt;br /&gt;
&lt;br /&gt;
Right now that parameter is decided purely by the engine depending on the circumstances, but it would make sense to move it to a frame paramter.&lt;br /&gt;
&lt;br /&gt;
This task is mainly to add a new boolean parameter in the particle class and using/exposing it to WML in a way similar to a unit_frame&lt;br /&gt;
&lt;br /&gt;
ask boucman for details&lt;br /&gt;
&lt;br /&gt;
== Bugs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
[[NotSoEasyCoding]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Future]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=47599</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=47599"/>
		<updated>2012-10-15T15:22:57Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt (for everything except -C, which uses a read-only checkout)&lt;br /&gt;
* Administrator rights on github.com/wescamp (if you need to create new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the svn invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the svn version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
* -u ADDON uploads a single add-on to wescamp.&lt;br /&gt;
* -U uploads all translatable add-ons.&lt;br /&gt;
* -l lists all add-ons.&lt;br /&gt;
* -L lists all translatable add-ons.&lt;br /&gt;
* -c creates a normal checkout&lt;br /&gt;
* -C creates a read-only checkout (doesn't require any github credentials)&lt;br /&gt;
* -s SERVER is the hostname of the add-on server&lt;br /&gt;
* -p PORT is the port of the add-on server&lt;br /&gt;
* -w WESCAMP_CHECKOUT specifies the directory of the wescamp checkout (or where it will be created)&lt;br /&gt;
* -G USER:PASSWORD is your login to github. This argument is required if an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
** You can also use a github OAuth2 token instead of your username and password. This token must have the 'repo' scope.&lt;br /&gt;
* -B BUILD_SYSTEM_CHECKOUT can be used to specify a build-system checkout&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp/branch-1.10/ -c&lt;br /&gt;
This makes a fresh checkout of all translatable 1.10 add-ons in the specified directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown&lt;br /&gt;
An existing checkout of the Invasion_from_the_Unknown-1.10 repository in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/ is updated.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -G USER:PASSWORD&lt;br /&gt;
The directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github. After this command it will be on github and a checkout will be in the directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/branch-1.10/ -U -G longhexadecimalstringthatisanoath2bearertoken&lt;br /&gt;
Updates all 1.10 add-ons. If they are not yet on wescamp, a new repository will be created for them.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=47598</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=47598"/>
		<updated>2012-10-15T15:21:55Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Invocation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt (for everything except -C, which uses a read-only checkout)&lt;br /&gt;
* Administrator rights on github.com/wescamp (if you need to create new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the svn invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the svn version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
* -u ADDON uploads a single add-on to wescamp.&lt;br /&gt;
* -U uploads all translatable add-ons.&lt;br /&gt;
* -l lists all add-ons.&lt;br /&gt;
* -L lists all translatable add-ons.&lt;br /&gt;
* -c creates a normal checkout&lt;br /&gt;
* -C creates a read-only checkout (doesn't require any github credentials)&lt;br /&gt;
* -s SERVER is the hostname of the add-on server&lt;br /&gt;
* -p PORT is the port of the add-on server&lt;br /&gt;
* -w WESCAMP_CHECKOUT specifies the directory of the wescamp checkout (or where it will be created)&lt;br /&gt;
* -G USER:PASSWORD is your login to github. This argument is required if an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
** You can also use a github OAuth2 token instead of your username and password. This token must have the 'repo' scope.&lt;br /&gt;
* -B BUILD_SYSTEM_CHECKOUT can be used to specify a build-system checkout&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp/branch-1.10/ -c&lt;br /&gt;
This makes a fresh checkout of all translatable 1.10 add-ons in the specified directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown&lt;br /&gt;
An existing checkout of the Invasion_from_the_Unknown-1.10 repository in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/ is updated.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -G USER:PASSWORD&lt;br /&gt;
The directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github. After this command it will be on github and a checkout will be in the directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/branch-1.10/ -U -G USER:PASSWORD&lt;br /&gt;
Updates all 1.10 add-ons. If they are not yet on wescamp, a new repository will be created for them.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=CampaignServerWML&amp;diff=47292</id>
		<title>CampaignServerWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=CampaignServerWML&amp;diff=47292"/>
		<updated>2012-09-23T16:31:12Z</updated>

		<summary type="html">&lt;p&gt;AI: Removed a 6-year old &amp;quot;current trunk only&amp;quot; statement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Campaign Server WML =&lt;br /&gt;
&lt;br /&gt;
This page describes the WML commands exchanged between campaign download clients and a campaign server. &lt;br /&gt;
&lt;br /&gt;
== Listing Available Campaigns ==&lt;br /&gt;
&lt;br /&gt;
This request is used to retrieve a list of campaigns available on the server and some overview information about them.&lt;br /&gt;
&lt;br /&gt;
* Request&lt;br /&gt;
** '''[request_campaign_list]'''&lt;br /&gt;
*** '''after''': only select campaigns last updated after the indicated time. ''after'' is in seconds relative to either the time when the command is processed or the [http://wikipedia.org/wiki/Unix_epoch Unix epoch]. As an example, to select campaigns last updated after Mon Oct 10 21:42:41 2005 GMT, you could not specify a value for ''times_relative_to'' (to use the default of relative to the [http://wikipedia.org/wiki/Unix_epoch Unix epoch]) and specify ''after'' = &amp;quot;1128980561&amp;quot;.&lt;br /&gt;
*** '''before''': only select campaigns last updated before the indicated time. ''before'' is in seconds relative to either the time when the command is processed or the [http://wikipedia.org/wiki/Unix_epoch Unix epoch]. As an example, to select campaigns last updated over a day ago, you could specify ''times_relative_to'' = &amp;quot;now&amp;quot; and ''before'' = &amp;quot;-86400&amp;quot;.&lt;br /&gt;
*** '''language''': return information only about campaigns that appear to be translated into this language. These names will normally be POSIX locale names. Typically you will want to either use a two letter language code (e.g. &amp;quot;de&amp;quot;) or a two letter language code followed by a two character region code (e.g. &amp;quot;pt_BR&amp;quot;). Note that &amp;quot;pt&amp;quot; will not match &amp;quot;pt_BR&amp;quot;.&lt;br /&gt;
*** '''name''': return information for this campaign. If the name is specified and not the empty string then only information about campaigns with matching names (unless something changes there will be at most one such campaign) will be returned.&lt;br /&gt;
*** '''times_relative_to''': &amp;quot;now&amp;quot; means that ''before'' and ''after'' are in seconds relative to the time when the request is processed by the campaign server. Any other value, or if it is not set, indicates that ''before'' and ''after'' are in seconds relative to the [http://wikipedia.org/wiki/Unix_epoch Unix epoch].&lt;br /&gt;
* Response&lt;br /&gt;
** '''timestamp''': what time the campaign server thought it was when this response was generated. You shouldn't count on this as a guaranty that no new campaigns will appear with previous update times. This could be used to detect significant clock skew or possibly used as an approximate time for how far you need to look back for updated campaigns.&lt;br /&gt;
** '''[campaigns]'''&lt;br /&gt;
*** '''[campaign]'''&lt;br /&gt;
**** '''author''': author(s) of the campaign.&lt;br /&gt;
**** '''dependencies''': list of add-on dependencies&lt;br /&gt;
**** ''description'': (current trunk only) description of the campaign. For pre 1.0 campaigns this should also describe the playability.&lt;br /&gt;
**** '''downloads''': the number times the campaign (including previous versions) has been downloaded directly from the campaign server.&lt;br /&gt;
**** '''filename''': filename campaign is stored in (currently the same as ''name'').&lt;br /&gt;
**** '''icon''': path to an image in the standard image directory for Wesnoth. This path must use forward slashes (/). It cannot refer to custom images included with the campaign. It is allowed to use [[ImagePathFunctionWML]]. This image is displayed as an icon by the campaign client built into Wesnoth.&lt;br /&gt;
**** '''name''': the name of the campaign. Note this is not the title and shouldn't have spaces in it.&lt;br /&gt;
**** '''size''': the size of the campaign in bytes on the campaign server.&lt;br /&gt;
**** '''timestamp''': when this version of the campaign was uploaded.&lt;br /&gt;
**** '''title''': campaign title. This is not a translatable string.&lt;br /&gt;
**** '''translate''': whether the campaign will be automatically send to wescamp and updated from wescamp.&lt;br /&gt;
**** '''uploads''': number of uploads (initial upload gets 1)&lt;br /&gt;
**** '''version''': version of the campaign. The recommended format is x.y.z where x, y and z are decimal strings. x should be 0 for campaigns that are not yet complete.&lt;br /&gt;
**** '''type''': indicates the type of the add-on, used for the downloads manager dialog. Possible values are described in [[PblWML]].&lt;br /&gt;
**** '''[translation]'''&lt;br /&gt;
***** '''language''': a language that this campaign has appeared to have been at least partially translated into. The following heuristic is used when a campaign is uploaded to extract a list of languages. The list of directories in the uploaded campaign is recursively searched. If a directory named 'LC_MESSAGES' is found then the name of the object containing this '''[dir]''' (normally the parent directory, but could be the campaign name if someone did something silly) is added to the list of translations. Directories named &amp;quot;LC_MESSAGES&amp;quot; are not searched for further matches. The normal naming convention is to use Posix locale names. This will usually be a two letter language code (e.g. &amp;quot;de&amp;quot;) or a two letter language code followed by a two letter region code (e.g. &amp;quot;pt_BR&amp;quot;). Since &amp;quot;en_US&amp;quot; is the base language, this language will not be listed as an available translation.&lt;br /&gt;
&lt;br /&gt;
== Downloading a Campaign ==&lt;br /&gt;
&lt;br /&gt;
This command is used to download a specified campaign from the campaign server.&lt;br /&gt;
&lt;br /&gt;
* Request&lt;br /&gt;
** '''[request_campaign]'''&lt;br /&gt;
*** '''name''': the name of the campaign. Note this is not the title and shouldn't have spaces in it.&lt;br /&gt;
* Response&lt;br /&gt;
** '''author''': author(s) of the campaign.&lt;br /&gt;
** '''campaign_name''': the name of the campaign. Note this is not the title and shouldn't have spaces in it.&lt;br /&gt;
** '''description''': description of the campaign. For pre 1.0 campaigns this should also describe the playability.&lt;br /&gt;
** '''icon''': path to an image in the standard image directory for Wesnoth. This path must use forward slashes (/). It cannot refer to custom images included with the campaign. It is allowed to use [[ImagePathFunctionWML]]. This image is displayed as an icon by the campaign client built into Wesnoth.&lt;br /&gt;
** '''name''': this field will always be empty. Client code would treat it as a directory name if it was not empty.&lt;br /&gt;
** '''timestamp''': the time the campaign was last uploaded to the campaign server. This is a decimal string containing the number of seconds since the unix epoch.&lt;br /&gt;
** '''title''': the title of the campaign. This is not a translatable string.&lt;br /&gt;
** '''version''': version of the campaign. The recommended format is x.y.z where x, y and z are decimal strings. x should be 0 for campaigns that are not yet complete.&lt;br /&gt;
** '''type''': indicates the type of the add-on, used for the downloads manager dialog. Possible values are described in [[PblWML]].&lt;br /&gt;
** '''[file]'''&lt;br /&gt;
*** '''name''': the name of the file. This does not include any path information.&lt;br /&gt;
*** '''contents''': the content of the file (binary data). This data should have no zero bytes. A byte with the code of 1 is an escape byte. The next byte will be data, but its value should be reduced by 1. Normally only byte codes of 0 and 1 are escaped.&lt;br /&gt;
** '''[dir]'''&lt;br /&gt;
*** '''name''': the name of the directory. This does not include any path information.&lt;br /&gt;
*** This tag may contain '''[file]''' or '''[dir]''' subtags (the latter are recursive).&lt;br /&gt;
&lt;br /&gt;
== Uploading a Campaign ==&lt;br /&gt;
&lt;br /&gt;
This command is used to upload a new or updated version of an add on campaign to the campaign server.&lt;br /&gt;
&lt;br /&gt;
* Request&lt;br /&gt;
** '''[upload]'''&lt;br /&gt;
*** '''author''': author(s) of the campaign.&lt;br /&gt;
*** '''description''': description of the campaign. For pre 1.0 campaigns this should also describe the playability.&lt;br /&gt;
*** '''icon''': path to an image in the standard image directory for Wesnoth. This path must use forward slashes (/). It cannot refer to custom images included with the campaign. It is allowed to use [[ImagePathFunctionWML]]. This image is displayed as an icon by the campaign client built into Wesnoth.&lt;br /&gt;
*** '''name''': the name of the campaign. Note this is not the title and shouldn't have spaces in it.&lt;br /&gt;
*** '''passphrase''': this is used to control updates to campaigns on the server. For existing campaigns, if the passphrase doesn't match, the update will be rejected. You can't easily change the passphrase yourself. If you lose or need to change the passphrase you need to contact the server administrator.&lt;br /&gt;
*** '''email''': it is used by campaign server administrators to contact authors in case of important problems with their add-ons (incompatibilities, broken data files, violation of server [[Distributing_content#License|policies]], etc.).&lt;br /&gt;
*** '''title''': the title of the campaign. This is not a translatable string.&lt;br /&gt;
*** '''version''': version of the campaign. The recommended format is x.y.z where x, y and z are decimal strings. x should be 0 for campaigns that are not yet complete.&lt;br /&gt;
*** '''type''': indicates the type of the add-on, used for the downloads manager dialog. Possible values are described in [[PblWML]].&lt;br /&gt;
*** '''[data]'''&lt;br /&gt;
**** '''[file]'''&lt;br /&gt;
***** '''name''': the name of the file. This does not include any path information.&lt;br /&gt;
***** '''contents''': the content of the file (binary data). This data should have no zero bytes. A byte with the code of 1 is an escape byte. The next byte will be data, but its value should be reduced by 1. Normally only byte codes of 0 and 1 are escaped.&lt;br /&gt;
**** '''[dir]'''&lt;br /&gt;
***** '''name''': the name of the directory. This does not include any path information.&lt;br /&gt;
***** This tag may contain '''[file]''' or '''[dir]''' subtags (the latter are recursive).&lt;br /&gt;
* Response&lt;br /&gt;
** '''[message]'''&lt;br /&gt;
*** '''message''': translatable string that indicates that the campaign upload was successful.&lt;br /&gt;
&lt;br /&gt;
== Changing the Passphrase for a Campaign ==&lt;br /&gt;
&lt;br /&gt;
This command is used to change the passphrase for a campaign. Currently the normal client doesn't have a way to use this. However, you can use the perl script campaign_passphrase.pl to do it, if you have a copy of the source tree.&lt;br /&gt;
&lt;br /&gt;
* Request&lt;br /&gt;
** '''[change_passphrase]'''&lt;br /&gt;
*** '''name''': The name of campaign.&lt;br /&gt;
*** '''passphrase''': The old passphrase.&lt;br /&gt;
*** '''new_passphrase''': The new passphrase.&lt;br /&gt;
* Respose&lt;br /&gt;
** '''[message]'''&lt;br /&gt;
*** '''message''': Translatable string that says that the passphrase was changed.&lt;br /&gt;
&lt;br /&gt;
== Deleting a Campaign ==&lt;br /&gt;
&lt;br /&gt;
This command is used to delete an existing campaign from the campaign server.&lt;br /&gt;
&lt;br /&gt;
* Request&lt;br /&gt;
** '''[delete]'''&lt;br /&gt;
*** '''name''': The name of the campaign to delete.&lt;br /&gt;
*** '''passphrase''': This must match the passphrase on record for the campaign or the master_password in order for the campaign to be deleted. Master_password.&lt;br /&gt;
* Response&lt;br /&gt;
** '''[message]'''&lt;br /&gt;
*** '''message''': Translatable string that says that the campaign was deleted.&lt;br /&gt;
&lt;br /&gt;
== Request License Information ==&lt;br /&gt;
&lt;br /&gt;
Retrieve the terms of the license used for any uploaded campaigns. You may not upload a campaign if you don't (or can't) aggree to the license. Wesnoth requires campaigns (including images and sound) to be licensed under the GPL. For more information on licensing, see [[Wesnoth:Copyrights]].&lt;br /&gt;
&lt;br /&gt;
* Request&lt;br /&gt;
** '''[request_terms]'''&lt;br /&gt;
* Response&lt;br /&gt;
** '''[message]'''&lt;br /&gt;
*** '''message''': translatable string containing the text of the license.&lt;br /&gt;
&lt;br /&gt;
== Developer commands ==&lt;br /&gt;
&lt;br /&gt;
* Request&lt;br /&gt;
** '''[validate_scripts]'''&lt;br /&gt;
*** '''name''': The name of the campaign to sign.&lt;br /&gt;
*** '''master_password''': The signing password.&lt;br /&gt;
* Response&lt;br /&gt;
** '''[message]'''&lt;br /&gt;
*** '''message''': Translatable(?) string that says that the campaign was signed.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[UserScenarios#Campaign_Server_Web_Access]]&lt;br /&gt;
* [[PblWML]]&lt;br /&gt;
* [[BuildingCampaignsThePBLFile]]&lt;br /&gt;
&lt;br /&gt;
[[Category:WML Reference]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=MultiplayerServerWML&amp;diff=47270</id>
		<title>MultiplayerServerWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=MultiplayerServerWML&amp;diff=47270"/>
		<updated>2012-09-20T13:37:33Z</updated>

		<summary type="html">&lt;p&gt;AI: The server can redirect you.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Multiplayer Server WML =&lt;br /&gt;
This page describes the [[WML]] used to communicate with the multiplayer server for Wesnoth, [[wesnothd]].&lt;br /&gt;
&lt;br /&gt;
== The handshake ==&lt;br /&gt;
&lt;br /&gt;
The client sends four bytes, then the server replies with four bytes. To get a new connection number, the client will send these four bytes: 0x00 0x00 0x00 0x00. The server then sends back the connection number (wesnothd calls this number the &amp;quot;socket number&amp;quot;). If the handshake is successful, the server will be the first to send a data package. All packages are in [http://en.wikipedia.org/wiki/Gzip gzip] format and are preceded by four bytes that specify the size of the package to come in big-endian. Below you'll find information about what data the (unzipped) packages contain.&lt;br /&gt;
&lt;br /&gt;
== The login procedure ==&lt;br /&gt;
&lt;br /&gt;
* server request (optional)&lt;br /&gt;
** '''[version]'''&lt;br /&gt;
&lt;br /&gt;
* client response&lt;br /&gt;
** '''[version]'''&lt;br /&gt;
*** '''version''': The client's version string.&lt;br /&gt;
&lt;br /&gt;
* server response (if the server does not accept this version)&lt;br /&gt;
** '''[redirect]'''&lt;br /&gt;
*** '''host''': The host you should connect to.&lt;br /&gt;
*** '''port''': The port you should connect to.&lt;br /&gt;
*** '''version''': A comma-separated list of globs that this server should accept (e.g. &amp;quot;1.0*,1.2*,1.4*,1.7*,1.8*&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* server request&lt;br /&gt;
** '''[mustlogin]'''&lt;br /&gt;
&lt;br /&gt;
* client response&lt;br /&gt;
** '''[login]'''&lt;br /&gt;
*** '''username''': The username the client would like to have.&lt;br /&gt;
*** '''password_reminder''': If &amp;quot;yes&amp;quot; the client requests the server to send a password reminder for the provided username.&lt;br /&gt;
*** '''password''': The hashed password, created from the password and salt received from the server. More information about how this password is being generated, including a real world example, can be found in the file [http://forum.wesnoth.org/download/file.php?id=41145 HashedPasswords.pdf] (885 KiB).&lt;br /&gt;
&lt;br /&gt;
* server response&lt;br /&gt;
** '''[join_lobby]''' or&lt;br /&gt;
** '''[error]'''&lt;br /&gt;
*** '''message''': The error message.&lt;br /&gt;
*** '''password_request''': If not empty the server asks the client to provide a password for its desired username.&lt;br /&gt;
*** '''phpbb_encryption''': If &amp;quot;yes&amp;quot; the client will encrypt the password using phpbb's algorithm.&lt;br /&gt;
*** '''random_salt''': Random salt sent to the client for mixing with the password hash.&lt;br /&gt;
*** '''hash_seed''': Salt generated from the original hash that is required to recreate it.&lt;br /&gt;
*** '''salt''': Salt generated from the original hash that is required to recreate it.&lt;br /&gt;
*** '''force_confirmation''': Display an ok/cancel dialog with the content of the 'message' key.&lt;br /&gt;
&lt;br /&gt;
* server response&lt;br /&gt;
** '''[gamelist]'''&lt;br /&gt;
*** '''[game]''' (repeated)&lt;br /&gt;
**** '''id''': A unique id of the game.&lt;br /&gt;
**** '''name''': The title of the game.&lt;br /&gt;
**** '''mp_scenario''': The id of the scenario.&lt;br /&gt;
**** '''mp_era''': The id of the used era.&lt;br /&gt;
**** '''mp_use_map_settings''': Does the game use the map settings specified in the scenario.&lt;br /&gt;
**** '''mp_fog''': Does the game use fog.&lt;br /&gt;
**** '''mp_shroud''': Does the game use shroud.&lt;br /&gt;
**** '''mp_village_gold''': The number of gold per village.&lt;br /&gt;
**** '''experience_modifier''': The experience setting.&lt;br /&gt;
**** '''mp_countdown''': Does the game use a timer.&lt;br /&gt;
**** '''mp_countdown_reservoir_time''': Upper limit of the possibly available time.&lt;br /&gt;
**** '''mp_countdown_init_time''': Initial time.&lt;br /&gt;
**** '''mp_countdown_action_bonus''': Time bonus per action.&lt;br /&gt;
**** '''mp_countdown_turn_bonus''': Time bonus per turn.&lt;br /&gt;
**** '''map_data''': The map data. ''Notice: not sent to lobby if the game uses shroud''&lt;br /&gt;
**** '''hash''': The hash value of the map_data.&lt;br /&gt;
**** '''observer''': Are observers allowed or not.&lt;br /&gt;
**** '''human_sides''': The number of sides played by humans.&lt;br /&gt;
**** '''slots''': The number of vacant/max slots.&lt;br /&gt;
**** '''turn''': The current turn/max turn.&lt;br /&gt;
** '''[user]''' (repeated)&lt;br /&gt;
*** '''name''': The username of the player.&lt;br /&gt;
*** '''game_id''': The ID of the game the player is in (version 1.3.7+svn).&lt;br /&gt;
*** '''location''': The name of the game the player is in.&lt;br /&gt;
*** '''available''': &amp;quot;yes&amp;quot; if the player is in the lobby; &amp;quot;no&amp;quot; if in a game.&lt;br /&gt;
Many of the keys under [game] are described more indepth on the [[ScenarioWML]] page.&lt;br /&gt;
&lt;br /&gt;
== Error messages ==&lt;br /&gt;
&lt;br /&gt;
* '''[error]'''&lt;br /&gt;
** '''message''': The error message.&lt;br /&gt;
&lt;br /&gt;
== Chat (lobby and in-game) ==&lt;br /&gt;
&lt;br /&gt;
* '''[message]'''&lt;br /&gt;
** '''sender''': (optional - filled by the server) The sender of the message.&lt;br /&gt;
** '''message''': The message itself.&lt;br /&gt;
** '''room''': The room the message is from/to&lt;br /&gt;
* '''[whisper]'''&lt;br /&gt;
** '''receiver''': The receiver of the whisper&lt;br /&gt;
** '''sender''': (optional - filled by the server) The sender of the whisper.&lt;br /&gt;
** '''message''': The message itself.&lt;br /&gt;
&lt;br /&gt;
== Room commands ==&lt;br /&gt;
Note: the room commands are in general and are subject to change.&lt;br /&gt;
* '''[room_join]'''&lt;br /&gt;
** '''room''': The room name to join&lt;br /&gt;
** '''player''': (filled by server in response message sent to all room members) the player that joins the room&lt;br /&gt;
** '''[members]''': member list sent to the player that joined&lt;br /&gt;
*** '''[member]''': (repeated) members&lt;br /&gt;
**** '''name''': This member's name&lt;br /&gt;
* '''[room_part]'''&lt;br /&gt;
** '''room''': The room name to part (leave). Leaving the lobby is not allowed.&lt;br /&gt;
** '''player''': (filled by server in response message sent to all room members) the player that leaves the room&lt;br /&gt;
* '''[room_query]''': specific room-related queries.&lt;br /&gt;
** '''[rooms]''': List rooms created on the server, or&lt;br /&gt;
** '''[names]''': List members of a given room&lt;br /&gt;
*** '''room''': The room name (if applicable)&lt;br /&gt;
** '''[persist]''': Check or set room persistance&lt;br /&gt;
*** '''value''': (optional) set room persistance to this value (yes/no)&lt;br /&gt;
* '''[room_query_response]''': contains specific response to a room_query.&lt;br /&gt;
** '''message''': optional text message response&lt;br /&gt;
** '''room''': room name (if applicable)&lt;br /&gt;
** '''[rooms]''': room list&lt;br /&gt;
*** '''[room]''': (repeated) rooms&lt;br /&gt;
**** '''name''': This room's name&lt;br /&gt;
** '''[members]''': member list&lt;br /&gt;
*** '''[member]''': (repeated) members&lt;br /&gt;
**** '''name''': This member's name&lt;br /&gt;
&lt;br /&gt;
== Nickname registration related commands (lobby and in-game) ==&lt;br /&gt;
&lt;br /&gt;
* '''[nickserv]'''&lt;br /&gt;
** '''[register]'''&lt;br /&gt;
*** '''password''': The password for the nickname.&lt;br /&gt;
*** '''mail''': The email address for the nickname.&lt;br /&gt;
** '''[drop]''': Drop this username.&lt;br /&gt;
** '''[set]''': Set a detail (e.g. email address) for this nickname.&lt;br /&gt;
*** '''detail''': The detail, e.g. &amp;quot;mail&amp;quot;.&lt;br /&gt;
*** '''value''': The new value for this detail, e.g. &amp;quot;user@edomain&amp;quot;&lt;br /&gt;
** '''[info]''': Request info about another username.&lt;br /&gt;
*** '''name''': The username.&lt;br /&gt;
&lt;br /&gt;
== Updating the lobby state ==&lt;br /&gt;
&lt;br /&gt;
* '''[gamelist_diff]''': server message - basically a diff from two [gamelist]s; the keys listed are the ones that actually occure in practice&lt;br /&gt;
** '''index''': The index of a user.&lt;br /&gt;
** '''[insert_child]''' A new user logged on.&lt;br /&gt;
*** '''[user]'''&lt;br /&gt;
**** '''name''': The name of the user.&lt;br /&gt;
**** '''available''' &amp;quot;yes&amp;quot;&lt;br /&gt;
*** '''[delete_child]''' A user logged off.&lt;br /&gt;
** '''[change_child]'''&lt;br /&gt;
*** '''[user]'''&lt;br /&gt;
**** '''[insert]''': A user joined/left a game.&lt;br /&gt;
***** '''available''': &amp;quot;yes&amp;quot; when the user left a game. &amp;quot;no&amp;quot; when the user joined a game&lt;br /&gt;
***** '''location''': The name of the game the user joined.&lt;br /&gt;
**** '''[delete]'''&lt;br /&gt;
***** '''location''': &amp;quot;x&amp;quot; when a game was left.&lt;br /&gt;
*** '''[gamelist]'''&lt;br /&gt;
**** '''index''': Index of the game in question.&lt;br /&gt;
**** '''[insert_child]''': A game started.&lt;br /&gt;
***** '''[game]''' All the usual keys of [game] possible, see above.&lt;br /&gt;
**** '''[delete_child]''': A game ended.&lt;br /&gt;
***** '''[game]'''&lt;br /&gt;
**** '''[change_child]''': Something changed in a game.&lt;br /&gt;
***** '''[game]'''&lt;br /&gt;
****** '''[insert]'''&lt;br /&gt;
******* '''slots''': The number of free slots in the form: free/max slots&lt;br /&gt;
******* '''turn''': The turn number in the form: current turn/max turns&lt;br /&gt;
****** '''[delete]'''&lt;br /&gt;
******* '''map''': &amp;quot;x&amp;quot; comes with every ''turn'' or ''slots'' change for games with shroud&lt;br /&gt;
******* '''mp_scenario''': &amp;quot;x&amp;quot; comes with ''turn'' and ''slots'' changes for games with no scenario id&lt;br /&gt;
&lt;br /&gt;
* '''[observer]''' or '''[observer_quit]''': server message - players joining([observer_quit] - quitting the lobby &amp;quot;game&amp;quot;)/quitting([observer] - joining the lobby &amp;quot;game&amp;quot;) a game&lt;br /&gt;
** '''name''': Username of the player/observer.&lt;br /&gt;
&lt;br /&gt;
== Game setup (the phase from creation to start) ==&lt;br /&gt;
To create a game the client sends:&lt;br /&gt;
* '''[create_game]'''&lt;br /&gt;
** '''name''': The title of the game.&lt;br /&gt;
&lt;br /&gt;
followed by a message with the scenario options as under [game] (see above) plus the scenario data ([time], [era], [side], etc. see [[ScenarioWML]])&lt;br /&gt;
&lt;br /&gt;
* '''[join]'''&lt;br /&gt;
** '''id''': The id of the game.&lt;br /&gt;
** '''observe''': Join the game as an observer.&lt;br /&gt;
&lt;br /&gt;
* '''[scenario_diff]''': [[ScenarioWML]] diff (side changes, etc.)&lt;br /&gt;
&lt;br /&gt;
* '''[start_game]''': sent by the host to start a game&lt;br /&gt;
* '''[leave_game]''': sent by the client when it leaves a game; sent by the server to make a client leave a game&lt;br /&gt;
&lt;br /&gt;
== In-game communication ==&lt;br /&gt;
&lt;br /&gt;
* '''[store_next_scenario]''': sent by the host - the scenario data (see [[ScenarioWML]]) to advance to the next scenario&lt;br /&gt;
* '''[notify_next_scenario]''': sent by the server to tell players that the data for the next scenario is available&lt;br /&gt;
* '''[load_next_scenario]''': sent by the client to request the data for the next scenario&lt;br /&gt;
* '''[next_scenario]''': data for the next scenario (see [[ScenarioWML]]), sent by the server on request&lt;br /&gt;
&lt;br /&gt;
* '''[info]''': sent by the host on game end - info about the game state&lt;br /&gt;
** '''type''': &amp;quot;termination&amp;quot; &lt;br /&gt;
** '''condition''': the termination reason&lt;br /&gt;
&lt;br /&gt;
* '''[change_controller]''': a player (un)droids one of his sides or assigns control to someone else (The host can assign control for any side.)&lt;br /&gt;
** '''side''': the side to change controller&lt;br /&gt;
** '''player''': the nickname of the player to take control&lt;br /&gt;
** '''controller''': the new controller: &amp;quot;human&amp;quot; or &amp;quot;human_ai&amp;quot;&lt;br /&gt;
** '''own_side''': &amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If a player leaves this is sent to the host for all sides he owned.&lt;br /&gt;
* '''side_drop''': The number of a side that dropped because a player left.&lt;br /&gt;
* '''controller''': The controller of that side. (&amp;quot;ai&amp;quot;, &amp;quot;network&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* '''[muteall]''': the host mutes/unmutes all observers - toggles&lt;br /&gt;
* '''[mute]''': the host mutes an observer - toggles&lt;br /&gt;
** '''username''': the username of the observer - if not specified the servers returns a list of muted usernames&lt;br /&gt;
* '''[kick]''' or '''[ban]''': the host kicks/bans a player/observer&lt;br /&gt;
** '''username''': the username of the player/observer&lt;br /&gt;
&lt;br /&gt;
* '''[turn]'''&lt;br /&gt;
** '''[command]''': (repeated) can contain all the tags you can find in a replay: [recruit], [move], [end_turn], etc.&lt;br /&gt;
*** '''[speak]'''&lt;br /&gt;
**** '''message''': text of the message&lt;br /&gt;
**** '''id''': the sender&lt;br /&gt;
**** '''team_name''': the name of the team the message is for - empty if it's a public message&lt;br /&gt;
&lt;br /&gt;
== Administrative commands ==&lt;br /&gt;
* '''[query]'''&lt;br /&gt;
** '''type''': The type of query. See [[ServerAdministration]] for details.&lt;br /&gt;
&lt;br /&gt;
[[Category:WML Reference]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=MultiplayerServerWML&amp;diff=47269</id>
		<title>MultiplayerServerWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=MultiplayerServerWML&amp;diff=47269"/>
		<updated>2012-09-20T13:33:28Z</updated>

		<summary type="html">&lt;p&gt;AI: /* The handshake */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Multiplayer Server WML =&lt;br /&gt;
This page describes the [[WML]] used to communicate with the multiplayer server for Wesnoth, [[wesnothd]].&lt;br /&gt;
&lt;br /&gt;
== The handshake ==&lt;br /&gt;
&lt;br /&gt;
The client sends four bytes, then the server replies with four bytes. To get a new connection number, the client will send these four bytes: 0x00 0x00 0x00 0x00. The server then sends back the connection number (wesnothd calls this number the &amp;quot;socket number&amp;quot;). If the handshake is successful, the server will be the first to send a data package. All packages are in [http://en.wikipedia.org/wiki/Gzip gzip] format and are preceded by four bytes that specify the size of the package to come in big-endian. Below you'll find information about what data the (unzipped) packages contain.&lt;br /&gt;
&lt;br /&gt;
== The login procedure ==&lt;br /&gt;
&lt;br /&gt;
* server request (optional)&lt;br /&gt;
** '''[version]'''&lt;br /&gt;
&lt;br /&gt;
* client response&lt;br /&gt;
** '''[version]'''&lt;br /&gt;
*** '''version''': The client's version string.&lt;br /&gt;
&lt;br /&gt;
* server request&lt;br /&gt;
** '''[mustlogin]'''&lt;br /&gt;
&lt;br /&gt;
* client response&lt;br /&gt;
** '''[login]'''&lt;br /&gt;
*** '''username''': The username the client would like to have.&lt;br /&gt;
*** '''password_reminder''': If &amp;quot;yes&amp;quot; the client requests the server to send a password reminder for the provided username.&lt;br /&gt;
*** '''password''': The hashed password, created from the password and salt received from the server. More information about how this password is being generated, including a real world example, can be found in the file [http://forum.wesnoth.org/download/file.php?id=41145 HashedPasswords.pdf] (885 KiB).&lt;br /&gt;
&lt;br /&gt;
* server response&lt;br /&gt;
** '''[join_lobby]''' or&lt;br /&gt;
** '''[error]'''&lt;br /&gt;
*** '''message''': The error message.&lt;br /&gt;
*** '''password_request''': If not empty the server asks the client to provide a password for its desired username.&lt;br /&gt;
*** '''phpbb_encryption''': If &amp;quot;yes&amp;quot; the client will encrypt the password using phpbb's algorithm.&lt;br /&gt;
*** '''random_salt''': Random salt sent to the client for mixing with the password hash.&lt;br /&gt;
*** '''hash_seed''': Salt generated from the original hash that is required to recreate it.&lt;br /&gt;
*** '''salt''': Salt generated from the original hash that is required to recreate it.&lt;br /&gt;
*** '''force_confirmation''': Display an ok/cancel dialog with the content of the 'message' key.&lt;br /&gt;
&lt;br /&gt;
* server response&lt;br /&gt;
** '''[gamelist]'''&lt;br /&gt;
*** '''[game]''' (repeated)&lt;br /&gt;
**** '''id''': A unique id of the game.&lt;br /&gt;
**** '''name''': The title of the game.&lt;br /&gt;
**** '''mp_scenario''': The id of the scenario.&lt;br /&gt;
**** '''mp_era''': The id of the used era.&lt;br /&gt;
**** '''mp_use_map_settings''': Does the game use the map settings specified in the scenario.&lt;br /&gt;
**** '''mp_fog''': Does the game use fog.&lt;br /&gt;
**** '''mp_shroud''': Does the game use shroud.&lt;br /&gt;
**** '''mp_village_gold''': The number of gold per village.&lt;br /&gt;
**** '''experience_modifier''': The experience setting.&lt;br /&gt;
**** '''mp_countdown''': Does the game use a timer.&lt;br /&gt;
**** '''mp_countdown_reservoir_time''': Upper limit of the possibly available time.&lt;br /&gt;
**** '''mp_countdown_init_time''': Initial time.&lt;br /&gt;
**** '''mp_countdown_action_bonus''': Time bonus per action.&lt;br /&gt;
**** '''mp_countdown_turn_bonus''': Time bonus per turn.&lt;br /&gt;
**** '''map_data''': The map data. ''Notice: not sent to lobby if the game uses shroud''&lt;br /&gt;
**** '''hash''': The hash value of the map_data.&lt;br /&gt;
**** '''observer''': Are observers allowed or not.&lt;br /&gt;
**** '''human_sides''': The number of sides played by humans.&lt;br /&gt;
**** '''slots''': The number of vacant/max slots.&lt;br /&gt;
**** '''turn''': The current turn/max turn.&lt;br /&gt;
** '''[user]''' (repeated)&lt;br /&gt;
*** '''name''': The username of the player.&lt;br /&gt;
*** '''game_id''': The ID of the game the player is in (version 1.3.7+svn).&lt;br /&gt;
*** '''location''': The name of the game the player is in.&lt;br /&gt;
*** '''available''': &amp;quot;yes&amp;quot; if the player is in the lobby; &amp;quot;no&amp;quot; if in a game.&lt;br /&gt;
Many of the keys under [game] are described more indepth on the [[ScenarioWML]] page.&lt;br /&gt;
&lt;br /&gt;
== Error messages ==&lt;br /&gt;
&lt;br /&gt;
* '''[error]'''&lt;br /&gt;
** '''message''': The error message.&lt;br /&gt;
&lt;br /&gt;
== Chat (lobby and in-game) ==&lt;br /&gt;
&lt;br /&gt;
* '''[message]'''&lt;br /&gt;
** '''sender''': (optional - filled by the server) The sender of the message.&lt;br /&gt;
** '''message''': The message itself.&lt;br /&gt;
** '''room''': The room the message is from/to&lt;br /&gt;
* '''[whisper]'''&lt;br /&gt;
** '''receiver''': The receiver of the whisper&lt;br /&gt;
** '''sender''': (optional - filled by the server) The sender of the whisper.&lt;br /&gt;
** '''message''': The message itself.&lt;br /&gt;
&lt;br /&gt;
== Room commands ==&lt;br /&gt;
Note: the room commands are in general and are subject to change.&lt;br /&gt;
* '''[room_join]'''&lt;br /&gt;
** '''room''': The room name to join&lt;br /&gt;
** '''player''': (filled by server in response message sent to all room members) the player that joins the room&lt;br /&gt;
** '''[members]''': member list sent to the player that joined&lt;br /&gt;
*** '''[member]''': (repeated) members&lt;br /&gt;
**** '''name''': This member's name&lt;br /&gt;
* '''[room_part]'''&lt;br /&gt;
** '''room''': The room name to part (leave). Leaving the lobby is not allowed.&lt;br /&gt;
** '''player''': (filled by server in response message sent to all room members) the player that leaves the room&lt;br /&gt;
* '''[room_query]''': specific room-related queries.&lt;br /&gt;
** '''[rooms]''': List rooms created on the server, or&lt;br /&gt;
** '''[names]''': List members of a given room&lt;br /&gt;
*** '''room''': The room name (if applicable)&lt;br /&gt;
** '''[persist]''': Check or set room persistance&lt;br /&gt;
*** '''value''': (optional) set room persistance to this value (yes/no)&lt;br /&gt;
* '''[room_query_response]''': contains specific response to a room_query.&lt;br /&gt;
** '''message''': optional text message response&lt;br /&gt;
** '''room''': room name (if applicable)&lt;br /&gt;
** '''[rooms]''': room list&lt;br /&gt;
*** '''[room]''': (repeated) rooms&lt;br /&gt;
**** '''name''': This room's name&lt;br /&gt;
** '''[members]''': member list&lt;br /&gt;
*** '''[member]''': (repeated) members&lt;br /&gt;
**** '''name''': This member's name&lt;br /&gt;
&lt;br /&gt;
== Nickname registration related commands (lobby and in-game) ==&lt;br /&gt;
&lt;br /&gt;
* '''[nickserv]'''&lt;br /&gt;
** '''[register]'''&lt;br /&gt;
*** '''password''': The password for the nickname.&lt;br /&gt;
*** '''mail''': The email address for the nickname.&lt;br /&gt;
** '''[drop]''': Drop this username.&lt;br /&gt;
** '''[set]''': Set a detail (e.g. email address) for this nickname.&lt;br /&gt;
*** '''detail''': The detail, e.g. &amp;quot;mail&amp;quot;.&lt;br /&gt;
*** '''value''': The new value for this detail, e.g. &amp;quot;user@edomain&amp;quot;&lt;br /&gt;
** '''[info]''': Request info about another username.&lt;br /&gt;
*** '''name''': The username.&lt;br /&gt;
&lt;br /&gt;
== Updating the lobby state ==&lt;br /&gt;
&lt;br /&gt;
* '''[gamelist_diff]''': server message - basically a diff from two [gamelist]s; the keys listed are the ones that actually occure in practice&lt;br /&gt;
** '''index''': The index of a user.&lt;br /&gt;
** '''[insert_child]''' A new user logged on.&lt;br /&gt;
*** '''[user]'''&lt;br /&gt;
**** '''name''': The name of the user.&lt;br /&gt;
**** '''available''' &amp;quot;yes&amp;quot;&lt;br /&gt;
*** '''[delete_child]''' A user logged off.&lt;br /&gt;
** '''[change_child]'''&lt;br /&gt;
*** '''[user]'''&lt;br /&gt;
**** '''[insert]''': A user joined/left a game.&lt;br /&gt;
***** '''available''': &amp;quot;yes&amp;quot; when the user left a game. &amp;quot;no&amp;quot; when the user joined a game&lt;br /&gt;
***** '''location''': The name of the game the user joined.&lt;br /&gt;
**** '''[delete]'''&lt;br /&gt;
***** '''location''': &amp;quot;x&amp;quot; when a game was left.&lt;br /&gt;
*** '''[gamelist]'''&lt;br /&gt;
**** '''index''': Index of the game in question.&lt;br /&gt;
**** '''[insert_child]''': A game started.&lt;br /&gt;
***** '''[game]''' All the usual keys of [game] possible, see above.&lt;br /&gt;
**** '''[delete_child]''': A game ended.&lt;br /&gt;
***** '''[game]'''&lt;br /&gt;
**** '''[change_child]''': Something changed in a game.&lt;br /&gt;
***** '''[game]'''&lt;br /&gt;
****** '''[insert]'''&lt;br /&gt;
******* '''slots''': The number of free slots in the form: free/max slots&lt;br /&gt;
******* '''turn''': The turn number in the form: current turn/max turns&lt;br /&gt;
****** '''[delete]'''&lt;br /&gt;
******* '''map''': &amp;quot;x&amp;quot; comes with every ''turn'' or ''slots'' change for games with shroud&lt;br /&gt;
******* '''mp_scenario''': &amp;quot;x&amp;quot; comes with ''turn'' and ''slots'' changes for games with no scenario id&lt;br /&gt;
&lt;br /&gt;
* '''[observer]''' or '''[observer_quit]''': server message - players joining([observer_quit] - quitting the lobby &amp;quot;game&amp;quot;)/quitting([observer] - joining the lobby &amp;quot;game&amp;quot;) a game&lt;br /&gt;
** '''name''': Username of the player/observer.&lt;br /&gt;
&lt;br /&gt;
== Game setup (the phase from creation to start) ==&lt;br /&gt;
To create a game the client sends:&lt;br /&gt;
* '''[create_game]'''&lt;br /&gt;
** '''name''': The title of the game.&lt;br /&gt;
&lt;br /&gt;
followed by a message with the scenario options as under [game] (see above) plus the scenario data ([time], [era], [side], etc. see [[ScenarioWML]])&lt;br /&gt;
&lt;br /&gt;
* '''[join]'''&lt;br /&gt;
** '''id''': The id of the game.&lt;br /&gt;
** '''observe''': Join the game as an observer.&lt;br /&gt;
&lt;br /&gt;
* '''[scenario_diff]''': [[ScenarioWML]] diff (side changes, etc.)&lt;br /&gt;
&lt;br /&gt;
* '''[start_game]''': sent by the host to start a game&lt;br /&gt;
* '''[leave_game]''': sent by the client when it leaves a game; sent by the server to make a client leave a game&lt;br /&gt;
&lt;br /&gt;
== In-game communication ==&lt;br /&gt;
&lt;br /&gt;
* '''[store_next_scenario]''': sent by the host - the scenario data (see [[ScenarioWML]]) to advance to the next scenario&lt;br /&gt;
* '''[notify_next_scenario]''': sent by the server to tell players that the data for the next scenario is available&lt;br /&gt;
* '''[load_next_scenario]''': sent by the client to request the data for the next scenario&lt;br /&gt;
* '''[next_scenario]''': data for the next scenario (see [[ScenarioWML]]), sent by the server on request&lt;br /&gt;
&lt;br /&gt;
* '''[info]''': sent by the host on game end - info about the game state&lt;br /&gt;
** '''type''': &amp;quot;termination&amp;quot; &lt;br /&gt;
** '''condition''': the termination reason&lt;br /&gt;
&lt;br /&gt;
* '''[change_controller]''': a player (un)droids one of his sides or assigns control to someone else (The host can assign control for any side.)&lt;br /&gt;
** '''side''': the side to change controller&lt;br /&gt;
** '''player''': the nickname of the player to take control&lt;br /&gt;
** '''controller''': the new controller: &amp;quot;human&amp;quot; or &amp;quot;human_ai&amp;quot;&lt;br /&gt;
** '''own_side''': &amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If a player leaves this is sent to the host for all sides he owned.&lt;br /&gt;
* '''side_drop''': The number of a side that dropped because a player left.&lt;br /&gt;
* '''controller''': The controller of that side. (&amp;quot;ai&amp;quot;, &amp;quot;network&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* '''[muteall]''': the host mutes/unmutes all observers - toggles&lt;br /&gt;
* '''[mute]''': the host mutes an observer - toggles&lt;br /&gt;
** '''username''': the username of the observer - if not specified the servers returns a list of muted usernames&lt;br /&gt;
* '''[kick]''' or '''[ban]''': the host kicks/bans a player/observer&lt;br /&gt;
** '''username''': the username of the player/observer&lt;br /&gt;
&lt;br /&gt;
* '''[turn]'''&lt;br /&gt;
** '''[command]''': (repeated) can contain all the tags you can find in a replay: [recruit], [move], [end_turn], etc.&lt;br /&gt;
*** '''[speak]'''&lt;br /&gt;
**** '''message''': text of the message&lt;br /&gt;
**** '''id''': the sender&lt;br /&gt;
**** '''team_name''': the name of the team the message is for - empty if it's a public message&lt;br /&gt;
&lt;br /&gt;
== Administrative commands ==&lt;br /&gt;
* '''[query]'''&lt;br /&gt;
** '''type''': The type of query. See [[ServerAdministration]] for details.&lt;br /&gt;
&lt;br /&gt;
[[Category:WML Reference]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=47065</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=47065"/>
		<updated>2012-08-10T23:56:00Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt (for everything except -C, which uses a read-only checkout)&lt;br /&gt;
* Administrator rights on github.com/wescamp (if you need to create new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the svn invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the svn version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
* -u ADDON uploads a single add-on to wescamp.&lt;br /&gt;
* -U uploads all translatable add-ons.&lt;br /&gt;
* -l lists all add-ons.&lt;br /&gt;
* -L lists all translatable add-ons.&lt;br /&gt;
* -c creates a normal checkout&lt;br /&gt;
* -C creates a read-only checkout (doesn't require any github credentials)&lt;br /&gt;
* -s SERVER is the hostname of the add-on server&lt;br /&gt;
* -p PORT is the port of the add-on server&lt;br /&gt;
* -w WESCAMP_CHECKOUT specifies the directory of the wescamp checkout (or where it will be created)&lt;br /&gt;
* -G USER:PASSWORD is your login to github. This argument is required if an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
* -B BUILD_SYSTEM_CHECKOUT can be used to specify a build-system checkout&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp/branch-1.10/ -c&lt;br /&gt;
This makes a fresh checkout of all translatable 1.10 add-ons in the specified directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown&lt;br /&gt;
An existing checkout of the Invasion_from_the_Unknown-1.10 repository in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/ is updated.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -G USER:PASSWORD&lt;br /&gt;
The directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github. After this command it will be on github and a checkout will be in the directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/branch-1.10/ -U -G USER:PASSWORD&lt;br /&gt;
Updates all 1.10 add-ons. If they are not yet on wescamp, a new repository will be created for them.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=47064</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=47064"/>
		<updated>2012-08-10T23:54:29Z</updated>

		<summary type="html">&lt;p&gt;AI: Remove -g&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works when -g (--git) is passed, so that it communicates with wescamp at github.com instead of wescamp-i18n at berlios.de.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt&lt;br /&gt;
* Administrator rights on github.com/wescamp (for creating new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the svn invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the svn version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
* -u ADDON uploads a single add-on to wescamp.&lt;br /&gt;
* -U uploads all translatable add-ons.&lt;br /&gt;
* -l lists all add-ons.&lt;br /&gt;
* -L lists all translatable add-ons.&lt;br /&gt;
* -c creates a normal checkout&lt;br /&gt;
* -C creates a read-only checkout (doesn't require any github credentials)&lt;br /&gt;
* -s SERVER is the hostname of the add-on server&lt;br /&gt;
* -p PORT is the port of the add-on server&lt;br /&gt;
* -w WESCAMP_CHECKOUT specifies the directory of the wescamp checkout (or where it will be created)&lt;br /&gt;
* -G USER:PASSWORD is your login to github. This argument is required if an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
* -B BUILD_SYSTEM_CHECKOUT can be used to specify a build-system checkout&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp/branch-1.10/ -c&lt;br /&gt;
This makes a fresh checkout of all translatable 1.10 add-ons in the specified directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown&lt;br /&gt;
An existing checkout of the Invasion_from_the_Unknown-1.10 repository in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/ is updated.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -G USER:PASSWORD&lt;br /&gt;
The directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github. After this command it will be on github and a checkout will be in the directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/branch-1.10/ -U -G USER:PASSWORD&lt;br /&gt;
Updates all 1.10 add-ons. If they are not yet on wescamp, a new repository will be created for them.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=47063</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=47063"/>
		<updated>2012-08-10T23:34:29Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Invocation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works when -g (--git) is passed, so that it communicates with wescamp at github.com instead of wescamp-i18n at berlios.de.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt&lt;br /&gt;
* Administrator rights on github.com/wescamp (for creating new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the svn invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the svn version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
* -u ADDON uploads a single add-on to wescamp.&lt;br /&gt;
* -U uploads all translatable add-ons.&lt;br /&gt;
* -l lists all add-ons.&lt;br /&gt;
* -L lists all translatable add-ons.&lt;br /&gt;
* -c creates a normal checkout&lt;br /&gt;
* -C creates a read-only checkout (doesn't require any github credentials)&lt;br /&gt;
* -s SERVER is the hostname of the add-on server&lt;br /&gt;
* -p PORT is the port of the add-on server&lt;br /&gt;
* -w WESCAMP_CHECKOUT specifies the directory of the wescamp checkout (or where it will be created)&lt;br /&gt;
* -G USER:PASSWORD is your login to github. This argument is required if an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
* -B BUILD_SYSTEM_CHECKOUT can be used to specify a build-system checkout&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp/branch-1.10/ -c -g&lt;br /&gt;
This makes a fresh checkout of all translatable 1.10 add-ons in the specified directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown -g&lt;br /&gt;
An existing checkout of the Invasion_from_the_Unknown-1.10 repository in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/ is updated.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -g -G USER:PASSWORD&lt;br /&gt;
The directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github. After this command it will be on github and a checkout will be in the directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/branch-1.10/ -U -g -G USER:PASSWORD&lt;br /&gt;
Updates all 1.10 add-ons. If they are not yet on wescamp, a new repository will be created for them.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=FormulaAI&amp;diff=46840</id>
		<title>FormulaAI</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=FormulaAI&amp;diff=46840"/>
		<updated>2012-07-25T01:22:06Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Available variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth Formula AI is an attempt to develop an AI framework for Wesnoth that allows easy and fun development and modification of AIs for Wesnoth.  In addition to the technical information on this page, a tutorial-style guide is also available at [[Formula AI Howto]].&lt;br /&gt;
&lt;br /&gt;
Wesnoth already has support for AIs written in Python, but writing AIs in Python has a couple of problems:&lt;br /&gt;
&lt;br /&gt;
* it's still rather difficult, especially for a non-programmer, to develop an AI, even in Python&lt;br /&gt;
* Python is insecure; a malicious trojan horse Python script masquerading as an AI could do untold damage&lt;br /&gt;
&lt;br /&gt;
The Wesnoth Formula AI aims to create a fairly simple, pure functional language which allows one to implement an AI. It also aims to allow AIs to be tweaked and modified by people with relatively little technical programming experience; anyone who can use WML should also be able to use the Formula AI to tweak an AI to make the AI in a scenario behave how they want.&lt;br /&gt;
&lt;br /&gt;
== How formulas get called ==&lt;br /&gt;
&lt;br /&gt;
=== Formulas Command Line ===&lt;br /&gt;
&lt;br /&gt;
To attempt to make it convenient to debug formulas, one can run formulas from within Wesnoth, and see the results. To run a formula, just start game and type 'f'. A command textbox will appear, where you can type a formula, and the results will be printed. For instance, typing&lt;br /&gt;
&lt;br /&gt;
 8 + 4 &lt;br /&gt;
&lt;br /&gt;
will result in &amp;quot;12&amp;quot; appearing on the screen. You can now use Wesnoth like a calculator. :-)&lt;br /&gt;
&lt;br /&gt;
=== Side-wide formulas ===&lt;br /&gt;
The first way to get a formula called is to assign it to a [side] in a WML map. This formula will be called every turn, so it is best used for very simple sides (a couple of special units which should have semi-scripted moves, or a simple handling followed by calls to the standard C++ AI)&lt;br /&gt;
&lt;br /&gt;
To use the Formula AI, one should put an [ai] tag inside the [side] tag. Inside this [ai] tag, one should set up the ''side_formulas'' stage and specify the 'move' attribute to be a formula for the movement the AI will make. Each time it's the AI's move, this formula will be run, and the move it results in will be executed. Then the formula will be run again; it'll continue to be run until it stops producing a valid move, at which point the AI will end its turn. Alternatively there is a command that the formula may return which will make it end its turn immediately.&lt;br /&gt;
&lt;br /&gt;
A sample AI which does nothing but recruit Wolf Riders is as follows:&lt;br /&gt;
 [side]&lt;br /&gt;
     ...&lt;br /&gt;
     [ai]&lt;br /&gt;
         version=10710&lt;br /&gt;
         [stage]&lt;br /&gt;
             engine=fai&lt;br /&gt;
             name=side_formulas&lt;br /&gt;
             move=&amp;quot;recruit('Wolf Rider')&amp;quot;&lt;br /&gt;
         [/stage]&lt;br /&gt;
     [/ai]&lt;br /&gt;
 [/side]&lt;br /&gt;
&lt;br /&gt;
=== Unit Formulas ===&lt;br /&gt;
&lt;br /&gt;
You can specify a formula for any kind of unit. This is a simple way of doing it:&lt;br /&gt;
&lt;br /&gt;
 [unit]&lt;br /&gt;
   ...&lt;br /&gt;
   [ai]&lt;br /&gt;
     formula=&amp;quot;move(me.loc, loc(me.loc.x, me.loc.y - 1))&amp;quot;&lt;br /&gt;
   [/ai]&lt;br /&gt;
 [/unit]&lt;br /&gt;
&lt;br /&gt;
Above formula will simply move unit one hex to the north every turn. Note how &amp;quot;me&amp;quot; keyword allows access to unit itself.  In addition, the ''unit_formulas'' stage also needs to be set up in the side definition:&lt;br /&gt;
&lt;br /&gt;
 [side]&lt;br /&gt;
     ...&lt;br /&gt;
     [ai]&lt;br /&gt;
         version=10710&lt;br /&gt;
         [stage]&lt;br /&gt;
             engine=fai&lt;br /&gt;
             name=unit_formulas&lt;br /&gt;
         [/stage]&lt;br /&gt;
     [/ai]&lt;br /&gt;
 [/side]&lt;br /&gt;
&lt;br /&gt;
If you need to execute unit formulas in a specific order, you can set a priority:&lt;br /&gt;
&lt;br /&gt;
 [unit]&lt;br /&gt;
   ...&lt;br /&gt;
   [ai]&lt;br /&gt;
     formula=&amp;quot;move(me.loc, loc(me.loc.x, me.loc.y - 1))&amp;quot;&lt;br /&gt;
     priority=10&lt;br /&gt;
   [/ai]&lt;br /&gt;
 [/unit]&lt;br /&gt;
&lt;br /&gt;
Units with highest priority get their formula executed first.&lt;br /&gt;
&lt;br /&gt;
You can also define AI unit-specific variables and use them in you formulas:&lt;br /&gt;
&lt;br /&gt;
 [unit]&lt;br /&gt;
  ...&lt;br /&gt;
   [ai]&lt;br /&gt;
     formula=&amp;quot;if(attack, attack, move(me.loc, me.vars.guard_loc) )&lt;br /&gt;
        where attack = choose(filter(attacks, units = [me.loc] and distance_between(me.vars.guard_loc, target) &amp;lt;= me.vars.guard_radius and unit_at(target).side=me.vars.hostile_side-1 ), avg_damage_inflicted)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     [vars]&lt;br /&gt;
       guard_radius=3&lt;br /&gt;
       guard_loc=&amp;quot;loc(8,5)&amp;quot;&lt;br /&gt;
       hostile_side=1&lt;br /&gt;
     [/vars]&lt;br /&gt;
   [/ai]&lt;br /&gt;
 [/unit]&lt;br /&gt;
&lt;br /&gt;
This formula will get location position from variable guard_loc and make sure that unit attacks only opponent from side 1 (value specified by hostile_side variable) which is 3 hexes (guard_radius) or less from guard_loc.&lt;br /&gt;
&lt;br /&gt;
Types of variables that are supported:&lt;br /&gt;
*number:&lt;br /&gt;
 variable=3&lt;br /&gt;
*text (important: note the ' ' within &amp;quot; &amp;quot;):&lt;br /&gt;
 name=&amp;quot;'I am variable'&amp;quot;&lt;br /&gt;
*list:&lt;br /&gt;
 number_list=[ 1, 2, 3]&lt;br /&gt;
* map:&lt;br /&gt;
 map=[ 'Elvish Archer' -&amp;gt; 70, 'Elvish Shaman' -&amp;gt; 60 ]&lt;br /&gt;
*location:&lt;br /&gt;
 place=&amp;quot;loc(X,Y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Candidate move evaluation ===&lt;br /&gt;
==== Overview ====&lt;br /&gt;
Units in wesnoth have all sort of special abilities, special powers and special usages. Thus, it was needed to have an easy way to describe special behaviour for special units. Adding an formula to a unit only partially solves the problem. It allows easily to have special units (like ennemy heroes) have special behaviour but not normal units with special powers to to behave smartly. &lt;br /&gt;
&lt;br /&gt;
Candidate moves are a way to have formula that will&lt;br /&gt;
&lt;br /&gt;
* evaluate a given situation&lt;br /&gt;
* see if they are able to provide &amp;quot;special moves&amp;quot; for the case they know how to handle&lt;br /&gt;
* give a move to do if the situation match their condition&lt;br /&gt;
&lt;br /&gt;
==== Evaluation Algorithm ====&lt;br /&gt;
&lt;br /&gt;
Each side will have some candidate move blocks made of&lt;br /&gt;
* a name for the move&lt;br /&gt;
* a type (see below for description of the different types and how they are called)&lt;br /&gt;
* a formula returning a score for the move&lt;br /&gt;
* a formula executing the move to do&lt;br /&gt;
&lt;br /&gt;
The engine will run the following pseudo-code&lt;br /&gt;
&lt;br /&gt;
 while (a formula returned a score greatern than 0) {&lt;br /&gt;
      foreach (registered candidate move) {&lt;br /&gt;
           foreach (set of parameters for that candidate move's type) {&lt;br /&gt;
               call the evaluation formula, note the score returned&lt;br /&gt;
           }&lt;br /&gt;
      }&lt;br /&gt;
      if (the highest score returned was greater than 0) {&lt;br /&gt;
          call the candidate move that returned the highest score with the corresponding set of parameters&lt;br /&gt;
      }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
in other word, we evaluate all candidate moves, then run the candidate move with the highest score, then re-evaluate everything, until no candidate move wants to play anymore&lt;br /&gt;
&lt;br /&gt;
==== Syntax ====&lt;br /&gt;
To add a new candidate move to the RCA AI ''main_loop'' stage, use the following syntax:&lt;br /&gt;
&lt;br /&gt;
       [ai]&lt;br /&gt;
           version=10710&lt;br /&gt;
           [stage]&lt;br /&gt;
               id=main_loop&lt;br /&gt;
               name=testing_ai_default::candidate_action_evaluation_loop&lt;br /&gt;
               {AI_CA_GOTO}&lt;br /&gt;
               {AI_CA_RECRUITMENT}&lt;br /&gt;
               {AI_CA_MOVE_LEADER_TO_GOALS}&lt;br /&gt;
               {AI_CA_MOVE_LEADER_TO_KEEP}&lt;br /&gt;
               {AI_CA_COMBAT}&lt;br /&gt;
               {AI_CA_HEALING}&lt;br /&gt;
               {AI_CA_VILLAGES}&lt;br /&gt;
               {AI_CA_RETREAT}&lt;br /&gt;
               {AI_CA_MOVE_TO_TARGETS}&lt;br /&gt;
               {AI_CA_PASSIVE_LEADER_SHARES_KEEP}&lt;br /&gt;
 &lt;br /&gt;
               [candidate_action]&lt;br /&gt;
                   engine=fai&lt;br /&gt;
                   name=go_south&lt;br /&gt;
                   type=movement&lt;br /&gt;
                   evaluation=&amp;quot;if((me.hitpoints &amp;lt; me.max_hitpoints), 60010, 0)&amp;quot;&lt;br /&gt;
                   action=&amp;quot;move(me.loc, loc(me.loc.x, me.loc.y + 1))&amp;quot;&lt;br /&gt;
               [/candidate_action]&lt;br /&gt;
           [/stage]&lt;br /&gt;
       [/ai]&lt;br /&gt;
&lt;br /&gt;
This is an example of a candidate action that gets added to all the standard RCA AI candidate actions and moves each unit with movement points left one hex south.  It is also possible to use&lt;br /&gt;
       {ai/aliases/stable_singleplayer.cfg}&lt;br /&gt;
inside the [side] tag to set up the standard RCA AI candidate actions, and then add the customized candidate actions later using [modify_ai] or one of the available macros.&lt;br /&gt;
&lt;br /&gt;
Each [candidate_action] block describes a candidate move and must have the following fields&lt;br /&gt;
&lt;br /&gt;
* ''name'' : the name of this candidate block&lt;br /&gt;
* ''type'' : see the paragraph about types below, this describe the implicite variables that the formulas will be called with&lt;br /&gt;
* ''evaluation'' : a formula returning an integer. This number reflects how good the move is compared to other moves. Values of zero will mean the move is not a good idea and should be skipped&lt;br /&gt;
* ''action'' : A formula that will be called if that candidate move is the best one&lt;br /&gt;
&lt;br /&gt;
==== Candidate move types ====&lt;br /&gt;
&lt;br /&gt;
there are two types of candidate moves&lt;br /&gt;
&lt;br /&gt;
* '''attack''' : these are called once for every pair &amp;lt;me,target&amp;gt; where me is a variable set to a unit on the AI side, and target is a variable set to an ennemy unit that &amp;quot;me&amp;quot; can reach&lt;br /&gt;
* '''movement''' : these are called once for every unit on the AI side, the &amp;quot;me&amp;quot; variable is set to the corresponding unit&lt;br /&gt;
&lt;br /&gt;
=== Summary : a typical AI turn ===&lt;br /&gt;
&lt;br /&gt;
An AI turn will run the following formulas. Any formula returning an &amp;quot;end turn&amp;quot; move will (of course) finish the turn. But assuming this doesn't happen :&lt;br /&gt;
* All unit formulas are called once&lt;br /&gt;
* All candidate moves are evaluated and played&lt;br /&gt;
* All ''move='' formulas are called until they don't return valid moves&lt;br /&gt;
* If no ''move='' formula is provided, we drop automatically to C++&lt;br /&gt;
* Turn is ended.&lt;br /&gt;
&lt;br /&gt;
Note that this means that you have to explicitely call &amp;quot;fallback&amp;quot; or set up the RCA AI ''main_loop'' stage specifically, if you want the C++ AI to finish your moves after a side-wide formula.  Also note that the stages are executed in the order in which they are put into the [ai] tag, not in the order of the above list.&lt;br /&gt;
&lt;br /&gt;
== Formula Basics ==&lt;br /&gt;
&lt;br /&gt;
* The Formula language supports basic arithmetic operations, such as: +, -, *, /, % and ^. It supports integers and decimal/floating point numbers, but operations will default to integer math unless operands are specified as floating point. For example:&lt;br /&gt;
&lt;br /&gt;
 4 + 8*7     #evaluates to 60&lt;br /&gt;
 (4 + 8)*7   #evaluates to 84&lt;br /&gt;
 8 % 6       #evaluates to 2&lt;br /&gt;
 5 / 2       #evaluates to 2&lt;br /&gt;
 5.0 / 2     #evaluates to 2.5&lt;br /&gt;
 5 / 2.0     #evaluates to 2.5&lt;br /&gt;
 3 ^ 2       #evaluates to 9&lt;br /&gt;
&lt;br /&gt;
* It also supports equality, = and !=, and comparison operators, &amp;lt;, &amp;gt;, &amp;lt;=, and &amp;gt;=. 'false' values are 0 (integer) and null. Other values are true. It also supports common operators such as and, or, and not:&lt;br /&gt;
&lt;br /&gt;
 2 = 4     #evaluates to 0&lt;br /&gt;
 2 &amp;lt;= 3    #evaluates to 1&lt;br /&gt;
 0 != 1    #evaluates to 1&lt;br /&gt;
 not 4     #evaluates to 0&lt;br /&gt;
 not 0     #evaluates to 1&lt;br /&gt;
 (2 &amp;lt; 4) and (3 &amp;gt; 6)    #evaluates to 1 and 0 which evaluates to 0&lt;br /&gt;
 (2 &amp;lt; 4) or (3 &amp;gt; 6)     #evaluates to 1 or 0 which evaluates to 1&lt;br /&gt;
&lt;br /&gt;
* Formula language supports also 'dice' operator 'd'. Example usage is:&lt;br /&gt;
&lt;br /&gt;
 3d5&lt;br /&gt;
&lt;br /&gt;
Which will give you one of results of rolling three five-sided dice (so random number between 3 and 15). NOTE: We encourage you to use this operator only when it is really needed. In most cases, you should not base the AI decisions on random results except for scenario replayability purposes.&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
&lt;br /&gt;
Formula System supports different types of data, which can be stored as a variables and are used in evaluations:&lt;br /&gt;
&lt;br /&gt;
* Numbers: like 0, 1, 2 etc. Floating-point numbers are not supported. 0 is equal to logical 'false', any other number is 'true'.&lt;br /&gt;
&lt;br /&gt;
* Text strings: &lt;br /&gt;
&lt;br /&gt;
 'this is a text string' &lt;br /&gt;
&lt;br /&gt;
* Lists: A list is a sequence of values. For example, ai.my_units is a list of unit objects. A list is represented as square brackets, [], surrounding a comma-seperated list. For instance: &lt;br /&gt;
&lt;br /&gt;
 [4, 8, 7] &lt;br /&gt;
&lt;br /&gt;
is a list of three numbers, and &lt;br /&gt;
&lt;br /&gt;
 []&lt;br /&gt;
&lt;br /&gt;
is a empty list. Various functions can operate on lists.&lt;br /&gt;
&lt;br /&gt;
To acces one particular element of a list we can use operator [], for example:&lt;br /&gt;
&lt;br /&gt;
 my_list[0]&lt;br /&gt;
&lt;br /&gt;
Returns first element from the my_list, so:&lt;br /&gt;
&lt;br /&gt;
 [ 10, 20, 30, 40][2]&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
&lt;br /&gt;
 30&lt;br /&gt;
&lt;br /&gt;
* Maps: A map is a sequence of pairs, each pair is a key and assigned to it value. For example:&lt;br /&gt;
&lt;br /&gt;
 [ 'Elvish Fighter' -&amp;gt; 50, 'Elvish Archer' -&amp;gt; 60 ]&lt;br /&gt;
&lt;br /&gt;
Is a map which consist of two pairs, first one assigns to the text string 'Elvish Fighter' the value 50, second one assigns 60 to the 'Elvish Archer' string.&lt;br /&gt;
&lt;br /&gt;
To access value assigned to the key, we can use operator []:&lt;br /&gt;
&lt;br /&gt;
 [ 'Elvish Fighter' -&amp;gt; 50, 'Elvish Archer' -&amp;gt; 60 ][ 'Elvish Fighter' ]&lt;br /&gt;
&lt;br /&gt;
Above example returns &lt;br /&gt;
&lt;br /&gt;
 50&lt;br /&gt;
&lt;br /&gt;
== AI Formula Language ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
&lt;br /&gt;
The formula language must be able to access information about the scenario being played to make intelligent decisions. Thus there are various 'inputs' that one may access. A simple example of an input is the turn number one is on, given by the input, 'turn'. Try bringing up the formula command line using 'f' and then type in&lt;br /&gt;
&lt;br /&gt;
 turn&lt;br /&gt;
&lt;br /&gt;
The AI will print out the current turn number the game is on.&lt;br /&gt;
&lt;br /&gt;
The 'turn' input is a simple integer. However, some inputs are complex types which contain other inputs, or which may be lists of inputs. For instance, the input 'my_units' contains a list of all the AI's units.&lt;br /&gt;
&lt;br /&gt;
A complex input such as a unit will contain a variety of inputs inside it. If one has a unit input, called 'u' for instance, one can access the 'x' co-ordinate of that unit by using u.loc.x -- u.loc accesses the 'location' object inside the 'unit' object, and the 'location' object contains 'x' and 'y' inputs inside it, which are the x and y co-ordinate of the unit.&lt;br /&gt;
=== Available variables ===&lt;br /&gt;
these are variables that you can call in an AI formula or from the command line.&lt;br /&gt;
&lt;br /&gt;
Some of these variables are complicated data structues, calling their name from the formula command line will allow you to easily see their content&lt;br /&gt;
&lt;br /&gt;
use the '''dir''' and '''debug_print''' to inspect the variables&lt;br /&gt;
&lt;br /&gt;
to get a coplete list, use the &lt;br /&gt;
 dir(self)&lt;br /&gt;
command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''attacks'' a list of all possible attacks&lt;br /&gt;
NOTE: this variable returns a list of all possible attacks (including attack combinations - attacking a single enemy unit with several units) , which is immediately treated as list of attack orders, which is evaluated (so, evaluation of this variable results in attacks being made). If you want to get the list without such evaluation, wrap it inside the array, &amp;quot;[attacks]&amp;quot;. If you want to get the first attack, wrap it inside the array twice, &amp;quot;[[attacks[0]]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* ''my_attacks'' a list of all possible attacks. It returns slightly different list then ''attacks''. I.e. when only two units (attacker and dedenter) are on the board ''attacks'' return one attack, from the position with the highest defence and ''my_attacks'' returns all 6 attacks from all adjacent tiles.&lt;br /&gt;
* ''my_side'' global variables describing your own side&lt;br /&gt;
* ''teams'' all the data about all the teams&lt;br /&gt;
* ''turn'' the current turn number&lt;br /&gt;
* ''time_of_day'' the current time of day&lt;br /&gt;
* ''keeps'' all keep locations&lt;br /&gt;
* ''vars'' all localy set varables using the set_var function&lt;br /&gt;
* ''allies'' a list of all sides that are friendly&lt;br /&gt;
* ''ennemies'' a list of all sides that are enemy&lt;br /&gt;
* ''my_moves'' a list of all my moves&lt;br /&gt;
* ''enemy_moves'' a list of all enemy moves&lt;br /&gt;
* ''my_leader'' our leader unit&lt;br /&gt;
* ''my_recruits'' the list of units that can be recruited by us&lt;br /&gt;
* ''recruits_of_side'' foreach side the list of units that can be recruited&lt;br /&gt;
* ''units'' the complete list of all units&lt;br /&gt;
* ''units_of_side'' foreach side, a list of all owned units&lt;br /&gt;
* ''my_units'' the complete list of all units owned by the current player&lt;br /&gt;
* ''enemy_units'' all units that are enemy to the current player&lt;br /&gt;
* ''villages'' all the villages on the map&lt;br /&gt;
* ''my_villages'' all the villages owned by the current player&lt;br /&gt;
* ''villages_of_side'' for each side, the list of villages owned&lt;br /&gt;
* ''enemy_and_unowned_villages'' all villages that you don't own&lt;br /&gt;
* ''map'' all the data about the map&lt;br /&gt;
&lt;br /&gt;
=== Built-in functions ===&lt;br /&gt;
The formula language contains a large number of built-in functions which allow you to carry out all kinds of complex tasks. List of these functions, usage and simple examples can be found [http://www.wesnoth.org/wiki/FormulaAI_Functions here].&lt;br /&gt;
&lt;br /&gt;
=== Custom Functions ===&lt;br /&gt;
&lt;br /&gt;
* You can define your own functions. A function is a formula which takes some inputs as parameters. Suppose we wanted to define a function that puts some value on a unit, we might add the following to the [ai] tag:&lt;br /&gt;
&lt;br /&gt;
 [function]&lt;br /&gt;
 name=value_unit&lt;br /&gt;
 inputs=&amp;quot;unit&amp;quot;&lt;br /&gt;
 formula=&amp;quot;unit.hitpoints + unit.level*4&amp;quot;&lt;br /&gt;
 [/function]&lt;br /&gt;
&lt;br /&gt;
This has defined a new function which takes a 'unit' as an input, and runs the given calculation over it.&lt;br /&gt;
&lt;br /&gt;
* We can have multiple inputs in our functions, to define them, just create comma-separated inputs list:&lt;br /&gt;
&lt;br /&gt;
 inputs=&amp;quot;attacker,defender&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This has defined a new function which takes both 'attacker' and 'defender' as an inputs.&lt;br /&gt;
&lt;br /&gt;
* Sometimes, we use one of our inputs really often in our function - to make our life easier we can make its members (inputs) directly accessible from within the formula. This is improved version of function from above:&lt;br /&gt;
&lt;br /&gt;
 [function]&lt;br /&gt;
 name=value_unit&lt;br /&gt;
 inputs=&amp;quot;unit*&amp;quot;&lt;br /&gt;
 formula=&amp;quot;hitpoints + level*4&amp;quot;&lt;br /&gt;
 [/function]&lt;br /&gt;
&lt;br /&gt;
As you can see, if we define input with a * char at the end, we make it a 'default input' for a formula. Note, that you can define only one default input per function.&lt;br /&gt;
&lt;br /&gt;
* It is important to know difference between formulas defined in custom functions, and formula defined by a 'move=' in a [ai] tag. For example, if we want to get info about leader, we write in formula 'my_leader' - which acces member of the AI. To be able to use 'my_leader' in custom functions we have to add 'ai' as an input for our function:&lt;br /&gt;
&lt;br /&gt;
 inputs=&amp;quot;ai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
allows us to access leader info by writing 'ai.my_leader', or:&lt;br /&gt;
&lt;br /&gt;
 inputs=&amp;quot;ai*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
allows us to access leader info by simply writing 'my_leader'&lt;br /&gt;
&lt;br /&gt;
* You can also use 'def' [[#Keywords|keyword]] to define custom functions&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Comments in Formula AI scripts are enclosed by # #:&lt;br /&gt;
&lt;br /&gt;
 #Define opening move#&lt;br /&gt;
 def opening(ai*) &lt;br /&gt;
  if(turn = 1,&lt;br /&gt;
   move(loc(11,23), loc(14,22)),&lt;br /&gt;
  [])&lt;br /&gt;
&lt;br /&gt;
Comments may also be included at the end of a line:&lt;br /&gt;
 &lt;br /&gt;
 def opening(ai*) &lt;br /&gt;
  if(turn = 1,&lt;br /&gt;
   move(loc(11,23), loc(14,22)), #capture village#&lt;br /&gt;
  []) #do nothing#&lt;br /&gt;
&lt;br /&gt;
and they may also be used inline:&lt;br /&gt;
&lt;br /&gt;
 def opening(ai*)&lt;br /&gt;
  if(turn = 1,&lt;br /&gt;
   move(loc(11,23) #my_leader#, loc(14,24) #closest village#),&lt;br /&gt;
  [] #do nothing# )&lt;br /&gt;
&lt;br /&gt;
== Keywords == &lt;br /&gt;
&lt;br /&gt;
The formula language has some reserved keywords to provide primitive functionality.  Currently the following keywords are defined:&lt;br /&gt;
&lt;br /&gt;
* where: This keyword is used to defining statements in formulas. You can define multiple comma-separated statements. Syntax:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;formula&amp;gt; where &amp;lt;comma-separated list of statements&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example formula:&lt;br /&gt;
&lt;br /&gt;
  a + b where a = 2, b = 4&lt;br /&gt;
&lt;br /&gt;
will give as result 6.&lt;br /&gt;
&lt;br /&gt;
* functions: Returns a list of all built-in and custom functions available to the AI&lt;br /&gt;
&lt;br /&gt;
* def: This keyword creates functions using the syntax:&lt;br /&gt;
&lt;br /&gt;
  def function_name(arg1, arg2, ....) function_body&lt;br /&gt;
&lt;br /&gt;
For example,   &lt;br /&gt;
&lt;br /&gt;
  def sum(x,y) x + y&lt;br /&gt;
&lt;br /&gt;
creates a function sum taking two arguments and returns their sum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Files and formulas ==&lt;br /&gt;
&lt;br /&gt;
You can easily split your formulas between different files and include them when necessary. For example:&lt;br /&gt;
&lt;br /&gt;
 [unit]&lt;br /&gt;
  ...&lt;br /&gt;
  formula={my_unit_formula.fai}&lt;br /&gt;
 [/unit]&lt;br /&gt;
&lt;br /&gt;
Will look for unit formula in the my_unit_formula.fai file.&lt;br /&gt;
&lt;br /&gt;
Although it is not mandatory, we advocate to use following syntax in your fai files:&lt;br /&gt;
&lt;br /&gt;
 faifile '&amp;lt;filename&amp;gt;'&lt;br /&gt;
 ...&lt;br /&gt;
 faiend&lt;br /&gt;
&lt;br /&gt;
This makes formula system know which file it is working with now, and gives you improved error reporting, which is often really helpful. Valid syntax for my_unit_formula.fai would be:&lt;br /&gt;
&lt;br /&gt;
 faifile 'my_unit_formula.fai'&lt;br /&gt;
 ...&lt;br /&gt;
 faiend&lt;br /&gt;
&lt;br /&gt;
== Tool Support ==&lt;br /&gt;
&lt;br /&gt;
=== ctags ===&lt;br /&gt;
&lt;br /&gt;
For some rudimentary support for exuberant ctags, add the following to .ctags (or create the file if it doesn't exist):&lt;br /&gt;
&lt;br /&gt;
 --langdef=formulaai&lt;br /&gt;
 --langmap=formulaai:.fai&lt;br /&gt;
 --regex-formulaai=/^def[ \t]*([a-zA-Z0-9_]+)/\1/d,definition/&lt;br /&gt;
&lt;br /&gt;
This is especially nice when used with an editor or plugin with ctags support, such as Taglist for Vim.&lt;br /&gt;
&lt;br /&gt;
=== Vim ===&lt;br /&gt;
&lt;br /&gt;
====Syntax Highlighting====&lt;br /&gt;
&lt;br /&gt;
Follow these steps to enjoy vim syntax highlighting support for Formula AI.&lt;br /&gt;
&lt;br /&gt;
# Grab the Formula AI vim syntax file, [http://svn.gna.org/viewcvs/*checkout*/wesnoth/trunk/data/tools/vim/formulaai.vim formulaai.vim].&lt;br /&gt;
# Copy formulaai.vim to .vim/syntax &lt;br /&gt;
# Add the following to .vimrc :&lt;br /&gt;
 autocmd! BufRead,BufNewFile *.fai setfiletype formulaai&lt;br /&gt;
&lt;br /&gt;
====Taglist Support====&lt;br /&gt;
&lt;br /&gt;
First you will need the very nice [http://www.vim.org/scripts/script.php?script_id=273 taglist plugin].  Follow the link for downloads and install directions if you don't already have it installed.&lt;br /&gt;
&lt;br /&gt;
Next, you'll need Formula AI support for exuberant ctags, follow the instructions in the [[#ctags|ctags]] section.  &lt;br /&gt;
&lt;br /&gt;
Once you have all that, simply add the following line to your .vimrc:&lt;br /&gt;
 &lt;br /&gt;
 let tlist_formulaai_settings = 'formulaai;d:definition'&lt;br /&gt;
&lt;br /&gt;
To test it all out, open a Formula AI script file and enter the command &lt;br /&gt;
 :Tlist&lt;br /&gt;
&lt;br /&gt;
You should now have some nice highlighting and be able to easily navigate through formula, enjoy!&lt;br /&gt;
  &lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DirectActionsWML&amp;diff=46537</id>
		<title>DirectActionsWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DirectActionsWML&amp;diff=46537"/>
		<updated>2012-05-01T21:17:35Z</updated>

		<summary type="html">&lt;p&gt;AI: [object] duration updates&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; 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.&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 true the gold will be added to the starting gold the next scenario, if false the next scenario will start with the amount of the current scenario (after taxes) or the minimum in the next scenario. Default is false.&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''': {{DevFeature1.11}} 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;
&lt;br /&gt;
=== [unit] ===&lt;br /&gt;
Places a unit on the map.  For syntax see [[SingleUnitWML]].&lt;br /&gt;
* {{Short Note:Predefined Macro|GENERIC_UNIT}}&lt;br /&gt;
* '''to_variable''':  spawn directly into a variable instead of on the map.&lt;br /&gt;
&lt;br /&gt;
=== [recall] ===&lt;br /&gt;
Recalls a unit.  The unit is recalled free of charge, and is placed near the leader.&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;
* '''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;
&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 position to teleport to.&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;
=== [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]] {{DevFeature1.11}} tags and keys; default for empty side= is all sides, as usual in a SSF.&lt;br /&gt;
* '''[filter_side]''' with a [[StandardSideFilter]] as argument {{DevFeature1.11}}: [gold][filter_side] is deprecated, use the new inline 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.  This must be a specific variable describing a unit, and may not be an array -- to unstore an entire array, iterate over it.  The variable is not cleared.  See also [[InternalActionsWML#.5Bstore_unit.5D|[store_unit]]], [[ConditionalActionsWML#.5Bwhile.5D|[while]]] and [[InternalActionsWML#.5Bclear_variable.5D|[clear_variable]]].&lt;br /&gt;
* '''variable''': the name of the variable.&lt;br /&gt;
* '''find_vacant''': 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''': (boolean yes|no, default yes): If yes, checks for terrain passability when placing the unit. This key has no effect if find_vacant=no (no check performed then). Before 1.9 this key is always &amp;quot;no&amp;quot;.&lt;br /&gt;
* '''text''': (translatable) floating text to display above the unit, such as a damage amount&lt;br /&gt;
* '''red''', '''green''', '''blue''': (default=0,0,0) the color to display the text in. 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;
* '''advance''': (default=true) if true 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''': (boolean yes|no, default no) Whether any advance/post advance events shall be fired if an advancement takes place, no effect otherwise.&lt;br /&gt;
* '''x''' ,'''y''': override unit location, &amp;quot;x,y=recall,recall&amp;quot; will put the unit on the unit's side's recall list.&lt;br /&gt;
Units can be unstored with negative (or zero) hit points. Such units will be automatically hit (and killed) in combat, but if given the chance to heal, they will have a minimum of one hit point after healing (regardless of how negative their hit points were). This is unusual-looking behavior, so often should be avoided.&amp;lt;!-- A known use-case is using [unstore_unit] to modify a unit during its last_breath event. --&amp;gt;&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]] {{DevFeature1.11}} 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.&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]] {{DevFeature1.11}} 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''': (default=1) the number of the side that is having its recruitment set. This can be a comma-separated list. note: Default side=1 for empty side= is deprecated.&lt;br /&gt;
* [[StandardSideFilter]] {{DevFeature1.11}} 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;
* '''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.&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''': {{DevFeature1.11}} 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]''': replaces a side's AI parameters with the new specified ones. Uses the same syntax described in [[AiWML]].&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''': {{DevFeature1.11}} 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''': {{DevFeature1.11}} 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;
* '''shroud_data''': changes to the side's shroud, using the same format as when defining the [side].&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 take any arguments.&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''': if 'yes', displays the unit dying (fading away).&lt;br /&gt;
* '''fire_event''': 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. 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;
&lt;br /&gt;
=== [move_unit] ===&lt;br /&gt;
works like the MOVE_UNIT macro.&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;
* '''fire_event''' (optional, 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;
* '''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;
&lt;br /&gt;
=== [modify_ai] ===&lt;br /&gt;
Changes AI objects (aspects, goals, candidate actions or stages) for a specified side. See [[AiWML#Adding_and_Deleting_Aspects_with_the_.5Bmodify_ai.5D_Tag|AiWML]] 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]] {{DevFeature1.11}} tags and keys; default for empty side= is all sides, as usual in a SSF.&lt;br /&gt;
* '''[filter_side]''' with a [[StandardSideFilter]] as argument {{DevFeature1.11}}: [modify_ai][filter_side] is deprecated, use the new inline 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;
* Accepts generally the syntax inside of wml unit variables created by [store_unit] which can be viewed in a savefile or by using the :inspect command. Can add traits with immediate effect. Cannot remove things. Subtags with the same name must be written in the correct order to match them with the tag they are supposed to modify.&lt;br /&gt;
example usage (see also the test scenario):&lt;br /&gt;
 [modify_unit]&lt;br /&gt;
     [filter]&lt;br /&gt;
         type=Troll Rocklobber&lt;br /&gt;
     [/filter]&lt;br /&gt;
     hitpoints=10&lt;br /&gt;
     [modifications]&lt;br /&gt;
         [trait]&lt;br /&gt;
             # first trait is unmodified&lt;br /&gt;
         [/trait]&lt;br /&gt;
         {TRAIT_HEALTHY}# second trait is replaced with the healthy trait&lt;br /&gt;
     [/modifications]&lt;br /&gt;
 [/modify_unit]&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: The syntax allowed is somehow vague. Just try things and possibly correct/add/modify this documentation. (a [http://forums.wesnoth.org/viewtopic.php?f=21&amp;amp;t=31676&amp;amp; forum thread] discusses some related issues).&lt;br /&gt;
&lt;br /&gt;
=== [transform_unit] ===&lt;br /&gt;
transforms every unit matching the filter to the given unit type. Keeps intact hitpoints, experience and status. If the unit is transformed to a non-living type (undead or mechanical), it will be also unpoisoned.&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 and removes all items on the tile the unit is on.&lt;br /&gt;
* '''id''': (Optional) when the object is picked up, a flag is set for ''id''.  The object cannot be picked up if a flag for ''id'' has been set.  This means that any object with an id can only be used once, even if first_time_only=no is set for the event. This restriction is per level. In a campaign objects with the same id can be assigned once per level.&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 to work around a bug when adding ABILITY_TELEPORT via an [object] or when using [object][effect][filter]with a $this_unit (see http://gna.org/bugs/index.php?18893).&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 'level', effects only last until the end of the level (note : 'level' is the scenario, so this doesn't mean it last until the unit levels-up). {{DevFeature1.11}} 'level' has been renamed to 'scenario'.&lt;br /&gt;
**if 'forever' or not set, effects never wear off.&lt;br /&gt;
** {{DevFeature1.11}} if 'turn', effects only last until the start of the units next turn (when the unit refreshes movement and attacks).&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)&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 '''[removeitem]''' 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;.&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_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;
{{DevFeature1.11}}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_view=yes).&lt;br /&gt;
&lt;br /&gt;
=== [reset_fog] ===&lt;br /&gt;
{{DevFeature1.11}}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;
Allows the player to undo the event that this tag is inside.  Has an effect only inside moveto events.  If the move is undone, only the position of the unit will be restored; any altered variables or changes to the game will remain changed after the move 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 move the first time.&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 lesser 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.&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 true) for each of the units healed.&lt;br /&gt;
*  '''amount''': (integer, default full) the maximum points the unit(s) will be healed. Can't set below 1 or above max_hitpoints. If &amp;quot;full&amp;quot;, sets hitpoints to max_hitpoints. Before 1.9 the default is 0.&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. Before 1.9 this is always &amp;quot;no&amp;quot;.&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 an 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.&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.&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 an harmer, experience will be attributed like in regular combat.&lt;br /&gt;
*  '''resistance_multiplier''': {{DevFeature1.11}} 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;
* [[TimeWML]]: the new schedule.&lt;br /&gt;
* '''id''': an unique identifier assigned to a time_area. Optional, unless you want to remove the time_area later. 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;
&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;
* '''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;
&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;
&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). ([http://forums.wesnoth.org/viewtopic.php?f=21&amp;amp;t=14749&amp;amp;p=405667&amp;amp;hilit=tunnel#p405667 source])&lt;br /&gt;
&lt;br /&gt;
* '''id''' identifier for the tunnel, to allow removing (optional).&lt;br /&gt;
* '''remove''': (boolean) yes/no value. If yes, removes all defined tunnels with the same ID (then only id= is necessary). (default: no)&lt;br /&gt;
* '''bidirectional''': (boolean) if yes, creates also a tunnel in the other direction. (default: yes)&lt;br /&gt;
* '''always_visible''': (boolean) if yes, the possible movement of enemies under fog can be seen. (default: no)&lt;br /&gt;
* '''[source]''': [[StandardLocationFilter]] the source hex(es) (required).&lt;br /&gt;
* '''[target]''': [[StandardLocationFilter]] the target hex(es) (required).&lt;br /&gt;
* '''[filter]''': [[StandardUnitFilter]] the units which can use the tunnel (required). Leave empty for &amp;quot;all units&amp;quot;.&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;
== 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 [http://www.wesnoth.org/macro-reference.xhtml 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>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=User:AI/Eastern_History_Notes&amp;diff=46464</id>
		<title>User:AI/Eastern History Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=User:AI/Eastern_History_Notes&amp;diff=46464"/>
		<updated>2012-04-15T04:10:51Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Minotaurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Secret stuff regarding Eastern_History (not linked because of WhatLinksHere stuff)&lt;br /&gt;
&lt;br /&gt;
== Silver Drakes ==&lt;br /&gt;
The silver drakes are unusual in that they aren't led by a single ruler, but a council constituted from one drake of each of the castes. Succession is otherwise as normal.&lt;br /&gt;
The council guards the knowledge of the process of maturation into a dragon. A single ruler might be tempted, but even a large nation of drakes cannot expect to sustain a council of 5 dragons.&lt;br /&gt;
&lt;br /&gt;
When the silver drakes take firecloud peak, they unknowingly share this volcano with the Fire King (one of the Earthen Kings). The fire king eventually reaches out to one of the members of the council and reveals/invents a way to only partially trigger the maturation process. This confers most of the magical strength of a dragon onto the drake, without significantly increasing its size.&lt;br /&gt;
&lt;br /&gt;
This drake informed 4 trusted friends of this process, underwent it together and then had his friends challenge and defeat the other members of the council. One of the surviving council members is Græk Lon, who was exiled and soon afterwards captured by Krados. (see TSL/ask espreon)&lt;br /&gt;
&lt;br /&gt;
The Fire King's angle here is that the rigid moral code of the drakes, combined with their disdain for other races, makes a very useful tool.&lt;br /&gt;
&lt;br /&gt;
== Minotaurs ==&lt;br /&gt;
The creator goddess of the minotaurs, Askela, is better known under the name Uria. She turned them from their original human forms into minotaurs after a slight that is said to be the worship of a bull.&lt;br /&gt;
To better understand her in the future, she granted the minotaurs 3 crystals. This started a shamanistic practice centered around crystals, with the three holy ones in possession of the highest elders.&lt;br /&gt;
&lt;br /&gt;
What lead to the start the era of strife was the unification of the three minotaur nations under Rilend Ironfist and the three crystals in the hands of his mage and advisor Zeal. Zeal cut out his eyes and used the crystals to forge a connection to Askela.&lt;br /&gt;
(possibly advised by Zeal) Rilend went to war to expand the empire of Lithia and eventually needed to lead his overstretched forces himself.&lt;br /&gt;
While Zeal was left unchecked in the palace, both he and Uria were corrupted for unknown reasons.&lt;br /&gt;
Zeal, envisioning the next target for conquest, caused the apocalyptic destruction of the rival human nations of Noct and Diurna, using demonic forces.&lt;br /&gt;
However, Rilend returned to Lithia in order to contain Zeal, who quickly assembled an army of demons and mercenaries to defend himself. The ensuing battle claimed the lives most of minotaur army Rilend had brought, and the forces he left behind were overstretched and leaderless, and were killed or routed in the following months.&lt;br /&gt;
Zeal was defeated, but managed to bind his soul to the three crystals as he died.&lt;br /&gt;
&lt;br /&gt;
It is henceforth forbidden to unite the three crystals, as the power is too dangerous to be used.&lt;br /&gt;
Later, the minotaurs are losing a war and are getting pushed back to their capital. A young talented shaman takes one of the holy crystals after the elder who owned it dies in battle. With the power of the crystal, he manages to win several battles, but for every battle he wins, several others are lost. He holds on to the holy crystal, effectively making him an elder, and begins to resent the other elders, who do not use their power effectively in battle.&lt;br /&gt;
At some point, he attempts to relieve the force of one of the other elders, which has been encircled. He manages to break into the encirclement, but can't break them out until the elder dies. He takes up this crystal too, and gains access power far beyond his expectation.&lt;br /&gt;
With his new power, he takes command of all minotaurs present, breaks through the encirclement and marches straight to the final crystal, destroying all in his path. There, he demands the crystal of the final elder, explaining that the combined power will allow him to truly defeat the enemy nation.&lt;br /&gt;
The elder refuses, and the shaman, enraged, kills him for refusing to serve Lithia's best interests. He takes the final crystal, at which point Zeal (slowly or quickly?) possesses him.&lt;br /&gt;
&lt;br /&gt;
Possibly more stuff about Zeal in TSL.&lt;br /&gt;
&lt;br /&gt;
== Eventide ==&lt;br /&gt;
The forerunners of the eventide where pre-khalifate settlers who left the desert because of the taboo on magic.&lt;br /&gt;
The cities of Noct and Diurna were founded after conflicts about which forms of magic should be used, which eventually consolidated around Noct using magic of darkness and Diurna using magic of light.&lt;br /&gt;
&lt;br /&gt;
The eventide formed after Noct and Diurna were both destroyed by the cataclysm described in the minotaur section. They banded together to take revenge. More by accident than through knowledge, the first target of their anger was at least the correct nation, Lithia. With the overstretched minotaur offensive crumbling and retreating beyond easy reach in the absence of its leader, the eventide quickly picked a new target, the xenophobic elves from the northern forest.&lt;br /&gt;
&lt;br /&gt;
== Triththa ==&lt;br /&gt;
The dominion of triththa started out as an illegal colony according to the treaties with the elves. To maintain secrecy, trade with firecloud peak was initially kept to a minimum. (50 BW - 50 YW or so) When the elves finally found out, the orcs were more pressing concern, and besides some strong words, not much was done.&lt;br /&gt;
&lt;br /&gt;
Not long afterwards, firecloud peak was invaded by the silver drakes and the survivors mostly evacuated to the hills and plains of triththa. With this trade with the west was cut off. The elves were not going to let illegal settlers cross one of their most sacred forests, the drakes were hostile to everyone, the desert was too large to cross and other routes were too long to send more than occasional messengers.&lt;br /&gt;
&lt;br /&gt;
This had two important effects: runecraft was maintained, but not communicated to the west and a critical ingredient for the use of thundersticks became unavailable.&lt;br /&gt;
&lt;br /&gt;
More to come...&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=45413</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=45413"/>
		<updated>2012-03-04T03:30:20Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works when -g (--git) is passed, so that it communicates with wescamp at github.com instead of wescamp-i18n at berlios.de.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt&lt;br /&gt;
* Administrator rights on github.com/wescamp (for creating new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the svn invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the svn version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
Invocation (for -u and -U) is the same as with svn, with the following differences:&lt;br /&gt;
* The -g/--git switch is required&lt;br /&gt;
* The -G/--github-login (with argument in the form of USER:PASSWORD) is required an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp/branch-1.10/ -c -g&lt;br /&gt;
This makes a fresh checkout of all translatable 1.10 add-ons in the specified directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown -g&lt;br /&gt;
An existing checkout of the Invasion_from_the_Unknown-1.10 repository in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/ is updated.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -g -G USER:PASSWORD&lt;br /&gt;
The directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github. After this command it will be on github and a checkout will be in the directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/branch-1.10/ -U -g -G USER:PASSWORD&lt;br /&gt;
Updates all 1.10 add-ons. If they are not yet on wescamp, a new repository will be created for them.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=45412</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=45412"/>
		<updated>2012-03-04T03:28:09Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works when -g (--git) is passed, so that it communicates with wescamp at github.com instead of wescamp-i18n at berlios.de.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt&lt;br /&gt;
* Administrator rights on github.com/wescamp (for creating new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the svn invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the svn version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
Invocation (for -u and -U) is the same as with svn, with the following differences:&lt;br /&gt;
* The -g/--git switch is required&lt;br /&gt;
* The -G/--github-login (with argument in the form of USER:PASSWORD) is required an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp/branch-1.10/ -c -g&lt;br /&gt;
This makes a fresh checkout of all translatable 1.10 add-ons in the specified directory.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown -g&lt;br /&gt;
In this case a checkout of the Invasion_from_the_Unknown-1.10 repository already exists in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -g -G USER:PASSWORD&lt;br /&gt;
In this case the directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/branch-1.10/ -U -g -G USER:PASSWORD&lt;br /&gt;
Updates all 1.10 add-ons. If they are not yet on wescamp, a new repository will be created for them.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=PblWML&amp;diff=45341</id>
		<title>PblWML</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=PblWML&amp;diff=45341"/>
		<updated>2012-02-21T23:31:28Z</updated>

		<summary type="html">&lt;p&gt;AI: /* email */&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 .pbl file.&lt;br /&gt;
&lt;br /&gt;
This is a file with name '''data/add-ons/''Addon_name''.pbl''' or, for Wesnoth 1.6 and later, '''data/add-ons/''Addon_Name''/_server.pbl''' in a subdirectory.  [http://exong.net/wesnoth-attach/files/pblexample_111.png Click here for an example of what we're talking about.]&lt;br /&gt;
&lt;br /&gt;
When you upload a add-on, the file '''data/add-ons/''Addon_Name''.cfg'''&lt;br /&gt;
and the directory '''data/add-ons/''Addon_Name''/''' will be published. Alternatively, '''data/add-ons/''Addon_Name''.cfg''' can be replaced with '''data/add-ons/''Addon_Name''/_main.cfg'''. Your add-on must be based entirely on these paths.&lt;br /&gt;
&lt;br /&gt;
Be aware that translations in the .pbl-files are '''not''' used, 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 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 [[ImagePathFunctionWML]] to recolor it.&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;
&lt;br /&gt;
=== version ===&lt;br /&gt;
: Displayed to the right of the title, it is just 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'' the numbers. This is necessary for the ''Update add-ons'' button to work correctly. ([[#Version Key Examples|See Examples]])&lt;br /&gt;
&lt;br /&gt;
=== author ===&lt;br /&gt;
: Displayed to the right of the version, it is just 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;
&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;
&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;
&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;
=== translate ===&lt;br /&gt;
: If set to '''true''', the add-on will be sent to and updated with [[WesCamp|WesCamp-i18n]]. (NOTE: this is a new and experimental function, which will automatically update the translations in your add-on. Make sure you make backups of your add-on in case of problems.)&lt;br /&gt;
&lt;br /&gt;
: You should make sure your add-on complies with some very specific [[WesCamp#How_to_contribute_to_this_Project|conventions]] required to ease the process for translators.&lt;br /&gt;
&lt;br /&gt;
=== type ===&lt;br /&gt;
: Indicates the type of the add-on, used for the downloads manager dialog. Possible values are:&lt;br /&gt;
&lt;br /&gt;
:* ''campaign'': single player campaign.&lt;br /&gt;
:* ''scenario'': single player scenario.&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;
:* ''media'': miscellaneous resources for UMC authors/users, for example, music packs, packages of general-purpose WML, etc.&lt;br /&gt;
:* ''other'': The type to use when no other type fits.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' If your add-on contains two or more separate multiplayer scenarios, use ''map_pack''.&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;
&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;
The following are examples of '''good''' version values:&lt;br /&gt;
&lt;br /&gt;
 version=&amp;quot;1.5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 version=&amp;quot;0.11.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 version=&amp;quot;0.1.4beta&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 version=&amp;quot;1.5c&amp;quot;&lt;br /&gt;
&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;
&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;
&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;
&lt;br /&gt;
 1.5 &amp;lt; 1.5c&lt;br /&gt;
&lt;br /&gt;
 1.0 &amp;lt; 1.0.1&lt;br /&gt;
&lt;br /&gt;
 1.0c &amp;lt; 1.0.1a&lt;br /&gt;
&lt;br /&gt;
 1.0.1a &amp;lt; 1.0.1c&lt;br /&gt;
&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;
 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&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;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
* [[BuildingCampaignsThePBLFile]]&lt;br /&gt;
* [[CampaignServerWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category: WML Reference]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=45122</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=45122"/>
		<updated>2012-02-07T15:22:41Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works when -g (--git) is passed, so that it communicates with wescamp at github.com instead of wescamp-i18n at berlios.de.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt&lt;br /&gt;
* Administrator rights on github.com/wescamp (for creating new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the svn invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the svn version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
Invocation (for -u and -U) is the same as with svn, with the following differences:&lt;br /&gt;
* The -g/--git switch is required&lt;br /&gt;
* The -G/--github-login (with argument in the form of USER:PASSWORD) is required an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown -g&lt;br /&gt;
In this case a checkout of the Invasion_from_the_Unknown-1.10 repository already exists in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -g -G USER:PASSWORD&lt;br /&gt;
In this case the directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github.&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/branch-1.10/ -U -g -G USER:PASSWORD&lt;br /&gt;
Updates all 1.10 add-ons. If they are not yet on wescamp, a new repository will be created for them.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesCamp&amp;diff=44699</id>
		<title>WesCamp</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesCamp&amp;diff=44699"/>
		<updated>2012-01-17T17:39:23Z</updated>

		<summary type="html">&lt;p&gt;AI: /* See Also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is dedicated to describing how to translate user-made content with the help of the [https://developer.berlios.de/projects/wescamp-i18n WesCamp-i18n] project.&lt;br /&gt;
&lt;br /&gt;
This project is hosted at [http://www.berlios.de/ BerliOS] and maintained by [mailto:david_AT_torangan.de Torangan] and [mailto:Majora700@gmail.com Espreon]. Add-ons are uploaded into the Subversion repository and .po files of the content are created. The .po files are updated regularly and the stats can be found at http://gettext.wesnoth.org.&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;
This page is dedicated to describing how to translate user-made content with the help of the [https://developer.berlios.de/projects/wescamp-i18n WesCamp-i18n] project.&lt;br /&gt;
&lt;br /&gt;
This project is hosted at [http://www.berlios.de/ BerliOS] and maintained by [mailto:david_AT_torangan.de Torangan] and [mailto:Majora700@gmail.com Espreon]. Add-ons are uploaded into the Subversion repository and .po files of the content are created. The .po files are updated regularly and the stats can be found at http://gettext.wesnoth.org.&lt;br /&gt;
&lt;br /&gt;
== Preparing your add-on for WesCamp ==&lt;br /&gt;
&lt;br /&gt;
In order for your add-on to be compatible with WesCamp’s translation tools, certain things must be done. This section describes what must be done and what should be done anyway.&lt;br /&gt;
&lt;br /&gt;
=== The textdomain declaration ===&lt;br /&gt;
First, your add-on must declare a textdomain. To do this, make sure something like the following is inside of your _main.cfg:&lt;br /&gt;
&lt;br /&gt;
  [textdomain]&lt;br /&gt;
      name=&amp;quot;wesnoth-Son_of_Haldric&amp;quot;&lt;br /&gt;
      path=&amp;quot;data/add-ons/Son_of_Haldric/translations&amp;quot;&lt;br /&gt;
  [/textdomain]&lt;br /&gt;
&lt;br /&gt;
Note that to be compatible with WesCamp’s tools, the part of the textdomain after ''wesnoth-'' must match your add-on’s directory name. In this example, the add-on’s directory is ''Son_of_Haldric'', thus we would get ''wesnoth-Son_of_Haldric''.&lt;br /&gt;
&lt;br /&gt;
The ''translations'' directory is where compiled translations would go.&lt;br /&gt;
&lt;br /&gt;
=== The textdomain bindings ===&lt;br /&gt;
&lt;br /&gt;
All files with translatable strings must be bound to your domain. See the example below:&lt;br /&gt;
&lt;br /&gt;
   #textdomain wesnoth-Son_of_Haldric&lt;br /&gt;
   &lt;br /&gt;
   [unit_type]&lt;br /&gt;
       id=Mu&lt;br /&gt;
       name= _ &amp;quot;Mu&amp;quot;&lt;br /&gt;
       ...&lt;br /&gt;
   [/unit_type]&lt;br /&gt;
&lt;br /&gt;
Note that you can reuse translations for strings in mainline domains by using multiple textdomain bindings or a gettext helper file (which will be explained later):&lt;br /&gt;
&lt;br /&gt;
    # textdomain wesnoth-Son_of_Haldric&lt;br /&gt;
    &lt;br /&gt;
    [unit_type]&lt;br /&gt;
        id=Mu&lt;br /&gt;
        name= _ &amp;quot;Mu&amp;quot;&lt;br /&gt;
        ...&lt;br /&gt;
   &lt;br /&gt;
        [attack]&lt;br /&gt;
            id=sword&lt;br /&gt;
            #textdomain wesnoth-units&lt;br /&gt;
            description= _ &amp;quot;sword&amp;quot;&lt;br /&gt;
            ...&lt;br /&gt;
        [/attack]&lt;br /&gt;
   &lt;br /&gt;
        #textdomain wesnoth-Son_of_Haldric&lt;br /&gt;
&lt;br /&gt;
Of course, if you use bindings for multiple textdomains, make sure the right parts of the file are bound to the right domains. Also, never try to use the mainline campaigns’ domains, for there is no guarantee that the mainline campaigns will be available on all setups. So, only use the core domains: wesnoth, wesnoth-editor, wesnoth-lib, wesnoth-help, wesnoth-test, and wesnoth-units.&lt;br /&gt;
&lt;br /&gt;
Note that it is highly recommended that the first textdomain binding be on the first line of the file. Otherwise, odd stuff may happen.&lt;br /&gt;
&lt;br /&gt;
=== The translatable strings ===&lt;br /&gt;
&lt;br /&gt;
To mark a string as translatable, just put an underscore ( _ ) in front of the string you wish to be marked as translatable, like the example below:&lt;br /&gt;
&lt;br /&gt;
    name= _ &amp;quot;Mu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that there are certain things you should never do. For example, '''never''' mark an empty string as translatable, for wmlxgettext (the tool that extracts strings from WML) will abort upon detecting one. Therefore, what is seen below should never be done:&lt;br /&gt;
&lt;br /&gt;
   name= _ &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Also, never put macro arguments in a translatable string, for it will not work. The reason for this is that the preprocessor does its job before gettext, thus gettext will try to replace a string that does not exist. Therefore, what is shown below should not be done:&lt;br /&gt;
&lt;br /&gt;
    name= _ &amp;quot;{TYPE} Mu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
To show why it will not work:&lt;br /&gt;
&lt;br /&gt;
   #define UNIT_NAME TYPE&lt;br /&gt;
       name= _ &amp;quot;{TYPE} Mu&amp;quot;&lt;br /&gt;
   #enddef&lt;br /&gt;
   &lt;br /&gt;
   {UNIT_NAME ( _ &amp;quot;Sword&amp;quot;)}&lt;br /&gt;
   {UNIT_NAME ( _ &amp;quot;Bow&amp;quot;)}&lt;br /&gt;
   &lt;br /&gt;
   Translation catalogues would have this: &amp;quot;{TYPE} Mu&amp;quot;, therefore gettext will look for it even though it will not exist because we, in fact, have these after the preprocessor is done:&lt;br /&gt;
   &lt;br /&gt;
   name= _ &amp;quot;Sword Mu&amp;quot;&lt;br /&gt;
   name= _ &amp;quot;Bow Mu&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   Since those are not in the catalogues, they will not get translated.&lt;br /&gt;
&lt;br /&gt;
=== The gettext helper file ===&lt;br /&gt;
&lt;br /&gt;
A gettext helper file is a lovely file that makes reusing mainline translations nice and easy. It is also more wmllint-friendly.&lt;br /&gt;
&lt;br /&gt;
Here is an example of a gettext helper file:&lt;br /&gt;
&lt;br /&gt;
   #textdomain wesnoth-lib&lt;br /&gt;
   &lt;br /&gt;
   #define STR_ICE&lt;br /&gt;
   _&amp;quot;Ice&amp;quot; #enddef&lt;br /&gt;
   &lt;br /&gt;
   #textdomain wesnoth-units&lt;br /&gt;
   &lt;br /&gt;
   #define STR_SWORD&lt;br /&gt;
   _&amp;quot;sword&amp;quot; #enddef&lt;br /&gt;
&lt;br /&gt;
A typical name for gettext helper files is ''mainline-strings.cfg''.&lt;br /&gt;
&lt;br /&gt;
To use it, just wire it into your add-on and use the macros:&lt;br /&gt;
&lt;br /&gt;
   [attack]&lt;br /&gt;
       id=sword&lt;br /&gt;
       name={STR_SWORD}&lt;br /&gt;
       ...&lt;br /&gt;
   [/attack]&lt;br /&gt;
&lt;br /&gt;
   [terrain_type]&lt;br /&gt;
       id=ice2&lt;br /&gt;
       name={STR_ICE}&lt;br /&gt;
       ...&lt;br /&gt;
   [/terrain_type]&lt;br /&gt;
&lt;br /&gt;
=== Getting your add-on into WesCamp ===&lt;br /&gt;
&lt;br /&gt;
Now, to get your add-on into WesCamp, all you do is put this line into your add-on’s .pbl file and upload to the add-ons server:&lt;br /&gt;
&lt;br /&gt;
   translate=true&lt;br /&gt;
&lt;br /&gt;
Your add-on will eventually be uploaded to WesCamp’s Subversion repository by mordante’s script, which he runs whenever.&lt;br /&gt;
&lt;br /&gt;
== How to contribute to this project ==&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, mail them to [mailto:Majora700@gmail.com Espreon] or (as a last resort) [mailto:david_AT_torangan.de Torangan].&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.freenode.net/wesnoth #wesnoth] channel on the Freenode 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:Majora700@gmail.com Espreon] or [mailto:david_AT_torangan.de Torangan].&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&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>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesCamp&amp;diff=44698</id>
		<title>WesCamp</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesCamp&amp;diff=44698"/>
		<updated>2012-01-17T17:12:20Z</updated>

		<summary type="html">&lt;p&gt;AI: /* See Also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is dedicated to describing how to translate user-made content with the help of the [https://developer.berlios.de/projects/wescamp-i18n WesCamp-i18n] project.&lt;br /&gt;
&lt;br /&gt;
This project is hosted at [http://www.berlios.de/ BerliOS] and maintained by [mailto:david_AT_torangan.de Torangan] and [mailto:Majora700@gmail.com Espreon]. Add-ons are uploaded into the Subversion repository and .po files of the content are created. The .po files are updated regularly and the stats can be found at http://gettext.wesnoth.org.&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;
This page is dedicated to describing how to translate user-made content with the help of the [https://developer.berlios.de/projects/wescamp-i18n WesCamp-i18n] project.&lt;br /&gt;
&lt;br /&gt;
This project is hosted at [http://www.berlios.de/ BerliOS] and maintained by [mailto:david_AT_torangan.de Torangan] and [mailto:Majora700@gmail.com Espreon]. Add-ons are uploaded into the Subversion repository and .po files of the content are created. The .po files are updated regularly and the stats can be found at http://gettext.wesnoth.org.&lt;br /&gt;
&lt;br /&gt;
== Preparing your add-on for WesCamp ==&lt;br /&gt;
&lt;br /&gt;
In order for your add-on to be compatible with WesCamp’s translation tools, certain things must be done. This section describes what must be done and what should be done anyway.&lt;br /&gt;
&lt;br /&gt;
=== The textdomain declaration ===&lt;br /&gt;
First, your add-on must declare a textdomain. To do this, make sure something like the following is inside of your _main.cfg:&lt;br /&gt;
&lt;br /&gt;
  [textdomain]&lt;br /&gt;
      name=&amp;quot;wesnoth-Son_of_Haldric&amp;quot;&lt;br /&gt;
      path=&amp;quot;data/add-ons/Son_of_Haldric/translations&amp;quot;&lt;br /&gt;
  [/textdomain]&lt;br /&gt;
&lt;br /&gt;
Note that to be compatible with WesCamp’s tools, the part of the textdomain after ''wesnoth-'' must match your add-on’s directory name. In this example, the add-on’s directory is ''Son_of_Haldric'', thus we would get ''wesnoth-Son_of_Haldric''.&lt;br /&gt;
&lt;br /&gt;
The ''translations'' directory is where compiled translations would go.&lt;br /&gt;
&lt;br /&gt;
=== The textdomain bindings ===&lt;br /&gt;
&lt;br /&gt;
All files with translatable strings must be bound to your domain. See the example below:&lt;br /&gt;
&lt;br /&gt;
   #textdomain wesnoth-Son_of_Haldric&lt;br /&gt;
   &lt;br /&gt;
   [unit_type]&lt;br /&gt;
       id=Mu&lt;br /&gt;
       name= _ &amp;quot;Mu&amp;quot;&lt;br /&gt;
       ...&lt;br /&gt;
   [/unit_type]&lt;br /&gt;
&lt;br /&gt;
Note that you can reuse translations for strings in mainline domains by using multiple textdomain bindings or a gettext helper file (which will be explained later):&lt;br /&gt;
&lt;br /&gt;
    # textdomain wesnoth-Son_of_Haldric&lt;br /&gt;
    &lt;br /&gt;
    [unit_type]&lt;br /&gt;
        id=Mu&lt;br /&gt;
        name= _ &amp;quot;Mu&amp;quot;&lt;br /&gt;
        ...&lt;br /&gt;
   &lt;br /&gt;
        [attack]&lt;br /&gt;
            id=sword&lt;br /&gt;
            #textdomain wesnoth-units&lt;br /&gt;
            description= _ &amp;quot;sword&amp;quot;&lt;br /&gt;
            ...&lt;br /&gt;
        [/attack]&lt;br /&gt;
   &lt;br /&gt;
        #textdomain wesnoth-Son_of_Haldric&lt;br /&gt;
&lt;br /&gt;
Of course, if you use bindings for multiple textdomains, make sure the right parts of the file are bound to the right domains. Also, never try to use the mainline campaigns’ domains, for there is no guarantee that the mainline campaigns will be available on all setups. So, only use the core domains: wesnoth, wesnoth-editor, wesnoth-lib, wesnoth-help, wesnoth-test, and wesnoth-units.&lt;br /&gt;
&lt;br /&gt;
Note that it is highly recommended that the first textdomain binding be on the first line of the file. Otherwise, odd stuff may happen.&lt;br /&gt;
&lt;br /&gt;
=== The translatable strings ===&lt;br /&gt;
&lt;br /&gt;
To mark a string as translatable, just put an underscore ( _ ) in front of the string you wish to be marked as translatable, like the example below:&lt;br /&gt;
&lt;br /&gt;
    name= _ &amp;quot;Mu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that there are certain things you should never do. For example, '''never''' mark an empty string as translatable, for wmlxgettext (the tool that extracts strings from WML) will abort upon detecting one. Therefore, what is seen below should never be done:&lt;br /&gt;
&lt;br /&gt;
   name= _ &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Also, never put macro arguments in a translatable string, for it will not work. The reason for this is that the preprocessor does its job before gettext, thus gettext will try to replace a string that does not exist. Therefore, what is shown below should not be done:&lt;br /&gt;
&lt;br /&gt;
    name= _ &amp;quot;{TYPE} Mu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
To show why it will not work:&lt;br /&gt;
&lt;br /&gt;
   #define UNIT_NAME TYPE&lt;br /&gt;
       name= _ &amp;quot;{TYPE} Mu&amp;quot;&lt;br /&gt;
   #enddef&lt;br /&gt;
   &lt;br /&gt;
   {UNIT_NAME ( _ &amp;quot;Sword&amp;quot;)}&lt;br /&gt;
   {UNIT_NAME ( _ &amp;quot;Bow&amp;quot;)}&lt;br /&gt;
   &lt;br /&gt;
   Translation catalogues would have this: &amp;quot;{TYPE} Mu&amp;quot;, therefore gettext will look for it even though it will not exist because we, in fact, have these after the preprocessor is done:&lt;br /&gt;
   &lt;br /&gt;
   name= _ &amp;quot;Sword Mu&amp;quot;&lt;br /&gt;
   name= _ &amp;quot;Bow Mu&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   Since those are not in the catalogues, they will not get translated.&lt;br /&gt;
&lt;br /&gt;
=== The gettext helper file ===&lt;br /&gt;
&lt;br /&gt;
A gettext helper file is a lovely file that makes reusing mainline translations nice and easy. It is also more wmllint-friendly.&lt;br /&gt;
&lt;br /&gt;
Here is an example of a gettext helper file:&lt;br /&gt;
&lt;br /&gt;
   #textdomain wesnoth-lib&lt;br /&gt;
   &lt;br /&gt;
   #define STR_ICE&lt;br /&gt;
   _&amp;quot;Ice&amp;quot; #enddef&lt;br /&gt;
   &lt;br /&gt;
   #textdomain wesnoth-units&lt;br /&gt;
   &lt;br /&gt;
   #define STR_SWORD&lt;br /&gt;
   _&amp;quot;sword&amp;quot; #enddef&lt;br /&gt;
&lt;br /&gt;
A typical name for gettext helper files is ''mainline-strings.cfg''.&lt;br /&gt;
&lt;br /&gt;
To use it, just wire it into your add-on and use the macros:&lt;br /&gt;
&lt;br /&gt;
   [attack]&lt;br /&gt;
       id=sword&lt;br /&gt;
       name={STR_SWORD}&lt;br /&gt;
       ...&lt;br /&gt;
   [/attack]&lt;br /&gt;
&lt;br /&gt;
   [terrain_type]&lt;br /&gt;
       id=ice2&lt;br /&gt;
       name={STR_ICE}&lt;br /&gt;
       ...&lt;br /&gt;
   [/terrain_type]&lt;br /&gt;
&lt;br /&gt;
=== Getting your add-on into WesCamp ===&lt;br /&gt;
&lt;br /&gt;
Now, to get your add-on into WesCamp, all you do is put this line into your add-on’s .pbl file and upload to the add-ons server:&lt;br /&gt;
&lt;br /&gt;
   translate=true&lt;br /&gt;
&lt;br /&gt;
Your add-on will eventually be uploaded to WesCamp’s Subversion repository by mordante’s script, which he runs whenever.&lt;br /&gt;
&lt;br /&gt;
== How to contribute to this project ==&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, mail them to [mailto:Majora700@gmail.com Espreon] or (as a last resort) [mailto:david_AT_torangan.de Torangan].&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.freenode.net/wesnoth #wesnoth] channel on the Freenode 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:Majora700@gmail.com Espreon] or [mailto:david_AT_torangan.de Torangan].&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&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;
&lt;br /&gt;
[[Category:Translations|*]]&lt;br /&gt;
[[Category:Campaigns]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesCamp&amp;diff=44697</id>
		<title>WesCamp</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesCamp&amp;diff=44697"/>
		<updated>2012-01-17T16:55:12Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Translators */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is dedicated to describing how to translate user-made content with the help of the [https://developer.berlios.de/projects/wescamp-i18n WesCamp-i18n] project.&lt;br /&gt;
&lt;br /&gt;
This project is hosted at [http://www.berlios.de/ BerliOS] and maintained by [mailto:david_AT_torangan.de Torangan] and [mailto:Majora700@gmail.com Espreon]. Add-ons are uploaded into the Subversion repository and .po files of the content are created. The .po files are updated regularly and the stats can be found at http://gettext.wesnoth.org.&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;
This page is dedicated to describing how to translate user-made content with the help of the [https://developer.berlios.de/projects/wescamp-i18n WesCamp-i18n] project.&lt;br /&gt;
&lt;br /&gt;
This project is hosted at [http://www.berlios.de/ BerliOS] and maintained by [mailto:david_AT_torangan.de Torangan] and [mailto:Majora700@gmail.com Espreon]. Add-ons are uploaded into the Subversion repository and .po files of the content are created. The .po files are updated regularly and the stats can be found at http://gettext.wesnoth.org.&lt;br /&gt;
&lt;br /&gt;
== Preparing your add-on for WesCamp ==&lt;br /&gt;
&lt;br /&gt;
In order for your add-on to be compatible with WesCamp’s translation tools, certain things must be done. This section describes what must be done and what should be done anyway.&lt;br /&gt;
&lt;br /&gt;
=== The textdomain declaration ===&lt;br /&gt;
First, your add-on must declare a textdomain. To do this, make sure something like the following is inside of your _main.cfg:&lt;br /&gt;
&lt;br /&gt;
  [textdomain]&lt;br /&gt;
      name=&amp;quot;wesnoth-Son_of_Haldric&amp;quot;&lt;br /&gt;
      path=&amp;quot;data/add-ons/Son_of_Haldric/translations&amp;quot;&lt;br /&gt;
  [/textdomain]&lt;br /&gt;
&lt;br /&gt;
Note that to be compatible with WesCamp’s tools, the part of the textdomain after ''wesnoth-'' must match your add-on’s directory name. In this example, the add-on’s directory is ''Son_of_Haldric'', thus we would get ''wesnoth-Son_of_Haldric''.&lt;br /&gt;
&lt;br /&gt;
The ''translations'' directory is where compiled translations would go.&lt;br /&gt;
&lt;br /&gt;
=== The textdomain bindings ===&lt;br /&gt;
&lt;br /&gt;
All files with translatable strings must be bound to your domain. See the example below:&lt;br /&gt;
&lt;br /&gt;
   #textdomain wesnoth-Son_of_Haldric&lt;br /&gt;
   &lt;br /&gt;
   [unit_type]&lt;br /&gt;
       id=Mu&lt;br /&gt;
       name= _ &amp;quot;Mu&amp;quot;&lt;br /&gt;
       ...&lt;br /&gt;
   [/unit_type]&lt;br /&gt;
&lt;br /&gt;
Note that you can reuse translations for strings in mainline domains by using multiple textdomain bindings or a gettext helper file (which will be explained later):&lt;br /&gt;
&lt;br /&gt;
    # textdomain wesnoth-Son_of_Haldric&lt;br /&gt;
    &lt;br /&gt;
    [unit_type]&lt;br /&gt;
        id=Mu&lt;br /&gt;
        name= _ &amp;quot;Mu&amp;quot;&lt;br /&gt;
        ...&lt;br /&gt;
   &lt;br /&gt;
        [attack]&lt;br /&gt;
            id=sword&lt;br /&gt;
            #textdomain wesnoth-units&lt;br /&gt;
            description= _ &amp;quot;sword&amp;quot;&lt;br /&gt;
            ...&lt;br /&gt;
        [/attack]&lt;br /&gt;
   &lt;br /&gt;
        #textdomain wesnoth-Son_of_Haldric&lt;br /&gt;
&lt;br /&gt;
Of course, if you use bindings for multiple textdomains, make sure the right parts of the file are bound to the right domains. Also, never try to use the mainline campaigns’ domains, for there is no guarantee that the mainline campaigns will be available on all setups. So, only use the core domains: wesnoth, wesnoth-editor, wesnoth-lib, wesnoth-help, wesnoth-test, and wesnoth-units.&lt;br /&gt;
&lt;br /&gt;
Note that it is highly recommended that the first textdomain binding be on the first line of the file. Otherwise, odd stuff may happen.&lt;br /&gt;
&lt;br /&gt;
=== The translatable strings ===&lt;br /&gt;
&lt;br /&gt;
To mark a string as translatable, just put an underscore ( _ ) in front of the string you wish to be marked as translatable, like the example below:&lt;br /&gt;
&lt;br /&gt;
    name= _ &amp;quot;Mu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that there are certain things you should never do. For example, '''never''' mark an empty string as translatable, for wmlxgettext (the tool that extracts strings from WML) will abort upon detecting one. Therefore, what is seen below should never be done:&lt;br /&gt;
&lt;br /&gt;
   name= _ &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Also, never put macro arguments in a translatable string, for it will not work. The reason for this is that the preprocessor does its job before gettext, thus gettext will try to replace a string that does not exist. Therefore, what is shown below should not be done:&lt;br /&gt;
&lt;br /&gt;
    name= _ &amp;quot;{TYPE} Mu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
To show why it will not work:&lt;br /&gt;
&lt;br /&gt;
   #define UNIT_NAME TYPE&lt;br /&gt;
       name= _ &amp;quot;{TYPE} Mu&amp;quot;&lt;br /&gt;
   #enddef&lt;br /&gt;
   &lt;br /&gt;
   {UNIT_NAME ( _ &amp;quot;Sword&amp;quot;)}&lt;br /&gt;
   {UNIT_NAME ( _ &amp;quot;Bow&amp;quot;)}&lt;br /&gt;
   &lt;br /&gt;
   Translation catalogues would have this: &amp;quot;{TYPE} Mu&amp;quot;, therefore gettext will look for it even though it will not exist because we, in fact, have these after the preprocessor is done:&lt;br /&gt;
   &lt;br /&gt;
   name= _ &amp;quot;Sword Mu&amp;quot;&lt;br /&gt;
   name= _ &amp;quot;Bow Mu&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   Since those are not in the catalogues, they will not get translated.&lt;br /&gt;
&lt;br /&gt;
=== The gettext helper file ===&lt;br /&gt;
&lt;br /&gt;
A gettext helper file is a lovely file that makes reusing mainline translations nice and easy. It is also more wmllint-friendly.&lt;br /&gt;
&lt;br /&gt;
Here is an example of a gettext helper file:&lt;br /&gt;
&lt;br /&gt;
   #textdomain wesnoth-lib&lt;br /&gt;
   &lt;br /&gt;
   #define STR_ICE&lt;br /&gt;
   _&amp;quot;Ice&amp;quot; #enddef&lt;br /&gt;
   &lt;br /&gt;
   #textdomain wesnoth-units&lt;br /&gt;
   &lt;br /&gt;
   #define STR_SWORD&lt;br /&gt;
   _&amp;quot;sword&amp;quot; #enddef&lt;br /&gt;
&lt;br /&gt;
A typical name for gettext helper files is ''mainline-strings.cfg''.&lt;br /&gt;
&lt;br /&gt;
To use it, just wire it into your add-on and use the macros:&lt;br /&gt;
&lt;br /&gt;
   [attack]&lt;br /&gt;
       id=sword&lt;br /&gt;
       name={STR_SWORD}&lt;br /&gt;
       ...&lt;br /&gt;
   [/attack]&lt;br /&gt;
&lt;br /&gt;
   [terrain_type]&lt;br /&gt;
       id=ice2&lt;br /&gt;
       name={STR_ICE}&lt;br /&gt;
       ...&lt;br /&gt;
   [/terrain_type]&lt;br /&gt;
&lt;br /&gt;
=== Getting your add-on into WesCamp ===&lt;br /&gt;
&lt;br /&gt;
Now, to get your add-on into WesCamp, all you do is put this line into your add-on’s .pbl file and upload to the add-ons server:&lt;br /&gt;
&lt;br /&gt;
   translate=true&lt;br /&gt;
&lt;br /&gt;
Your add-on will eventually be uploaded to WesCamp’s Subversion repository by mordante’s script, which he runs whenever.&lt;br /&gt;
&lt;br /&gt;
== How to contribute to this project ==&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, mail them to [mailto:Majora700@gmail.com Espreon] or (as a last resort) [mailto:david_AT_torangan.de Torangan].&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.freenode.net/wesnoth #wesnoth] channel on the Freenode 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:Majora700@gmail.com Espreon] or [mailto:david_AT_torangan.de Torangan].&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&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://developer.berlios.de/projects/wescamp-i18n WesCamp-i18n project at Berlios.de]&lt;br /&gt;
* [http://svn.berlios.de/viewcvs/wescamp-i18n/ WesCamp-i18n SVN tree]&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;br /&gt;
[[Category:Campaigns]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=44477</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=44477"/>
		<updated>2011-12-27T00:54:30Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works when -g (--git) is passed, so that it communicates with wescamp at github.com instead of wescamp-i18n at berlios.de.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt&lt;br /&gt;
* Administrator rights on github.com/wescamp (for creating new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the svn invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the svn version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
Invocation (for -u and -U) is the same as with svn, with the following differences:&lt;br /&gt;
* The -g/--git switch is required&lt;br /&gt;
* The -G/--github-login (with argument in the form of USER:PASSWORD) is required an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown -g&lt;br /&gt;
In this case a checkout of the Invasion_from_the_Unknown-1.10 repository already exists in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -g -G USER:PASSWORD&lt;br /&gt;
In this case the directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;br /&gt;
&lt;br /&gt;
[[Category:Translations|*]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=44476</id>
		<title>Wescamp.py Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wescamp.py_Instructions&amp;diff=44476"/>
		<updated>2011-12-27T00:53:29Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Checkouts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documented here is how wescamp.py works when -g (--git) is passed, so that it communicates with wescamp at github.com instead of wescamp-i18n at berlios.de.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Git&lt;br /&gt;
* Python (2.5 or above should work)&lt;br /&gt;
* Ssh keys so that git push doesn't require a password prompt&lt;br /&gt;
* Administrator rights on github.com/wescamp (for creating new repositories)&lt;br /&gt;
&lt;br /&gt;
== Checkouts ==&lt;br /&gt;
Like the svn invocation, with git, a directory per &amp;quot;version branch&amp;quot; is required. Unlike the svn version, you can't simply check out a single directory to do this.&lt;br /&gt;
The -c/--checkout switch will check out a version directory for you, if it is properly named. The -U switch can make the checkouts as a side-effect.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;version directory&amp;quot; is required to end in the version it's for, as this is currently the method used to identify the version. The following formats work:&lt;br /&gt;
 /tmp/wescamp/1.10&lt;br /&gt;
 /tmp/wescamp-1.10&lt;br /&gt;
&lt;br /&gt;
== Invocation ==&lt;br /&gt;
Invocation (for -u and -U) is the same as with svn, with the following differences:&lt;br /&gt;
* The -g/--git switch is required&lt;br /&gt;
* The -G/--github-login (with argument in the form of USER:PASSWORD) is required an upload would create a new repository on github. This is because a json API is used to create the new repository.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Invasion_from_the_Unknown -g&lt;br /&gt;
In this case a checkout of the Invasion_from_the_Unknown-1.10 repository already exists in /tmp/wescamp-upload/1.10/Invasion_from_the_Unknown/&lt;br /&gt;
&lt;br /&gt;
 ./data/tools/wesnoth/wescamp.py -scampaigns.wesnoth.org -p15002 -w/tmp/wescamp-upload/1.10/ -u Era_of_Myths -g -G USER:PASSWORD&lt;br /&gt;
In this case the directory /tmp/wescamp-upload/1.10/ exists, but there is no Era_of_Myths directory in it and neither is there an Era_of_Myths-1.10 repository on github.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If there's anything missing, please contact me. (AI0867)&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Sandbox&amp;diff=44415</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Sandbox&amp;diff=44415"/>
		<updated>2011-12-15T18:26:55Z</updated>

		<summary type="html">&lt;p&gt;AI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--Do not remove --&amp;gt;&lt;br /&gt;
The sandbox is for editing and formatting experiments. If you are already logged in, click on the &amp;quot;Edit&amp;quot; link above to experiment yourself!&lt;br /&gt;
[[Category:Wesnoth Wiki]]&lt;br /&gt;
&amp;lt;!--Edit below this line --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LinkMacro|GOLD|easy normal hard}}&lt;br /&gt;
&lt;br /&gt;
And now a simple {{LinkMacro|GOLD}} link.&lt;br /&gt;
&lt;br /&gt;
{{Transclusion test}}&lt;br /&gt;
&lt;br /&gt;
[[foo]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Fosdem2012&amp;diff=44398</id>
		<title>Fosdem2012</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Fosdem2012&amp;diff=44398"/>
		<updated>2011-12-14T00:26:48Z</updated>

		<summary type="html">&lt;p&gt;AI: /* Schedule/Plans */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General information ==&lt;br /&gt;
This page is meant to somehow coordinate the small Wesconf taking place at FOSDEM 2012. That is everyone attending should please list him/herself in the list of arrivals and stuff like this. FOSDEM 2012 will take place at the first weekend in Febuary 2012, on Saturday 4th and Sunday 5th.&lt;br /&gt;
&lt;br /&gt;
* Fosdem - http://fosdem.org/2012/&lt;br /&gt;
&lt;br /&gt;
== Schedule/Plans ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! (nick)name(s)&lt;br /&gt;
! Arrival&lt;br /&gt;
! Departure&lt;br /&gt;
! Accomodation&lt;br /&gt;
|-&lt;br /&gt;
| Ivanovic&lt;br /&gt;
| Fri, 3rd, &amp;quot;afternoon&amp;quot; (~15:00 at &amp;quot;chokopolis&amp;quot;; not 100% sure yet)&lt;br /&gt;
| Sun, 5th, leaving right from ULB campus&lt;br /&gt;
| 2go4?&lt;br /&gt;
|-&lt;br /&gt;
| AI&lt;br /&gt;
| Friday?&lt;br /&gt;
| Sunday?&lt;br /&gt;
| 2go4?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For accommodations please keep in mind that parking in the center of Brussels is really problematic. It might make sense to drive to the University where FOSDEM takes place, park there and take the bus into the town center (where some of the hotels/hostels are).&lt;br /&gt;
&lt;br /&gt;
Possible hostels that we at least contacted over the last years (some of them might already be booked out by now!):&lt;br /&gt;
* [http://www.chab.be/ CHAB]&lt;br /&gt;
* [http://www.2go4.be/ 2go4] Note: groups bigger 6 are not allowed, so we can (officially) not form a complete Wesnoth group at this hostel, got to meet somewhere in town/at the university...&lt;br /&gt;
* [http://www.jeugdherbergen.be/brusselE.htm Bruegel YH]&lt;br /&gt;
&lt;br /&gt;
On the official FOSDEM page [http://www.fosdem.org/2012/practical/accommodation some more possible hotels/hostels] are listed.&lt;br /&gt;
&lt;br /&gt;
== Maps ==&lt;br /&gt;
* [http://tinyurl.com/3a65gr Bruegel YH]&lt;br /&gt;
* [http://tinyurl.com/35br9c Brussels Central (Train Station) → Bruegel YH]&lt;br /&gt;
* [http://tinyurl.com/37d9v4 Bruegel YH → Brussels Central (Train Station) → Novotel Grand Place]&lt;br /&gt;
* [http://tinyurl.com/2mzns6 Novotel Grand Place]&lt;br /&gt;
* [http://tinyurl.com/3dggg3 CrownePlaza (Europa)]&lt;br /&gt;
* [http://tinyurl.com/36epxj FOSDEM]&lt;br /&gt;
* [http://tinyurl.com/2w4bms Novotel Grand Place -&amp;gt; FOSDEM]&lt;br /&gt;
&lt;br /&gt;
== Transportation ==&lt;br /&gt;
Information about how to reach the FOSDEM is listed at the [http://www.fosdem.org/2012/transportation official transportation subpage].&lt;br /&gt;
&lt;br /&gt;
Short version of how to get there for those that reside in Bruegel YH and Novotel Grand Place (basically town center):&lt;br /&gt;
&lt;br /&gt;
* Enter Bus 71 (Debrouckere - Central Station (&amp;quot;Gare Centrale&amp;quot;) - Delta) somewhere at 'Central Station'&lt;br /&gt;
* Leave the bus at &amp;quot;ULB&amp;quot; (crossroads Ave. Adolphe Buyl - Sq. Deveze)&lt;br /&gt;
* Walk down Ave. Paul Heger on your right hand.&lt;br /&gt;
&lt;br /&gt;
== Wesnoth Hacking Room ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth will not have a room of its own (though there will be the open source game dev devroom on Sunday where hopefully many Wesnoth devs will participate). Instead we will use one of the &amp;quot;general hacking rooms&amp;quot;. So far it is not sure which room it will be, if we do it like the last three years, it will be room number 115 in the building AW1. Last year this was the smaller of the two hacking rooms and we had no real problem with conquering (and holding) the first row in this room. There were not too many power outlets, so this year at least Ivanovic will bring one multi-outlet power strip plus some extension cable (5m or something like this). Mordante will (hopefully) also bring a multi-outlet power strip and a 20m extension cable. There is no wired network, everything wireless (and sometimes rather/very unstable!). Beside this you should bring laptops since there are no computers available for hacking.&lt;br /&gt;
&lt;br /&gt;
Short version:&lt;br /&gt;
 AW1 - Room 115 (at least on Saturday)&lt;br /&gt;
&lt;br /&gt;
== Discussions and Results ==&lt;br /&gt;
We usually discuss all sorts of things at FOSDEM, this section is basically a (really short) summary of things that were discussed including their results. First are the discussions that were done &amp;quot;in plenum&amp;quot; with basically all attendees around. At the bottom is an area meant for discussions that were held in sub groups that not all devs might be aware of that were around.&lt;br /&gt;
&lt;br /&gt;
Please make sure to list any topics you want to talk about below. The GameDev Room topic might serve as sample...&lt;br /&gt;
&lt;br /&gt;
===Wesnoth presence in the GameDev Room===&lt;br /&gt;
Since Ivanovic is responsible for organizing the Open Source Game Development Devroom which takes place on Sunday 5th, there will at least be one Wesnoth Dev busy with this room. Though several other will hopefully support Ivanovic in this effort and be around to listen to many interesting talks and presentations.&lt;br /&gt;
&lt;br /&gt;
== Group Picture ==&lt;br /&gt;
Has to be taken first.&lt;br /&gt;
&lt;br /&gt;
== Previous Years ==&lt;br /&gt;
* [http://www.wesnoth.org/wiki/Fosdem2011 FOSDEM 2011 wiki page]&lt;br /&gt;
* [http://www.wesnoth.org/wiki/Fosdem2010 FOSDEM 2010 wiki page]&lt;br /&gt;
* [http://www.wesnoth.org/wiki/Fosdem2009 FOSDEM 2009 wiki page]&lt;br /&gt;
* [http://www.wesnoth.org/wiki/Fosdem2008 2008 wiki page], [http://www.wesnoth.org/forum/viewtopic.php?p=283649#p283649 Forum topic (with group photo)], [https://mail.gna.org/public/wesnoth-dev/2008-02/msg00078.html Summary of FOSDEM 2008 results]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Wesconf]]&lt;/div&gt;</summary>
		<author><name>AI</name></author>
		
	</entry>
</feed>