La propriété name d’Inform 6 est très facile à utiliser : on met la liste des mots qui ont un rapport avec l’objet, qui pourraient être des synonymes, et on laisse le système analyser l’entrée du joueur, compter le nombre de mots consécutifs qui se rapportent à chaque objet, et déterminer l’objet qui a le meilleur score, et donc le plus de chances de correspondre à ce que la joueuse voulait dire. Mais quand on gratte un peu, on s’aperçoit qu’il y a beaucoup de problèmes potentiels : comment différencier l’échoppe et la porte de l’échoppe ? Comment différencier le bleu de travail du ciel bleu ? Comment différencier la lance en fer et le fer de lance ?

Ce problème se pose moins avec Inform 7, car on peut définir des locutions comme se référant à l’objet :

Understand "ciel bleu" as le ciel.
Understand "bleu" as le bleudetravail.

Cette formulation rend aisée la définition d’une expression, ou juste l’ajout d’adjectifs, comme synonyme du mot ; ça manquait à Inform 6, et ça me manquait, j’avoue que j’étais un peu jaloux.

Pname, de Neil Cerutti

J’ai regardé les extensions Inform 6 qui étaient disponibles, et il n’y en avait pas beaucoup qui me plaisaient ; certaines permettaient de définir certains mots comme étant des adjectifs, ce qui n’était pas exactement ce que je cherchais… Finalement, j’ai trouvé l’extension « pname » de Neil Cerutti (mentionnée dans le chapitre « Too Many Toilets » de l’Inform Beginner’s Guide).

« pname » est une extension très chouette, qui m’a donné beaucoup d’idées pour PhraseNames. En gros, on peut définir une propriété pname, qui contiendra des suites de mots, comme ceci :

  '.x' 'red' '.x' 'toilet' 'door'
  'soda' '.or' 'coke' 'machine'
  '.x' 'old' '.x' 'brass' 'lantern' '.p' '.x' 'shining' 'light'

Dans cette suite de mots, il y a des petits marqueurs, qui indiquent au parser la fonction des mots ; ces marqueurs sont ceux qui commencent par un point.

  • Le mot '.x' indique que le mot suivant est optionnel : s’il n’est pas dans la commande, ça n’est pas grave (si vous ne mettez pas le '.x' devant red, on ne pourra pas dire door, le joueur devra absolument écrire « red door ».).
  • Le mot '.or' veut dire que le mot suivant est une alternative au mot qu’on vient de passer : « soda machine » et « coke machine » sont tous les deux acceptés.
  • Le mot '.p' est là pour séparer deux expressions : la troisième ligne définit « old brass lantern » et « shining light ».
  • Et enfin, les mots doivent être lus dans la commande dans le même ordre que dans la propriété pname : « machine coke » ne marchera pas.

Avec ceci, on peut faire pas mal de choses : la troisième ligne permet de reconnaître « lantern », « brass lantern », « old brass lantern », « old lantern », « light » et « shining light ».

Il y a en revanche quelques problèmes avec cette extension. Premièrement, certaines choses sont toujours impossibles, ou du moins difficiles à écrire de façon compacte ; par exemple, reconnaître « barre en fer » sans reconnaître « barre en ». Mais surtout, l’extension date de 2001, et fonctionne en remplaçant 4 routines de la bibliothèque Inform 6 version 6.10 — et on en est à la 6.11 ou 6.12, donc le code qui a été copié-collé à l’époque a depuis été modifié, corrigé, etc. Utiliser cette extension, c’est se priver de 15 ans de développement sur la bibliothèque Inform 6 ! Il fallait donc une autre solution.

Étendons cette extension avec PhraseNames

PhraseNames repose sur le même principe, celui d’écrire des motifs avec des mots spéciaux pour préciser ce qui est autorisé ou non pour faire référence à l’objet, et ainsi d’éviter d’écrire des parse_name à foison. Cependant, elle ne touche pas à la bibliothèque Inform 6 (et est donc compatible avec n’importe quelle version de celle-ci), et est plus flexible, grâce à l’ajout de fonctionnalités. PhraseNames, c’est pname, en mieux !

Pour utiliser PhraseNames, il faut inclure l’extension, puis remplacer parse_name par la routine ComplicatedParsing ; on peut ensuite faire ce genre de manipulations. Voici la définition par PhraseNames de la lanterne :

Include "PhraseNames";
Object lantern "old brass lantern"
    with parse_name ComplicatedParsing,
    phrase_name '.opt' 'old' '.opt' 'brass' 'lantern' './' '.opt' 'shining' 'light;

Exactement le même principe que pour pname, sauf qu’on dit '.opt' pour un mot optionnel, et qu’on sépare par des './' les locutions. Le '.or' reste identique et a la même fonction, et on peut les enchaîner aussi ; bref, tout ce qui est faisable avec pname est faisable avec PhraseNames.

J’ai aussi rajouté d’autres fonctionnalités bien utiles. Par exemple, on peut aussi écrire '.name', pour dire « n’importe quel mot que vous avez mis dans la propriété name de l’objet ». Ceci permet d’écrire des choses comme :

name 'depliant' 'papier' 'livre' 'livret' 'fascicule',
phrase_name '.name' '.opt' 'colore';

Ce qui donne « papier coloré », « livre coloré », « dépliant coloré », « fascicule coloré », d’un coup d’un seul !

On peut aussi ajouter non pas un mot optionnel, mais des suites de mots optionnelles, avec le mot-clé '.opt(' ; on ferme la parenthèse avec '.)'. Par exemple :

name 'barre' 'barreau',
phrase_name '.name' '.opt(' 'de' '.or' 'en' 'fer' '.or' 'metal' '.)',

Et voilà pour « barre de fer », « barreau en fer », « barreau en métal », etc. !

La seule contrainte est qu’on ne peut pas mettre de '.opt(' dans un '.opt(' – trop difficile à prendre en charge pour moi !

À cause de cette restriction, j’ai ajouté une fonctionnalité pour compenser : il s’agit de '.rest', qui veut dire « et puis le reste de la phrase, qui est optionnel ». Ceci permet de complexifier les choses, car on peut alors utiliser des '.opt(' en suivant ; c’est un peu comme un '.opt(' dans un '.opt(' en bout de phrase (miam, n’est-ce pas ? N’est-ce pas ??). Cela permet des exemples compliqués, comme celui-ci, tiré de Homeland Security :

name 'depliant' 'papier' 'livre' 'livret',
phrase_name '.name' '.opt' 'colore' '.rest' 'sur' '.opt' 'la' 'securite' '.opt(' 'de' '.or' 'a' 'l^' 'aeroport' '.)' '.opt(' 'd^' 'Aruba' '.)'

Ceci permet de reconnaître « papier coloré », « dépliant sur la sécurité de l’aéroport d’Aruba », « livre sur la sécurité à l’aéroport », et d’autres tournures complexes comme celles-ci ! C’est en fait cet exemple qui m’a motivé à développer l’extension : après quelques heures de réflexion, j’étais arrivé à créer un parse_name compliqué de 22 lignes, alors que ça prend une seule ligne avec PhraseNames ! Un autre exemple, tiré de Tipelau :

name 'generateur' 'generateurs' 'moteur' 'moteurs',
phrase_name '.name' '.opt(' '.opt' 'a//' 'diesel' '.or' 'petrole' '.or' 'essence' '.)' '.rest' '.opt' 'du' 'village';

Avec cette extension, vous pourrez créer très facilement des noms complexes pour vos objets. De plus, avec les différentes possibilités pour les sections de l’expression, on arrive facilement à reconnaître des dizaines, voire des centaines de formulations équivalentes pour le même objet ! Bref, je n’en suis pas peu fier : allez la télécharger sur mon Bitbucket, et à vous les noms longs et flexibles pour tous vos objets en un rien de temps !