Tout d'abord, qu'est-ce qu'un script? C'est un langage spécifique, comme une langue étrangère: Au début, c'est incompréhensible. C'est après que cela devient marrant.
Tout script commence par Begin et fini par End. A côté de Begin, on met entre guillemets (pas obligatoire) et sans espace le nom du script. Dans mon exemple, ce sera totor
Begin "Totor" End
ou
Begin Totor End
Il faut savoir que dans un scipt, il faut éviter les espaces inutiles (par exemple dans les titres) et les accents.
Tout script est composé de variables et de fonctions. Lisez ce qui suit pour comprendre de quoi il retourne.
Dans chaque script, il faut déclarer les variables au début sous la ligne Begin... Mais qu'es ce que c'est une variable? C'est un chiffre qui porte un nom (Oui, je sais, c'est très réducteur ...). Vous pouvez leur donner n'importe quel nom. Dans les scripts présents dans Morro, on utilise souvent "DoOnce" (qui signifie "fait une fois" en anglais) et "Timer" (qui signifie temps). Chez moi, ce sera "Momo" et "Super". Par défaut, une variable est égale à 0. Il faut mettre juste devant la fonction désirée la commande adéquate pour la déclarer. Il en exite 3. Short, long et float sont des types de variables.
short : un petit entier
long : un grand entier
float : un flottant (nombre à virgule, en quelque sorte)
Pour une utilisation classique, long ne sert à rien puisqu'on ne va jamais très loin dans les nombres
Float est utilisé pour une variable de temps (voir plus bas).
Donc, chez moi, cela donne
Begin "Totor" Short Momo Float Super End
Maintenant, on va commencer à s'amuser.
Pour qu'un script se declence, il y a souvent une condition (Vous avez fait ça, vous avez activez une porte,...). Pour savoir si une condition a été remplise, on utlise un if (un "si").
A chaque if, il doit y avoir un endif ("fin du si") en dessous.
A côté du if, on met la fonction qui va nous dire si oui ou non cette action est faite ou non.
A ce moment là, deux possibilité:
- Donner la valeur d'une variable [if ( momo == 1 )]
- Utiliser une fonction spécifique à l'action testée qui renvoi comme chiffre soit 1 (L'action est faite ou en cours), soit 0 (bah, que dalle...)
A chaque fois, on utilise ==, >=, <=, >, < != (non égale) à côté de la fonction avec ensuite le chiffre testé... (Oui, je sais, c'est pas très clair...)
Pour connaître toutes les fonctions, reportez vous à l'aide du TESCS ou aux tutos déjà dispo.
Mon script va consister à ce que si le joueur appuie sur une porte, il y ai un message "Youplaboum" la première fois et que après, la porte fonctionne normalement
Pour savoir si un objet est activé (que ce soit un objet que l'on veut prendre, une porte,...), on utilise OnActivate. Donc, si c'est 0, la porte n'est pas activée, et le 1 est l'inverse. Cela donne
Begin "Totor" Short Momo Float Super if ( OnActivate == 1 ) endif EndLa fonction pour envoyer un message est: Message Box "Message"
on met cela après le "if ( OnActivate == 1 )".
Begin "Totor" Short Momo Float Super if ( OnActivate == 1 ) MessageBox "Youplaboum" endif EndAvec un script comme celui-ci, on aura le message à chaque activation de la porte. Comme je ne le veux qu'une fois, on va faire en sorte de mettre la variable Momo à 1 (car elle était à zéro). On fait cela grâce à un set "Nom de la variable" to "le chiffre désiré".
Begin "Totor" Short Momo Float Super if ( OnActivate == 1 ) MessageBox "Youplaboum" Set Momo to 1 endif End
On va aussi tester le fait que cette variable est à 0 quand on lance ce message la première fois. On la passe à un juste après afin de savoir que l'on a fait cette action
Begin "Totor" Short Momo Float Super if ( OnActivate == 1 ) if ( Momo == 0 ) MessageBox "Youplaboum" Set Momo to 1 endif endif End
Donc, là, ce script envoie un message à la premiere activation de la porte. Mais après, elle ne marche plus.
Petite explication par Korfandar:
L'objet sur lequel est appliqué le script doit être "activable" i.e. c'est une porte, un container ou un activator (voire un pnj).
Normalement un tel objet à un comportement par défaut quand on l'active : une porte s'ouvre ou téléporte le pj, un container s'ouvre en inventaire, un pnj dialogue...
Le script intercepte cette activation par défaut par le test "onactivate", donc si on ne mets pas le "activate" l'objet n'effectue plus son action par défaut d'activation.
Pour que l'objet puisse s'activer normalement, il faut lui dire quand c'est nécessaire par la fonction "activate".
Il faut donc mettre la fonction activate (qui revient à dire au script de faire l'action habituelle pour l'objet sur lequel il est rattaché.). Et tout cela quand Momo est égale à 1. Pour ne pas surcharger le script, on peut mettre un Elseif ("autre si"). Le Elseif ne nécessite pas un autre endif car il dépend d'un "if" mis précedemment.
Begin "Totor" Short Momo Float Super if ( OnActivate == 1 ) if ( Momo == 0 ) MessageBox "Youplaboum" Set Momo to 1 Elseif ( Momo == 1 ) Activate endif endif End
En résumé, sachez que si un script est attaché à un objet avec un OnActivate, cet objet ne fera plus ce à quoi il est destiné.
Bon revenons à mon float qui ne sert à rien. On va faire la même chose en faisant en sorte qu'il attende 2 secondes pour afficher le message.
Tout comme les short et les long, les float ont une valeur de 0 au début. Il faut donc les modifier avec cette ligne de code:
Set Timer to ( Timer + GetSecondsPassed )
Ce qui donne chez moi en remplaçant le nom de ma variable:
Begin "Totor" Short Momo Float Super Set Super to ( Super + GetSecondsPassed ) if ( OnActivate == 1 ) if ( Momo == 0 ) MessageBox "Youplaboum" Set Momo to 1 Elseif ( Momo == 1 ) Activate endif endif End
Maintenant, à chaque seconde de passée, la variable augmentera de 1. Il suffit ensuite de mettre une condition pour qu'il affiche le message au bout de 2 secondes:
Begin "Totor" Short Momo Float Super Set Super to ( Super + GetSecondsPassed ) if ( OnActivate == 1 ) if ( Super >= 2 ) if ( Momo == 0 ) MessageBox "Youplaboum" Set Momo to 1 Elseif ( Momo == 1 ) Activate endif endif endif End
Dernière chose, les scripts tournent constamment, ce qui explique pourquoi Morro rame si souvent. Il existe trois lignes de code permettant de soulager les scripts. Il s'agit de:
if ( MenuMode == 1 ) Return endifEn fait, ces lignes renvoi ( le Return ) au début du script. Le MenuMode fait référence au fait que le joueur se trouve dans un des menu (que ce soit pour sauvegarder, l'inventaire,...). Donc n'utilisez ce passage que lorsque votre script n'a pas besoin d'être utilisé dans un des menu
Et voilà le script final:
Begin "Totor" Short Momo Float Super if ( MenuMode == 1 ) Return endif Set Super to ( Super + GetSecondsPassed ) if ( OnActivate == 1 ) if ( Super >= 2 ) if ( Momo == 0 ) MessageBox "Youplaboum" Set Momo to 1 Elseif ( Momo == 1 ) Activate endif endif endif End