Affichage des résultats 1 à 6 sur 6

Discussion: [DLG] Modifier un dialogue ajouté par un autre mod : commande STATE_WHICH_SAYS

  1. #1
    Date d'inscription
    February 2011
    Messages 
    674

    [DLG] Modifier un dialogue ajouté par un autre mod : commande STATE_WHICH_SAYS

    Bonjour à toutes et à tous,


    Je suis à la recherche d'une méthode permettant de modifier un dialogue qui a été ajouté par un autre mod.

    Plus précisément, je veux faire un EXTEND_BOTTOM sur l'un des blocs de ce dialogue, afin d'ajouter une nouvelle option à CHARNAME dans la discussion. Mon grand problème est de trouver quel est le numéro du bloc de dialogue, car d'une installation à une autre, en fonction des mods installés avant le mien, ce numéro va changer.

    Existe-il une méthode permettant de parcourir tous les blocs d'un fichier de dialogue, et d'en récupérer le numéro si le bloc possède certaines caractéristiques ?


    Dans l'exemple qui m'intéresse, c'est le mod BG1NPC qui ajoute la possibilité d'initier une discussion avec les personnages de son groupe. Dans le cadre de mon mod sur Garrick, je veux ajouter à ce dialogue une réplique permettant à CHARNAME de demander à Garrick d'expliquer les effets de ses nouvelles chansons.
    Le bloc de dialogue en question est contenu dans le fichier garrij.dlg, et ressemble à ça :
    Code:
    IF WEIGHT #yy
    ~  IsGabber(Player1)
    !Global("endofbg1","GLOBAL",2)
    ~ THEN BEGIN xxx // from:
      SAY #105971 /* ~*Garrick semble un peu distant, ces derniers temps, et moins bavard. C'est surprenant. Peut-être serait-ce le bon moment pour remédier à cette situation et remonter le moral du barde. Et les artistes n'aiment rien tant que de parler d'eux-mêmes.*~ [X#BLANKD] */
      IF ~~ THEN REPLY #105972 /* ~*Vous décidez que cela n'en vaut pas la peine. Après tout, vous pourriez apprendre des choses que vous ne voulez pas savoir sur Garrick.*~ */ EXIT
      [autres réponses possibles]
      IF ~~ THEN REPLY #105980 /* ~Garrick, ta voix est... étrange.~ */ GOTO 268
    END
    À noter que c'est le seul bloc du dialogue qui utilise la condition "IsGabber(Player1)", c'est peut-être une piste pour réussir à le détecter ?

    J'ajoute la possibilité de dialogue comme ceci :
    Code:
    EXTEND_BOTTOM GARRIJ xxx
    	IF ~Or(3)
    	Global("gtt#ChansonIvrogne","GLOBAL",1)
    	Global("gtt#ChansonSirenes","GLOBAL",1)
    	Global("gtt#BalladeNainFou","GLOBAL",1)
    	~ THEN REPLY @320 GOTO choixchanson
    END
    J'utilise déjà l'instruction DECOMPILE_AND_PATCH pour modifier des éléments ajoutés par d'autres mods, mais uniquement pour des choses très simples, je ne vois pas trop s'il est possible de l'utiliser dans ce cas ?

    Merci d'avance pour vos suggestions
    Dernière modification par Freddy_Gwendo ; 20/03/2016 à 20h27. Motif: Modification du titre de la discussion
    « Pssst. Tu as remarqué comme elle me dévore du regard ? Hein ? Tu as vu ça ? La façon dont elle a regardé la courbe de mon os occipital ? »

  2. #2
    Date d'inscription
    February 2011
    Messages 
    674
    J'ai trouvé la solution


    En fait, c'est plutôt simple ! WeiDU a même une commande pour ça : STATE_WHICH_SAYS.

    Elle prend comme paramètres un fichier .tra, un numéro de réplique contenu dans ce fichier .tra, un fichier de dialogue et donne en retour le numéro du bloc qui contient cette réplique dans ce dialogue.

    Dans mon cas, ça s'utilise comme ceci :
    Code:
    OUTER_SET nbdiaggarrcharname = STATE_WHICH_SAYS 3614 IN ~bg1npc/tra/%s/X#PCINIT.tra~ FROM garrij
    COMPILE ~garrick-tt/d/chansons.d~ EVALUATE_BUFFER
    où X#PCINIT.tra est le fichier qui contient la réplique qui débute le bloc dont je veux trouver le numéro.
    Le bloc correspondant dans chansons.d :
    Code:
    EXTEND_BOTTOM GARRIJ %nbdiaggarrcharname%
    	IF ~Or(3)
    	Global("gtt#ChansonIvrogne","GLOBAL",1)
    	Global("gtt#ChansonSirenes","GLOBAL",1)
    	Global("gtt#BalladeNainFou","GLOBAL",1)
    	~ THEN REPLY @320 GOTO choixchanson
    END

    WeiDU, c'est trop fort
    Dernière modification par mirandir ; 21/10/2014 à 10h14.
    « Pssst. Tu as remarqué comme elle me dévore du regard ? Hein ? Tu as vu ça ? La façon dont elle a regardé la courbe de mon os occipital ? »

  3. #3
    Date d'inscription
    December 2007
    Localisation
    GAP, Hautes alpes
    Messages 
    2 033
    Cool, c'est bon de savoir ça, parce-que je risque d'en avoir besoin pour rajouter des banters avec Jon Irenicus de Longer road
    Les mères célibataires au d'avoir flashé sur un gars "beau comme un dieu" elle auraient mieux fait de chercher un gars "qui ferait un bon père".

    Sur Path Of Exile. Plus de modding, ni traduction, etc...

  4. #4
    Date d'inscription
    April 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 645
    Je me permets de remonter ce fil.

    J'essaie de faire la même chose mais en ajoutant une réplique à l'intérieur d'un dialogue :

    Code:
    IF WEIGHT #4 /* Triggers after states #: 16 20 21 even though they appear after this state */
    ~Global("VillageSaved","GLOBAL",0)~ THEN BEGIN 4 // from:
      SAY #32306 /* ~Hé ! Que voulez-vous, étranger ?~ ~Hé ! Que voulez-vous, étrangère ?~ */
      IF ~Global("WainwrightJob","GLOBAL",0)~ THEN REPLY #32307 /* ~Que se passe-t-il donc dans ce village ?~ */ GOTO 5
      IF ~Global("WainwrightJob","GLOBAL",1)~ THEN REPLY #32308 /* ~Savez-vous quelque chose à propos de ces meurtres ?~ */ GOTO 5
     ==> Nouvelle réplique
      IF ~~ THEN REPLY #32309 /* ~Qui êtes-vous ?~ */ GOTO 9
      IF ~~ THEN REPLY #32310 /* ~Rien, vraiment.~ */ GOTO 10
    END
    Je n'ai trouvé aucune fonction me permettant de trouver le numéro de transition correspondant à la réponse #32309 et me permettant d'utiliser un EXTEND_TOP UHMEN02 4 #numeroreplique.

    Aurais-tu une idée ?



    Quelques heures plus tard...

    J'ai fini par trouver !

    Mais comme WeiDU ne le gère pas, il faut créer une fonction idoine :

    Code:
    DEFINE_PATCH_FUNCTION ~GW_FIND_DLG_RESPONSE_STRING~
    	INT_VAR	GW_string_dlg = 0	// string que l'on cherche
    	RET	GW_transition_found	// Variable indiquant que l'on a trouvé une correspondance
    		GW_transition_number	// Numéro de la transition (réponse)
    BEGIN
    
    	SET GW_transition_number = 0
    	SPRINT GW_transition_found "N"
    	READ_LONG 0x08 GW_numstates				// Number of states
    	READ_LONG 0x0c GW_offstates				// Offset of state table from start of file
    	READ_LONG 0x10 GW_numresponse				// Number of transitions
    	READ_LONG 0x14 GW_offresponse				// Offset of transition table from start of file
    
    	FOR (state = 0 ; state < GW_numstates ; ++state) BEGIN
    
    		PATCH_IF ("%GW_transition_found%" STRING_COMPARE_CASE "Y") BEGIN
    
    			READ_LONG ("%GW_offstates%" +       (state * 0x10)) GW_state_string		// Actor response text (i.e. what the non-player character says to the party)
    			READ_LONG ("%GW_offstates%" + 0x4 + (state * 0x10)) GW_index_first_response	// Index of the first transition corresponding to this state (i.e. the index in the transition table of the first potential response the party can make in this state).
    			READ_LONG ("%GW_offstates%" + 0x8 + (state * 0x10)) GW_state_num_response	// Number of transitions corresponding to this state (i.e. how many possible responses are there to this state). A consecutive range of transitions in the transition table are assigned to this state, starting from 'first', as given by the previous field, ranging up to (but not including) 'first'+'count'.
    
    			FOR (response = 0 ; response < GW_state_num_response ; ++response) BEGIN
    				READ_LONG ("%GW_offresponse%" + 0x4 + ("%GW_index_first_response%" * 0x20) + (response * 0x20)) GW_response_string
    
    				PATCH_IF (GW_response_string = GW_string_dlg) BEGIN
    					SET GW_transition_number = response
    					SPRINT GW_transition_found "Y"
    				END
    
    			END	// of Looping through responses
    
    		END		// PATCH_IF ("%GW_transition_found%" STRING_COMPARE_CASE "Y")
    
    	END			// of Looping through states
    
    END				// of DEFINE_PATCH_FUNCTION
    Puis dans le tp2 :

    Code:
    COPY_EXISTING - ~UHMAN02.dlg~ ~override~
    	PATCH_IF (SOURCE_SIZE > 0x2f) THEN BEGIN	// protects against invalid files
    		LPF ~GW_FIND_DLG_RESPONSE_STRING~ INT_VAR GW_string_dlg = 32309 RET GW_transition_found GW_transition_number END
    		PATCH_IF ("%GW_transition_found%" STRING_EQUAL "Y") BEGIN
    			SET UHMAN02_Transition4 = GW_transition_number
    		END
    	END
    BUT_ONLY
    
    
    COMPILE ~Diamant_Eternel/Dlg/Vaelasa.d~ EVALUATE_BUFFER
    Et enfin dans le .d :

    Code:
    EXTEND_TOP UHMAN02 4 #%UHMAN02_Transition4%
    
    	+ ~Global("GWChevaucheuseKit","GLOBAL",2)~ + @11104001 GOTO Chevaucheuse1
    
    END
    Ne pas oublier le "#" devant la variable d'insertion, sinon, ça fout le bordel dans le fichier dlg : j'ai galéré un moment avant de comprendre, la doc WeiDU n'étant pas très claire sur ce point.

    Si ça peut servir...

    Note : ça fonctionne aussi pour les EXTEND_BOTTOM.
    Dernière modification par Freddy_Gwendo ; 15/05/2016 à 15h46. Motif: Question - Réponse !
    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
    February 2011
    Messages 
    674
    Merci, ça me semble bien utile comme fonction !
    « Pssst. Tu as remarqué comme elle me dévore du regard ? Hein ? Tu as vu ça ? La façon dont elle a regardé la courbe de mon os occipital ? »

  6. #6
    Date d'inscription
    April 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 645
    De rien. Autant en faire profiter tout le monde. De plus, ça m'a permis d'étudier la structure du fichier .dlg. En fait, on peut y chercher et modifier des tas d'éléments, comme pour les autres fichiers (itm, spl, cre, are, etc...)

    Comme tu l'as dit :
    Citation Envoyé par mirandir Voir le message
    WeiDU, c'est trop fort
    Enfin quand on arrive à pondre ce que l'on veut.
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

Discussions similaires

  1. [WeiDU] Dialogue et commande EXTERN
    Par Cocrane dans le forum Dialogues
    Réponses: 5
    Dernier message: 27/10/2014, 21h01
  2. Réponses: 21
    Dernier message: 24/04/2012, 21h24
  3. Réponses: 7
    Dernier message: 24/05/2011, 12h40
  4. [MOD] Recherche d'un mod qui ajoute un groupe devant le donjon de Firkraag
    Par Jalen dans le forum Le Bazar de l'Aventurier
    Réponses: 3
    Dernier message: 25/05/2009, 10h47
  5. Réponses: 3
    Dernier message: 14/01/2006, 11h15

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 252 253 254 255 256