Page 1 sur 1

Dialogue compliqué, besoin d'aide

Posté : mer. 16 févr. 2022, 17:41
par deratiseur
Je suis entrain de créer un dialogue plus compliqué que tout ce que j'ai déjà fait pour mes marchands, et je butte sur quelques trucs. Voilà les contextes :

BEGIN Maiq

IF ~~ THEN BEGIN presentation SAY @901
IF ~~ THEN REPLY @902 GOTO maiq
IF ~~ THEN REPLY @903 GOTO dragon
IF ~~ THEN REPLY @9026 DO ~~ Exit (je voudrais que cette dernière réponse termine le dialogue, mais je ne sais le faire que par "celui qui parle donne une réponse du genre "comme vous voudrez" puis quitte le dialogue")
END

IF ~~ THEN BEGIN maiq SAY @9022 GOTO presentation (je voudrais que celui qui parle donne sa réponse et qu'on ne puisse que cliquer sur "continuer", ce qui fait revenir à la liste des propositions.)
END

Posté : mer. 16 févr. 2022, 17:55
par deratiseur
Autant pour moi, Exit doit être en majuscule.

Par contre je butte toujours sur le deuxième point.

Posté : mer. 16 févr. 2022, 20:32
par Machiavélique
deratiseur a écrit :
IF ~~ THEN BEGIN maiq SAY @9022 GOTO presentation (je voudrais que celui qui parle donne sa réponse et qu'on ne puisse que cliquer sur "continuer", ce qui fait revenir à la liste des propositions.)
END

J'ai peut-être mal compris ce que tu souhaites faire mais dans ce cas pourquoi pas tout simplement copier le contenu de "presentation" dans le "maiq" et d'utiliser ensuite un CHAIN ? (Par contre, c'est sûr que ça sera plus lourd que de rediriger directement vers "presentation" depuis le "maiq" comme tu souhaitais le faire)


CHAIN ~NomDuDLG~ maiq
SAY @9022
= @901 // (ou == NomDeLautreDLG @901 si changement de PNJ)
++ @902 + maiq
++ @903 + dragon
++ @9026 DO ~~ EXIT

J'ai pas testé mais sauf erreur dans la syntaxe, dans l'idée ça devrait marcher pour un .d donc il doit bien y avoir moyen de l'adapter à un .baf

Mais peut-être que j'ai pas du tout compris ce que tu souhaitais faire...

Posté : mer. 16 févr. 2022, 21:13
par deratiseur
Machiavélique a écrit :J'ai peut-être mal compris ce que tu souhaites faire mais dans ce cas pourquoi pas tout simplement copier le contenu de "presentation" dans le "maiq" et d'utiliser ensuite un CHAIN ? (Par contre, c'est sûr que ça sera plus lourd que de rediriger directement vers "presentation" depuis le "maiq" comme tu souhaitais le faire)


CHAIN ~NomDuDLG~ maiq
SAY @9022
= @901 // (ou == NomDeLautreDLG @901 si changement de PNJ)
++ @902 + maiq
++ @903 + dragon
++ @9026 DO ~~ EXIT

J'ai pas testé mais sauf erreur dans la syntaxe, dans l'idée ça devrait marcher pour un .d donc il doit bien y avoir moyen de l'adapter à un .baf

Mais peut-être que j'ai pas du tout compris ce que tu souhaitais faire...
Heu... tout simplement parce que je n'utilise jamais CHAIN car je n'y comprend rien. Et ++ non plus.


En fait je veux que le gars se présente, et qu'on puisse lui demander tout en tas de trucs. A chaque fois, il donne sa réponse, puis le joueur clique sur "continuer" et le dialogue revient à la liste des questions possibles (dont une, bien sur, dit "au revoir" suivi de exit)

Posté : mer. 16 févr. 2022, 21:51
par Freddy_Gwendo
Pas sûr d'avoir tout compris, mais...
deratiseur a écrit :Je suis entrain de créer un dialogue plus compliqué que tout ce que j'ai déjà fait pour mes marchands, et je butte sur quelques trucs. Voilà les contextes :

Code : Tout sélectionner

BEGIN Maiq

IF ~~ THEN BEGIN presentation    SAY @901
    IF ~~ THEN REPLY @902 GOTO maiq
    IF ~~ THEN REPLY @903 GOTO dragon
    IF ~~ THEN REPLY @9026 DO ~~ Exit (je voudrais que cette dernière réponse termine le dialogue, mais je ne sais le faire que par "celui qui parle donne une réponse du genre "comme vous voudrez" puis quitte le dialogue")
END

IF ~~ THEN BEGIN maiq    SAY @9022 GOTO presentation (je voudrais que celui qui parle donne sa réponse et qu'on ne puisse que cliquer sur "continuer", ce qui fait revenir à la liste des propositions.)
END

Code : Tout sélectionner

IF ~~ THEN BEGIN presentation
  SAY ~Bonjour~
    IF ~~ THEN REPLY ~choix 1~ GOTO choix1
    IF ~~ THEN REPLY ~choix 2~ GOTO choix2
    IF ~~ THEN REPLY ~choix n~ GOTO choixn
    IF ~~ THEN REPLY ~Au revoir~ EXIT // Note : DO ~~ ne sert à rien puisqu'il ne crée pas d'action.
END

IF ~~ THEN choix1
  SAY ~Réponse1~
    IF ~~ THEN GOTO presentation
END

IF ~~ THEN choix2
  SAY ~Réponse2 pas content : arrête la discussion.~
    IF ~~ THEN EXIT
END
quant aux + et ++ :

Code : Tout sélectionner

[color="#00FFFF"]++[/color] ~choix 1~ [color="#00FFFF"]+[/color] reponse1 =[color="#00FFFF"] IF ~~ THEN REPLY[/color] ~choix 1~ [color="#00FFFF"]GOTO[/color] reponse1

Code : Tout sélectionner

[color="#00FFFF"]+[/color] ~condition1~ [color="#00FFFF"]+[/color] ~choix 1~ [color="#00FFFF"]+[/color] reponse1 = [color="#00FFFF"]IF[/color] ~condition1~ [color="#00FFFF"]THEN REPLY[/color] ~choix 1~ [color="#00FFFF"]GOTO[/color] reponse1
En gros, + remplace IF, THEN REPLY, GOTO.

Posté : mer. 16 févr. 2022, 23:06
par deratiseur
Bon, j'ai essayé, main mon PNJ n'a toujours rien à me dire.

Dialogue :
BEGIN Maiq

IF ~~ THEN presentation SAY ~Bonjour, aventuriers. M'aiq sait beaucoup de choses. De quoi voudriez vous que M'aiq vous parle ?~
IF ~~ THEN REPLY ~M'aiq~ GOTO maiq2
IF ~~ THEN REPLY ~Je n'ai pas le temps de discuter. Au revoir.~ EXIT
END

IF ~~ THEN presentation2 SAY ~Autre chose ?~ (ce bloc est la copie du premier pour que la phrase d'introduction ne soit pas la même)
IF ~~ THEN REPLY ~M'aiq~ GOTO maiq2
IF ~~ THEN REPLY ~Je n'ai pas le temps de discuter. Au revoir.~ EXIT
END

IF ~~ THEN maiq2 SAY ~Le père de M'aiq s'appelait également M'aiq. Tout comme le père du père de M'aiq. Du moins, c'est ce que disait son père.~
IF ~~ THEN GOTO presentation2
END

Posté : jeu. 17 févr. 2022, 00:37
par Machiavélique
Que Freddy_Gwendo me corrige si je me trompe mais normalement tu dois avoir un BEGIN ~NomDuDLG~ si tu désires créer un dialogue à partir de zéro (donc un BEGIN ~Maiq~ écrasera un eventuel DLG ~Maiq~ existant, il faut un APPEND ou un CHAIN pour ajouter du contenu à un DLG).
J'ai jamais testé ou vu de BEGIN sans les tildes entourant le nom du DLG (peut-être que ça peut fonctionner sans je ne sais pas)

Pour moi il faudrait écrire :

Code : Tout sélectionner

BEGIN ~Maiq~ [color="#00FF00"]// Création du DLG Maiq[/color]

IF ~NumTimesTalkedTo(0)~ THEN BEGIN presentation [color="#00FF00"]// Déclaration du label presentation (unique au DLG Maiq). J'ai rajouté un NumTimesTalkedTo(0)* [/color]
SAY ~Bonjour, aventuriers. M'aiq sait beaucoup de choses. De quoi voudriez vous que M'aiq vous parle ?~ [color="#00FF00"]// Phrase prononcée par le perso auquel le DLG est attaché[/color]
   IF ~~ THEN REPLY ~M'aiq~ GOTO maiq2 [color="#00FF00"]// 1er choix de réponse du joueur (non imposée par une condition et menant au label maiq2)[/color]
   IF ~~ THEN REPLY ~Je n'ai pas le temps de discuter. Au revoir.~ EXIT [color="#00FF00"]// 2ème choix de réponse du joueur (non imposée par une condition et amenant à un fin de dialogue)[/color]
END [color="#00FF00"]// Fin du label presentation[/color]

IF ~~ THEN presentation2 [color="#00FF00"]// Déclaration du label presentation2 (unique au DLG Maiq)[/color]
SAY ~Autre chose ?~ [color="#00FF00"]// (ce bloc est la copie du premier pour que la phrase d'introduction ne soit pas la même)[/color]
   IF ~~ THEN REPLY ~M'aiq~ GOTO maiq2 [color="#00FF00"]// 1er choix de réponse du joueur (non imposée par une condition et menant au label maiq2)[/color]
   IF ~~ THEN REPLY ~Je n'ai pas le temps de discuter. Au revoir.~ EXIT [color="#00FF00"]// 2ème choix de réponse du joueur (non imposée par une condition et amenant à un fin de dialogue)[/color]
END [color="#00FF00"]// Fin du label presentation2[/color]

IF ~~ THEN maiq2 [color="#00FF00"]// Déclaration du label maiq2 (unique au DLG Maiq)[/color]
SAY ~Le père de M'aiq s'appelait également M'aiq. Tout comme le père du père de M'aiq. Du moins, c'est ce que disait son père.~
IF ~~ THEN GOTO presentation2 [color="#00FF00"]// On va au label presentation2 en devant cliquer sur "continuer" (ce que tu souhaitais faire) [/color]
END 

[color="#00FF00"]/*******************************************************************************************************************************************************************************************************************************************/
/* J'ai rajouté un NumTimesTalkedTo(0) car je ne suis pas sûr que ça marche s'il n'y a pas une condition (même avec un BEGIN).                                                                                                             */
/* S'il n'y a pas de condition le code n'est pas lu et si une condition est vraie alors le code est lu et ensuite il recommence à lire le fichier depuis le début (donc mettre une condition toujours vraie serait une très mauvaise idée. */
/* Avec NumTimesTalkedTo(0) la condition ne sera vraie que si c'est la toute première fois qu'on s'adresse au personnage, il faudra ensuite gérer le reste avec une variable (ou faire autrement que NumTimesTalkedTo(0))                  */
/*******************************************************************************************************************************************************************************************************************************************/[/color]
Tu rentres dans un label seulement au moyen d'un GOTO (comme GOTO presentation2) OU si la condition qui régit le label existe et est vraie au moment où le script est lu. Quand tu tombes sur un EXIT le script ne sort pas pour continuer à lire ce qu'il y a en dessous, il recommence à relire le script depuis le début en cherchant la première condition de label qui sera vraie afin de l'exécuter (si pas de condition il continuera à lire le script en descendant jusqu'à la fin).

Posté : jeu. 17 févr. 2022, 07:52
par deratiseur
Du coup j'en conclu qu'il faut mettre une condition à chaque fois pour que ça fonctionne.
Mon dialogue avec Deckard Cain pourtant très simple :
BEGIN pxl2deck

IF ~~ THEN BEGIN proposition SAY @80691121
++ @80691122 DO ~StartStore("pxl2deck",LastTalkedToBy())~ EXIT
++ @80691123 EXIT
END
rendait Deckard muet alors que :
BEGIN pxl2deck

IF ~true~ THEN BEGIN proposition SAY @80691121
++ @80691122 DO ~StartStore("pxl2deck",LastTalkedToBy())~ EXIT
++ @80691123 EXIT
END
Lui rend la parole

Note : BEGIN ~pxl2deck~ ne change rien.

Et chose bizarre :
BEGIN ~pxl2maiq~

IF ~NumTimesTalkedTo(0)~ THEN presentation SAY @901
IF ~~ THEN REPLY @905 GOTO maiq2
IF ~~ THEN REPLY @903 EXIT
END

IF ~~ THEN presentation2 SAY @902
IF ~~ THEN REPLY @905 GOTO maiq2
IF ~~ THEN REPLY @903 EXIT
END

IF ~~ THEN maiq2 SAY @906
IF ~~ THEN GOTO presentation2
END
Fait qu'il ne me parle qu'une fois puis devient muet. je dois corriger ça avec
BEGIN ~pxl2maiq~

IF ~NumTimesTalkedTo(0)~ THEN presentation SAY @901
IF ~~ THEN REPLY @905 GOTO maiq2
IF ~~ THEN REPLY @903 EXIT
END

IF ~!NumTimesTalkedTo(0)~ THEN presentation2 SAY @902
IF ~~ THEN REPLY @905 GOTO maiq2
IF ~~ THEN REPLY @903 EXIT
END

IF ~~ THEN maiq2 SAY @906
IF ~~ THEN GOTO presentation2
END
qui marche mais qui est bien lourd, et je n'y vois pas de raison logique.

Enfin, ça marche en bidouillant, c'est tout ce qui compte. merci à vous, j'avance.

Posté : jeu. 17 févr. 2022, 18:59
par deratiseur
Je reviens à la charge avec un problème de dialogue d'un autre genre. (note, mon dialogue fonctionne :) c'est juste un problème technique)

Soit la boucle à condition :
IF ~~ THEN sousort SAY @9023
IF ~~ THEN REPLY @9024 GOTO 1 (réponse toujours disponible)
IF ~~ THEN REPLY @9026 GOTO 2 (réponse toujours disponible)
IF ~Global("maiqcerq","LOCALS",1) CheckStatGT(LastTalkedToBy(),15,WIS)~ THEN REPLY @9028 GOTO 3 (réponse disponible SI SAGESSE>15 & dialogue "2" été utilisé)
IF ~Global("maiqcerqsec","LOCALS",1)~ THEN REPLY @9030 GOTO 4 (réponse disponible SI le dialogue "3" à été utilisé)
IF ~~ THEN REPLY @904 GOTO presentation2 (réponse de au-revoir pour revenir au menu général)
END

IF ~~ THEN 1 SAY @9025
IF ~~ THEN GOTO sousort
END

IF ~~ THEN 2 SAY @9027
IF ~~ THEN DO ~SETGlobal("maiqcerq","LOCALS",1)~ GOTO sousort
END

IF ~~ THEN 3 SAY @9029
IF ~~ THEN DO ~SETGlobal("maiqcerqsec","LOCALS",1)~ GOTO sousort
END

IF ~~ THEN 4 SAY @9031
IF ~~ THEN GOTO sousort
END
Pourquoi après avoir lu la réponse 3 et être revenu au menu de base je n'ai pas la proposition de réponse "4" ? -> mais si je redemande la 3 en revenant oui j'ai la proposition 4 -> je dois donc demander deux fois la 3 pour avoir la 4. WTF ?

Posté : jeu. 17 févr. 2022, 19:16
par Freddy_Gwendo
Le problème vient de la façon dont le moteur du jeu enregistre les modifications de variables. En gros, pour que la modification de variable prenne effet, il faut au moins deux validations de dialogues.

Pour que le dialogue suivant fonctionne

Code : Tout sélectionner

0 = bonjour à vous
    enchanté de vous connaître DO variable_dejavu = 1 GOTO 1
    IF variable_dejavu = 1 On ne s'est pas déjà rencontré GOTO 2
    ...

1 = De même. Je m'appelle Schmoll. Et vous ?
   reponse 1 GOTO3
   reponse 2 GOTO 0

Il faut l'écrire comme ceci :

Code : Tout sélectionner

0 = bonjour à vous
    enchanté de vous connaître DO variable_dejavu = 1 GOTO 1
    IF variable_dejavu = 1 On ne s'est pas déjà rencontré GOTO 2
    ...

1 = De même.
   GOTO 1b

1b = Je m'appelle Schmoll. Et vous ?
   reponse 1 GOTO3
   reponse 2 GOTO 0

Il existe une autre possibilité qui nécessite l'installation de ToBex et/ou un jeu EE. Ajouter le FLAG BIT 9 (Execute immediate) à la réponse.

Posté : jeu. 17 févr. 2022, 20:11
par Freddy_Gwendo
Édit : sinon, les bons triggers pour ton dialogue sont NumTimesTalkedTo(0) et NumTimesTalkedToGT(0)

Posté : jeu. 17 févr. 2022, 20:13
par Machiavélique
deratiseur a écrit :Du coup j'en conclu qu'il faut mettre une condition à chaque fois pour que ça fonctionne.
Mon dialogue avec Deckard Cain pourtant très simple
À ma connaissance oui. Il faut au moins que quelque part une condition soit vraie pour rentrer dans un label et ensuite faire tout ce que tu veux. Tu pourrais très bien ne mettre aucune condition dans ton DLG ~maiq~ et accéder à des labels de ~maiq~ depuis un autre DLG avec un EXTERN ~Maiq~ presentation (Mais cela signifie que tu aurais alors dans cet autre DLG une condition de label devant être vraie pour rentrer dans ce label et exécuter le code te permettant d'accéder au label presentation du DLG ~Maiq~. Donc même si en apparence tu pourrais te passer de condition dans ~Maiq~ tu serais quand même obligé d'en avoir au moins une ailleurs. Donc il n'y a besoin d'en mettre à chaque fois, mais juste 1 à chaque fois qu'il y a une partie de script que tu souhaites lancer.)

Ce que tu as écrit dans ton 2nd post avec les variables locales est pour moi la meilleure façon de faire. L'idée du NumTimesTalkedTo(0) est justement de désigner le premier label qui doit être exécuté et ensuite de "retenir" que cela s'est produit en utilisant une variable locale. Grâce à cette variable locale que tu peux faire évoluer tu peux faire en sorte que la prochaine fois que tu lui parles, soit tu relances le même dialogue, soit tu en lances un autre, soit tu fais complètement autre chose, les possibilités sont presque infinies...

Utiliser IF ~true~ ou IF ~!NumTimesTalkedTo(0)~ ou tout autre chose qui, une fois passée à true restera à true, risque de t'exposer à d'autres problèmes lorsque tu rajouteras des choses en plus que ce soit directement dans ton .d/.baf ou au moyen d'une extension. Pour moi il vaut mieux l'éviter mais ça dépend de ce que tu ajouteras et comment tu l'ajouteras.


deratiseur a écrit :Je reviens à la charge avec un problème de dialogue d'un autre genre. (note, mon dialogue fonctionne :) c'est juste un problème technique)

Pourquoi après avoir lu la réponse 3 et être revenu au menu de base je n'ai pas la proposition de réponse "4" ? -> mais si je redemande la 3 en revenant oui j'ai la proposition 4 -> je dois donc demander deux fois la 3 pour avoir la 4. WTF ?

C'est (malheureusement) normal. Tu ne peux pas modifier la valeur d'une variable et checker immédiatement après sa valeur. Le moteur de jeu semble nécessiter un certain laps de temps avant de prendre en compte cette nouvelle valeur. C'est comme si il affichait déjà le label sousort (ou qu'il avait peut-être déjà anticiper/préparer son affichage) avant de terminer de mettre à jour la valeur ta variable "maiqcerqsec". Ça doit te faire pareil avec "maiqcerq", si tu vas sur 2 et que tu retournes sur 1 tu ne devrais pas avoir ta proposition. Mais si tu vas ensuite sur 1 OU sur 2 (car toujours disponible) alors ta proposition devrait ensuite s'afficher.
Je connais bien le problème, j'y ai été aussi confronté lors de mes tests, sauf qu'en y réfléchissant je n'avais pas besoin de vérifier la valeur d'une variable juste après l'avoir modifiée (ce qui est dans un sens plutôt logique car si je viens de la modifier c'est que je connais sa valeur).

Essaie de rajouter un wait(5) juste pour voir et si ça marche essaie de diminuer sa valeur avec un wait(1)
(Mais j'ai absolument aucune idée de si ça va permettre de contourner le problème ou non)

Code : Tout sélectionner

IF ~~ THEN 2 SAY @9027
IF ~~ THEN DO ~SETGlobal("maiqcerq","LOCALS",1) Wait(5)~ GOTO sousort
END

IF ~~ THEN 3 SAY @9029
IF ~~ THEN DO ~SETGlobal("maiqcerqsec","LOCALS",1) Wait(5)~ GOTO sousort
END

Posté : jeu. 17 févr. 2022, 20:20
par deratiseur
Merci.

De toute façon les dialogues ça me rend FOU. Le dialogue d'Agenor, le tenancier de l'interplan, fonctionnait. Il a suffit que je lui rajoute un bloc pour le dialogue du Chaudron et boum, marche plus. FOU !!!!!

Posté : jeu. 17 févr. 2022, 20:29
par Freddy_Gwendo
Je viens de retrouver un topic échangé sur ce sujet avec Argent77 avant une mise à jour de WeiDU, qui m'a permis de valider l'écriture de mes dialogues prenant en compte la modification instantannée de variables ET compatible oBG2 et BG2:EE. ;)

Posté : jeu. 17 févr. 2022, 22:49
par Machiavélique
Merci pour ce partage :)
Ça a l'air très intéressant, si je comprends bien on peut ajouter un "FLAGS" après des actions afin de préciser les manières dont ces actions doivent être exécutées (les manières car on peut en mettre plusieurs et les additionner).
Ce "FLAGS" serait sur 11 bits et il existerait quelque part un tableau (que je n'ai pas trouvé) précisant l'effet que procure chaque bit.

Je serais bien curieux de savoir à quoi servent les bits 0 à 8 (étrangement j'ai rien trouvé dans le bigg README de WeiDU).
J'aurai d'ailleurs trouvé plus parlant une notation allant de 1 à 11 plutôt que de 0 à 10 (c'est tout de suite plus parlant au niveau des poids)

En tout cas ça a l'air assez simple d'utilisation (en supposant que j'ai bien compris).


Quand tu auras l'occasion dératiseur, essaie de voir si ça résout ton problème :

Code : Tout sélectionner

IF ~~ THEN 2 SAY @9027
IF ~~ THEN DO ~SETGlobal("maiqcerq","LOCALS",1)~ FLAGS ~%BIT9%~ GOTO sousort
END

IF ~~ THEN 3 SAY @9029
IF ~~ THEN DO ~SETGlobal("maiqcerqsec","LOCALS",1)~ FLAGS ~%BIT9%~ GOTO sousort
END

Posté : ven. 18 févr. 2022, 07:17
par deratiseur
Comme je m'en doutais
IF ~~ THEN rune SAY @9014
IF ~~ THEN DO ~SetGlobal("maiqrune","LOCALS",1)~ FLAGS ~%BIT9%~ GOTO malabs
END
refuse de s'installer et indique une erreur au niveau de ~%BIT9%~ sur une installation Old BG2.

Je devrais installer TobEx ou moder sur BG2EE pour que ça marche. Et donc crée une dépendance. C'est mort.

Posté : ven. 18 févr. 2022, 08:26
par Freddy_Gwendo
Tu l'as compilé avec EVALUATE_BUFFER ?

Posté : ven. 18 févr. 2022, 16:42
par deratiseur
J'ai essayé avec un TP2 tout simple :
BEGIN ~Routinedetest~
OUTER_SET INSTANT_ACTIONS = BIT9
COMPILE ~Derats_Magasin_2/Dialog~
et le dialogue refuse de s'intaller, il coince à la ligne :
IF ~~ THEN rune SAY @9014
IF ~~ THEN DO ~SetGlobal("maiqrune","LOCALS",1)~ FLAGS ~%BIT9%~ GOTO malabs
END
Ce n'est pas mieux avec :
IF ~~ THEN rune SAY @9014
IF ~~ THEN DO ~SetGlobal("maiqrune","LOCALS",1)~ FLAGS ~%INSTANT_ACTIONS%~ GOTO malabs
END
Et pas mieux avec le BIT0.

Posté : ven. 18 févr. 2022, 18:54
par Machiavélique
Honnêtement... Weidu c'est pas ma tasse de thé, difficile de t'aider là-dessus...

Je ne vois pas le EVALUATE_BUFFER préconisé par Freddy_Gwendo. Je ne comprends pas très bien la doc à ce sujet pour en déduire comment l'exploiter correctement bien que j'aie des idées mais... je me demande si on ne pourrait pas s'en passer en écrivant plutôt :

Code : Tout sélectionner

IF ~~ THEN 2 SAY @9027
IF ~~ THEN DO ~SETGlobal("maiqcerq","LOCALS",1)~ FLAGS 512 GOTO sousort
END

IF ~~ THEN 3 SAY @9029
IF ~~ THEN DO ~SETGlobal("maiqcerqsec","LOCALS",1)~ FLAGS 512 GOTO sousort
END
Sinon... plus simplement si tu veux quelque chose qui marche dans ton cas précis sans t'embêter tu peux faire :

Code : Tout sélectionner

IF ~~ THEN sousort SAY @9023 [color="#00FF00"]// Avec une condition pour le label ici SAUF si tu accèsdes préalablement à de label via un GOTO[/color]
IF ~~ THEN REPLY @9024 GOTO 1 [color="#00FF00"]// (réponse toujours disponible)[/color]
IF ~~ THEN REPLY @9026 [color="#FF0000"]DO ~SETGlobal("maiqcerq","LOCALS",1)~[/color] GOTO 2 [color="#00FF00"]// (réponse toujours disponible)[/color]
IF ~Global("maiqcerq","LOCALS",1) CheckStatGT(LastTalkedToBy(),15,WIS)~ THEN REPLY @9028 [color="#FF0000"]DO ~SETGlobal("maiqcerqsec","LOCALS",1)~[/color] GOTO 3 [color="#00FF00"]// (réponse disponible SI SAGESSE>15 & dialogue "2" été utilisé)[/color]
IF ~Global("maiqcerqsec","LOCALS",1)~ THEN REPLY @9030 GOTO 4 [color="#00FF00"]// (réponse disponible SI le dialogue "3" à été utilisé)[/color]
IF ~~ THEN REPLY @904 GOTO presentation2 [color="#00FF00"]// (réponse de au-revoir pour revenir au menu général)[/color]
END

IF ~~ THEN 1 SAY @9025
IF ~~ THEN GOTO sousort
END

IF ~~ THEN 2 SAY @9027
IF ~~ THEN GOTO sousort
END

IF ~~ THEN 3 SAY @9029
IF ~~ THEN GOTO sousort
END

IF ~~ THEN 4 SAY @9031
IF ~~ THEN GOTO sousort
END 

C'est une solution qui ne pourra pas fonctionner dans tous les cas figures (d'où l'intérêt de trouver un moyen de passer par le FLAGS 512 comme le préconise Freddy_Gwendo) mais pour ce que tu souhaites faire, ça ça devrait marcher.

Posté : ven. 18 févr. 2022, 22:11
par Freddy_Gwendo
Essaie avec COMPILE ~Derats_Magasin_2/Dialog~ EVALUATE_BUFFER.

Posté : sam. 19 févr. 2022, 07:43
par deratiseur
De retour

Avec EVALUATE_BUFFER ça s'installe mais ça ne marche pas, soit j'ai toujours le bug de la double demande soit en bidouillant entre BIT0, BIT9 ou ~%INSTANT_ACTIONS%~ ça "marche" avec 3-4 secondes de temps d’attente quand je demande la réponse qui utilise le flag.

Mais je met le sujet en "Résolu" et je suis content de vous apprendre que j’ai enfin un Mai'q qui parle comme je l'entendais. La solution étai pourtant très simple et c'est Machiavélique qui y a pensé : mettre à jour la valeur avant de donner la réponse, la réponse servant de deuxième appel.
IF ~~ THEN REPLY @9026 DO ~SETGlobal("maiqcerq","LOCALS",1)~ GOTO 2
à résolu mon deuxième problème :)

Posté : sam. 19 févr. 2022, 08:28
par Freddy_Gwendo
Pour ce genre de manip, il faut TobEx en prérequis et utiliser l'action DialogueSetGlobal qui est prévue pour. Pour rendre le code compatible avec EE, consulter le lien plus haut. ;)