[Tuto][gba][BPRF] Changer le pokémon que nous montre Chen pendant l'introduction

Pages: [1]

Gadoin

  • Membre
  • 386 posts
21 Novembre 2013, 11:49
/!\ Attention, ce tutoriel est valable pour la version Rouge Feu Fr uniquement. (d'où la balise [BPRF] dans le titre)


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 ;)
Pour les autres vous aurez besoin de 2 ou trois petites choses :
- 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.
Pour ce tuto, j'ai choisi évoli, je note les offsets correspondants, pour info, sur une rom non modifiée, les sprites des pokémons 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.
Editeur hexadécimal. (HxD)
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 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.
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 a l'envers et deux chiffres a la fois, on commence par le couple de chifffre 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"n 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 vers votre sprite.
On ressort le bloc-note/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 pointeur.
Le sprite est maintenant modifié!


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.
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 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! ;D (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 ;)
« Modifié: 24 Novembre 2013, 04:05 par Gadoin »

Baitot

  • Membre
  • 491 posts
21 Novembre 2013, 12:35
Très bon tuto, très bien détaillé mais je pense que c'est assez inutile.
Sinon, un grand bravo pour avoir écrit tout ça pour une manipulation qui prend 2 minutes à faire, ça as dû te prendre beaucoup de temps.

Elyiøs

  • Membre
  • 3107 posts
21 Novembre 2013, 12:43
Tout le monde ne sait pas le faire, inutile pour certains et utile pour d'autre

Megadrifter

  • Membre
  • 6425 posts
21 Novembre 2013, 12:44
Tous les tutoriels sont utiles, surtout quand ils sont bien rédigés. Donc je le note quelque part pour l'intégrer au site dans les prochains mois. Très bon travail Gadoin. En plus, je n'ai pas aperçu beaucoup (voire pas du tout) de fautes. Ça fait plaisir.

Myst

  • Membre
  • 1870 posts
21 Novembre 2013, 12:51
Tous les tutoriels sont utiles, surtout quand ils sont bien rédigés. Donc je le note quelque part pour l'intégrer au site dans les prochains mois. Très bon travail Gadoin. En plus, je n'ai pas aperçu beaucoup (voire pas du tout) de fautes. Ça fait plaisir.

Tout le monde ne sait pas le faire, inutile pour certains et utile pour d'autre

Oh que oui, surtout pour les debutants qui touchent pas a l'hexa.

Sinon même avis de megadrifter.

Gadoin

  • Membre
  • 386 posts
21 Novembre 2013, 13:37
Très bon tuto, très bien détaillé mais je pense que c'est assez inutile.
Sinon, un grand bravo pour avoir écrit tout ça pour une manipulation qui prend 2 minutes à faire, ça as dû te prendre beaucoup de temps.

En effet, la manipulation est très rapide, j'aurai pu faire un tuto en quelques minutes, mais le tuto est loin d'être inutile, le but de celui-ici est de comprendre et aussi d'apprendre quelques aspect qui s'avèrent compliqués pour les novices.

Sa m'as pris du temps c'est vrai, mais vu que j'en ai pas mal en ce moment autant le passer à quelque chose d'utile pour la communauté, sa m'as aussi permis de me changer un peu les idées ;)



Edit : La palette de nidoran ingame est affecté par la modification a l'offset 0x231800! Du coup, je vais devoir retravailler encore là-dessus pour corriger sa, le tuto malgré qu'il soit fonctionnel, n'est donc pas complètement valable pour le moment. (à part de sacrifier nidoran...)


Pour laisser des nouvelles sur le sujet :

En modifiant le pointeur a l'offset 0x1310B0, (qui pointe vers un second pointeur qui contient l'offset de la palette) le nidoran du prof sera systématiquement noir. (Alors que la routine est exécuté de la même manière! Seulele pointeur vers l'adresse et l'adresse de la palette voulue est affiché a la place de ceux correspondants a la palette de nidoran)

Le second pointeur peut contenir l'adresse de n'importe quelle palette, tant que le premier pointeur reste le même la palette est chargé est appliqué au sprite sans problème, mais le soucis est que ce second pointeur (qui est modifié dans ce tuto) est situé dans un table qui contient les pointeur de toutes les palette associée au différents pokémons du jeu. Elle est utilisée a chaque fois que le jeu va afficher le sprite d'un pokémon.
Modifier l'adresse contenue dans ces pointeurs entraine donc la modification la palette associée au pokémon concerné.

Bref, je suis dans l'impasse pour le moment, mais je continue de chercher.


Pour contourner le problème de la palette :
Il est possible d'insérer un nouveau Pokémon qui sera une copie exacte de nidoran(f) et qui prends sa place dans le pokédex.
Cependant, il faudra aussi modifier ces zones de rencontre ainsi que les dresseurs qui le possèdent. (zones de rencontre : Route 3 et Parc Safari)
Mais je ne trouve pas cette technique très "propre" et en plus elle fait perdre une place pour un autre pokémon.
« Modifié: 23 Novembre 2013, 15:25 par Gadoin »

Baitot

  • Membre
  • 491 posts
23 Novembre 2013, 19:18
En fait, il faut que tu ailles à l'offset H1310B0.
Là-bas, tu trouveras un pointeur qui pointera vers le pointeur de la palette de Nidoran ^^.
Donc remplace le pointeur par un autre offset (par exemple moi je choisi l'offset HC31800, donc remplace 00182308 par 0018C308).
Ensuite, va vers cette offset (HC31800 pour moi) et ajoute le pointeur de la palette + 1D00 à la fin.
Pour moi, ça donne 1C 32 D4 08 1D 00 00 00  (1C 32 D4 08 = pointeur de la palette de Nidoran et 1D 00 = Numéro Héxa de Nidoran).
Cette manipulation change la palette du Pokémon avec Chen, pas de Nidoran.

EDIT: Faute de frappe.
« Modifié: 23 Novembre 2013, 19:20 par Baitot »

Gadoin

  • Membre
  • 386 posts
23 Novembre 2013, 20:52
Alors c'était le "00 1D" après le pointeur vers la palette le secret!
Je te remercie beaucoup pour ton aide, je vais modifier la fin du tuto pour l'adapter à cette solution.


Edit : MàJ du tuto terminée, je peut enfin sortir me démonter la geule l'esprit tranquille!
« Modifié: 23 Novembre 2013, 22:39 par Gadoin »

Arnik

  • Membre
  • 1812 posts
04 Août 2017, 22:48
/!\ Mise à jour: le logiciel GBA Intro Manager, disponible sur Pokemon Legendary, permet de changer le Pokémon (apparence, palette et cri) disponible à côté du professeur.
Image
« Modifié: 04 Août 2017, 22:50 par Arnik »

Pages: [1]    En haut ↑