Dans ce tutoriel, nous allons voir comment changer le pokémon que nous montre le Prof.Chen quand il nous fais son discours au début du jeu.
Pour les utilisateurs confirmés qui sont déjà a l'aise avec l'hexadécimal dans pokémon...
...afin de ne pas lire tout mon pavé et voir des choses que vous connaissez déja, vous pouvez gagner du temps.
A l'offset 0x1310AC est stocké un pointeur vers un second pointeur qui redirige sur le sprite.
A l'offset 0x1310B0 est stocké un pointeur vers un second pointeur qui redirige sur la palette.
Par contre, il faudra ajouter "1D 00" a la suite du second pointeur vers votre palette.
J'imagine que c'est assez clair, vous n'avez besoin de rien de plus, au pire lisez le tuto
- Un éditeur hexadécimal. (Perso j'utilise HxD)
- De l'offset du sprite à afficher ainsi que celui de sa palette. (unLZ sera utile pour les obtenir)
- De quoi écrire. (Pas obligatoire si vous avez un très bonne mémoire.)
Pour modifier ce pokémon, nous allons utiliser un éditeur hexadécimal, du coup pour ceux qui ne connaissent pas vraiment, je vais commencer par une intro qui parle rapidement de l'hexa, si vous savez déja ce que c'est, sautez le paragraphe.
Si vous faites déjà du Rom hacking, j'imagine que vous avec déjà entendu parler de l'hexadécimal.
Pour ceux qui n'y connaissent rien, c'est un système de numération en base de 16 (Chiffres de 0 à F), le système décimal est en base de 10 (Chiffres de 0 à 9) et le système binaire est lui en base de 2 (Chiffres : 0 et 1), il est possible d'utiliser une infinité de système de comptage différents. Notre système de comptage a nous est le décimal car nous avons 10 doigts. (véridique!) Les systèmes électroniques numériques ne comptent pas sur leurs doigts, mais tous utilisent le binaire (Car ils utilisent 2 états électriques pour stocker/transférer les informations), l'hexadécimal est simplement un écriture plus compacte et facile a manipuler que le binaire, de plus la conversion entre les deux est extrêmement simple (car 16 est une puissance de 2 (2^4 : ainsi, un chiffre hexadécimal tient sur 4 chifffres binaires)), c'est pour cela qu'il est utilisé aujourd'hui par de nombreux appareils électroniques tels que les PC, les consoles de jeu, les voitures ...
Enfin bref, je vais pas vous faire un cours car dans ce tuto car nous allons seulement le côtoyer, c'était juste histoire de faire un peu de culture, si vous voulez en savoir plus, je pense que google vous le permettra.
Après tout ce blabla, attaquons les choses plus sérieuses, mais avant de commencer un petit backup de la rom ne devrait pas faire de mal.
Tout dabord, nous allons chercher l'offset du sprite que l'on veut afficher ainsi que l'offset de sa palette, j'utilise unLZ pour les trouver mais vous pouvez utiliser n'importe quoi d'autre tant que vous les récupérez.
unLZ pour obtenir l'offset.
Sprite : 0xD8B358 - Palette : 0xD8B644
Vous pouvez maintenant fermer unLZ, on n'en aura plus besoin. (Sauf si vous voulez l'utiliser pour vous souvenir de vos offsets...)
On va maintenant sortir notre éditeur hexadécimal pour modifier le sprite, avant cela, il va tout de même y avoir une paire de manipulation a faire. Ouvrez votre rom pour obtenir quelque chose de similaire, quelques éléments devraient différer si vous utilisez un autre éditeur mais a quelque chose près c'est pareil.
Editeur hexadécimal. (HxD)
- A gauche (en bleu), vous avez les offsets de chaque lignes.
- En haut se trouve le numéro de chaque colonne.
- En bas a gauche (en noir), il y a l'offset qui correspond à la position de mon curseur.
- En plein milieux (entouré en vert), il y a le contenu de la rom écrit en hexadécimal.
- A droite, il y a l'équivalent des valeurs hexa du milieu mais en codage AINSI (ce codage peut changer mais ce n'est pas important).
Pour afficher le sprite, le jeu va dabord charger en mémoire un premier pointeur, qui pointe vers un second pointeur, qui lui contient l'offset du sprite. (Si vous ne savez pas ce qu'est un pointeur (en programmation) et bien c'est une variable qui contient un offset, voyez sa comme un papier où est marqué l'adresse d'une personne.)
Bref, on va commencer par chercher notre premier pointeur, il est a l'offset 0x1310AC
Pour atteindre directement l'adresse voulue, on peut utiliser le raccourci Ctrl+G, mais si vous voulez, vous pouvez descendre a la main...
Veillez bien a ce que hex soit coché, sinon il faudra entrer l'offset en décimal.
Atteindre l'offset 0x1310AC.
Ce pointeur là, va pointer vers un second pointeur, qui lui contient l'offset du sprite du nidoran montré habituellement par le Prof, et c'est lui qu'on va changer afin de le faire pointer vers le pointeur qui indique l'offset du sprite d'évoli mais pour sa, il va falloir trouver un pointeur qui indique l'adresse d'évoli.
On va déja récupérer l'adresse de son sprite qu'on a noté auparavant et on va rechercher un pointeur vers celle-ci (avec la combinaison Ctrl+F, sa marche mieux que la reherche avec les yeux)
On va rechercher le pointeur vers l'offset du sprite, on le marque en "à l'envers" et y ajoute "08"
Ce qui me donne "58 B3 D8 08", on précise que le type est une valeur en hexa et qu'il faut chercher dans toutes les directions à partir de l'emplacement du curseur.
Recherche du pointeur vers votre sprite.
On retourne ensuite a l'offset du premier pointeur (à nouveau Ctrl+G : 0x1310AC) et on y rentre le pointeur vers l'offset qu'on viens de récupérer ( offset "à l'envers", le 08...) à la place de celui qui y est déja, sa me donne E0 F8 22 08.
Modification du pointeur.
On peut passer à la palette (sauf si la palette de votre pokémon est le même que nidoran, mais j'en doute)
Pour appliquer la palette au sprite choisi, le jeu va dabord charger en mémoire un premier pointeur, qui pointe vers un second pointeur, qui lui contient l'offset du la palette. (Une impression de déja vu non? C'est normal, c'est un peu le même principe que pour le sprite, tellement que j'ai copier-coller la phrase que j'ai utilisé un peu plus haut et changé trois mots)
Cependant, il y a quelque chose de plus cette fois-ci, pour afficher la palette, le jeu va vérifier que le second pointeur pointe vers une palette qui appartiens à un nidoran femelle. On va donc devoir lui faire croire que c'est le cas.
Pour stocker notre second pointeur il va nous falloir un peu de place sur la ROM, plus précisément 6 octets. Vous pouvez utiliser directement l'éditeur hexadécimal, il vous faudra chercher une suite de 12 chiffres hecadécimaux "F" dans la rom. (Ctrl+F : FF FF FF FF FF FF)
Pour un peu plus de culture
On recherche 6 octets de libres, pourquoi chercher 12 "F"?
Les "F" : Dans les Roms pokémon, les octets libres contiennent des "F", pour trouver ces emplacement libres, on vas donc chercher ces "F"
Et ensuite pourquoi 12 :
Un octets = 8 bits. (8 chiffres binaires)
Un chiffre hexadécimal tient sur 4 chifffres binaires. (Il y en a donc 2 par octets)
On va alors en chercher : 6 octets * 2 bits = 12 chiffres hexadécimaux.
Et pour ceux qui vont se demander pourquoi on cherches 6 octets, et bien c'est la place qu'il nous faut pour contenir notre pointeur et ce qu'on va y rajouter.
Les "F" : Dans les Roms pokémon, les octets libres contiennent des "F", pour trouver ces emplacement libres, on vas donc chercher ces "F"
Et ensuite pourquoi 12 :
Un octets = 8 bits. (8 chiffres binaires)
Un chiffre hexadécimal tient sur 4 chifffres binaires. (Il y en a donc 2 par octets)
On va alors en chercher : 6 octets * 2 bits = 12 chiffres hexadécimaux.
Et pour ceux qui vont se demander pourquoi on cherches 6 octets, et bien c'est la place qu'il nous faut pour contenir notre pointeur et ce qu'on va y rajouter.
Donc pour moi, j'ai 6 octets de libres a l'offset 0xD0 et je vais y rentrer : 44 B6 D8 08 1D 00
Le tuto ne s'arrête pas la, il faut encore modifier notre premier pointeur afin qu'il pointe vers le second, celui-ci est stocké a l'offset 0x1310B0 Vous avez juste à lui indiquer l'emplacement de votre second pointeur (à l'offset 0xD0 pour moi), je remplace donc l'ancien pointeur (00 18 23 08) par le mien D0 00 00 08.
Et voila, vous pouvez sauvegarder et admirer le résultat!
Allez, un dernier screen pour la route, avec notre second pointeur modifié et le résultat.
Résultat
Le tuto est terminé, vous devriez avoir réussi à changer le pokémon que le Prof Chen vous montre et en prime vous en conaissez un peu plus sur l'hexadécimal! (Si vous n'avez pas réussi reprenez votre backup et recommencez le tuto)
Si quelque chose n'est pas clair, vous semble incorrect ou bien que vous avez des questions, n'hésitez pas.
N'hésiter pas aussi a me laisser vos avis sur ce tuto.
Et Merci a Baitot qui m'a aidé pour réaliser la fin de ce tutoriel