Rom Hack & Fan Game

Apprendre à scripter sur une ROM GBA

Vous en avez marre de devoir chercher à droite et à gauche pour apprendre à scripter ? Les tutoriels que vous trouvez sont périmé ? Ils ne marchent plus sur les versions actuelles ? Cet apprentissage est là pour vous, vous deviendrez un vrai pro' sur XSE 1.1.1 ! Commençons sans plus tarder.

Vous aurez besoin de matériel, comme à chaque fois :

  • XSE 1.1.1, téléchargeable ici
  • Une rom GBA
  • Advance Map, téléchargeable ici
  • Un fusil ou une corde (niark)

Bon, déjà, assurez-vous que XSE 1.1.1 soit assigné à Advance Map. C'est bon ? Let's go !

On va commencer par quelquechose de simple, très simple, où je vais en profiter pour vous expliquer en détail la fonction de chaque commande. On va apprendre à faire un "Message normal". Quand vous approcherez du personnage, et que vous parlerez avec lui en appuyant sur la touche A, il vous dira le message que vous avez scripté. Voici un exemple de "Message normal" :

'---------------
#org 0x6C54B2
msgbox 0x86D59B3 MSG_FACE '"Voici un mess..."
end

'---------
'Strings
'---------
#org 0x6D59B3
= Voici un message. Cool!

On va décortiquer le script.

'---------------
#org 0x6C54B2

Tout script commence par cette commande. C'est la base absolue. #org 0x[offset] signifie que votre script est entré dans la mémoire, il est assigné à un offset de la rom. C'est un peu le point de sauvegarde.

msgbox 0x8[autreoffset] MSG_FACE '""

"msgbox" signifie que votre message est dans une boîte de dialogue. Un dialogue commence toujours par cette commande, après le #org et compagnie. 0x8[autreoffset] est un appel au message. Votre message sera situé plus bas dans votre script, et assigné à un offset. On inscrit donc cet offset ici, mais aussi plus bas. MSG_FACE est une commande qui sert à ce que le personnage à qui vous parler vous regarde, et ne tourne pas la tête pendant le message. '"" n'est pas une commande à proprement parlé, mais il faut la mettre quand même.

'---------
'Strings
'---------

Ca vous indique que vous entrez dans une zone interdite. Nan, je rigole. En fait, vous entrez dans la zone où le message sera écrit.

#org 0x[autreoffset]

On revient à ce que je disait tout à l'heure. c'est le même offset qui est après msgbox 0x8.

= [votre message]

Ici, vous inscrivez votre message. Attention tout de même, je vous conseille d'utiliser l'ajusteur de texte (Outil > Ajusteur de texte) disponible dans XSE pour inscrire un texte long.
Vous savez maintenant inscrire un nouveau message. Pour compiler votre script, reportez-vous au tuto d'initiation si vous ne savez pas comment faire. Il est possible qu'après avoir compiler, votre script bug. Vérifiez toujours. Dans ce cas, changer simplement l'offset. Je vous recommande également de faire vos scripts sous bloc-note, et de les copier/coller dans les script des personnages.

Maintenant, on va apprendre à faire un message de pancarte. Ce script sera à rentrer dans un évent "Pancarte". Commençons sans tarder.

'---------------
#org 0x8B412A
msgbox 0x86BC415 MSG_SIGN '"Message de pa..."
end

'---------
'Strings
'---------
#org 0x6BC415
= Message de pancarte. Cool!

Le début, c'est du classique. Pas besoin de réxpliquer.

msgbox 0x8[autreoffset] MSG_SIGN '""

C'est pareil que tout à l'heure, sauf le type de message : MSG_SIGN. A utiliser pour les pancartes.

'---------
'Strings
'---------
#org 0x[autreoffset]
= [votremessage]

Exactement pareil que tout à l'heure.

Vous pouvez donc constater que c'est très similaire, les script de message normal et message de pancarte se ressemblent beaucoup. Rien à ajouter !
Même topo que tout à l'heure, faites vos scripts sous bloc-notes et c/c. Vous savez maintenant faire un nouveau script de message de pancarte. GG !

On entre maintenant dans le compliqué. Mais c'est beaucoup plus fun, question résultat ! On va faire un "applymovement". Kézako ? C'est un script qui a pour fonction de faire déplacer un personnage, quand vous lui "parlez", ou que vous marchez sur un script (vert). C'est un peu plus complexe que les deux script du dessus :

'---------------
#org 0x6CAB58
lock
applymovement 0x1 0x86C1F3C
waitmovement 0x0
release
end

'---------
'Movements
'---------
#org 0x6C1F3C
#raw 0x56 '(!)
#raw 0xFE 'End of movements

Cet "applymovement" va faire en sorte que quand vous parlez au personnage qui contient ce script, un point d'exclamation va appraître sur sa tête. Mais, voyons ça à la loupe0

'---------------
#org 0x[offset]

Toujours du classique.

lock

"lock", ou "lockall". Cette fonction permet que tout soit bloquer. A mettre à chaque applymovement, pour que la map soit figée. Très important, donc.

applymovement 0x1 0x8[autreoffset]

"applymovement", vous vous en doutez, c'est la fonction qui fait débuter l'applymovement. 0x1, c'est l'ID du personnage. En effet, chaque personnage à un numéro. Pour trouver ce numéro, regardez sur la droite de la fenêtre d'Advance map (quand votre personnage est selectionné), dans "Numéro du Personnage". Copiez/collez le chiffre après 0x, "1" pour ma part. Enfin, 0x8[autreoffset], c'est la commande d'appel aux mouvements à exécuter.

waitmovement 0x0

Cette commande suit chaque, je dit bien chaque, applymovement. 0x0 ne change pas.

release

Cette fonction, très importante, permet au script de débloquer la map, quand il se finit.

end

Classique, il finit le script.

'---------
'Movements
'---------
#org 0x[autreoffset]
#raw 0x56 '(!)
#raw 0xFE 'End of movements

#org 0x[autreoffset], pareil que pour un message normal, mettre le même qu'après 0x8, plus haut. Mais que peut bien signifier #raw 0x56 et #raw 0xFE ? C'est tout simplement les mouvements ! Il en existe une grande liste pour chque version (ici, Saphir). Il faut obligatoirement mettre un #raw avant la commande. Dans l'exemple, 0x56 fait apparaître un point d'exclamation au-dessus du personnage. Je mettrai la liste de tout les mouvements en bas de page. 0xFE est présent à chaque fin de mouvement. C'est pour dire au script que les mouvements sont fini.

Evidemment, cet applymovement était très simple, il en existe des plus complexes. J'espère que vous avez tout compris, parce que c'était coton à expliquer ^^'

Il est possible de faire faire des mouvements à son personnage (Brice ou Flora). Pour cela, à la place de "0xID" (du personnage), mettez tout simplement "MOVE_PLAYER". Vous pouvez aussi faire plusieurs applymovement à la suite. Il faudra procéder comme ceci :

applymovement 0xID 0x8[offset]
waitmovement 0x0
applymovement 0xID 0x8[offset]
waitmovement 0x0

Plus bas, vous devrez mettre ceci :

'---------
'Movements
'---------
#org 0x[offsetdupremierapply]
#raw [mouvements]
#raw 0xFE

org 0x[offsetdudeuxièmeapply]
#raw [mouvements]
#raw 0xFE

Il est aussi possible de compiler un applymovement dans un script, sous Advance Map (les verts marqués d'un "S"). Pour ça, il suffit de faire exactement pareil qu'au dessus, dans le script. Sauf qu'il vous faudra faire une petite chose en plus. Quand votre script est sélectionné, regardez à droite de la fenêtre d'Advance Map. Dans "Inconnu", mettez 0003, au lieu du 0000. Puis, dans N° du Var, au lieu du 0000, inscrivez 4050. Et voilà !
Vous devriez être en mesure de compiler ça. Toujours la même, bloc-note puis c/c dans un personnage OU dans un script (vous savez les petits verts.). Si il y a bug, il vous suffit de changer l'offset et en mettre un plus grand (pour ça, dans FSF, à gauche, au lieu de mettre 64 bytes, mettez 500).

On s'attaque à autre chose ? Hmm ? Ok, vous l'aurez voulu. On va faire un truc simple, pour souffler un peu. On va apprendre à faire un "giveitem". C'est quoi, ce machin ? Eh bien, quand vous parlez à un personnage, ou que vous trouvez une pokéball par terre, vous obtenez un objet ! Pratique, non ? Hyper facile.

'---------------
#org 0x6D1D1C
giveitem 0x1 0x1 MSG_FIND
end

C'est tout ! Décortiquons un peu :

'---------------
#org 0x[offset]

Vous savez ce que ça signifie.

giveitem 0x1 0x1 MSG_FIND

"giveitem" débute le script. 0x1, c'est le type de l'objet, Chaque objet correspond à un numéro. Ici, "1", c'est une Masterball. Si j'avais voulu mettre une Hyperball, j'aurais mis "2". L'autre 0x1 signifie la quantité. Pas de problème, j'ai UNE Masterball. Si j'en avais voulu 5, j'aurais mis 0x5. MSG_FIND, c'est tout simplement, le message qui s'affiche quand vous obtenez un objet.

end

Classique.

Mais c'est pas encore terminer. Nan mais. Si on ne fais pas la manipulation qui suit, l'objet réapparaîtra encore et encore ! Pour éviter ça, aller dans Advance Map (vous y êtes déjà, haha). Sélectionnez votre objet, ou votre personnage. Sur la droite, en dessous de "Offset du Script", vous avez "ID du personnage". Normalement, il est à 0000. Mettez le à 03EC. Ensuite, si vous avez mis une Pokéball en guise de personnage (sprite), dans les mouvements, toujours sur la droite, au lieu de "Pas de mouvement", vous mettez "Regarde alentour". Et voilà !
Bon, la même qu'à chaque fois, hein, j'vais pas toujours vous le rabacher. On va s'orienter sur quelquechose d'encore plus fun, un Wildbattle.

On va apprendre à faire un Wildbattle. C'est quand vous trouvez un Pokémon dans la nature, pas dans les hautes herbes, mais en "vrai", comme Rayquaza, Kyogre ou Groudon. Ce sont des personnages, mais dont leur sprite a été changé, via Advance Map. Donc, ce script est à entrer dans les personnages. En exemple, un Ronflex :

'---------------
#org 0x460900
lock
faceplayer
setwildbattle 0x8F 0x5A 0x0
checksound
cry 0x8F 0x2
pause 0x28
waitcry
setflag 0x305
setflag 0x861
special 0x138
waitstate
clearflag 0x861
release
end

C'est déjà plus long :/ Mais toujours assez facile. Sherlock, passez moi la loupe, qu'on voit ça en détail.

(Je vous laisse deviner à quoi sert le #org 0x[offset] ^^)

lock
faceplayer

"lock", vous connaissez. "faceplayer", un peu moins. Ca fonctionne comme MSG_FACE, ça dit au personnage de vous regardez.

setwildbattle 0x8F 0x5A 0x0

setwildbattle débute le cript. Facile. Par contre, la suite l'est moins. 0x8F est l'espèce du Pokémon, mais en hexadécimal. En effet, dans la liste décimale, Ronflex est le numéro 143. en hexa', 143 équivaut à 8F. Donc, après 0x, on inscrit 8F. Vous voulez savoir comment obtenir de l'hexadécimal à partir du décimal ? Rien de plus facile, sur la droite de la fenêtre de XSE, vous avez une espèce de calculette. Elle est équipée d'un convertisseur. Vous cochez DEC, et vous inscrivez votre nombre (ici, 143). Ensuite, vous cochez HEX, et il change tout seul (ici, on obtient 8F). Passons. Continuons la suite du script. 0x5A. C'est le niveau de votre Pokémon. Je veux, ici, que le Ronflex soit au niveau 90. En hexadécimal, 90 équivaut à 5A. 0x0 signifie l'objet que le Pokémon porte. Je ne lui en ai pas mis.

checksound
cry 0x8F 0x2

"checksound" signifie qu'on "check" (change) sur le cri du Pokémon. Donc, cry 0x8F, c'est le cri de Ronflex. 0x2, on ne le change pas, c'est toujours pareil.

pause 0x28
waitcry

pause 0x28 signifie qu'il va y avoir une pause (petite) avant le début du combat. 0x28, c'est le temps "par défaut". "waitcry", littéralement, signifie qu'on va attendre le cri pendant le combat. Il fonctionne un peu comme le "waitmovement".

setflag 0x305
setflag 0x861
special 0x138
waitstate
clearflag 0x861

Tout ceci, c'est à ne pas changer. Ce sont les données de l'écran noir et du commencement du combat. Très important, mais juste à c/c..

release
end

Classique. Une fois le combat fini, le Pokémon disparaît, et vous êtes libéré.
Maintenant que vous savez faire un Wildbattle, vous allez apprendre à faire un Trainerbattle. Même chose, mais avec un dresseur.

Un Trainerbattle sert à faire un combat contre un dresseur dans la nature. Cependant, il existe plusieurs types de dresseurs (dresseurs normaux, champions d'arènes, etc..). Nous allons pour l'instant voir le plus simple. Exemple :

'---------------
#org 0x14EFA7
trainerbattle 0x0 0x25B 0x0 0x8[offset1] 0x8[offset2]
msgbox 0x8[offset3] MSG_NORMAL '""
end

'---------
'Strings
'---------
#org 0x[offset1]
= [message1]

#org 0x[offset2]
= [message2]

#org 0x[offset3]
= [message3]

Comme d'hab', on voit ça élément par élément.

trainerbattle 0x0 0x25B 0x0 0x8[offset1] 0x8[offset2]

"trainerbattle" débute le script. 0x0 définit le type de combat. Si cela avait été un combat de champion d'arène, j'aurais mis 0x2. Ici, c'est un combat normal, qui se déclenche quand vous êtes dans le champ de vision du personnage. 0x25B correspond à une donnée de personnage. Pour voir cette donnée, il faut utiliser A-Trainer. Pour un nouveau personnage, il vous faudra au préalable créer un nouveau dresseur via A-Trainer. Le second 0x0 est là tout le temps, on le met à chaque fois. Ensuite, il faut mettre deux offset. Ces offset seront à retrouver plus bas dans le "Strings", car ce sont les messages que dit le dresseur. Le premier correspond à ce qu'il vous dit en engageant le combat. Le second correspond à ce qu'il vous dit lorsqu'il perd le combat.

msgbox 0x8[offset3] MSG_NORMAL '""

Vous connaissez. Cette fonction permet au personnage de dire quelquechose, rappelez-vous, bon sang ! Juste que MSG_FACE est remplacé par MSG_NORMAL. Cette fonction va permettre au personnage de dire quelquechose après l'avoir battu. Bon, je pense que vous avez compris le reste du script, après le string de la biatch Strings.
Me revoilà! Et avec un nouveau script à vous apprendre! Très facile, vous verrez.

On va faire un "Spécial". Qu'est-ce qu'un spécial ? C'est une commande qui sert à faire quelquechose de spécial, comme soigner les Pokémon via l'infirmière. Vous pouvez aussi faire un tremblement de terre (r/s). Sans plus tarder, voyons ça plus en détail :

'---------------
#org 0x[offset]
special 0x[numéroduspécial]
end

C'est tout! Facile, hein ? Bon, je n'ai qu'une commande à décortiquer, le reste, vous connaissez.

special 0x[numéroduspécial]

"special" va commencer le script. 0x[numéroduspécial] va faire quelquechose de spécial, du genre donner le Pokédex, le Pokénav (r/s), des trucs comme ça, quoi. Vous vous doutez qu'il vous faudra piocher dans une liste plus bas pour trouver le numéro à mettre.

Evidemment, ce type de script est à coupler avec un ou deux message, des applymovement, mais tout seul, c'est plutôt à mettre dans les p'tits verts.
16/08/2010 : Plop à tous! Je reviens avec un nouveau script, le célèbre GivePokémon. Bon, ça va être un peu plus hard que les précédents, donc tenez vous bien à votre chaise, hein. Je dis ça parce qu'on va pas faire un pauvre GivePokémon tout seul, ce serait bien trop fade. On va laisser le choix au joueur de le prendre ou non! On commence ? Aller, ce serait bête de s'arrêter maintenant.

Bon, on va y aller doucement, hein. Voilà :

'---------------
#org 0x6C4740
checkflag 0x201
lock
faceplayer
if 0x1 goto 0x86C457C
msgbox 0x86C4783 MSG_YESNO '"Pokémon?"
compare LASTRESULT 0x1
if 0x1 goto 0x86C4864
msgbox 0x86C47AB MSG_NORMAL '"A plus!"
release
end

'---------------
#org 0x6C457C
msgbox 0x86C4823 MSG_NORMAL '"Bien?"
release
end

'---------------
#org 0x6C4864
givepokemon 0x15E 0x5 0x0 0x0 0x0 0x0
fanfare 0x13E
msgbox 0x86C48A0 MSG_NORMAL '"Tiens!"
waitfanfare
closeonkeypress
setflag 0x201
release
end


'---------
' Strings
'---------
#org 0x6C4783
= Pokémon?

#org 0x6C47AB
= A plus!

#org 0x6C4823
= Bien?

#org 0x6C48A0
= Tiens!

Testé et approuvé. Bon, j'ai mis des textes simples, histoire de pas faire trop long, hein. Allez on commence par des commandes que vous ne connaissez pas :

checkflag 0x201

Bon, cette commande débute un flag. C'est quoi, un flag ? Eh bien, pour faire court, c'est une commande qui permet à faire disparaître un personnage ou à ne faire exécuter un script qu'une seule fois. Eh oui, si on en mettait pas, le script pourrait s'exécuter à l'infini, et dans notre exemple, on recevrait le Pokémon des milliers des fois! Donc, très important.

if 0x1 goto 0x86C457C

Très important, comme commande. Très très importante. Vous en retrouverez dans pratiquement tous les scripts "complexes". Bon, on va décortiquer. "if 0x1 goto" appelle la commande. Cette commande sert à "transporter" le déroulement du script. C'est pour ça qu'il y a un offset. Exemple :

if 0x1 goto 0xoffset2
bla bla bla
bla bla bla

'---------------
#org 0xoffset2
bla bla bla

M'voyez ? Une fois ce deuxième script terminé, le déroulement est "retransporté" où on l'avait déplacé. Capiche ?

On continue :

msgbox 0x86C4783 MSG_YESNO '"Pokémon?"
compare LASTRESULT 0x1
if 0x1 goto 0x86C4864
msgbox 0x86C47AB MSG_NORMAL '"A plus!"

Donc, passons ça à la loupe."msgbox 0x8offset MSG_YESNO", c'est nouveau, je crois. Ben, c'est simple, quand le perso' vous pose une question, vous pouvez répondre par Oui ou Non. Ici, il va nous demander si on veut le Pokémon. Fastoche. Ensuite, "compare LASTRESULT 0x1" va comparer votre réponse. Ainsi, le script va s'éxécuter différemment suivant votre réponse. Si vous répondez Oui, il va retourner une valeur positive, 1. Sinon, valeur négative, 0. On le couple donc avec "if ___ goto". Si vous dites Oui, c'est le "if ___ goto" qui va s'exécuter. Sinon, le script continue. C'est pour cela qu'à la fin, on voit "msgbox 0x8offset MSG_NORMAL '"A plus!"". C'est le message que le perso' vous dit si vous refusez son Pokémon.

'---------------
#org 0x6C457C
msgbox 0x86C4823 MSG_NORMAL '"Bien?"
release
end

Rappelez-vous. C'est là ou nous emmène le premier "if ___ goto". Il s'éxecute une fois que le Pokémon  été donné. Eh oui, si vous lui parlez après, il faut bien qu'il vous dise quelque chose ^^. "end" revoie au script.

'---------------
#org 0x6C4864
givepokemon 0x15E 0x5 0x0 0x0 0x0 0x0
fanfare 0x13E
msgbox 0x86C48A0 MSG_NORMAL '"Tiens!"
waitfanfare
closeonkeypress
setflag 0x201
release
end

Y en a des choses là-dedans!!! C'est là où nous emmène le deuxième "if ___ goto", si on a répondu Oui. "givepokemon" (nous y voilà enfin!) débute l'action. Ce qui suit est facile à comprendre. 0x15E, c'est le numéro en hexa' du Pokémon que je veux lui faire donner, ici un Azurill. 0x5, c'est, toujours en hexa' son niveau. Ici, niveau 5. 0x0, le premier, c'est l'objet qu'il tient, en hexa'. Je ne lui en ai pas mis. les trois derniers 0x0, ce sont des Filler, indispensables au GivePokémon. "fanfare 0x13E". C'est le petit bruit qu'on entend quand on obtient quelque chose. "msgbox 0x8offset MSG_NORMAL", c'est ce que le perso' nous dit en nous donnant le Pokémon. "waitfanfare", toujours avec la "fanfare". "closeonkeypress" tient le msgbox ouvert jusqu'à ce que vous ayez obtenu le Pokémon (pendant le temps de la "fanfare", donc). "setflag 0x201" termine le checkflag. Important, donc.

Puis, le reste, vous connaissez =) Bon, c'était coton à expliquer, mais au bout de quelques essais, vous devriez avoir compris. A bientôt pour un nouveau script!
31/08/2010 : Je reviens avec un nouveau type de script! C'est hyper simple, et assez utile, pour de gros script de scénario. C'est le script du warp. Il vous transporte ou vous le voulez lorsqu'il s'active.

'---------------
#org 0xoffset
lockall
checkflag 0x200
if 0x1 goto 0x8offset
applymovement MOVE_PLAYER 0x8offset
waitmovement 0x0
warp 0x3 0x1 0x0 0xC 0x13
setflag 0x200
releaseall
end

'---------------
#org 0xoffset
releaseall
end

'---------
'Movements
'---------
#org 0xoffset
0xA 'Left
0xA 'Left
0xFE 'End

Je l'ai couplé à un applymovement, histoire de donner un peu de contenance. Je vous explique juste la commande du warp, vous connaissez le reste, hein.

warp 0x3 0x1 0x0 0xC 0x13

warp active la commande. 0x3, c'est le Bank de la map où on veut aller. 0x1, c'est sont numéro. 0x0, c'est le numéro du warp auquel le script va être relié. Eh oui, il faudra d'abord vous assurer qu'un warp existe déjà dans votre map!

Ensuite, 0xC. C'est une coordonnée de Postion. Si vous ne savez pas comment trouver les coordonnées de position de votre warp, faites comme indiqué : dans Advance Map, allez dans la map où vous souhaitez faire apparaître votre perso'. Cliquez sur Event, puis sélectionnez le warp sur lequel vous souhaitez apparaître (²). Dans le panel de droite, vous apercevrez "Position...", et deux coordonnées. Ce sont ces valeurs là qu'il va falloir copier. Donc, si vous m'avez suivi, 0xC, c'est la première valeur. 0x13, c'est la deuxième.

Compilez, et testez.

Merci à Giratino, pour m'avoir fait gagner du temps en me passant un script Pokémart vierge. On va apprendre ce que c'est, et comment le faire. Attention : Il y a deux sortes de Pokémart. Un pour RF/VF, et l'autre pour R/S/E. Je vous enseignerai les deux.

Qu'est-ce qu'un Pokémart ? C'est un script qui permet d'acheter ou de vendre des objets, comme en boutique Pokémon. Voilà le code, qui je le rappelle, est livré par Giratino (script pour RF/VF) :

'---------------
#org 0xoffset
special 0x187
compare LASTRESULT 0x2
if 0x1 goto 0x8offset
lock
faceplayer
preparemsg 0x8offset '"Bonjour!\nJe peux vous aider?"
waitmsg
pokemart 0x8offset
msgbox 0x8offset MSG_KEEPOPEN '"A la prochaine!"
release
end

'---------------
#org 0xoffset
release
end


'---------
' Strings
'---------
#org 0xoffset
= Bonjour!\nJe peux vous aider?

#org 0xoffset
= A la prochaine!


'-----------
' MartItems
'-----------
#org 0xoffset
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x

Il y a plusieurs nouvelles choses. Décortiquons, encore une fois.

special 0x187
compare LASTRESULT 0x2

Le "special", c'est tout simplement la commande de départ d'un Pokémart pour RF/VF. "compare LASTRESULT 0x2" va comparer le résultat du "special", de sorte à savoir où il doit continuer le script.

preparemsg 0x8offset '"Bonjour!\nJe peux vous aider?"
waitmsg
pokemart 0x8offset

"preparemsg 0x8offset", c'est tout simplement le message que le personnage va dire avant de faire votre choix. Ce n'est pas un "msgbox", attention, car il va préparer le message, et le placer ailleurs lors de l'exécution du script. "waitmsg", semblable à "waitfanfare" vu précédemment, va faire patienter le message jusqu'à l'exécution du Pokémart.

Enfin, "pokemart 0x8offset" va débuter le Pokémart. Il se rapporte à ceci :

'-----------
' MartItems
'-----------
#org 0xoffset
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x
#raw word 0x

"#raw word 0x", c'est semblable à "#raw 0x..." pour les applymovement, n'est-ce pas ? Après le 0x, il suffit de mettre le numéro en hexadécimal de l'objet que vous voulez faire vendre. Et voilà pour le Pokémart de RF/VF. Voyons dès à présent celui de R/S/E.

'---------------
#org 0x156861
lock
faceplayer
preparemsg 0x81A5F96 '"Bienvenue!\pEn quoi puis-je vous a..."
waitmsg
pokemart 0x8156878
msgbox 0x81A5FBD MSG_KEEPOPEN '"A la prochaine!"
release
end


'---------
' Strings
'---------
#org 0x1A5F96
= Bienvenue!\pEn quoi puis-je vous aider?

#org 0x1A5FBD
= A la prochaine!


'-----------
' MartItems
'-----------
#org 0x156878
#raw word 0x4
#raw word 0x3
#raw word 0xD
#raw word 0x16
#raw word 0xE
#raw word 0x12
#raw word 0x55
#raw word 0x56
#raw word 0x7A
#raw word 0x0

Z'avez vu ? C'est exactement pareil, mais sans le "special" et le "compare LASTRESULT 0x2" du début ! Ahah, ça va me faire gagner du temps, tout ça...
Eh ! Me lachez pas !

...
...

Bon, pour ceux qui restent, je vais vous apprendre à faire un Checkgender. C'est quoi ? C'est un script qui va agir différemment suivant le personnage que l'on a pris au début.

Bon, c'est simple, cool, et utile. Voici :

'---------------
#org 0xoffset
lock
faceplayer
checkgender
compare 0x800D 0x0
if 0x1 goto 0x8offsetgars
compare 0x800D 0x1
if 0x1 goto 0x8offsetmeuf
end

'----------------
#org 0xoffsetgars
msgbox 0x8offset1 MSG_FACE '""
release
end

'----------------
#org 0xoffsetmeuf
msgbox 0x8offset2 MSG_FACE '""
release
end

'---------
' Strings
'---------
#org 0xoffset1
= Salut, mec!

#org 0xoffset2
= Salut, chérie!

Voyons les nouvelles commandes.

checkgender
compare 0x800D 0x0
if 0x1 goto 0x8offsetgars
compare 0x800D 0x1
if 0x1 goto 0x8offsetmeuf

"checkgender", c'est la commande, elle débute. "compare 0x800D 0x0" va, encore une fois, comparer le résultat du "checkgender". Si c'est un garçon, le "if ... goto" du dessous se déclenche, et emmène le script à l'exécution de ce que va dire le personnage si c'est un garçon.

'----------------
#org 0xoffsetgars
msgbox 0x8offset1 MSG_FACE '""
release
end

Sinon, il continue, et "compare 0x800D 0x1" va comparer une seconde fois. Si c'est pas un mec, c'est une fille, donc, le personnage ne va pas dire la même chose. Très utile pour les scénario, donc.
Nous sommes le 11 septembre 2010, et j'ai envie de vous apprendre un nouveau type de script. Quatre, plus précisément, mais ils se recoupent.

Bon, on va apprendre des choses hyper hyper hyper simple. Les Showpoképic/Hidepoképic et les Showsprite/Hidesprite. Les deux premiers servent à faire apparaître une fenêtre avec l'image d'un Pokémon dedans (comme dans RF/VF au moment de choisir le Pokémon) et la faire disparaître. Les deux autres, respectivement Showsprite et Hidesprite, servent à faire apparaître un sprite (overworld) ou à le faire disparaître. Indispensable pour tout bon scénario. On commence par le Showpoképic et le Hidepoképic :

'---------------
#org 0xoffset
msgbox 0x8offset MSG_NORMAL '""
showpokepic 0x1 0xA 0x3
msgbox 0x8offset MSG_NORMAL '""
hidepokepic 0x1
end

'---------
' Strings
'---------
#org 0xoffset
= C'est un Bulbizarre.

#org 0xoffset
= Cool, non ?

Bon, c'est ultra basique. Il y a juste deux commandes que vous ne connaissez pas :

showpokepic 0x1 0xA 0x3

"showpokepic" débute la commande. 0x1, c'est le numéro du Pokémon qu'on veut faire apparaître (/!\ hexadécimal). 0xA et 0x3, ce sont les coordonnées de l'emplacement de la fenêtre dans l'écran. Je vous conseille vivement de garder 0xA et 0x3 car ce sont les coordonnées par défaut, celles qui placeront le fenêtre pile au milieu de l'écran.

hidepokepic 0x1

Il fait tout simplement disparaître la fenêtre, avec 0x1 le numéro du Pokémon, toujours en hexa'. Voilà, on en a terminé avec ceux-là ! Passons aux Showsprite et Hidesprite.

'---------------
#org 0xoffset
lockall
checkflag 0x200
msgbox 0x8offset MSG_FACE '""
hidesprite LASTALKED
applymovement MOVE_PLAYER 0x8offset
showsprite LASTALKED
releaseall
end

Bon, ça se complique un tout petit peu. "checkflag 0x200", vous connaissez, et ici, c'est indispensable. Pourquoi ? Parce que le "200", il faudra l'inscrire dans l'ID du personnage que vous voudrez faire apparaître ou disparaître. Pour cela, cliquez sur votre personnage dans AM, descendez dans le panel de droite jusqu'à trouver "ID du personnage", et inscrivez le numéro de votre flag. Voilà =)

hidesprite LASTTALKED

Cette commande fait disparaître le personnage à qui vous parlez. Dans ce scirpt, il vous dit quelque chose, et disparaît. "hidesprite" débute la commande, et LASTALKED signifie que le dernier personnage à qui vous avez parlez disparaît. Si vous ne voulez pas faire disparaître le personnage à qui vous avez parler, alors, il faudra faire comme ceci :

hidesprite 0xnuméro du personnage

Ensuite, le "showsprite". Il n'est plaçable QUE après un "hidesprite". Il fait réapparaître le personnage que vous avez fait disparaître. Dans mon script, le personnage vous parle. Ensuite il disparaît. Puis, le héros fait quelques pas. Enfin, le personnage que vous aviez fait disparaître réapparaît. Évidemment, mon script est ultra basique, à vous de l'étoffez.

showsprite LASTTALKED

Bon, bah, même explication que pour le "hidesprite". "0xnuméro du personnage" si vous ne voulez pas de "LASTALKED". Et voilà, j'ai fini de vous enseigner ces quatres petites choses ! A bientôt !

Exercices

Parce qu'on bon tuto de script doit contenir des exercices, je vous en propose quelques-uns ! Je vais les classer par difficultés, que vous sachiez à quoi vous attendre (peut-être).

Niveau débutant :
1er exercice : faites un message simple qui nous pose une question, et par laquelle on doit répondre par Oui ou Non, sans vous servir du tuto.
2eme exercice : faites un message de pancarte, sans vous servir du tuto.
3eme exercice : faites un applymovement (au choix), suivi d'un message simple.

Niveau moyen :
1er exercice : faites un applymovement du héros qui ira à droite, en haut, à gauche, en bas, et qui aura un point d'exclamation sur la tête à la fin.
2eme exercice : faites moi un wildbattle précédé d'un spécial "tremblement de terre".
3eme exercice : compilez un message simple, suivi d'un giveitem et d'un givepokémon.

Niveau difficile :
1er exercice : faites moi un message simple, suivi de deux givepokémon où le joueur devra choisir lequel il veut, puis faites disparaître le donneur une fois le choix fait.
2eme exercice : compilez un message simple qui variera selon le genre du personnage (checkgender), suivi d'un giveitem, où l'objet sera encore différent selon le genre (sexisme, je sais). Puis, à la fin du script, je veux un trainerbattle.
3eme exercice : faites un applymovement du héros et un autre apply d'un personnage qui s'exécutent en même temps, suivi d'un warp.

Niveau expert :
Attention, ça va chier des bulles.
1er exercice : message simple différent selon le genre, puis applymovement du héros suivi de l'applymovement du personnage auquel on a parlé, suivi d'un message simple demandant si on veut un Pokémon (oui ou non), bien sûr suivi du givepokémon. Ensuite, applymovement du héros, puis warp.
2eme exercice : trainerbattle, si on bat l'adversaire, giveitem, puis applymovement du héros jusqu'à un Pokémon legendaire, spécial "tremblement de terre", puis wildbattle. Vous rajouterez des messages simple là où il faut pour que la mini-histoire soit cohérente.

Listes en vrac

  • Liste des Pokémon (décimal) (déclic à montrer ou cacher)
    BULBASAUR 1
    IVYSAUR 2
    VENUSAUR 3
    CHARMANDER 4
    CHARMELEON 5
    CHARIZARD 6
    SQUIRTLE 7
    WARTORTLE 8
    BLASTOISE 9
    CATERPIE 10
    METAPOD 11
    BUTTERFREE 12
    WEEDLE 13
    KAKUNA 14
    BEEDRILL 15
    PIDGEY 16
    PIDGEOTTO 17
    PIDGEOT 18
    RATTATA 19
    RATICATE 20
    SPEAROW 21
    FEAROW 22
    EKANS 23
    ARBOK 24
    PIKACHU 25
    RAICHU 26
    SANDSHREW 27
    SANDSLASH 28
    NIDORAN|w| 29
    NIDORINA 30
    NIDOQUEEN 31
    NIDORAN|m| 32
    NIDORINO 33
    NIDOKING 34
    CLEFAIRY 35
    CLEFABLE 36
    VULPIX 37
    NINETALES 38
    JIGGLYPUFF 39
    WIGGLYTUFF 40
    ZUBAT 41
    GOLBAT 42
    ODDISH 43
    GLOOM 44
    VILEPLUME 45
    PARAS 46
    PARASECT 47
    VENONAT 48
    VENOMOTH 49
    DIGLETT 50
    DUGTRIO 51
    MEOWTH 52
    PERSIAN 53
    PSYDUCK 54
    GOLDUCK 55
    MANKEY 56
    PRIMEAPE 57
    GROWLITHE 58
    ARCANINE 59
    POLIWAG 60
    POLIWHIRL 61
    POLIWRATH 62
    ABRA 63
    KADABRA 64
    ALAKAZAM 65
    MACHOP 66
    MACHOKE 67
    MACHAMP 68
    BELLSPROUT 69
    WEEPINBELL 70
    VICTREEBEL 71
    TENTACOOL 72
    TENTACRUEL 73
    GEODUDE 74
    GRAVELER 75
    GOLEM 76
    PONYTA 77
    RAPIDASH 78
    SLOWPOKE 79
    SLOWBRO 80
    MAGNEMITE 81
    MAGNETON 82
    FARFETCH'D 83
    DODUO 84
    DODRIO 85
    SEEL 86
    DEWGONG 87
    GRIMER 88
    MUK 89
    SHELLDER 90
    CLOYSTER 91
    GASTLY 92
    HAUNTER 93
    GENGAR 94
    ONIX 95
    DROWZEE 96
    HYPNO 97
    KRABBY 98
    KINGLER 99
    VOLTORB 100
    ELECTRODE 101
    EXEGGCUTE 102
    EXEGGUTOR 103
    CUBONE 104
    MAROWAK 105
    HITMONLEE 106
    HITMONCHAN 107
    LICKITUNG 108
    KOFFING 109
    WEEZING 110
    RHYHORN 111
    RHYDON 112
    CHANSEY 113
    TANGELA 114
    KANGASKHAN 115
    HORSEA 116
    SEADRA 117
    GOLDEEN 118
    SEAKING 119
    STARYU 120
    STARMIE 121
    MR. MIME 122
    SCYTHER 123
    JYNX 124
    ELECTABUZZ 125
    MAGMAR 126
    PINSIR 127
    TAUROS 128
    MAGIKARP 129
    GYARADOS 130
    LAPRAS 131
    DITTO 132
    EEVEE 133
    VAPOREON 134
    JOLTEON 135
    FLAREON 136
    PORYGON 137
    OMANYTE 138
    OMASTAR 139
    KABUTO 140
    KABUTOPS 141
    AERODACTYL 142
    SNORLAX 143
    ARTICUNO 144
    ZAPDOS 145
    MOLTRES 146
    DRATINI 147
    DRAGONAIR 148
    DRAGONITE 149
    MEWTWO 150
    MEW 151
    CHIKORITA 152
    BAYLEEF 153
    MEGANIUM 154
    CYNDAQUIL 155
    QUILAVA 156
    TYPHLOSION 157
    TOTODILE 158
    CROCONAW 159
    FERALIGATR 160
    SENTRET 161
    FURRET 162
    HOOTHOOT 163
    NOCTOWL 164
    LEDYBA 165
    LEDIAN 166
    SPINARAK 167
    ARIADOS 168
    CROBAT 169
    CHINCHOU 170
    LANTURN 171
    PICHU 172
    CLEFFA 173
    IGGLYBUFF 174
    TOGEPI 175
    TOGETIC 176
    NATU 177
    XATU 178
    MAREEP 179
    FLAAFFY 180
    AMPHAROS 181
    BELLOSSOM 182
    MARILL 183
    AZUMARILL 184
    SUDOWOODO 185
    POLITOED 186
    HOPPIP 187
    SKIPLOOM 188
    JUMPLUFF 189
    AIPOM 190
    SUNKERN 191
    SUNFLORA 192
    YANMA 193
    WOOPER 194
    QUAGSIRE 195
    ESPEON 196
    UMBREON 197
    MURKROW 198
    SLOWKING 199
    MISDREAVUS 200
    UNOWN 201
    WOBBUFFET 202
    GIRAFARIG 203
    PINECO 204
    FORRETRESS 205
    DUNSPARCE 206
    GLIGAR 207
    STEELIX 208
    SNUBBULL 209
    GRANBULL 210
    QWILFISH 211
    SCIZOR 212
    SHUCKLE 213
    HERACROSS 214
    SNEASEL 215
    TEDDIURSA 216
    URSARING 217
    SLUGMA 218
    MAGCARGO 219
    SWINUB 220
    PILOSWINE 221
    CORSOLA 222
    REMORAID 223
    OCTILLERY 224
    DELIBIRD 225
    MANTINE 226
    SKARMORY 227
    HOUNDOUR 228
    HOUNDOOM 229
    KINGDRA 230
    PHANPY 231
    DONPHAN 232
    PORYGON2 233
    STANTLER 234
    SMEARGLE 235
    TYROGUE 236
    HITMONTOP 237
    SMOOCHUM 238
    ELEKID 239
    MAGBY 240
    MILTANK 241
    BLISSEY 242
    RAIKOU 243
    ENTEI 244
    SUICUNE 245
    LARVITAR 246
    PUPITAR 247
    TYRANITAR 248
    LUGIA 249
    HO-OH 250
    CELEBI 251
    TREECKO 277
    GROVYLE 278
    SCEPTILE 279
    TORCHIC 280
    COMBUSKEN 281
    BLAZIKEN 282
    MUDKIP 283
    MARSHTOMP 284
    SWAMPERT 285
    POOCHYENA 286
    MIGHTYENA 287
    ZIGZAGOON 288
    LINOONE 289
    WURMPLE 290
    SILCOON 291
    BEAUTIFLY 292
    CASCOON 293
    DUSTOX 294
    LOTAD 295
    LOMBRE 296
    LUDICOLO 297
    SEEDOT 298
    NUZLEAF 299
    SHIFTRY 300
    NINCADA 301
    NINJASK 302
    SHEDINJA 303
    TAILLOW 304
    SWELLOW 305
    SHROOMISH 306
    BRELOOM 307
    SPINDA 308
    WINGULL 309
    PELIPPER 310
    SURSKIT 311
    MASQUERAIN 312
    WAILMER 313
    WAILORD 314
    SKITTY 315
    DELCATTY 316
    KECLEON 317
    BALTOY 318
    CLAYDOL 319
    NOSEPASS 320
    TORKOAL 321
    SABLEYE 322
    BARBOACH 323
    WHISCASH 324
    LUVDISC 325
    CORPHISH 326
    CRAWDAUNT 327
    FEEBAS 328
    MILOTIC 329
    CARVANHA 330
    SHARPEDO 331
    TRAPINCH 332
    VIBRAVA 333
    FLYGON 334
    MAKUHITA 335
    HARIYAMA 336
    ELECTRIKE 337
    MANECTRIC 338
    NUMEL 339
    CAMERUPT 340
    SPHEAL 341
    SEALEO 342
    WALREIN 343
    CACNEA 344
    CACTURNE 345
    SNORUNT 346
    GLALIE 347
    LUNATONE 348
    SOLROCK 349
    AZURILL 350
    SPOINK 351
    GRUMPIG 352
    PLUSLE 353
    MINUN 354
    MAWILE 355
    MEDITITE 356
    MEDICHAM 357
    SWABLU 358
    ALTARIA 359
    WYNAUT 360
    DUSKULL 361
    DUSCLOPS 362
    ROSELIA 363
    SLAKOTH 364
    VIGOROTH 365
    SLAKING 366
    GULPIN 367
    SWALOT 368
    TROPIUS 369
    WHISMUR 370
    LOUDRED 371
    EXPLOUD 372
    CLAMPERL 373
    HUNTAIL 374
    GOREBYSS 375
    ABSOL 376
    SHUPPET 377
    BANETTE 378
    SEVIPER 379
    ZANGOOSE 380
    RELICANTH 381
    ARON 382
    LAIRON 383
    AGGRON 384
    CASTFORM 385
    VOLBEAT 386
    ILLUMISE 387
    LILEEP 388
    CRADILY 389
    ANORITH 390
    ARMALDO 391
    RALTS 392
    KIRLIA 393
    GARDEVOIR 394
    BAGON 395
    SHELGON 396
    SALAMENCE 397
    BELDUM 398
    METANG 399
    METAGROSS 400
    REGIROCK 401
    REGICE 402
    REGISTEEL 403
    KYOGRE 404
    GROUDON 405
    RAYQUAZA 406
    LATIAS 407
    LATIOS 408
    JIRACHI 409
    DEOXYS 410
    CHIMECHO 411
  • Liste des items (hexadécimal) (déclic à montrer ou cacher)
    Master Ball 1
    Ultra Ball 2
    Great Ball 3
    Poké Ball 4
    Safari Ball 5
    Net Ball 6
    Dive Ball 7
    Nest Ball 8
    Repeat Ball 9
    Timer Ball 10
    Luxury Ball 11
    Premier Ball 12
    Potion 13
    Antidote 14
    Burn Heal 15
    Ice Heal 16
    Awakening 17
    Parlyz Heal 18
    Full Restore 19
    Max Potion 20
    Hyper Potion 21
    Super Potion 22
    Full Heal 23
    Revive 24
    Max Revive 25
    Fresh Water 26
    Soda Pop 27
    Lemonade 28
    Moomoo Milk 29
    Energypowder 30
    Energy Root 31
    Heal Powder 32
    Revival Herb 33
    Ether 34
    Max Ether 35
    Elixir 36
    Max Elixir 37
    Lava Cookie 38
    Blue Flute 39
    Yellow Flute 40
    Red Flute 41
    Black Flute 42
    White Flute 43
    Berry Juice 44
    Sacred Ash 45
    Shoal Salt 46
    Shoal Shell 47
    Red Shard 48
    Blue Shard 49
    Yellow Shard 50
    Green Shard 51
    HP Up 63
    Protein 64
    Iron 65
    Carbos 66
    Calcium 67
    Rare Candy 68
    PP Up 69
    Zinc 70
    PP Max 71
    Guard Spec. 73
    Dire Hit 74
    X Attack 75
    X Defend 76
    X Speed 77
    X Accuracy 78
    X Special 79
    Poké Doll 80
    Fluffy Tail 81
    Super Repel 83
    Max Repel 84
    Escape Rope 85
    Repel 86
    Sun Stone 93
    Moon Stone 94
    Fire Stone 95
    Thunderstone 96
    Water Stone 97
    Leaf Stone 98
    Tinymushroom 103
    Big Mushroom 104
    Pearl 106
    Big Pearl 107
    Stardust 108
    Star Piece 109
    Nugget 110
    Heart Scale 111
    Orange Mail 121
    Harbor Mail 122
    Glitter Mail 123
    Mech Mail 124
    Wood Mail 125
    Wave Mail 126
    Bead Mail 127
    Shadow Mail 128
    Tropic Mail 129
    Dream Mail 130
    Fab Mail 131
    Retro Mail 132
    Cheri Berry 133
    Chesto Berry 134
    Pecha Berry 135
    Rawst Berry 136
    Aspear Berry 137
    Leppa Berry 138
    Oran Berry 139
    Persim Berry 140
    Lum Berry 141
    Sitrus Berry 142
    Figy Berry 143
    Wiki Berry 144
    Mago Berry 145
    Aguav Berry 146
    Iapapa Berry 147
    Razz Berry 148
    Bluk Berry 149
    Nanab Berry 150
    Wepear Berry 151
    Pinap Berry 152
    Pomeg Berry 153
    Kelpsy Berry 154
    Qualot Berry 155
    Hondew Berry 156
    Grepa Berry 157
    Tamato Berry 158
    Cornn Berry 159
    Magost Berry 160
    Rabuta Berry 161
    Nomel Berry 162
    Spelon Berry 163
    Pamtre Berry 164
    Watmel Berry 165
    Durin Berry 166
    Belue Berry 167
    Liechi Berry 168
    Ganlon Berry 169
    Salac Berry 170
    Petaya Berry 171
    Apicot Berry 172
    Lansat Berry 173
    Starf Berry 174
    Enigma Berry 175
    Brightpowder 179
    White Herb 180
    Macho Brace 181
    Exp. Share 182
    Quick Claw 183
    Soothe Bell 184
    Mental Herb 185
    Choice Band 186
    King's Rock 187
    Silverpowder 188
    Amulet Coin 189
    Cleanse Tag 190
    Soul Dew 191
    Deepseatooth 192
    Deepseascale 193
    Smoke Ball 194
    Everstone 195
    Focus Band 196
    Lucky Egg 197
    Scope Lens 198
    Metal Coat 199
    Leftovers 200
    Dragon Scale 201
    Light Ball 202
    Soft Sand 203
    Hard Stone 204
    Miracle Seed 205
    Blackglasses 206
    Black Belt 207
    Magnet 208
    Mystic Water 209
    Sharp Beak 210
    Poison Barb 211
    Nevermeltice 212
    Spell Tag 213
    Twistedspoon 214
    Charcoal 215
    Dragon Fang 216
    Silk Scarf 217
    Up-grade 218
    Shell Bell 219
    Sea Incense 220
    Lax Incense 221
    Lucky Punch 222
    Metal Powder 223
    Thick Club 224
    Stick 225
    Red Scarf 254
    Blue Scarf 255
    Pink Scarf 256
    Green Scarf 257
    Yellow Scarf 258
    Mach Bike 259
    Coin Case 260
    Itemfinder 261
    Old Rod 262
    Good Rod 263
    Super Rod 264
    S.S. Ticket 265
    Contest Pass 266
    Wailmer Pail 268
    Devon Goods 269
    Soot Sack 270
    Basement Key 271
    Acro Bike 272
    PokéBlock Case 273
    Letter 274
    Eon Ticket 275
    Red Orb 276
    Blue Orb 277
    Scanner 278
    Go-goggles 279
    Meteorite 280
    Rm. 1 Key 281
    Rm. 2 Key 282
    Rm. 4 Key 283
    Rm. 6 Key 284
    Storage Key 285
    Root Fossil 286
    Claw Fossil 287
    Devon Scope 288
    TM01 289
    TM02 290
    TM03 291
    TM04 292
    TM05 293
    TM06 294
    TM07 295
    TM08 296
    TM09 297
    TM10 298
    TM11 299
    TM12 300
    TM13 301
    TM14 302
    TM15 303
    TM16 304
    TM17 305
    TM18 306
    TM19 307
    TM20 308
    TM21 309
    TM22 310
    TM23 311
    TM24 312
    TM25 313
    TM26 314
    TM27 315
    TM28 316
    TM29 317
    TM30 318
    TM31 319
    TM32 320
    TM33 321
    TM34 322
    TM35 323
    TM36 324
    TM37 325
    TM38 326
    TM39 327
    TM40 328
    TM41 329
    TM42 330
    TM43 331
    TM44 332
    TM45 333
    TM46 334
    TM47 335
    TM48 336
    TM49 337
    TM50 338
    HM01 339
    HM02 340
    HM03 341
    HM04 342
    HM05 343
    HM06 344
    HM07 345
    HM08 346
    Oak's Parcel 349
    Poké Flute 350
    Secret Key 351
    Bike Voucher 352
    Gold Teeth 353
    Old Amber 354
    Card Key 355
    Lift Key 356
    Helix Fossil 357
    Dome Fossil 358
    Silph Scope 359
    Bicycle 360
    Town Map 361
    VS Seeker 362
    Fame Checker 363
    TM Case 364
    Berry Pouch 365
    Teachy TV 366
    Tri-pass 367
    Rainbow Pass 368
    Tea 369
    Mysticticket 370
    Auroraticket 371
    Powder Jar 372
    Ruby 373
    Sapphire 374
  • Liste des mouvements Emeraude (déclic à montrer ou cacher)
    Se déplace lentement en Bas (Down), Haut (Up), Gauche (Left), Droite (Right)
    #raw 0x4 'Step Down (Slow)
    #raw 0x5 'Step Up (Slow)
    #raw 0x6 'Step Left (Slow)
    #raw 0x7 'Step Right (Slow)

    Se déplace normalement en Bas (Down), Haut (Up), Gauche (Left), Droite (Right)
    #raw 0x8 'Step Down (Normal)
    #raw 0x9 'Step Up (Normal)
    #raw 0xA 'Step Left (Normal)
    #raw 0xB 'Step Right (Normal)

    Délai avant un mouvement
    #raw 0x10 'Delay1
    #raw 0x11 'Delay2
    #raw 0x12 'Delay3
    #raw 0x13 'Delay4
    #raw 0x14 'Delay5

    Regarde dans la direction actuelle
    #raw 0x3E 'Face Player

    End of Movements (à toujours placer à la fin des mouvements)
    #raw 0xFE 'End of Movements
  • Liste des mouvements R/S (déclic à montrer ou cacher)
    0x54 ' Hide
    0x55 ' Show
    0x56 ' !
    0x57 ' ?
    0x58 ' Coeur au dessus de la tête
    0x5A ' Pokeball au dessus de la tête
    0x10 ' Delay0
    0x11 ' Delay1
    0x12 ' Delay2
    0x13 ' Delay3
    0x14 ' Delay4

    ' Step
    0x00 ' Down0
    0x01 ' Up0
    0x02 ' Left0
    0x03 ' Right0
    0x04 ' Down1
    0x05 ' Up1
    0x06 ' Left1
    0x07 ' Right1
    0x08 ' Down2
    0x09 ' Up2
    0x0A ' Left2
    0x0B ' Right2
    0x17 ' Left3
    0x18 ' Right3
    0x15 ' Down3
    0x16 ' Up3
    0x2D ' Down4
    0x2E ' Up4
    0x2F ' Left4
    0x30 ' Right4

    ' Running
    0x35 ' RunDown
    0x36 ' RunUp
    0x37 ' RunLeft
    0x38 ' RunRight
    0x7E ' RunDown2
    0x7F ' RunUp2
    0x80 ' RunLeft2
    0x81 ' RunRight2

    ' Hop & Jump
    0x0C ' HopTileDown
    0x0D ' HopTileUp
    0x0E ' HopTileLeft
    0x0F ' HopTileRight
    0x3A ' HighHopDown
    0x3B ' HighHopUp
    0x3C ' HighHopLeft
    0x3D ' HighHopRight
    0x46 ' HopDown
    0x47 ' HopUp
    0x48 ' HopLeft
    0x49 ' HopRight
    0x4A ' HopDown180
    0x4B ' HopUp180
    0x4C ' HopLeft180
    0x4D ' HopRight180
    0x42 ' JumpDown
    0x43 ' JumpUp
    0x44 ' JumpLeft
    0x45 ' JumpRight

    ' Straf (May have glitches)
    0x19 ' StDown1
    0x1A ' StUp1
    0x1B ' StLeft1
    0x1C ' StRight1
    0x1D ' StDown2
    0x1E ' StUp2
    0x1F ' StLeft2
    0x20 ' StRight2
    0x21 ' StDown3
    0x22 ' StUp3
    0x23 ' StLeft3
    0x24 ' StRight3
    0x25 ' StDown4
    0x26 ' StUp4
    0x27 ' StLeft4
    0x28 ' StRight4
    0x6A ' StDown1i
    0x6B ' StUp1i
    0x6C ' StLeft1i
    0x6D ' StRight1i
    0x6E ' StDown5
    0x6F ' StUp5
    0x70 ' StLeft5
    0x71 ' StRight5

    'Special
    0x31 ' SlideFaceDown
    0x32 ' SlideFaceUp
    0x33 ' SlideFaceLeft
    0x34 ' SlideFaceRight
    0x86 ' IceSlideDown
    0x87 ' IceSlideUp
    0x88 ' IceSlideLeft
    0x89 ' IceSlideRight

    ' Glitchy
    0x3E ' Up0A
    0x3F ' Down0A
    0x4E ' Down0B
    0x63 ' Up0B
    0x65 ' Right0A
    0x66 ' RunStopLoopDown
    0x67 ' RunStopLoopUp
    0x68 ' RunStopLoopLeft
    0x69 ' RunStopLoopRight
    0x72 ' Down15
    0x73 ' Up15
    0x74 ' Left15
    0x75 ' Right15
    0x7A ' Down6
    0x7B ' Up6
    0x7C ' Left6
    0x7D ' Right6
    0x82 ' Down7
    0x83 ' Up7
    0x84 ' Left7
    0x85 ' Right7

    ' EXIT
    0xFE
  • Liste des mouvements RF/VF (déclic à montrer ou cacher)
    POKéMON Rouge Feu/Vert Feuille FR-US:
    Tourne la tête vers le bas: 0x00
    Tourne la tête vers le Haut: 0x01
    Tourne la tête vers la gauche: 0x02
    Tourne la tête vers la droite: 0x03
    Fait un pas en bas (Très lentement): 0x08
    Fait un pas en haut (Très lentement): 0x09
    Fait un pas à gauche (Très lentement): 0x0A
    Fait un pas à droite (Très lentement): 0x0B
    Fait un pas en bas (lentement): 0x0C
    Fait un pas en haut (lentement): 0x0D
    Fait un pas à gauche(lentement): 0x0E
    Fait un pas à droite (lentement): 0x0F
    Fait un pas en bas (Normalement): 0x10
    Fait un pas en haut (Normalement): 0x11
    Fait un pas à gauche (Normalement): 0x12
    Fait un pas à droite (Normalement): 0x13
    Jump Down 2 Squares 0x14
    Jump Up 2 Squares 0x15
    Jump Left 2 Squares 0x16
    Jump Right 2 Squares 0x17
    Step Down (Fast) 0x1D
    Step Up (Fast) 0x1E
    Step Left (Fast) 0x1F
    Step Right (Fast) 0x20
    Step on the Spot Down 0x21
    Step on the Spot Up 0x22
    Step on the Spot Left 0x23
    Step on the Spot Right 0x24
    Step on the Spot Down (Fast) 0x25
    Step on the Spot Up (Fast) 0x26
    Step on the Spot Left (Fast) 0x27
    Step on the Spot Right (Fast) 0x28
    Step on the Spot Down (Very Fast) 0x29
    Step on the Spot Up (Very Fast) 0x2A
    Step on the Spot Left (Very Fast) 0x2B
    Step on the Spot Right (Very Fast) 0x2C
    Face Down (Non-Instant) 0x2D
    Face Up (Non-Instant) 0x2E
    Face Left (Non-Instant) 0x2F
    Face Right (Non-Instant) 0x30
    Slide Down 0x31
    Slide Up 0x32
    Slide Left 0x33
    Slide Right 0x34
    Slide Down On Right Foot 0x3D
    Slide Up On Right Foot 0x3E
    Slide Left On Right Foot 0x3F
    Slide Right On Right Foot 0x40
    Slide Down On Left Foot 0x41
    Slide Up On Left Foot 0x42
    Slide Left On Left Foot 0x43
    Slide Right On Left Foot 0x44
    Face Player 0x4A
    Face Away from Player 0x4B
    Jump Down 1 Square 0x4E
    Jump Up 1 Square 0x4F
    Jump Left 1 Square 0x50
    Jump Right 1 Square 0x51
    Jump in Place (Facing Down) 0x52
    Jump in Place (Facing Up) 0x53
    Jump in Place (Facing Left) 0x54
    Jump in Place (Facing Right) 0x55
    Jump in Place (Facing Down->Up) 0x56
    Jump in Place (Facing Up->Down) 0x57
    Jump in Place (Facing Left->Right) 0x58
    Jump in Place (Facing Right->Left) 0x59
    Disappear 0x60
    Reappear 0x61
    "!" box popup 0x62
    "?" box popup 0x63
    "X" box popup 0x64
    "!!" box popup 0x65
    "^_^" box popup 0x66
  • Liste des "spécials" (R/S/RF/VF) (déclic à montrer ou cacher)
    special 0x0 - Guérit les POKéMONS
    special 0x3C - Acces au PC de LEO (RF/VF)
    special 0x98 - Aller à la Montagne (R/S)
    special 0x9C - Wally Catch (R/S)
    special 0x9F - choisir un Pokemon (R/S)
    special 0xE0 - Pokeblock (R/S)
    special 0x10F - Recommencer le jeu
    special 0x110 - Le Hall de la Gloire (Ligue Pokémon) et les Crédits
    special 0x111 - Animation de l'Ascenseur
    special 0x119 - Effet de l'Orbe de Groudon(R/S)
    special 0x131 - Tremblement de Terre (R/S)
    special 0x132 - Salles d'Exposition
    special 0x136 - Tremblement de Terre (RF/VF)
    special 0x137 - Battaile de Lave
    special 0x156 - Combat avec un Fantôme (RF/VF)
    special 0x157 - Monter sur le Vélo (RF/VF)
    special 0x161 - Commencer à Surfer (RF/VF)
    special 0x166 - Surnom
    special 0x16F - Activer le National Dex (RF/VF)
    special 0x17B - Animation du Sea Gallop (?????)
    special 0x191 - SS. Anne
    special 0x1F3 - Activer le National Dex (Emeraude)
  • Liste des "spécials" (Emeraude) (déclic à montrer ou cacher)
    0 - Soigner Pokemon
    3 - Fait passer le héros dans le warp utiliser en dernier
    8 - Créer une base secrète
    E - Ouvrir le pc de la base secrète
    22 - Message d'attente avant échange Link
    24 - Ouvre le menu de sauvegarde (Ne pas oublier de mettre la commande waitstate juste après)
    2A - Ouvre le menu de choix Pokémon (Pour zone de combat)
    2F - Ouvre le sac à baie
    3A - Le héros se retourne avec une "!" au dessus de la tête
    3B - Joue la musique d'une rencontre avec un dresseur
    3E - Provoque un combat contre un dresseur (Par défaut et sans pokémon)
    3F - Ouvre le PC
    61 - Affiche l'animation d'arrosage
    62 - Créer ou modifier son profil
    63 - Affiche votre profil
    6A - Ouverture d'un message bizarre accompagné d'un son extraterrestre
    6F - Un message qui raconte une histoire ...
    70 - Ouvre un menu de choix (En rapport avec l'histoire du 6F)
    71 - Choisir bureau (Huh?)
    9B - Affiche l'animation du téléphérique
    9D - Changer l'heure
    9E - Affiche l'heure
    9F - Choisir starter + Combat contre Zigzaton
    A0 - Animation avec Timmy (Explication "Comment capturer un pokemon")
    A1 - Propose de donner un surnom au premier Pokémon de l'équipe
    A2 - Choisir un pokemon dans l'équipe
    A4 - Mixeur de baie
    B2 - "En quête de dresseur" Journaliste Ines
    BF - Choisir un Pokémon à déposer en pension
    C0 - Récupérer Pokémon mis en pension
    C5 - Eclosion d'un oeuf (Il fait éclore le premier Pokémon de l'équipe ... Bizarre)
    C7 - Affiche les résultats de la zone combat
    D3 - Ouvre la boite Pokeblock
    D8 - Analyse du Pokedex
    DE - Choisir Pokémon (Huh?)
    DF - Affiche les capacités Combat et concours du premier Pokémon
    E3 - Enseigner une capacité au premier pokémon
    EF - Déclenche un combat contre un dresseur de la zone combat (Gamin Hugo)
    F4 - Arrête la musique
    F8 - Choisir Pokémon pour un défi (?)
    FD - Afficher PC du héros
    FE - Affiche la carte
    101 - Animation Evolution
    106 - Affiche record de vitesse pour le mixeur de baie
    109 - Affiche écran d'accueil du PC
    10A - Consulter les données du panthéon
    10B - Affiche le diplôme certifiant que le héros à remplit tout le pokédex
    111 - Affiche le bateau
    112 - Redémarre le jeu
    113 - Victoire de la Ligue Pokémon + Crédit
    114 - Effet ascenseur
    11C - Effet Orbe rouge + Seisme
    12E - Passe dans le warp menant au dernier point d'atterissage (Flightspot) utilisé
    133 - Effet Seisme
    134 - Affiche étage (Ascenseur)
    139 - Combat contre Kyogre
    13A - Combat contre Groudon
    13B - Combat contre Légendaire (Rayquaza?)
    13D - Fait trembler l'écran pendant 1 seconde
    13F - Effet Flash
    140 - Faire passer le héros dans le warp utiliser en dernier (Sans son)
    141 - Effet de chute en passant au dernier warp utilisé
    142 - Affiche un pokemon inconnu (?)
    145 - Combat contre un pokemon (?)
    15D - Redémarrer le jeu

Spritevisible & spriteinvisible

Vous connaissez déjà les commandes showsprite et hidesprite. Spritevisible et spriteinvisible fonctionnent un peu de la même façon.

'---------------
#org 0x710730
lock
msgbox 0x87107B0 MSG_FACE '"Ciao !"
applymovement 0x4 0x8710830
waitmovement 0x0
spriteinvisible 0x4 0x3 0x0
release
end


'---------
' Strings
'---------
#org 0x7107B0
= Ciao !


'-----------
' Movements
'-----------
#org 0x710830
#raw 0x12 'Step Left (Normal)
#raw 0x12 'Step Left (Normal)
#raw 0x12 'Step Left (Normal)
#raw 0xFE 'End of Movements

Une seule nouvelle commande.

spriteinvisible 0x4 0x3 0x0

spriteinvisible débute la commande. 0x4, c'est le numéro du personnage. 0x3, c'est la bank sur laquelle le personnage se trouve. 0x0, c'est la map.

Mais attention, quand vous faites cette commande, le sprite est invisible, mais il est toujours présent sur la map, contraire au hidesprite qui le supprime complètement. Ainsi, même si le sprite est invisible, si vous parlez au "fantôme", le script s'exécutera quand même.
Vous me direz, "mais alors quel est l'avantage ?". C'est simple, pas besoin de flag, il reste invisible même si vous bougez. Vous pouvez aussi ainsi faire disparaitre votre sprite même si vous êtes sur une autre map (mais dans ce cas, il faut quand même le flag).

spritevisible est exactement pareil, mais dans le sens inverse.

Météo

Les commandes suivantes servent à changer la météo.

'---------------
#org 0x7109C4
lock
msgbox 0x8710A44 MSG_FACE '"Il va pleuvoir !"
setweather 0x3
doweather
pause 0x28
msgbox 0x8710AC4 MSG_NORMAL '"Et maintenant, il va faire le même..."
resetweather
doweather
release
end


'---------
' Strings
'---------
#org 0x710A44
= Il va pleuvoir !

#org 0x710AC4
= Et maintenant, il va faire le même\ntemps qu'avant.

Voyons ça de plus près, rien de bien difficile.

setweather 0x3
doweather

setweather 0x3 dit au script de préparer le temps 0x3 (ici, 0x3 = la pluie).
doweather dit au script d'exécuter le temps préparé. Pas de paramètres requis pour cette commande.

resetweather
doweather

resetweather dit au sript de péparer le temps normal de la map (visible dans l'onglet "Entête").
doweather, pareil, dit au script d'exécuter le temps préparé.
Aucun paramètre requis à nouveau pour ces deux commandes.

À noter que "doweather" doit suivre, sans exception, chaque commande de météo. Si vous ne mettez pas cette commande dans votre script, le temps ne se déclenchera pas.

Voici une liste de toutes les météos possibles :

Rien = 0x0
Reflets des nuages = 0x1
Normal = 0x2
Pluie = 0x3
Neige (peu) = 0x4
Orage = 0x5
Brouillard = 0x6
Neige = 0x7
Tempête de sable = 0x8
Brouillard en diagonale = 0x9
Brouillard mince = 0xA
Un peu sombre = 0xB
Surchauffe = 0xC
orage (2) = 0xD
aucun = 0xE

(Merci à pokemonbonjour pour la liste)

Animations des portes

'---------------
#org 0x710B84
lock
checkflag 0x221
applymovement 0x6 0x8710C04
waitmovement 0x0
setdooropened 0x10 0xD
doorchange
applymovement 0x6 0x8710C84
waitmovement 0x0
hidesprite 0x6
setdoorclosed 0x10 0xD
doorchange
setflag 0x221
release
end


'-----------
' Movements
'-----------
#org 0x710C04
#raw 0x13 'Step Right (Normal)
#raw 0x13 'Step Right (Normal)
#raw 0x1 'Face Up
#raw 0xFE 'End of Movements

#org 0x710C84
#raw 0x11 'Step Up (Normal)
#raw 0xFE 'End of Movements

What's new ?

setdooropened 0x10 0xD
doorchange

setdooropened est la commande qui ouvre une porte sur la map. 0x10 et 0xD sont les coordonnées respectives X et Y de la porte sur la map.
doorchange n'est pas tout à fait indispensable, mais ça donne un résultat tout simplement meilleur. doorchange peut se comparer à par exemple un waitfanfare. Ainsi, grâce à cette commande, le script attend que la porte soit ouverte complètement pour continuer le script.
Utile, si vous avez mélangé à un applymovement, car quand le perso passe avant que la porte ne s'ouvre, ça le fait pas !

setdoorclosed 0x10 0xD
doorchange

setdoorclosed marche exactement comme setdooropened, mais pour fermer une porte.
doorchange ne change pas justement.

Les flags

On y va, c'est un peu coton à expliquer mais on va le faire !.

'---------------
#org 0x710F55
lock
checkflag 0x240
if 0x1 goto 0x8711115
msgbox 0x8710FD5 MSG_FACE '"Je suis gentil, je te donne un obj..."
giveitem 0x1 0x1 MSG_OBTAIN
msgbox 0x8711055 MSG_FACE '"A ploush !"
setflag 0x240
release
end

'---------------
#org 0x711115
msgbox 0x8711195 MSG_FACE '"T'as déjà eu ton objet !"
clearflag 0x240
release
end


'---------
' Strings
'---------
#org 0x710FD5
= Je suis gentil, je te donne un objet.

#org 0x711055
= A ploush !

#org 0x711195
= T'as déjà eu ton objet !

Décortiquons.

'---------------
#org 0x710F55
lock

Rien de particulier.

checkflag 0x240
if 0x1 goto 0x8711115

checkflag 0x240 va regarder si le flag n°240 est activé ou pas.
if 0x1 goto 0x8[offset] ordonne au script d'aller à cet offset si le flag n°240 est activé.
Mais comment s'active-t-il ? Attendez un instant.

msgbox 0x8710FD5 MSG_FACE '"Je suis gentil, je te donne un obj..."
giveitem 0x1 0x1 MSG_OBTAIN
msgbox 0x8711055 MSG_FACE '"A ploush !"

Un msgbox, simple, suivi d'un giveitem (Master ball), et d'un nouveau msgbox.
Rien de bien particulier non plus.

setflag 0x240

On y vient ! Voilà comment le flag n°240 s'active.
La commande "setflag 0x[numéroduflag]" active le flag.
Ainsi, quand je vais parler à la personne la première fois, il va me dire "Je te donne un objet", il me donne l'objet, puis me dit "A ploush". Ici, le flag 240 s'active. Ainsi, si je reparle une deuxième fois à la personne, "checkflag 0x240" va détecter que le flag est activé. Je vais donc être envoyé à la deuxième partie de mon script. La personne me dira donc "Tu as déjà eu l'objet". Ainsi, je ne pourrai pas obtenir l'objet à l'infinie.

Continuons.

clearflag 0x240

clearflag 0x240, comme son nom l'indique, supprime, désactive le flag n°240.
Comme ça, quand je parle pour la deuxième fois à la personne, "clearflag" désactive le flag.
Ainsi, si je lui reparle une troisième fois, "checkflag 0x240" va voir que le flag n'est pas activé. Donc, le script continue normalement.

Ici, dans mon exemple, les flags ne sont pas très importants, étant donné que grâce au clearflag, je peux obtenir l'objet à l'infinie. Si je ne l'obtenir qu'une fois, il faut supprimer "clearflag 0x240" du script.

À noter que vous pouvez activer un flag allant de 0001 à FFFF.
Certains flags importants sont déjà utilisés dans le jeu, faites attention, cela peut provoquer quelques bugs dans le jeu.

Flags spéciaux

Il existe des flags spéciaux qui active certaines choses dans le jeu (donner un bagde, ajouter un menu...). Voici un exemple :

'---------------
#org 0x711215
msgbox 0x8711295 MSG_FACE '"Tiens, prends ces chaussures de sp..."
setflag 0x82F
end


'---------
' Strings
'---------
#org 0x711295
= Tiens, prends ces chaussures de sport !

Voici la commande du flag spécial :

setflag 0x82F

Ici, ce flag donne les chaussures de sport au joueur.

Voici les listes des flags spéciaux :

Rouge Feu / Vert Feuille

Débloquer le menu Pokémon : 0x828
Débloquer le Pokédex : 0x829
Chaussures de sport : 0x82F
Badge 1 : 0x820
Badge 2 : 0x821
Badge 3 : 0x822
Badge 4 : 0x823
Badge 5 : 0x824
Badge 6 : 0x825
Badge 7 : 0x826
Badge 8 : 0x827

Rubis / Saphir

Débloquer le menu Pokémon : 0x800
Débloquer le Pokédex : 0x801
Débloquer le Pokénav : 0x802
Chaussures de sport : 0x860
Badge 1 : 0x807
Badge 2 : 0x808
Badge 3 : 0x809
Badge 4 : 0x80A
Badge 5 : 0x80B
Badge 6 : 0x80C
Badge 7 : 0x80D
Badge 8 : 0x80E

Emeraude

Débloquer le menu Pokémon : 0x860
Débloquer le Pokédex : 0x861
Débloquer le Pokénav : 0x862
Chaussures de sport : 0x8C0
Badge 1 : 0x867
Badge 2 : 0x868
Badge 3 : 0x869
Badge 4 : 0x86A
Badge 5 : 0x86B
Badge 6 : 0x86C
Badge 7 : 0x86D
Badge 8 : 0x86E

On a fini pour les flags !.
          20/5/2011 - MAJ

Le Countpokemon

Mais qu'est-ce c'est ? Cela sert à compter le nombre de Pokémon dans votre équipe (non pas possible !). Cela peut-être utile pour des zones où l'on ne peut rentrer qu'avec un certain nombre de Pokémon....

'---------------
#org 0x7114C4
lock
countpokemon
compare LASTRESULT 0x1
if 0x1 goto 0x8711544
compare LASTRESULT 0x2
if 0x1 goto 0x8711644
compare LASTRESULT 0x3
if 0x1 goto 0x8711784
compare LASTRESULT 0x4
if 0x1 goto 0x8711BB4
compare LASTRESULT 0x5
if 0x1 goto 0x8711CB4
compare LASTRESULT 0x6
if 0x1 goto 0x8711DB4
msgbox 0x8711B34 MSG_FACE '"Tu as 0 Pokémon."
release
end

'---------------
#org 0x711544
msgbox 0x87115C4 MSG_FACE '"Tu as 1 Pokémon."
release
end

'---------------
#org 0x711644
msgbox 0x8711704 MSG_FACE '"Tu as 2 Pokémon."
release
end

'---------------
#org 0x711784
msgbox 0x8711AB4 MSG_FACE '"Tu as 3 Pokémon."
release
end

'---------------
#org 0x711BB4
msgbox 0x8711C34 MSG_FACE '"Tu as 4 Pokémon."
release
end

'---------------
#org 0x711CB4
msgbox 0x8711D34 MSG_FACE '"Tu as 5 Pokémon."
release
end

'---------------
#org 0x711DB4
msgbox 0x8711E34 MSG_FACE '"Tu as 6 Pokémon."
release
end


'---------
' Strings
'---------
#org 0x711B34
= Tu as 0 Pokémon.

#org 0x7115C4
= Tu as 1 Pokémon.

#org 0x711704
= Tu as 2 Pokémon.

#org 0x711AB4
= Tu as 3 Pokémon.

#org 0x711C34
= Tu as 4 Pokémon.

#org 0x711D34
= Tu as 5 Pokémon.

#org 0x711E34
= Tu as 6 Pokémon.

Plutôt long, mais simple..

countpokemon

Voici la commande qui déclenche tout.
coutpokemon, comme son nom l'indique, regarde le nombre de Pokémon présent(s) dans votre équipe.

compare LASTRESULT 0x1
if 0x1 goto 0x8711544

compare LASTRESULT 0x1 va regarder si countpokemon a compté 1 Pokémon dans l'équipe.
Si oui (= if 0x1), il va à un certain offset. On retrouve cet offset plus bas :

'---------------
#org 0x711544
msgbox 0x87115C4 MSG_FACE '"Tu as 1 Pokémon."
release
end

~~> Avec un message disant "Tu as 1 Pokémon."
C'est logique.

compare LASTRESULT 0x2
if 0x1 goto 0x8711644

Si countpokemon voit que vous n'avez pas 1 seul Pokémon dans votre équipe, il continue de compter. Le nombre d'après ? 2. (Bravo, une première S vous attend.).
compare LASTRESULT 0x2 fait exactement la même chose que compare LASTRESULT 0x1, mais pour 2 Pokémon. Si c'est le cas, il va à un nouvel offset :

'---------------
#org 0x711644
msgbox 0x8711704 MSG_FACE '"Tu as 2 Pokémon."
release
end

Qui est celui-là, avec un message disant "Tu as 2 Pokémon."
Logique toujours.

Ce sera la même chose avec "compare LASTRESULT 0x3, 0x4, 0x5 et 0x6".

msgbox 0x8711B34 MSG_FACE '"Tu as 0 Pokémon."

A la fin du script, juste après les compare LASTRESULT, arrive un message simple :
"Tu as 0 Pokémon". C'est normal, si le script arrive jusqu'ici, c'est que le joueur n'a ni 1, 2, 3, 4, 5, ni 6 Pokémon dans son équipe. Calcul ~~> Il en a donc 0 (le max possible étant 6).
Donc ce message s'affichera. Normalement ça devrait jamais arriver, car le joueur est censé avoir 1 Pokémon minimum tout le temps. (sauf si c'est le tout tout début du jeu).

Voilà, c'est fini pour le countpokemon. Alors, facile non ?

Giveegg

Aujourd'hui, on va apprendre à faire un giveegg !
C'est exactement la même chose que pour un givepokemon (Cf. tuto de Sainior, je vais pas tout réexpliquer), mais cela donne un oeuf !

'---------------
#org 0x712104
lock
checkflag 0x245
if 0x1 goto 0x8712384
faceplayer
msgbox 0x8712184 MSG_YESNO '"Tu veux un oeuf ?"
compare LASTRESULT 0x1
if 0x1 goto 0x8712204
msgbox 0x8712284 MSG_NORMAL '"Dommage !"
release
end

'---------------
#org 0x712384
msgbox 0x8712404 MSG_FACE '"Mon oeuf va bien ?"
release
end

'---------------
#org 0x712204
giveegg 0x19
fanfare 0x13E
msgbox 0x8712304 MSG_NORMAL '"Prends-le !"
waitfanfare
closeonkeypress
setflag 0x245
release
end


'---------
' Strings
'---------
#org 0x712184
= Tu veux un oeuf ?

#org 0x712284
= Dommage !

#org 0x712404
= Mon oeuf va bien ?

#org 0x712304
= Prends-le !

Vous voyez, c'est comme le givepokemon, sauf que la commande est encore plus simple !

Voici la seule nouvelle commande :

giveegg 0x19

giveegg est la commande qui donne l'oeuf. 0x19, c'est le numéro du Pokémon en hexa. Ici, c'est un Pikachu, (25 en décimal ~~> 19 en hexa).
Rien d'autre ! Le Pokémon sera niveau 5.

Donc, rien de bien compliqué si vous connaissez déjà le givepokemon (je le redis, j'ai pas ré-expliquer, Sainior l'a très bien fait.)

Setmaptile

Oulahh, c'est quoi ça ? C'est simple, en fait, le setmaptile change un bloc de la map sur laquelle vous vous trouvez au moment. C'est pas dur, et c'est plutôt bien pour certains scénarios (oui, rappelez vous, [je sais plus dans quelle version] un mec creuse une grotte au fur et à mesure que vous capturez des zarbis ! On peut utiliser le setmaptile pour ce genre de choses).

'---------------
#org 0x71279C
lock
setmaptile 0xB 0xE 0x4 0x0
special 0x8E
release
end

Deux nouvelles commandes :

setmaptile 0xB 0xE 0x4 0x0

setmaptile lance la commande. 0xB et 0xE sont respectivement les positions X et Y du bloc à changer sur la carte où vous vous trouvez.
0x4, c'est le numéro du bloc en hexa que vous voulez faire apparaître à la position donnée. Comment connaître sur numéro ? Simple, allez dans Advance Map, cliquez sur le bloc choisi et regardez en bas à gauche : "Bloc : XXX Offset : YYYYYY" est affiché. Mémorisez le numéro du bloc, c'est cette valeur que vous devez entrer dans la commande. (le nombre est déjà en hexa, vous ne changez donc rien).
0x0, c'est le numéro de comportement. (0x0, vous pouvez passer, 0x1, vous pouvez pas)

special 0x8E

Cette commande est à mettre après chaque setmaptile. En gros, elle "re-affiche l'écran", de telle sorte que le bloc changé apparaisse. Sans cette commande, seul le comportement du bloc changera, pas son image.

Dans mon script, sur la position X : B et Y : E, un bloc avec une fleur s'affichera, et je pourrais passer dessus.

Voilà, on en a fini avec le setmaptile !.

Ps : Je n'ai pas trouvé le moyen pour que le bloc reste changé une fois qu'on change de map. Si quelqu'un trouve un moyen, merci de me MP.

Random

Avant tout, je voudrai remercier Sainior qui m'a appris ça, donc merci à lui.

On va apprendre à faire une commande de hasard, un tirage au sort en quelque sorte. Pour cela, nous allons utiliser la commande "ramdom". Voici un exemple de script qu'on peut faire :

'---------------
#org 0x6E41BC
lock
msgbox 0x86E42BC MSG_FACE '"Combien ?"
random 0x4
compare LASTRESULT 0x0
if 0x1 goto 0x8271029
compare LASTRESULT 0x1
if 0x1 goto 0x8271129
compare LASTRESULT 0x2
if 0x1 goto 0x8271229
compare LASTRESULT 0x3
if 0x1 goto 0x86E433C
release
end

'---------------
#org 0x271029
msgbox 0x82710A9 MSG_NORMAL '"1"
release
end

'---------------
#org 0x271129
msgbox 0x82711A9 MSG_NORMAL '"2"
release
end

'---------------
#org 0x271229
msgbox 0x82712A9 MSG_NORMAL '"3"
release
end

'---------------
#org 0x6E433C
msgbox 0x86E43BC MSG_NORMAL '"4"
release
end


'---------
' Strings
'---------
#org 0x6E42BC
= Combien ?

#org 0x2710A9
= 1

#org 0x2711A9
= 2

#org 0x2712A9
= 3

#org 0x6E43BC
= 4

C'est assez long, mais très très simple.

random 0x4
compare LASTRESULT 0x0
if 0x1 goto 0x8271029

random 0x4 est la commande principale. random lance la commande, et 0x4 est le nombre de possibilité au tirage au sort.
compare LASTRESULT 0x0, 0x1, 0x2 et 0x3, vous connaissez. On compare la valeur choisie par le random. Une fois la valeur trouvée, if 0x1 goto 0x8[Offset] vous envoie sur l'offset choisi.

Ainsi, dans ce script, j'ai 1 chace sur 4 de tomber sur "1", 1 chance sur 4 de tomber de "2", 1 chance sur 4 de tomber sur "3" et 1 chance sur 4 de tomber sur "4".

Voilà, c'est tout pour le random ! Merci encore à Sainior et Pokémon Legendary pour le pack de XSE.

L'équipe ROM-Hacking de Pokémon Trash

Par Loris
  • Geof63 08/01/2023 à 11:56
    Sur gba
  • Geof63 08/01/2023 à 11:56
    Geof63
    Bonjour j'aimerai trouver le script pour faire un combat identique (s auto combattre ). Pouvez-vous m'aider merci
  • ProfNori 22/02/2020 à 17:43
    je regardais le code des infirmières des centres pokemons et je suis tombé sur un spécial 0x169 et des special2 0x[qqch] , et je ne les trouvent pas ici. Qqun sait ce que c'est ?
  • Tenpers 08/06/2019 à 20:41
    Pour cette ligne :

    145 - Combat contre un pokemon (?)

    Il s'agit du dernier Pokémon sauvage rencontré :)