J'ai remanié les scripts pour qu'ils soient dynamiques
.:Les messages:.
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.
Code : Tout sélectionner
#dynamic @offset
#freespace 0xFF
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
Code : Tout sélectionner
msgbox @text MSG_SIGN '""
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.
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 ^^
Code : Tout sélectionner
#dynamic @offset
#freespace 0xFF
#org @start
msgbox @text MSG_FACE '""
end
#org @text
= Ceci est un message normal.
Code : Tout sélectionner
#dynamic @offset
#freespace 0xFF
#org @start
Code : Tout sélectionner
msgbox @text MSG_FACE '""
Code : Tout sélectionner
#org @text
= Ceci est un message normal.
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 :(.
Code : Tout sélectionner
faceplayer
msgbox @text 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 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
Bon c'était un peu coton à expliquer
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
Code : Tout sélectionner
lock
Code : Tout sélectionner
applymovement 0x[id_du_perso] @move
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
Code : Tout sélectionner
release
end
Code : Tout sélectionner
#org @move
#raw 0x[id_du_mouvement]
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
Vous allez en pleurer . Voici le script :
Code : Tout sélectionner
#dynamic @offset
#freespace 0xFF
#org @start
giveitem 0x1 0x1 MSG_FIND
end
Bah oui, quand je vous dit que c'est simple .
Code : Tout sélectionner
giveitem 0x[id_item] 0x[quantité] MSG_FIND
"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
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 !
Code : Tout sélectionner
additem 0x1 0x1
Code : Tout sélectionner
fanfare 0x101
msgbox @txt1 0x4
waitfanfare
closeonkeypress
"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
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 !
Code : Tout sélectionner
#dynamic @offset
#freespace 0xFF
#org @start
givepokemon 0x[id_pkmn] 0x[niveau] 0x[id_objet] 0x0 0x0 0x0
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
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
Code : Tout sélectionner
closeonkeypress
Code : Tout sélectionner
#dynamic @offset
#freespace 0xFF
#org @start
giveegg 0x[id_PkMn]
end
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.
Code : Tout sélectionner
#dynamic @offset
#freespace 0xFF
#org @soin
fadescreen 0x1
fanfare 0x100
waitfanfare
special 0x0
fadescreen 0x0
return
Si on veut réutiliser le script sans se taper la réécriture, on utilse cette commande:
Code : Tout sélectionner
call @soin
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.
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).
.: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
"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]
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
"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é ) 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
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]
Voilà Voilà ^^
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
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
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 .
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
Code : Tout sélectionner
#org @continue
'suite du script
end
Note: Ce type de script est utilisé par exemple pour les champions d'arènes.
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
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
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 .
Code : Tout sélectionner
#dynamic @offset
#freespace 0xFF
#org @start
setweather 0x[id_temps]
doweather
pause 0x50
resetweather
doweather
end
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.
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 !
Code : Tout sélectionner
checkgender
compare LASTRESULT 0x0
if 0x1 goto @gars
compare LASTRESULT 0x1
if 0x1 goto @meuf
"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.
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]
Code : Tout sélectionner
#org @text
#braille [Votre message qui sera transformer en braille]
C'est fini, j'espère trouver des énigmes badass dans vos Rom-Hack.
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
"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.
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]
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.
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 !
Code : Tout sélectionner
checkflag 0x[numéro_du_flag]
Code : Tout sélectionner
hidesprite 0x[numéro_du_personnage]
"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.
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
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.
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
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 .
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 !
Code : Tout sélectionner
random 0x[nombre_maximum_choisi]
Code : Tout sélectionner
compare LASTRESULT 0x0
if 0x1 goto 0x8[offset3]
compare LASTRESULT 0x1
if 0x1 goto 0x8[offset4]
Le reste de script est du classique pas besoin de réexpliquer.
Sur ce à un prochain script .
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