Affichage des résultats 1 à 15 sur 15

Discussion: Gestion des dialogues et structure du code

  1. #1
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 065

    Gestion des dialogues et structure du code

    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
    Dernière modification par Cocrane ; 24/04/2013 à 23h20.

  2. #2
    Date d'inscription
    avril 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 756
    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:
    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:
    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:
    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.
    Dernière modification par Freddy_Gwendo ; 25/04/2013 à 13h36.
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

  3. #3
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 065
    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

  4. #4
    Date d'inscription
    avril 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 756
    Citation Envoyé par Cocrane
    "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:
    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:
    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...

  5. #5
    Date d'inscription
    juillet 2003
    Localisation
    Plaisir
    Messages 
    6 852
    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 !

  6. #6
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 065
    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

  7. #7
    Date d'inscription
    juillet 2003
    Localisation
    Plaisir
    Messages 
    6 852
    Citation Envoyé par Cocrane Voir le message
    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 !

  8. #8
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 065
    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

  9. #9
    Date d'inscription
    juillet 2003
    Localisation
    Plaisir
    Messages 
    6 852
    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 !

  10. #10
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 065
    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"?

  11. #11
    Date d'inscription
    avril 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 756
    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 !
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

  12. #12
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 065
    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?

  13. #13
    Date d'inscription
    avril 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 756
    Citation Envoyé par Cocrane
    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.


    Citation Envoyé par Cocrane
    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...

  14. #14
    Date d'inscription
    juillet 2003
    Localisation
    Plaisir
    Messages 
    6 852
    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 !

  15. #15
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 065
    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.

Discussions similaires

  1. [Structure] Le débarcadère
    Par Perdigan Foxglove dans le forum Le Complexe Portuaire
    Réponses: 499
    Dernier message: 13/01/2020, 20h23
  2. [Structure] Quai d'embarquement
    Par Perdigan Foxglove dans le forum Le Complexe Portuaire
    Réponses: 429
    Dernier message: 22/03/2019, 18h16
  3. [Structure] Les quais militaires
    Par Garfield dans le forum Le Complexe Portuaire
    Réponses: 315
    Dernier message: 29/10/2014, 19h37
  4. [Structure] Les égouts marins
    Par Agrippa dans le forum Le Complexe Portuaire
    Réponses: 196
    Dernier message: 25/12/2012, 21h53
  5. [JEU] Structure
    Par kodlyck dans le forum L'Académie de Padhiver (NWN 1)
    Réponses: 2
    Dernier message: 12/11/2005, 09h54

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251