Scripter en utilisant l’allocation d’offset dynamique avec XSE
Ce tutoriel s’adresse aux personnes souhaitant réaliser des scripts pour les roms Pokémon sur gba de manière plus simple et plus rapide grâce aux offsets dynamiques. Ici, vous n’apprendrez en aucun cas les bases de la réalisation de ces scripts et pour ceux qui ne les connaissent pas, je vous recommande de jeter un œil (ou même les deux ?) au tutoriel de Sainior qui est excellent.
Alors, maintenant que tout ça est clair et avant d’aborder l’allocation dynamique, je vais commencer par vous en dire un peu plus sur les offsets.
L’offset
Un offset est une adresse dans la mémoire de la rom à partir de laquelle plusieurs données sont stockées, les offsets sont utilisés comme repère afin de pouvoir retrouver des scripts lorsque l’on en a besoin. Pour faire une comparaison simple, un offset est comparable à un numéro de ligne sur une feuille, bien entendu, si la rom serait une feuille, il y aurait plusieurs millions de lignes. Chaque instruction que l’on inscrit (comme msgbox, goto...) prend une certaine place en mémoire (un certain nombre de lignes sur notre feuille)
Le problème avec les offsets !
Si jamais on ne fait pas attention à utiliser des offsets libres lorsque l’on scripte, ils risquent de se « chevaucher » et lorsque le script sera exécuté, il y aura un bug, ou bien encore un plantage complet du jeu (Et oui, si jamais on écrit quelque chose sur une ligne ou il y a déjà quelque chose, sa deviens nettement plus compliqué à lire !)
Donc si on fait attention a bien vérifier que l’adresse en mémoire est disponible et suffisante, notre script va fonctionner niquel ! Mais c’est assez long de devoir chercher un offset libre a chaque fois et puis on peut tout de même faire une erreur sur un chiffre sans le faire exprès... et là c’est le drame ! (surtout si vous n’avez fait aucune sauvegarde récente de votre travail)
C’est là qu’interviens l’allocation d’offset dynamique ! (c’est à partir de la deviens enfin intéressant !)
L’allocation d’offset dynamique est une fonctionnalité du logiciel XSE, elle va permettre de laisser le logiciel s’occuper de la gestion de la mémoire à notre place et à chercher les offsets pour nous.
Pour permettre l’utilisation d’offsets dynamiques, il faut avant toute chose, signaler au logiciel que l’on va les utiliser, et c’est avant le début du script que ça se passe, il faut rajouter la ligne suivante
Code: [Sélectionner]
#dynamic 0x[OFFSET]
[OFFSET] est à remplacer par une adresse (hexadécimale) à partir de laquelle XSE va ajouter notre code dans la rom, je vous conseille de choisir un offset a partir duquel il y a beaucoup de place afin d’être sûr de ne pas empiéter sur un offset qui serai déjà pris.
Après cela, c’est fini, on s’occupe plus des offsets, c’était le dernier/seul ! On va pouvoir commencer à écrire du vrai code, et dès la première ligne on va profiter de notre allocation dynamique !
D’habitude, un script commence par un #org 0x[OFFSET], mais cela va être différent, car maintenant, on a plus besoin de renseigner les offset. A la place, on va utiliser les pointeurs...
Les pointeurs
Avec l’allocation dynamique, les offsets seront remplacées par des pointeurs
Lors de la compilation du script et de son écriture dans la mémoire de la rom, notre pointeur sera remplacé par un offset qu’aura choisi XSE.
Le pointeur sera donc utilisé à chaque fois que l’on aura besoin d’écrire un offset, il se présente sous la forme suivante :
Code: [Sélectionner]
@[nomdupointeur]
Les pointeurs de même nom pointeront tous vers le même offset, afin de pointer vers un autre offset, il suffit d’utiliser un pointeur avec un nom différent. (Si on veut leur trouver un nom très original, on peut par exemple les appeler @pointeur1, @pointeur2, mais pour que cela sois plus pratique, on peut les nommer en fonction de ce qu’ils contiennent comme @message25, @movehaut...)
Après cette explication, revenons à notre première instruction !
Code: [Sélectionner]
#org @start
On remarque que l'habituel 0x[OFFSET] est remplacé par un pointeur nommé @start.
Les différentes instructions de votre script vont ensuite suivre celle-ci comme avant, mais il est maintenant possible d’utiliser des pointeurs. Notre script commence à l’offset @start, qui deviendra (normalement*) lors de la compilation, l’offset spécifié dans la première ligne (avec #dynamic)
*Si l'offset de @start est différent que celui du #dynamic, c'est qu'il a sans doute été mal choisi (déja utilisé ou bien manque de place libre)
Voici un exemple de script qui utilise l’allocation d’offset dynamique :
Code: [Sélectionner]
#dynamic 0x7105B8
#org @start
msgbox @message1 MSG_KEEPOPEN '"Message numéro un"
applymovement MOVE_PLAYER @move
waitmovement 0x0
msgbox @message2 MSG_KEEPOPEN '"Message numéro deux"
end
'--- Mouvements ---
#org @move
#raw 0x11 ‘Pas vers le haut (Normal)
#raw 0x11 ‘Pas vers le haut (Normal)
#raw 0xFE ‘Fin des mouvements
'--- Textes ---
#org @message1
=Message numéro un
#org @message2
=Message numéro deux
Après toutes les explications que je vous ai fournies, vous devriez être capable de comprendre ce script, je vous explique tout de même le détails des instructions utilisant les pointeurs :
#dynamic 0x7105B8 :
Permet d’utiliser l’allocation dynamique en commençant à partir de l’offset 7105B8 (Offset a partir duquel il y a une place énorme, dans ce cas, j’ai fait une recherche pour trouver 10 000 octets libres avec FSF sur une rom rouge feu FR).
#org @start :
Début de notre script a l’offset @start.
msgbox @message1 MSG_KEEPOPEN :
Ouvre une boite de dialogue avec le message contenu a l’offset @message1.
applymovement MOVE_PLAYER @move : Déplace le personnage suivant les déplacement contenus a l’offset @move.
msgbox @message2 MSG_KEEPOPEN :
Idem que le premier mais l’offset est différent (@message2)
#org @move :
Emplacement des infos de mouvement qui sont utilisés pour notre applymovement.
#org @message1 et #org @message2 :
Similaire à l’instruction du dessus mais cette fois, il s’agit de texte et non de mouvement, chaque message est associé au pointeur correspondant
Mise en garde !
Lorsque vous compilerez votre script, XSE va vous fournir les offsets vers lesquels pointent tous vos différents pointeurs, après la première compilation il est important fermer votre script et de le ré-ouvrir (si vous comptez le modifier), vous remarquerez que vos pointeurs auront tous disparus et ont été remplacé par les offsets fournis à la fin de votre compilation. Si jamais vous compilez plusieurs fois un script utilisant l'allocation dynamique sans faire ceci, XSE va, à chaque compilation, écrire votre code à partir d’offsets différents vu que les anciens ont été pris par vos précédentes compilations et ne sont plus libres, cela risque, a terme, de prendre pas mal de place.
PS :
- Je débute encore en scripting, si j'ai fait une erreur, que j'ai oublié de préciser quelque chose, ou bien encore que vous pensez qu'il faudrai changer/ajouter/supprimer des passages, signalez-le moi et j'éditerai (Si je le juge nécessaire) ce tutoriel.