La boîte de texte en combat
Cette explication porte sur la modification de la boîte de texte où s'affiche "Pikachu utilise Tonnerre !" en combat, car celle-ci ne peut pas être modifiée comme n'importe quel graphisme, mais ce n'est pas non plus très difficile. Et c'est d'ailleurs pour ça que très peu de hack-roms la modifient (aucune à ma connaissance, mais ça a déjà dû être fait).
Voilà la boîte de dialogue en question :

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 boîte 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 a 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 chercher la palette (et d'autres données qui se situent 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ées suivantes se trouvent #4D4 octets après le pointeur, ce qui veut dire qu'on ne peut pas modifier 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 modifier l'image, elle prend trop de place une fois compressée 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 boîte de dialogue. Si vous n'aviez pas remarqué, il y a une série d'octets qui se répète (FF F0 01 ...), cela correspond à tous les pixels transparents que l'on peut voir avec NSE (enfin sur NSE, ils apparaissent avec la première couleur de la palette). L'astuce consiste à faire comme si on n'en avait pas besoin dans leur intégralité car ils n'ont à première vue pas de réelle 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 ai pas remarqué.
Je vais bientôt recommencer une partie sur Rouge Feu, et j'en profiterai 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 a une forme spéciale (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éros (celle chargée par défaut) dans la ROM "temporaire", ça vous facilitera la tâche. Vous serez ensuite obligé de modifier manuellement la palette dans la ROM "final".
Autre détail 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 dites-vous bien que tous les éléments qui apparaissent dans NSE utilisent la même palette, il faut donc faire celle-ci en conséquence.
Débrouillez-vous avec NSE pour modifier l'image et obtenir le résultat recherché. Ce n'est pas la peine de toucher aux tiles qui sont au milieu, ceux du haut suffisent. Moi j'obtiens ça :

Une fois que c'est fait, 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, ça ne servirait à rien.
Remarque : il est possible que le logiciel mette du temps à sauvegarder, vous donnant l'impression qu'il bugge, mais ne vous inquiétez pas, c'est normal. Il arrive parfois qu'il bugge réellement, mais si vous ouvrez votre ROM avec un éditeur hexadécimal, vous verrez que les modifications ont été appliquées.
À partir de là, plus besoin de NSE, fermez-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 faites coller.
C'est terminé, vous pouvez admirer le résultat. Voici ce que j'ai pu obtenir :
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 plupart des Poké Balls utilisent une image commune pour la 3ème frame, ce qui rend la modification assez délicate car il faut faire attention à ce que cette image commune soit en accord avec toutes les balls qui l'utilisent. Mais nous, on voudrait que chaque ball puisse avoir 3 frames qui lui sont uniques.
La frame commune
Dans un premier temps, je vais vous expliquer le problème un peu plus clairement, car je comprends que vous ne voyez pas de quoi je parle.
Pour ça, j'ai collé toutes les balls à la suite :

On remarque que certaines ont 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 :

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 uniques pour chaque ball, je vous donne quelques offsets qui peuvent vous servir (Rouge Feu FR uniquement) :
La table de pointeurs des images : #25A9BC jusqu'à #25AA1C. La table de pointeurs des palettes : #25AA1C jusqu'à #25AA7C.
La solution
Je ne vais pas vous expliquer pourquoi la solution fonctionne car trop peu d'entre vous seraient capables de comprendre le pourquoi, donc contentez-vous d'appliquer ce qui suit.
Pour commencer, rendez-vous à l'offset correspondant à votre version avec votre éditeur hexadécimal. Et remplacez le #062C par #14E0. C'est terminé, vous pouvez utiliser les 3 frames propres à chaque ball. 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 a 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 quel type de ball 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 quel que soit le type de ball. Jetez un œil avec le désassembleur pour mieux comprendre.
En bonus voilà un petit pack que je vous ai fait avec les balls des versions DPP/HGSS adaptées en 16*16 et prêt à être inséré avec NSE (palette comprise).
Pour toutes suggestions ou questions, dirigez-vous vers le topic dédié sur le forum.
Par Unifag

