Rom Hack & Fan Game

Animer les front et back sprites des Pokémon et des dresseurs

On sait tous que les sprites des version gba sont inanimé (sauf pour les front de émeraude), je me propose donc de vous apprendre à les animée pour rendre les débuts de combat un peu plus dynamique, suite à ce tuto vous serez en mesure d'animé les front et back sprites des Pokémon, les sprites des dressseurs, ou encore modifier l'animation des backsprites des dresseurs (héro, timmy, etc). De plus les sprites ne seront pas seulement animé en combat mais aussi dans le menu Pokémon, et lors de l'utilsation de showpokepic dans un script (plutôt intéressent).
Mais avant de commencer il y a quelques restrictions que vous devez connaitre:
- Chaque Pokémon (seulement les Pokémon, pas les dresseurs) doit avoir le même nombre de sprites, ce qui induit une certaine quantité de travail.
- Si vous animé le front des Pokémon et que ceux-ci ont X sprites, alors les back devront avoir le même nombre de sprites. Et posséderont la même animation (ordre et durée d'affichage, pas les même sprites bien entendu).
- Le combat ne peut pas démarrer temps que l'animation du Pokémon adverse n'est pas fini, en revanche pas besoin d'attendre que l'animation du backsprite soit fini pour commencer le combat. Mais si elle elle n'est pas trop longue on peut commencer le combat aussi vite que sans animation.
- L'animation est rejouer quand on sort du sac ou du menu de sélection de Pokémon.

Remarque : Toutes ces observation ont étaient faite sur RF/VF, il se peut que ce soit un peu différent sur RSE.

Comme vous le constatez ce ne sont pas des contraintes gênante en jeu mais je me devais de vous avertir. Ces contraintes ne sont valable que pour les Pokémon, pour ce qui est des dresseurs le système est beaucoup plus pérmitif.
Un gros avantage pour les backsprites est qu'il est possible d'avoir deux parties d'animations différentes, une a l'arriver en combat, puis l'autre quand il lance la balle.

Vous l'aurez compris il y a de quoi se faire plaisir avec de belles animations. Et si vous n'êtes pas convaincu rendez-vous à la fin de ce tuto pour avoir un aperçu de ce qu'il est possible de faire.

Remarque : Les nombres précédé d'un '#' sont en hexadécimal, sinon il sont en décimal.
Les bases de l'hexadécimal sont requises pour comprendre le tuto, mais rassurez vous, savoir que #A = 10, #B = 11, etc devrait suffire.

Les outils nécessaire

Votre éditeur Hexadécimal qui sera notre principale outil.
UnLz-GBA pour ajouter les sprites. Les logiciels comme NSE ou Advance sprite editor ne sont pas adapté dans la cas présent.

Augmenter le nombre de sprites d'un Pokémon

La première étape pour créer/modifié une animation est d'augmenter le nombre de sprites de sorte à avoir au minimum 2 sprites dans des positions différente pour un même Pokémon/dresseur/...

Remarque : Certains seront tenté de parler de frame, mais comme j'utilise le mot frame pour autre chose plus loin dans ce tuto et que je voulais éviter la confusion je me suis rabattu sur le mot sprite.

Quelque sois l’élément que vous voulez animer la méthode pour insérer les sprites est la même.
Pour commencez il vous faut une image avec vos sprites les un sous les autres, vous devriez obtenir quelque-chose comme ça:

Ensemble de sprites pour les Jumelles

On va maintenant l’insérer grâce à UnLz-gba, je ne vais pas donner de détailles la dessus car je considère que c'est quelque-chose d’acquis (et si ce n'est pas le cas vous trouverez tous un tas de tuto la dessus), en prenant bien sur le soin de bien repointé votre image et aussi de modifier la palette.
A ce stade vous pouvez déjà tester le jeu pour vérifier que vous avez correctement inséré le sprite, si tous fonctionne on continue.

Créer l'animation

Maintenant que nos sprites sont insérer on va pouvoir s'attaquer à l'animation. Avant tous il faut trouver un espace libre dans la rom où nous allons crée notre animation, notez l'offset on en aura besoin par la suite.
Comme vous le savez une animation est composé de plusieurs frame, dans notre cas chaque frame est codée sur 4 octets.

XX 00 YY 00

Les deuxième et quatrième octets doivent toujours être 00, je ne sais pas à quoi il correspondent mais laissais les à 00 sous peine de voir des bugs graphiques apparaître.
Le premier octet (XX) correspond à l'index du sprite à afficher (de #00 à #FF), si je reprend mon exemple précédent voila comment je doit numéroter chaque sprite:

Ordre des sprites pour les Jumelles

Le troisième octet (YY) correspond à plusieurs paramètre, les deux premier bits correspondent au flips vertical et horizontal, et les 6 dernier bits sont la durée d'affichage. Ça peut paraître compliqué mais finalement ça ne l'est pas temps que ça, si vous n'avez pas besoin de faire de flips il vous suffit de prendre la durée d'affichage.
La durée d'affichage ne s’exprime pas en seconde mais en nombre de rafraîchissement, en sachant que la gba est cadencé à 60 rafraîchissement/seconde il faudra donc une durée de 60 pour que la frame restent afficher 1s. Je vais prendre un autre exemple, supposons que vous vouliez que l'image s'affiche durant 100ms, il vous suffit alors de faire un produit en croix pour savoir quelle valeur prendre :
1s -> 60 rafraîchissement
0.1s -> ?? rafraîchissement
60*0.1/1 = 6 = #6
Vous mettrez donc 06 à la place de YY.
Si jamais vous voulez faire un split vertical il vous suffit de rajouter #80 à votre durée, et pour un split horizontal #40.

Remarque : L'utilité des flips est très limité, car en combat il ne sont pas pris en compte, leur seul utilité est donc dans les menus, et peut être les scripts mais je n'ai pas essayer.
De plus comme la durée n'est codée seulement sur 6bits on ne peut aller que de #00 à #3F, mais rien ne nous empêche de faire une seconde frame identique à la suite pour prolonger la durée d'affichage.

Et voila, on à notre première frame, on peut maintenant faire les autres à la suite. Une fois que vous avez fait toute vos frame il faut indiquée que l'animation est fini, pour ce faire il suffit de rajouter #FF FF 00 00 à la suite. En reprenant mon exemple voila ce que je peut obtenir comme animation:

00 00 20 00   01 00 10 00   02 00 10 00   03 00 10 00   04 00 25 00   03 00 10 00   02 00 10 00   01 00 10 00   00 00 00 00   FF FF 00 00

Remarque : Il ne faut pas oublier que les backsprite des dresseurs sont animée en 2 temps, il faut donc faire deux animation.
Il ne faut pas non plus oublier que l'animation est commune à tous les Pokémon, backsprite comme frontsprite, il faut donc crée l'animation en conséquent.

Repointer

Maintenant que nous avons crée notre animation il faut changé le pointeur de l'animation pour indiqué au jeu où se trouve la nouvelle animation. Cette fois je vais différencier chaque cas car ils sont tous différents. Il faut donc changez le pointeur correspondant à l’élément que vous avez modifié.

Les Pokémon

Les Pokémon sont le cas le plus simple, en effet l'animation est commune à tous les Pokémon, et donc il n'y à qu'un seul pointeur pour l'animation de tous les Pokémon. Voila un tableau avec l'offset pour chaque versions:

Version Offset
Rouge Feu #22EDC8
Vert Feuille #22EDA4
Rubis #1F006C
Saphir #1EFFFC
Émeraude #30723C

Il vous suffit donc de modifier se pointeur pour qu'il pointe vers votre nouvelle animation, petit rappel :
Si vous avez crée votre table à l'offset #730004 vous devez donc mettre le pointeur suivant #04007308.

Dresseur: les backs

Pour les backsprite il y à 2 pointeurs pour chaque dresseur, pour savoir à quelle offset commence la liste de pointeur regardez le tableau :

Version Offset
Rouge Feu #234350
Vert Feuille #23432C
Rubis #1F4EBC
Saphir #1F4E4C
Émeraude #30D7FC

Chaque perso prend 8 octets, pour trouver les pointeurs de votre perso il suffit donc de faire: "offset du tableau"+#8*#x
Voila les valeurs de x pour rf/vf: 0 - hero, 1 - heroine, 2 - type de la tv, 3 - vieille homme, 4 - brendan, 5 - may.
Par contre je connais pas l'ordre des perso pour rse donc il faudra tester les différents pointeur par vous même.
Une fois que vous avez trouvez les pointeurs de votre perso il ne reste plus qu'a les modifié, en sachant que le premier pointeur est correspond à l'animation lors de l'arrivée en combat, et le deuxième pointeur correspond au moment où il lance la ball.

Remarque : Si vous utilisez les version ruby/saphir ou alors émeraude et que vous trouvez l'ordre des perso n'hésitait pas à en faire part ici, j'éditerai le premier post en conséquent.

Dresseur: les fronts

Cette fois il y à 1 pointeur par sprite. Voila l'offset de la table de pointeur pour chaque version :

Version Offset
Rouge Feu #233298
Vert Feuille #233274
Rubis #1F4554
Saphir #1F44E4
Émeraude #30CD28

Pour retrouver le pointeur du sprite que vous voulez animé il faut connaitre le numéro de notre sprite, pour trouver se numéro je vous conseille d'utiliser A-trainer, sur cette image j'ai encadrer en rouge l'endroit où se trouve le numéro en question :

Numéro du sprite dans A-Trainer

Ensuite il vous suffis de faire "offset du tableau"+#4*"numéro du sprite" pour trouvez l'offset du pointeur de votre sprite, il ne vous reste plus qu'à le modifier.

Exemple

Pour vous convaincre voila une petite vidéo de ce qu'il est possible de faire:

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

Par Unifag

Par Loris