\[TUTO GBA\] Émeraude FR : Modifier le Pokémon attrapé par Timmy
Julink - 5 août 2014 à 16:17 Comment modifier le Pokémon que Timmy attrape ? (Émeraude FR) Une très grande partie d'entre vous ont certainement déjà essayé de faire une Hack-Rom de Pokémon Emeraude. Et vous avez sûrement déjà modifié les combats contre Timmy en remplaçant son Tarsal par un Pokémon bien cheaté histoire de donner à ce gamin un peu plus de hype. Seulement, l'illogisme reste : le premier Pokémon que vous le voyez attraper reste Tarsal. Je vais vous apprendre aujourd'hui comment modifier ce combat sur une rom FR ! Pré-requis :
- Advanced Pokémon Sprite Editor (juste pour connaître le numéro du Pokémon)
- Une calculatrice pouvant passer en mode "programmeur" (celle de Windows par exemple)
- Un éditeur hexadécimal (HxD par exemple)
- De la concentration (sans déconner ?)
Les offsets B0886 et B0887 (sélectionnés en bleu) sont ceux que nous allons modifier pour transformer la commande de multiplication en commande d'addition.
- Si vous souhaitez remplacer Tarsal par un Pokémon de génération 1 ou 2, remplacez le 49 par 00.
- Si vous voulez le remplacer par un autre Pokémon de 3ème génération, remplacez le 49 par FF.
Petite précision, si vous souhaitez modifier son niveau, remplacez le 05 de l'offset B0888 par le niveau de votre choix converti en hexadécimal.
La commande que nous venons de modifier (en rouge) va donc additionner FF soit 255 à notre nombre de base.
L'encadré vert correspond à tout ce que nous devons modifier et se présente sous le schéma XX21YY31.
Les "XX" correspondent à notre nombre de base et les "YY" sont le nombre à ajouter.
Evidemment, il faut remplacer la partie représentée par XX à présent. Pour cela, nous allons utiliser Advance Pokémon Sprite Editor, afin de connaître le numéro du Pokémon souhaité par ordre d'insertion.
Lancez le logiciel, charger votre rom et rendez-vous sur le Pokémon de votre choix en utilisant le menu déroulant. Son numéro d'insertion apparaît dans "Species Number".
Relevez ce numéro (ici 387) et ouvrez votre calculatrice en mode programmeur. (celle de Windows par exemple)
- Si votre Pokémon est de 1ère ou 2ème génération, cliquez sur "éc", rentrez le nombre et cliquez sur "Hex" pour le convertir en hexadécimal.
- Si votre Pokémon est de 3ème génération, cliquez sur "éc" rentrez le nombre, puis soustrayez-lui 255 et cliquez sur "Hex" pour convertir le résultat en hexadécimal.
Dans l'encadré vert se trouve notre formule finale. 84 sera additionné à FF et ainsi Lumivole sera généré !
...
Ou pas.
À la base, le combat est programmé pour que le Tarsal attrapé par Timmy soit obligatoirement mâle. Donc le jeu se fige si vous le remplacez par un Pokémon exclusivement femelle.
Si vous vous en tapez, vous avez terminé. Si non, réglons ce problème dès maintenant.
Dans votre éditeur hexadécimal, atteignez l'offset 68037 et remplacez le 06 par 20. Et voilà !
/!\ Attention cependant à ne pas remplacer Tarsal par un Pokémon que Zigzaton est incapable d'affaiblir, tel qu'un Pokémon de type Spectre !
Par Mickey`, Unifag et Julink.
Merci à Link et Arnikum Plus.
yago58 - 5 août 2014 à 16:33 Et hop dans la biblio, tu peux mettre tes 3-4 ligne pour le niveau. Bon boulot, continues comme ça.
Julink - 5 août 2014 à 16:37 Déjà mis pour le niveau, juste au dessus du dernier screen. Merci beaucoup.
Pixel967 - 5 août 2014 à 17:28 Good
Mickey` - 5 août 2014 à 18:07 Salut, Bon tuto, cependant, pour trouver le numéro du Pokémon à écrire, tu fais beaucoup de calculs... pour pas grand chose. Il est inutile de convertir le numéro de ton Pokémon en binaire, de le diviser par 10, puis de le convertir en hexadécimal... En fait, 10 en binaire = 2 en décimal (et donc 2 en hexadécimal). Il suffit donc, quand tu as le numéro de ton Pokémon, de le diviser par deux et de le convertir en hexadécimal. Exemple : Numéro de Tarsal : 392 --> 392/2 = 196 = $C4 Numéro de Spinda : 308 --> 308/2 = 154 = $9A Numéro de Rayquaza : 406 --> 406/2 = 203 = $CB Ah, et autre chose, ton éditeur hexadécimal... =X
Julink - 5 août 2014 à 18:20 Effectivement, n'ayant pour l'instant que peu travaillé sur de l'hexa et jamais sur du binaire, je ne me suis pas rendu compte. ^^' Pour l'éditeur j'ai pris ce que j'avais sous la main. Tu en aurais un à me conseiller ? Edit : j'ai changé les calculs du tuto du coup.
yago58 - 5 août 2014 à 18:39 hxd trouvable sur PL
Mickey` - 5 août 2014 à 20:30 Il me semble que c'est mieux Je te conseille également HxD, il est complet et bien foutu !
Julink - 5 août 2014 à 20:54 Ok, super, merci les gars !
Megadrifter - 6 août 2014 à 22:09 Joli tuto ! http://www.pokemontrash.com/jeux-pokemon/modifier-pokemon-timmy-emeraude.php
Mickey` - 6 août 2014 à 23:25 Par contre, je suis désolé de t'embêter encore, mais... à quoi sert le script ? Ca n'en n'est pas un en fait, c'est juste des données interprétées en tant que script par XSE. C'est juste que la commande warp6 se traduit en hexadécimal par $C4, mais si on change le $C4, le script va aussi changer. Par exemple, si le Pokémon choisi est un Kaïminus, le script se transformera en applymovement. Dans le tuto, le Spinda transformera la commande en darken. Tout ça pour dire que le script ne sert à rien, et est même erroné : XSE est un logiciel qui ne réfléchit pas (un logiciel ne sait faire que ce qu'on lui apprend) : il interprète toutes les données qu'on lui donne. C'est d'ailleurs pour ça que quand des problèmes d'offsets apparaissent, on a des scripts très bizarres, c'est parce que XSE interprètent les données sans réfléchir. Cette partie est donc inutile.
Julink - 7 août 2014 à 09:33 En même temps, pour l'instant je ne suis pas très bon, et c'est mon premier tuto. Je modifierais peut-être ça quand je serai sur un PC. Et merci pour l'ajout sur le site.
Julink - 7 août 2014 à 17:49 Par contre ça pose problème au niveau des Pokémon dont la valeur divisée par deux tombe sur un nombre à virgule en décimale : en hexa, il tombe pile entre deux valeurs. Si on prend NidoranF pour exemple, sa valeur en hexa est 1D SANS LA DIVISION. En divisant par deux ça donne E<1D/2<F. Comment pourrait-on alors procéder ? Y aurait-il une autre valeur à changer dans un autre offset ? EDIT : Je viens de trouver que pour les Pokémon 0 à 251, il faut modifier l'offset B0887 en rentrant 00 à la place de 49 et dans ce cas, à l'offset B0884, c'est juste le numéro du Pokémon en hexa. Sauf que ça ne marche ni pour les Pokémon exclusivement femelles, ni pour les Pokémon asexués. Je suis encore en train de faire des recherches la-dessus mais ça semble compliqué pour le moment.
Mickey` - 7 août 2014 à 18:17 Exact, je n'y avais pas pensé. Mais que ce soit avec ma technique ou ce que tu avais dit avant, le résultat est le même : Soit NidoranF, de numéro 29 = $1D = b11101. $1D/2 = $E $E*2 = 1C = 28 b11101/10 = b1110 b1110*10 = b11100 = 28 Le résultat est donc bien le même. Tu as essayé pour voir ce que ça donne ?
MikaZ - 7 août 2014 à 19:01 La c'est con. On se fait avoir par de simple nombre impair. Donne nous le résultat et on verra.
Julink - 7 août 2014 à 19:27 > EDIT : Je viens de trouver que pour les Pokémon 0 à 251, il faut modifier l'offset B0887 en rentrant 00 à la place de 49 et dans ce cas, à l'offset B0884, c'est juste le numéro du Pokémon en hexa. Sauf que ça ne marche ni pour les Pokémon exclusivement femelles, ni pour les Pokémon asexués. Je suis encore en train de faire des recherches la-dessus mais ça semble compliqué pour le moment.
Mickey` - 8 août 2014 à 00:56 Alors après pas mal de recherches avec Unifag, nous avons trouvé (enfin surtout lui) un moyen de choisir n'importe quel Pokémon, mais en réalité pas tous. Si on décompile l'ASM à l'offset B0884, voici ce qu'on obtient : ``` 080B0884 21C4 mov r1,#0xC4 080B0886 0049 lsl r1,r1,#0x1 ``` mov r1, #0xC4 permet de choisir le numéro du Pokémon lsl r1, r1, #0x1 le multiplie par deux Etant donné que la valeur maximale d'un octet est $FF = 255, l'astuce est de faire une addition. Je m'explique : si le numéro du Pokémon est égal ou inférieur à 255, on ne fait rien. S'il est supérieur à ce nombre, on ajoute une valeur $X telle que $FF + $X = Numéro du Pokémon. La commande add permet de faire ceci. ``` mov r1, #0xFF add r1, #0x7D ``` (C'est un exemple) Dans ce cas présent : $FF + $7D = $17C = 380, ce qui fait donc apparaître Mangriff. Si on veut faire apparaître un Pokémon dont le numéro est inférieur ou égal à 255, on additionne tout simplement 0. ``` mov r1, #0x8C add r1, #0x0 ``` Ici, $8C + $0 = $8C = 140, ce qui fait appraître Kabuto. Ces deux instructions, une fois compilées, donnent ceci : XX21YY31 XX, c'est le nombre de base, et YY, c'est le nombre à ajouter. Toujours en hexadécimal ! Dans l'exemple du Mangriff, on écrira donc FF217D31. Ou 7D21FF31, au choix, c'est une addition, peu importe l'ordre Il faut écrire ces données à l'offset B0884. Cependant, il s'avère qu'il y a un problème : le jeu "force" le Pokémon à être mâle. En fait, le jeu fait une boucle tant que le Pokémon n'est pas mâle jusqu'à qu'il le soit. Cependant, si le Pokémon est forcément femelle, ou bien asexué, il ne pourra jamais être mâle, ce qui provoquera une boucle infinie et bloquera votre jeu. Ainsi, ces deux catégories de Pokémon ne peuvent pas être utilisés pour Timmy. Ou bien il faut encore modifier d'autres données, mais là, c'est beaucoup de travail pour pas grand chose, je trouve Encore merci à Unifag pour son aide ! Bonne soirée
TheCaptainSnow - 8 août 2014 à 01:09 Problème du sexe résolue, remplacer simplement ce qui se trouve à l'offset 0x068036 par #0020
Julink - 8 août 2014 à 11:01 > Alors après pas mal de recherches avec Unifag, nous avons trouvé (enfin surtout lui) un moyen de choisir n'importe quel Pokémon, mais en réalité pas tous. Si on décompile l'ASM à l'offset B0884, voici ce qu'on obtient : ``` 080B0884 21C4 mov r1,#0xC4 080B0886 0049 lsl r1,r1,#0x1 ``` mov r1, #0xC4 permet de choisir le numéro du Pokémon lsl r1, r1, #0x1 le multiplie par deux Etant donné que la valeur maximale d'un octet est $FF = 255, l'astuce est de faire une addition. Je m'explique : si le numéro du Pokémon est égal ou inférieur à 255, on ne fait rien. S'il est supérieur à ce nombre, on ajoute une valeur $X telle que $FF + $X = Numéro du Pokémon. La commande add permet de faire ceci. ``` mov r1, #0xFF add r1, #0x7D ``` (C'est un exemple) Dans ce cas présent : $FF + $7D = $17C = 380, ce qui fait donc apparaître Mangriff. Si on veut faire apparaître un Pokémon dont le numéro est inférieur ou égal à 255, on additionne tout simplement 0. ``` mov r1, #0x8C add r1, #0x0 ``` Ici, $8C + $0 = $8C = 140, ce qui fait appraître Kabuto. Ces deux instructions, une fois compilées, donnent ceci : XX21YY31 XX, c'est le nombre de base, et YY, c'est le nombre à ajouter. Toujours en hexadécimal ! Dans l'exemple du Mangriff, on écrira donc FF217D31. Ou 7D21FF31, au choix, c'est une addition, peu importe l'ordre Il faut écrire ces données à l'offset B0884. Cependant, il s'avère qu'il y a un problème : le jeu "force" le Pokémon à être mâle. En fait, le jeu fait une boucle tant que le Pokémon n'est pas mâle jusqu'à qu'il le soit. Cependant, si le Pokémon est forcément femelle, ou bien asexué, il ne pourra jamais être mâle, ce qui provoquera une boucle infinie et bloquera votre jeu. Ainsi, ces deux catégories de Pokémon ne peuvent pas être utilisés pour Timmy. Ou bien il faut encore modifier d'autres données, mais là, c'est beaucoup de travail pour pas grand chose, je trouve Encore merci à Unifag pour son aide ! Bonne soirée Comme tu vires le 49, y'a plus la division par deux, donc l'addition ne sert qu'aux Pokémon de 3ème génération si j'ai bien compris. > Problème du sexe résolue, remplacer simplement ce qui se trouve à l'offset 0x068036 par #0020 Je teste tout ça de suite ! Edit : Ça marche, bordel ! Ça marche ! :D
Mickey` - 8 août 2014 à 11:42 C'est exactement ça, le "49 00" multiplie le nombre par deux. Comme on le remplace "XX 31", ça ne multiplie plus par deux mais ça ajoute un nombre qu'on choisit
Arnikum Plus - 8 août 2014 à 13:51 Et pour l'Aspicot du vieillard à Jadielle?
Julink - 8 août 2014 à 14:30 > Et pour l'Aspicot du vieillard à Jadielle? Il faudrait trouver trouver l'offset correspondant et regarder si c'est la même formule, auquel cas on le modifierait de la même manière je pense.
Arnikum Plus - 8 août 2014 à 14:33 Je doute que ce soit pareil, le vieux n'appelle pas de Pokémon contrairement à Timmy.
TheCaptainSnow - 8 août 2014 à 15:11 Pour RF c'est à l'offset 07F8B0 que ça se passe, il suffit de remplacer le 0D par le numéro du voulu (la limite est 255, on ne peut pas utilisé l’addition pour dépassé la limite cette fois), et le 05 juste après par le niveau du pokémon. En cas de problème lié au sexe du pokémon c'est à l'offset 03DE16 que ça se passe, il suffi de remplace 0006 par 0020.
Julink - 8 août 2014 à 17:32 T'es vraiment bon, Unifag.
yago58 - 8 août 2014 à 17:40 oOui il est bon, tu pourrais apprendre pas mal de lui comme de Mickey
Arnikum Plus - 9 août 2014 à 21:17 Je me sens à l'écart T-T
TheCaptainSnow - 9 août 2014 à 21:35 Tous comme Myst et lui même, il ne t'a pas cité simplement parce-que Mickey et moi somme les seuls à nous être lancer dans l'asm et qu'on maitrise beaucoup mieux le fonctionnement du jeu (certain appellerais ça hexadécimal), ce qui nous permet de faire plus de chose. Mais tkt tu fais partie des bons
yago58 - 9 août 2014 à 21:53 Je rêve, Arnikum est vexé ^^ Nan t'es un bon, si je devais citer les membres de confiance dans cette section tu ferais parti du lot. tient d'ailleurs (ne pas tenir compte de l'ordre) : -Myst -Unifag -Mickey' -Baitot -Arnikum plus -Undi -Aquafred -Pixel (heureux ? ) Edit Unifag: -Yago Pardon à ceux que j'ai oublié :-[ :'(
Pixel967 - 9 août 2014 à 21:57 Oui moi :( PS : je plaisante Oh merci beaucoup
TheCaptainSnow - 12 août 2014 à 01:48 Comme le tuto à était mis sur le mini-site et qu'il est en partie faux et incomplet ce serait bien qu'il sois refait, tiens nous informé si tu compte t'en occuper ou non julink.
Julink - 12 août 2014 à 09:53 Je compte m'en occuper, ne vous inquiétez pas ! Mais là pour l'instant j'ai un peu la flemme, et je pleure Robin Williams... :'(
Julink - 13 août 2014 à 11:40 Et voilà, j'ai mis le premier post à jour !
TheCaptainSnow - 13 août 2014 à 12:15 C'est du tous bon, une petite remarque avec l'offset pour rf et l'aspicot du vieux aurait était bien puisque la méthode est presque pareil (a part qu'on est bloquer à #0xFF cette fois, l'addition ne pouvant être faite par manque de place). J'avais pas pensé au coup du type spectre mais il se passe quoi?
Julink - 13 août 2014 à 13:25 Ben si tu mets un type spectre (j'ai essayé avec Ténéfix pour voir), Zigzaton lance des Charge dans le vide puisque le type Spectre est immunisé au type Normal, et comme il n'est jamais affaibli Timmy ne lance jamais sa Pokéball. J'ai pas essayé de faire passer des dizaines de tours, mais je pense qu'au final Zigzaton est mis K.O. soit par Ténéfix, soit par le contrecoup de Lutte.
Darkrai-X - 17 décembre 2014 à 22:28 > Je rêve, Arnikum est vexé ^^ Nan t'es un bon, si je devais citer les membres de confiance dans cette section tu ferais parti du lot. tient d'ailleurs (ne pas tenir compte de l'ordre) : -Myst -Unifag -Mickey' -Baitot -Arnikum plus -Undi -Aquafred -Pixel (heureux ? ) Edit Unifag: -Yago Pardon à ceux que j'ai oublié :-[ :'( AH, ben j'avais pas vu ça, merci!
