Si vous avez joué à des jeux vidéo récemment, que ce soit sur une console ou sur PC, vous savez sûrement ce qu’est un achievement, un succès, un trophée, une médaille, un haut fait (ma traduction préférée, celle de World of Warcraft). Certaines actions dans un jeu sont récompensées par les développeurs par un badge ; à vous de les trouver, de les collectionner, de consulter les guides en ligne pour trouver comment obtenir ceux qui vous manquent, etc. C’est purement pour le fun (parfois on vous donne des points attachés à votre compte, mais les points ne servent à rien de toute façon), un peu parfois pour le prestige puisque certains sont plus durs que d’autres (et il y a des sites pour se comparer aux autres, bien sûr), et surtout ça vous donne une carotte pour explorer le jeu dans ses moindres recoins ou jouer au jeu d’une façon différente de celle dont vous avez l’habitude.

Pour le développeur, c’est un très bon moyen d’augmenter la durée de vie du jeu pour pas cher, et de valoriser tout le travail qui a été fait sur le jeu (puisque si une joueuse veut tous les succès, elle est un peu obligée d’aller dans des recoins qu’elle n’aurait peut-être pas exploré, ou des modes de jeux qu’elle aurait ignorés sinon, ce qui rentabilise le travail du développeur).

Dans le monde de la FI, une sorte d’équivalent de ceci pourrait être la commande « amusing ». Il s’agit d’une des options données une fois qu’on a fini le jeu avec le score maximum ; c’est une fonctionnalité inventée par Inform. Quand on sélectionnait cette option, on avait « avez-vous essayé de… » et une liste de commandes à essayer dans le jeu ; en fin de compte, une liste d’easter eggs, de réponses drôles cachées dans le jeu, que le joueur est invité à essayer en y rejouant. Le but est donc un peu similaire : pousser le joueur à passer un peu plus de temps sur le jeu et à en explorer les moindres recoins.

Pourquoi n’y en a-t-il pas plus dans les fictions interactives ? La tradition s’est en effet un peu perdue, ou peut-être est-ce la taille des projets qui a diminué – même si, de nos jours, les jeux Choice of Games ont un nombre conséquent de succès à débloquer en explorant le graphe narratif. Une raison est également qu’une grande partie de l’intérêt des achievements est qu’ils sont permanents, reliés à votre compte de joueur, et que vous pouvez ensuite faire la liste de ceux que vous avez obtenus et les comparer à d’autres joueurs. (C’est aussi l’intérêt pour les entreprises comme Steam ou Sony : vous avez passé du temps sur ce compte à accumuler les succès, donc restez fidèles pour ne pas les perdre…). Et comme on n’a pas de Steam pour la FI, ou même peu de FI sur Steam, la question ne s’est pas trop posée, en tout cas pas dans la scène amateur.

Il y a cependant de plus en plus de fictions interactives qui sortent sur des plateformes grand public comme Steam, le Play Store, ou même la Switch. Il est donc bon d’y réfléchir, et d’avoir des outils adaptés. Pour ce qui est des jeux avec analyseur syntaxique, ceux sur lesquels je me concentre dans l’article d’aujourd’hui, il y a quelques outils écrits ces dernières années. Pour Inform 7, il me semble que la plus utilisée (par exemple dans le jeu Scroll Thief) est Achievements de Mikael Segercrantz, mais il en existe d’autres, comme celle-ci de Juhana Leinonen.

Capture d'écran de Kerkerkruip montrant la liste des succès.

Les succès de Kerkerkruip, affichés sous forme de menu — basique, mais fait le boulot.

En Inform 6, c’est l’extension « achievements.h » de Vince Laviano, développée en 2016, qui vient remplir ce rôle — et très franchement, elle est bien faite, et très facile d’utilisation ! Je vais vous la présenter brièvement, pour que vous puissiez voir les principes qui sous-tendent sa conception.

L’extension implémente un trophée comme un objet de la classe Achievement, comme ceci :

Achievement metro "Métro mais pas trop"
    with description "Prenez le métro au moins une fois.";

Une fois déclaré, vous pouvez le décerner au joueur en appelant la routine award, qui est déclarée dans la classe Achievement. En écrivant metro.award();, on donne le trophée au joueur, et celui-ci apparaîtra alors comme débloqué. Le joueur peut regarder la liste des succès, et voir ceux qui ont été débloqués, en tapant la commande « achievements ».

Un autre type de succès est ceux basés sur la répétition d’une action ; on utilisera pour ceux-ci CountingAchievement :

CountingAchievement sousmarins "Terreur des océans"
    with target_count 5,
    description "Détruisez 5 sous-marins.";

Il y a aussi les trophées qui sont « en plusieurs parties », dans ce cas c’est un MultiAchievement :

MultiAchievement pinballwizard "Pinball Wizard"
    with num_tasks 5,
    description "Obtenez le high score sur les 5 flippers.";

La différence est que pour un CountingAchievement on peut faire 5 fois la même action, alors que pour un MultiAchievement il faut faire 5 actions différentes, que vous numérotez dans le code (ici, de 0 à 4 inclus). Quand le joueur a fait le high score sur le flipper numéro 0 on écrit pinballwizard.complete_task(0); ; et pour tester si le joueur a un high score sur le flipper numéro 2 on fait pinballwizard.is_task_completed(2);.

Il y a enfin les MetaAchievements, c’est-à-dire les succès qui sont décernés une fois que d’autres succès ont été décernés :

MetaAchievement tout "100 %"
    with description "Obtenez tous les succès.",
    depends_on metro sousmarins pinballwizard;

Il y a quelques autres fonctionnalités intéressantes : donnez l’attribut concealed à un succès et il sera caché dans la liste ; donnez l’attribut persistent pour qu’il soit inscrit dans un fichier à part et que le jeu puisse se souvenir que ce succès a été obtenu, même si le joueur commence une autre partie. Vous pouvez aussi faire parfait.fail() si vous voulez que l’achievement échoue, c’est-à-dire que le joueur ne pourra plus jamais le débloquer (ici par exemple le joueur a fait une erreur). Enfin, un succès qui est réussi est déplacé dans l’objet EarnedAchievements — ainsi, si vous voulez tester que le succès a été réussi, vous pouvez écrire if parfait in EarnedAchievements.

Le développement de cette extension s’est arrêté ; il y a deux ou trois problèmes mais globalement le code est très complet et plutôt dense. J’ai beaucoup aimé le principe de cette extension quand elle est sortie, et je l’ai reprise récemment pour y ajouter quelques bouts de code spécifiques à Vorple. Vous pouvez voir cette extension en action dans mon jeu Neon Vertex : une notification s’affiche lorsque vous obtenez un succès, et il est possible de déclarer une icône pour chacun des succès et afficher la liste en tant que succession d’icônes, comme sur Steam !

Vous pourrez trouver le code sur le dépôt de code de Vorple sur Github. J’espère qu’elle vous sera utile !