Hack'n'Trash : Création de Codes Action Replay (1ère partie)
Vous nous l'avez demandé dans le premier Hack'n'Trash, le sujet qui vous fait le plus envie : la création de codes. Afin de vous offrir un contenu homogène, nous allons nous limiter aux codes Action Replay DS. Et je vais me faire l'honneur de vous initier dans cette première partie.
Si vous n'appréciez pas un minimum les mathématiques, si vous n'avez jamais utilisé de codes ou d'émulateurs, il est très probable que vous ne puissiez pas aller jusqu'au bout de cet article.
L'hexadécimal
L'hexadécimal, c'est le mot qui sort régulièrement, mais qu'est-ce que c'est au juste ? C'est un système de comptage, aujourd'hui principalement dédié à l'électronique.
En tant qu'êtres humains, nous comptons aujourd'hui en base 10, c'est-à-dire en décimal. Parce que nous avons dix doigts. Dans les temps anciens, certaines communautés comptaient de manières différentes. Je vais vous apprendre à compter en hexadécimal avec vos mains (uniquement pour les gens normalement constitués, je m'excuse auprès des autres). Avec votre main fétiche, servez-vous de votre pouce pour compter les extrémités de chaque phalange des autres doigts de votre main. Vous devriez compter 16 extrémités (l'articulation entre deux phalanges ne compte que pour 1). Voilà, vous savez compter en base 16. Compter jusqu'à 16 avec une main, avouez que c'est plutôt cool. Et si on se servait de la deuxième ? Pour optimiser le comptage, si on se sert de la deuxième main pour compter les dizaines, on peut alors compter jusqu'à 256 ! C'est ainsi que compte les appareils électroniques.
Le seul petit détail à ne pas oublier, c'est qu'en hexadécimal, on compte de 0 à F, avec les chiffres de 0 à 9 et les lettres de A à F, avec A pour 10, B pour 11, et ainsi de suite.
La mémoire vive et les adresses mémoire
Rappelez-vous, l'Action Replay sert à modifier des valeurs de la mémoire vive (RAM). Imaginez que la RAM est une très longue rue, dont les adresses commencent au numéro 0, où habitent des valeurs que l'on peut appeler des familles. Les valeurs sont stockées dans ce qu'on appelle des octets, que l'on représentera par des maisons. Et chacun de ces octets a une adresse. Un octet peut contenir une valeur comprise entre 0 et 255, ce qui donne de 00 à FF en hexadécimal, comme si chaque maison pouvait contenir jusqu'à 255 habitants (ou pas... je vous laisse imaginer la taille de la baraque).
Qu'en est-il des valeurs plus grandes que 255 ? Comme l'argent dans Pokémon ?
Eh bien sa valeur est stockée sur plusieurs octets. Tout comme vous séparez les milliers en décimal, la console sépare la valeur en plusieurs octets.
Voilà un exemple un peu plus parlant (si vous aimez les mathématiques, ça devrait être facile) :
Décimal | Hexadécimal |
2000 | 0x7D0 |
002 000 | 0x07 D0 |
En décimal, la maison peut être inhabitée, ou contenir jusqu'à 999 habitants. Cela fait donc 1000 valeurs possibles. La première maison (n°0) contient les unités. La deuxième maison (n°1) contient les milliers. | En hexadécimal, la maison peut être inhabitée, ou contenir jusqu'à 255 habitants. Cela fait donc 256 valeurs possibles. La première maison (n°0) contient les hexa-unités. La deuxième maison (n°1) contient les hexa-centaines. |
002×1000^1 + 000×1000^0 | 0x07×256^1 + 0xD0×256^0 |
La notation 0x7D0 indique que c'est une valeur hexadécimal égale à 7D0. La lettre x à ne pas confondre avec le symbole de multiplication ×.
L'accent circonflexe représente ici la notation Exposant (ou Puissance pour les intimes).
Pour résumer ce tableau, dites-vous que pour faire la somme des habitants des maisons, il faut additionner le nombre d'habitants de chaque maison, multiplié par le nombre de possibilités, lui-même multiplié par le nombre de possibilités autant de fois qu'on peut trouver de maisons avant.
Pour votre information, une DS peut compter jusqu'à 4 294 967 295, c'est-à-dire FF FF FF FF.
Je vais finir par vous perdre avant le plus important. Peut-être qu'en passant au concret, vous assimilerez ça plus facilement...
La matériel requis
Pour l'exemple qui va suivre, je vais me servir de DeSmuME, un émulateur DS très puissant, mais légèrement gourmand. Si vous avez un PC qui date d'avant 2012, je ne peux pas vous assurer que ça fonctionnera convenablement. La version de cet émulateur que je vais utiliser est la plus récente, et est disponible dans le paquet WinDS Pro.
Et bien sûr, la ROM du jeu pour lequel vous souhaitez un code. Pour ma part, je vais me servir de Pokémon Link!.
Création de notre premier code
Les types de codes
Première chose, il faut savoir qu'un code a une certaine structure, qui dépend de son type. Dans cette initiation, nous allons créer un code d'affectation. Ce type de code est le plus simple à créer, il permet de remplacer une valeur par une autre dans la RAM, sans contrainte particulière. Il existe trois codes de ce genre que voici :
0XXXXXXX YYYYYYYY | Ce code remplace la valeur des 4 octets à partir de l'adresse mémoire XXXXXXX par YYYYYYYY. |
1XXXXXXX YYYYYYYY | Ce code remplace la valeur des 2 octets à partir de l'adresse mémoire XXXXXXX par YYYY. |
2XXXXXXX YYYYYYYY | Ce code remplace la valeur de l'octet à l'adresse mémoire XXXXXXX par YY. |
Vous pourrez retrouver la totalité des types de codes sur GameHacking.org.
Pour savoir lequel de ces codes vous allez créer, vous devez connaître votre jeu par cœur et connaître la valeur maximale de celle que vous voulez changer. Si la valeur ne dépasse pas les 255, vous utiliserez le code de type 2 ; si votre valeur ne dépasse pas les 65535, vous utiliserez le code de type 1 ; et pour le reste, le code de type 0.
Lancez une partie de votre jeu avec DeSmuME, allez sur l'écran où la valeur est affichée pour la connaître. Ici, je vais regarder mon Score dans le mode Sans Fin. Mettez en pause votre jeu (avec le bouton Play/Pause dans la barre d'outils), et ouvrez l'outil RAM Search depuis le menu Tools.
Beaucoup d'informations sont affichées là. Le principe de création de code consiste à comparer une ancienne valeur avec la nouvelle pour trouver l'adresse mémoire où se trouve la fameuse valeur. Nous avons donc tout un panel d'options pour nous aider à trouver ce qu'on cherche le plus rapidement possible.
Le Score maximum dans ce jeu est 99 999 999. On a donc une valeur supérieure à 65535, ce qui signifie qu'elle tient sur 4 octets. Je vais cocher 4 bytes dans les options Data Size. Byte qui signifie Octet en français.
Pour faciliter la recherche de la valeur, nous allons afficher et chercher la valeur directement en hexadécimal. Donc je vais cocher Hexadecimal dans les options Data Type / Display.
Nous cherchons une valeur précise que nous connaissons, et qui n'a pas encore changé. Je vais donc cocher l'option Equal To dans les options Comparison Operator. Pour les mêmes raisons, je vais cocher Specific Value dans les options Compare To / By.
Il ne me reste plus qu'à entrer mon Score dans la zone de texte à côté de Specific Value, et cliquer sur Search en haut à droite pour rechercher toutes les valeurs à 0 pouvant tenir sur 4 octets.
Le nombre de possibilities dans le titre de la fenêtre devrait diminuer. Vous avez donc dans le tableau, uniquement les adresses mémoires pour lesquelles la valeur est à 0, et est composée de 4 octets. Maintenant, il faut procéder à une comparaison. Pour cela, vous allez devoir modifier la valeur en jouant un peu. Je vais donc faire Play pour relancer le jeu où je me suis arrêté, et augmenter mon Score, et refaire Pause. Quand c'est fait, j'ai deux possibilités :
- comparer la nouvelle valeur à l'ancienne pour trouver toutes les adresses mémoires auxquelles les valeurs ont augmenté ;
- rechercher directement la nouvelle valeur parce que je la connais.
La deuxième a plus de chances de me donner un résultat intéressant. Je vais donc entrer mon nouveau Score, qui est de 50, dans le champ Specific Value et cliquer sur Search. Attention ! Nous recherchons des valeurs hexadécimales ! Il faut donc convertir 50 en hexadécimal avant de continuer. Vous pouvez convertir facilement du décimal en hexadécimal avec le mode Programmeur de la Calculatrice Windows.
Par chance, le résultat de ma recherche me donne très peu de possibilités. Je suis donc très près du but. Avec 4 possibilités, j'ai meilleur temps d'essayer 4 codes plutôt que de continuer mes recherches. Par sécurité, je vais faire un savestate pour relancer le jeu où je me suis arrêté si ça plante à cause d'un code. S'il vous reste trop de possibilités à tester, continuez de modifier la valeur jusqu'à affiner les possibilités au nombre de 5 ou 6.
Connaissant bien ce jeu, je sais à quoi peuvent correspondre certaines adresses mémoires. L'une d'entre elle est le record du mode Sans Fin, une autre est le Score affiché à l'écran, une autre la valeur en mémoire de mon Score. C'est cette dernière qu'il faut modifier pour être sûr que la partie prenne en compte sa modification. En ne modifiant que l'affichage, mon vrai Score ne sera pas modifié. C'est comme les fleuristes, ils changent les graines pour des roses rouges, ils obtiennent des roses rouges ; ils trempent les roses rouges dans un colorant noir, ce seront toujours des roses rouges.
Bien, j'ai une adresse mémoire dans la colonne Adress des possibilités. J'ai dit qu'il me fallait un code de type 0. Et j'aimerais un Score de 3000, que je vais convertir en hexadécimal (BB8). Je remplace donc XXXXXXX par une adresse de mon choix (dans Adress, la longueur de l'adresse est de 8 caractères, supprimez le premier 0 à gauche et remplacez-le par le type du code), et YYYYYYYY par 00000BB8. Il est impératif de remplir le vide d'une valeur par des 0. La longueur d'un code est invariable. Voilà le résultat :
0220A97C 00000BB8
DeSmuME vous facilite encore plus la tâche. Cliquez sur la ligne d'une possibilité et cliquez sur le bouton Add Cheat. Il générera un code, avec la valeur de votre choix (que vous pouvez inscrire en décimal). N'oubliez pas une petite description pour le retrouver. Cliquez sur Add.
Le code est activé. Reprenez votre partie. Si le jeu plante ou se bloque, alors vous vous êtes trompés. Dans le menu Tools/Cheats, allez dans List. Supprimez le code que vous venez de créer et chargez le savestate de tout à l'heure et refaites Pause. Recommencez l'opération pour les autres adresses.
Pour ma part, cette adresse ne semble pas la bonne. J'ai donc testé les autres. Et je suis arrivé à la conclusion que la bonne adresse était 022101C4. Mon code final est donc le suivant :
022101C4 00000BB8
Avec ce code, mon Score est de 3000 et le restera tant que le code sera activé. D'ailleurs si je Reset les résultats de RAM Search et cherche à nouveau mon Score, je devrais trouver au minimum deux adresses, mon Score véritable, et celui affiché à l'écran.
Ajouter des touches d'activation
Un code fixe n'est jamais pratique quand il s'agit de scoring. Parfois même, ce genre de codes bloquent votre jeu parce qu'il n'accepte pas que la valeur soit fixée. Dans ces cas-là, il faut trouver un moyen d'activer le code à un certain moment pour modifier la valeur sans pour autant la bloquer. Et la méthode la plus utilisée est celle des touches d'activation.
Les touches que vous pressez pendant votre partie passent aussi dans la RAM. Leurs valeurs sont déjà connues, ne manque plus qu'un moyen d'utiliser notre code à la pression des touches de notre choix. Et là intervient notre maître à tous, le grand M@T, qui nous a fait une page qui vous permettra d'entourer votre code avec celui des touches.
Cochez les touches de votre choix, le code sera automatiquement modifié. Puis remplacez (code) par votre code. Voilà, c'est fini. Maintenant, lorsque vous presserez les touches que vous aurez choisies, la valeur sera modifiée, et pourra évoluer à n'importe quel moment. Vous aurez donc la possibilité de la remettre à votre valeur fétiche à tout moment. Attention toutefois à ne pas mettre des valeurs trop proches du maximum, certains jeux ne gèrent pas le dépassement du maximum et planteront ou afficheront des valeurs corrompues.
Conclusion
Vous savez maintenant créer un code tout à fait banal, mais suffisant dans la plupart des jeux. Dans les grandes lignes, il faut chercher une première fois la valeur, la modifier, la rechercher en la comparant à l'ancienne (à plusieurs reprises pour trouver un minimum de correspondance) et tester les codes.
J'espère que vous êtes satisfaits de ce tutoriel. Et maintenant, quel serait le prochain sujet du Hack'n'Trash ? À vous de me le dire dans les commentaires !
Le petit MegaRobert
Adresse mémoire : c'est un emplacement de la RAM dans lequel est stocké une valeur. Pour la DS, sa taille varie entre 1, 2 et 4 octets.
ROM : copie conforme d'un jeu original disponible sur cartouche. En parallèle, nous appelons les copies de jeux sur disque des ISOs.
Savestate : c'est une sauvegarde de l'état de votre jeu à un moment précis. À la différence des sauvegardes que vous faites dans le jeu manuellement, et seulement quand vous y êtes autorisé dans le jeu. Le but est de pouvoir revenir en arrière. Pratique pour les tests de codes, ou encore le Tool Assisted Speedrun.
Scoring : on utilise ce terme lorsque la progression dans le jeu se fait au travers du score du joueur.