[Tutoriel] Trouver l'offset d'une image et/ou sa palette dans la rom

Pages: [1]

Unifag

  • Membre
  • 883 posts
22 août 2012, 17:30
Qui n'a jamais voulu modifier intégralement les graphismes des roms gba pour avoir quelque-chose digne des jeux DS? Seulement on n'arrive pas toujours à trouver les graphismes que l'on veut modifier ou alors on les trouve sur Unzl-gba, mais pas moyen de trouver leurs palettes. Et bien après se tuto vous serez en mesure de trouver une grande partie des graphismes et leurs palettes, en tous cas ceux en 16couleurs. Vous pourrez éventuellement adapter le tuto pour les images en 256c mais je n'e parlerai pas ici.

Pour comprendre ce tuto il vous faut connaitre un minimum l’hexadécimal, j'invite ceux pour qui ce n'est pas le cas à aller voir le tuto fait par Flow'.

Ce tuto est divisé en deux parties, la première permettra de trouver l'offset de la palette en connaissant celui de l'image. Alors qu'avec la deuxième vous pourrez trouver où se trouve l'image dans la rom et aussi sa palette en partant cette fois d'une image trouver sur le web où même un screen pris sur émulateur, utile quand l'image ne se trouve pas dans UnLZ-gba.



Nécessaire

     - NSE
     - Un éditeur hexadécimal (Hex Editor pour moi)
     - Une image de l'élément rechercher
     - UnLZ-gba

Il que l'image sois une copie exact de l'image en jeu, surtout au niveau des couleurs. Pour ca je vous conseille de prendre ces images sur spriters-ressource ou serebii. Vous pouvez aussi faire un screen sur émulateur (pour nosgba les couleurs exacts sont obtenus en allant dans options->émulation setup->Gba Mode-VGA(poppy bright)).
J'utiliserai émeraude(FR) pour ce tutoriel mais il est valable pour toutes les autres versions.



Partie 1 - Identifié la palette d'un graphisme

L'image Offset

La première chose à faire est de se procurer l'offset de l'image, on trouve facilement celui-ci dans UnLZ-gba. Référez vous à l’Index des Tiles si vous ne savez pas où se situe ce que vous cherchez dans UnLZ-gba.
A gauche un screen de mon élément sous UnLZ-gba et à droite un screen IG de ce même élément:


Une fois que c'est fait, ouvrez une copie de votre rom avec NSE, faite affichage->Offset, un cadre devrait alors s'ouvrir. Dans Offset mettait celui que vous aviez trouvé dans UnLZ-gba et faite Charger sans toucher aux autres options, vous aurez un message vous indiquant que "la palette X n'est pas une palette compressée valide" ignoré le et faite simplement OK .

Réaliser une copie de la palette

On va maintenant reconstituer nous-même une copie de la palette recherchée en utilisant la palette charger actuellement dans NSE et votre image (pour moi Drattak vs Cisayox). Pour ça, allez dans Edition->palette.
Voilà ma méthode pour modifier facilement la palette:
- je passe une couleur en fushia
- je fais sauver pour voir quelle zone est de cette couleur
- de la je peut récupérer la vraie couleur de cette zone sur mon image (Drattak vs Cisayox). Pour sa je clique sur la pipette et en maintenant la clique je fait glisser la souris jusqu’à la couleur exact puis je clique sur le cadre qui a pris la couleur que je voulait.
Je vous est fait un petit gif, car je vous avoue que cette explication est confuse:

Et voila ce que j’obtiens une fois fini:


Retrouver la palette d'origine
Pour avoir la vraie palette il faut donc retrouver une palette semblable à celle-ci, pour cela ouvrer votre rom (pas la copie) avec votre éditeur hexadeximal et lancer une recherche sur des couleurs de votre palette qui se suivent, pour moi se sera:
Citer
FF6F 5B5B F83A
J'obtiens un résultat à l'offset C11BA0, si vous n'en avez pas c'est que l'image (Drattak vs Cisayox pour moi) que vous avez choisis n'a pas les couleurs exact ou alors la palette n'a pas la forme habituelle, c'est le cas pour les "sols des combats" mais ceux-ci reste quand même identifiable.
Revenons à notre résultat, si je regarde les octets qui suivent je remarque qu'ils correspondent aux couleurs de ma palette (faite une selection pour voir les octets difficilement visible):
Citer
FF6F 5B5B F83A 4F42 AA31 E400 4721 9F03
Je sais qu'avant ces couleurs il y en a deux autres soit 4 octets, je peut donc identifier l'offset de départ de la palette: C11B9C
Voici donc ma palette complète:
Citer
0000 0821 FF6F 5B5B F83A 4F42 AA31 E400 4721 9F03 7F4A 287F 007C E003 1F00 4D7E

Quelque petite précision spécialement pour cette image, la palette possède quelque spécificité:
- La 2eme couleurs (0821) sera la couleur utilisé pour écrire le nombre de pv/lvl/nom des pokémons
- La 3eme (FF6F) devra être celle utilisé pour la couleurs du fond sous le nom mais aussi sous les pv restant.
- La 4eme (5B5B) correspond à la couleur de l'ombre du texte.
Comme vous l'avais remarqué je vous demande d'utilisez la même couleur pour le fond sous le nom et sous les Pv, enfaîte cela est du au fait que le jeu "colle" des carré de cette couleur (la 3eme) avant d'afficher le nom/les pv et le lvl, c'est pourquoi il est nécessaire qu'il soir de la même couleurs sur cette image.


Et voilà, cette partie du tuto touche à sa fin, il ne vous reste plus qu'à ouvrir votre rom (pas la copie) avec NSE et refaire affichage->Offset, dans offset il faut mettre l'offset qui était indiqué dans UnLZ-gba et dans palette celui que vous avez trouvé. Admirer le resultat:
Spoiler

Cette partie vous a sembler simple, tant mieux. Car la partie suivante est bien plus coriace que la première. Mais une fois que vous avez compris le principe sa reste assez simple, le tous est de bien comprendre comment est stockée une image dans la rom.

Maintenant je ne veux plus voir de rom-hack avec un mixte entre graphisme gba et nds, sinon gare à vous  :biere:



Partie 2 - Trouver l'image Offset et la palette à partir d'un screen/image externe

Ce qui ont essayer de modifier l'image de la partie 1 ce sont vite rendu compte qu'ils leur manqué quelque-chose, la barre de vie et d'xp n'est pas modifié, il faut donc les modifié aussi, mais comment faire si on ne connait pas les offsets de ces images. Et bien c'est la que la deuxième partit du tuto va vous servir.
Pour les trouvez il vous faudra les mêmes outils que pour retrouver uniquement la palette, excepté UNLZ-GBA.

Moi je vais partir de cette image:


La première chose à faire est de trouver la palette de l’élément rechercher, mais on ne peux pas utilisez la premiers méthode allez vous me dire, et bien je vais vous répondre que si, mais qu'il va falloir l'adapter.

Enfaîte on va utilisez NSE pour regrouper les couleurs de l’élément rechercher par nuance de teinte (le bleu clair avec le bleu, et avec le bleu foncé, ...), l'ordre na pas d'importance car de toute façon nous ne pouvons pas devinez comment elle seront disposez dans la rom (quand je parler d'ordre je veux dire que noir/bleu/vert/rouge et aussi correct que vert/bleu/rouge/noir mais ne faite pas bleu claire/vert foncé/bleu foncé/... mais bien bleu claire/bleu/bleu foncé/vert claire/...).

Voila ce que j'obtient:


Si je vous est demandé de ranger vos couleurs par nuance de teinte ces parce-qu'il en est de même dans la rom, dans la plupart des cas elle sont rangées du clair au foncé, plus rarement du foncé au clair et dans de très rare cas elle ne sont pas ordonnée par nuance mais en général il y à toujours une nuance de la palette qui suis la règle claire->foncé ou l'inverse.

Mais quelle teinte utilisez pour la recherche?
Je vous conseille d'utilisez celle qui posséde le plus de nuance, dans mon cas ce sera le rouge/orangé, il faut impérativement avoir plus de 2 nuance, sinon vous ne chercherez qu'une couleur dans la rom et le nombre de résultats proposé sera considérable.
Je vous avez dit que dans mon cas c'était l'orangé qui possédé le plus de teinte, sois les couleurs: DF3E 5E3A BB2D
En général 2 nuances sont largement suffisante pour retrouver une palette, la 3
eme servira surtout à vérifier qu'on à trouver la bonne palette, dans mon cas je lance donc la recherche suivante dans Hex-Editor: DF3E 5E3A mais j'aurais très bien pus chercher  DF3E 5E3A BB2D

J'obtient un résultat à l'offset $AC0AB6, mais si je regarde les octet autour aucune valeur ne correspond à ce qui pourrais être une couleur de ma palette.
Je suppose que ce n'est donc pas sa et regarde le résultat suivant, qui se trouve à l'offset $C11BC9, cette fois les octets autour pourrais correspondre au couleurs de ma palette. En plus il n'y à pas d'autre résultat pour cette recherche, ce qui m'encourage à pensés que cette fois ces bien la palette rechercher:
Citer
FF7F 3A5F 1046 092D AA2D DF3E 5E3A BB2D EE57 4B43
On retrouve même la totalité des couleurs que j'avais identifié au début, plus d'autres.
Il faut maintenant identifié le debut de la palette, pour sa pas de secret il faut essayer de le déduire, dans mon exemple c'est assez simple, premièrement on remarque que quelque octet plus loin on à une répétition de 00, je suppose que sa ne fais donc pas partie de la palette, et en regardant 32 (nombre de couleur par palette*2 soit 16*2) octet plus tôt je remarque que la couleur semblent être du noir (00 00) or en général la couleur de transparence (la 1er de la palette) est du noir.
Dans mon cas la palette se trouve donc à l'offset $C11BBC. Une vérification avec NSE confirme d'ailleurs que la palette rechercher est surement celle-ci.

Maintenant qu'on à la palette la véritable difficulté va commencer, il va falloir trouver l'image.

Pour commencer je vais ouvrir NSE et charger ma palette fraîchement trouvé si ce n'est pas déjà fais. Il faut maintenant reproduire une partit de l'image rechercher. Vous n'ête pas obligé de la reproduire dans sa totalité, personnellement j'en est reproduit une toute petite partie:
Spoiler

Mais pour continuez il faut que je vous explique comment sont stocker les images en 16couleurs dans la rom. Pour cela je vais prendre un exemple que je vais expliquer petit à petit:
Citer
44 54 22 54

Pour que le jeu sache quelle couleur de la palette il doit utilisé celle-ci est représenté comme une index, ainsi la première couleur de la palette est à l'index 0 (mais il faut savoir quelle correspond toujours à la transparence), la deuxième sera à l'index 1, etc jusqu’à la 16eme qui sera à l'index F. Vous pouvez retrouvé l'index d'une couleur dans NSE (attention NSE donne l'index d'une couleur sous la forme 0X mais l'index est bien X et non 0X).

L'exemple utilise donc seulement 3 couleurs, celles à l'index 4, 5, et 2.
Imagions qu'a l'index 2 de la palette se trouve du rouge, à l'index 4 du blanc et à l'index 5 du bleu, il suffit de remplacer ces couleur dans notre exemple et on obtient notre image:
4     4     5    4     2     2     5    4
blanc/blanc/bleu/blanc/rouge/rouge/bleu/blanc


Il faut savoir que si j'ai choisis d'utilisez 8 pixel pour mon exemple ce n'est pas au hasard, c'est parce-que il en est de même dans le jeu, enfaîte une image est un ensemble de ligne de 8 pixel, lignes elle même réuni par groupe de 8. Ceux qui donne des carrée de 8*8. C'est justement pour sa que je vous est dit d'essayer de découper votre image en carrée de 8 quand vous la reproduisait.

Voila une image et un shema qui vous aidera à comprendre:
Spoiler
Spoiler

Maintenant que vous savez comment est stocké une image dans la rom on va pouvoir reprendre notre reproduction d'une partie de l'image pour en déduire la recherche à effectuer.


En cours de rédaction...
« Modifié: 19 septembre 2012, 18:01 par Unifag »

Pages: [1]    En haut ↑