Rom Hack & Fan Game

Modifier le Pokémon de l'introduction

Attention, ce tutoriel est valable pour la version Rouge Feu FR uniquement.

Dans ce tutoriel, nous allons voir comment changer le Pokémon que nous montre le Prof.Chen quand il nous fait son discours au début du jeu.

Un Évoli pour l'introduction du Prof.

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.

Matériel

  • Un éditeur hexadécimal (HxD pour ma part)
  • De l'offset du sprite à afficher ainsi que celui de sa palette (Unlz-GBA sera votre meilleur ami)
  • De quoi écrire, ça peut servir

Modification du sprite

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.

Offsets du sprite et de sa palette dans Unlz-GBA

Pour ce tuto, j'ai choisi Évoli, je note les offsets correspondants, pour info, sur une rom non modifiée, les sprites des Pokémon sont stockés a partir de 656.
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.

Éditeur hexadécimal

Si c'est la première fois que vous utilisez un tel éditeur, voila comment celui-ci s'organise :
- 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 d'abord 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 ça 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

A l'adresse 0x1310AC j'ai entouré une suite de 4 couples chiffre hexadécimaux dont j'ai souligné l'adresse. C'est un pointeur. il se lit à l'envers et deux chiffres a la fois, on commence par le couple de chiffre de droite, notre pointeur vise donc dans ce cas la l'offset 0x08 22 F5 A0. On note la présence du "08" par rapport au offsets "habituels" il est la car le jeu est chargé en mémoire à partir de l'offset 0x8000000, tous les offsets de la rom lus par le jeu commenceront donc par 08.
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

On ressort le bloc-notes/unLZ/notre cerveau et on note l'offset (souligné en vert) de ce pointeur qui contient l'adresse du sprite, j'ai 0x22F8E0.

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 premier pointeur

Le sprite est maintenant modifié!

Modification de la palette

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 copié-collé 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)

Une fois qu'on a trouvé de la place on va y mettre le pointeur suivi de "1D 00" (qui correspondent au numéro de Nidoran(f))
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 tutoriel 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 de la modification

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! ;D (Si vous n'avez pas réussi reprenez votre backup et recommencez le tuto)
Et Merci a Baitot qui m'a aidé pour réaliser la fin de ce tutoriel

Pour des détails supplémentaires ou poser des questions, dirigez-vous sur le topic dédié du forum.

Par Gadoin

Par Loris