Page 1 sur 1

[WeiDU] Rechercher des répliques dans des dialogues sans NI, ni DLTCEP

Posté : dim. 22 mai 2016, 09:17
par Freddy_Gwendo
Modifier un fichier dlg existant peut paraître très facile à première vue. Surtout si on prend comme base le fichier vanilla du jeu. En revanche, pour peu que l'on se penche sur les problèmes de compatibilité avec les autres mods, ça peut vite devenir l'enfer.

En effet, si vous partez d'une phrase de dialogue proposant 4 répliques possibles et décidez d'en ajouter une entre la 3° et la quatrième, votre code a de fortes chances de ne pas produire ce que vous espériez si d'autres mods ont ajouté leur propre contenu avant le vôtre !

J'en ai fait l'amère expérience en voulant ajouter des options de réponses au dialogue UHMAY01 (Ministre Lloyd des Collines d'Umar) : il n'y a pas moins de 43 mods qui le modifient, et encore je ne suis pas certain de les avoir tous téléchargés.

Pour les ceusses intéressés, j'ai pondu une [post=420644]petite routine WeiDU[/post] qui permet de retrouver l'index d'une réponse dans l'architecture du fichier .dlg et donc de s'affranchir des mods qui auraient été installés avant le vôtre.


Quelques jours plus tard, je l'ai adaptée pour répondre à une demande d'un membre des d'Oghms qui souhaitait connaître les textes correspondant à des interjections introduites par le mod qu'il traduisait.

Son utilisation est simple. Je la détaille dans le message suivant.

Posté : dim. 22 mai 2016, 09:21
par Galathée
C'est moi le membre mystérieux des d'Oghmatiques et je profite de l'occasion pour te remercier encore de ton aide précieuse ;)
Un outil extrêmement pratique à n'en pas douter !

Recherche de texte dans les dialogues pour traducteurs

Posté : dim. 22 mai 2016, 09:23
par Freddy_Gwendo
1. Procédure d'installation.
  1. Téléchargez l'archive proposée en pièces jointes.
  2. Désarchivez-la dans votre répertoire de jeu.

Vous obtiendrez ceci :
  • Le fichier setup-GW_strings_a_trouver.exe (une copie de WeiDU v239.00).
  • Le répertoire GW_strings_a_trouver. Ce dernier contient

    [INDENT]- Un sous-répertoire backup (indispensable pour que WeiDU ne plante pas).[/INDENT]
    [INDENT]- Le fichier setup-GW_strings_a_trouver.tp2 (associé à setup-GW_strings_a_trouver.exe, c'est lui qui indique à WeiDU ce qu'il doit faire).[/INDENT]
    [INDENT]- Le fichier GW_strings_a_trouver.tph qui contient les fonctions et macros utilisées pour le traitement.[/INDENT]
    [INDENT]- Le fichier GW_strings_a_trouver.tpa qui contient le tableau des données à rechercher.[/INDENT]


2. Fonctionnement.

Généralement, le fichier .d que vous traduisez contient une liste d'instructions comme les suivantes :

Code : Tout sélectionner

I_C_T "[color="#00FF00"]nom de dialogue existant[/color]" "[color="#00FF00"]indice de la réplique à laquelle on ajoute quelque chose[/color]"
LISTE d'AJOUTS
END

APPEND_TOP "[color="#00FF00"]nom de dialogue existant[/color]" "[color="#00FF00"]indice de la réplique à laquelle on ajoute quelque chose[/color]"
LISTE d'AJOUTS
END

APPEND_BOTTOM "[color="#00FF00"]nom de dialogue existant[/color]" "[color="#00FF00"]indice de la réplique à laquelle on ajoute quelque chose[/color]"
LISTE d'AJOUTS
END

...
Il vous suffit donc de repérer ces lignes et de les reporter dans le tableau GW_strings_a_trouver.tpa :

Code : Tout sélectionner

// Fichier	#	=> String
//- 0 --------- 1 ---------------------
HGWRA01,	18	=> HGWRA01_18
HGWRA01,	24	=> HGWRA01_24
MELISS01,	11	=> MELISS01_11
IMOEN25J,	11	=> IMOEN25J_11
MINSC25J,	7	=> MINSC25J_7
NALIA25J,	3	=> NALIA25J_3
BALTH,		26	=> BALTH_26

END
Oubliez les deux premières lignes qui sont des repères de programmation. ;)

Chaque ligne contient le nom du fichier dialogue ("nom de dialogue existant") et l'index du texte à retrouver ("indice de la réplique à laquelle on ajoute quelque chose") séparés par une virgule.
Après la flèche se trouve une donnée artificielle, mais indispensable : Elle permet à WeiDU de comprendre que chaque ligne est différente. Vous pouvez très bien changer HGWRA01_18 par 1, HGWRA01_24 par 2, etc.
L'essentiel est que chaque valeur "String" soit différente.

Ainsi, pour WeiDU,

Code : Tout sélectionner

// Fichier	#	=> String
//- 0 --------- 1 ---------------------
HGWRA01,	18	=> 1
HGWRA01,	24	=> 1

END
les résultats du traitement de la première ligne seront écrasés par ceux de la seconde puisqu'il considérera que ce sont les mêmes. Et vous n'obtiendrez pas le texte correspondant à la réplique 18 du fichier HGWRA01.dlg

Idem pour :

Code : Tout sélectionner

// Fichier	#	=> String
//- 0 --------- 1 ---------------------
HGWRA01,	18	=> 1
HGWRA01,	18	=> 2

END

Une fois vos données saisies, sauvegardez le fichier GW_strings_a_trouver.tpa, puis lancez la procédure en double-cliquant sur setup-GW_strings_a_trouver.exe.

A la fin du traitement, vous trouverez dans votre répertoire le fichier GW_strings_a_trouver.txt :

Code : Tout sélectionner

*=====================================================================================================================================================================*
*                                                               Liste des phrases de dialogue à trouver                                                               *
*                                                                                                                                                                     *
*  DLG		n°	tlk		Phrase                                                                                                                        *
*=====================================================================================================================================================================*
  HGWRA01  	18	65896	Combien d'autres devront souffrir avant que tu comprennes que j'ai raison ? Combien d'autres mourront ? Que sont devenus tes anciens compagnons... combien sont morts, à cause de toi ?
	Gorion
-------------------------------------------------------------------------------------------------------------------------------
  HGWRA01  	24	65914	Tu ne sais pas de quoi tu parles. Tu es liée à lui, tu as tué tout comme lui.
	Gorion
-------------------------------------------------------------------------------------------------------------------------------
  HGWRA01  	25	65926	Je ne permettrai pas que la prophétie se réalise grâce à toi ! Je ne le permettrai pas ! Tu devras mourir par ma main, avant !
	Gorion
-------------------------------------------------------------------------------------------------------------------------------
  SARVOLO  	9	71486	De quel compagnon as-tu envie d'entendre parler ?
	Volo
-------------------------------------------------------------------------------------------------------------------------------
  GORODR1  	11	62379	Ce jour est venu, <CHARNAME>. Le grand Mal se débat à l'intérieur, et il a déjà infecté la Tour de Garde au point que nous ne pouvons contourner les créatures et les magies qu'il a déjà générées.
	Odren
-------------------------------------------------------------------------------------------------------------------------------
  GORODR1  	35	62548	Nous...je...je l'admets. J'ai honte à le reconnaître, mais c'est ce que j'ai fait. Je ne croyais pas que vous...ou qui que ce soit...serait assez puissant pour tuer le Prince des Démons.
	Odren
-------------------------------------------------------------------------------------------------------------------------------
  IMOEN25J  	30	70535	"Notre folie nous sera pardonnée" ! De qui se moque-t-il ?! Il cherche la bagarre !
	Nom de la créature pas trouvé
-------------------------------------------------------------------------------------------------------------------------------
Vous y trouverez le nom du fichier de dialogue, l'indice de la réplique recherchée, son numéro d'index dans le fichier dialog.tlk, puis le texte de la réplique.
Cerise sur le gâteau, j'ai ajouté le nom de la créature qui utilise le dialogue.
Pour certains fichiers de dialogue, vous trouverez la mention « Nom de la créature pas trouvé ». C'est normal : ça concerne généralement les dialogues attribués par script, notamment aux PNJ. Cependant, il est très facile de trouver leur destinataire : IMOEN25J, ça devrait vous dire quelque chose, non ?!



3. Notes.

a. Cette procédure n'installe rien et ne modifie rien.

b. Cependant, j'ai conservé une routine qui vérifie la présence du fichier GW_strings_a_trouver.txt dans le répertoire. S'il n'existe pas, elle le crée, sinon, elle le complète par les éléments trouvés.
Donc, à chaque utilisation, je vous conseille de le sauvegarder quelque part, puis de le supprimer.

c. Comme je ne mode pour l'instant que sur des versions normales, je ne sais pas si cette procédure fonctionne sur les versions Enhanced (il va vraiment falloir que je les télécharge un de ces jours). En fait, je n'en suis pas certain du tout.

Si quelqu'un veut l'adapter, pas de problème. ;)



J'espère avoir été clair dans mes explications. Si ce n'est pas le cas, n'hésitez pas à réagir ; je rectifierai le tir.

Posté : dim. 22 mai 2016, 18:07
par Isaya
Freddy_Gwendo a écrit :c. Comme je ne mode pour l'instant que sur des versions normales, je ne sais pas si cette procédure fonctionne sur les versions Enhanced (il va vraiment falloir que je les télécharge un de ces jours). En fait, je n'en suis pas certain du tout.
Le principe des dialogues n'a pas changé dans les Enhanced Edition.

Néanmoins il se peut que les dialogues aient changé par rapport aux versions d'origine, par exemple pour corriger des bugs ou pour inclure des interjections des nouveaux personnages introduits par Beamdog, de sorte que les mods qui veulent justement ajouter des interjections ou des réponses doivent distinguer ces cas (sans compter certains changements du patch 2.0 ou supérieur). Mais c'est avant tout le problème de l'auteur du mod.

Néanmoins, par rapport aux exemples que tu donnes, cela signifie qu'identifier l'indice de la réplique peut s'avérer un peu plus compliqué dans un tel cas. Par exemple, BG1 NPC a recours à des variables fixées en fonction du jeu pour ce type de situation. Cela se traduit par le fait qu'il faut aller consulter les fichiers g3_<jeu>_cpmvars.tpa dans le répertoire bg1npc\lib (avec <jeu> = bgee, par exemple) pour connaître l'indice en question. Cela s'applique notamment au dialogue de Perleflamme où l'intervention d'Imoen se traduit par :

Code : Tout sélectionner

I_C_T ~%tutu_var%FIREBE~ %firebeadstate1% X#FirebeardImoen1
avec dans g3_bgee_cpmvars.tpa

Code : Tout sélectionner

OUTER_SET firebeadstate1 = 3

Posté : dim. 22 mai 2016, 20:12
par Freddy_Gwendo
Ouaip, j'utilise ce genre de technique pour mon mod.

Exemple pour détecter Solaufein Romance :

Code : Tout sélectionner

// DÉFINITION de la COMPATIBILITÉ avec le mod Solaufein Romance

DEFINE_ACTION_MACRO ~GW_COMPATIBILITY_SOLAROM~ 
BEGIN

// 1. Recherche de la présence du mod Solaufein Romance dans le répertoire du jeu.
// -------------------------------------------------------------------------------
	ACTION_IF (DIRECTORY_EXISTS "solarom") BEGIN
		PRINT "Le mod Solaufein Romance est present dans le repertoire."

// 2. Recherche du rang du nouvel échange ajouté au dialogue UHMER01 par kit de la Chevaucheuse.
// ---------------------------------------------------------------------------------------------
		OUTER_SET GW_Uhmer01_state_remise1 = STATE_WHICH_SAYS 11105624 IN ~Diamant_Eternel/tra/%s/vaelasa.tra~ FROM UHMER01

// 3. Création d'un clone du fichier wwmer01.sto pour intégrer les remises accordées par Elence Fielding à la Chevaucheuse.
// ------------------------------------------------------------------------------------------------------------------------
		ACTION_IF FILE_EXISTS_IN_GAME ~wwmer01.sto~ BEGIN		// Si le mod Solaufein Romance a déjà été installé : on modifie les paramètres de wwmer01.sto
			COPY_EXISTING ~wwmer01.sto~ ~override/GWwwmer1.sto~
				PATCH_IF (SOURCE_SIZE > 0x9b) BEGIN
					SAY NAME2 @11105631	// ~Armurerie d'Elence Fielding~
					WRITE_LONG 0x14 110	// ORIGINAL = 150	- Store "sell price markup" (percentage of base price store charges for items)
					WRITE_LONG 0x18 50	// ORIGINAL = 30	- Store "buy price markup" (percentage of base price store is willing to pay)
					WRITE_LONG 0x1c 0	// ORIGINAL = 5		- Depreciation rate
					WRITE_LONG 0x40 80	// ORIGINAL = 100	- ID Price
				END
			BUT_ONLY
		END ELSE BEGIN							// Sinon, on on crée directement ce clone.
			COPY ~solarom/uhmer01.sto~ ~override/GWwwmer1.sto~
				PATCH_IF (SOURCE_SIZE > 0x9b) BEGIN
					SAY NAME2 @11105631	// ~Armurerie d'Elence Fielding~
					WRITE_LONG 0x14 110	// ORIGINAL = 150	- Store "sell price markup" (percentage of base price store charges for items)
					WRITE_LONG 0x18	50	// ORIGINAL = 30	- Store "buy price markup" (percentage of base price store is willing to pay)
					WRITE_LONG 0x1c 0	// ORIGINAL = 5		- Depreciation rate
					WRITE_LONG 0x40 80	// ORIGINAL = 100	- ID Price
				END
			BUT_ONLY
		END	// of ACTION_IF FILE_EXISTS_IN_GAME ~wwmer01.sto~

//4. Définition de la valeur GW_Solaufein_Romance (= 1) pour modifier le dialogue UHMER01 du kit.
// ----------------------------------------------------------------------------------------------
		OUTER_SET GW_Solaufein_Romance = 1

	END ELSE BEGIN						// Si le mod Solaufein Romance n'est pas dans le répertoire du jeu.

		PRINT "Le mod Solaufein Romance n'est pas present dans le repertoire"
		OUTER_SET GW_Solaufein_Romance = 0
//		OUTER_SET GW_Uhmer01_state_remise1 = "-99"
		OUTER_SET GW_Uhmer01_state_remise1 = STATE_WHICH_SAYS 11105624 IN ~Diamant_Eternel/tra/%s/vaelasa.tra~ FROM UHMER01

	END		// of ACTION_IF (DIRECTORY_EXISTS "solarom")

END			// of DEFINE_ACTION_MACRO ~GW_COMPATIBILITY_SOLAROM~
Puis dans la procédure d'installation des dialogues :

Code : Tout sélectionner

// COMPATIBILITÉ avec le mod Solaufein Romance : Modification du dialogue UHMER01.
LAM ~GW_COMPATIBILITY_SOLAROM~

ACTION_IF (GW_Uhmer01_state_remise1 > 0) BEGIN

	<<<<<<<< .../Diamant_Eternel/inlined/uhmer01.d
A_T_T UHMER01 %GW_Uhmer01_state_remise1% ~!GlobalGT("SolaTalk","GLOBAL",13)~
EXTEND_TOP UHMER01 %GW_Uhmer01_state_remise1%
	IF ~GlobalGT("SolaTalk","GLOBAL",13)~ THEN DO ~StartStore("GWwwmer1",LastTalkedToBy(Myself))~ EXIT
END
> >> >> >> >
	COMPILE ~.../Diamant_Eternel/inlined/uhmer01.d~ EVALUATE_BUFFER

END	// of ACTION_IF (GW_Uhmer01_state_remise1 > 0)
Ça me permet :

1. D'identifier la présence du mod Solaufein Romance dans le répertoire.
2. De savoir s'il a été installé avant mon mod ou s'il le sera après.
3. De gérer la modification du fichier UHMER01.dlg en conséquence.