J'écrirai ici un tutoriel pour les gens qui voudraient apprendre à coder des NPCs, des quêtes, des events ou tout autre bordel du genre. Ce guide ne vous apprendra pas à maîtriser un langage de programmation précis (du genre C++ ou Java). Il vous apprendra seulement à scripter dans le langage de la plateforme eAthena : il s'agit d'une version très simplifiée du langage C qui fonctionne presque entièrement avec des commandes préconçues.
La documentation : la sainte Bible du programmeurJe vais commencer par vous donner des liens qui sont nécéssaires à la programmation de RO.
LA DOCUMENTATION OFFICIELLE. Il s'agit du fichier distribué avec l'émulateur eAthena. Le début du fichier explique la syntaxe du langage ainsi que le fonctionnement des opérateurs. Ensuite, la syntaxe et le fonctionnement de chaque commande est expliqué en détail, le plus souvent avec des exemples.
LES COMMANDES DE SCRIPT. Il s'agit d'une version améliorée de la documentation officielle. Chaque commande est expliquée avec des exemples et des trucs sur le fonctionnement.
LE WIKI DE eATHENA. Le wiki contient plusieurs pages sur la programmation (en anglais, malheureusement). Il peut toujours être utile d'aller y jeter un coup d'œil!
LE WIKI DE rATHENA. Même chose que pour le wiki de eAthena; ce wiki contient de l'information assez détaillée qui peut être utile.
LA LISTE DES NPC. Cette liste contient le numéro d'identification de chaque sprite de NPC. Utile lorsqu'on veut coder un NPC!
La syntaxe de base - Code:
-
prontera,50,70,4 script Vieil Homme 78,{
mes "[Vieil Homme]";
mes "Bonjour. Je suis un NPC!";
end;
}
Chaque NPC commence par la déclaration suivante :
- Code:
-
map_du_npc,X,Y,orientation [TAB] script [TAB] nom_du_npc [TAB] ID,{
map_du_npc : map sur laquelle le NPC est présent (dans l'exemple, il s'agit de prontera)
X : coordonnée en X du NPC sur la map (dans l'exemple, 50)
Y : coordonnée en Y du NPC sur la map (dans l'exemple, 70)
orientation : l'orientation est un chiffre de 1 à 8 qui définit de quel côté regarde le NPC;
[1][8][7]
[2][X][6]
[3][4][5]
script : on met
script lorsqu'il s'agit d'un script,
shop lorsqu'il s'agit d'un magasin et
warp lorsqu'il s'agit d'un warp. Nous verrons les particularités des shops et des warps un peu plus loin.
nom_du_npc : le nom du NPC qui sera affiché dans le jeu
ID : le numéro d'identification du NPC. Il s'agit de l'apparence qu'aura le NPC dans le jeu. Pour une liste des numéros possibles,
cliquez iciVous devez ensuite ouvrir un bloc avec un bracket "
{". Le script ne compilera pas si le code est placé hors d'un bloc. Vous pouvez maintenant commencer à coder votre NPC. Chaque commande doit être terminée par un point-virgule "
;". Dans l'exemple, la commande
mes "Bonjour. Je suis un NPC!"; ouvrirait, dans le jeu, une boîte de dialogue où serait écrit "Bonjour, je suis un NPC!". Nous survolerons les commandes principales un peu plus tard.
Les opérateurs mathématiquesLes opérateurs mathématiques sont utilisés, eh oui, pour effectuer des calculs mathématiques. Les voici:
- Opérateurs mathématiques:
+ : opérateur d'addition. Il permet d'additionner deux chiffres ou bien deux chaînes de caractères. Voici deux exemples:
- Code:
-
set .@num, 1 + 2;
// Définit la valeur de la variable .@num. La variable aura la valeur 3.
// Nous verrons les variables plus en détails un peu plus tard.
- Code:
-
set .@char$, "Bon" + "jour";
// Définit la valeur de la variable .@char$. La variable aura la valeur "Bonjour".
- : opérateur de soustraction. Il permet de soustraire deux chiffres. Voici un exemple:
- Code:
-
set .@num, 8 - 2;
// Définit la valeur de la variable .@num. La variable aura la valeur 6.
* : opérateur de multiplication. Il permet de multiplier deux chiffres. Voici un exemple:
- Code:
-
set .@num, 2 * 2;
// Définit la valeur de la variable .@num. La variable aura la valeur 4.
/ : opérateur de division. Il permet de diviser deux chiffre. Il est important de noter que le résultat d'une division donnera toujours un chiffre entier, jamais décimal. Par exemple, 5/3 donnera 1 et 5/2 donnera 2. Voici un exemple:
- Code:
-
set .@num, 9 / 4;
// Définit la valeur de la variable .@num. La variable aura la valeur 2.
% : opérateur de modulo. Le modulo est une opération complexe qui donne le reste d'une division. Par exemple, 7%2 donne 1, 12%5 donne 2 et 20%5 donne 0. Voici un exemple:
- Code:
-
set .@num, 3 % 2;
// Définit la valeur de la variable .@num. La variable aura la valeur 1.
Les opérateurs de comparaisonLes opérateurs de comparaison sont utilisés pour comparer les éléments d'une condition. Ils ne peuvent être utilisés qu'à l'intérieur d'une condition ou d'une boucle.
- Opérateurs de comparaison:
== : opérateur d'égalité. Il renvoit
vrai si les deux éléments sont égaux. Voici quelques exemples:
- Code:
-
if(2 == 3) {
mes "Ce message n'apparaitra jamais!";
}
- Code:
-
if(6 == 6) {
mes "Ce message apparaitra toujours!";
}
- Code:
-
if(.@num == 6) {
mes "Ce message apparaitra seulement si la valeur de la variable .@num est égale à 6.";
}
!= : opérateur d'inégalité. Il renvoit
vrai si les deux éléments sont inégaux. Voici quelques exemples:
- Code:
-
if(10 != 10) {
mes "Ce message n'apparaitra jamais!";
}
- Code:
-
if(24 != 7) {
mes "Ce message apparaitra toujours!";
}
- Code:
-
if(.@num != 32) {
mes "Ce message apparaitra seulement si la valeur de la variable .@num n'est pas égale à 32.";
}
> : opérateur "strictement plus grand que". Il renvoit
vrai si le premier élément est strictement plus grand que le second.
- Code:
-
if(16 > 16) {
mes "Ce message n'apparaitra jamais!";
}
- Code:
-
if(124 > 7) {
mes "Ce message apparaitra toujours!";
}
- Code:
-
if(.@num > 68) {
mes "Ce message apparaitra seulement si la valeur de la variable .@num est plus grande que 68.";
}
< : opérateur "strictement plus petit que". Il renvoit
vrai si le premier élément est strictement plus petit que le second.
- Code:
-
if(4 < 2) {
mes "Ce message n'apparaitra jamais!";
}
- Code:
-
if(41 < 55) {
mes "Ce message apparaitra toujours!";
}
- Code:
-
if(.@num < 23) {
mes "Ce message apparaitra seulement si la valeur de la variable .@num est plus petite que 23.";
}
>= : opérateur "plus grand ou égal à". Il renvoit
vrai si le premier élément est plus grand ou égal au second.
- Code:
-
if(12 >= 1) {
mes "Ce message n'apparaitra jamais!";
}
- Code:
-
if(3 >= 3) {
mes "Ce message apparaitra toujours!";
}
- Code:
-
if(.@num >= 17) {
mes "Ce message apparaitra seulement si la valeur de la variable .@num est plus grande ou égale à 17.";
}
<= : opérateur "plus petit ou égal à". Il renvoit
vrai si le premier élément est plus petit ou égal au second.
- Code:
-
if(52 <= 30) {
mes "Ce message n'apparaitra jamais!";
}
- Code:
-
if(84 <= 124) {
mes "Ce message apparaitra toujours!";
}
- Code:
-
if(.@num <= 35) {
mes "Ce message apparaitra seulement si la valeur de la variable .@num est plus petite ou égale à 35.";
}
Les opérateurs logiquesLes opérateurs logiques sont utilisés pour lier plusieurs conditions. Les voici:
- Opérateurs logiques:
&& : l'opérateur "et". L'opération renvoit
vrai si les deux conditions liées par le "et" renvoient également vrai. Exemple:
- Code:
-
if((.@var + 1 == 2) && (.@num + 3 == 7)) {
mes "Ce message apparaitra seulement si les deux conditions sont vraies.";
}
|| : l'opérateur "ou". L'opération renvoit
vrai si une des deux conditions liées par le "ou" renvoient vrai. Exemple:
- Code:
-
if((.@var + 1 == 2) || (.@num + 3 == 7)) {
mes "Ce message apparaitra si une des deux conditions est vraie.";
}
! : l'opérateur "à l'inverse de". L'opération renvoit le résultat contraire de la condition. Exemples:
- Code:
-
if(!(1 + 1 == 2)) {
mes "Ce message n'apparaitra jamais!";
}
- Code:
-
if(!(1 + 1 == 3)) {
mes "Ce message apparaitra toujours!";
}
Les variablesLes variables sont, comme leur nom l'indique, des objets possèdant une valeur variable. Il existe quatre types de variables (variable joueur, variable de compte, variable globale et variable de NPC). Chaque type de variable possède une version pouvant stocker des chiffres entiers (
integer) et une version pouvant stocker des chaînes de caractères (
string). Pour les chaînes de caractères (
string), il suffit d'ajouter le préfixe "
$" à la variable (la variable
exemple pourrait seulement stocker des chiffres alors que la variable
exemple$ pourrait seulement stocker des chaînes de caractères). Il existe également une version "
temporaire" et une version "
permanente" pour chaque type (sauf pour les variables de compte, qui sont toujours permanentes). Il suffit d'ajouter le préfixe "
@" pour les variables temporaires (la variable
exemple serait permanente alors que la variable
@exemple serait temporaire ; il en va de même pour les chaînes de caractères : la variable
exemple$ serait permanente alors que la variable
@exemple$ serait temporaire). Je vais essayer d'expliquer les différences entre chaque type de variable. Vous pouvez aussi CLIQUER ICI pour lire l'article du wiki de rAthena (en anglais) qui parle des variables et des tableaux (
arrays).
La variable joueur (player variable)set exemple, 10; — Numérique, permanente (
permanent integer)
set exemple$, "texte"; — Chaîne de caractères, permanente (
permanent string)
set @exemple, 10; — Numérique, temporaire (
temporary integer)
set @exemple$, "texte"; — Chaîne de caractères, temporaire (
temporary string)
Les variables joueur permanentes n'ont aucun préfixe et sont stockées dans la base de donnée pour
chaque personnage. Chaque personnage peut donc avoir une valeur qui lui est propre. La race de votre personnage, la classe, le niveau ou encore le nombre de zeny sont toutes des variables joueur permanente. Une variable numérique (
exemple) peut possèder une valeur allant de 0 à 2,147,483,648 (soit 32 bits). Une chaîne de caractères (
exemple$) peut possèder jusqu'à 128 caractères. Petit exemple:
- Code:
-
prontera,50,55,3 script NPC 811,{
if(!pomme) { //On vérifie que la variable existe
mes "[NPC]";
mes "Aimez-vous les pommes?";
next;
menu "Oui, j'aime les pommes.", L_YES ,"Non, je n'aime pas les pommes.", L_NO;
}
else { // Le joueur a déjà répondu à la question
mes "[NPC]";
if(pomme == 1)
mes "Vous aimez les pommes!";
else
mes "Vous n'aimez pas les pommes!";
close;
}
L_YES:
set pomme, 1;
mes "[NPC]";
mes "D'accord! Je m'en souviendrai!";
close;
L_NO:
set pomme, 2;
mes "[NPC]";
mes "D'accord! Je m'en souviendrai!";
close;
}
Ce NPC demande au joueur s'il aime les pommes, et sauvegarde sa réponse dans une variable joueur permanente nommée
pomme. Quand le joueur retourne lui parler, le NPC récupère la valeur de la variable (1 si le joueur aime les pommes, 2 si le joueur n'aime pas les pommes) et dis au joueur s'il aime les pommes ou non. Vous pouvez aussi comprendre quelques commandes de base, comme
mes "texte"; qui permet d'afficher un message à l'écran,
menu "choix1", label1 , "choix2" , label2; qui permet d'afficher un menu et
close; qui permet de mettre fin au NPC. Veuillez aussi prendre note qu'on aurait pu écrire
if(pomme != 0) au lieu de
if(!pomme) pour vérifier si la variable existe déjà.
Les commandes de basemes "texte";La commande
mes permet d'afficher un message à l'écran. C'est la commande qui est utilisée lors des dialogues avec les PNJs.
close;La commande
close permet de terminer le code d'un PNJ. C'est la commande qui est utilisée pour terminer la plupart des PNJs.
close2;La commande
close2 permet de fermer une conversation avec un PNJs tout en continuant d'exécuter du code. Quand on utilise cette commande, il faut utiliser la commande
end pour terminer le code.
end;La commande
end permet de terminer le code d'un PNJ. Il est préférable d'utiliser la commande
close dans les cas où
end n'est pas nécessaire.
set variable, <valeur>;La commande
set permet d'indexer une valeur à une variable. La variable peut prendre différents préfixes ou suffixes, dépendamment de sa nature. La valeur de la variable peut être numérique (un nombre de 0 à 2,147,483,647) ou bien une chaîne de caractère (jusqu'à 128 caractères).
warp "map",<x>,<y>;La commande
warp permet de téléporter le joueur invoqué. On doit spécifier le nom de la map ainsi que les coordonnées en x et en y.
getitem <id>,<nb>;La commande
getitem permet de donner un item au joueur invoqué. Il faut spécifier l'ID de l'item ainsi que le nombre à donner.
delitem <id>,<nb>;La commande
delitem permet d'enlever un item au joueur invoqué. Il faut spécifier l'ID de l'item ainsi que le nombre à enlever.
Je continuerai le guide un peu plus tard ... prochainement: les variables, les commandes principales, les conditions et les boucles.