Je viens de sortir un nouveau jeu, en anglais, qui s’appelle Tristam Island ! Il a la particularité d’être sorti sur 36 plates-formes différentes, dont une multitude d’ordinateurs rétro des années 80. Pour arriver à ce résultat, j’ai dû travailler avec le format « z3 » de la Z-machine ; les informations à ce sujet sont un peu disparates, donc je me suis dit que j’allais en faire un article un peu technique.
Il y a beaucoup à dire sur l’aventure Tristam Island ; je ferai sans doute d’autres articles sur d’autres aspects du jeu, comme sa conception narrative, ou le marketing. Mais il faut aussi le temps que ça décante dans ma tête !
Pourquoi la v3 ?
Rembobinons un peu. Infocom est le studio roi de la fiction interactive entre 1980 et 1988 dans le monde anglophone. Pour des raisons d’efficacité et portabilité, leurs jeux étaient compilés dans un format maison destiné à être lu par une machine virtuelle (dans la réalité, un interpréteur qui simulait cette machine virtuelle) : la Z-Machine. (On en a déjà parlé dans un article, si vous voulez rattraper votre retard !) La grande majorité (24) de leurs jeux utilisaient la version 3 de la spécification, mais il en existe quatre qui utilisent la version 4, trois pour la version 5, et quatre pour la version 6 (si je ne dis pas de bêtises).
Le format « Z-machine version 3 » est un format qui a de multiples contraintes, la version 5 offrant à la fois moins de contraintes d’espace et plus de fonctionnalités. Quand, dans les années 90, le langage Inform 6 est né, il offrait la possibilité de compiler son jeu en « z3 » ou en « z5 » ; quasiment tout le monde utilisa alors le z5. Le format z3 fut délaissé, tant et si bien qu’à partir de la version 6.15 du compilateur Inform 6, quelque chose se cassa sans que personne ne s’en aperçoive.
Mais en 2020, un engouement sans précédent pour le rétro arrive, porte par Fredrik Ramsberg et Johan Berntsson (qui, après avoir écrit un interpréteur pour Commodore 64, voulurent créer une bibliothèque Inform 6 optimisée pour les vieux ordinateurs), et Stefan Vogt, dont nous avons publié l’entretien récemment. Andrew Plotkin eut vent des bugs dans le compilateur et les corrigea.
Ça y est, z3 is back.
Dans cet historique, j’ignore malheureusement ce qui s’est construit autour de ZIL et ZILF, la toute petite communauté qui s’est récemment construite autour du langage original utilisé par Infocom ; je ne connais pas bien la scène et je n’ai pas l’impression qu’ils aient fait beaucoup de jeux originaux avec… Si j’ai tort dites-moi, et on en discutera dans ces colonnes !
Quels avantages ?
On va beaucoup parler des contraintes et des inconvénients du format z3 dans cet article, alors autant commencer par ses avantages. Et autant vous prévenir, ce format ne vous intéressera sans doute que si vous voulez faire du rétro de chez rétro…
Car l’avantage principal du z3, c’est qu’il est lisible sur plus de machines que le z5 ; en effet, il en existe qui ont un interpréteur z3 mais pas z5. Ce sont : le TI-99/4A, le MSX, l’Oric Atmos, la TI-84+CE, la Game Boy, le TRS-80, le TRS Color Computer, le Spectrum +3 (je crois), le PC-88, et enfin tous les systèmes avec CP/M (Osborne I, Kaypro, DEC Rainbow, etc.). Sans oublier les stylos LiveScribe et les systèmes embarqués avec Embcrusted.
Ce sont des ordinateurs pour la plupart très vieux, mais je vous l’ai dit, on parle de rétro très rétro !
Un autre avantage, c’est que les jeux z3 ont tendance à être plus rapides, ce qui est un avantage non négligeable quand on parle de vieilles machines.
Où trouver des fichiers z3 ?
Il n’y en a pas tant que ça, en fait, pour les raisons mentionnées ci-dessus. Il y a tout d’abord les 24 jeux Infocom. Ensuite, quelques vieux jeux, comme Deja Vu, une démo d’Inform par Graham Nelson, ainsi que (il me semble) des portages de jeux Scott Adams. Puis quelques jeux ZIL, comme un portage d’Adventure par Jesse McGrew ; et aussi, des jeux comme Cat’s Eye et Moonglow (des « miniventures » de Dave Bernazzani), ou encore Guss’s Death par Kyle Frownfelter. Et enfin, des jeux écrits avec PunyInform : les démos dans leur dépôt GitHub, Calypso par Dave Footit, et Behind Closed Doors 9B et Alien Research Centre 3 par John Wilson.
Ah, et Tristam Island par votre serviteur.
Comment créer un jeu « z3 »?
Vous pouvez apprendre ZIL ou ZILF, mais je n’y connais rien… La meilleure façon est de créer le jeu en Inform 6, car il y a des tutos sur notre site et beaucoup d’aide en ligne. Il vous faudra utiliser PunyInform, qui fait pareil que la bibliothèque standard d’Inform 6, mais qui est plus compacte et rentre dans le format. (Elle n’est pas encore traduite en français, mais ça viendra bientôt !)
Ou vous pouvez utiliser Moiki, qui grâce au dévouement de son créateur, permet d’exporter une histoire au format z3 !
Notez qu’utiliser Inform 7 n’est pas possible : le code généré par l’outil, quelle que soit la taille de votre jeu, est trop gros, et l’outil ne permet plus vraiment de créer des jeux au format Z-Machine depuis quelques années.
Quelles sont les contraintes ?
Allez, c’est parti… Le guide est non exhaustif, mais ça vous donnera une idée de ce à quoi j’ai dû me frotter pour Tristam Island !
Taille
La plus grosse contrainte : un fichier z3 ne peut faire plus de 128 ko. On ne peut pas dépasser ; si vous arrivez au bout, il faut optimiser votre code (tiens, un bon sujet pour un article un peu trop technique), ou couper du contenu. Sachant en plus que PunyInform, qui fait un boulot formidable en terme de fonctionnalités, prend de base 23 ko de place !
Mais en réalité, ça n’est pas vraiment une contrainte si terrible que ça. La majorité des jeux Infocom, qui prennent des heures à être finis, et parviennent à avoir des mondes vibrants et une grande géographie, rentrent presque tous dans ce format. Tristam Island parvient à rentrer 6-9 h de jeu dans ce format. En fait, je suis prêt à parier que quasiment tous les jeux que j’ai écrits jusqu’à présent rentreraient dans ce format !
Nombre d’objets
Dans un jeu z3, le nombre d’objets (ce qui comprend les lieux) est plafonné à 255 ; cette restriction n’existe pas dans les autres formats. C’est un peu plus ennuyeux ; pour Tristam Island, j’ai dû ruser en créant des objets qui répondaient comme plusieurs objets différents. (Par exemple, toutes les maisons dans le jeu sont en fait un unique objet, qui répond différemment selon le lieu !) Mais pareil, pas un problème à moins d’avoir un gros jeu.
À noter que la bibliothèque standard Inform 6 déclare une trentaine d’objets de base, comme le joueur, chaque direction, le sol, etc. PunyInform, quant à elle parvient à n’utiliser que 3 objets ; ça vous en fait 252, pas mal.
Résolution du dictionnaire
C’est un terme technique pour dire : « combien de lettres le parser regarde-t-il pour reconnaître un mot ? » On en a parlé dans l’article sur « infinitif vs impératif » : ça n’est pas une question à prendre à la légère.
Le format z3 se base sur 6 caractères, ce qui est suffisant… en anglais. Si vous avez des caractères accentués dans une commande, ils prendront l’équivalent de 4 lettres, et ça n’est plus bon du tout !! Il est donc impératif de prévenir le joueur dans un jeu en français : pas d’accent dans les commandes, s’il vous plaît.
En z5, la résolution est de 9 caractères, ce qui est pas mal. Mais pour éviter le souci des accents, encore une fois, la bibliothèque francophone enlève les accents des entrées avant de le traiter ; c’est pour ça qu’il faut écrire 'telephone'
dans votre code. Mais…
Pas de re-parsing
Cette limitation du z3 pose souci pour le français. En z5, on a une fonction de la machine virtuelle (on dit « opcode » techniquement) très chouette, @tokenise
, qui permet de refaire une passe sur le contenu du tableau contenant l’entrée et d’identifier les mots. C’est une étape faite automatiquement par le parser mais, parfois on a besoin de trifouiller la commande du joueur et refaire une passe, pour faciliter la reconnaissance des mots. (Par exemple, enlever les accents ; on l’utilise aussi pour replacer les pronoms aux bons endroits.)
En z3, vous n’avez aucun contrôle dessus : la machine le fait une fois pour vous et puis c’est tout. Aïe.
Tant qu’on est dans le parsing…
Des tableaux de propriétés courts
Quand on code en Inform 6, on écrit des choses comme
Object peluche with name 'peluche' 'ours' 'ourson' 'poilu' 'doux' 'petit' 'perdu';
Ce bout de code dit que la propriété name
, qui contient la liste des mots qui se réfèrent à l’objet, est un tableau contenant 9 mots ; si le joueur tape « regarder petit ourson poilu », le parser comprendra.
En z3, vous n’avez pas le droit à plus de 4 éléments dans ce genre de constructions — c’est assez peu pour certains objets ! La solution est alors d’utiliser une routine parse_name
; ça n’est pas compliqué mais c’est un peu lourd, et surtout, ça prend plus de place (déjà qu’on en a pas beaucoup…).
Barre de statut fixe
Le souci suivant est un peu plus délicat : la barre de statut, qui s’affiche en haut de l’écran, n’est pas personnalisable en z3. Il y a deux possibilités : soit on affiche une heure (comme dans Witness), soit le nom du lieu, le score, et le nombre de tours.
Votre jeu n’a pas de score ? Tant pis, ça affichera « Score: 0 » tout le temps. Vous voulez faire une boite de citation jolie comme dans Trinity ? C’est fait avec une astuce à base de barre de statut, donc non. Vous voulez afficher une boussole ? Non plus. Vous êtes francophone ? Ça sera toujours « Moves » affiché en haut, à moins de hacker l’interpréteur.
Et une autre contrariété : quand on est en z3, le nom du lieu qui s’affiche est une chaîne de caractères fixe, qui doit être écrite après le nom de l’objet dans le code. Aucun moyen de faire en sorte, par exemple, que le nom d’un lieu varie dans la barre de statut (parce que vous savez maintenant qui habite dans cette maison, par exemple) : c’est non.
Du texte, et puis c’est tout
La version 5 introduit des choses très chouettes, que j’ai beaucoup utilisées dans mes jeux, mais qui ne sont pas dans la version 3. Par exemple, aucun style n’est possible pour le texte : adieu les textes de couleurs différentes, les fonds colorés (comme dans Photopia), les polices à chasse fixe (cruciaux pour l’affichage des emails dans Life On Mars?), et surtout, le gras et l’italique. Du texte, rien que du texte.
Absente aussi est la fonctionnalité d’attente pendant une certaine durée, et avec elle pas mal de trucs cools : les effets « machine a écrire » (Life On Mars?), les karaokés (Homeland Security), ou simplement l’attente avant un nouvel événement (la fin de Life on Mars?). Adieu aussi a la possibilité de faire un jeu avec du temps réel, comme Border Zone ou, plus près de chez nous, un remake d’Omeyad.
Ah oui, et vous ne pouvez pas effacer l’écran non plus ! C’est vraiment pas rigolo, le z3…
Table de caractères
La table de caractères interne utilisée par le format z3 est fixée par le standard. J’ai une bonne et une mauvaise nouvelle. La bonne nouvelle, c’est que la table fixée par le standard inclut les accents français. La mauvaise, c’est que ce standard a été formalisé après Infocom… donc beaucoup d’interpréteurs Infocom (et autres) ne prendront pas en charge les accents. Ça n’est pas insurmontable : il y a des trucs, comme redéfinir la table de caractères de l’ordinateur, qui étaient assez connus à l’époque. Mais tout de même, c’est un peu rageant. Mais ça pourrait être pire !
Notez que dans l’état actuel des choses, si vous avez un accent dans le code, il y aura une erreur à la compilation ; la solution est d’utiliser la table dans le DM4, qui indique que @`e
est un « è », etc. Comme dans le code source de Filaments…
Il y a aussi un truc assez standard en z5, qui est de redéfinir la table de caractères avec Zcharacter
; cela permet notamment d’optimiser la place que prennent les caractères français, ou d’ajouter des caractères Unicode. Ce n’est bien entendu pas permis en z3 — mais attention ! le compilateur ne vous le dira pas, et certains interpréteurs utiliseront votre nouvelle table alors que le standard dit explicitement d’ignorer les redéfinitions de table dans le format z3. Un bien joli bazar…
C’est tout ?
Je ne sais pas si c’est tout. Mais c’est déjà beaucoup !
Si jamais l’aventure de créer un jeu en z3 vous tente — par exemple, pour pouvoir le porter sur plein de plates-formes rétro — n’hésitez pas à me contacter ! Cet article est une petite feuille de rappel à garder sous la main, mais la pratique peut s’avérer retorse, et étant passé par là, je peux vous aider !
2 Pings