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é...

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

Répondre
Avatar du membre
mirandir
Adepte de Grondemarteau
Ver charognard
Messages : 674
Enregistré le : mer. 09 févr. 2011, 10:30
Contact :
Statut : Hors ligne

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

.

Message par mirandir »

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 : Tout sélectionner

IF WEIGHT #yy
~  IsGabber(Player1)
!Global("endofbg1","GLOBAL",2)
~ THEN BEGIN [B]xxx[/B] // 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 : Tout sélectionner

EXTEND_BOTTOM GARRIJ [B]xxx[/B]
	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 ^^
« 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 ? »
Avatar du membre
mirandir
Adepte de Grondemarteau
Ver charognard
Messages : 674
Enregistré le : mer. 09 févr. 2011, 10:30
Contact :
Statut : Hors ligne
.

Message par mirandir »

J'ai trouvé la solution :dance4:


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 : Tout sélectionner

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 : Tout sélectionner

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 :cool:
« 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 ? »
Avatar du membre
deratiseur
Golem de fer
Messages : 3698
Enregistré le : mer. 05 déc. 2007, 18:35
Localisation : Gap, Hautes alpes
Statut : Hors ligne
.

Message par deratiseur »

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 :)
Le standard téléphonique est en rade : l'atelier du Deratiseur ne répondra plus à aucune demande personnalisée.
Bosse sur : Interplan v9, Derat's Kri'Binn, Todd : KOPP2.

Mes mods sont tous sur Mediafire et Github
Et leurs descriptions sont ici.
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 »

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 : Tout sélectionner

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
[color="#FFFF00"] ==> Nouvelle réplique[/color]
  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 : Tout sélectionner

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 : Tout sélectionner

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 : Tout sélectionner

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.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
mirandir
Adepte de Grondemarteau
Ver charognard
Messages : 674
Enregistré le : mer. 09 févr. 2011, 10:30
Contact :
Statut : Hors ligne
.

Message par mirandir »

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 ? »
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 »

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 :
mirandir a écrit :WeiDU, c'est trop fort :cool:
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...
Répondre

Retourner vers « Dialogues »

Qui est en ligne

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