Mr. Matt : recreuser les cavernes de mon enfance
Quand j'étais gamin, j'avais ADI. Le logiciel éducatif avec l'extraterrestre vert qui vous expliquait les fractions. Sauf que sur le CD-ROM d'ADI 4, entre deux exercices de conjugaison, il y avait des jeux. Et parmi ces jeux, il y avait Mr. Matt.
J'y ai passé beaucoup trop d'heures. Vraiment beaucoup trop. (l'éducatif a rempli son office : j'ai appris la persévérance, sinon les fractions)
Aujourd'hui, il est là, dans votre navigateur : mrmatt.jeux.philr.fr.
Le jeu
Mr. Matt est un jeu de réflexion de J. Andrzej Wrotniak, écrit en 1996 pour Windows, après qu'il eut rangé son Atari ST sans trouver de version correcte de Stone Age. Distribué en shareware, il a été téléchargé cinquante mille fois la première année.
Le principe tient en une phrase, et l'aide d'origine le dit mieux que moi : « No shooting, no killing, just thinking ahead and hours of endless frustration. »
Vous creusez la terre, vous mangez les pommes, vous évitez les pierres. Manger la dernière pomme termine le niveau. Les pierres tombent dès que la case sous elles se libère, roulent sur les tas, et vous tuent si elles arrivent au-dessus de votre tête. Vous pouvez en pousser une, une seule, à l'horizontale. Il y a aussi des caisses, qui avalent trois pierres avant de disparaître, et des bombes, arrivées en 2001, qui détruisent ce qu'elles touchent.
C'est tout. Et c'est un cauchemar.
Parce que pousser une pierre est irréversible. Une pomme murée derrière un éboulement est une pomme perdue, et un niveau perdu, sauf que vous ne le saurez que quarante coups plus tard. Le jeu est un cousin du Sokoban déguisé en Boulder Dash. (sauf que Boulder Dash vous laisse courir, là où Mr. Matt vous laisse réfléchir à votre erreur)
Le portage
J'ai refait le jeu sous Godot 4.7, à partir de la distribution shareware 1.59 et de la version 3.16 de 2001.
La règle que je me suis donnée : fidélité. Pas de « réinterprétation moderne », pas de refonte graphique, pas de mode aventure avec des succès. Les mêmes règles, les mêmes niveaux, les mêmes tuiles, les mêmes sons, tous extraits directement de MRMATT.EXE. Les quarante bitmaps de 16 pixels dorment dans une ressource Delphi de l'exécutable de 1997 ; les sons sont les MM_*.WAV d'origine, en PCM 8 bits mono à 22 050 Hz, dont deux avec un en-tête corrompu qu'il a fallu réécrire.
Même les traductions viennent de là. Le jeu parle six langues, anglais, français, allemand, italien, espagnol et suédois, et ce sont les six fichiers .MMI livrés en 1997, quatre-vingt-neuf chaînes chacun. Coquilles comprises : le français d'origine dit « Qu'as-tu fais à Mr.Matt? », et il continue de le dire.
Comment on vérifie qu'un portage est fidèle
C'est la partie que je n'avais pas vue venir, et de loin la plus intéressante.
L'aide de 1997 décrit les règles. Mal. Elle dit qu'une pierre roule, sans dire de quel côté. Elle dit qu'une bombe n'explose pas « en atterrissant au bas de l'écran », sans dire si le bas de l'écran porte ou avale. Elle ne dit rien du moment exact où un objet se met à tomber, ce qui est pourtant toute la différence entre survivre et mourir.
Sauf que la distribution de 2001 contient un fichier mrmatt.sol avec 2 278 solutions trouvées par des joueurs, sur 437 packs de niveaux. Ces gens ont joué sur le vrai programme. Donc chacune de leurs suites de coups doit, rejouée dans mon moteur, se terminer par une victoire.
Ça fait un oracle. Bien plus sévère qu'une lecture de la documentation, et surtout mesurable : j'ai écrit le moteur une seconde fois en C, compilé chaque règle douteuse derrière un #define, et regardé le taux de réussite bouger.
| Variante testée | Réussite | Verdict |
|---|---|---|
| (règles finalement retenues) | 99,8 % | |
| Les caisses ne roulent pas | 89,6 % | réfuté |
| On roule sur n'importe quoi | 48,1 % | réfuté |
| La chute n'attend pas le pas suivant | 41,4 % | réfuté |
| Il faut tomber avant de rouler | 8,2 % | réfuté |
Trois règles que l'aide ne dit nulle part sont sorties de là.
Un objet en l'air ne tombe pas tout seul. Le vrai jeu n'applique pas la gravité au plateau entier : un objet ne tombe que si la case sous lui a changé. Or 851 niveaux du corpus commencent avec une pierre posée dans le vide. Elle y reste, suspendue, jusqu'à ce qu'on vienne la déranger.
Le sens du roulement suit le joueur. Quand une pierre atterrit sur une autre et que les deux côtés sont libres, elle part du côté où Mr. Matt vient de se déplacer. Forcer un sens fixe réparait 42 solutions et en cassait 36 ; cette règle-là en répare 66 et n'en casse aucune.
Une caisse avale tout ce qui arrive sur elle, qu'il tombe, qu'on l'y pousse ou qu'il y roule.
Le désassemblage a confirmé les trois. Il a aussi livré la définition exacte de la mort, à l'adresse 0x4653c4 : Mr. Matt meurt quand un objet vient occuper la case juste au-dessus de lui, et seulement tant qu'il reste des pommes. Une fois la dernière mangée, le niveau est gagné et plus rien ne l'atteint.
Au bout du compte : 2 273 solutions sur 2 278, et les 35 des sept jeux d'origine. Il en reste cinq qui ne rejouent pas, toutes très tardives, entre le 305e et le 1102e coup.
Les niveaux, et un chiffre à casser
Le shareware ne donne que 48 niveaux. La version enregistrée en donnait quatre mille, et l'auteur a suspendu les enregistrements il y a longtemps.
Mais 437 packs communautaires de l'époque circulaient encore. Sauf que ceux distribués après 2001 sont brouillés : les dix-huit lignes de plateau deviennent illisibles, le reste non.
+>$> ->!<*!#O* &!H! <<<<*=>+%!> <- chiffré
H#+#+#+++*************+++#+#+#+ <- le même en clair
Un fichier, abba_dabba_dooo.mat, existait dans les deux formats. Ça donne 2 232 cases de clair connu, et de quoi comparer. C'est une substitution par décalage sur un alphabet de seize caractères, où la clé ne dépend que de la position et se répète tous les 256 caractères. Ce n'est donc pas un flux : deux niveaux du même fichier chiffrent la même case de la même façon, ce qui a suffi à trahir la méthode.
Vérification sur un fichier sans clair connu, 2b_or_not_2b.mat : il en sort cinq niveaux dessinant chacun un point d'interrogation, pour un jeu nommé « 2b Or Not 2b » dont les niveaux s'appellent « Question 1 » à « Question 5 ». C'était donc ça.
Résultat : 443 jeux et 2 322 niveaux livrés avec le portage, dans une ressource de 303 ko qui se charge en 11 millisecondes.
Il reste un mystère. Chaque niveau porte un nombre de contrôle que je ne sais toujours pas calculer. Ce n'est ni une somme simple ni un CRC-16 courant. Tant qu'il n'est pas percé, les niveaux que vous créerez seront relus par mon jeu, mais probablement refusés par celui de 1997. (dommage, c'était le seul pont qui manquait)
Ce qu'il y a dedans
Un écran, comme dans l'original : la barre de menus Fichier / Jeu / Options / Aide, le plateau, et le bandeau bleu du bas avec les numéros de niveaux, jaune pour celui en cours, vert pour les faits, rouge pour le suivant.
Et puis : quatorze thèmes graphiques, dont Bière, Margaritas et Matt-Ilda ; un éditeur de niveaux avec point, ligne, cercle et remplissage, et soixante-quatre pas d'annulation ; les clichés et la relecture de l'original, touches C et R ; l'affichage de la solution pour n'importe lequel des 443 jeux, puisque les 2 278 solutions humaines sont embarquées. (une victoire obtenue en regardant la solution n'est pas enregistrée, comme en 1997 : le jeu vous connaît)
Ça tourne aussi au doigt. Un pavé directionnel translucide se pose au coin bas gauche, un bouton d'annulation au coin bas droit, et le tout se verrouille en paysage et en plein écran au premier appui. Firefox pour Android n'implémente pas le verrou d'orientation, alors il y a un bouton, et une version installable dont le manifeste le déclare.
Et un import-export JSON, parce que le format .mat est de l'art ASCII et qu'il fallait bien un pont vers des outils d'aujourd'hui.
La suite
Reste une question que je me posais déjà à dix ans, devant un niveau bloqué : est-ce qu'une machine saurait le résoudre ?
La réponse courte est non, pas vraiment. J'ai écrit un solveur, une recherche en faisceau. Il résout 3 niveaux sur 26. Le moteur en C tourne à 900 000 états par seconde, contre 5 000 en GDScript, et ça ne change rien : la force brute est à des dizaines d'ordres de grandeur du problème. Pousser une pierre crée des impasses irréversibles, et c'est exactement ce qui rend Sokoban difficile.
Ce sera l'objet du prochain article. Il sera moins joyeux.