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 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-rom la modifie (aucune à ma connaissance, mais ça a déjà dû être fait). Voilà la boite de dialogue en question :
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 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 boite 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 de 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](https://www.pokemontrash.com/jeux-pokemon/trouver-offset-image-palette-gba.php) 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équent. Débrouillez vous avec NSE pour modifier l'image et obtenir le résultat recherché, ce n'est pas la peine de toucher au tiles qui sont au milieu, ceux du haut suffisent. Moi j’obtiens ça :

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 plus part des Poké Balls utilisent 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 toutes les balls qui l'utilisent. Mais nous, on voudrait que chaque ball puisse avoir 3 frames qui lui sont unique.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 :


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 seraient capable de comprendre le pourquoi, donc contentez vous d'appliquer ce qui suit. Pour commencer, rendez-vous à l'offset correspondant à votre version avec votre éditeur héxadécimal. Et remplacez le #062C par #14E0. C'est terminé, vous pouvez utiliser les 3 frames propres à 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 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 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 quel que soit le type de balls. Jetez un œil avec le dé-assembleur pour mieux comprendre. En bonus voilà [un petit pack](https://www.pokemontrash.com/images/jeux-pokemon/astuces-ecrans-combat/balls.zip) que je vous ai fait avec les balls des versions DPP/HGSS adaptées 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

