[TUTO GBA] Émeraude FR : Modifier le Pokémon attrapé par Timmy

Pages: [1] 2

Julink

  • Membre
  • 788 posts
05 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 ?)

   La théorie :
Pour commencer, nous allons vous expliquer la procédure. On va se servir de l'ASM, c'est à dire qu'on va modifier les données du combat en passant par l'hexadécimal. La valeur hexadécimale qui va renvoyer à Tarsal se trouve à l'offset B0884. Si on décompile l'ASM à cet offset, nous obtenons ceci:

080B0884 21C4     mov     r1,#0xC4
080B0886 0049     lsl     r1,r1,#0x1

 
"Pourquoi C4 renvoie à Tarsal ?" me demanderiez-vous ? Eh bien, c'est parce que la commande lsl r1, r1, #0x1 multiplie C4 par deux. Ce qui en décimal donne 392, le numéro du fameux Tarsal dans l'ordre des Pokémon, en comptant tous les Pokémon "? ? ? ? ? ? ? ? ? ?" entre Célébi et Arcko. (visibles sur Advanced Pokémon Sprite Editor)
Nous pourrions donc nous servir de ce calcul pour remplacer Tarsal par le Pokémon de notre choix, pensez-vous ? Eh bien c'est plus compliqué que ça.

Le fait est que si la commande qui permet de multiplier par deux a été insérée, c'est pour que les Pokémon dont l'ordre est supérieur à 255 (soit FF) puissent apparaître (puisque que 256 devient 100 et a donc tout ce qui suit a trois caractère).
Cette commande nous empêche de choisir un Pokémon dont la valeur est impair, puisque celle-ci une fois divisée par deux devrait donner un nombre à virgule, or, en hexadécimal les nombres à virgule n'existent pas.
C'est pourquoi nous allons modifier cette fameuse commande afin qu'au lieu de multiplier par deux, elle va ajouter un nombre de notre choix. Vous allez voir, c'est pas si compliqué.

   La pratique :
Pour l'exemple, nous allons remplacer Tarsal par Lumivole.
Tout d'abord, ouvrez votre éditeur hexadécimal et chargez votre rom. Allez à l'offset B0886.
Alors normalement, vous devriez avoir ça :



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.
Dans les deux cas, remplacez le 00 de l'offset suivant (B0887) par 31.
Pour cet exemple, comme nous le remplaçons par Lumivole, nous allons avoir ceci :


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 "Dé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 "Déc" rentrez le nombre, puis soustrayez-lui 255 et cliquez sur "Hex" pour convertir le résultat en hexadécimal.

Relevez votre résultat, et revenez sur l'éditeur hexadécimal.
Remplacez C4 à l'offset B0884 par ce que vous avez obtenu. (ici 84)



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.
« Modifié: 13 août 2014, 11:46 par Julink »

yago58

  • Invité
05 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

  • Membre
  • 788 posts
05 août 2014, 16:37
Déjà mis pour le niveau, juste au dessus du dernier screen.

Merci beaucoup. :)

Pixel

  • Membre
  • 174 posts

Mickey`

  • Membre
  • 2746 posts
05 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

  • Membre
  • 788 posts
05 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. ;)
« Modifié: 05 août 2014, 18:30 par Julink »

yago58

  • Invité
05 août 2014, 18:39
hxd trouvable sur PL

Mickey`

  • Membre
  • 2746 posts
05 août 2014, 20:30
Il me semble que c'est mieux ;)

Je te conseille également HxD, il est complet et bien foutu ! :)

Julink

  • Membre
  • 788 posts
05 août 2014, 20:54
Ok, super, merci les gars !

Megadrifter

  • Membre
  • 6425 posts

Mickey`

  • Membre
  • 2746 posts
06 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

  • Membre
  • 788 posts
07 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. :)
« Modifié: 07 août 2014, 09:36 par Julink »

Julink

  • Membre
  • 788 posts
07 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.
« Modifié: 07 août 2014, 19:26 par Julink »

Mickey`

  • Membre
  • 2746 posts
07 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

  • Membre
  • 367 posts
07 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

  • Membre
  • 788 posts
07 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.
« Modifié: 07 août 2014, 19:29 par Julink »

Mickey`

  • Membre
  • 2746 posts
08 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 :)

Unifag

  • Membre
  • 883 posts
08 août 2014, 01:09
Problème du sexe résolue, remplacer simplement ce qui se trouve à l'offset 0x068036 par #0020

Julink

  • Membre
  • 788 posts
08 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 
« Modifié: 08 août 2014, 11:04 par Julink »

Mickey`

  • Membre
  • 2746 posts
08 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 ;)

Arnik

  • Membre
  • 1812 posts
08 août 2014, 13:51
Et pour l'Aspicot du vieillard à Jadielle?

Julink

  • Membre
  • 788 posts
08 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.  ;)

Arnik

  • Membre
  • 1812 posts
08 août 2014, 14:33
Je doute que ce soit pareil, le vieux n'appelle pas de Pokémon contrairement à Timmy.

Unifag

  • Membre
  • 883 posts
08 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

  • Membre
  • 788 posts
08 août 2014, 17:32
T'es vraiment bon, Unifag. :)

yago58

  • Invité
08 août 2014, 17:40
oOui il est bon, tu pourrais apprendre pas mal de lui comme de Mickey ;)

Arnik

  • Membre
  • 1812 posts
09 août 2014, 21:17
Je me sens à l'écart T-T

Unifag

  • Membre
  • 883 posts
09 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

  • Invité
09 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é  :-[ :'(

« Modifié: 09 août 2014, 22:22 par Unifag »

Pixel

  • Membre
  • 174 posts
09 août 2014, 21:57
Oui moi  :(

PS : je plaisante

Oh merci beaucoup :)
« Modifié: 09 août 2014, 22:27 par Pixel »

Pages: [1] 2    En haut ↑