Comment créer un code ?
Le but quand on créé un code c'est de trouver l'adresse en question, c'est ensuite la valeur qu'on choisira qui donnera l'effet voulu.
Au vu des milliers d'adresses possibles, on ne peut pas juste essayer des adresses au pif jusqu'à ce que ça marche. C'est possible, mais vu le temps que ça mettrait, ce serait encore plus simple de faire sans le code.
La méthode consiste à filtrer ces adresses selon leur valeur, et de répéter les filtrages jusqu'à avoir une liste d'adresses courte (et souvent une seule).
Pour cela, on peut utiliser psx emulation cheater (PEC) pour l'émulateur ePSXe.
On va prendre un exemple concret : cherchons le code FF VIII qui détermine le nombre de Gils.
Le plus simple, sera de faire varier la valeur de cette adresse afin de filtrer le plus possible :
- Je suis à Balamb, devant la boutique avec 5000 Gils.
- J'accède au chercheur de codes de PEC : Ctrl+H, et on voit cette fenêtre :
Cette fenêtre apparaît toujours, mais les filtres proposés diffèrent selon si le premier filtrage ou si c'est la suite d'un précédent filtrage.
Pour notre premier filtrage, voilà les options :
Search for (chercher) :
- Equal Value : valeur égale à
- Not Equal Value : valeur non-égale à
- Range : fourchette de valeurs
Data type (type de données/adresses) :
- 1 byte : 1 octet - valeur de 00 à FF (255)
- 2 bytes : 2 octets - valeur de 0000 à FFFF (65535)
- 4 bytes : 4 octets - valeur de 00000000 à FFFFFFFF (4294967295)
Data base : ça vous laisse le choix entre chercher les valeurs en décimal ou en hexadécimal
Value : la valeur qu'on cherche (selon ce qu'on a mis dans "search for"). dans le cas d'un Range on aura deux cases (minimum et maximum).
Search range : permet de ne chercher qu'une trache d'adresses, utile si vous savez déjà à peu près où votre adresse se trouvera. mais laissez "complete memory" tant que vous êtes pas sûrs.
Dans mon cas, j'ai 5000 Gils sur moi. Donc je choisis :
Search for : equal value
Data type : comme j'ai déjà 5000, ça ne peut pas être 1 byte (valeur limitée à 255). Je choisis 4 bytes : je sais que la valeur maximale des Gils est 99999999 qui est plus grande que le maximum pour 2 bytes 65535.
Data base : décimal, c'est plus simple pour cette recherche, enfin pour moi en tout cas.
Value : 5000 (la valeur de l'adresse que je cherche)
Search range : Complete memory fait très bien l'affaire.
Ensuite, j'appuie UNE SEULE FOIS sur le bouton "Search" en bas : le premier filtrage est fait.
Un message apparaît au dessus de la grosse case blance : Founded Adresses (adresses trouvées): 2.
PEC a donc trouvé 2 adresses de 4 bytes qui sont égales à 5000 à ce moment là du jeu. Elles sont affichées dans la grosse case blanche.
/!\ Dans le cas où PEC trouvent trop d'adresses, il n'en affichera aucune. Mais le filtrage est réussi et on peut le continuer. J'essaierai d'aborder un exemple plus tard. /!\
Cela me suffit pour tester, car il n'y a que 2 tests à faire. Je double clic sur chacune des deux adresses, et à chaque fois j'ai le droit d'entrer une nouvelle valeur : j'en choisis deux différentes : adresse 1 aura une valeur de 8 et adresse 2 aura une valeur de 2000.
Je retourne dans le jeu : bouton Resume Emulation. Je regarde le nombre de Gils que j'ai : 8.
Je vens un objet d'une valeur de 50 gils pour être sûr qu'il m'a trouvé l'argent réel. Si j'ai 58 gils à la fin de la transaction, alors je sais à 100% que c'est la bonne adresse.
Et vu que ça a marché, je peux noter cette adresse et en faire un code. Retournons sur le chercheur de code : Ctrl+H.
Je peux noter mon adresse à la main, ou alors je clique sur l'adresse voulu puis je clic sur le bouton "copy" à droite pour l'avoir dans le presse-papiers :
8007831C
Par défaut, PEC affiche les adresses avec la fonction 80 en utilisant son premier byte. Effacer alors les deux premiers chiffres pour voir la vraie adresse. Mais maintenant, il faut quand même adapter ce code pour l'utiliser.
On a une adresse de 4 bytes qui commence par 07831C :
07831C
07831D
07831E
07831F
Je peux faire le code en utilisant la fonction 30 :
3007831C 00??
3007831D 00??
3007831E 00??
3007831F 00??
Les valeurs inscrites sur "??" se cumulent. Mais il faut prendre en compte l'ordre des bytes :
- le premier donne un montant entre 1 et 255
- le deuxième donne un montant entre 256 et 65280
- le troisième donne un montant entre 65536 et 16711680
- le quatrième donne un montant entre 16777216 et 78190080
En fait, c'est simple mais je suis naze pour expliquer. Ce qu'il faut comprendre c'est qu'on écrit les derniers chiffres du montant voulu sur les premiers octets.
Mettons que je veuille 99,999,999 Gils (le max naturel du jeu). Dans un premier temps, il faudra convertir 99999999 en hexa pour que PEC ou les AR le comprenne.
La calculette Windows le fait très bien ou sinon : http://www.statman.info/co/conversions/hexadecimal.html
Et donc 99999999 = 5F5E0FF
Voyons comment insérer 5F5E0FF sur ces 4 bytes : 05 F5 E0 FF =>
Byte 1 : FF
Byte 2 : E0
Byte 3 : F5
Byte 4 : 05
Voilà donc mon code entier avec la fonction 30 (écriture constante sur 1 byte) :
"99999999 Gils
3007831C 00FF
3007831D 00E0
3007831E 00F5
3007831F 0005
Mais 4 lignes de codes ça fait beaucoup. Heureusement, les AR (dont PEC) ont pour la plupart la fonction 80 (écriture constante sur 2 bytes).
Prenons l'adresse qu'avait trouvé PEC : 07831C. Si j'utilise un code 80, ça me donne :
8007831C YYZZ (ZZ est l'octet de 07831C et YY est l'octet de 07831D)
8007831E ??XX (XX est l'octet de 07831E et ?? est l'octet de 07831F)
Et maintenant entrons notre nombre hexadécimal là dedans : 05 F5 E0 FF =>
Byte 1 : FF
Byte 2 : E0
Byte 3 : F5
Byte 4 : 05
Alors :
8007831C E0FF
8007831E 05F5
Si je veux un nombre qui tient sur 3 bytes, et que je veux pas toucher au quatrième je peux aussi combiner un 80 et un 30, c'est pas interdit ^^. Si par exemple je veux 99,999 Gils = 01 86 9F alors je peux :
8007831C 869F
3007831E 0001
J'espère que jusque là c'est clair. Je vais essayer de me grouiller pour les explications sur quand on a besoin de filtrer plusieurs fois.
Il me restera à aborder comment trouver un code quand c'est pas des valeurs connus ensuite et faire un exemple concret avec plusieurs filtrages parce que je pensais pas trouvé l'adresse des Gils aussi vite. Mais en bidouillant un peu on trouve vite comment faire, c'est assez intuitif.