Difference between revisions of "WML Templates"

From The Battle for Wesnoth Wiki
(Finished campaign.cfg. Units, utils, scenarios, maps still to do. And needs sanity checking.)
(Units and scenarios still to do. Still needs sanity checking.)
Line 1: Line 1:
This page provides a set of blank 'templates' which can be used as a basis for user-made campaigns, scenarios, and units. You will need to have a basic understanding of WML to make best use of these resources. See [[ReferenceWML]]. You will also need to understand how to create text files on your computer and set up an appropriate directory structure for the campaign. By the time you have created a simple campaign using these templates, you should have learned enough about WML to be able to create more ambitious work on your own.
+
 
 +
This page provides a set of blank 'templates' which can be used as a basis
 +
for user-made campaigns, scenarios, and units. You will need to have a basic
 +
understanding of WML to make best use of these resources. See
 +
[[ReferenceWML]]. You will also need to understand how to create text files
 +
on your computer and set up an appropriate directory structure for the
 +
campaign. By the time you have created a simple campaign using these
 +
templates, you should have learned enough about WML to be able to create
 +
more ambitious work on your own.
  
 
== Campaigns ==
 
== Campaigns ==
  
For a basic campaign, you need to create a set of .cfg files in the correct locations. That also means you have to create a set of correctly-named directories as well. These examples will lead you through the basic setup of a campaign called ''Example_Campaign''. You will need to replace all occurrences of 'Example_Campaign' will the name of your own campaign.
+
For a basic campaign, you need to create a set of .cfg files in the correct
 +
locations. That also means you have to create a set of correctly-named
 +
directories as well. These examples will lead you through the basic setup of
 +
a campaign called ''Example_Campaign''. You will need to replace all
 +
occurrences of 'Example_Campaign' with the name of your own campaign.
 +
 
 +
For everything to work reliably, the names must be ''exactly'' as shown. If
 +
there is a mismatch between any of the names, Wesnoth will not be able to
 +
find all the data it needs to run your campaign, and it will stop dead with
 +
an error. Assume that all names are case-sensitive, and use underscores ( _
 +
) for spaces between words. Avoid accented characters as well. If you do
 +
not, you may find that your campaign only works properly for other people
 +
using the same operating system as you.
 +
 
 +
For Linux users, all paths are relative to
 +
'''/home/username/.wesnoth/data/campaigns/''', where 'username' will be the
 +
currently logged-in user. The game has been organised so that you can keep
 +
your own data separate from the main Wesnoth data, which means your custom
 +
campaigns will not interfere with the workings of the rest of the game, and
 +
ensures that you should never need to alter anything inside the main Wesnoth
 +
folder (usually /usr/local/share/wesnoth or similar).
 +
 
 +
For Mac users, [need correct information; may vary from version to version]
 +
 
 +
For Windows users, [need correct information; may vary from version to version]
  
For everything to work reliably, the names must be ''exactly'' as shown. If there is a mismatch between any of the names, Wesnoth will not be able to find all the data it needs to run your campaign, and it will stop dead with an error. Assume that all names are case-sensitive, and use underscores ( _ ) for spaces between words. Avoid accented characters as well. If you do not, you may find that your campaign only works properly for other people using the same operating system as you.
 
  
For Linux users, all paths are relative to '''/home/(your username)/.wesnoth/data/campaigns/'''. You do not ever have to alter your main Wesnoth folder (the one under /usr/local/share/wesnoth or similar). The game has been organised so that your can keep your own data separate from the main Wesnoth data, so that your custom campaigns do not interfere with the workings of the rest of the game.
+
=== Basic file creation ===
  
To make a campaign, you will need to create the following files and directories:
+
To make a campaign, you need to create a set of files and directories, as
 +
follows:
  
 
*A blank text file: /Example_Campaign.cfg
 
*A blank text file: /Example_Campaign.cfg
 
*A campaign folder: /Example_Campaign/
 
*A campaign folder: /Example_Campaign/
 
*A scenario folder: /Example_Campaign/scenarios/
 
*A scenario folder: /Example_Campaign/scenarios/
*At least one scenario file: /Example_Campaign/scenarios/First_Scenario.cfg
 
 
*A maps folder: /Example_Campaign/maps/
 
*A maps folder: /Example_Campaign/maps/
*As many maps as scenarios (covered elsewhere). These maps will usually be called /Example_Campaign/maps/First_Scenario.map, Second_Scenario.map and so on, but there may be exceptions.
 
 
If you are going to use custom units, images or macros, you will also need to create the following directories:
 
 
 
*A units folder: /Example_Campaign/units/
 
*A units folder: /Example_Campaign/units/
 
*An images folder: /Example_Campaign/images/
 
*An images folder: /Example_Campaign/images/
 
*A utilities (macros) folder: /Example_Campaign/utils/
 
*A utilities (macros) folder: /Example_Campaign/utils/
  
You can add these extra folders later on, when you need them, or you can create a full set of folders right at the start. As it does no harm to set them all up in advance and leave them empty, we suggest you do so.
+
*At least one scenario file: /Example_Campaign/scenarios/01_First_Scenario.cfg
 +
*As many maps as scenarios (covered elsewhere). These maps will usually be
 +
called /Example_Campaign/maps/01_First_Scenario.map, 02_Second_Scenario.map
 +
and so on, but there may be exceptions.
 +
*Inside the utils folder, a blank text file: /utils.cfg
 +
*Inside the utils folder, a blank text file: /deaths.cfg
 +
*Inside the utils folder, a blank text file: /route.cfg
 +
*Inside the utils folder, a blank text file: /story.cfg
 +
 
 +
'''Tip:''' Number your scenarios as the first part of their filenames. This
 +
makes it easier to tell what order they will be used in. If your scenarios
 +
branch (meaning a player will ''either'' play scenario A ''or'' scenario B,
 +
but not both), label the alternatives something like 03a_First_Branch.cfg,
 +
03b_Second_Branch.cfg and so on. For a basic campaign, we advise you not to
 +
use scenario branching unless you're already a confident WML coder.
 +
 
 +
'''Tip:''' Use the same numbering scheme for your maps as well, although if
 +
you want to name the maps differently from the corresponding scenario,
 +
that's fine. For example, you might have a scanerio called
 +
''01_Kidnap_Attempt.cfg'', while the associated map is called
 +
''01_The_Royal_Park.map''.
 +
 
 +
While you may not need custom folders for, say, units or campaign-specific
 +
graphics, it does no harm to set them up in advance and leave them empty, so
 +
we suggest you create them anyway.
 +
 
 +
It is important that you place all the parts of your campaign in the right
 +
places and that the folders are named correctly, because Wesnoth will look
 +
for these folders to find your scenarios, images etc. If you use a different
 +
folder arrangement of your own (for example if you store all your macros in
 +
a /macros/ directory) then you will have to adjust the example code
 +
accordingly.
  
It is important that you place all the parts of your campaign in the right places and that the folders are named correctly, because Wesnoth will look for these folders to find your scenarios, images etc.
+
'''Tip:''' Also choose an abbreviation for your campaign that doesn't clash
 +
with the names of any other campaign. For example, Heir to the Throne is
 +
commonly abbreviated HTTT. If your campaign is called 'An Example Campaign',
 +
use AEC. This is useful because you can then prepend 'AEC' to your
 +
campaign-specific macros and avoid accidental name clashes with WML code
 +
from other campaigns.
  
  
=== 1. Example_Campaign.cfg, [Campaign] section ===
+
=== Example_Campaign.cfg, [Campaign] section ===
  
The Example_Campaign.cfg file has two parts. The first part determines the available difficulty settings and difficulty descriptions for your campaign. Without this data, your campaign will not appear in the Wesnoth menu, and you won't be able to select it for playing. The difficulty settings are listed between a [campaign] and a [/campaign] tag as shown below. The parts marked in bold are the bits you should customise:
+
The Example_Campaign.cfg file has two parts. The first part determines the
 +
available difficulty settings and difficulty descriptions for your campaign.
 +
Without this data, your campaign will not appear in the Wesnoth menu, and
 +
you won't be able to select it for playing. The difficulty settings are
 +
listed between a [campaign] and a [/campaign] tag as shown below. The parts
 +
marked '''in bold''' are the bits you will need to customise:
  
 
  [campaign]
 
  [campaign]
 
 
  name= _ "'''An Example Campaign'''"
 
  name= _ "'''An Example Campaign'''"
 
  id='''EXAMPLE_CAMPAIGN'''
 
  id='''EXAMPLE_CAMPAIGN'''
Line 49: Line 116:
  
 
  icon='''Campaign_Icon.png'''
 
  icon='''Campaign_Icon.png'''
  description= _ "'''This is an example campaign template, all ready to be customised.'''"
+
  description= _ "'''This is an example campaign template, all ready to be
 +
customised.'''"
  
 
   [about]
 
   [about]
    title= _ "Campaign Designer"
+
  title= _ "Campaign Designer"
    text="'''Your Name'''"
+
  text="'''Your Name'''"
 
   [/about]
 
   [/about]
 +
 
   [about]
 
   [about]
 
     title= _ "Current Maintainer"
 
     title= _ "Current Maintainer"
Line 65: Line 134:
 
Working through this block of data a few lines at a time:
 
Working through this block of data a few lines at a time:
  
 +
name= _ "'''An Example Campaign'''"
  
name= _ "'''An Example Campaign'''"
 
  
The name of your campaign as it is displayed in the Wesnoth game. This is free-text. The name should more-or-less correspond to the name of the campaign folder, but you don't have to worry about file naming restrictions such as having to use underscores for spaces.
+
The name of your campaign as it is displayed in the Wesnoth game. This is
 +
free-text. The name should more-or-less correspond to the name of the
 +
campaign folder, but you don't have to worry about file naming restrictions
 +
such as having to use underscores for spaces.
  
  
Line 78: Line 150:
 
  define='''EXAMPLE_CAMPAIGN'''
 
  define='''EXAMPLE_CAMPAIGN'''
  
We will call this important entry the ''campaign name key''. The #ifdef command used in section 2 must exactly match whatever you define here.
+
We will call this important entry the ''campaign name key''. The #ifdef
 +
command used in section 3 must exactly match whatever you define here.
  
  
 
  first_scenario='''First_Scenario'''
 
  first_scenario='''First_Scenario'''
  
The scenario identifier for the first scenario. This must exactly match the scenario ID in the relevant scenario file. It's helpful (but not compulsory) to have the scenario filename and the scenario ID match.
+
The scenario identifier for the first scenario. This must exactly match the
 +
scenario ID in the relevant scenario file. It's helpful (but not compulsory)
 +
to have the scenario filename and the scenario ID match.
  
  
 
  difficulties=EASY,NORMAL,HARD
 
  difficulties=EASY,NORMAL,HARD
  
Three different difficulty levels is very common for Wesnoth scenarios, but you can have more or fewer if you want. For now, stick with three, and keep their names unaltered.
+
Using three different difficulty levels is very common for Wesnoth
 +
scenarios, but you can have more or fewer if you want. For now, stick with
 +
three, and leave their names unaltered.
  
  
Line 98: Line 175:
 
  _"'''Hard setting description'''" _"(Hard)"}
 
  _"'''Hard setting description'''" _"(Hard)"}
  
There are six different things you can customise here. The Easy, Normal and Hard setting descriptions are usually set to an atmospheric name for the corresponding difficulty level. For example, you might use 'Scout' for the easiest setting, 'Warrior' for the middle setting, and 'General' for the hardest setting. As a rough guide, you should limit yourself to 1-3 words for each difficulty description. The Easy_Image.png, Normal_Image.png and Hard_Image.png refer to custom graphics for each difficulty level. Normally you would save these in the /Example_Campaign/images/ folder. You can also use any standard Wesnoth graphic. For example, if you wanted to use the image of an orcish archer for one of the difficulty settings, you would give the filename as units/orcs/archer.png
+
There are six different things you can customise here. The Easy, Normal and
 +
Hard setting descriptions are usually set to an atmospheric name for the
 +
corresponding difficulty level. For example, you might use 'Scout' for the
 +
easiest setting, 'Warrior' for the middle setting, and 'General' for the
 +
hardest setting. As a rough guide, you should limit yourself to 1-3 words
 +
for each difficulty description. The Easy_Image.png, Normal_Image.png and
 +
Hard_Image.png refer to custom graphics for each difficulty level. Normally
 +
you would save these in the /Example_Campaign/images/ folder. You can also
 +
use any standard Wesnoth graphic. For example, if you wanted to use the
 +
image of an orcish archer for one of the difficulty settings, you would give
 +
the filename as units/orcs/archer.png
  
  
 
  icon='''Campaign_Icon.png'''
 
  icon='''Campaign_Icon.png'''
  
A custom campaign icon is optional. If you want to use a standard Wesnoth image, provide the path from the main Wesnoth images directory. For example, items/monolith3.png
+
A custom campaign icon is optional. If you want to use a standard Wesnoth
Otherwise Wesnoth will look in the /Example_Campaign/images/ folder, in this example for a png file called Campaign_Icon.png
+
image, provide the path from the main Wesnoth images directory. For example,
 +
items/monolith3.png
 +
 
 +
Otherwise Wesnoth will look in the /Example_Campaign/images/ folder, in this
 +
example for a png file called Campaign_Icon.png
  
  
  description= _ "'''This is an example campaign template, all ready to be customised.'''"
+
  description= _ "'''This is an example campaign template, all ready to be
 +
customised.'''"
  
The campaign description is also free-text. This is a chance to give a quick summary of what your campaign is about. 2-3 lines of text is about the right length.
+
The campaign description is also free-text. This is a chance to give a quick
 +
summary of what your campaign is about. 2-3 lines of text is about the right
 +
length.
  
  
Line 116: Line 210:
 
     text="'''Your Name'''"
 
     text="'''Your Name'''"
 
   [/about]
 
   [/about]
 +
 
   [about]
 
   [about]
 
     title= _ "Current Maintainer"
 
     title= _ "Current Maintainer"
Line 121: Line 216:
 
   [/about]
 
   [/about]
  
 +
These bits are optional, but if you're planning to share the campaign with
 +
others, it's helpful to have some information about who you are. You might
 +
also want to credit the people who have helped you with artwork, debugging,
 +
or lots of other things, but at the minimum you should fill in your name as
 +
the original campaign designer and presumably as the current maintainer too.
  
If you're planning to share the campaign with others, it's helpful to have a bit of information about who you are. You might also want to credit the people who have helped you with artwork, debugging, or lots of other things, but at the minimum you should fill in your name as the original campaign designer and presumably as the current maintainer too.
+
Having filled in and customised all of this data, you have set up a workable
 
+
skeleton campaign structure. There are extra pieces of data that could be
 
+
inserted into the campaign section, but the basic setup described here is
Having filled in and customised all of this data, you have set up a workable skeleton campaign structure. There are extra pieces of data that could be inserted into the campaign section, but the basic setup described here is enough to be going on with. Once you are ready to be more ambitions, see [[CampaignWML]] for details on other tags and customisation that could be of use.
+
enough to be going on with. Once you are ready to be more ambitions, see
 
+
[[CampaignWML]] for details on other tags and customisation that could be of
 +
use.
  
=== 2. Example_Campaign.cfg, #define section ===
 
  
When Wesnoth starts up, it scans for all available campaign files. But loading ''all'' the images, macros, units etc. from all available campaigns might take a very long time and might cause errors, so when Wesnoth first starts it only reads the data stored between [campaign] tags.
+
=== Example_Campaign.cfg, #define section ===
  
 +
When Wesnoth starts up, it scans for all available campaign files. But
 +
loading ''all'' the images, macros, units etc. from all available campaigns
 +
might take a very long time and might cause errors, so when Wesnoth first
 +
starts it only reads the data stored between [campaign] tags.
  
 
Remember the line
 
Remember the line
Line 137: Line 241:
 
  define=EXAMPLE_CAMPAIGN
 
  define=EXAMPLE_CAMPAIGN
  
? When a particular campaign is selected by the player, Wesnoth starts loading all the rest of the data for that particular campaign. But for Wesnoth to do this, the ''campaign name key'' and the campaign data must match up correctly. Assuming they do, all the scenario code found by Wesnoth matching the campaign name key will be run. And that is what the lines of code below are for:
+
? When a particular campaign is selected by the player, Wesnoth starts
+
loading all the rest of the data for that particular campaign. But for
 +
Wesnoth to do this, the ''campaign name key'' and the campaign data must
 +
match up correctly. Assuming they do, all the scenario code found by Wesnoth
 +
matching the campaign name key will be run. And that is what the lines of
 +
code below are for. As before, you will need to customise all the bits
 +
marked '''in bold''':
 +
 
 
  #ifdef '''EXAMPLE_CAMPAIGN'''
 
  #ifdef '''EXAMPLE_CAMPAIGN'''
  
Line 148: Line 258:
 
  {@campaigns/'''Example_Campaign'''/utils}
 
  {@campaigns/'''Example_Campaign'''/utils}
  
 +
# Add custom units
 
  [+units]
 
  [+units]
 
   {@campaigns/'''Example_Campaign'''/units}
 
   {@campaigns/'''Example_Campaign'''/units}
 
  [/units]
 
  [/units]
  
 +
# Add scenarios
 
  {@campaigns/'''Example_Campagn'''/scenarios}
 
  {@campaigns/'''Example_Campagn'''/scenarios}
  
Line 159: Line 271:
 
What do these lines of data do?
 
What do these lines of data do?
  
+
 
 
  #ifdef '''EXAMPLE_CAMPAIGN'''
 
  #ifdef '''EXAMPLE_CAMPAIGN'''
  
Line 169: Line 281:
 
  [/binary_path]
 
  [/binary_path]
  
The [binary_path] tag tells Wesnoth where the images/, units/, scenarios/, maps/ and utils/ folders are.
+
The [binary_path] tag tells Wesnoth where the images/, units/, scenarios/,
 +
maps/ and utils/ folders are.
  
  
 
  # Load campaign utilities first
 
  # Load campaign utilities first
  
This line is just a free-text comment. Note that in WML, the order in which we load things matters. It's usually a good idea to load campaign macros and utilities as soon as possible.  By loading these utilities ''before'' the units and scenarios, we know that our custom utilities are available for use in our unit and scenario definitions. Trying to load scenario resources in the wrong order is a common cause of problems when writing campaigns. If for some reason you need to load things in a different order to make your campaign work, adjust the warning accordingly.
+
This line is just a free-text comment. Note that in WML, the order in which
 +
we load things matters. It's usually a good idea to load campaign macros and
 +
utilities as soon as possible.  By loading these utilities ''before'' the
 +
units and scenarios, we know that our custom utilities are available for use
 +
in our unit and scenario definitions. Trying to load scenario resources in
 +
the wrong order is a common cause of problems when writing campaigns. If for
 +
some reason you need to load things in a different order to make your
 +
campaign work, adjust the warning accordingly.
  
  
Line 182: Line 302:
  
  
 +
# Add custom units
 
  [+units]
 
  [+units]
 
   {@campaigns/'''Example_Campaign'''/units}
 
   {@campaigns/'''Example_Campaign'''/units}
 
  [/units]
 
  [/units]
  
These lines load all the custom units for the campaign.
+
These lines load all the custom units for the campaign. ('# Add custom
 +
units' is just another free-text comment.)
  
  
  {@campaigns/'''Example_Campagn'''/scenarios}
+
# Add scenarios
 +
  {@campaigns/'''Example_Campaign'''/scenarios}
  
And this line ensures that Wesnoth can load the next scenario when the previous one is completed.
+
Another comment, then a line that tells Wesnoth to find all the campaign
 +
scenarios.
  
  
 
  #endif
 
  #endif
  
The #ifdef at the start of section 2 is a special multi-line instruction which must be closed using an #endif tag.
+
The #ifdef at the start of section 2 is a special multi-line instruction
 +
which must be closed using an #endif tag.
 +
 
 +
 
 +
=== utils.cfg ===
 +
 
 +
Next you need a file called /Example_Campaign/utils/utils.cfg. If you
 +
created the utils folder and utils.cfg file in section 1, a blank file with
 +
the correct name will already be set up in the correct location. Otherwise,
 +
create it now.
 +
 
 +
The purpose of the utils.cfg file is to act as a repository for any
 +
campaign-specific macros you create. Other useful macros can be stored here
 +
as well. How you organise them is up to you – you can store them all
 +
in the utils.cfg file, or save each one in its own .cfg file. As long as you
 +
save all you macros inside the utils directory, everything should work as
 +
expected.
  
 +
Here are some sample macros that are widely-used in many campaigns:
  
=== 3. utils.cfg ===
 
  
Next you need  /CAMPAIGN_NAME/utils/utils.cfg: (remember, this is in '''/home/(your username)/.wesnoth/data/campaigns/''' (under linux), '''NOT''' /usr/local/share/wesnoth/data/campaigns!!!)
+
==== Maps ====
  
This is also the place to add any other macros you make, either in their own files, or in this one. The just have to be in the utils/ folder you told wesnoth about :)
+
# A simple map-listing macro
 +
# Usage: map={MAP scenario_name.map}
  
# A useful macro to make listing your maps easier.
 
# Usage: map={MAP scenario1_map}
 
 
  #define MAP MAP_NAME
 
  #define MAP MAP_NAME
 +
 
  map_data="{@campaigns/CAMPAIGN_NAME/maps/{MAP_NAME}}"
 
  map_data="{@campaigns/CAMPAIGN_NAME/maps/{MAP_NAME}}"
 +
 
  #enddef
 
  #enddef
   
+
 
  # This is a macro that will trigger on the death of your heroes (if you want one)
+
'''Usage:''' Just copy-and-paste these five lines of text ''untouched'' into
  #define DEATHS
+
the utils.cfg file. When you want to use this macro, you call it in your
  [event]## Copy for each of the heroes
+
''scenario.cfg'' files, by inserting a line such as
 +
 
 +
  map={MAP '''01_First_Scenario.map'''}
 +
 
 +
or
 +
 
 +
  map={MAP '''02a_Second_Scenario_Branch_A.map'''}
 +
 
 +
or similar, customising the bits in bold as appropriate to your campaign.
 +
 
 +
 
 +
=== deaths.cfg ===
 +
 
 +
This is a macro that will trigger on the death of major campaign
 +
characters, including the heroes. If you only need a few dying speeches, you
 +
could just store the deaths macro inside utils.cfg. If you have more than
 +
about four, or if you plan for characters to use different dying speeches in
 +
different scenarios, it's probably better to store the deaths macro
 +
separately, as it could get rather long.
 +
 
 +
  #define '''AEC_DEATHS'''
 +
 
 +
  [event]
 
  name=die
 
  name=die
 
   [filter]
 
   [filter]
   description= ## the description of the hero unit e.g. "konrad"
+
   description="'''Hero Name'''"
 
   [/filter]
 
   [/filter]
 
   [message]
 
   [message]
   description= ## the description of the hero unit e.g. "konrad"
+
   description="'''Hero Name'''"
   message= _ "" ## what you want them to say.
+
   message= _ "'''Hero's final words'''"
 
   [/message]
 
   [/message]
 
   [endlevel]
 
   [endlevel]
   result=defeat ## Hero dying = loss.
+
   result=defeat
 
   [/endlevel]
 
   [/endlevel]
 
  [/event]
 
  [/event]
 +
 +
[event]
 +
name=die
 +
  [filter]
 +
  description="'''Sidekick Name'''"
 +
  [/filter]
 +
  [message]
 +
  description="'''Sidekick Name'''"
 +
  message= _ "'''Sidekick's final words'''"
 +
  [/message]
 +
  [endlevel]
 +
  result=defeat
 +
  [/endlevel]
 +
[/event]
 +
 +
[event]
 +
name=die
 +
  [filter]
 +
  description="'''Enemy Name'''"
 +
  [/filter]
 +
  [message]
 +
  description="'''Enemy Name'''"
 +
  message= _ "'''Enemy's final words'''"
 +
  [/message]
 +
  [endlevel]
 +
  result=victory
 +
  [/endlevel]
 +
[/event]
 +
 +
#enddef
 +
 +
'''Usage:''' Copy-and-paste this into the deaths.cfg file, and alter the
 +
names and final words for each character. If the unit's dying means game
 +
over for the player, include the section of text that says
 +
 +
[endlevel]
 +
result=defeat
 +
[/endlevel]
 +
 +
otherwise delete it.
 +
 +
If the unit's dying means an immediate victory in that scenario, include the
 +
section of text that says
 +
 +
[endlevel]
 +
result=victory
 +
[/endlevel]
 +
 +
If you have additional units who need to speak some final words, just make
 +
extra copies of the appropriate section and customise it to suit.
 +
 +
 +
=== story.cfg ===
 +
 +
The story.cfg file allows you to collect together all the background plot
 +
for the campaign in one place. You ''can'' include this data inside the
 +
individual scenario files, but it's better coding practice to separate
 +
things out a bit. You can then manage the entire campaign plot in one place
 +
rather than having to scan through a dozen scenario files.
 +
 +
 +
#define '''AEC_STORY01'''
 +
 +
[story]
 +
  [part]
 +
  music='''gameplay01.ogg'''
 +
  story= _ "'''The background story, part one.'''"
 +
  background='''Background_Image01.png'''
 +
  [/part]
 +
 +
  [part]
 +
  music='''gameplay02.ogg'''
 +
  story= _ "'''The background story, part two.'''"
 +
  background='''Background_Image02.png'''
 +
  [/part]
 +
[/story]
 +
 +
#enddef
 +
 +
#define '''AEC_STORY02'''
 +
 +
[story]
 +
  [part]
 +
  music='''gameplay01.ogg'''
 +
  story= _ "'''The background story, part three.'''"
 +
  background='''Background_Image03.png'''
 +
  [/part]
 +
[/story]
 +
 +
#enddef
 +
 +
 +
#define '''AEC_STORY03'''
 +
#Placeholder macro; no extra plot exposition for this scenario.
 +
#enddef
 +
 +
 +
#define '''AEC_STORY04'''
 +
 +
[story]
 +
  [part]
 +
  music='''gameplay03.ogg'''
 +
  story= _ "'''An unexpected twist halfway through the campaign.'''"
 +
  background='''Background_Image04.png'''
 +
  [/part]
 +
[/story]
 +
 
  #enddef
 
  #enddef
  
=== 4. Scenarios ===
+
'''Usage:''' Copy-and-paste this into the story.cfg file, and alter the
 +
music, text and background image for each stage of the campaign. Each block
 +
of story text should be about 2-4 lines. You can have more background text
 +
at the very start of the campaign, but don't insert two or three paragraphs
 +
of prose between every scenario. Very few people will read it. When you need
 +
extra plot sections, just make extra copies of the appropriate parts and
 +
customise them.
 +
 
 +
Music is optional. If you don't want any music delete the 'music=…'
 +
lines.
 +
 
 +
On Linux the standard Wesnoth music available is in
 +
/usr/local/share/wesnoth/music/
 +
In Windows, the music will be in [need correct information; may vary from
 +
version to version]
 +
On the Mac, the music will be in [need correct information; may vary from
 +
version to version]
 +
 
 +
Background images are optional but encouraged. If no image filename is
 +
supplied, the text appears against a black screen, which is rather dull. If
 +
you don't have any suitable images delete the 'background=…' lines.
 +
 
 +
 
 +
=== route.cfg ===
 +
 
 +
The route.cfg file allows you to track your heroes' progress across a
 +
campaign map. You don't have to have a campaign map at all, of course, but
 +
they are commonly used.
 +
 
 +
#define '''AEC_ROUTE01'''
 +
 
 +
[story]
 +
  [part]
 +
  background='''Campaign_Map.png'''
 +
  show_title=yes
 +
  {DOT '''100 150'''}
 +
  {DOT '''150 150'''}
 +
  {DOT '''200 150'''}
 +
  {DOT '''250 150'''}
 +
  {DOT '''250 200'''}
 +
  {CROSS '''250 250'''}
 +
  [/part]
 +
[/story]
 +
 
 +
#enddef
 +
 
 +
 
 +
#define '''AEC_ROUTE02'''
 +
 
 +
[story]
 +
  [part]
 +
  background='''Campaign_Map.png'''
 +
  show_title=yes
 +
  {DOT '''280 290'''}
 +
  {DOT '''310 330'''}
 +
  {DOT '''340 370'''}
 +
  {DOT '''370 410'''}
 +
  {DOT '''400 450'''}
 +
  {DOT '''430 490'''}
 +
  {DOT '''460 530'''}
 +
  {CROSS '''490 570'''}
 +
  [/part]
 +
[/story]
 +
 
 +
#enddef
 +
 
 +
'''Usage:''' Copy-and-paste this into the route.cfg file, and alter the
 +
background, DOT and CROSS commands to suit the map. Make extra copies of
 +
each section from #define to #enddef and renumber them for scenarios 03 and
 +
onwards. 'show_title=yes' is optional, and shows the campaign title. You can
 +
delete this line if you don't want the title to appear.
 +
 
 +
'''Tip:''' The distance between dots is measured in pixels. 30-60 pixels
 +
between dots is about right. The bigger the gap, the faster the heroes are
 +
assumed to be moving, so if they're moving at constant speed try to keep the
 +
distance between dots more or less constant. That's a bit more complicated
 +
if they're moving at an angle other than exactly horizontal or exactly
 +
vertical. As a rule of thumb, 50 dots horizontally comes to 35 + 35 at
 +
45° when moving diagonally.
 +
 
 +
 
 +
=== Scenarios ===
 +
 
 +
Note: This template refers to macros defined in the example macro files
 +
given above, utils.cfg, deaths.cfg, story.cfg and route.cfg. That's why you
 +
have to set up those files first. To use this template, make copies of it as
 +
01_First_Scenario.cfg, 02_Second_Scenario.cfg and so on for each scenario
 +
you have planned, and store them in the /Example_Campaign/scenarios/ folder.
  
Note: this template refers to macros in the template utils.cfg shown above.
 
 
  [scenario]
 
  [scenario]
  name= _ ""
+
  name= _ "'''The First Scenario'''"
  id=
+
  id='''01_First_Scenario'''
  next_scenario=
+
  next_scenario='''02_Second_Scenario'''
 +
 
 +
{MAP '''01_First_Scenario.map'''}
 +
{SCENARIO_MUSIC "gameplay01.ogg"}
 +
{TURNS '''20 18 15'''}
  
  {MAP }
+
  {MORNING}
  turns=
+
  {AFTERNOON}
  {MORNING}
+
{DUSK}
  {AFTERNOON}
+
{FIRST_WATCH}
  {DUSK}
+
{SECOND_WATCH}
  {FIRST_WATCH}
+
{DAWN}
  {SECOND_WATCH}
 
  {DAWN}
 
  
 
  victory_when_enemies_defeated=yes
 
  victory_when_enemies_defeated=yes
 
  disallow_recall=no
 
  disallow_recall=no
  [story]
+
 
    [part]
+
{'''AEC_STORY_01'''}
    background=
+
{'''AEC_ROUTE_01'''}
      {DOT }
+
 
      {CROSS }
+
   [side]
    [/part]
 
  [/story]
 
   [side]## Copy for allies
 
 
   side=1
 
   side=1
 
   controller=human
 
   controller=human
 
   fog=no
 
   fog=no
 
   shroud=no
 
   shroud=no
   team_name=good
+
   team_name='''good'''
+
   description='''Hero Name'''
   description=
+
   type='''Spearman'''
   type=
 
 
 
   canrecruit=yes
 
   canrecruit=yes
   recruit=
+
   recruit='''Archer,Bowman,Chocobone'''
 
   [/side]
 
   [/side]
   [side]## Copy for enemies
+
 
 +
   [side]
 
   side=2
 
   side=2
   team_name=enemy
+
   team_name='''evil'''
 +
  description='''Enemy Name'''
 +
  type='''Horseman'''
 +
  canrecruit=yes
 +
  recruit='''Draug,Elvish Archer,Fencer'''
 +
  {GOLD '''150 200 250'''}
 +
  [/side]
  
   description=
+
   {'''AEC_DEATHS'''}
  type=
 
  
  canrecruit=yes
 
  recruit=
 
  {GOLD }
 
  [/side]
 
  {DEATHS}
 
 
   [event]
 
   [event]
 
   name=start
 
   name=start
Line 291: Line 645:
 
     side=1
 
     side=1
 
       [objective]
 
       [objective]
       description= _ ""
+
       description= _ "Victory Condition"
 
       condition=win
 
       condition=win
 
       [/objective]
 
       [/objective]
 
       [objective]
 
       [objective]
       description= _ "Death of "
+
       description= _ "Death of Hero"
 
       condition=lose
 
       condition=lose
 
       [/objective]
 
       [/objective]
 
       [objective]
 
       [objective]
       description= _ "Death of "
+
       description= _ "Death of Sidekick"
 
       condition=lose
 
       condition=lose
 
       [/objective]
 
       [/objective]
Line 308: Line 662:
 
     [/objectives]
 
     [/objectives]
 
   [/event]
 
   [/event]
   [event]## Copy for events
+
 
 +
   [event]
 
   name=
 
   name=
 
     [filter]
 
     [filter]
 
     [/filter]
 
     [/filter]
     [message]## Copy for messages
+
     [message]
 
     description=
 
     description=
 
     message= _ ""
 
     message= _ ""
 
     [/message]
 
     [/message]
 
   [/event]
 
   [/event]
 +
 
  [/scenario]
 
  [/scenario]
  
=== 5. Units ===
+
 
 +
 
 +
 
 +
=== Units ===
  
 
  [unit]
 
  [unit]
Line 379: Line 738:
 
== See Also ==
 
== See Also ==
  
* [[UsefulWMLFragments]
+
* [[UsefulWMLFragments]]
 
* [[ReferenceWML]]
 
* [[ReferenceWML]]
  
 
[[Category: UsefulWMLFragments]]
 
[[Category: UsefulWMLFragments]]

Revision as of 17:23, 28 January 2009

This page provides a set of blank 'templates' which can be used as a basis for user-made campaigns, scenarios, and units. You will need to have a basic understanding of WML to make best use of these resources. See ReferenceWML. You will also need to understand how to create text files on your computer and set up an appropriate directory structure for the campaign. By the time you have created a simple campaign using these templates, you should have learned enough about WML to be able to create more ambitious work on your own.

Campaigns

For a basic campaign, you need to create a set of .cfg files in the correct locations. That also means you have to create a set of correctly-named directories as well. These examples will lead you through the basic setup of a campaign called Example_Campaign. You will need to replace all occurrences of 'Example_Campaign' with the name of your own campaign.

For everything to work reliably, the names must be exactly as shown. If there is a mismatch between any of the names, Wesnoth will not be able to find all the data it needs to run your campaign, and it will stop dead with an error. Assume that all names are case-sensitive, and use underscores ( _ ) for spaces between words. Avoid accented characters as well. If you do not, you may find that your campaign only works properly for other people using the same operating system as you.

For Linux users, all paths are relative to /home/username/.wesnoth/data/campaigns/, where 'username' will be the currently logged-in user. The game has been organised so that you can keep your own data separate from the main Wesnoth data, which means your custom campaigns will not interfere with the workings of the rest of the game, and ensures that you should never need to alter anything inside the main Wesnoth folder (usually /usr/local/share/wesnoth or similar).

For Mac users, [need correct information; may vary from version to version]

For Windows users, [need correct information; may vary from version to version]


Basic file creation

To make a campaign, you need to create a set of files and directories, as follows:

  • A blank text file: /Example_Campaign.cfg
  • A campaign folder: /Example_Campaign/
  • A scenario folder: /Example_Campaign/scenarios/
  • A maps folder: /Example_Campaign/maps/
  • A units folder: /Example_Campaign/units/
  • An images folder: /Example_Campaign/images/
  • A utilities (macros) folder: /Example_Campaign/utils/
  • At least one scenario file: /Example_Campaign/scenarios/01_First_Scenario.cfg
  • As many maps as scenarios (covered elsewhere). These maps will usually be

called /Example_Campaign/maps/01_First_Scenario.map, 02_Second_Scenario.map and so on, but there may be exceptions.

  • Inside the utils folder, a blank text file: /utils.cfg
  • Inside the utils folder, a blank text file: /deaths.cfg
  • Inside the utils folder, a blank text file: /route.cfg
  • Inside the utils folder, a blank text file: /story.cfg

Tip: Number your scenarios as the first part of their filenames. This makes it easier to tell what order they will be used in. If your scenarios branch (meaning a player will either play scenario A or scenario B, but not both), label the alternatives something like 03a_First_Branch.cfg, 03b_Second_Branch.cfg and so on. For a basic campaign, we advise you not to use scenario branching unless you're already a confident WML coder.

Tip: Use the same numbering scheme for your maps as well, although if you want to name the maps differently from the corresponding scenario, that's fine. For example, you might have a scanerio called 01_Kidnap_Attempt.cfg, while the associated map is called 01_The_Royal_Park.map.

While you may not need custom folders for, say, units or campaign-specific graphics, it does no harm to set them up in advance and leave them empty, so we suggest you create them anyway.

It is important that you place all the parts of your campaign in the right places and that the folders are named correctly, because Wesnoth will look for these folders to find your scenarios, images etc. If you use a different folder arrangement of your own (for example if you store all your macros in a /macros/ directory) then you will have to adjust the example code accordingly.

Tip: Also choose an abbreviation for your campaign that doesn't clash with the names of any other campaign. For example, Heir to the Throne is commonly abbreviated HTTT. If your campaign is called 'An Example Campaign', use AEC. This is useful because you can then prepend 'AEC' to your campaign-specific macros and avoid accidental name clashes with WML code from other campaigns.


Example_Campaign.cfg, [Campaign] section

The Example_Campaign.cfg file has two parts. The first part determines the available difficulty settings and difficulty descriptions for your campaign. Without this data, your campaign will not appear in the Wesnoth menu, and you won't be able to select it for playing. The difficulty settings are listed between a [campaign] and a [/campaign] tag as shown below. The parts marked in bold are the bits you will need to customise:

[campaign]
name= _ "An Example Campaign"
id=EXAMPLE_CAMPAIGN
define=EXAMPLE_CAMPAIGN
first_scenario=First_Scenario
difficulties=EASY,NORMAL,HARD
difficulty_descriptions={MENU_IMG_TXT2 Easy_Image.png
_"Easy setting description" _"(Easy)"} + ";"
+ {MENU_IMG_TXT2 Normal_Image.png
_"Normal setting description" _"(Normal)"} + ";"
+ {MENU_IMG_TXT2 Hard_Image.png
_"Hard setting description" _"(Hard)"}
icon=Campaign_Icon.png
description= _ "This is an example campaign template, all ready to be

customised."

  [about]
  title= _ "Campaign Designer"
  text="Your Name"
  [/about]
  [about]
    title= _ "Current Maintainer"
    text="Your Name"
  [/about]
[/campaign]


Working through this block of data a few lines at a time:

name= _ "An Example Campaign"


The name of your campaign as it is displayed in the Wesnoth game. This is free-text. The name should more-or-less correspond to the name of the campaign folder, but you don't have to worry about file naming restrictions such as having to use underscores for spaces.


id=EXAMPLE_CAMPAIGN

The campaign identifier. This is used internally by the Wesnoth game.


define=EXAMPLE_CAMPAIGN

We will call this important entry the campaign name key. The #ifdef command used in section 3 must exactly match whatever you define here.


first_scenario=First_Scenario

The scenario identifier for the first scenario. This must exactly match the scenario ID in the relevant scenario file. It's helpful (but not compulsory) to have the scenario filename and the scenario ID match.


difficulties=EASY,NORMAL,HARD

Using three different difficulty levels is very common for Wesnoth scenarios, but you can have more or fewer if you want. For now, stick with three, and leave their names unaltered.


difficulty_descriptions={MENU_IMG_TXT2 Easy_Image.png
_"Easy setting description" _"(Easy)"} + ";"
+ {MENU_IMG_TXT2 Normal_Image.png
_"Normal setting description" _"(Normal)"} + ";"
+ {MENU_IMG_TXT2 Hard_Image.png
_"Hard setting description" _"(Hard)"}

There are six different things you can customise here. The Easy, Normal and Hard setting descriptions are usually set to an atmospheric name for the corresponding difficulty level. For example, you might use 'Scout' for the easiest setting, 'Warrior' for the middle setting, and 'General' for the hardest setting. As a rough guide, you should limit yourself to 1-3 words for each difficulty description. The Easy_Image.png, Normal_Image.png and Hard_Image.png refer to custom graphics for each difficulty level. Normally you would save these in the /Example_Campaign/images/ folder. You can also use any standard Wesnoth graphic. For example, if you wanted to use the image of an orcish archer for one of the difficulty settings, you would give the filename as units/orcs/archer.png


icon=Campaign_Icon.png

A custom campaign icon is optional. If you want to use a standard Wesnoth image, provide the path from the main Wesnoth images directory. For example, items/monolith3.png

Otherwise Wesnoth will look in the /Example_Campaign/images/ folder, in this example for a png file called Campaign_Icon.png


description= _ "This is an example campaign template, all ready to be

customised."

The campaign description is also free-text. This is a chance to give a quick summary of what your campaign is about. 2-3 lines of text is about the right length.


  [about]
    title= _ "Campaign Designer"
    text="Your Name"
  [/about]
  [about]
    title= _ "Current Maintainer"
    text="Your Name"
  [/about]

These bits are optional, but if you're planning to share the campaign with others, it's helpful to have some information about who you are. You might also want to credit the people who have helped you with artwork, debugging, or lots of other things, but at the minimum you should fill in your name as the original campaign designer and presumably as the current maintainer too.

Having filled in and customised all of this data, you have set up a workable skeleton campaign structure. There are extra pieces of data that could be inserted into the campaign section, but the basic setup described here is enough to be going on with. Once you are ready to be more ambitions, see CampaignWML for details on other tags and customisation that could be of use.


Example_Campaign.cfg, #define section

When Wesnoth starts up, it scans for all available campaign files. But loading all the images, macros, units etc. from all available campaigns might take a very long time and might cause errors, so when Wesnoth first starts it only reads the data stored between [campaign] tags.

Remember the line

define=EXAMPLE_CAMPAIGN

? When a particular campaign is selected by the player, Wesnoth starts loading all the rest of the data for that particular campaign. But for Wesnoth to do this, the campaign name key and the campaign data must match up correctly. Assuming they do, all the scenario code found by Wesnoth matching the campaign name key will be run. And that is what the lines of code below are for. As before, you will need to customise all the bits marked in bold:

#ifdef EXAMPLE_CAMPAIGN
[binary_path]
   path=data/campaigns/Example_Campaign
[/binary_path]
# Load campaign utilities first
{@campaigns/Example_Campaign/utils}
# Add custom units
[+units]
  {@campaigns/Example_Campaign/units}
[/units]
# Add scenarios
{@campaigns/Example_Campagn/scenarios}
#endif


What do these lines of data do?


#ifdef EXAMPLE_CAMPAIGN

This must match the define=EXAMPLE_CAMPAIGN from section 1.


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

The [binary_path] tag tells Wesnoth where the images/, units/, scenarios/, maps/ and utils/ folders are.


# Load campaign utilities first

This line is just a free-text comment. Note that in WML, the order in which we load things matters. It's usually a good idea to load campaign macros and utilities as soon as possible. By loading these utilities before the units and scenarios, we know that our custom utilities are available for use in our unit and scenario definitions. Trying to load scenario resources in the wrong order is a common cause of problems when writing campaigns. If for some reason you need to load things in a different order to make your campaign work, adjust the warning accordingly.


{@campaigns/Example_Campaign/utils}

This line loads all the campaign macros and utilities.


# Add custom units
[+units]
  {@campaigns/Example_Campaign/units}
[/units]

These lines load all the custom units for the campaign. ('# Add custom units' is just another free-text comment.)


# Add scenarios
{@campaigns/Example_Campaign/scenarios}

Another comment, then a line that tells Wesnoth to find all the campaign scenarios.


#endif

The #ifdef at the start of section 2 is a special multi-line instruction which must be closed using an #endif tag.


utils.cfg

Next you need a file called /Example_Campaign/utils/utils.cfg. If you created the utils folder and utils.cfg file in section 1, a blank file with the correct name will already be set up in the correct location. Otherwise, create it now.

The purpose of the utils.cfg file is to act as a repository for any campaign-specific macros you create. Other useful macros can be stored here as well. How you organise them is up to you – you can store them all in the utils.cfg file, or save each one in its own .cfg file. As long as you save all you macros inside the utils directory, everything should work as expected.

Here are some sample macros that are widely-used in many campaigns:


Maps

# A simple map-listing macro
# Usage: map={MAP scenario_name.map}
#define MAP MAP_NAME
map_data="{@campaigns/CAMPAIGN_NAME/maps/{MAP_NAME}}"
#enddef

Usage: Just copy-and-paste these five lines of text untouched into the utils.cfg file. When you want to use this macro, you call it in your scenario.cfg files, by inserting a line such as

map={MAP 01_First_Scenario.map}

or

map={MAP 02a_Second_Scenario_Branch_A.map}

or similar, customising the bits in bold as appropriate to your campaign.


deaths.cfg

This is a macro that will trigger on the death of major campaign characters, including the heroes. If you only need a few dying speeches, you could just store the deaths macro inside utils.cfg. If you have more than about four, or if you plan for characters to use different dying speeches in different scenarios, it's probably better to store the deaths macro separately, as it could get rather long.

#define AEC_DEATHS
[event]
name=die
  [filter]
  description="Hero Name"
  [/filter]
  [message]
  description="Hero Name"
  message= _ "Hero's final words"
  [/message]
  [endlevel]
  result=defeat
  [/endlevel]
[/event]
[event]
name=die
  [filter]
  description="Sidekick Name"
  [/filter]
  [message]
  description="Sidekick Name"
  message= _ "Sidekick's final words"
  [/message]
  [endlevel]
  result=defeat
  [/endlevel]
[/event]
[event]
name=die
  [filter]
  description="Enemy Name"
  [/filter]
  [message]
  description="Enemy Name"
  message= _ "Enemy's final words"
  [/message]
  [endlevel]
  result=victory
  [/endlevel]
[/event]
#enddef

Usage: Copy-and-paste this into the deaths.cfg file, and alter the names and final words for each character. If the unit's dying means game over for the player, include the section of text that says

[endlevel]
result=defeat
[/endlevel]

otherwise delete it.

If the unit's dying means an immediate victory in that scenario, include the section of text that says

[endlevel]
result=victory
[/endlevel]

If you have additional units who need to speak some final words, just make extra copies of the appropriate section and customise it to suit.


story.cfg

The story.cfg file allows you to collect together all the background plot for the campaign in one place. You can include this data inside the individual scenario files, but it's better coding practice to separate things out a bit. You can then manage the entire campaign plot in one place rather than having to scan through a dozen scenario files.


#define AEC_STORY01
[story]
  [part]
  music=gameplay01.ogg
  story= _ "The background story, part one."
  background=Background_Image01.png
  [/part]
  [part]
  music=gameplay02.ogg
  story= _ "The background story, part two."
  background=Background_Image02.png
  [/part]
[/story]
#enddef
#define AEC_STORY02
[story]
  [part]
  music=gameplay01.ogg
  story= _ "The background story, part three."
  background=Background_Image03.png
  [/part]
[/story]
#enddef


#define AEC_STORY03
#Placeholder macro; no extra plot exposition for this scenario.
#enddef


#define AEC_STORY04
[story]
  [part]
  music=gameplay03.ogg
  story= _ "An unexpected twist halfway through the campaign."
  background=Background_Image04.png
  [/part]
[/story]
#enddef

Usage: Copy-and-paste this into the story.cfg file, and alter the music, text and background image for each stage of the campaign. Each block of story text should be about 2-4 lines. You can have more background text at the very start of the campaign, but don't insert two or three paragraphs of prose between every scenario. Very few people will read it. When you need extra plot sections, just make extra copies of the appropriate parts and customise them.

Music is optional. If you don't want any music delete the 'music=…' lines.

On Linux the standard Wesnoth music available is in /usr/local/share/wesnoth/music/ In Windows, the music will be in [need correct information; may vary from version to version] On the Mac, the music will be in [need correct information; may vary from version to version]

Background images are optional but encouraged. If no image filename is supplied, the text appears against a black screen, which is rather dull. If you don't have any suitable images delete the 'background=…' lines.


route.cfg

The route.cfg file allows you to track your heroes' progress across a campaign map. You don't have to have a campaign map at all, of course, but they are commonly used.

#define AEC_ROUTE01
[story]
  [part]
  background=Campaign_Map.png
  show_title=yes
  {DOT 100 150}
  {DOT 150 150}
  {DOT 200 150}
  {DOT 250 150}
  {DOT 250 200}
  {CROSS 250 250}
  [/part]
[/story]
#enddef


#define AEC_ROUTE02
[story]
  [part]
  background=Campaign_Map.png
  show_title=yes
  {DOT 280 290}
  {DOT 310 330}
  {DOT 340 370}
  {DOT 370 410}
  {DOT 400 450}
  {DOT 430 490}
  {DOT 460 530}
  {CROSS 490 570}
  [/part]
[/story]
#enddef

Usage: Copy-and-paste this into the route.cfg file, and alter the background, DOT and CROSS commands to suit the map. Make extra copies of each section from #define to #enddef and renumber them for scenarios 03 and onwards. 'show_title=yes' is optional, and shows the campaign title. You can delete this line if you don't want the title to appear.

Tip: The distance between dots is measured in pixels. 30-60 pixels between dots is about right. The bigger the gap, the faster the heroes are assumed to be moving, so if they're moving at constant speed try to keep the distance between dots more or less constant. That's a bit more complicated if they're moving at an angle other than exactly horizontal or exactly vertical. As a rule of thumb, 50 dots horizontally comes to 35 + 35 at 45° when moving diagonally.


Scenarios

Note: This template refers to macros defined in the example macro files given above, utils.cfg, deaths.cfg, story.cfg and route.cfg. That's why you have to set up those files first. To use this template, make copies of it as 01_First_Scenario.cfg, 02_Second_Scenario.cfg and so on for each scenario you have planned, and store them in the /Example_Campaign/scenarios/ folder.

[scenario]
name= _ "The First Scenario"
id=01_First_Scenario
next_scenario=02_Second_Scenario
{MAP 01_First_Scenario.map}
{SCENARIO_MUSIC "gameplay01.ogg"}
{TURNS 20 18 15}
{MORNING}
{AFTERNOON}
{DUSK}
{FIRST_WATCH}
{SECOND_WATCH}
{DAWN}
victory_when_enemies_defeated=yes
disallow_recall=no
{AEC_STORY_01}
{AEC_ROUTE_01}
  [side]
  side=1
  controller=human
  fog=no
  shroud=no
  team_name=good
  description=Hero Name
  type=Spearman
  canrecruit=yes
  recruit=Archer,Bowman,Chocobone
  [/side]
  [side]
  side=2
  team_name=evil
  description=Enemy Name
  type=Horseman
  canrecruit=yes
  recruit=Draug,Elvish Archer,Fencer
  {GOLD 150 200 250}
  [/side]
  {AEC_DEATHS}
  [event]
  name=start
    [recall]
    description=
    [/recall]
    [message]
    description=
    message= _ ""
    [/message]
    [objectives]
    side=1
      [objective]
      description= _ "Victory Condition"
      condition=win
      [/objective]
      [objective]
      description= _ "Death of Hero"
      condition=lose
      [/objective]
      [objective]
      description= _ "Death of Sidekick"
      condition=lose
      [/objective]
      [objective]
      description= _ "Turns run out"
      condition=lose
      [/objective]
    [/objectives]
  [/event]
  [event]
  name=
    [filter]
    [/filter]
    [message]
    description=
    message= _ ""
    [/message]
  [/event]
[/scenario]



Units

[unit]
id=
name= _ ""
image=
race=
hitpoints=
movement_type=
movement=
alignment=
ability=null
experience=500
advanceto=null
level=
cost=
usage=## AI usage: values are 'scout', 'fighter', 'archer', 'healer' and 'mixed fighter'
unit_description= _ ""
get_hit_sound=groan.wav
  [attack]
  name= _ ""
  type=
  damage=
  number=
  special=null
    [frame]
    begin=-100
    end=100
    image=
    [/frame]
    [sound]
    time=-200
    sound=
    [/sound]
  [/attack]
  [attack]
  name= _ ""
  type=
  range=long
  damage=
  number=
  special=null
    [sound]
    time=-200
    sound=
    [/sound]
    [missile_frame]
    begin=-100
    end=0
    image=
    image_diagonal=
    [/missile_frame]
  [/attack]
[/unit]

See Also