https://wiki.wesnoth.org/api.php?action=feedcontributions&user=Octalot&feedformat=atomThe Battle for Wesnoth Wiki - User contributions [en]2024-03-28T15:31:27ZUser contributionsMediaWiki 1.31.16https://wiki.wesnoth.org/index.php?title=CampaignDialogue&diff=72463CampaignDialogue2024-03-07T17:43:21Z<p>Octalot: Mention the POT files</p>
<hr />
<div>{| style="float:right"<br />
|<br />
__TOC__<br />
|}<br />
<br />
This page is the hub for the transcription of campaign dialogue into the wiki as a resource for writers. As such, it consists entirely of spoilers.<br />
<br />
These Wiki pages aren't automatically updated when the text in the campaign changes. However, files with all the text in each campaign are automatically generated as part of the support for translations. [https://github.com/wesnoth/wesnoth/blob/master/po/wesnoth-tutorial/wesnoth-tutorial.pot Link to the one for the tutorial]. The others can be found by following that link and then replacing both ''tutorial''s in the URL with the campaign acronym (completely lowercase).<br />
<br />
The campaigns are ordered chronologically. Each has a relevant year (generally beginning) listed.<br />
<br />
==Tutorial==<br />
''Main article: [[CampaignDialogue:Tutorial]]<br />
<br />
==The Rise Of Wesnoth==<br />
''Main article: [[CampaignDialogue:TROW]]<br />
<br />
5 BW - 1 YW.<br />
<br />
==Winds of Fate==<br />
''Main article: [[CampaignDialogue:WoF]]<br />
<br />
3-4 YW.<br />
<br />
==An Orcish Incursion==<br />
''Main Article: [[CampaignDialogue:AOI]]<br />
<br />
8-9 YW.<br />
<br />
==Legend of Wesmere==<br />
''Main Article: [[CampaignDialogue:LOW]]<br />
<br />
12-93 YW.<br />
<br />
==Secrets of the Ancients==<br />
''Main article: [[CampaignDialogue:SOTA]]<br />
<br />
23 YW.<br />
<br />
==Sceptre of Fire==<br />
''Main article: [[CampaignDialogue:SOF]]<br />
<br />
25-40 YW.<br />
<br />
==Two Brothers==<br />
''Main article: [[CampaignDialogue:TB1.9]]<br />
<br />
363 YW.<br />
<br />
==Descent into Darkness==<br />
''Main article: [[CampaignDialogue:DID]]<br />
<br />
389 YW.<br />
<br />
==Delfador's Memoirs==<br />
''Main article: [[CampaignDialogue:DM]]<br />
<br />
468-470 YW.<br />
<br />
==Liberty==<br />
''Main Article: [[CampaignDialogue:L]]<br />
<br />
501 YW.<br />
<br />
==Heir to the Throne==<br />
''Main Article: [[CampaignDialogue:HttT]]<br />
<br />
517-518 YW.<br />
<br />
==Northern Rebirth==<br />
''Main Article: [[CampaignDialogue:NR]]<br />
<br />
534-535 YW.<br />
<br />
==The Hammer of Thursagan==<br />
''Main Article: [[CampaignDialogue:THOT]]<br />
<br />
550-551 YW.<br />
<br />
==The South Guard==<br />
''Main Article: [[CampaignDialogue:TSG]]<br />
<br />
607-608 YW.<br />
<br />
==Eastern Invasion==<br />
''Main Article: [[CampaignDialogue:EI]]<br />
<br />
625-627 YW.<br />
<br />
==Dead Water==<br />
''Main Article: [[CampaignDialogue:DW]]<br />
<br />
626 YW.<br />
<br />
==Son of the Black Eye==<br />
''Main Article: [[CampaignDialogue:SOTBE]]<br />
<br />
742-758 YW.<br />
<br />
==Under the Burning Suns==<br />
''Main article: [[CampaignDialogue:UTBS]]<br />
<br />
??? AF.<br />
<br />
[[Category:Create|*]]<br />
[[Category:Writing|*]]<br />
[[Category:Campaigns|*]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=WesnothTranslationsHowTo&diff=72437WesnothTranslationsHowTo2024-03-02T15:54:14Z<p>Octalot: /* Tools */ updating all the files needs "po4a-update" and "manual" too</p>
<hr />
<div>This page contains information on how-to translate and submit translation updates.<br />
<br />
== How to submit your translations ==<br />
<br />
Important: Please '''do not submit translations as pull requests''' on the Wesnoth github repository site. While that seems like a good idea, it causes potential complications that we cannot always easily resolve. As a result, we cannot accept translations submitted via pull request and will close such PRs immediately.<br />
<br />
'' ''' Translation Maintainers ''' ''<br />
<br />
The translation maintainers should send the updated/new translation<br />
po-files to the language coordinator:<br />
Ivanovic (crazy-ivanovic AT gmx DOT net).<br />
Additionally they have to quickly check over other people's translations<br />
(other people translating the same language) as the other translators<br />
(if any) will have to send their translations to their language maintainer<br />
before inclusion in the source-code repository. You should also subscribe to the [http://www.wesnoth.org/wiki/WesnothTranslations#Mailing_List wesnoth-i18n mailinglist].<br />
<br />
Send the files as an archive containing the complete .po files (no .mo or .gmo files) and ensure that they follow the directory structure used in version control. For example, the archive with the German (de) translations should therefore be structured as follows:<br />
wesnoth/de.po<br />
wesnoth-httt/de.po <br />
wesnoth-tutorial/de.po<br />
etc.<br />
<br />
'' ''' Translators ''' ''<br />
<br />
The other translators (those who are not maintainers) should contact<br />
the maintainer for their language to see if there is some work to do.<br />
After you have done some work on the translation you should email it<br />
to your language maintainer. They will then (if needed) check it over<br />
before sending it on to the language coordinators. A list of all translators<br />
currently working on a language is found on each language page.<br />
<br />
'' ''' NEW Translators ''' ''<br />
<br />
If you want to help out with the translation of an language already started on,<br />
contact the translation maintainer for the language.<br />
If you want to start translation of Wesnoth to a new language,<br />
first contact Ivanovic.<br />
And then just follow the instructions written in '' Translators '' .<br />
<br />
== Translations How-To ==<br />
<br />
If you are a translator, see [[GettextForTranslators]] for more information.<br />
<br />
If you are a developer or UMC author, gettext internals for Wesnoth are discussed here: [[GettextForWesnothDevelopers]]. For UMC authors, the tool for generating .po files is linked to from [[GettextForWesnothDevelopers#Generating the_.pot_and_.po_files_for_UMC]].<br />
<br />
=== Files ===<br />
<br />
We will use the Swedish (sv) language and the ''wesnoth-editor'' domain as an example. There are three important files for each text-domain:<br />
* ''wesnoth-editor/wesnoth-editor.pot'' file, which is a template containing all the strings used in the domain, but with empty strings instead of a translation. You can see how a ''.pot'' file looks like in the repository : [https://github.com/wesnoth/wesnoth/blob/master/po/wesnoth-editor/wesnoth-editor.pot#L50 Current repository version].<br />
* ''wesnoth-editor/sv.po'', the file containing the translation, you can see how a ''.po'' file looks like in the repository: [https://github.com/wesnoth/wesnoth/blob/master/po/wesnoth-editor/sv.po#L50 Current repository version].<br />
* ''{translations_dir}/sv/LC_MESSAGES/wesnoth-editor.mo'', which is a binary version of <lang>.po that the game will use for efficiency reasons. This is not found in the repo, but is created during compilation of the game.<br />
<br />
The first of these files, we update every once in a while, when there is new or modified text,<br />
for instance when a new campaign scenario hits the repository.<br />
<br />
=== Tools ===<br />
<br />
For the main Wesnoth repository, the build system can handle updating these files.<br />
* Using SCons, '''scons pot-update po4a-update manual''' will do everything. This can be done without building the Wesnoth executables.<br />
** '''scons -j8 pot-update po4a-update manual''' is quicker, because it does it in parallel.<br />
** '''scons -j8 pot-update''' will do all in-game text, omitting the manpages and manual<br />
* Using CMake, enable '''ENABLE_NLS''' and '''ENABLE_POT_UPDATE_TARGET''', then run '''make -C po pot-update''' to generate the files.<br />
<br />
Some notes on the individual steps that are used during the build:<br />
<br />
C++ and Python files are parsed with ''xgettext'', WML and Lua files are parsed with ''wmlxgettext''. The results are then combined to generate the ''.pot'' file.<br />
<br />
Then, ''msgmerge'' is used to merge this new "state of the game strings" with your current translations, and generate a new, up-to-date, ''sv.po''.<br />
<br />
Then, a tool called ''msgfmt'' is called, which generates a new ''wesnoth.mo'' file from your ''wesnoth.po'' file, which will be used by the game once installed.<br />
<br />
=== Summary ===<br />
<br />
That was for the "Big Picture".<br />
But you really just need to be concerned with the po file:<br />
translating new strings, checking "fuzzy" entries.<br />
We can handle the administrative tasks of updating etc.<br />
You really don't need to bother with any of these commands, unless you want to compile .mo files to check in-game.<br />
<br />
Ivanovic is now responsible for integrating translations into Wesnoth, with the help of Torangan and ott.<br />
You should contact Ivanovic (crazy-ivanovic AT gmx DOT net), and he'll put them in the game.<br />
<br />
== Specifying typefaces and fonts for a translation ==<br />
<br />
Translations in a language which use characters outside of the Latin, Greek and Cyrillic character sets may want to specify different typefaces. There are some translatable strings in data/hardwired/fonts.cfg which specify the fonts to use; these strings appear in the ''wesnoth'' text domain, and can be configured by putting the required fonts' names as the translations.<br />
<br />
Note the documentation in data/hardwired/fonts.cfg.<br />
<br />
== See Also ==<br />
* [[GettextForTranslators]]<br />
* [[WesnothTranslations]]<br />
* [[TranslatorsGuide]]<br />
* [http://gettext.wesnoth.org Translation statistics]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=EffectWML&diff=72436EffectWML2024-03-02T14:50:06Z<p>Octalot: /* [effect]apply_to=variation */ Remove mention of the type+variation bug, it was fixed in 1.14.10 and 1.15.3</p>
<hr />
<div>{{WML Tags}}<br />
<br />
== [effect] ==<br />
<br />
The tag [effect] is used to describe one modification to a unit. Any number of [effect] tags can be used to describe a complete modification.<br />
<br />
Modifications are permanent changes to a unit; however using an [[DirectActionsWML#.5Bobject.5D|[object]]] with a limited ''duration'' to apply an [effect] will cause the unit to be rebuilt without the effect's effects when the duration expires. <br />
<br />
The following keys and subtags are always recognized:<br />
* '''[filter]''': only apply this effect if the affected unit matches. See [[StandardUnitFilter]] for details.<br />
* '''times''': describes how many times the effect is applied. The default is to apply the effect once. Other possible value : "per level" which means that the effect is applied level times, where level is the unit level. {{DevFeature1.13|5}} Integers are now supported for ''times''.<br />
* '''apply_to''': describes what the effect actually affects. New effect types can be added with [[LuaWML/Units#wesnoth.effects]].<br />
[effect] uses different keys depending on the value of '''apply_to'''. '''apply_to''' can take the following values:<br />
* {{anchor|apply_to-new_attack|'''new_attack'''}}: will use all other keys and tags as the description of an attack that will be added to the unit. See [attack] in [[UnitTypeWML#Attacks|UnitTypeWML]].<br />
* {{anchor|apply_to-remove_attacks|'''remove_attacks'''}}: remove the matching attacks. All tags from the attack filter construct will be used to match the attack; see [[FilterWML#Filtering Weapons|FilterWML]]. Do not use a [filter] tag otherwise it will not work properly.<br />
* {{anchor|apply_to-attack|'''attack'''}}: find an attack and modify it. All tags from the attack filter construct will be used to match the attack; see [[FilterWML#Filtering Weapons|FilterWML]]. After that, the following keys and tags can be used to modify the attack. Note: do not use a [filter] tag. Just put the keys you want to filter on inside the [effect] tag.<br />
** '''set_name''': change the attack's name (ie identifier).<br />
** '''set_description''': change the attack's description (ie displayed name). <br />
** '''set_type''': change the attack type. The standard values are '''blade''', '''pierce''', '''impact''', '''fire''', '''cold''', and '''arcane'''.<br />
** '''set_range''': change the attack range. The standard values are '''ranged''' and '''melee'''.<br />
** '''set_icon''': change the attack's icon.<br />
** {{anchor|set_specials|'''[set_specials]'''}}: change the attack's specials. The specials to add are given exactly as in the [[AbilitiesWML#The_.5Bspecials.5D_tag|[specials]]] tag.<br />
*** '''mode''': if '''append''', adds the given specials to the attack. If '''replace''', replaces the existing specials with the given ones. Default '''replace'''.<br />
**** {{DevFeature1.15|3}} A deprecation warning is triggered unless the '''mode''' attribute is set, although the effect will still be '''replace'''. This is to allow the default to change in the 1.17.x series.<br />
** '''remove_specials''': remove the listed specials. The value of this key is the comma-separated list of the id of the specials to remove. This key is always evaluated before a [set_specials] tags in the same [effect]<br />
** '''increase_damage''': increases the attack's damage. This can be positive or negative, so you can use it to decrease damage as well. If it ends in a percent(''''%''''), the change in damage will be a percentage ratio of the attack's original damage.<br />
** '''increase_attacks''': increases the number of attack strikes. Like '''increase_damage''', it can be positive or negative, or a percentage.<br />
** '''increase_accuracy''': increases the attack accuracy; can be positive or negative, or a percentage<br />
** '''increase_parry''': increases the attack parry bonus; can be positive or negative, or a percentage<br />
** '''increase_movement_used''': {{DevFeature1.13|2}} increases the movement points used by the attack; can be positive or negative, or a percentage<br />
** '''increase_attacks_used''': {{DevFeature1.17|13}} increases the attack points used by the attack; can be positive or negative, or a percentage<br />
** '''set_damage''' {{DevFeature1.13|2}} like increase_damage, but sets the damage to a specific value instead of setting it relative to its original value<br />
** '''set_attacks''' {{DevFeature1.13|2}} like increase_attacks, but sets the attacks to a specific value instead of setting it relative to its original value<br />
** '''set_accuracy''' {{DevFeature1.13|2}} like increase_accuracy, but sets the accuracy to a specific value instead of setting it relative to its original value<br />
** '''set_parry''' {{DevFeature1.13|2}} like increase_parry, but sets the parry to a specific value instead of setting it relative to its original value<br />
** '''set_movement_used''' {{DevFeature1.13|2}} like increase_movement_used, but sets the movement used to a specific value instead of setting it relative to its original value<br />
** '''set_attacks_used''' {{DevFeature1.17|13}} like increase_attacks_used, but sets the attacks used to a specific value instead of setting it relative to its original value<br />
** '''attack_weight''': change the attack's attack_weight. See [attack] in [[UnitTypeWML#Attacks|UnitTypeWML]] for explanations about attack_weight.<br />
** '''defense_weight''': change the attack's defense_weight. See [attack] in [[UnitTypeWML#Attacks|UnitTypeWML]] for explanations about defense_weight.<br />
* {{anchor|apply_to-max_attacks|'''max_attacks'''}}: {{DevFeature1.13|2}} change the unit's maximum attacks per turn<br />
** '''increase''': how much to increase by; can be positive or negative, or a percentage<br />
* {{anchor|apply_to-hitpoints|'''hitpoints'''}}: modifies the unit's HP and/or max HP.<br />
** '''increase''': the amount to increase the unit's HP.<br />
** '''heal_full''': if present and not set to "no" the unit will be put back to full HP.<br />
** '''increase_total''': will increase the total HP of the unit. Can be specified either as a negative or a positive value. It can also be specified as a percentage of the current total; i.e. "-50%" will cut max HP in half.<br />
** '''violate_maximum''': it the unit ends up with more than its max HP after these modifications, and this key is present (set to any non-null value, ex. '''yes'''), the unit's HP won't be lowered to its max HP.<br />
* {{anchor|apply_to-movement|'''movement'''}}: modifies the unit's movement points.<br />
** '''increase''': maximum movement is increased by this amount. It can be positive, negative, or specified as a percentage.<br />
** '''set''': maximum movement is set to a specific value.<br />
** '''apply_to_vision''': {{DevFeature1.15|13}} if set to '''yes''' (which is the default), then the vision points will change by the same amount. See [[#Movement_and_Vision|Movement and Vision]].<br />
* {{anchor|apply_to-vision|'''vision'''}}: {{DevFeature1.13|2}} modifies the unit's vision points. Note: this has side effects described in [[#Movement_and_Vision|Movement and Vision]].<br />
** '''increase''': maximum vision is increased by this amount. It can be positive, negative, or specified as a percentage.<br />
** '''set''': maximum vision is set to a specific value. <br />
* {{anchor|apply_to-jamming|'''jamming'''}}: {{DevFeature1.13|2}} modifies the unit's jamming points.<br />
** '''increase''': maximum jamming is increased by this amount. It can be positive, negative, or specified as a percentage.<br />
** '''set''': maximum jamming is set to a specific value.<br />
* {{anchor|apply_to-experience|'''experience'''}}: affects the unit's current XP.<br />
** '''increase''': current XP is increased by this amount. It can be positive, negative, or specified as a percentage.<br />
** '''set''': current XP is set to a specific value.<br />
* {{anchor|apply_to-max_experience|'''max_experience'''}}: affects the amount of XP the unit needs for the next level.<br />
** '''increase''': how to change the xp; again it can be negative, positive or a percentage.<br />
** '''set''': current max XP is set to a specific value.<br />
* {{anchor|apply_to-loyal|'''loyal'''}}: no keys associated. The affected unit will be loyal i.e have an upkeep of 0.<br />
* {{anchor|apply_to-fearless|'''fearless'''}}: Add/Remove fearless attribute.<br />
** '''set''': new value for fearless (boolean). Defaults to '''yes'''.<br />
* {{anchor|apply_to-healthy|'''healthy'''}}: Add/Remove healthy attribute.<br />
** '''set''': new value for healthy (boolean). Defaults to '''yes'''.<br />
* {{anchor|apply_to_movement_costs|'''movement_costs'''}}: speed through specific terrain is modified<br />
** '''replace''': If set to "yes", any new values replace the old ones. Otherwise, new values are added to old values (negative values allowed). Defaults to '''no'''.<br />
** '''[movement_costs]''': a subtag that describes the new movement costs just like under [[UnitsWML#.5Bmovetype.5D|[movetype]]] if replace is set to "yes".<br />
* {{anchor|apply_to-vision_costs|'''vision_costs'''}}: vision through specific terrain is modified<br />
** '''replace''': If set to "yes", any new values replace the old ones. Otherwise, new values are added to old values (negative values allowed). Defaults to '''no'''.<br />
** '''[vision_costs]''': a subtag that describes the new vision costs just like under [[UnitsWML#.5Bmovetype.5D|[movetype]]] if replace is set to "yes".<br />
* {{anchor|apply_to-jamming_costs|'''jamming_costs'''}}: jamming through specific terrain is modified<br />
** '''replace''': If set to "yes", any new values replace the old ones. Otherwise, new values are added to old values (negative values allowed). Defaults to '''no'''.<br />
** '''[jamming_costs]''': a subtag that describes the new jamming costs just like under [[UnitsWML#.5Bmovetype.5D|[movetype]]] if replace is set to "yes".<br />
* {{anchor|apply_to-defense|'''defense'''}}: Sets the unit's chance to be hit in specific terrain (100 - the unit's defense as shown in-game). <br />
** '''replace''': If set to "yes", any new values replace the old ones. Otherwise, new values are added to old values. In most cases, adding a positive number makes the unit easier to hit, while adding a negative number makes the unit harder to hit. The new value is added to the absolute value of the old, and the sign of the old value is preserved. Defaults to '''no'''.<br />
** '''[defense]''': a subtag that describes the new defense just like under [[UnitsWML#.5Bmovetype.5D|[movetype]]] if replace is set to "yes".<br />
* {{anchor|apply_to-resistance|'''resistance'''}}: Sets percent damage taken from combat (100 - the unit's resistance as shown in-game)<br />
** '''replace''': If set to "yes", any new values replace the old ones. Otherwise, new values are added to old values. Adding a positive number makes the unit take more damage, while adding a negative number makes the unit take less damage. Defaults to '''no'''.<br />
** '''[resistance]''': a subtag that describes the new resistance just like under [[UnitsWML#.5Bmovetype.5D|[movetype]]] if replace is set to "yes".<br />
* {{anchor|apply_to-variation|'''variation'''}}: switches the unit into one of its variations. Similar to the '''type''' effect below, this might not behave properly outside of [advancement].<br />
** '''name''': the id of the variation to invoke. <br />
* {{anchor|apply_to-type|'''type'''}}: transforms the unit into a new unit_type. This does not work in [trait]; in ActionWML it's recommended to use [transform_unit] instead of an [object] with this effect. This effect cannot be undone with [remove_object].<br />
** '''name''': the id of the unit_type to invoke.<br />
* {{anchor|apply_to-status|'''status'''}}: modifies the status affecting the unit.<br />
** '''add''': a list of status modifications to add. Beware, these may be reapplied later, such as when the unit is recalled or levels up; if in an event, you can use [[InternalActionsWML|[store_unit]]] and [[DirectActionsWML|[unstore_unit]]], modifying unit.status.name directly, to avoid this, or if you are creating the unit, you can just add it to the unit's [status] tag in the [unit] tag. These are listed in [status], [[SingleUnitWML]].<br />
** '''remove''': a list of status modifications to remove.<br />
* {{anchor|apply_to-zoc|'''zoc'''}}: toggle the zone of control.<br />
** '''value''': new value for zoc (boolean).<br />
* {{anchor|apply_to-profile|'''profile'''}}: customize the profile of the unit. See [[UnitTypeWML]].<br />
** '''portrait''': new image to display when the unit speaks.<br />
** '''small_portrait''': new image to display in unit reports.<br />
** '''description''': sets the text to display when hovering over the unit's type in the righthand pane.<br />
** '''[special_note]''': {{DevFeature1.15|2}} Adds or removes a special note in the unit's description.<br />
*** '''remove''': A boolean value specifying whether to add or remove a note. Defaults to '''no'''.<br />
*** '''note''' (translatable): The text of the note you want to add or remove. If removing a note, this must be an exact match, character-for-character, for the note you want to remove, and must also be in the same textdomain.<br />
*** Since the tag name is the same, notes can also be added using the standard special note macros, eg '''{NOTE_HEALS}'''.<br />
*** To remove a note, you can simply suffix '''{NOTE_REMOVE}''' to the regular note macro, eg '''{NOTE_HEALS}{NOTE_REMOVE}'''.<br />
* {{anchor|apply_to-new_ability|'''new_ability'''}}: Adds one or more abilities to a unit.<br />
** '''[abilities]''': A subtag that contains the ability definitions.<br />
* '''remove_ability''': Removes one or more abilities from a unit. Abilities are not reference counted: added, added, removed = gone.<br />
** '''[abilities]''': A subtag that contains the ability definitions. Strictly speaking, all that is needed is the id= inside some tag. {{DevFeature1.17|17}} This is now deprecated, use [filter_ability] instead.<br />
** {{DevFeature1.17|17}} '''[filter_ability]''': A subtag that contains the ability definitions like type of abilities, id, or other attributes like affect_self or [affect_adjacent] but not generic filter.<br />
* {{anchor|apply_to-new_animation|'''new_animation'''}}: contain animations that will be added to the unit, it can contain multiple animation blocks, and a single "id=" line. That Id should be unique for each effect block and is used by the engine to reuse WML parsing, making the loading faster. See [[AnimationWML]] for further reference.<br />
* {{anchor|apply_to-image_mod|'''image_mod'''}}: modify the image path function ([[ImagePathFunctions]]) of all the unit's frames. Due to a bug, the effect is permanent even inside [object]duration=turn<br />
** '''replace''': replaces the image path function(s) to be used, e.g. "RC(magenta>red)"<br />
** '''add''': adds an image path function without removing any existing ones.<br />
** If needed, you can also define new [[GameConfigWML#Color_Palettes|color palettes]] here.<br />
* {{anchor|apply_to-ellipse|'''ellipse'''}}: Change the image used for the unit's ellipse.<br />
** '''ellipse''' : the new image to use. Can be set to "none" to disable the ellipse.<br />
* {{anchor|apply_to-halp|'''halo'''}}: Change the image used for the unit's halo.<br />
** '''halo''': the new image to use.<br />
* {{anchor|apply_to-overlay|'''overlay'''}}: Change the unit's overlays.<br />
**'''add''': the specified overlay will be added to the unit's overlays. It can be a comma separated list with multiple overlays. ''Note: overlays added in this way cannot be removed by [remove_unit_overlay] until the effect's duration is over.''<br />
**'''replace''': all the unit's overlays will be removed and replaced with the specified one. Again, it can be a comma separated list. ''Note: overlays replaced in this way cannot be modified by [unit_overlay] or [remove_unit_overlay] until the effect's duration is over.''<br />
**'''remove''': {{DevFeature1.15|0}} the specified overlay will be removed from the unit's overlays. It can be a comma separated list with multiple overlays.<br />
** {{DevFeature1.15|0}} [unit_overlay] and [remove_unit_overlay] are now equivalent to adding a permanent object with this effect, after checking if the unit already has / already doesn't have the overlay (effects with temporary durations will cause false positives / false negatives in this check).<br />
* {{anchor|apply_to-recall_cost|'''recall_cost'''}}: {{DevFeature1.13|2}} change a unit's recall cost<br />
** '''set''': set recall cost to a specific value, or a percentage of original value<br />
** '''increase''': alter recall cost relative to original value; can be positive or negative, or a percentage<br />
* {{anchor|apply_to-alignment|'''alignment'''}}: {{DevFeature1.13|2}} change a unit's alignment<br />
** '''set''': the new alignment (one of chaotic, lawful, neutral, liminal)<br />
* {{anchor|apply_to-new_advancement|'''new_advancement'''}}: {{DevFeature1.13|2}} add new advancement choices to the unit<br />
** '''replace''': whether to replace existing advancement choices; if this key is set to yes, existing advancement choices are cleared only if you're adding a choice of the same type. (That is, unit type advancements are cleared only if you're adding a new unit advancement choice, and AMLA choices are cleared only if you're adding new AMLA choices.)<br />
** '''types''': a comma-separated list of additional unit types the unit can advance to. ('''Note:''' If using this, you probably want to include a filter to prevent the unit from being able to advance to this type once it has already done so.)<br />
** '''[advancement]''': an advancement choice to add, see [[UnitTypeWML#After_max_level_advancement_(AMLA)|AMLAs]]; you can have several of these tags to add multiple advancement choices at the same time.<br />
* {{anchor|apply_to-remove_advancement|'''remove_advancement'''}}: {{DevFeature1.13|2}} remove existing advancement choices from the unit<br />
** '''types''': a list of unit type advancements to remove as a possibility<br />
** '''amlas''': a list of AMLA id attributes; any advancement possibility with the given id will be removed<br />
* {{anchor|apply_to-level|'''level'''}}: {{DevFeature1.17|15}} change a unit's level. '''Note:''' this key is incompatible with ''times=per level''; if this combination is used, the engine reports a warning and uses ''times=1'' as fallback value<br />
** '''set''': set level to a specific value; can be positive or negative, but not a percentage<br />
** '''increase''': alter level relative to original value; can be positive or negative, but not a percentage<br />
<br />
== Movement and Vision ==<br />
<br />
Wesnoth 1.14 introduced vision points; by default units have the same number of vision points as their max movement points. However, combining effects that change vision with effects that change movement had edge cases which were reworked in 1.16:<br />
<br />
Consider a unit with 5 mp, and default vision:<br />
* It has (effectively) 5 mp and 5 vp.<br />
* After (mp + 1), it will have 6 mp and 6 vp.<br />
* After (vp + 2), it will have 5 mp and 7 vp.<br />
<br />
In 1.14, using an effect with apply_to=vision breaks the link between vision and movement:<br />
* After (mp + 1) (vp + 2), it will have 6 mp and 8 vp.<br />
* After (vp + 2) (mp + 1), it will have 6 mp and 7 vp.<br />
<br />
{{DevFeature1.15|13}}, [effect]apply_to=movement has another attribute apply_to_vision, which defaults to true. With that change, the order that the effects are applied in doesn't matter:<br />
* After (mp + 1) (vp + 2), it will have 6 mp and 8 vp.<br />
* After (vp + 2) (mp + 1), it will have 6 mp and 8 vp.<br />
<br />
Increasing movement by 50% increases vision by (50% of movement) not by (50% of vision). For a unit that started with 6 mp and 8 vp, the following effect would give it 9 mp and 11 vp.<br />
[effect]<br />
apply_to=movement<br />
increase=50%<br />
[/effect]<br />
<br />
=== Examples ===<br />
== Effect: apply_to = new_animation ==<br />
This is the only way to change animations of units after they have been placed on the map.<br />
In this example, I add very simple idle animation (taken from Goblin Spearman) to the unit, which moves to hex (x=1, y=5). If you want something more complex, you need to check [[AnimationWML]] page.<br />
<br />
[event]<br />
name = moveto<br />
[filter]<br />
x,y = 1,5<br />
[/filter]<br />
[object]<br />
[filter]<br />
x,y = 1,5<br />
[/filter]<br />
[effect]<br />
apply_to = new_animation<br />
[idle_anim]<br />
{STANDARD_IDLE_FILTER}<br />
start_time=0<br />
[frame]<br />
image="units/goblins/spearman-idle-[1~12].png:[150*3,300,150*8]"<br />
[/frame]<br />
[/idle_anim]<br />
[/effect]<br />
[/object]<br />
[/event]<br />
<br />
If you are going to use '''advanced WML''' and want to add animation to unit, stored in variable, then following example might help you. '''This way is not efficient if you have no additional logic like inventoriy, shops, advanced unit modifications in your add-on.''' Is is preferred to use first variant or define all needed animation in unit_type.<br />
[event]<br />
name = moveto<br />
[filter]<br />
x,y = 1,5<br />
[/filter]<br />
[store_unit]<br />
[filter]<br />
x,y=1,5<br />
[/filter]<br />
variable = stored_unit<br />
[/store_unit]<br />
[set_variables]<br />
name = stored_unit.modifications.object<br />
[value]<br />
[effect]<br />
apply_to = new_animation<br />
[idle_anim]<br />
{STANDARD_IDLE_FILTER}<br />
start_time=0<br />
[frame]<br />
image="units/goblins/spearman-idle-[1~12].png:[150*3,300,150*8]"<br />
[/frame]<br />
[/idle_anim]<br />
[/effect]<br />
[/value]<br />
[/set_variables]<br />
[unstore_unit]<br />
variable = stored_unit<br />
[/unstore_unit]<br />
[/event]<br />
<br />
== Where to Use Effects ==<br />
<br />
A collection of effects together makes up a "unit modification", which is encased in one of the three types of modification tags: '''[trait]''', '''[object]''', or '''[advancement]'''. Which tag to use depends on the goal of the modification.<br />
<br />
* [[UnitsWML#.5Btrait.5D|Traits]] are shown in the unit details on the sidebar. They can be placed in a race or unit type to include the trait in the pool of random traits for that race or unit type, or they can be placed in the global [units] tag to add them to the global pool of random traits. (Note that this can cause out-of-sync errors in multiplayer.)<br />
* [[UnitTypeWML#After_max_level_advancement_.28AMLA.29|Advancements]] are offered when a unit levels up. If a unit type has both modification advancements and regular advancements, the player can choose either each time they level up.<br />
* [[DirectActionsWML#.5Bobject.5D|Objects]] are usually placed on the map or added by special events. They also have a built-in facility to automatically remove under certain conditions.<br />
<br />
An effect can also be placed in '''[modify_unit]''' [[DirectActionsWML#.5Bmodify_unit.5D|ActionWML]] to apply it on-the-fly without keeping a record that it has been applied. This is mainly useful for effects that change transient properties such as current hitpoints or experience. An effect applied in this way is liable to be reverted when the unit is rebuilt in the future, for example when they level up or when an object is removed.<br />
<br />
== See Also ==<br />
<br />
* [[UnitTypeWML]]<br />
* [[ReferenceWML]]<br />
* [[AnimationWML]]<br />
<br />
<br />
[[Category: WML Reference]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=GettextForTranslators&diff=72289GettextForTranslators2024-02-21T11:52:16Z<p>Octalot: /* Format strings */ Add a new section of basic rules</p>
<hr />
<div>== Gettext for translators ==<br />
<br />
=== For the engine and mainline campaigns ===<br />
<br />
The target audience of this page is anyone who wants to help with a language that's already in the list on [[WesnothTranslations]]. The files for these languages have already been set up, someone is already the maintainer, and the pages linked from that page say where to go and how to introduce yourself to the team. The effort is split with separate teams for each language, and each team can have its own working style.<br />
<br />
Because each team can work in different ways, please do not submit translations as pull requests on Github. While that seems like a good idea, it causes potential complications, so we ask that everyone talks to their language's maintainer and submits changes in the way that the maintainer decides to use.<br />
<br />
If you're starting a completely new translation, or taking over as the maintainer of a translation, then the next place to read would be the [[WesnothTranslationsHowTo]] page.<br />
<br />
=== For add-ons ===<br />
<br />
The target audience is anyone who wants to help translate an add-on, assuming the add-on's maintainer has already set it up for translation. Translations are shipped with the add-on, so it's up to the maintainer to choose how to receive the files and organise the workflow.<br />
<br />
To translate an add-on, skip to the [[#Files_for_add-ons|Files for add-ons]] section.<br />
<br />
If you are the maintainer of the add-on, the instructions for setting up the translation are on [[GettextForWesnothDevelopers]].<br />
<br />
== Textdomains and getting the files to translate ==<br />
<br />
The progress for each language is shown on https://www.wesnoth.org/gettext/ . Click on your language, and you'll see a breakdown into sections ''(textdomains)'', such as<br />
* wesnoth<br />
* wesnoth-editor<br />
* wesnoth-help<br />
* wesnoth-units<br />
* wesnoth-lib (contains strings shared by game and editor)<br />
* wesnoth-httt (the Heir to the Throne campaign)<br />
* wesnoth-utbs (the Under the Burning Suns campaign)<br />
* etc<br />
<br />
Each has a separate file with a .po extension. For example, the Swedish translation has abbreviation ''sv'', and its translation of the editor's strings is in ''wesnoth-editor/sv.po''. The page on https://www.wesnoth.org/gettext/?view=langs&version=branch&lang=sv links to the current version in the main Git repository.<br />
<br />
Although the .po files contain text, please send the complete files as email attachments (or whichever method your team uses), rather than cutting and pasting lines from the file into an email. The translated strings are<br />
very sensitive to formatting and whitespace changes.<br />
<br />
=== Files when running the game ===<br />
<br />
When the game runs it will look for an .mo file, for example ''translations/sv/LC_MESSAGES/wesnoth-editor.mo''. If you want to test your text in-game and you're happy to modify your installation:<br />
<br />
* Some .po editors can automatically generate .mo files.<br />
* Deleting the .mo file will make the game look for ''translations/wesnoth-editor/sv.po'' instead.<br />
<br />
However you can also send your untested .po file to the maintainer and they should check that it looks correct in-game.<br />
<br />
=== Files for add-ons ===<br />
<br />
This assumes the add-on has .po files rather than .mo files. The engine supports both, but only .po are editable. For example, an add-on called Son of Haldric that has a Swedish translation would likely store it in:<br />
<br />
* ''data/add-ons/Son_of_Haldric/translations/wesnoth-Son_of_Haldric/sv.po'' .<br />
<br />
That comes from:<br />
<br />
* ''data/add-ons/Son_of_Haldric'' is where all files from the add-on are stored<br />
* ''translations/wesnoth-Son_of_Haldric'' is configured by the maintainer<br />
* ''sv'' is the language code for Swedish. The codes for each language are given in the big table on [https://www.wesnoth.org/gettext/ https://www.wesnoth.org/gettext/] .<br />
<br />
If it's been set up for translation but hasn't yet been translated into Swedish, it may instead have a file called ''wesnoth-Son_of_Haldric.pot''. This is a template which you can copy to "sv.po", however first try opening the .pot file directly in your [[#Tools|translation tool]], as the it will likely prompt you to create a translation from the template.<br />
<br />
After editing the file, either refresh the cache (press F5 on the title screen) or restart Wesnoth to see the changes.<br />
<br />
Warning: files in the add-on directory will be overwritten or deleted if it's updated using the in-game Add-on Manager, so keep backups of files in a separate directory.<br />
<br />
== How to translate ==<br />
<br />
Now that you have the .po file to edit, it can be worked on using any of the programs listed in the [[#Tools|Tools section]]. The general preference in Wesnoth seems to be towards Poedit, but they all work on the same .po file format.<br />
<br />
The general concept is that the GUI will show the strings in English, along with a text-box to add the translation.<br />
<br />
=== Hints ===<br />
<br />
In addition to the English text, most strings have some additional information which in Poedit will be shown in the bottom-right of the screen. For example, the tutorial's "... this quintain!" has "[message]: speaker=Delfador", meaning that it's [[InterfaceActionsWML#.5Bmessage.5D|said]] by the unit with id "Delfador". Sometimes the hint is less obvious, often lines will be "[message]: speaker=unit", normally meaning the unit whose move, attack, or death has triggered an event.<br />
<br />
Some strings will have additional hints, such as "Addressing Konrad" or "Addressing Li'sar". The level of detail varies a lot between campaigns, please don't be afraid to point out when something needs to be improved.<br />
<br />
The .po files also say which source file the string came from, in Poedit 3.4 this is found in a right-click menu (right-click on a string in the top-left pane of the GUI).<br />
<br />
=== Carets ===<br />
<br />
These lines in the tutorial both have the hint "[message]: speaker=student"; they're spoken by Konrad and Li'sar respectively:<br />
* "A quintain? You want me to fight a dummy?"<br />
* "female^A quintain? You want me to fight a dummy?"<br />
<br />
When an English string has a caret (the ^ symbol) in it, then everything before the first caret is removed before showing it to the player. In the translated strings, leave out everything before the caret.<br />
<br />
These caret hints are very commonly used in Wesnoth for strings where the translation may depend on the gender of the speaker, or the person spoken to. They're also used for strings such as "Prefs section^General", where the string is the label on the "general preferences" tab, not a military rank.<br />
<br />
=== Warnings ===<br />
<br />
Some editors can automatically detect inconsistencies between the English and the translated text, for example if the original ends with a full-stop and the translation ends with an exclamation mark. Poedit defaults to showing these above even the untranslated strings, but these can be false-positives - generally someone's already looked at these and decided that the translated text is better as-is.<br />
<br />
=== Fuzzy strings ===<br />
<br />
One of the downsides of Gettext is that spelling and grammar corrections in the English text break the link between the original and the translated text. The tools that generate .po files try to recover from this by using the old translation for the new English text, and marking the string as ''fuzzy''; in Poedit these are sorted below the completely untranslated strings, and shown with the "Needs Work" button lit along with a note about what the previous English text was.<br />
<br />
Be wary, this mechanism can also generate incorrect suggestions. For example it may decide that "Landar left $number troops to guard the council" is a spelling correction of "Kalenz left $number troops to guard the council".<br />
<br />
== Parts to leave untranslated ==<br />
<br />
Some translatable strings mix text to be translated with placeholders that are handled by the engine before displaying the text to the player. The text of the placeholder needs to be left untranslated.<br />
<br />
=== Dollar signs ===<br />
<br />
Most placeholders start with a dollar sign (<code>$</code>), for example, <code>$number</code> or <code>$gold_amount</code>. The details are in [[SyntaxWML]], but for translation the general rules are:<br />
<br />
Characters that appear in placeholders are letters, numbers, square brackets, underscores, full stops and question marks.<br />
<br />
* After a dollar sign, every character in the list above is part of the placeholder.<br />
* A space ends the placeholder, and the space is also displayed to the player.<br />
* A vertical bar (<code>|</code>) ends the placeholder, and the vertical bar isn't displayed to the player.<br />
* If you need to put a full stop or question mark immediately after a placeholder that doesn't end with a vertical bar, add a vertical bar to separate them.<br />
* A dollar sign at the end of the string, or directly followed by a pipe (<code>$|</code>), is displayed as a dollar sign.<br />
* Obscure cases should have a hint about the string.<br />
<br />
==== More details about dollar signs ====<br />
<br />
Anything that isn't covered by the basic rules in the previous section should have a po hint.<br />
<br />
A format variable is introduced by a dollar sign (<code>$</code>), which is followed by a unique name. The name can be any sequence of letters, numbers, and underscores. For example, <code>$number</code>, <code>$gold_amount</code>, and <code>$1st_name</code> are all valid examples of placeholders. This unique name '''''must not be translated''''' and should be rendered exactly as-is in the translated text, as the engine needs to be able to match it exactly to substitute in the correct replacement.<br />
<br />
In some rare cases, the name may also contain a period (<code>.</code>) or square brackets (<code>[]</code>). For example, <code>$houses[3].title</code> would be valid. Names can also be nested within each other, so <code>$house_$colour</code> and <code>$houses[$n]</code> can also occasionally occur.<br />
<br />
The <code>|</code> character is used if the end of the name needs to be disambiguated (because the following character could otherwise also be part of the name). For example, in <code>$some|where</code>, the variable is only <code>$some|</code>. This can also be used in nesting, so you could have something complicated like <code>$the_$colour|_town.houses[$n].owner</code>.<br />
<br />
The <code>?</code> character following a variable indicates a default value. The text between the <code>?</code> and the following <code>|</code> should be translated as normal, but the framing characters (<code>?|</code>) and the preceding variable name '''''must''''' be left untouched.<br />
<br />
You may also see a dollar sign immediately followed by a parenthesized formula from time to time (for example, <code>$($n + $m)</code>. In this case, the entire formula should be left untouched in the translated text. Formulas normally only evaluate to numerical values. They should not be used very often in translatable strings, however.<br />
<br />
A dollar sign at the end of the string, or directly followed by a pipe (<code>$|</code>), is displayed as just a dollar sign and does not indicate any formatting placeholder.<br />
<br />
=== Markup ===<br />
<br />
Some strings contain formatting markup. This comes in two styles. The most common is [[Pango formatting|Pango markup]], which is an HTML-like formatting language. The other is the custom help page markup, which looks superficially similar but is rather different, and is documented here.<br />
<br />
Like HTML, help markup consists of tags enclosed in angle brackets (eg <code><italic></code>), with a slash added to the closing tag. The difference lies in what comes between the tags, which takes a key=value format where the value is usually enclosed in single quotes. There can be multiple key=value pairs, separated by spaces. Generally, all of that should be left untouched, with the exception of the <code>text</code> key. If you see something like <code><italic>text='some text'</italic></code>, the only part that should be translated is "some text". Or if you see <code><nowiki><ref>dst='movement' text='zones of control'</ref></nowiki></code>, then only "zones of control" should be translated, and the rest should be left untouched.<br />
<br />
== FAQ ==<br />
* '''What are "Plural-forms"?'''<br />
** Some languages have different word forms for different numbers of things (for example in English we have "1 thing" but "2 thing'''s'''"). The rules are different for different languages. You can find them [http://translate.sourceforge.net/wiki/l10n/pluralforms here].<br />
* '''How do I use ' within a single-quote delimited string when translating text= in help screen texts?'''<br />
** Add a backslash before it, however the preferred method now is to use [[Typography_Style_Guide#Character_Usage_Summary|typographic punctuation]] instead.<br />
* '''What should I do with strings like "Prefs section^General"?'''<br />
** There are ambiguous strings which should be translated in a different way depending on where they appear. For example, we have "General" in the preferences as "General preferences" and we can also have "a General". These strings can have different translations for a given language, so we use "context" to solve this. The prefix only tries to give a hint about the string, and should be not translated, for example:<br />
msgid "Prefs section^General"<br />
msgstr "General"<br />
* '''My PO file already has that translated to "Prefs section^General", should it work?'''<br />
** It does, but probably shouldn't. For strings that have no translation, the part before the "^" will be removed. This is also done when the PO's msgstr is exactly the same as the msgid, which will later break if someone makes any change to the text. For example:<br />
# wrong but seems to work (shows as "Root")<br />
msgid "filesystem_path_system^Root"<br />
msgstr "filesystem_path_system^Root"<br />
# wrong and shows as "filesystem_path_system^Wurzel"<br />
msgid "filesystem_path_system^Root"<br />
msgstr "filesystem_path_system^Wurzel"<br />
* '''Who can I ask for further information?'''<br />
** You can ask in [[Support|Discord or IRC]]. Ping Ivanovic in Discord's #development or IRC's #wesnoth-dev channel. If you don't like IRC, send a mail to crazy-ivanovic AT gmx DOT net, or pm him (ivanovic) at the forum.<br />
* '''Why is the diff from the previous version so huge? I have only made a small change to the .po file with poedit.'''<br />
** When saving .po file poedit unwraps all strings. Usually, all .po files are wrapped at 80 characters so if you want smaller diffs and less merge conflicts you can execute the following commands each time after editing with poedit:<br />
<br />
msgattrib file.po > file.po1<br />
mv file.po1 file.po<br />
<br />
== Tools ==<br />
<br />
There are several tools to work with .po files:<br />
* [https://pofile.net/free-po-editor Free PO editor] (Web based)<br />
* [http://userbase.kde.org/Lokalize Lokalize] (Unix KDE) (Formerly known as [https://directory.fsf.org/wiki/KBabel KBabel])<br />
* [https://kate-editor.org/ Kate] (Unix KDE)<br />
* [http://wiki.gnome.org/Apps/Gtranslator GTranslator] (Unix Gnome)<br />
* [http://virtaal.translatehouse.org Virtaal] (Multiplatform)<br />
* [http://www.poedit.net/ poEdit] (Multiplatform)<br />
* [http://www.gnu.org/software/emacs/emacs.html Emacs with po-mode] (Multiplatform)<br />
* [http://www.vim.org/ Vim] with [http://www.vim.org/scripts/script.php?script_id=695 PO plug-in] (Multiplatform)<br />
<br />
Of course, you can edit po files with any UTF-8 capable text editor, but the tools listed above have great advantages over any text editor regarding .po translation, like going to next fuzzy/untranslated string, searching only in specific fields (msgid, msgstr, comment), ...<br />
<br />
== See Also ==<br />
<br />
* [[WesnothTranslations]]<br />
* [[WesnothTranslationsHowTo]]<br />
* [[GettextForWesnothDevelopers]]<br />
* [[TranslatorShellscript]]<br />
* [http://www.wesnoth.org/gettext/ Translation statistics]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=GettextForTranslators&diff=72288GettextForTranslators2024-02-21T11:01:32Z<p>Octalot: /* How to translate */ Describe the po hints and caret hints</p>
<hr />
<div>== Gettext for translators ==<br />
<br />
=== For the engine and mainline campaigns ===<br />
<br />
The target audience of this page is anyone who wants to help with a language that's already in the list on [[WesnothTranslations]]. The files for these languages have already been set up, someone is already the maintainer, and the pages linked from that page say where to go and how to introduce yourself to the team. The effort is split with separate teams for each language, and each team can have its own working style.<br />
<br />
Because each team can work in different ways, please do not submit translations as pull requests on Github. While that seems like a good idea, it causes potential complications, so we ask that everyone talks to their language's maintainer and submits changes in the way that the maintainer decides to use.<br />
<br />
If you're starting a completely new translation, or taking over as the maintainer of a translation, then the next place to read would be the [[WesnothTranslationsHowTo]] page.<br />
<br />
=== For add-ons ===<br />
<br />
The target audience is anyone who wants to help translate an add-on, assuming the add-on's maintainer has already set it up for translation. Translations are shipped with the add-on, so it's up to the maintainer to choose how to receive the files and organise the workflow.<br />
<br />
To translate an add-on, skip to the [[#Files_for_add-ons|Files for add-ons]] section.<br />
<br />
If you are the maintainer of the add-on, the instructions for setting up the translation are on [[GettextForWesnothDevelopers]].<br />
<br />
== Textdomains and getting the files to translate ==<br />
<br />
The progress for each language is shown on https://www.wesnoth.org/gettext/ . Click on your language, and you'll see a breakdown into sections ''(textdomains)'', such as<br />
* wesnoth<br />
* wesnoth-editor<br />
* wesnoth-help<br />
* wesnoth-units<br />
* wesnoth-lib (contains strings shared by game and editor)<br />
* wesnoth-httt (the Heir to the Throne campaign)<br />
* wesnoth-utbs (the Under the Burning Suns campaign)<br />
* etc<br />
<br />
Each has a separate file with a .po extension. For example, the Swedish translation has abbreviation ''sv'', and its translation of the editor's strings is in ''wesnoth-editor/sv.po''. The page on https://www.wesnoth.org/gettext/?view=langs&version=branch&lang=sv links to the current version in the main Git repository.<br />
<br />
Although the .po files contain text, please send the complete files as email attachments (or whichever method your team uses), rather than cutting and pasting lines from the file into an email. The translated strings are<br />
very sensitive to formatting and whitespace changes.<br />
<br />
=== Files when running the game ===<br />
<br />
When the game runs it will look for an .mo file, for example ''translations/sv/LC_MESSAGES/wesnoth-editor.mo''. If you want to test your text in-game and you're happy to modify your installation:<br />
<br />
* Some .po editors can automatically generate .mo files.<br />
* Deleting the .mo file will make the game look for ''translations/wesnoth-editor/sv.po'' instead.<br />
<br />
However you can also send your untested .po file to the maintainer and they should check that it looks correct in-game.<br />
<br />
=== Files for add-ons ===<br />
<br />
This assumes the add-on has .po files rather than .mo files. The engine supports both, but only .po are editable. For example, an add-on called Son of Haldric that has a Swedish translation would likely store it in:<br />
<br />
* ''data/add-ons/Son_of_Haldric/translations/wesnoth-Son_of_Haldric/sv.po'' .<br />
<br />
That comes from:<br />
<br />
* ''data/add-ons/Son_of_Haldric'' is where all files from the add-on are stored<br />
* ''translations/wesnoth-Son_of_Haldric'' is configured by the maintainer<br />
* ''sv'' is the language code for Swedish. The codes for each language are given in the big table on [https://www.wesnoth.org/gettext/ https://www.wesnoth.org/gettext/] .<br />
<br />
If it's been set up for translation but hasn't yet been translated into Swedish, it may instead have a file called ''wesnoth-Son_of_Haldric.pot''. This is a template which you can copy to "sv.po", however first try opening the .pot file directly in your [[#Tools|translation tool]], as the it will likely prompt you to create a translation from the template.<br />
<br />
After editing the file, either refresh the cache (press F5 on the title screen) or restart Wesnoth to see the changes.<br />
<br />
Warning: files in the add-on directory will be overwritten or deleted if it's updated using the in-game Add-on Manager, so keep backups of files in a separate directory.<br />
<br />
== How to translate ==<br />
<br />
Now that you have the .po file to edit, it can be worked on using any of the programs listed in the [[#Tools|Tools section]]. The general preference in Wesnoth seems to be towards Poedit, but they all work on the same .po file format.<br />
<br />
The general concept is that the GUI will show the strings in English, along with a text-box to add the translation.<br />
<br />
=== Hints ===<br />
<br />
In addition to the English text, most strings have some additional information which in Poedit will be shown in the bottom-right of the screen. For example, the tutorial's "... this quintain!" has "[message]: speaker=Delfador", meaning that it's [[InterfaceActionsWML#.5Bmessage.5D|said]] by the unit with id "Delfador". Sometimes the hint is less obvious, often lines will be "[message]: speaker=unit", normally meaning the unit whose move, attack, or death has triggered an event.<br />
<br />
Some strings will have additional hints, such as "Addressing Konrad" or "Addressing Li'sar". The level of detail varies a lot between campaigns, please don't be afraid to point out when something needs to be improved.<br />
<br />
The .po files also say which source file the string came from, in Poedit 3.4 this is found in a right-click menu (right-click on a string in the top-left pane of the GUI).<br />
<br />
=== Carets ===<br />
<br />
These lines in the tutorial both have the hint "[message]: speaker=student"; they're spoken by Konrad and Li'sar respectively:<br />
* "A quintain? You want me to fight a dummy?"<br />
* "female^A quintain? You want me to fight a dummy?"<br />
<br />
When an English string has a caret (the ^ symbol) in it, then everything before the first caret is removed before showing it to the player. In the translated strings, leave out everything before the caret.<br />
<br />
These caret hints are very commonly used in Wesnoth for strings where the translation may depend on the gender of the speaker, or the person spoken to. They're also used for strings such as "Prefs section^General", where the string is the label on the "general preferences" tab, not a military rank.<br />
<br />
=== Warnings ===<br />
<br />
Some editors can automatically detect inconsistencies between the English and the translated text, for example if the original ends with a full-stop and the translation ends with an exclamation mark. Poedit defaults to showing these above even the untranslated strings, but these can be false-positives - generally someone's already looked at these and decided that the translated text is better as-is.<br />
<br />
=== Fuzzy strings ===<br />
<br />
One of the downsides of Gettext is that spelling and grammar corrections in the English text break the link between the original and the translated text. The tools that generate .po files try to recover from this by using the old translation for the new English text, and marking the string as ''fuzzy''; in Poedit these are sorted below the completely untranslated strings, and shown with the "Needs Work" button lit along with a note about what the previous English text was.<br />
<br />
Be wary, this mechanism can also generate incorrect suggestions. For example it may decide that "Landar left $number troops to guard the council" is a spelling correction of "Kalenz left $number troops to guard the council".<br />
<br />
== Parts to leave untranslated ==<br />
<br />
=== Format strings ===<br />
<br />
Some strings contain formatting markup. A few strings use the C format style, documented [https://www.gnu.org/software/gettext/manual/html_node/c_002dformat.html here], or the Lua format style, documented [https://www.lua.org/manual/5.1/manual.html#pdf-string.format here]. However, most format strings in Wesnoth use a custom formatting language, which is described here.<br />
<br />
A format variable is introduced by a dollar sign (<code>$</code>), which is followed by a unique name. The name can be any sequence of letters, numbers, and underscores. For example, <code>$number</code>, <code>$gold_amount</code>, and <code>$1st_name</code> are all valid examples of placeholders. This unique name '''''must not be translated''''' and should be rendered exactly as-is in the translated text, as the engine needs to be able to match it exactly to substitute in the correct replacement.<br />
<br />
In some rare cases, the name may also contain a period (<code>.</code>) or square brackets (<code>[]</code>). For example, <code>$houses[3].title</code> would be valid. Names can also be nested within each other, so <code>$house_$colour</code> and <code>$houses[$n]</code> can also occasionally occur.<br />
<br />
The <code>|</code> character is used if the end of the name needs to be disambiguated (because the following character could otherwise also be part of the name). For example, in <code>$some|where</code>, the variable is only <code>$some|</code>. This can also be used in nesting, so you could have something complicated like <code>$the_$colour|_town.houses[$n].owner</code>.<br />
<br />
The <code>?</code> character following a variable indicates a default value. The text between the <code>?</code> and the following <code>|</code> should be translated as normal, but the framing characters (<code>?|</code>) and the preceding variable name '''''must''''' be left untouched.<br />
<br />
You may also see a dollar sign immediately followed by a parenthesized formula from time to time (for example, <code>$($n + $m)</code>. In this case, the entire formula should be left untouched in the translated text. Formulas normally only evaluate to numerical values. They should not be used very often in translatable strings, however.<br />
<br />
A dollar sign at the end of the string, or directly followed by a pipe (<code>$|</code>), is displayed as just a dollar sign and does not indicate any formatting placeholder.<br />
<br />
=== Markup ===<br />
<br />
Some strings contain formatting markup. This comes in two styles. The most common is [[Pango formatting|Pango markup]], which is an HTML-like formatting language. The other is the custom help page markup, which looks superficially similar but is rather different, and is documented here.<br />
<br />
Like HTML, help markup consists of tags enclosed in angle brackets (eg <code><italic></code>), with a slash added to the closing tag. The difference lies in what comes between the tags, which takes a key=value format where the value is usually enclosed in single quotes. There can be multiple key=value pairs, separated by spaces. Generally, all of that should be left untouched, with the exception of the <code>text</code> key. If you see something like <code><italic>text='some text'</italic></code>, the only part that should be translated is "some text". Or if you see <code><nowiki><ref>dst='movement' text='zones of control'</ref></nowiki></code>, then only "zones of control" should be translated, and the rest should be left untouched.<br />
<br />
== FAQ ==<br />
* '''What are "Plural-forms"?'''<br />
** Some languages have different word forms for different numbers of things (for example in English we have "1 thing" but "2 thing'''s'''"). The rules are different for different languages. You can find them [http://translate.sourceforge.net/wiki/l10n/pluralforms here].<br />
* '''How do I use ' within a single-quote delimited string when translating text= in help screen texts?'''<br />
** Add a backslash before it, however the preferred method now is to use [[Typography_Style_Guide#Character_Usage_Summary|typographic punctuation]] instead.<br />
* '''What should I do with strings like "Prefs section^General"?'''<br />
** There are ambiguous strings which should be translated in a different way depending on where they appear. For example, we have "General" in the preferences as "General preferences" and we can also have "a General". These strings can have different translations for a given language, so we use "context" to solve this. The prefix only tries to give a hint about the string, and should be not translated, for example:<br />
msgid "Prefs section^General"<br />
msgstr "General"<br />
* '''My PO file already has that translated to "Prefs section^General", should it work?'''<br />
** It does, but probably shouldn't. For strings that have no translation, the part before the "^" will be removed. This is also done when the PO's msgstr is exactly the same as the msgid, which will later break if someone makes any change to the text. For example:<br />
# wrong but seems to work (shows as "Root")<br />
msgid "filesystem_path_system^Root"<br />
msgstr "filesystem_path_system^Root"<br />
# wrong and shows as "filesystem_path_system^Wurzel"<br />
msgid "filesystem_path_system^Root"<br />
msgstr "filesystem_path_system^Wurzel"<br />
* '''Who can I ask for further information?'''<br />
** You can ask in [[Support|Discord or IRC]]. Ping Ivanovic in Discord's #development or IRC's #wesnoth-dev channel. If you don't like IRC, send a mail to crazy-ivanovic AT gmx DOT net, or pm him (ivanovic) at the forum.<br />
* '''Why is the diff from the previous version so huge? I have only made a small change to the .po file with poedit.'''<br />
** When saving .po file poedit unwraps all strings. Usually, all .po files are wrapped at 80 characters so if you want smaller diffs and less merge conflicts you can execute the following commands each time after editing with poedit:<br />
<br />
msgattrib file.po > file.po1<br />
mv file.po1 file.po<br />
<br />
== Tools ==<br />
<br />
There are several tools to work with .po files:<br />
* [https://pofile.net/free-po-editor Free PO editor] (Web based)<br />
* [http://userbase.kde.org/Lokalize Lokalize] (Unix KDE) (Formerly known as [https://directory.fsf.org/wiki/KBabel KBabel])<br />
* [https://kate-editor.org/ Kate] (Unix KDE)<br />
* [http://wiki.gnome.org/Apps/Gtranslator GTranslator] (Unix Gnome)<br />
* [http://virtaal.translatehouse.org Virtaal] (Multiplatform)<br />
* [http://www.poedit.net/ poEdit] (Multiplatform)<br />
* [http://www.gnu.org/software/emacs/emacs.html Emacs with po-mode] (Multiplatform)<br />
* [http://www.vim.org/ Vim] with [http://www.vim.org/scripts/script.php?script_id=695 PO plug-in] (Multiplatform)<br />
<br />
Of course, you can edit po files with any UTF-8 capable text editor, but the tools listed above have great advantages over any text editor regarding .po translation, like going to next fuzzy/untranslated string, searching only in specific fields (msgid, msgstr, comment), ...<br />
<br />
== See Also ==<br />
<br />
* [[WesnothTranslations]]<br />
* [[WesnothTranslationsHowTo]]<br />
* [[GettextForWesnothDevelopers]]<br />
* [[TranslatorShellscript]]<br />
* [http://www.wesnoth.org/gettext/ Translation statistics]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=AddonsWML&diff=72169AddonsWML2024-01-23T13:02:51Z<p>Octalot: /* Which add-ons are active during gameplay */ Note that [units] isn't an add-on module</p>
<hr />
<div>{{WML Tags}}<br />
== Creating add-ons in WML ==<br />
<br />
An add-on is defined by a directory structure, there is no tag called '''[addon]'''. The directory must contain a '''_main.cfg''', and the name of the directory is treated as its '''id'''. There are different rules for add-ons that define a custom core, which are described in [[CoreWML]] and ignored for the purposes of this page.<br />
<br />
The description of a downloaded add-on is found in '''_info.cfg''', the data for a locally authored add-on is in '''_server.pbl''' (see [[PblWML]]).<br />
<br />
An add-on typically contains other files, see for example [[AddonStructure]] or [[BuildingCampaignsTheCampaignFile]].<br />
<br />
== Which add-ons are active during gameplay ==<br />
<br />
To help prevent clashes between add-ons, when starting a scenario the engine only loads the active add-ons. An add-on is active if one or more "add-on modules" is used by the game. If a game does not use any add-on module from your add-on, then your add-on won't be parsed at all. On the other hand, if the game uses any add-on module from your add-on, then your entire add-on will be parsed, relying on preprocessor defines to exclude parts that aren't relevant to the add-on module that is to be loaded.<br />
<br />
Several toplevel tags are used to define an "add-on module":<br />
<br />
* [[EraWML|'''[era]''']] - A multiplayer era<br />
* [[CampaignWML|'''[campaign]''']] - A campaign, either single-player or multiplayer<br />
* [[ScenarioWML|'''[scenario]''']] - A campaign scenario<br />
* [[ScenarioWML|'''[multiplayer]''']] - A multiplayer scenario<br />
* [[ScenarioWML|'''[test]''']] - A test or demo scenario<br />
* [[ModificationWML|'''[modification]''']] - A modification that can be selected in the campaign or multiplayer menu<br />
* [[ModificationWML|'''[resource]''']] - A resource that can be requested by any other add-on module<br />
<br />
Notably, that list doesn't contain the [[UnitsWML|'''[units]''']] tag. For example, a multiplayer scenario which allows the player to choose any era but has scripted events that spawn Ageless Era units needs to activate those units' add-on by loading a resource from it.<br />
<br />
== Common Tags and Keys ==<br />
<br />
The following tags and keys are supported in most types of addon modules:<br />
<br />
* '''id''': The addon module's unique ID. It must be unique across all addon module types, so for example there cannot be a '''[scenario]''' and a '''[multiplayer]''' with the same ID.<br />
* '''addon_min_version''': The minimum version of your add-on with which this content is backwards compatible. Compared with the version string given in [[PblWML]]. If ''addon_min_version'' is not explicitly specified, it means compatible only with the same version. Clients in multiplayer must have add-on versions agreeing with the ''addon_min_versions'' of each others' content in order to play, and will be prompted to update otherwise.<br />
* '''name''': (translatable) The visible name for the addon module, shown in the campaign selection or multiplayer game creation menu. (Not supported for '''[resource]''' since it is never visible anywhere.)<br />
* '''description''': (translatable) The detailed description for the addon module, shown in the campaign selection or multiplayer game creation menu. (Also not supported for '''[resource]''', nor for '''[scenario]''' or '''[test]'''.)<br />
* '''define'''='''''SYMBOL''''' When this addon module is active, the preprocessor symbol '''''SYMBOL''''' will be defined. See [[PreprocessorRef#.23ifdef_and_.23ifndef|ifdef]] for how this can be used to isolate parts of the file from other addon modules. Besides the addon module tag, only the tags '''[textdomain]''' and '''[binary_path]''' (see [[BinaryPathWML]]) should go outside of '''#ifdef ''SYMBOL'''''. This symbol will be defined ''before'' any .cfg is preprocessed. Note: If for some reason you don't want to place your '''[binary_path]''' outside your '''#ifdef ''SYMBOL''''' (perhaps it's causing conflicts with other addon modules), you can use binary-path-independent paths for the textdomain and any assets that are used in the addon module tag. This looks like '''icon=data/add-ons/whatever/something.png''' – essentially, any path beginning with '''data/'''.<br />
* '''[event]''' - An event handler that will be registered when the addon module is active. See [[EventWML]].<br />
* '''[lua]''' - Lua code that will be run when the addon module is loaded, before the '''preload''' event is fired. See [[LuaWML]].<br />
* '''[ai]''': Defines an AI algorithm that can be selected by players at the join game screen. See [[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Top-level_Elements|here]] for details. This is not used in single-player.<br />
** Note: This is not the place to define faction-specific AI parameters in an era. For that, place the '''[ai]''' tag in '''[multiplayer_side]'''.<br />
** Note: This tag may not be supported in '''[resource]''', '''[scenario]''', or '''[test]'''.<br />
* '''[options]''': Custom options. See [[OptionWML]] for details. Note: This may not be supported in '''[resource]''', '''[scenario]''', or '''[test]'''.<br />
* '''[load_resource]''': Indicates a resource to load when this addon module is loaded.<br />
** '''id''': The ID of the resource.<br />
* '''[modify_unit_type]''' {{DevFeature1.15|2}}: Changes a unit type while this modification is active. The supported attributes are:<br />
** '''type''' : the id of the unit type to change.<br />
** '''set_experience''' : changes the unit type's max experience.<br />
** '''set_cost''' : changes the unit type's recruit cost.<br />
** '''set_advances_to''' : changes the unit type's advancements.<br />
** '''add_advancement''' : adds a (list of comma separated) unit type(s) to the possible advancements of this unit type.<br />
** '''remove_advancement''' : removes a (list of comma separated) unit type(s) from the possible advancements of this unit type.<br />
<br />
== See Also ==<br />
<br />
* [[BinaryPathWML]] - Toplevel tag to define search paths for assets.<br />
* [[UnitsWML]] - Toplevel tag to define units and unit-related data.<br />
* [[TerrainWML]] - Toplevel tag to define terrain types.<br />
* [[TerrainGraphicsWML]] - Toplevel tag to define how terrain is drawn.</div>Octalothttps://wiki.wesnoth.org/index.php?title=AddonsWML&diff=72168AddonsWML2024-01-23T12:25:18Z<p>Octalot: /* Creating add-ons in WML */ Correct file extension for .pbl files</p>
<hr />
<div>{{WML Tags}}<br />
== Creating add-ons in WML ==<br />
<br />
An add-on is defined by a directory structure, there is no tag called '''[addon]'''. The directory must contain a '''_main.cfg''', and the name of the directory is treated as its '''id'''. There are different rules for add-ons that define a custom core, which are described in [[CoreWML]] and ignored for the purposes of this page.<br />
<br />
The description of a downloaded add-on is found in '''_info.cfg''', the data for a locally authored add-on is in '''_server.pbl''' (see [[PblWML]]).<br />
<br />
An add-on typically contains other files, see for example [[AddonStructure]] or [[BuildingCampaignsTheCampaignFile]].<br />
<br />
== Which add-ons are active during gameplay ==<br />
<br />
To help prevent clashes between add-ons, when starting a scenario the engine only loads the active add-ons. An add-on is active if one or more "add-on modules" is used by the game. If a game does not use any add-on module from your add-on, then your add-on won't be parsed at all. On the other hand, if the game uses any add-on module from your add-on, then your entire add-on will be parsed, relying on preprocessor defines to exclude parts that aren't relevant to the add-on module that is to be loaded.<br />
<br />
Several toplevel tags are used to define an "add-on module":<br />
<br />
* [[EraWML|'''[era]''']] - A multiplayer era<br />
* [[CampaignWML|'''[campaign]''']] - A campaign, either single-player or multiplayer<br />
* [[ScenarioWML|'''[scenario]''']] - A campaign scenario<br />
* [[ScenarioWML|'''[multiplayer]''']] - A multiplayer scenario<br />
* [[ScenarioWML|'''[test]''']] - A test or demo scenario<br />
* [[ModificationWML|'''[modification]''']] - A modification that can be selected in the campaign or multiplayer menu<br />
* [[ModificationWML|'''[resource]''']] - A resource that can be requested by any other addon module<br />
<br />
== Common Tags and Keys ==<br />
<br />
The following tags and keys are supported in most types of addon modules:<br />
<br />
* '''id''': The addon module's unique ID. It must be unique across all addon module types, so for example there cannot be a '''[scenario]''' and a '''[multiplayer]''' with the same ID.<br />
* '''addon_min_version''': The minimum version of your add-on with which this content is backwards compatible. Compared with the version string given in [[PblWML]]. If ''addon_min_version'' is not explicitly specified, it means compatible only with the same version. Clients in multiplayer must have add-on versions agreeing with the ''addon_min_versions'' of each others' content in order to play, and will be prompted to update otherwise.<br />
* '''name''': (translatable) The visible name for the addon module, shown in the campaign selection or multiplayer game creation menu. (Not supported for '''[resource]''' since it is never visible anywhere.)<br />
* '''description''': (translatable) The detailed description for the addon module, shown in the campaign selection or multiplayer game creation menu. (Also not supported for '''[resource]''', nor for '''[scenario]''' or '''[test]'''.)<br />
* '''define'''='''''SYMBOL''''' When this addon module is active, the preprocessor symbol '''''SYMBOL''''' will be defined. See [[PreprocessorRef#.23ifdef_and_.23ifndef|ifdef]] for how this can be used to isolate parts of the file from other addon modules. Besides the addon module tag, only the tags '''[textdomain]''' and '''[binary_path]''' (see [[BinaryPathWML]]) should go outside of '''#ifdef ''SYMBOL'''''. This symbol will be defined ''before'' any .cfg is preprocessed. Note: If for some reason you don't want to place your '''[binary_path]''' outside your '''#ifdef ''SYMBOL''''' (perhaps it's causing conflicts with other addon modules), you can use binary-path-independent paths for the textdomain and any assets that are used in the addon module tag. This looks like '''icon=data/add-ons/whatever/something.png''' – essentially, any path beginning with '''data/'''.<br />
* '''[event]''' - An event handler that will be registered when the addon module is active. See [[EventWML]].<br />
* '''[lua]''' - Lua code that will be run when the addon module is loaded, before the '''preload''' event is fired. See [[LuaWML]].<br />
* '''[ai]''': Defines an AI algorithm that can be selected by players at the join game screen. See [[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Top-level_Elements|here]] for details. This is not used in single-player.<br />
** Note: This is not the place to define faction-specific AI parameters in an era. For that, place the '''[ai]''' tag in '''[multiplayer_side]'''.<br />
** Note: This tag may not be supported in '''[resource]''', '''[scenario]''', or '''[test]'''.<br />
* '''[options]''': Custom options. See [[OptionWML]] for details. Note: This may not be supported in '''[resource]''', '''[scenario]''', or '''[test]'''.<br />
* '''[load_resource]''': Indicates a resource to load when this addon module is loaded.<br />
** '''id''': The ID of the resource.<br />
* '''[modify_unit_type]''' {{DevFeature1.15|2}}: Changes a unit type while this modification is active. The supported attributes are:<br />
** '''type''' : the id of the unit type to change.<br />
** '''set_experience''' : changes the unit type's max experience.<br />
** '''set_cost''' : changes the unit type's recruit cost.<br />
** '''set_advances_to''' : changes the unit type's advancements.<br />
** '''add_advancement''' : adds a (list of comma separated) unit type(s) to the possible advancements of this unit type.<br />
** '''remove_advancement''' : removes a (list of comma separated) unit type(s) from the possible advancements of this unit type.<br />
<br />
== See Also ==<br />
<br />
* [[BinaryPathWML]] - Toplevel tag to define search paths for assets.<br />
* [[UnitsWML]] - Toplevel tag to define units and unit-related data.<br />
* [[TerrainWML]] - Toplevel tag to define terrain types.<br />
* [[TerrainGraphicsWML]] - Toplevel tag to define how terrain is drawn.</div>Octalothttps://wiki.wesnoth.org/index.php?title=AddonsWML&diff=72167AddonsWML2024-01-23T12:15:33Z<p>Octalot: /* Creating add-ons in WML */ Fixed some links</p>
<hr />
<div>{{WML Tags}}<br />
== Creating add-ons in WML ==<br />
<br />
An add-on is defined by a directory structure, there is no tag called '''[addon]'''. The directory must contain a '''_main.cfg''', and the name of the directory is treated as its '''id'''. There are different rules for add-ons that define a custom core, which are described in [[CoreWML]] and ignored for the purposes of this page.<br />
<br />
An add-on typically contains other files, see for example [[AddonStructure]] or [[BuildingCampaignsTheCampaignFile]].<br />
<br />
The description of a downloaded add-on is found in '''_info.cfg''', the data for a locally authored add-on is in '''_server.cfg''' (see [[PblWML]]).<br />
<br />
== Which add-ons are active during gameplay ==<br />
<br />
To help prevent clashes between add-ons, when starting a scenario the engine only loads the active add-ons. An add-on is active if one or more "add-on modules" is used by the game. If a game does not use any add-on module from your add-on, then your add-on won't be parsed at all. On the other hand, if the game uses any add-on module from your add-on, then your entire add-on will be parsed, relying on preprocessor defines to exclude parts that aren't relevant to the add-on module that is to be loaded.<br />
<br />
Several toplevel tags are used to define an "add-on module":<br />
<br />
* [[EraWML|'''[era]''']] - A multiplayer era<br />
* [[CampaignWML|'''[campaign]''']] - A campaign, either single-player or multiplayer<br />
* [[ScenarioWML|'''[scenario]''']] - A campaign scenario<br />
* [[ScenarioWML|'''[multiplayer]''']] - A multiplayer scenario<br />
* [[ScenarioWML|'''[test]''']] - A test or demo scenario<br />
* [[ModificationWML|'''[modification]''']] - A modification that can be selected in the campaign or multiplayer menu<br />
* [[ModificationWML|'''[resource]''']] - A resource that can be requested by any other addon module<br />
<br />
== Common Tags and Keys ==<br />
<br />
The following tags and keys are supported in most types of addon modules:<br />
<br />
* '''id''': The addon module's unique ID. It must be unique across all addon module types, so for example there cannot be a '''[scenario]''' and a '''[multiplayer]''' with the same ID.<br />
* '''addon_min_version''': The minimum version of your add-on with which this content is backwards compatible. Compared with the version string given in [[PblWML]]. If ''addon_min_version'' is not explicitly specified, it means compatible only with the same version. Clients in multiplayer must have add-on versions agreeing with the ''addon_min_versions'' of each others' content in order to play, and will be prompted to update otherwise.<br />
* '''name''': (translatable) The visible name for the addon module, shown in the campaign selection or multiplayer game creation menu. (Not supported for '''[resource]''' since it is never visible anywhere.)<br />
* '''description''': (translatable) The detailed description for the addon module, shown in the campaign selection or multiplayer game creation menu. (Also not supported for '''[resource]''', nor for '''[scenario]''' or '''[test]'''.)<br />
* '''define'''='''''SYMBOL''''' When this addon module is active, the preprocessor symbol '''''SYMBOL''''' will be defined. See [[PreprocessorRef#.23ifdef_and_.23ifndef|ifdef]] for how this can be used to isolate parts of the file from other addon modules. Besides the addon module tag, only the tags '''[textdomain]''' and '''[binary_path]''' (see [[BinaryPathWML]]) should go outside of '''#ifdef ''SYMBOL'''''. This symbol will be defined ''before'' any .cfg is preprocessed. Note: If for some reason you don't want to place your '''[binary_path]''' outside your '''#ifdef ''SYMBOL''''' (perhaps it's causing conflicts with other addon modules), you can use binary-path-independent paths for the textdomain and any assets that are used in the addon module tag. This looks like '''icon=data/add-ons/whatever/something.png''' – essentially, any path beginning with '''data/'''.<br />
* '''[event]''' - An event handler that will be registered when the addon module is active. See [[EventWML]].<br />
* '''[lua]''' - Lua code that will be run when the addon module is loaded, before the '''preload''' event is fired. See [[LuaWML]].<br />
* '''[ai]''': Defines an AI algorithm that can be selected by players at the join game screen. See [[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Top-level_Elements|here]] for details. This is not used in single-player.<br />
** Note: This is not the place to define faction-specific AI parameters in an era. For that, place the '''[ai]''' tag in '''[multiplayer_side]'''.<br />
** Note: This tag may not be supported in '''[resource]''', '''[scenario]''', or '''[test]'''.<br />
* '''[options]''': Custom options. See [[OptionWML]] for details. Note: This may not be supported in '''[resource]''', '''[scenario]''', or '''[test]'''.<br />
* '''[load_resource]''': Indicates a resource to load when this addon module is loaded.<br />
** '''id''': The ID of the resource.<br />
* '''[modify_unit_type]''' {{DevFeature1.15|2}}: Changes a unit type while this modification is active. The supported attributes are:<br />
** '''type''' : the id of the unit type to change.<br />
** '''set_experience''' : changes the unit type's max experience.<br />
** '''set_cost''' : changes the unit type's recruit cost.<br />
** '''set_advances_to''' : changes the unit type's advancements.<br />
** '''add_advancement''' : adds a (list of comma separated) unit type(s) to the possible advancements of this unit type.<br />
** '''remove_advancement''' : removes a (list of comma separated) unit type(s) from the possible advancements of this unit type.<br />
<br />
== See Also ==<br />
<br />
* [[BinaryPathWML]] - Toplevel tag to define search paths for assets.<br />
* [[UnitsWML]] - Toplevel tag to define units and unit-related data.<br />
* [[TerrainWML]] - Toplevel tag to define terrain types.<br />
* [[TerrainGraphicsWML]] - Toplevel tag to define how terrain is drawn.</div>Octalothttps://wiki.wesnoth.org/index.php?title=ReferenceWML&diff=72166ReferenceWML2024-01-23T12:12:57Z<p>Octalot: Move AddonsWML into the "How WML works" section</p>
<hr />
<div>{{WML Tags}}<br />
== The Wesnoth Markup Language ==<br />
<br />
The Wesnoth Markup Language (WML) is used to code almost everything in Wesnoth, including scenarios, units, savefiles, and the user interface layout. WML files are simple, human-readable text files, usually with the .cfg extension, with similarities to INI files and XML. A major feature in WML are macros, which are alike those found in the C language and similarily are handled by a preprocessor. Implementation-wise, WML files are handled mainly by the ''config'' class (and ''simple_wml'' in [[wesnothd]]).<br />
<br />
This page is a collection of pointers to different common WML structures.<br />
<br />
See [[BuildingScenarios]], [[BuildingCampaigns]] and [[BuildingUnits]]<br />
for a tutorial style overview.<br />
<br />
<br />
<br />
''Note: this reference may contain slight inaccuracies, might not list all existing keys and tags or might contain some deprecated syntax. If you find that this reference doesn't give you the answer to how to implement some feature in WML, the most reliable way is to look at the WML code of existing units and campaigns that have done so.''<br />
<br />
== How WML works ==<br />
<br />
* [[SyntaxWML]] Description of WML syntax, and how to use variables<br />
* [[PreprocessorRef]] the WML preprocessor syntax<br />
* [[GrammarWML]] A more formal definition of the WML syntax. More useful for implementing a WML parser than for writing WML documents.<br />
* [[AddonsWML]] Content that can be published and downloaded via the add-ons server<br />
<br />
== WML toplevel tags ==<br />
<br />
The following covers most of the possible toplevel tags in a typical main WML file. Some minor and dev-oriented tags (not intended for use by UMC) are omitted.<br />
<br />
* [[GameConfigWML]] the top level '''[game_config]''' tag<br />
* [[UnitsWML]] the top level '''[units]''' tag<br />
** [[AbilitiesWML]] a list of the different abilities a unit or weapon can have<br />
** [[UnitTypeWML]] how to describe a unit type<br />
** [[AnimationWML]] how to animate units<br />
* [[CoreWML]] the top level '''[core]''' tag<br />
* [[CampaignWML]] the top level '''[campaign]''' tag<br />
** [[CreditsWML]] how to describe the credits (the '''[about]''' tag)<br />
* [[ScenarioWML]] the top level tags '''[scenario]''', '''[multiplayer]''', and '''[test]'''<br />
** [[EventWML]] how to describe an event (the '''[event]''' tag)<br />
** [[SideWML]] how to describe a side (the '''[side]''' tag)<br />
** [[MapGeneratorWML]] the random map generator<br />
** [[TimeWML]] how to describe a day<br />
** [[IntroWML]] how to describe the intro screen (the '''[story]''' and '''[part]''' tags)<br />
* [[EraWML]] the top level '''[era]''' tag<br />
* [[ModificationWML]] the top level '''[modification]''' and '''[resource]''' tags<br />
* [[TerrainWML]] the top level '''[terrain_type]''' tag<br />
* [[TerrainGraphicsWML]], the top level '''[terrain_graphics]''' tag<br />
* [[ThemeWML]] the top level '''[theme]''' tag<br />
* [[LanguageWML]] the top level '''[language]''' tag<br />
* [[LocaleWML]] the top level '''[locale]''' tag<br />
* [[HelpWML]] the top level '''[help]''' tag<br />
* [[BinaryPathWML]] the top level '''[binary_path]''' tag<br />
* [[FontsWML]] the top level '''[fonts]''' tag<br />
* [[GettextForWesnothDevelopers#The_textdomain_tag|Textdomains]] the '''[textdomain]''' tag<br />
<br />
Some other files use the WML format, but with different tags.<br />
<br />
* [[AchievementsWML]] the [achievement_group] and [achievement] tags.<br />
* [[SavefileWML]] a description of the format of savegames<br />
** [[ReplayWML]] a description of the format of player actions such as moving a unit<br />
** [[StatisticalScenarioWML]] used to generate statistics of a savegame<br />
* [[PblWML]] a description of the format of server-uploadable campaigns<br />
* [[SchemaWML]] a description of WML files that define the structure of other WML files<br />
* [[DiffWML]] used to describe structural differences between preprocessed WML documents<br />
* [[GUIToolkit]] creating dialogs<br />
<br />
== Other WML tags ==<br />
<br />
* [[EventWML]] how to describe an event<br />
** [[FilterWML]] the construct to filter on [[StandardUnitFilter|units]], [[StandardLocationFilter|locations]], [[StandardSideFilter|sides]], weapons, vision, and WML data.<br />
** [[ActionWML]] to describe the actions which occur when the event is fired<br />
*** [[ConditionalActionsWML]] actions that encapsulate conditional filters and the actions to execute if the conditions are met<br />
*** [[DirectActionsWML]] actions that directly affect gameplay: for example, creating a unit<br />
**** [[SingleUnitWML]] how to describe a unit (for uses such as placing one on the map with the '''[unit]''' tag)<br />
*** [[InternalActionsWML]] actions that WML uses internally: for example, storing a variable<br />
*** [[InterfaceActionsWML]] actions that do not affect gameplay: for example, displaying a message<br />
*** [[LuaWML]] how to code actions with the Lua language (BfW 1.14 and earlier)<br />
*** [[LuaAPI]] how to code actions with the Lua language (BfW 1.16 and later)<br />
* [[AiWML]] how to describe parameters for AI (the '''[ai]''' tag)<br />
* [[EffectWML]] the construct to modify a unit (the '''[effect]''' tag)<br />
* [[DescriptionWML]] the structure of WML coded menus like the difficulty chooser of campaigns<br />
* [[EditorWML]] tags controlling the post-1.4 editor's behavior<br />
* [[MusicListWML]] for playing music (see also [[Available Music]] for a list of what's available)<br />
<br />
== Predefined macros == <br />
<br />
Wesnoth ships with a library of predefined macros you should find useful in writing your own WML.<br />
* [https://www.wesnoth.org/macro-reference.html WML Macros] - description of all such macros.<br />
<br />
== Other ==<br />
<br />
* [[ReferenceWMLSyntax]] how this wiki and the pages it links to should be formatted<br />
* [[ConventionsWML]] how to make your WML more readable<br />
* [[Wml_optimisation]] how to make your WML code more efficient<br />
* [[UsefulWMLFragments]] Various pieces of WML for various purposes. If you have some WML you're proud of that you think others can use, add it here.<br />
* [[Maintenance tools]] for wmlindent, wmllint, wmlscope<br />
* [[CommandMode]] commands are not strictly speaking part of WML, but they are useful for debugging it, and could be a little hard to find, so linking to them here makes sense.<br />
* [[MultiplayerServerWML]] is used when communicating with the multiplayer server.<br />
* [[CampaignServerWML]] is used when managing contributed campaigns on the campaign server.<br />
* [[ImagePathFunctions]] (IPFs) are used when applying the color function to images, such as marking units as belonging to a team or in TerrainGraphics.<br />
* [[Pango formatting]] shows ways to enrich descriptions (pango markup, which can generate basic html tags like <nowiki><b>, <i>, <span></nowiki> and others).<br />
* [[Wesnoth_Formula_Language]] (WFL) often used with $() formulas.<br />
* [[PreprocessorRef|Syntax of preprocessor mini-language]] : symbols, macros, file inclusions...<br />
<br />
== See Also ==<br />
<br />
* [[BuildingMaps]] the text-based format for Wesnoth maps<br />
* [[TerrainCodeTableWML]] a list of all terrains, and [[TerrainCodesWML]], on how to use them<br />
* [[MultiHexTutorial]] a description of the multi-hex tiling system<br />
* [[IGNFileFormat]] a description of the ignore file format<br />
* [[CompatibilityStandards#Deprecation_levels_-_When_to_remove_deprecated_features|DeprecationLevels]]<br />
* Back to [[Create]]<br />
<br />
[[Category: WML Reference]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=AddonsWML&diff=72165AddonsWML2024-01-23T12:07:41Z<p>Octalot: How directory structure fills the role of an [addon] tag</p>
<hr />
<div>{{WML Tags}}<br />
== Creating add-ons in WML ==<br />
<br />
An add-on is defined by a directory structure, there is no tag called '''[addon]'''. The directory must contain a '''_main.cfg''', and the name of the directory is treated as its '''id'''. There are different rules for add-ons that define a custom core, which are described in [[CoreWML]] and ignored for the purposes of this page.<br />
<br />
An add-on typically contains other files, see for example AddonStructure or BuildingCampaignsTheCampaignFile.<br />
<br />
The description of a downloaded add-on is found in '''_info.cfg''', the data for a locally authored add-on is in '''_server.cfg''' (see [[PblWML]]).<br />
<br />
== Which add-ons are active during gameplay ==<br />
<br />
To help prevent clashes between add-ons, when starting a scenario the engine only loads the active add-ons. An add-on is active if one or more "add-on modules" is used by the game. If a game does not use any add-on module from your add-on, then your add-on won't be parsed at all. On the other hand, if the game uses any add-on module from your add-on, then your entire add-on will be parsed, relying on preprocessor defines to exclude parts that aren't relevant to the add-on module that is to be loaded.<br />
<br />
Several toplevel tags are used to define an "add-on module":<br />
<br />
* [[EraWML|'''[era]''']] - A multiplayer era<br />
* [[CampaignWML|'''[campaign]''']] - A campaign, either single-player or multiplayer<br />
* [[ScenarioWML|'''[scenario]''']] - A campaign scenario<br />
* [[ScenarioWML|'''[multiplayer]''']] - A multiplayer scenario<br />
* [[ScenarioWML|'''[test]''']] - A test or demo scenario<br />
* [[ModificationWML|'''[modification]''']] - A modification that can be selected in the campaign or multiplayer menu<br />
* [[ModificationWML|'''[resource]''']] - A resource that can be requested by any other addon module<br />
<br />
== Common Tags and Keys ==<br />
<br />
The following tags and keys are supported in most types of addon modules:<br />
<br />
* '''id''': The addon module's unique ID. It must be unique across all addon module types, so for example there cannot be a '''[scenario]''' and a '''[multiplayer]''' with the same ID.<br />
* '''addon_min_version''': The minimum version of your add-on with which this content is backwards compatible. Compared with the version string given in [[PblWML]]. If ''addon_min_version'' is not explicitly specified, it means compatible only with the same version. Clients in multiplayer must have add-on versions agreeing with the ''addon_min_versions'' of each others' content in order to play, and will be prompted to update otherwise.<br />
* '''name''': (translatable) The visible name for the addon module, shown in the campaign selection or multiplayer game creation menu. (Not supported for '''[resource]''' since it is never visible anywhere.)<br />
* '''description''': (translatable) The detailed description for the addon module, shown in the campaign selection or multiplayer game creation menu. (Also not supported for '''[resource]''', nor for '''[scenario]''' or '''[test]'''.)<br />
* '''define'''='''''SYMBOL''''' When this addon module is active, the preprocessor symbol '''''SYMBOL''''' will be defined. See [[PreprocessorRef#.23ifdef_and_.23ifndef|ifdef]] for how this can be used to isolate parts of the file from other addon modules. Besides the addon module tag, only the tags '''[textdomain]''' and '''[binary_path]''' (see [[BinaryPathWML]]) should go outside of '''#ifdef ''SYMBOL'''''. This symbol will be defined ''before'' any .cfg is preprocessed. Note: If for some reason you don't want to place your '''[binary_path]''' outside your '''#ifdef ''SYMBOL''''' (perhaps it's causing conflicts with other addon modules), you can use binary-path-independent paths for the textdomain and any assets that are used in the addon module tag. This looks like '''icon=data/add-ons/whatever/something.png''' – essentially, any path beginning with '''data/'''.<br />
* '''[event]''' - An event handler that will be registered when the addon module is active. See [[EventWML]].<br />
* '''[lua]''' - Lua code that will be run when the addon module is loaded, before the '''preload''' event is fired. See [[LuaWML]].<br />
* '''[ai]''': Defines an AI algorithm that can be selected by players at the join game screen. See [[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Top-level_Elements|here]] for details. This is not used in single-player.<br />
** Note: This is not the place to define faction-specific AI parameters in an era. For that, place the '''[ai]''' tag in '''[multiplayer_side]'''.<br />
** Note: This tag may not be supported in '''[resource]''', '''[scenario]''', or '''[test]'''.<br />
* '''[options]''': Custom options. See [[OptionWML]] for details. Note: This may not be supported in '''[resource]''', '''[scenario]''', or '''[test]'''.<br />
* '''[load_resource]''': Indicates a resource to load when this addon module is loaded.<br />
** '''id''': The ID of the resource.<br />
* '''[modify_unit_type]''' {{DevFeature1.15|2}}: Changes a unit type while this modification is active. The supported attributes are:<br />
** '''type''' : the id of the unit type to change.<br />
** '''set_experience''' : changes the unit type's max experience.<br />
** '''set_cost''' : changes the unit type's recruit cost.<br />
** '''set_advances_to''' : changes the unit type's advancements.<br />
** '''add_advancement''' : adds a (list of comma separated) unit type(s) to the possible advancements of this unit type.<br />
** '''remove_advancement''' : removes a (list of comma separated) unit type(s) from the possible advancements of this unit type.<br />
<br />
== See Also ==<br />
<br />
* [[BinaryPathWML]] - Toplevel tag to define search paths for assets.<br />
* [[UnitsWML]] - Toplevel tag to define units and unit-related data.<br />
* [[TerrainWML]] - Toplevel tag to define terrain types.<br />
* [[TerrainGraphicsWML]] - Toplevel tag to define how terrain is drawn.</div>Octalothttps://wiki.wesnoth.org/index.php?title=GettextForWesnothDevelopers&diff=72164GettextForWesnothDevelopers2024-01-23T10:46:52Z<p>Octalot: /* The translatable strings */ Explain a bit about where the textdomain is used</p>
<hr />
<div>This page is used to help Wesnoth developers and UMC authors to work with the internationalization (i18n) system, based on GNU gettext.<br />
<br />
== General design of gettext use ==<br />
<br />
Programs using Gettext include the strings in one language (usually English) within the source code. For each target language, a separate file provides a look-up table from English to that language. If the file is missing or doesn't have a translation for that string, the system falls back to using the English text.<br />
<br />
The translation mechanism usually involves a function or macro called ''_'' (a single underscore sign). Examples are in the programming-language specific sections below.<br />
<br />
=== Textdomains ===<br />
<br />
Gettext splits translations into domains. For Wesnoth, the general idea is to use distinct textdomains for each campaign or add-on, so that UMC authors can easily ship translations together with their campaigns. These domains are covered in more depth in [[GettextForTranslators]].<br />
<br />
The convention is to name each domain using the name of the add-on, or just its initials. For example, ''wesnoth-utbs'' or ''wesnoth-Son_of_Haldric''. For UMC, it probably makes sense to use the full name to ensure that it doesn't clash with another add-on.<br />
<br />
=== Caret hints ===<br />
<br />
Some strings look the same in English but should not necessarily look identical in translations. To handle this, those strings can be prefixed with any descriptive string and a '''^''' character. For users viewing in '''en_US''', these hints will be automatically removed from the string before showing it to the user.<br />
<br />
{{DevFeature1.15|2}} if the string contains more than one '''^''', the descriptive string ends at the first '''^''', everything following the first '''^''' will be shown to the user.<br />
<br />
{{DevFeature1.15|18}} When using gettext's Plural Forms, these prefixes can and should be used in both the singular and the plural.<br />
<br />
=== UTF-8 ===<br />
<br />
For translation, all C++, WML and Lua files should be in UTF-8. As noted in the [[Typography_Style_Guide]], some punctuation should be used that's outside of the ASCII subset.<br />
<br />
== Marking up strings in C++ ==<br />
<br />
In C++, you can mark up strings for translations using the <syntaxhighlight lang=c++ inline>_("A translation")</syntaxhighlight> and <syntaxhighlight lang=c++ inline>_n("Translation", "Translations", int)</syntaxhighlight> macros. The <code>_n</code> macro is to be used if the string has a singular and plural form.<br />
<br />
You can also add comments for translators. Single-line comments must start with <code>TRANSLATORS:</code> and be on the line ''immediately'' above the translatable string. For multi-line comments, the <code>TRANSLATORS:</code> only needs to be on the first line to include the whole comment, and the last line must be immediately above the translatable string.<br />
<br />
If the string contains any placeholders, '''don't''' use <code>snprintf</code>. Instead use WML style variables, put their values in a <syntaxhighlight lang=c++ inline>utils::string_map</syntaxhighlight> and use the <code>VGETTEXT</code> or <code>VNGETTEXT</code> macros instead.<br />
<br />
<syntaxhighlight lang=c++><br />
utils::string_map symbols;<br />
symbols["enemies"] = std::to_string(enemy_count_);<br />
symbols["friends"] = std::to_string(friend_count_);<br />
std::string message;<br />
if ( friend_count_ != 0 && enemy_count_ != 0 ) {<br />
// Omitted from the example - see the code in src/action/move.cpp for how to handle strings with two independent ints.<br />
} else if ( enemy_count_ != 0 ) {<br />
// TRANSLATORS: Only enemies sighted -- bad message.<br />
// This is shown when a move is interrupted because units were revealed from the fog of war.<br />
message = VNGETTEXT("Enemy unit sighted!", "$enemies enemy units sighted!", enemy_count_, symbols);<br />
} else if ( friend_count_ != 0 ) {<br />
// TRANSLATORS: Only friends sighted -- good message.<br />
// This is shown when a move is interrupted because units were revealed from the fog of war.<br />
message = VNGETTEXT("Friendly unit sighted", "$friends friendly units sighted", friend_count_, symbols);<br />
}<br />
</syntaxhighlight><br />
<br />
The <syntaxhighlight lang=c++ inline>string_map</syntaxhighlight> can contain additional values that aren't used in the translated string. In the example above, it has both ''friends'' and ''enemies''.<br />
<br />
By default, all strings in C++ belong to the "wesnoth" textdomain. If a different textdomain is required, you can add a textdomain binding at the top of the source file, before any include statements. A textdomain binding looks like this: <syntaxhighlight lang=c++>#define GETTEXT_DOMAIN "wesnoth-lib"</syntaxhighlight><br />
<br />
You should avoid placing translatable strings in C++ headers if at all possible. Though there are a few places where it may be unavoidable, such as if templates are in use, it creates the risk of the strings sometimes being looked up in the wrong textdomain if the header is included in multiple files with different textdomains. If possible, always factor the translatable strings out into a source file.<br />
<br />
== Marking up strings in WML ==<br />
<br />
=== The textdomain bindings ===<br />
<br />
All files with translatable strings must declare which textdomain they use, which is normally done by putting ''#textdomain'' on the first line of each .wml file. See the example below:<br />
<br />
<syntaxhighlight lang=wml><br />
#textdomain wesnoth-Son_of_Haldric<br />
<br />
[unit_type]<br />
id=Mu<br />
name= _ "Mu"<br />
# ...<br />
[/unit_type]<br />
</syntaxhighlight><br />
<br />
Note that it is highly recommended that the first textdomain binding be on the first line of the file. Otherwise, odd stuff may happen.<br />
<br />
=== The translatable strings ===<br />
<br />
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. When parsing this, the engine will record both the visible text and the active textdomain, which can later be used to get the translation when displaying the text to the player.<br />
<br />
<syntaxhighlight lang=wml><br />
name= _ "Mu"<br />
</syntaxhighlight><br />
<br />
==== Notes to the translators ====<br />
<br />
If you think a translatable string needs additional guidance to be translated properly, you can provide a special comment that will be seen by the translators. Some hints are generated automatically, but in general if you have to wonder whether a hint is needed then it probably is. The context of the scenario isn't obvious in the translation tools, and you can't assume that the strings are shown to the translator in the same order that they appear in the WML file.<br />
<br />
Just begin the comment with '#po:' or '# po:' above the string in question. This must be on the line (or lines) immediately before the string that the hint applies to:<br />
<br />
<syntaxhighlight lang=wml><br />
#po: "northern marches" is *not* a typo for "northern marshes" here.<br />
#po: In archaic English, "march" means "border country".<br />
story=_ "The orcs were first sighted from the north marches of the great forest of Wesmere."<br />
</syntaxhighlight><br />
<br />
The wmlxgettext tool will automatically generate hints for some tags, in addition to hints from '# po:' comments:<br />
<br />
* For ''[message]'': the ''id'', ''speaker'', ''role'' or ''type'' used to choose the speaker<br />
* For ''[object]'': the ''id''<br />
* For ''[unit]'': the ''id'' and ''unit_type''<br />
* For ''[unit_type]'': the ''id'' and ''race''<br />
* For ''[objective]'': whether it's ''condition=win'' or ''condition=lose''<br />
<br />
==== Things to avoid ====<br />
<br />
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:<br />
<br />
<syntaxhighlight lang=wml><br />
name= _ ""<br />
</syntaxhighlight><br />
<br />
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:<br />
<br />
<syntaxhighlight lang=wml><br />
name= _ "{TYPE} Mu"<br />
</syntaxhighlight><br />
<br />
To show why it will not work:<br />
<br />
<syntaxhighlight lang=wml><br />
#define UNIT_NAME TYPE<br />
name= _ "{TYPE} Mu"<br />
#enddef<br />
<br />
{UNIT_NAME ( _ "Sword")}<br />
{UNIT_NAME ( _ "Bow")}<br />
</syntaxhighlight><br />
<br />
Translation catalogues would have this: "{TYPE} Mu", therefore gettext will look for it even though it will not exist because we, in fact, have these after the preprocessor is done:<br />
<br />
<syntaxhighlight lang=wml><br />
name= _ "Sword Mu"<br />
name= _ "Bow Mu"<br />
</syntaxhighlight><br />
<br />
Since those are not in the catalogues, they will not get translated.<br />
<br />
=== Gender-specific strings ===<br />
<br />
Several tags, including ''[message]'', ''[abilities]'' and ''[trait]'', can choose different strings based on the gender of the unit. In English the two versions are likely to be the same, but other languages may have gender-specific words for 'I' or 'me'.<br />
<br />
<syntaxhighlight lang=wml><br />
[message]<br />
speaker=student<br />
message= _ "Have you found an orc for me to fight, huh? A troll?"<br />
female_message= _ "female^Have you found an orc for me to fight, huh? A troll?"<br />
[/message]<br />
</syntaxhighlight><br />
<br />
The convention in WML is, as above, to use ''message='' and ''female_message='', with the latter string including the prefix ''female^''. The mechanism also supports ''male_message='', but all units will fall back to using the plain ''message='' value if there isn't gender-specific version that matches their gender.<br />
<br />
The message is chosen based on the gender of the speaking unit. To change the message based on the gender of another unit requires separate ''[message]'' tags:<br />
<br />
<syntaxhighlight lang=wml><br />
[if]<br />
[have_unit]<br />
id=student<br />
gender=male<br />
[/have_unit]<br />
[then]<br />
[message]<br />
speaker=Delfador<br />
message= _ "Young man, you have $student_hp hitpoints and a sword. I’m fairly sure you’ll win."<br />
[/message]<br />
[/then]<br />
[else]<br />
[message]<br />
speaker=Delfador<br />
message= _ "female^Young lady, you have $student_hp hitpoints and a sword. I’m fairly sure you’ll win."<br />
[/message]<br />
[/else]<br />
[/if]<br />
</syntaxhighlight><br />
<br />
Using a macro to encapsulate most of that can be useful. The example above is from the tutorial, after expanding the ''GENDER'' macro which is defined in data/campaigns/tutorial/utils/utils.cfg.<br />
<br />
=== Proper nouns in strings ===<br />
<br />
Some languages require declensions of proper nouns - a person's name may change slightly depending on their role in a sentence. See for example [https://github.com/hrubymar10/wesnoth-cs/pull/209#issuecomment-1066163433 the Czech translators' PR 209].<br />
<br />
Where there are a small number of units that might be addressed, for example the two in the tutorial or the four possible allies in UtBS, it's better to have a separate translatable string for each possible character instead of interpolating '''$unit.name''' into a string.<br />
<br />
=== Reusing mainline translations ===<br />
<br />
You can reuse translations for strings in mainline domains by using multiple textdomain bindings:<br />
<br />
<syntaxhighlight lang=wml><br />
# textdomain wesnoth-Son_of_Haldric<br />
<br />
[unit_type]<br />
id=Mu<br />
name= _ "Mu"<br />
# ...<br />
<br />
[attack]<br />
id=sword<br />
#textdomain wesnoth-units<br />
description= _ "sword"<br />
# ...<br />
[/attack]<br />
<br />
#textdomain wesnoth-Son_of_Haldric<br />
# ...<br />
[/unit_type]<br />
</syntaxhighlight><br />
<br />
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, and wesnoth-units.<br />
<br />
==== The gettext helper file ====<br />
<br />
A gettext helper file is a lovely file that makes reusing mainline translations nice and easy, by having all strings that should use a specific textdomain in a single file. It is also more wmllint-friendly.<br />
<br />
Here is an example of a gettext helper file. The macro names start with 'SOH_' to ensure that they don't clash with another add-on's macros (assuming that this add-on is Son_of_Haldric).<br />
<br />
<syntaxhighlight lang=wml><br />
#textdomain wesnoth-lib<br />
<br />
#define SOH_STR_ICE<br />
_"Ice" #enddef<br />
<br />
#textdomain wesnoth-units<br />
<br />
#define SOH_STR_SWORD<br />
_"sword" #enddef<br />
</syntaxhighlight><br />
<br />
A typical name for gettext helper files is ''mainline-strings.cfg''.<br />
<br />
To use it, just wire it into your add-on and use the macros:<br />
<br />
<syntaxhighlight lang=wml><br />
[attack]<br />
id=sword<br />
name={SOH_STR_SWORD}<br />
# ...<br />
[/attack]<br />
<br />
[terrain_type]<br />
id=ice2<br />
name={SOH_STR_ICE}<br />
# ...<br />
[/terrain_type]<br />
</syntaxhighlight><br />
<br />
=== Unbalanced WML macros ===<br />
<br />
WML macros can be ''unbalanced'', meaning that they either include a [tag] without the corresponding [/tag] or a [/tag] before the corresponding [+tag]. These macros are expected to be used in a place where the [tag] is already open. Writing new macros using this isn't recommended; instead please ask in the WML Workshop forum about better ways to do it.<br />
<br />
When generating the .pot files for translation, wmlxgettext may stop with one of the errors<br />
* error: Son_Of_Haldric/utils/abilities.cfg:29: unexpected closing tag '[/abilities]' outside any scope.<br />
* error: Son_Of_Haldric/utils/abilities.cfg:300: End of WML file reached, but some tags were not properly closed. (nearest unclosed tag is: [abilities])<br />
<br />
Suppose abilities.cfg line 29 is in the definition of SOH_ABILITY_BLITZ. To get the .pot file generated, the simplest change is to use ''# wmlxgettext'' comments to add the missing opening or closing tags:<br />
<br />
<syntaxhighlight lang=wml><br />
# wmllint: unbalanced-on<br />
# wmlxgettext: [abilities]<br />
#define SOH_ABILITY_BLITZ<br />
[dummy]<br />
id=soh_blitz<br />
# ... ability definition stuff ...<br />
[/dummy]<br />
[/abilities]<br />
# ... several lines of code, none of which are an ''#enddef'' ...<br />
[+abilities] # wmlxgettext: [/abilities]<br />
#enddef<br />
# wmllint: unbalanced-off<br />
</syntaxhighlight><br />
<br />
== Marking up strings in Lua ==<br />
<br />
In Lua code, textdomains are a callable object that looks up a string. This has support for both singular and plural strings. By convention, the name <code>_</code> is usually used for the textdomain object.<br />
<br />
The following sample code demonstrates how to fetch translatable strings in Lua:<br />
<br />
<syntaxhighlight lang=lua><br />
local _ = wesnoth.textdomain "wesnoth"<br />
<br />
-- Look up a normal string:<br />
local win_condition = _ "Defeat enemy leader(s)"<br />
<br />
-- Hints for the translators start with "po:", as in WML:<br />
-- po: Floating text shown when a unit with the "feeding" ability gets a kill<br />
local text = stringx.vformat(_"+$value max HP", { value = feeding.value})<br />
</syntaxhighlight><br />
<br />
Plural strings are supported since Wesnoth 1.14:<br />
<syntaxhighlight lang=lua><br />
local turn_count = 5<br />
turn_counter = _("this turn left", "%d turns left", turn_count)<br />
turn_counter = tostring(turn_counter):format(turn_count)<br />
<br />
-- For readability, the example's strings are slightly different to the real code.<br />
-- The real strings have brackets in the text shown to the player.<br />
</syntaxhighlight><br />
<br />
In Wesnoth 1.15, variables can be interpolated using names:<br />
<syntaxhighlight lang=lua><br />
-- Look up a plural string, using the preferred style (as of Wesnoth 1.15.3):<br />
local turn_count = 5<br />
turn_counter = _("this turn left", "$remaining_turns turns left", turn_count)<br />
turn_counter = turn_counter:vformat{remaining_turns = turn_count}<br />
</syntaxhighlight><br />
<br />
== The textdomain tag ==<br />
<br />
To tell the engine where to search for the .po and .mo files, each textdomain needs a ''[textdomain]'' tag. For add-ons and mainline campaigns, the tag is usually placed inside of the _main.cfg. This is a top-level tag, so should be outside the ''[campaign]'' or ''[modification]'' tag.<br />
<br />
Translatable strings from C++ and Lua use the same textdomains as WML; this WML tag tells the engine where to search for these strings irrespective of which programming language the string appeared in.<br />
<br />
<syntaxhighlight lang=wml><br />
[textdomain]<br />
name="wesnoth-Son_of_Haldric"<br />
path="data/add-ons/Son_of_Haldric/translations"<br />
[/textdomain]<br />
</syntaxhighlight><br />
<br />
The .po (or .mo) files will be loaded from a subdirectory of the ''translations'' directory.<br />
<br />
== Generating the .pot and .po files for UMC ==<br />
<br />
For each language, Wesnoth will search for a .po file containing the translations. How to create that file will be explained below, but first the overview of where it should go. Continuing with the Son of Haldric example, the Swedish translation would be in the file:<br />
<br />
* ''data/add-ons/Son_of_Haldric/translations/wesnoth-Son_of_Haldric/sv.po'' .<br />
<br />
That comes from:<br />
<br />
* ''data/add-ons/Son_of_Haldric/translations'' comes from the ''[textdomain]'' tag's ''path''<br />
* ''wesnoth-Son_of_Haldric'' is the textdomain's name<br />
* ''sv'' is the language code for Swedish. The codes for each language are given in the big table on [https://www.wesnoth.org/gettext/ https://www.wesnoth.org/gettext/] .<br />
<br />
Wesnoth 1.14 (but not 1.12) supports reading .po files directly, so when you add the .po file and the new translation should appear as soon as you refresh the cache.<br />
<br />
=== Generating the .pot file ===<br />
<br />
The template (.pot) file contains all of the strings that need to be translated in the .po files, but without the translations.<br />
<br />
The .pot is generated from WML and Lua files using a tool called wmlxgettext. With Wesnoth 1.14.5 and later, this is shipped with Wesnoth itself as part of the [[Maintenance_tools]] and can be used from the Maintenance Tools' GUI. At the moment it's not documented on that page, but if you follow the instructions to get GUI.pyw running then you'll see there's a wmlxgettext tab.<br />
<br />
Pre-1.13 instructions on how to get and use it are in Nobun's [https://r.wesnoth.org/p617733 forum posting].<br />
<br />
==== Error messages from wmlxgettext ====<br />
<br />
If you get the error from ''wmlxgettext'' of "UTF-8 Format error. Can't decode byte 0x91 (invalid start byte).", and the line in question has a curly quotation mark, that likely means that your text editor is using the Windows-1252 character set, and you need to replace the Windows quotes with their Unicode equivalents, see [[Typography_Style_Guide]] and your editor's documentation for more info. The same applies if the error message says 0x92, 0x93 or 0x94.<br />
<br />
If you get either "unexpected closing tag '[/''something'']' outside any scope" or "End of WML file reached, but some tags were not properly closed. (nearest unclosed tag is: [''something''])" then see [[#Unbalanced_WML_macros]] above.<br />
<br />
=== Generating the .po files for each language ===<br />
<br />
Each .po file can start as a simple copy of the .pot file. Either the author or the translator copies the template to the language-specific filename, and then the work of [[GettextForTranslators]] happens on those copies.<br />
<br />
Some .po editors, for example poedit, will recognise that the .pot is a template, and automatically suggest saving to a different filename. The poedit editor can also update a .po file based on changes to the .pot file.<br />
<br />
=== Generating the .mo files for UMC ===<br />
<br />
For Wesnoth 1.14, it's generally not necessary to compile the .po files to .mo files. The mainline translations still use .mo files for better performance, but UMC authors can skip the .mo compilation stage.<br />
<br />
== See Also ==<br />
<br />
* [[WesnothTranslations]]<br />
* http://www.gnu.org/software/gettext/<br />
* [https://www.gnu.org/software/gettext/manual/html_node/Preparing-Strings.html#Preparing-Strings GNU gettext manual on preparing translatable strings]<br />
* [[GetText]]<br />
* [https://wmlxgettext-unoff.readthedocs.io/en/latest/ wmlxgettext documentation]<br />
<br />
[[Category:Development]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=1.19_Roadmap&diff=720651.19 Roadmap2024-01-05T13:39:43Z<p>Octalot: Rough outline of the roadmap, milestone headings are only 1.19.5, .10, .20, Beta 1 and release</p>
<hr />
<div>This page is for consolidating and planning when new features and fixes are intended to land in the 1.19 development branch. The release schedule for Development releases can be found [https://forums.wesnoth.org/viewtopic.php?f=2&t=52785 here (link is to the 1.17 page, might change for 1.19)].<br />
<br />
== Instructions ==<br />
Place the feature or fix you intend to implement within the section of the point release that you intend to have it implemented by, as well as your forum username in parenthesis after the feature description. The point release something is planned to be released with is not set in stone, and can be updated as needed depending on the circumstances.<br />
<br />
This is just an outline currently, with some point releases for the early, middle and late parts of the branch.<br />
<br />
== 1.19.5 ==<br />
* [https://github.com/wesnoth/wesnoth/pull/6512 #6512] New type of deprecation warning, when a deprecated attribute is used alongside its replacement (octalot)<br />
<br />
== 1.19.10 ==<br />
* [https://github.com/wesnoth/wesnoth/issues/5041 #5041] Draw text on images in [[IntroWML]], useable for place-name labels on the journey-tracker maps (octalot)<br />
<br />
== 1.19.20 ==<br />
<br />
== 1.19.?? (Beta 1) ==<br />
'''This marks the beginning of the feature freeze and string freeze for 1.19;''' the only API changes made past this point must be to fix bugs.<br />
<br />
== 1.19.?? (RC1) ==<br />
'''This marks the beginning of the API freeze;''' no API changes for for any reason can be made at this point. Additional RC releases will be done as needed.<br />
<br />
* Add new screenshots for 1.20<br />
<br />
== 1.20.0 ==<br />
<br />
[[Category:Roadmaps]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=WesnothTranslationsHowTo&diff=71703WesnothTranslationsHowTo2023-10-20T11:11:02Z<p>Octalot: /* Files */ Split the section into Files, Tools and Summary. Mention SCons and CMake before individual tools.</p>
<hr />
<div>This page contains information on how-to translate and submit translation updates.<br />
<br />
== How to submit your translations ==<br />
<br />
Important: Please '''do not submit translations as pull requests''' on the Wesnoth github repository site. While that seems like a good idea, it causes potential complications that we cannot always easily resolve. As a result, we cannot accept translations submitted via pull request and will close such PRs immediately.<br />
<br />
'' ''' Translation Maintainers ''' ''<br />
<br />
The translation maintainers should send the updated/new translation<br />
po-files to the language coordinator:<br />
Ivanovic (crazy-ivanovic AT gmx DOT net).<br />
Additionally they have to quickly check over other people's translations<br />
(other people translating the same language) as the other translators<br />
(if any) will have to send their translations to their language maintainer<br />
before inclusion in the source-code repository. You should also subscribe to the [http://www.wesnoth.org/wiki/WesnothTranslations#Mailing_List wesnoth-i18n mailinglist].<br />
<br />
Send the files as an archive containing the complete .po files (no .mo or .gmo files) and ensure that they follow the directory structure used in version control. For example, the archive with the German (de) translations should therefore be structured as follows:<br />
wesnoth/de.po<br />
wesnoth-httt/de.po <br />
wesnoth-tutorial/de.po<br />
etc.<br />
<br />
'' ''' Translators ''' ''<br />
<br />
The other translators (those who are not maintainers) should contact<br />
the maintainer for their language to see if there is some work to do.<br />
After you have done some work on the translation you should email it<br />
to your language maintainer. They will then (if needed) check it over<br />
before sending it on to the language coordinators. A list of all translators<br />
currently working on a language is found on each language page.<br />
<br />
'' ''' NEW Translators ''' ''<br />
<br />
If you want to help out with the translation of an language already started on,<br />
contact the translation maintainer for the language.<br />
If you want to start translation of Wesnoth to a new language,<br />
first contact Ivanovic.<br />
And then just follow the instructions written in '' Translators '' .<br />
<br />
== Translations How-To ==<br />
<br />
If you are a translator, see [[GettextForTranslators]] for more information.<br />
<br />
If you are a developer or UMC author, gettext internals for Wesnoth are discussed here: [[GettextForWesnothDevelopers]]. For UMC authors, the tool for generating .po files is linked to from [[GettextForWesnothDevelopers#Generating the_.pot_and_.po_files_for_UMC]].<br />
<br />
=== Files ===<br />
<br />
We will use the Swedish (sv) language and the ''wesnoth-editor'' domain as an example. There are three important files for each text-domain:<br />
* ''wesnoth-editor/wesnoth-editor.pot'' file, which is a template containing all the strings used in the domain, but with empty strings instead of a translation. You can see how a ''.pot'' file looks like in the repository : [https://github.com/wesnoth/wesnoth/blob/master/po/wesnoth-editor/wesnoth-editor.pot#L50 Current repository version].<br />
* ''wesnoth-editor/sv.po'', the file containing the translation, you can see how a ''.po'' file looks like in the repository: [https://github.com/wesnoth/wesnoth/blob/master/po/wesnoth-editor/sv.po#L50 Current repository version].<br />
* ''{translations_dir}/sv/LC_MESSAGES/wesnoth-editor.mo'', which is a binary version of <lang>.po that the game will use for efficiency reasons. This is not found in the repo, but is created during compilation of the game.<br />
<br />
The first of these files, we update every once in a while, when there is new or modified text,<br />
for instance when a new campaign scenario hits the repository.<br />
<br />
=== Tools ===<br />
<br />
For the main Wesnoth repository, the build system can handle updating these files.<br />
* Using SCons, '''scons pot-update''' will do everything. '''scons -j8 pot-update''' is quicker, because it does it in parallel. This can be done without building the Wesnoth executables.<br />
* Using CMake, enable '''ENABLE_NLS''' and '''ENABLE_POT_UPDATE_TARGET''', then run '''make -C po pot-update''' to generate the files.<br />
<br />
Some notes on the individual steps that are used during the build:<br />
<br />
C++ and Python files are parsed with ''xgettext'', WML and Lua files are parsed with ''wmlxgettext''. The results are then combined to generate the ''.pot'' file.<br />
<br />
Then, ''msgmerge'' is used to merge this new "state of the game strings" with your current translations, and generate a new, up-to-date, ''sv.po''.<br />
<br />
Then, a tool called ''msgfmt'' is called, which generates a new ''wesnoth.mo'' file from your ''wesnoth.po'' file, which will be used by the game once installed.<br />
<br />
=== Summary ===<br />
<br />
That was for the "Big Picture".<br />
But you really just need to be concerned with the po file:<br />
translating new strings, checking "fuzzy" entries.<br />
We can handle the administrative tasks of updating etc.<br />
You really don't need to bother with any of these commands, unless you want to compile .mo files to check in-game.<br />
<br />
Ivanovic is now responsible for integrating translations into Wesnoth, with the help of Torangan and ott.<br />
You should contact Ivanovic (crazy-ivanovic AT gmx DOT net), and he'll put them in the game.<br />
<br />
== Specifying typefaces and fonts for a translation ==<br />
<br />
Translations in a language which use characters outside of the Latin, Greek and Cyrillic character sets may want to specify different typefaces. There are some translatable strings in data/hardwired/fonts.cfg which specify the fonts to use; these strings appear in the ''wesnoth'' text domain, and can be configured by putting the required fonts' names as the translations.<br />
<br />
Note the documentation in data/hardwired/fonts.cfg.<br />
<br />
== See Also ==<br />
* [[GettextForTranslators]]<br />
* [[WesnothTranslations]]<br />
* [[TranslatorsGuide]]<br />
* [http://gettext.wesnoth.org Translation statistics]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignDialogue:TB&diff=71587CampaignDialogue:TB2023-08-24T11:45:59Z<p>Octalot: Add a note that this page is outdated</p>
<hr />
<div>{| style="float:right"<br />
|<br />
__TOC__<br />
|}<br />
<br />
This is a transcription of all dialogue from [[A Tale of Two Brothers]]. It is meant as a resource for Wesnoth writers. If you don't want spoilers, leave this page now.<br />
<br />
{{Note|This page needs updating, most of the text is from the 1.8 version of Wesnoth}}<br />
<br />
=== Possible Timeframe ===<br />
This campaign, as originally written, had no definite time or place. There was a vague reference to "the eastern reaches of the kingdom of Wesnoth". In a later revision the epilog hint that Arvith may have traveled with the elf-lord Kalenz, but this is not much of a constraint as Kalenz was around in 1YW and at least until the beginning of HttT in 517 YW.<br />
<br />
Maghre has to be within reach of the orcs, but in a time and place where there haven't been orc raids for generations. This limits us to *western* Wesnoth, orc raids having been a chronic problem in the northeast even during the Kingdom's strongest periods. The logical time would be shortly after the death of Haldric IV in 350, the beginning of the First Dark Age. It's arbitrarily set at 353; Kalenz began his wanderings ten years later, so the timing for Arvith to meet him later in life isn't bad.<br />
<br />
Placing the campaign is a little trickier. Our main textual clue is that there is a dense wood, said by legend to be haunted, a few days' ride north. Later, the boss's keep is said to be still further north. Neither of these directions has plot importance, but they do suggest a locale for Maghre - near the Gray Woods. The battle maps exclude it from being in a featureless plain, though; there are hills to the south and west.<br />
<br />
== Death Dialogue ==<br />
=== Mordak ===<br />
'''Mordak:''' Argh<br />
<br />
=== Arvith ===<br />
'''Arvith:''' All is lost now that I am dead...<br />
<br />
'''Arvith:''' Everything is lost now that I am dead...<br />
<br />
== Scenario 1: Rooting Out A Mage ==<br />
=== Story ===<br />
Translation hints: The first paragraph is shown with the journey map as a background, showing the village in the foothills along the route between Aldril and Dan’Tonk. I'm assuming the beacons either use smoke signals or basic fire signals, with a few agreed ones to request goods or indicate that surplus is for sale.<br />
<br />
The remote freehold of Maghre in the western reaches of the Kingdom of Wesnoth was once a peaceful place, its inhabitants largely unaware of the comings and goings of the wider world. Wars and the rumor of wars touched them not. Even merchants were rarely seen, although caravans between Aldril and Dan’Tonk might send a wagon when called by the beacon tower.<br />
<br />
Then came the day that a dark mage settled in the region and began seeking sacrifices for his summonings.<br />
<br />
Skeletons and zombies killed cattle and fired fields. 'Fear and obey Mordak the Mage!' they cried in fell voices as they did their foul deeds. People vanished from isolated farmsteads. Men and women began to fear the night, and their children even the bright day. But the nearest lord was more than a day’s ride distant, and messengers sent to seek his help did not return.<br />
<br />
There was a man named Baran who had shown talent as a mage when he was young, gone to the great Academy on the Isle of Alduin, and returned to work his magic in the land where he was born. The people looked to him for help and leadership. He found weapons half-forgotten from the times of their sires and grandsires hanging in many houses, and bade the villagers to take them down and clean and oil them. He set the smiths of Maghre to making spearheads and ax-blades for the rest.<br />
<br />
Now Baran had a brother named Arvith who had also left Maghre to seek his fortune, and had become the leader of a small band of horsemen who hired out as guards to merchant caravans. Fortunate it was for all that, in better times, the brothers had talked of using trade beacons for other signals when in dire need. Baran sent out that call.<br />
<br />
12 V, 363 YW<br />
Excerpt from the journal of Baran of Maghre<br />
<br />
If I could but face this ‘Mordak’! I think my magic might prove stronger than his. But he bides in the hills, well-guarded by his servants, and I muster frightened peasants to fight his minions with blades and sticks.<br />
<br />
I need my brother; he always had a better head for battle than I. Yet we have not spoken since that evil day at Toen Caric. If he will not come for me, perhaps he will return to aid our village in its hour of desperate need.<br />
<br />
Heeding the call, Arvith gathered such men as he could and hurried to Maghre to help Baran.<br />
<br />
=== Introductory Dialogue ===<br />
'''Arvith:''' Greetings, my brother! How may my men and I be of aid?"<br />
<br />
'''Baran:''' A dark mage has come upon us; his creatures call him Mordak. They have been terrorizing outlying farms, and we fear they may soon attack the village itself! The villagers of Maghre have taken up weapons but they are not trained fighters; but we need your men, and you to lead them.<br />
<br />
'''Baran:''' I can feel Mordak's foul touch on the hidden currents of the earth and air. He is somewhere due north of here, I would say not more than two days' ride.<br />
<br />
'''Arvith:''' I will lead my men, and such villagers as can keep up with us, north to slay this Mordak! What will you do?<br />
<br />
'''Baran:''' You shall be the right hand, I the left. I will go stealthily with a handful of our best scouts and woodsmen. While you demonstrate against him and kill his creatures, I will try to defeat Mordak himself with magic at an unguarded moment. Together we may accomplish what either alone may not.<br />
<br />
=== Turn 6 ===<br />
'''Arvith:''' Baran should be in position by now. Press them, distract the adept so Baran can spring his trap!<br />
<br />
=== Turn 10 ===<br />
'''Arvith:''' Baran has not made his attack! I begin to fear for him... and it means we must deal with this Mordak ourselves!<br />
<br />
=== Undead Leader: Last Breath ===<br />
'''Mordak:''' Argh.<br />
<br />
'''Arvith:''' Good work, men! But what has become of my brother?<br />
<br />
'''Mordak:''' Worried about him, are you? E-he-he..hergh...gaargh...<br />
<br />
'''Arvith:''' There's nothing more to be had from this one; we will have to search for Baran ourselves!<br />
<br />
'''Unit:''' Sir, our scouts report that Baran was seen captured and carried away further north!<br />
<br />
'''Arvith:''' That they should dare this! We will give chase at once.<br />
<br />
=== Time Over ===<br />
'''Mordak:''' Your brother's plan to ambush me has failed. He is our prisoner now.<br />
<br />
'''Arvith:''' My brother, kidnapped? I have failed you, Baran! And even now Mordak's forces descend upon the village!<br />
<br />
=== First Attack ===<br />
'''Arvith:''' I hear these creatures are nigh-immune to our weapons, let us see!<br />
<br />
=== Player Kills First Enemy ===<br />
'''Unit:''' That was not so hard!<br />
<br />
<br />
== Scenario 2: The Chase ==<br />
=== Story ===<br />
The pursuit had already run for several days when the pursuers came to the bounds of the huge forest known as the Gray Woods. Ancient tales wArvithd of lost souls haunting the wood, hunting and killing anyone brave enough to enter it.<br />
<br />
Heedless of those rumors, Arvith followed them. His only worry was that his horsemen would be at disadvantage if attacked in the forest.<br />
<br />
<br />
=== Introductory Dialogue ===<br />
'''Narrator:''' Sounds of a scuffle were heard from the forest.<br />
<br />
'''Arvith:''' Come on, men. A stroll through such lovely green woods, what could be finer?<br />
<br />
'''Unit:''' It is whispered that hungry ghosts rule this forest, and kill everyone who dares to enter.<br />
<br />
'''Arvith:''' I will lead my men, and such villagers as can keep up with us, north to slay this Mordak! What will you do?<br />
<br />
'''Nil-Galion:''' You there! Halt and explain yourself.<br />
<br />
'''Arvith:''' We're chasing after some men who kidnapped my brother!<br />
<br />
'''Nil-Galion:''' Those men told me their prisoner had attempted to murder their master, and wArvithd that evil men would follow him. Advance no further, or you will die.<br />
<br />
'''Arvith:''' So much for those ghost stories. Mere elves will not stop me from freeing my brother!<br />
<br />
'''Unit:''' I am glad at least that we will not have to face ghosts. But those elves will have us at a disadvantage; our horses will not maneuver well in the trees.<br />
<br />
'''Arvith:''' Bah, just stay on the paths; our spearmen and bowmen can fight in the deeper woods. We have faced and won through greater perils than those amateurs can offer.<br />
<br />
<br />
=== Move to the North ===<br />
'''Unit:''' I see them! There they are!<br />
<br />
'''Muff Toras:''' Curses! If they had been an hour slower our master's reinforcements would already be here to meet us.<br />
<br />
<br />
=== Turn 12 ===<br />
'''Arvith:''' Come on, men, let's catch those kidnappers!<br />
<br />
<br />
=== Elf Last Breath ===<br />
'''Nil-Galion:''' Foolish human, you have killed me but you will not catch the undead in time. I have fulfilled my contract, and will be reanimated soon to become a lord of their armies.<br />
<br />
'''Arvith:''' Follow their back trail!<br />
<br />
<br />
=== Undead Last Breath ===<br />
'''Muff Toras:''' Hah! You have captured me, but it will avail you nothing. I sent your precious brother the mage north with half my men a day since; he will be safely locked away in our master's dungeons by now.<br />
<br />
'''Arvith:''' My blade is at your throat. Give us the way to my brother now, or I will spill your wretched blood on the ground.<br />
<br />
'''Muff Toras:''' Three days ride to the northeast, in a deserted castle. The passwords to the guards are --- and ---.<br />
<br />
'''Arvith:''' Bind him and take him with us. If he has played us false, he will die.<br />
<br />
<br />
=== Time Over ===<br />
'''Muff Toras:''' My reinforcements are here!<br />
<br />
'''Arvith:''' He escaped us...<br />
<br />
<br />
=== Victory: Easy ===<br />
'''Brena:''' Greetings. I am Brena, a knight errant. I saw you pursuing and fighting the foul undead. Are there more of them to be destroyed?<br />
<br />
'''Arvith:''' Aye. We think there's a nest of them north-east of here. They've captured my brother.<br />
<br />
'''Brena:''' I bear a great hatred towards their kind. I will follow and fight them with you, if you permit.<br />
<br />
'''Unit:''' He would only slow us down!<br />
<br />
'''Arvith:''' It is my place to decide this.<br />
<br />
''Option 1''<br />
<br />
'''Arvith:''' All right, come along with us.<br />
<br />
'''Brena:''' Thank you. My comrades and I will help you on your noble quest.<br />
<br />
''Option 2''<br />
<br />
'''Arvith:''' I am sorry. We have not the time to spare.<br />
<br />
'''Brena:''' Take this, then, for I see that you are on a quest. My comrades will help you whenever you call for them.<br />
<br />
== Scenario 3: Guarded Castle ==<br />
<br />
=== Introductory Dialogue ===<br />
'''Narrator:''' Arvith's men arrived at the castle and were immediately challenged by some guards.<br />
<br />
'''Guard Leader:''' Halt! Friend or foe? Give the password.<br />
<br />
'''Arvith:''' The password is ----.<br />
<br />
'''Guard Leader:''' Pass friend.<br />
<br />
<br />
=== Orcs Sighted ===<br />
<br />
'''Knago-Brek:''' Haha! We not kill people for long time. Weapon wants blood. We now kill humans!!<br />
<br />
'''Arvith:''' My sword-arm has a say in who will do the dying. Come on, men, let's kill some orcs.<br />
<br />
<br />
=== Second Set of Guards (Turn 6) ===<br />
<br />
'''Guard Leader:''' Are you our relief arriving? Does this mean we get to leave here now?<br />
<br />
'''Arvith:''' Um, yes. Fine. You can go.<br />
<br />
'''Guard Leader:''' Um, you're supposed to give the password.<br />
<br />
'''Arvith:''' Oh, of course. I had nearly forgotten.<br />
<br />
'''Guard Leader:''' Thanks! Irritating little formality, isn't it?<br />
<br />
'''Arvith:''' I think I should better support my men at the front to make sure we can free my brother.<br />
<br />
<br />
=== Undead Last Breath ===<br />
'''Rotharik:''' Nooo! This is the end...<br />
<br />
'''Unit:''' There's a key in his robes.<br />
<br />
'''Arvith:''' That may well be the key to the cell they're holding Baran in! I will take it.<br />
<br />
<br />
=== Baran's Cell ===<br />
'''Unit:''' I found Baran. He is in this cell.<br />
<br />
IF Arvith<br />
<br />
'''Baran:''' Good to see you, Arvith. Now can you get me out of this dungeon, please?<br />
<br />
IF ANOTHER UNIT<br />
<br />
'''Baran:''' You must be one of Arvith's men. Please help me get out of this dungeon.<br />
<br />
THEN<br />
<br />
IF PLAYER DOES NOT HAVE KEY<br />
<br />
'''Baran:''' The accursed dark sorcerer Rotharik has imprisoned me behind this magically enhanced iron gate. It can only be opened with the correct key. You must get it from him to free me.<br />
<br />
IF PLAYER HAS KEY<br />
<br />
'''Baran:''' Thank you for saving me. I had almost given up hope you would free me.<br />
<br />
'''Arvith:''' Oh it was nothing, a few elves, one or two dark sorcerers, a bunch of orcs and some undead. Really just a day's work for us mercenaries.<br />
<br />
'''Baran:''' Thank you for coming to my aid. Let us return to the village.<br />
<br />
<br />
=== Time Over ===<br />
'''Rotharik:''' You are too late! Your brother is already dead! Muhahahaha...<br />
<br />
'''Arvith:''' Argh!!!<br />
<br />
== Scenario 4: Return to the Village ==<br />
<br />
=== Introductory Dialogue ===<br />
'''Arvith:''' There. Your village is just across those hills, and already I see men coming to greet us!<br />
<br />
'''Baran:''' No, they are fleeing from something. We must find out what is happening over there!<br />
<br />
'''Arvith:''' Men! Ready your weapons!<br />
<br />
'''Baran:''' We should go there and talk to Counselor Hoban. Maybe he knows what is going on here.<br />
<br />
<br />
=== Sighted by Councillor Hoban ===<br />
'''Councillor Hoban:''' I am glad to see you returned.<br />
<br />
'''Baran:''' No gladder than I am to be here. But what has happened to Maghre?<br />
<br />
'''Councillor Hoban:''' Soon after you departed we were beset by orcs. With half the men of Maghre gone, we could not stop them.<br />
<br />
'''Councillor Hoban:''' The orcish warlord aims to enslave us. We will not be able to hold out for much longer.<br />
<br />
'''Councillor Hoban:''' Have a care, his men are fell fighters and have killed many. Very few remain who can bear arms, but I will send them to aid you in battle.<br />
<br />
<br />
=== Enemies Defeated ===<br />
'''Arvith:''' Finally the warlord is killed. Now you can go back to Maghre.<br />
<br />
'''Baran:''' So much has been destroyed. It will be difficult to repair all that the orcs and undead have wrecked. And they could come again.<br />
<br />
'''Arvith:''' I must go back to earning my living. But you have my word, little brother; if you are beset again, I will come.<br />
<br />
=== Baran's Last Breath ===<br />
'''Baran:''' It is over, I am vanquished.<br />
<br />
<br />
===Time Over===<br />
'''Arvith:''' I don't think we can rescue anyone from these villages. It is too late.<br />
<br />
'''Baran:''' I was too weak to protect these people. Oh why did this happen to me?!?<br />
<br />
<br />
==Scenario 5: Epilogue==<br />
===Story===<br />
It took years to rebuild the village and restore the surrounding farms. The people of Maghre had to work very hard, but felt better knowing Arvith's men would be their firm allies in troubled times.<br />
<br />
Arvith and his men left the village assured that it would be well guided by Baran. On their journeys they faced many challenges and battles. Some tales even mention Arvith's name together with that of the famous elvish lord Kalenz, but this is a different story...<br />
<br />
==TB's Specified Unit Names==<br />
<br />
===Humans===<br />
*[[CharactersStorys#Arvith | Arvith]]<br />
*[[CharactersStorys#Baran | Baran]]<br />
*Alwyn<br />
*Brent<br />
*[[CharactersStorys#Brena | Brena]]<br />
*Cadell<br />
*Dannen<br />
*Efran<br />
*Fargus<br />
*Erik<br />
*Heine<br />
*Magnus<br />
*Councillor Hoban<br />
<br />
=== Elves ===<br />
*[[CharactersStorys#Nil-Galion | Nil-Galion]]<br />
<br />
===Undead===<br />
=====Human=====<br />
*[[CharactersStorys#Mordak | Mordak]]<br />
*[[CharactersStorys#Muff_Toras | Muff Toras]]<br />
*[[CharactersStorys#Rotharik | Rotharik]]<br />
<br />
===Orcs===<br />
*Knago-Brek<br />
*[[CharactersStorys#Tairach | Tairach]]<br />
<br />
<br />
[[Category:Create|*]]<br />
[[Category:Writing|*]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignDialogue:TB&diff=71586CampaignDialogue:TB2023-08-24T11:41:39Z<p>Octalot: /* Enemies Defeated */ More amulet removal</p>
<hr />
<div>{| style="float:right"<br />
|<br />
__TOC__<br />
|}<br />
<br />
This is a transcription of all dialogue from [[A Tale of Two Brothers]]. It is meant as a resource for Wesnoth writers. If you don't want spoilers, leave this page now.<br />
<br />
=== Possible Timeframe ===<br />
This campaign, as originally written, had no definite time or place. There was a vague reference to "the eastern reaches of the kingdom of Wesnoth". In a later revision the epilog hint that Arvith may have traveled with the elf-lord Kalenz, but this is not much of a constraint as Kalenz was around in 1YW and at least until the beginning of HttT in 517 YW.<br />
<br />
Maghre has to be within reach of the orcs, but in a time and place where there haven't been orc raids for generations. This limits us to *western* Wesnoth, orc raids having been a chronic problem in the northeast even during the Kingdom's strongest periods. The logical time would be shortly after the death of Haldric IV in 350, the beginning of the First Dark Age. It's arbitrarily set at 353; Kalenz began his wanderings ten years later, so the timing for Arvith to meet him later in life isn't bad.<br />
<br />
Placing the campaign is a little trickier. Our main textual clue is that there is a dense wood, said by legend to be haunted, a few days' ride north. Later, the boss's keep is said to be still further north. Neither of these directions has plot importance, but they do suggest a locale for Maghre - near the Gray Woods. The battle maps exclude it from being in a featureless plain, though; there are hills to the south and west.<br />
<br />
== Death Dialogue ==<br />
=== Mordak ===<br />
'''Mordak:''' Argh<br />
<br />
=== Arvith ===<br />
'''Arvith:''' All is lost now that I am dead...<br />
<br />
'''Arvith:''' Everything is lost now that I am dead...<br />
<br />
== Scenario 1: Rooting Out A Mage ==<br />
=== Story ===<br />
Translation hints: The first paragraph is shown with the journey map as a background, showing the village in the foothills along the route between Aldril and Dan’Tonk. I'm assuming the beacons either use smoke signals or basic fire signals, with a few agreed ones to request goods or indicate that surplus is for sale.<br />
<br />
The remote freehold of Maghre in the western reaches of the Kingdom of Wesnoth was once a peaceful place, its inhabitants largely unaware of the comings and goings of the wider world. Wars and the rumor of wars touched them not. Even merchants were rarely seen, although caravans between Aldril and Dan’Tonk might send a wagon when called by the beacon tower.<br />
<br />
Then came the day that a dark mage settled in the region and began seeking sacrifices for his summonings.<br />
<br />
Skeletons and zombies killed cattle and fired fields. 'Fear and obey Mordak the Mage!' they cried in fell voices as they did their foul deeds. People vanished from isolated farmsteads. Men and women began to fear the night, and their children even the bright day. But the nearest lord was more than a day’s ride distant, and messengers sent to seek his help did not return.<br />
<br />
There was a man named Baran who had shown talent as a mage when he was young, gone to the great Academy on the Isle of Alduin, and returned to work his magic in the land where he was born. The people looked to him for help and leadership. He found weapons half-forgotten from the times of their sires and grandsires hanging in many houses, and bade the villagers to take them down and clean and oil them. He set the smiths of Maghre to making spearheads and ax-blades for the rest.<br />
<br />
Now Baran had a brother named Arvith who had also left Maghre to seek his fortune, and had become the leader of a small band of horsemen who hired out as guards to merchant caravans. Fortunate it was for all that, in better times, the brothers had talked of using trade beacons for other signals when in dire need. Baran sent out that call.<br />
<br />
12 V, 363 YW<br />
Excerpt from the journal of Baran of Maghre<br />
<br />
If I could but face this ‘Mordak’! I think my magic might prove stronger than his. But he bides in the hills, well-guarded by his servants, and I muster frightened peasants to fight his minions with blades and sticks.<br />
<br />
I need my brother; he always had a better head for battle than I. Yet we have not spoken since that evil day at Toen Caric. If he will not come for me, perhaps he will return to aid our village in its hour of desperate need.<br />
<br />
Heeding the call, Arvith gathered such men as he could and hurried to Maghre to help Baran.<br />
<br />
=== Introductory Dialogue ===<br />
'''Arvith:''' Greetings, my brother! How may my men and I be of aid?"<br />
<br />
'''Baran:''' A dark mage has come upon us; his creatures call him Mordak. They have been terrorizing outlying farms, and we fear they may soon attack the village itself! The villagers of Maghre have taken up weapons but they are not trained fighters; but we need your men, and you to lead them.<br />
<br />
'''Baran:''' I can feel Mordak's foul touch on the hidden currents of the earth and air. He is somewhere due north of here, I would say not more than two days' ride.<br />
<br />
'''Arvith:''' I will lead my men, and such villagers as can keep up with us, north to slay this Mordak! What will you do?<br />
<br />
'''Baran:''' You shall be the right hand, I the left. I will go stealthily with a handful of our best scouts and woodsmen. While you demonstrate against him and kill his creatures, I will try to defeat Mordak himself with magic at an unguarded moment. Together we may accomplish what either alone may not.<br />
<br />
=== Turn 6 ===<br />
'''Arvith:''' Baran should be in position by now. Press them, distract the adept so Baran can spring his trap!<br />
<br />
=== Turn 10 ===<br />
'''Arvith:''' Baran has not made his attack! I begin to fear for him... and it means we must deal with this Mordak ourselves!<br />
<br />
=== Undead Leader: Last Breath ===<br />
'''Mordak:''' Argh.<br />
<br />
'''Arvith:''' Good work, men! But what has become of my brother?<br />
<br />
'''Mordak:''' Worried about him, are you? E-he-he..hergh...gaargh...<br />
<br />
'''Arvith:''' There's nothing more to be had from this one; we will have to search for Baran ourselves!<br />
<br />
'''Unit:''' Sir, our scouts report that Baran was seen captured and carried away further north!<br />
<br />
'''Arvith:''' That they should dare this! We will give chase at once.<br />
<br />
=== Time Over ===<br />
'''Mordak:''' Your brother's plan to ambush me has failed. He is our prisoner now.<br />
<br />
'''Arvith:''' My brother, kidnapped? I have failed you, Baran! And even now Mordak's forces descend upon the village!<br />
<br />
=== First Attack ===<br />
'''Arvith:''' I hear these creatures are nigh-immune to our weapons, let us see!<br />
<br />
=== Player Kills First Enemy ===<br />
'''Unit:''' That was not so hard!<br />
<br />
<br />
== Scenario 2: The Chase ==<br />
=== Story ===<br />
The pursuit had already run for several days when the pursuers came to the bounds of the huge forest known as the Gray Woods. Ancient tales wArvithd of lost souls haunting the wood, hunting and killing anyone brave enough to enter it.<br />
<br />
Heedless of those rumors, Arvith followed them. His only worry was that his horsemen would be at disadvantage if attacked in the forest.<br />
<br />
<br />
=== Introductory Dialogue ===<br />
'''Narrator:''' Sounds of a scuffle were heard from the forest.<br />
<br />
'''Arvith:''' Come on, men. A stroll through such lovely green woods, what could be finer?<br />
<br />
'''Unit:''' It is whispered that hungry ghosts rule this forest, and kill everyone who dares to enter.<br />
<br />
'''Arvith:''' I will lead my men, and such villagers as can keep up with us, north to slay this Mordak! What will you do?<br />
<br />
'''Nil-Galion:''' You there! Halt and explain yourself.<br />
<br />
'''Arvith:''' We're chasing after some men who kidnapped my brother!<br />
<br />
'''Nil-Galion:''' Those men told me their prisoner had attempted to murder their master, and wArvithd that evil men would follow him. Advance no further, or you will die.<br />
<br />
'''Arvith:''' So much for those ghost stories. Mere elves will not stop me from freeing my brother!<br />
<br />
'''Unit:''' I am glad at least that we will not have to face ghosts. But those elves will have us at a disadvantage; our horses will not maneuver well in the trees.<br />
<br />
'''Arvith:''' Bah, just stay on the paths; our spearmen and bowmen can fight in the deeper woods. We have faced and won through greater perils than those amateurs can offer.<br />
<br />
<br />
=== Move to the North ===<br />
'''Unit:''' I see them! There they are!<br />
<br />
'''Muff Toras:''' Curses! If they had been an hour slower our master's reinforcements would already be here to meet us.<br />
<br />
<br />
=== Turn 12 ===<br />
'''Arvith:''' Come on, men, let's catch those kidnappers!<br />
<br />
<br />
=== Elf Last Breath ===<br />
'''Nil-Galion:''' Foolish human, you have killed me but you will not catch the undead in time. I have fulfilled my contract, and will be reanimated soon to become a lord of their armies.<br />
<br />
'''Arvith:''' Follow their back trail!<br />
<br />
<br />
=== Undead Last Breath ===<br />
'''Muff Toras:''' Hah! You have captured me, but it will avail you nothing. I sent your precious brother the mage north with half my men a day since; he will be safely locked away in our master's dungeons by now.<br />
<br />
'''Arvith:''' My blade is at your throat. Give us the way to my brother now, or I will spill your wretched blood on the ground.<br />
<br />
'''Muff Toras:''' Three days ride to the northeast, in a deserted castle. The passwords to the guards are --- and ---.<br />
<br />
'''Arvith:''' Bind him and take him with us. If he has played us false, he will die.<br />
<br />
<br />
=== Time Over ===<br />
'''Muff Toras:''' My reinforcements are here!<br />
<br />
'''Arvith:''' He escaped us...<br />
<br />
<br />
=== Victory: Easy ===<br />
'''Brena:''' Greetings. I am Brena, a knight errant. I saw you pursuing and fighting the foul undead. Are there more of them to be destroyed?<br />
<br />
'''Arvith:''' Aye. We think there's a nest of them north-east of here. They've captured my brother.<br />
<br />
'''Brena:''' I bear a great hatred towards their kind. I will follow and fight them with you, if you permit.<br />
<br />
'''Unit:''' He would only slow us down!<br />
<br />
'''Arvith:''' It is my place to decide this.<br />
<br />
''Option 1''<br />
<br />
'''Arvith:''' All right, come along with us.<br />
<br />
'''Brena:''' Thank you. My comrades and I will help you on your noble quest.<br />
<br />
''Option 2''<br />
<br />
'''Arvith:''' I am sorry. We have not the time to spare.<br />
<br />
'''Brena:''' Take this, then, for I see that you are on a quest. My comrades will help you whenever you call for them.<br />
<br />
== Scenario 3: Guarded Castle ==<br />
<br />
=== Introductory Dialogue ===<br />
'''Narrator:''' Arvith's men arrived at the castle and were immediately challenged by some guards.<br />
<br />
'''Guard Leader:''' Halt! Friend or foe? Give the password.<br />
<br />
'''Arvith:''' The password is ----.<br />
<br />
'''Guard Leader:''' Pass friend.<br />
<br />
<br />
=== Orcs Sighted ===<br />
<br />
'''Knago-Brek:''' Haha! We not kill people for long time. Weapon wants blood. We now kill humans!!<br />
<br />
'''Arvith:''' My sword-arm has a say in who will do the dying. Come on, men, let's kill some orcs.<br />
<br />
<br />
=== Second Set of Guards (Turn 6) ===<br />
<br />
'''Guard Leader:''' Are you our relief arriving? Does this mean we get to leave here now?<br />
<br />
'''Arvith:''' Um, yes. Fine. You can go.<br />
<br />
'''Guard Leader:''' Um, you're supposed to give the password.<br />
<br />
'''Arvith:''' Oh, of course. I had nearly forgotten.<br />
<br />
'''Guard Leader:''' Thanks! Irritating little formality, isn't it?<br />
<br />
'''Arvith:''' I think I should better support my men at the front to make sure we can free my brother.<br />
<br />
<br />
=== Undead Last Breath ===<br />
'''Rotharik:''' Nooo! This is the end...<br />
<br />
'''Unit:''' There's a key in his robes.<br />
<br />
'''Arvith:''' That may well be the key to the cell they're holding Baran in! I will take it.<br />
<br />
<br />
=== Baran's Cell ===<br />
'''Unit:''' I found Baran. He is in this cell.<br />
<br />
IF Arvith<br />
<br />
'''Baran:''' Good to see you, Arvith. Now can you get me out of this dungeon, please?<br />
<br />
IF ANOTHER UNIT<br />
<br />
'''Baran:''' You must be one of Arvith's men. Please help me get out of this dungeon.<br />
<br />
THEN<br />
<br />
IF PLAYER DOES NOT HAVE KEY<br />
<br />
'''Baran:''' The accursed dark sorcerer Rotharik has imprisoned me behind this magically enhanced iron gate. It can only be opened with the correct key. You must get it from him to free me.<br />
<br />
IF PLAYER HAS KEY<br />
<br />
'''Baran:''' Thank you for saving me. I had almost given up hope you would free me.<br />
<br />
'''Arvith:''' Oh it was nothing, a few elves, one or two dark sorcerers, a bunch of orcs and some undead. Really just a day's work for us mercenaries.<br />
<br />
'''Baran:''' Thank you for coming to my aid. Let us return to the village.<br />
<br />
<br />
=== Time Over ===<br />
'''Rotharik:''' You are too late! Your brother is already dead! Muhahahaha...<br />
<br />
'''Arvith:''' Argh!!!<br />
<br />
== Scenario 4: Return to the Village ==<br />
<br />
=== Introductory Dialogue ===<br />
'''Arvith:''' There. Your village is just across those hills, and already I see men coming to greet us!<br />
<br />
'''Baran:''' No, they are fleeing from something. We must find out what is happening over there!<br />
<br />
'''Arvith:''' Men! Ready your weapons!<br />
<br />
'''Baran:''' We should go there and talk to Counselor Hoban. Maybe he knows what is going on here.<br />
<br />
<br />
=== Sighted by Councillor Hoban ===<br />
'''Councillor Hoban:''' I am glad to see you returned.<br />
<br />
'''Baran:''' No gladder than I am to be here. But what has happened to Maghre?<br />
<br />
'''Councillor Hoban:''' Soon after you departed we were beset by orcs. With half the men of Maghre gone, we could not stop them.<br />
<br />
'''Councillor Hoban:''' The orcish warlord aims to enslave us. We will not be able to hold out for much longer.<br />
<br />
'''Councillor Hoban:''' Have a care, his men are fell fighters and have killed many. Very few remain who can bear arms, but I will send them to aid you in battle.<br />
<br />
<br />
=== Enemies Defeated ===<br />
'''Arvith:''' Finally the warlord is killed. Now you can go back to Maghre.<br />
<br />
'''Baran:''' So much has been destroyed. It will be difficult to repair all that the orcs and undead have wrecked. And they could come again.<br />
<br />
'''Arvith:''' I must go back to earning my living. But you have my word, little brother; if you are beset again, I will come.<br />
<br />
=== Baran's Last Breath ===<br />
'''Baran:''' It is over, I am vanquished.<br />
<br />
<br />
===Time Over===<br />
'''Arvith:''' I don't think we can rescue anyone from these villages. It is too late.<br />
<br />
'''Baran:''' I was too weak to protect these people. Oh why did this happen to me?!?<br />
<br />
<br />
==Scenario 5: Epilogue==<br />
===Story===<br />
It took years to rebuild the village and restore the surrounding farms. The people of Maghre had to work very hard, but felt better knowing Arvith's men would be their firm allies in troubled times.<br />
<br />
Arvith and his men left the village assured that it would be well guided by Baran. On their journeys they faced many challenges and battles. Some tales even mention Arvith's name together with that of the famous elvish lord Kalenz, but this is a different story...<br />
<br />
==TB's Specified Unit Names==<br />
<br />
===Humans===<br />
*[[CharactersStorys#Arvith | Arvith]]<br />
*[[CharactersStorys#Baran | Baran]]<br />
*Alwyn<br />
*Brent<br />
*[[CharactersStorys#Brena | Brena]]<br />
*Cadell<br />
*Dannen<br />
*Efran<br />
*Fargus<br />
*Erik<br />
*Heine<br />
*Magnus<br />
*Councillor Hoban<br />
<br />
=== Elves ===<br />
*[[CharactersStorys#Nil-Galion | Nil-Galion]]<br />
<br />
===Undead===<br />
=====Human=====<br />
*[[CharactersStorys#Mordak | Mordak]]<br />
*[[CharactersStorys#Muff_Toras | Muff Toras]]<br />
*[[CharactersStorys#Rotharik | Rotharik]]<br />
<br />
===Orcs===<br />
*Knago-Brek<br />
*[[CharactersStorys#Tairach | Tairach]]<br />
<br />
<br />
[[Category:Create|*]]<br />
[[Category:Writing|*]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignDialogue:TB&diff=71585CampaignDialogue:TB2023-08-24T11:39:53Z<p>Octalot: /* Story */ Revised text from 1.17.20, removing the amulets.</p>
<hr />
<div>{| style="float:right"<br />
|<br />
__TOC__<br />
|}<br />
<br />
This is a transcription of all dialogue from [[A Tale of Two Brothers]]. It is meant as a resource for Wesnoth writers. If you don't want spoilers, leave this page now.<br />
<br />
=== Possible Timeframe ===<br />
This campaign, as originally written, had no definite time or place. There was a vague reference to "the eastern reaches of the kingdom of Wesnoth". In a later revision the epilog hint that Arvith may have traveled with the elf-lord Kalenz, but this is not much of a constraint as Kalenz was around in 1YW and at least until the beginning of HttT in 517 YW.<br />
<br />
Maghre has to be within reach of the orcs, but in a time and place where there haven't been orc raids for generations. This limits us to *western* Wesnoth, orc raids having been a chronic problem in the northeast even during the Kingdom's strongest periods. The logical time would be shortly after the death of Haldric IV in 350, the beginning of the First Dark Age. It's arbitrarily set at 353; Kalenz began his wanderings ten years later, so the timing for Arvith to meet him later in life isn't bad.<br />
<br />
Placing the campaign is a little trickier. Our main textual clue is that there is a dense wood, said by legend to be haunted, a few days' ride north. Later, the boss's keep is said to be still further north. Neither of these directions has plot importance, but they do suggest a locale for Maghre - near the Gray Woods. The battle maps exclude it from being in a featureless plain, though; there are hills to the south and west.<br />
<br />
== Death Dialogue ==<br />
=== Mordak ===<br />
'''Mordak:''' Argh<br />
<br />
=== Arvith ===<br />
'''Arvith:''' All is lost now that I am dead...<br />
<br />
'''Arvith:''' Everything is lost now that I am dead...<br />
<br />
== Scenario 1: Rooting Out A Mage ==<br />
=== Story ===<br />
Translation hints: The first paragraph is shown with the journey map as a background, showing the village in the foothills along the route between Aldril and Dan’Tonk. I'm assuming the beacons either use smoke signals or basic fire signals, with a few agreed ones to request goods or indicate that surplus is for sale.<br />
<br />
The remote freehold of Maghre in the western reaches of the Kingdom of Wesnoth was once a peaceful place, its inhabitants largely unaware of the comings and goings of the wider world. Wars and the rumor of wars touched them not. Even merchants were rarely seen, although caravans between Aldril and Dan’Tonk might send a wagon when called by the beacon tower.<br />
<br />
Then came the day that a dark mage settled in the region and began seeking sacrifices for his summonings.<br />
<br />
Skeletons and zombies killed cattle and fired fields. 'Fear and obey Mordak the Mage!' they cried in fell voices as they did their foul deeds. People vanished from isolated farmsteads. Men and women began to fear the night, and their children even the bright day. But the nearest lord was more than a day’s ride distant, and messengers sent to seek his help did not return.<br />
<br />
There was a man named Baran who had shown talent as a mage when he was young, gone to the great Academy on the Isle of Alduin, and returned to work his magic in the land where he was born. The people looked to him for help and leadership. He found weapons half-forgotten from the times of their sires and grandsires hanging in many houses, and bade the villagers to take them down and clean and oil them. He set the smiths of Maghre to making spearheads and ax-blades for the rest.<br />
<br />
Now Baran had a brother named Arvith who had also left Maghre to seek his fortune, and had become the leader of a small band of horsemen who hired out as guards to merchant caravans. Fortunate it was for all that, in better times, the brothers had talked of using trade beacons for other signals when in dire need. Baran sent out that call.<br />
<br />
12 V, 363 YW<br />
Excerpt from the journal of Baran of Maghre<br />
<br />
If I could but face this ‘Mordak’! I think my magic might prove stronger than his. But he bides in the hills, well-guarded by his servants, and I muster frightened peasants to fight his minions with blades and sticks.<br />
<br />
I need my brother; he always had a better head for battle than I. Yet we have not spoken since that evil day at Toen Caric. If he will not come for me, perhaps he will return to aid our village in its hour of desperate need.<br />
<br />
Heeding the call, Arvith gathered such men as he could and hurried to Maghre to help Baran.<br />
<br />
=== Introductory Dialogue ===<br />
'''Arvith:''' Greetings, my brother! How may my men and I be of aid?"<br />
<br />
'''Baran:''' A dark mage has come upon us; his creatures call him Mordak. They have been terrorizing outlying farms, and we fear they may soon attack the village itself! The villagers of Maghre have taken up weapons but they are not trained fighters; but we need your men, and you to lead them.<br />
<br />
'''Baran:''' I can feel Mordak's foul touch on the hidden currents of the earth and air. He is somewhere due north of here, I would say not more than two days' ride.<br />
<br />
'''Arvith:''' I will lead my men, and such villagers as can keep up with us, north to slay this Mordak! What will you do?<br />
<br />
'''Baran:''' You shall be the right hand, I the left. I will go stealthily with a handful of our best scouts and woodsmen. While you demonstrate against him and kill his creatures, I will try to defeat Mordak himself with magic at an unguarded moment. Together we may accomplish what either alone may not.<br />
<br />
=== Turn 6 ===<br />
'''Arvith:''' Baran should be in position by now. Press them, distract the adept so Baran can spring his trap!<br />
<br />
=== Turn 10 ===<br />
'''Arvith:''' Baran has not made his attack! I begin to fear for him... and it means we must deal with this Mordak ourselves!<br />
<br />
=== Undead Leader: Last Breath ===<br />
'''Mordak:''' Argh.<br />
<br />
'''Arvith:''' Good work, men! But what has become of my brother?<br />
<br />
'''Mordak:''' Worried about him, are you? E-he-he..hergh...gaargh...<br />
<br />
'''Arvith:''' There's nothing more to be had from this one; we will have to search for Baran ourselves!<br />
<br />
'''Unit:''' Sir, our scouts report that Baran was seen captured and carried away further north!<br />
<br />
'''Arvith:''' That they should dare this! We will give chase at once.<br />
<br />
=== Time Over ===<br />
'''Mordak:''' Your brother's plan to ambush me has failed. He is our prisoner now.<br />
<br />
'''Arvith:''' My brother, kidnapped? I have failed you, Baran! And even now Mordak's forces descend upon the village!<br />
<br />
=== First Attack ===<br />
'''Arvith:''' I hear these creatures are nigh-immune to our weapons, let us see!<br />
<br />
=== Player Kills First Enemy ===<br />
'''Unit:''' That was not so hard!<br />
<br />
<br />
== Scenario 2: The Chase ==<br />
=== Story ===<br />
The pursuit had already run for several days when the pursuers came to the bounds of the huge forest known as the Gray Woods. Ancient tales wArvithd of lost souls haunting the wood, hunting and killing anyone brave enough to enter it.<br />
<br />
Heedless of those rumors, Arvith followed them. His only worry was that his horsemen would be at disadvantage if attacked in the forest.<br />
<br />
<br />
=== Introductory Dialogue ===<br />
'''Narrator:''' Sounds of a scuffle were heard from the forest.<br />
<br />
'''Arvith:''' Come on, men. A stroll through such lovely green woods, what could be finer?<br />
<br />
'''Unit:''' It is whispered that hungry ghosts rule this forest, and kill everyone who dares to enter.<br />
<br />
'''Arvith:''' I will lead my men, and such villagers as can keep up with us, north to slay this Mordak! What will you do?<br />
<br />
'''Nil-Galion:''' You there! Halt and explain yourself.<br />
<br />
'''Arvith:''' We're chasing after some men who kidnapped my brother!<br />
<br />
'''Nil-Galion:''' Those men told me their prisoner had attempted to murder their master, and wArvithd that evil men would follow him. Advance no further, or you will die.<br />
<br />
'''Arvith:''' So much for those ghost stories. Mere elves will not stop me from freeing my brother!<br />
<br />
'''Unit:''' I am glad at least that we will not have to face ghosts. But those elves will have us at a disadvantage; our horses will not maneuver well in the trees.<br />
<br />
'''Arvith:''' Bah, just stay on the paths; our spearmen and bowmen can fight in the deeper woods. We have faced and won through greater perils than those amateurs can offer.<br />
<br />
<br />
=== Move to the North ===<br />
'''Unit:''' I see them! There they are!<br />
<br />
'''Muff Toras:''' Curses! If they had been an hour slower our master's reinforcements would already be here to meet us.<br />
<br />
<br />
=== Turn 12 ===<br />
'''Arvith:''' Come on, men, let's catch those kidnappers!<br />
<br />
<br />
=== Elf Last Breath ===<br />
'''Nil-Galion:''' Foolish human, you have killed me but you will not catch the undead in time. I have fulfilled my contract, and will be reanimated soon to become a lord of their armies.<br />
<br />
'''Arvith:''' Follow their back trail!<br />
<br />
<br />
=== Undead Last Breath ===<br />
'''Muff Toras:''' Hah! You have captured me, but it will avail you nothing. I sent your precious brother the mage north with half my men a day since; he will be safely locked away in our master's dungeons by now.<br />
<br />
'''Arvith:''' My blade is at your throat. Give us the way to my brother now, or I will spill your wretched blood on the ground.<br />
<br />
'''Muff Toras:''' Three days ride to the northeast, in a deserted castle. The passwords to the guards are --- and ---.<br />
<br />
'''Arvith:''' Bind him and take him with us. If he has played us false, he will die.<br />
<br />
<br />
=== Time Over ===<br />
'''Muff Toras:''' My reinforcements are here!<br />
<br />
'''Arvith:''' He escaped us...<br />
<br />
<br />
=== Victory: Easy ===<br />
'''Brena:''' Greetings. I am Brena, a knight errant. I saw you pursuing and fighting the foul undead. Are there more of them to be destroyed?<br />
<br />
'''Arvith:''' Aye. We think there's a nest of them north-east of here. They've captured my brother.<br />
<br />
'''Brena:''' I bear a great hatred towards their kind. I will follow and fight them with you, if you permit.<br />
<br />
'''Unit:''' He would only slow us down!<br />
<br />
'''Arvith:''' It is my place to decide this.<br />
<br />
''Option 1''<br />
<br />
'''Arvith:''' All right, come along with us.<br />
<br />
'''Brena:''' Thank you. My comrades and I will help you on your noble quest.<br />
<br />
''Option 2''<br />
<br />
'''Arvith:''' I am sorry. We have not the time to spare.<br />
<br />
'''Brena:''' Take this, then, for I see that you are on a quest. My comrades will help you whenever you call for them.<br />
<br />
== Scenario 3: Guarded Castle ==<br />
<br />
=== Introductory Dialogue ===<br />
'''Narrator:''' Arvith's men arrived at the castle and were immediately challenged by some guards.<br />
<br />
'''Guard Leader:''' Halt! Friend or foe? Give the password.<br />
<br />
'''Arvith:''' The password is ----.<br />
<br />
'''Guard Leader:''' Pass friend.<br />
<br />
<br />
=== Orcs Sighted ===<br />
<br />
'''Knago-Brek:''' Haha! We not kill people for long time. Weapon wants blood. We now kill humans!!<br />
<br />
'''Arvith:''' My sword-arm has a say in who will do the dying. Come on, men, let's kill some orcs.<br />
<br />
<br />
=== Second Set of Guards (Turn 6) ===<br />
<br />
'''Guard Leader:''' Are you our relief arriving? Does this mean we get to leave here now?<br />
<br />
'''Arvith:''' Um, yes. Fine. You can go.<br />
<br />
'''Guard Leader:''' Um, you're supposed to give the password.<br />
<br />
'''Arvith:''' Oh, of course. I had nearly forgotten.<br />
<br />
'''Guard Leader:''' Thanks! Irritating little formality, isn't it?<br />
<br />
'''Arvith:''' I think I should better support my men at the front to make sure we can free my brother.<br />
<br />
<br />
=== Undead Last Breath ===<br />
'''Rotharik:''' Nooo! This is the end...<br />
<br />
'''Unit:''' There's a key in his robes.<br />
<br />
'''Arvith:''' That may well be the key to the cell they're holding Baran in! I will take it.<br />
<br />
<br />
=== Baran's Cell ===<br />
'''Unit:''' I found Baran. He is in this cell.<br />
<br />
IF Arvith<br />
<br />
'''Baran:''' Good to see you, Arvith. Now can you get me out of this dungeon, please?<br />
<br />
IF ANOTHER UNIT<br />
<br />
'''Baran:''' You must be one of Arvith's men. Please help me get out of this dungeon.<br />
<br />
THEN<br />
<br />
IF PLAYER DOES NOT HAVE KEY<br />
<br />
'''Baran:''' The accursed dark sorcerer Rotharik has imprisoned me behind this magically enhanced iron gate. It can only be opened with the correct key. You must get it from him to free me.<br />
<br />
IF PLAYER HAS KEY<br />
<br />
'''Baran:''' Thank you for saving me. I had almost given up hope you would free me.<br />
<br />
'''Arvith:''' Oh it was nothing, a few elves, one or two dark sorcerers, a bunch of orcs and some undead. Really just a day's work for us mercenaries.<br />
<br />
'''Baran:''' Thank you for coming to my aid. Let us return to the village.<br />
<br />
<br />
=== Time Over ===<br />
'''Rotharik:''' You are too late! Your brother is already dead! Muhahahaha...<br />
<br />
'''Arvith:''' Argh!!!<br />
<br />
== Scenario 4: Return to the Village ==<br />
<br />
=== Introductory Dialogue ===<br />
'''Arvith:''' There. Your village is just across those hills, and already I see men coming to greet us!<br />
<br />
'''Baran:''' No, they are fleeing from something. We must find out what is happening over there!<br />
<br />
'''Arvith:''' Men! Ready your weapons!<br />
<br />
'''Baran:''' We should go there and talk to Counselor Hoban. Maybe he knows what is going on here.<br />
<br />
<br />
=== Sighted by Councillor Hoban ===<br />
'''Councillor Hoban:''' I am glad to see you returned.<br />
<br />
'''Baran:''' No gladder than I am to be here. But what has happened to Maghre?<br />
<br />
'''Councillor Hoban:''' Soon after you departed we were beset by orcs. With half the men of Maghre gone, we could not stop them.<br />
<br />
'''Councillor Hoban:''' The orcish warlord aims to enslave us. We will not be able to hold out for much longer.<br />
<br />
'''Councillor Hoban:''' Have a care, his men are fell fighters and have killed many. Very few remain who can bear arms, but I will send them to aid you in battle.<br />
<br />
<br />
=== Enemies Defeated ===<br />
'''Arvith:''' Finally the warlord is killed. Now you can go back to Maghre.<br />
<br />
'''Baran:''' So much has been destroyed. It will be difficult to repair all that the orcs and undead have wrecked. And they could come again.<br />
<br />
'''Arvith:''' I must go back to earning my living. But we have our amulets, little brother. If you are beset again, I will come.<br />
<br />
<br />
=== Baran's Last Breath ===<br />
'''Baran:''' It is over, I am vanquished.<br />
<br />
<br />
===Time Over===<br />
'''Arvith:''' I don't think we can rescue anyone from these villages. It is too late.<br />
<br />
'''Baran:''' I was too weak to protect these people. Oh why did this happen to me?!?<br />
<br />
<br />
==Scenario 5: Epilogue==<br />
===Story===<br />
It took years to rebuild the village and restore the surrounding farms. The people of Maghre had to work very hard, but felt better knowing Arvith's men would be their firm allies in troubled times.<br />
<br />
Arvith and his men left the village assured that it would be well guided by Baran. On their journeys they faced many challenges and battles. Some tales even mention Arvith's name together with that of the famous elvish lord Kalenz, but this is a different story...<br />
<br />
==TB's Specified Unit Names==<br />
<br />
===Humans===<br />
*[[CharactersStorys#Arvith | Arvith]]<br />
*[[CharactersStorys#Baran | Baran]]<br />
*Alwyn<br />
*Brent<br />
*[[CharactersStorys#Brena | Brena]]<br />
*Cadell<br />
*Dannen<br />
*Efran<br />
*Fargus<br />
*Erik<br />
*Heine<br />
*Magnus<br />
*Councillor Hoban<br />
<br />
=== Elves ===<br />
*[[CharactersStorys#Nil-Galion | Nil-Galion]]<br />
<br />
===Undead===<br />
=====Human=====<br />
*[[CharactersStorys#Mordak | Mordak]]<br />
*[[CharactersStorys#Muff_Toras | Muff Toras]]<br />
*[[CharactersStorys#Rotharik | Rotharik]]<br />
<br />
===Orcs===<br />
*Knago-Brek<br />
*[[CharactersStorys#Tairach | Tairach]]<br />
<br />
<br />
[[Category:Create|*]]<br />
[[Category:Writing|*]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=EventWML&diff=71572EventWML2023-08-11T06:58:29Z<p>Octalot: /* Optional Keys and Tags */ Add the priority attribute</p>
<hr />
<div>{{WML Tags}}<br />
== The [event] Tag ==<br />
<br />
This tag is a subtag of the [scenario], [unit_type] and [era] tags which is used to describe a set of [[ActionWML|actions]] which trigger at a certain point in a scenario. When used in a [scenario] tag (also includes [multiplayer] and [test]), the event only occurs in that scenario. When used in a [unit_type] tag, the event will occur in all scenarios in which a unit of that type appears in (only after such a unit appears during the scenario, however). When used in an [era], the event will occur in any scenario which is played using that era.<br />
<br />
This tag has keys and child tags that control when and if the event actions will be triggered. Most important of these is the '''name''' key. Without it, no error will be raised but the event will never fire. Therefore, from a practical standpoint, it can be considered mandatory. All of the others can be used or not and the event actions will fire either way.<br />
<br />
'''Lexicon side note:''' ''The word "event" in the [event] tag itself may be considered an abbreviation of the term "event handler" because it is technically not a game "event" but an event '''handler''' for the game events fired with the given 'name'. However, this distinction is usually unimportant in most discussions and the event handlers are therefore simply referred to as "events" in this documentation.''<br />
<br />
=== The 'name' Key (Mandatory) ===<br />
<br />
Usage:<br />
<syntaxhighlight lang='wml'><br />
name=<value><br />
</syntaxhighlight><br />
<br />
This key defines which game event or trigger your [event] tag will be handling. This 'name' key should not be confused with a descriptive comment; it is rather a precise value which must match the predefined game event's name to be valid.<br />
<br />
The '''name''' key can accept a list of comma separated values describing when the event will be triggered.* These values may be either predefined event types or custom event names not matching any predefined type.<br />
<br />
For example:<br />
<br />
<syntaxhighlight lang='wml'><br />
name=attacker misses,defender misses<br />
</syntaxhighlight><br />
<br />
''* Note that unless you use [[#first_time_only|first_time_only=no]], the event will fire only once, '''not''' once for each listed type.''<br />
<br />
All predefined event types are listed below, along with a description of when this value will cause the event to be triggered, in the [[#Predefined_Events_Without_Filters|Predefined Events Without Filters]] and [[#Predefined_Events_With_Filters|Predefined Events With Filters]] sections. Any value ''not'' listed there is a custom event name which can be triggered only by a '''[fire_event]''' tag somewhere else. <br />
<br />
Spaces in event names can be interchanged with ''underscores'' (for example, '''name=new turn''' and '''name=new_turn''' are equivalent).<br />
<br />
==== Variables in the name ====<br />
<br />
If the name contains variables, they will be substituted each time the event is triggered. For example, '''name=turn $disaster_turn''' will only trigger if the turn number is currently equal to whatever number is stored in the variable '''$disaster_turn'''; updating the variable will adjust the turn that the event triggers on. However, if the variable contents contains a comma, it won't be parsed after substitution. Since an event name can't contain a comma, this means the event will never trigger.<br />
<br />
{{DevFeature1.17|6}}<br />
<br />
Commas resulting from variable substitution are now parsed. If you write '''name=$important_event''' and the variable '''$important_event''' contains the text "capture,die", the event will trigger on either a death or a village capture.<br />
<br />
==== Custom events ====<br />
<br />
An event with a custom name may be invoked using the [[InternalActionsWML#.5Bfire_event.5D|[fire_event]]] tag. Normally you'll use such custom events as named subroutines to be called by events with predefined types. One common case of this, for example, is that more than one '''sighted''' events might fire the same custom event that changes the scenario objectives. Also, custom events come very handy in [[Wml_optimisation]].<br />
<br />
Example:<br />
<syntaxhighlight lang='wml'><br />
# The following is the definition of a custom event "unit recruited"<br />
[event]<br />
name=unit_recruited<br />
first_time_only=no<br />
[message]<br />
speaker=unit<br />
message=_ "Reporting for duty!"<br />
[/message]<br />
[/event]<br />
<br />
# This is a standard recruit event that triggers whenever a unit is recruited by side 1<br />
[event]<br />
name=recruit<br />
first_time_only=no<br />
[filter]<br />
[/filter]<br />
[filter_second]<br />
side=1<br />
[/filter_second]<br />
<br />
# And now a fire_event tag is used to trigger the previously defined event. To use<br />
# "speaker=unit" in the fired event, it's also necessary to specify the [primary_unit].<br />
[fire_event]<br />
name=unit_recruited<br />
[primary_unit]<br />
id=$unit.id<br />
[/primary_unit]<br />
[/fire_event]<br />
<br />
# As a result, every time side 1 recruits a unit, this unit says "Reporting for duty!"<br />
[/event]<br />
</syntaxhighlight><br />
<br />
You can have more code after the '''[fire_event]''', which will run after the fired event has happened.<br />
Example:<br />
<syntaxhighlight lang='wml'><br />
# This is a standard recall event that triggers whenever a unit is recalled by side 1<br />
[event]<br />
name=recall<br />
first_time_only=no<br />
[filter]<br />
[/filter]<br />
[filter_second]<br />
side=1<br />
[/filter_second]<br />
<br />
# Fire the custom event, exactly as the in recruit event<br />
[fire_event]<br />
name=unit_recruited<br />
[primary_unit]<br />
id=$unit.id<br />
[/primary_unit]<br />
[/fire_event]<br />
<br />
# After that event has happened, the remaining code in this event is run<br />
[message]<br />
speaker=second_unit<br />
message=_ "Glad to have you back"<br />
[/message]<br />
# As a result, every time side 1 recalls a unit, the recalled unit says<br />
# "Reporting for duty!", and the leader replies "Glad to have you back"<br />
[/event]<br />
</syntaxhighlight><br />
<br />
=== Optional Keys and Tags ===<br />
<br />
These keys and tags are more complex ways to filter when an event should trigger:<br />
<br />
==== first_time_only ====<br />
: Whether the event should be removed from the scenario after it is triggered. This key takes a [[ConditionalActionsWML#Boolean_Values|boolean]]; for example:<br />
: ''first_time_only=yes''<br />
:: Default behavior if key is omitted. The event will trigger the first time it can and never again.<br />
: ''first_time_only=no''<br />
:: The event will trigger every time the criteria are met instead of only the first time.<br />
<br />
==== id ====<br />
: If an id is specified, then the event will not be added if another event with the same id already exists. An id will also allow the event to be removed, see below. Supplying a non-empty id= is mandatory in case of a [unit_type][event].<br />
<br />
==== remove ====<br />
: Removes an event instead of adding a new one. This key takes a [[ConditionalActionsWML#Boolean_Values|boolean]]; if yes, does the same as a [[InternalActionsWML#.5Bremove_event.5D|[remove_event]]] with the same id= value, and the other attributes of this event tag are ignored.<br />
<br />
{{DevFeature1.13|0}} May be a comma separated list.<br />
<br />
{{DevFeature1.15|7}} Prints a deprecation warning recommending to use [remove_event] instead.<br />
<br />
==== priority ====<br />
: {{DevFeature1.17|20}} If several '[event]' tags have the same name, then any with a high priority value will be triggered before events with a lower priority value. Negative numbers are also supported, to run after events without a priority (as the attribute defaults to zero). For events with equal priority, the order is determined by the order in which the events were added.<br />
<br />
==== [filter] ====<br />
: The event will only trigger if the primary unit matches this filter.<br />
:* [[StandardUnitFilter]]: selection criteria<br />
<br />
==== [filter_second] ====<br />
: Like [filter], but for the secondary unit.<br />
:* [[StandardUnitFilter]]: selection criteria<br />
<br />
==== [filter_attack] ====<br />
: Can be used to set additional filtering criteria based on the weapon used by the primary unit. This is usable in the events ''attack'', ''attacker hits'', ''attacker misses'', ''defender hits'', ''defender misses'', ''attack end'', ''last breath'', and ''die''. For more information and filter keys, see [[FilterWML#Filtering Weapons|Filtering Weapons]]. The most commonly used keys are the following.<br />
:* '''name''': the name of the weapon used.<br />
:* '''range''': the range of the weapon used.<br />
:* '''special_id''': filter on the attack's weapon special id.<br />
:* '''special_type''': filter on the attack's weapon special type.<br />
:* {{DevFeature1.17|15}} '''special_id_active''': filter on the attack's weapon special id active(encoded in [specials] or [abilities] tags).<br />
:* {{DevFeature1.17|15}} '''special_type_active''': filter on the attack's weapon special type active(encoded in [specials] or [abilities] tags).<br />
<br />
==== [filter_second_attack] ====<br />
: Like [filter_attack], but for the weapon used by the secondary unit.<br />
<br />
==== [filter_condition] ====<br />
: This tag makes sense inside any sort of event - even those that don't have units, or custom events,... The event will only trigger if this condition evaluates to true.<br />
:* [[ConditionalActionsWML#Condition_Tags|Condition Tags]]<br />
: note: This tag is meant to be used when the firing of an event shall be based on variables/conditions which cannot be retrieved from the filtered units.<br />
<br />
==== [filter_side] ====<br />
: The current side (usually the side $side_number) must match the passed [[StandardSideFilter]] for the event to fire.<br />
:* SSF tags and keys as arguments as described in [[StandardSideFilter]].<br />
: note: This tag makes most sense in side turn and turn refresh events. However, all wml events have a current side so one could also prevent e.g. a moveto event from firing if you put a [filter_side] tag there and the moving unit's side doesn't match.<br />
<br />
==== [insert_tag] ====<br />
: An '''[insert_tag]''' that expands to any of the above filter tags will result in the filter being loaded from the variable each time the game checks if the event should fire. This can result in the event's filter varying from turn to turn.<br />
<br />
==== filter_formula ====<br />
:{{DevFeature1.17|6}}<br />
: Similar to [filter_condition], but the condition is expressed in [[Wesnoth Formula Language]]. The formula has access to the following keys:<br />
:*Event information:<br />
:**'''event''' - the event name<br />
:**'''event_id''' - the event's unique ID<br />
:**'''event_data''' - additional information specific to the event, such as owner_side or damage_inflicted, or anything passed in '''[fire_event][data]'''.<br />
:**'''loc''', '''unit''' - primary event location and unit<br />
:**'''second_loc''', '''second_unit''' - secondary event location and unit<br />
:**'''weapon''', '''second_weapon''' - primary and secondary weapon<br />
:*Gamestate information:<br />
:**'''turn_number'''<br />
:**'''time_of_day''' - the time of day ID<br />
:**'''side_number''' - currently active side<br />
:**'''sides''' - a list of all sides<br />
:**'''units''' - a list of all units on the map<br />
:**'''map''' - the entire game map as a two-dimensional array<br />
<br />
==== delayed_variable_substitution ====<br />
: This key is only relevant inside of a [[#Delayed Variable Substitution_2|nested event]] and controls when variable substitution will occur in those special case actions.<br />
<br />
=== Actions triggered by [event] ===<br />
<br />
After the trigger conditions have been met, all [[ActionWML|action tags]] within the [event] tag are executed in the order they are written in.<br />
<br />
There are 3 main types of actions:<br />
* direct actions ([[DirectActionsWML]]) which have a direct effect on gameplay<br />
* display actions ([[InterfaceActionsWML]]) which show something to the user<br />
* internal actions ([[InternalActionsWML]]) which are used by WML internally<br />
<br />
More details in [[ActionWML]]. Actions can also be dynamically inserted via '''[insert_tag]'''.<br />
<br />
Several actions use standard filters to find out which units<br />
to execute the command on. These are denoted by the phrases<br />
"standard unit filter" and "standard location filter".<br />
<br />
=== Nested Events ===<br />
<br />
There is one special type of action: event creation. By placing an '''[event]''' tag inside another '''[event]''' tag, the nested event is spawned (created) when the parent (outer) event is encountered (when executing the contents of the parent event).<br />
<br />
([[#Nested Event Example|See Examples]])<br />
<br />
==== Delayed Variable Substitution ====<br />
<br />
Variable substitution for a nested event can happen either when it is spawned by the parent event or when it is triggered itself. This is controlled with the key '''delayed_variable_substitution''' which is used in the nested event.<br />
<br />
If this key is set to ''yes'', the variables in the nested event will contain values from the turn in which the ''nested'' event was triggered. ''This is the default behavior if the key is omitted.'' If set to ''no'', the variables in the nested event are set at the time the ''parent'' event is triggered.<br />
<br />
This behavior can be fine tuned with a special syntax when referencing variables. Instead of the normal '''$variable''' syntax, use '''$|variable''' to cause a variable to contain values relevant to the turn in which the nested event was triggered even when '''delayed_variable_substitution''' is set to ''no''. In this way you can have a mix of variables relevant to the parent and nested event trigger times.<br />
<br />
([[#Delayed Variable Substitution Example|See Examples]])<br />
<br />
== Multiplayer safety ==<br />
<br />
In multiplayer it is only safe to use WML that might require synchronization with other players because of input or random numbers (like [message] with input or options or [unstore_unit] where a unit might advance) in the following events. This is because in these cases WML needs data from other players to work right and/or do the same thing for all players. This data is only available after a network synchronization.<br />
<br />
List of synchronized events:<br />
* moveto<br />
* enter hex<br />
* exit hex<br />
* sighted<br />
* last breath <br />
* menu item X<br />
* die<br />
* capture <br />
* recruit<br />
* prerecruit <br />
* recall <br />
* prerecall <br />
* advance<br />
* pre advance<br />
* post advance <br />
* attack<br />
* attack end <br />
* attacker hits <br />
* attacker misses <br />
* defender hits<br />
* defender misses <br />
* start<br />
* prestart (prestart are synced but [message][option] & [unstore_unit] advancement choices will do a random decision because UI things don't work during prestart events.)<br />
* new turn <br />
* side turn <br />
* turn X <br />
* side X turn <br />
* side X turn Y <br />
* turn refresh<br />
* side turn end<br />
* side X turn end<br />
* side turn X end<br />
* side X turn Y end<br />
* turn end<br />
* turn X end<br />
* {{DevFeature1.13|0}} enemies defeated<br />
* {{DevFeature1.13|0}} time over<br />
* {{DevFeature1.13|10}} victory<br />
* {{DevFeature1.13|10}} defeat<br />
* {{DevFeature1.13|0}} scenario_end<br />
The following are <b>not</b> synced:<br />
* select<br />
* preload<br />
* victory {{DevFeature1.13|10}} local_victory<br />
* defeat {{DevFeature1.13|10}} local_defeat<br />
* ai turn<br />
<br />
If an event is not listed here, ask someone to be sure.<br />
<br />
There is also the possibility of events that are normally synchronized when fired by the engine but can be non-synchronized when fired by WML tags from non-synchronized event. So when you are using them you must be extra careful. For example [unstore_unit] may trigger a unit advancement that will fire ''advance'' and ''post advance'' events.<br />
<br />
== A Trap for the Unwary ==<br />
<br />
You need to beware of using macros to generate events. If you include a macro expanding to an event definition twice, the event will be executed twice (not once) each time the trigger condition fires. Consider this code:<br />
<br />
<syntaxhighlight lang='wml'><br />
#define DOUBLE<br />
[event]<br />
name=multiply_by_2<br />
{VARIABLE_OP 2_becomes_4 multiply 2}<br />
[/event]<br />
#enddef<br />
<br />
{DOUBLE}<br />
{DOUBLE}<br />
<br />
{VARIABLE 2_becomes_4 2}<br />
<br />
[fire_event]<br />
name=multiply_by_2<br />
[/fire_event]<br />
<br />
{DEBUG_MSG "$2_becomes_4 should be 4"}<br />
</syntaxhighlight><br />
<br />
After it executes, the debug message will reveal that the variable has been set to 8, not 4.<br />
<br />
=== Event IDs ===<br />
<br />
This problem can be avoided by setting an '''id''' on the event, i.e.:<br />
<br />
<syntaxhighlight lang='wml'><br />
#define DOUBLE<br />
[event]<br />
name=multiply_by_2<br />
id=doubler_event<br />
{VARIABLE_OP 2_becomes_4 multiply 2}<br />
[/event]<br />
#enddef<br />
</syntaxhighlight><br />
<br />
Events with the same ID will only be accepted once by the engine no matter how many times they are included, and will only be saved once to the scenario's savefile. Events with an ID can also be removed by using the '''remove''' key, i.e.:<br />
<br />
<syntaxhighlight lang='wml'><br />
[event]<br />
id=doubler_event<br />
remove=yes<br />
[/event]<br />
</syntaxhighlight><br />
<br />
After that WML is encountered (at toplevel or after created from another event), the event with this ID is removed from the scenario wml, thus firing it has no effect. After an event is removed, it can still be re-added later.<br />
<br />
== Predefined Events Without Filters ==<br />
<br />
These events do not take filter parameters (except [filter_condition] which works for all events).<br />
<br />
=== preload ===<br />
<br />
Triggers before a scenario 'prestarts' and when loading a savegame -- before anything is shown on the screen at all. Can be used to set up the [[LuaWML|Lua]] environment: loading libraries, defining helper functions, etc.<br />
<br />
'''Note:''' If a game is started, saved, and then reloaded, the preload event will fire two times while playing. However, it will only fire once when viewing the replay. If the preload event alters the gamestate the second time it fired while playing (when loading the saved game) then it can result in Out Of Sync errors.<br />
<br />
'''Note:''' Unlike prestart and start, the preload event '''must be able to fire more than once!''' This is because it is triggered each time a savegame is loaded in addition to the initial time when it loads before the scenario 'prestart'. This means that it is effectively ''mandatory'' to have the [[#first_time_only|first_time_only=no]] key value in a preload event.<br />
<br />
=== prestart ===<br />
<br />
Triggers before a scenario 'starts' -- before anything is shown on the screen at all. Can be used to set up things like village ownership. For things displayed on-screen such as character dialog, use '''start''' instead.<br />
<br />
'''Note:''' ''This value makes the [[#first_time_only|first_time_only]] key irrelevant since, by definition, it can only fire once.''<br />
<br />
=== start ===<br />
<br />
Triggers after the map is shown but before the scenario begins -- before players can 'do' anything.<br />
<br />
'''Note:''' ''This value makes the [[#first_time_only|first_time_only]] key irrelevant since, by definition, it can only fire once.''<br />
<br />
=== new turn ===<br />
<br />
Triggers at the start of every turn (not side turn). See also [[#first_time_only|first_time_only=no]]. Before any events of this type trigger, the value of the WML variable '''turn_number''' is set to the number of the turn that is beginning.<br />
<br />
=== turn end ===<br />
<br />
Triggers at the end of every turn (not side turn). See also [[#first_time_only|first_time_only=no]]. The WML variable '''side_number''' will contain the side that ended their turn.<br />
<br />
=== turn ''X'' end ===<br />
<br />
Triggers at the end of turn ''X''.<br />
<br />
=== side turn ===<br />
<br />
Triggers when a side is about to start its turn. Before events of this type trigger, the value of the WML variable '''side_number''' is set to the number of the side of the player about to take their turn. This is before any healing takes place for that side, before calculating income, and before restoring unit movement and status.<br />
<br />
=== ai turn ===<br />
<br />
Triggered just before the AI is invoked for a side. This is called after ''side turn'', and thus the WML variable '''side_number''' still holds the number of this side. Note that this event might be called several times per turn in case that fallbacks to human or droiding is involved. I.e. it happens at the middle of turn of human side 1 if the human player droids his side. It happens after the selection of ai to play the turn but before AI is told that new turn has come.<br />
<br />
'''Note:''' ''This event can break replays if it is used improperly. The ai turn event does not fire during replays. The intention is only to guide the AI to make choices (movements, attacks) which are then saved to the replay.''<br />
<br />
=== turn refresh ===<br />
<br />
Like '''side turn''', triggers just before a side is taking control but '''after''' healing, calculating income, and restoring unit movement and status. WML variable '''side_number''' holds the number of this side.<br />
<br />
Note that the turn refresh event does occur on turn 1, even though healing, income and unit refreshing do not.<br />
<br />
=== turn ''X'' ===<br />
<br />
Triggers at the start of turn ''X''. It's the first side initialization event. <br />
<br />
Side initialization events go in the order of: <br />
<br />
# '''turn ''X''''' <br />
# '''new turn''' <br />
# '''side turn''' <br />
# '''side ''X'' turn''' <br />
# '''side turn ''X''''' <br />
# '''side ''X'' turn ''Y''''' <br />
# '''turn refresh''' <br />
# '''side ''X'' turn refresh''' <br />
# '''turn ''X'' refresh''' <br />
# '''side ''X'' turn ''Y'' refresh'''<br />
<br />
=== side ''X'' turn ''Y'' ===<br />
<br />
This event triggers at the start of turn ''Y'' of side X <br />
<br />
=== side ''X'' turn ===<br />
<br />
This event triggers at the start of any turn of side X<br />
<br />
'''Note:''' ''Of course, [[#first_time_only|first_time_only=no]] is needed for this event to be triggered more than once.''<br />
<br />
=== side turn ''X'' ===<br />
<br />
This event triggers at the start of any side on turn X<br />
<br />
'''Note:''' ''Of course, [[#first_time_only|first_time_only=no]] is needed for this event to be triggered more than once.''<br />
<br />
=== side X turn Y refresh ===<br />
<br />
This event triggers at the turn refresh for side X on turn Y<br />
<br />
=== side ''X'' turn refresh ===<br />
<br />
This event triggers at the turn refresh for side X<br />
<br />
'''Note:''' ''Of course, [[#first_time_only|first_time_only=no]] is needed for this event to be triggered more than once.''<br />
<br />
=== turn ''X'' refresh ===<br />
<br />
This event triggers for any side at the refresh of turn X.<br />
<br />
'''Note:''' ''Of course, [[#first_time_only|first_time_only=no]] is needed for this event to be triggered more than once.''<br />
<br />
=== side turn end ===<br />
<br />
Triggers after a side ends its turn. Like side turn, there are also some variations for specific combinations of side number and turn number. Here is the order in which the turn end events trigger:<br />
<br />
# '''side turn end''' <br />
# '''side ''X'' turn end''' <br />
# '''side turn ''X'' end''' <br />
# '''side ''X'' turn ''Y'' end''' <br />
# '''turn end''' <br />
# '''turn ''X'' end''' <br />
<br />
=== time over ===<br />
<br />
Triggers on turn ''turns''. (''turns'' is specified in [scenario])<br />
<br />
=== enemies defeated ===<br />
<br />
Triggers when all sides that are not defeated are allied and if there is at least one human (or human networked) side among them. Especially this event triggers in a situaltion that would normaly cause a victory due to enemies defeated. (regardless of whether this was disabled with victory_when_enemies_defeated=no). <br />
<br />
=== local_victory ===<br />
<br />
In Wesnoth 1.12 and earlier, the event described here is '''victory''', {{DevFeature1.13|10}} in 1.14 the event described here is '''local_victory'''.<br />
<br />
This event will be fired at the end of a scenario, if the player's side won. If it fires as a result of an '''[endlevel]''' tag, the event is processed before the line after the '''[endlevel]]''' tag. The event is not synchronized, as in networked mp it is possible to have different results for different players.<br />
<br />
=== local_defeat ===<br />
<br />
In Wesnoth 1.12 are earlier, the event described here is '''defeat''', {{DevFeature1.13|10}} in 1.14 the event described here is '''local_defeat'''.<br />
<br />
Functions identically to '''local_victory''', except that the player's side lost.<br />
<br />
=== victory ===<br />
<br />
This section describes a new event Wesnoth 1.14. In 1.12 and earlier, the '''victory''' event is equivalent to 1.14's '''local_victory'''.<br />
<br />
This event will be fired at the end of a scenario, if the game will proceed to the next scenario. In multiplayer, this means that it will fire on all players' clients, even for players who received a '''local_defeat''', as long as the game continues to the next scenario. This event is synchronized.<br />
<br />
It helps debugging if the victory event allows you to safely advance to any of the possible next maps after using the ":next_level" command. Scenarios where key units are picked up before the victory, or where some action chosen earlier determines which map to advance to, make it hard to quickly test scenarios in a campaign.<br />
<br />
Bug [https://github.com/wesnoth/wesnoth/issues/4667 #4667]: this event is treated as unsynchronized in replays, causing OOS reports when watching the replay.<br />
<br />
=== defeat ===<br />
<br />
This section describes a new event Wesnoth 1.14. In 1.12 and earlier, the '''defeat''' event is equivalent to 1.14's '''local_defeat'''.<br />
<br />
This event will be fired at the end of a scenario, if the game resulted in a game-over other than victoriously reaching the end of a campaign (including single-scenario campaigns). Synchronization (including bug #4667) is the same as '''victory'''.<br />
<br />
=== scenario_end ===<br />
<br />
{{DevFeature1.13|10}} This event fires immediately after '''victory''' or '''defeat'''; it is synchronized, but is also affected by bug #4667.<br />
<br />
Note: in 1.13.0 - 1.13.9 this event was added as a synchronized alternative to the events that are, since 1.13.10, called local_victory or local_defeat.<br />
<br />
== Predefined Events With Filters ==<br />
<br />
Filters (except [filter_condition] which is for all sorts of events) can be applied to the following event triggers (see [[FilterWML]]; see also below). The actions specified in the event tag will be executed only if the filter returns true. <br />
These event triggers are all actions by units ('''moveto''', '''attack''') or things that happen to units ('''recruit''', '''advance'''). When one of these events is triggered, the position of the active unit (referred to as the '''primary unit''') is stored in the variables '''x1''' and '''y1''' and the position of any unit that primary unit does something to is stored in the variables '''x2''' and '''y2''' (this unit is referred to as the '''secondary unit''' below). '' These units are also automatically stored in the variables '''unit''' and '''second_unit''' as if they had been stored using the '''[store_unit]''' tag. see [[SingleUnitWML]]. weapon and second_weapon variables are available inside attack, attacker_hits, defender_hits, die and last_breath events. See [[VariablesWML#Automatically_Stored_Variables|automatically stored variables]] for more information.<br />
<br />
=== moveto ===<br />
<br />
Triggers after the primary unit moves. Typically this is used when the primary unit gets to a particular location and a filter for the location of the primary unit is included; remember that this is the location that the primary unit lands on, not the location it started on or any location it travels on. If the unit moves to a village, the capture event will be fired before this event. <br />''An '''[allow_undo]''' tag anywhere within a moveto event will cancel any lack of undo functionality the event would have caused. Note that undo functionality will only move the unit back to its former location; it will not undo other changes to the game caused by the event. Thus it is up to the scenario designer to use this tag correctly.'' $x2 and $y2 refer to the hex the unit came from.<br />
<br />
=== sighted ===<br />
<br />
A '''sighted''' event is triggered by a unit becoming visible to a side (other than the unit's own side). This is mostly useful when the side seeing the unit uses [[fog of war]] or [[shroud]], but they still fire even when fog/shroud is not in use, and they do take into account the {{tag2|AbilitiesWML#The_.5Babilities.5D_tag|hides}} ability (for a moving unit and for ambushers). The ''primary unit'' is the unit that became visible, and the ''secondary unit'' belongs to the side that now sees the primary unit. In some cases, sighted events can be delayed from when they "should" occur. If that happens, the secondary unit will be filtered as if it was at the location where the event "should" have occurred, and ''x2,y2'' will store that location (not the current position of the secondary unit). To understand when sighted events fire, it is helpful to distinguish the times the acting unit sights other units from the times when the acting unit is sighted.<br />
<br />
An acting unit can sight other units when it is recruited, recalled, leveled, or moved, and when fog or shroud is cleared from occupied hexes as a result. In these cases, the acting unit is always the ''secondary unit''. For the first three actions, there are two events associated with the action; clearing occurs between these events, but any sighted events are fired after the second event. (For example, when a unit is recruited, the ''prerecruit'' event fires, then fog is cleared, then the ''recruit'' event fires, then ''sighted'' events fire.) For movement, the sighted events fire between ''enter_hex'' and ''exit_hex'' events, but sometimes sighted events are postponed until the moving unit reaches a good place to stop (e.g. not in an occupied hex). As a major exception to the above, players have the option to delay shroud (and fog) updates. If the player delays shroud updates, sighted events are also delayed until the shroud is updated.<br />
<br />
An acting unit can be sighted by other sides when it is recruited, recalled, leveled (in rare cases), or moved. In these cases, the acting unit is always the ''primary unit''. These events fire after sightings by the acting unit (unless the player delayed shroud updates). For the first two, the sighted event fires for all sides that can see the unit, other than the unit's own side (even if those sides use neither fog nor shroud). For leveling units, sides that could see the unit before it leveled are excluded. (This is why these events are rare &ndash; the leveling unit must have lost a [hides] ability as a result of leveling in order to be seen after, but not before, leveling.) For movement, a sighted event is fired for each side that could see the unit after movement, but not before. In particular, only the starting and ending hexes are considered; a unit that moves through seen hexes but ends movement in a fogged hex does not trigger a sighted event for itself. In all cases where the acting unit is sighted, a (single) ''secondary unit'' is chosen from the sighting team. This choice should be considered arbitrary, but units within their sight range of the acting unit are chosen in preference to units further away. You may want to use [filter_second] in order to restrict a sighted event in a single player scenario to only being triggered by the player and not by other non-allied sides.<br />
<br />
Sighted events are not triggered by a ''hides'' ability becoming inactive, unless it becomes inactive due to that unit's movement or to that unit ambushing another. (To detect a ''nightstalk'' ability becoming inactive due to time of day, use a ''new_turn'' event. Custom ''hides'' abilities might need similar handling.)<br />
<br />
Sighted events have some special caveats for WML authors. First and foremost, {{tag|DirectActionsWML|allow_undo}} should generally be avoided in sighted events. It can be used if current unit positions have no bearing on the event, but otherwise it could cause a replay to go out of sync if a player delays shroud updates and undoes a move. This should not be an onerous restriction, though, as clearing fog will block the ability to undo, regardless of what happens within an event. Secondly, it is currently possible for WML to kill a unit involved in a sighted event before that event fires. If that happens, filters on the killed unit will not match anything and the event may seem to have not fired.<br />
<br />
=== enter_hex ===<br />
<br />
Triggers for each hex entered during movement, with $x1,$y1 identifying the hex entered and $x2,$y2 identifying the previous hex (just exited). In Wesnoth 1.12, the movement will be interrupted, stopping the unit where it is; this behavior can be avoided by using the {{tag|DirectActionsWML|allow_undo}} tag or `NO_INTERRUPT_NO_UNDO` macro. {{DevFeature1.13|11}} movement is not interrupted unless the {{tag|DirectActionsWML|cancel_action}} tag is used.<br />
<br />
'''Note:''' This event behaves a bit unusually if the hex is occupied (and the moving unit is simply passing through). When this happens, $x1,$y1 is still the hex where the event was triggered, but the moving unit (stored in $unit) will be located somewhere earlier in the route (the most recent unoccupied hex). That is, $x1,$y1 will not equal $unit.x,$unit.y (a condition that can be used to detect when the entered hex is occupied). The moving unit will have already spent its movement points to enter the event's hex even though it is has not actually moved from the most recent unoccupied hex.<br />
<br />
'''Note:''' At the time of writing (7ca5a0df, just before 1.13.11), if the hex is occupied then $unit contains the occupying unit, not the moving unit.<br />
<br />
'''Note:''' At the time of writing (1.16.2), if the hex is occupied then $unit does contain the moving unit.<br />
<br />
=== exit_hex ===<br />
<br />
Triggers for each hex exited during movement, with $x1,$y1 identifying the hex exited and $x2,$y2 identifying the next hex (to be entered). If this event is handled without using {{tag|DirectActionsWML|allow_undo}}, then movement is interrupted, stopping the unit where it is. {{DevFeature1.13|11}} movement is not interrupted unless the {{tag|DirectActionsWML|cancel_action}} tag is used.<br />
<br />
'''Note:''' This event behaves a bit unusually if the hex is occupied (and the moving unit is simply passing through). When this happens, $x1,$y1 is still the hex where the event was triggered, but the moving unit (stored in $unit) will be located somewhere earlier in the route (the most recent unoccupied hex). That is, $x1,$y1 will not equal $unit.x,$unit.y (a condition that can be used to detect when the exited hex is occupied). The moving unit will have already spent its movement points to enter the event's hex even though it is has not actually moved from the most recent unoccupied hex.<br />
<br />
=== pre attack {{DevFeature1.17|7}}===<br />
<br />
Similar to '''attack''', but is triggered before calculating the number of attacks and the movement of the unit. Can be used for modifications, which affect these values.<br />
<br />
=== attack ===<br />
<br />
Triggers when the primary unit attacks the secondary unit. Variables $weapon and $second_weapon contain weapons used for this attack by primary and secondary units respectively for all attack-related events (attack_end, attacker_hits, attacker_misses, defender_hits, defender_misses, die and last_breath).<br />
<br />
=== attack end ===<br />
<br />
Similar to '''attack''', but is triggered ''after'' the fight instead of before. Note that if either unit is killed during the fight, this event triggers before any '''die''' events.<br />
<br />
=== attacker hits ===<br />
<br />
Triggers when the the primary unit (the attacker) hits the secondary unit (the defender). The value of the WML variable '''damage_inflicted''' is set to the number of hitpoints inflicted by the attacker.<br />
<br />
=== attacker misses ===<br />
<br />
Same as ''attacker hits'', but is triggered when the attacker misses.<br />
<br />
=== defender hits ===<br />
<br />
Triggers when the primary unit (the attacker) is hit in retaliation by the secondary unit (the defender). The value of the WML variable '''damage_inflicted''' is set to the number of hitpoints inflicted by the defender.<br />
<br />
=== defender misses ===<br />
<br />
Same as ''defender hits'', but is triggered when the defender misses.<br />
<br />
=== petrified ===<br />
Triggers when the primary unit is hit by an attack with the 'petrifies' ability (See ''petrifies'', [[AbilitiesWML]]) by the secondary unit (the unit with the 'petrifies' ability).<br />
<br />
=== last breath ===<br />
<br />
Triggers when the primary unit is killed by the secondary unit, but before the death animation is triggered. Use this instead of name=die when you want the primary unit to make a final [message]. <br />
<br />
=== die ===<br />
<br />
Triggers when the primary unit is killed by the secondary unit. ''Note: The primary unit is not removed from the game until the end of this event. The primary unit can still be manipulated, will block other units from taking its hex, and will still be found by standard unit filters (except [have_unit]). To prevent this behavior, you can use [kill] to remove the unit immediately. However, this will stop any (still unfired) other events that also match the unit from firing afterwards, so use with caution.'' If you want to the primary unit to make a final [message], use name=last_breath, see above.<br />
<br />
=== capture ===<br />
<br />
Triggers when the primary unit captures a village. The village may have been previously neutral, or previously owned by another side; merely moving into your own villages does not constitute a capture. This event will be fired before the moveto event. Villages becoming neutral (via [capture_village]) do not fire capture events. The variable $owner_side contains the previous owner side of the village. 0 means neutral.<br />
<br />
=== recruit ===<br />
<br />
Triggers when the primary unit is recruited (by the secondary unit). (That is, when a unit is recruited it will trigger this event and this event's filter will filter that unit.).<br />
<br />
=== prerecruit ===<br />
<br />
Triggers when the primary unit is recruited (by the secondary unit) but before it is displayed.<br />
<br />
=== recall ===<br />
<br />
Triggers after the primary unit is recalled (by the secondary unit).<br />
<br />
=== prerecall ===<br />
<br />
Triggers when the primary unit is recalled (by the secondary unit) but before it is displayed.<br />
<br />
=== advance ===<br />
<br />
Triggers just before the primary unit is going to advance to another unit, or advance by AMLA. (This is after the player selects which advancement, if there is a choice). If this event removes the unit, changes the unit's type, or reduces the unit's experience below what it needs to advance, then the advancement is aborted. This also applies to advancement by AMLA.<br />
<br />
=== pre advance ===<br />
<br />
{{DevFeature1.13|0}} Triggers before the unit advancement dialog is shown. If this event removes the unit or reduces the unit's experience below what it needs to advance, then the advancement is aborted.<br />
<br />
=== post advance ===<br />
<br />
Triggers just after the primary unit has advanced to another unit, or advance by AMLA.<br />
<br />
=== select ===<br />
<br />
Triggers when the primary unit is selected. Prior to version 1.11, this also triggered when a move was interrupted, as the game keeps the moving unit selected by selecting it again at the end of movement. ''Note: in networked multiplayer, these events are only executed by the client on which the event is triggered, leading to out of sync errors if you modify the game state in the event.''<br />
<br />
=== menu item ''X'' ===<br />
<br />
Triggers when a WML menu item with id=''X'' is selected. ''Note: if the menu item has a [command], this event may be executed before or after the command; there is no guarantee.''<br />
<br />
=== unit placed {{DevFeature1.13|3}}===<br />
<br />
Triggers when the primary unit is placed on the map, regardless of method. This includes but might not be limited to:<br />
* Leaders and units placed in side definitions (fired once for every unit right before prestart events)<br />
* Recruited and recalled units<br />
* Units placed on the map with the [unit] tag ('''not''' units created directly onto a recall list or variable)<br />
* Units placed by the wesnoth.put_unit() Lua function<br />
* Units placed by :to_map in Lua (which is a shortcut for the above)<br />
* Units created via debug mode<br />
* Units created by plague <br />
* Every use of [unstore_unit], when ''fire_event'' is set to ''yes'' (default is ''no'')<br />
* Units moved on map with [move_unit] before {{DevFeature1.15|8}}<br />
* Units matching the filter of [petrify], [unpetrify] or [harm_unit] before {{DevFeature1.15|8}}<br />
* Units who receive a bonus from the feeding ability every time except the first, before {{DevFeature1.15|8}}<br />
This event is solely intended for special cases where no other event types suffice, for example if you must immediately apply a modification to every unit that ever appears. The event does '''not''' keep track of which units it has previously fired for, but can fire an unlimited number of times for the same unit as long the unit is "placed" several times and the event filter doesn't prevent it.<br />
<br />
== Miscellaneous Notes and Examples ==<br />
<br />
=== Primary/Secondary Unit Speaker Example ===<br />
<br />
In events, the primary unit can be referred to as '''unit''' and the secondary unit can be referred to as '''second_unit''' in [message] tags using the '''speaker''' key. For example:<br />
<br />
<syntaxhighlight lang='wml'><br />
[event]<br />
name=last breath<br />
[message]<br />
speaker=second_unit<br />
message= _ "Hahaha! I finally killed you!"<br />
[/message]<br />
<br />
[message]<br />
speaker=unit<br />
message= _ "It's not over yet! I'll come back to haunt you!"<br />
[/message]<br />
[/event]<br />
</syntaxhighlight><br />
<br />
=== Nested Event Example ===<br />
<br />
An event is created for a portal that opens on turn 10. The parent (or 'outer') event executes on turn 10 at which point the nested moveto event is created. This nested event executes when a player steps on a certain spot.<br />
<br />
<syntaxhighlight lang='wml'><br />
[event]<br />
name=turn 10<br />
<br />
[event]<br />
name=moveto<br />
[filter]<br />
x,y=5,8<br />
[/filter]<br />
<br />
# moving to 5,8 will trigger this event only on turn 10 and after<br />
[/event]<br />
[/event]<br />
</syntaxhighlight><br />
<br />
An equivalent way of doing this would be to create a single moveto event with a '''[filter_condition]''' statement to check for turn number but using nested '''[event]''' tags is a convenient shortcut to accomplish this task without resorting to '''[filter_condition]''' statements. Using '''[if]''' tags is also an option especially if your event has '''first_time_only=yes'''.<br />
<br />
=== Delayed Variable Substitution Example ===<br />
<br />
This code will display a message showing the turn number on which the nested ''moveto'' event happens.<br />
<br />
<syntaxhighlight lang='wml'><br />
[event]<br />
name=turn 10<br />
<br />
[event]<br />
name=moveto<br />
delayed_variable_substitution=yes<br />
[filter]<br />
x,y=5,8<br />
[/filter]<br />
<br />
{DEBUG_MSG "Turn $turn_number"} <br />
[/event]<br />
[/event]<br />
</syntaxhighlight><br />
<br />
Since this is the default behavior for the '''delayed_variable_substitution''' key, the following example is identical.<br />
<br />
<syntaxhighlight lang='wml'><br />
[event]<br />
name=turn 10<br />
<br />
[event]<br />
name=moveto<br />
[filter]<br />
x,y=5,8<br />
[/filter]<br />
<br />
{DEBUG_MSG "Turn $turn_number"} <br />
[/event]<br />
[/event]<br />
</syntaxhighlight><br />
<br />
The following code will always display "Turn 10" when the nested ''moveto'' event happens. This is because the variable substitution is done when the parent event is triggered and spawns the nested event, ''not'' when the nested event is triggered.<br />
<br />
<syntaxhighlight lang='wml'><br />
[event]<br />
name=turn 10<br />
<br />
[event]<br />
name=moveto<br />
delayed_variable_substitution=no<br />
[filter]<br />
x,y=5,8<br />
[/filter]<br />
<br />
{DEBUG_MSG "Turn $turn_number"} <br />
[/event]<br />
[/event]<br />
</syntaxhighlight><br />
<br />
Finally, the following example is identical to the first two in that it will display a message showing the turn number on which the nested ''moveto'' event happens, despite the fact that the '''delayed_variable_substitution''' key is set to ''no''. This is because the special '''$|variable''' syntax is used.<br />
<br />
<syntaxhighlight lang='wml'><br />
[event]<br />
name=turn 10<br />
<br />
[event]<br />
name=moveto<br />
delayed_variable_substitution=no<br />
[filter]<br />
x,y=5,8<br />
[/filter]<br />
<br />
{DEBUG_MSG "Turn $|turn_number"} <br />
[/event]<br />
[/event]<br />
</syntaxhighlight><br />
<br />
=== Multiple Nested Events ===<br />
<br />
Every delayed_variable_substitution=no causes a variable substitution run on the subevent where it occurs at the spawn time of this event and on all following subevents. For any specific event, variable substitution happens at least one time when the event is executed. For each delayed=no key appearing in itself or in an event of an "older" generation, which is not the toplevel event, an additional variable substitution run is made.<br />
<br />
<syntaxhighlight lang='wml'><br />
[event] # parent<br />
name=turn 2<br />
# delayed_variable_substitution=no # In the parent event, delayed= has no effect.<br />
<br />
[event] # child<br />
name=turn 3<br />
delayed_variable_substitution=no # Causes variable substitution in the child, grandchild and great-grandchild event<br />
# at execution time of the parent event = spawn time of the child event.<br />
<br />
[event]# grandchild<br />
name=turn 4<br />
delayed_variable_substitution=yes # no variable substitution in the grandchild and great-grandchild event<br />
# at execution time of the child event = spawn time of the grandchild event<br />
<br />
[event] # great-grandchild<br />
name=turn 5<br />
{DEBUG_MSG $turn_number} # output: 2 - value from the variable substitution at execution time of the parent event,<br />
# caused by delayed=no in the child event<br />
<br />
{DEBUG_MSG $||turn_number}# output: "$turn_number"<br />
# Each variable substitution transforms a "$|" to a "$" (except when no | left).<br />
<br />
{DEBUG_MSG $|turn_number}# output: 5 - from the variable substitution at execution time<br />
# of the great-grandchild event<br />
[/event]<br />
[/event]<br />
[/event]<br />
[/event]<br />
</syntaxhighlight><br />
<br />
== See Also ==<br />
<br />
* [[DirectActionsWML]]<br />
* [[InternalActionsWML]]<br />
* [[InterfaceActionsWML]]<br />
* [[FilterWML]]<br />
* [[ReferenceWML]]<br />
<br />
<br />
[[Category: WML Reference]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=ScenarioWML&diff=71493ScenarioWML2023-07-05T10:26:06Z<p>Octalot: /* The [test] tag */ Remove mention of macros, as their availability is based on the file inclusion order</p>
<hr />
<div>{{WML Tags}}<br />
<br />
The top level tags '''[multiplayer]''', '''[test]''', and '''[scenario]''' are [[AddonsWML|addon module]] tags that are all formatted the same way.<br />
The difference between these tags is the way that the scenarios they describe are accessed.<br />
<br />
The keys '''id''' and '''next_scenario''' affect how scenarios can be accessed.<br />
Whenever a scenario is won, the scenario with id=''next_scenario'' of the same tag type will be played.<br />
Units from the first scenario will be available for recall in the second.<br />
<br />
Some scenarios can be played without playing other scenarios first<br />
(in this case there is nothing on the recall list).<br />
These scenarios are called ''initial scenario''s.<br />
<br />
A list of initial scenarios, and how to access them:<br />
<br />
* All '''[multiplayer]''' scenarios (without ''allow_new_game=no'') are initial scenarios listed in the multiplayer scenario selector screen (accessed by the "multiplayer" button).<br />
* Any '''[test]''' scenario is an initial scenario. A test scenario can be accessed by running the game in test mode. (note: this is NOT the same as debug mode. It can be accessed using -t or --test followed by an optional scenario ID which defaults to 'test'.) {{DevFeature1.13|8}} It can also be accessed by assigning a hotkey to the "Test Scenario" command in hotkey preferences, then pressing that hotkey at the title screen. This will bring up a list of interactive test scenarios to choose from. (Automated test scenarios used for unit testing are excluded from this list but can still be run from the command-line.)<br />
* Any '''[scenario]''' scenario with an id listed in the value of ''first_scenario'' in a campaign tag (see [[CampaignWML]]) is an initial scenario accessed by selecting that campaign after clicking on the "campaign" button.<br />
<br />
== The [scenario] tag ==<br />
<br />
The following keys and tags are recognized in '''[scenario]''' tags, in addition to all the common [[AddonsWML|addon module keys and tags]]:<br />
<br />
* '''next_scenario''': The id of the scenario to load when the current one is won. This can be changed dynamically, to build non-linear campaigns.<br />
* '''map_data''': inputs valid Wesnoth map data. See [[BuildingMaps]] for a description of the Wesnoth map syntax.<br />
* '''map_file''': {{DevFeature1.14|3}} path to a file containing Wesnoth map data. This is the recommended way to reference a map in a scenario. The version number 1.14.3 is not a typo; it was included but buggy in earlier 1.14.x releases.<br />
** {{DevFeature1.15|3}} the file can be found via [binary_path], as documented for [[DirectActionsWML#.5Breplace_map.5D|[replace_map]]].<br />
** {{DevFeature1.15|4}} the file can be a WML file with the contents of a '''[scenario]''' tag, which will be merged in to the current scenario. For example, the map file can include named '''[time_area]'''s. There's more detail in PR #4999.<br />
* '''turns''': sets an event on turn ''turns'' causing the player to lose. Use ''-1'' to have no turn limit. Default value is ''-1'' on wesnoth-1.13 and ''100'' on wesnoth-1.12. See also [[EventWML]]<br />
* '''turn_at''': the turn to start on (default=1)<br />
*: Note that none of the regular start-of-turn behavior, including poison damage, healing, income and refreshing unit movement and status, will occur before the start of turn 2. All start-of-turn [[EventWML|WML events]] will still be fired, however.<br />
* '''random_start_time''': controls random starting time of day. Possible values are yes and no or list of possible start times; starting from 1 to number of times. for example ''random_start_time=2,3,5,6'' (default depends on version and mp/sp, better include this key)<br />
* '''music''': the music file relative to ''./music/'' to play during the scenario<br />
* '''[music]''': specifies the music tracks to play during this scenario, see [[MusicListWML]].<br />
* '''defeat_music''': specifies a comma-separated list of music tracks which may be chosen to play on defeat. If not provided, the default in [[GameConfigWML]] is used instead. May be overridden by [[DirectActionsWML|endlevel]] clauses.<br />
* '''victory_music''': specifies a comma-separated list of music tracks which may be chosen to play on victory. If not provided, the default in [[GameConfigWML]] is used instead. May be overridden by [[DirectActionsWML|endlevel]] clauses.<br />
* '''theme''': the name of the UI theme that should be used when playing this scenario. Valid ids to use can be found in the files in data/themes. Cutscene and Cutscene_Minimal can be useful for dialog only scenarios.<br />
* '''victory_when_enemies_defeated''': when this is set to '''yes''' (default), the player wins once all non-allied units with '''canrecruit=yes''' (aka leaders) are killed. (Currently this only controls the win condition for when all enemies are defeated; it does not prevent the player from losing if he has no leader.) See Also [[SideWML]]. When this value is true the following keys can be used:<br />
** '''carryover_percentage''': by default 80% of the gold is carried over to the next scenario, with this key the amount can be changed.<br />
** '''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.<br />
* '''remove_from_carryover_on_defeat''': when this is set to '''yes''' (default), for sides who got defeated (according to the side.defeat_condition), carryover will be removed.<br />
* '''disallow_recall''': when this is set to 'no'(default), the player is allowed to recall units from previous scenarios.<br />
* '''experience_modifier''': the percentage that required XP to level up (for all units in the scenario) is multiplied by. Default 100. Note that when used in a campaign, weird things (like units being above the required XP to level up) can happen if this value is different for different scenarios.<br />
* '''do_healing''': {{DevFeature1.15|0}} when set to yes, the engine will not skip healing at the first sides turn and will do the healing just like every other turn. <br />
* '''[story]''': describes the intro screen. See [[IntroWML]]<br />
* '''[label]''': sets a label<br />
** '''x''', '''y''': location to set label<br />
** '''text''': the label<br />
* '''[item]''': places an item on map. See [[InterfaceActionsWML#.5Bitem.5D|InterfaceActionsWML]].<br />
* '''[time]''': how a day should progress. See [[TimeWML]]<br />
* '''current_time''': The time of day slot number (starting from zero) active at scenario start.<br />
* '''[time_area]''': 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<br />
** takes x and y coordinates.<br />
** '''[time]''': how a day should progress in those locations. See [[TimeWML]]<br />
** '''current_time''': The time slot number (starting with zero) active at the creation of the area.<br />
** time areas can be used in events, assigned identifiers, and removed at discretion. They also accept complete Standard Location Filters. See [[DirectActionsWML]].<br />
* '''[side]''': describes one player. See [[SideWML]]<br />
* '''map_generation''': another way to generate a map. The map will be generated randomly<br />
** '''default''': the default random map generator<br />
* '''[generator]''' if this is present, the map and scenario will be generated randomly. See [[MapGeneratorWML]]<br />
* [[TerrainGraphicsWML]]: Scenarios can define custom terrain rules for the rendering of the map.<br />
* [[GameConfigWML#Color_Palettes|Color palettes]]<br />
<br />
== The [multiplayer] tag ==<br />
<br />
The following keys and subtags are additionally recognized in '''[multiplayer]''' scenarios:<br />
<br />
* '''force_lock_settings''': provides a default value for [[SideWML]] ''lock'' attributes and forces the "Use map settings" to be checked and disabled. This is useful if author wants to limit game customization in order to keep the scenario/campaign balanced. Individual options can still be enabled if this key is set to '''yes'''. E.g. color selection can be enabled by explicitly setting ''color_lock=yes'' in [[SideWML]].<br />
* '''new_game_title''': if provided will be used instead of '''name''' for campaign entry points.<br />
* '''allow_new_game''': (default=yes) allow/prevent the scenario to be listed in the game configuration screen. This is intended for multiplayer campaigns with multiple entry points.<br />
* '''allow_era''': a list of era ids. Only the eras with matching ids will be allowed to be played with this scenario.<br />
* '''disallow_era''': a list of era ids. Eras with matching ids will not be allowed to be played with this scenario. Cannot be used in parallel with allow_era.<br />
* '''ignore_incompatible_era''': a list of era ids. The eras with matching ids will be considered compatible with this scenario regardless their dependencies.<br />
* '''allow_modification''': same as allow_era, but for modifications.<br />
* '''disallow_modification''': same as disallow_era, but for modifications. Cannot be used in parallel with allow_modification.<br />
* '''ignore_incompatible_modification''': same as ignore_incompatible_era, but for modifications.<br />
* '''force_modification''': a list of modification ids (id key in [modification]). The specified modifications must be enabled to play this scenario.<br />
* '''require_scenario''': {{DevFeature1.13|0}} In a multiplayer scenario, this indicates that the scenario file is not enough (you have custom assets like terrain or additional unit art) and other player must download the full add-on not just the scenario WML to join a game. This will also mean that the '''addon_min_version''' attribute will control the minimum version number of your add-on which is compatible with this version.<br />
* '''mp_village_gold''': {{DevFeature1.13|9}} default value for the corresponding attribute in '''[side]'''<br />
* '''mp_village_support''': {{DevFeature1.13|9}} default value for the corresponding attribute in '''[side]'''<br />
* '''mp_shroud''': {{DevFeature1.13|9}} default value for the corresponding attribute in '''[side]'''<br />
* '''mp_fog''': {{DevFeature1.13|9}} default value for the corresponding attribute in '''[side]'''<br />
<br />
== The [test] tag ==<br />
<br />
The following keys and subtags are additionally recognized in '''[test]''' scenarios:<br />
<br />
* '''is_unit_test''': {{DevFeature1.13|8}} If set to 'yes', this scenario will not appear in the list of test scenarios. The list of test scenarios can be reached from the titlescreen via the Start Test Scenario hotkey. This hotkey is not set by default.<br />
<br />
The tags documented in [[TestWML]] are enabled by an #ifdef TEST conditional, and it's a reasonable assumption that any [test] tag will itself be inside an #ifdef TEST conditional.<br />
<br />
== Defining the Map ==<br />
<br />
There are several possible ways to define the map for a scenario. First of all, the game supports two different types of map: a "plain map", which typically has a .map extension (or occasionally .mask when used as a terrain mask), and a "scenario map", which has a .cfg extension.<br />
<br />
A common practice is to include the map data directly into the scenario. If you're using a plain map, that looks like this:<br />
<br />
<syntaxhighlight lang=wml><br />
[scenario]<br />
map_data="{~add-ons/Your_Addon/maps/the-file.map}"<br />
[/scenario]<br />
</syntaxhighlight><br />
<br />
This uses the WML preprocessor to directly include the contents of the map file. If you're using a scenario map, it instead looks like this:<br />
<br />
<syntaxhighlight lang=wml><br />
[scenario]<br />
{~add-ons/Your_Addon/maps/the-file.cfg}<br />
[/scenario]<br />
</syntaxhighlight><br />
<br />
Another way to specify the map is to use '''map_file''', which resolves the map against the [[BinaryPathWML|binary path]] to locate the file. This looks the same for either a plain map or a scenario map:<br />
<br />
<syntaxhighlight lang=wml><br />
[scenario]<br />
map_file="the-file.map"<br />
[/scenario]<br />
</syntaxhighlight><br />
<br />
The last way to specify a map is to use a [[MapGeneratorWML|generator]].<br />
<br />
== Scenario End Conditions ==<br />
<br />
In this section we will give a more precise explanation of things that can cause a scenario to end.<br />
<br />
* At the '''end of every turn''', the turn number will be compared with the turn limit. <br />
** If we pass the limit, the ''time over'' event will fire. If turns are not added by WML in response to this event, then the scenario will immediately end in defeat. [[EventWML#The_.27name.27_Key_.28Mandatory.29]]<br />
* At the '''beginning of any turn''', and at '''the end of any user or ai action''', the victory conditions will be checked. This will result either in the scenario ending or continuing. The procedure for this is as follows:<br />
** Every side will have its ''defeat_condition'' evaluated based on the units it currently has on the board. [[SideWML]]<br />
*** At this time, villages of defeated sides will be unflagged, and if ''remove_from_carryover_on_defeat = yes'' then their carryover will be cleared as well.<br />
** If any two not-defeated sides are enemies, the scenario will continue.<br />
*** At this time, the ''enemies defeated'' event will fire.<br />
** Furthermore, if ''victory_when_enemies_defeated=no'' and there exists a human controlled side, then the scenario will continue.<br />
*** The human controlled side may be local or remote, for networked mp play.<br />
** If neither of these conditions is met then the scenario will end. <br />
***In victory or defeat according to whether a local human-controlled side is not defeated.<br />
<br />
== See Also ==<br />
<br />
* [[EventWML]]<br />
* [[ReferenceWML]]<br />
<br />
<br />
[[Category: WML Reference]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=ScenarioWML&diff=71492ScenarioWML2023-07-05T10:19:03Z<p>Octalot: /* The [test] tag */ Link to TestWML</p>
<hr />
<div>{{WML Tags}}<br />
<br />
The top level tags '''[multiplayer]''', '''[test]''', and '''[scenario]''' are [[AddonsWML|addon module]] tags that are all formatted the same way.<br />
The difference between these tags is the way that the scenarios they describe are accessed.<br />
<br />
The keys '''id''' and '''next_scenario''' affect how scenarios can be accessed.<br />
Whenever a scenario is won, the scenario with id=''next_scenario'' of the same tag type will be played.<br />
Units from the first scenario will be available for recall in the second.<br />
<br />
Some scenarios can be played without playing other scenarios first<br />
(in this case there is nothing on the recall list).<br />
These scenarios are called ''initial scenario''s.<br />
<br />
A list of initial scenarios, and how to access them:<br />
<br />
* All '''[multiplayer]''' scenarios (without ''allow_new_game=no'') are initial scenarios listed in the multiplayer scenario selector screen (accessed by the "multiplayer" button).<br />
* Any '''[test]''' scenario is an initial scenario. A test scenario can be accessed by running the game in test mode. (note: this is NOT the same as debug mode. It can be accessed using -t or --test followed by an optional scenario ID which defaults to 'test'.) {{DevFeature1.13|8}} It can also be accessed by assigning a hotkey to the "Test Scenario" command in hotkey preferences, then pressing that hotkey at the title screen. This will bring up a list of interactive test scenarios to choose from. (Automated test scenarios used for unit testing are excluded from this list but can still be run from the command-line.)<br />
* Any '''[scenario]''' scenario with an id listed in the value of ''first_scenario'' in a campaign tag (see [[CampaignWML]]) is an initial scenario accessed by selecting that campaign after clicking on the "campaign" button.<br />
<br />
== The [scenario] tag ==<br />
<br />
The following keys and tags are recognized in '''[scenario]''' tags, in addition to all the common [[AddonsWML|addon module keys and tags]]:<br />
<br />
* '''next_scenario''': The id of the scenario to load when the current one is won. This can be changed dynamically, to build non-linear campaigns.<br />
* '''map_data''': inputs valid Wesnoth map data. See [[BuildingMaps]] for a description of the Wesnoth map syntax.<br />
* '''map_file''': {{DevFeature1.14|3}} path to a file containing Wesnoth map data. This is the recommended way to reference a map in a scenario. The version number 1.14.3 is not a typo; it was included but buggy in earlier 1.14.x releases.<br />
** {{DevFeature1.15|3}} the file can be found via [binary_path], as documented for [[DirectActionsWML#.5Breplace_map.5D|[replace_map]]].<br />
** {{DevFeature1.15|4}} the file can be a WML file with the contents of a '''[scenario]''' tag, which will be merged in to the current scenario. For example, the map file can include named '''[time_area]'''s. There's more detail in PR #4999.<br />
* '''turns''': sets an event on turn ''turns'' causing the player to lose. Use ''-1'' to have no turn limit. Default value is ''-1'' on wesnoth-1.13 and ''100'' on wesnoth-1.12. See also [[EventWML]]<br />
* '''turn_at''': the turn to start on (default=1)<br />
*: Note that none of the regular start-of-turn behavior, including poison damage, healing, income and refreshing unit movement and status, will occur before the start of turn 2. All start-of-turn [[EventWML|WML events]] will still be fired, however.<br />
* '''random_start_time''': controls random starting time of day. Possible values are yes and no or list of possible start times; starting from 1 to number of times. for example ''random_start_time=2,3,5,6'' (default depends on version and mp/sp, better include this key)<br />
* '''music''': the music file relative to ''./music/'' to play during the scenario<br />
* '''[music]''': specifies the music tracks to play during this scenario, see [[MusicListWML]].<br />
* '''defeat_music''': specifies a comma-separated list of music tracks which may be chosen to play on defeat. If not provided, the default in [[GameConfigWML]] is used instead. May be overridden by [[DirectActionsWML|endlevel]] clauses.<br />
* '''victory_music''': specifies a comma-separated list of music tracks which may be chosen to play on victory. If not provided, the default in [[GameConfigWML]] is used instead. May be overridden by [[DirectActionsWML|endlevel]] clauses.<br />
* '''theme''': the name of the UI theme that should be used when playing this scenario. Valid ids to use can be found in the files in data/themes. Cutscene and Cutscene_Minimal can be useful for dialog only scenarios.<br />
* '''victory_when_enemies_defeated''': when this is set to '''yes''' (default), the player wins once all non-allied units with '''canrecruit=yes''' (aka leaders) are killed. (Currently this only controls the win condition for when all enemies are defeated; it does not prevent the player from losing if he has no leader.) See Also [[SideWML]]. When this value is true the following keys can be used:<br />
** '''carryover_percentage''': by default 80% of the gold is carried over to the next scenario, with this key the amount can be changed.<br />
** '''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.<br />
* '''remove_from_carryover_on_defeat''': when this is set to '''yes''' (default), for sides who got defeated (according to the side.defeat_condition), carryover will be removed.<br />
* '''disallow_recall''': when this is set to 'no'(default), the player is allowed to recall units from previous scenarios.<br />
* '''experience_modifier''': the percentage that required XP to level up (for all units in the scenario) is multiplied by. Default 100. Note that when used in a campaign, weird things (like units being above the required XP to level up) can happen if this value is different for different scenarios.<br />
* '''do_healing''': {{DevFeature1.15|0}} when set to yes, the engine will not skip healing at the first sides turn and will do the healing just like every other turn. <br />
* '''[story]''': describes the intro screen. See [[IntroWML]]<br />
* '''[label]''': sets a label<br />
** '''x''', '''y''': location to set label<br />
** '''text''': the label<br />
* '''[item]''': places an item on map. See [[InterfaceActionsWML#.5Bitem.5D|InterfaceActionsWML]].<br />
* '''[time]''': how a day should progress. See [[TimeWML]]<br />
* '''current_time''': The time of day slot number (starting from zero) active at scenario start.<br />
* '''[time_area]''': 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<br />
** takes x and y coordinates.<br />
** '''[time]''': how a day should progress in those locations. See [[TimeWML]]<br />
** '''current_time''': The time slot number (starting with zero) active at the creation of the area.<br />
** time areas can be used in events, assigned identifiers, and removed at discretion. They also accept complete Standard Location Filters. See [[DirectActionsWML]].<br />
* '''[side]''': describes one player. See [[SideWML]]<br />
* '''map_generation''': another way to generate a map. The map will be generated randomly<br />
** '''default''': the default random map generator<br />
* '''[generator]''' if this is present, the map and scenario will be generated randomly. See [[MapGeneratorWML]]<br />
* [[TerrainGraphicsWML]]: Scenarios can define custom terrain rules for the rendering of the map.<br />
* [[GameConfigWML#Color_Palettes|Color palettes]]<br />
<br />
== The [multiplayer] tag ==<br />
<br />
The following keys and subtags are additionally recognized in '''[multiplayer]''' scenarios:<br />
<br />
* '''force_lock_settings''': provides a default value for [[SideWML]] ''lock'' attributes and forces the "Use map settings" to be checked and disabled. This is useful if author wants to limit game customization in order to keep the scenario/campaign balanced. Individual options can still be enabled if this key is set to '''yes'''. E.g. color selection can be enabled by explicitly setting ''color_lock=yes'' in [[SideWML]].<br />
* '''new_game_title''': if provided will be used instead of '''name''' for campaign entry points.<br />
* '''allow_new_game''': (default=yes) allow/prevent the scenario to be listed in the game configuration screen. This is intended for multiplayer campaigns with multiple entry points.<br />
* '''allow_era''': a list of era ids. Only the eras with matching ids will be allowed to be played with this scenario.<br />
* '''disallow_era''': a list of era ids. Eras with matching ids will not be allowed to be played with this scenario. Cannot be used in parallel with allow_era.<br />
* '''ignore_incompatible_era''': a list of era ids. The eras with matching ids will be considered compatible with this scenario regardless their dependencies.<br />
* '''allow_modification''': same as allow_era, but for modifications.<br />
* '''disallow_modification''': same as disallow_era, but for modifications. Cannot be used in parallel with allow_modification.<br />
* '''ignore_incompatible_modification''': same as ignore_incompatible_era, but for modifications.<br />
* '''force_modification''': a list of modification ids (id key in [modification]). The specified modifications must be enabled to play this scenario.<br />
* '''require_scenario''': {{DevFeature1.13|0}} In a multiplayer scenario, this indicates that the scenario file is not enough (you have custom assets like terrain or additional unit art) and other player must download the full add-on not just the scenario WML to join a game. This will also mean that the '''addon_min_version''' attribute will control the minimum version number of your add-on which is compatible with this version.<br />
* '''mp_village_gold''': {{DevFeature1.13|9}} default value for the corresponding attribute in '''[side]'''<br />
* '''mp_village_support''': {{DevFeature1.13|9}} default value for the corresponding attribute in '''[side]'''<br />
* '''mp_shroud''': {{DevFeature1.13|9}} default value for the corresponding attribute in '''[side]'''<br />
* '''mp_fog''': {{DevFeature1.13|9}} default value for the corresponding attribute in '''[side]'''<br />
<br />
== The [test] tag ==<br />
<br />
The following keys and subtags are additionally recognized in '''[test]''' scenarios:<br />
<br />
* '''is_unit_test''': {{DevFeature1.13|8}} If set to 'yes', this scenario will not appear in the list of test scenarios. The list of test scenarios can be reached from the titlescreen via the Start Test Scenario hotkey. This hotkey is not set by default.<br />
<br />
The tags and macros documented in [[TestWML]] are recognized when '''#ifdef TEST''' is true. It's a reasonable assumption that any '''[test]''' tag will itself be inside an '''#ifdef TEST''' conditional.<br />
<br />
== Defining the Map ==<br />
<br />
There are several possible ways to define the map for a scenario. First of all, the game supports two different types of map: a "plain map", which typically has a .map extension (or occasionally .mask when used as a terrain mask), and a "scenario map", which has a .cfg extension.<br />
<br />
A common practice is to include the map data directly into the scenario. If you're using a plain map, that looks like this:<br />
<br />
<syntaxhighlight lang=wml><br />
[scenario]<br />
map_data="{~add-ons/Your_Addon/maps/the-file.map}"<br />
[/scenario]<br />
</syntaxhighlight><br />
<br />
This uses the WML preprocessor to directly include the contents of the map file. If you're using a scenario map, it instead looks like this:<br />
<br />
<syntaxhighlight lang=wml><br />
[scenario]<br />
{~add-ons/Your_Addon/maps/the-file.cfg}<br />
[/scenario]<br />
</syntaxhighlight><br />
<br />
Another way to specify the map is to use '''map_file''', which resolves the map against the [[BinaryPathWML|binary path]] to locate the file. This looks the same for either a plain map or a scenario map:<br />
<br />
<syntaxhighlight lang=wml><br />
[scenario]<br />
map_file="the-file.map"<br />
[/scenario]<br />
</syntaxhighlight><br />
<br />
The last way to specify a map is to use a [[MapGeneratorWML|generator]].<br />
<br />
== Scenario End Conditions ==<br />
<br />
In this section we will give a more precise explanation of things that can cause a scenario to end.<br />
<br />
* At the '''end of every turn''', the turn number will be compared with the turn limit. <br />
** If we pass the limit, the ''time over'' event will fire. If turns are not added by WML in response to this event, then the scenario will immediately end in defeat. [[EventWML#The_.27name.27_Key_.28Mandatory.29]]<br />
* At the '''beginning of any turn''', and at '''the end of any user or ai action''', the victory conditions will be checked. This will result either in the scenario ending or continuing. The procedure for this is as follows:<br />
** Every side will have its ''defeat_condition'' evaluated based on the units it currently has on the board. [[SideWML]]<br />
*** At this time, villages of defeated sides will be unflagged, and if ''remove_from_carryover_on_defeat = yes'' then their carryover will be cleared as well.<br />
** If any two not-defeated sides are enemies, the scenario will continue.<br />
*** At this time, the ''enemies defeated'' event will fire.<br />
** Furthermore, if ''victory_when_enemies_defeated=no'' and there exists a human controlled side, then the scenario will continue.<br />
*** The human controlled side may be local or remote, for networked mp play.<br />
** If neither of these conditions is met then the scenario will end. <br />
***In victory or defeat according to whether a local human-controlled side is not defeated.<br />
<br />
== See Also ==<br />
<br />
* [[EventWML]]<br />
* [[ReferenceWML]]<br />
<br />
<br />
[[Category: WML Reference]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=Template:WML_Tags&diff=71490Template:WML Tags2023-07-02T17:36:42Z<p>Octalot: Link to test_do_attack_by_id</p>
<hr />
<div>{| class="reference-sidebar"<br />
|-<br />
|<br />
<span class="editlink">&#91;[{{SERVER}}{{localurl:Template:WML Tags|action=edit}} edit]&#93;</span>'''WML Tags'''<br />
|-<br />
|''A:'' <br />
[[AbilitiesWML|abilities]],<br />
[[CreditsWML#.5Babout.5D|about]],<br />
[[AchievementsWML|achievement]],<br />
[[AchievementsWML|achievement_group]],<br />
[[Creating_Custom_AIs#Behavior_Candidate_Actions|add_ai_behavior]],<br />
[[SingleUnitWML|advance]],<br />
[[AdvancedPreferenceWML|advanced_preference]],<br />
[[UnitTypeWML|advancefrom]],<br />
[[UnitTypeWML#After_max_level_advancement_.28AMLA.29|advancement]],<br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|advances]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_ability|affect_adjacent]],<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Top-level_Elements|ai]],<br />
[[StandardSideFilter|allied_with]], <br />
[[DirectActionsWML#.5Ballow_end_turn.5D|allow_end_turn]],<br />
[[DirectActionsWML#.5Ballow_extra_recruit.5D|allow_extra_recruit]],<br />
[[DirectActionsWML#.5Ballow_recruit.5D|allow_recruit]],<br />
[[DirectActionsWML#.5Ballow_undo.5D|allow_undo]],<br />
[[ConditionalActionsWML#Meta-Condition_Tags|and]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|animate]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|animate_unit]],<br />
[[AnimationWML|animation]],<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|aspect]],<br />
attack ([[ReplayWML|replay]], [[UnitTypeWML#Attacks|weapon]]),<br />
[[AnimationWML|attack_anim]],<br />
attacks ([[AbilitiesWML#The_.5Bspecials.5D_tag|special]], [[StatisticalScenarioWML#The_.5Bteam.5D_tag|stats]]),<br />
[[AiWML#List_of_AI_Aspects|avoid]];<br />
|-<br />
|''B:'' <br />
[[UnitTypeWML#Other_tags|base_unit]], <br />
[[IntroWML#.5Bbackground_layer.5D|background_layer]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|berserk]], <br />
[[BinaryPathWML|binary_path]],<br />
[[InternalActionsWML#Flow_control_actions|break]],<br />
[[EditorWML#The_.5Bbrush.5D_tag|brush]];<br />
|-<br />
|''C:'' <br />
[[CampaignWML#The_.5Bcampaign.5D_tag|campaign]],<br />
[[DirectActionsWML#.5Bcancel_action.5D|cancel_action]],<br />
[[Wesnoth_AI_Framework#The_.5Bcandidate_action.5D_Tag|candidate_action]], <br />
[[DirectActionsWML#.5Bcapture_village.5D|capture_village]],<br />
[[ConditionalActionsWML#.5Bswitch.5D|case]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|chance_to_hit]], <br />
[[InterfaceActionsWML#.5Bchange_theme.5D|change_theme]], <br />
[[InterfaceActionsWML#.5Bchat.5D|chat]],<br />
[[OptionWML|checkbox]],<br />
[[OptionWML|choice]],<br />
[[ReplayWML|choose]],<br />
[[PersistenceWML|clear_global_variable]],<br />
[[InterfaceActionsWML#.5Bclear_menu_item.5D|clear_menu_item]],<br />
[[InternalActionsWML#.5Bclear_variable.5D|clear_variable]],<br />
[[InterfaceActionsWML#.5Bcolor_adjust.5D|color_adjust]],<br />
[[GameConfigWML#Color_Palettes|color_palette]],<br />
[[GameConfigWML#Color_Palettes|color_range]],<br />
command&nbsp;([[ConditionalActionsWML#.5Bcommand.5D|action]], [[ReplayWML|replay]]),<br />
[[InternalActionsWML#Flow_control_actions|continue]],<br />
[[CreditsWML#.5Bcredits_group.5D|credits_group]],<br />
[[AiWML#The_.5Bgoal.5D_Tag|criteria]];<br />
|-<br />
|''D:'' <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|damage]],<br />
[[AnimationWML#death|death]], <br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|deaths]],<br />
[[AnimationWML#default|default]], <br />
[[AnimationWML#defend|defend]],<br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|defends]],<br />
[[UnitsWML#.5Bmovetype.5D|defense]],<br />
[[InterfaceActionsWML#.5Bdelay.5D|delay]],<br />
[[InterfaceActionsWML#.5Bdeprecated_message.5D|deprecated_message]],<br />
[[ReplayWML|destination]],<br />
[[CampaignWML|difficulty]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|disable]],<br />
[[DirectActionsWML#.5Bdisallow_end_turn.5D|disallow_end_turn]],<br />
[[DirectActionsWML#.5Bdisallow_extra_recruit.5D|disallow_extra_recruit]],<br />
[[DirectActionsWML#.5Bdisallow_recruit.5D|disallow_recruit]],<br />
[[ConditionalActionsWML#.5Bwhile.5D|do]], <br />
[[DirectActionsWML#.5Bdo_command.5D|do_command]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|drains]], <br />
[[AnimationWML#draw_weapon_anim|draw_weapon_anim]];<br />
|-<br />
|''E:'' <br />
[[EditorWML#The_.5Beditor_group.5D_tag|editor_group]],<br />
[[EditorWML#The_.5Beditor_music.5D_tag|editor_music]],<br />
[[EditorWML#The_.5Beditor_times.5D_tag|editor_times]],<br />
[[EffectWML|effect]],<br />
else&nbsp;([[ConditionalActionsWML#.5Bif.5D|action]], [[AnimationWML#.5Bif.5D_and_.5Belse.5D|animation]]), [[ConditionalActionsWML#.5Bif.5D|elseif]],<br />
[[DirectActionsWML#.5Bendlevel.5D|endlevel]],<br />
end_turn&nbsp;([[DirectActionsWML#.5Bend_turn.5D|action]], [[ReplayWML|replay]]),<br />
[[StandardSideFilter|enemy_of]], <br />
[[Wesnoth_AI_Framework#Available_Engines|engine]], <br />
entry&nbsp;([[CreditsWML#.5Bentry.5D|credits]], [[OptionWML|options]]),<br />
[[EraWML|era]],<br />
[[EventWML|event]],<br />
[[AnimationWML#Simplified_animation_blocks|extra_anim]];<br />
|-<br />
|''F:''<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|facet]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|facing]], <br />
[[InterfaceActionsWML#.5Bmove_units_fake.5D|fake_unit]], <br />
[[ConditionalActionsWML#.5Bfalse.5D|false]],<br />
[[PblWML#.5Bfeedback.5D|feedback]],<br />
[[UnitTypeWML#Other_tags|female]], <br />
filter ([[FilterWML|concept]], [[EventWML#.5Bfilter.5D|event]]),<br />
[[StandardUnitFilter|filter_adjacent]], <br />
[[StandardLocationFilter|filter_adjacent_location]], <br />
[[FilterWML#Filtering_Weapons|filter_attack]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_attacker]], <br />
[[AbilitiesWML#Common_keys_and_tags_for_every_ability|filter_base_value]], <br />
[[EventWML#.5Bfilter_condition.5D|filter_condition]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_defender]], <br />
[[AiWML#Filtering_Combat_with_the_.27attacks.27_Aspect|filter_enemy]],<br />
[[StandardLocationFilter|filter_location]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_opponent]], <br />
[[AiWML#Filtering_Combat_with_the_.27attacks.27_Aspect|filter_own]],<br />
[[StandardLocationFilter|filter_owner]], <br />
[[StandardLocationFilter|filter_radius]], <br />
[[SingleUnitWML|filter_recall]], <br />
[[StandardUnitFilter|filter_second]],<br />
[[FilterWML#Filtering_Weapons|filter_second_attack]],<br />
[[AbilitiesWML|filter_self]], <br />
[[StandardSideFilter|filter_side]],<br />
[[AbilitiesWML|filter_student]], <br />
[[FilterWML#Filtering_Vision|filter_vision]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_weapon]], <br />
[[FilterWML#Filtering_on_WML_data|filter_wml]],<br />
[[InternalActionsWML#.5Bfind_path.5D|find_path]],<br />
[[InternalActionsWML#.5Bfire_event.5D|fire_event]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|firststrike]], <br />
[[InterfaceActionsWML#.5Bfloating_text.5D|floating_text]],<br />
[[ConditionalActionsWML#.5Bfound_item.5D|found_item]],<br />
[[ConditionalActionsWML#.5Bfor.5D|for]],<br />
[[ConditionalActionsWML#.5Bforeach.5D|foreach]],<br />
[[AnimationWML#Frames|frame]];<br />
|-<br />
|''G:'' <br />
[[GameConfigWML|game_config]],<br />
[[PersistenceWML|get_global_variable]],<br />
[[AiWML#The_.5Bgoal.5D_Tag|goal]],<br />
[[DirectActionsWML#.5Bgold.5D|gold]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|gold_carryover]];<br />
|-<br />
|''H:'' <br />
[[DirectActionsWML#.5Bharm_unit.5D|harm_unit]],<br />
[[StandardSideFilter|has_ally]], <br />
[[StandardUnitFilter|has_attack]],<br />
[[StandardSideFilter|has_unit]], <br />
[[ConditionalActionsWML#.5Bhas_achievement.5D|has_achievement]],<br />
[[ConditionalActionsWML#.5Bhave_location.5D|have_location]],<br />
[[ConditionalActionsWML#.5Bhave_unit.5D|have_unit]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|heal_on_hit]], <br />
[[DirectActionsWML#.5Bheal_unit.5D|heal_unit]],<br />
[[AnimationWML#healed|healed_anim]], <br />
[[AnimationWML#healing|healing_anim]], <br />
[[AbilitiesWML|heals]], <br />
[[UnitsWML#.5Bhide_help.5D|hide_help]],<br />
[[InterfaceActionsWML#.5Bhide_unit.5D|hide_unit]],<br />
[[AbilitiesWML|hides]];<br />
|-<br />
|''I:'' <br />
[[AnimationWML#idling|idle_anim]], <br />
if&nbsp;([[ConditionalActionsWML#.5Bif.5D|action]], [[AnimationWML#.5Bif.5D_and_.5Belse.5D|animation]], [[IntroWML|intro]]),<br />
[[AbilitiesWML|illuminates]], <br />
image&nbsp;([[IntroWML#.5Bimage.5D|intro]], [[TerrainGraphicsWML|terrain]]),<br />
[[ReplayWML|init_side]],<br />
[[InternalActionsWML#.5Binsert_tag.5D|insert_tag]],<br />
[[InterfaceActionsWML#.5Binspect.5D|inspect]],<br />
[[InterfaceActionsWML#.5Bitem.5D|item]],<br />
[[EditorWML#The_.5Bitem_group.5D_tag|item_group]];<br />
|-<br />
|''J:''<br />
[[UnitsWML#.5Bmovetype.5D|jamming_costs]],<br />
[[InternalActionsWML#.5Bset_variable.5D|join]];<br />
|-<br />
|''K:'' <br />
[[DirectActionsWML#.5Bkill.5D|kill]],<br />
[[StatisticalScenarioWML|killed]];<br />
|-<br />
|''L:'' <br />
[[InterfaceActionsWML#.5Blabel.5D|label]],<br />
[[LanguageWML|language]],<br />
[[SideWML|leader]],<br />
[[AiWML#List_of_AI_Aspects|leader_goal]],<br />
[[AbilitiesWML|leadership]], <br />
[[AnimationWML#leading|leading_anim]], <br />
[[AnimationWML#levelin|levelin_anim]],<br />
[[AnimationWML#levelout|levelout_anim]], <br />
[[DirectActionsWML#.5Blift_fog.5D|lift_fog]],<br />
[[AI_Recruitment#Aspect_recruitment_instructions|limit]],<br />
[[InternalActionsWML#.5Bset_variables.5D|literal]],<br />
[[AddonsWML|load_resource]],<br />
[[LocaleWML|locale]],<br />
[[InterfaceActionsWML#.5Block_view.5D|lock_view]],<br />
[[LuaWML|lua]];<br />
|-<br />
|''M:'' <br />
[[UnitTypeWML#Other_tags|male]], <br />
[[SavefileWML|menu_item]], <br />
[[InterfaceActionsWML#.5Bmessage.5D|message]],<br />
[[Micro AIs|micro_ai]],<br />
[[AnimationWML#The_content_of_a_frame|missile_frame]],<br />
[[ModificationWML|modification]],<br />
[[SingleUnitWML|modifications]],<br />
[[DirectActionsWML#.5Bmodify_ai.5D|modify_ai]],<br />
[[DirectActionsWML#.5Bmodify_side.5D|modify_side]],<br />
[[DirectActionsWML#.5Bmodify_turns.5D|modify_turns]],<br />
[[DirectActionsWML#.5Bmodify_unit.5D|modify_unit]],<br />
[[AddonsWML|modify_unit_type]],<br />
[[ReplayWML|move]],<br />
[[DirectActionsWML#.5Bmove_unit.5D|move_unit]],<br />
[[InterfaceActionsWML#.5Bmove_unit_fake.5D|move_unit_fake]],<br />
[[InterfaceActionsWML#.5Bmove_units_fake.5D|move_units_fake]],<br />
[[AnimationWML#movement|movement_anim]], <br />
[[UnitsWML#.5Bmovetype.5D|movement costs]],<br />
[[UnitsWML#.5Bmovetype.5D|movetype]],<br />
[[ScenarioWML|multiplayer]],<br />
[[EraWML#Defining_Factions|multiplayer_side]],<br />
[[MusicListWML#.5Bmusic.5D|music]];<br />
|-<br />
|''N:'' <br />
[[ConditionalActionsWML#Meta-Condition_Tags|not]], <br />
[[InterfaceActionsWML#.5Bobjectives.5D|note]];<br />
|-<br />
|''O:'' <br />
[[DirectActionsWML#.5Bobject.5D|object]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|objective]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|objectives]],<br />
[[DirectActionsWML#.5Bon_undo.5D|on_undo]],<br />
[[InterfaceActionsWML#.5Bopen_help.5D|open_help]],<br />
[[InterfaceActionsWML#.5Bmessage.5D|option]],<br />
[[OptionWML|options]],<br />
[[ConditionalActionsWML#Meta-Condition_Tags|or]];<br />
|-<br />
|''P:'' <br />
[[IntroWML|part]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|petrifies]], <br />
[[DirectActionsWML#.5Bpetrify.5D|petrify]], <br />
[[DirectActionsWML#.5Bplace_shroud.5D|place_shroud]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|plague]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|poison]], <br />
[[UnitTypeWML#Other_tags|portrait]], <br />
[[AnimationWML#post_movement|post_movement_anim]], <br />
[[AnimationWML#pre_movement|pre_movement_anim]], <br />
[[InternalActionsWML#.5Bfire_event.5D|primary_attack]], <br />
[[InternalActionsWML#.5Bfire_event.5D|primary_unit]], <br />
[[InterfaceActionsWML#.5Bprint.5D|print]], <br />
[[DirectActionsWML#.5Bprogress_achievement.5D|progress_achievement]], <br />
[[DirectActionsWML#.5Bput_to_recall_list.5D|put_to_recall_list]];<br />
|-<br />
|''R:'' <br />
[[UnitsWML#.5Brace.5D|race]], <br />
[[InternalActionsWML#.5Brandom_placement.5D|random_placement]], <br />
recall&nbsp;([[DirectActionsWML#.5Brecall.5D|action]], [[ReplayWML|replay]]), <br />
[[StatisticalScenarioWML|recalls]],<br />
[[ReplayWML|recruit]], <br />
[[AnimationWML#recruited|recruit_anim]], <br />
[[AnimationWML#recruiting|recruiting_anim]], <br />
[[StatisticalScenarioWML|recruits]], <br />
[[InterfaceActionsWML#.5Bredraw.5D|redraw]],<br />
[[AbilitiesWML|regenerate]],<br />
[[InternalActionsWML#.5Bremove_event.5D|remove_event]],<br />
[[InterfaceActionsWML#.5Bremove_item.5D|remove_item]], <br />
[[DirectActionsWML#.5Bremove_object.5D|remove_object]], <br />
[[DirectActionsWML#.5Bremove_shroud.5D|remove_shroud]], <br />
[[InterfaceActionsWML#.5Bremove_sound_source.5D|remove_sound_source]], <br />
[[DirectActionsWML#.5Bremove_time_area.5D|remove_time_area]], <br />
[[DirectActionsWML#.5Bremove_trait.5D|remove_trait]],<br />
[[InterfaceActionsWML#.5Bremove_unit_overlay.5D|remove_unit_overlay]],<br />
[[ConditionalActionsWML#.5Brepeat.5D|repeat]],<br />
[[DirectActionsWML#.5Breplace_map.5D|replace_map]], <br />
[[DirectActionsWML#.5Breplace_schedule.5D|replace_schedule]], <br />
[[ReplayWML|replay]], <br />
[[SavefileWML|replay_start]],<br />
[[DirectActionsWML#.5Breset_fog.5D|reset_fog]], <br />
resistance&nbsp;([[AbilitiesWML|ability]], [[UnitsWML#.5Bmovetype.5D|unit]]),<br />
[[UnitsWML#.5Bresistance_defaults.5D|resistance_defaults]],<br />
[[ModificationWML#The_.5Bresource.5D_toplevel_tag|resource]],<br />
[[InternalActionsWML#Flow_control_actions|return]],<br />
[[InternalActionsWML#.5Brole.5D|role]], <br />
[[TerrainMaskWML|rule]];<br />
|-<br />
|''S:'' <br />
[[SavefileWML|save]], <br />
[[ScenarioWML|scenario]],<br />
[[InterfaceActionsWML#.5Bscreen_fade.5D|screen_fade]], <br />
[[InterfaceActionsWML#.5Bscroll.5D|scroll]], <br />
[[InterfaceActionsWML#.5Bscroll_to.5D|scroll_to]],<br />
[[InterfaceActionsWML#.5Bscroll_to_unit.5D|scroll_to_unit]], <br />
[[InternalActionsWML#.5Bfire_event.5D|secondary_attack]], <br />
[[InternalActionsWML#.5Bfire_event.5D|secondary_unit]], <br />
[[HelpWML|section]], <br />
[[InterfaceActionsWML#.5Bselect_unit.5D|select_unit]], <br />
[[ReplayWML|sequence]], <br />
[[DirectActionsWML#.5Bset_achievement.5D|set_achievement]],<br />
[[DirectActionsWML#.5Bset_extra_recruit.5D|set_extra_recruit]],<br />
[[PersistenceWML|set_global_variable]],<br />
[[InterfaceActionsWML#.5Bset_menu_item.5D|set_menu_item]], <br />
[[DirectActionsWML#.5Bset_recruit.5D|set_recruit]],<br />
[[EffectWML|set_specials]], <br />
[[InternalActionsWML#.5Bset_variable.5D|set_variable]], <br />
[[InternalActionsWML#.5Bset_variables.5D|set_variables]], <br />
[[AnimationWML#sheath_weapon|sheath_weapon_anim]], <br />
show_if&nbsp;([[InterfaceActionsWML#.5Bmessage.5D|message]], <br />
[[InterfaceActionsWML#.5Bobjectives.5D|objective]], <br />
[[InterfaceActionsWML#.5Bset_menu_item.5D|set_menu_item]]),<br />
[[InterfaceActionsWML#.5Bshow_objectives.5D|show_objectives]],<br />
[[SideWML|side]], <br />
[[AbilitiesWML|skirmisher]], <br />
[[OptionWML|slider]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|slow]], <br />
[[SavefileWML|snapshot]],<br />
[[InterfaceActionsWML#.5Bsound.5D|sound]], <br />
[[InterfaceActionsWML#.5Bsound_source.5D|sound_source]], <br />
source&nbsp;([[ReplayWML|replay]], [[DirectActionsWML#.5Btunnel.5D|teleport]]),<br />
[[UnitTypeWML#Other_tags|special_note]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|specials]], <br />
[[InternalActionsWML#.5Bset_variables.5D|split]],<br />
[[Wesnoth_AI_Framework#Available_Stages|stage]], <br />
[[AnimationWML#standing|standing_anim]], <br />
[[StatisticalScenarioWML#The_.5Bstatistics.5D_tag|statistics]],<br />
[[SingleUnitWML|status]], <br />
[[InternalActionsWML#.5Bstore_gold.5D|store_gold]], <br />
[[InternalActionsWML#.5Bstore_items.5D|store_items]], <br />
[[InternalActionsWML#.5Bstore_locations.5D|store_locations]],<br />
[[InternalActionsWML#.5Bstore_map_dimensions.5D|store_map_dimensions]],<br />
[[InternalActionsWML#.5Bstore_reachable_locations.5D|store_reachable_locations]],<br />
[[InternalActionsWML#.5Bstore_relative_direction.5D|store_relative_direction]],<br />
[[InternalActionsWML#.5Bstore_side.5D|store_side]], <br />
[[InternalActionsWML#.5Bstore_starting_location.5D|store_starting_location]], <br />
[[InternalActionsWML#.5Bstore_time_of_day.5D|store_time_of_day]], <br />
[[InternalActionsWML#.5Bstore_turns.5D|store_turns]], <br />
[[InternalActionsWML#.5Bstore_unit.5D|store_unit]], <br />
[[InternalActionsWML#.5Bstore_unit_defense.5D|store_unit_defense]], <br />
[[InternalActionsWML#.5Bstore_unit_defense_on.5D|store_unit_defense_on]], <br />
[[InternalActionsWML#.5Bstore_unit_type.5D|store_unit_type]], <br />
[[InternalActionsWML#.5Bstore_unit_type_ids.5D|store_unit_type_ids]], <br />
[[InternalActionsWML#.5Bstore_villages.5D|store_villages]], <br />
[[IntroWML|story]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|swarm]], <br />
[[AchievementsWML|sub_achievement]],<br />
[[ConditionalActionsWML#.5Bswitch.5D|switch]],<br />
[[InternalActionsWML#.5Bsync_variable.5D|sync_variable]];<br />
|-<br />
|''T:'' <br />
[[DirectActionsWML#.5Btunnel.5D|target]], <br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|team]],<br />
teleport&nbsp;([[AbilitiesWML|ability]], [[DirectActionsWML#.5Bteleport.5D|action]]),<br />
[[AnimationWML#pre_teleport|teleport_anim]],<br />
[[DirectActionsWML#.5Bterrain.5D|terrain]], <br />
[[UnitsWML#.5Bterrain_defaults.5D|terrain_defaults]],<br />
[[TerrainGraphicsWML|terrain_graphics]], <br />
[[TerrainMaskWML|terrain_mask]], <br />
[[TerrainWML|terrain_type]], <br />
[[ScenarioWML#The_.5Btest.5D_tag|test]],<br />
[[InterfaceActionsWML#.5Btest_condition.5D|test_condition]],<br />
[[TestWML#The_.5Btest_do_attack_by_id.5D_tag|test_do_attack_by_id]],<br />
[[InterfaceActionsWML#.5Bmessage.5D|text_input]], <br />
[[GettextForWesnothDevelopers#The_textdomain_tag|textdomain]],<br />
[[ThemeWML|theme]],<br />
[[ConditionalActionsWML#.5Bif.5D|then]],<br />
[[TerrainGraphicsWML|tile]], <br />
[[TimeWML|time]], <br />
[[DirectActionsWML#.5Btime_area.5D|time_area]], <br />
[[HelpWML|topic]], <br />
[[HelpWML|toplevel]], <br />
[[UnitsWML#.5Btrait.5D|trait]], <br />
[[DirectActionsWML#.5Btransform_unit.5D|transform_unit]], <br />
[[InternalActionsWML#.5Bfind_path.5D|traveler]], <br />
[[ConditionalActionsWML#.5Btrue.5D|true]],<br />
[[DirectActionsWML#.5Btunnel.5D|tunnel]];<br />
|-<br />
|''U:'' <br />
[[InterfaceActionsWML#.5Bunhide_unit.5D|unhide_unit]], <br />
[[SingleUnitWML|unit]],<br />
[[InterfaceActionsWML#.5Bunit_overlay.5D|unit_overlay]], <br />
[[UnitTypeWML|unit_type]], <br />
[[InternalActionsWML#.5Bunit_worth.5D|unit_worth]], <br />
[[UnitsWML|units]],<br />
[[InterfaceActionsWML#.5Bunlock_view.5D|unlock_view]],<br />
[[DirectActionsWML#.5Bunpetrify.5D|unpetrify]], <br />
[[DirectActionsWML#.5Bunstore_unit.5D|unstore_unit]],<br />
[[InternalActionsWML#.5Bunsynced.5D|unsynced]];<br />
|-<br />
| ''V:'' <br />
[[InternalActionsWML#.5Bset_variables.5D|value]], <br />
[[ConditionalActionsWML#.5Bvariable.5D|variable]],<br />
[[VariablesWML#The_.5Bvariables.5D_tag|variables]],<br />
[[TerrainGraphicsWML|variant]],<br />
[[UnitTypeWML#Other_tags|variation]], <br />
[[AnimationWML#victory|victory_anim]], <br />
[[SideWML|village]],<br />
[[UnitsWML#.5Bmovetype.5D|vision_costs]],<br />
[[InterfaceActionsWML#.5Bvolume.5D|volume]];<br />
|-<br />
| ''W:'' <br />
[[ConditionalActionsWML#.5Bwhile.5D|while]],<br />
[[InterfaceActionsWML#.5Bwml_message.5D|wml_message]],<br />
[[SchemaWML|wml_schema]];<br />
|-<br />
| ''Z:''<br />
[[InterfaceActionsWML#.5Bzoom.5D|zoom]];<br />
|}<includeonly>[[Category:WML Reference]]</includeonly><noinclude>A box with all the WML tags, each one linking to the page and section they are described in. This box should be included in each of the WML reference pages.</noinclude></div>Octalothttps://wiki.wesnoth.org/index.php?title=TestWML&diff=71489TestWML2023-07-02T17:35:10Z<p>Octalot: Document [test_do_attack_by_id]</p>
<hr />
<div>{{WML Tags}}<br />
<br />
The tags and macros on this page are for use in unit tests, they're defined in data/test and enabled when '''#ifdef TEST''' is true.<br />
<br />
The main '''[test]''' tag is documented on the [[ScenarioWML#The_.5Btest.5D_tag|ScenarioWML]] page.<br />
<br />
== The [test_do_attack_by_id] tag ==<br />
<br />
The '''[test_do_attack_by_id]''' tag is a wrapper for [[ReplayWML|[do_command][attack]]], taking unit ids instead of map coordinates. It has the following attributes:<br />
<br />
* '''attacker''' the unit that initiates the attack<br />
* '''defender''' the unit being attacked<br />
* '''weapon''' (unset by default) if set, is used as the value for [do_command][attack]weapon=<br />
* '''defender_weapon''' (unset by default) if set, is used as the value for [do_command][attack]defender_weapon=<br />
* '''resupply_attacks_left''' (unset by default) if set to an integer higher than attacker.attacks_left, then attacker.attacks_left will be set to this value before calling [do_command][attack]<br />
<br />
The reason for making this a test-only tag is that it can handle errors by failing the test, or by doing nothing and having the test fail later. Using unit IDs helps avoid hardcoding map coordinates in tests, and in tests the author is expected to know exactly which units should be involved. Even if this was a generic tag, it's likely that its only use outside tests would only be in events that already auto-store '''$unit''', and either auto-store '''$second_unit''' or already include a hardcoded '''x,y=''' filter.<br />
<br />
An alternative would be a generic tag taking SUFs for attacker and defender, but outside unit tests, there's a possibility of there being no unit matching the SUF, many units matching the SUF, or that the two units aren't adjacent to each other.<br />
<br />
== See Also ==<br />
<br />
* [[LuaAPI/unit_test|LuaAPI for unit tests]]<br />
<br />
[[Category: WML Reference]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=Template:WML_Tags&diff=71488Template:WML Tags2023-07-02T17:02:54Z<p>Octalot: Correct link for [test]</p>
<hr />
<div>{| class="reference-sidebar"<br />
|-<br />
|<br />
<span class="editlink">&#91;[{{SERVER}}{{localurl:Template:WML Tags|action=edit}} edit]&#93;</span>'''WML Tags'''<br />
|-<br />
|''A:'' <br />
[[AbilitiesWML|abilities]],<br />
[[CreditsWML#.5Babout.5D|about]],<br />
[[AchievementsWML|achievement]],<br />
[[AchievementsWML|achievement_group]],<br />
[[Creating_Custom_AIs#Behavior_Candidate_Actions|add_ai_behavior]],<br />
[[SingleUnitWML|advance]],<br />
[[AdvancedPreferenceWML|advanced_preference]],<br />
[[UnitTypeWML|advancefrom]],<br />
[[UnitTypeWML#After_max_level_advancement_.28AMLA.29|advancement]],<br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|advances]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_ability|affect_adjacent]],<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Top-level_Elements|ai]],<br />
[[StandardSideFilter|allied_with]], <br />
[[DirectActionsWML#.5Ballow_end_turn.5D|allow_end_turn]],<br />
[[DirectActionsWML#.5Ballow_extra_recruit.5D|allow_extra_recruit]],<br />
[[DirectActionsWML#.5Ballow_recruit.5D|allow_recruit]],<br />
[[DirectActionsWML#.5Ballow_undo.5D|allow_undo]],<br />
[[ConditionalActionsWML#Meta-Condition_Tags|and]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|animate]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|animate_unit]],<br />
[[AnimationWML|animation]],<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|aspect]],<br />
attack ([[ReplayWML|replay]], [[UnitTypeWML#Attacks|weapon]]),<br />
[[AnimationWML|attack_anim]],<br />
attacks ([[AbilitiesWML#The_.5Bspecials.5D_tag|special]], [[StatisticalScenarioWML#The_.5Bteam.5D_tag|stats]]),<br />
[[AiWML#List_of_AI_Aspects|avoid]];<br />
|-<br />
|''B:'' <br />
[[UnitTypeWML#Other_tags|base_unit]], <br />
[[IntroWML#.5Bbackground_layer.5D|background_layer]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|berserk]], <br />
[[BinaryPathWML|binary_path]],<br />
[[InternalActionsWML#Flow_control_actions|break]],<br />
[[EditorWML#The_.5Bbrush.5D_tag|brush]];<br />
|-<br />
|''C:'' <br />
[[CampaignWML#The_.5Bcampaign.5D_tag|campaign]],<br />
[[DirectActionsWML#.5Bcancel_action.5D|cancel_action]],<br />
[[Wesnoth_AI_Framework#The_.5Bcandidate_action.5D_Tag|candidate_action]], <br />
[[DirectActionsWML#.5Bcapture_village.5D|capture_village]],<br />
[[ConditionalActionsWML#.5Bswitch.5D|case]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|chance_to_hit]], <br />
[[InterfaceActionsWML#.5Bchange_theme.5D|change_theme]], <br />
[[InterfaceActionsWML#.5Bchat.5D|chat]],<br />
[[OptionWML|checkbox]],<br />
[[OptionWML|choice]],<br />
[[ReplayWML|choose]],<br />
[[PersistenceWML|clear_global_variable]],<br />
[[InterfaceActionsWML#.5Bclear_menu_item.5D|clear_menu_item]],<br />
[[InternalActionsWML#.5Bclear_variable.5D|clear_variable]],<br />
[[InterfaceActionsWML#.5Bcolor_adjust.5D|color_adjust]],<br />
[[GameConfigWML#Color_Palettes|color_palette]],<br />
[[GameConfigWML#Color_Palettes|color_range]],<br />
command&nbsp;([[ConditionalActionsWML#.5Bcommand.5D|action]], [[ReplayWML|replay]]),<br />
[[InternalActionsWML#Flow_control_actions|continue]],<br />
[[CreditsWML#.5Bcredits_group.5D|credits_group]],<br />
[[AiWML#The_.5Bgoal.5D_Tag|criteria]];<br />
|-<br />
|''D:'' <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|damage]],<br />
[[AnimationWML#death|death]], <br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|deaths]],<br />
[[AnimationWML#default|default]], <br />
[[AnimationWML#defend|defend]],<br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|defends]],<br />
[[UnitsWML#.5Bmovetype.5D|defense]],<br />
[[InterfaceActionsWML#.5Bdelay.5D|delay]],<br />
[[InterfaceActionsWML#.5Bdeprecated_message.5D|deprecated_message]],<br />
[[ReplayWML|destination]],<br />
[[CampaignWML|difficulty]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|disable]],<br />
[[DirectActionsWML#.5Bdisallow_end_turn.5D|disallow_end_turn]],<br />
[[DirectActionsWML#.5Bdisallow_extra_recruit.5D|disallow_extra_recruit]],<br />
[[DirectActionsWML#.5Bdisallow_recruit.5D|disallow_recruit]],<br />
[[ConditionalActionsWML#.5Bwhile.5D|do]], <br />
[[DirectActionsWML#.5Bdo_command.5D|do_command]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|drains]], <br />
[[AnimationWML#draw_weapon_anim|draw_weapon_anim]];<br />
|-<br />
|''E:'' <br />
[[EditorWML#The_.5Beditor_group.5D_tag|editor_group]],<br />
[[EditorWML#The_.5Beditor_music.5D_tag|editor_music]],<br />
[[EditorWML#The_.5Beditor_times.5D_tag|editor_times]],<br />
[[EffectWML|effect]],<br />
else&nbsp;([[ConditionalActionsWML#.5Bif.5D|action]], [[AnimationWML#.5Bif.5D_and_.5Belse.5D|animation]]), [[ConditionalActionsWML#.5Bif.5D|elseif]],<br />
[[DirectActionsWML#.5Bendlevel.5D|endlevel]],<br />
end_turn&nbsp;([[DirectActionsWML#.5Bend_turn.5D|action]], [[ReplayWML|replay]]),<br />
[[StandardSideFilter|enemy_of]], <br />
[[Wesnoth_AI_Framework#Available_Engines|engine]], <br />
entry&nbsp;([[CreditsWML#.5Bentry.5D|credits]], [[OptionWML|options]]),<br />
[[EraWML|era]],<br />
[[EventWML|event]],<br />
[[AnimationWML#Simplified_animation_blocks|extra_anim]];<br />
|-<br />
|''F:''<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|facet]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|facing]], <br />
[[InterfaceActionsWML#.5Bmove_units_fake.5D|fake_unit]], <br />
[[ConditionalActionsWML#.5Bfalse.5D|false]],<br />
[[PblWML#.5Bfeedback.5D|feedback]],<br />
[[UnitTypeWML#Other_tags|female]], <br />
filter ([[FilterWML|concept]], [[EventWML#.5Bfilter.5D|event]]),<br />
[[StandardUnitFilter|filter_adjacent]], <br />
[[StandardLocationFilter|filter_adjacent_location]], <br />
[[FilterWML#Filtering_Weapons|filter_attack]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_attacker]], <br />
[[AbilitiesWML#Common_keys_and_tags_for_every_ability|filter_base_value]], <br />
[[EventWML#.5Bfilter_condition.5D|filter_condition]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_defender]], <br />
[[AiWML#Filtering_Combat_with_the_.27attacks.27_Aspect|filter_enemy]],<br />
[[StandardLocationFilter|filter_location]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_opponent]], <br />
[[AiWML#Filtering_Combat_with_the_.27attacks.27_Aspect|filter_own]],<br />
[[StandardLocationFilter|filter_owner]], <br />
[[StandardLocationFilter|filter_radius]], <br />
[[SingleUnitWML|filter_recall]], <br />
[[StandardUnitFilter|filter_second]],<br />
[[FilterWML#Filtering_Weapons|filter_second_attack]],<br />
[[AbilitiesWML|filter_self]], <br />
[[StandardSideFilter|filter_side]],<br />
[[AbilitiesWML|filter_student]], <br />
[[FilterWML#Filtering_Vision|filter_vision]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_weapon]], <br />
[[FilterWML#Filtering_on_WML_data|filter_wml]],<br />
[[InternalActionsWML#.5Bfind_path.5D|find_path]],<br />
[[InternalActionsWML#.5Bfire_event.5D|fire_event]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|firststrike]], <br />
[[InterfaceActionsWML#.5Bfloating_text.5D|floating_text]],<br />
[[ConditionalActionsWML#.5Bfound_item.5D|found_item]],<br />
[[ConditionalActionsWML#.5Bfor.5D|for]],<br />
[[ConditionalActionsWML#.5Bforeach.5D|foreach]],<br />
[[AnimationWML#Frames|frame]];<br />
|-<br />
|''G:'' <br />
[[GameConfigWML|game_config]],<br />
[[PersistenceWML|get_global_variable]],<br />
[[AiWML#The_.5Bgoal.5D_Tag|goal]],<br />
[[DirectActionsWML#.5Bgold.5D|gold]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|gold_carryover]];<br />
|-<br />
|''H:'' <br />
[[DirectActionsWML#.5Bharm_unit.5D|harm_unit]],<br />
[[StandardSideFilter|has_ally]], <br />
[[StandardUnitFilter|has_attack]],<br />
[[StandardSideFilter|has_unit]], <br />
[[ConditionalActionsWML#.5Bhas_achievement.5D|has_achievement]],<br />
[[ConditionalActionsWML#.5Bhave_location.5D|have_location]],<br />
[[ConditionalActionsWML#.5Bhave_unit.5D|have_unit]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|heal_on_hit]], <br />
[[DirectActionsWML#.5Bheal_unit.5D|heal_unit]],<br />
[[AnimationWML#healed|healed_anim]], <br />
[[AnimationWML#healing|healing_anim]], <br />
[[AbilitiesWML|heals]], <br />
[[UnitsWML#.5Bhide_help.5D|hide_help]],<br />
[[InterfaceActionsWML#.5Bhide_unit.5D|hide_unit]],<br />
[[AbilitiesWML|hides]];<br />
|-<br />
|''I:'' <br />
[[AnimationWML#idling|idle_anim]], <br />
if&nbsp;([[ConditionalActionsWML#.5Bif.5D|action]], [[AnimationWML#.5Bif.5D_and_.5Belse.5D|animation]], [[IntroWML|intro]]),<br />
[[AbilitiesWML|illuminates]], <br />
image&nbsp;([[IntroWML#.5Bimage.5D|intro]], [[TerrainGraphicsWML|terrain]]),<br />
[[ReplayWML|init_side]],<br />
[[InternalActionsWML#.5Binsert_tag.5D|insert_tag]],<br />
[[InterfaceActionsWML#.5Binspect.5D|inspect]],<br />
[[InterfaceActionsWML#.5Bitem.5D|item]],<br />
[[EditorWML#The_.5Bitem_group.5D_tag|item_group]];<br />
|-<br />
|''J:''<br />
[[UnitsWML#.5Bmovetype.5D|jamming_costs]],<br />
[[InternalActionsWML#.5Bset_variable.5D|join]];<br />
|-<br />
|''K:'' <br />
[[DirectActionsWML#.5Bkill.5D|kill]],<br />
[[StatisticalScenarioWML|killed]];<br />
|-<br />
|''L:'' <br />
[[InterfaceActionsWML#.5Blabel.5D|label]],<br />
[[LanguageWML|language]],<br />
[[SideWML|leader]],<br />
[[AiWML#List_of_AI_Aspects|leader_goal]],<br />
[[AbilitiesWML|leadership]], <br />
[[AnimationWML#leading|leading_anim]], <br />
[[AnimationWML#levelin|levelin_anim]],<br />
[[AnimationWML#levelout|levelout_anim]], <br />
[[DirectActionsWML#.5Blift_fog.5D|lift_fog]],<br />
[[AI_Recruitment#Aspect_recruitment_instructions|limit]],<br />
[[InternalActionsWML#.5Bset_variables.5D|literal]],<br />
[[AddonsWML|load_resource]],<br />
[[LocaleWML|locale]],<br />
[[InterfaceActionsWML#.5Block_view.5D|lock_view]],<br />
[[LuaWML|lua]];<br />
|-<br />
|''M:'' <br />
[[UnitTypeWML#Other_tags|male]], <br />
[[SavefileWML|menu_item]], <br />
[[InterfaceActionsWML#.5Bmessage.5D|message]],<br />
[[Micro AIs|micro_ai]],<br />
[[AnimationWML#The_content_of_a_frame|missile_frame]],<br />
[[ModificationWML|modification]],<br />
[[SingleUnitWML|modifications]],<br />
[[DirectActionsWML#.5Bmodify_ai.5D|modify_ai]],<br />
[[DirectActionsWML#.5Bmodify_side.5D|modify_side]],<br />
[[DirectActionsWML#.5Bmodify_turns.5D|modify_turns]],<br />
[[DirectActionsWML#.5Bmodify_unit.5D|modify_unit]],<br />
[[AddonsWML|modify_unit_type]],<br />
[[ReplayWML|move]],<br />
[[DirectActionsWML#.5Bmove_unit.5D|move_unit]],<br />
[[InterfaceActionsWML#.5Bmove_unit_fake.5D|move_unit_fake]],<br />
[[InterfaceActionsWML#.5Bmove_units_fake.5D|move_units_fake]],<br />
[[AnimationWML#movement|movement_anim]], <br />
[[UnitsWML#.5Bmovetype.5D|movement costs]],<br />
[[UnitsWML#.5Bmovetype.5D|movetype]],<br />
[[ScenarioWML|multiplayer]],<br />
[[EraWML#Defining_Factions|multiplayer_side]],<br />
[[MusicListWML#.5Bmusic.5D|music]];<br />
|-<br />
|''N:'' <br />
[[ConditionalActionsWML#Meta-Condition_Tags|not]], <br />
[[InterfaceActionsWML#.5Bobjectives.5D|note]];<br />
|-<br />
|''O:'' <br />
[[DirectActionsWML#.5Bobject.5D|object]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|objective]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|objectives]],<br />
[[DirectActionsWML#.5Bon_undo.5D|on_undo]],<br />
[[InterfaceActionsWML#.5Bopen_help.5D|open_help]],<br />
[[InterfaceActionsWML#.5Bmessage.5D|option]],<br />
[[OptionWML|options]],<br />
[[ConditionalActionsWML#Meta-Condition_Tags|or]];<br />
|-<br />
|''P:'' <br />
[[IntroWML|part]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|petrifies]], <br />
[[DirectActionsWML#.5Bpetrify.5D|petrify]], <br />
[[DirectActionsWML#.5Bplace_shroud.5D|place_shroud]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|plague]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|poison]], <br />
[[UnitTypeWML#Other_tags|portrait]], <br />
[[AnimationWML#post_movement|post_movement_anim]], <br />
[[AnimationWML#pre_movement|pre_movement_anim]], <br />
[[InternalActionsWML#.5Bfire_event.5D|primary_attack]], <br />
[[InternalActionsWML#.5Bfire_event.5D|primary_unit]], <br />
[[InterfaceActionsWML#.5Bprint.5D|print]], <br />
[[DirectActionsWML#.5Bprogress_achievement.5D|progress_achievement]], <br />
[[DirectActionsWML#.5Bput_to_recall_list.5D|put_to_recall_list]];<br />
|-<br />
|''R:'' <br />
[[UnitsWML#.5Brace.5D|race]], <br />
[[InternalActionsWML#.5Brandom_placement.5D|random_placement]], <br />
recall&nbsp;([[DirectActionsWML#.5Brecall.5D|action]], [[ReplayWML|replay]]), <br />
[[StatisticalScenarioWML|recalls]],<br />
[[ReplayWML|recruit]], <br />
[[AnimationWML#recruited|recruit_anim]], <br />
[[AnimationWML#recruiting|recruiting_anim]], <br />
[[StatisticalScenarioWML|recruits]], <br />
[[InterfaceActionsWML#.5Bredraw.5D|redraw]],<br />
[[AbilitiesWML|regenerate]],<br />
[[InternalActionsWML#.5Bremove_event.5D|remove_event]],<br />
[[InterfaceActionsWML#.5Bremove_item.5D|remove_item]], <br />
[[DirectActionsWML#.5Bremove_object.5D|remove_object]], <br />
[[DirectActionsWML#.5Bremove_shroud.5D|remove_shroud]], <br />
[[InterfaceActionsWML#.5Bremove_sound_source.5D|remove_sound_source]], <br />
[[DirectActionsWML#.5Bremove_time_area.5D|remove_time_area]], <br />
[[DirectActionsWML#.5Bremove_trait.5D|remove_trait]],<br />
[[InterfaceActionsWML#.5Bremove_unit_overlay.5D|remove_unit_overlay]],<br />
[[ConditionalActionsWML#.5Brepeat.5D|repeat]],<br />
[[DirectActionsWML#.5Breplace_map.5D|replace_map]], <br />
[[DirectActionsWML#.5Breplace_schedule.5D|replace_schedule]], <br />
[[ReplayWML|replay]], <br />
[[SavefileWML|replay_start]],<br />
[[DirectActionsWML#.5Breset_fog.5D|reset_fog]], <br />
resistance&nbsp;([[AbilitiesWML|ability]], [[UnitsWML#.5Bmovetype.5D|unit]]),<br />
[[UnitsWML#.5Bresistance_defaults.5D|resistance_defaults]],<br />
[[ModificationWML#The_.5Bresource.5D_toplevel_tag|resource]],<br />
[[InternalActionsWML#Flow_control_actions|return]],<br />
[[InternalActionsWML#.5Brole.5D|role]], <br />
[[TerrainMaskWML|rule]];<br />
|-<br />
|''S:'' <br />
[[SavefileWML|save]], <br />
[[ScenarioWML|scenario]],<br />
[[InterfaceActionsWML#.5Bscreen_fade.5D|screen_fade]], <br />
[[InterfaceActionsWML#.5Bscroll.5D|scroll]], <br />
[[InterfaceActionsWML#.5Bscroll_to.5D|scroll_to]],<br />
[[InterfaceActionsWML#.5Bscroll_to_unit.5D|scroll_to_unit]], <br />
[[InternalActionsWML#.5Bfire_event.5D|secondary_attack]], <br />
[[InternalActionsWML#.5Bfire_event.5D|secondary_unit]], <br />
[[HelpWML|section]], <br />
[[InterfaceActionsWML#.5Bselect_unit.5D|select_unit]], <br />
[[ReplayWML|sequence]], <br />
[[DirectActionsWML#.5Bset_achievement.5D|set_achievement]],<br />
[[DirectActionsWML#.5Bset_extra_recruit.5D|set_extra_recruit]],<br />
[[PersistenceWML|set_global_variable]],<br />
[[InterfaceActionsWML#.5Bset_menu_item.5D|set_menu_item]], <br />
[[DirectActionsWML#.5Bset_recruit.5D|set_recruit]],<br />
[[EffectWML|set_specials]], <br />
[[InternalActionsWML#.5Bset_variable.5D|set_variable]], <br />
[[InternalActionsWML#.5Bset_variables.5D|set_variables]], <br />
[[AnimationWML#sheath_weapon|sheath_weapon_anim]], <br />
show_if&nbsp;([[InterfaceActionsWML#.5Bmessage.5D|message]], <br />
[[InterfaceActionsWML#.5Bobjectives.5D|objective]], <br />
[[InterfaceActionsWML#.5Bset_menu_item.5D|set_menu_item]]),<br />
[[InterfaceActionsWML#.5Bshow_objectives.5D|show_objectives]],<br />
[[SideWML|side]], <br />
[[AbilitiesWML|skirmisher]], <br />
[[OptionWML|slider]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|slow]], <br />
[[SavefileWML|snapshot]],<br />
[[InterfaceActionsWML#.5Bsound.5D|sound]], <br />
[[InterfaceActionsWML#.5Bsound_source.5D|sound_source]], <br />
source&nbsp;([[ReplayWML|replay]], [[DirectActionsWML#.5Btunnel.5D|teleport]]),<br />
[[UnitTypeWML#Other_tags|special_note]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|specials]], <br />
[[InternalActionsWML#.5Bset_variables.5D|split]],<br />
[[Wesnoth_AI_Framework#Available_Stages|stage]], <br />
[[AnimationWML#standing|standing_anim]], <br />
[[StatisticalScenarioWML#The_.5Bstatistics.5D_tag|statistics]],<br />
[[SingleUnitWML|status]], <br />
[[InternalActionsWML#.5Bstore_gold.5D|store_gold]], <br />
[[InternalActionsWML#.5Bstore_items.5D|store_items]], <br />
[[InternalActionsWML#.5Bstore_locations.5D|store_locations]],<br />
[[InternalActionsWML#.5Bstore_map_dimensions.5D|store_map_dimensions]],<br />
[[InternalActionsWML#.5Bstore_reachable_locations.5D|store_reachable_locations]],<br />
[[InternalActionsWML#.5Bstore_relative_direction.5D|store_relative_direction]],<br />
[[InternalActionsWML#.5Bstore_side.5D|store_side]], <br />
[[InternalActionsWML#.5Bstore_starting_location.5D|store_starting_location]], <br />
[[InternalActionsWML#.5Bstore_time_of_day.5D|store_time_of_day]], <br />
[[InternalActionsWML#.5Bstore_turns.5D|store_turns]], <br />
[[InternalActionsWML#.5Bstore_unit.5D|store_unit]], <br />
[[InternalActionsWML#.5Bstore_unit_defense.5D|store_unit_defense]], <br />
[[InternalActionsWML#.5Bstore_unit_defense_on.5D|store_unit_defense_on]], <br />
[[InternalActionsWML#.5Bstore_unit_type.5D|store_unit_type]], <br />
[[InternalActionsWML#.5Bstore_unit_type_ids.5D|store_unit_type_ids]], <br />
[[InternalActionsWML#.5Bstore_villages.5D|store_villages]], <br />
[[IntroWML|story]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|swarm]], <br />
[[AchievementsWML|sub_achievement]],<br />
[[ConditionalActionsWML#.5Bswitch.5D|switch]],<br />
[[InternalActionsWML#.5Bsync_variable.5D|sync_variable]];<br />
|-<br />
|''T:'' <br />
[[DirectActionsWML#.5Btunnel.5D|target]], <br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|team]],<br />
teleport&nbsp;([[AbilitiesWML|ability]], [[DirectActionsWML#.5Bteleport.5D|action]]),<br />
[[AnimationWML#pre_teleport|teleport_anim]],<br />
[[DirectActionsWML#.5Bterrain.5D|terrain]], <br />
[[UnitsWML#.5Bterrain_defaults.5D|terrain_defaults]],<br />
[[TerrainGraphicsWML|terrain_graphics]], <br />
[[TerrainMaskWML|terrain_mask]], <br />
[[TerrainWML|terrain_type]], <br />
[[ScenarioWML#The_.5Btest.5D_tag|test]],<br />
[[InterfaceActionsWML#.5Btest_condition.5D|test_condition]],<br />
[[InterfaceActionsWML#.5Bmessage.5D|text_input]], <br />
[[GettextForWesnothDevelopers#The_textdomain_tag|textdomain]],<br />
[[ThemeWML|theme]],<br />
[[ConditionalActionsWML#.5Bif.5D|then]],<br />
[[TerrainGraphicsWML|tile]], <br />
[[TimeWML|time]], <br />
[[DirectActionsWML#.5Btime_area.5D|time_area]], <br />
[[HelpWML|topic]], <br />
[[HelpWML|toplevel]], <br />
[[UnitsWML#.5Btrait.5D|trait]], <br />
[[DirectActionsWML#.5Btransform_unit.5D|transform_unit]], <br />
[[InternalActionsWML#.5Bfind_path.5D|traveler]], <br />
[[ConditionalActionsWML#.5Btrue.5D|true]],<br />
[[DirectActionsWML#.5Btunnel.5D|tunnel]];<br />
|-<br />
|''U:'' <br />
[[InterfaceActionsWML#.5Bunhide_unit.5D|unhide_unit]], <br />
[[SingleUnitWML|unit]],<br />
[[InterfaceActionsWML#.5Bunit_overlay.5D|unit_overlay]], <br />
[[UnitTypeWML|unit_type]], <br />
[[InternalActionsWML#.5Bunit_worth.5D|unit_worth]], <br />
[[UnitsWML|units]],<br />
[[InterfaceActionsWML#.5Bunlock_view.5D|unlock_view]],<br />
[[DirectActionsWML#.5Bunpetrify.5D|unpetrify]], <br />
[[DirectActionsWML#.5Bunstore_unit.5D|unstore_unit]],<br />
[[InternalActionsWML#.5Bunsynced.5D|unsynced]];<br />
|-<br />
| ''V:'' <br />
[[InternalActionsWML#.5Bset_variables.5D|value]], <br />
[[ConditionalActionsWML#.5Bvariable.5D|variable]],<br />
[[VariablesWML#The_.5Bvariables.5D_tag|variables]],<br />
[[TerrainGraphicsWML|variant]],<br />
[[UnitTypeWML#Other_tags|variation]], <br />
[[AnimationWML#victory|victory_anim]], <br />
[[SideWML|village]],<br />
[[UnitsWML#.5Bmovetype.5D|vision_costs]],<br />
[[InterfaceActionsWML#.5Bvolume.5D|volume]];<br />
|-<br />
| ''W:'' <br />
[[ConditionalActionsWML#.5Bwhile.5D|while]],<br />
[[InterfaceActionsWML#.5Bwml_message.5D|wml_message]],<br />
[[SchemaWML|wml_schema]];<br />
|-<br />
| ''Z:''<br />
[[InterfaceActionsWML#.5Bzoom.5D|zoom]];<br />
|}<includeonly>[[Category:WML Reference]]</includeonly><noinclude>A box with all the WML tags, each one linking to the page and section they are described in. This box should be included in each of the WML reference pages.</noinclude></div>Octalothttps://wiki.wesnoth.org/index.php?title=Typography_Style_Guide&diff=71439Typography Style Guide2023-06-14T06:04:06Z<p>Octalot: /* Race names */ New section with the capitalisation rules</p>
<hr />
<div>This style guide describes how character dialogue within campaigns should be marked up. For dialogue within the Wesnoth game user interface, see the [[UI Style Guide]]. For C coding guidelines, see the [[CodingStandards]]. For WML coding, see the [[WML Style Guide]]. For a general writing style guide for Wesnoth campaigns, see esr's Campaign Design How-To, http://www.catb.org/~esr/wesnoth/campaign-design-howto.html This guide covers storyboarding, plotting and adding flavour, as well as advice on map design, balance, and some of the pitfalls to avoid.<br />
<br />
Note: Many of these areas are no longer particularly typography-related. They will be moved to a separate writing style guide before too long. [[User:Simons Mith|Simons Mith]] 13:16, 19 August 2010 (UTC)<br />
<br />
==References==<br />
<br />
# http://www.alistapart.com/articles/emen/ The Trouble with Em and En (and Other Shady Characters)<br />
# http://en.wikipedia.org/wiki/Hyphen<br />
# http://en.wikipedia.org/wiki/Dash<br />
# http://en.wikipedia.org/wiki/Ellipsis<br />
# http://en.wikipedia.org/wiki/Quotation_mark<br />
# http://en.wikipedia.org/wiki/Title_case#Choice_of_case_in_text<br />
<br />
==Character Usage Summary==<br />
<br />
'''Dashes'''<br />
<br />
en dash: &#x2013; U+2013 (8211)<br />
em dash: &#x2014; U+2014 (8212)<br />
horizontal bar: &#x2015; U+2015 (8213) AKA quotation dash<br />
minus sign: &#x2212; U+2212 (8722)<br />
<br />
'''Quotes and Apostrophes'''<br />
<br />
left single quote: &#x2018; U+2018 (8216)<br />
right single quote: &#x2019; U+2019 (8217) same character as curly apostrophe<br />
left double quote: &#x201C; U+201C (8220)<br />
right double quote: &#x201D; U+201D (8221)<br />
curly apostrophe: &#x2019; U+2019 (8217) same character as right single quote<br />
<br />
'''Other Characters (for reference)'''<br />
<br />
ellipsis: &#x2026; U+2026 (8230) not used at present, use three full stops<br />
hyphen: &#x2010; U+2010 (8208) actual hyphen character, not used at present<br />
hyphen-minus is OK in the standard Wesnoth font<br />
<br />
'''Characters being removed from within US-English dialogs'''<br />
<br />
hyphen-minus - replace with U+2013, U+2014, U+2015, U+2212 as appropriate<br />
straight apostrophe ' same character as single quote, replace with U+2019<br />
unsexed single quote ' same character as straight apostrophe, replace with U+2018 and U+2019 as appropriate<br />
backquote ` shouldn't be present anywhere, replace with U+2018<br />
unsexed double quote " replace with U+201C, U+201D as appropriate<br />
<br />
==Title Case==<br />
<br />
For scenario titles, scenario IDs and filenames, our preferred version of '''title case''' (there are several) is to capitalize all words except for articles, prepositions, and conjunctions. This is the third option listed at http://en.wikipedia.org/wiki/Title_case#Choice_of_case_in_text. (Also shown below):<br />
<br />
'''The Vitamins Are in My Fresh California Raisins'''<br />
<br />
For example, if you had a scenario called ''A Man, an Elf and a Diary'', the scenario filename might be<br />
<br />
04_A_Man_an_Elf_and_a_Diary.cfg<br />
<br />
the corresponding map filename<br />
<br />
04_A_Man_an_Elf_and_a_Diary.map<br />
<br />
and the WML at the start of the scenario file might be<br />
<br />
#textdomain wesnoth-Fate_of_a_Princess<br />
id=04_A_Man_an_Elf_and_a_Diary<br />
name= _ "A Man, an Elf, and a Diary"<br />
<br />
Please apply these guidelines to all scenario filenames, scenario and campaign titles and IDs. For filenames, omit any punctuation and use underscores instead of spaces.<br />
<br />
==Spacing Definitions==<br />
<br />
* 'Unspaced' means no spaces before or after<br />
* 'Spaced' means spaces before and after<br />
* 'Leading space' means a space before, no space after<br />
* 'Trailing space' means a space after, but no space before<br />
<br />
If the space is the first character after an open quotation, or the last character before a close quotation, it should be omitted. This means 'unspaced' elements will be unaltered, 'spaced' elements will become either leading- or trailing-spaced elements, and leading- or trailing-spaced elements may be unaltered, or may become unspaced.<br />
<br />
==Dashes==<br />
<br />
'''Em Dash'''<br />
<br />
"And now&#x2014; An unexpected interruption!"<br />
(trailing space em dash U+2014)<br />
<br />
"&#x2014;What was that?!"<br />
(leading space em dash U+2014)<br />
(abrupt start to a sentence)<br />
<br />
"commands great respect &#x2014; especially among soldiers"<br />
(spaced em dash U+2014)<br />
<br />
"Somewhere in this sentence&#x2014;no need to guess where&#x2014;is a parenthetical thought."<br />
(''paired'' unspaced em dashes U+2014)<br />
<br />
In character dialogue you can use parentheses instead of paired spaced em dashes, but in speech the dashes are slightly more preferable.<br />
<br />
'''En Dash'''<br />
<br />
"The trident is 14&#x2013;2"<br />
(unspaced en dash U+2013)<br />
(weapon attack statistics)<br />
<br />
Things like weapon attack statistics and other game jargon should not be used in any dialogue spoken by a character.<br />
<br />
high-priority&#x2013;high-pressure tasks<br />
(unspaced en dash U+2013)<br />
(hyphenating compound words &ndash; in this case tasks which are both high-priority and high-pressure)<br />
<br />
"S&#x2013;gn&#x2013;d, D&#x2013;lf&#x2013;do&#x2013;"<br />
(unspaced en dash U+2013)<br />
(marking missing letters in a fragment of text)<br />
<br />
These usages are all very rare in scenario dialogue.<br />
<br />
'''Horizontal Bar'''<br />
<br />
text=_"Gee, look at all them Injuns!"<br />
source=_"&#x2015; General Custer, 1876"<br />
(spaced horizontal bar U+2015)<br />
<br />
This is a sample quotation from tips.cfg; there are no instances of this usage in scenario dialogue at present.<br />
<br />
'''Minus Sign'''<br />
<br />
"&#x2212;25%"<br />
(outside of equations use leading space minus sign U+2212)<br />
(sample from english.cfg; extremely rare in scenario dialog)<br />
<br />
In speech, the word 'minus' should be written out in full; only game-specific scenario-related sentences should use the minus symbol inside scenario dialogue text.<br />
<br />
'''Hyphen Minus'''<br />
<br />
"Assemble a war-party"<br />
(unspaced hyphen-minus)<br />
(ordinary hyphen minus from the keyboard)<br />
<br />
Note that there are no plans at present to use the genuine unicode hyphen &#x2010; U+2010<br />
<br />
==Ellipses==<br />
<br />
There is a Unicode ellipsis symbol, &#x2026; U+2026, but at present we are using three full stops because in the standard Wesnoth font it looks basically the same. For our purposes, the non-speech uses of ellipsis &ndash; typically for quoting extracts of text, are very unlikely to be relevant. Please see references 1 and 4 for more details if you need information on this area. Normally an ellipsis should be spaced to separate it from the text, but when it combines with other punctuation, the leading space disappears and the other punctuation follows. For pauses in mid-word, use unspaced ellipses. For speech in the Wesnoth game, a trailing space is usually the most appropriate option. Examples:<br />
<br />
alpha ... beta<br />
(used for missing words in a quoted section of text)<br />
gamma, ... delta<br />
(missing words, mixed with punctuation)<br />
(both very rare in dialogue)<br />
<br />
epsilon...<br />
(a word fading away to nothing)<br />
(by far the most common usage in the Wesnoth game)<br />
<br />
eta... theta<br />
(a pause between words, or speech fading away from one word to the next)<br />
(also common)<br />
<br />
io...ta<br />
(mid-word)<br />
(not uncommon)<br />
<br />
kappa...?<br />
lambda...!<br />
mu..., nu<br />
(a pause or a fading away, mixed with some punctuation)<br />
(not uncommon)<br />
<br />
omicron....<br />
(words removed from the end of a sentence, so there's a full stop)<br />
(full stop counts as punctuation, so the spaces around the ellipsis are removed, giving four dots)<br />
<br />
# Outside of speech, an ellipsis is most often used to indicate one or more missing words in a quotation.<br />
# In speech, it most often represents a pause of some kind.<br />
# Missing or unintelligible words can also be represented with an ellipsis. <br />
# When an ellipsis occurs at the end of a sentence, it should be treated in one of three ways, depending on usage:<br />
## If the ellipsis is being used to indicate one or missing ''words'', it should be followed by a period.<br />
## If it indicates one or more missing ''sentences'', then it should appear after the period of the preceding sentence, and with a space on either side.<br />
## If it indicates that the thought or quote is just trailing off at the end of a sentence (''no'' missing words), then only the ellipsis is used, without a closing period.<br />
<br />
Usages 4.1 and 4.2 are very rare in Wesnoth dialogue. 99% of the time, we follow usage 4.3. This means you would probably only have four dots (ellipsis plus full stop) if a character was talking or quoting at length and you cut off the character's speech partway through. In normal speech, four dots will almost always be incorrect. Similarly, there is no such thing as a five-dot (or more) ellipsis, so using any more than three dots will probably be wrong. Chinese and Japanese can use six- and variable numbers of dots respectively, but that doesn't mean we can in US-English.<br />
<br />
Examples:<br />
<br />
"Now, listen carefully. This is a very long and complicated document:<br />
&#x201C;Firstly, all beer barrels shall be marked with His Majesty's Royal Seal.<br />
&#x201C;Secondly, all dogs shall wear spiked metal collars....&#x201D;"<br />
(usage 4.1)<br />
(technically correct, but long screeds of text are bad practice in scenario dialogue anyway)<br />
<br />
"Dear friends, we are gathered here today to celebrate the many achievements of me,<br />
Delfador the Wise, the Noble, the handsome, he who defeated the dreaded Floating Nose<br />
of the Swamp of Despair, and ate the Sacred Pie of..."<br />
(usage 4.3)<br />
(in this case, speech treated as fading because the ''listener's'' attention has wandered)<br />
<br />
==Usages in Speech==<br />
<br />
As far as this style guide is concerned, 'Speech' pretty much exclusively means in the campaign dialogue stored in Wesnoth's .cfg files. Usages in the online help, the user guide, the game's user interface and so on are separate (but related) matters.<br />
<br />
==The Difference Between Ellipses and Dashes in Speech==<br />
<br />
In speech, an ellipsis with a trailing space represents an indefinite or variable pause, or a character's words fading away to nothing, and an unspaced ellipsis represents an indefinite or variable pause in mid-word. An em dash represents an intentional pause, or an abrupt cut-off, possibly in mid-word. So that's the basic difference for Wesnoth's purposes; abrupt, use a dash, fading, use ellipsis.<br />
<br />
===Ellipses in Speech===<br />
<br />
If you start a character's speech with an ellipsis, it needs a trailing space:<br />
<br />
"... Haldric?"<br />
(trailing space ellipsis)<br />
(tentative inquiry)<br />
<br />
When mixed in with punctuation, the trailing space is lost:<br />
<br />
"And that reason would be...?"<br />
(unspaced ellipsis)<br />
(leading question)<br />
<br />
If a character is dying, their speech might fade away as follows:<br />
<br />
"Urgh! I go on to the Sunlit Lands..."<br />
(trailing space ellipsis)<br />
<br />
For a character struggling to speak, you would normally use trailing space ellipses:<br />
<br />
"Urgh! I go... on... to... the... Sunlit... Lands..."<br />
<br />
You can fade away or pause in mid-word if you want, but generally only in longer words. Again, use only sparingly:<br />
<br />
"Anti...disestab...lish...ment...arian..."<br />
(unspaced ellipsis)<br />
<br />
Mixing these makes a character's speech appear even more irregular, but may look untidy or incorrect even when it's intentional. Use sparingly:<br />
<br />
"Urgh! I go on... to... the... Sun...lit... Lands..."<br />
<br />
Darken Volk, the necromancer in Descent into Darkness, uses a lot of pauses in his conversation as he searches for just the right word:<br />
<br />
"The northlands have been my... home... for many years,"<br />
(trailing space ellipsis)<br />
<br />
If a non-speaking character needs a moment in the spotlight, you can use an ellipsis for a wordless pause. Use sparingly:<br />
<br />
"..."<br />
(trailing space ellipsis)<br />
<br />
===Dashes in Speech===<br />
<br />
Dashes are used for abrupt or intentional interruptions, including when a character 'interrupts himself' by making an aside or changing who he is talking to in mid-sentence.<br />
<br />
"You can't kill me! I am invinc&#x2014;"<br />
(trailing space em dash U+2014)<br />
<br />
"Delfador, my friend &#x2014; Li'sar, the book, if you please &#x2014; would you mind looking at this strange old tome we found?"<br />
(spaced em dash U+2014)<br />
(two changes in who he's talking to, so two spaced em dashes)<br />
<br />
"Delfador, old friend&#x2014; ''Down, Fyrax!'' &#x2014; Don't worry, he's harmless&#x2014; Now, where was I?"<br />
(trailing space and spaced em dashes U+2014)<br />
(a mixed combination of interruptions and changes in who is being addressed)<br />
<br />
"&#x2014;What was that?!"<br />
(leading space em dash U+2014)<br />
(abrupt)<br />
<br />
Theoretically, a short, sharp, but significant wordless pause could be marked with an em dash. However, the Wesnoth user interface is too sluggish to represent this properly, because you have to click or press keys to step through dialogue. For this reason, we advise against using it.<br />
<br />
"&#x2014;"<br />
(spaced em dash U+2014)<br />
<br />
==Emphasis in Speech==<br />
<br />
We can now use bold and italic HTML-style markup inside WML tags. We use the Pango markup language, which is ''similar'' to HTML, but not exactly the same. I recommend adopting the use of Pango markup as promptly as possible. A quick overview is available here: http://www.pygtk.org/docs/pygtk/pango-markup-language.html<br />
<br />
* For specialised game jargon terms, which should never be spoken in-character, use &lt;i&gt;''i tags''&lt;/i&gt;: 'Your units are &lt;i&gt;''chaotic''&lt;/i&gt;. Your enemies, the elves, are &lt;i&gt;''neutral''&lt;/i&gt;.' However, you don't have to italicise every instance of a game term. When introducing an important new concept, italicise it the first time, then just refer to it normally. This mostly applies to tutorial-style scenarios. When introducing items or units with special abilities in ordinary scenarios, use italics to highlight the special feature(s): 'This enchanted spear inflicts &lt;i&gt;''arcane''&lt;/i&gt; damage.' 'Your new recruit has the &lt;i&gt;''diehard''&lt;/i&gt; ability, which means....' <br />
<br />
* For user interface features, such as buttons, menu options and key shortcuts, use &lt;b&gt;'''b tags'''&lt;/b&gt;. 'To undo a move, press the &lt;b&gt;'''u'''&lt;/b&gt; key.' 'Click the &lt;b&gt;'''End Turn'''&lt;/b&gt;' button in the bottom right of the game window.'<br />
<br />
* For emphatic speech by characters, and in-character use of jargon, (for example, if a human wizard used a word in the Drakish language), use &lt;i&gt;''i tags''&lt;/i&gt;. This method is also used for the titles of campaigns or scenarios; &lt;i&gt;''The South Guard''&lt;/i&gt;, &lt;i&gt;''A Choice Must be Made''&lt;/i&gt;, and so on.<br />
<br />
* For shouting, either continue to use CAPITAL LETTERS, as now, or consider switching to the use of &lt;big&gt;<big>big tags</big>&lt;/big&gt; instead. Which to use is going to be the author's decision, and may vary from campaign to campaign. Whichever you choose, be consistent throughout the campaign. Use of capitals for shouting is a reasonably well-established practice, but please use it infrequently, because it can become irritating when overused.<br />
<br />
Note for editors: In the current campaign texts, some instances of capitals should be switched to &lt;i&gt; tags, while others should become &lt;big&gt; tags instead. However, there is likely to be some text remaining in all capitals after these adjustments.<br />
<br />
Note also that 1.9.0 provides some macros to do standardised formatting for you: see data/core/macros/interface-utils.cfg, which provides the following:<br />
<br />
#define WHISPER TEXT<br />
"&lt;small&gt;(" + {TEXT} + ")&lt;/small&gt;"#enddef<br />
<br />
#define ASIDE TEXT<br />
"&lt;i&gt;(" + {TEXT} + ")&lt;/i&gt;"#enddef<br />
<br />
#define CAPTION TEXT<br />
"&lt;span color='#bcb088'&gt;&lt;b&gt;" + {TEXT} + "&lt;/b&gt;&lt;/span&gt;<br />
<br />
... and could easily be expanded for SHOUT, ACTION and any other special markup that might be desired.<br />
<br />
* For larger text, which might be used for headings, or in place of capital letters use &lt;big&gt;<big>big tags</big>&lt;/big&gt;.<br />
<br />
* For whispered text and asides, try &lt;small&gt;&lt;i&gt;<small>''(combined small and i tags, inside parentheses)''</small>&lt;/small&gt;&lt;/i&gt;. (This usage TBC.)<br />
<br />
==Apostrophes==<br />
<br />
Apostrophes are easy; just use a right single quote for a curly apostrophe; it's the same character in Unicode (&#x2019; U+2019)<br />
<br />
==Quotes in Speech==<br />
<br />
We are adopting the standard of '<i>logical punctuation</i>', where the practice is to include within quotation marks only those punctuation marks that appeared in the quoted material. Otherwise punctuation is placed outside the closing quotation marks. See reference 5 above, particularly the Punctuation section (also linked here: http://en.wikipedia.org/wiki/Quotation_mark#Punctuation). This is as distinct from the US 'traditional punctuation' style, where full stops and commas tend to appear inside the quotation marks even if they are not part of the quote. Note that ''in fiction'', it's rare for there to be any actual difference between the two styles.<br />
<br />
Characters mentioning words or names (as opposed to using them) will usually use sexed single quotes:<br />
<br />
"Who is this &#x2018;Mal-Ravanal&#x2019; fellow?"<br />
<br />
"Calm down, soldier! Who is this 'they' you are speaking of?"<br />
<br />
When a character is reporting someone else's exact words, this is a rare occasion when double quotes would be used:<br />
<br />
"Lord Aryad said, &#x201C;If more trouble follows them here we should let them fight it out,<br />
then we should &#x2018;deal&#x2019; with the survivors, and make a compromise with the Dwarves.&#x201D;"<br />
<br />
Referring to the second example above, <br />
<br />
"Calm down, soldier! Who is this &#x201C;they&#x201D; you are speaking of?"<br />
<br />
could also be justified, but with a difference in emphasis; the form with double quotes emphasizes that the speaker is quoting a previous utterance of the soldier, whereas the first form emphasizes the indefiniteness of the language the soldier used.<br />
<br />
==Numbers in Speech==<br />
<br />
In ''game-specific'' dialogues, always write numbers as numbers:<br />
"The Elvish Fighter has a 5&ndash;4 ''melee'' attack."<br />
"You gain 500 gold!"<br />
<br />
In ''character'' dialogues, write numbers below ten as words, and numbers above twelve as numbers. If it's a ''round'' number above 12, you may continue to write it in words:<br />
"Five gold pieces"<br />
"Five hundred gold pieces"<br />
"Ten thousand orcs"<br />
"572 gold pieces"<br />
"43 trolls"<br />
<br />
The numbers 10&ndash;12 represent a grey area where you can use either convention as you see fit. As far as possible, you should avoid mixing words and numbers in a single dialogue:<br />
<br />
"We have only 7 warriors remaining, but the enemy has 33 orcs and 14 trolls."<br />
<br />
Write complex number ranges as numbers separated with an en dash (U+2013). Write simple number ranges as words:<br />
"35-50 elves"<br />
"Between five and eight years, Sire."<br />
<br />
==Sound Effects==<br />
<br />
'Sound effects' includes maniacal laughter, characters' death noises &ndash; usually variations on the theme of 'Argh!' and other non-words. The main guideline is to tone these down somewhat; don't use 'Aaaaaarrrrrrgggggghhhhhhh!!!!!', be content with 'AAaargh!'. Maniacal laughter, no matter how maniacal, should only have 3&ndash;4 HAs in it, and never more than about 5. 'HAHAHAHA!' will usually be quite sufficient. Feel free to use 'Hmm' or 'Hmmm', but not 'Hmmmmm' or more. As a rough rule of thumb, restrict yourself to a maximum of about 10 letters for random exclamations, and normally 5&ndash;7.<br />
<br />
Similarly, do not use multiple exclamation or question marks. The following combinations are acceptable: !, ?, !?, ?!, ??, !!, but three or more marks really are not. Incidentally, an exclaimed question would be punctuated with ?!, whereas an incredulous statement would be punctuated with !?.<br />
<br />
Don't forget that you can still use &lt;big&gt;, &lt;b&gt; and &lt;i&gt; tags, or use some sort of WML special effect such as the {EARTHQUAKE}, {FLASH_ } or {LIGHTNING_ } macros, possibly with sound or a custom portrait. I would encourage these methods, rather than trying to convey the same thing with nothing more than the keyboard auto-repeat to help you.<br />
<br />
==Wordless Actions==<br />
<br />
When a character performs some unspoken action, such as heaving open a door, sighing, or making some other random sound, and you specifically want to cover that action in the dialogue, use the same style as for stage directions. If the action is mixed in with speech, put it in parentheses and italicise it.<br />
<br />
"(''Sigh'') Very well, I'll send some troops to accompany you."<br />
"What the...? (''Gurgle'') The slaves... are... uprising..."<br />
<br />
If there is no speech at all, you can:<br />
# Assign the entire dialogue to the narrator, in which case no special markup is needed<br />
# Phrase the action as a complete sentences, marked with italics only<br />
# Continue to use parentheses and italics<br />
Examples, in order of preference:<br />
<br />
Speaker: Chantal<br />
(''Cautiously opens the box'')<br />
(usually present tense)<br />
<br />
Speaker: Narrator<br />
Chantal cautiously opened the box.<br />
(usually past tense)<br />
<br />
Speaker: Chantal<br />
''Chantal cautiously opens the box.''<br />
(usually present tense)<br />
<br />
==Race Names==<br />
<br />
Race names should not be capitalised, however unit types are capitalised as if they were proper nouns.<br />
<br />
Examples:<br />
elves, dwarves, orcs<br />
Dwarvish Thunderguard (a unit type)<br />
Northern Elves (proper noun, it refers to a group)<br />
<br />
[[Category:Campaigns_-_Development]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=UI_Style_Guide&diff=71432UI Style Guide2023-06-12T10:14:52Z<p>Octalot: Add new sections for tables of text</p>
<hr />
<div>== User Interface Style Guide ==<br />
<br />
This is a draft style guide covering the Wesnoth game user interface. For general C coding guidelines, see [[CodingStandards]]. There are some typography issues also covered in this guide, but please cross-refer to the [[Typography Style Guide]] as well. <br />
<br />
The Wesnoth UI (user interface) has a mixed setup. Most of the layout and text is stored in WML files in the 'data/gui/' directory tree, which can be altered without having to recompile the program (press F5 on the title screen to rebuild the cache, but for UI you'll likely have to restart Wesnoth before the changes take effect). Part of it is hard-coded within the game's source code, which means you need to be able to at least read C program code to understand what is going on. Removing existing components from a UI dialog will normally require changes to the C code, as it the C code generally treats missing components as an error.<br />
<br />
==General Principles==<br />
<br />
The guiding principle of UI design is to make sure that all windows and icons follow the same style. Buttons and icons are consistent, sliders are always used in the same circumstances for the same reasons, and so on. There are also cases where Wesnoth may deliberately break the theoretical ideal; those are documented here, along with the reasons for doing so.<br />
<br />
===UI Style Violations===<br />
<br />
The game currently has a small number of areas where the UI intentionally breaks 'best practice'. The two main ones are the 'Languages' button on the main screen, and the 'Advanced Preferences' tab.<br />
<br />
'Languages' should really be stored as a sub-menu under the 'Preferences' button, but instead we put it in the main Wesnoth window to make it easier for non-English speakers to find and change the game's language settings.<br />
<br />
'Advanced Preferences' is a scrolling menu with a multi-purpose checkbox which changes its function depending on which advanced preference is selected. This is a coding shortcut to handle a growing number of custom options without having to create the several extra preferences windows that would otherwise be needed.<br />
<br />
A minor niggle is that some of the buttons in the Wesnoth main menu ought to be marked with ellipses because they open sub-windows.<br />
<br />
==Situations==<br />
<br />
===Window Titles===<br />
<br />
Window titles use '''title case''', which means all words are capitalised except for articles, prepositions, and conjunctions. In the standard UI, window titles are in larger text in a gold colour:(Image to follow)<br />
Window titles should be short and declarative, no more than 3-5 words. Do '''not''' use a window title for a question.<br />
<br />
For example, do not use 'Are You Sure You Want to Delete This File?' as a title. Instead, the title should be 'Delete File', or similar, and the ''subhead'' should contain the question.<br />
<br />
If the 'window' is a non-interactive progress bar, a window title is not required.<br />
<br />
If the window is usually non-interactive, but does have a Cancel button, give it a short title.<br />
<br />
Example:<br />
Title: Loading Addons<br />
Subhead: Loading [programmatically generated name of the add-on currently being processed]<br />
<br />
===Window Subheads===<br />
<br />
Window subheads usually contain a single sentence, in larger than usual white text. The subhead should tell the user what to do, or ask them a direct question. When giving an instruction, ideally the first word should be 'Choose', 'Select', 'Delete', 'Load', 'Save', 'Confirm' or similar, and if there's a button the user has to click in order to do whatever-it-is, the verb on the button should match the imperative word used in the subhead.<br />
<br />
If you are asking the user a question, use a question mark. If you are giving the user an instruction, use an imperative form and end with an colon. If you are giving the user information about what the computer is doing, end with an ellipsis.<br />
<br />
Examples:<br />
Title: Language<br />
Subhead: Choose your preferred language:<br />
<br />
Title: Load Game<br />
Subhead: Choose the game to load:<br />
<br />
Title: Delete Game<br />
Subhead: Do you really want to delete this game?<br />
<br />
Title: [None]<br />
Subhead: Loading files and creating cache...<br />
<br />
===Typography Summary===<br />
<br />
Within the UI, there are only a handful of special characters needed. Use the correct Unicode symbol for the minus sign − U+2212 (8722) when listing ToD penalties and resistances, and the en dash – U+2013 (8211) when listing weapon damage/strikes values. These corrections are already in progress throughout the game. Other symbols, such as sexed quotation marks are unlikely to be needed anywhere; refer to the [[Typography Style Guide]] if necessary. We do not currently plan to use the ellipis character … U+2026 (8230), so three dots continues to remain acceptable for an ellipsis. If you want to use more than three dots, to indicate progress, it would be preferable to use a proper progress bar. Otherwise, start with three dots and add extras one at a time.<br />
<br />
===Buttons===<br />
<br />
A button should say what it does with a single verb. The current preferred list of button words is as follows:<br />
<br />
* Back<br />
* Cancel<br />
* Delete<br />
* Load<br />
* Next<br />
* Save<br />
* Select<br />
* (more to follow)<br />
<br />
Please avoid using 'OK' in favour of a specific word indicating what will happen when the button is clicked.<br />
<br />
If clicking a button will open a new window, add an unspaced ellipsis, except on the Wesnoth main menu, where ellipses are never used because it looks untidy.<br />
<br />
===Tables With Columns===<br />
<br />
When data is formatted into columns using separate UI components, for example the in-game Statistics Table, then the labels should not have colons. This also applies to the table headings, for example the in-game Status Table.<br />
<br />
===Tables In Plain Text===<br />
<br />
Sometimes data is concatenated into text, with one "Label: Value" pair on each line, but for some reason it isn't formatted into a table with columns. The label should be in '''sentence case''', unless the label's string is itself data (a terrain type name, damage type, etc).<br />
<br />
For translation, the label should include the colon, but ideally not the whitespace.<br />
_("Weapon range:")<br />
_("Damage type:")<br />
<br />
Alternatively, make the entire line one string using interpolation. This is preferred when the value should include a measurement unit or a percentage sign:<br />
_("Required XP: $xp")<br />
_("Chance to hit: $chance|%")<br />
_("Reward: $amount| gold")<br />
<br />
===Sliders===<br />
<br />
A slider should include a text label on the left describing the value it contains, followed by a colon. The label should be in '''sentence case'''. On the right, the current numeric slider value should be given, ''with units'', if any. The labels and the values should be left-aligned; the sliders should all be vertically aligned with one another. The existing UI widgets library already handles the alignment issues for you. Use the floating tooltip function to explain what the slider is for, the units, and the maximum, minimum and default permissible values. Where the function of the slider is glaringly obvious, you can just provide the minimum, maximum and default values.<br />
<br />
Examples:<br />
<br />
Players: ====|========= 3<br />
Map width: ========|===== 50 hexes<br />
Map height: ======|======= 40 hexes<br />
Hilliness: ===|========== 40<br />
<br />
===Checkboxes===<br />
<br />
Checkbox labels use '''sentence case'''. Use the floating tooltip function to explain what the checkbox is for, if it isn't obvious, and the default value. Do ''not'' just paraphrase the checkbox label text, instead try to answer the question of what a player actually sees when the option is turned on.<br />
<br />
Example:<br />
<br />
Do '''not''' use:<br />
_X_ Floating labels<br />
Tooltip: Turns on floating labels<br />
<br />
Instead use:<br />
_X_ Floating labels<br />
Tooltip: Show floating text above a unit when it is damaged or healed<br />
<br />
===Text Boxes===<br />
<br />
===Menus===<br />
<br />
The game's pull-down menus use '''title case'''. The key shortcut for a function is pulled from the hotkeys configuration file. Related functions should be grouped together. Frequently-used or important functions should be near the top of the list, 'dangerous' functions should be moved to the end of the list. 'Quit' is considered dangerous, which is why it is moved as far wy from the top of the menu as possible. As far as possible, try to ensure that accidentally missing the menu option you wanted to select by one row is harmless. Where no more obvious order is apparent, list items in alphabetical order.<br />
<br />
===Tooltips===<br />
<br />
Tooltips use sentence case, but the last sentence in any tooltip does not have a full stop. Try to add a tooltip to every button. At the very minimum, the tooltip should show either the default value, the current value, or the minimum and maximum values, depending on what is most useful. Where a button or checkbox's function is not immediately obvious, phrase the tooltip to describe what happens when the option is turned '''on'''.<br />
<br />
Tooltips should contain no more than one or two lines of text.<br />
<br />
Examples:<br />
<br />
name=_"Ping timeout (seconds)"<br />
description=_"How long to wait for a ping reply before giving up. 0 means wait indefinitely"<br />
<br />
name=_"Auto-open whisper windows in lobby"<br />
description=_"When you are sent a whisper message, it appears in a pop-up window"<br />
<br />
(WML code)<br />
<br />
===Default Values===<br />
<br />
While it might be nice to display the default value for every checkbox, widget and so on a player might alter, this can make the tooltips needlessly untidy. The recommended practice is not to mindlessly add this information to every tooltip, but to provide it wherever a changed setting could cause unexpected behaviour, or wherever the original value is hard to retrieve. For example, it's easy to tell whether 'Floating Labels' is on or off. On the other hand, the name (and possibly port number) for the default add-on server should be stored in the tooltip, so that a user can restore it if necessary.<br />
<br />
[[Category:Development]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=UI_Style_Guide&diff=71431UI Style Guide2023-06-12T09:11:28Z<p>Octalot: Remove the "for C programmers" vs "for WML programmers" distinction, as most of the C is now WML in GUI2</p>
<hr />
<div>== User Interface Style Guide ==<br />
<br />
This is a draft style guide covering the Wesnoth game user interface. For general C coding guidelines, see [[CodingStandards]]. There are some typography issues also covered in this guide, but please cross-refer to the [[Typography Style Guide]] as well. <br />
<br />
The Wesnoth UI (user interface) has a mixed setup. Most of the layout and text is stored in WML files in the 'data/gui/' directory tree, which can be altered without having to recompile the program (press F5 on the title screen to rebuild the cache, but for UI you'll likely have to restart Wesnoth before the changes take effect). Part of it is hard-coded within the game's source code, which means you need to be able to at least read C program code to understand what is going on. Removing existing components from a UI dialog will normally require changes to the C code, as it the C code generally treats missing components as an error.<br />
<br />
==General Principles==<br />
<br />
The guiding principle of UI design is to make sure that all windows and icons follow the same style. Buttons and icons are consistent, sliders are always used in the same circumstances for the same reasons, and so on. There are also cases where Wesnoth may deliberately break the theoretical ideal; those are documented here, along with the reasons for doing so.<br />
<br />
===UI Style Violations===<br />
<br />
The game currently has a small number of areas where the UI intentionally breaks 'best practice'. The two main ones are the 'Languages' button on the main screen, and the 'Advanced Preferences' tab.<br />
<br />
'Languages' should really be stored as a sub-menu under the 'Preferences' button, but instead we put it in the main Wesnoth window to make it easier for non-English speakers to find and change the game's language settings.<br />
<br />
'Advanced Preferences' is a scrolling menu with a multi-purpose checkbox which changes its function depending on which advanced preference is selected. This is a coding shortcut to handle a growing number of custom options without having to create the several extra preferences windows that would otherwise be needed.<br />
<br />
A minor niggle is that some of the buttons in the Wesnoth main menu ought to be marked with ellipses because they open sub-windows.<br />
<br />
==Situations==<br />
<br />
===Window Titles===<br />
<br />
Window titles use '''title case''', which means all words are capitalised except for articles, prepositions, and conjunctions. In the standard UI, window titles are in larger text in a gold colour:(Image to follow)<br />
Window titles should be short and declarative, no more than 3-5 words. Do '''not''' use a window title for a question.<br />
<br />
For example, do not use 'Are You Sure You Want to Delete This File?' as a title. Instead, the title should be 'Delete File', or similar, and the ''subhead'' should contain the question.<br />
<br />
If the 'window' is a non-interactive progress bar, a window title is not required.<br />
<br />
If the window is usually non-interactive, but does have a Cancel button, give it a short title.<br />
<br />
Example:<br />
Title: Loading Addons<br />
Subhead: Loading [programmatically generated name of the add-on currently being processed]<br />
<br />
===Window Subheads===<br />
<br />
Window subheads usually contain a single sentence, in larger than usual white text. The subhead should tell the user what to do, or ask them a direct question. When giving an instruction, ideally the first word should be 'Choose', 'Select', 'Delete', 'Load', 'Save', 'Confirm' or similar, and if there's a button the user has to click in order to do whatever-it-is, the verb on the button should match the imperative word used in the subhead.<br />
<br />
If you are asking the user a question, use a question mark. If you are giving the user an instruction, use an imperative form and end with an colon. If you are giving the user information about what the computer is doing, end with an ellipsis.<br />
<br />
Examples:<br />
Title: Language<br />
Subhead: Choose your preferred language:<br />
<br />
Title: Load Game<br />
Subhead: Choose the game to load:<br />
<br />
Title: Delete Game<br />
Subhead: Do you really want to delete this game?<br />
<br />
Title: [None]<br />
Subhead: Loading files and creating cache...<br />
<br />
===Typography Summary===<br />
<br />
Within the UI, there are only a handful of special characters needed. Use the correct Unicode symbol for the minus sign − U+2212 (8722) when listing ToD penalties and resistances, and the en dash – U+2013 (8211) when listing weapon damage/strikes values. These corrections are already in progress throughout the game. Other symbols, such as sexed quotation marks are unlikely to be needed anywhere; refer to the [[Typography Style Guide]] if necessary. We do not currently plan to use the ellipis character … U+2026 (8230), so three dots continues to remain acceptable for an ellipsis. If you want to use more than three dots, to indicate progress, it would be preferable to use a proper progress bar. Otherwise, start with three dots and add extras one at a time.<br />
<br />
===Buttons===<br />
<br />
A button should say what it does with a single verb. The current preferred list of button words is as follows:<br />
<br />
* Back<br />
* Cancel<br />
* Delete<br />
* Load<br />
* Next<br />
* Save<br />
* Select<br />
* (more to follow)<br />
<br />
Please avoid using 'OK' in favour of a specific word indicating what will happen when the button is clicked.<br />
<br />
If clicking a button will open a new window, add an unspaced ellipsis, except on the Wesnoth main menu, where ellipses are never used because it looks untidy.<br />
<br />
===Sliders===<br />
<br />
A slider should include a text label on the left describing the value it contains, followed by a colon. The label should be in '''sentence case'''. On the right, the current numeric slider value should be given, ''with units'', if any. The labels and the values should be left-aligned; the sliders should all be vertically aligned with one another. The existing UI widgets library already handles the alignment issues for you. Use the floating tooltip function to explain what the slider is for, the units, and the maximum, minimum and default permissible values. Where the function of the slider is glaringly obvious, you can just provide the minimum, maximum and default values.<br />
<br />
Examples:<br />
<br />
Players: ====|========= 3<br />
Map width: ========|===== 50 hexes<br />
Map height: ======|======= 40 hexes<br />
Hilliness: ===|========== 40<br />
<br />
===Checkboxes===<br />
<br />
Checkbox labels use '''sentence case'''. Use the floating tooltip function to explain what the checkbox is for, if it isn't obvious, and the default value. Do ''not'' just paraphrase the checkbox label text, instead try to answer the question of what a player actually sees when the option is turned on.<br />
<br />
Example:<br />
<br />
Do '''not''' use:<br />
_X_ Floating labels<br />
Tooltip: Turns on floating labels<br />
<br />
Instead use:<br />
_X_ Floating labels<br />
Tooltip: Show floating text above a unit when it is damaged or healed<br />
<br />
===Text Boxes===<br />
<br />
===Menus===<br />
<br />
The game's pull-down menus use '''title case'''. The key shortcut for a function is pulled from the hotkeys configuration file. Related functions should be grouped together. Frequently-used or important functions should be near the top of the list, 'dangerous' functions should be moved to the end of the list. 'Quit' is considered dangerous, which is why it is moved as far wy from the top of the menu as possible. As far as possible, try to ensure that accidentally missing the menu option you wanted to select by one row is harmless. Where no more obvious order is apparent, list items in alphabetical order.<br />
<br />
===Tooltips===<br />
<br />
Tooltips use sentence case, but the last sentence in any tooltip does not have a full stop. Try to add a tooltip to every button. At the very minimum, the tooltip should show either the default value, the current value, or the minimum and maximum values, depending on what is most useful. Where a button or checkbox's function is not immediately obvious, phrase the tooltip to describe what happens when the option is turned '''on'''.<br />
<br />
Tooltips should contain no more than one or two lines of text.<br />
<br />
Examples:<br />
<br />
name=_"Ping timeout (seconds)"<br />
description=_"How long to wait for a ping reply before giving up. 0 means wait indefinitely"<br />
<br />
name=_"Auto-open whisper windows in lobby"<br />
description=_"When you are sent a whisper message, it appears in a pop-up window"<br />
<br />
(WML code)<br />
<br />
===Default Values===<br />
<br />
While it might be nice to display the default value for every checkbox, widget and so on a player might alter, this can make the tooltips needlessly untidy. The recommended practice is not to mindlessly add this information to every tooltip, but to provide it wherever a changed setting could cause unexpected behaviour, or wherever the original value is hard to retrieve. For example, it's easy to tell whether 'Floating Labels' is on or off. On the other hand, the name (and possibly port number) for the default add-on server should be stored in the tooltip, so that a user can restore it if necessary.<br />
<br />
[[Category:Development]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=Template:WML_Tags&diff=71281Template:WML Tags2023-05-20T06:33:07Z<p>Octalot: Correct link for [textdomain]</p>
<hr />
<div>{| class="reference-sidebar"<br />
|-<br />
|<br />
<span class="editlink">&#91;[{{SERVER}}{{localurl:Template:WML Tags|action=edit}} edit]&#93;</span>'''WML Tags'''<br />
|-<br />
|''A:'' <br />
[[AbilitiesWML|abilities]],<br />
[[CreditsWML#.5Babout.5D|about]],<br />
[[AchievementsWML|achievement]],<br />
[[AchievementsWML|achievement_group]],<br />
[[Creating_Custom_AIs#Behavior_Candidate_Actions|add_ai_behavior]],<br />
[[SingleUnitWML|advance]],<br />
[[AdvancedPreferenceWML|advanced_preference]],<br />
[[UnitTypeWML|advancefrom]],<br />
[[UnitTypeWML#After_max_level_advancement_.28AMLA.29|advancement]],<br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|advances]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_ability|affect_adjacent]],<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Top-level_Elements|ai]],<br />
[[StandardSideFilter|allied_with]], <br />
[[DirectActionsWML#.5Ballow_end_turn.5D|allow_end_turn]],<br />
[[DirectActionsWML#.5Ballow_extra_recruit.5D|allow_extra_recruit]],<br />
[[DirectActionsWML#.5Ballow_recruit.5D|allow_recruit]],<br />
[[DirectActionsWML#.5Ballow_undo.5D|allow_undo]],<br />
[[ConditionalActionsWML#Meta-Condition_Tags|and]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|animate]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|animate_unit]],<br />
[[AnimationWML|animation]],<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|aspect]],<br />
attack ([[ReplayWML|replay]], [[UnitTypeWML#Attacks|weapon]]),<br />
[[AnimationWML|attack_anim]],<br />
attacks ([[AbilitiesWML#The_.5Bspecials.5D_tag|special]], [[StatisticalScenarioWML#The_.5Bteam.5D_tag|stats]]),<br />
[[AiWML#List_of_AI_Aspects|avoid]];<br />
|-<br />
|''B:'' <br />
[[UnitTypeWML#Other_tags|base_unit]], <br />
[[IntroWML#.5Bbackground_layer.5D|background_layer]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|berserk]], <br />
[[BinaryPathWML|binary_path]],<br />
[[InternalActionsWML#Flow_control_actions|break]],<br />
[[EditorWML#The_.5Bbrush.5D_tag|brush]];<br />
|-<br />
|''C:'' <br />
[[CampaignWML#The_.5Bcampaign.5D_tag|campaign]],<br />
[[DirectActionsWML#.5Bcancel_action.5D|cancel_action]],<br />
[[Wesnoth_AI_Framework#The_.5Bcandidate_action.5D_Tag|candidate_action]], <br />
[[DirectActionsWML#.5Bcapture_village.5D|capture_village]],<br />
[[ConditionalActionsWML#.5Bswitch.5D|case]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|chance_to_hit]], <br />
[[InterfaceActionsWML#.5Bchange_theme.5D|change_theme]], <br />
[[InterfaceActionsWML#.5Bchat.5D|chat]],<br />
[[OptionWML|checkbox]],<br />
[[OptionWML|choice]],<br />
[[ReplayWML|choose]],<br />
[[PersistenceWML|clear_global_variable]],<br />
[[InterfaceActionsWML#.5Bclear_menu_item.5D|clear_menu_item]],<br />
[[InternalActionsWML#.5Bclear_variable.5D|clear_variable]],<br />
[[InterfaceActionsWML#.5Bcolor_adjust.5D|color_adjust]],<br />
[[GameConfigWML#Color_Palettes|color_palette]],<br />
[[GameConfigWML#Color_Palettes|color_range]],<br />
command&nbsp;([[ConditionalActionsWML#.5Bcommand.5D|action]], [[ReplayWML|replay]]),<br />
[[InternalActionsWML#Flow_control_actions|continue]],<br />
[[CreditsWML#.5Bcredits_group.5D|credits_group]],<br />
[[AiWML#The_.5Bgoal.5D_Tag|criteria]];<br />
|-<br />
|''D:'' <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|damage]],<br />
[[AnimationWML#death|death]], <br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|deaths]],<br />
[[AnimationWML#default|default]], <br />
[[AnimationWML#defend|defend]],<br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|defends]],<br />
[[UnitsWML#.5Bmovetype.5D|defense]],<br />
[[InterfaceActionsWML#.5Bdelay.5D|delay]],<br />
[[InterfaceActionsWML#.5Bdeprecated_message.5D|deprecated_message]],<br />
[[ReplayWML|destination]],<br />
[[CampaignWML|difficulty]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|disable]],<br />
[[DirectActionsWML#.5Bdisallow_end_turn.5D|disallow_end_turn]],<br />
[[DirectActionsWML#.5Bdisallow_extra_recruit.5D|disallow_extra_recruit]],<br />
[[DirectActionsWML#.5Bdisallow_recruit.5D|disallow_recruit]],<br />
[[ConditionalActionsWML#.5Bwhile.5D|do]], <br />
[[DirectActionsWML#.5Bdo_command.5D|do_command]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|drains]], <br />
[[AnimationWML#draw_weapon_anim|draw_weapon_anim]];<br />
|-<br />
|''E:'' <br />
[[EditorWML#The_.5Beditor_group.5D_tag|editor_group]],<br />
[[EditorWML#The_.5Beditor_music.5D_tag|editor_music]],<br />
[[EditorWML#The_.5Beditor_times.5D_tag|editor_times]],<br />
[[EffectWML|effect]],<br />
else&nbsp;([[ConditionalActionsWML#.5Bif.5D|action]], [[AnimationWML#.5Bif.5D_and_.5Belse.5D|animation]]), [[ConditionalActionsWML#.5Bif.5D|elseif]],<br />
[[DirectActionsWML#.5Bendlevel.5D|endlevel]],<br />
end_turn&nbsp;([[DirectActionsWML#.5Bend_turn.5D|action]], [[ReplayWML|replay]]),<br />
[[StandardSideFilter|enemy_of]], <br />
[[Wesnoth_AI_Framework#Available_Engines|engine]], <br />
entry&nbsp;([[CreditsWML#.5Bentry.5D|credits]], [[OptionWML|options]]),<br />
[[EraWML|era]],<br />
[[EventWML|event]],<br />
[[AnimationWML#Simplified_animation_blocks|extra_anim]];<br />
|-<br />
|''F:''<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|facet]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|facing]], <br />
[[InterfaceActionsWML#.5Bmove_units_fake.5D|fake_unit]], <br />
[[ConditionalActionsWML#.5Bfalse.5D|false]],<br />
[[PblWML#.5Bfeedback.5D|feedback]],<br />
[[UnitTypeWML#Other_tags|female]], <br />
filter ([[FilterWML|concept]], [[EventWML#.5Bfilter.5D|event]]),<br />
[[StandardUnitFilter|filter_adjacent]], <br />
[[StandardLocationFilter|filter_adjacent_location]], <br />
[[FilterWML#Filtering_Weapons|filter_attack]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_attacker]], <br />
[[AbilitiesWML#Common_keys_and_tags_for_every_ability|filter_base_value]], <br />
[[EventWML#.5Bfilter_condition.5D|filter_condition]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_defender]], <br />
[[AiWML#Filtering_Combat_with_the_.27attacks.27_Aspect|filter_enemy]],<br />
[[StandardLocationFilter|filter_location]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_opponent]], <br />
[[AiWML#Filtering_Combat_with_the_.27attacks.27_Aspect|filter_own]],<br />
[[StandardLocationFilter|filter_owner]], <br />
[[StandardLocationFilter|filter_radius]], <br />
[[SingleUnitWML|filter_recall]], <br />
[[StandardUnitFilter|filter_second]],<br />
[[FilterWML#Filtering_Weapons|filter_second_attack]],<br />
[[AbilitiesWML|filter_self]], <br />
[[StandardSideFilter|filter_side]],<br />
[[AbilitiesWML|filter_student]], <br />
[[FilterWML#Filtering_Vision|filter_vision]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_weapon]], <br />
[[FilterWML#Filtering_on_WML_data|filter_wml]],<br />
[[InternalActionsWML#.5Bfind_path.5D|find_path]],<br />
[[InternalActionsWML#.5Bfire_event.5D|fire_event]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|firststrike]], <br />
[[InterfaceActionsWML#.5Bfloating_text.5D|floating_text]],<br />
[[ConditionalActionsWML#.5Bfound_item.5D|found_item]],<br />
[[ConditionalActionsWML#.5Bfor.5D|for]],<br />
[[ConditionalActionsWML#.5Bforeach.5D|foreach]],<br />
[[AnimationWML#Frames|frame]];<br />
|-<br />
|''G:'' <br />
[[GameConfigWML|game_config]],<br />
[[PersistenceWML|get_global_variable]],<br />
[[AiWML#The_.5Bgoal.5D_Tag|goal]],<br />
[[DirectActionsWML#.5Bgold.5D|gold]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|gold_carryover]];<br />
|-<br />
|''H:'' <br />
[[DirectActionsWML#.5Bharm_unit.5D|harm_unit]],<br />
[[StandardSideFilter|has_ally]], <br />
[[StandardUnitFilter|has_attack]],<br />
[[StandardSideFilter|has_unit]], <br />
[[ConditionalActionsWML#.5Bhas_achievement.5D|has_achievement]],<br />
[[ConditionalActionsWML#.5Bhave_location.5D|have_location]],<br />
[[ConditionalActionsWML#.5Bhave_unit.5D|have_unit]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|heal_on_hit]], <br />
[[DirectActionsWML#.5Bheal_unit.5D|heal_unit]],<br />
[[AnimationWML#healed|healed_anim]], <br />
[[AnimationWML#healing|healing_anim]], <br />
[[AbilitiesWML|heals]], <br />
[[UnitsWML#.5Bhide_help.5D|hide_help]],<br />
[[InterfaceActionsWML#.5Bhide_unit.5D|hide_unit]],<br />
[[AbilitiesWML|hides]];<br />
|-<br />
|''I:'' <br />
[[AnimationWML#idling|idle_anim]], <br />
if&nbsp;([[ConditionalActionsWML#.5Bif.5D|action]], [[AnimationWML#.5Bif.5D_and_.5Belse.5D|animation]], [[IntroWML|intro]]),<br />
[[AbilitiesWML|illuminates]], <br />
image&nbsp;([[IntroWML#.5Bimage.5D|intro]], [[TerrainGraphicsWML|terrain]]),<br />
[[ReplayWML|init_side]],<br />
[[InternalActionsWML#.5Binsert_tag.5D|insert_tag]],<br />
[[InterfaceActionsWML#.5Binspect.5D|inspect]],<br />
[[InterfaceActionsWML#.5Bitem.5D|item]],<br />
[[EditorWML#The_.5Bitem_group.5D_tag|item_group]];<br />
|-<br />
|''J:''<br />
[[UnitsWML#.5Bmovetype.5D|jamming_costs]],<br />
[[InternalActionsWML#.5Bset_variable.5D|join]];<br />
|-<br />
|''K:'' <br />
[[DirectActionsWML#.5Bkill.5D|kill]],<br />
[[StatisticalScenarioWML|killed]];<br />
|-<br />
|''L:'' <br />
[[InterfaceActionsWML#.5Blabel.5D|label]],<br />
[[LanguageWML|language]],<br />
[[SideWML|leader]],<br />
[[AiWML#List_of_AI_Aspects|leader_goal]],<br />
[[AbilitiesWML|leadership]], <br />
[[AnimationWML#leading|leading_anim]], <br />
[[AnimationWML#levelin|levelin_anim]],<br />
[[AnimationWML#levelout|levelout_anim]], <br />
[[DirectActionsWML#.5Blift_fog.5D|lift_fog]],<br />
[[AI_Recruitment#Aspect_recruitment_instructions|limit]],<br />
[[InternalActionsWML#.5Bset_variables.5D|literal]],<br />
[[AddonsWML|load_resource]],<br />
[[LocaleWML|locale]],<br />
[[InterfaceActionsWML#.5Block_view.5D|lock_view]],<br />
[[LuaWML|lua]];<br />
|-<br />
|''M:'' <br />
[[UnitTypeWML#Other_tags|male]], <br />
[[SavefileWML|menu_item]], <br />
[[InterfaceActionsWML#.5Bmessage.5D|message]],<br />
[[Micro AIs|micro_ai]],<br />
[[AnimationWML#The_content_of_a_frame|missile_frame]],<br />
[[ModificationWML|modification]],<br />
[[SingleUnitWML|modifications]],<br />
[[DirectActionsWML#.5Bmodify_ai.5D|modify_ai]],<br />
[[DirectActionsWML#.5Bmodify_side.5D|modify_side]],<br />
[[DirectActionsWML#.5Bmodify_turns.5D|modify_turns]],<br />
[[DirectActionsWML#.5Bmodify_unit.5D|modify_unit]],<br />
[[AddonsWML|modify_unit_type]],<br />
[[ReplayWML|move]],<br />
[[DirectActionsWML#.5Bmove_unit.5D|move_unit]],<br />
[[InterfaceActionsWML#.5Bmove_unit_fake.5D|move_unit_fake]],<br />
[[InterfaceActionsWML#.5Bmove_units_fake.5D|move_units_fake]],<br />
[[AnimationWML#movement|movement_anim]], <br />
[[UnitsWML#.5Bmovetype.5D|movement costs]],<br />
[[UnitsWML#.5Bmovetype.5D|movetype]],<br />
[[ScenarioWML|multiplayer]],<br />
[[EraWML#Defining_Factions|multiplayer_side]],<br />
[[MusicListWML#.5Bmusic.5D|music]];<br />
|-<br />
|''N:'' <br />
[[ConditionalActionsWML#Meta-Condition_Tags|not]], <br />
[[InterfaceActionsWML#.5Bobjectives.5D|note]];<br />
|-<br />
|''O:'' <br />
[[DirectActionsWML#.5Bobject.5D|object]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|objective]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|objectives]],<br />
[[DirectActionsWML#.5Bon_undo.5D|on_undo]],<br />
[[InterfaceActionsWML#.5Bopen_help.5D|open_help]],<br />
[[InterfaceActionsWML#.5Bmessage.5D|option]],<br />
[[OptionWML|options]],<br />
[[ConditionalActionsWML#Meta-Condition_Tags|or]];<br />
|-<br />
|''P:'' <br />
[[IntroWML|part]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|petrifies]], <br />
[[DirectActionsWML#.5Bpetrify.5D|petrify]], <br />
[[DirectActionsWML#.5Bplace_shroud.5D|place_shroud]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|plague]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|poison]], <br />
[[UnitTypeWML#Other_tags|portrait]], <br />
[[AnimationWML#post_movement|post_movement_anim]], <br />
[[AnimationWML#pre_movement|pre_movement_anim]], <br />
[[InternalActionsWML#.5Bfire_event.5D|primary_attack]], <br />
[[InternalActionsWML#.5Bfire_event.5D|primary_unit]], <br />
[[InterfaceActionsWML#.5Bprint.5D|print]], <br />
[[DirectActionsWML#.5Bprogress_achievement.5D|progress_achievement]], <br />
[[DirectActionsWML#.5Bput_to_recall_list.5D|put_to_recall_list]];<br />
|-<br />
|''R:'' <br />
[[UnitsWML#.5Brace.5D|race]], <br />
[[InternalActionsWML#.5Brandom_placement.5D|random_placement]], <br />
recall&nbsp;([[DirectActionsWML#.5Brecall.5D|action]], [[ReplayWML|replay]]), <br />
[[StatisticalScenarioWML|recalls]],<br />
[[ReplayWML|recruit]], <br />
[[AnimationWML#recruited|recruit_anim]], <br />
[[AnimationWML#recruiting|recruiting_anim]], <br />
[[StatisticalScenarioWML|recruits]], <br />
[[InterfaceActionsWML#.5Bredraw.5D|redraw]],<br />
[[AbilitiesWML|regenerate]],<br />
[[InternalActionsWML#.5Bremove_event.5D|remove_event]],<br />
[[InterfaceActionsWML#.5Bremove_item.5D|remove_item]], <br />
[[DirectActionsWML#.5Bremove_object.5D|remove_object]], <br />
[[DirectActionsWML#.5Bremove_shroud.5D|remove_shroud]], <br />
[[InterfaceActionsWML#.5Bremove_sound_source.5D|remove_sound_source]], <br />
[[DirectActionsWML#.5Bremove_time_area.5D|remove_time_area]], <br />
[[DirectActionsWML#.5Bremove_trait.5D|remove_trait]],<br />
[[InterfaceActionsWML#.5Bremove_unit_overlay.5D|remove_unit_overlay]],<br />
[[ConditionalActionsWML#.5Brepeat.5D|repeat]],<br />
[[DirectActionsWML#.5Breplace_map.5D|replace_map]], <br />
[[DirectActionsWML#.5Breplace_schedule.5D|replace_schedule]], <br />
[[ReplayWML|replay]], <br />
[[SavefileWML|replay_start]],<br />
[[DirectActionsWML#.5Breset_fog.5D|reset_fog]], <br />
resistance&nbsp;([[AbilitiesWML|ability]], [[UnitsWML#.5Bmovetype.5D|unit]]),<br />
[[UnitsWML#.5Bresistance_defaults.5D|resistance_defaults]],<br />
[[ModificationWML#The_.5Bresource.5D_toplevel_tag|resource]],<br />
[[InternalActionsWML#Flow_control_actions|return]],<br />
[[InternalActionsWML#.5Brole.5D|role]], <br />
[[TerrainMaskWML|rule]];<br />
|-<br />
|''S:'' <br />
[[SavefileWML|save]], <br />
[[ScenarioWML|scenario]],<br />
[[InterfaceActionsWML#.5Bscreen_fade.5D|screen_fade]], <br />
[[InterfaceActionsWML#.5Bscroll.5D|scroll]], <br />
[[InterfaceActionsWML#.5Bscroll_to.5D|scroll_to]],<br />
[[InterfaceActionsWML#.5Bscroll_to_unit.5D|scroll_to_unit]], <br />
[[InternalActionsWML#.5Bfire_event.5D|secondary_attack]], <br />
[[InternalActionsWML#.5Bfire_event.5D|secondary_unit]], <br />
[[HelpWML|section]], <br />
[[InterfaceActionsWML#.5Bselect_unit.5D|select_unit]], <br />
[[ReplayWML|sequence]], <br />
[[DirectActionsWML#.5Bset_achievement.5D|set_achievement]],<br />
[[DirectActionsWML#.5Bset_extra_recruit.5D|set_extra_recruit]],<br />
[[PersistenceWML|set_global_variable]],<br />
[[InterfaceActionsWML#.5Bset_menu_item.5D|set_menu_item]], <br />
[[DirectActionsWML#.5Bset_recruit.5D|set_recruit]],<br />
[[EffectWML|set_specials]], <br />
[[InternalActionsWML#.5Bset_variable.5D|set_variable]], <br />
[[InternalActionsWML#.5Bset_variables.5D|set_variables]], <br />
[[AnimationWML#sheath_weapon|sheath_weapon_anim]], <br />
show_if&nbsp;([[InterfaceActionsWML#.5Bmessage.5D|message]], <br />
[[InterfaceActionsWML#.5Bobjectives.5D|objective]], <br />
[[InterfaceActionsWML#.5Bset_menu_item.5D|set_menu_item]]),<br />
[[InterfaceActionsWML#.5Bshow_objectives.5D|show_objectives]],<br />
[[SideWML|side]], <br />
[[AbilitiesWML|skirmisher]], <br />
[[OptionWML|slider]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|slow]], <br />
[[SavefileWML|snapshot]],<br />
[[InterfaceActionsWML#.5Bsound.5D|sound]], <br />
[[InterfaceActionsWML#.5Bsound_source.5D|sound_source]], <br />
source&nbsp;([[ReplayWML|replay]], [[DirectActionsWML#.5Btunnel.5D|teleport]]),<br />
[[UnitTypeWML#Other_tags|special_note]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|specials]], <br />
[[InternalActionsWML#.5Bset_variables.5D|split]],<br />
[[Wesnoth_AI_Framework#Available_Stages|stage]], <br />
[[AnimationWML#standing|standing_anim]], <br />
[[StatisticalScenarioWML#The_.5Bstatistics.5D_tag|statistics]],<br />
[[SingleUnitWML|status]], <br />
[[InternalActionsWML#.5Bstore_gold.5D|store_gold]], <br />
[[InternalActionsWML#.5Bstore_items.5D|store_items]], <br />
[[InternalActionsWML#.5Bstore_locations.5D|store_locations]],<br />
[[InternalActionsWML#.5Bstore_map_dimensions.5D|store_map_dimensions]],<br />
[[InternalActionsWML#.5Bstore_reachable_locations.5D|store_reachable_locations]],<br />
[[InternalActionsWML#.5Bstore_relative_direction.5D|store_relative_direction]],<br />
[[InternalActionsWML#.5Bstore_side.5D|store_side]], <br />
[[InternalActionsWML#.5Bstore_starting_location.5D|store_starting_location]], <br />
[[InternalActionsWML#.5Bstore_time_of_day.5D|store_time_of_day]], <br />
[[InternalActionsWML#.5Bstore_turns.5D|store_turns]], <br />
[[InternalActionsWML#.5Bstore_unit.5D|store_unit]], <br />
[[InternalActionsWML#.5Bstore_unit_defense.5D|store_unit_defense]], <br />
[[InternalActionsWML#.5Bstore_unit_defense_on.5D|store_unit_defense_on]], <br />
[[InternalActionsWML#.5Bstore_unit_type.5D|store_unit_type]], <br />
[[InternalActionsWML#.5Bstore_unit_type_ids.5D|store_unit_type_ids]], <br />
[[InternalActionsWML#.5Bstore_villages.5D|store_villages]], <br />
[[IntroWML|story]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|swarm]], <br />
[[AchievementsWML|sub_achievement]],<br />
[[ConditionalActionsWML#.5Bswitch.5D|switch]],<br />
[[InternalActionsWML#.5Bsync_variable.5D|sync_variable]];<br />
|-<br />
|''T:'' <br />
[[DirectActionsWML#.5Btunnel.5D|target]], <br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|team]],<br />
teleport&nbsp;([[AbilitiesWML|ability]], [[DirectActionsWML#.5Bteleport.5D|action]]),<br />
[[AnimationWML#pre_teleport|teleport_anim]],<br />
[[DirectActionsWML#.5Bterrain.5D|terrain]], <br />
[[UnitsWML#.5Bterrain_defaults.5D|terrain_defaults]],<br />
[[TerrainGraphicsWML|terrain_graphics]], <br />
[[TerrainMaskWML|terrain_mask]], <br />
[[TerrainWML|terrain_type]], <br />
[[ScenarioWML#Test_scenario|test]],<br />
[[InterfaceActionsWML#.5Btest_condition.5D|test_condition]],<br />
[[InterfaceActionsWML#.5Bmessage.5D|text_input]], <br />
[[GettextForWesnothDevelopers#The_textdomain_tag|textdomain]],<br />
[[ThemeWML|theme]],<br />
[[ConditionalActionsWML#.5Bif.5D|then]],<br />
[[TerrainGraphicsWML|tile]], <br />
[[TimeWML|time]], <br />
[[DirectActionsWML#.5Btime_area.5D|time_area]], <br />
[[HelpWML|topic]], <br />
[[HelpWML|toplevel]], <br />
[[UnitsWML#.5Btrait.5D|trait]], <br />
[[DirectActionsWML#.5Btransform_unit.5D|transform_unit]], <br />
[[InternalActionsWML#.5Bfind_path.5D|traveler]], <br />
[[ConditionalActionsWML#.5Btrue.5D|true]],<br />
[[DirectActionsWML#.5Btunnel.5D|tunnel]];<br />
|-<br />
|''U:'' <br />
[[InterfaceActionsWML#.5Bunhide_unit.5D|unhide_unit]], <br />
[[SingleUnitWML|unit]],<br />
[[InterfaceActionsWML#.5Bunit_overlay.5D|unit_overlay]], <br />
[[UnitTypeWML|unit_type]], <br />
[[InternalActionsWML#.5Bunit_worth.5D|unit_worth]], <br />
[[UnitsWML|units]],<br />
[[InterfaceActionsWML#.5Bunlock_view.5D|unlock_view]],<br />
[[DirectActionsWML#.5Bunpetrify.5D|unpetrify]], <br />
[[DirectActionsWML#.5Bunstore_unit.5D|unstore_unit]],<br />
[[InternalActionsWML#.5Bunsynced.5D|unsynced]];<br />
|-<br />
| ''V:'' <br />
[[InternalActionsWML#.5Bset_variables.5D|value]], <br />
[[ConditionalActionsWML#.5Bvariable.5D|variable]],<br />
[[VariablesWML#The_.5Bvariables.5D_tag|variables]],<br />
[[TerrainGraphicsWML|variant]],<br />
[[UnitTypeWML#Other_tags|variation]], <br />
[[AnimationWML#victory|victory_anim]], <br />
[[SideWML|village]],<br />
[[UnitsWML#.5Bmovetype.5D|vision_costs]],<br />
[[InterfaceActionsWML#.5Bvolume.5D|volume]];<br />
|-<br />
| ''W:'' <br />
[[ConditionalActionsWML#.5Bwhile.5D|while]],<br />
[[InterfaceActionsWML#.5Bwml_message.5D|wml_message]],<br />
[[SchemaWML|wml_schema]];<br />
|-<br />
| ''Z:''<br />
[[InterfaceActionsWML#.5Bzoom.5D|zoom]];<br />
|}<includeonly>[[Category:WML Reference]]</includeonly><noinclude>A box with all the WML tags, each one linking to the page and section they are described in. This box should be included in each of the WML reference pages.</noinclude></div>Octalothttps://wiki.wesnoth.org/index.php?title=ReferenceWML&diff=71280ReferenceWML2023-05-20T06:32:00Z<p>Octalot: Replace WesCamp link for [textdomain]</p>
<hr />
<div>{{WML Tags}}<br />
== The Wesnoth Markup Language ==<br />
<br />
The Wesnoth Markup Language (WML) is used to code almost everything in Wesnoth, including scenarios, units, savefiles, and the user interface layout. WML files are simple, human-readable text files, usually with the .cfg extension, with similarities to INI files and XML. A major feature in WML are macros, which are alike those found in the C language and similarily are handled by a preprocessor. Implementation-wise, WML files are handled mainly by the ''config'' class (and ''simple_wml'' in [[wesnothd]]).<br />
<br />
This page is a collection of pointers to different common WML structures.<br />
<br />
See [[BuildingScenarios]], [[BuildingCampaigns]] and [[BuildingUnits]]<br />
for a tutorial style overview.<br />
<br />
<br />
<br />
''Note: this reference may contain slight inaccuracies, might not list all existing keys and tags or might contain some deprecated syntax. If you find that this reference doesn't give you the answer to how to implement some feature in WML, the most reliable way is to look at the WML code of existing units and campaigns that have done so.''<br />
<br />
== How WML works ==<br />
<br />
* [[SyntaxWML]] Description of WML syntax, and how to use variables<br />
* [[PreprocessorRef]] the WML preprocessor syntax<br />
* [[GrammarWML]] A more formal definition of the WML syntax. More useful for implementing a WML parser than for writing WML documents.<br />
<br />
== WML toplevel tags ==<br />
<br />
The following covers most of the possible toplevel tags in a typical main WML file. Some minor and dev-oriented tags (not intended for use by UMC) are omitted.<br />
<br />
* [[GameConfigWML]] the top level '''[game_config]''' tag<br />
* [[UnitsWML]] the top level '''[units]''' tag<br />
** [[AbilitiesWML]] a list of the different abilities a unit or weapon can have<br />
** [[UnitTypeWML]] how to describe a unit type<br />
** [[AnimationWML]] how to animate units<br />
* [[CoreWML]] the top level '''[core]''' tag<br />
* [[AddonsWML]] the entry point for an add-on module<br />
** [[CampaignWML]] the top level '''[campaign]''' tag<br />
*** [[CreditsWML]] how to describe the credits (the '''[about]''' tag)<br />
** [[ScenarioWML]] the top level tags '''[scenario]''', '''[multiplayer]''', and '''[test]'''<br />
*** [[EventWML]] how to describe an event<br />
*** [[SideWML]] how to describe a side<br />
*** [[MapGeneratorWML]] the random map generator<br />
*** [[TimeWML]] how to describe a day<br />
*** [[IntroWML]] how to describe the intro screen (the '''[story]''' and '''[part]''' tags)<br />
** [[EraWML]] the top level '''[era]''' tag<br />
** [[ModificationWML]] the top level '''[modification]''' and '''[resource]''' tags<br />
* [[TerrainWML]] the top level '''[terrain_type]''' tag<br />
* [[TerrainGraphicsWML]], the top level '''[terrain_graphics]''' tag<br />
* [[ThemeWML]] the top level '''[theme]''' tag<br />
* [[LanguageWML]] the top level '''[language]''' tag<br />
* [[LocaleWML]] the top level '''[locale]''' tag<br />
* [[HelpWML]] the top level '''[help]''' tag<br />
* [[BinaryPathWML]] the top level '''[binary_path]''' tag<br />
* [[FontsWML]] the top level '''[fonts]''' tag<br />
* [[GettextForWesnothDevelopers#The_textdomain_tag|Textdomains]] the '''[textdomain]''' tag<br />
<br />
Some other files use the WML format, but with different tags.<br />
<br />
* [[AchievementsWML]] the [achievement_group] and [achievement] tags.<br />
* [[SavefileWML]] a description of the format of savegames<br />
** [[ReplayWML]] a description of the format of player actions such as moving a unit<br />
** [[StatisticalScenarioWML]] used to generate statistics of a savegame<br />
* [[PblWML]] a description of the format of server-uploadable campaigns<br />
* [[SchemaWML]] a description of WML files that define the structure of other WML files<br />
* [[DiffWML]] used to describe structural differences between preprocessed WML documents<br />
* [[GUIToolkit]] creating dialogs<br />
<br />
== Other WML tags ==<br />
<br />
* [[EventWML]] how to describe an event<br />
** [[FilterWML]] the construct to filter on [[StandardUnitFilter|units]], [[StandardLocationFilter|locations]], [[StandardSideFilter|sides]], weapons, vision, and WML data.<br />
** [[ActionWML]] to describe the actions which occur when the event is fired<br />
*** [[ConditionalActionsWML]] actions that encapsulate conditional filters and the actions to execute if the conditions are met<br />
*** [[DirectActionsWML]] actions that directly affect gameplay: for example, creating a unit<br />
**** [[SingleUnitWML]] how to describe a unit (for uses such as placing one on the map)<br />
*** [[InternalActionsWML]] actions that WML uses internally: for example, storing a variable<br />
*** [[InterfaceActionsWML]] actions that do not affect gameplay: for example, displaying a message<br />
*** [[LuaWML]] how to code actions with the Lua language (BfW 1.14 and earlier)<br />
*** [[LuaAPI]] how to code actions with the Lua language (BfW 1.16 and later)<br />
* [[AiWML]] how to describe parameters for AI<br />
* [[EffectWML]] the construct to modify a unit<br />
* [[DescriptionWML]] the structure of WML coded menus like the difficulty chooser of campaigns<br />
* [[EditorWML]] tags controlling the post-1.4 editor's behavior<br />
* [[MusicListWML]] for playing music (see also [[Available Music]] for a list of what's available)<br />
<br />
== Predefined macros == <br />
<br />
Wesnoth ships with a library of predefined macros you should find useful in writing your own WML.<br />
* [https://www.wesnoth.org/macro-reference.html WML Macros] - description of all such macros.<br />
<br />
== Other ==<br />
<br />
* [[ReferenceWMLSyntax]] how this wiki and the pages it links to should be formatted<br />
* [[ConventionsWML]] how to make your WML more readable<br />
* [[Wml_optimisation]] how to make your WML code more efficient<br />
* [[UsefulWMLFragments]] Various pieces of WML for various purposes. If you have some WML you're proud of that you think others can use, add it here.<br />
* [[Maintenance tools]] for wmlindent, wmllint, wmlscope<br />
* [[CommandMode]] commands are not strictly speaking part of WML, but they are useful for debugging it, and could be a little hard to find, so linking to them here makes sense.<br />
* [[MultiplayerServerWML]] is used when communicating with the multiplayer server.<br />
* [[CampaignServerWML]] is used when managing contributed campaigns on the campaign server.<br />
* [[ImagePathFunctions]] (IPFs) are used when applying the color function to images, such as marking units as belonging to a team or in TerrainGraphics.<br />
* [[Pango formatting]] shows ways to enrich descriptions (pango markup, which can generate basic html tags like <nowiki><b>, <i>, <span></nowiki> and others).<br />
* [[Wesnoth_Formula_Language]] (WFL) often used with $() formulas.<br />
* [[PreprocessorRef|Syntax of preprocessor mini-language]] : symbols, macros, file inclusions...<br />
<br />
== See Also ==<br />
<br />
* [[BuildingMaps]] the text-based format for Wesnoth maps<br />
* [[TerrainCodeTableWML]] a list of all terrains, and [[TerrainCodesWML]], on how to use them<br />
* [[MultiHexTutorial]] a description of the multi-hex tiling system<br />
* [[IGNFileFormat]] a description of the ignore file format<br />
* [[CompatibilityStandards#Deprecation_levels_-_When_to_remove_deprecated_features|DeprecationLevels]]<br />
<br />
[[Category: WML Reference]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=PblWML&diff=71279PblWML2023-05-20T06:28:44Z<p>Octalot: /* translate */ Replace some WesCamp links (not all)</p>
<hr />
<div>{{WML Tags}}<br />
<br />
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.<br />
<br />
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.<br />
<br />
<b>Note:</b> Be aware that translations in the .pbl-files are '''not''' used, so don't mark these strings as translatable. {{DevFeature1.15|4}} The translations in the .pbl-files are used, but they are used as a plain text instead of Gettext strings, so don't mark these strings as translatable.<br />
<br />
== What goes into a .pbl file? ==<br />
<br />
'''Note:''' ''You should '''not''' use special formatting or coloring in any of these keys when uploading to the official server.'''''<br />
<br />
The following keys are recognized for .pbl files:<br />
<br />
=== icon ===<br />
: 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.<br />
<br />
: If the icon is a unit with magenta team-color bits, please use [[ImagePathFunctions]] to recolor it. For example: <br />
<br />
::icon="units/elves-wood/archer+female-sword-1.png~RC(magenta>brightorange)"<br />
:or<br />
::icon="units/human-peasants/peasant-ranged.png~RC(magenta>white)~CS(24,24,24)"<br />
:or<br />
::icon="units/human-peasants/ruffian.png~RC(magenta>green)~BLIT(units/human-peasants/woodsman.png~RC(magenta>lightblue),18,12)"<br />
<br />
: Because the add-on manager's UI is dark, recoloring to light colors looks usually better. A useful way to preview recolored unit sprites offers the tool [https://irydacea.me/projects/wesnoth-rcx Wesnoth RCX].<br />
<br />
: {{DevFeature1.13|12}} Instead of a standard Wesnoth image, a [[DataURI]] can also be used. This way, an image can be directly included into the _server.pbl file. Take care to leave no trailing newline.<br />
<br />
=== title ===<br />
: 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.<br />
: '''This value is required'''.<br />
<br />
=== version ===<br />
: 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]])<br />
: '''This value is required'''.<br />
<br />
=== author ===<br />
: 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.<br />
: '''This value is required'''.<br />
<br />
=== passphrase ===<br />
: 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.<br />
: '''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!'''<br />
<br />
: {{DevFeature1.15|12}}<br />
<br />
: It is no longer required to keep the passphrase in the .pbl file at all. If it is not present, then Wesnoth will prompt for it to be entered when uploading or deleting an add-on.<br />
<br />
=== description ===<br />
: 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.<br />
: '''This value is required'''.<br />
<br />
=== dependencies ===<br />
: 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]])<br />
<br />
=== tags ===<br />
{{DevFeature1.13|12}}<br />
: 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.<br />
<br />
{{DevFeature1.15|13}} The in-game add-ons manager will show all the tags in the UI, and also includes a drop-down list of tags to filter by. Not all tags are listed in the filter box, and the exact list of tags supported may change before 1.16 is released, but the list is currently:<br />
<br />
* '''cooperative''': All human players are on the same team, versus the AI<br />
* '''cosmetic''': These make the game look different, without changing gameplay<br />
* '''difficulty''': Can make campaigns easier or harder<br />
* '''rng''': Modify the randomness in the combat mechanics, or remove it entirely<br />
* '''survival''': Fight against waves of enemies<br />
* '''terraforming''': Players can change the terrain<br />
<br />
For example, if an A New Land style add-on had tags ''building'', ''terraforming'', ''anl'', ''city'', and ''survival'' then it would be shown if either ''Terraforming'' or ''Survival'' was selected in the drop-down; the other tags wouldn't affect the filtering.<br />
<br />
=== core ===<br />
{{DevFeature1.13|0}}<br />
: An optional string defining the id of the core which the addon is designed for. Defaults to "''default''". Don't specify for an addon which is of type "''core''" itself. Note: DO NOT SET this unless you know why you need it! Giving it an invalid value can lead to mysterious errors with your campaign failing to load!<br />
<br />
=== translate ===<br />
: If set to ''true'', the add-on would have been sent to and updated with [[WesCamp|WesCamp-i18n]], if that project were still active. However, as WesCamp is no longer active, this no longer does anything.<br />
<br />
: 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.<br />
<br />
: Note: WesCamp was abandoned in 2014. Instead, please refer to:<br />
* [[GettextForWesnothDevelopers]]<br />
* [[GettextForTranslators#For_add-ons]]<br />
* forum thread: [https://r.wesnoth.org/t46366 Guide: Translating your UMC without WesCamp].<br />
<br />
=== type ===<br />
: Indicates the type of the add-on; used to filter listings in the downloads manager dialog. Acceptable values are:<br />
<br />
:* ''core'': replaces the whole wml tree. {{DevFeature1.13|0}}<br />
:* ''campaign'': single player campaign.<br />
:* ''scenario'': single player scenario.<br />
:* ''campaign_sp_mp'': hybrid campaign.<br />
:* ''era'': multiplayer era.<br />
:* ''faction'': multiplayer stand-alone faction, or add-on for other available era.<br />
:* ''map_pack'': multiplayer map-pack.<br />
:* ''campaign_mp'': multiplayer campaign.<br />
:* ''scenario_mp'': multiplayer scenario. (See the note below.)<br />
:* ''mod_mp'': multiplayer modification ({{DevFeature1.13|11}} can also used for single-player modifications, although it's still called ''mod_mp'').<br />
:* ''media'': miscellaneous resources for UMC authors/users, for example, music packs, packages of general-purpose WML, etc. <small>Note: Shows as Resources, not Media, in the add-ons interface</small><br />
:* ''other'': The type to use when no other type fits.<br />
: '''Note:''' If your add-on contains two or more separate multiplayer scenarios, use ''map_pack''.<br />
<br />
: '''This value is required'''.<br />
<br />
=== email ===<br />
: 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.<br />
<br />
: '''This value is required if forum_auth is not set to true'''.<br />
<br />
=== forum_auth ===<br />
{{DevFeature1.17|3}}<br />
: When set to ''true'', you will be prompted for your forum username and password when uploading your add-on. When set to true, the ''passphrase'' and ''email'' fields are also not required.<br />
<br />
=== [feedback] ===<br />
: 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.<br />
<br />
==== topic_id ====<br />
: 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 <code><nowiki>http://forums.wesnoth.org/viewtopic.php?f=XX&t=YYYYY</nowiki></code>. You must take special care to ensure this information is valid before uploading if you want players to be able to reach you!<br />
<br />
=== [translation] ===<br />
{{DevFeature1.15|4}}<br />
: Multiple [translation] tags can be used to provide the addon with a localized title and description to be seen in the addons manager. However, it should be noted that the declared translations won't influence the list of supported locales as it depends only on the presence of .mo and .po files for corresponding languages.<br />
<br />
==== language ====<br />
: The target language code for the translation. The codes for each language are given in the big table on [https://www.wesnoth.org/gettext/] . You can use either its contracted version (like ''sv'' for Swedish) or a more precise variety (like ''zh_CN'' or ''ca_ES@valencia'').<br />
: '''This value is required'''.<br />
<br />
==== title ====<br />
: The translation of addon's title for the target language.<br />
: '''This value is required'''.<br />
<br />
==== description ====<br />
: The translation of addon's description for the target language.<br />
<br />
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]].<br />
<br />
== Examples ==<br />
<br />
=== Dependency Key Example ===<br />
<br />
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:<br />
<br />
dependencies=Imperial_Era,Era_of_Myths<br />
<br />
=== Version Key Examples ===<br />
<br />
{{DevFeature1.17|13}} the schema validation rejects many of the '''good''' examples. https://github.com/wesnoth/wesnoth/issues/7396<br />
<br />
The following are examples of '''good''' version values:<br />
<br />
version="1.5"<br />
version="0.11.4"<br />
version="0.1.4beta"<br />
version="1.5c"<br />
<br />
The following are examples of '''bad''' version values:<br />
<br />
version="Beta1.5"<br />
version="Incomplete (0.3.4)"<br />
<br />
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.<br />
<br />
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.<br />
<br />
0.5 < 1.0<br />
1.5 < 1.5c<br />
1.0 < 1.0.1<br />
1.0c < 1.0.1a<br />
1.0.1a < 1.0.1c<br />
1.0 Final < 1.0.1 Beta<br />
<br />
=== Example .pbl File ===<br />
<br />
<syntaxhighlight lang=wml><br />
title="My Campaign"<br />
type="campaign"<br />
icon="misc/ball.png"<br />
version="0.1.2"<br />
author="Me, artwork by myself"<br />
passphrase="This is like a password; see the security note in the documentation above before choosing a value of your own"<br />
description="You get to kill a lot of bad guys. But only the first map is done."<br />
email="name@example.com"<br />
[feedback]<br />
topic_id=12345<br />
[/feedback]<br />
# Note: the translation feature works on version 1.14.14, 1.15.4 and later only<br />
[translation]<br />
language="ru"<br />
title="Моя Кампания"<br />
description="Вам придётся завалить немало плохишей. Но пока что готова лишь первая карта."<br />
[/translation]<br />
[translation]<br />
language="zh_CN"<br />
title="我的竞选"<br />
description="你会杀死很多坏人。 但是只完成了第一张地图。(translated online)"<br />
[/translation]<br />
</syntaxhighlight><br />
<br />
== See Also ==<br />
<br />
* [[IGNFileFormat]]<br />
* [[FancyAddonIcons]]<br />
* [[ReferenceWML]]<br />
* [[CampaignServerWML]]<br />
<br />
[[Category: WML Reference]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=GermanTranslation&diff=71278GermanTranslation2023-05-20T06:21:35Z<p>Octalot: /* Siehe auch */ Replace the WesCamp link</p>
<hr />
<div>== Das Wort zum Geleit ==<br />
Diese Seite dient dazu, die Anstrengungen des deutschen Übersetzungsteams besser zu koordinieren. Die Übersetzung ist deshalb in Unterpunkte aufgespalten worden, so dass für alle Teammitglieder und Besucher ersichtlich ist, ob momentan bereits jemand an der Übersetzung für eine Textdomain arbeitet, und ob es einen Ansprechpartner für einzelne Kampagnen gibt.<br />
<br />
Übersetzungen basieren üblicherweise auf der aktuellen ''stable'' Version, bitte benutzt nicht die Dateien der ''master'' Version.<br />
<br />
Es ist außerdem sinnvoll vor dem Übersetzen einmal einen Blick auf [[GermanTranslationUnitNames|diese Liste]] mit stilistischen Hinweisen, Standardbegriffen, Einheitennahmen, etc. zu werfen.<br />
<br />
== Aktuelles Übersetzungsteam ==<br />
{|<br />
!style="text-align:left"| Name<br />
!style="text-align:left"| Nickname<br />
!style="text-align:left"| Emailadresse<br />
!style="text-align:left"| Anm.<br />
|-<br />
|Aaron Winter<br />
|bitron / byteron<br />
|im Discord erreichbar<br />
|Maintainer<br />
|-<br />
|<br />
|mcpgal<br />
|im Discord erreichbar<br />
|<br />
|-<br />
|<br />
|octalot<br />
|im Discord erreichbar<br />
|<br />
|-<br />
|<br />
|s1m0n<br />
|im Discord erreichbar<br />
|<br />
|}<br />
<br />
== Inaktive Übersetzer ==<br />
{|<br />
!style="text-align:left"| Name<br />
!style="text-align:left"| Nickname<br />
!style="text-align:left"| Emailadresse<br />
!style="text-align:left"| Anm.<br />
|-<br />
|Severin Glöckner<br />
|Sevu / Shiki<br />
|im Forum & Discord erreichbar<br />
|Vize-Maintainer<br />
|-<br />
|-<br />
|Christoph Berg<br />
|chrber<br />
|Christoph DOT Berg AT kpm-sport DOT de<br />
|<br />
|-<br />
|Nils Kneuper<br />
|Ivanovic<br />
|crazy-ivanovic AT gmx DOT net<br />
|<br />
|-<br />
|Oliver Lange<br />
|Crommy<br />
|oli-lange äd web Pünktchen de<br />
|<br />
|-<br />
|Tobias Schönau<br />
|SonIcco<br />
|tobias DOT schoenau AT eagerbyte DOT com<br />
|<br />
|-<br />
| –<br />
|Drakefriend<br />
|<br />
|<br />
|-<br />
|David Philippi<br />
|Torangan<br />
|david AT torangan DOT de<br />
|<br />
|-<br />
|Elias Pschernig<br />
|Allefant<br />
|allefant AT gmail DOT com<br />
|<br />
|-<br />
| -<br />
|vonHalenbach<br />
|vonHalenbach Ät users.sourceforge punkt net<br />
|<br />
|-<br />
|Sven Priess<br />
|Gedankenschinder<br />
|mail AT svenpriess DOT de<br />
|<br />
|-<br />
|Andre Schmidt<br />
|schmidta<br />
|andre AT schmidtandre DOT de<br />
|<br />
|-<br />
|Jan Greve<br />
|Jan`ger<br />
|Jan AT Phreeknet DOT org<br />
|<br />
|-<br />
|Andre<br />
|Hochbass<br />
|hochbass AT gmx DOT de<br />
|<br />
|-<br />
|Boris Stumm<br />
|quijote_<br />
|wesnoth AT bstumm DOT de<br />
|<br />
|-<br />
|Jan-Heiner Laberenz<br />
|jan-heiner<br />
|jan-heiner AT arcor DOT de<br />
|<br />
|-<br />
|Kai Ensenbach<br />
| -<br />
| -<br />
|<br />
|-<br />
|Onno Tasler<br />
|belchion<br />
|onno.tasler AT spamfence DOT net<br />
|<br />
|-<br />
|Ruben Philipp<br />
|The Very Uhu<br />
|the15thfeuergnu AT yahoo DOT de<br />
|<br />
|-<br />
|Stefan<br />
|Termimad<br />
|steve213 AT gmx DOT de<br />
|<br />
|-<br />
|Stephan Grochtmann<br />
|Schattenstephan<br />
|Schattenstephan AT gmx DOT com<br />
|<br />
|-<br />
| -<br />
|ammoq<br />
|erich DOT kitzmueller AT chello DOT at<br />
|<br />
|-<br />
|Arndt<br />
| -<br />
|muehlenf AT igi DOT tugraz DOT at<br />
|<br />
|-<br />
| -<br />
|ja-el<br />
| -<br />
|<br />
|-<br />
|Jonas<br />
| -<br />
|celb AT gmx DOT at<br />
|<br />
|-<br />
|Michael Vondung<br />
| -<br />
| -<br />
|<br />
|-<br />
|Olaf M.<br />
|milamber<br />
| -<br />
|<br />
|-<br />
|Uz-Friedrich Valentin<br />
|Uz<br />
|uz_ AT users DOT sourceforge DOT net<br />
|<br />
|-<br />
|Rhonda D'Vine<br />
|Rhonda<br />
|rhonda AT deb DOT at<br />
|<br />
|-<br />
|Christoph Lange<br />
|madelgijs<br />
|christoph DOT t DOT lange AT googlemail DOT com<br />
|<br />
|-<br />
|<br />
|-<br />
|<br />
|Flatterdorsch<br />
|im Discord erreichbar<br />
|<br />
|-<br />
|<br />
|Nevermore901<br />
|im Discord erreichbar<br />
|<br />
|}<br />
<br />
== Status der Übersetzung ==<br />
Wenn bei einer Kampagne für einen Betreuer ein '''-''' angegeben ist, bedeutet das nicht, dass sie gar nicht übersetzt wird. Dies wird von einem der aktiven Übersetzer übernommen, wenn dieser Zeit findet.<br />
<br />
Wünschenswert wäre es jedoch, wenn sich neue Übersetzer finden würden, die die Betreung einer dieser Kampagnen übernehmen würden damit die Qualität auch weiterhin auf dem hohen Niveau gesichert ist.<br />
<br />
{|border="1"<br />
!Name<br />
![[GettextForTranslators#Textdomains_and_getting_the_files_to_translate | Textdomain]]<br />
!Betreuer<br />
!Nutzerversion<br>1.16<br />
!Entwicklerversion<br>1.17<br />
|-<br />
!colspan="6"|Offizielle Kampagnen<br />
|-<br />
|Das Zepter des Feuers<br />
|wesnoth-sof<br />
| -<br />
|Fertig<br />
|-<br />
|Die dunklen Künste<br />
|wesnoth-did<br />
| -<br />
|Fertig<br />
|-<br />
|Die Geschichte zweier Brüder<br />
|wesnoth-tb<br />
| -<br />
|Fertig<br />
|-<br />
|Die Südwacht<br />
|wesnoth-tsg<br />
| -<br />
|Fertig<br />
|-<br />
|Der Thronerbe<br />
|wesnoth-httt<br />
| -<br />
|Fertig<br />
|-<br />
|Der Aufstieg Wesnoths<br />
|wesnoth-trow<br />
| -<br />
|Fertig<br />
|-<br />
|Freiheit<br />
|wesnoth-l<br />
| -<br />
|Fertig<br />
|-<br />
|Invasion der Finsternis<br />
|wesnoth-ei<br />
| -<br />
| -<br />
|-<br />
|Schwarzauges Sohn<br />
|wesnoth-sotbe<br />
| -<br />
|Fertig<br />
|-<br />
|Unter brennenden Sonnen<br />
|wesnoth-utbs<br />
|octalot<br />
|In Nachbearbeitung<br />
|-<br />
|Wiedergeburt des Nordens<br />
|wesnoth-nr<br />
| -<br />
| -<br />
|-<br />
|Der Hammer von Thursagan<br />
|wesnoth-thot<br />
| -<br />
|Fertig<br />
|-<br />
|Die Legende von Wesmere<br />
|wesnoth-low<br />
| -<br />
| -<br />
|-<br />
|Delfadors Memoiren<br />
|wesnoth-dm<br />
| -<br />
|Unklar<br />
|-<br />
|Stille Wasser<br />
|wesnoth-dw<br />
| -<br />
|Fertig<br />
|-<br />
|Geheimnisse der Ahnen<br />
|wesnoth-sota<br />
| -<br />
|Fertig<br />
|-<br />
|World Conquest<br />
|wesnoth-wc<br />
| -<br />
|Unklar<br />
|große Korrektur des englische Text gebietet<br />
|-<br />
!colspan="6"|Einheiten<br />
|-<br />
|Alle Einheiten<br />
|wesnoth-units<br />
| -<br />
|Fertig<br />
|-<br />
!colspan="6"|Sonstiges<br />
|-<br />
|Einführung<br />
|wesnoth-tutorial<br />
| -<br />
|Fertig<br />
|-<br />
|Eine neue Heimat<br />
|wesnoth-anl<br />
| -<br />
|Fertig<br />
|-<br />
|Steam Store Seite<br />
| -<br />
| -<br />
| -<br />
|-<br />
!colspan="6"|Benutzeroberfläche<br />
|-<br />
|Allgemeines<br />
|wesnoth<br />
|Bitron<br />
|Fertig<br />
|-<br />
|Allgemeines<br />
|wesnoth-lib<br />
|Bitron<br />
|Fertig<br />
|-<br />
|Hilfe<br />
|wesnoth-help<br />
| -<br />
|Fertig<br />
|-<br />
|Mehrspieler<br />
|wesnoth-multiplayer<br />
| -<br />
|Fertig<br />
|-<br />
|Editor<br />
|wesnoth-editor<br />
|Bitron<br />
|Fertig<br />
|-<br />
!colspan="6"|Dokumentation<br />
|-<br />
|Handbuch<br />
|wesnoth-manual<br />
| -<br />
|Fertig<br />
|-<br />
|Handbuchseiten<br />
|wesnoth-manpages<br />
| -<br />
|Fertig<br />
|-<br />
|}<br />
<br />
== Statusbeschreibungen ==<br />
{| style="margin-top: 1em; text-align: left" border="1"<br />
! scope="row"| Unklar<br />
| Die Zuweisung der Übersetzung ist unklar.<br>Sie kann also bereits vergeben sein oder an einen neuen Übersetzer vergeben werden.<br />
|-<br />
! scope="row"| Nicht Begonnen<br />
| Es werden noch ÜbersetzerInnen gesucht. Bei Interesse einfach melden.<br />
|-<br />
! scope="row"| In Bearbeitung<br />
| An der Übersetzung wird gearbeitet.<br />
|-<br />
! scope="row"| Korrektur<br />
| Die Übersetzung ist beim Korrekturlesen.<br />
|-<br />
! scope="row"| Fertig<br />
| Die Übersetzung ist abgeschlossen.<br />
|-<br />
! scope="row"| In Nachbearbeitung<br />
| Größtenteils fertig, nur einzelne Teile fehlen.<br />
|}<br />
<br />
== Gesucht ==<br />
<br />
Manche Kampagnen haben bessere Übersetzungen als andere. An manchen Stellen ist die Übersetzung zwischendurch unpassend, teils fehlt der Kontextbezug. Auch Rechtschreibfehler existieren, welche jedem zweiten Spieler auffallen, jedoch niemand meldet oder korrigiert. Und manchmal ist der Wortlaut der Übersetzung auch einfach zu sehr ans Englische angelehnt.<br />
<br />
<br />
Es werden Leute gesucht, welche Interesse daran haben eine Kampagne zu übernehmen und auszugestalten. Dies kann z.B. heißen, die Kampagne selber zu spielen und dabei Screenshots von seltsamen Dialogen zu machen um diese später auszubessern, oder andere Dinge zu ändern. Ggf. findet man dabei auch Sachen welche man im Englischen ebenfalls ändern könnte, sei es der Text, die Story oder anderes.<br />
Es ist verlockend, relativ wortgetreu zu Übersetzen, aber freiere Übersetzungen sind in der Regel deutlich besser.<br />
<br />
Aus technischer Sicht kann nur eine Person an einer Textdomain arbeiten, ohne dass man Gefahr läuft, Änderungen von jmd. anderem zu überschreiben(*). Am besten du sagst Bescheid wenn du daran arbeitest, und wirst in die Liste eingetragen.<br />
<br />
Es wäre schön wenn du eine Kampagne langfristig übernehmen würdest und als Ansprechpartner für Spieler zu Verfügung stehst.<br />
<br />
<br />
(*): Die Vorteile von Git, welches erlaubt, dass mehrere Personen gleichzeitig an etwas arbeiten, wobei jeder seine eigene Version der Datei ohne die Änderungen des Anderen hat, lassen sich hier nur umständlich anwenden. Es kann nur eine neuste Version der Datei geben. Poeditor [nicht zu Verwechseln mit Poedit] ist ein webbasiertes Tool, welches es erlaubt, dass mehrere Leute gleichzeitig dieselbe Datei bearbeiten.<br />
<br />
<br />
Einzelne Fehler können, nach einer Registrierung im Wiki, auch hier eingetragen werden, am besten mit einer korrigierten Variante:<br />
[[GermanTranslationErrors]]<br />
<br />
== Kontakt ==<br />
<br />
* Siehe "Aktuelles Übersetzungsteam".<br />
* Am besten in Wesnoths Discord Server im Channel #German -> https://discord.gg/battleforwesnoth<br />
* irc.libera.chat #wesnoth-de (irgendwer wird schon da sein, einfach warten und hin und wieder was sagen, das sollte in dem leisen Kanal auffallen...)<br />
* Der Discord und IRC Channel sind mit einem Bot verbunden.<br />
<br />
== Siehe auch ==<br />
* [[GermanTranslationErrors|Fehler]] - Eine Sammlung der bekannten und noch nicht behobenen Fehler.<br />
* [[GermanTranslationUnitNames|Liste mit Standardbegriffen, Einheitennamen, usw]]<br />
* [https://www.wesnoth.org/gettext/?view=langs&version=master&lang=de Statistiken der deutschen Übersetzung (Entwicklerversion)]<br />
* [https://www.wesnoth.org/gettext/?view=langs&version=branch&lang=de Statistiken der deutschen Übersetzung (aktuelle Nutzerversion)]<br />
* [[GettextForTranslators|Gettext für Übersetzer (nur auf Englisch)]] - Werkzeugen für .po Dateien (Poedit, Lokalize, uzw)<br />
* [[WesnothTranslations]] - Liste der Wikiseiten aller Wesnoth-Übersetzungen<br />
<br />
== Sonstiges ==<br />
* [[GermanTranslationMPCampaign|Die Chroniken von Elvenmar ~ Das zweite Zeitalter (Mehrspieler Kampagne)]] - nicht mehr betreut<br />
* [[Zeit der Mythen]]: Übersetzung des Add-Ons Era of Myths<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=GermanTranslation&diff=71277GermanTranslation2023-05-20T06:17:35Z<p>Octalot: /* Status of the Translations */ Update to match current gettext stats</p>
<hr />
<div>== Das Wort zum Geleit ==<br />
Diese Seite dient dazu, die Anstrengungen des deutschen Übersetzungsteams besser zu koordinieren. Die Übersetzung ist deshalb in Unterpunkte aufgespalten worden, so dass für alle Teammitglieder und Besucher ersichtlich ist, ob momentan bereits jemand an der Übersetzung für eine Textdomain arbeitet, und ob es einen Ansprechpartner für einzelne Kampagnen gibt.<br />
<br />
Übersetzungen basieren üblicherweise auf der aktuellen ''stable'' Version, bitte benutzt nicht die Dateien der ''master'' Version.<br />
<br />
Es ist außerdem sinnvoll vor dem Übersetzen einmal einen Blick auf [[GermanTranslationUnitNames|diese Liste]] mit stilistischen Hinweisen, Standardbegriffen, Einheitennahmen, etc. zu werfen.<br />
<br />
== Aktuelles Übersetzungsteam ==<br />
{|<br />
!style="text-align:left"| Name<br />
!style="text-align:left"| Nickname<br />
!style="text-align:left"| Emailadresse<br />
!style="text-align:left"| Anm.<br />
|-<br />
|Aaron Winter<br />
|bitron / byteron<br />
|im Discord erreichbar<br />
|Maintainer<br />
|-<br />
|<br />
|mcpgal<br />
|im Discord erreichbar<br />
|<br />
|-<br />
|<br />
|octalot<br />
|im Discord erreichbar<br />
|<br />
|-<br />
|<br />
|s1m0n<br />
|im Discord erreichbar<br />
|<br />
|}<br />
<br />
== Inaktive Übersetzer ==<br />
{|<br />
!style="text-align:left"| Name<br />
!style="text-align:left"| Nickname<br />
!style="text-align:left"| Emailadresse<br />
!style="text-align:left"| Anm.<br />
|-<br />
|Severin Glöckner<br />
|Sevu / Shiki<br />
|im Forum & Discord erreichbar<br />
|Vize-Maintainer<br />
|-<br />
|-<br />
|Christoph Berg<br />
|chrber<br />
|Christoph DOT Berg AT kpm-sport DOT de<br />
|<br />
|-<br />
|Nils Kneuper<br />
|Ivanovic<br />
|crazy-ivanovic AT gmx DOT net<br />
|<br />
|-<br />
|Oliver Lange<br />
|Crommy<br />
|oli-lange äd web Pünktchen de<br />
|<br />
|-<br />
|Tobias Schönau<br />
|SonIcco<br />
|tobias DOT schoenau AT eagerbyte DOT com<br />
|<br />
|-<br />
| –<br />
|Drakefriend<br />
|<br />
|<br />
|-<br />
|David Philippi<br />
|Torangan<br />
|david AT torangan DOT de<br />
|<br />
|-<br />
|Elias Pschernig<br />
|Allefant<br />
|allefant AT gmail DOT com<br />
|<br />
|-<br />
| -<br />
|vonHalenbach<br />
|vonHalenbach Ät users.sourceforge punkt net<br />
|<br />
|-<br />
|Sven Priess<br />
|Gedankenschinder<br />
|mail AT svenpriess DOT de<br />
|<br />
|-<br />
|Andre Schmidt<br />
|schmidta<br />
|andre AT schmidtandre DOT de<br />
|<br />
|-<br />
|Jan Greve<br />
|Jan`ger<br />
|Jan AT Phreeknet DOT org<br />
|<br />
|-<br />
|Andre<br />
|Hochbass<br />
|hochbass AT gmx DOT de<br />
|<br />
|-<br />
|Boris Stumm<br />
|quijote_<br />
|wesnoth AT bstumm DOT de<br />
|<br />
|-<br />
|Jan-Heiner Laberenz<br />
|jan-heiner<br />
|jan-heiner AT arcor DOT de<br />
|<br />
|-<br />
|Kai Ensenbach<br />
| -<br />
| -<br />
|<br />
|-<br />
|Onno Tasler<br />
|belchion<br />
|onno.tasler AT spamfence DOT net<br />
|<br />
|-<br />
|Ruben Philipp<br />
|The Very Uhu<br />
|the15thfeuergnu AT yahoo DOT de<br />
|<br />
|-<br />
|Stefan<br />
|Termimad<br />
|steve213 AT gmx DOT de<br />
|<br />
|-<br />
|Stephan Grochtmann<br />
|Schattenstephan<br />
|Schattenstephan AT gmx DOT com<br />
|<br />
|-<br />
| -<br />
|ammoq<br />
|erich DOT kitzmueller AT chello DOT at<br />
|<br />
|-<br />
|Arndt<br />
| -<br />
|muehlenf AT igi DOT tugraz DOT at<br />
|<br />
|-<br />
| -<br />
|ja-el<br />
| -<br />
|<br />
|-<br />
|Jonas<br />
| -<br />
|celb AT gmx DOT at<br />
|<br />
|-<br />
|Michael Vondung<br />
| -<br />
| -<br />
|<br />
|-<br />
|Olaf M.<br />
|milamber<br />
| -<br />
|<br />
|-<br />
|Uz-Friedrich Valentin<br />
|Uz<br />
|uz_ AT users DOT sourceforge DOT net<br />
|<br />
|-<br />
|Rhonda D'Vine<br />
|Rhonda<br />
|rhonda AT deb DOT at<br />
|<br />
|-<br />
|Christoph Lange<br />
|madelgijs<br />
|christoph DOT t DOT lange AT googlemail DOT com<br />
|<br />
|-<br />
|<br />
|-<br />
|<br />
|Flatterdorsch<br />
|im Discord erreichbar<br />
|<br />
|-<br />
|<br />
|Nevermore901<br />
|im Discord erreichbar<br />
|<br />
|}<br />
<br />
== Status der Übersetzung ==<br />
Wenn bei einer Kampagne für einen Betreuer ein '''-''' angegeben ist, bedeutet das nicht, dass sie gar nicht übersetzt wird. Dies wird von einem der aktiven Übersetzer übernommen, wenn dieser Zeit findet.<br />
<br />
Wünschenswert wäre es jedoch, wenn sich neue Übersetzer finden würden, die die Betreung einer dieser Kampagnen übernehmen würden damit die Qualität auch weiterhin auf dem hohen Niveau gesichert ist.<br />
<br />
{|border="1"<br />
!Name<br />
![[GettextForTranslators#Textdomains_and_getting_the_files_to_translate | Textdomain]]<br />
!Betreuer<br />
!Nutzerversion<br>1.16<br />
!Entwicklerversion<br>1.17<br />
|-<br />
!colspan="6"|Offizielle Kampagnen<br />
|-<br />
|Das Zepter des Feuers<br />
|wesnoth-sof<br />
| -<br />
|Fertig<br />
|-<br />
|Die dunklen Künste<br />
|wesnoth-did<br />
| -<br />
|Fertig<br />
|-<br />
|Die Geschichte zweier Brüder<br />
|wesnoth-tb<br />
| -<br />
|Fertig<br />
|-<br />
|Die Südwacht<br />
|wesnoth-tsg<br />
| -<br />
|Fertig<br />
|-<br />
|Der Thronerbe<br />
|wesnoth-httt<br />
| -<br />
|Fertig<br />
|-<br />
|Der Aufstieg Wesnoths<br />
|wesnoth-trow<br />
| -<br />
|Fertig<br />
|-<br />
|Freiheit<br />
|wesnoth-l<br />
| -<br />
|Fertig<br />
|-<br />
|Invasion der Finsternis<br />
|wesnoth-ei<br />
| -<br />
| -<br />
|-<br />
|Schwarzauges Sohn<br />
|wesnoth-sotbe<br />
| -<br />
|Fertig<br />
|-<br />
|Unter brennenden Sonnen<br />
|wesnoth-utbs<br />
|octalot<br />
|In Nachbearbeitung<br />
|-<br />
|Wiedergeburt des Nordens<br />
|wesnoth-nr<br />
| -<br />
| -<br />
|-<br />
|Der Hammer von Thursagan<br />
|wesnoth-thot<br />
| -<br />
|Fertig<br />
|-<br />
|Die Legende von Wesmere<br />
|wesnoth-low<br />
| -<br />
| -<br />
|-<br />
|Delfadors Memoiren<br />
|wesnoth-dm<br />
| -<br />
|Unklar<br />
|-<br />
|Stille Wasser<br />
|wesnoth-dw<br />
| -<br />
|Fertig<br />
|-<br />
|Geheimnisse der Ahnen<br />
|wesnoth-sota<br />
| -<br />
|Fertig<br />
|-<br />
|World Conquest<br />
|wesnoth-wc<br />
| -<br />
|Unklar<br />
|große Korrektur des englische Text gebietet<br />
|-<br />
!colspan="6"|Einheiten<br />
|-<br />
|Alle Einheiten<br />
|wesnoth-units<br />
| -<br />
|Fertig<br />
|-<br />
!colspan="6"|Sonstiges<br />
|-<br />
|Einführung<br />
|wesnoth-tutorial<br />
| -<br />
|Fertig<br />
|-<br />
|Eine neue Heimat<br />
|wesnoth-anl<br />
| -<br />
|Fertig<br />
|-<br />
|Steam Store Seite<br />
| -<br />
| -<br />
| -<br />
|-<br />
!colspan="6"|Benutzeroberfläche<br />
|-<br />
|Allgemeines<br />
|wesnoth<br />
|Bitron<br />
|Fertig<br />
|-<br />
|Allgemeines<br />
|wesnoth-lib<br />
|Bitron<br />
|Fertig<br />
|-<br />
|Hilfe<br />
|wesnoth-help<br />
| -<br />
|Fertig<br />
|-<br />
|Mehrspieler<br />
|wesnoth-multiplayer<br />
| -<br />
|Fertig<br />
|-<br />
|Editor<br />
|wesnoth-editor<br />
|Bitron<br />
|Fertig<br />
|-<br />
!colspan="6"|Dokumentation<br />
|-<br />
|Handbuch<br />
|wesnoth-manual<br />
| -<br />
|Fertig<br />
|-<br />
|Handbuchseiten<br />
|wesnoth-manpages<br />
| -<br />
|Fertig<br />
|-<br />
|}<br />
<br />
== Statusbeschreibungen ==<br />
{| style="margin-top: 1em; text-align: left" border="1"<br />
! scope="row"| Unklar<br />
| Die Zuweisung der Übersetzung ist unklar.<br>Sie kann also bereits vergeben sein oder an einen neuen Übersetzer vergeben werden.<br />
|-<br />
! scope="row"| Nicht Begonnen<br />
| Es werden noch ÜbersetzerInnen gesucht. Bei Interesse einfach melden.<br />
|-<br />
! scope="row"| In Bearbeitung<br />
| An der Übersetzung wird gearbeitet.<br />
|-<br />
! scope="row"| Korrektur<br />
| Die Übersetzung ist beim Korrekturlesen.<br />
|-<br />
! scope="row"| Fertig<br />
| Die Übersetzung ist abgeschlossen.<br />
|-<br />
! scope="row"| In Nachbearbeitung<br />
| Größtenteils fertig, nur einzelne Teile fehlen.<br />
|}<br />
<br />
== Gesucht ==<br />
<br />
Manche Kampagnen haben bessere Übersetzungen als andere. An manchen Stellen ist die Übersetzung zwischendurch unpassend, teils fehlt der Kontextbezug. Auch Rechtschreibfehler existieren, welche jedem zweiten Spieler auffallen, jedoch niemand meldet oder korrigiert. Und manchmal ist der Wortlaut der Übersetzung auch einfach zu sehr ans Englische angelehnt.<br />
<br />
<br />
Es werden Leute gesucht, welche Interesse daran haben eine Kampagne zu übernehmen und auszugestalten. Dies kann z.B. heißen, die Kampagne selber zu spielen und dabei Screenshots von seltsamen Dialogen zu machen um diese später auszubessern, oder andere Dinge zu ändern. Ggf. findet man dabei auch Sachen welche man im Englischen ebenfalls ändern könnte, sei es der Text, die Story oder anderes.<br />
Es ist verlockend, relativ wortgetreu zu Übersetzen, aber freiere Übersetzungen sind in der Regel deutlich besser.<br />
<br />
Aus technischer Sicht kann nur eine Person an einer Textdomain arbeiten, ohne dass man Gefahr läuft, Änderungen von jmd. anderem zu überschreiben(*). Am besten du sagst Bescheid wenn du daran arbeitest, und wirst in die Liste eingetragen.<br />
<br />
Es wäre schön wenn du eine Kampagne langfristig übernehmen würdest und als Ansprechpartner für Spieler zu Verfügung stehst.<br />
<br />
<br />
(*): Die Vorteile von Git, welches erlaubt, dass mehrere Personen gleichzeitig an etwas arbeiten, wobei jeder seine eigene Version der Datei ohne die Änderungen des Anderen hat, lassen sich hier nur umständlich anwenden. Es kann nur eine neuste Version der Datei geben. Poeditor [nicht zu Verwechseln mit Poedit] ist ein webbasiertes Tool, welches es erlaubt, dass mehrere Leute gleichzeitig dieselbe Datei bearbeiten.<br />
<br />
<br />
Einzelne Fehler können, nach einer Registrierung im Wiki, auch hier eingetragen werden, am besten mit einer korrigierten Variante:<br />
[[GermanTranslationErrors]]<br />
<br />
== Kontakt ==<br />
<br />
* Siehe "Aktuelles Übersetzungsteam".<br />
* Am besten in Wesnoths Discord Server im Channel #German -> https://discord.gg/battleforwesnoth<br />
* irc.libera.chat #wesnoth-de (irgendwer wird schon da sein, einfach warten und hin und wieder was sagen, das sollte in dem leisen Kanal auffallen...)<br />
* Der Discord und IRC Channel sind mit einem Bot verbunden.<br />
<br />
== Siehe auch ==<br />
* [[GermanTranslationErrors|Fehler]] - Eine Sammlung der bekannten und noch nicht behobenen Fehler.<br />
* [[GermanTranslationUnitNames|Liste mit Standardbegriffen, Einheitennamen, usw]]<br />
* [https://www.wesnoth.org/gettext/?view=langs&version=master&lang=de Statistiken der deutschen Übersetzung (Entwicklerversion)]<br />
* [https://www.wesnoth.org/gettext/?view=langs&version=branch&lang=de Statistiken der deutschen Übersetzung (aktuelle Nutzerversion)]<br />
* [[WesCamp|Wescamp i18n (nur auf Englisch)]] - Informationen zum Übersetzen von inoffiziellen Kampagnen<br />
* [[WesnothTranslations]] - Liste der Wikiseiten aller Wesnoth-Übersetzungen<br />
<br />
== Sonstiges ==<br />
* [[GermanTranslationMPCampaign|Die Chroniken von Elvenmar ~ Das zweite Zeitalter (Mehrspieler Kampagne)]] - nicht mehr betreut<br />
* [[Zeit der Mythen]]: Übersetzung des Add-Ons Era of Myths<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignEliador&diff=71276CampaignEliador2023-05-20T06:03:54Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2008}}<br />
<br />
== Translation of Invasion of Eliador ==<br />
<br />
This is a list of the people currently translating Invasion of Eliador into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>German (de)</td><td>vonHalenbach</td><td>completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>Brivido</td><td>completed</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>Unassigned</td><td>completed (inactive)</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Eliador&order=trans Translation stats for Invasion of Eliador]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignFlightFreedom&diff=71275CampaignFlightFreedom2023-05-20T06:03:31Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2008}}<br />
<br />
== Translation of Flight to Freedom ==<br />
<br />
This is a list of the people currently translating [[FlightToFreedom|Flight to Freedom]] into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>Bertrand Grietens</td><td>Work in progress</td></tr><br />
<tr><td>German (de)</td><td>The Very Uhu </td><td>completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>luciano</td><td>work in progress</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>Unassigned</td><td>inactive</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Flight_Freedom&order=trans Translation stats for Flight to Freedom]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignLiberty&diff=71274CampaignLiberty2023-05-20T06:02:39Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2008}}<br />
<br />
== Translation of Liberty ==<br />
<br />
This is a list of the people currently translating Liberty into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>kilder</td><td>completed</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>Maarten</td><td>correction</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>Bertram</td><td>work in progress</td></tr><br />
<tr><td>German (de)</td><td>Torangan</td><td>completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>Americo Iacovizzi (Dark Amex)</td><td>work in progress</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>capitol</td><td>completed</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Liberty&order=trans Translation stats for Liberty]<br />
* [[CharactersStorys#Liberty | List of Hero descriptions]]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignMageRepublic&diff=71273CampaignMageRepublic2023-05-20T06:01:56Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2008}}<br />
<br />
== Translation of Mage Republic ==<br />
<br />
This is a list of the people currently translating Mage Republic into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>Ricardo Sodré Andrade ([http://www.wesnoth.org/wiki/User:Corvo Corvo])</td><td>work in progress</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>German (de)</td><td>Allefant</td><td>completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>RokStar</td><td>completed</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>Nikita(ILikeProgramming)</td><td>completed</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>Unassigned</td><td>completed (inactive)</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Mage_Republic&order=trans Translation stats for Mage Republic]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignMysteryCampaign&diff=71272CampaignMysteryCampaign2023-05-20T06:01:28Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2008}}<br />
<br />
== Translation of Mystery Campaign ==<br />
<br />
This is a list of the people currently translating Mystery Campaign into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>Claudio Terra</td><td>Completed</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>Joe Dalton</td><td>completed</td></tr><br />
<tr><td>Dutch (nl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>German (de)</td><td>Torangan</td><td>completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>RokStar</td><td>completed</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>Unassigned</td><td>completed (inactive)</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Mystery_Campaign&order=trans Translation stats for Mystery Campaign]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignNorthernRebirth&diff=71271CampaignNorthernRebirth2023-05-20T06:00:03Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2008}}<br />
<br />
== Translation of Northern Rebirth ==<br />
<br />
This is a list of the people currently translating Northern Rebirth into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>British English (en_GB)</td><td>[[User:Placid|Placid]]</td><td>completed</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>Fopper</td><td>Work in progress</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>[[User:Gdou|Gdou]]</td><td>Completed</td></tr><br />
<tr><td>German (de)</td><td>[[User:Crommy|Crommy]]</td><td>Completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>Luciano</td><td>Work in progress</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>Unassigned</td><td>stalled</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Northern_Rebirth&order=trans Translation stats for Northern Rebirth]<br />
* [[CharactersStorys#Northern_Rebirth | List of Hero descriptions]]<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignSavingElensefar&diff=71270CampaignSavingElensefar2023-05-20T05:59:14Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2008}}<br />
<br />
== Translation of Saving Elensefar ==<br />
<br />
This is a list of the people currently translating [[Saving Elensefar]] into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>Moroder</td><td>Completa</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>Galactic turkey</td><td>done, need correctors</td></tr><br />
<tr><td>German (de)</td><td>Schattenstephan</td><td>work in progress</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>luciano</td><td>work in progress</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>Artanis</td><td>work in progress</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>Unassigned</td><td>completed (inactive)</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Saving_Elensefar&order=trans Translation stats for Saving Elensefar]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignSeptreOfFire&diff=71269CampaignSeptreOfFire2023-05-20T05:58:26Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2008}}<br />
<br />
== Translation of Sceptre of Fire ==<br />
This is a list of the people currently translating Sceptre of Fire into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>British English (en_GB)</td><td>pjr</td><td>completed</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>Joe Dalton</td><td>in progress</td></tr><br />
<tr><td>Dutch (nl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>[[User:Gdou|Gdou]]</td><td>completed</td></tr><br />
<tr><td>German (de)</td><td>Ivanovic</td><td>completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>Sanna</td><td>completed</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* Character informations for translators [[CharactersStorys#Sceptre_of_Fire]]<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Sceptre_of_Fire&order=trans Translation stats for Sceptre of Fire]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignUnrest&diff=71268CampaignUnrest2023-05-20T05:57:53Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2008}}<br />
<br />
== Translation of Unrest in Elfland ==<br />
This is a list of the people currently translating Unrest in Elfland into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>kilder</td><td>completed</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>Joedalton</td><td>correction</td></tr><br />
<tr><td>Dutch (nl)</td><td>Foppe Benedictus</td><td>work in progress</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>German (de)</td><td>Ivanovic</td><td>completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>[[HungarianTranslation|Műhelyben]]</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>RokStar</td><td>completed</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>Unassigned</td><td>completed (inactive)</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Unrest&order=trans Translation stats for Unrest in Elfland]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignNewThreat&diff=71267CampaignNewThreat2023-05-20T05:56:49Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2008}}<br />
<br />
== Translation of A New Threat ==<br />
<br />
This is a list of the people currently translating Mage Republic into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>Ricardo Sodré Andrade ([http://www.wesnoth.org/wiki/User:Corvo Corvo])</td><td>work in progress</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>Joe Dalton</td><td>correction</td></tr><br />
<tr><td>Dutch (nl)</td><td>Tux2B</td><td>work in progress</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>Tux2B</td><td>work in progress</td></tr><br />
<tr><td>German (de)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>brivido</td><td>completed</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>Nikita(ILikeProgramming)</td><td>work in progress</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>Unassigned</td><td>inactive</td></tr><br />
<tr><td>Turkish (tr)</td><td>Pınar</td><td>work in progress</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Dark_Elves&order=trans Translation stats for A New Threat]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignAnOrcishIncursion&diff=71266CampaignAnOrcishIncursion2023-05-20T05:54:26Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|status of who was working on it in 2011}}<br />
<br />
== Translation of An Orcish Incursion ==<br />
<br />
This is a list of the people currently translating An Orcish Incursion into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>Claudio Terra</td><td>Completa</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>work in progress</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>Foppe Benedictus</td><td>Completed</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>[[User:Japsu|Japsu]]</td><td>completed</td></tr><br />
<tr><td>French (fr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>German (de)</td><td>Torangan</td><td>completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>RokStar</td><td>completed</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>[[User:Mist|Mist]]</td><td>completed</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://gettext.wesnoth.org/index.php?package=wesnoth-aoi&order=trans Translation stats for Orcish Incursion]<br />
* [[CharactersStorys#An_Orcish_Incursion | List of Hero Description]]<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=Template:WML_Tags_by_Category&diff=71240Template:WML Tags by Category2023-05-19T08:17:12Z<p>Octalot: Replace WesCamp link for [textdomain]</p>
<hr />
<div>{| class="gallery" style="width:225px;float: right;border: 1px solid #B48648; color:#B48648; font-size: 7pt;margin-left;10px;"<br />
|-<br />
|<br />
<span style="float: right;"><small class="editlink noprint plainlinksneverexpand">[{{SERVER}}{{localurl:Template:WML Tags by Category|action=edit}} edit ]</small></span><br />
'''WML Tags by Category'''<br />
<br />
|-<br />
|''Top-level tags:'' <br />
[[AdvancedPreferenceWML|advanced_preference]], <br />
[[BinaryPathWML|binary_path]],<br />
[[CampaignWML#The_.5Bcampaign.5D_tag|campaign]],<br />
[[CoreWML|core]],<br />
[[EraWML|era]],<br />
[[FontsWML|fonts]],<br />
[[GameConfigWML|game_config]],<br />
[[HelpWML|help]],<br />
[[LanguageWML|language]],<br />
[[LocaleWML|locale]],<br />
[[ModificationWML|modification]],<br />
[[ScenarioWML|multiplayer]],<br />
[[TerrainGraphicsWML|terrain_graphics]], <br />
[[TerrainWML|terrain_type]], <br />
[[ThemeWML|theme]], <br />
[[ScenarioWML|tutorial]], <br />
[[UnitsWML|units]];<br />
<br />
|-<br />
|''AI:'' <br />
[[Creating_Custom_AIs#Behavior_Candidate_Actions|add_ai_behavior]],<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Top-level_Elements|ai]],<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|aspect]],<br />
[[AiWML#List_of_AI_Aspects|avoid]],<br />
[[Wesnoth_AI_Framework#The_.5Bcandidate_action.5D_Tag|candidate_action]], <br />
[[AiWML#The_.5Bgoal.5D_Tag|criteria]],<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Engines|engine]], <br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Aspects|facet]],<br />
[[AiWML#Filtering_Combat_with_the_.27attacks.27_Aspect|filter_enemy]],<br />
[[AiWML#Filtering_Combat_with_the_.27attacks.27_Aspect|filter_own]],<br />
[[AiWML#The_.5Bgoal.5D_Tag|goal]],<br />
[[AiWML#List_of_AI_Aspects|leader_goal]],<br />
[[AI_Recruitment#Aspect_recruitment_instructions|limit]],<br />
[[Micro AIs|micro_ai]],<br />
[[Wesnoth_AI_Framework#The_.5Bai.5D_Tag_.E2.80.94_Stages|stage]];<br />
<br />
|-<br />
|''Savefile and replay WML:'' <br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|advances]],<br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|attacks]],<br />
[[ReplayWML|choose]],<br />
[[ReplayWML|command]],<br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|deaths]],<br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|defends]],<br />
[[ReplayWML|destination]],<br />
[[ReplayWML|end_turn]],<br />
[[ReplayWML|init_side]],<br />
[[StatisticalScenarioWML|killed]],<br />
[[ReplayWML|move]],<br />
[[ReplayWML|random]], <br />
[[ReplayWML|recall]],<br />
[[StatisticalScenarioWML|recalls]],<br />
[[ReplayWML|recruit]], <br />
[[StatisticalScenarioWML|recruits]],<br />
[[ReplayWML|replay]], <br />
[[SavefileWML|replay_start]],<br />
[[ReplayWML|results]], <br />
[[ReplayWML|sequence]], <br />
[[StatisticalScenarioWML#The_.5Bstatistics.5D_tag|statistics]],<br />
[[StatisticalScenarioWML#The_.5Bteam.5D_tag|team]],<br />
[[SavefileWML|menu_item]], <br />
[[SavefileWML|save]], <br />
[[SavefileWML|snapshot]],<br />
[[ReplayWML|source]],<br />
[[VariablesWML#The_.5Bvariables.5D_tag|variables]];<br />
<br />
|-<br />
|''Editor and maps WML:'' <br />
[[EditorWML#The_.5Bbrush.5D_tag|brush]],<br />
[[MapGeneratorWML#The_Default_Generator|castle]], <br />
[[MapGeneratorWML#The_Cave_Generator|chamber]], <br />
[[MapGeneratorWML#The_Default_Generator|convert]], <br />
[[EditorWML#The_.5Beditor_group.5D_tag|editor_group]],<br />
[[EditorWML#The_.5Beditor_music.5D_tag|editor_music]], <br />
[[EditorWML#The_.5Beditor_times.5D_tag|editor_times]],<br />
[[MapGeneratorWML|generator]],<br />
[[MapGeneratorWML|height]], <br />
[[MapGeneratorWML#The_Cave_Generator|items]],<br />
[[MapGeneratorWML|naming]], <br />
[[MapGeneratorWML|road_cost]],<br />
[[MapGeneratorWML#The_Cave_Generator|settings]], <br />
[[MapGeneratorWML|village_naming]]; <br />
<br />
|-<br />
|''Wesnoth interface markup''<br />
[[ThemeWML#.5Bstatus.5D|expenses]],<br />
[[ThemeWML|gold]],<br />
[[ThemeWML#.5Bstatus.5D|income]],<br />
[[ThemeWML|label]],<br />
[[ThemeWML#.5Bmain_map.5D|main_map]],<br />
[[ThemeWML#.5Bmain_map_border.5D|main_map_border]], <br />
[[ThemeWML#.5Bmenu.5D|menu]], <br />
[[ThemeWML#.5Bmini_map.5D|mini_map]],<br />
[[ThemeWML#.5Bstatus.5D|num_units]],<br />
[[ThemeWML#.5Bstatus.5D|observers]],<br />
[[ThemeWML#.5Bpanel.5D|panel]], <br />
[[ThemeWML#.5Bstatus.5D|position]],<br />
[[ThemeWML|resolution]], <br />
[[ThemeWML|side_playing]], <br />
[[ThemeWML|status]],<br />
[[ThemeWML#.5Bstatus.5D|time_of_day]],<br />
[[ThemeWML#.5Bstatus.5D|turn]], <br />
[[ThemeWML#.5Bstatus.5D|unit_abilities]], <br />
[[ThemeWML#.5Bstatus.5D|unit_alignment]], <br />
[[ThemeWML#.5Bstatus.5D|unit_description]], <br />
[[ThemeWML#.5Bstatus.5D|unit_hp]], <br />
[[ThemeWML#.5Bstatus.5D|unit_image]], <br />
[[ThemeWML#.5Bstatus.5D|unit_level]], <br />
[[ThemeWML#.5Bstatus.5D|unit_moves]],<br />
[[ThemeWML#.5Bstatus.5D|unit_profile]], <br />
[[ThemeWML#.5Bstatus.5D|unit_status]],<br />
[[ThemeWML#.5Bstatus.5D|unit_traits]], <br />
[[ThemeWML#.5Bstatus.5D|unit_weapons]],<br />
[[ThemeWML#.5Bstatus.5D|unit_xp]],<br />
[[ThemeWML#.5Bstatus.5D|upkeep]],<br />
[[ThemeWML#.5Bstatus.5D|villages]];<br />
|-<br />
|''Units animation WML''<br />
[[AnimationWML|animation]],<br />
[[AnimationWML|attack_anim]],<br />
[[AnimationWML#death|death]], <br />
[[AnimationWML#defend|defend]],<br />
[[AnimationWML#draw_weapon_anim|draw_weapon_anim]],<br />
[[AnimationWML#.5Bif.5D_and_.5Belse.5D|else]],<br />
[[AnimationWML#Frames|frame]],<br />
[[AnimationWML#healed|healed_anim]], <br />
[[AnimationWML#healing|healing_anim]], <br />
[[AnimationWML#idling|idle_anim]], <br />
[[AnimationWML#.5Bif.5D_and_.5Belse.5D|if]],<br />
[[AnimationWML#leading|leading_anim]], <br />
[[AnimationWML#levelin|levelin_anim]],<br />
[[AnimationWML#levelout|levelout_anim]], <br />
[[AnimationWML#The_content_of_a_frame|missile_frame]],<br />
[[AnimationWML#movement|movement_anim]], <br />
[[AnimationWML#post_movement|post_movement_anim]], <br />
[[AnimationWML#pre_movement|pre_movement_anim]], <br />
[[AnimationWML#recruited|recruit_anim]], <br />
[[AnimationWML#recruiting|recruiting_anim]], <br />
[[AnimationWML#Simplified_animation_blocks|extra_anim]],<br />
[[AnimationWML#sheath_weapon|sheath_weapon_anim]], <br />
[[AnimationWML#standing|standing_anim]], <br />
[[AnimationWML#pre_teleport|teleport_anim]],<br />
[[AnimationWML#victory|victory_anim]];<br />
|-<br />
|''Everything else in alphabetical order''<br />
<br />
''A:'' <br />
<br />
[[CampaignWML#Campaign credits|about]],<br />
[[AbilitiesWML|abilities]],<br />
[[SingleUnitWML|advance]],<br />
[[UnitTypeWML|advancefrom]],<br />
[[UnitTypeWML#After_max_level_advancement_.28AMLA.29|advancement]],<br />
[[DirectActionsWML#.5Ballow_end_turn.5D|allow_end_turn]],<br />
[[DirectActionsWML#.5Ballow_extra_recruit.5D|allow_extra_recruit]],<br />
[[DirectActionsWML#.5Ballow_recruit.5D|allow_recruit]],<br />
[[DirectActionsWML#.5Ballow_undo.5D|allow_undo]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|animate]],<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|animate_unit]],<br />
[[UnitTypeWML#Attacks|attack]];<br />
<br />
''B:'' <br />
<br />
[[UnitTypeWML#Other_tags|base_unit]], <br />
[[AbilitiesWML|berserk]]; <br />
<br />
''C:'' <br />
<br />
[[ConditionalActionsWML#.5Bcommand.5D|command]],<br />
[[DirectActionsWML#.5Bcapture_village.5D|capture_village]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|chance_to_hit]], <br />
[[InterfaceActionsWML#.5Bchat.5D|chat]],<br />
[[InterfaceActionsWML#.5Bclear_menu_item.5D|clear_menu_item]],<br />
[[InterfaceActionsWML#.5Bcolor_adjust.5D|color_adjust]];<br />
<br />
''D:'' <br />
<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|damage]],<br />
[[UnitsWML#.5Bmovetype.5D|defense]],<br />
[[InterfaceActionsWML#.5Bdelay.5D|delay]],<br />
[[InterfaceActionsWML#.5Bdeprecated_message.5D|deprecated_message]],<br />
[[AbilitiesWML|disable]],<br />
[[DirectActionsWML#.5Bdisallow_end_turn.5D|disallow_end_turn]],<br />
[[DirectActionsWML#.5Bdisallow_extra_recruit.5D|disallow_extra_recruit]],<br />
[[DirectActionsWML#.5Bdisallow_recruit.5D|disallow_recruit]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|drains]]; <br />
<br />
''E:'' <br />
<br />
[[EffectWML|effect]],<br />
[[DirectActionsWML#.5Bendlevel.5D|endlevel]],<br />
[[DirectActionsWML#.5Bend_turn.5D|end_turn]],<br />
[[CampaignWML#Campaign_credits|entry]], <br />
[[EventWML|event]];<br />
<br />
''F:''<br />
<br />
[[InterfaceActionsWML#.5Banimate_unit.5D|facing]], <br />
[[InterfaceActionsWML#.5Bmove_units_fake.5D|fake_unit]], <br />
[[UnitTypeWML#Other_tags|female]], <br />
[[InternalActionsWML#.5Bfire_event.5D|fire_event]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|firststrike]], <br />
[[InterfaceActionsWML#.5Bfloating_text.5D|floating_text]];<br />
<br />
''G:'' <br />
<br />
[[DirectActionsWML#.5Bgold.5D|gold]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|gold_carryover]];<br />
<br />
''H:'' <br />
<br />
[[DirectActionsWML#.5Bharm_unit.5D|harm_unit]],<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|heal_on_hit]], <br />
[[DirectActionsWML#.5Bheal_unit.5D|heal_unit]],<br />
[[AbilitiesWML|heals]], <br />
[[UnitsWML#.5Bhide_help.5D|hide_help]],<br />
[[InterfaceActionsWML#.5Bhide_unit.5D|hide_unit]],<br />
[[AbilitiesWML|hides]];<br />
<br />
''I:'' <br />
<br />
[[AbilitiesWML|illuminates]], <br />
[[TerrainGraphicsWML|image]],<br />
[[InterfaceActionsWML#.5Binspect.5D|inspect]],<br />
[[InterfaceActionsWML#.5Bitem.5D|item]]; <br />
<br />
''K:'' <br />
<br />
[[DirectActionsWML#.5Bkill.5D|kill]];<br />
<br />
''L:'' <br />
<br />
[[InterfaceActionsWML#.5Blabel.5D|label]],<br />
[[AbilitiesWML|leadership]], <br />
[[DirectActionsWML#.5Blift_fog.5D|lift_fog]],<br />
[[InterfaceActionsWML#.5Block_view.5D|lock_view]];<br />
<br />
''M:'' <br />
<br />
[[UnitTypeWML#Other_tags|male]], <br />
[[InterfaceActionsWML#.5Bmessage.5D|message]],<br />
[[SingleUnitWML|modifications]],<br />
[[DirectActionsWML#.5Bmodify_ai.5D|modify_ai]],<br />
[[DirectActionsWML#.5Bmodify_side.5D|modify_side]],<br />
[[DirectActionsWML#.5Bmodify_turns.5D|modify_turns]],<br />
[[DirectActionsWML#.5Bmodify_unit.5D|modify_unit]],<br />
[[DirectActionsWML#.5Bmove_unit.5D|move_unit]],<br />
[[InterfaceActionsWML#.5Bmove_unit_fake.5D|move_unit_fake]],<br />
[[InterfaceActionsWML#.5Bmove_units_fake.5D|move_units_fake]],<br />
[[UnitsWML#.5Bmovetype.5D|movement costs]],<br />
[[UnitsWML#.5Bmovetype.5D|movetype]],<br />
[[EraWML|multiplayer_side]],<br />
[[MusicListWML#.5Bmusic.5D|music]];<br />
<br />
''N:'' <br />
<br />
[[InterfaceActionsWML#.5Bobjectives.5D|note]]; <br />
<br />
''O:'' <br />
<br />
[[DirectActionsWML#.5Bobject.5D|object]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|objective]],<br />
[[InterfaceActionsWML#.5Bobjectives.5D|objectives]],<br />
[[InterfaceActionsWML#.5Bopen_help.5D|open_help]],<br />
[[InterfaceActionsWML#.5Bmessage.5D|option]],<br />
[[OptionWML|options]];<br />
<br />
''P:'' <br />
<br />
[[IntroWML|part]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|petrifies]], <br />
[[DirectActionsWML#.5Bpetrify.5D|petrify]], <br />
[[DirectActionsWML#.5Bplace_shroud.5D|place_shroud]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|plague]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|poison]], <br />
[[UnitTypeWML#Other_tags|portrait]], <br />
[[InterfaceActionsWML#.5Bprint.5D|print]]; <br />
<br />
''R:'' <br />
<br />
[[UnitsWML#.5Brace.5D|race]], <br />
[[DirectActionsWML#.5Brecall.5D|recall]], <br />
[[InterfaceActionsWML#.5Bredraw.5D|redraw]],<br />
[[AbilitiesWML|regenerate]], <br />
[[InterfaceActionsWML#.5Bremove_item.5D|remove_item]], <br />
[[DirectActionsWML#.5Bremove_shroud.5D|remove_shroud]], <br />
[[InterfaceActionsWML#.5Bremove_sound_source.5D|remove_sound_source]], <br />
[[InterfaceActionsWML#.5Bremove_unit_overlay.5D|remove_unit_overlay]],<br />
[[DirectActionsWML#.5Breplace_map.5D|replace_map]], <br />
[[DirectActionsWML#.5Breplace_schedule.5D|replace_schedule]], <br />
[[DirectActionsWML#.5Breset_fog.5D|reset_fog]], <br />
resistance&nbsp;([[AbilitiesWML|ability]], [[UnitsWML#.5Bmovetype.5D|unit]]),<br />
[[InternalActionsWML#.5Brole.5D|role]], <br />
[[TerrainMaskWML|rule]];<br />
<br />
''S:'' <br />
<br />
[[ScenarioWML|scenario]],<br />
[[InterfaceActionsWML#.5Bscroll.5D|scroll]], <br />
[[InterfaceActionsWML#.5Bscroll_to.5D|scroll_to]],<br />
[[InterfaceActionsWML#.5Bscroll_to_unit.5D|scroll_to_unit]], <br />
[[HelpWML|section]], <br />
[[InterfaceActionsWML#.5Bselect_unit.5D|select_unit]], <br />
[[DirectActionsWML#.5Bset_extra_recruit.5D|set_extra_recruit]],<br />
[[InterfaceActionsWML#.5Bset_menu_item.5D|set_menu_item]], <br />
[[DirectActionsWML#.5Bset_recruit.5D|set_recruit]],<br />
[[EffectWML|set_specials]], <br />
show_if&nbsp;([[InterfaceActionsWML#.5Bmessage.5D|message]], [[InterfaceActionsWML#.5Bset_menu_item.5D|set_menu_item]]),<br />
[[InterfaceActionsWML#.5Bshow_objectives.5D|show_objectives]],<br />
[[SideWML|side]], <br />
[[AbilitiesWML|skirmisher]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|slow]], <br />
[[InterfaceActionsWML#.5Bsound.5D|sound]], <br />
[[InterfaceActionsWML#.5Bsound_source.5D|sound_source]], <br />
[[DirectActionsWML#.5Btunnel.5D|source]]&nbsp;(teleport),<br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|specials]], <br />
[[SingleUnitWML|status]], <br />
[[IntroWML|story]], <br />
[[AbilitiesWML#The_.5Bspecials.5D_tag|swarm]];<br />
<br />
''T:'' <br />
<br />
[[DirectActionsWML#.5Btunnel.5D|target]], <br />
teleport&nbsp;([[AbilitiesWML|ability]], [[DirectActionsWML#.5Bteleport.5D|action]]),<br />
[[DirectActionsWML#.5Bterrain.5D|terrain]], <br />
[[TerrainMaskWML|terrain_mask]], <br />
[[ScenarioWML#Test_scenario|test]],<br />
[[InterfaceActionsWML#.5Bmessage.5D|text_input]], <br />
[[GettextForWesnothDevelopers#The_textdomain_tag|textdomain]],<br />
[[TerrainGraphicsWML|tile]], <br />
[[TimeWML|time]], <br />
[[DirectActionsWML#.5Btime_area.5D|time_area]], <br />
[[HelpWML|topic]], <br />
[[HelpWML|toplevel]], <br />
[[UnitsWML#.5Btrait.5D|trait]], <br />
[[DirectActionsWML#.5Btransform_unit.5D|transform_unit]], <br />
[[DirectActionsWML#.5Btunnel.5D|tunnel]];<br />
<br />
''U:'' <br />
<br />
[[InterfaceActionsWML#.5Bunhide_unit.5D|unhide_unit]], <br />
[[SingleUnitWML|unit]],<br />
[[InterfaceActionsWML#.5Bunit_overlay.5D|unit_overlay]], <br />
[[UnitTypeWML|unit_type]], <br />
[[UnitsWML|units]],<br />
[[InterfaceActionsWML#.5Bunlock_view.5D|unlock_view]],<br />
[[DirectActionsWML#.5Bunpetrify.5D|unpetrify]];<br />
<br />
''V:'' <br />
<br />
[[UnitTypeWML#Other_tags|variation]], <br />
[[SideWML|village]],<br />
[[InterfaceActionsWML#.5Bvolume.5D|volume]];<br />
<br />
''W:'' <br />
<br />
[[InterfaceActionsWML#.5Bwml_message.5D|wml_message]];<br />
|-<br />
|''Filtering''<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_ability|affect_adjacent]],<br />
[[StandardSideFilter|allied_with]], <br />
[[StandardSideFilter|enemy_of]], <br />
[[StandardUnitFilter|filter_adjacent]], <br />
[[StandardLocationFilter|filter_adjacent_location]], <br />
[[FilterWML#Filtering_Weapons|filter_attack]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_attacker]], <br />
[[AbilitiesWML#Common_keys_and_tags_for_every_ability|filter_base_value]], <br />
[[EventWML#.5Bfilter_condition.5D|filter_condition]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_defender]], <br />
[[StandardLocationFilter|filter_location]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_opponent]], <br />
[[StandardLocationFilter|filter_owner]], <br />
[[StandardLocationFilter|filter_radius]], <br />
[[SingleUnitWML|filter_recall]], <br />
[[StandardUnitFilter|filter_second]],<br />
[[FilterWML#Filtering_Weapons|filter_second_attack]],<br />
[[AbilitiesWML|filter_self]], <br />
[[StandardSideFilter|filter_side]],<br />
[[FilterWML#Filtering_Vision|filter_vision]],<br />
[[AbilitiesWML#Common_keys_and_tags_for_every_weapon_special|filter_weapon]], <br />
[[StandardUnitFilter|filter_wml]],<br />
[[StandardSideFilter|has_unit]], <br />
[[FilterWML#Filtering_Weapons|primary_attack]], <br />
[[StandardUnitFilter|primary_unit]],<br />
[[FilterWML#Filtering_Weapons|secondary_attack]], <br />
[[StandardUnitFilter|secondary_unit]], <br />
<br />
|-<br />
|''Variable operations''<br />
general-purpose:<br />
[[PersistenceWML|clear_global_variable]],<br />
[[InternalActionsWML#.5Bclear_variable.5D|clear_variable]],<br />
[[PersistenceWML|get_global_variable]],<br />
[[InternalActionsWML#.5Binsert_tag.5D|insert_tag]],<br />
[[LuaWML|lua]],<br />
[[PersistenceWML|set_global_variable]],<br />
[[InternalActionsWML#.5Bset_variable.5D|set_variable]], <br />
[[DirectActionsWML#.5Bunstore_unit.5D|unstore_unit]];<br />
<br />
conditionals: <br />
[[ConditionalActionsWML#.5Bif.5D|if]],<br />
[[ConditionalActionsWML#.5Bif.5D|then]],<br />
[[ConditionalActionsWML#.5Bif.5D|else]],<br />
[[ConditionalActionsWML#.5Bswitch.5D|switch]],<br />
[[ConditionalActionsWML#.5Bswitch.5D|case]],<br />
[[AnimationWML#default|default]],<br />
[[ConditionalActionsWML#Condition_Tags|variable]],<br />
[[ConditionalActionsWML#Condition_Tags|have_location]],<br />
[[ConditionalActionsWML#Condition_Tags|have_unit]],<br />
[[ConditionalActionsWML#True_Condition_Tags|true]],<br />
[[ConditionalActionsWML#True_Condition_Tags|false]],<br />
[[ConditionalActionsWML#Meta-Condition_Tags|and]],<br />
[[ConditionalActionsWML#Meta-Condition_Tags|not]], <br />
[[ConditionalActionsWML#Meta-Condition_Tags|or]];<br />
<br />
loops:<br />
[[ConditionalActionsWML#.5Bwhile.5D|while]],<br />
[[ConditionalActionsWML#.5Bwhile.5D|do]];<br />
<br />
arrays:<br />
[[InternalActionsWML#.5Bset_variables.5D|set_variables]],<br />
[[InternalActionsWML#.5Bset_variables.5D|join]],<br />
[[InternalActionsWML#.5Bset_variables.5D|split]],<br />
[[InternalActionsWML#.5Bset_variables.5D|literal]], <br />
[[InternalActionsWML#.5Bset_variables.5D|value]]; <br />
<br />
capturing game data:<br />
[[InternalActionsWML#.5Bfind_path.5D|destination]],<br />
[[InternalActionsWML#.5Bfind_path.5D|find_path]],<br />
[[InternalActionsWML#.5Bstore_gold.5D|store_gold]], <br />
[[InternalActionsWML#.5Bstore_items.5D|store_items]], <br />
[[InternalActionsWML#.5Bstore_locations.5D|store_locations]],<br />
[[InternalActionsWML#.5Bstore_map_dimensions.5D|store_map_dimensions]],<br />
[[InternalActionsWML#.5Bstore_reachable_locations.5D|store_reachable_locations]],<br />
[[InternalActionsWML#.5Bstore_side.5D|store_side]], <br />
[[InternalActionsWML#.5Bstore_starting_location.5D|store_starting_location]], <br />
[[InternalActionsWML#.5Bstore_time_of_day.5D|store_time_of_day]], <br />
[[InternalActionsWML#.5Bstore_turns.5D|store_turns]], <br />
[[InternalActionsWML#.5Bstore_unit.5D|store_unit]], <br />
[[InternalActionsWML#.5Bstore_unit_type.5D|store_unit_type]], <br />
[[InternalActionsWML#.5Bstore_unit_type_ids.5D|store_unit_type_ids]], <br />
[[InternalActionsWML#.5Bstore_villages.5D|store_villages]], <br />
[[InternalActionsWML#.5Bfind_path.5D|traveler]],<br />
[[InternalActionsWML|unit_worth]]; <br />
|}<br />
<br />
<includeonly>[[Category:WML Reference]]</includeonly><br />
<br />
<noinclude>Alternative box to {{WML Tags}}</noinclude></div>Octalothttps://wiki.wesnoth.org/index.php?title=FAQ&diff=71239FAQ2023-05-19T08:11:51Z<p>Octalot: Replace WesCamp link</p>
<hr />
<div>{{Translations}}<br />
== General ==<br />
<br />
===What is Battle for Wesnoth?===<br />
Battle for Wesnoth is a turn-based tactical strategy game with a high fantasy theme, featuring both single-player, and online/hotseat multiplayer combat.<br />
<br />
===What license is the game distributed under?===<br />
The project is distributed under the [http://www.fsf.org/copyleft/gpl.html GPL]. All contributors retain copyright on the portions of the project that they contribute. For more information, see [[Wesnoth:Copyrights]].<br />
<br />
===How to get informed about new releases?===<br />
Check the front page of the website.<br />
<br />
===A new version is out, but where is the download for [Windows, OS X, etc.]?===<br />
<br />
The packages provided, other than the source code tarball, are <strong>not</strong> part of the official project. The BfW team only releases the game's source code. Binary executables or applications are always contributed by community volunteers. If not for these volunteers, there would never be any downloads for us to enjoy. The volunteers compile the game and upload it on their own time, and sometimes they cannot do this in a timely fashion (or at all, at times). Although there are usual packagers designated for each operating system, there are times when other members of the community are asked to step in and contribute when the usual people cannot.<br />
<br />
Every time a new version is released, the usual volunteers are notified by the project leaders. <strong>Please refrain from making forum posts asking where your download is</strong> because it doesn't help anything - the packagers already know, and they will get to it as soon as they can. In the past, the Windows and Mac communities have come together to produce home-grown unofficial builds for the community to use, and the renewed interest in the community and learning how to compile is generally a good thing.<br />
<br />
===Why doesn't Wesnoth have my favorite feature?===<br />
The answer to this varies from case to case. Although it is not always readily evident, Wesnoth was designed with a few base goals present from the very start of the project. To give an example, the simple gameplay and pixel art style are part of Wesnoth's design and we will never replace them with overly complicated rules and 3D models. Some people may not like this or find it disappointing, but such is life.<br />
<br />
There are other cases where the community would like to see something implemented but we simply don't have the human resources to do it right now, primarily because we are unpaid volunteers with our own jobs and families to care for. That is where you come in. The beautiful thing about our game being open-source software is that, if you want a feature badly enough, you can take our game's source code and modify it yourself, and then [[PatchSubmissionGuidelines|submit your work]] to us. The same principle applies to art -- if there is something you feel is missing and have the required skills (or will to learn), you can submit it to our [http://forums.wesnoth.org/viewforum.php?f=9 Art Contributions forum] for review.<br />
<br />
===Do you want help making this game? How can I help?===<br />
Yes, we want your help. Whether you're a programmer, artist, musician, writer, translator, level designer, playtester, or just have some great suggestions, you're welcome to contribute. How? You can:<br />
* join the [http://www.wesnoth.org/wiki/Project project]<br />
* share your opinions at the [http://www.wesnoth.org/forum/ Forum]<br />
* talk with us on [[Support#IRC|IRC]]<br />
* [[ReportingBugs|report]] bugs you find with Wesnoth and its mainline content<br />
* update the wiki<br />
* play against other players via the [[GettingStarted#Multiplayer|Multiplayer]] menu<br />
* vote for Wesnoth at your favorite gaming web site<br />
* spread the word!<br />
<br />
=== What are the system requirements? ===<br />
'''outdated!'''<br />
We are not completely certain, but an x86 running at 400 MHz with 128 MB RAM should be adequate for versions 1.0.2 and below. For versions 1.1 and up we recommend a computer with at least 1 GHz and 512 MB RAM if you run KDE or Gnome as Windowmanager (The game itself needs about 100 MB RAM). Slower machines will have trouble scrolling large maps or processing AI turns with many units. See the [http://www.wesnoth.org/forum/viewtopic.php?t=7384 forum thread] about minimum and recommended system requirements.<br />
<br />
=== I'm bored; how do I speed the game up? ===<br />
<br />
There are several preferences you can change to shorten the time that the AI takes to make its moves. "Accelerated Speed" will make units move and fight faster. "Skip AI Moves" will not show the AI's units moving from hex to hex. Finally, you can turn off all combat animations via the "Show Combat" option on the Advanced tab.<br />
<br />
=== My computer is too slow; how do I speed the game up? ===<br />
<br />
First, turn off the music and sound effects. Turning off the color cursors will make your cursor respond faster. If scrolling the map is slow, run the game in "Full Screen" mode, not in a window. Turn off combat, map, and standing unit animations via the "Show Combat", "Animate Map" and "Unit Standing Animations" options on the Advanced tab in the game Preferences. You can try turning off halos and combat results, but this might make gameplay more difficult.<br />
<br />
== Gameplay and Controls ==<br />
<br />
=== How do I learn to play? ===<br />
<br />
If you just want to jump right in, start the game and play the tutorial. If you like reading documentation, see [[WesnothManual]]. At any time while playing, you can select help from the menu button (or hit F1). The online help is quite extensive and provides information on terrains, weapons, traits, abilities, units and a good overview of how to play.<br />
<br />
=== My unit leveled up but didn't improve. What happened? ===<br />
<br />
This is called "After Maximum Level Advancement" or AMLA for short. While most level 0, 1, and 2 units can advance, some cannot. However, some level 3 units can advance to level 4, or even 5. You can see whether a unit can advance further by right clicking and selecting "description."<br />
<br />
After a unit reaches the highest level it can get, every time it reaches a new experience threshold (which increases with each advancement) it gains 3 hitpoints and is restored to a state of full health. This is a minor bonus so that experience gained by maxed out units is not altogether wasted. It is generally better to give experience to lower level units, rather than continue to advance units that have reached their maximum level.<br />
<br />
=== I tried to trap an enemy with several weak units, but it still escaped. What happened? ===<br />
<br />
Most units exert a zone of control (or ZoC). If an enemy moves into one of the six adjacent hexes, the zone of control will prevent it from moving any farther. However some weak units are level 0, meaning they are so weak that they do not have a ZoC. You can still surround an enemy unit entirely with level 0 units to keep it from escaping, but if there is any gap in your ranks, it could escape.<br />
<br />
Also, some units have the "skirmish" ability, which allows them to ignore ZoCs.<br />
<br />
=== How can I see where an enemy unit can move next turn? ===<br />
<br />
During your turn you can click on an enemy unit. Wesnoth will highlight all the hexes the unit can move to in the next turn. This is useful when trying to arrange your units to block an enemy's movement.<br />
<br />
=== There's too much luck in this game! ===<br />
<br />
Sooner or later, you will become frustrated when your archmage with four 70% attacks misses all four times. This does not mean that the AI is cheating or the random number generator is futzed. It means you are noticing random negative events more than positive ones. During the development of the game, many mathematicians have done sophisticated statistical analysis of the combat system. Likewise, programmers have examined the random number generator. No flaws have been found, so streaks of "bad" and "good" luck should just be accepted as part of having randomness in Wesnoth. A more detailed rational and discussion of the role that randomness plays in Wesnoth can be found [http://www.wesnoth.org/forum/viewtopic.php?f=6&t=21317&start=0&st=0&sk=t&sd=a here].<br />
<br />
Since Wesnoth is GPLed, it is possible that a new development team will someday "fork" the source and produce a version more like Heroes of Might & Magic, with less or no randomness. Until then, don't charge with your horsemen against troll rocklobbers at night...<br />
<br />
=== The (random unit) is overpowered/underpowered! ===<br />
<br />
The development team has spent years tweaking the units in the game. Each unit has had its gold cost, attack types, combat damage, defensive values, resistances, upgrade paths, and other stats carefully scrutinized and loudly discussed in the forum. However, the game code and the units were being modified right up until the 1.0 release, so some unbalanced units may have slipped through.<br />
<br />
If you have evidence to back up your claim, search the forum for past discussions about this unit, and then try posting.<br />
<br />
=== The (random scenario) is too hard/easy! ===<br />
<br />
See above answer about random units.<br />
<br />
=== What do the different difficulty levels do? ===<br />
<br />
That depends on the scenario. Usually, the opponent will get more money and be able to recruit higher-level units at higher difficulty levels, and you will have fewer turns available.<br />
<br />
== Maps, Scenarios and Campaigns ==<br />
<br />
=== How do I beat scenario _______ ? ===<br />
<br />
If you are stuck on a scenario in a campaign, you'll probably find a walkthrough at [[MainlineCampaigns]]. Or check out the "Strategies and Tips" forum at http://www.wesnoth.org/forum/viewforum.php?f=3<br />
<br />
=== How do I download user campaigns? ===<br />
Choose "Campaigns" in the main Wesnoth menu. Then scroll down to the bottom and choose "Get More Campaigns..." or since 1.1.5 there is a "Get add-ons" button in the main menu. This connects you to the campaign server. In the campaign server you can view a list of all available campaigns and download them, as well as posting or deleting your own campaigns.<br />
<br />
If you are behind a firewall you may not be able to connect to the campaign server. In this case try to download the campaign directly from the campaign server at http://addons.wesnoth.org/. If you know how to change your firewall settings, then you should open port 15003 (version 1.1.1 and up) or port 15002 (versions 1.1.0 and lower). For added security, you can restrict traffic over those ports to the campaign server's IP address (currently 88.191.12.200).<br />
<br />
=== Are there any tools to help me create maps and scenarios? ===<br />
Yes, the game includes a built-in map editor, that you can use to build the terrain maps for your scenarios.<br />
<br />
Unfortunately, there's no simple solution for creating the rest of what constitutes a complete scenario or campaign, which is the [[ReferenceWML|WML]] code. There have been some abandoned attempts at creating complete scenario editors such as [[CampGen]], but they are no longer maintained, nor do they work with the latest stable versions of the game.<br />
<br />
You should take a look at the [[Create]] section for information and guides that can help you build your own scenario or campaign. Taking a look at how existing content works is also a good idea.<br />
<br />
=== What are the .cfg files and how can I edit them? ===<br />
<br />
The .cfg files are plain text files, saved with the file extension ".cfg". You can create and edit them using normal text editors; just save the files in correct format.<br />
<br />
Please note that some Windows programs like to add a ".txt" extension, so the file is instead of "my_scenario.cfg" saved as "my_scenario.cfg.txt". And then the Windows Explorer will hide the ".txt" extension by default, so you may not notice it.<br />
<br />
'''Notepad''': After you create a document, click "File", "Save as..." and select "Save as type: All files". To open the document, click "File", "Open..." and select "Files of type: All files (*.*)". If you open someone else's document, and the end-of-line symbols are displayed as small rectangles, you have to use another editor.<br />
<br />
'''WordPad''': After you create a document, click "File", "Save as..." and select "Save as type: Text Document". After the document is saved, close WordPad and remove the ".txt" extension from file. To open the document, click "File", "Open..." and select "Files of type: All documents (*.*)".<br />
<br />
There are also some additional editors with plugins offering support for WML [https://forums.wesnoth.org/viewtopic.php?f=21&t=13799 here].<br />
<br />
=== I already created an add-on and published it on the server. How can I get translations for the campaign? ===<br />
See [[GettextForTranslators#For_add-ons]]<br />
<br />
===How do I place an object or unit on my map with the map editor?===<br />
You can't. You need to make a scenario file. There are more details on the [[BuildingMaps|maps]] page.<br />
<br />
== Multiplayer ==<br />
<br />
===How do I connect to a multiplayer server, when I sit behind a restrictive firewall?===<br />
<br />
You have to open outgoing TCP port 15000 - 14997 (depending on the version you use) to play multiplayer games over the internet on the official servers.<br />
<br />
===How to find players for multiplayer game?===<br />
Hang around for a while on multiplayer servers and you might find someone to play with. If you observe other people playing you will get informed when someone joins the servers. Maybe you find someone willing to play in the [[Support#IRC|IRC]] channel dedicated to Wesnoth, #wesnoth at irc.libera.chat.<br />
<br />
===How to save and load a multiplayer game===<br />
<br />
Save the game. Give it a good name, so that you can find it among the other saved games.<br />
<br />
Create new game. (Give it a name like "private game for X and Y", so that other players will not try joining it, and you do not have to explain or kick them.) The first item in the map/scenario list is "Saved games", select this. Choose the saved game. Wait for the other player(s) to connect. Start the game.<br />
<br />
===How can I make my computer into a dedicated Wesnoth server?===<br />
<br />
To setup a dedicated Wesnoth server, you have to compile the game with the "--enable-server" flag, and after you install, simply run wesnothd from the console. This will start the server, listening on TCP port 15000. To compile the server only you can use the flags "--disable-game --enable-server". If you aren't using a linux or mac operating system, there are a few ways you can compile on Windows... [[CompilingWesnoth/CrossCompiling|here is one way]].<br />
<br />
'''Note:''' Packages for Wesnoth 1.4 and later include wesnothd by default since it's required by the "Host a network game" option from the Multiplayer menu, which is the preferred option for temporarily hosting a server instance to play in a LAN or privately through the Internet.<br />
<br />
===Which versions of Wesnoth can play together?===<br />
<br />
You only need to make sure you are using the same minor version number (6 in "1.6.x", 8 in "1.8.x" and so on) corresponding to stable branch releases. If you are using a development release (odd minor version numbers), you must be using exactly the same version number as other clients, to avoid out-of-sync (OOS) issues in multiplayer.<br />
<br />
If you are using user-made eras or MP scenarios, all players should make sure they are using the same, latest version of the add-on.<br />
<br />
== Translations ==<br />
<br />
===Where can I find more information about translating Wesnoth?===<br />
See [[WesnothTranslations]] for a list of currently maintained projects, and methods for contacting their maintainers and volunteering for help, and instructions for starting your own translation if it isn't included in the game already. [http://gettext.wesnoth.org] shows the current progress translations for different game development and stable branches, mainline campaigns and user-made add-ons.<br />
<br />
== Other Questions You Have ==<br />
<br />
The best way to get answers to less-frequently asked questions is by visiting the official [http://forums.wesnoth.org Battle for Wesnoth forums]. There are plenty of people willing to help. Make sure you read ALL of the forum sticky notes and announcements before posting!<br />
<br />
[[Category:Troubleshooting and Bugs]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignSouthGuard&diff=71238CampaignSouthGuard2023-05-19T08:09:43Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete|obsolete as this is from 2011}}<br />
<br />
== Translation of The South Guard ==<br />
<br />
This is a list of the people currently translating The South Guard into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>Kvasir</td><td>complete</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>[[User:Gdou|Gdou]]</td><td>complete</td></tr><br />
<tr><td>German (de)</td><td>[[User:Crommy|Crommy]]</td><td>complete</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>luciano/Gwain</td><td>complete</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>grzywacz</td><td>in progress</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>Lancelot</td><td>in progress</td></tr><br />
<tr><td>Swedish (sv)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://www.wesnoth.org/gettext/index.php?version=branch&package=wesnoth-tsg Translation stats for The South Guard]<br />
* [[CharactersStorys#The_South_Gard | List of Hero descriptions]]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignTwoBrothers&diff=71237CampaignTwoBrothers2023-05-19T08:08:33Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete}}<br />
<br />
== Translation of Two Brothers ==<br />
This is a list of the people currently translating Two Brothers into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>British English (en_GB)</td><td>[[User:Placid|Placid]]</td><td>work in progress</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>German (de)</td><td>Ivanovic</td><td>completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>[[HungarianTranslation|Műhelyben]]</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>RokStar</td><td>completed</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>Elestel</td><td>work in progress</td></tr><br />
<tr><td>Swedish (sv)</td><td>Sanna, Lugo Moll</td><td>completed</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://www.wesnoth.org/gettext/index.php?package=wesnoth-tb&order=trans&version=branch Translation stats for Two Brothers]<br />
*[[CharactersStorys#Two_Brothers | List of Hero Description]]<br />
<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignLegendOfWesmere&diff=71236CampaignLegendOfWesmere2023-05-19T07:22:10Z<p>Octalot: Candidate for deletion</p>
<hr />
<div>{{Delete}}<br />
<br />
== Translation of Legend of Wesmere ==<br />
<br />
This is a list of the people currently translating Legend of Wesmere into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>British English (en_GB)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>Tux2b</td><td>completed</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>Tux2B</td><td>pause</td></tr><br />
<tr><td>German (de)</td><td>Torangan</td><td>work in progress</td></tr><br />
<tr><td>Greek (el_GR)</td><td>santi</td><td>completed</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>Brivido</td><td>completed</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Russian (ru)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Swedish (sv)</td><td>Unassigned</td><td>completed (inactive)</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[WesCamp]]<br />
* [http://pulsar.unizar.es/~isaac/wesnoth-gettext/westats/index.php?package=wesnoth-Legend_of_Wesmere&order=trans Translation stats for Legend of Wesmere]<br />
<br />
[[Category:Campaigns]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignDelfadorsMemoirs&diff=71235CampaignDelfadorsMemoirs2023-05-19T07:20:34Z<p>Octalot: Mark as obsolete, remove translation info and WesCamp link</p>
<hr />
<div>{{Obsolete|Has some history, but probably a candidate for deletion}}<br />
<br />
== New maintainer ==<br />
Josh Parsons hasn't active for a long time, so I've been nominated (by myself) to be a new maintainer of the campaign. Currently I'm working on internationalized version, so, translators, you are welcome now.<br />
<br />
Oto '[[User:Tapik|tapik]]' Buchta<br />
<br />
== Campaign overture ==<br />
Due to changes in [[HeirToTheThrone|HTTT]], the place of [[Delfador]]'s school had to be moved to the Isle of Alduin. So it was necessary to define a reason why the Delfador went to the Methor's academy. So I've invented a Name Journey. It is the journey of each young mage from the School of Light, Isle of Alduin, bringing him/her his/her name.<br />
<br />
Oto '[[User:Tapik|tapik]]' Buchta<br />
<br />
== Campaign developers are welcome ==<br />
There are many things to do with this campaign. Overture could be transformed to the set of scenarios (with some scenarios from the Name Journey) and the Delfador should be returned back to the Westyn.<br />
<br />
== See Also ==<br />
<br />
* [[Delfador's Memoirs]]<br />
<br />
[[Category:Delfador's Memoirs]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=CampaignBurningSuns&diff=71234CampaignBurningSuns2023-05-19T07:17:26Z<p>Octalot: Candidate for deletion, and remove the WesCamp link</p>
<hr />
<div>{{Delete|this is from before the campaign was mainlined}}<br />
<br />
== Translation of Under the Burning Suns ==<br />
This is a list of the people currently translating Under the Burning Suns into different languages:<br />
<br />
<table border="1" style="width:65%"><br />
<tr><th>Language</th><th>Translator</th><th>Status</th></tr><br />
<tr><td>Afrikaans (af)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Brazilian Portuguese (pt_BR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>British English (en_GB)</td><td>[[User:Placid|Placid]]</td><td>work in progress</td></tr><br />
<tr><td>Bulgarian (bg)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Catalan (ca)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Chinese (zh_CN)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Czech (cs)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Danish (da)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Dutch (nl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Estonian (et)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Finnish (fi)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>French (fr)</td><td>breversa</td><td>work in progress</td></tr><br />
<tr><td>German (de)</td><td>Allefant</td><td>completed</td></tr><br />
<tr><td>Greek (el_GR)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Hungarian (hu)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Italian (it)</td><td>luciano</td><td>work in progress</td></tr><br />
<tr><td>Japanese (ja)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Latin (la)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Norwegian (no)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Polish (pl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>[[CampaignBurningSuns:RussianTranslation|Russian (ru)]]</td><td>[[User:Alxrem|Alexey Remizov]]</td><td>work in progress</td></tr><br />
<tr><td>Serbian (sr)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovak (sk)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Slovenian (sl)</td><td>?</td><td>unknown</td></tr><br />
<tr><td>Spanish (es)</td><td>Elestel</td><td>work in progress</td></tr><br />
<tr><td>Swedish (sv)</td><td>Unassigned</td><td>stalled</td></tr><br />
<tr><td>Turkish (tr)</td><td>?</td><td>unknown</td></tr><br />
</table><br />
<br />
== Status Descriptions ==<br />
* '''unknown'''<br />
<br />
It is not known if someone is actually translating this campaign.<br />
* '''work in progress'''<br />
<br />
Someone is working on it, but it is not done, yet.<br />
* '''correction'''<br />
<br />
Translation is already completed, but it is being corrected at the moment.<br />
* '''completed'''<br />
<br />
It is already completed and updated when there are changes.<br />
* '''completed (not active)'''<br />
<br />
It is already completed and but not updated when there are changes.<br />
<br />
== See Also ==<br />
<br />
* [[CharactersStorys#Under_the_Burning_Sun | List of Hero descriptions]]<br />
[[Category:Translations]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=WesnothTranslations&diff=71233WesnothTranslations2023-05-19T07:12:36Z<p>Octalot: /* See also */ Replace the Wescamp link</p>
<hr />
<div>== Translations ==<br />
<br />
Wesnoth is currently being translated into the following languages. Instructions on how to contribute are found here:<br />
[[WesnothTranslationsHowTo]].<br />
<br />
{| class="wikitable"<br />
|-<br />
! Translation !! Maintainer !! Contact<br />
|-<br />
| [[AfrikaansTranslation|Afrikaans]] || None || N/A<br />
|-<br />
| [[AncientGreekTranslation|Ancient Greek]] || None || N/A<br />
|-<br />
| [[ArabicTranslation|Arabic]] || Mejri Ziad (Hermestrismi)|| [mailto:beja.comuneATgmailDOTcom]<br />
|-<br />
| [[BasqueTranslation|Basque]] || None || N/A<br />
|-<br />
| [[BengaliTranslation|Bengali]] || [[User:Knyghtmare|Knyghtmare]] || knyghtmare#8753 on Discord<br />
|-<br />
| [[BurmeseTranslation|Burmese]] || None || N/A<br />
|-<br />
| [[BulgarianTranslation|Bulgarian]] || Ivan Petrov (TheWhiteKnight) || [mailto:vankata_petrovATabvDOTbg]<br />
|-<br />
| [[CatalanTranslation|Catalan]] || Miquel-Àngel Burgos i Fradeja || [mailto:miquel.angel.burgosATgmailDOTcom]<br />
|-<br />
| [[ChineseTranslation|Chinese]] || CloudiDust || [mailto:cloudidustATgmailDOTcom]<br />
|-<br />
| [[ChineseTaiwanTranslation|Chinese (Taiwan)]] || 楊綮銘 (Taiwan) || [mailto:steven2880ATgmailDOTcom]<br />
|-<br />
| [[CroatianTranslation|Croatian]] || None || N/A<br />
|-<br />
| [[CzechTranslation|Czech]] || Michal Žejdl || [mailto:lachimATemerDOTcz]<br />
|-<br />
| [[DanishTranslation|Danish]] || None || N/A<br />
|-<br />
| [[DutchTranslation|Dutch]] || Merijn de Vet || [mailto:tybonzerATliveDOTnl]<br />
|-<br />
| [[EnglishGBTranslation|English (GB)]] || Wedge009 || [mailto:wedge009ATwedge009DOTnet]<br />
|-<br />
| [[EnglishShawTranslation|English (Shaw)]] || Arc Riley || [mailto:ArcRileyATubuntuDOTcom]<br />
|-<br />
| [[Esperanto_translation|Esperanto]] || Mariano Street (mctpyt) || [mailto:mctpytATprotonDOTme]<br />
|-<br />
| [[EstonianTranslation|Estonian]] || None || N/A<br />
|-<br />
| [[FilipinoTranslation|Filipino]] || None || N/A<br />
|-<br />
| [[FinnishTranslation|Finnish]] || Jaakko Saarikko (styxnix) || [mailto:jaakkoDOTsaarikkoATprotonmailDOTcom]<br />
|-<br />
| [[FrenchTranslation|French]] || Mathieu Guilbaud (Guim) || Translations ML<br />
|-<br />
| [[GalicianTranslation|Galician]] || None || N/A<br />
|-<br />
| [[GermanTranslation|German]] || Aaron Winter (Bitron) || <br />
|-<br />
| [[GreekTranslation|Greek]] || None || N/A<br />
|-<br />
| [[HebrewTranslation|Hebrew]] || None || N/A<br />
|-<br />
| [[HungarianTranslation|Hungarian]] || Széll András || [mailto:szellDOTandrisATgmailDOTcom]<br />
|-<br />
| [[IcelandicTranslation|Icelandic]] || None || N/A<br />
|-<br />
| [[IndonesianTranslation|Indonesian]] || Irsyad Musthafa || [mailto:sevennightmareATtutanotaDOTde]<br />
|-<br />
| [[IrishTranslation|Irish]] || None || N/A<br />
|-<br />
| [[ItalianTranslation|Italian]] || Antonio Rosella || [mailto:arosellaATyahooDOTcom]<br />
|-<br />
| [[JapaneseTranslation|Japanese]] || Hironori Fujimoto (RatArmy) || [mailto:broadbarredfirefishATgmailDOTcom]<br />
|-<br />
| [[KoreanTranslation|Korean]] || mistzone || [mailto:drier22ATgmailDOTcom]<br />
|-<br />
| [[LatinTranslation|Latin]] || None || N/A<br />
|-<br />
| [[LatvianTranslation|Latvian]] || None || N/A<br />
|-<br />
| [[LithuanianTranslation|Lithuanian]] || None || N/A<br />
|-<br />
| [[MarathiTranslation|Marathi]] || None || N/A<br />
|-<br />
| [[MacedonianTranslation|Macedonian]] || None || N/A<br />
|-<br />
| [[NorwegianTranslation|Norwegian]] || None || N/A<br />
|-<br />
| [[OldEnglishTranslation|Old English]] || None || N/A<br />
|-<br />
| [[PolishTranslation|Polish]] || ForPeace || [https://forums.wesnoth.org/viewtopic.php?f=7&t=3796 forum thread]<br />
|-<br />
| [[PortugueseTranslation|Portuguese Brazilian]] || Andrei Machado || [mailto:andreisp.machadoATyahooDOTcom]<br />
|-<br />
| [[PortugueseContinentalTranslation|Portuguese (European)]] || trewe || [mailto:sjrs456ATyahooDOTfr]<br />
|-<br />
| [[RACVTranslation|RACV]] || None || N/A<br />
|-<br />
| [[RomanianTranslation|Romanian]] || None || N/A<br />
|-<br />
| [[RussianTranslation|Russian]] || Artem Khrapov || ([[User:kabachuha|kabachuha]]) [mailto:artemkhrapov2001ATyandexDOTru]<br />
|-<br />
| [[Scottish_Gaelic_Translation|Scottish Gaelic]] || GunChleoc || [mailto:fiosAIGforamnagaidhligDOTnet]<br />
|-<br />
| [[SerbianTranslation|Serbian]] || None || N/A<br />
|-<br />
| [[SlovakTranslation#Preklad|Slovak]] || Aceman || <br />
|-<br />
| [[SlovenianTranslation|Slovenian]] || None || N/A<br />
|-<br />
| [[SpanishTranslation|Spanish]] || Toranks || [mailto:davinciATtoranksDOTes]<br />
|-<br />
| [[SpanishLatinAmericanTranslation|Spanish (Latin American)]] || None || N/A<br />
|-<br />
| [[SwedishTranslation|Swedish]] || Alex Alowersson (fluxbird) || [mailto:alexalowersonATgmailDOTcom]<br />
|-<br />
| [[TurkishTranslation|Turkish]] || Nilgün Belma Bugüner || [mailto:nilgunATbelgelerDOTorg]<br />
|-<br />
| [[UkrainianTranslation|Ukrainian]] || None || N/A<br />
|-<br />
| [[ValencianTranslation|Valencian]] || None || N/A<br />
|-<br />
| [[VietnameseTranslation|Vietnamese]] || None || N/A<br />
|}<br />
<br />
== Mailing List ==<br />
<br />
There now is a mailing list dedicated to translation matters. It is mainly intended to be used for informing translation maintainers about important changes, to announce string freezes and other special things. Everyone is free to subscribe to this list.<br />
<br />
* [https://listengine.tuxfamily.org/wesnoth.org/i18n/ List info, how to subscribe, and archives from April 2022]<br />
* [https://mailman.wesnoth.org/pipermail/i18n/ Old list archives (up until April 2022)]<br />
<br />
Please keep in mind that this list is not meant for discussing changes for one single translation but instead subjects which are relevant to all translations.<br />
<br />
== See also ==<br />
<br />
* [[WesnothTranslationsHowTo]]<br />
* [[ImageLocalization]]<br />
* [[GetText]]<br />
* [http://gettext.wesnoth.org Translations statistics (stable)]<br />
* [http://gettext.wesnoth.org/index.php?version=trunk&package=alloff Translations statistics (development)]<br />
* [[GettextForTranslators#For_add-ons|Translating User Made Campaigns and add-ons]]<br />
* [[SpellingMistakes]]<br />
* [[CharactersStorys| Character descriptions for Translators (Spoiler Warning)]]<br />
* [[Poetry of Wesnoth Translations]]<br />
<br />
[[Category:Translations|*]]</div>Octalothttps://wiki.wesnoth.org/index.php?title=GettextForTranslators&diff=71232GettextForTranslators2023-05-19T07:08:06Z<p>Octalot: Translating add-ons</p>
<hr />
<div>== Gettext for translators ==<br />
<br />
=== For the engine and mainline campaigns ===<br />
<br />
The target audience of this page is anyone who wants to help with a language that's already in the list on [[WesnothTranslations]]. The files for these languages have already been set up, someone is already the maintainer, and the pages linked from that page say where to go and how to introduce yourself to the team. The effort is split with separate teams for each language, and each team can have its own working style.<br />
<br />
Because each team can work in different ways, please do not submit translations as pull requests on Github. While that seems like a good idea, it causes potential complications, so we ask that everyone talks to their language's maintainer and submits changes in the way that the maintainer decides to use.<br />
<br />
If you're starting a completely new translation, or taking over as the maintainer of a translation, then the next place to read would be the [[WesnothTranslationsHowTo]] page.<br />
<br />
=== For add-ons ===<br />
<br />
The target audience is anyone who wants to help translate an add-on, assuming the add-on's maintainer has already set it up for translation. Translations are shipped with the add-on, so it's up to the maintainer to choose how to receive the files and organise the workflow.<br />
<br />
To translate an add-on, skip to the [[#Files_for_add-ons|Files for add-ons]] section.<br />
<br />
If you are the maintainer of the add-on, the instructions for setting up the translation are on [[GettextForWesnothDevelopers]].<br />
<br />
== Textdomains and getting the files to translate ==<br />
<br />
The progress for each language is shown on https://www.wesnoth.org/gettext/ . Click on your language, and you'll see a breakdown into sections ''(textdomains)'', such as<br />
* wesnoth<br />
* wesnoth-editor<br />
* wesnoth-help<br />
* wesnoth-units<br />
* wesnoth-lib (contains strings shared by game and editor)<br />
* wesnoth-httt (the Heir to the Throne campaign)<br />
* wesnoth-utbs (the Under the Burning Suns campaign)<br />
* etc<br />
<br />
Each has a separate file with a .po extension. For example, the Swedish translation has abbreviation ''sv'', and its translation of the editor's strings is in ''wesnoth-editor/sv.po''. The page on https://www.wesnoth.org/gettext/?view=langs&version=branch&lang=sv links to the current version in the main Git repository.<br />
<br />
Although the .po files contain text, please send the complete files as email attachments (or whichever method your team uses), rather than cutting and pasting lines from the file into an email. The translated strings are<br />
very sensitive to formatting and whitespace changes.<br />
<br />
=== Files when running the game ===<br />
<br />
When the game runs it will look for an .mo file, for example ''translations/sv/LC_MESSAGES/wesnoth-editor.mo''. If you want to test your text in-game and you're happy to modify your installation:<br />
<br />
* Some .po editors can automatically generate .mo files.<br />
* Deleting the .mo file will make the game look for ''translations/wesnoth-editor/sv.po'' instead.<br />
<br />
However you can also send your untested .po file to the maintainer and they should check that it looks correct in-game.<br />
<br />
=== Files for add-ons ===<br />
<br />
This assumes the add-on has .po files rather than .mo files. The engine supports both, but only .po are editable. For example, an add-on called Son of Haldric that has a Swedish translation would likely store it in:<br />
<br />
* ''data/add-ons/Son_of_Haldric/translations/wesnoth-Son_of_Haldric/sv.po'' .<br />
<br />
That comes from:<br />
<br />
* ''data/add-ons/Son_of_Haldric'' is where all files from the add-on are stored<br />
* ''translations/wesnoth-Son_of_Haldric'' is configured by the maintainer<br />
* ''sv'' is the language code for Swedish. The codes for each language are given in the big table on [https://www.wesnoth.org/gettext/ https://www.wesnoth.org/gettext/] .<br />
<br />
If it's been set up for translation but hasn't yet been translated into Swedish, it may instead have a file called ''wesnoth-Son_of_Haldric.pot''. This is a template which you can copy to "sv.po", however first try opening the .pot file directly in your [[#Tools|translation tool]], as the it will likely prompt you to create a translation from the template.<br />
<br />
After editing the file, either refresh the cache (press F5 on the title screen) or restart Wesnoth to see the changes.<br />
<br />
Warning: files in the add-on directory will be overwritten or deleted if it's updated using the in-game Add-on Manager, so keep backups of files in a separate directory.<br />
<br />
== How to translate ==<br />
<br />
Now that you have the .po file to edit, it can be worked on using any of the programs listed in the [[#Tools|Tools section]]. The general preference in Wesnoth seems to be towards Poedit, but they all work on the same .po file format.<br />
<br />
The general concept is that the GUI will show the strings in English, along with a text-box to add the translation.<br />
<br />
=== Warnings ===<br />
<br />
Some editors can automatically detect inconsistencies between the English and the translated text, for example if the original ends with a full-stop and the translation ends with an exclamation mark. Poedit defaults to showing these above even the untranslated strings, but these can be false-positives - generally someone's already looked at these and decided that the translated text is better as-is.<br />
<br />
=== Fuzzy strings ===<br />
<br />
One of the downsides of Gettext is that spelling and grammar corrections in the English text break the link between the original and the translated text. The tools that generate .po files try to recover from this by using the old translation for the new English text, and marking the string as ''fuzzy''; in Poedit these are sorted below the completely untranslated strings, and shown with the "Needs Work" button lit along with a note about what the previous English text was.<br />
<br />
Be wary, this mechanism can also generate incorrect suggestions. For example it may decide that "Landar left $number troops to guard the council" is a spelling correction of "Kalenz left $number troops to guard the council".<br />
<br />
== FAQ ==<br />
* '''What are "Plural-forms"?'''<br />
** Some languages have different word forms for different numbers of things (for example in English we have "1 thing" but "2 thing'''s'''"). The rules are different for different languages. You can find them [http://translate.sourceforge.net/wiki/l10n/pluralforms here].<br />
* '''How do I use ' within a single-quote delimited string when translating text= in help screen texts?'''<br />
** Add a backslash before it, however the preferred method now is to use [[Typography_Style_Guide#Character_Usage_Summary|typographic punctuation]] instead.<br />
* '''What should I do with strings like "Prefs section^General"?'''<br />
** There are ambiguous strings which should be translated in a different way depending on where they appear. For example, we have "General" in the preferences as "General preferences" and we can also have "a General". These strings can have different translations for a given language, so we use "context" to solve this. The prefix only tries to give a hint about the string, and should be not translated, for example:<br />
msgid "Prefs section^General"<br />
msgstr "General"<br />
* '''My PO file already has that translated to "Prefs section^General", should it work?'''<br />
** It does, but probably shouldn't. For strings that have no translation, the part before the "^" will be removed. This is also done when the PO's msgstr is exactly the same as the msgid, which will later break if someone makes any change to the text. For example:<br />
# wrong but seems to work (shows as "Root")<br />
msgid "filesystem_path_system^Root"<br />
msgstr "filesystem_path_system^Root"<br />
# wrong and shows as "filesystem_path_system^Wurzel"<br />
msgid "filesystem_path_system^Root"<br />
msgstr "filesystem_path_system^Wurzel"<br />
* '''Who can I ask for further information?'''<br />
** You can ask in [[Support|Discord or IRC]]. Ping Ivanovic in Discord's #development or IRC's #wesnoth-dev channel. If you don't like IRC, send a mail to crazy-ivanovic AT gmx DOT net, or pm him (ivanovic) at the forum.<br />
* '''Why is the diff from the previous version so huge? I have only made a small change to the .po file with poedit.'''<br />
** When saving .po file poedit unwraps all strings. Usually, all .po files are wrapped at 80 characters so if you want smaller diffs and less merge conflicts you can execute the following commands each time after editing with poedit:<br />
<br />
msgattrib file.po > file.po1<br />
mv file.po1 file.po<br />
<br />
== Tools ==<br />
<br />
There are several tools to work with .po files:<br />
* [https://pofile.net/free-po-editor Free PO editor] (Web based)<br />
* [http://userbase.kde.org/Lokalize Lokalize] (Unix KDE)<br />
* [http://wiki.gnome.org/Apps/Gtranslator GTranslator] (Unix Gnome)<br />
* [http://virtaal.translatehouse.org Virtaal] (Multiplatform)<br />
* [http://www.poedit.net/ poEdit] (Multiplatform)<br />
* [http://www.gnu.org/software/emacs/emacs.html Emacs with po-mode] (Multiplatform)<br />
* [http://www.vim.org/ Vim] with [http://www.vim.org/scripts/script.php?script_id=695 PO plug-in] (Multiplatform)<br />
<br />
Of course, you can edit po files with any UTF-8 capable text editor, but the tools listed above have great advantages over any text editor regarding .po translation, like going to next fuzzy/untranslated string, searching only in specific fields (msgid, msgstr, comment), ...<br />
<br />
== See Also ==<br />
<br />
* [[WesnothTranslations]]<br />
* [[WesnothTranslationsHowTo]]<br />
* [[GettextForWesnothDevelopers]]<br />
* [[TranslatorShellscript]]<br />
* [http://www.wesnoth.org/gettext/ Translation statistics]<br />
<br />
[[Category:Translations]]</div>Octalot