Et pourtant, la solution n'était pas bien compliquée et pourrait s'avérer bien plus intéressante qu'il n'y parait. C'est TheZZAZZGlitch, le glitchologue bien connu notamment pour son travail sur le 8F récemment, qui a décidé il y a quelques jours de se pencher sur la question à la faveur d'une question posée sur le forum de nos amis anglophones, Glitch City Laboratories.
Comme je trouve ça très cool, j'ai décidé de vous expliquer ses découvertes ici-même. Comme vous le savez si vous avez lu notre page, le Ditto Trick n'est ni plus ni moins qu'un phénomène super simple : on change la valeur de l'adresse mémoire $CD2D, qui contient l'IDH du dresseur rencontré dans le cadre du glitch, alors que le script de rencontre est bloqué par notre fuite. Et, en retournant dans la zone du dresseur, le combat se déclenche finalement, mais contre le mauvais adversaire. Comment un banal changement de ce type pourrait-il impliquer la disparition d'un PNJ qui n'a rien avoir dans l'histoire ?
Les dresseurs ne sont pas les seuls à vous parler pour vous combattre
Et oui, c'est également le cas des Pokémon légendaires, qui eux aussi ouvrent une boite de dialogue pour vous crier dessus avant que le combat ne commence. Les IDH des dresseurs étant tous supérieurs à C9, ce cas est le seul dans lequel la valeur de $CD2D se trouve naturellement inférieure à C9. C'est la raison pour laquelle les développeurs ont crée un petit sous-programme qui est la cause de tout nos malheurs.
Ce sous-programme vérifie la valeur de $CD2D au moment du combat : s'il est égal ou supérieur à C9, c'est bien un combat de dresseur ; mais s'il est inférieur à cette valeur, c'est que nous sommes forcément dans le cas particulier d'une rencontre avec un Pokémon légendaire. Dans les deux cas, un combat se lance. Mais le combat contre un Pokémon légendaire possède une petite spécificité par rapport à celui contre un dresseur : à la fin du combat, le Pokémon légendaire doit disparaître.
Introduction sur la gestion des objets d'une map
La gestion des objets et personnages d'une map donnée est contenue dans une section de la RAM que l'on nomme missable object flags. Cette section, qui est modifiée à chaque entrée dans une nouvelle map, contient la liste des choses qui peuvent potentiellement disparaître sur ladite map. Sur la Route 24, cette liste contient notamment un personnage (le Rocket qui vous donne la Pépite) et un objet (la CT45 dans la Pokéball). A chacun de ces "objets" est lié une boite de dialogue - le texte prononcé par le Rocket (dont l'IDH interne, pour cette map, est 01) et celui qui indique que vous trouvez la CT45 (IDH 08).
Le fonctionnement est donc tout simple : lorsque la boite de dialogue en question s'affiche, l'objet lié disparaît.
Retour sur le mismatching des boites de dialogue
Dans notre page sur le Ditto Trick, nous parlons également d'un phénomène, lui déjà décrit depuis des années, appelé Walking lag glitch et dû le plus souvent à l'inattention de la personne qui fait le glitch. Lors d'un Ditto Trick, il est préférable que la dernière boite de dialogue ouverte par le jeu, avant le retour à la map du dresseur que vous avez fui, est le menu START. Cette boite de dialogue à un IDH universel sur toutes les maps : 00. Ainsi, lorsque vous arrivez sur la map, le menu START s'affiche et ensuite, le combat commence.
Si vous avez par inadvertance ouvert une autre boite de dialogue (c'est-à-dire parlé à quelqu'un, lu un panneau, ou ramassé un objet...) c'est la boite de dialogue ayant le même IDH interne sur la map qui s'ouvrira et non pas le menu START ; mais le combat aura tout de même lieu, ce qui ne change rien au glitch... sauf s'il n'y a pas de boite de dialogue de cet IDH sur la map (il y aura alors un code d'erreur) ou si la boite de dialogue de cet IDH correspond au texte d'un dresseur qui n'est pas encore combattu : le jeu se mettra alors à laguer et c'est quasiment impossible à réparer !
Je pense que vous avez déjà commencé à comprendre le concept que j'essaye de vous expliquer : si vous effectuez le Ditto Trick sur la Route 24 avec, comme dernière boite de dialogue, celle d'IDH 08, la CT45 disparaîtra après le combat, parce que la boite de dialogue 08 de la Route 24 (le texte de la CT45) aura été ouverte par le glitch !
Disparition des PNJ d'autres maps
Tout ça c'est bien, mais ça n'explique pas tout. Lorsque vous effectuez un Ditto Trick normal avec le menu START à la Route 24 - un des exemples les plus connus de ce glitch, le policier qui se trouve devant la maison cambriolée par la Team Rocket à Azuria disparait. Pourtant, ce garde n'est pas sur la Route 24 ; et sa boite de dialogue d'IDH 07 n'a en apparence aucun rapport avec votre menu START d'IDH 00. D'ailleurs, puisque ce menu a le même IDH partout, il n'y a jamais de PNJ dont la boite de dialogue porte l'IDH 00. Alors, que se passe-t'il ?
L'explication est que la liste des missable object flags n'est que partiellement mise à jour à chaque entrée dans une nouvelle map. Analysons une seconde la liste d'Azuria, telle qu'elle apparait dans les valeurs de la RAM :
01 05 02 06 06 07 0A 08 0B 09 FF
Les hexadécimaux en gras correspondent aux boites de dialogue des "objets" qui disparaissent sur la map et le reste des valeurs sont des références internes pour chaque objet, à l'exception du FF qui marque la fin de la liste. Lorsque vous montez sur la Route 24, le début de cette liste est remplacé par les deux seuls objets de la Route 24. Le reste de la liste contient donc des données restantes de la précédente map :
01 24 08 25 FF 07 0A 08 0B 09 FF
Lorsque vous effectuez le glitch avec une boite de dialogue qui ne correspond pas à un objet, comme le menu START, le jeu, qui rappelons-le considère que quelque chose doit disparaitre puisqu'un Pokémon légendaire vient d'être rencontré, ne comprend pas et lira la valeur se trouvant immédiatement la fin de la liste à la place, qu'il interprète comme un objet à faire disparaitre : ici, la valeur 07 renvoie à la boite de dialogue du policier ; et le policier disparait. Ceci vous permet ni plus ni moins que de faire disparaitre des objets ou des personnages appartenant à d'autres map.
Les conséquences de cette découverte en glitchologie et speedrunning
Quand on y réfléchit, ce travail peut être le début de quelque chose de très important, surtout en terme de speed runs sans exécution de code ni item underflow. Grâce à un simple ditto trick, on pourrait alors sauter des pans entiers du jeu !
A l'heure actuelle, tout cela n'est qu'embryonnaire. Je ne sais pas si TheZZAZZGlitch (merci et bravo encore à lui pour ce travail) prévoit de l'approfondir, mais il est certain que nous, nous le ferons dès que possible

Et vous ?