Rom Hack & Fan Game

Astuces pour les écrans de combat

La boite de texte en combat

Cette explication porte sur la modification de la boite de texte où s'affiche "Pikachu utilise Tonnerre !" en combat, car celle-ci ne peut pas être modifier comme n'importe quelle graphisme, mais ce n'est pas non plus très difficile. Et c'est d'ailleurs pour ça que très peu de hack-rom la modifie (aucune à ma connaissance mais ça à déjà du être fais).

Voila la boite de dialogue en question :

Écran de combat

Remarque : je vous conseille d'ouvrir votre rom avec un éditeur hexadécimal et de jeter un œil à l'image, et à ce qui se trouve juste après. L'image commence à l'offset #D00000 et se termine à l'offset #D004D4. Vous devriez aussi regarder à quoi elle ressemble avec NSE.

Le problème de cette image

Le cas de cette boite de dialogue est un peu spécial puisqu'on ne peut pas repointer l'image. La raison est simple, en général il y à au moins 1 pointeur pour chaque élément(l'image, la palette, etc) . Mais ici le pointeur est le même pour plusieurs données, donc pour aller cherchez la palette (et d'autres données qui se situe après la palette) le jeu se rend à l'offset indiqué par le pointeur et ajoute #4D4 (la taille de l'image), il faut donc toujours que la palette + les donnée suivante se trouve #4D4 octets après le pointeur, ce qui veut dire qu'on ne peut pas modifié la taille de l'image (sa taille, en octets, pas ses dimensions).
En plus de ça l'image est compressée, donc quand on la modifie il faudrait faire en sorte qu'elle ne prenne pas plus de place qu'avant, chose impossible avec les outils à notre disposition (je ne sais pas exactement pourquoi mais même sans modifié l'image elle prend trop de place une fois compressé par NSE/UnLzGBA, l'algorithme de compression ne doit pas être suffisamment optimisé).

La solution

Mais en trichant un peu il est possible de modifier cette boite de dialogue. Si vous n'aviez pas remarquer il y à une série d'octets qui se répète (FF F0 01 ...), cela correspond à tout les pixels transparent que l'on peut voir avec NSE (enfin sur NSE ils apparaissent de la première couleur de la palette). L'astuce consiste à faire comme si on en avais pas besoin dans leurs intégralité car il n'ont à première vus pas de réel utilité à part remplir l'image.

Remarque : si jamais ces pixels que j'ai qualifiés de bouche-trous avaient vraiment une utilité, il est possible que cela provoque des bugs, mais pour le moment je n'en est pas remarqué.
Je vais bientôt recommencer une partie sur Rouge Feu, et j'en profiterais pour faire toute l'aventure avec cette modification, ce qui me permettra de vérifier que cette solution est viable et ne provoque aucun bug, auquel cas je vous en ferais part.

La pratique

Pour commencer prenez 2 exemplaires de votre rom, un que j’appellerai "temporaire" et l'autre "final".
Ouvrez donc la rom "temporaire" avec NSE et rendez vous à l'offset #D00000.

Remarque : la palette se trouve à l'offset #D004DD. Mais ce n'est pas la peine de l'ouvrir avec NSE puisqu'elle à une forme spécial (avec des 00 tous les 8 octets, allez voir ici pour plus d'informations).
Pour modifier votre image et palette vous pouvez faire votre nouvelle palette à la place de celle du héro (celle chargé par défaut) dans la rom "temporaire", ça vous facilitera la tache, vous serez ensuite obligé de modifier manuellement la palette dans la rom "final".
Autre détaille important sur la palette, certaines couleurs de la palette servent à des éléments bien précis et il faut les prendre en compte: #1: texte, #6: ombre du texte.
Mais dite vous bien que tous les éléments qui apparaisse dans NSE utilise la même palette, il faut donc faire celle-ci en conséquent.

Débrouillez vous avec NSE pour modifié l'image et obtenir le résultât recherché, ce n'est pas la peine de toucher au tiles qui sont au milieu, ceux du haut suffisent. Moi j’obtiens sa :

Sprite de la boite de dialogue des combats

Une fois que c'est fais, on va passer en mode avancé (Options->Advanced Mode). Et au moment de sauvegarder décochez la case "Auto-abort if data is too big". Ne changez pas l'offset, sa ne servirais à rien.

Remarque : il est possible que le logiciel mette du temps à sauvegarder, vous donnant l'impression qu'il bug, mais ne vous inquiétez pas, c'est normal. Il arrive parfois qu'il bug réellement, mais si vous ouvrez votre rom avec un éditeur hexadécimal vous verrez que les modifications ont été appliqué.

A partir de la plus besoin de NSE, fermer le et ouvrez vos deux roms, "temporaire" et "final", avec votre éditeur hexadécimal.

Dans votre rom "temporaire", rendez vous à l'offset #D00000 et sélectionnez #4D4 octets (donc de #D00000 à #D004D4), puis copiez les.
Rendez vous maintenant à l'offset #D00000 de votre rom clean et faite coller.

C'est terminée, vous pouvez admirez le résultat. Voici ce que j'ai pu obtenir :

Résultat de la modificationRésultat de la modification

Utiliser trois frames pour chaque Poké Ball

Cette fois je vais vous donner une petite astuce pour pouvoir utiliser 3 frames pour chaque Poké Ball. La plus part Poké Balls utilise une image commune pour la 3eme frame, ce qui rend la modification assez délicate car il faut faire attention à ce que cette image commune soit en accord avec toute les balls qui l'utilise. Mais nous on voudrai que chaque balls puissent avoir 3 frames qui leur sont unique.

La frame commune

Dans un premier temps je vais vous expliquer le problème un peu plus clairement, car je comprend que vous ne voyait pas de quoi je parle.
Pour ça, j'ai collé toutes les balls à la suite :

Frames des Balls

On remarque que certaines on une frame de plus que les autres, et bien c'est parce-que les autres utilisent une image commune pour la dernière frame. Et donc c'est la palette qui varie en fonction du type de ball. Voilà cette image commune :

Frame commune à toutes les balls

Cette méthode permet certes d'économiser un peu de place mais ça nous limite quand même beaucoup pour nos modifications.

Remarque : même si l'objectif n'est pas de vous apprendre à modifier les images mais juste de vous expliquer comment exploiter 3 frames unique pour chaque balls je vous donne quelque offsets qui peuvent vous servir (rouge feu fr uniquement):
La table de pointeur des images: #25A9BC jusqu'à #25AA1C.
La table de pointeur des palettes: #25AA1C jusqu'à #25AA7C.

La solution

Je ne vais pas vous expliquer pourquoi la solution fonctionne car trop peu d'entre vous serez capable de comprendre le pourquoi, donc contenter vous d'appliquer ce qui suis.

Pour commencer, rendez-vous à l'offset correspondant à votre version avec votre éditeur héxadécimal. Et remplacez le #062C par #14E0. C'est terminer, vous pouvez utilisé les 3 frames propre à chaque balls. Simple n'est-ce pas.

Remarque : pour les plus minutieux vous pouvez remplacer les offsets de #04BFFE jusqu'à #4C0028 par des #FF car le jeu n'en à plus besoin, vous gagnerez un peu de place.

Ceux qui veulent comprendre comment ça fonctionne sachez que ce que vous venez de remplacer par des #FF permettait au jeu de vérifier quelle type de balls c'était puis de charger l'image commune si besoin. L'instruction E0 étant un branch simple en ASM il permet de sauter le chargement de l'image commune quelle que soit le type de balls. Jeter un œil avec le dé-assembleur pour mieux comprendre.

En bonus voila un petit pack que je vous est fait avec les balls des versions DPP/HGSS adapter en 16*16 et prêt à être insérer avec NSE (palette comprise).

Pour toutes suggestions ou questions, dirigez-vous vers le topic dédié sur le forum.

Par Unifag

Par Loris