Hier, nous avons commencé à coder un système de sorts pour notre adaptation de Harry Potter en fiction interactive. Aujourd’hui, apprenons non pas à créer des verbes, mais à en étendre.

Un exemple que l’on peut prendre pour commencer est celui du verbe « lancer » ; dans notre contexte de Harry Potter, on voudrait bien que « lancer sort » soit reconnu. Sauf que « lancer » fait déjà partie des verbes reconnus par Inform 6 en français ! Si on écrit Verb 'lancer', le système va se plaindre que ce verbe est déjà défini. Il ne s’agit pas ainsi de créer un verbe, mais d’en étendre un, ce qu’on fait avec la commande Extend :

[ SortPasPrécisSub ;
 "Veuillez préciser le sort que vous souhaitez lancer ; vous pouvez également juste taper son nom directement.";
];
Extend 'lancer'
* 'sort'    -> SortPasPrécis;

Grâce à ces deux dernières lignes, nous ajoutons une ligne de grammaire supplémentaire pour le verbe « lancer », après celles déjà définies.

Supposons ensuite que vous vouliez empêcher le joueur de taper « lancer sort lumos » ou tout autre sort, pour insister sur le fait qu’il faille taper directement le sort.

Personnellement je trouve que ça n’est pas une bonne idée : je déteste les jeux qui donnent une réponse spécifique pour me dire la façon « correcte » de le formuler. Si le jeu a une réponse spécifique pour cette commande, c’est qu’il la reconnaît, et si il la reconnaît, pourquoi fait-il comme si il ne comprenait pas ?? Grr !

Dans ce cas, il faut une ligne qui oriente le joueur vers la bonne commande. On écrit :

[ SortPasCommeCa ;
 "[Dans ce jeu, vous n'avez pas besoin de taper 'lancer sort' ; tapez le sort directement.]";
];
Verb 'lancer'
* 'sort' topic ->SortPasCommeCa;

Le topic veut dire « n’importe quel texte entré par le joueur » ; le jeu n’essaiera pas de le faire correspondre à un objet.

Pour être plus gentil avec le joueur, nous allons autoriser les formulations « lancer sort lumos », « lancer sort expecto patronus », etc. Pour cela il faut rajouter plusieurs lignes à la grammaire de « lancer », comme ceci :

Extend 'lancer'
 * 'sort'                             ->SortPasPrécis
 * 'sort' 'lumos'                     ->Lumos
 * 'sort' 'expecto' 'patronus'        ->ExpectoPatronus
 * 'sort' 'petrificus' 'totalus' noun ->PetrificusTotalus
 * 'sort' 'avada' 'kedavra' animate   ->AvadaKedavra;

Vous pouvez également rajouter une ligne de plus, * 'sort' topic ->SortInconnu, si vous voulez pouvoir dire au joueur que ce sort est inconnu.

Attention à bien rajouter cette ligne en dernier ! Il s’agit de la ligne la plus générale ; si vous l’ajoutez avant, le programme trouvera que cette ligne décrit la commande très bien comme ça, et ne regardera pas les lignes d’après, qui seront donc toujours ignorées.

Maintenant, comment faire si vous voulez reconnaître « jeter sort » et consorts en plus de « lancer sort » ? En fait, c’est déjà fait : « jeter » est un synonyme de « lancer » dans la bibliothèque Inform francophone ! Mais supposons que vous vouliez les différencier – par exemple, parce que votre jeu s’appelle Harry Potter et la Pollution de l’environnement naturel et que vous voulez pouvoir jeter des détritus. Vous utiliseriez le mot-clé only, comme ceci :

Extend 'jeter' only
 * 'détritus'                                ->PoubelleNormale
 * 'plastique'/'carton'/'emballage'/'papier' ->Recyclage;

Les barres obliques « / » permettent de séparer des options équivalentes — pas besoin d’écrire 4 lignes de grammaire (une pour le plastique, une pour le papier, etc) différentes !

Nous l’avons dit avant, les lignes de grammaire que vous définissez sont mises après les autres, c’est-à-dire qu’Inform commencera toujours l’analyse de la phrase en regardant les lignes de grammaire prédéfinies d’abord, puis les vôtres. Parfois, on a envie de changer ce comportement, par exemple si l’on veut une règle similaire mais avec des caractéristiques plus spécifiques (par exemple, 'jeter' edible est plus précis que 'jeter' noun). On utilise alors le mot-clé first, comme ceci :

Extend 'jeter' first
 * edible ->GaspillageNourriture;

Ceci permet de placer vos règles en premier, avant les autres.

Et si vous voulez en mettre certaines en premier, mais en garder d’autres, mais pas d’autres, et puis… Ouh là… Parfois, il vaut repartir de zéro, et utiliser le mot-clé replace :

Extend 'jeter' replace
 * ... ! À vous de jouer !