Cette semaine, c’est un petit tutoriel pour commencer à programmer en Inform 6 ! Nous allons commencer par mettre en place le code et quelques objets et, demain, dans une deuxième partie, nous mettrons en place des réactions particulières et quelque chose qui ressemblera plus à un jeu. Les tutos pour Inform 6 en français ne sont pas légion, mais j’espère pouvoir faire quelques articles sur différents aspects et fonctionnalités de ce langage — n’hésitez pas si vous avez des questions ou suggestions pour la suite !

Inform 6 est un langage créé au milieu des années 1990 ; sa syntaxe et son mode de fonctionnement sont très stables, mais son développement se poursuit, notamment pour la correction d’éventuels bugs. Il s’agit d’un langage orienté objet, tout comme d’autres langages comme C++ et Java ; on retrouve des mots-clés et des concepts très similaires à d’autres langages de programmation. Il sert de plus de base à Inform 7, qui traduit tout son code en Inform 6 avant compilation. Les bibliothèques et le compilateur I6 sont sous licence libre et open source, et nous travaillons à l’inclusion d’I6 en français dans Linux.

Tout d’abord, allez télécharger le kit pour débuter, que je vous ai préparé avec amour, avec la dernière version du compilateur (6.34) incluse. Je vais ici partir du principe que vous savez comment jouer à un jeu Inform (et en particulier que vous savez ce qu’est un interpréteur) ; si non, rendez-vous sur cette page !

Comment utiliser ce kit ?

Vous trouverez dans ce kit un script pour compiler votre jeu, c’est-à-dire transformer votre code en un jeu jouable et distribuable. Il y a deux options : « publier » (votre jeu tout propre et optimisé, qui peut être distribué directement) et « tester » (votre jeu, avec un « mode développeur » encore activé, c’est-à-dire avec certaines commandes « cheat codes » qui peuvent être utiles pour le debug, mais qui rendront votre jeu trop facile !) ; je vous recommande d’utiliser « publier » quasiment tout le temps, sauf problème coriace ! Par la suite, nous diront « la compilation » pour l’étape qui consiste à lancer ce script pour obtenir votre jeu sous forme jouable.

Le code distribué dans le kit est celui d’un jeu très simple : une pièce totalement blanche (classique) avec un seul objet. Mieux vaut démarrer simple ! Ouvrez le code, et ouvrez le jeu dans une autre fenêtre – et expérimentez ! Vous arriverez sans doute à voir quel bout de code correspond à quelle partie du jeu et vice-versa. Et n’hésitez pas, changez quelques valeurs, quelques chaînes de caractère, et voyez ce que ça donne !

Des milliers de jeux ont été écrits en Inform 6, et vous trouverez sur Internet des dizaines de code sources de jeux, notamment sur l’IFArchive. En français, vous pouvez notamment télécharger les codes source de tous les jeux de FibreTigre, ainsi que les miens ; utilisez les étiquettes dans la section « jeux » pour trouver des jeux avec un code source I6 disponible. Lire le code, même en diagonale, après avoir joué au jeu pourrait vous donner des idées et vous faire progresser !

Nous allons partir de rien, avec pour objectif de reproduire le code donné dans le kit ; nous allons mettre en place les objets aujourd’hui, et les choses plus compliquées (comme le score et les conditions de victoire) demain.

Le code source de base pour un jeu Inform 6 ressemble à ceci :

Constant Story "Mon histoire";
Constant Headline "Mon sous-titre";

Include "Parser";
Include "Verblib";

Object piece;

[ Initialise ;
	location = piece;
	print "texte d'introduction";
	return true;
];

Include "FrenchG.h";

Copiez-collez ce code ! Chez moi, c’est dans un fichier nommé « blanc.inf », parce que c’est un jeu vide, blanc. À mesure que vous créez des jeux, vous pourrez customiser ce fichier pour y inclure des réglages que vous aimez avoir dans vos jeux.

Voyons tout ce que tout ça veut dire

Les deux premières lignes définissent deux constantes. La première est Story, le titre de votre jeu ou histoire ; la deuxième est Headline, le chapeau (ou sous-titre) du jeu. Lorsque le jeu va démarrer, il va afficher le titre du jeu en gras, puis le chapeau en-dessous, puis une ligne pour indiquer avec quelle version d’Inform le jeu a été créé. Actuellement, si nous jouons au jeu, nous verrons :

Mon histoireMon sous-titreRelease 1 / …

Le chapeau peut contenir, par exemple, un sous-titre pour votre jeu, votre nom, et éventuellement d’autres choses comme une indication au joueur. Si nous voulons afficher le chapeau sous le titre, il faut ajouter un retour à la ligne : en Inform 6, on signale ce retour à la ligne par un symbole ^. Nous allons ainsi écrire

Constant Story "Mon premier programme Inform 6";
Constant Headline "^Par un nouveau programmeur^";

Ce qui donne

Mon premier programme Inform 6
Par un nouveau programmeur
Release 1 / …

Remarquez que chaque ligne du programme — en fait, chaque instruction que l’on écrit — doit se terminer par un point-virgule ; c’est une convention présente dans de nombreux langages de programmation pour pouvoir séparer les instructions, et Inform ne déroge pas à la règle.

Les lignes suivantes sont des commandes Include : on les utilise pour ajouter des fichiers de code à votre code, et ainsi pouvoir utiliser leurs fonctionnalités. Ici, les deux fichiers à inclure absolument sont Parser, qui est le fichier de la bibliothèque Inform 6 qui fait l’analyse syntaxique de la commande du joueur, et VerbLib, qui contient les actions définies par défaut, comme « Take » ou « Push ». Tant que nous y sommes, allons voir à la fin du code source : un autre fichier, FrenchG, est inclus ; il s’agit du fichier contenant la définition de la grammaire française, qui spécifie notamment que « prendre » se réfère à l’action « Take », et que « pousser » se réfère à l’action « Push ». Rien qu’avec l’inclusion de ces trois fichiers, vous voilà avec un jeu qui peut comprendre des commandes écrites en français, avec une centaine de verbes (dont de nombreux synonymes) et de constructions reconnus !

L’ordre dans lequel vous incluez ces fichiers a une importance : toujours dans cet ordre (mais si vous sauvegardez ce code vide, vous n’aurez pas de problème). Par contre, on peut mettre FrenchG juste après Verblib si l’on veut ; c’est juste que j’aime bien visuellement séparer la grammaire du reste du jeu.

Initialise

Le dernier point est la ligne qui commence par un crochet ouvrant. Ceci signifie que nous sommes en train de définir une fonction, ou routine, c’est-à-dire une suite d’instructions que l’on exécute les unes à la suite des autres à chaque fois que l’on se réfère au nom de la fonction. Ici, la fonction s’appelle Initialise ; il s’agit d’une fonction qu’il faut obligatoirement définir, car Inform 6 s’attend à ce qu’elle soit définie, et y fait appel dès que le jeu démarre.

S’il ne la trouve pas, il écrira sans doute Error : No such constant as Initialise, pour dire « j’ai écrit quelque part qu’il fallait que je lance la fonction Initalise, mais elle n’est pas définie ! ».

À l’intérieur d’Initialise, il faut absolument donner le nom du lieu de départ du jeu ; sinon, vous aurez une erreur, non pas durant la compilation, mais en lançant le jeu. Le lieu dans lequel se trouve le joueur est contenu dans une variable nommée location : dès que le joueur bouge dans un lieu différent, Inform change la valeur de location. Pour donner une valeur de départ à location, c’est-à-dire définir un lieu de départ pour le joueur, nous écrivons :

location = piece;

Qu’est-ce que piece ? C’est justement la dernière ligne qu’il nous reste à expliquer : piece est le nom d’un objet défini dans le code. Car oui, en Inform 6, un lieu est un objet, tout comme le reste en fait.

L’instruction location = piece veut dire « le lieu actuel est maintenant défini comme étant l’objet ‘piece’ » ; le égal, comme dans beaucoup de langages de programmation, se lit comme un « : » ou une flèche ←.

La ligne suivante est une commande print : là encore, comme dans beaucoup d’autres langages de programmation, cette commande veut dire « afficher quelque chose à l’écran ». Puisqu’on est encore à l’étape d’initialisation, l’« écran-titre » (titre, chapeau, etc.) ne s’est pas encore affiché ; ainsi, si on utilise print, on affichera un texte avant l’écran-titre, c’est-à-dire un texte introductif. Ici nous allons juste afficher une ou deux phrases pour justifier le lieu dans lequel le joueur se trouve :

print "Vous vous réveillez en sursaut. Autour de vous, du blanc à l'infini. Une pièce complètement blanche...^";

Notez que nous terminons par un ^ ; c’est pour décoller le texte de l’écran-titre, pour les mettre en valeur.

Enfin, la dernière ligne est return true;. return est une commande permettant de renvoyer une valeur : la fonction a fini d’être exécutée, et on peut renvoyer un résultat, une valeur, un état… Ici, nous renvoyons true (vrai), pour dire que tout s’est bien passé et que le jeu devrait afficher l’écran-titre maintenant.

Notre premier objet

L’objet piece va être notre premier exemple d’objet. J’ai écrit plus haut Object piece; juste pour le définir ; mettons un peu plus d’information ici. Dans un jeu en Inform, on utilise une convention qui remonte à très loin (sans doute à Adventure) : le système affiche le nom du lieu en gras, et la description du lieu en-dessous. Pour spécifier le nom qui doit être affiché, on l’écrit après le nom de l’objet, comme ceci :

Object piece "Une pièce blanche";

Il y a donc deux types de nom en Inform. Le premier, piece, est le nom interne, utilisé par Inform et par le programmeur pour se référer à l’objet ; ce nom doit être un seul mot, composé de lettres (sans accents) et de chiffres. Le nom affiché au joueur peut être n’importe quel texte, et peut contenir ce qu’on veut.

La description est une propriété de base de l’objet — en fait, de n’importe quel objet d’Inform : tout objet a une propriété description. Pour la spécifier, il faut indiquer with (pour dire qu’on commence à lister les propriétés) ; ça donne :

Object piece "Une pièce blanche"
	with description "Vous ignorez où vous vous trouvez, et comment vous êtes arrivé là. Ce qui est sûr, c'est qu'il n'y a pas beaucoup de choses à voir ici...";

Lancez le jeu et…

L’obscurité
Il fait noir, et vous ne pouvez rien voir.

Mmh, ça n’est pas exactement ce à quoi nous nous attendions. C’est parce qu’il manque une dernière information : que cette pièce est éclairée. Nous le faisons en spécifiant l’attribut light, comme ceci :

Object piece "Une pièce blanche"
	with description "Vous ignorez où vous vous trouvez, et comment vous êtes arrivé là. Ce qui est sûr, c'est qu'il n'y a pas beaucoup de choses à voir ici...",
	has light;

Et en lançant, nous obtenons enfin :

Vous vous réveillez en sursaut. Autour de vous, du blanc à l'infini. Une pièce complètement blanche…

Mon premier programme Inform 6
Par un nouveau programmeur
Release 1 / Serial number 170709 / Inform v6.33 Library 6/11

Une pièce blanche
Vous ignorez où vous vous trouvez, et comment vous êtes arrivé là. Ce qui est sûr, c'est qu'il n'y a pas beaucoup de choses à voir ici…

>

Et voilà, vous avez une ébauche de jeu qui se profile ! Demain, nous remplirons le jeu un peu plus, pour qu’il ait une fin, une condition de victoire, etc. — bref, des éléments qui le rapprochent plus d’un jeu traditionnel. À demain !