Fiction-interactive.fr

Tutoriels Inform 7

Liste des articles :

Écrire une fiction interactive avec Inform 7, partie 1 : Premiers pas – Nathanaël Marion

Écrire une fiction interactive avec Inform 7, partie 2 : Créer un monde – Nathanaël Marion

Écrire une fiction interactive avec Inform 7, partie 3 : Un jeu complet – Nathanaël Marion

Écrire une fiction interactive avec Inform 7, partie 4 : Diffusons notre jeu – Nathanaël Marion

Les supports, les contenants et les clés avec Inform 7 – Nathanaël Marion

Éviter le code dupliqué avec Inform 7 – Nathanaël Marion

Le texte dans Inform 7 – Nathanaël Marion

Trizbort, plus qu’un outil de cartographes ! - Hugo Labrande

Les bases pour créer un action avec Inform 7 – Nathanaël Marion

Créer de nouveaux types dans Inform 7 – Nathanaël Marion

Utiliser l’extension Inform 7 Basic Screen Effects – Nathanaël Marion

L’art de détruire pour reconstruire dans Inform 7 – Corax

Cet ebook compile des tutoriels parus sur le site http://www.fiction-interactive.fr, centrés sur le logiciel Inform 7.

On parle uniquement de technique ici ; nous vous conseillons de l’accompagner de notre ebook sur la conception de jeux ! Et les articles sur Vorple, un outil qui étend les possibilités d’Inform 7, sont dans leur propre ebook.

Nous publions un article sur la fiction interactive, et plus largement les narrations non-linéaires, tous les vendredis de septembre à juin.

Si ces articles vous ont plu, n’hésitez pas à :

parler de http://www.fiction-interactive.fr autour de vous ;

nous rejoindre sur notre serveur Discord ;

faire un don à notre compte paypal (paypal@fiction-interactive.fr), qui servira à couvrir nos frais d’hébergement et à proposer des prix pour notre concours annuel.

Écrire une fiction interactive avec Inform 7, partie 1 : Premiers pas

Nathanaël Marion

Dans cette série d’articles, nous apprendrons les bases du logiciel Inform 7, ce qui vous permettra de d’écrire vos premières fictions interactives à analyseur syntaxique.

Ce tutoriel est une mise à jour d’un tutoriel écrit par farvardin, sous licence CC BY-NC-SA. Un grand merci à lui !

Introduction à Inform 7

Inform 7 est un langage de programmation en langage naturel permettant de créer des mondes imaginaires, de les remplir d’objets et de personnages, et par ce biais, de créer des histoires, des aventures et des jeux, également nommés fictions interactives.

Mais à la différence des jeux modernes impliquant des effets 3D, des animations, des images et du son, les fictions interactives utilisent uniquement du texte pour communiquer avec le joueur et lui décrire son environnement, comme dans un livre ; l’unique moyen d’entrer des commandes pour le joueur est de les taper au clavier.

Cela n’enlève néanmoins pas la possibilité à l’auteur d’ajouter des images, des sons et une interface sophistiquée à sa fiction interactive, s’il le juge nécessaire.

Voici à quoi une fiction interactive peut ressembler. Il s’agit en fait d’un extrait de celle que nous allons créer pas à pas dans ce guide. Les commandes que le joueur a entrées sont écrite après le symbole « > ».

Crypte

Un silence de mort règne entre ces murs oppressants, et le murmure enjoué du vent n'arrive pas jusqu'ici.

Vous pouvez voir une porte de pierre, une momie et un cimeterre.

>prendre le cimeterre

Ce sabre légendaire, le Shamshir, vous avait toujours fasciné, et maintenant vous pouvez enfin mettre la main dessus.

Au moment où vous prenez l'arme, la porte donnant vers l'extérieur se referme !

L'air commence à manquer…

>ouvrir la porte

La porte est trop lourde pour vous.

L'air commence à manquer…

Inform 7 est l’un des systèmes les plus efficaces et modernes pour créer ce type de jeux. Il est composé :

d’un environnement développement intégré (EDI) pour écrire le code, interpréter le jeu et avoir accès à la documentation ainsi qu’à divers modules (par exemple, la liste des relations entre les objets, la liste des verbes, l’arborescence des choix possibles…) ;

d’un compilateur permettant de créer le fichier d’histoire dans un langage machine spécial, qui sera par la suite interprété ;

de bibliothèques permettant d’établir les règles de base qui régissent le monde.

Ce guide ne prétend pas se substituer au manuel fourni avec le logiciel, très complet même si uniquement en anglais pour le moment. C’est en revanche le premier du genre qui aborde, en français, une initiation à Inform 7 et qui donne les bases nécessaires pour concevoir un univers textuel. Le lecteur pourra ensuite se référer au manuel officiel, et à ses nombreux exemples commentés, pour en savoir plus.

À la fin de votre lecture, vous serez en mesure de créer vous-même une petite aventure textuelle. Pour avoir une idée de résultat final, vous pouvez jouer à Sable en ligne.

À titre d’exemple des possibilités évoluées de ce langage, notons qu’il est possible de modéliser aisément les règles de la physique, de tester des équations et de les résoudre (nous n’aborderons pas cela ici).

Un petit exemple

La principale originalité d’Inform 7 est d’être un langage naturel déclaratif au lieu d’un langage de bas niveau procédural, impératif, comme le C par exemple (ou comme Inform 6, le prédécesseur d’Inform 7).

Voici un exemple de code écrit en Inform 7 :

Les murs sont des choses décoratives dans la Crypte.

La description est "Les murs sont recouverts de carreaux en terre cuite qui représentent des dieux et des animaux fabuleux. Une partie est restée en pierre brute.".

Instead of inserting le cimeterre into les murs:

 si la portedepierre est verrouillée:

 dire "Vous glissez votre cimeterre dans l'interstice entre les deux pierres, et la porte est de nouveau ouverte.";

 maintenant la portedepierre est déverrouillée;

 maintenant la portedepierre est ouverte;

 sinon:

 dire "Il ne se passe rien de spécial.".

Même une personne n’ayant jamais fait de programmation pourrait deviner ce que fait l’extrait ci-dessus, et c’est là l’un des attraits d’Inform 7. Malheureusement, on peut aussi remarquer que certains passages n’ont pas pu être traduits dans notre langue.

En effet, jusqu’à récemment, il n’était possible d’écrire sa source qu’en anglais. Ce n’est que depuis la version 6L02 qu’il est possible d’obtenir une source presque entièrement en français ; les versions futures d’Inform 7 devraient permettre de l’écrire entièrement dans la langue de Molière. Gardez à l’esprit que la syntaxe en français n’est pas définitive, et qu’elle est encore susceptible de changer.

Mais trêve de bavardage, et entrons dans le vif du sujet.

Il est recommandé de taper les extraits de code dans Inform 7 avant de les lire et d’essayer de les comprendre ; en effet, Inform 7 colorera la source et il sera plus facile de vous y retrouver.

Installation d’Inform 7

En premier lieu, téléchargeons Inform 7 sur le site officiel :

http://inform7.com/

et plus précisément à la page :

http://inform7.com/downloads/

Si vous êtes sur macOS, il faut télécharger la version 7.9.3 (build 6M62) intitulé « interim 2019 release ».

Si vous êtes sur Windows ou Linux, il faut télécharger la version 7.9.2 (build 6L38) plus bas sur la page.

Attention, la traduction française d’Inform 7 n’est compatible qu’avec une version spécifique d’Inform. Assurez-vous d’avoir téléchargé la bonne version selon votre système d’exploitation.

Les captures d’écran dans la suite de ce tutoriel ont été réalisées sous macOS, mais l’interface est à peu de choses près la même quel que soit le système utilisé.

Petite parenthèse pour les utilisateurs de Windows

Si vous êtes sur macOS ou Linux, sautez cette section. Sinon, il est fortement recommendé de lire ce qui suit !

L’antivirus de Windows ralentit fortement le fonctionnement d’Inform 7. Pour empêcher cela, il faut lui dire de ne pas vérifier ce que fait Inform 7.

Oui, cela crée une faille de sécurité sur votre ordinateur, mais si vous téléchargez bien Inform depuis le lien donné plus haut, il ne devrait pas y avoir de risques. Si cela peut vous rassurer, de nombreux sujets sur le forum anglophone intfiction.org mentionnent ce problème et la solution que je vais indiquer (là, là, là, là, là et là, par exemple). Ce n’est pas obligatoire, à vous de voir si vous en aurez besoin. Faites-le en tout connaissance de cause !

Alors commençons.

Ouvrez l’application Sécurité Windows (touche Windows puis taper « sécurité windows »).

Dans le menu latéral, sélectionnez « Protection contre les virus et les menaces ».

Sur le nouvel écran, dans la section « Paramètres de protection contre les virus et menaces », cliquez sur « Gérez les paramètres ».

Sur l’écran qui s’affiche, descendez jusqu’à « Exclusions » et cliquez sur « Ajouter ou supprimer des exclusions ».

Cliquez sur le bouton « Ajoutez une exclusion » et sélectionnez « Processus ».

Dans le champ qui apparaît, entrez le chemin du compilateur Inform, « ni.exe », et validez. Si vous avez installé Inform dans l’emplacement par défaut, cela sera :

C:\Program Files (x86)\Inform 7\Compilers\ni.exe

Encore une fois, n’oubliez pas ce que cela implique ! Dans le cas (très improbable, certes) où il vous arriverait quelque chose, vous serez le seul responsable.

Maintenant que cela est derrière nous, continuons avec notre introduction à Inform !

Faisons connaissance avec Inform 7

Une fois l’installation terminée, démarrez le logiciel et cliquez sur le bouton « Start a new project… » (Windows, Linux) ou « Project » dans la colonne de droite (macOS).

Créons un dossier qui contiendra le projet. Par exemple, un dossier nommé « Sable » dans un dossier « Projets Inform » dans vos documents. (Évitez des accents dans le chemin, ils peuvent parfois causer des problèmes.)

Appelons notre nouveau projet « Sable ». Choisissez également votre nom de plume.

La fenêtre principale s’ouvre alors. L’interface est séparée en deux zones, comme dans un livre ouvert.

La page de gauche est généralement utilisée pour taper le code et la page de droite pour visualiser le jeu ou lire la documentation, mais il est possible d’obtenir en vis-à-vis n’importe quelle combinaison d’onglets, par exemple deux fenêtres de source pour comparer du code. Il suffit de sélectionner les onglets se trouvant au-dessus des fenêtres (Windows) ou sur le côté (macOS, Linux).

Ces onglets sont :

Source (le code source du jeu) ;

Results (les messages d’erreurs ou d’autres événements s’étant déroulés lors de la compilation) ;

Index (la liste des lieux, des objets, des verbes… de votre jeu) ;

Skein (le cheminement des parties que vous avez réalisées, sous forme d’arborescence) ;

Transcript (la transcription des parties que vous avez réalisées) ;

Story (où vous jouerez et testerez votre jeu) ;

Documentation (les deux manuels — an anglais seulement — d’Inform 7) ;

Extensions (où vous pourrez télécharger de nouvelles extensions et consulter leur documentation) ;

Settings (les options).

Pour le moment, nous nous concentrerons sur les onglets « Source » et « Story », qui sont les plus importants. Lorsque vous aurez un peu plus d’aisance avec Inform (nous utiliserons à partir de maintenant les termes « Inform » et « Inform 7 » indifféremment), vous pourrez découvrir les autres modules (certains sont très optionnels, comme le skein et le transcript).

Petite manipulation à faire avant de continuer si vous êtes sur macOS : allez dans l’onglet « Settings » du projet et sélectionnez la version 7.9.2 (6L38) comme version d’Inform. Ce sera important pour faire fonctionner le français.

Notre premier code

Les projets nouvellement créés contiennent le code source minimal requis. Adaptez-le afin d’obtenir le code suivant. Ce n’est pas grave si vous ne le comprenez pas encore, tout sera expliqué par la suite.

"Sable" by Fiction-interactive.fr

Oasis is a room. "Une belle oasis ensoleillée…".

The dromadaire is an animal in Oasis.

When play begins, say "Bonjour, voyageur.".

Cliquez sur le bouton « Go! » en haut à gauche de la fenêtre pour compiler le jeu.

Sur Windows, c’est cette étape qui prend vraiment beaucoup de temps si vous n’avez pas désactivé l’antivirus comme indiqué précédemment. Vous pouvez tester cette étape avec et sans antivirus pour juger si vous avez vraiment besoin de le désactiver.

Vous verrez le résultat s’afficher sur la page de droite :

Bonjour, voyageur.

Sable

An Interactive Fiction by IFiction-FR

Release 1 / Serial number 150903 / Inform 7 build 6L38 (I6/v6.33 lib 6/12N) SD

Oasis

Une belle oasis ensoleillée…

You can see a dromadaire here.

Argh, nous avons du français et de l’anglais mélangé et ce n’est pas ce que nous souhaitons !

En effet, Inform 7 étant à la base tout en anglais, il n’a pas encore moyen de savoir que nous voulons que le jeu soit en français pour toutes nos réponses, ce qui est normal. Aussi, à l’exception des noms et autres chaînes de caractères que nous avons écrits nous-mêmes en français, tout sera traité en anglais.

Mais même si ce n’est pas encore parfait, nous pouvons commencer dès maintenant à interagir avec cette histoire en franglais, en tapant des instructions (instructions pour le moment en anglais) après le signe « > » (appelé « invite de commande », ou « prompt » en anglais) ; le résultat s’affichera sur la ligne suivante.

Par exemple :

>examine the dromadaire

You see nothing special about the dromadaire.

Installation de l’extension française d’Inform 7

Inform 7 utilise un système d’extensions qui permet d’ajouter des fonctionnalités. Ainsi, pour franciser Inform 7, il suffit de télécharger l’extension « French Language.i7x », qui se trouve à  l’adresse ci-dessous. Il vous faudra cliquer sur « French Language.i7x », puis sur le bouton représentant 3 points en haut à droite, puis sur « Open raw », et enfin sauvegarder l’onglet qui s’ouvre sur votre ordinateur.

https://bitbucket.org/informfr/i7-french-language/src

Téléchargeons également l’extension « Experimental French Features.i7x » (nous verrons par la suite pourquoi).

Ensuite, allons dans les fichiers de l’application Inform et ouvrons le fichier « about.txt » situé ici :

Windows : C:\Program Files\Inform 7\Internal\Languages\French\about.txt
(Vous devez avoir les droits administrateur pour pouvoir modifier le fichier. Il peut s’avérer nécessaire de copier ce fichier ailleurs, de modifier cette copie comme indiquée ci-dessous et de le remettre à son emplacement original en écrasant l’ancienne version.)

macOS : clic droit sur l’icône d’Inform puis « Afficher le contenu du paquet » ; de là, le fichier se trouve dans Contents/Resources/retrospective/6L38/Languages/French/about.txt

Linux : /usr/share/gnome-inform7/Extensions/Reserved/Languages/French/about.txt
ou /usr/share/gnome-inform7/Languages/French/about.txt

Modifions la ligne 5 pour remplacer « Eric Forgeot » par « Nathanael Marion » (cette étape ne devrait plus être nécessaire dans les prochaines versions).

Une fois que cela est fait, nous sommes prêts à installer les extensions. Retournons dans Inform et allons dans le menu File > Install extension… et choisissons le fichier « French Language.i7x » que nous venons de télécharger. Répétons l’opération pour « Experimental French Features.i7x ».

L’extension est fonctionnelle, mais des bugs sont fréquemment corrigés. Assurez-vous régulièrement que vous possédez bien la dernière version à l’adresse ci-dessus !

Maintenant, ajoutons (in French) à la fin de la première ligne, ce qui permettra d’utiliser l’extension « French Language » :

"Sable" by Fiction-interactive.fr (in French)

Nous nous retrouvons donc avec ce code :

"Sable" by Fiction-interactive.fr (in French)

Oasis is a room. "Une belle oasis ensoleillée…".

The dromadaire is an animal in Oasis.

When play begins, say "Bonjour, voyageur.".

Mais il y a mieux, nous pouvons également écrire une partie de notre source en français ! Ajoutons la ligne Include Experimental French Features by Nathanael Marion (nécessaire pour que certaines choses puissent être écrites en français) après la ligne de titre, et modifions notre code pour qu’il ressemble à ceci :

"Sable" by Fiction-interactive.fr (in French)

Include Experimental French Features by Nathanael Marion.

[Attention, il y a une espace entre le mot « Oasis » et son déterminant !]

L' Oasis (f) est un endroit. "Une belle oasis ensoleillée…".

Le dromadaire est un animal dans l' Oasis.

When play begins, dire "Bonjour, voyageur.".

Dans la source, un texte entre crochets est un commentaire, c’est-à-dire une note que l’auteur a ajoutée, mais qui ne sera pas compilée. Par défaut, les commentaires sont affichés en vert dans Inform.

Si nous compilons de nouveau le jeu avec « Go! », nous obtenons maintenant :

Bonjour, voyageur.

Sable

Une fiction interactive par IFiction-FR

Release 1 / Serial number 150903 / Inform 7 build 6L38 (I6/v6.33 lib 6/12N) SD

Oasis

Une belle oasis ensoleillée…

Vous pouvez voir un dromadaire.

Nous avons maintenant toutes les répliques du jeu en français ! De plus, nous pouvons interagir avec l’histoire en tapant nos commandes en français.

Par exemple :

>examiner le dromadaire

Rien de particulier concernant le dromadaire.

>embrasser le dromadaire

Le dromadaire n'aimera peut-être pas ça.

>le frapper

La violence n'est pas une solution ici.

Ici, comme nous n’avons rien précisé de plus, nous obtenons les réponses types prévues dans Inform 7 (et plus précisément dans les traductions de l’extension française).

Voici quelques précisions techniques sur ce que nous venons de faire. Il n’est pas nécessaire de les connaître pour poursuivre le tutoriel.
Ajouter (in French) à la première ligne fait en sorte que l’extension « French Language » est utilisée. Cette extension permet de traduire les réponses du jeu et les commandes du joueur en français. Elle permet également de taper une partie de sa source en français. C’est grâce à elle qu’il devient possible d’écrire L’ Oasis (f) est un endroit et Le dromadaire est un animal dans l’ Oasis.
La ligne Include Experimental French Features by Nathanael Marion nous fait utiliser la seconde extension téléchargée plus tôt. Elle permet d’écrire une encore plus grande partie de son code en français (dire […] en est un exemple). Cette extension est expérimentale dans le sens que les fonctionnalités qu’elle ajoute ne sont pas encore officiellement supportées par Inform. Cependant, il ne devrait pas y avoir un grand risque de l’utiliser. À terme, quand Inform supportera ces fonctionnalités, elles seront ajoutées dans l’extension « French Language ».
Pour plus de précisions sur ce qui est traduit et par quoi, consultez la documentation de ces extensions (onglet « Extensions »).

Nous voici enfin parés pour la suite. Rendez-vous à la suite de cette article pour commencer à écrire notre fiction interactive !

Écrire une fiction interactive avec Inform 7, partie 2 : Créer un monde

Nathanaël Marion

Dans cet article, nous allons voir la syntaxe de base d’Inform, ce qui nous donnera tous les outils nécessaires pour créer un jeu, certes simple, mais complet. Expérimentez un peu avec les différents exemples donnés afin de vous assurer de bien comprendre le fonctionnement d’Inform, mais ne vous inquiétez pas si quelque chose vous échappe : le chapitre suivant vous accompagnera dans la création de votre première fiction interactive. Et si vous n’avez pas encore lu la partie 1, c’est par ici !

Les lieux et les objets

Concepts de base

Revenons un peu sur le code utilisé pour placer les objets dans le jeu, et expliquons-le un peu mieux, même si le langage naturel permet de comprendre ce qui a été fait.

Tout d’abord, il faut savoir que l’état initial du monde du jeu est créé à partir de phrases déclaratives écrites au présent. De plus, chaque objet, au sens large du terme, doit posséder un type particulier. Par exemple, l’oasis est de type « endroit », le dromadaire de type « animal ». Les types représentent l’essence même de l’objet, et déterminent ce qu’il est possible de faire avec lui.

Pour créer un objet, il faut donc écrire :

Nom de l'objet est un type de l'objet.

Commençons par les lieux où se déroulera l’histoire du jeu.

Les lieux

Suivons la règle énoncée ci-dessus pour créer un endroit :

L' Oasis (f) est un endroit.

Le déterminant est très important : c’est lui qui indique à Inform le genre et le nombre de l’objet ou de l’endroit en question. Ici, comme le déterminant est ambigu (« l’ »), il faut ajouter (f) après le nom de l’oasis pour qu’Inform sache que le mot est féminin. Il ne faut pas non plus oublier que, pour qu’Inform sache où s’arrête le déterminant et où commence le nom, il faut ajouter une espace après l’apostrophe dans des situations comme l’ Oasis.

Ajoutons maintenant une description à notre nouvel endroit. Il y a deux méthodes pour y parvenir.

Nous pouvons écrire la description de l’endroit entre guillemets, juste après l’avoir créé (si vous ne l’aviez pas encore remarqué, tous les textes qui seront affichés en jeu doivent être écrits entre guillemets dans la source) :

L' Oasis est un endroit. "Une belle oasis ensoleillée…".

Ou bien nous pouvons spécifier explicitement quelle doit être la description :

La description de l' Oasis est "Une belle oasis ensoleillée…".

La première façon est la plus répandue, mais les deux façons de faire sont valides.

Nous sommes maintenant en mesure de créer plusieurs autres endroits :

La Crypte est un endroit. Le Désert est un endroit.

Mais il y a un problème. Le joueur commencera dans le premier endroit défini dans la source (ici, l’oasis), mais comment pourra-t-il se rendre autre part ?

Il faut relier les endroits entre eux. Nous pouvons faire cela en les situant les uns par rapport aux autres. Par exemple :

La Crypte est au sud de l' Oasis.

Le Désert est au nord de l' Oasis, à l'ouest de l' Oasis et à l'est de l' Oasis.

Ces phrases créent les endroits s’ils n’ont pas été créés auparavant.

Les différentes connexions possibles sont :

nord, sud, est, ouest ;

nord-ouest, sud-ouest, nord-est, sud-est ;

au-dessus, en dessous, à l’intérieur, à l’extérieur.

Testons cela :

Oasis

Une belle oasis ensoleillée…

Vous pouvez voir un dromadaire.

>aller au sud

Crypte

>nord

Oasis

Une belle oasis ensoleillée…

Vous pouvez voir un dromadaire.

Une petite note sur la casse : les majuscules n’ont pas d’importance pour les références à un lieu ou un objet dans le code, mais le nom du lieu ou de l’objet s’affichera en jeu de la même façon que sa première occurrence dans la source. Il est conseillé d’écrire les lieux avec une majuscule et les objets tout en minuscules.

Les choses

La chose est le type le plus basique qu’un objet peut avoir. Les choses sont utilisées pour représenter un peu tout et n’importe quoi, tant que l’objet ne possède pas de caractéristique particulière.

Créer un objet est aussi facile que créer un endroit, si ce n’est qu’il faut spécifier son emplacement :

Le palmier est une chose dans l' Oasis.

Pour créer un objet de type plus spécifique, il suffit de remplacer chose par homme, femme, animal, conteneur, ou tout autre type existant (voir l’index pour en obtenir la liste) :

Le dromadaire est un animal dans l' Oasis.

Cela permettra de donner des réponses types plus adaptées à la nature de ces objets (qu’ils soient vivants ou non) ainsi que de leur attribuer des propriétés spécifiques. Ainsi, pour un être vivant, la réponse par défaut à l’action « toucher » sera « Vous savez tenir vos mains tranquilles », alors que pour un objet inanimé, cela sera « Vous ne sentez rien de particulier ». De même, le joueur sera en mesure de mettre des objets dans un conteneur, mais pas dans une simple chose.

À présent, nous avons une petite oasis où se trouvent un palmier et un dromadaire.

D’ailleurs, ce palmier est très bien, mais il y a un petit problème de conception, que vous avez peut-être remarqué si vous avez testé le jeu : essayez de prendre le palmier avec la commande « prendre le palmier » ; la réponse « Voilà qui est fait » sera affichée. En consultant votre inventaire avec « inventaire » (abrégé par « i »), vous le trouverez effectivement dans vos affaires :

>i

Vous avez :

 un palmier

Comment résoudre ce problème ? Utilisons des propriétés.

Les propriétés

Les objets possèdent des propriétés, qui déterminent leur façon de se comporter. Sans le savoir, vous en avez déjà utilisé une : la description. En effet, la description est un texte qu’un objet possède, et qui est affiché quand le joueur le regarde.

Les propriétés les plus basiques sont des adjectifs, qui représentent l’état actuel dans lequel se trouve les objets qu’ils qualifient. De nombreux adjectifs sont déjà utilisables par défaut, dont un qui va nous permettre de résoudre le problème du palmier.

Car si les objets définis comme être vivants ne pourront pas être transportables par défaut (c’est une question de savoir-vivre…), ce n’est pas le cas de notre arbre.

Ajoutons-lui une caractéristique. Pour qu’il soit impossible de le prendre, il suffit de dire qu’il est fixé sur place :

Le palmier est une chose dans l' Oasis. Il est fixé sur place.

Il est possible de simplifier :

Le palmier est une chose fixée sur place dans l' Oasis.

Essayez de le prendre à présent. Le jeu vous répondra que c’est impossible.

Maintenant que le problème du palmier est résolu, ajoutons du réalisme et créons du sable. Nous savons comment faire pour qu’il soit impossible de le prendre :

Le sable est fixé sur place dans l' Oasis.

Mais ce n’est pas bon, car maintenant le jeu nous annonce :

Vous pouvez voir un dromadaire, un palmier et un sable.

Le déterminant indéfini pose problème : « un sable » n’est pas correct, puisqu’il faut un article partitif.

Pour résoudre cela, il faut modifier la propriété indefinite article du sable (notons au passage que cette propriété n’a pas pu être traduite) :

L' indefinite article du sable est "du".

Cela affichera un résultat correct, mais il est possible de faire mieux.

En effet, le sable n’est pas un objet que nous souhaitons mettre en avant lors des descriptions (c’est évident qu’il y a du sable dans un désert et une oasis) ; il peut être intéressant de le masquer dans les descriptions, tout en permettant au joueur d’interagir avec lui (l’examiner, le toucher, etc.).

Pour cela, nous utilisons la propriété décoratif :

Le sable est une chose décorative dans l' Oasis.

Un objet défini comme décoratif sera automatiquement fixé sur place, il n’est donc pas nécessaire de l’indiquer.

Mieux, si nous souhaitons que le sable soit présent dans plusieurs endroits à la fois, il faut changer son type « chose » en « toile de fond ». Une toile de fond est toujours décorative, et donc également fixée sur place.

Profitons-en pour ajouter un soleil.

Le sable est une toile de fond dans l' Oasis, dans le Désert et dans la Crypte.

Le soleil est une toile de fond dans l' Oasis et dans le Désert.

Lorsque plusieurs objets (ici, des lieux) sont concernés par une action ou une définition, il est possible d’utiliser une virgule ainsi que « et » pour les séparer, cela évite d’écrire plusieurs phrases distinctes comme ceci : Le sable est une toile de fond dans l’ Oasis. Le sable est une toile de fond dans le Désert.

N’oubliez pas qu’un objet ne doit être une toile de fond que s’il se trouve dans plusieurs endroit à la fois. S’il s’agit d’un simple décor dans un endroit unique, la propriété décoratif suffit :

Le chemin est une chose décorative dans l' Oasis.

Il existe de nombreuses autres propriétés, mais nous les verrons au fur et à mesure de leur utilisation.

Enfin, en plus des propriétés existantes qui sont utilisées par les règles prédéfinies dans Inform, nous pouvons en créer nous-mêmes, et les utiliser dans des règles que nous écrirons. Nous verrons ceci plus tard, mais voyons brièvement comment créer une nouvelle propriété :

Une personne peut être mort. Une personne est rarement mort.

Une personne peut être heureux. Une personne est généralement heureux.

Ces lignes feront en sorte que chaque personnage créé sera toujours vivant et heureux par défaut (ce qui pour l’instant ne sert à rien, car nous n’avons pas écrit de règles concernant ces propriétés).

Aussi, les mots « mort » et « heureux » ont été utilisés, mais l’auteur peut choisir les adjectifs qu’il veut, même « zedfzg » et « ftagg » s’il le souhaite vraiment, du moment qu’il s’y retrouve ensuite…

Les adjectifs dans l’exemple ci-dessus ont été créés au masculin, bien que le mot « personne » soit féminin. En fait, la version actuelle d’Inform ne reconnaît pas les différentes formes des adjectifs, c’est pourquoi il faut choisir la forme que l’on veut utiliser dans sa source (par exemple, le masculin singulier). Si l’on avait écrit morte, il aurait alors été nécessaire de l’écrire au féminin partout.
Ceci n’est pas valable avec les adjectifs définis par Inform, comme décoratif ou ouvert : il est donc possible d’écrire décoratives ou ouverts.

Les synonymes

Nous avons enfin un petit cadre sympathique, mais il nous reste une nouvelle chose à régler pour rendre le jeu encore un peu plus attrayant : imaginons que nous créons un cimeterre (une sorte d’épée courbe) et que le joueur souhaite y faire référence en l’appelant « épée » ou « lame » (parce que c’est plus court, parce que qu’il ne se souvient plus de mot exact…).

Pour permettre l’utilisation de synonymes en jeu uniquement, il suffit d’ajouter :

Le cimeterre est une chose dans la Crypte. La description est "Un beau sabre à la lame courbe et damassée qui scintille de mille feux.".

Comprendre "sabre", "epee", "lame", "courbe" ou "damas" comme le cimeterre.

Nous n’indiquerons jamais les accents dans les synonymes possibles, car l’extension française enlève les diacritiques des commandes du joueur avant de les interpréter. Un synonyme défini avec accents ne sera jamais utilisable.

À présent, le joueur pourra taper n’importe quelle combinaison des synonymes créés pour faire référence au cimeterre, comme « épée », « lame courbe » ou « sabre ».

Si votre objet possède des accents dans son nom, il faut ajouter un synonyme sans accents, sinon le joueur ne pourra jamais interagir avec l’objet !
Par exemple, si nous avions écrit L’ épée (f) est une chose, il aurait fallu ajouter Comprendre "epee" comme l’ épée, même si cela paraît redondant.

Les règles

Nous pouvons maintenant créer tout un monde avec des lieux, des connexions, des objets, des personnages… Mais ce monde reste terriblement statique, car nous n’avons pas encore vu comment provoquer des réponses s’adaptant en fonction de l’action envisagée.

Il faut donc créer des règles pour rendre notre monde plus vivant. Nous en avons déjà vu une : la règle When play begins, qui permet d’exécuter du code au début du jeu :

When play begins, dire "Une introduction…"

Ici, cela ne fait qu’afficher un petit texte d’introduction (grâce à l’instruction dire), mais nous pouvons imaginer placer là certaines initialisations supplémentaires.

Voyons à présent les règles les plus pratiques, celles qui peuvent modifier le déroulement d’une action.

Malheureusement, les noms des règles n’ont pas pu être traduits en français. Il faudra les écrire en anglais !

Les règles instead

La première d’entre elles, et la plus utilisée, est la règle instead (« au lieu de » en anglais) :

Instead of taking NomDeLaChose: [« taking » est l'action pour « prendre »]

 dire "D'abord il se passe ça.";

 dire "Puis il se passe ça.".

Une règle instead se déclenche quand le joueur essaye l’action spécifiée (ici, prendre l’objet appelé NomDeLaChose). Cette dernière est alors interrompue et les instructions écrites dans la règle sont exécutées. Il s’agit donc d’une règle spécifique qui va empêcher la règle générale, qui ne provoque qu’un message bateau, de se dérouler.

La ponctuation pour les règles (instead ou autre) doit être comme suit :

Le préambule (ici, le « Instead of… ») doit être suivi d’un deux-points.

Chaque instruction doit être suivie d’un point-virgule, sauf la dernière.

La dernière instruction doit être suivie d’un point, pour indiquer que la règle est terminée.

Il est recommandé d’écrire une instruction par ligne pour plus de clarté et d’indenter (avec une tabulation) les instructions, mais ce n’est pas obligatoire.

Si la règle ne contient qu’une instruction, alors il est possible d’utiliser une virgule à la place du deux-points :

Instead of taking NomDeLaChose, dire "Ma réplique super drôle.".

Ceci n’est valable que lorsqu’il n’y a qu’une instruction, et n’est pas obligatoire.

Attention de bien vérifier la ponctuation et la syntaxe dans Inform 7, car langage naturel ne veut pas dire que le logiciel comprend tout ce qui est écrit ! En général, les messages d’erreur générés, bien qu’en anglais, permettent de rapidement voir où se situe le problème, mais il peut arriver que certaines erreurs de ponctuation passent à la compilation du fait d’une structure considérée comme valide, mais que le jeu ne se comporte pas comme attendu.

Ce genre de règle pourra être utilisée pour empêcher l’affichage du message « C’est trop difficile à transporter » lorsque le joueur essaye de prendre du sable : bien que le sable est effectivement difficile à transporter, nous voulons souligner l’absence d’intérêt particulier à prendre du sable dans le désert. Écrivons cela :

Instead of taking le sable, dire "Il n'y a pas de technocrate ici pour essayer de lui vendre votre sable, et vous n'avez de toute façon pas de récipient pour l'emporter.".

Le message par défaut sera ainsi remplacé par votre réplique super drôle !

Attention, les actions n’ont pas été traduites en français non plus, il faut donc utiliser leur nom anglais !

Les règles before

Les règles before (« avant » en anglais) servent à intervenir avant qu’une action ait lieu, mais n’empêcheront pas son déroulement : par défaut, l’action continuera comme si de rien n’était.

Before taking NomDeLaChose, dire "Description de ce qu'il se passe.".

Cette règle se déclenchera avant que le joueur prenne le NomDeLaChose. Si le joueur tente de prendre cet objet, le message « Description de ce qu’il se passe » sera affiché puis l’action continuera, le message par défaut sera affiché et le joueur aura l’objet dans son inventaire. Voici un exemple :

Before taking le cimeterre, dire "Ce sabre légendaire vous avait toujours fasciné, et maintenant vous pouvez enfin mettre la main dessus.".

Pour éviter que ce message n’apparaisse à chaque fois que le joueur repose le sabre puis le reprend, ce qui ridiculiserait l’effet, nous pouvons préciser que la règle ne peut être appliquée que la première fois que le cimeterre est pris, avec la précision pour la première fois :

Before taking le cimeterre pour la première fois, dire "Ce sabre légendaire vous avait toujours fasciné, et maintenant vous pouvez enfin mettre la main dessus.".

Les règles after

Si l’on veut que quelque chose se passe après qu’une certaine action soit réussie, il faut utiliser une règle after (« après » en anglais) :

After taking le cimeterre, dire "Bon ben finalement c'est pas si impressionnant que cela de porter ce sabre, mais qu'est-ce qu'il est lourd !".

Si l’on n’écrit pas l’instruction continuer l’action à la fin d’une règle after, alors le message par défaut ne sera pas affiché (vous n’avez qu’à tester pour vérifier !).

Connaître le véritable nom des actions

Il est important de faire la différence entre une action et une commande.

Quand le joueur tape la commande « prendre le cimeterre », c’est l’action taking qui a lieu. Le joueur aurait pu taper « ramasser le cimeterre », et la même action taking aurait eu lieu.

Dans les règles que nous venons de voir, il faut utiliser le nom de l’action (« taking »), et non la commande (« ramasser » ou « prendre »). Il existe deux méthodes simples pour trouver le nom exact d’une action.

La première consiste à taper la commande de débogage « actions » en jeu, puis de tester différentes actions. Par exemple, supposons que l’on cherche à chevaucher le dromadaire : quels noms d’action utiliser pour qu’Inform comprenne cela ?

Essayons la méthode :

>actions

Actions listing on.

>grimper sur le dromadaire

[climbing le dromadaire]

Vous ne pouvez pas arriver à grand-chose de cette manière.

[climbing le dromadaire - failed the block climbing rule]

>monter sur le dromadaire

[entering le dromadaire]

Vous ne pouvez pas y aller.

[entering le dromadaire - failed the French can't enter what's not enterable rule]

On sait maintenant que ces commandes entraînent les actions climbing et entering (le verbe « entrer » peut sembler étrange ici, mais c’est un verbe générique utilisé pour entrer dans un fauteuil ou monter sur une plate-forme).

La deuxième méthode consiste à aller dans l’index (onglet « Index »), puis à cliquer sur « Actions » en haut à droite. Une liste des actions possibles en jeu apparaîtra.

Concrétisons donc cela :

Instead of climbing or entering le dromadaire, dire "L'animal ne se laisse pas faire.".

Remarquons au passage qu’il est possible de créer une règle s’appliquant à plusieurs actions à la fois en écrivant or (« ou » en anglais) entre chacune des actions.

Les conditions

Il ne nous manque plus qu’un concept essentiel pour pouvoir voler de nos propres ailes : les tests et les conditions. Cela va se faire avec des « si ».

Mais avant tout, il va falloir copier le code qui suit au tout début de notre source, juste après Include Experimental French Features by Nathanael Marion. La traduction des conditions ne fonctionnera pas sinon. Cela est dû au fait que certaines parties d’Inform ne peuvent pas être traduites de manière « standard ». Les prochaines versions d’Inform devraient corriger le problème.

Include (-

language French

<control-structure-phrase> ::=

 /a/ si ... est début |

 /b/ si ... est |

 /c/ si ... |

 /c/ à moins que |

 /d/ répéter ... |

 /e/ tant que ... |

 /f/ sinon |

 /g/ sinon si ... |

 /g/ sinon à moins que |

 /h/ -- sinon |

 /i/ -- ...

-) in the Preform grammar.

Vous n’avez pas à comprendre ce code (il s’agit de quelque chose de beaucoup trop technique), copiez-le simplement dans votre source. Il faut reconnaître qu’il est plutôt embêtant d’avoir à se trimbaler ce code dans chacun de nos projets, alors si cela vous gêne, vous pouvez utiliser les conditions en anglais (if, else) à la place de leur traduction.

Ceci étant dit, voyons un exemple de la syntaxe utilisée :

Instead of attacking le dromadaire:

 dire "Attaquer le dromadaire serait-il une bonne idée ?";

 si le player a le cimeterre:

 dire "Il est vrai que vous avez de quoi tuer la bête.";

 sinon:

 dire "Vous pourriez frapper la bête avec vos poings.";

 dire "Mais vous n'êtes pas si cruel.".

Voici la syntaxe à suivre :

Commencer la condition par si condition: (ne pas oublier le deux-points). Il est possible de tester plusieurs conditions en même temps en les liant avec et ou ou, comme si le player porte le cimeterre et le player est dans l' Oasis:.

Écrire une instruction par ligne sous le si. Ces instructions doivent être indentées un cran plus profond que le si (ne pas oublier les points-virgules). Elles ne seront exécutées que si la condition est vraie.

Si l’on veut que quelque chose se passe si la condition est fausse, écrire sinon: (ne pas oublier le deux-points). Le sinon doit être indenté au même niveau que le si. Ajouter un sinon est facultatif.

Écrire une instruction par ligne sous le sinon. Ces instructions doivent être indentées un cran plus profond que le sinon (ne pas oublier les points-virgules). Elles ne seront exécutées que si la condition est fausse.

Pour exécuter des instructions dans tous les cas, sans se soucier de la condition, écrire la suite de ses instructions en revenant à l’indentation du si.

Si ce n’est pas encore clair, relisez bien l’exemple ci-dessus, testez-le et essayez de le modifier. Il est très important que vous compreniez cette structure, qui est utilisée très souvent.

Un peu comme pour les règles instead, before et after, s’il n’y a qu’une instruction à exécuter, il est possible (mais non obligatoire) de remplacer le deux-points par une virgule : si le player a le cimeterre, dire "Il est vrai que vous avez de quoi tuer la bête.".

Aussi, il arrive souvent de vouloir qu’une partie d’un texte change en fonction d’une certaine condition. Il est alors possible d’utiliser la syntaxe suivante, intégrée directement dans le texte :

La description du cimeterre est "Un beau sabre à la lame courbe et damassée qui scintille de mille feux[si le player porte le cimeterre]. Vous êtes vraiment heureux de l'avoir trouvé[sinon] est planté dans le sol[fin si].".

Tout ce qui est entre crochets dans du texte n’est pas un commentaire et ne s’affichera pas littéralement. Avec cette construction, le texte sera différent, selon une condition : tout ce qui se trouve entre [si …] et [sinon] ne s’affichera que si la condition est vraie, sinon c’est ce qui est entre [sinon] et [fin si] qui sera affiché. Encore une fois, le [sinon] est optionnel.

Ici, si le joueur a le cimeterre, la description de celui-ci sera « Un beau sabre à la lame courbe et damassée qui scintille de mille feux. Vous êtes vraiment heureux de l’avoir trouvé. » S’il ne le porte pas, il verra « Un beau sabre à la lame courbe et damassée qui scintille de mille feux est planté dans le sol. ».

Conclusion

Nous avons maintenant toutes les compétences requises pour créer un jeu complet. Cependant, il nous reste encore quelques notions à connaître ; rendez-vous ici pour les apprendre, en même temps que la création de votre première fiction interactive !

Écrire une fiction interactive avec Inform 7, partie 3 : Un jeu complet

Une vraie histoire

Nous sommes à présent capables de créer un petit monde réagissant aux actions du joueur, mais nous n’avons pas encore de fil conducteur pour le motiver. Il est toujours bien d’élaborer au moins un scénario qui contiendra les actions les plus importantes que le joueur devra effectuer. Voici, dans les grandes lignes, ce que nous allons faire :

Le héros, c’est-à-dire le joueur, est le prince de Perse, le fameux « prince of Persia ». Il arrive dans une oasis, entourée de désert, et s’apprête à entrer dans une crypte ancienne contenant un cimeterre mythique nommé le « Shamshir ». Lorsqu’il pénètre dans la crypte, la porte se referme et le seul moyen de sortir est de fouiller les murs jusqu’à trouver une encoche servant d’interrupteur pour rouvrir la porte. Lorsque celle-ci s’ouvre, un div, démon persan, apparaît. Le héros doit s’en débarrasser avec son arme nouvellement acquise. Une fois que ceci est fait, il peut repartir, mais pas à dos du dromadaire qui se trouve dans l’oasis : il doit trouver son cheval, ce qui convient mieux à sa lignée. Le jeu peut alors se terminer avec une victoire du joueur.

Quelques conseils d’organisation

Les en-têtes

Il est possible d’utiliser des en-têtes dans sa source, qui permettent de la séparer et de l’organiser.

Part 1 – L'Oasis

L' Oasis (f) est un endroit. "Une belle oasis ensoleillée…"

Chapter 1.1 – Le dromadaire

Le dromadaire est un animal dans l' Oasis.

[…]

Un en-tête est une ligne qui commence par le mot Volume, Book, Part, Chapter ou Section (en ordre d’importance). La numérotation et le titre ne sont pas importants, mais un en-tête Volume englobera tous les en-têtes de niveau inférieur, et ainsi de suite. Rien ne vous force à tous les utiliser, ou même à les utiliser du tout, mais l’organisation de la source est importante.

Ordonner sa source

Une façon standard d’organiser son code est d’écrire les choses dans cet ordre :

Une section qui inclut toutes les extensions nécessaires et qui fait les initialisations requises par le jeu ;

Une section pour les règles générales que nous voulons ajouter ;

Et enfin, une section par endroit, avec des sous-sections pour chaque objet si nécessaire.

Bien évidemment, ce modèle est à adapter en fonction du jeu et des besoins, et rien ne nous force à le suivre.

Voici une suggestion d’organisation pour notre premier jeu :

Part 1 - Configurations et initialisations générales

Chapter 1 - les extensions

Chapter 2 - La propriété Mort

Chapter 3 - Les objets initialement hors jeu

Part 2 - Les objets et les lieux

Chapter 1 - L'oasis

Chapter 2 - La crypte

Part 3 - Les scènes

Chapter 1 - Enfermé

Chapter 2 - Bataille

Part 4 - Tests

Ne vous inquiétez pas si vous ne savez pas encore ce que certaines sections vont contenir, nous verrons cela au fur et à mesure de l’écriture de notre code.

Créons notre jeu

Nous pouvons enfin commencer à créer notre fiction interactive.

Chacun de ses éléments seront décrits en détail dans les sections suivantes, et les nouvelles notions nécessaires à l’élaboration du jeu seront expliquées. De plus, chaque section contiendra un exemple de code possible pour arriver à nos fins ; il est recommandé d’essayer d’implanter seul ce qui est demandé à chaque section avant de regarder le code correspondant !

Enfin, sauvegardez et testez souvent votre jeu : il est plus facile de trouver une erreur si vous le testez après chaque fonctionnalité implantée. Si vous le testez à la toute fin, il y a d’énormes chances que vous vous retrouviez avec une montagne d’erreurs d’un coup à résoudre.

Commençons par le commencement

Tout d’abord, incluons les extensions nécessaires :

"Sable" by Fiction-interactive.fr (in French)

Part 1 - Configurations et initialisations générales

Chapter 1 - Les extensions

Include Experimental French Features by Nathanael Marion.

[Pour faire fonctionner les conditions en français.]

Include (-

language French

<control-structure-phrase> ::=

 /a/ si ... est début |

 /b/ si ... est |

 /c/ si ... |

 /c/ à moins que |

 /d/ répéter ... |

 /e/ tant que ... |

 /f/ sinon |

 /g/ sinon si ... |

 /g/ sinon à moins que |

 /h/ -- sinon |

 /i/ -- ...

-)  in the Preform grammar.

À l’oasis

Concentrons-nous maintenant sur le chapitre portant sur l’oasis. Nous afficherons une petite introduction qui explique la situation initiale au joueur et nous créons l’oasis.

When play begins, dire "Bienvenue, aventurier. Vous êtes le prince de Perse, et au cours d'une partie de chasse dans la forêt, votre cheval vous a désarçonné. Vous avez alors erré à sa recherche, jusqu'à atteindre une oasis.".

L' Oasis (f) est un endroit. "C'était une belle oasis ensoleillée mais, maintenant, le soleil va déclinant… Il y a le désert tout autour d'ici, à l'exception d'une forêt à l'est ; au sud descend un chemin en direction d'une crypte. La forêt n'est pas sûre en fin de journée.".

Il est judicieux d’indiquer les directions dans lesquelles le joueur pourra aller dans les descriptions des endroits ; sans cela, il serait perdu et ne saurait pas trop quoi faire. Ne l’oubliez pas !

Implantons maintenant le dromadaire :

Il faut qu’il soit un animal.

Un message approprié doit être affiché et l’action doit être stoppée si le joueur tente de grimper sur le dromadaire.

Le dromadaire tue le joueur si celui-ci l’attaque.

Nous aussi voulons que le message lorsque le joueur essaie de grimper sur le dromadaire change si le cheval n’est pas encore arrivé. Par exemple :

Instead of climbing or entering le dromadaire, dire "Vous, un prince, n'oseriez certainement pas retourner à votre palais à dos de dromadaire ![si le cheval n'est pas dans l' Oasis]Mais où est donc votre cheval ?[fin si]".

Puisque la condition mentionne le cheval, il faut que le cheval soit créé quelque part dans le code pour que le jeu fonctionne.

Pour terminer la partie, il faut utiliser l’une de ces instructions :

[Si le joueur a perdu, ou qu'il s'agit d'une « mauvaise » fin]

 fin de l' histoire en disant "Vous êtes mort";

[Si le joueur a gagné, ou qu'il s'agit de la « vraie » fin]

 fin définitive de l'histoire en disant "Vous avez gagné";

Le message est à adapter en fonction de ce qu’il s’est passé dans le jeu.

Voici le résultat final pour le dromadaire :

Le dromadaire est un animal dans l' Oasis.

Instead of climbing or entering le dromadaire, dire "Vous, un prince, n'oseriez certainement pas retourner à votre palais à dos de dromadaire ![si le cheval n'est pas dans l' Oasis]Mais où est donc votre cheval ?[fin si]".

Instead of attacking le dromadaire:

 dire "Le dromadaire n'a pas apprécié, et il vous le rend bien, avec un coup de sabot bien placé.";

 fin de l'histoire en disant "Vous êtes mort".

Créons aussi le cheval du joueur pour que la condition dans le texte fonctionne. Comme il n’est pas présent au début de la partie, nous ne spécifierons pas d’emplacement lors de sa création (nous verrons comment le placer en jeu en cours de partie plus tard).

Le cheval est un animal.

La description est "Votre cheval est un splendide Akhal-Teke.".

Comprendre "akhal" ou "akhal teke" comme le cheval.

Ajoutons le palmier (rien de bien sorcier ici) :

Le palmier est une chose fixée sur place dans l' Oasis.

La description est "Un palmier qui oscille au gré du vent.".

Comprendre "arbre" comme le palmier.

Ajoutons comme décor dans l’oasis un chemin vers la crypte. Nous pourrions écrire le chemin vers la crypte est une chose dans l' Oasis, mais cela pourrait causer un conflit avec l’endroit « Crypte » que nous allons bientôt créer, donc nous écrirons le chemin est une chose décorative dans l' Oasis. Il reste néanmoins possible de modifier le nom qui sera affiché en jeu avec la propriété printed name, qui est analogue à la propriété description.

Voici le code obtenu :

Le chemin est une chose décorative dans l' Oasis.

Le printed name est "chemin vers la crypte".

[Le printed name est une propriété similaire à la description, mais pour le nom qui sera affiché en jeu.]

Au tour du sable, maintenant :

Il doit être une toile de fond dans l’oasis, la crypte et le désert (ajoutez également ces deux derniers endroits, nous les modifierons plus tard).

Le prendre et le fouiller doivent donner des messages appropriés et bloquer l’action (rappelez-vous le moyen de trouver à quelle action correspond la commande « fouiller »).

Le code final pour le sable :

Le sable est une toile de fond dans l' Oasis, dans le Désert et dans la Crypte.

L' indefinite article du sable est "du".

Instead of taking le sable, dire "Il n'y a pas de technocrate ici pour essayer de lui vendre votre sable, et vous n'avez de toute façon pas de récipient pour l'emporter.".

[Pour « fouiller le sable ».]

Instead of searching le sable, dire "Autant chercher une aiguille dans une botte de foin.".

Le Désert est au nord de l' Oasis et au nord-ouest de l' Oasis et à l'ouest de l' Oasis.

[Un petit bonus : permet d'expliquer pourquoi le joueur ne peut aller dans une direction qui ne mène à aucun endroit depuis le désert.]

Instead of going nulle part from le désert, dire "Sans cheval, vous ne pouvez risquer de vous aventurer dans le désert seul.".

Ajoutons également une forêt à l’est de l’oasis, mais en empêchant le joueur de s’y rendre : l’endroit n’est pas sûr à la tombée de la nuit. On peut pour cela ajouter to la forêt après l’action going dans la règle.

La Forêt est un endroit. La Forêt est à l'est de l' Oasis.

Instead of going to la forêt, dire "La nuit va bientôt tomber, et la jungle est la plus dangereuse à ce moment ; autant rester dans le désert, essayer de retrouver votre cheval ou explorer les environs.".

Dans la crypte

Maintenant que l’oasis est terminée, penchons-nous sur la crypte.

Il faut d’abord créer une porte de pierre (en utilisant le type porte), qui se situera entre la crypte et l’oasis. Il faut qu’elle soit ouverte, mais qu’il soit impossible pour le joueur de l’ouvrir ou de la fermer. Voici à quoi peut ressembler son implantation :

[On ne peut pas écrire « porte de pierre », car il y aurait une confusion avec le verbe « porter ».

Nous allons donc l'appeler « portedepierre » dans notre code.]

La portedepierre est une porte ouverte.

La portedepierre est au nord de la Crypte et au sud de l' Oasis.

Le printed name de la portedepierre est "porte de pierre".

Comprendre "porte", "seuil" ou "crypte" comme la portedepierre.

[Permet d'autoriser le joueur à quitter la crypte lorsqu'il tape « sortir » plutôt que « aller au nord ».]

Instead of exiting quand la location est la crypte, essayer de going nord.

[L'instruction « essayer de » force le joueur à faire une action, ici aller au nord.]

Instead of opening or closing la portedepierre, dire "La porte est trop lourde pour vous[si la portedepierre est ouverte], de plus elle est déjà ouverte[fin si].".

Maintenant que ceci est fait, attaquons-nous à la suite. Nous aurons besoin de créer une nouvelle propriété pour les personnages morts. Nous voulons que les personnes puissent être mortes, et qu’interagir avec une personne morte bloque l’action (n’oubliez pas d’écrire votre code dans la bonne section) :

Une personne peut être mort. Une personne est rarement mort.

[« Rarement » signifie que les personnes ne seront pas mortes par défaut.]

Instead of doing something to une mort personne, dire "Cette créature est morte, laissons-la en paix.".

[Il arrive qu'Inform ne comprenne pas quand l'adjectif est après le nom, c'est pourquoi il est écrit « to une mort personne ».]

Revenons à la crypte. Créons-la, ajoutons-lui une description, une momie et le fameux cimeterre. Il faut qu’un message personnalisé apparaisse lorsque le joueur prend le cimeterre pour la première fois. La momie sera considérée comme une personne et non une chose, afin de pouvoir lui attribuer la propriété que nous venons de créer (ce qui affichera le message adéquat si le joueur interagit avec elle).

Cela donne :

La Crypte est un endroit. "Un silence de mort règne entre ces murs oppressants, et le murmure enjoué du vent n'arrive pas jusqu'ici.".

La momie est une personne mort dans la Crypte.

[On affiche un petit texte avant d'examiner la momie. On n'utilise pas la description, car elle ne s'affichera jamais, puisque toute action sur personne morte est bloquée par la règle que nous avons définie plus tôt.]

Before examining la momie, dire "En temps normal, cela ne ferait pas aussi peur, mais il faut bien avouer qu'en ces lieux, l'évocation de la mort prend une autre dimension.".

Le cimeterre est une chose dans la Crypte.

La description est "Un beau sabre à la lame courbe et damassée qui scintille de mille feux.".

Comprendre "sabre", "epee", "lame", "shamshir", "courbe" ou "damas" comme le cimeterre.

[Nous remplaçons le message par défaut lorsque le joueur prend le cimeterre, sans pour autant l'empêcher de le prendre.]

After taking le cimeterre pour la première fois:

 dire "Ce sabre légendaire, le Shamshir, vous avait toujours fasciné, et maintenant vous pouvez enfin mettre la main dessus.".

Notre première scène

Le scénario que nous avons conçu plus tôt nous dit que la porte doit se refermer après que le joueur a pris le cimeterre. Décidons que le joueur meurt d’asphyxie s’il n’arrive pas à ouvrir la porte à temps.

Si nous savons comment organiser spatialement le jeu, nous n’avons pas encore abordé comment l’organiser temporellement. Les scènes sont ce qu’il nous faut.

L’utilisation de scènes n’est pas nécessaire pour créer un jeu fonctionnel avec Inform, car il est possible d’utiliser des tests sur des propriétés d’objets ou des variables à la place. Néanmoins, les scènes apportent un confort d’utilisation qu’il serait dommage de négliger.

Les scènes dans Inform sont analogues aux scènes dans une pièce de théâtre : elles commencent à un événement précis, se terminent à un événement précis, et des choses se passent lors de leur déroulement. Elles aident ainsi à découper et organiser le temps. Par exemple, lorsque tel personnage ouvre son courrier ou pousse un cri, un autre comédien arrive sur scène, et ainsi de suite.

Créons une scène nommée Enfermé et donnons les conditions qui la font débuter et se terminer.

Enfermé est une scène.

Enfermé begins when le player porte le cimeterre.

[La scène commence quand le joueur porte le cimeterre.]

Enfermé ends sadly when the time since Enfermé began is 10 minutes.

[Elle se termine mal quand dix minutes se sont passées depuis son commencement (1 min = 1 tour).]

Enfermé ends happily when la portedepierre est ouverte.

[Elle se termine bien quand la porte de pierre est ouverte.]

Nous pouvons voir que nous avons spécifié deux fins pour notre scène : l’une d’elles fera mourir le joueur, et l’autre le permettra de continuer (les noms des différentes fins — « sadly » et « happily » ici — importent peu, nous pouvons choisir ceux que nous voulons). Ceci, bien que pratique, est optionnel : il est possible de créer une scène ne possédant qu’une seule fin (il n’est dans ce cas plus nécessaire de lui donner un nom).

De plus, dans le code ci-dessus, nous avons décidé que la scène commence quand le joueur porte le cimeterre. Cela fera-t-il en sorte que la scène recommence encore et encore s’il pose le cimeterre et le reprend ? Non, car une scène ne peut arriver qu’une seule fois (par défaut du moins). Il n’y a donc pas de problème de ce côté.

Aussi, une scène ne peut pas se terminer avant d’avoir commencé, donc le fait qu’elle prenne fin quand la porte est ouverte n’est pas dérangeant par rapport au fait que la porte est déjà ouverte au début du jeu, alors que la scène n’a pas encore commencé.

Enfin, une scène ne peut pas finir de plusieurs façons à la fois, donc, si les 10 minutes finissent de s’écouler alors que la scène s’est déjà terminée joyeusement, rien ne se passera.

Définissons à présent ce qu’il se passe lorsque la scène commence et se termine. Il faut que la porte se referme et se verrouille, et qu’un message l’indique au joueur. Si elle se termine mal, nous faisons mourir le joueur d’asphyxie. Si elle se termine bien, nous amenons le div dans l’oasis, afin de préparer la bataille finale.

Créons d’abord le div. Il doit se trouver hors du jeu, comme le cheval.

Le div est un animal.

La description est "Un démon sanguinaire à la face simiesque et aplatie qui ne vous fera pas de quartier.".

Comprendre "monstre", "demon" ou "sanguinaire" comme le div.

Puis spécifions les événements liés à la scène :

When Enfermé begins: [quand la scène commence.]

 dire "Au moment où vous prenez l'arme, la porte donnant vers l'extérieur se referme !";

 maintenant la portedepierre est fermée;

 maintenant la portedepierre est verrouillée.

When Enfermé ends sadly: [quand la scène se termine mal.]

 dire "Vous ne pouvez plus respirer. Cette crypte sera votre tombeau.";

 fin de l'histoire en disant "Vous êtes mort".

When Enfermé ends happily: [quand la scène se termine bien.]

 maintenant le div est dans l' Oasis.

L’instruction maintenant permet de changer un état dans le monde (rendre la porte fermée, ou déplacer le div, par exemple).

Affichons aussi un message à chaque tour pendant la scène pour indiquer au joueur que son temps est compté :

[Une règle « Every turn  » s'exécute à chaque tour.

Celle-ci en particulier s'exécute à chaque tour, mais seulement si Enfermé est en cours.]

Every turn during Enfermé: [« during » signifie « pendant »]

 dire "L'air commence à manquer…".

La scène est fonctionnelle, mais il faut donner un moyen au joueur d’ouvrir la porte. Ajoutons des murs dans la crypte, avec des synonymes appropriés, et récompensons le joueur qui les fouille en lui indiquant qu’il y a un interstice entre deux pierres. Il faut que, quand le joueur insère le cimeterre dans l’interstice, la porte s’ouvre (ce qui terminera la scène).

Lors de la conception de ce genre d’énigme, il est toujours bon de penser à donner au joueur toutes les informations dont il aura besoin (subtilement ou pas), même si elles peuvent sembler évidentes. Par exemple, si nous n’avions pas mentionné les murs dans la descriptions de la crypte, le joueur n’aurait peut-être pas pensé à les toucher, et il n’aurait donc jamais trouvé la solution de l’énigme.

Vous devriez obtenir quelque chose comme ceci :

Les murs sont des choses décoratives dans la Crypte.

La description est "Les murs sont recouverts de carreaux en terre cuite qui représentent des dieux et des animaux fabuleux. Il y a également une partie qui est restée en pierre brute.".

Comprendre "dieux", "animaux", "fabuleux", "mur", "interstice", "pierre" ou "pierres" comme les murs.

Instead of searching or touching les murs, dire "À un certain endroit, il y a un interstice plus marqué entre deux pierres.".

Instead of inserting le cimeterre into les murs:

 si la portedepierre est verrouillée: [alors la porte s'ouvre]

 dire "Vous glissez votre cimeterre dans l'interstice entre les deux pierres, et la porte est de nouveau ouverte.";

 maintenant la portedepierre est déverrouillée;

 maintenant la portedepierre est ouverte;

 sinon: [rien ne se passe]

 dire "Il ne se passe rien de spécial.".

[Il est aussi possible d'ajouter des synonymes à une action pour permettre plus de choix au joueur.]

Comprendre "planter [cimeterre] dans [quelque chose]" ou "glisser [cimeterre] dans [quelque chose]" comme inserting it into.

La bataille finale

Nous sommes prêts pour la dernière partie du jeu : le combat contre le div !

Nous aurons besoin d’un moyen de savoir où en est rendu le combat. Pour cela, nous allons créer une nouvelle propriété pour notre div. Il s’agira d’un nombre que nous appellerons attaque :

Le div has a number called attaque. L' attaque du div est 1.

Il faut aussi faire gagner le joueur quand il monte sur son cheval :

Instead of climbing or entering le cheval:

 dire "Vous remontez sur votre cheval, et retournez enfin à votre palais.";

 fin définitive de l'histoire.

Et enfin, la scène finale :

Elle commence quand le joueur et le div se trouvent dans l’oasis. Nous affichons alors un message qui indique que le div se rue sur le joueur.

Elle se termine quand le div est mort. Nous déplaçons alors le cheval dans l’oasis, pour que le joueur puisse terminer le jeu.

À chaque tour durant la bataille et si le joueur est dans l’ Oasis, l’attaque du div augmente de 1 si elle est plus petite que 4 et un petit texte indiquant qu’il attaque le joueur est affiché. Si l’attaque du div est plus grande que 4, il dévore le joueur et la partie est finie.

Pour battre le div, le joueur doit l’attaquer avec le cimeterre. S’il ne possède pas l’arme, on lui indique qu’il n’arrivera pas à grand-chose. S’il la possède, l’attaque du div est diminuée de 2. Le div meurt si son attaque est inférieure à 0 (n’oubliez pas la propriété mort !)

Il nous manque cependant encore quelques notions.

Il nous faut comparer des nombres :

 si l' attaque du div est inférieure à 0:

 si l' attaque du div est supérieure à 4:

Et pour changer un nombre :

 augmenter l' attaque du div de 1;

 diminuer l' attaque du div de 2;

Enfin, pour ne pas afficher le même texte plusieurs fois à la suite et ne pas ennuyer le joueur, voici une petite astuce :

 dire "[parmi]La lame s'élève dans les airs, légère comme une flamme, et retombe sur le div, le blessant gravement[ou]Vous fendez comme si vous étiez le vent, perçant votre ennemi et réduisant ses attaques à néant[ou]Vous vous battez bien, vous sentez votre avantage[stoppant].";

Cette structure est analogue à [si condition] … [fin si]. La première fois, « La lame s’élève dans les airs, légère comme une flamme, et retombe sur le div, le blessant gravement » sera affiché, puis ce sera « Vous fendez comme si vous étiez le vent, perçant votre ennemi et réduisant ses attaques à néant ». Après cela, le message « Vous vous battez bien, vous sentez votre avantage » sera toujours montré. Les différents textes séparés par [ou] entre [parmi] et [stoppant] seront donc affichés de manière séquentielle.
Et voilà, nous sommes en mesure de terminer l’écriture de notre jeu :

Bataille est une scène.

Bataille begins when le player est dans l' Oasis et le div est dans l' Oasis.

Bataille ends when le div est mort.

When bataille begins:

 dire "Le div fonce vers vous !".

[Nous avons ici des conditions imbriqués. Assurez-vous de bien comprendre ce qui se passe et quand.]

Every turn during Bataille:

 si le player est dans l' Oasis:

 si l' attaque du div est inférieure à 4:

 dire "[parmi]Vous feriez bien de trouver un moyen de vaincre ce monstre ![ou]Il fait tournoyer son poing au-dessus de sa tête.[ou]Il pousse un grognement hideux.[stoppant]";

 augmenter l' attaque du div de 1;

 sinon:

 dire "Il finit par vous attraper et vous dévorer !";

 fin de l'histoire en disant "Vous êtes mort".

Instead of attacking le div:

 si le player porte le cimeterre:

 dire "[parmi]La lame s'élève dans les airs, légère comme une flamme, et retombe sur le div, le blessant gravement[ou]Vous fendez comme si vous étiez le vent, perçant votre ennemi et réduisant ses attaques à néant[ou]Vous vous battez bien, vous sentez votre avantage[stoppant].";

 diminuer l' attaque du div de 2;

 si l' attaque du div est inférieure à 0, maintenant le div est mort;

 sinon:

 maintenant l' attaque du div est 4; [accélère la fin du joueur]

 dire "Vous n'irez pas loin avec vos petits poings…".

When bataille ends:

 dire "Le monstre s'écroule lourdement, sans vie.";

 dire "Votre cheval arrive enfin, mais après la bataille !";

 maintenant le cheval est dans l' Oasis.

Version finale de notre jeu

Voici pour résumer le code complet que nous venons d’écrire, avec commentaires additionnels pour vous permettre de bien comprendre :

"Sable" by Fiction-interactive.fr (in French)

Part 1 - Configurations et initialisations générales

Chapter 1 - Les extensions

Include Experimental French Features by Nathanael Marion.

[Pour faire fonctionner les conditions en français.]

Include (-

language French

 ::=

 /a/ si ... est début |

 /b/ si ... est |

 /c/ si ... |

 /c/ à moins que |

 /d/ répéter ... |

 /e/ tant que ... |

 /f/ sinon |

 /g/ sinon si ... |

 /g/ sinon à moins que |

 /h/ -- sinon |

 /i/ -- ...

-)  in the Preform grammar.

Chapter 2 - La propriété Mort

[À utiliser avec les monstres de notre histoire]

Une personne peut être mort. Une personne est rarement mort.

[« Rarement » signifie que les personnes ne seront pas mortes par défaut.]

[Cette règle empêche le joueur d'interagir avec une personne morte, en remplaçant le message par défaut par un laconique « Cette créature est morte, laissons-la en paix. »]

Instead of doing something to une mort personne, dire "Cette créature est morte, laissons-la en paix.".

Chapter 3 - Les objets initialement hors jeu

[Si on ne précise pas où est le cheval, il ne sera à aucun endroit au début du jeu. Nous le ferons venir plus tard, à la fin.]

Le cheval est un animal.

La description est "Votre cheval est un splendide Akhal-Teke.".

Comprendre "akhal" ou "akhal teke" comme le cheval.

Instead of climbing or entering le cheval:

 dire "Vous remontez sur votre cheval, et retournez enfin à votre palais.";

 fin définitive de l'histoire.

Le div est un animal.

La description est "Un démon sanguinaire à la face simiesque et aplatie qui ne vous fera pas de quartier.".

Comprendre "monstre", "demon" ou "sanguinaire" comme le div.

[Le div possède un nombre que nous allons appeler « attaque », et qui servira à déterminer s'il est sur le point de mourir ou de gagner.]

Le div has a number called attaque. L' attaque du div est 1.

Part 2 - Les objets et les lieux

Chapter 1 - L'oasis

[Affichons notre petite introduction au tout début de la partie.]

When play begins, dire "Bienvenue, aventurier. Vous êtes le prince de Perse, et au cours d'une partie de chasse dans la forêt, votre cheval vous a désarçonné. Vous avez alors erré à sa recherche, jusqu'à atteindre une oasis.".

L' Oasis (f) est un endroit. "C'était une belle oasis ensoleillée mais, maintenant, le soleil va déclinant… Il y a le désert tout autour d'ici, à l'exception d'une forêt à l'est ; au sud descend un chemin en direction d'une crypte. La forêt n'est pas sûre en fin de journée.".

Le dromadaire est un animal dans l' Oasis.

Instead of climbing or entering le dromadaire, dire "Vous, un prince, n'oseriez certainement pas retourner à votre palais à dos de dromadaire ![si le cheval n'est pas dans l' Oasis]Mais où est donc votre cheval ?[fin si]".

[ce type de code est un moyen de faciliter un test de condition impliquant uniquement du texte, nous aurions pu l'écrire autrement, mais cela aurait été plus long.]

[Le dromadaire tue le joueur si ce dernier tente de l'attaquer.]

Instead of attacking le dromadaire:

 dire "Le dromadaire n'a pas apprécié, et il vous le rend bien, avec un coup de sabot bien placé.";

 fin de l'histoire en disant "Vous êtes mort".

Le palmier est une chose fixée sur place dans l' Oasis.

La description est "Un palmier qui oscille au gré du vent.".

Comprendre "arbre" comme le palmier.

Le chemin est une chose décorative dans l' Oasis.

Le printed name est "chemin vers la crypte".

Le sable est une toile de fond dans l' Oasis, dans le Désert et dans la Crypte.

[Pour changer l'article indéfini du sable.]

L' indefinite article du sable est "du".

Instead of taking le sable, dire "Il n'y a pas de technocrate ici pour essayer de lui vendre votre sable, et vous n'avez de toute façon pas de récipient pour l'emporter.".

[L'action « searching » résulte de la commande « fouiller ».]

Instead of searching le sable, dire "Autant chercher une aiguille dans une botte de foin.".

Le Désert est au nord de l' Oasis et au nord-ouest de l' Oasis et à l'ouest de l' Oasis.

[Permet d'expliquer pourquoi le joueur ne peut aller dans une direction qui qui ne mène à aucun endroit depuis le désert.]

Instead of going nulle part from le désert, dire "Sans cheval, vous ne pouvez risquer de vous aventurer dans le désert seul.".

La Forêt est un endroit. La Forêt est à l'est de l' Oasis.

[Nous empêchons le joueur d'entrer dans la forêt en lui affichant un message.]

Instead of going to la forêt, dire "La nuit va bientôt tomber, et la jungle est la plus dangereuse à ce moment ; autant rester dans le désert, essayer de retrouver votre cheval ou explorer les environs.".

Chapter 2 - La crypte

[On ne peut pas écrire « porte de pierre », car il y aurait une confusion avec le verbe « porter ». Nous allons donc l'appeler « portedepierre » dans notre code.]

La portedepierre est une porte ouverte déverrouillée.

La portedepierre est au nord de la Crypte et au sud de l' Oasis. Comprendre "porte", "seuil" ou "crypte" comme la portedepierre.

[La propriété « printed name » correspond au nom qui sera affiché au joueur. Utile pour que ça n'affiche pas « Vous pouvez voir une portedepierre ».].

Le printed name de la portedepierre est "porte de pierre".

[Permet d'autoriser le joueur à quitter la crypte lorsqu'il tape « sortir » plutôt que « aller au nord ».]

Instead of exiting quand la location est la crypte, essayer de going nord.

Instead of opening or closing la portedepierre, dire "La porte est trop lourde pour vous[si la portedepierre est ouverte], de plus elle est déjà ouverte[fin si].".

La Crypte est un endroit. "Un silence de mort règne entre ces murs oppressants, et le murmure enjoué du vent n'arrive pas jusqu'ici.".

La momie est une femme mort dans la Crypte.

[Nous affichons un petit texte avant d'examiner la momie. Nous n'utilisons pas la description car elle ne s'affichera jamais, puisque toute action sur une personne morte est bloquée par la règle que nous avons définie plus tôt.]

Before examining la momie, dire "En temps normal, cela ne ferait pas aussi peur, mais il faut bien avouer qu'en ces lieux, l'évocation de la mort prend une autre dimension.".

Le cimeterre est une chose dans la Crypte.

La description est "Un beau sabre à la lame courbe et damassée qui scintille de mille feux.".

Comprendre "sabre", "epee", "lame", "shamshir", "courbe" ou "damas" comme le cimeterre.

[Nous remplaçons le message par défaut lorsque le joueur prend le cimeterre, sans pour autant l'empêcher de le prendre.]

After taking le cimeterre pour la première fois:

 dire "Ce sabre légendaire, le Shamshir, vous avait toujours fasciné, et maintenant vous pouvez enfin mettre la main dessus.".

Les murs sont des choses décoratives dans la Crypte.

La description est "Les murs sont recouverts de carreaux en terre cuite qui représentent des dieux et des animaux fabuleux. Une partie est restée en pierre brute.".

Comprendre "dieux", "animaux", "fabuleux", "mur", "interstice", "pierre" ou "pierres" comme les murs.

Instead of searching or touching les murs, dire "À un certain endroit, il y a un interstice plus marqué entre deux pierres.".

Instead of inserting le cimeterre into les murs:

 si la portedepierre est verrouillée: [alors la porte s'ouvre]

 dire "Vous glissez votre cimeterre dans l'interstice entre les deux pierres, et la porte est de nouveau ouverte.";

 maintenant la portedepierre est déverrouillée;

 maintenant la portedepierre est ouverte;

 sinon: [si elle n'est pas verrouillée, rien ne se passe]

 dire "Il ne se passe rien de spécial.".

[Nous ajoutons des synonymes à une action pour permettre plus de choix au joueur.]

Comprendre "planter [cimeterre] dans [quelque chose]" ou "glisser [cimeterre] dans [quelque chose]" comme inserting it into.

Part 3 - Les scènes

Chapter 1 - Enfermé

[Nous créons la scène.]

Enfermé est une scène.

[La scène commence quand le joueur porte le cimeterre.]

Enfermé begins when le player porte le cimeterre.

[Elle se termine mal quand dix minutes se sont passées depuis son commencement (1 min = 1 tour).]

Enfermé ends sadly when the time since Enfermé began is 10 minutes.

[Elle se termine bien quand la porte de pierre est ouverte.]

Enfermé ends happily when la portedepierre est ouverte.

When Enfermé begins: [quand la scène commence]

 dire "Au moment où vous prenez l'arme, la porte donnant vers l'extérieur se referme !";

 maintenant la portedepierre est fermée;

 maintenant la portedepierre est verrouillée.

[Une règle « Every turn » s'exécute à chaque tour. Celle-ci en particulier s'exécute à chaque tour, mais seulement si Enfermé est en cours.]

Every turn during Enfermé:

 dire "L'air commence à manquer…".

When Enfermé ends sadly: [quand la scène se termine mal]

 dire "Vous ne pouvez plus respirer. Cette crypte sera votre tombeau.";

 fin de l'histoire en disant "Vous êtes mort".

When Enfermé ends happily: [quand la scène se termine bien]

 maintenant le div est dans l' Oasis.

Chapter 2 - Bataille Bataille est une scène.

Bataille begins when le player est dans l' Oasis et le div est dans l' Oasis.

Bataille ends when le div est mort.

When bataille begins:

 dire "Le div fonce vers vous !".

[Faites bien attention aux conditions imbriquées !]

Every turn during Bataille:

 si le player est dans l' Oasis: [On vérifie cela pour que le joueur puisse se réfugier dans la crypte à tout moment.]

 si l' attaque du div est inférieure à 4:

 [la structure « parmi » permet d'afficher des messages de manière séquentielle.]

 dire "[parmi]Vous feriez bien de trouver un moyen de vaincre ce monstre ![ou]Il fait tournoyer son poing au-dessus de sa tête.[ou]Il pousse un grognement hideux.[stoppant]";

 augmenter l' attaque du div de 1;

 sinon:

 dire "Il finit par vous attraper et vous dévorer !";

 fin de l'histoire en disant "Vous êtes mort".

Instead of attacking le div:

 si le player porte le cimeterre:

 dire "[parmi]La lame s'élève dans les airs, légère comme une flamme, et retombe sur le div, le blessant gravement[ou]Vous fendez comme si vous étiez le vent, perçant votre ennemi et réduisant ses attaques à néant[ou]Vous vous battez bien, vous sentez votre avantage[stoppant].";

 diminuer l' attaque du div de 2;

 si l' attaque du div est inférieure à 0, maintenant le div est mort;

 sinon:

 maintenant l' attaque du div est 4; [Accélère la fin du joueur.] dire "Vous n'irez pas loin avec vos petits poings…".

When bataille ends:

 dire "Le monstre s'écroule lourdement, sans vie.";

 dire "Votre cheval arrive enfin, mais après la bataille !";

 maintenant le cheval est dans l' Oasis.

Part 4 - Tests

[Nous verrons quoi mettre dans cette section bientôt !]

Conclusion

Eh oui, nous avons écrit tout ça. Et pourtant, il est encore possible de faire beaucoup de choses : par exemple, il manque un plan d’eau dans cette oasis ! Vous pouvez vous en charger vous-même ? Vous pourrez par exemple traiter l’eau comme le sable, et rajouter en plus des exceptions si le joueur essaye de la boire ou d’y entrer.

Une fois que vous serez satisfait de votre fiction interactive, il sera temps de la faire tester !

Écrire une fiction interactive avec Inform 7, partie 4 : Diffusons notre jeu

Testons

Il serait bête de diffuser un jeu qui ne fonctionne pas comme prévu. Testez-le bien, puis demandez à d’autres personnes d’essayer votre petite aventure ! Vous n’avez pas lu la précédente partie ? Elle est ici.

Les privilèges du démiurge

En tant qu’auteur, nous avons la possibilité de faire des choses qu’un joueur normal ne pourrait pas. En voici un aperçu.

Test me!

Il est possible de tester le cheminement du joueur au travers de certaines commandes, pour vérifier rapidement que le jeu est finissable, ou pour atteindre instantanément certaines zones ou certains objets.

La procédure de test automatique implique de rajouter dans le code cette partie :

Test me with "aller au sud / prendre le cimeterre / fouiller les murs / mettre la lame dans l'interstice / sortir / attaquer le div / encore / encore / monter sur le cheval".

Ainsi, durant le jeu, en tapant « test me », chaque commande sera automatiquement tapée les unes à la suite des autres.

Nous pouvons également créer des batteries de tests pour tester différentes parties du jeu :

Test me with "test one / test two / test three".

Test one with "aller au sud / prendre le cimeterre"

Test two with "ouvrir la porte / frapper la porte"

Test three with "toucher la momie / fouiller les murs"

Ces commandes de débogage ne seront bien entendu pas disponibles lorsque le jeu final sera sorti (voir plus bas).

« Test me » est très utile pour vérifier qu’un jeu peut se dérouler correctement d’un bout à l’autre, jusqu’à la victoire.

Déplacer des objets

En jeu, l’auteur peut utiliser la commande « gonear [objet] » pour se déplacer instantanément dans un endroit ou dans le même endroit que l’objet donné. À l’inverse, « purloin [objet] » permet de mettre dans son inventaire n’importe quel objet que l’on veut tester durant la conception du jeu.

Dans un petit jeu comme le nôtre, cela n’est pas forcément très utile, mais cela peut l’être si, par exemple, on souhaite tester un objet sans avoir à faire à chaque fois toutes les étapes permettant de l’obtenir.

Publier son jeu

Lorsque votre jeu est prêt, il vous suffit de cliquer sur le bouton « Release » en haut à gauche de la fenêtre, et un fichier de jeu sera créé dans le dossier « sable.materials », situé au même endroit que votre projet.

Si vous voulez rendre votre jeu plus attrayant, vous pouvez ajouter dans ce même dossier une image au format JPG ou PNG nommée « Cover.jpg » (ou « Cover.png »). Elle servira de couverture à votre fiction interactive ; le manuel recommande une taille de 960×960 pixels et vous devez également fournir une version plus petite de 120×120 pixels (nommée « Small Cover.jpg/png »). Il ne vous reste plus qu’à ajouter dans votre code la ligne :

Release along with cover art ("Description de la couverture").

Le texte entre parenthèses est utilisé par les malvoyants, afin qu’ils puissent savoir de quoi a l’air la couverture.

Ne piquez pas d’images sur Google ! Créez votre couverture vous-même, demandez à une connaissance de la faire, ou prenez des images dont la licence vous le permet !

Si tout se passe bien, vous vous retrouverez avec un fichier « sable.gblorb ». Ce fichier contient votre jeu, sa couverture et d’autres données importantes comme son numéro d’identification unique. Il existe deux moyens de l’ouvrir :

Sur internet : écrivez la ligne suivante dans votre source :

Release along with an interpreter.

[OU si vous avez aussi une couverture]

Release along with an interpreter and cover art ("Description de la couverture").

Lorsque vous cliquerez sur le bouton « Release », un mini site internet contenant tout ce qu’il faut pour jouer à votre fiction interactive en ligne sera créé dans « sable.materials ». Il vous suffira de placer ce site sur un serveur (par exemple, sur votre blog).

Sur votre ordinateur : vous aurez besoin d’un interpréteur. Il s’agit d’un logiciel qui va vous permettre de lire votre jeu, comme un lecteur vidéo vous permet de lire un fichier MP4.

Un bon interpréteur est le logiciel Lectrote, qui fonctionne sous Windows, macOS et Linux :

https://github.com/erkyrath/lectrote/releases

Pour d’autres interpréteurs, allez voir sur notre page d’aide dédiée.

Et si vos joueurs préfèrent ne rien avoir à installer, il reste la version en ligne.

Le format Glulx (extension .ulx ou .gblorb) est en fait interprété par une machine virtuelle (à l’instar d’un programme en java), et des interpréteurs pour cette machine existent pour presque toutes les plates-formes existantes (Windows, macOS, Linux, Android, iOS, FreeBSD, Nintendo DS, Pocket PC, ou même Atari et Amiga). Le gros avantage, c’est qu’en plus de pouvoir être interprété dans un navigateur, c’est le même fichier qui pourra être redistribué sur tous les systèmes d’exploitation à la fois, nul besoin de recompiler une version différente pour chaque OS.

Pour aller plus loin

Félicitations ! Vous êtes arrivés au bout de ce tutoriel !

Si vous avez aimé ce premier contact avec la fiction interactive, voici d’autres ressources disponibles pour approfondir vos connaissances en Inform 7.

Le manuel d’Inform

La ressource la plus complète à ce jour est le manuel inclus avec Inform. Pour y accéder, il suffit de cliquer sur l’onglet « Documentation ». Malheureusement, il n’est disponible qu’en anglais, et ne couvrira donc pas la traduction de la syntaxe et de toutes les instructions en français (à terme, le manuel devrait être traduit). Pour avoir la liste des correspondances français-anglais des instructions, un fichier PDF est disponible à la même adresse que l’extension française :

https://bitbucket.org/informfr/i7-french-language/src

La communauté anglophone

En anglais, il existe beaucoup plus de sites internet consacrés aux fictions interactives.

Le forum de la communauté anglophone : https://intfiction.org/ ;

L’IFDB, une base de données contenant toutes les fictions interactives ainsi que des critiques : http://ifdb.tads.org/ ;

L’IFWiki : http://ifwiki.org/index.php/Main_Page.

Et la communauté francophone !

Bien évidemment, de nombreuses ressources sont disponibles en français. Vous trouverez sur ce site de nombreux articles concernant la fiction interactive, et des personnes sont prêtes à vous aider sur notre forum ou sur Discord, où vous pourrez également présenter vos projets.

Étendre les possibilités d’Inform

Si vous souhaitez étendre les possibilités d’Inform, de nombreuses extensions sont disponibles. Cliquez sur l’onglet « Extensions » puis sur « Public Library » en haut à droite. Encore plus d’extensions sont disponibles à l’adresse suivante (ne téléchargez pas les extensions sur le site officiel d’Inform 7, elles ne sont pas à jour) :

https://github.com/i7/extensions

Conclusion

Nous espérons que vous avez apprécié ce tutoriel. Restez à l’affût des prochains qui paraîtront régulièrement sur le site, et n’hésitez pas à nous communiquer vos remarques en commentaires !

Les supports, les contenants et les clefs avec Inform 7

Nathanaël Marion

Aujourd’hui, nous allons nous intéresser à certains types d’objets particuliers, à savoir les supports et les contenants. Nous verrons également comment implanter des coffres verrouillés ou tout objet apparenté.

Les supports et les contenants

Les supports

Les supports sont des objets sur lesquels peuvent être posées des choses. Ils peuvent servir à représenter des tables, des plateaux, des estrades…

Voici comment créer un support :

L' autel est un support. L'autel est dans le temple.

Attention, il n’est pour l’instant pas possible de spécifier le lieu d’un support directement avec L' autel est un support dans le temple. La raison est qu’Inform penserait que le verbe est « to support » et créerait une chose nommée « dans le temple » posé sur un support nommé « L’autel est un ».

Il ne nous reste plus qu’à mettre des objets sur l’autel, avec le verbe « être sur » :

L' idole (f) est une chose sur l' autel

[ou, de manière équivalente :]

L' autel supporte l' idole (f).

Nous pouvons également tester si quelque chose est sur un support:

 si l' idole est sur le support:

 […]

Le joueur peut, lui, mettre des objets sur un support avec l’action putting it on (et bien sûr les reprendre avec l’action taking). Par exemple :

After taking l' idole:

 maintenant la stèle est fermée;

 maintenant la stèle est verrouillée;

 dire "Le sol se met à trembler au moment où vous vous emparez de la statuette, et une lourde stèle tombe et bloque la sortie[_]!".

After putting l' idole on l' autel:

 maintenant la stèle est ouverte;

 maintenant la stèle est déverrouillée;

 dire "Vous reposez l'idole et la stèle se relève. Serait-il impossible de sortir d'ici avec le trésor[_]?".

Par défaut, un support est fixé sur place, il ne sera donc pas possible de se balader avec l’autel dans sa poche. Si nous voulions, mettons, une assiette, il suffirait de la déclarer comme portable.

Les contenants

Les contenants sont très similaires aux supports, mais sont un peu plus compliqués puisqu’ils peuvent être ouverts et fermés.

Voici la liste des propriétés qu’un contenant possède :

ouvert/fermé : le joueur ne peut pas toucher le contenu d’un contenant fermé.

ouvrable/non ouvrable : il est impossible d’ouvrir ou de fermer un contenant s’il n’est pas ouvrable.

verrouillé/déverrouillé : le joueur ne peut pas ouvrir un contenant verrouillé.

verrouillable/non verrouillable : le joueur ne pourra pas fermer à clef ou déverrouiller un contenant non verrouillable

transparent/opaque : le joueur peut voir le contenu d’un contenant fermé s’il est transparent (une vitrine ou une cage, par exemple).

Le mot « ouvrable » n’a pas ce sens-là en français, et je cherche un meilleur mot. Si vous en avez un, n’hésitez pas à l’indiquer !

Par défaut, un contenant est ouvert, non ouvrable, déverrouillé, non verrouillable et opaque, un peu comme un bac.

Sans plus tarder, voici un petit exemple :

Le sarcophage est un contenant fermé ouvrable dans le temple.

La momie est dans le sarcophage. Le sarcophage contient l' amulette (f).

[« être dans » revient au même que « contenir » (avec les objets inversés, bien sûr).]

L’action permettant de mettre un objet dans un contenant est inserting it into (et non « putting it in », attention !).

Instead of inserting l'amulette into le socle:

 […]

Propriétés s’appliquant à la fois aux contenants et aux supports

Il est possible de limiter le nombre maximum d’objet pouvant se trouver sur un support ou dans un contenant avec la propriété carrying capacity, qui est un nombre :

La carrying capacity de l' autel est 3.

Par défaut, il n’y a pas de limites. Par ailleurs, les personnes possèdent également cette propriété. On peut l’utiliser si on ne veut pas qu’elles puissent transporter trop d’objets à la fois (mais les joueurs n’aiment en général pas les inventaires limités).

Il est également possible de permettre au joueur de monter sur un support ou d’entrer dans un contenant avec la propriété entrable.

Si un contenant ou un support entrable est assez grand et suffit à lui-même, alors il est peut-être plus judicieux d’en faire un endroit, situé à l’intérieur ou au-dessus d’un autre endroit.

Le mot « entrable » n’est pas français, et je cherche aussi un meilleur mot pour le remplacer. Si vous en avez un, n’hésitez pas à l’indiquer !

Des clefs et des serrures

Principe de base

Nous allons maintenant voir comment implanter des clefs permettant de verrouiller et déverrouiller des contenants ou des portes.

Il faut tout d’abord nous assurer que le contenant est verrouillable (sinon tout ce que nous faisons en ce moment ne servirait à rien) et ouvrable (sinon le joueur pourra déverrouiller le contenant mais pas l’ouvrir, ce qui serait un peu stupide). Il suffit ensuite de créer une clef et de dire qu’elle ouvre le contenant en question.

Le coffre est un contenant fermé ouvrable verrouillé verrouillable fixé sur place dans le temple.

La clef est une chose sur l' autel. La clef ouvre le coffre.

N’importe quoi peut être une « clef », même une personne si ça vous chante ! Mais dans ce dernier cas, le joueur ne sera pas en mesure de l’avoir dans son inventaire, donc la personne-clef sera inutilisable…

Nous aurons en jeu :

>pr clef

Voilà qui est fait.

>déverrouiller coffre avec clef

Vous déverrouillez le coffre.

>ouvrir coffre

Vous ouvrez le coffre.

Extensions utiles

On pourrait remarquer que c’est un peu lourd d’avoir à effectuer toutes ces actions pour ouvrir le coffre. Pour automatiser certaines choses (si on veut que le joueur essaie de déverrouiller le coffre automatiquement avant de l’ouvrir, ou qu’on n’ait pas à préciser la clef lors du déverrouillage), il est possible d’utiliser l’extension Locksmith d’Emily Short, incluse avec Inform.

Une autre extension, Skeleton Keys d’Emily Short, peut être utile si on veut plusieurs clefs pour une même porte. En effet, par défaut, il ne peut y avoir qu’une clef par porte (mais une clef peut ouvrir plusieurs portes).

Dernières remarques

Pour terminer, quelques considérations.

D’autres types de contenants

Il existe deux types spécifiques de contenants dans Inform. Le premier est le véhicule. Il s’agit d’un contenant toujours entrable et dans lequel le joueur peut se déplacer (sans avoir à en sortir). Le second est le fourre-tout, qui est utile si le joueur a un inventaire limité ; il mettra alors automatiquement les objets en trop dans un fourre-tout s’il en possède un avant de prendre un objet.

Pour plus d’informations sur les supports et les contenants, vous pourrez vous référer au chapitre 3 de la documentation d’Inform, notamment la section 5, 6, 12, 13, 16 et 29. Eh oui, nous avons vu beaucoup de choses, mine de rien !

L’auteur peut tout faire

N’oubliez pas qu’en tant qu’auteur, vous possédez tous les pouvoirs (pour votre fiction interactive seulement, bien sûr !). Cela signifie par exemple que vous pouvez ouvrir une porte non ouvrable depuis le code :

 maintenant [votre objet] est ouvert.

Cela peut servir, entre autres, pour une porte qui ne peut être ouverte conventionnellement et qui s’ouvre après une action particulière.

Vous pouvez également mettre plus d’objets dans un contenant que son carrying capacity le permet. Le joueur pourra les prendre, mais pas tous les remettre. Peut-être pour une valise pleine à craquer ?

Une énigme éculée

Enfin, bien que des portes verrouillées puissent être utiles, n’en abusez pas ! Évitez d’écrire une fiction interactive où il faut trouver une clef pour ouvrir la porte menant à la section suivante, où il faudra trouver la prochaine clef pour ouvrir… Trouver des clefs doit faire partie des énigmes les plus éculées du domaine !

Et nous nous quittons sur ces bonnes paroles !

Éviter le code dupliqué avec Inform 7

Nathanaël Marion

Nous allons aujourd’hui voir comment réutiliser des parties de notre code à plusieurs endroits de notre source, sans avoir à les réécrire à chaque fois.

Pour cela, nous allons utiliser des expressions (« phrases » en anglais).

Dans Inform 7, une expression est un ensemble d’instructions que l’on peut réutiliser facilement, sans avoir à toutes les retaper.

Créer une expression

Le type d’expression le plus simple se crée en tapant dans le code To suivi de n’importe quels mots puis d’un deux-points, un peu comme une règle. Doivent suivre ensuite une série d’instructions, indentées, encore une fois comme dans une règle.

To déclencher le piège:

 maintenant la trappe est fermée;

 maintenant la trappe est verrouillée;

 maintenant les oubliettes sont sombres;

 dire "Soudainement, la trappe se referme, vous plongeant dans l'obscurité[_]!".

Avec cela, l’instruction déclencher le piège; (c’est-à-dire les mots que nous avons écrits après To) est utilisable dans le reste de notre source, par exemple dans d’autres règles :

Before opening le coffre:

 déclencher le piège.

Instead of pulling le levier:

 déclencher le piège.

Ainsi, ouvrir le coffre et tirer le levier déclencheront le piège, sans que nous ayons eu à nous répéter. De plus, cela facilite la maintenance du code ; si jamais nous voulons modifier ce qu’il se passe lorsque le piège se déclenche, il suffit de le faire une seule fois dans l’expression, plutôt que dans chaque règle qui fait se déclencher le piège.

Des expressions non fixées

Imaginons maintenant que nous avons plusieurs pièges, et que la porte qui se referme est différente selon celui qui est déclenché. Faudra-t-il créer une expression pour chacun d’eux, comme ce qui suit ?

To déclencher le piège de la trappe:

 maintenant la trappe est fermée;

 […]

To déclencher le piège du portail:

 maintenant le portail est fermé;

 […]

Vous vous en doutez, la réponse est non. Il suffit de faire une expression qui n’a pas une forme fixe.

To déclencher le piège du/de/des (sortie - une porte):

 maintenant la sortie est fermée;

 maintenant la sortie est verrouillée;

 maintenant la location est sombre;

 dire "Soudainement, [la sortie] se referme, vous plongeant dans l'obscurité[_]!".

L’expression agit maintenant comme une phrase à « trous ». Ces trous sont entre parenthèses et contiennent deux éléments séparés par un trait d’union. Le premier est le nom qui sera utilisé dans l’expression pour se référer à ce qui comblera le trou quand on utilisera l’expression, et le second est le type que le trou accepte.

Avec cette expression, nous serons en mesure d’écrire :

Instead of pulling le levier:

 déclencher le piège de la trappe.

After entering la plateforme:

 déclencher le piège du portail.

Dans le premier cas, sortie fera référence à la trappe ; dans le second, au portail.

Et hors de l’expression, sortie ne signifiera rien.

Enfin, il est possible d’autoriser plusieurs formulations pour une expression en donnant plusieurs options pour un mot, séparées par des barres obliques. Ici, nous permettons l’emploi de plusieurs prépositions.

Cette syntaxe pour des expressions non fixée est aussi valable pour les types d’expressions présentés plus bas.

Des expressions qui font un choix

Il est également possible d’avoir des expressions renvoyant une valeur. Elles prennent la forme suivante :

To decide what type is nom arbitraire:

 […]

 se décider pour la valeur à renvoyer.

Par exemple :

La maison est un endroit. La voisine est une femme. Le facteur est un homme. Le voleur est un homme. Le chat est un animal. Le facteur porte la lettre. Le player porte le diamant.

To decide what personne is le prochain visiteur:

 si le player ne porte pas la lettre:

 se décider pour le facteur;

 sinon si le player porte l' argent:

 se décider pour le voleur;

 sinon si le player porte le poisson:

 se décider pour le chat;

 sinon:

 se décider pour la voisine.

Avec cela, nous pourrons écrire :

Every turn:

 si le prochain visiteur est le chat:

 dire "Vous entendez un miaulement.";

 maintenant le prochain visiteur est dans la maison.

Ici, le prochain visiteur est une certaine personne, déterminée selon certaines conditions ; puis, à chaque tour, on affiche un message si le prochain visiteur est le chat et on amène le prochain visiteur dans la maison (bien sûr, l’exemple est très simpliste ; ça ne s’arrêtera jamais, donc ça finirait avec la voisine remise dans la maison à chaque tour, même si elle y est déjà).

Des expressions pour dire des choses

Nous finissons ce tutoriel avec des expressions permettant de créer des substitutions de texte. Elles doivent commencer par To dire.

To dire avertissement:

 dire "Attention, défense d'entrer !".

Cela créera la substitution "[avertissement]", qui affichera le texte « Attention, défense d’entrer ! ». Nous pourrons ainsi afficher ce texte dans plusieurs endroits du jeu sans avoir à le retaper ; pratique si ce texte revient souvent ! On peut faire quelque chose de plus compliqué, en faisant varier le texte sous certaines conditions, comme avec l’expression de la section précédente.

Pour en savoir plus

Pour en savoir plus sur les expressions, vous pouvez aller voir les sections 1, 2, 3, 16 et 17 du chapitre 11 de la documentation d’Inform. De plus, la section 11.15 explique une notion utile, les variables temporaires. Il y aura peut-être un tutoriel qui parlera de cela plus en détail un jour !

Le texte dans Inform 7

Le texte est bien évidemment un élément important dans une fiction interactive, et une grande partie de votre source consistera en le texte que le joueur verra à l’écran. Voici donc un tutoriel simple consacré à cela. Il aura surtout l’air d’une liste pas très interactive, mais il présentera des éléments essentiels pour écrire un jeu avec Inform.

Les caractères impossibles à taper directement

Comme nous l’avons vu dans le tutoriel d’introduction à Inform 7, tous les textes qui seront affichés en jeu seront écrits entre guillemets droits. Il est possible d’y mettre à peu près n’importe quoi, à quelques exceptions près.

Les crochets

Dans les textes, ce qui est entre crochets est appelé une substitution et a une signification spéciale ; ce qui est entre crochet ne sera donc pas affiché littéralement. Un exemple est [si condition], que nous avons déjà vu auparavant.

Pour avoir un crochet dans son texte, il faut donc écrire ceci

 dire "[crochet]Ce texte est entre crochets.[crochet fermant]";

Les espaces insécables et les tirets

Les espaces insécables et les tirets dans la source sont convertis en espaces normales et en traits d’union, respectivement, à la compilation. Pour éviter ce comportement, deux substitutions sont créées par l’extension française : "[_]" pour une espace insécable, et "[--]" pour un tiret (plus précisément, un tiret cadratin).

Petit rappel sur l’utilisation de ces caractères :
Il faut des espaces insécables devant les points d’exclamation et d’interrogation, les deux-points, les points-virgules et les symboles d’unité, entre autres. Il en faut aussi après un guillemet ouvrant et avant un fermant.
Le tiret s’utilise dans les dialogues et séparer du texte du reste de la phrase. N’utilisez pas des traits d’union dans ce cas !

Les apostrophes

Il est impossible de taper des guillemets droits dans un texte, car Inform penserait qu’ils marquent sa fin. C’est pourquoi les apostrophes qui ne sont pas à l’intérieur de mots sont convertis en guillemets droits lors de l’affichage. Par exemple,

Instead of examining le panneau pour la première fois:

 dire "Vous lisez l'inscription à voix haute[_]: «[_]Il est écrit 'Défense d'entrer'.[_]»

affichera :

>x panneau

Vous lisez l'inscription à voix haute : « Il est écrit "Défense d'entrer". »

Remarquons que les apostrophes sont restées dans « l’inscription » et « d’entrer », car elles se situent dans des mots.

Petit rappel concernant l’utilisation des guillemets :
En français, on utilise des guillemets en chevrons, comme ci-dessus. Les guillemets droits ne s’utilisent que lorsqu’il faut des guillemets de deuxième niveau (à l’intérieur d’autres guillemets, comme dans l’exemple).

Si jamais nous voulons forcer l’affichage d’une apostrophe, il existe la substitution "[']". Elle est rarement utilisée car, en français les apostrophes sont en général dans des mots.

Dire des valeurs

Il est possible d’afficher n’importe quel objet ou valeur dans un texte en le plaçant entre crochets :

Instead of jumping:

 dire "Vous sautez [9] fois sur le [chemin].".

[Il faut bien sûr qu'il y ait un objet appelé « chemin » dans le jeu.]

Ceci affichera « Vous sautez 9 fois sur le chemin ». Cela semble inutile comme cela, mais c’est parce que nous avons utilisé des valeurs fixes. Si nous ne connaissons pas à l’avance ce qui sera affiché, cela est très pratique. On pourrait par exemple afficher l’attaque de notre vieille connaissance le div :

La description du div est "Par un étrange pouvoir de clairvoyance, vous déterminez que le div a une attaque de [attaque du div]."

Ce qui est dans les crochets pourra être remplacé par « 4 », « 1 », etc., en fonction de l’attaque actuelle du div.

Ce genre de substitution peut être utile si le printed name d’un objet change en cours de jeu. Ainsi, "[chemin]" pourrait afficher « chemin » ou « chemin vers la crypte » si jamais on change son nom après que le joueur a visité la crypte.

Avoir le bon déterminant

Si l’on souhaite afficher le nom d’un objet n’étant pas connu d’avance, il suffit de précéder l’objet par le déterminant dans la substitution.

Instead of pushing un support:

 dire "[Le noun] est très bien ici.".

Le noun est l’objet concerné par l’action en cours, ici le support étant poussé.

Si le joueur pousse la table, cela affichera « La table est très bien ici ». S’il s’agit d’un bureau, alors ce sera « Le bureau ». Si le support possède un nom propre, alors le déterminant ne s’affichera pas.

Il est possible d’utiliser un déterminant indéfini (une, une, des) ou défini (le, la, les) ; Il est aussi possible d’utiliser à/au/aux et de/du, pour afficher la préposition sous la forme appropriée. Un dernier exemple :

Instead of taking une chose sur l' autel:

 dire "Une flamme émane [du noun], vous dissuadant."

Cela pourra afficher « de la statuette » ou « du saphir », par exemple.

Enfin, mettre une majuscule au déterminant dans la substitution permet d’avoir une majuscule au texte affiché.

Dans la substitution, utiliser le féminin, le masculin ou le pluriel revient au même. "[le noun]" ou "[la noun]" fera exactement la même chose, afficher le noun avec le bon déterminant, en fonction de s’il est masculin ou féminin. Vous pouvez donc choisir le genre qui vous paraît le plus naturel dans ces substitutions.

Les nombres en lettres

Il est possible d’écrire les nombres (et les heures) en toutes lettres. En effet, il convient de les écrire ainsi dans les textes, surtout si les nombres sont petits.

La description du div est "Le div a [attaque du div en lettres] point[s] d'attaque.".

"[nombre en lettres]" affiche donc le nombre en question en lettres. La substitution "[s]" affiche un « s » si le dernier nombre affiché est plus grand que 1, sinon elle n’affiche rien ; cela est très utile pour les pluriels.

Mise en forme du texte

Des sauts de lignes

Inform place automatiquement des sauts de ligne à certains endroits, afin de garantir une mise en page uniforme à travers une fiction interactive. Inform ajoute notamment un passage à la ligne après tout texte qui se termine par un point (normal, d’interrogation ou d’exclamation). Ainsi,

 dire "Salut"

 dire "Salut."

affichera « SalutSalut. » sans passage à la ligne entre les deux car le premier texte ne se termine pas par un point.

Ceci est important ! Si vous tapez une espace après vos points à la fin d’un texte, il n’y aura pas de saut de ligne car le dernier caractère affiché n’est plus un point !

Il est possible d’ajouter manuellement des passages à la ligne avec la substitution "[à la ligne]" et des sauts de paragraphes avec "[saut de paragraphe]".

Il existe d’autres substitutions moins utilisées concernant les sauts de ligne ; vous pourrez en savoir plus dans la section 5.8 du manuel.

Des styles de caractères

Pour finir, les substitutions permettant de changer le style du texte.

"[gras]" permet de mettre le texte qui suit en gras, "[italique]" permet de mettre le texte qui suit en italique et "[romain]" permet de le mettre en romain, c’est-à-dire en lettres « normales », par défaut, et d’ainsi annuler le gras et l’italique.

De plus, il est possible d’utiliser une police à largeur fixe avec (sans surprise) "[largeur fixe]" et d’annuler cet effet avec "[largeur variable]".

Il est impossible de combiner ces effets (comme de l’italique en gras), mais il est possible de définir d’autres styles afin de changer la couleur, l’indentation ou autre avec l’extension Glulx Text Effects incluse avec Inform.

Conclusion

Nous arrivons à la fin de ce tutoriel. Nous avons couvert les substitutions les plus communes mais, si jamais vous souhaitez approfondir le sujet, vous pouvez aller lire le chapitre 5 de la documentation. À la prochaine !

Trizbort, plus qu’un simple outil de cartographes

Hugo Labrande

Aujourd’hui, parlons d’un outil relativement récent : Trizbort. Certes, le nom ne donne pas envie (ah, ces anglophones et leurs références obscures à des jeux Infocom), mais il s’agit d’un outil de dessin de cartes, bien fait et avec quelques fonctionnalités très chouettes.

Carte de ma fiction interactive Tipelau, un jeu très cool.

Avant toute chose, il faut que je vous l’avoue, c’est un outil qui ne marche que sous Windows, hé oui… J’ai déjà essayé de le compiler pour Linux avec Mono, mais ça n’a pas marché (une sombre histoire de bibliothèques partagées non portables *grommelle grommelle*). Si jamais il y a un développeur C# dans le coin qui veut regarder, je lui serai très reconnaissant !

Bref, reprenons. Dans la plupart des fictions interactives avec analyseur syntaxique, on se déplace énormément de salle en salle, en parcourant la géographie de part et d’autres, et parfois même en tournant en rond. À mesure que l’on bouge, on essaie de se faire une carte mentale des lieux que l’on rencontre. C’est parfois pas facile — et c’est ce qui est parfois exploité et transformé en énigme, notamment dans les sections « labyrinthe » — mais, parfois, si la carte du jeu est trop grande, le joueur normalement constitué se décourage, submergé par la quantité d’informations à retenir (pour moi, c’est Inside Woman et Worldsmith).

Donc, il est souvent nécessaire de faire une carte ; les joueurs aguerris ont toujours eu un bout de papier à portée de main, et finissent avec un bureau couvert de notes (vous pouvez voir des exemples sur le site de David Welbourn, joueur vorace et très méticuleux qui a scanné toutes ses notes de jeu récemment). C’est le problème que veut résoudre Trizbort : il s’agit à la base d’un logiciel pour tracer des cartes au fur et à mesure que vous explorez le jeu, que vous puissiez vous y retrouver. Il y a même une fonction incroyable, l’auto-mapping : lancez le jeu dans un interpréteur, allumez la transcription (« transcript on », normalement), puis ouvrez Trizbort et dites-lui où est le fichier de transcription : Trizbort s’occupe de dessiner la carte tout seul au fur et à mesure !

Trizbort est très simple d’utilisation. Lancez-le, et vous vous retrouvez face à un canevas vide. Créez une salle en appuyant sur R, puis appuyez sur Entrée : vous pouvez alors changer le nom de la salle, mettre des indications, sa description (qui apparaîtra quand vous passez la souris sur la boîte), etc. Vous pouvez aussi faire une liste des objets dans la salle, ce qui peut vous aider pour les jeux avec beaucoup d’énigmes à la fois ou beaucoup de choses qui pourraient être utiles mais pour lesquelles vous devrez revenir plus tard : la règle, c’est un objet par ligne, et si un objet est dans un autre, on l’écrit dessous et avec une espace en plus au début de la ligne. Vous pouvez aussi, si le cœur vous en dit, changer le style de boîte (bords ronds, en pointillé, etc.) pour distinguer certaines salles visuellement ; ça peut vous servir si vous vous créez un code (« les salles secrètes en ellipse », par exemple), ou si vous voulez faire une jolie carte de votre jeu afin de pouvoir la donner au joueur avec votre jeu (ou la faire payer, si vous êtes comme ça). Bref, beaucoup d’options pour ajouter des informations et des annotations à votre carte.

Ma première pièce avec Trizbort !

Ensuite, vous pouvez en créer une autre, et faire de même. Et pour les relier, vous avez le choix : vous pouvez soit sélectionner les deux salles et appuyer sur J et laisser Trizbort faire le lien, soit dessiner à la main, en cliquant sur un des points d’accroche qui apparaissent quand vous passez la souris sur une salle, et en tirant le lien. Les liens persisteront, même si vous décidez de bouger une salle, de réorganiser toute une section (vous pouvez sélectionnez plusieurs salles et les déplacer, pas de souci), ou agrandir ou diminuer la taille d’une boîte ! L’outil est vraiment flexible et vous permet de faire beaucoup de choses graphiquement avec les boîtes.

Le reste de ma maison est en passe d’être raccordé…

J’ai déjà vu certains articles expliquant que l’on pouvait utiliser Twine pour faire des dessins de boîtes reliées entre elles, pour plusieurs applications (flowchart du jeu, dépendance entre les énigmes, etc.). J’aurais tendance à dire personnellement que Trizbort est plus flexible graphiquement (plein de couleurs, de types de boîtes, de types de liens), et permet de coder plus d’informations différentes, donc c’est vraiment un outil à ne pas négliger ; en revanche, il est peut-être moins portable (Windows seulement, alors que Twine fonctionne même dans un navigateur), et Twine permet de générer une page web avec les liens cliquables, ce qui peut être utile pour simuler l’expérience utilisateur. Bref, à ne pas négliger pour des utilisations qui ne sont pas forcément des cartes.

Une autre carte, celle de Jason Dyer jouant à Adventure 501, créée avec Trizbort.

Enfin, je ne peux pas parler de Trizbort sans évoquer une fonctionnalité extraordinaire, qui a changé la façon dont je travaille : l’export de code. Oui, vous pouvez dessiner la carte d’un jeu, avec les bons noms, les descriptions, et la liste des objets, et ensuite demander à Trizbort d’exporter le code vers un langage de programmation de fiction interactive à analyseur syntaxique ! Beaucoup de langages sont pris en charge : Inform 6 et Inform 7 (code en anglais), TADS, Alan, Hugo et ZIL.

Ceci fait que vous pouvez utiliser Trizbort comme un outil de prototypage : faites une ébauche de carte pour votre jeu, mettez les quelques objets dont vous aurez besoin dans le jeu, et exportez le code, et vous avez maintenant le squelette de votre jeu, à remplir avec toute la logique du jeu et les interactions — ça vous donne une bonne longueur d’avance, sans avoir eu à toucher au code !

Bref, que vous soyez joueur ou auteur, Trizbort est un outil moderne qui gagne à être connu et peut vous être très utile !

Les bases pour créer une action avec Inform 7

Nathanaël Marion

Rappel : comment modifier le comportement normal d’une action

Dans la deuxième partie du tutoriel d’introduction à I7, nous avons vue qu’il existe trois façons de modifier le comportement d’une action : les règles before, instead et after.

Une règle before se déroule avant qu’une action ait lieu, mais n’empêche pas son déroulement ; l’action poursuivra son déroulement normal.

Une règle instead empêche le déroulement d’une action en faisant autre chose à la place.

Une règle after se déclenche après que l’action a réussi et fait son effet, mais avant que le message l’indiquant soit affiché. Par défaut, ce dernier ne le sera pas sauf si l’on écrit continuer l'action;.

Si vous ne vous en souvenez plus, n’hésitez pas à relire la section correspondante du tutoriel en lien.

Enfin, n’oubliez pas la syntaxe pour écrire une règle : le préambule directement dans la source et suivie d’un deux-points, des expressions indentées et séparées par des points-virgules, et un point à la fin :

La chambre est un endroit. Le bureau est un support. Le bureau est dans la chambre. Le stylo est une chose.

Instead of looking under le bureau when le stylo est hors scène:

 [« hors scène » veut dire que le stylo n'est dans aucun endroit.]

 maintenant le player porte le stylo;

 dire "Vous vous baissez et chercher sous votre bureau. Ah[_]! Le stylo qui vous a échappé est ici. Vous le récupérez.".

Voilà, maintenant que cela est dit, voyons comment créer ses propres actions, et comment définir leur comportement standard.

De nouvelles actions

Créer des actions

Commençons d’emblée par un exemple :

Smiling is an action applying to nothing.

Photographing is an action applying to one thing.

Photographing it with is an action applying to two things.

Ce code crée trois actions : l’action smiling (« sourire »), photographing (« photographier ») et photographing it with (« photographier quelque chose avec »).

Ici, la première ne concerne aucune chose (comme sauter), la deuxième, une seule (comme examiner) et la troisième, deux (comme déverrouiller quelque chose avec). Le mot it dans la dernière est important : il permet de montrer à Inform où doit se trouver le premier objet. Ainsi, on écrira Instead of photographing la fleur with le polaroid. De plus, il faut que le nom de l’action se termine en -ing (que ce soit un mot en anglais ou inventé ; on pourrait utiliser « souriring » si on le voulait).

Les deux dernières actions sont bien distinctes, malgré le fait qu’elles commencent par le même mot.

Vous pouvez maintenant compiler et tester tout ça… et vous vous rendrez compte qu’il n’y a aucun moyen d’effectuer ces actions !

Il faut en effet ajouter quelques lignes de compréhension.

Ajouter des commandes

Encore une fois, un exemple sera sûrement plus clair que de longues explications :

Comprendre "sourire" comme smiling.

Comprendre "photographier [quelque chose]" comme photographing.

Comprendre "photographier [quelque chose] avec [quelque chose]" comme photographing it with.

Ce qui est entre crochet représente les objets auxquels vont s’appliquer les actions. Testons ce code (en ajoutant des objets pour prendre des photos) :

>sourire

>photographier la fleur

>

Il ne se passe rien ! C’est normal : les actions ont bien eu lieu, mais elles ne font rien car nous n’avons pas écrit de règles pour elles.

Avant de passer à la suite, n’hésitez pas à ajouter d’autres commandes pour ces actions, comme « prendre en photo », afin de vérifier si vous avez bien compris.

Les règles définissant le comportement normal d’une action

Il existe trois livres de règles pour définir comment doit se dérouler une action : les règles check, carry out et report.

Pourquoi ne pas utiliser les règles que nous avons déjà vues, comme instead ou before ? La réponse est simple. Ces règles sont là pour créer des exceptions (si on prend une bombe, elle explose plutôt que d’aller dans l’inventaire). Les règles introduites dans cette section définissent le comportement normal, générique d’une action. Cela permet une séparation claire, avec moins de risques d’interférences entre les règles.

Les règles check

Les règles check doivent vérifier que certaines conditions sont remplies, et interrompre l’action en indiquant pourquoi si ce n’est pas le cas. Si tout va bien, on ne fait rien.

[On crée une propriété pour pouvoir savoir ce qui a été pris en photo.]

Une chose peut être photographié. Une chose est rarement photographié.

Check photographing:

 [Le noun est l'objet de l'action. Le deuxième objet, s'il y en a un, est le second noun.]

 si le noun est photographié, dire "Vous avez déjà pris [le noun] en photo." instead.

Ici, on vérifie si l’objet en question est photographié, et on affiche un message si c’est le cas. Le mot instead à la fin permet de faire arrêter l’action.

Ce mot instead n’a rien à voir avec la règle du même nom ! Il s’agit ici d’une indication qui dit à Inform d’arrêter l’action. Il faut la mettre à la fin d’une instruction, et elle ne s’utilise en général que dans les règles check.

À vous de jouer ! Testez tout d’abord la règle que nous venons d’écrire, puis créez d’autres règles pour vérifier si le joueur possède bien un appareil photo (qui pourra peut-être être un type d’objet), ou s’il essaie de photographier un appareil photo avec ce même appareil photo (pour l’action s’appliquant à un seul objet, il faut vérifier si le joueur a un autre appareil à disposition ou pas ; pour l’action s’appliquant à deux objets, il suffit de comparer le noun et le second noun).

Le mieux est de créer une nouvelle règle par condition, plutôt que d’utiliser une seule méga-règle qui vérifie tout. Vous ne devriez en général pas avoir à vous soucier de leur ordre.

Les règles carry out

Si l’action passe toutes les règles check (et qu’il n’y a pas de règles instead), elle est considérée comme ayant réussi, et les règles carry out sont exécutées.

Ces règles sont là pour appliquer les effets de l’action, pour modifier le monde en conséquence. Il ne faut cependant pas afficher de message.

Carry out photographing:

 maintenant le noun est photographié.

Vous pouvez vous amuser à ajouter d’autres choses, si vous avez d’autres idées (par exemple, faire diminuer le nombre de photos restantes de l’appareil utilisé — qui serait une propriété — ; il faudra encore une fois distinguer les deux actions permettant de photographier).

Les règles report

Les règles report sont exécutées après les règles carry out. Leur seul rôle est d’afficher un message au joueur, lui indiquant que l’action a bien eu lieu.

Report photographing:

 dire "Clic[_]! Vous prenez [le noun] en photo.".

Les règles report ne sont pas atteintes s’il y a eu une règle after auparavant (sauf si l’on écrit continuer l'action;). C’est pour cela que le message par défaut n’est pas affiché dans ce cas.

Quelques remarques générales

Une histoire de conventions

Est-il vraiment interdit d’afficher une réponse lors d’une règle carry out ? Bien sûr que non. Bien que ces règles ont toutes un usage bien spécifique, Inform ne force rien. Il ne s’agit que de conventions — qu’il vaut bien sûr mieux de respecter.

Parfois, c’est subjectif. Doit-on utiliser une règle instead ou carry out si l’on veut faire exploser une bombe quand on la prend ? Il s’agit bien d’une exception, puisque la bombe ne va pas dans l’inventaire, elle fait terminer la partie. Mais en même temps, c’est bien le comportement normal d’une bombe d’exploser… J’utiliserais ici une règle instead — sauf peut-être si une bombe est un type d’objet et que toutes les bombes se comportent comme cela — mais les deux fonctionnent. Mieux vous comprendrez les rouages d’Inform, plus vous saurez faire un bon choix.

Il n’est pas requis d’utiliser toutes les règles

Notre action de sourire n’a vraisemblablement pas besoin de règles check ou carry out : n’importe qui peut sourire, quand il veut, et cela ne fait rien de spécial. Une règle report suffira.

Le joueur ne peut pas deviner les commandes

Si vous créez de nouvelles actions, alors il faut trouver un moyen d’indiquer au joueur quelles commandes il peut utiliser. Cela peut se faire directement dans un texte d’aide, ou bien être suggéré plus subtilement par certains objets et descriptions. S’il y a un appareil photo dans le jeu, le joueur essaiera vraisemblablement de photographier des choses, même si l’objet n’était là que pour la décoration.

Pour aller plus loin

Le chapitre « Advanced Actions » de la documentation couvre la création d’actions (ainsi que d’autres choses, comme des actions effectuées par des ). Il explique également d’autres notions, plus rarement utiles, comme les actions « hors du monde » (telles que sauvegarder) ou les variables d’action, ainsi que la notion de visibilité.

De plus, la section 17.6 explique comment créer une action s’appliquant à des valeurs, comme un nombre.

Amusez-vous bien !

Créer de nouveaux types dans Inform 7

Nathanaël Marion

Tous les objets que nous manipulons dans Inform ont un type. Nous avons ainsi déjà vu la chose, la personne et le contenant, pour ne citer que ceux-ci. Il existe également des types plus abstraits, comme le texte ou le nombre.

Mais que faire si les types par défaut d’Inform ne sont pas suffisamment ? Il nous suffit de créer nos propres types.

Pourquoi créer des types ?

Il arrive régulièrement que nous voulions que toute une série d’objets dans notre jeu se comporte de la même façon et suive des règles communes. Par exemple, dans Inform, tous les contenants peuvent se fermer, s’ouvrir et contenir des objets ; les appareils peuvent être allumés ou éteints.

Créer des types d’objets « physiques »

Tous les objets qui constituent le monde virtuel du jeu et avec lesquels le joueur peut interagir sont du type objet (sans surprise). Ce type se ramifie en plusieurs sous-types : endroit, chose, direction et région. Les choses possèdent encore plus de sous-types.

Pour créer un nouveau type, il faut choisir de quel autre type il descend. Cela sera en général chose (ou plus précis).

Par exemple, si notre jeu contient de nombreux trésors et que nous voulons en piéger certains, nous pourrions spécifier les coffres piégés un à un, ou nous pourrions créer un nouveau type, qui servira de modèle à tous nos pièges :

A trapped chest is a kind of container.

A trapped chest translates into French as un coffre piégé.

Il est recommandé de créer son type en anglais, et d’en indiquer la traduction juste après. Cela permet à Inform de faire les accords comme il faut. Si nous avions écrit directement A cheval is a kind of thing, Inform appliquerait les règles de l’anglais et pensera que le pluriel est « chevals » plutôt que « chevaux ».

Maintenant, il nous est possible de créer des coffres piégés où nous le voulons :

Les Oubliettes sont un endroit.

La malle est un coffre piégé dans les Oubliettes.

Mais cela sert-il à quelque chose pour l’instant ? Eh bien non, car nous n’avons rien ajouté de spécifique à ce nouveau type de contenant. Il se comportera donc exactement comme un contenant normal.

Ajoutons donc quelques règles qui ne s’appliqueront qu’aux coffres piégés :

After opening un coffre piégé:

 dire "Alors que vous ouvrez le coffre, une explosion magique vous fait voir de toutes les couleurs[_]!".

Before examining un coffre piégé when le player porte la lentille magique:

 dire "[Le noun] semble avoir été piégé par un sortilège.".

Ajouter un when à la fin du préambule de la règle fait en sorte qu’elle ne s’exécutera que si la condition spécifiée est vraie.

Ainsi, tous nos contenants piégés se comporteront de la même façon.

Ajouter des propriétés

Comme nous l’avons déjà vu précédemment, il est possible d’ajouter des propriétés aux objets (comme l’attaque du div ou la propriété mort des personnes) :

Un coffre piégé peut être actif ou désamorcé. Un coffre est généralement actif. [Les coffres piégés sont soit actifs, soit désamorcés, et sont actifs par défaut.]

Un coffre piégé has a number called puissance. La puissance d' un coffre piégé est généralement 1. [Les coffres auront tous un nombre appelé « puissance », qui sera mis à un sauf si indiqué autrement dans la source.]

N’oubliez pas qu’Inform ne sait pas (pour le moment) accorder les propriétés créées par l’auteur ! Il vous faudra toujours les écrire de la même façon, même au pluriel ou au féminin !

Modifions donc notre code précédent.

Use scoring. [Cette option indique à Inform que nous souhaitons du score dans notre jeu.]

[…]

La puissance de la malle est 5.

After opening un coffre piégé:

 [On pénalise le joueur.]

 diminuer le score de la puissance du noun;

 dire "Alors que vous ouvrez le coffre, une explosion magique vous fait voir de toutes les couleurs[_]!".

Before examining un coffre piégé when le player porte la lentille magique:

 si le noun est actif:

 dire "[Le noun] semble avoir été piégé par un sortilège.";

 sinon:

 dire "Le sortilège qui protégeait [le noun] a été contré.".

Rendu à ce stade, vous vous êtes peut-être posé la question suivante : pourquoi avoir créé un nouveau type de contenant plutôt que d’avoir créé une propriété piégé s’appliquant à tous les contenants ? Il n’y a pas de bonne réponse à cette question, tout dépend de votre projet. Si vous pensez qu’il s’agit d’un concept général, qui peut s’appliquer à beaucoup de choses différentes, alors une propriété peut mieux convenir. Si vous pensez qu’un coffre piégé est assez spécifique, mieux vaut créer un type.

Par exemple, avec ce que nous avons écrit, seuls les coffres piégés auront une puissance, alors que tous les contenants en auraient eu une si piégé avait été une simple propriété. C’est une économie de mémoire très négligeable, mais cela illustre la différence.

Les types « abstraits »

Il est également possible de créer des types qui ne représentent rien de physique, mais qui peuvent prendre une certaine valeur parmi une liste prédéfinie. Un exemple vaut mieux qu’un long discours :

Une taille is a kind of value.

[On devrait le créer en anglais et le traduire, mais ça ne change pas grand-chose ici.]

Les tailles sont minuscule, petit, moyen, gros, énorme.

Le code ci-dessus crée un type de valeur nommé taille, qui pourra prendre cinq valeurs distinctes.

Un contenant has a taille. Un contenant est généralement moyen.

After examining un contenant:

 dire "C'est [taille du noun].".

Instead of taking un contenant when la taille du noun est plus grande que moyen:

 dire "[Le noun] est bien trop gros.".

Les types de valeurs sont très utiles quand on veut exprimer avec des mots certains concepts. On aurait pu en effet utiliser un nombre plutôt qu’un nouveau type, mais il faut alors se souvenir quel nombre correspond à « gros », et il devient plus lourd à afficher une certaine taille ("C'est [si la taille est 0]minuscule[sinon si la taille est 1]petit[sinon si …").

Voici des exemples d’utilité pour les types de valeur : les jours de la semaine, les éléments (feu, air…), les couleurs… ; de manière générale, tout ce qui peut avoir un nombre fini de valeurs différentes.

Notons que l’ordre de déclaration des valeurs a une importance : en plus de pouvoir les comparer comme plus haut, il est possible de récupérer une valeur précédant ou suivant une autre avec les expressions :

 la taille avant gros; [énorme]

 la taille après gros; [moyen]

Pas très utile ci-dessus, plus utile quand on ne sait pas à l’avance la valeur recherchée (s’il s’agit d’une propriété d’un objet, par exemple).

Pour terminer, sachez que ces valeurs peuvent avoir leurs propres propriétés :

Une taille peut être invisible. Minuscule est invisible.

[Dans une certaine règle:]

 si la taille du noun est invisible:

 […]

Conclusion

Voici pour ce bref tour sur la création des types dans Inform ! Le chapitre 4 du manuel entre plus en détail sur les types, si jamais vous voulez tout savoir sur cet aspect d’Inform.

Utiliser l’extension Inform 7 Basic Screen Effects

De base, Inform ne permet pas de modifier la façon dont la fiction interactive se présente : il s’agira toujours d’un texte qui est affiché, puis de l’invite de commande, puis la commande du joueur, puis de nouveau du texte affiché en bloc, et ainsi de suite.

Cependant, l’extension Basic Screen Effects, incluse avec Inform, permet de modifier un peu cette boucle. Voyons de suite ce qu’elle permet.

Et n’oubliez pas d’écrire dans votre source la ligne suivante afin d’inclure l’extension :

Include Basic Screen Effects by Emily Short.

Effacer l’écran

La première chose que nous pourrions avoir envie de faire est d’effacer l’écran. Cela fera en sorte de vider la fenêtre de tout son texte, comme si on venait d’ouvrir le jeu. Il faut utiliser l’expression suivante :

 effacer l'écran;

Évitez cependant d’abuser de cette fonction : effacer l’écran empêche le joueur de remonter dans la fenêtre pour revoir ses action précédentes. Si le joueur a besoin de retrouver une information obtenue auparavant, il ne pourra pas le faire puisque le texte aura disparu.

Effacer l’écran est surtout utile comme transition entre des chapitres ou lorsque un changement notable a lieu dans le jeu. Un petit exemple :

Instead of sleeping when la location est la chambre:

 effacer l'écran;

 maintenant le player est dans le rêve.

Il est également possible de n’effacer que la fenêtre principale ou la barre de statut :

 effacer l'écran principal seulement;

 effacer la barre de statut seulement;

Il est à noter que la barre de statut est mise à jour à chaque tour ; son effacement ne sera donc pas visible en général puisque qu’elle sera reremplie dès que l’invite de commande sera affichée (instantanément, donc). Cependant, cela n’est pas le cas si l’on attend que le joueur appuie sur une touche, comme nous allons le voir dans la section suivante.

Attendre une touche

Il arrive que nous ayons besoin de faire avancer l’histoire et d’informer le joueur de certaines choses en affichant beaucoup de texte d’un coup à l’écran, un peu comme l’équivalent d’une cinématique dans un jeu plus « conventionnel ». Si un textdump, comme le disent les anglophones, s’avère nécessaire, une bonne idée est d’effectuer des pauses régulières.

When play begins:

 dire "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ac elit lectus. Morbi non rutrum magna. Sed laoreet velit ut metus blandit, id tristique erat convallis. Cras sed semper dui. Nulla eu ante vitae purus volutpat commodo.";

 attendre une touche;

 dire "Duis vestibulum scelerisque ligula eu condimentum. Curabitur ut interdum metus, id venenatis justo. Pellentesque luctus faucibus ipsum vitae volutpat. Nunc et nibh a massa sodales tristique. In eu sagittis ex, non mollis neque. Vivamus efficitur auctor mi et imperdiet.";

 attendre une touche;

 dire "Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam et dui leo. Morbi diam orci, euismod et scelerisque eget, commodo eget sapien. Vestibulum ut fringilla felis. Quisque ac justo vitae ante feugiat vestibulum.";

 attendre une touche.

Le joueur devra appuyer sur une touche — n’importe laquelle — pour afficher les paragraphes au fur et à mesure, et ainsi découvrir cette merveilleuse introduction épique sans être submergé.

Encore une fois, il faut éviter d’en abuser. Si votre fiction interactive contient des passages aussi longs que ci-dessus, alors c’est que quelque chose cloche peut-être, et qu’il faudrait plutôt trouver un autre moyen plus naturel de faire passer l’information. Dans les dialogues « cinématiques », attendre une touche peut être utile entre chaque réplique pour rendre le texte plus dynamique. De plus, si afficher un énorme texte est inévitable, effectuer des pauses permet de ne pas avoir le petit [more] affiché par l’interpréteur parce que le texte a dépassé de la fenêtre.

Cette pratique de mettre le jeu en pause est répandue dans le monde francophone, mais ne l’est apparemment pas autant chez les anglophones. Certains ont même appelé le concours de 2015 « press any key comp » (en français : « compétition appuyez sur une touche ») !

Pour finir cette section, il existe un raccourci pour afficher un message demandant d’appuyer sur une touche, d’attendre une touche et d’effacer l’écran juste après. À vous de voir si cela vous sera utile.

 mettre l'histoire en pause;

Personnaliser la barre de statut

Il est possible par défaut de modifier la partie gauche et droite de la barre de statut, comme ceci :

When play begins:

 maintenant la left hand status line est  "[the player's surroundings] / [turn count] / [score]";

 maintenant la right hand status line est "Heure : [time of day]".

Cela n’est pas suffisant si l’on veut du texte au centre, ou une barre de statut de plusieurs lignes. L’extension sur laquelle porte ce tutoriel le permet. Il faut tout d’abord définir un tableau, de la forme suivante :

Table of Votre titre pour le tableau

left  central right

"T : [turn count]"  "[location]"  "H : [time of day]"

"S : [score]"  ""  ""

Il y a une tabulation entre chaque colonne et un seul saut de ligne à la fin de chaque ligne ; chaque élément doit contenir un texte. Le titre peut être à peu près n’importe quoi. Il est recommandé de copier ce code dans Inform, car il mettra en forme le tableau pour qu’il soit plus lisible. (Si vous voulez avoir plus d’informations sur les tableaux, vous pouvez regarder le chapitre 16 de la documentation, mais nous n’en aurons pas besoin ici.)

Il suffit ensuite d’écrire directement dans sa source :

Rule for contructing the status line:

 remplir la barre de statut avec Table of Votre titre pour le tableau;

 la règle réussit.

Si nous souhaitons simplement centrer du texte, il est possible de ne pas utiliser de tableau du tout :

Rule for contructing the status line:

 centrer "[location]" sur la ligne 1;

 la règle réussit.

Conclusion

L’extension Basic Screen Effects permet de mieux contrôler le flot du texte. Elle permet également d’autres choses, comme utiliser des couleurs ou centrer du texte. Cependant, la première fonctionnalité ne fonctionne pas avec l’extension française (une histoire de format Z-machine/Glulx) et la seconde ne fonctionne qu’avec des caractères à largeur fixe.

Une autre extension vous permettra de modifier l’apparence du texte : Glulx Text Effects ; gardez cependant en tête que cette extension peut ne pas fonctionner sur certains interpréteurs (l’interpréteur en ligne Quixe par exemple, où il faudra utiliser du CSS).

Et pour terminer, une dernière expression de Basic Screen Effects, qui permet de stopper abruptement le jeu, sans message de fin et sans invite finale. Cela peut mieux convenir qu’une fin standard en fonction du ton de votre jeu.

Le début est un endroit.

La fin est en dessous du début.

Article est une scène.

Article begins when play begins.

Article ends when le player est dans la fin.

When Article ends:

 arrêter l'histoire abruptement.

L’art de détruire pour reconstruire avec Inform 7

Corax

Aujourd’hui, l’article a été écrit par Corax, un membre récent de la communauté. Il explique comment il a codé ses FI (telle que sa participation au concours), qui ont été très bien accueillies. Le niveau requis est assez élevé, mais il n’y a pas besoin de comprendre en détail ce qui est présenté pour pouvoir l’utiliser.

Sur ce, laissons la place à Corax !

Nathanaël

Inform 7 propose de créer des jeux selon un certain modèle. Peut-être ce modèle ne vous convient-il pas tout à fait, voire pas du tout, et vous aimeriez donc pouvoir vous en éloigner. Or, bien souvent, il est plus facile de créer que de modifier.

Bien sûr, il faut s’assurer que ça correspond à vos besoins. Pas besoin de modifier le comportement d’Inform s’il correspond bien à votre projet !

Cet article va vous donner des astuces qui vous aideront à intercepter toutes les commandes du joueur afin, dans un premier temps, de les bloquer, puis, dans un second temps, de les filtrer et de les personnaliser.

Les deux règles capitales

Créons un nouveau projet, et mettons-y un endroit. L’environnement de test est prêt.

"Le Labo de Test" by Corax (in French)

Le Labo est un endroit.

Fondamentalement, le joueur ne peut faire que deux choses : soit il tape du texte, soit il ne tape rien. S’il tape une commande, celle-ci passe par la règle suivante avant d’être analysée :

After reading a command:

La commande elle-même sera contenue dans la variable player's command, qui ne peut normalement être utilisée ailleurs que dans cette règle. Nous allons faire en sorte que le jeu se contente désormais d’indiquer ce que le joueur a tapé.

After reading a command:

 dire "Le joueur a tapé[_]: «[_][player's command][_]».";

 rejeter la commande du joueur.

Vous pouvez tester. Tapez ce que vous voulez, les messages par défaut d’Inform ne s’afficheront plus. En trois lignes de code, La quasi-totalité des commandes ont été bloquées, mais pour autant, vous restez capable de savoir ce que le joueur tape. S’il ne tape rien, c’est cette règle qui agit :

For printing a parser error when the latest parser error is the I beg your pardon error:

Avec ce code, nous bloquons le fait de ne rien taper :

For printing a parser error when the latest parser error is the I beg your pardon error:

 dire "Le joueur n'a rien tapé.".

Cette règle se déclenche quand l’analyseur de commande n’a pas compris quelque chose ; on spécifie ici que l’on souhaite intercepter uniquement la commande vide.

Attention, il faut éviter de faire autre chose que d’afficher du texte ou d’effacer l’écran. Changer l’état du monde du jeu lors d’une erreur de l’analyseur peut créer des bugs !

Bloquer les exceptions

Certaines commandes particulières échappent aux deux règles que nous venons de voir. Si vous êtes comme moi, ça va vous chiffonner car vous désirez que tout soit sous votre contrôle. Pour remédier au problème, il faut agir directement sur les réponses par défaut d’Inform qui correspondent à ces exceptions. Le code suivant place dans ces messages la procédure de blocage.

Use UNDO prevention.

To dire annuleexception:

 dire "Une exception a été bloquée.[sans passage à la ligne]".

The immediately undo rule response (A) is "[annuleexception]".

The parser command internal rule response (A) is "[annuleexception]".

The parser command internal rule response (B) is "[annuleexception]".

The parser command internal rule response (C) is "[annuleexception]".

The parser command internal rule response (D) is "[annuleexception]".

Vous pouvez tester, par exemple avec la commande « annuler ». Désormais, tout, absolument tout ce que peut taper le joueur est bloqué. Et les seuls textes qui s’affichent sont ceux que vous avez écrits.

Ce n’est en fait pas tout à fait vrai que tout a été bloqué, mais ce qui ne l’a pas été n’est en pratique jamais tapé par le joueur. Il existe d’autres manières de bloquer les commandes spéciales comme « annuler », mais il faut plonger dans Inform 6, qui est le code sous-jacent à Inform 7. Ce serait sûrement trop compliqué pour rien.

Filtrer les commandes

Imaginons maintenant que vous désiriez que certaines commandes s’exécutent normalement en laissant toutes les autres bloquées. Vous pouvez procéder ainsi :

After reading a command:

 si la player's command matches the text "aller", ne pas prendre de décision;

 dire "Le joueur a tapé[_]: «[_][player's command][_]».";

 rejeter la commande du joueur.

Dans cet exemple, dès que la commande du joueur comporte le texte « aller », elle est traitée normalement. Notez en revanche que les commandes « Aller nord » (avec une majuscule) ou « allér nord » seront bloquées car la casse et les accents ne sont pas gérés par le code ci-dessus. Notez aussi que la commande « youpiallerlulu » franchira le filtrage puisqu’elle comporte bien le texte « aller ».

After reading a command:

 let TxtChoix be la player's command en minuscules;

 si TxtChoix correspond au texte "aller", ne pas prendre de décision;

 dire "Le joueur a tapé[_]: «[_][player's command][_]».";

 rejeter la commande du joueur.

Ce code s’affranchit déjà de la casse du texte. Le principe est là, à vous de vous l’approprier en manipulant les chaînes de caractères à votre guise et en introduisant autant d’exceptions au blocage que nécessaire.

Ici, il faut spécifier toutes les variantes possibles pour une action (par exemple si le joueur tape seulement « n » pour aller au nord). Il est possible d’utiliser des expressions régulières (section 20.6 de la documentation) ou des jetons de grammaire (section 17.13) pour faciliter l’écriture de ces conditions, même si ce serait peut-être en faire trop selon le cas. Mais comme mes jeux utilisent des liens plutôt que des commandes, je n’ai pas à anticiper toutes les commandes possibles que le joueur pourraient taper.

Personnaliser des commandes

Imaginons maintenant que vous désiriez inventer une commande inédite, la commande « plouf ». Elle aurait comme effet extraordinaire de renvoyer un texte rigolo.

After reading a command:

 let TxtChoix be la player's command en minuscules;

 si TxtChoix est "plouf":

 suivre l' ActionPlouf rule;

 rejeter la commande du joueur;

 si TxtChoix correspond au texte "aller", ne pas prendre de décision;

 dire "Le joueur a tapé[_]: «[_][player's command][_]».";

 rejeter la commande du joueur.

This is the ActionPlouf rule:

 dire "Vous sautez dans un verre d’eau. Magie, ça fonctionne[_]! Par contre, vous buvez la tasse[_]!".

Ça n’a l’air de rien, mais vous voilà capable d’associer à n’importe quelle commande du joueur les règles de votre choix sans qu’Inform vienne vous bousculer avec son fonctionnement traditionnel.

Ici, plus vous avez d’actions, plus il faudra écrire de conditions dans une règle qui finira par devenir gigantesque. Si cela vous dérange, il est possible d’organiser son code avec des tableaux contenant les commandes et les règles associées (chap. 16) ou un livre de règles, voire une activité (chap. 18 et 19).

On va un peu plus loin ? Maintenant, on veut que la commande « plouf X » ajoute 2 à X, X devant être un nombre.

[Ces variables servent à exploiter la commande du joueur après son analyse.]

TxtChoix is a text variable.

NumChoix is a number variable.

ChoixAvecNombre is a truth state variable.

After reading a command:

 [Analyse de la commande du joueur]

 si la player's command correspond à "[number]":

 maintenant NumChoix est le number understood;

 maintenant TxtChoix est "";

 sinon:

 maintenant TxtChoix est la player's command en minucscule;

 si la player's command contient "[number]":

 maintenant NumChoix est le number understood;

 maintenant ChoixAvecNombre est vrai;

 sinon:

 maintenant ChoixAvecNombre est faux;

 [Traitement spécifique des commandes]

 si TxtChoix correspond au texte "plouf":

 suivre l' ActionPlouf rule;

 rejeter la commande du joueur;

 si TxtChoix correspond au texte "aller", ne pas prendre de décision;

 [Traitement par défaut]

 dire "Le joueur a tapé[_]: «[_][player's command][_]».";

 rejeter la commande du joueur.

This is the ActionPlouf rule:

 si ChoixAvecNombre est vrai:

 dire "Plouf change [NumChoix] en [NumChoix + 2], c'est magique[_]!";

 sinon:

 dire "Plouf n'a rien à changer.".

Peu à peu, vous rédigez votre propre analyseur syntaxique. En procédant ainsi, vous pouvez plier Inform à votre imagination, mais en vous privant de son comportement par défaut vous vous privez aussi de certaines commodités. Pondre un système quasiment de A à Z ne se fera pas sans de nombreuses lignes de code.

Il reste que rédiger son propre analyseur syntaxique n’est pas une mince affaire. Si vous voyez que votre code devient trop complexe à gérer, il vous faudra peut-être bien y repenser.

Achever la métamorphose

Vous contrôlez tout, tout sauf un petit truc. Oui, quelque chose est encore hors de votre pouvoir. Pour bien vous en rendre compte, ajoutons quelques éléments à notre projet.

Le Labo est un endroit.

La description est "Un labo bleu.".

Le Labo2 est un endroit.

La description est "Un labo rouge.".

Le Labo2 est à l'ouest du Labo.

Testez ! Déplacez-vous avec les commandes « aller ouest » et « aller est ». Inform se permet encore de présenter les lieux à sa façon. On va arranger ça et, pour ce faire, il faut remplacer l’action looking qui s’exécute automatiquement dès que le joueur pénètre dans une room.

Instead of looking:

 essayer de displaying.

L’action displaying n’existe pas encore. On peut donc la créer en toute liberté.

Displaying is an action applying to nothing.

Carry out displaying:

 dire "Nom du lieu[_]: [location du player][à la ligne]Description du lieu[_]: [description de la location du player]".

Testez ! Voyez comme le monde apparaît selon la manière prévue. Notez que vous n’utiliserez peut-être même plus les endroits dans votre système, tout dépendra de la manière dont vous le conceptualisez. Mais si vous vous en servez encore, l’action looking était importante à aborder. Si une autre action déjà existante vous pause problème, faite-lui subir le même sort, remplacez-la par une de votre création.

Il également possible de désactiver toutes les règles de l’action looking et d’ajouter ses propres Carry out looking. Ce serait plus « propre », mais cela implique de bien comprendre le fonctionnement de l’action d’origine, d’aller chercher les règles d’origine dans les règles standards… Utiliser une règle instead convient très bien dans la plupart des cas.

Conclusion

Avec cet ensemble d’astuces, vous devriez être capable de créer des jeux textuels sans contrainte, si ce n’est celle de devoir bien réfléchir à votre système sous peine d’aboutir à quelque chose de bancal.