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 IFiction-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 joueur 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 joueur 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 joueur 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 joueur 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 IFiction-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ébur 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 joueur 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 joueur 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 joueur 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 joueur 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 !

J'ai écrit ma première fiction interactive avec Inform 7 !Click to Tweet