Page 1 sur 1
Gestion des dialogues et structure du code
Posté : mer. 24 avr. 2013, 23:10
par Cocrane
Le but étant de ne plus saisir le code, j'ai regardé comment il était fait et j'ai quelques questions.
Le fichier de dialogue s'organise de la manière suivante sauf erreur de ma part
nom fichier de dialogue
BLOCK 1
SOUS BLOCK 1
SOUS BLOCK 2
Etc...
BLOCK 2
SOUS BLOCK 1
SOUS BLOCK 2
Etc...
pour le Block ca donne:
BLOCK
IF ~condition(s)~ THEN BEGIN ~nom de block~
SAY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
END
pour le sous block ca donne:
IF ~condition(s)~ THEN /* Sous block */
REPLY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
DO ~action(s)~
GOTO ~nom de block~
EXTERN [nom fichier de dialogue]nom de block
EXIT
END
Les deux ensembles:
IF ~condition(s)~ THEN BEGIN ~nom de block~
SAY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
IF ~condition(s)~ THEN /* Sous block */
REPLY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
DO ~action(s)~
GOTO ~nom de block~
EXTERN [nom fichier de dialogue]nom de block
EXIT
END
IF ~condition(s)~ THEN /* Sous block */
REPLY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
DO ~action(s)~
GOTO ~nom de block~
EXTERN [nom fichier]nom de block
EXIT
END
Etc...
END
Questions
1-Le Mot clé est il toujours exprimé exprimé une seule fois par sous block?
2-Peut on avoir une conditon supplémentaire pour SAY?
IF ~condition(s)~ THEN BEGIN ~nom de block~
IF ~condition(s)~ THEN SAY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
IF ~condition(s)~ THEN /* Sous block */
REPLY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
DO ~action(s)~
GOTO ~nom de block~
EXTERN [nom fichier de dialogue]nom de block
EXIT
END
etc...
END
Plusieurs SAY dans un block?
Exemple:
IF ~condition(s)~ THEN BEGIN ~nom de block~
IF ~condition(s)~ THEN SAY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
IF ~condition(s)~ THEN SAY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
Etc...
END
Ou
IF ~condition(s)~ THEN BEGIN ~nom de block~
SAY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
IF ~condition(s)~ THEN /* Sous block */
REPLY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
SAY #indice fichier dialogue.TLK ~/* Texte correspondant du fichier dialogue TLK*/
Etc...
END
Cocrane
Posté : jeu. 25 avr. 2013, 01:14
par Freddy_Gwendo
Tiens, c'est marrant, je suis justement en plein dans la rédaction de certains dialogues !
Comme je suis chaud, je vais essayer de te répondre.
Tout d'abord, si je reprends ta terminologie, les sous blocs ne se terminent jamais par un "END", mais par
EXIT,
GOTO Bloc du même dialogue
EXTERN ~Autre Fichier de Dialogue~ Bloc (de cet autre fichier).
Sinon, le plus simple est de prendre des exemples de ce que suis en train de pondre :
Oui, on peut multiplier les SAY dans une même ligne :
Code : Tout sélectionner
IF ~NumTimesTalkedTo(0) Global("GWGwendoMet","GLOBAL",0)~ THEN BEGIN Solaire.Hello
SAY @3900000 = @3900001
IF ~~ THEN REPLY @3900002 DO ~SetGlobal("GWGwendoMet","GLOBAL",1)~ GOTO Solaire.Qui
IF ~~ THEN REPLY @3900003 DO ~SetGlobal("GWGwendoMet","GLOBAL",1)~ GOTO Solaire.Quoi
IF ~~ THEN REPLY @3900004 DO ~SetGlobal("GWGwendoMet","GLOBAL",1)~ GOTO Solaire.Insulte
END
Non, on ne peut pas mettre de SAY dans les sous-blocs, mais uniquement des REPLY. Les conditions ne sont codées que pour le Bloc (comme dans l'exemple précédent) ou que pour chaque sous-bloc :
Code : Tout sélectionner
IF ~~ THEN BEGIN Solaire.LastChance
SAY @3900012
IF ~~ THEN REPLY @3900007 GOTO Solaire.Bataille
IF ~Class(Player1,PALADIN_ALL)~ THEN REPLY @3900013 GOTO Solaire.Bye1_Paladin
IF ~!Class(Player1,PALADIN_ALL)~ THEN REPLY @3900013 GOTO Solaire.Bye1_NonPaladin
IF ~Global("GWGwendoHist","GLOBAL",0)~ THEN REPLY @3900002 GOTO Solaire.Qui
IF ~Global("GWGwendoQuoi","GLOBAL",0)~ THEN REPLY @3900003 GOTO Solaire.Quoi
END
Par ailleurs, on peut tout-à-fait ne pas donner de réponse à un sous-bloc. Ici, pas de choix de réponses, mais une liste d'actions et fin du dialogue :
Code : Tout sélectionner
IF ~~ THEN BEGIN Solaire.Bye1_Paladin // 1° Refus
SAY @3900014
IF ~~ THEN DO ~IncrementGlobal("GWGwendoNO","GLOBAL",1) PlaySound("EFF_HAND") Wait(1) AddJournalEntry(@3500901,INFO) ForceSpell(Myself,DRYAD_TELEPORT)~ EXIT
END
Je ne sais pas si j'ai été clair, mais il se fait tard et je vais rejoindre l'amie Morphée.
En espérant que ça aura quand même permis de te faire avancer.
PS : j'ai oublié de te remercier pour le lien que tu m'as communiqué en MP.
Posté : sam. 27 avr. 2013, 13:14
par Cocrane
Salut Freddy,
merci pour ton retour.
"SAY @3900000 = @3900001"
> je ne connais pas ce type de saisie. On point sur deux indices texte d'un fichier tra qui seront à afficher en une seule fois ou en deux fois via une validation du joueur pour avoir la suite?
1 seul SAY par block et sa condition dépend de celle du BLOCK.
Je pense que tu as répondu à mes questions.
Pour le lien, pas de soucis. J'espère que tu trouveras des images à ton gout!
Cocrane
Posté : sam. 27 avr. 2013, 13:39
par Freddy_Gwendo
Cocrane a écrit :
"SAY @3900000 = @3900001"
> je ne connais pas ce type de saisie. On point sur deux indices texte d'un fichier tra qui seront à afficher en une seule fois ou en deux fois via une validation du joueur pour avoir la suite?
En fait, les deux textes s'affichent l'un à la suite de l'autre.
Ainsi,
Code : Tout sélectionner
IF ~NumTimesTalkedTo(0) Global("GWGwendoMet","GLOBAL",0)~ THEN BEGIN Solaire.Hello
SAY @3900000 = @3900001
IF ~~ THEN REPLY @3900002 DO ~SetGlobal("GWGwendoMet","GLOBAL",1)~ GOTO Solaire.Qui
IF ~~ THEN REPLY @3900003 DO ~SetGlobal("GWGwendoMet","GLOBAL",1)~ GOTO Solaire.Quoi
IF ~~ THEN REPLY @3900004 DO ~SetGlobal("GWGwendoMet","GLOBAL",1)~ GOTO Solaire.Insulte
END
est l'équivalent de
Code : Tout sélectionner
IF ~NumTimesTalkedTo(0) Global("GWGwendoMet","GLOBAL",0)~ THEN BEGIN Solaire.Hello
SAY @3900000
IF ~~ THEN GOTO Solaire.HelloSuite
END
IF ~~ THEN BEGIN Solaire.HelloSuite
SAY @3900001
IF ~~ THEN REPLY @3900002 DO ~SetGlobal("GWGwendoMet","GLOBAL",1)~ GOTO Solaire.Qui
IF ~~ THEN REPLY @3900003 DO ~SetGlobal("GWGwendoMet","GLOBAL",1)~ GOTO Solaire.Quoi
IF ~~ THEN REPLY @3900004 DO ~SetGlobal("GWGwendoMet","GLOBAL",1)~ GOTO Solaire.Insulte
END
Dans la fenêtre de dialogue, tu obtiendrais ceci :
"
Salutations, Enfant de Bhaal ! Je suis heureuse de te retrouver en pleine forme. Alors, où en es-tu de tes pérégrinations ? Tes allers et venues commencent à faire du bruit, ici-bas..."
[ENTER]
"
Voyons donc où tu en es de tes faits d'armes..."
C'est donc une manière de coder pour fainéant comme moi qui souhaite ne pas multiplier les blocs inutiles qui s'enchaînent sans possibilité de réponses ou d'actions quelconques. Et je dois avouer qu'il m'arrive d'en abuser en regroupant ainsi jusqu'à une demi-douzaine de strings.
Posté : sam. 27 avr. 2013, 20:24
par Isaya
Cette capacité est décrite dans la doc WeiDU dans le
tutorial sur Multisay. Elle sert avant tout à découper un texte long en plusieurs parties pour le rendre plus digeste.
On peut aussi préciser que c'est un cas particulier du SAY ou du CHAIN, ça ne marche pas dans des réponses.
Au final, dans le fichier DLG, cela se traduit par le bout de code qu'a écrit Freddy. Autrement dit, quand tu décompiles un dialogue pour le visualiser dans ton éditeur, tu ne peux plus revenir à cette forme condensée.
Posté : dim. 28 avr. 2013, 14:02
par Cocrane
Freddy, Isaya> merci pour vos éclaircissements. Je vais donc gérer ce cas dans l'éditeur.
Isaya> tu dis "quand tu décompiles un dialogue pour le visualiser dans ton éditeur, tu ne peux plus revenir à cette forme condensée"
Je ne vois pas où est le point de blocage. Du coup, je pense que je n'ai pas compris ta remarque.
Cocrane
Posté : dim. 28 avr. 2013, 15:15
par Isaya
Cocrane a écrit :Isaya> tu dis "quand tu décompiles un dialogue pour le visualiser dans ton éditeur, tu ne peux plus revenir à cette forme condensée"
Je ne vois pas où est le point de blocage. Du coup, je pense que je n'ai pas compris ta remarque.
Il me semble que ton éditeur gère actuellement l'affichage des dialogues existants. Dans ce cas, l'utilisation de WeiDU pour visualiser un fichier DLG construit avec le SAY multiple conduira à la création des deux blocs enchaînés qu'a indiqué Freddy. Autrement dit le processus n'est pas réversible : on peut pas revenir au code WeiDU (.D) initial à partir d'un fichier DLG. Je voulais juste te mettre en garde au cas où tu essaierais cette opération.
Posté : lun. 29 avr. 2013, 18:38
par Cocrane
Oui l'éditeur est pour le moment capable de lire uniquement le fichier DLG. Je n'utilise plus weidu pour décompiler ou compiler des fichiers.
La nouvelle version:
- lira les .D
- généra des .D via un assistant pour éviter d'écrire le code.
- .TRA dans la version suivante quand j'aurai pris du recul.
Je ne suis pas toujours sur d'avoir compris les limites de Weidu.
* Décompilation
DLG (avec Say =) -> .D (avec Say =) ?
* Compilation
.D (avec Say =) -> DLG (avec Say =) ?
Pour chaque action ci-dessus possible, je peux gérer l'éditeur pour comprendre ou écrire le code avec le '='
Cocrane
Posté : mar. 30 avr. 2013, 23:04
par Isaya
Je pense qu'envisager de faire la conversion .D vers .DLG est un travail inutile et sans le moindre intérêt pour tout le monde, sans compter les efforts à accomplir et tous les bugs pour réinventer une roue qui risque de moins bien rouler que l'original. Cette tâche restera toujours l'apanage de WeiDU lors de l'installation d'un mod. Tu vas user le soleil si tu te lances là-dedans, à mon avis.
De même, chercher à recomposer un SAY multiple à partir d'un fichier .DLG ne sera pas si simple. Je te suggère de ne pas y perdre trop de temps pour commencer. Cela n'apportera pas grand chose, de toute manière. Un auteur va surtout chercher à composer son dialogue, pas à optimiser la décompilation d'un dialogue existant sous forme de DLG.
Si tu gères le cas du multisay dans ton générateur simplifié, ce sera déjà bien.
Posté : jeu. 02 mai 2013, 21:54
par Cocrane
je te rassure je n'ai pas pour but de remplacer Weidu. Je me suis mal exprimé dans mon message. J'essayais de comprendre quelle était le problème que tu annonçais dans tes messages avec le '='.
L'idéé étant d'être capable d'interpréter un DLG avec SAY utilisant le '=' et de permettre au moddeur d'utiliser le '=' dans un .D à destination de Weidu.
Il existe d'autres 'originalités"?
Posté : dim. 05 mai 2013, 05:53
par Freddy_Gwendo
En termes d'originalité, il y a aussi les CHAIN et les I_T_C.
Mais je pense qu'Armand est beaucoup plus calé que moi pour t'en parler.
Je commence tout juste à utiliser les CHAIN (même si je compte le faire le plus systématiquement possible à l'avenir). Quant aux I_T_C, je n'ai pas encore franchi le pas. Tout paraît si simple dans la doc de WeiDU. Malheureusement elle ne renseigne que des cas généraux alors que l'écriture d'un dialogue spécifique renvoie à des cas particuliers qu'il faut apprivoiser.
Par ailleurs, je ne sais pas si tu as consulté dernièrement le forum de Pocket Plane mais WeiDU est en train de profondément évoluer et sa doc a été "enfin" mise-à-jour avec des exemples de modding bien plus concrets. Je dis "enfin" mais j'en aurais été bien incapable. Merci à Wisp !
Posté : dim. 16 juin 2013, 10:51
par Cocrane
L'assistant dialogue avant. Je devrai pouvoir présenter une première version fin juin début juillet.
Question technique:
Les blocks où il y a une condition (avec WEIGHT) sont des blocks qui déclenchent un début de conversation?
Les blocks sans condition sont des blocks appelés par d'autres blocks (enchainement) du fichier DLG ou par le mot clé Extern?
Posté : dim. 16 juin 2013, 19:20
par Freddy_Gwendo
Cocrane a écrit :Les blocks sans condition sont des blocks appelés par d'autres blocks (enchainement) du fichier DLG ou par le mot clé Extern?
Les deux mon général !
Soit il est appelé par un bloc du dialogue existant, soit par un dialogue extérieur.
Cocrane a écrit :Les blocks où il y a une condition (avec WEIGHT) sont des blocks qui déclenchent un début de conversation?
Là, tu t'attaques à du lourd.
Comme la gestion des WEIGHT est assez pénible et sujette à bugs si on ne fait pas gaffe aux incompatibilité entres mods, j'ai préféré m'en passer et utiliser de bonnes vieilles conditions bien définies.
Sur le principe, les WEIGHT précisent un degré de priorité de déclenchement des blocs
à condition égale.
S'ils sont dotés des mêmes conditions de délcenchement (inclue "aucune condition", ce qui est en soi un type de condition), les blocs seront lancés les uns après les autres, en fonction de la valeur du WEIGHT : 1° lancement de dialogue --> WEIGHT #1, 2° lancement de dialogue --> WEIGHT #2, etc...
Mais comme ça fait plus de cinq ans que je ne me suis pas plongé dedans, mes souvenirs sont peut-être flous. Le mieux est de vérifier dans la doc WeiDU où un chapitre leur est consacré.
Posté : dim. 16 juin 2013, 20:36
par Isaya
Pour dire les choses simplement, WEIGHT est à proscrire quand on écrit un dialogue (sous forme de fichier d) à partir de zéro. Ça ne sert strictement à rien dans ce cas, il suffit simplement de s'assurer qu'on met bien les conditions dans leur ordre de priorité, la plus importante au tout début.
Extrait du tutoriel de la doc WeiDU :
Strong Style Suggestion: do not use the WEIGHT directive in your hand-made D files. Just use the implicit ordering.
WEIGHT n'a d'intérêt que pour intervenir sur des fichiers DLG déjà faits, en général ceux du jeu. Il s'agit en général de la construction d'un fichier d venant patcher un dialogue existant du jeu, lorsqu'il est nécessaire de s'assurer que la réplique qu'on ajoute sera bien prioritaire sur les répliques déjà présentes dans le fichier DLG du jeu. Et là en général, les gens ne font pas dans la finesse, ils utilisent un WEIGHT #-1, pour être ultra-prioritaire vis à vis des autres répliques qui auraient déjà un WEIGHT.
A mon avis vouloir gérer ce dernier cas au travers d'un éditeur est peine perdue. La complexité des opérations de patch que l'on peut être amené à réaliser dans le cas de la modification d'un dialogue existant est hors de portée d'un éditeur. Toutes les opérations de ce type ou presque sont des cas particuliers.
Posté : lun. 17 juin 2013, 22:04
par Cocrane
On peut donc créer un block avec une condition sans WEIGHT. Je pensais que tous les blocks qui déclenchaient un début de discussion devait présenter une valeur de WEIGHT.
Je note qu'il n'est pas utile de gérer le WEIGHT.
Merci pour vos retours.