Aller au contenu
Top-Metin2.org - Vous êtes à la recherche d'un serveur Metin 2 ? ×
×
×
  • Créer...

[Debug] Déboguer sa quête


Kameyu

Messages recommandés

  • Développeur

 

Bonjour, bonsoir à toutes et à tous.

 

 

Depuis le temps que je me ballade sur la partie "Quêtes" et "Aide / Questions / Support" je constate que nombre d'entre vous ont des problèmes de compilation et souvent même s'il compile la quête ne marche pas. Nous allons voir pas à pas comment débugguer sa quête pour la rendre fonctionnelle. Voici entre autre le "Sommaire" de ce tutoriel. Je qualifierai les étapes plus ou moins importantes en fonction des erreurs communes dont je mettrai des points d'exclamation entre parenthèses (!) selon l'importance. Bonne lecture, vous en avez un paquet qui vous attend !

 

/!\ Vous devez impérativement avoir lu entièrement le tutoriel de Valithis² sur les bases des quêtes afin de suivre ce tutoriel /!\

 

# Sommaire #

1. Les "Quest" et "State" (!)

2. Les "When" (!)

3. Les conditions (if/else/elseif) (!!)

4. Les End (!!!)

5. Organisation (!!)

6. Quelques astuces (!)

 

 

 

1. Les "Quest" et "State"

 

 

Bien, maintenant que nous pouvons commencer le tutoriel, nous allons voir comment et quand placer les "Quest" et plus particulièrement les "state" pour éviter toute erreur lors de la compilation.

 

Pourquoi ai-je un message d'erreur du genre " must start with 'quest' " lorsque je compile mes quêtes avec sh make ?

C'est simple, vous n'avez pas mis de end à la fin de votre quête et pour cette raison, cette partie rejoint la partie 6 que vous allez voir après les End. Comment résoudre ce problème ?

Je vous invite à lire cette toute petite quête pour exemple:

 

quest bonjour begin
    state start begin
         when 9002.chat."Boutique" begin
              say_title("Bonjour")
              say("Message test")
              local choix = select("Oui","Non")
              if choix == 1 then
                   say("Coucou")
              else
                   say("Pas coucou")
         end
    end
end
 

 

Le compilateur me donnera une erreur lors de la compilation de cette quête. Pourquoi ? Tout simplement parce que je n'ai pas compté combien "d'états" j'ouvre à chaque fois. Ici, j'ai ouvert 4 états: Un "quest", un "state", un "when" et un "if". Il me faut donc au total "4 end" pour éviter toute erreur de compilation.

 

C'est facile ton truc, je le fais tout le temps !

Oui, mais c'est là que ça devient compliqué ! Lorsque vous avez plusieurs "state" et plusieurs "if" et aussi des "if" à l'intérieur de "if", vous serez un moment donné perdus et vous ne saurez plus où il manque des end (d'où ça rejoint le chapitre 5 sur l'organisation).

C'est ce qu'on va apprendre dans le chapitre 3 et 4.

 

 

 

2. Les "When"

 

 

Que fait un "When" ?

Un when exécute une liste de commandes et de conditions lorsqu'un évènement est déclenché. When signifie "Quand" en français.

Par exemple, dans ma quête:

 

Citation
when 9002.chat."Boutique" begin

 

Signifie "Quand le PNJ numéro 9002 affiche "Boutique" dans une fenêtre (et qu'on clique dessus bien entendu) alors démarre l'état et fais ça: (suite de l'état).

Il suffit juste d'écrire la condition "when" correctement pour que celle-ci ne vous renvoie une erreur, à une exception près: vous ne mettez pas de fonction comme "kill", "levelup", "login", "chat", etc... et si vous mettez seulement "when pc.get_level() < 50 begin" il vous renverra une erreur, donc vous devrez rajouter "login or levelup with entre "when" et "pc.get_level()" pour indiquer: lorsque le personnage se connecte ou up un level inférieur à 50, fais ça: (début de la quête). Y'a rien de compliqué avec les When, c'est juste magique ;).

 

 

 

3. Les conditions (if/else/elseif)

 

 

Les conditions "if / else / elseif" sont les mêmes que les autres: elles finissent par un "end". Cependant il ne faut pas oublier de le placer lorsque la condition est finie. Par exemple, si je veux faire un choix: une fois le else écrit pour le dernier choix, après les "say" et les conditions suivantes il ne faut pas oublier le "end" ! Sinon, le compilateur croira que la suite de votre code n'est que l'intérieur de la condition jusqu'à ce qu'il voit un autre end !

Oui, c'est bien pour ça que même si vous réussissez à compiler votre quête, vous n'arrivez pas à afficher les bonnes choses lorsque vous cliquez sur un choix ! Pour quelques veinards, la quête marchera, mais c'est rare, croyez-moi. C'est tout ce qu'il y avait à dire à propos des conditions. N'oubliez surtout pas le end une fois que tous les choix ont été créés !!

 

 

 

4. Les "End"

 

 

Enfin, on en vient à la partie la plus importante du tutoriel ! N'oubliez pas de conserver les 3 end principaux (quest, state, when) à la fin de la page, ça vous permettra de savoir quel end correspond à quel autre end, par exemple quand vous avez des tonnes de conditions, si vous laissez trop de "end" en bas de page, vous ne saurez plus à quel état correspond tel "end". C'est pourquoi vous devez toujours garder 3 "end" en bas de page afin d'éviter de s'y perdre quand l'état "when" est terminé. Quand vous compilerez, s'il manque un "end" ce ne sera que pour un "if" ou une boucle (personnes un peu plus expérimentées...), voici un exemple pour les "end" à ajouter à la fin:

 

quest bonjour begin
    state start begin
         when 9002.chat."Boutique" begin
              Je suis en train de taper le code
              pour la quête, et je laisse bien apparaître
              les trois end, tout en écrivant l'intérieur
              de la condition. Ça m'évite de les oublier
              si toutefois je suis trop absorbé par le if
              et que j'en oublie les trois premiers états.
         end
    end
end
 

 

Si vous avez plusieurs "state", vous ajouterez un "end" à la fin du state en question et laisserez seulement un end pour le "quest" à la première ligne. Vous tiendrez compte que si vous avez une erreur de end, vous compterez combien de "state" et de "when" vous avez ouvert. Dans un "state", il faut toujours deux "end" finaux, pour le "state" et le "when".

 

 

 

5. Organisation

 

 

Accrochez-vous, c'est presque fini ! Le plus dur a déjà été fait !

La question tant posée dans ce chapitre est... Qu'est-ce que l'organisation dans les quêtes ? C'est simple, l'organisation c'est la manière avec laquelle vous écrivez vos quêtes et selon celle-ci, il est plus ou moins facile de se retrouver dans les étapes de la quête.

Reprenons ma première quête d'exemple. Admettons que je n'organise pas la quête, ça donnerait en quelque sorte ça:

 

quest bonjour begin
state start begin
when 9002.chat."Boutique" begin
              say_title("Bonjour")
              say("Message test")
local choix = select("Oui","Non")
if choix == 1 then
              say("Coucou")
else
              say("Pas coucou")
end
end
end
 

 

C'est pas très évident à lire, n'est-ce pas ? Dans ce cas là, et comme je l'ai dit plus haut:

 

Citation
Lorsque vous avez plusieurs "state" et plusieurs "if" et aussi des "if" à l'intérieur de "if", vous serez un moment donné perdus et vous ne saurez plus où il manque des end (d'où ça rejoint le chapitre 6 sur l'organisation)

On en vient enfin !

Donc c'est la raison pour laquelle si tout est mal placé, vous ne saurez pas à quoi les derniers "end" correspondent, sauf avec un peu de logique, mais admettons que j'ai dans ma quête 5 "if", ce ne serait pas si facile de s'y retrouver ;).

Prenez cette quête pour exemple, qui est très bien organisée:

 

quest bonjour begin
state start begin
	when 20091.chat."Dire Bonjour" begin
		say_title("Dire bonjour à Seon-Pyeong")
		say("Voulez-vous dire bonjour ?")
		local a=select("Dire bonjour", "Quitter")
		if a == 1 then
			say("blablater")
			local e = select("Oui", "Non")
			if e == 1 then
				say("blablater")
			elseif e == 2 then
				say("faire du blabla")
			else
				return
			end
		else
			say("Au revoir !")
		end
	end
end
end
 

 

Imaginez ce que ça donnerait si la quête n'était pas organisée... !

Bon, très bien je vous montre ça !

 

quest bonjour begin
state start begin
when 20091.chat."Dire Bonjour" begin
say_title("Dire bonjour à Seon-Pyeong")
say("Voulez-vous dire bonjour ?")
local a=select("Dire bonjour", "Quitter")
if a == 1 then
say("blablater")
local e = select("Oui", "Non")
if e == 1 then
say("blablater")
elseif e == 2 then
say("faire du blabla")
else
return
end
else
say("Au revoir !")
end
end
end
end
 

C'est pas beau à voir tout ça, hein ? Et si je vous demandais à quoi correspond le troisième "end" en partant de la fin, vous hésiterez un moment avant de le trouver ;).

L'organisation n'est là que pour vous aider dans vos quêtes. Organisez vos quêtes: faites une tabulation sur l'éditeur lorsque vous ouvrez un état (quest, state, when, if, elseif, else, etc...) comme dans mon exemple organisé. Ça ne vous fera que du bien, et vous saurez (en regardant la colonne où est situé le "end", quand s'ouvrent et se ferment les états.

Voilà, vous savez tout ce qu'il faut savoir pour débugguer sa quête. J'espère que vous y arriverez, et je vais vous donner, avec le chapitre 6, quelques conseils et astuces pour bien y parvenir.

 

 

 

6. Quelques astuces

 

 

Voici maintenant quelques astuces afin de débugguer correctement votre quête.

 

Lorsque vous compilez une quête, il vous affiche une erreur si vous vous plantez à un certain endroit de la quête. Selon l'erreur, les messages d'erreur affichés ne sont pas exactement les mêmes problèmes que vous avez, par exemple, s'il vous affiche "expected 'end'" ça veut dire qu'il vous manque un "end" et il vous indique à quel endroit ça ne va pas. Malheureusement le "end" que vous avez oublié n'est pas forcément à cette ligne ! Oui, c'est bien ça. La ligne qu'il vous indique c'est celle à laquelle il ne comprend plus ce que vous avez marqué, donc il renvoie un message d'erreur avec le numéro de la ligne où il a planté.

C'est à vous de retrouver le "end" manquant, grâce aux étapes que je vous ai donné plus haut. N'oubliez pas une chose très très très importante dans la création de quêtes:

 

/!\ N'ajoutez jamais de "end" à tire-larigot à la fin de la quête sans savoir ce que ça peut faire ! Cherchez toujours, oui je dis bien TOUJOURS si une condition est bien terminée par un "end", si c'est le cas, cherchez si ce n'est pas le "when" qui n'est pas fermé, puis le "state" et enfin le "quest" ! Sinon, la quête ne marchera pas comme vous le désirez /!\

 

Vérifiez si vous avez bien mis les "end" au bon endroit, sans ça, la quête ne fonctionnera pas comme prévu et vous aurez des surprises, notamment aux "select" lorsque vous cliquerez sur un des choix il se peut que la quête ne vous amène pas au choix attendu.

 

Deuxième astuce, vous devriez télécharger "Notepad++" et l'installer. Une fois fait, ouvrez un nouveau document enregistré en .quest, et allez dans le menu du haut, choisissez "langage" puis "L" et choisissez "Lua", vous pourrez repérer les "if", "elseif", "else" et "end" ainsi que "local" et les return. Ils seront mis en surbrillance bleue pour les faire "ressortir" du code et ainsi vous permettre de bien voir où vous avez placé ces "mots-clés".

Notepad++ est disponible

Hidden Content

    Give reaction to this post to see the hidden content.
(Téléchargement direct).

 

Voilà, c'est tout pour ce tutoriel ! N'hésitez pas à m'envoyer un MP si vous trouvez une erreur dans les quêtes et si vous êtes certain que c'est une erreur (je ne tiens pas à me faire spammer par des débutants en quêtes). Merci d'avoir lu ce tutoriel, bien qu'un peu long, mais c'est pour votre bien !

 

Vous désirez partager ce tutoriel ? N'oubliez pas d'ajouter la source du tutoriel avant de le copier/coller, et si vous avez au moins fait l'effort de le lire, enlevez cette phrase, elle n'est là qu'à titre informatif !

 

 

Cordialement, Kameyu.

 

Modifié par Kameyu
  • Metin2 Dev 1
  • Love 1
Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 2
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Jours populaires



  • brilliantdiscord_widget
  • Flux d'Activité

    1. 21

      Metin2 en 2020 peut-on en parler?

    2. 0

      METIN2Project

    3. 3

      Ressources - UnPack - Metin2 Client - Officiel

    4. 0

      Barre des tâches d'argent étendue

    5. 16

      Redémarrage automatique des channels

    6. 16

      Multi Logo GM / SGM / GA

  • En ligne récemment

    • Aucun utilisateur enregistré regarde cette page.

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.