Créer sa campagne pour Battle for Wesnoth

Message 1, par Elzen

§ 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=Seargent
  [/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.


Découverte Wesnoth

Message 2, par Eric H.

§ Posté le 15/11/2015 à 23h 49m 53

C'est en zieutant le programme du Capitole du Libre à Toulouse que j'ai découvert votre intervention programmée (à laquelle je pense assister) que j'ai découvert Wesnoth et c'est super cool ! Merci pour la découverte ! Du coup, Je suis en pleine campagne des Gardes pour détruire les affreux.

Message 3, par Elzen

§ Posté le 15/11/2015 à 23h 52m 21

De rien 😊


Je suis en pleins préparatifs ; mais ça devrait être bon pour cet atelier.


On se verra là-bas, alors 😉

Message 4, par Tondeuse_volante

§ Posté le 06/07/2017 à 16h 01m 23

Salut je suis un grand fan de wesnoth, je me suis intéressé a la création de campage et scénario j'ai donc suivie t'es indication pour mons 1er scenario, MAIS! tu n'indique pas comment faire, par exemple : arrivées des énemis au bout d'un certain tour ou encore mettre la carte indiquant l'emplacement et le déplacement avant chaque scénario. Et également, pour finir comment lancées un dialogue pendant le jeu ou/et à la fin .

si tu pouvait donc m'aider je dis pas non.



voila ^^ au passage ne critique pas mon orthographe stp, je n'ais jamais étais bon 😓

Message 5, par Elzen

§ Posté le 06/07/2017 à 16h 14m 59

Pour la carte dans l'introduction du scénario, ça passe par les balises d'intro. Je n'ai jamais essayé par moi-même (pas encore réussi à faire une carte correcte, donc bon) ; mais ça n'avait pas l'air spécialement compliqué, de mémoire.


Pour lancer des dialogues, faire arriver les ennemis, etc., ça passe par les balises d'événements. Il faut choisir le déclencheur (le début d'un tour donné, par exemple), et ensuite, tu peux définir l'événement comme tu veux. C'est [unit] pour placer des unités, de la même façon que pour la définition de l'équipe. Pour les dialogues, c'est [message], j'en ai parlé plus haut.


Note, quand tu veux faire un truc en particulier, un assez bon moyen est d'aller voir dans les campagnes qui l'utilisent comment c'est codé, c'est comme ça que j'ai commencé 😊



Sinon, je pense re-proposer un atelier Battle for Wesnoth au prochain Capitole du Libre, mais c'est sans garantie (l'an dernier, il y avait eu pas mal de propositions et les orgas avaient préféré favoriser autre chose).

Envoyer une réponse