36.15 [Nespas?]: Ulla peut aller se rhabiller .
Le ROM Hacking expliqué aux enfants

Le guide du débutant pour crâner à la récré par EcstazY
Bonjour ami(e) internaute. Oui, toi, si tu es là, c'est que tu as bien sur un peu d'intérêt dans le rom hacking. Oui, j'aime aborder les mots qui font mal dès le départ, comme ça pas de malaise ou autre. Le rom hacking (ou modification de rom en français) est un domaine qui me tient à coeur. Oui, en effet, sans lui je n'aurais jamais pu découvrir des jeux comme Chrono Trigger ou d'autres, qui n'existent pas en français. Oui, à l'époque je parlais anglais comme une vache espagnole. Et donc qui dit modification de roms dit aussi modifications éventuelles des textes, donc traduction. Mais bon, moi je ne vous montrerais rien d'utiles, enfin pas vraiment. Pas de traduction complexe, comme celle de Chrono, pas de modifications de fou, comme le redesign des circuits de Super Mario Kart, non non. Moi je me suffirais d'une approche d'un débutant pour des débutants. La simple modification de roms NES. Mais oui on va modifier des graphismes, des palettes, du texte, etc... Mais juste des bases. Après, si je vous ai un peu chauffé vous ferez ce que vous voulez, moi je m'en tamponne les amygdales avec une pelle à tarte.

Pourquoi la NES ? Ah toi tu n'es pas d'ici hein ? ;) Cela reste ma console préférée, et j'aime à l'étudier dans ses moindres détails, d'où mon intérêt primaire pour ses fichiers. Mais trêves de bla-bla, on s'en fout de mes histoires à deux sesterces (moi aussi en écrivant je m'endors, c'est dire), commençons.

I - Edition des graphismes

Et oui, on commence par le plus simple, il n'y a pas de raison de se compliquer la vie dès le départ. Oui, la modification des graphismes d'un jeu NES est très simple. C'est d’ailleurs pour ça en partie que l'on se retrouve avec un GoodNES de plus de 8000 roms, alors qu'il n'y a que 800 jeux commerciaux (nombre large, toute cartouches confondues)... Tant de hack à deux francs, c'est déprimant, mais bon, vous n'êtes pas là pour produire votre rom pour la fame, si ? Pourquoi les graphismes de la NES sont si simples à modifier ? Tout simplement car ils ne sont pas compressés. Oui, les graphismes sont stockés bruts dans la rom, et un utilitaire spécial pourra les lire sans problèmes. On peut donc les modifier aisément.

On pourra utiliser simplement NESticle, ou bien un gros classique comme Tile Layer Pro, que vous pouvez télécharger sur le site (les fichiers sont à la fin de ce dossier), pour se simplifier la vie. Je montrerais les 2 méthodes (la méthode émulateur et la méthode éditeur) pour bien faire le panorama de la question. Mais eh, c'est quoi des graphismes NES hein ?

Les graphismes de la NES à l'écran sont une mosaïque de petits carrés de 8 par 8 pixels (appelés tiles). Pour la NES, on peut utiliser 4 couleurs dans ces carrés, avec généralement 3 couleurs réelles, et une de transparence (pour un décor : ce sera noir derrière, pour un sprite, on verra le décor derrière. Enfin transparent quoi...). Bien sur la NES ne peut pas charger les graphismes d'un jeu en entier d'un coup en mémoire. Elle a une limite de 256 carrés (16 par 16) pour le décor, et un autre 256 (encore 16*16...) pour les sprites. Pour nos ami(e)s matheux, nous avons donc 256+256=512 tiles en mémoire. Ils sont partagés en deux tables distinctes, de 256. NESticle permet d'afficher les tiles en cours d'utilisation. Pour bien faire, appuyer sur "p" (la pause du système) et sur "F2" (show pattern table).



A l'écran, malgré le fait que la NES à en mémoire 512 tiles, elle ne peut en afficher que 64 d'un coup, à cause de ses 256 bytes de RAM uniquement pour les sprites. Encore une fois le calcul est simple. On a 256 bytes pour 64 tiles affichables, on a donc 256/64=4 bytes par tiles. D'ailleurs, généralement, le flickering des jeux est souvent du à un dépassement de cette limite de 64, ou si la limite de 8 sprites est dépassée sur la même colonne de l'écran. Nous avons donc deux réservoirs d'images (décor + sprites) et donc deux sets de palettes. Un pour le décor, un autre pour les sprites. Chaque set de palette contient 4 palettes, qui comme écrit au dessus contiennent 4 couleurs, dont une transparente. Pour le décor, chaque lot de 2*2 tiles peut avoir une seule couleur assignée. Pour les sprites, un tile (1*1) a une couleur assignée. Oui, c'est un peu technique dès le départ, mais franchement relisez moi ça la tête dans les glaçons (non, pas ceux de l'apéritif) et vous verrez que ce n'est vraiment pas insurmontable. Promis ;)

Pour commencer les TP, on va triturer la rom de Excite bike. J'adore ce jeu, j'ai toujours tout appris dessus, car il a de tout (graphismes + sprites + textes) de manière simple et rangée. Faites donc une copie de la Rom d'origine, que vous appellerez "NES Pas Supercross.nes" (au hasard) et ouvrez là dans Tile Layer Pro. Une bonne grosse bouillie apparaît, mais si vous descendez dans la fenêtre, vous verrez que cela ressemble quand même à quelque chose.



En cliquant sur un tile (un carré pour ceux qui suivent), vous le voyez en gros plan dans la fenêtre "Tile Editor", avec la palette des couleurs en bas. Vous pouvez donc modifiez le tile en question avec la souris (pixel art power !). Nickel.

Bon vous avez fait joujou, c'est bien. Maintenant faites une copie de la rom que vous modifiez. Appelez la "presse papier.nes". Editez le premier carré en haut à gauche pour en faire un carré tout noir. Faites des glissez déposez sur toutes les cases de la ligne pour faire une ligne complète de noir. Puis copiez cette ligne en sélectionnant la ligne avec un clic droit. Copiez collez cette ligne, pour obtenir deux ligne noir. Bref. Transformez votre rom en rom toute noire. A la fin vous devez avoir une superbe grille pleine de noir. A quoi tout ceci peut bien nous servir ? C'est une future base de travail pour pouvoir éditer facilement une rom. La grille est là, l'exportation d'une image sera toute simple, à partir de cette grille. Un bon presse papier de tiles quoi, comme son nom l'indique si bien !



Bon là dans Tile Layer Pro vous avez fait joujou avec vos tiles. Bien. Pour pouvoir jouer avec la rom modifiée, vous devez bien sur "enregistrer" votre rom... Et vous pouvez tester, ça marche. Il existe une autre méthode plus simple pour ceux qui ne voient vraiment pas à quoi correspondent les tiles d'un jeu. En effet on se retrouve quand même la plupart du temps avec une grosse bouillie crado de pixels. Alors pour retrouver où va quoi, c'est peu évident. Vous connaissiez NESticle comme émulateur ? Oui, tout le monde le sait, c'est le meilleur malgré le fait qu'il soit ancien, tous les jeux NES tournaient à merveille sur un 486, une vraie perle et bla bla bla... mais c'est aussi un formidable outil d'édition de rom ! Démonstration.

Comme tout au long de ce dossier, ouvrez la rom de Excite. Lancez une partie et faites un bon gros "p" (pause" puis "F2" (pour voir la palette des tiles). Là, si vous avez suivi l'étape Tile Layer Pro, vous reconnaissez. Les tiles de l'écran en cours apparaissent devant-vous. Un double clic sur un tile, et hop vous entrez en mode "modification". Allez, moi je vais me redesigner cette moto, ce look 1980 me fatigue les yeux, hop. Un peu de dessin et c'est bon. Superbe.



Maintenant pour enregistrer votre rom fraîchement modifiée, hop, "fichier" puis "enregistrer VROM" et c'est bon. VROM pour Virtual Rom pour ceux qui ont le cerveau lent (le cerf volant, ah ah ah).

Hop vous avez fait votre première modification de rom. Culte. Allez donc pissez partout pour montrer votre joie. Yahou. Maintenant des remarques. La modification de 2 sprites sera un peu légère pour modifier l'aspect d'un sprite. Par exemple, la vibration de la moto utilise en fait plusieurs sprites. Pareil si on lève la roue avant, etc. Un héros est donc une suite de nombreux sprites. Et si vous en modifiez un, il faut tous les modifier, sinon c'est vraiment laid. Par exemple la plupart des hacks de Super Mario Bros 1 ne modifient pas l'allure de Mario qui glisse après avoir couru... Donc vous courez avec Zelda, vous faites une demi tour et vous retrouvez Mario, c'est ridicule (je hais les hacks de Mario 1).

Voila, fin de cette première partie, c'est déjà énorme !

II - Modifications Hexadécimales

Et oui, depuis le temps que ce mot vous fait peur, il va falloir s'y mettre. Ce n'est vraiment pas compliqué, et c'est véritablement nécessaire pour bien progresser (et accessoirement pouvoir comprendre des blagues de geeks à base de code hexa). Pour commencer il faut un éditeur hexadécimal. Personnellement je recommande l'usage de Hex Workshop, qui me suit depuis de nombreuses années, et qui fait tout ce que je lui demande. Bon après vous faites ce que vous voulez, moi je donne des conseils, c'est tout... Mais Hex Workshop ne fait que lire les fichiers. Normal. Pour supporter les tables (j'en reparle dans 30s) il vous faut un éditeur spécial. Personnellement je vous recommande Translhextion (en téléchargement en bas), qui supporte la lecture d’un fichier (une rom pourquoi pas) via une table. Nous ça nous va superbement, nickel.

Maintenant, qu’est ce vraiment que l’hexa ? Tous les informaticiens vous le diront, c’est simple. Mais un peu d’histoire ne fait pas de mal. Oui, j’appelle ça de l’histoire, mais c’est une manière de parler, pas de chichis. Les nombres binaires étant de plus en plus longs en informatique, il a fallu introduire une nouvelle base : la base hexadécimale. La base hexadécimale consiste donc à compter sur une base 16, c'est ainsi qu’au-delà des 10 premiers chiffres on ajoute les 6 premières lettres : 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.

On obtient donc logiquement le tableau comparatif suivant :


Déc.....Hex

0.......00
1.......01
2.......02
3.......03
4.......04
5.......05
6.......06
7.......07
8.......08
9.......09
10......0A
11......0B
12......0C
13......0D
14......0E
15......0F
16......10
17......11
...........
159.....9F
160.....A0
...........
255.....FF


Ainsi dans un jeu, les valeurs hexadécimales iront de 00 à FF, et représenteront aussi bien des variables de niveaux, de sprites, de textes, de statistiques, etc… Mais comment savoir à quoi correspond quoi ? Ah ah ah (rire de géant vert) c’est ce que je vais tenter de vous montrer dans le reste de ce dossier. Asseyez-vous et lisez (en même temps si vous êtes debout en lisant mon dossier, c’est triste).

III - Modifications de palettes

Voila l’une des parties les plus simples du rom hacking NES. Oui, depuis le début je dis que c’est simple, c’est à se demander l’intérêt de ce dossier hein ? Et bien non petit grigou ! Vous n’auriez vraisemblablement jamais eu l’idée de modifier la rom d’excite pour faire le crâneur. Bon en même temps c’est normal, il n’y a que les personnes nécrophiles sur personne atteintes de la lèpre qui ont les mêmes envies que moi à ce niveau. Enfin…

Tenez, ouvrez donc NESticle, et Excite. Hop, ouvrez l’éditeur de palette grâce à une superbe pression sur F4. Oh, la palette du jeu ! On se retrouve face à un tableau avec deux lignes de carrés de couleurs. La première ligne représente les couleurs pour les sprites, et la deuxième pour les décors. En double cliquant sur la couleur que l’on désire modifier, une nouvelle fenêtre apparaît. Elle contient plusieurs informations :



Le gros carré avec marqué « 02 » représente la valeur hexadécimale de la couleur, telle que la NES la connaît dans ses palettes. Les 3 barres représentent les valeurs RGB (Red Green Blue ou Rouge Vert Bleu pour nos ami(e)s qui n’aiment pas l’anglais. Et oui il y en a…) qu’utilisent NESticle pour reproduire cette couleur. Vous pouvez modifier pour rigoler un bon coup (ah ah j’en ris encore ah ah) les palettes telles qu’elles s’affichent à l’écran avec NESticle. Mais qu’avec l’émulateur. Une fois fermé, le jeu retourne à la normal et il n’y a rien de changé. Or si on veut modifier les palettes ce serait pas mal de pouvoir quand même sortir une ROM spéciale… Poursuivons donc.

Prenez les carrés de la palette de votre choix par paquet de 4, et notez dans leur ordre les valeurs des 4 couleurs de cette palette. Dans mon cas, avec Excite on a une superbe palette : « 0220160F » qui se lit en fait comme la couleur 02 + la couleur 20 + la couleur 16 + la couleur 0F. Vous suivez ? Ca me rassure en même temps, je serais assez vexé sinon, surtout vu le niveau de mâchage de ce dossier. Mon dieu ma bonté me perdra.

Ouvrez l’éditeur hexadécimal et recherchez cette chaîne hexa. Si tout va bien vous avez au moins une occurrence. Et bien vous modifiez la valeur que vous voulez changé dans cette chaîne hexa par celle que vous voulez. Non, pas celle que vous voulez, mais n’importe quelle valeur de la palette de la NES en suivant ceci :



Et c’est tout. Franchement c’est simple.



Mais il arrive que parfois, il n’y ai aucune occurrence de la chaîne des couleurs. Et bien c’est tout simplement que les palettes sont stockées d’une autre manière, et varie en cours de jeu. On a ce problème pour Kid Icarus où Pit change de couleur comme de niveau, et Metroid où Samus change de couleur quand il change d’arme.

Dans ces cas là, vous verrez que dans les groupes de 4 carrés de palette, il y a 2 valeurs fixes. Dans le cas de Kid Icarus, après test, on voit que les deux valeurs sont le blanc et le noir, ec qui est le cas dans 98% des cas et que les deux autres sont amenées à bouger dans le jeu.



On doit donc pour modifier tout ça rechercher les deux premières valeurs dans le fichier (en hexa pour ceux qui suivent). Aux occurrence, il fau faire des tests, car se baser juste sur 2 paires dans la vue en hexa peut tout casser, car on ne peut savoir par avance ce que ces deux valeurs seront réellement, une palette ou autre chose. Une fois ces deux valeurs trouvées, il faut modifier les deux d’après, comme dans la méthode classique. Rien de plus bête, il fallait juste le savoir. Encore une fois, simple. Il arrive cependant que dans 2% des cas cela ne fonctionne pas, car la palette est stockée d’une autre manière.

De temps en temps on voit une palette qui clignote. Oui, dans ce cas, pas de hasard, il faut faire pause à chaque fois dans le jeu, noter l’adresse de la première couleur, puis remettre le jeu en route, en refaisant pause, pour voir ce qui a changé, prendre la valeur de la couleur, et hop. Fatiguant.

Une autre diablerie restera les systèmes propriétaires, les astuces de programmation. Mon seul exemple, malgré le fait que je sois convaincu qu’il y en ai d’autres, est la lave de Fire Man dans Megaman 1, on a une table des couleur de 5 bytes juste pour le cycle des animations de la lave !

Si vous ne trouvez toujours pas, pas d’affolement, c’est juste que la palette est diaboliquement bien caché. Regardez donc celles de Megaman 6 et pleurez. Après il faut des techniques plus barbares pour s’en sortir. Je vous dirais juste que c’est la base de la corruption de rom pour trouver. Je verrais ça peut-être plus tard, nous verrons si vous ne vous êtes pas endormis entre temps.

Mais modifier une palette c’est bien c’est fun, mais ce n’est tout de même pas la folle ambiance. Et bien continuons. Je vous ai dis au départ que là vous ne ferez rien de bien vraiment utile, mais que vous saurez au moins tout faire. Modifions maintenant les textes d’une ROM.

IV - Modifications des textes

Voila une partie amusante, en tout cas à mes yeux. C'est sympathique de modifier un texte, car après on jouera avec sa rom à soit. C'est vrai c'est très con, mais la vie est faite de choses futiles. Et heureusement. La modification de textes de jeux NES est une chose relativement facile. Les textes sont généralement non compressés, c'est à dire qu'ils peuvent être lus directement dans la rom. Directement ? Oui enfin après une petite transformation tout de même.

Techniquement les textes du jeu sont stockés dans le fichier. Ils sont juste "cryptés" si je puis dire. Avec la bonne clé de décryptage ils apparaissent comme évident. Maintenant comment trouver cette clé ? Ah ah ah :)

Il existe deux méthodes. La première utilise NESticle, encore et toujours. On charge le jeu, et après un F2, on regarde où se situe la lettre A. Simple, dans Excite on voit que la lettre A correspond à l'adresse 0A (en double cliquant dessus, l'adresse apparait dans la barre des titre).



En regardant l'adresse de B on voit qu'elle est à 0B. L'adresse de C est 0C, etc... On obtient alors une table de correspondance entre les lettres réelles et leurs adresses dans la rom sous la forme :

0A=a
0B=b
0C=c
0D=d
0E=e
0F=f
10=g
11=h
12=i
13=j
14=k
15=l
16=m
17=n
18=o
19=p
1A=q
1B=r
1C=s
1D=t
1E=u
1F=v
20=w
21=x
22=y
23=z


Qui est la table du jeu. Là je n'ai pas mis les "!" et autres "espaces" ou "?" car c'est juste pour vous montrer comment cela se passe. Et cette table est la clé qui permettra de lire le texte directement dans la rom.

La deuxième méthode est plus simple. A l'aide de SearchRX, on ouvre la rom. Le programme nous l'affiche, en hexa, propre. On tape dans le moteur de recherche un bout de texte pris dans le jeu. Dans le cas présent j'ai tapé "nintendo" qui s'affiche dès le premier écran titre du jeu. Le programme va tester toutes les solutions possibles, et sortira les différentes occurrences du mot nintendo dans la rom. Un petit clic droit puis "Create Table" et hop on a notre table.



Bien, on va pouvoir commencer à travailler proprement. On a la rom, la table, il ne manque plus que l'éditeur hexadécimal qui va bien. Personnellement j'adore Hexworkshop, mais il ne prend pas en compte les tables. Et c'est important car on va écrire dans la rom au travers de cette même table ! C'est là que Translhextion va intervenir. Il va faire éditeur hexa + gestionnaire de tables.

Dans Translhexion, on ouvre la rom, qui ne manque pas de s'afficher normalement en hexa normal... Il manque la table. Pour l'ajouter, un petit [CTRL]+[T] (ou le menu "script" > "Open Thinguy Table"). On valide, il envoie un petit message pour dire qu'il va bien et que sa grand-mère avec. Une petite fenêtre apparaît. Cochez donc la case "Thinguy View Active". Ohhhhh....

La rom s'ouvre et le texte est compréhensible ! God Damned.

A partir de là vous pouvez par exemple rechercher le mot « NINTENDO » et le remplacer par « NES PAS ». J’ai mis là deux espaces. Pourquoi ? Parce que Le mot Nintendo a 8 lettres, et NES Pas en a 6. Or, un point important, on ne peut pas rajouter du texte comme ça n’importe comment dans la ROM. Et oui, on peut en enlever éventuellement selon certaines conditions, mais pas en rajouter. Une raison ? Et bien oui bien sur ah ah. C’est que les roms sont coupés en paquet de 32 octets. Si on rajoute du texte, on place des graphismes dans la partie code, du son dans les graphismes etc… L’erreur de tous les débutants. Donc on doit tenter de préserver ce que l’on a déjà.



Ouvrez maintenant la rom de Faxanadu. C’est la seule rom que je connaisse où l’on a pas besoin de table, c’est amusant ! Vous pouvez l’ouvrir avec n’importe quel éditeur hexadécimal cela fonctionne ! Mais on n’est pas là pour le tourisme. Regardez les deux captures. Dans le jeu :



Dans l’éditeur hexadécimal :



On en tire deux choses : On voit que dans la phrase du jeu il y a deux informations : il y a les espaces, les passages à la ligne, et les passages à l’écran d’après. On voit les espaces entres les mots (si si je vous assure) et les passage à la ligne après « I’ve been ON » On regarde dans l’hexa, et le caractère de passage à la ligne est le FE. Pour l’espace c’est le FD. Pour le passage à l’écran d’après, il intervient après « a long journey. » On regarde dans l’hexa et hop, on obtient que l’écran d’après est appelé après un superbe FC. Voila, on a tout pour refaire le jeu. Il suffit simplement de respecter les règles de base : pas de rajouts de textes, pas de dépassements d’écrans (genre sortir du cadre dans Faxanadu). Propre et de bon goût.