WB [Tutoriel] Insérer une nouvelle quête dans Warband Native

Users who are viewing this thread

BerTolkien

Sergeant Knight
Hello

En discutant avec lolitablue, on a pensé qu'il serait bien d'avoir un tutoriel en Français sur les quêtes.
On pourra aussi apprendre à bien bâtir un dialogue et manipuler des variables !
Cela devrait pouvoir intéresser les personnes qui voudraient se lancer dans le modding.

Tuto 1

Introduction :
Commençons par une simple quête, récupérer un item et le ramener au personnage qui le demande.
Il faut d'abord créer le personnage et le plus simple est de le situer dans une scène existante comme par exemple une taverne.
Je vais prendre l'exemple de Mixora, un des personnages dans mon mod (Nox RPG).


Création du personnage :
- Il faut le créer dans le module_troops.py du ms (module system) !
Insérer impérativement ce qui suit après la ligne : ["merchants_end","merchants_end","merchants_end",tf_hero,
Donc avant  #Used for player enterprises et ["town_1_master_craftsman", "{!}Town 1 Craftsman", "{!}Town 1 Seneschal", tf_hero|tf_is_merchant,

Code:
  ["mixora","Mixora","Mixora",tf_hero, scn_town_6_tavern|entry(1),reserved, fac_commoners,
   [itm_leather_jacket,itm_hide_boots],def_attrib|level(2),wp(20),knows_common,0x0000000b8a106250149970a4198a4e9e00000000001eeb2b0000000000000000],
* Explications pour scn_town_6_tavern|entry(1) :
- scn_town_6_tavern est la taverne de Praven dans la Native, entry(1) est le point d'entée où apparaît le personnage.

Note : Il faudra bien sûr éditer la scène pour mettre physiquement l'entry(1) à l'endroit où vous voulez le personnage dans la scène.

Voilà, le nouveau personnage est créé !
Compiler le ms avant de continuer (build_module.bat)
****

Création de la quête :
Par exemple, amener à Mixora du sel pour conserver des aliments (Pour simplifier on prend un item existant).
C'est dans module_quests.py que cela se passe.
Placer ce qui suit après : ("intrigue_against_lord", "Intrigue against Lord", qf_random_quest, "{!}Criticize {s11} in Private"),
Donc avant : #Dynamic quests begin here
Code:
  ("mixora_q1", "Bag of salt", 0,
    "{!}At the tavern in Praven, a guy needs salt to preserve food. Bring him a bag of salt.^Clue: Buying salt."),
Je vous recommande de programmer les textes en Anglais et d'effectuer la traduction en Français plus tard.
* Explications :
"mixora_q1" est la référence de la quête (Mettez ce que vous voulez).
"Bag of salt" est le nom qui sera affiché dans le journal des quêtes.
Traduction du texte de la quête : À la taverne de Praven un gars a besoin de sel pour consever de la nourriture. Lui amener un sac de sel.^Indice : Acheter du sel.

Compiler le ms avant de continuer (build_module.bat).
La quête est validée.
****

Création du dialogue :
C'est dans module_dialogs.py que cela se passe.
Pour un personnage dans une taverne il faut placer le dialogue après le paragraphe #Tavern Talk (with farmers)
Dernière ligne du paragraphe : "Thank you for helping us {sir/madam}. Crush those bandits!", "close_window", []],
Donc avant le paragraphe #Tavern Talk (with troops)
Code:
### Dialogue Mixora, quest Sac de sel
  [anyone, "start", [(eq,"$g_talk_troop", "trp_mixora"),(eq,"$mixora_a1", 2)], "Greetings {playername}.","mixora_bye01",[]],
  [anyone|plyr, "mixora_bye01", [], "Greetings to you, Mixora.", "close_window",[]],
# Fin quest
  [anyone, "start", [(eq,"$g_talk_troop", "trp_mixora"),(eq,"$mixora_a1", 1)], "Have you some salt?","mixora_02",[]],
  [anyone|plyr, "mixora_02", [(player_has_item,"itm_salt")], "Yes I have.", "mixora_02a",[
     (assign,"$mixora_a1", 2),
     (troop_remove_item, "trp_player", "itm_salt"),
     (call_script, "script_change_troop_renown", "trp_player", 5),
     (call_script, "script_change_player_honor", 2),
     (call_script, "script_change_player_relation_with_troop","$g_talk_troop", 10),
     (call_script, "script_end_quest","qst_mixora_q1"),
     (troop_add_gold, "trp_player", 1000),
     (add_xp_as_reward, 500)]],
  [anyone|plyr, "mixora_02", [(neg|player_has_item,"itm_salt")], "No, not yet.", "close_window",[]],
  [anyone, "mixora_02a", [], "Really? Congratulations {sir/lassie}! Your reward, some money.","close_window",[]],
# Prise quest
  [anyone, "start", [(eq,"$g_talk_troop", "trp_mixora"),(eq,"$mixora_a1", 0),(eq,"$qt_mixora_q1", 0)], "Greetings {sir/madam}. I am Mixora, and if you looking for a job, I can propose you one.", "mixora_01",[]],
  [anyone|plyr, "mixora_01", [], "Yes, I am interested.", "mixora_01a",[]],
  [anyone|plyr, "mixora_01", [], "No, I am not interested.", "close_window",[]],
  [anyone, "mixora_01a", [], "I explain to you. I have food to be preserved. If possible I would like to have at least a bag of salt. I'll give you a nice reward.", "mixora_01b",[]],
  [anyone|plyr, "mixora_01b", [], "That's nice offer. I bring you at least a bag of salt!", "mixora_01c",[
     (assign,"$mixora_a1", 1),
     (assign,"$qt_mixora_q1", 1),
     (setup_quest_text, "qst_mixora_q1"),
     (str_store_string, s2, "@At the tavern in Praven, a guy needs salt to preserve food. Bring him a bag of salt.^Clue: Buying salt."),
     (call_script, "script_start_quest","qst_mixora_q1","trp_mixora"),
     (call_script, "script_change_player_relation_with_troop","$g_talk_troop", 5)]],
  [anyone|plyr, "mixora_01b", [],  "I don't have time for that! Farewell.", "close_window",[]],
  [anyone, "mixora_01c", [],"I count on you!", "close_window",[]],
# Gen
  [trp_mixora, "start", [], "Greetings {sir/madam}. I am Mixora.", "mixora_bye00",[]],
  [trp_mixora|plyr, "mixora_bye00", [], "Greetings sir.", "close_window",[]],
Les lignes précédées d'un # ne sont pas prises en compte mais elles servent à se repérer dans le dialogue.
Le programme est lu de haut en bas. Et le tout début du dialogue est tout en bas (Valeur de la "variable dialogue" à zéro).

Importance des variables :
Création de deux variables. Grâce à la "variable dialogue" du personnage on sait où on en est dans la progression du dialogue ($mixora_a1).
Une deuxième variable est très fortement recommandée pour le suivi de la quête. on l’appellera "variable quête" ($qt_mixora_q1). Pas indispensable pour une quête toute simple mais il vaut mieux prendre l'habitude de la créer.

* Explications :
- Les deux lignes après # Gen
Elles n'ont pas de "variable dialogue" ! Elles ne sont pas indispensables mais peuvent être très utiles en cas de problème, par exemple si on a fait dans la suite du dialogue une erreur dans la "variable dialogue", c'est cette partie de dialogue qui s'affichera. Lors d'un test, on saura alors qu'il y a un problème. Normalement ces deux lignes ne doivent jamais apparaître si on ne s'est pas trompé.

* Le véritable dialogue débute avec les lignes après # Prise quest
La première ligne est très importante. C'est celle qui donnera le "go" du dialogue.
Composition de la ligne :
[anyone, "start", [(eq,"$g_talk_troop", "trp_mixora"),(eq,"$mixora_a1", 0),(eq,"$qt_mixora_q1", 0)], "Texte introduction dialogue.", "mixora_01",[]],
- Un dialogue devra toujours commencer par [anyone, "start",
"start" est ici le fanion de début de ligne.
- Puis par les variables :
[(eq,"$g_talk_troop", "trp_mixora"),    -> On attribue à la "variable personnage" ($g_talk_troop) le nom du personnage que l'on a créé (ici trp_mixora).
(eq,"$mixora_a1", 0),                          -> On crée la "variable dialogue", au départ on lui donne la valeur zéro (C'est la valeur par défaut d'une nouvelle variable).
(eq,"$qt_mixora_q1", 0)],                    -> On crée la "variable quête", au départ on lui donne la valeur zéro.
- La ligne se poursuit par le "Texte introduction dialogue."
- La ligne doit avoir un fanion de fin, ici c'est "mixora_01", on peut mettre ce que l'on veut. Cela signifie que l'on poursuivra le dialogue avec la ou les lignes ayant ce même fanion mais comme fanion de début de ligne.

Note : Lorsque l'on crée une nouvelle variable, il faudra la faire évoluer au moins une fois sinon elle restera orpheline et sortira en erreur lors de la compilation.

* Les deux lignes qui suivent :
  [anyone|plyr, "mixora_01", [], "Yes, I am interested.", "mixora_01a",[]],
  [anyone|plyr, "mixora_01", [], "No, I am not interested.", "close_window",[]],

- Une réponse à une introduction de dialogue commencera toujours par [anyone|plyr,
- Puis par le fanion de début de ligne : "mixora_01",
- Puis par le texte de la réponse.
- Et enfin par le fanion de fin de ligne.

Ici deux possibilités de réponses qui s'affichent , en cliquant sur la deuxième vous mettez fin au dialogue. "close_window" est le fanion de fin de dialogue.
En cliquant sur la première réponse (fanion de fin de ligne "mixora_01a") vous poursuivez le dialogue avec la ligne ayant pour fanion de début de ligne "mixora_01a" !

* Poursuite du dialogue avec :
  [anyone, "mixora_01a", [], "I explain to you. I have food to be preserved. If possible I would like to have at least a bag of salt. I'll give you a nice reward.", "mixora_01b",[]],
- Une réponse du personnage avec qui on parle débutera toujours par [anyone,
- Puis fanion de début de ligne, puis texte, puis fanion de fin de ligne.

* Donc poursuite du dialogue avec :
  [anyone|plyr, "mixora_01b", [], "That's nice offer. I bring you at least a bag of salt!", "mixora_01c",[
(assign,"$mixora_a1", 1),      -> On fait évoluer la valeur de la "variable dialogue" à 1, ce qui signifie qu'après la fin de ce dialogue, le nouveau dialogue débutera au prochain [anyone, "start", et (eq,"$mixora_a1", 1),
(assign,"$qt_mixora_q1", 1), -> On fait évoluer la valeur de la "variable quête" à 1, juste pour la valider. Vous pourrez apprendre à vous en servir pour une quête plus complexe (Futur tuto).
(setup_quest_text, "qst_mixora_q1"), -> Cette ligne affichera le nom de la quête mixora_q1 dans le journal des quêtes.
(str_store_string, s2, "@At the tavern in Praven, a guy needs salt to preserve food. Bring him a bag of salt.^Clue: Buying salt."), -> Cette ligne affiche le texte de la quête.
(call_script, "script_start_quest","qst_mixora_q1","trp_mixora"), -> Cette ligne valide la quête mixora_q1 pour le personnage trp_mixora !
(call_script, "script_change_player_relation_with_troop","$g_talk_troop", 5)]], -> La relation avec le personnage avec qui on parle évolue de 5 points.
- Vous avez accepté la quête en cliquant sur cette réponse.

- Vous avez remarqué qu'il y a des crochets [], au début de la ligne et d'autres à la fin de ligne. Les premiers servent à mettre une ou des conditions à l'affichage du texte. Les derniers servent à mettre les conséquences de la réponse qui s'affiche. C'est le cas ici. Voir la signification de chaque conséquence après le signe ->
- Sinon vous avez la possibilité de refuser la quête en cliquant sur la deuxième réponse :
  [anyone|plyr, "mixora_01b", [],  "I don't have time for that! Farewell.", "close_window",[]],

* La dernière ligne met fin à ce dialogue si on a accepté la quête (Sinon on reprend au début du dialogue, la "variable dialogue" n'a pas évoluée, elle reste à zéro) :
  [anyone, "mixora_01c", [],"I count on you!", "close_window",[]],

!!!!!
* Je pense maintenant que vous avez compris que la prochaine fois que vous parlerez avec Mixora, le nouveau dialogue débutera par la ligne :
  [anyone, "start", [(eq,"$g_talk_troop", "trp_mixora"),(eq,"$mixora_a1", 1)], "Have you some salt?","mixora_02",[]],

* Il se poursuivra par deux réponses possibles :
  [anyone|plyr, "mixora_02", [(player_has_item,"itm_salt")], "Yes I have.", "mixora_02a",[
(assign,"$mixora_a1", 2),    -> On fait évoluer la valeur de la "variable dialogue" à 2, ce qui signifie qu'après la fin de ce dialogue, le nouveau dialogue débutera au prochain [anyone, "start", et (eq,"$mixora_a1", 2),
        (troop_remove_item, "trp_player", "itm_salt"),  -> On enlève l'objet de quête de l'inventaire du héros.
(call_script, "script_change_troop_renown", "trp_player", 5),  -> La renommée du héros évolue de 5 points.
(call_script, "script_change_player_honor", 2),  -> L'honneur du héros évolue de 2 points.
(call_script, "script_change_player_relation_with_troop","$g_talk_troop", 10),  -> La relation avec le personnage avec qui on parle évolue de 10 points.
(call_script, "script_end_quest","qst_mixora_q1"),  -> Met fin à la quête mixora_q1, donc disparaît du journal des quêtes.
(troop_add_gold, "trp_player", 1000),  -> On attribue au héro de l'argent, ici 1000 deniers.
(add_xp_as_reward, 500)]],  -> On attribue 500 points d'expérience au héros.
  [anyone|plyr, "mixora_02", [(neg|player_has_item,"itm_salt")], "No, not yet.", "close_window",[]],

- Les premiers crochets contiennent une condition d'affichage pour les deux réponses possibles :
La première réponse s'affiche si vous avez sur vous l'item demandé, ici un sac de sel (player_has_item,"itm_salt"), la deuxième réponse ne s'affiche pas.
La deuxième réponse s'affiche si vous n'avez pas l'item demandé (neg|player_has_item,"itm_salt"), la première réponse ne s'affiche pas.
* La première réponse a bien sûr des conséquences puisque l'on a réussi la quête. Voir la signification de chaque conséquence après le signe ->

* Si la quête est réussie, ce dialogue se termine par la ligne :
[anyone, "mixora_02a", [], "Really? Congratulations {sir/lassie}! Here is your reward, some money.","close_window",[]],

!!!!!
* Si vous avez terminé la quête, toutes les prochaines fois que vous parlerez avec Mixora vous aurez toujours ce dialogue (Sauf si vous le faites évoluer) qui débutera par la ligne :
  [anyone, "start", [(eq,"$g_talk_troop", "trp_mixora"),(eq,"$mixora_a1", 2)], "Greetings {playername}.","mixora_bye01",[]],
* Et se terminera par cette réponse :
  [anyone|plyr, "mixora_bye01", [], "Greetings to you, Mixora.", "close_window",[]],

********

Traduction des dialogues :
* Suite générique après fin quête (eq,"$mixora_a1", 2) :
"start" Salutations {playername}. "mixora_bye01"
"mixora_bye01" Salutations à vous, Mixora. "close_window"

* Suite du dialogue (eq,"$mixora_a1", 1) :
"start" Avez-vous du sel ? "mixora_02"
"mixora_02" Oui. "mixora_02a"
"mixora_02" Non, pas encore. "close_window"
"mixora_02a" Vraiment ? Félicitations {monsieur/madame} ! Votre récompense, de l'argent. "close_window"

* Début du dialogue (eq,"$mixora_a1", 0) :
"start" Salutations {monsieur/madame}, je suis Mixora et si vous cherchez du travail, je peux vous en proposer un. "mixora_01"
"mixora_01" Oui, je suis {intéressé/intéressée}. "mixora_01a"
"mixora_01" Non, cela ne m'intéresse pas. "close_window"
"mixora_01a" Je vous explique. J'ai des aliments à consever et si c'est possible j'aimerais avoir au moins un sac de sel. Je vous promets une bonne récompense. "mixora_01b"
"mixora_01b" C'est une bonne offre, je vous amène au moins un sac de sel. "mixora_01c"
"mixora_01b" Je n'ai pas de temps à perdre avec cela. Adieu. "close_window"
"mixora_01c" Je compte sur vous ! "close_window"
# Gen :
"start" Salutations {monsieur/madame}, je suis Mixora. "mixora_bye00"
"mixora_bye00" Salutations monsieur. "close_window"

********

Fin du premier tuto !
J'espère qu'il vous aidera à créer des quêtes un peu partout !
Dans le tuto 2 qui suit, on complique la quête.

Tchin !
:twisted:
 
Tuto 2

Hello
L'objectif de ce deuxième tuto est de faire une quête qui se déroulera en deux étapes.

Reprise de notre personnage Mixora pour cette nouvelle quête qui fera suite à la première (Sel). Il faudra lui amener deux livres.
On a besoin de créer deux nouveaux personnages.
Le premier on va l'appeler Recelor que l'on place dans une autre taverne que celle de Mixora. Par exemple Dhirim (town_16).
Le deuxième on va l'appeler Bottino, artisan bottier. On va le placer dans un village, Azgad dans la Native (village_3).

module_troops.py :
Mettre le code de Recelor après celui de Mixora :
Code:
  ["recelor","Recelor","Recelor",tf_hero, scn_town_16_tavern|entry(1),reserved, fac_commoners,[itm_leather_jacket,itm_hide_boots],
   def_attrib|level(2),wp(20),knows_common,0x0000000749041043591b524cec85d2e200000000001e4cea0000000000000000],

Pour un personnage dans un village, mettre le code de Bottino juste avant ["quick_battle_6_player", "{!}quick_battle_6_player", "{!}quick_battle_6_player",
Code:
  ["bottino","Bottino","Bottino",tf_hero, scn_village_3|entry(5),reserved, fac_commoners,[itm_leather_jacket,itm_hide_boots],
   def_attrib|level(2),wp(20),knows_common, 0x0000000fce000345292dad94924ecb1d00000000001d98d30000000000000000],

Note : Il faudra bien sûr éditer les deux scènes pour mettre physiquement l'entry(1) pour Recelor dans la taverne désirée et l'entry(5) pour Bottino dans le village choisi.

Compiler le ms avant de continuer (build_module.bat)
****

Création de 3 items. (Livres + Bottes)
module_items.py :
Mettre le code tout à la fin du fichier. Juste avant : ["items_end", "Items End", [("shield_round_a",0)], 0, 0, 1, 0, 0],
Code:
["book_sorcery_a","Sorcery vol1", [("book_f",0)], itp_type_book, 0, 500, weight(0.5)|abundance(0),imodbits_none],
["book_sorcery_b","Sorcery vol2", [("book_f",0)], itp_type_book, 0, 500, weight(0.5)|abundance(0),imodbits_none],
["leather_boots_hm", "Hand-made Leather Boots", [("leather_boots_a",0)], itp_type_foot_armor|itp_civilian|itp_attach_armature, 0,
 150, weight(1.5)|abundance(10)|head_armor(0)|body_armor(0)|leg_armor(25)|difficulty(0),imodbits_none],

Compiler le ms avant de continuer (build_module.bat)
****

Création de la quête. module_quests.py :
Mettre le code à la suite de la quête 1 du premier tuto.
Code:
 ("mixora_q2", "The two books", 0,
  "{!}At the tavern in Praven, Mixora wants to retrieve the two books loaned to Bottino.^Clue: Village of Azgad."),
Traduction : À la taverne de Praven, Mixora veut récupérer les deux livres prêtés à Bottino.^Indice : Village d'Azgad.

Compiler le ms avant de continuer (build_module.bat)
****

Création d'une variable qui servira aussi de temporisation.
C'est ce que l'on appelle un trigger, très intéressant dans un dialogue pour qu'une nouvelle action ne se renouvelle que plus tard. (Par exemple toutes les 24h)
module_simple_triggers.py :
Placer le code tout à la fin du fichier.
Code:
	# Tous les jours
   (24,
	[
	 (try_begin),  # Tempo vente Bottino
	  (eq,"$suivi_bot1", 1),
	  (assign,"$suivi_bot1", 0),
	 (try_end),
	]),
Explications :
- Toutes les 24h, si la valeur de la variable $suivi_bot1 est égale à 1 elle passe à zéro :
La variable est dans le dialogue avec Bottino, cela signifie qu'on lui a acheté des bottes, et qu'il faut attendre que la variable soit à nouveau à zéro pour renouveler un achat.
****

Voilà maintenant le gros morceau déterminant de la quête, les dialogues !

module_dialogs.py :
Mixora : Si vous avez fait le tuto 1, remplacez l'ancien dialogue  par le nouveau (C'est plus simple). Sinon placer le code comme indiqué dans le tuto 1.
Code:
### Dialogue Mixora, quest 1 Sac de sel, puis quest 2 livres
	# Quest 2 et suite gen
  [anyone, "start", [(eq,"$g_talk_troop", "trp_mixora"),(eq,"$mixora_a1", 2)], "Greetings {playername}!","mixora_03",[]],
  [anyone|plyr, "mixora_03", [(eq,"$qt_mixora_q2", 0),(ge,"$bottino_a1", 1)], "What enthusiasm! Do you need anything?", "mixora_03a",[]],
  [anyone|plyr, "mixora_03", [(eq,"$qt_mixora_q2", 3),(player_has_item,"itm_book_sorcery_a"),(player_has_item,"itm_book_sorcery_b")], "I have your two books.", "mixora_qt2_end",[]],
  [anyone|plyr, "mixora_03", [], "Greetings to you, Mixora.", "close_window",[]],
  [anyone, "mixora_03a", [], "Yes {playername}, I need you.","mixora_03b",[]],
  [anyone|plyr, "mixora_03b", [], "What is it about ?", "mixora_03c",[]],
  [anyone, "mixora_03c", [], "It is a tricky case. I know you've seen Bottino at the village of Azgad. I have a problem with him. A long time ago I lent him books, the two volumes of Sorcery.\
 He does not want to give them back. Can you settle this? If you succeed I promise you a great reward!","mixora_03d",[]],
  [anyone|plyr, "mixora_03d", [], "So no problem, I take care of it.", "mixora_end0",[
	(assign,"$qt_mixora_q2", 1),
	(setup_quest_text, "qst_mixora_q2"),
	(str_store_string, s2, "@At the tavern in Praven, Mixora wants to retrieve the two books loaned to Bottino.^Clue: Village of Azgad."),
	(call_script, "script_start_quest","qst_mixora_q2","trp_mixora"),
	(call_script, "script_change_player_relation_with_troop","$g_talk_troop", 2)]],
	# Fin quest 2
  [anyone, "mixora_qt2_end", [], "Really? Congratulations {playername}! I am impressed! Here is your reward, some money.","mixora_qt2_end1",[
	(assign,"$qt_mixora_q2", 4),
	(troop_remove_item, "trp_player", "itm_book_sorcery_a"),
	(troop_remove_item, "trp_player", "itm_book_sorcery_b"),
	(troop_add_gold, "trp_player", 3000),
	(call_script, "script_change_player_relation_with_troop","$g_talk_troop", 10)]],
  [anyone|plyr, "mixora_qt2_end1", [], "Thank you very much Mixora. I hope you will forgive Bottino for this misconduct. He's not a bad guy.", "mixora_qt2_end2",[]],
  [anyone, "mixora_qt2_end2", [], "There is no problem.","close_window",[
	(call_script, "script_end_quest","qst_mixora_q2"),
	(call_script, "script_change_troop_renown", "trp_player", 10),
	(add_xp_as_reward, 800)]],
	# Fin quest 1
  [anyone, "start", [(eq,"$g_talk_troop", "trp_mixora"),(eq,"$mixora_a1", 1)], "Have you some salt?","mixora_02",[]],
  [anyone|plyr, "mixora_02", [(player_has_item,"itm_salt")], "Yes I have.", "mixora_02a",[
	(assign,"$mixora_a1", 2),
	(troop_remove_item, "trp_player", "itm_salt"),
	(call_script, "script_change_player_honor", 2),
	(call_script, "script_change_player_relation_with_troop","$g_talk_troop", 10)]],
  [anyone|plyr, "mixora_02", [(neg|player_has_item,"itm_salt")], "No, not yet.", "close_window",[]],
  [anyone, "mixora_02a", [], "Really? Congratulations {sir/lassie}! Here is your reward, some money.","close_window",[
	(troop_add_gold, "trp_player", 1000),
	(call_script, "script_end_quest","qst_mixora_q1"),
	(add_xp_as_reward, 500)]],
	# Prise quest 1
  [anyone, "start", [(eq,"$g_talk_troop", "trp_mixora"),(eq,"$mixora_a1", 0)], "Greetings {sir/madam}. I am Mixora, and if you looking for a job, I can propose you one.", "mixora_01",[]],
  [anyone|plyr, "mixora_01", [], "Yes, I am interested.", "mixora_01a",[]],
  [anyone|plyr, "mixora_01", [], "No, I am not interested.", "close_window",[]],
  [anyone, "mixora_01a", [], "I explain to you. I have food to be preserved. If possible I would like to have a bag of salt. Nobody wants to do this for me. I'll give you a nice reward.", "mixora_01b",[]],
  [anyone|plyr, "mixora_01b", [], "That's nice offer. I bring you salt!", "mixora_end0",[
	(assign,"$mixora_a1", 1),
	(setup_quest_text, "qst_mixora_q1"),
	(str_store_string, s2, "@At the tavern in Praven, a guy needs salt to preserve food. Bring him a bag of salt.^Clue: Buying salt."),
	(call_script, "script_start_quest","qst_mixora_q1","trp_mixora"),
	(call_script, "script_change_player_relation_with_troop","$g_talk_troop", 2)]],
  [anyone|plyr, "mixora_01b", [],  "I don't have time for that! Farewell.", "close_window",[]],
  [anyone, "mixora_end0", [],"I count on you!", "close_window",[]],
	# Gen
  [trp_mixora, "start", [], "I am Mixora.", "mixora_bye00",[]],
  [trp_mixora|plyr, "mixora_bye00", [], "I am {playername}.", "close_window",[]],

Bottino :
Il faut placer le code d'un personnage dans un village à un autre emplacement que celui dans une taverne !
Placer le code de Bottino juste avant cette ligne : [anyone,"start", [], "Surrender or die. Make your choice", "battle_reason_stated",[]],
Code:
### Dialogue Bottino
	# Quest Mixora et suite
  [anyone, "start", [(eq,"$g_talk_troop", "trp_bottino"),(eq,"$bottino_a1", 1)], "Greetings {playername}.", "botti1_02",[]],
  [anyone, "botti1_cont1", [], "Yes?", "botti1_02",[]],
  [anyone|plyr, "botti1_02", [(eq,"$qt_mixora_q2", 1),(call_script, "script_troop_get_player_relation", "$g_talk_troop"),(assign, "$g_talk_troop_relation", reg0),
	(ge,"$g_talk_troop_relation", 18)], "It is tricky but I must ask you the question.", "botti1_book",[]], # Quete livres Mixora
  [anyone|plyr, "botti1_02", [(eq,"$qt_mixora_q2", 1),(call_script, "script_troop_get_player_relation", "$g_talk_troop"),(assign, "$g_talk_troop_relation", reg0),
	(lt,"$g_talk_troop_relation", 18)], "Do you know Mixora?", "botti1_book_no",[]],
  [anyone|plyr, "botti1_02", [], "I'd like buy boots.", "botti1_com",[]],
  [anyone|plyr, "botti1_02", [], "Greetings Bottino. See you soon.", "close_window",[]],
	# Quest Mixora
  [anyone, "botti1_book", [], "You are a good customer, I listen to you.", "botti1_book1",[]],
  [anyone|plyr, "botti1_book1", [], "Mixora lent you books. Why do not you want to give them back?", "botti1_book2",[]],
  [anyone, "botti1_book2", [], "I am very annoyed with this story. Some time ago I needed some money and I sold one of the two books. I confess, I am not proud.", "botti1_book3",[]],
  [anyone|plyr, "botti1_book3", [], "Tell me to whom you sold it and give me the one you have.", "botti1_book4",[]],
  [anyone, "botti1_book4", [], "I sold it to Recelor. He's still at the tavern in Dhirim. I willingly give you the volume I have kept.", "botti1_book5",[(troop_add_item, "trp_player","itm_book_sorcery_a", 0)]],
  [anyone|plyr, "botti1_book5", [], "That is reasonable. I will try to arrange the case with Mixora.", "botti1_book6",[
	(assign,"$qt_mixora_q2", 2),
	(add_quest_note_from_sreg,"qst_mixora_q2",3,"@We retrieved volume 1 from Bottino. The other volume was sold to Recelor at the tavern in Dhirim.", 0),
	(display_message, "str_quest_log_updated",0xFF00FF00)]],
  [anyone, "botti1_book6", [], "Thank you very much {playername}.", "close_window",[]],
  [anyone, "botti1_book_no", [], "I will not answer this question.", "close_window",[]],
	# Premier dial
  [anyone, "start", [(eq,"$g_talk_troop", "trp_bottino"),(eq,"$bottino_a1", 0)], "I am Bottino and my boots are very good.", "botti1_01",[]],
  [anyone|plyr, "botti1_01", [], "I am {playername}. Tell me more.", "botti1_01a",[(assign,"$bottino_a1", 1)]],
  [anyone, "botti1_01a", [], "I sell boots of exceptional quality at a very attractive price. 150 denars the boots. Are you interested?", "botti1_01b",[]],
  [anyone|plyr, "botti1_01b", [], "Yes I am.", "botti1_com",[]],
  [anyone|plyr, "botti1_01b", [], "Next time, thank you.", "close_window",[]],
	# Commerce
  [anyone, "botti1_com", [(eq,"$suivi_bot1", 0)], "A pair of boots is available.", "botti1_com1",[]],
  [anyone, "botti1_com", [(eq,"$suivi_bot1", 1)], "I have no more boots available. Come back in a few hours.", "close_window",[]],
  [anyone|plyr, "botti1_com1", [(store_troop_gold, ":gold", "trp_player"),(ge,":gold", 150)], "I take the boots.", "botti1_cont1",[
	(assign,"$suivi_bot1", 1),
	(troop_remove_gold, "trp_player", 150),
	(troop_add_item, "trp_player","itm_leather_boots_hm", 0),
	(call_script, "script_troop_get_player_relation", "$g_talk_troop"),(assign, "$g_talk_troop_relation", reg0),
	(try_begin),
	  (lt,"$g_talk_troop_relation", 18),
	  (call_script, "script_change_player_relation_with_troop", "$g_talk_troop", 6),
	(else_try),
	  (call_script, "script_change_player_relation_with_troop", "$g_talk_troop", 1),
	(try_end),]],
  [anyone|plyr, "botti1_com1", [(store_troop_gold, ":gold", "trp_player"),(lt,":gold", 150)], "I do not have enough money, I will come back.", "close_window",[]],
	# Gen
  [trp_bottino, "start", [], "I am Bottino.","botti1_bye00",[]],
  [trp_bottino|plyr, "botti1_bye00", [], "I am {playername}.","close_window",[]],

Recelor :
Placer le code à la suite de celui pour Mixora.
Code:
### Dialogue Recelor (Taverne Dhirim)
	# Quest Mixora et suite
  [anyone, "start", [(eq,"$g_talk_troop", "trp_recelor"),(eq,"$recelor_a1", 1)], "{playername}, do you need something?", "recel1_02",[]],
  [anyone, "recel1_cont1", [], "Do you need something?", "recel1_02",[]],
  [anyone|plyr, "recel1_02", [(eq,"$qt_mixora_q2", 2),(eq,"$qt_recel_q1", 0)], "I am looking for a book. Sorcery volume 2.", "recel1_book",[]],
  [anyone|plyr, "recel1_02", [(eq,"$qt_mixora_q2", 2),(eq,"$qt_recel_q1", 1),(store_troop_gold, ":gold", "trp_player"),(ge,":gold", 1000)], "I have money for the book Sorcery volume 2.", "recel1_book_end",[]],
  [anyone|plyr, "recel1_02", [], "Not for the moment. Goodbye.", "close_window",[]],
	# Quest Mixora
  [anyone, "recel1_book", [], "I have this book. I sell it for 1000 denars.", "recel1_book1",[]],
  [anyone|plyr, "recel1_book1", [(store_troop_gold, ":gold", "trp_player"),(ge,":gold", 1000)], "It's a bit expensive but I take it.", "recel1_book_end",[]],
  [anyone|plyr, "recel1_book1", [(store_troop_gold, ":gold", "trp_player"),(lt,":gold", 1000)], "It's a bit expensive but I come back with the money.", "close_window",[
	(assign,"$qt_recel_q1", 1),
	(add_quest_note_from_sreg,"qst_lounoir_q2",3,"@We retrieved volume 1 from Bottino. We need 1000 denars at the tavern in Dhirim to buy volume 2. Recelor sells it.", 0),
	(display_message, "str_quest_log_updated",0xFF00FF00)]],
  [anyone, "recel1_book_end", [], "Do not move, I come back with the book.^(Ten minutes later) The book is yours.", "recel1_merci1",[
	(assign,"$qt_mixora_q2", 3),
	(assign,"$qt_recel_q1", 2),
	(troop_remove_gold, "trp_player", 1000),
	(troop_add_item, "trp_player","itm_book_sorcery_b", 0),
	(add_quest_note_from_sreg,"qst_lounoir_q2",3,"@We retrieved the two books. The quest is successful. Bring the books to the tavern in Praven to finish it.", 0),
	(display_message, "str_quest_log_updated",0xFF00FF00)]],
  [anyone|plyr, "recel1_merci1", [], "Thank you Recelor.", "close_window",[]],
	# Premier dial
  [anyone, "start", [(eq,"$g_talk_troop", "trp_recelor"),(eq,"$recelor_a1", 0)], "I am Recelor the resourceful person.", "recel1_01",[]],
  [anyone|plyr, "recel1_01", [], "This is very interesting. I am {playername}. You have very beautiful boots!", "recel1_01a",[]],
  [anyone, "recel1_01a", [], "Greetings {playername}. Yes my boots are excellent as the maker. Bottino is an artisan bootmaker in the village of Azgad.", "recel1_01b",[]],
  [anyone|plyr, "recel1_01b", [], "This is very interesting. I'll go see him!", "recel1_cont1",[(assign,"$recelor_a1", 1)]],
	# Gen
  [trp_recelor, "start", [], "I am Recelor.","recel1_bye00",[]],
  [trp_recelor|plyr, "recel1_bye00", [], "I am {playername}.","close_window",[]],

Compiler le ms (build_module.bat)
On peut maintenant jouer !

**********
Traduction des dialogues :

Mixora :
# Prise deuxième quête
"start"      Salutations {playername} ! "mixora_03"
"mixora_03"  Quel enthousiasme ! Vous avez besoin de quelque chose ? "mixora_03a"
"mixora_03"  J'ai vos deux livres.  "mixora_qt2_end
"mixora_03"  Salutations à vous, Mixora. "close_window"
"mixora_03a" Oui {playername}, j'ai besoin de vous. "mixora_03b
"mixora_03b  De quoi s'agit-il ? "mixora_03c"
"mixora_03c" C'est une affaire délicate. Je sais que vous avez vu Bottino au village d'Azgad. J'ai une embrouille avec lui. Il y a très longtemps je lui ai prêté des livres,
            les deux tomes du Sorcellerie. Il ne veut pas me les rendre. Pouvez-vous régler cela ? Si vous réussissez je vous promets une belle récompense !  "mixora_03d"
"mixora_03d" Alors pas de problème, je m'en occupe.  "mixora_end0"
# Fin quest 2
"mixora_qt2_end"  Vraiment ? Félicitations {playername} ! Je suis impressionné ! Voici votre récompense, de l'argent.  "mixora_qt2_end1"
"mixora_qt2_end1" Merci beaucoup Mixora. J'espère que vous pardonnerez à Bottino cet écart de conduite. Ce n'est pas un mauvais bougre.  "mixora_qt2_end2"
"mixora_qt2_end2" Il n'y a aucun problème.  "close_window"
...
"mixora_end0" Je compte sur vous !  "close_window"
...
Pour le reste du dialogue, voir tuto 1.

Bottino :
# Quête Mixora et suite
"start"          Salutations {playername}.  "botti1_02"
"botti1_cont1"  Oui ?  "botti1_02"
"botti1_02"      C'est délicat mais il me faut vous poser la question.  "botti1_book"
"botti1_02"      Vous connaissez Mixora ?  "botti1_book_no"
"botti1_02"      Pouvez-vous me vendre une paire de bottes ?  "botti1_com"
"botti1_02"      Salutations Bottino.  "close_window"
# Quête Mixora
"botti1_book"    Vous êtes un bon client, je vous écoute.
"botti1_book1"  Mixora vous a prêté deux livres. Pourquoi ne pas les rendre ? "botti1_book2"
"botti1_book2"  Je suis très embêté avec cette histoire. Il y a quelques temps j'ai eu besoin d'un peu d'argent et j'ai vendu un des deux livres. Je l'avoue, je ne suis pas fier. "botti1_book3"
"botti1_book3"  Dites-moi à qui vous l'avez vendu et donnez moi celui que vous avez.  "botti1_book4"
"botti1_book4"  Je l'ai vendu à Recelor. Il est de longue à la taverne de Dhirim. Je vous donne volontiers le volume que j'ai conservé.  "botti1_book5"
"botti1_book5"  Voilà qui est raisonnable. Je vais essayer d'arranger l'affaire avec Mixora.  "botti1_book6"
"botti1_book6"  Merci beaucoup {playername}.  "close_window"
"botti1_book_no"  Je ne vais pas répondre à cette question.  "close_window"
# Premier dial
"start"      Je suis Bottino et mes bottes sont très bonnes. "botti1_01"
"botti1_01"  Je suis {playername}. Dites m'en plus. "botti1_01a"
"botti1_01a"  Je vends des bottes d'une exceptionnelle qualité à un prix très attractif. 150 deniers la paire. Êtes-vous intéressé ?  "botti1_01b"
"botti1_01b"  Oui.  "botti1_com"
"botti1_01b"  Une prochaine fois, merci.  "close_window"
# Commerce
"botti1_com"  Une paire de bottes est disponible.  "botti1_com1"
"botti1_com"  Je n'ai plus de bottes disponibles. Revenez dans quelques heures.  "close_window"
"botti1_com1" Je prends les bottes.  "botti1_cont1"
"botti1_com1" Je n'ai pas assez d'argent, je reviendrai.  "close_window"

Recelor :
"start"        {playername}, vous avez besoin de quelque chose ?  "recel1_02"
"recel1_cont1" Vous avez besoin de quelque chose ?  "recel1_02"
"recel1_02"    Je suis à la recherche d'un livre. Sorcellerie tome 2.  "recel1_book"
"recel1_02"    J'ai l'argent pour le livre Sorcellerie tome 2.  "recel1_book_end"
"recel1_02"    Pas pour le moment. Au revoir.  "close_window"
#
"recel1_book"  J'ai ce livre. Je le vends 1000 deniers.  "recel1_book1"
"recel1_book1" C'est abusé mais je le prends.  "recel1_book_end"
"recel1_book1" C'est abusé mais je reviens avec l'argent.  "close_window"
maj journal quete : Nous avons récupéré le tome 1 auprès de Bottino. Il nous faut 1000 deniers pour acheter le tome 2 à Recelor qui se trouve à la taverne de Dhirim.
"recel1_book_end" Ne bougez pas, je reviens avec le livre.^(Dix minutes plus tard) Le livre est à vous.  "recel1_merci1"
"recel1_merci1"  Merci Recelor.  "close_window"
maj journal quete : Nous avons récupéré les deux livres. La quête est un succès. Amener les livres à la taverne de Praven pour la finir.
# Premier dial
"start"        Je suis Recelor le champion de la débrouille.  "recel1_01"
"recel1_01"    Voilà qui est intéressant. Je suis {playername}. Vous avez de très belles bottes !  "recel1_01a"
"recel1_01a"  Salutations {playername}. Oui mes bottes sont excellentes comme celui qui les fabrique. Bottino est un artisan bottier au village d'Azgad.  "recel1_01b"
"recel1_01b"  C'est très intéressant. J'irai le voir !  "recel1_cont1"

***********

Explications dialogues :

Dialogue Mixora :
Voir tuto 1 pour la partie # Fin quest 1 à # Gen
La quête 1 étant terminée la "variable dialogue" est égale à 2 (eq,"$mixora_a1", 2). Le dialogue reprend donc à # Quest 2 et suite gen.

Note : Pour les variables il y a trois principaux états  ->  eq = égal à la valeur.  ge = plus grand ou égal.  lt = plus petit.

Après l'entame du dialogue [anyone, "start", ->  Trois réponses possibles :
  [anyone|plyr, "mixora_03", [(eq,"$qt_mixora_q2", 0),(ge,"$bottino_a1", 1)], "What enthusiasm! Do you need anything?", "mixora_03a",[]],  -> Quête se déclenche que si on a déjà parlé à Bottino
  [anyone|plyr, "mixora_03", [(eq,"$qt_mixora_q2", 3),(player_has_item,"itm_book_sorcery_a"),(player_has_item,"itm_book_sorcery_b")], "I have your two books.", "mixora_qt2_end",[]],  -> Fin quête
  [anyone|plyr, "mixora_03", [], "Greetings to you, Mixora.", "close_window",[]],  -> Mettre fin au dialogue

La première réponse a des conditions pour qu'elle s'affiche. Ce sera le déclenchement de la quête 2.
(eq,"$qt_mixora_q2", 0) est la "variable quête", à zéro par défaut la première fois.
(ge,"$bottino_a1", 1) est la "variable dialogue" du personnage Bottino. La valeur doit être au moins à 1, ce qui signifie qu'on a déjà parlé à Bottino.
La deuxième a aussi des conditions pour qu'elle s'affiche. Ce seront elles qui mettront fin à la quête.
(eq,"$qt_mixora_q2", 3), la "variable quête" doit être égale à 3.
(player_has_item,"itm_book_sorcery_a"),(player_has_item,"itm_book_sorcery_b"), on doit posséder dans l'inventaire les deux livres.
La troisième n'a pas de condition, elle s'affichera systématiquement pour mettre fin au dialogue ("close_window").

Si la première réponse remplit les conditions, le dialogue continue de [anyone, "mixora_03a",  à  [anyone, "mixora_end0", [],"I count on you!", "close_window",[]],
C'est la prise de quête. Conséquence dans :
  [anyone|plyr, "mixora_03d", [], "So no problem, I take care of it.", "mixora_end0",[
(assign,"$qt_mixora_q2", 1),          -> Evolution "variable quête" à 1
(setup_quest_text, "qst_mixora_q2"),  -> Nom de la quête
(str_store_string, s2, "@At the tavern in Praven, Mixora wants to retrieve the two books loaned to Bottino.^Clue: Village of Azgad."),  -> Texte quête
(call_script, "script_start_quest","qst_mixora_q2","trp_mixora"),  -> Validation quête dans le journal
(call_script, "script_change_player_relation_with_troop","$g_talk_troop", 2)]],  -> Évolution relation avec le personnage (Mixora) de + 2 pts

Vous avez pris la quête ! (Si vous parlez immédiatement à nouveau à Mixora, la première réponse ne s'affichera plus, la "variable quête" est passée à 1)

Si la deuxième réponse remplit les conditions, c'est que vous avez réussi la quête. Le dialogue se poursuivra donc à # Fin quest 2.
Conséquences de la réussite de la quête :
  [anyone, "mixora_qt2_end", [], "Really? Congratulations {playername}! I am impressed! Here is your reward, some money.","mixora_qt2_end1",[
(assign,"$qt_mixora_q2", 4),  -> La "variable quête" passe à 4
(troop_remove_item, "trp_player", "itm_book_sorcery_a"),  -> On retire les deux livres de l'inventaire
(troop_remove_item, "trp_player", "itm_book_sorcery_b"),
(troop_add_gold, "trp_player", 3000),  -> On touche 3000 deniers
(call_script, "script_change_player_relation_with_troop","$g_talk_troop", 10)]],  -> Évolution relation avec le personnage (Mixora) de + 10 pts
Puis dans :
  [anyone, "mixora_qt2_end2", [], "There is no problem.","close_window",[
(call_script, "script_end_quest","qst_mixora_q2"),  -> Fin de la quête, disparaît du journal
(call_script, "script_change_troop_renown", "trp_player", 10),  -> + 10 pts à la renommée du joueur
(add_xp_as_reward, 800)]],  -> + 800 pts d'expérience au joueur, bénéficient aussi aux compagnons du joueur (NPC)

Vous avez fini la quête ! (Si vous parlez immédiatement à nouveau à Mixora, la première et la deuxième réponse ne s'afficheront plus, la "variable quête" a évoluée)

***************

Dialogue Bottino :
Le paragraphe # Gen est un garde-fou (Voir tuto 1)
Le dialogue commence avec le paragraphe # Premier dial, la "variable dialogue" du personnage est à zéro (eq,"$bottino_a1", 0), vous devez maintenant avoir l'habitude du démarrage d'un dialogue !
  [anyone, "start", [(eq,"$g_talk_troop", "trp_bottino"),(eq,"$bottino_a1", 0)], "I am Bottino and my boots are very good.", "botti1_01",[]],
  [anyone|plyr, "botti1_01", [], "I am {playername}. Tell me more.", "botti1_01a",[(assign,"$bottino_a1", 1)]],  -> La "variable dialogue" passe à 1
  [anyone, "botti1_01a", [], "I sell boots of exceptional quality at a very attractive price. 150 denars the boots. Are you interested?", "botti1_01b",[]],
  [anyone|plyr, "botti1_01b", [], "Yes I am.", "botti1_com",[]],  -> On continue avec le dialogue # Commerce
  [anyone|plyr, "botti1_01b", [], "Next time, thank you.", "close_window",[]],  -> Mettre fin au dialogue sans achat

Quelque soit la réponse la "variable dialogue" est à 1

Dialogue partie commerce :
# Commerce
  [anyone, "botti1_com", [(eq,"$suivi_bot1", 0)], "A pair of boots is available.", "botti1_com1",[]],  -> Condition : (eq,"$suivi_bot1", 0) est la "variable commerce", à zéro par défaut la première fois, on peut faire un achat.
  [anyone, "botti1_com", [(eq,"$suivi_bot1", 1)], "I have no more boots available. Come back in a few hours.", "close_window",[]],  -> Condition : la "variable commerce" est à 1, on a déjà fait un achat. La variable sert aussi de tempo (Voir plus haut explication d'un trigger dans le module_simple_triggers.py)
  [anyone|plyr, "botti1_com1", [(store_troop_gold, ":gold", "trp_player"),(ge,":gold", 150)], "I take the boots.", "botti1_cont1",[  -> Condition : avoir 150 deniers, le fanion de fin de ligne "botti1_cont1" permet une continuité en poursuivant avec le dialogue suivant
(assign,"$suivi_bot1", 1),  -> La "variable commerce" passe à 1
(troop_remove_gold, "trp_player", 150),  -> On retire au joueur 150 deniers
(troop_add_item, "trp_player","itm_leather_boots_hm", 0),  -> On obtient la paire de bottes
(call_script, "script_troop_get_player_relation", "$g_talk_troop"),(assign, "$g_talk_troop_relation", reg0),  -> On met en mémoire la relation que l'on a avec Bottino
(try_begin),
  (lt,"$g_talk_troop_relation", 1:cool:-> Si la relation est inférieure à 18
  (call_script, "script_change_player_relation_with_troop", "$g_talk_troop", 6),  -> On augmente la relation de +6
(else_try),  -> Si la relation est égale ou supérieure à 18
  (call_script, "script_change_player_relation_with_troop", "$g_talk_troop", 1),  -> On augmente seulement la relation de +1
(try_end),]],
  [anyone|plyr, "botti1_com1", [(store_troop_gold, ":gold", "trp_player"),(lt,":gold", 150)], "I do not have enough money, I will come back.", "close_window",[]],  -> Condition : On a pas assez d'argent, le dialogue prend fin, la "variable commerce" reste à zéro

Le dialogue suivant est celui avec la "variable dialogue" à 1 (eq,"$bottino_a1", 1).
Quête Mixora : La première partie de la quête ne s'accomplira que si elle est en cours, "variable quête" à 1 (eq,"$qt_mixora_q2", 1) donnée par Mixora, et que l'on a au moins 18 de relation avec Bottino, c'est à dire que l'on a acheté au moins trois paires de bottes !
# Quest Mixora et suite
  [anyone, "start", [(eq,"$g_talk_troop", "trp_bottino"),(eq,"$bottino_a1", 1)], "Greetings {playername}.", "botti1_02",[]],
  [anyone, "botti1_cont1", [], "Yes?", "botti1_02",[]],
  [anyone|plyr, "botti1_02", [(eq,"$qt_mixora_q2", 1),(call_script, "script_troop_get_player_relation", "$g_talk_troop"),(assign, "$g_talk_troop_relation", reg0),  -> Si quête Mixora en cours (eq,"$qt_mixora_q2", 1), mémorisation de la relation avec Bottino
(ge,"$g_talk_troop_relation", 1:cool:], "It is tricky but I must ask you the question.", "botti1_book",[]],  -> Relation égale ou supérieure à 18 -> # Quest Mixora
  [anyone|plyr, "botti1_02", [(eq,"$qt_mixora_q2", 1),(call_script, "script_troop_get_player_relation", "$g_talk_troop"),(assign, "$g_talk_troop_relation", reg0),  -> Si quête Mixora en cours (eq,"$qt_mixora_q2", 1), mémorisation de la relation avec Bottino
(lt,"$g_talk_troop_relation", 1:cool:], "Do you know Mixora?", "botti1_book_no",[]],  -> Si la relation est inférieure à 18
  [anyone|plyr, "botti1_02", [], "I'd like buy boots.", "botti1_com",[]],  -> Commerce
  [anyone|plyr, "botti1_02", [], "Greetings Bottino. See you soon.", "close_window",[]],
# Quest Mixora
  [anyone, "botti1_book", [], "You are a good customer, I listen to you.", "botti1_book1",[]],
  ...
  [anyone, "botti1_book4", [], "I sold it to Recelor. He's still at the tavern in Dhirim. I willingly give you the volume I have kept.", "botti1_book5",[(troop_add_item, "trp_player","itm_book_sorcery_a", 0)]],  -> Conséquence : Obtention du premier livre
  [anyone|plyr, "botti1_book5", [], "That is reasonable. I will try to arrange the case with Mixora.", "botti1_book6",[
(assign,"$qt_mixora_q2", 2),  -> Évolution "variable quête" à 2
(add_quest_note_from_sreg,"qst_mixora_q2",3,"@We retrieved volume 1 from Bottino. The other volume was sold to Recelor at the tavern in Dhirim.", 0),  -> Mise à jour du journal des quêtes
(display_message, "str_quest_log_updated",0xFF00FF00)]],  -> Affichage message de mise à jour en vert (0xFF00FF00)
  [anyone, "botti1_book6", [], "Thank you very much {playername}.", "close_window",[]],  -> Fin dialogue quête
  [anyone, "botti1_book_no", [], "I will not answer this question.", "close_window",[]],  -> Fin dialogue si quête en cours mais pas assez de relation avec Bottino

***************

Dialogue Recelor :
Le paragraphe # Gen est le garde-fou
Le dialogue commence avec le paragraphe # Premier dial, la "variable dialogue" du personnage est à zéro (eq,"$recelor_a1", 0)

Note : Dans un jeu de rôle il y a un principe de base, parler avec tous les personnages que l'on rencontre. Il est donc important que certaines personnes soient placées dans un endroit où on est sûr de les rencontrer. Dans Warband rien de mieux qu'une taverne. Dans ce tuto c'est le cas pour Mixora et Recelor. Il sera plus difficile de tomber sur un personnage situé dans un village, il faut donc une indication pour que l'on rencontre ce personnage. C'est le but du premier dialogue avec Recelor qui va évoquer Bottino (que l'on ait ou pas la quête).

# Premier dial
  [anyone, "start", [(eq,"$g_talk_troop", "trp_recelor"),(eq,"$recelor_a1", 0)], "I am Recelor the resourceful person.", "recel1_01",[]],
  [anyone|plyr, "recel1_01", [], "This is very interesting. I am {playername}. You have very beautiful boots!", "recel1_01a",[]],  -> Une info sur les bottes que porte Recelor
  [anyone, "recel1_01a", [], "Greetings {playername}. Yes my boots are excellent as the maker. Bottino is an artisan bootmaker in the village of Azgad.", "recel1_01b",[]],  -> Info Bottino l'artisan bottier et son village
  [anyone|plyr, "recel1_01b", [], "This is very interesting. I'll go see him!", "recel1_cont1",[(assign,"$recelor_a1", 1)]],  -> Continuité dialogue avec le fanion fin "recel1_cont1", la "variable dialogue" passe à 1

Le dialogue suivant est celui avec la "variable dialogue" à 1 (eq,"$recelor_a1", 1)
# Quest Mixora et suite
  [anyone, "start", [(eq,"$g_talk_troop", "trp_recelor"),(eq,"$recelor_a1", 1)], "{playername}, do you need something?", "recel1_02",[]],
  [anyone, "recel1_cont1", [], "Do you need something?", "recel1_02",[]],  -> Continuité du premier dial
  [anyone|plyr, "recel1_02", [(eq,"$qt_mixora_q2", 2),(eq,"$qt_recel_q1", 0)], "I am looking for a book. Sorcery volume 2.", "recel1_book",[]],  -> Condition : Si quête en cours en ayant déjà parlé à Bottino (eq,"$qt_mixora_q2", 2), on va tenter d'acheter le livre avec nouvelle "variable argent" par défaut à zéro (eq,"$qt_recel_q1", 0)
  [anyone|plyr, "recel1_02", [(eq,"$qt_mixora_q2", 2),(eq,"$qt_recel_q1", 1),(store_troop_gold, ":gold", "trp_player"),(ge,":gold", 1000)], "I have money for the book Sorcery volume 2.", "recel1_book_end",[]],  -> Condition : Si quête en cours en ayant déjà parlé à Bottino (eq,"$qt_mixora_q2", 2), et à Recelor sans avoir assez d'argent (eq,"$qt_recel_q1", 1), et si maintenant on a assez d'argent.
  [anyone|plyr, "recel1_02", [], "Not for the moment. Goodbye.", "close_window",[]],

Dialogue concernant la quête :
# Quest Mixora
  [anyone, "recel1_book", [], "I have this book. I sell it for 1000 denars.", "recel1_book1",[]],  -> Proposition vente livre
  [anyone|plyr, "recel1_book1", [(store_troop_gold, ":gold", "trp_player"),(ge,":gold", 1000)], "It's a bit expensive but I take it.", "recel1_book_end",[]],  -> On assez d'argent pour acheter le livre
  [anyone|plyr, "recel1_book1", [(store_troop_gold, ":gold", "trp_player"),(lt,":gold", 1000)], "It's a bit expensive but I come back with the money.", "close_window",[  -> On a pas assez d'argent
(assign,"$qt_recel_q1", 1),  -> Conséquence : La "variable argent" passe à 1
(add_quest_note_from_sreg,"qst_lounoir_q2",3,"@We retrieved volume 1 from Bottino. We need 1000 denars at the tavern in Dhirim to buy volume 2. Recelor sells it.", 0),  -> Mise à jour journal des quêtes
(display_message, "str_quest_log_updated",0xFF00FF00)]],  -> Affichage message mise à jour
  [anyone, "recel1_book_end", [], "Do not move, I come back with the book.^(Ten minutes later) The book is yours.", "recel1_merci1",[  -> La quête se poursuit avec assez d'argent
(assign,"$qt_mixora_q2", 3),  -> La "variable quête" évolue à 3
(assign,"$qt_recel_q1", 2),  -> La "variable argent" évolue à 2
(troop_remove_gold, "trp_player", 1000),  -> On retire 1000 deniers au joueur
(troop_add_item, "trp_player","itm_book_sorcery_b", 0),  -> On récupère le livre dans son inventaire
(add_quest_note_from_sreg,"qst_lounoir_q2",3,"@We retrieved the two books. The quest is successful. Bring the books to the tavern in Praven to finish it.", 0),  -> Mise à jour succès de la quête dans le journal
(display_message, "str_quest_log_updated",0xFF00FF00)]],  -> Affichage message mise à jour
  [anyone|plyr, "recel1_merci1", [], "Thank you Recelor.", "close_window",[]],  -> Fin de cette partie de la quête


Fin du tuto 2


Tchin !
:twisted:
 
Merci pour le tuto, ça donne envie de créer un bon paquets de quetes similaires (même si ce n'est pas vraiment mon truc)
Je pense que ça va surement cartonner dans le forum Englais s'il est traduit bien-sûr (vu que les autres tutos  sont  atrocement dépassés)
Bon continuation

 
Bonjour BerTolkien,

Superbe travail. Les quêtes ouvrent un nouvelle dimension au jeu, et apportent une meilleure immersion et seconde vie aux mods.

Félicitations, et bonne continuation.

Salutations,
 
Bonjour

J'aurais une petite question ou plutôt quelques unes:

Est-ce qu'il y a un moyen de retrouver parmi tous les fichiers **.py tous les éléments de code d'une quête donnée?


Par exemple retrouver rapidement tout le codage de la première quête donnée par le marchand de Praven.

Est-ce qu'il y a une sorte de clé commune à toutes ces lignes qui nous permettrait de les retrouver dans tous les fichiers concernés par cette quête?

Ou bien faut absolument faire la quête pour repérer le dialogue et les personnages, objet ou but, liés par le scénario.

Merci.  :razz:
 
Bonjour lolitablue,

Oui effectivement, tu peux retrouver tous les éléments d'une quêtes dans les fichiers .PY concernés.
Il suffit que tu fasse une recherche de la quête active que tu souhaites, avec la fonction de quête active. :smile:

Exemple :
(check_quest_active, "qst_track_down_bandits"),

Le nom de la quête suffit pour retrouver rapidement les scripts.

Chaque quête active, au niveau dialogue a cette condition, pour que le personnage fasse référence dans son dialogue. Et pour les autres scripts qui concerne cette quête c'est la même chose. Il y a la condition de la quête pour que le script soit actif.

Tu peux donc trouver le plus fréquemment dans les fichiers suivants :

module_dialogs.py
module_game_menus.py
module_mission_templates.py
module_quests.py
module_scripts.py
module_simple_triggers.py
module_triggers.py

Salutations, :grin:
 
kozure okami said:
Bonjour lolitablue,

Oui effectivement, tu peux retrouver tous les éléments d'une quêtes dans les fichiers .PY concernés.
Il suffit que tu fasse une recherche de la quête active que tu souhaites, avec la fonction de quête active. :smile:

Exemple :
(check_quest_active, "qst_track_down_bandits"),

...

Je te remercie pour tout ces renseignements.

Il y a un truc que je ne comprends pas (petit cerveau)
Où est-ce que je tape ma requête?

(check_quest_active, "qst_track_down_bandits"),

... pour trouver les lignes de code.

Est-ce qu'il faut un logiciel spécifique?

Désolé mais je suis totalement néophyte!

Merci et bonne soirée.


 
c'est une question de mot-clés
Ici c'est  le mot clé qst_track_down_bandits ou même (check_quest_active, "qst_track_down_bandits") que tu dois chercher  (par exemple en en utilisant la fonctionalité de  recherche sur tout les fichiers/dossiers de notepad++ )
 
fladin said:
c'est une question de mot-clés
Ici c'est  le mot clé qst_track_down_bandits ou même (check_quest_active, "qst_track_down_bandits") que tu dois chercher  (par exemple en en utilisant la fonctionalité de  recherche sur tout les fichiers/dossiers de notepad++ )

Ok, j'ai pigé, merci.

J'ai testé la quête "Fournir un sac de sel", ça marche et je vais la décortiquer pour comprendre son fonctionnement.
Pas facile de trouver un sac de sel dans Calradia!! :cool:
 
Hello

lolitablue :
J'ai testé la quête "Fournir un sac de sel", ça marche et je vais la décortiquer pour comprendre son fonctionnement.
Une fois que l'on a compris le principe on peut très vite aller plus loin !
J'ai oublié une commande importante lors des conséquences en fin de quête, enlever l'objet de quête de l'inventaire du joueur : (troop_remove_item, "trp_player", "itm_salt"),
J'ai mis à jour le tuto.

Alphα :
Cool! Faudra s'organiser pour Bannerlord
Je suis tout à fait d'accord avec toi, surtout qu'on ne manque pas d'excellents éléments dans notre communauté franchouillarde !  :shifty:
Mais je sens que cela ne sera pas si facile de l'organiser.
Il est évident que le chef d'orchestre est tout trouvé, notre adorable FantasyWarrior, juste un peu trop dirigiste mais tellement génial !


Bon, je prépare le deuxième tuto.

Tchin !
:twisted:


 
Hello

Voilà ! Le deuxième tuto est prêt ! (J'ai juste les explications des dialogues à terminer, c'est en cours.)

On ajoute une nouvelle quête qui se déroule en deux étapes.
Cela va permettre d'apprendre à jongler avec les différentes variables et à faire évoluer le journal des quêtes à chaque fois qu'une mise à jour est nécessaire.


Tchin !
:twisted:
 
Hello

Le tuto 2 est complet !  :party:

Si vous le testez, n'hésitez pas à me signaler un quelconque problème.
Comme c'est la transposition d'une de mes quêtes, j'ai donc pu faire une erreur d'adaptation.

De plus, si vous avez besoin d'explications complémentaires je vous les fournirais.

Il est aussi possible de changer la fin de la quête par un combat au lieu d'un achat. C'est un peu plus complexe, cela peut faire l'objet d'un tuto 3 !


Tchin !
:twisted:
 
Salut et merci pour tout ce travail.

J'ai repris et corrigé la traduction que j'avais fait sur le tutoriel sur l'ajout d'un dialogue.


Et je suis en train de l'étudier, avec tes tutos, je devrais m'en sortir!!


Bonne journée.  :razz:
 
Back
Top Bottom