Oyez, oyez !

Les résultats du vote sur les meilleurs RPG de tous les temps sont désormais dévoilés dans ce message !

Merci à toutes et à tous pour votre participation !

N'hésitez pas à aller commenter, ajouter des jeux auxquels vous n'auriez pas pensé...

Gestion des dialogues et structure du code

<img src="filesforums/mods/editeur_baldur.jpg" alt="editeur" class="image_left" />Cette section traite du développement d'un outil graphique pour créer des mods Infinity Engine.
Répondre
Cocrane
Adepte de Grondemarteau
Ogre mage
Messages : 1328
Enregistré le : dim. 21 mars 2010, 12:03
Localisation : Paris
Contact :
Statut : Hors ligne

Gestion des dialogues et structure du code

.

Message 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
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message 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. :$
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Cocrane
Adepte de Grondemarteau
Ogre mage
Messages : 1328
Enregistré le : dim. 21 mars 2010, 12:03
Localisation : Paris
Contact :
Statut : Hors ligne
.

Message 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
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message 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. :$
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message 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.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Cocrane
Adepte de Grondemarteau
Ogre mage
Messages : 1328
Enregistré le : dim. 21 mars 2010, 12:03
Localisation : Paris
Contact :
Statut : Hors ligne
.

Message 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
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message 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.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Cocrane
Adepte de Grondemarteau
Ogre mage
Messages : 1328
Enregistré le : dim. 21 mars 2010, 12:03
Localisation : Paris
Contact :
Statut : Hors ligne
.

Message 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
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message 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.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Cocrane
Adepte de Grondemarteau
Ogre mage
Messages : 1328
Enregistré le : dim. 21 mars 2010, 12:03
Localisation : Paris
Contact :
Statut : Hors ligne
.

Message 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"?
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message 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. :hang3:

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 ! ;)
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Cocrane
Adepte de Grondemarteau
Ogre mage
Messages : 1328
Enregistré le : dim. 21 mars 2010, 12:03
Localisation : Paris
Contact :
Statut : Hors ligne
.

Message 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?
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message 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é.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message 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.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Cocrane
Adepte de Grondemarteau
Ogre mage
Messages : 1328
Enregistré le : dim. 21 mars 2010, 12:03
Localisation : Paris
Contact :
Statut : Hors ligne
.

Message 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.
Répondre

Retourner vers « Éditeur Baldur's Gate »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité