[Tuto][gba][XSE] Scripter en utilisant l’allocation d’offset dynamique avec XSE

Pages: [1]

Gadoin

  • Membre
  • 386 posts
03 septembre 2013, 17:28
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

#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 :
@[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 !
#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 :
#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.
« Modifié: 04 septembre 2013, 10:38 par Gadoin »

Unifag

  • Membre
  • 883 posts
03 septembre 2013, 19:31
C'est très bon tous ça, on manquait de personne comme toi ces temps ci.
« Modifié: 03 septembre 2013, 19:36 par Unifag »

Myst

  • Membre
  • 1870 posts
03 septembre 2013, 19:34
Le dynamique, c'est berk.
sinon
C'est très bon tous ça, on manquait de personne comme toi c'est temps si.

hremeraude

  • Membre
  • 11384 posts
03 septembre 2013, 19:46
C'est pas mal, moi en dynamic je met toujours @dynamic 0x800000 c'est mieux je pense :)
Sinon ta comparaison de l'offset à une ligne sur une feuille pas mal  :tibia:

Unifag

  • Membre
  • 883 posts
03 septembre 2013, 19:56
Non c'est pas toujours mieux.

hremeraude

  • Membre
  • 11384 posts
03 septembre 2013, 20:38
ça fait quoi ?

Unifag

  • Membre
  • 883 posts
03 septembre 2013, 20:42
J'ai pas de situation précise à décrire mais parfois il se peut que tu est besoin de préserver certaine zone. Ou tous simplement ton script peut écraser des données si tu est trop négligent.
XSE verra parfois un espace libre alors que ça n'est est pas un, il verra des FF, mais parfois les FF ne sont pas un espace libre, par exemple FF FF FF FF permet dans certain cas de marqué la fin d'une liste ou autre. Et si dans ton script dynamique tu à un text "??" XSE va considéré qu'il y à suffisamment de place et remplacé ce qui marque la fin de la liste. Conclusion ta liste est corrompu.
J’espère que tu comprend mieux l’intérêt de choisir un offset safe.
« Modifié: 03 septembre 2013, 20:53 par Unifag »

Arnik

  • Membre
  • 1812 posts
03 septembre 2013, 20:49
J'?

Edit: Ok Uni'. Je me demande si je ne devrais pas sortir un tuto en graphisme. M'enfin...
« Modifié: 03 septembre 2013, 21:40 par Arnikum Plus »

Unifag

  • Membre
  • 883 posts
03 septembre 2013, 21:05
Tab+entrer = fail. Mais j'ai corrigé. :)

hremeraude

  • Membre
  • 11384 posts
03 septembre 2013, 23:28
J'ai pas de situation précise à décrire mais parfois il se peut que tu est besoin de préserver certaine zone. Ou tous simplement ton script peut écraser des données si tu est trop négligent.
XSE verra parfois un espace libre alors que ça n'est est pas un, il verra des FF, mais parfois les FF ne sont pas un espace libre, par exemple FF FF FF FF permet dans certain cas de marqué la fin d'une liste ou autre. Et si dans ton script dynamique tu à un text "??" XSE va considéré qu'il y à suffisamment de place et remplacé ce qui marque la fin de la liste. Conclusion ta liste est corrompu.
J’espère que tu comprend mieux l’intérêt de choisir un offset safe.

ah ok et tu me conseille de choisir à partir d'où ?

Gadoin

  • Membre
  • 386 posts
04 septembre 2013, 10:13

Je te conseille de faire une recherche sur ta rom avec Free Space Finder et de choisir une zone avec beaucoup d'octets de libres afin de ne pas avoir de problèmes avec les offsets déja occupés, n'hésite pas a prendre la valeur maximale que tu peut entrer sur FSF (999 999 octets)


L'offset 800000 est généralement libre sur une rom de base, mais sa ne sera pas forcément le cas avec d'autres alors il faut faire attention!
Et puis après ta première compilation, l'espace ne sera plus si libre que sa, si jamais tu fais plusieurs scripts sur ta rom et qu'a chaque fois tu choisis le même offset de départ pour l'allocation dynamique, cela peut parfois t'entraîner des problèmes.
Bref, comme te l'as conseillé Unifag, choisis un offset libre.
« Modifié: 04 septembre 2013, 21:02 par Gadoin »

hremeraude

  • Membre
  • 11384 posts
04 septembre 2013, 11:19
Il n'y a plus d'utilité à scripter en dynamic si on prend un offset avec FSF enfin bon on aura forcément la bonne taille :)

Gadoin

  • Membre
  • 386 posts
04 septembre 2013, 12:11
Faux :
Si tu ne prends pas le BON offset tu n'aura pas forcément la bonne taille.
En dynamic, tu ne cherche qu'un seul offset.
L'utilité du dynamic est surtout de pouvoir utiliser des pointeurs afin de simplifier le code et éviter les erreurs et gagner du temps, de plus cela te permet aussi d'exporter ton script vers d'autres rom sans avoir a changer tout les offsets mais uniquement le premier! (Ce qui est très utile si tu fais partie d'une équipe de développeurs.)


Edit de Yago =>C'est inutile de quoter le post au dessus du tien et ça bouffe de la place, merci d'en perdre l'habitude.
« Modifié: 04 septembre 2013, 12:32 par Yago »

hremeraude

  • Membre
  • 11384 posts
04 septembre 2013, 12:30
Ouais en gros tu cherche le premier offset et la dynamic fait le reste quoi x)

Gadoin

  • Membre
  • 386 posts
04 septembre 2013, 12:32
En gros : c'est exactement sa  ;D

Pages: [1]    En haut ↑