Page 1 sur 1

[Tuto][GBA]Le Scripting XSE

Posté : dim. 13 sept. 2015 00:59
par MikaZ
/!\Ce post sera actualisé pour ajouter au fur et à mesure les scripts et évité de les répartir à travers les différentes pages de conversation./!\

J'ai remanié les scripts pour qu'ils soient dynamiques

.:Les messages:.
.:La pancarte:.
Note: Ce type de script est à insérer dans les "S" oranges.

Voici le script d'une pancarte:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
msgbox @text MSG_SIGN '""
end

#org @text
= Ceci est un message.
Ça à l'air simple mais voyons cela de plus près.

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF
Ceci est la base absolue en dynamique. La première ligne indique à XSE le premier offset du script, XSE cherchera ensuite pour chaque "commande @" un offset de libre après l'offset indiqué, ce qui vous enlève cette tâche à faire et permet de gagner énormément de place de la ROM.
La deuxième ligne permet de lui indiquer quel offset chercher et remplacer dans la ROM, en général on attribut 0x00 ou 0xFF à cette commande

Code : Tout sélectionner

#org @start
En gros, cette commande indique a XSE que le script commence ici et lui attribut un offset.

Code : Tout sélectionner

msgbox @text MSG_SIGN '""
"msgbox" indique que votre message s'affichera dans une boite de dialogue. Tout les dialogues commencent ainsi. "@text" est un appel au message. Cette commande indique au jeu d'afficher le texte codé à l'offset indiqué (trouvé par XSE mais je vais le redire à chaque fois vous avez compris xD)
Le texte en question sera présent plus bas dans le script."MSG_SIGN'"" " est le type de message à utiliser pour les pancartes.

Code : Tout sélectionner

#org @text
= Ceci est un message.
"#org @text" c'est là que l'on retrouve le même offset que celui utilisé par la "msgbox" ET ILS DOIENT ÊTRE INDENTIQUES xD. Ce qui suit le "=" est le message. Si le texte que vous voulez écrire est assez long, utilisez l'ajusteur de texte présent dans le menu "Outils".

Voilà, vous avez créé votre premier script. Pour qu'il soit utilisable, il faut le compiler. Pour cela cliquez sur l'icone représentant un double engrenage. Une fenêtre s'affiche, cliquez sur "Copier", pour avoir l'offset du script trouvé par XSE (il peut-être différent de celui que vous avez choisi) , puis sur "Fermer" et là vous n'avez plus qu'à coller l'offset sur la case adéquate dans Advance-Map ^^
.:Le normal:.
Vous aviez repris votre souffle ;) ? Alors prenez une grande bouffée d'air :twisted: car ce n'est pas fini.

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
msgbox @text MSG_FACE '""
end

#org @text
= Ceci est un message normal.
Ca ressemble beaucoup au message de pancarte, n'est ce pas ? Décortiquons:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
Pas besoin de réexpliquer ;)

Code : Tout sélectionner

msgbox @text MSG_FACE '""
"msgbox @text" vous connaissez, "MSG_FACE" un peu moins. Cette commande permet que lorsque l'on parle au personnage il vous regarde.

Code : Tout sélectionner

#org @text
= Ceci est un message normal.
Vous connaissez aussi, c'est comme dans le message de pancarte.
.:Le YESNO:.
Ce script est super pratique, il permet d'afficher un message à double choix : oui / non
Le voici:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
faceplayer
msgbox @text MSG_YESNO '""
compare LASTRESULT 0x1
if 0x1 goto @continue
msgbox @non MSG_NORMAL '""
end

#org @continue
msgbox @oui MSG_NORMAL '""
end

#org @text
=Bonjour. Ca va ?

#org @oui
= Tout va bien alors ^^.

#org @non
= Ya des jours comme ça :(.
Il y a quelques nouveautés:

Code : Tout sélectionner

faceplayer
msgbox @text MSG_YESNO '""
La première commande permet au personnage auquel on parle de se tourner vers nous. La deuxième vous la connaissez un peu il y a juste le type de message qui change. Au lieu de mettre "MSG_NORMAL", on met "MSG_YESNO"
qui fera apparaitre une fenêtre avec le choix "OUI" ou "NON".

Code : Tout sélectionner

compare LASTRESULT 0x1
if 0x1 goto @continue
La première commande compare le dernier résultat, ici votre choix OUI ou NON, avec la valeur "0x1".
La deuxième agit en fonction de votre réponse. Concrètement on peut la traduire par: "Si la réponse est OUI aller à l'offset indiqué. Sinon, continuer normalement le script."

Code : Tout sélectionner

#org @continue
msgbox @oui MSG_NORMAL '""
end
C'est là où est reporté la suite du script si votre réponse est OUI. Vous pouvez ymettre ce que vous voulez mais n'oubliez pas le "end" à la fin.

Bon c'était un peu coton à expliquer :?
.:Les applymovements:.
Qu'est qu'ça !? Ce script permet de déplacer tout personnage présent sur la map. Compliqué ? Pas si sûr:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
lock
applymovement 0x1 @move
waitmovement 0x0
release
end

#org @move
#raw 0x56 '(!)
#raw 0xFE 'End of movements
Alors voyons cela.

Code : Tout sélectionner

lock
Cette commande est indispensable sinon attention au bug. Elle permet de bloquer la caméra dans la position actuelle.

Code : Tout sélectionner

applymovement 0x[id_du_perso] @move
/!\ Attention c'est en hexadécimal /!\
C'est la commande en elle même. Mettre dans "id du perso" le numéro correspondant au personnage que vous voulez déplacer. Si vous voulez déplacer le joueur il faudra mettre "MOVE_PLAYER" et non un nombre.

Code : Tout sélectionner

waitmovement 0x0
Cela permet au jeu d'attendre que le mouvement soit fini avant d’exécuter la suite du script.

Code : Tout sélectionner

release
end
"release" débloque la caméra et "end" termine le script.

Code : Tout sélectionner

#org @move
#raw 0x[id_du_mouvement]
Un mouvement commence toujours "#raw" la suite "0x[id_du_mouvement]" indique quel est le mouvement effectué.
Une liste des mouvements possibles en fonction des versions est disponible en bas de ce post ^^

Code : Tout sélectionner

#raw 0xFE 'End of movements
Ceci indique que c'est la fin des mouvements et que le script peut continuer à s'exécuter.
.:Commandes "item":.
.:Giveitem:.
C'est ultra simple. Cela permet de donner, quand on parle à un personnage ou une pokéball, un item au joueur.
Vous allez en pleurer ;). Voici le script :

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
giveitem 0x1 0x1 MSG_FIND
end
C'est tout ?
Bah oui, quand je vous dit que c'est simple :P.

Code : Tout sélectionner

giveitem 0x[id_item] 0x[quantité] MSG_FIND
/!\ Attention c'est en hexadécimal /!\
"giveitem" est la commande. Le premier 0x1 est l'objet en lui même ou plutôt son ID dans le jeu (ici une masterball). Le deuxième 0x1 est la quantité d'objet que vous voulez donner au joueur. La j'ai une masterball, si j'en aurai voulu 3 par exemple, j'aurai mis 0x3. "MSG_FIND" est le message qui s'affichera quand vous obtiendrai votre objet.

Code : Tout sélectionner

end
Basique, termine le script.
.:Additem:.
Bah ce n'est pas compliqué non plus:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
additem 0x1 0x1
fanfare 0x101
msgbox @txt1 msg_normal
waitfanfare
closeonkeypress
end

#org @txt1
= Tiens une masterball !
Donc c'est quasiment la même structure:

Code : Tout sélectionner

additem 0x1 0x1
Au début l'objet puis sa quantité. L'avantage de additem est que l'on peut mettre un message et une musique personnalisés:

Code : Tout sélectionner

fanfare 0x101
msgbox @txt1 0x4
waitfanfare
closeonkeypress
"0x101" est l'id de la fanfare a jouée, "msgbox" vous connaissez.
"waitfanfare" attends que la fanfare finisse d'être jouer.
"closeonkeypress" permet au jeu d'attendre l'action du joueur sur le bouton ^^
Le reste vous connaissez :P
.:Checkitem:.
A venir
.:Removeitem:.
A venir
.:Les dons de Pokémons:.
.:GivePokemon:.
Très simple et très pratique. Cela donne au joueur un pokémon voulu. Associé à d'autres scripts cela peut faire un bon élément pour un scénario. Passons au code:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
givepokemon 0x90 0xA 0x1 0x0 0x0 0x0
fanfare 0x13E
msgbox @text MSG_NORMAL '""
waitfanfare
closeonkeypress
release
end

#org @text
= Tiens un PkMn !
Voyons cela:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
givepokemon 0x[id_pkmn] 0x[niveau] 0x[id_objet] 0x0 0x0 0x0
/!\ Attention c'est en hexadécimal /!\
Le début ça devrait aller ;).
Passons au "givepokemon". "0x[id_pkmn]" est l'espèce du pokémon (ici un Artikodin).
"0x[niveau]" est son niveau .
Le "0x[id_objet]" d'après permet de lui faire tenir un objet, ici je lui ai mis une masterball.
Un logiciel externe tel que Item Editor permet de voir cette liste et même de la modifier
Les 3 "0x0" restants sont des fillers a mettre obligatoirement.

Passons à la suite :

Code : Tout sélectionner

fanfare 0x13E
C'est la musique qui se joue lorsque l'on obtient quelque chose dans le jeu.
Le "msgbox" qui suit est le message qui s'affiche pendant l'obtention du Pokémon.
On peut voir la liste des musiques disponibles dans Advance Map, ainsi que leurs ID

Code : Tout sélectionner

waitfanfare
Cela fonctionne de la même manière que le "waitmovement", cela indique au jeu d'attendre la fin de la musique d'obtention pour poursuivre le script.

Code : Tout sélectionner

closeonkeypress
Permet à la fenêtre de dialogue de disparaitre que si l'utilisateur appuie sur une touche. Et la fin vous connaissez alors ;).
.:Giveegg:.
Encore plus simple que le "givepokemon", voici le "giveegg":

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
giveegg 0x[id_PkMn]
end
La commande change juste de "givepokemon" à "giveegg".
Voilà, il n'y a plus qu'à donner l'id du Pokémon en hexadécimal. Pas besoin de donner son niveau ni son objet tenu, c'est un oeuf.
.:La fonction call:.
Ce script est très pratique, il permet de réutiliser un script déjà fait sans avoir à réécrire son code. Exemple:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @soin
fadescreen 0x1
fanfare 0x100
waitfanfare
special 0x0
fadescreen 0x0
return
Ce script permet de faire une transition vers un écran noir puis de jouer la musique de soin (comme dans les Centres Pokémons), de soigner les Pokémons du joueur et enfin de revenir à l'écran de jeu.
Si on veut réutiliser le script sans se taper la réécriture, on utilse cette commande:

Code : Tout sélectionner

call @soin
Cela va appeler le script.
Il faut prendre l'offset que XSE a choisi lors de la compilation du script précédent, pour ça après la compilation rouvrez simplement le script. Voici un petit exemple d'application:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
msgbox @text1 MSG_FACE '"Veille femme: Tu as l'air fatigué...."
call @soin
msgbox @text2 MSG_FACE '"Veille femme: Te revoila sur pied."
end

#org @soin
fadescreen 0x1
fanfare 0x100
waitfanfare
special 0x0
fadescreen 0x0
return

#org @text1
= Veille femme: Tu as l'air fatigué.\nJe vais m'occuper de toi.

#org @text2
= Veille femme: Te revoilà sur pied.
Le "call" va appeler et exécuter ce qui se trouve à @soin (le script de soin compilé avant). Une fois fini, il va continuer normalement mon script.
Cela permet de gagner des octets dans la rom car cela prends beaucoup moins de place d'écrire une ligne qu'un script (surtout si vous réutilisez de gros scripts).
.:Les combats sauvages:.
Un wildbattle sert à combattre un Pokémon sauvage.
.:Wildbattle (Musique dresseur R/S/E):.

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
lock
faceplayer
setwildbattle 0x[id_PkMn] 0x[niveau] 0x[id_objet]
checksound
cry 0x[id_PkMn] 0x2
pause 0x28
waitcry
setflag 0x305
setflag 0x861
special 0x138
waitstate
clearflag 0x861
release
end
Bon ça va, ce n'est pas si terrible :twisted:.

"faceplayer" dit au Pokémon de se tourner vers le joueur quand on lui parle.

Code : Tout sélectionner

setwildbattle 0x[id_PkMn] 0x[niveau] 0x[id_objet]
/!\ Attention c'est en hexadécimal /!\
Cela défini le Pokémon que l'on s'apprête à combattre. L'id du Pokémon, de l'objet et du niveau doivent être en hexadécimal ! Sinon c'est simple.

Code : Tout sélectionner

checksound
cry 0x[id_PkMn] 0x2
pause 0x28
waitcry
/!\ Attention c'est en hexadécimal /!\
"checksound" permet de changer sur le cri du Pokémon.
La fonction "cry" appelle et lit le cri du Pokémon indiqué .
La "pause" (café :D ) fait une... pause dans le jeu avant d’exécuter la suite du script, 0x28 est le temps de la pause(en milliseconde).
Finalement on attend le cri du Pokémon (en combat apparemment) avec la ligne "waitcry".

Code : Tout sélectionner

setflag 0x305
setflag 0x861
special 0x138
waitstate
clearflag 0x861
Tout ça c'est les écran de jeu en combat, ect. C'est juste à copier/coller. D'ailleurs la musique en combat est celle de Rubis/Saphir en combat de dresseur.

Note:
Je sais que le "special 0x138" déclenche un combat sauvage avec le dernier Pokémon défini en mémoire, donc soit celui défini par le "setwildbattle" soit en l’occurrence le dernier Pokémon rencontré (dresseur ou sauvage, K.O ou pas car oui il garde en mémoire son statut, son nombre de PVs, ses PPs, sa nature, etc)
Enfin on termine avec "release" et "end"

Note 2:
Vous pouvez choisir la musique jouée en combat en ajoutant :

Code : Tout sélectionner

playsong 0x[id_song]
Il faut qu'il soit placé juste après le "special 0x138"
Voilà Voilà ^^
.:Wildbattle (Musique combat sauvage):.

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
lock
cry 0x[id_du_pokemon] 0x2
pause 0x28
wildbattle 0x[id_PkMn] 0x[niveau] 0x[id_objet]
release
end
Et voui, c'est tout. Au lieu que le combat se déclenche avec la commande "special 0x138", il se déclenche directement avec la commande "wildbattle", plus adaptée par exemple si vous voulez faire une attaque de horde (plusieurs Pokémons sauvages qui vous attaquent les uns à la suite des autres).
.:Les combats de dresseurs:.
.:Trainerbattle:.
Comme son nom l'indique le "trainerbattle" permet de déclencher un combat avec un dresseur lorsque l'on est dans son champ de vue.
C'est simple et super pratique. Voici:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
trainerbattle 0x0 0x[id_dresseur] @begin @defeat
end

#org @begin
= Message quand il vous voit

#org @defeat
= Message défaite 
/!\ Attention c'est en hexadécimal /!\
Le combat se déclenche avec la commande "trainerbattle". L'id du dresseur peut être choisi grâce à un logiciel comme A-trainer (pour son utilisation se sera un autre tuto). Tout est dit dans le code après.
Voilà c'est tout !? Mais non rassurez vous je vous réserve un autre type de trainerbattle :twisted: .
.:Trainerbattle2:.
Qu'est ce qui change ? Pas grand chose je vous l'accorde:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
trainerbattle 0x2 0x[id_dresseur] @begin @defeat @continue
end

#org @continue

'suite du script

end

#org @begin
= Message quand il vous voit

#org @defeat
= Message défaite 
Il y a deux nouveaux trucs. Le "0x0" après le "trainerbattle" devient "0x2". Un pointeur, ou offset si vous préférez, a fait son apparition à la fin de cette même commande. Il intervient en cas de victoire sur le dresseur et reprend le script sur l'offset indiqué.

Code : Tout sélectionner

#org @continue

'suite du script

end
Ceci est la suite de votre script vous pouvez y mettre ce que vous voulez.

Note: Ce type de script est utilisé par exemple pour les champions d'arènes.
.:Les "specials":.
Ce script, malgré sa simplicité, est un outil très puissant. Il peut soigner les Pokemon du joueur, téléporter le joueur, lancer une animation, demander au joueur de donner un surnom, etc.
Bref, en clair il permet de faire beaucoup de choses tout en étant court. Voici la bête:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
special 0x[id_special]
end
L'id du special est bien sur un nombre en hexadécimal. Une liste de ces specials est affichée en bas de page.
.:La téléportation:.
.:Warp:.
Je pense que vous l'attendiez celui là. Je l'ai promis, le voici:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
warp 0x[id_bank] 0x[id_map] 0x[id_du_warp] 0x[coordonnée_1] 0x[coordonnée_2]
end
/!\ Attention c'est en hexadécimal /!\
Déjà, il faut que vous choisissiez la map dans laquelle vous voulez vous téléporter. Noter son ID de Bank et son numéro. C'est ce que vous mettrez à la place de "[id_bank]" et "[id_map]"
L'id du warp est son numéro évènement, visible sur A-Map.
"[coordonnée_1]" et "[coordonnée_2]" sont ces coordonnées visibles soit en bas de l'écran soit sur le côté de l'onglet "event" quand votre warp est sélectionné.
Voilà, simple et pratique. A coupler avec deux ou trois applymovements, quelques msgbox, ça donnera un bon résultat ;).
.:Warpmuted:.
a venir
.:Warptp:.
a venir
.:Météo:.

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
setweather 0x[id_temps]
doweather
pause 0x50
resetweather
doweather
end
Voilà c'est pas si terrible :P.
Sérieusement, "setweather" permet de définir le temps indiquer après le "0x"
Une liste des temps possibles est à la fin de ce post.
"doweather" applique le temps défini par "setweather".
"resetweather" permet de réhabiliter le temps par défaut de la map.
.:Checkgender:.
On va y aller molo, voilà:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
lock
faceplayer
checkgender
compare LASTRESULT 0x0
if 0x1 goto @gars
compare LASTRESULT 0x1
if 0x1 goto @meuf
end

#org @gars
msgbox @textgars MSG_FACE '""
release
end

#org @meuf
msgbox @textmeuf MSG_FACE '""
release
end

#org @textgars
=Salut mec !

#org @textmeuf
=Salut meuf !
Keskia de nouveau:

Code : Tout sélectionner

checkgender
compare LASTRESULT 0x0
if 0x1 goto @gars
compare LASTRESULT 0x1
if 0x1 goto @meuf
"checkgender" démarre la commande.
"compare LASTRESULT" ne change pas, cela permet d'amorcer la comparaison du dernier résultat avec une valeur, "0x0" pour le gars et "0x1" pour la fille.
Les "if" et "goto" envoie le script, à l'offset indiqué, selon le résultat. Simple et utile pour les scénars.
.:Le Braille:.
Aussi simple qu'un "msgbox", ce script permet de créer de véritables énigmes, comme dans R/S/E dans les salles de Régi's:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
lockall
braille @text
waitkeypress
releaseall
end

#org @text
#braille [Votre message qui sera transformer en braille]
Au lieu d'activer la commande par "msgbox", elle s'active par "braille" suivi de l'offset.

Code : Tout sélectionner

#org @text
#braille [Votre message qui sera transformer en braille]
C'est identique à des textes basique sauf que cette fois il est précédé de la balise "#braille" au lieu d'un "=".
C'est fini, j'espère trouver des énigmes badass dans vos Rom-Hack.
.:Animation des portes:.
Gros script assez simple pour de bons scénars:

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
lock
setdooropened 0x[position_X] 0x[position_Y]
doorchange
setdoorclosed 0x[position_X] 0x[position_Y]
doorchange
release
end
/!\ Attention c'est en hexadécimal /!\
"setdooropened" permet d'ouvrir la porte à la position X,Y donnée.
"doorchange" est comme un "waitfanfare", il attend que la porte soit entièrement ouverte avant de continuer le script.
"setdoorclosed" comme "setdooropened" mais pour fermer la porte.
Pis la fin plus besoin d'expliquer ;)
Voilà c'est tout, si ce n'est que coupler à quelques "applymovements" ce script peut-être redoutable.
.:Showpokepic/Hidepokepic:.

Code : Tout sélectionner

#dynamic @offset
#freespace 0xFF

#org @start
lock
msgbox @text1 MSG_NORMAL ""'
showpokepic 0x[ID_PkMn] 0x[pos_fenêtre_X] 0x[pos_fenêtre_Y]
msgbox @text2 MSG_NORMAL ""'
hidepokepic 0x[ID_PkMn]
end

#org @text1
= [Message1]

#org @text2
= [Message2]
/!\ Attention c'est en hexadécimal /!\
Rien de plus simple, on fait apparaître la fenêtre grâce à la commande "showpokepic" suivi du numéro du Pokémon.
Pour les coordonnées je vous conseille de mettre 0xA en X et 0x3 en Y.
"hidepokepic" suivi du numéro du Pokémon ferme la fenêtre.
.:Showsprite/Hidesprite:.
Petit script sympas pour jouer au Fantominus:

Code : Tout sélectionner

'------------
#org 0x[offset]
lock
checkflag 0x[numéro_du_flag]
hidesprite 0x[numéro_du_personnage]
msgbox 0x8[offset2] MSG_NORMAL '""
showsprite 0x[numéro_du_personnage]
release
end

'---------
'Strings
'---------
#org 0x[offset2]
= Votre Message !
Keskya de new ? Bah cela :

Code : Tout sélectionner

checkflag 0x[numéro_du_flag]
Et se sera indispensable car le numéro du flag sera inscrit dans l'ID du personnage, dans A-Map, que vous voulez faire apparaître ou disparaître.

Code : Tout sélectionner

hidesprite 0x[numéro_du_personnage]
Le numéro du personnage apparaît sur A-Map, dans la section "Event", quand celui-ci est sélectionné.
"hidesprite" permet donc de faire disparaître le personnage dont le numéro est indiqué après le "0x" ( en hexadécimal, pensez donc a convertir !)
"showsprite" fonctionne de la même manière que "hidesprite" mais cela fait apparaître le personnage mais il n'est plaçable qu'après un hidesprite.
A la place de "0x[numéro_du_personnage]" vous pouvez mettre "LASTTALKED" ce qui aura pour effet de faire disparaître le dernier personnage a qui vous avez parlez dans le jeu.
.:Spritevisible/Spriteinvisible:.

Code : Tout sélectionner

'------------
#org 0x[offset]
lock
applymovement 0x[ID_personnage] 0x8[offset2]
waitmovement 0x0
spriteinvisible 0x[ID_du_personnage] 0x[bank_de_map] 0x[numéro_de_map]
release
end

'---------
'Movements
'---------
#org 0x[offset2]
#raw 0x0
#raw 0xFE
Rien de bien particulier.
La seule nouvelle commande est "spriteinvisible". Ce qui suit est déjà expliqué, les nombres sont cependant en hexadécimal.ATTENTION !!! Le sprite est toujours présent sur la map, vous pouvez parlez au personnage même s'il est invisible.
Le "spritevisible", bah c'est pareil dans le sens inverse.
.:Les flags :.
Rien de plus simple, il ya cependant 3 commandes pour gérer les flags.

Code : Tout sélectionner

'------------
#org 0x[offset]
checkflag 0x[numéro_du_flag]
if 0x1 goto 0x8[offset2]
msgbox 0x8[offset3] MSG_NORMAL '""
setflag 0x[numéro_du_flag]
end

'------------
#org 0x[offset2]
clearflag 0x[numéro_du_flag]
end

'---------
'Strings
'---------
#org 0x[offset3]
=Votre message
"checkflag" (souvent couplé avec "if...goto") vérifie si le flag choisi est activé. Le "if...goto" renvoie le script à l'offset indiqué après le goto.
A ce stade, le script continue normalement vu que le flag n'est pas activé et donc le "msgbox" s'exécute.
Le scipt continue et exécute le "setflag" qui a pour but d'activer le flag choisi.
Si on réexécute le script, le "checkflag" va donc détecté que le flag choisi est activé et va lancer la deuxième partie du script qui est à l'[offset2].
A cette offset, le script execute un "clearflag" qui désactivera notre flag choisi.
Vu qu'il n'est plus activé, si le script est réexécuter , on reverra notre "msgbox".
Voilà j'espère que que j'ai été assez clair, si ce n'est pas le cas dites le moi ;).
.:Random:.
Aujourd'hui nous allons apprendre à générer un nombre aléatoire dans un script.
On va faire un truc simple histoire de ne pas trop vous embrouillez. Voilà:

Code : Tout sélectionner

'------------
#org [offset]
lock
msgbox 0x8[offset2] MSG_FACE '""
random 0x2
compare LASTRESULT 0x0
if 0x1 goto 0x8[offset3]
compare LASTRESULT 0x1
if 0x1 goto 0x8[offset4]
release
end

'------------
#org 0x[offset3]
msgbox 0x8[offset5] MSG_NORMAL '""
release
end

'------------
#org 0x[offset4]
msgbox 0x8[offset6] MSG_NORMAL '""
release
end

'---------
'Strings
'---------
#org 0x[offset2]
= Pile ou Face ?

#org 0x[offset5]
= Pile !

#org 0x[offset6]
= Face !
Ce n'est pas si compliqué. Une nouvelle commande:

Code : Tout sélectionner

random 0x[nombre_maximum_choisi]
La fonction "random" choisira un nombre entre 1 et le nombre (en hexadécimal) inscrit après le "0x". Ici, le jeu ne pourra choisir q'un nombre entre 1 et 2, un pile ou face en somme. Pour interpreter, le résultat obtenu par la fonction "random", on utilisera :

Code : Tout sélectionner

compare LASTRESULT 0x0
if 0x1 goto 0x8[offset3]
compare LASTRESULT 0x1
if 0x1 goto 0x8[offset4]
Ces lignes vont comparer si le résultat est 1 pour la première commande et 2 pour la deuxième. Si le résultat est 1, le script est renvoyer à l'offset 3. Si ce n'est pas le cas, le script continue et va vérifier le deuxième résultat (qui ser aforcement vrai si le premier est faux) et renverra le script a l'offset 4.
Le reste de script est du classique pas besoin de réexpliquer.
Sur ce à un prochain script ;).
.:Le Countpokemon:.
Bon ça fait longtemps j'ai pas touché à ce topic xD Mais bon on peut toujours continuer
Voici sur quoi on va bosser aujourd'hui:

Code : Tout sélectionner

#dynamic
==================
/!\A venir/!\

.:Setflagtrainer & clearflagtrainer :.

.:Setmaptile :.
==================
.:Ressources:.

Voici le lien pour les ressources de scripting XSE

Re: [Tuto][GBA]Le Scripting

Posté : dim. 13 sept. 2015 03:37
par XeR
Joli tuto.
J'avais essayé de toucher aux outils de RH y'a quelques temps.
Est-ce que tu sais si le langage de scripting est :
- Fait par Nintendo, et directement inclus dans le jeu ?
- Déjà existant (type LUA), et inclus dans le jeu ?
- Déjà existant, mais généré depuis le jeu, puis réinjecté dans le jeu ?
- Fait par le dev du soft, généré depuis le jeu, puis réinjecté ?

Par exemple, je sais que les scripts utilisés par Call of Duty sont fait en QuakeC (CoD c'est juste un gros mod de Quake Arena en fait. :D)

Re: [Tuto][GBA]Le Scripting

Posté : dim. 13 sept. 2015 10:36
par MikaZ
Je n'en ai aucune idée pour être franc.
Je pense quand même que c'est Nintendo après sa peut directement les logiciels qui nous donne ce langage et au moment de compiler il retranscrit tout dans le langage originale du jeu.