Difference between revisions of "CampaignWML"

From The Battle for Wesnoth Wiki
m (The [binary_path] tag)
m (A complete example)
Line 344: Line 344:
 
   path="data/campaigns/My_Campaign/translations"
 
   path="data/campaigns/My_Campaign/translations"
 
  [/textdomain]
 
  [/textdomain]
 
[binary_path]
 
  path=data/campaigns/My_Campaign/
 
[/binary_path]
 
 
   
 
   
 
  [campaign]
 
  [campaign]
Line 383: Line 379:
 
  [/campaign]
 
  [/campaign]
 
   
 
   
 +
[binary_path]
 +
  path=data/campaigns/My_Campaign/external_binary_data/
 +
[/binary_path]
 +
 
  #ifdef CAMPAIGN_MY_CAMPAIGN
 
  #ifdef CAMPAIGN_MY_CAMPAIGN
 +
  [binary_path]
 +
    path=data/campaigns/My_Campaign/
 +
  [/binary_path]
 
   
 
   
 
   [+units]
 
   [+units]
Line 389: Line 392:
 
   [/units]
 
   [/units]
 
   
 
   
 +
  {@campaigns/My_Campaign/utilities}
 
   {@campaigns/My_Campaign/scenarios}
 
   {@campaigns/My_Campaign/scenarios}
 
   
 
   

Revision as of 11:27, 5 July 2006

[edit]WML Tags

A:

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

B:

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

C:

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

D:

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

E:

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

F:

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

G:

game_config, get_global_variable, goal, gold, gold_carryover;

H:

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

I:

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

J:

jamming_costs, join;

K:

kill, killed;

L:

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

M:

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

N:

not, note;

O:

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

P:

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

R:

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

S:

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

T:

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

U:

unhide_unit, unit, unit_overlay, unit_type, unit_worth, units, unlock_view, unpetrify, unstore_unit, unsynced;

V:

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

W:

while, wml_message, wml_schema;

Z:

zoom;

Each campaign consists of several scenarios. Those scenarios are described in their [scenario] tags. Then, there is usually one campaign file containing information related to the whole campaign.

The [textdomain] tag specifies where to find translations of campaign texts.

The [binary_data] tag specifies where to find campaign specific images, music and sounds; if there are any.

The [campaign] tag contains general campaign information, that is for example:

  • how campaign appears in the game campaign menu
  • electable difficulties
  • first scenario
  • campaign specific credits

The [about] tag in [campaign] tag is one section of campaign-specific credits.

The [textdomain] tag

Top-level tag; appears directly in [game].

Attributes:

  • name -- symbol of text domain
  • path -- directory containing dictionaries

Text domains

All texts in game are written in English. For displaying texts in other languages there are dictionary files: English to another language. (Dictionary source files have extension "po", compiled dictionaries have extension "mo".) To make translating and translation maintenance easier, all texts in the game are divided to groups called text domains. There is one dictionary per text domain per language. Each campaign is a separate text domain; that is each campaign has its translations in its own files, one per language.

The name attribute specifies the name of dictionary files. It should begin by "wesnoth-" followed by the name of campaign. For example if the name of campaign is "My Campaign", the text domain name is "wesnoth-My_Campaign". When a WML tag includes preprocessor instruction "#textdomain wesnoth-My_Campaign", it means that all translated texts in this tag (and its subtags) should be found a dictionary file "wesnoth-My_Campaign.mo". (All [campaign] and [scenario] tags should specify their text domain.)

The path attribute specifies a directory that contains dictionary files. A campaign called "My Campaign" could specify a [textdomain] tag like this:

[textdomain]
  name="wesnoth-My_Campaign"
  path="data/campaigns/My_Campaign/translations"
[/textdomain]

All [campaign] and [scenario] tags in this campaign should start like this:

[campaign]
  #textdomain wesnoth-My_Campaign

  #...

[/campaign]
[scenario]
  #textdomain wesnoth-My_Campaign

  #...

[/scenario]

When the game is played in English language, all translatable texts (those preceded by "_" mark) are displayed directly. When the game is played in any other language, program will try to translate the texts by dictionary whose location is determined by:

  • the path attribute of the current text domain
  • the language code of the current language (usually in form "xx" or "xx_XX")
  • the name attribute of the current text domain

For example, if the current language is Esperanto (language code: "eo"), the dictionary will be: (on MS Windows)

%ProgramFiles%\Wesnoth\userdata\data\campaigns\My_Campaign\translations\eo\LC_MESSAGES\wesnoth-My_Campaign.mo

The [binary_path] tag

Top-level tag; appears directly in [game].

Attribute:

  • path -- directory containg campaign-specific binary data

Binary files locations

Program looks for binary files (images, music, sounds) in the subdirectories of "$data" directory, that is:

  • images in "$data/images/"
  • music in "$data/music/"
  • sounds in "$data/sounds"

Because user-contributed files are in different place, this tag makes program find binary files also in subdirectories of directory specified in path attribute. (It means that images should not be in the "path" directory, but in "path/images/" directory; music in "path/music/" directory; sounds in "path/sounds/" directory.) The directory must include the final slash ("/") symbol.

A campaign called "My Campaign" could specify a [binary_path] tag like this:

[binary_path]
  path=data/campaigns/My_Campaign/
[/binary_path]

Now when program looks for an image called "example.png", it will try to find the image in the following locations: (on MS Windows)

%ProgramFiles%\Wesnoth\images\example.png
%ProgramFiles%\Wesnoth\userdata\data\campaigns\My_Campaign\images\example.png

Binary file conflicts

As a matter of custom, user campaigns should avoid conflicts with other image and sound files. If a user image has the same name as another file somewhere, unpredictable results will occur in that one of the files will be used in place of the other.

There are two ways to avoid this: unique filenames and isolation using #ifdef.

  1. The first way is to give user campaign images, sounds, and music unique filename prefixes. For example, a opening story logo called main.jpg could exist in several campaigns. Give it a prefix like this: mycampaign_main.jpg where mycampaign is your campaign's name.
  2. The second way is to place the [binary_path] statement inside your campaign #ifdef. The statements inside #ifdef are only loaded if someone plays your campaign. This is the best way to do it. The custom images and sounds you use in your campaign will not be exposed to the game until you select the campaign from the menu.

If there are some images you want exposed to the game, use a 2nd [binary_path] tag. This way you will have one public binary path and one private binary path. Since there are probably only one or two images you want to be publicly visible (like the campaign menu icon and menu image), it is much easier to place unique prefixes on these public image files.

Make the second [binary_path] statement outside of the #ifdef that points to another subdirectory of your campaign such as ./external_binary_data/. In that directory you would need to make images, sounds, and music subdirectories. See the full example below.

The [campaign] tag

Top-level tag; appears directly in [game].

Campaign menu attributes:

  • rank -- order of campaign in the campaign selection menu
  • icon -- small campaign image in the campaign selection menu
  • name -- (translatable) campaign name in the campaign selection menu
  • description -- (translatable) campaign description in the information pane of the campaign selection menu
  • image -- larger campaign image in the information pane of the campaign selection menu

Difficulty attributes:

  • difficulties -- comma-separated list of preprocessor symbols for difficulties
  • difficulty_descriptions -- (partially translatable) menu of difficulties

Preprocessor attribute:

  • define -- preprocessor symbol for campaign

First scenario attribute:

  • first_scenario -- the ID of the first scenario in the campaign

Campaign credits subtag:

Obsolete attributes: (do not use them)

  • id -- the internationalization key for the campaign

Campaign selection menu

Campaign selection menu displays a list of mainline and user-contributed campaigns. Campaigns are ordered by their rank attribute (lower to higher, unranked in the end). Mainline campaigns use multiples of 10 from 10 to 50. Your campaign's rank should be at least 51; but you do not have to specify it.

In the left part of dialog the icon and name of campaign are displayed. When user selects a campaign, the description and image are displayed in the right part. For example if [campaign] tag looks like this:

[campaign]

  icon=small.png
  name= _"My Campaign"
  description= _"Hero goes somewhere and does something."
  image=large.png

  #...

[/campaign]

Then the campaign selection menu will look like this:

+------------------------------+---------------------+
| Select a campaign:           |                     |
| [.....] Heir to the Throne   | Hero goes somewhere |
| [.....] Son of the Black Eye | and does something. |
| [.....] Eastern Invasion     |     [ large ]       |
| [.....] The Rise of Wesnoth  |     [  .png ]       |
| [small] My Campaign          |                [OK] |
+------------------------------+---------------------+

Difficulty menu

From campaign author's view, "difficulty" is a preprocessor symbol, which can be used in scenario script to make gameplay easier or harder. This is typically done by making difficulty-dependent turn limits, starting gold for enemies, recruiting lists for enemies, AI commands,... but it can be anything. Exactly one of difficulty symbols is defined during campaign.

Using difficulties in campaign in optional. It is recommend to use standard symbols "EASY", "NORMAL", "HARD", because a few standard macros use them (file "utils.cfg"; see UtilWML). The difficulties attribute is a comma-separated list of preprocessor symbols to be defined. These symbols are used internally, and are never displayed to player. (It means that campaign author can use the symbols "EASY", "NORMAL", "HARD", even if the selection box displays different names, e.g. "Hard", "Very hard", "Nightmare".) The difficulty_descriptions is a formatted string that is best created using macros "MENU_IMG_TXT" and "MENU_IMG_TXT2" like this:

[campaign]

  #...

  difficulties=EASY,NORMAL,HARD
  difficulty_descriptions= {MENU_IMG_TXT2 elvish-fighter.png  _"Fighter"  _"(easiest)"} + ";"
                   + "*" + {MENU_IMG_TXT  elvish-hero.png     _"Hero"                 } + ";"
                         + {MENU_IMG_TXT2 elvish-champion.png _"Champion" _"(hardest)"}

  #...

[/campaign]

The semicolon ";" separates items in menu, and the asterisk "*" specifies the default value (see DescriptionWML). Number of rows in difficulty_descriptions must be the same as number of symbols in difficulties. The difficulty menu will look like this:

+-------------------------------+
| Choose a difficulty:          |
| [fighter.] Fighter  (easiest) |
| [hero.png] Hero               |
| [champion] Champion (hardest) |
+-------------------------------+

Campaign symbol

Each campaign must define a unique preprocessor symbol, to make program run efficiently (load data faster and use less memory). This symbol is used to include campaign-specific WML files, that is scenario files and campaign-specific macros. If you do not care about technical details, skip the following paragraph.

WML files include each other; starting with "$data/game.cfg" which includes some files that also include some files... and so on, up to all the units, campaigns, etc. There are hundreds of WML files which must be read and parsed; they consume a lot of memory and make program start slowly. To reduce this amount, scenario files are not loaded at the start of program; their inclusion is prevented by "#ifdef" preprocessor commands (see PreprocessorRef). When starting a campaign (or loading a saved game from campaign), the campaign-specific preprocessor symbol is defined, and WML files are reloaded... now including also scenario files from the current campaign (but not from other campaigns). Each campaign must define a unique preprocessor symbol, and conditionally include its campaign-specific files, to support this process. Without it, the campaign would work anyway, but its files would consume memory also when not necessary, e.g. when playing some other campaign.

The define attribute must contain a unique preprocessor symbol. It should start with "CAMPAIGN_" followed by the name of campaign. For example if your campaign is called "My Campaign", you should write:

[campaign]

  #...

  define=CAMPAIGN_MY_CAMPAIGN

  #...

[/campaign]

Then, you have to use this symbol at the end of campaign WML file (after the end of [campaign] tag) to include campaign-specific files (e.g. scenarios) like this:

#ifdef CAMPAIGN_MY_CAMPAIGN
{@campaigns/My_Campaign/scenarios}
#endif

Only the tags [binary_path] and [campaign] should go outside the "#ifdef" section.

Selecting first scenario

Attribute first_scenario specifies which scenario should be started first. Its value must be the same as the value of "id" attribute of the [scenario] tag for given scenario. For example your campaign can contain:

[campaign]

  #...

  first_scenario=My_first_scenario

  #...

[/campaign]

And the corresponding scenario would contain:

[scenario]

  id=My_first_scenario

  #...

[/scenario]

Please note that the "id" attribute of the [scenario] tag does not have to be the same as the name of scenario file. Attribute first_scenario refers to the "id" attribute of the [scenario] tag, not to the filename. (However, you should include all scenario files in your campaign file; read the previous section.)

All scenarios must have unique IDs. (That is: unique in scope of their campaign. Because scenarios from different campaigns are never loaded together in memory.)

Campaign tag only specifies the first scenario of the campaign. Then, each scenario specifies which one will follow.

The [about] tag

Template:DevFeature

Appears in [campaign] tag.

Attributes:

  • title -- (translatable) title of credits section
  • text -- names of campaign contributors

Campaign specific credits

A campaign can specify its own credits. These will be included in the game credits; in the bottom if player has not completed this campaign, in the top if player has completed this campaign.

There can be any number of [about] tags inside a [campaign] tag. Campaign-specific credits are preceded by the name of campaign. Each [about] tag contains one section of credits. Section title is in title attribute; it must be one of the following values:

  • "Campaign Designer"
  • "Current Maintainer"
  • "Artwork and Graphics Designers"
  • "Music"
  • "Miscellaneous"

The text attribute contains the names of contributors, each on separate line. Example:

#textdomain wesnoth
[about]
  title= _"Campaign Designer"
  text="Name Surname (nickname)"
[/about]
[about]
  title= _"Artwork and Graphics Designers"
  text="Artist One
Artist Two"
[/about]

Related forum thread: 9720.

A complete example

This is a campaign file for campaign "My Campaign"; the file path is "$userdata/campaigns/My_Campaign.cfg".

# This is a main campaign file of campaign "My Campaign".

[textdomain]
  name="wesnoth-My_Campaign"
  path="data/campaigns/My_Campaign/translations"
[/textdomain]

[campaign]
  #textdomain wesnoth-My_Campaign

  icon=small.png
  name= _"My Campaign"
  description= _"Hero goes somewhere and does something."
  image=large.png
 
  difficulties=EASY,NORMAL,HARD
  difficulty_descriptions= {MENU_IMG_TXT2 elvish-fighter.png  _"Fighter"  _"(easiest)"} + ";"
                   + "*" + {MENU_IMG_TXT  elvish-hero.png     _"Hero"                 } + ";"
                         + {MENU_IMG_TXT2 elvish-champion.png _"Champion" _"(hardest)"}

  define=CAMPAIGN_MY_CAMPAIGN

  first_scenario=My_first_scenario

  # DEVELOPMENT BRANCH ONLY...

  #textdomain wesnoth
  [about]
    title= _"Campaign Designer"
    text="Name Surname (nickname)"
  [/about]
  [about]
    title= _"Artwork and Graphics Designers"
    text="Artist One
Artist Two"
  [/about]

  # ...DEVELOPMENT BRANCH ONLY

[/campaign]

[binary_path]
  path=data/campaigns/My_Campaign/external_binary_data/
[/binary_path]
#ifdef CAMPAIGN_MY_CAMPAIGN
  [binary_path]
    path=data/campaigns/My_Campaign/
  [/binary_path]

  [+units]
    {@campaigns/My_Campaign/units}
  [/units]

  {@campaigns/My_Campaign/utilities}
  {@campaigns/My_Campaign/scenarios}

#endif

See Also