§ Posté le 16/11/2014 à 23h 25m 06
Je reviens présentement de Capitole du Libre, auquel j'avais été convié par un camarade pour animer un atelier sur la création de campagne pour le jeu vidéo Battle for Wesnoth (j'en ai profité également pour animer conférence et atelier sur l'auto-hébergement, et pour enfin assister à une conférence de Benjamin Bayart en étant présent dans la salle ).
La durée de l'atelier était cependant légèrement trop courte (surtout compte tenu du fait que je suis sorti un peu en retard de mon atelier précédent), et nous n'avons pas eu tout à fait assez de temps pour voir en détail les choses les plus intéressantes. Il m'est donc venu l'idée, en montant dans le train, de rédiger un tutoriel pour ce blog sur ce sujet, qui reprendrait les bases. J'ai quatre heures devant moi, ça devrait amplement faire l'affaire, si j'arrête de raconter ma vie.
Commençons donc par le début. Les contenus personnels sont à placer dans un répertoire spécifique dédié à ça. Sous les systèmes GNU/Linux(1), ce répertoire est situé à l'adresse :
~/.local/share/wesnoth/XXX/data/add-ons
En remplaçant, bien évidemment, « XXX » par le numéro de version de votre jeu, la version stable étant la « 1.10 » à l'instant où j'écris ces lignes.
Ce répertoire existe normalement à partir du moment où vous avez lancé le jeu. Si c'est la première campagne que vous créez, il sera vide, à moins que vous n'ayiez déjà utilisé le bouton « extension » pour aller récupérer d'autres contenus utilisateurs. Nous pouvons donc y créer un nouveau répertoire, qui sera celui de votre campagne : à vous de lui trouver le nom qui convient(2).
À l'intérieur de ce répertoire, nous commencerons par créer un fichier servant à décrire le contenu de notre extension. Ce fichier doit s'appeler « _main.cfg » (en n'oubliant pas le « _ » en premier caractère). Pour une campagne, voici une version minimale de ce fichier :
#textdomain wesnoth-XXX
[textdomain]
name="wesnoth-XXX"
path="data/add-ons/XXX/translations"
[/textdomain]
[campaign]
name=_"Nom de la campagne"
define=CAMPAIGN_XXX
description=_"Description de la campagne"
id=XXX
abbrev=_"XXX"
first_scenario=mon_premier_scenario
[/campaign]
#ifdef CAMPAIGN_XXX
{~add-ons/XXX/scenarios}
[binary_path]
path=data/add-ons/XXX/
[/binary_path]
#endif
Chaque occurrence de XXX devra être remplacée par une valeur bien précise. Avant de détailler ça, notons que la syntaxe du fichier est relativement simple, proche de celle des fichiers .ini/.desktop, mais avec des fermetures de balises et des macros. Toutes les entrées dont la valeur commence par un « _ » sont celles qui seront affichées par l'interface du jeu (ce caractère initial sert à les faire prendre en charge par l'outil de traduction, si je ne m'abuse), et sont donc à régler comme vous l'entendez.
La première section du fichier, de la ligne 2 à la ligne 5, sert à permettre au jeu d'utiliser des versions traduites de ces textes. Nous ne parlerons pas davantage de la façon dont les traductions elles-mêmes sont mises en place(3), mais indiquer ces quelques lignes permettra de ne rien avoir à retoucher à l'extension elle-même au moment où vous vous en occuperez.
Sur la ligne « path », il faut indiquer l'adresse du répertoire que vous venez de créer ; sur la ligne « name », il faut indiquer un identifiant pour votre extension, qui la distinguera de celle des autres extensions utilisateur. Utiliser le nom du répertoire peut y être une bonne idée. Enfin, la toute première ligne de ce fichier, celle qui commence par le croisillon(4), sert à indiquer que nous allons utiliser ces traductions : il faut donc y indiquer la même valeur que sur cette ligne « name » (cela vaudra également pour chacun des autres fichiers que nous créerons pour cette campagne, avec la même valeur).
Passons à la section suivante, qui sert à définir les méta-informations concernant la campagne. Les noms et descriptions seront affichées dans la liste des campagnes, dans l'interface du jeu. L'abréviation, pour sa part, sera utilisée dans le nom des sauvegardes automatiques du jeu.
La ligne « id » concerne l'identifiant, c'est-à-dire que la valeur qui y est renseignée sert à identifier la campagne de manière unique (là encore, utiliser le nom du répertoire est envisageable). Mais nous nous intéresserons plus spécifiquement à la ligne « define », qui sert à définir une macro particulière, utilisée plus bas. Conventionnellement, on utilise ici des caractères majuscules.
Le reste du fichier n'est donc pas dans une section spécifique, mais dans un bloc particulier dépendant de cette macro. Cela permet de ne pas parasiter le jeu de base avec les informations que nous créerons spécifiquement pour cette extension : l'instruction « #ifdef
» signifie que ce qui est situé entre ces deux balises ne sera lue que si la macro est définie, et donc que la campagne est lancée.
On y trouve une première instruction indiquant que nous allons utiliser un répertoire « scénarios », que nous créerons très bientôt ; et que le répertoire dans lequel nous travaillons sera ajouté au path du jeu, c'est-à-dire que nous pourrons préciser des chemins relatifs à partir de lui.
Une fois ce fichier correctement renseigné(5), votre campagne apparaîtra au bas de la liste (après redémarrage du jeu si celui-ci était déjà lancé). Il est possible de la faire apparaître plus haut en indiquant, dans la section [campaign], une ligne « rank=X », où X est le numéro qui vous intéresse (les campagnes du jeu de base ont des positions multiples de 5 : 5 pour l'Héritier du Trône, 10 pour l'histoire de deux frères, 15 pour Une incursion orc, etc., ce qui vous permet de placer les vôtres entre deux ou avant si besoin).
La campagne n'est cependant pour l'instant affichée qu'avec du texte, ce qui est un peu triste. Pour obtenir un affichage plus décoré, comme pour les autres campagnes, vous pouvez également ajouter, dans la section [campaign], quelque chose comme ceci :
image=data/core/images/portraits/humans/transparent/mage.png
icon=data/core/images/units/human-magi/mage.png~RC(magenta>red)
L'« image » représente la grande image affichée sous la description (ici, le portrait d'un mage dans le jeu de base) ; l'« icône » la petite image affichée dans la liste, à côté du nom de la campagne (ici, l'image du mage de base).
La commande particulière, à la fin de l'icône, « ~RC(magenta>red)
» sert à effectuer un remplacement de couleur automatique : les images des unités du jeu de base comportent une certaine proportion de nuances de magenta, que le jeu remplacera automatiquement, en cour de parties, par des nuances de rouge, bleu, vert, etc., selon l'équipe à laquelle appartient l'unité. Puisque nous ne sommes ici pas dans le jeu, et que notre image n'est liée à aucune équipe, nous pouvons donc préciser ainsi quelle couleur utiliser.
À ce stade, vous pouvez donc lancer votre campagne… ce qui vous vaudra une belle fenêtre d'erreur indiquant que le scénario « mon_premier_scenario » n'a pas pu être trouvé. Normal, puisque nous ne l'avons pas encore défini ; nous allons donc le faire maintenant. Mais constatons d'abord au passage que la campagne disparaît alors de la liste : puisqu'elle n'était pas fonctionnelle, le jeu l'a automatiquement désactivée. Il faudra donc le fermer et le relancer pour la voir revenir ; ce que nous devrons de toute façon faire à chaque modification des fichiers de notre campagne (c'est le point un peu énervant là-dedans).
La première étape, pour créer votre scénario, sera de lui fabriquer une carte. Pour cela, le jeu dispose d'un éditeur assez bien conçu, dont je ne détaillerai pas l'utilisation. Dessinez-donc la carte qui vous intéresse (en veillant à ce que le terrain soit adapté en fonction des unités alliées ou ennemies qui devront s'y battre), n'oubliez pas de placer les positions de départ des deux (ou trois, ou plus, à votre guise) camps concernés (à l'aide du drapeau), puis enregistrez-la (conventionnellement, on utilise l'extension « .map » à la fin du nom du fichier).
Les cartes créées par l'éditeur sont situées dans un répertoire spécifique ; sous les systèmes GNU/Linux, il s'agit de celui-ci :
~/.local/share/wesnoth/XXX/editor/maps
(Avec, cette fois encore, le numéro de version correspondant)
La première chose que nous allons faire, pour pouvoir utiliser cette carte dans notre campagne, est de créer un répertoire « maps », dans le répertoire de la campagne, dans lequel nous allons copier ce fichier. Nous créerons aussi ce répertoire « scenarios » dont il a déjà été question plus haut, dans lequel nous viendrons placer un fichier « mon_premier_scenario.cfg ».
Voici un exemple de fichier de scénario simple :
#textdomain wesnoth-XXX
[scenario]
id=mon_premier_scenario
next_scenario=mon_second_scenario
name=_"Mon premier scénario"
map_data="{~add-ons/XXX/maps/ma_super_carte.map}"
turns=18
{DAWN}
{MORNING}
{AFTERNOON}
{DUSK}
{FIRST_WATCH}
{SECOND_WATCH}
[side]
side=1
team_name=1
user_team_name=_"Équipe 1"
recruit=Peasant
id=leader
canrecruit=yes
type=Sergeant
[/side]
[side]
side=2
team_name=2
user_team_name="Équipe 2"
recruit=Goblin Spearman
type=Orcish Leader
canrecruit=yes
[/side]
[/scenario]
Tout le contenu du fichier est donc à placer dans une section [scenario], laquelle contiendra un certain nombre de sous-sections.
Le premier champ sert à indiquer l'identifiant du scénario(6) ; c'est celui qu'il faut renseigner dans le champ « first_scenario » du fichier précédent. Le second indique l'identifiant du scénario suivant : vous créerez ensuite le fichier correspondant. Notez que, si vous n'indiquez pas de scénario suivant, la campagne sera considérée comme terminée (et remportée) si le joueur/la joueuse termine le scénario en cours.
Le champ « map_data » sert à indiquer le contenu de la carte. Directement son contenu, et non pas le fichier qui la contient : c'est la raison pour laquelle le nom du fichier est précisé entre accolades, ce qui sert à charger son contenu. Le « turns » qui suit indique le nombre de tours que le joueur/la joueuse aura pour remporter la partie – mais il faudra définir un événement particulier pour gérer cela correctement, nous y reviendrons.
La séquence suivante sert à indiquer le déroulement de la journée au cours de la partie : le premier tour de ce scénario aura lieu à l'aube ; puis la journée habituelle se déroulera. Vous pouvez changer ce cycle (mettez par exemple {DUSK}
en premier pour débuter au crépuscule), ou le remplacer par {UNDERGROUND}
si votre scénario se déroule dans une caverne, où le cycle jour/nuit n'est pas visible.
La suite sert à définir les différentes équipes. Définir une équipe revient en grande partie à définir quel est son leader. Dans l'exemple, nous avons une équipe 1 (dirigée par le joueur/la joueuse) dirigée par un Sergent (unité de l'armée loyaliste) et pouvant recruter des paysans, quand l'équipe 2 (dirigée par l'ordinateur) est jouée par un meneur orc et peut recruter des lanciers gobelins (séparer les différents types d'unités recrutables par des virgules s'il y en a plusieurs).
Le champ « side » sert à définir le numéro de l'équipe. Le champ « team_name » (qui ne sera pas affiché, contrairement à « user_team_name ») sert à indiquer au moteur de jeu quelles sont les alliances en cours : deux équipes ayant la même valeur de « team_name » (ce qui n'empêche pas que leur « user_team_name » soient différents) seront alliées ; elles seront ennemies dans le cas contraire. Bien sûr, ajoutez d'autres sections side s'il y a d'autres équipes à placer sur la carte.
Vous pouvez, ici, effectuer un certain nombre de paramétrages différents. Par exemple, indiquer « gold=X » fera que l'équipe démarrera le scénario avec X pièces d'or en réserve (sauf cas d'or conservé depuis le scénario précédent pour l'équipe joueuse). Placer « color=X » vous permettra de changer la couleur de l'équipe, si les couleurs par défaut ne vous conviennent pas(7). Et si vous voulez changer qui du joueur/de la joueuse ou de l'ordinateur contrôle l'équipe, utilisez « controller=human » ou « controller=ai ».
Si vous désirez que l'une des équipes ait des unités de base, il suffit de le préciser à l'intérieur de la balise side correspondante :
[unit]
type=Mage
random_gender=yes
x=12
y=15
[/unit]
Vous pouvez également grouper les deux coordonnées sur une même ligne en indiquant « x,y=12,15
». Si vous ne précisez aucune coordonnée, l'unité ne sera pas ajoutée sur la carte, mais pourra être rappelée comme s'il s'agissait d'un vétéran.
Nous allons maintenant parler des événements, utilisés pour faire arriver des choses particulières au cours du scénario. Il en existe un certain nombre, permettant de gérer les déplacements d'unités, les captures de villages, les débuts de tours, les morts, etc. Pour le moment, nous nous intéresserons à deux événements particuliers : prestart
(juste avant le début de la partie) et start
(au début de celle-ci).
L'événement « prestart
» est utilisé habituellement pour définir quels sont les objectifs (du moins, ce qui s'affichera dans la fenêtre d'objectifs en début de partie) et pour affecter à chaque équipe ses villages de départ, comme ceci :
[event]
name=prestart
[objectives]
[objective]
description=_"Vaincre le chef ennemi"
condition=win
[/objective]
[objective]
description=_"Mort du leader"
condition=lose
[/objective]
[objective]
description=_"Fin des tours atteinte"
condition=win
[/objective]
[/objectives]
{STARTING_VILLAGE 1 12 14}
{STARTING_VILLAGE 2 1 2}
[/event]
À placer, conventionnellement, après la définition des équipes, donc après la fin de la dernière section [side]. La macro « STARTING_VILLAGE » reçoit comme premier paramètre le numéro de l'équipe concernée, et les deux suivants sont les coordonnées (x et y) du village en question (n'hésitez pas à afficher la carte pour vérifier ça : les coordonnées sont affichées dans le jeu quand vous survolez la case correspondante).
Les objectifs ne sont donnés qu'à titre indicatif : en dehors d'une victoire automatique (à moins qu'elle ait été désactivée) lorsque tous les chefs ennemis sont morts, rien ne sera effectué par le jeu tant que vous ne coderez pas les événements correspondants.
L'événement « start
» a lieu lorsque la carte est affichée (le précédent se déroulant juste avant, quand l'écran est encore noir), et est habituellement utilisé pour l'ambiance, en faisant parler les personnages, comme ceci :
[event]
name=start
[message]
speaker=leader
message=_"Bon, eh bien, c'est le début du scénario."
[/message]
[message]
speaker=narrator
image=wesnoth-icon.png
message=_"À vous de jouer !"
[/message]
[/event]
Le champ « speaker » du message sert à indiquer quelle unité doit parler. Il faut pour cela que vous ayez donné un identifiant à cette unité, que vous réutiliserez ici. Il existe quelques identifiants particuliers : « narrator
» indique que le message est un texte d'ambiance, qui n'est associé à aucune unité en particulier ; « unit
» désigne l'unité ayant déclenché l'événement, le cas échéant (déplacement sur une case donnée, mort…). Si l'unité que vous désignez ne semble pas exister, ce dialogue sera simplement omis par le jeu.
Notez que, par défaut, le jeu affiche le portrait associé à l'unité lorsqu'il la fait parler (ou bien affiche son image de base si l'unité n'a pas de portrait défini). Vous pouvez changer cette image en utilisant le champ approprié, comme dans l'exemple ci-dessus.
Nous pouvons également faire apparaître des textes de narration avant le début de la partie, pour un meilleur effet. Cela se fait avec une section particulière :
[story]
[part]
background=portraits/humans/transparent/peasant.png
story=_"Il était une fois un groupe de paysans, en guerre contre les orcs."
[/part]
[part]
background=portraits/orcs/transparent/warlord.png
story=_"À vous de battre ces orcs."
[/part]
[/story]
Une fois que vous aurez créé tout ceci, votre campagne commencera déjà à ressembler à quelque chose. Il y a, bien sûr, énormément d'autres possibilités (notamment, créer des unités… si vous disposez des compétences de graphiste nécessaires pour leur donner une apparence regardable), mais cet article ne se voulait qu'une introduction(8).
Pour aller plus loin, un bon moyen est à mon avis de regarder les fichiers de scénarios du jeu de base, qui donne une bonne idée des événements possibles (et sont généralement plutôt pas mal commentés). Vous pouvez également consulter la documentation en ligne, en anglais, mais globalement assez facile à comprendre… ou bien attendre un de mes prochains ateliers sur ce thème
D'ici-là, je compte bien continuer à travailler sur mes propres projets de campagnes, et toute aide sera la bienvenue.