Codes Pokémon

Lexique des tricheurs

L'informatique est née des mathématiques, c'est pourquoi dès que nous touchons aux entrailles d'une machine, certaines notions sont indispensables à la compréhension du système. Les consoles de jeu font partie de ces machines. Et pour tricher, il faut mettre les mains dedans, si je puis dire. Alors voici un rapide tour des notions qu'il vous faudra connaître si vous souhaitez apprendre à tricher, voire hacker, des jeux.

Base et Modulo

En primaire, vous apprenez tous la notion d'unité, et simultanément de dizaine, centaine et millier. C'est le chiffre le plus à droite d'un nombre lorsqu'on écrit de gauche à droite. Une base définie le nombre de valeurs qui peut être utiliser dans les unités d'un nombre. Nous comptons régulièrement en base 10, autrement dit en décimal. Cela signifie que lorsque j'écrirais les unités d'un nombre, je n'aurai le choix qu'entre 10 valeurs, que vous connaissez tous : les chiffres arabes, qui vont de 0 à 9.

Ces valeurs sont obligatoirement ordonnées. Lorsque nous sommes à la valeur maximale pour les unités et que nous souhaitons continuer de compter, nous devons ajouter 1 aux dizaines. Si on reprend le décimal, après 9, j'ai 10, puisque 9 équivaut à 09 et 1 + 0 = 1. Et pour les unités ? Eh bien nous n'avons pas plus grand, alors il faut repartir de 0. C'est là que l'opérateur modulo intervient, ce terme résume en fait le retour à la valeur initial de la base.

L'opérateur modulo, souvent représenté par % ou MOD, vous donne le reste de la division euclidienne d'un nombre par une base donnée. Si vous divisez 13 par 10, le quotient sera 1 (il y a 1 fois 10 dans 13), et le reste sera 3 (il faut ajouter 3 à 1 × 10 pour avoir 13). Donc 13 % 10 = 3.
Pourquoi vous parler de cet opérateur ? Parce les machines standards ne peuvent pas compter jusqu'à l'infini. Lorsque vous atteignez le maximum, si vous continuez, soit la machine plante, soit elle repart de zéro. C'est aussi pour cette raison que dans certains jeux mal programmés, lorsque vous atteignez le score maximal, vous revenez à zéro.

Décimal

C'est la base 10, la numérotation de notre vie de tous les jours. Les chiffres vont de 0 à 9. Vous connaissez sûrement déjà très bien. Vaut-il la peine que je m'attarde dessus ?

Binaire

C'est la base 2, la base de l'informatique. Les chiffres sont 0 et 1. Une valeur en binaire est couramment précédée de la notation 0b. Le vrai et le faux, l'allumé et l'éteint, ou tout autre sorte d'opposés absolus. Les processeurs des premiers ordinateurs étaient en fait composés d'ampoules.

Ampoule éteinte = 0  Ampoule allumé = 1

Connaître le binaire vous sera utile, par exemple, lorsque vous manipulerez des drapeaux. Pour presque tout le reste, vous devrez penser à l'hexadécimal.

Hexadécimal

C'est la base 16, la plus utilisée dans les outils électroniques, notamment les consoles. Les chiffres vont de 0 à 9, suivi de A, B, C, D, E et F. Une valeur en hexadécimal est couramment précédée des notations 0x ou $. Tout peut être représenté par l'hexadécimal. Des valeurs numériques, dans un premier temps, mais aussi des lettres selon les encodages normalisés, des couleurs, et plein d'autres choses que vous découvrirez avec l'expérience.

Lorsque nous trichons, nous sommes forcément confrontés un jour ou l'autre à l'hexadécimal. D'ailleurs, vous rencontrerez ça dès lors que vous chercherez des codes pour vos Action Replay en tout genre. L'hexadécimal nous sert aussi à comprendre, lire et modifier les sauvegardes des jeux, et les jeux eux-mêmes.

Mémoire vive

La mémoire vive, ou RAM, est le système de stockage des données dynamiques. Par exemple, l'affichage à l'écran passe par la RAM, ainsi que vos Pokémon, vos objets, le lieu où vous vous trouvez, ou encore le temps de jeu. Pour vous donner une représentation plus simple de la RAM, imaginez que la RAM est une très longue rue, dont les adresses commencent au numéro 0, où habitent des valeurs que l'on peut appeler des familles. Les valeurs sont stockées dans ce qu'on appelle des octets, que l'on représentera par des maisons. Et chacun de ces octets a une adresse. Un octet peut contenir une valeur comprise entre 0 et 255, ce qui donne de 00 à FF en hexadécimal, comme si chaque maison pouvait contenir jusqu'à 255 habitants. Les valeurs plus grandes que 255 sont stockées sur plusieurs octets.

Un octet est une somme de valeurs binaires, aussi nommées bits. C'est ici que la notion de drapeau prend son sens, puisqu'un drapeau peut être stocké sur un ou plusieurs bits.
Une valeur sur 4 octets est appelée un mot (ou word). Une valeur sur 2 octets est appelée un demi-mot (ou halfword).

Adresse relative

Vous trouverez ce mot plus souvent que d'autres, sous sa traduction anglaise Offset. Un Offset définit une adresse dont on doit se servir comme point de départ pour en calculer d'autres. C'est-à-dire que si nous cherchons une adresse à partir d'un Offset, il faudra réaliser le calcul suivant pour trouver l'adresse réelle (ou absolue) : adresse absolue = adresse + Offset.

Boutisme

Le boutisme, plus connu sous le nom d'Endianness, est ce qui définie l'ordre de lecture des octets. Le boutisme dépend du processeur, mais certains systèmes forcent le boutisme, notamment pour la compression de données. Dans notre cas, il faut retenir deux boutismes : le gros-boutisme et le petit-boutisme.

Le gros-boutisme n'est pas courant, mais il arrive de le rencontrer dans des données particulières. La lecture des octets d'une valeur se fait de gauche à droite, comme nous lisons un livre ou un nombre. Si, par exemple, la valeur 0x0428AE1F est stockée en dur dans le programme d'un jeu, alors quand on ouvrira le jeu dans un éditeur hexadécimal, les octets s'afficheront comme suit : 04 28 AE 1F.

Le petit-boutisme quant à lui est bien plus courant. La RAM a la plupart du temps une architecture petit-boutiste. C'est-à-dire que la lecture des octets se fait de droite à gauche. Quand on recherche des données dans la RAM, avec un outil de suivi de celle-ci, les valeurs numériques, et parfois d'autres, s'affichent ainsi. Reprenons la valeur 0x0428AE1F. Lorsque vous lirez cette valeur, les octets seront alors dans l'ordre suivant : 1F AE 28 04. C'est un peu difficile à interprêter au début, mais avec le temps, vous devriez vous habituer.

Drapeau(anglais)

Un drapeau, ou plutôt un flag, est une variable qui est contrôlé régulièrement avant l'exécution d'actions. C'est utile dans le cas des événements in-game, comme la rencontre d'un légendaire ou les combats contre les dresseurs. Pour éviter de pouvoir recommencer indéfiniment ces événements, la valeur du flag est modifié une fois l'événement terminé. Comme dit plus haut, c'est souvent stocké sur un bit. Un octet peut contenir jusqu'à 8 flags. Notez que l'ordre de lecture des bits est de droite à gauche. Si je dis le 1er bit, je parle de celui le plus à droite.

Un octet peut être représenté en hexadécimal, mais aussi en binaire. Voici un exemple :

0x46 = 0b01000110

Disons que 0 veut dire que vous n'avez pas battu un dresseur, et 1 que vous l'avez battu. Vous allez combattre un dresseur quelconque. Dans la RAM, le flag du combat est le 4ème bit de l'octet dont la valeur est 0x46. Le jeu va vérifier que le flag ne soit pas à 1. 0b01000110. Le flag est à 0, je n'ai pas battu ce dresseur, le jeu m'autorise à le combattre. Je l'ai battu. Juste après la fin du combat, le jeu va modifier le flag pour le passer à 1. J'aurai donc 0b01001110. Maintenant, si je réessaye de combattre le dresseur, le jeu refusera.

Des événements sur plusieurs étapes seront stockés sur plusieurs bits. Pour un événement en 3 étapes, le flag utilisera deux bits avec les possibilités suivantes : 0b00, 0b01, 0b10 et 0b11.

Décimal codé binaire

Cette notion est un cas particulier de l'utilisation de l'hexadécimal. Dans le cas de Pokémon, on le rencontre sur les versions sorties sur Game Boy, notamment pour l'Argent et les Jetons de Casino. En fait, la valeur sera écrite en décimal dans l'hexadécimal. C'est-à-dire que pour trouver une telle valeur, vous devrez chercher sa valeur décimal dans l'hexadécimal (par exemple : 999 Jetons seront inscrits 0x0999 au lieu de 0x03E7). C'est clairement plus facile pour nous ainsi, mais pour la machine, c'est rarement simple à utiliser.

Somme de contrôle

Une somme de contrôle, ou Checksum pour les intimes, est un moyen de contrôler les données lues. C'est une mesure de sécurité très courante et très efficace, qu'on le retrouve pour les sauvegardes par exemple. Pour vérifier qu'aucune donnée n'est pas corrompue (ou n'a pas été modifiée par un logiciel extérieur), le jeu fait la somme des octets sur une plage donnée (modulo la valeur maximale de la Checksum) et la compare à celle enregistrée auparavant. Si les Checksums sont différentes, alors des modifications imprévues ont été réalisées. Et c'est là que votre jeu vous dit "La sauvegarde est corrompue...".

Par Megadrifter

Par Loris
  • DEUS VULT 06/04/2019 à 18:08
    J'ai rien compris mais je me sens plus intelligent