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

[BANTERS] Les Banters de mon PNJ ne se déclenchent pas

Répondre
Avatar du membre
Klare
Tasloï
Messages : 75
Enregistré le : lun. 16 avr. 2012, 17:16
Localisation : Picardie, fausses terres de la pluie annuelle.
Statut : Hors ligne

[BANTERS] Les Banters de mon PNJ ne se déclenchent pas

.

Message par Klare »

Bonsoir bonsoir, me revoici, toujours autant chargé en question.

Donc, je travaille actuellement sur l'ajout de Banter a mon NPC, la base pour un bon PJ. Et outre l’écriture des banters, j'ai un petit problème.

Ça ne cause pas.

Grosso modo, les deux personnages Klare et Aerie sont dans mon groupe et tentent de communiquer, en vain. Je reste donc positif mon script doit marché, le problème vient du dialogue.

J'ai voulu séparer les banters a part histoire d’alléger un peu la totalité du texte de Klare. A tout les coup, c'est la source du problème.

Donc voici le morceau du script du NPC qui est chargé de lancer 3 banters avec Aerie :

Code : Tout sélectionner

// Banters                                                                           //
// Lancement de cette "competance" du NPC
IF
  InParty(Myself)
  Global("CKBanterON","LOCALS",0)                              // les banters n'ont pas encore été initiés
THEN
  RESPONSE #100
    RealSetGlobalTimer("CKBanterTimer","GLOBAL",20)            // Lance un timer pour les banters
    SetGlobal("CKBanterON","LOCALS",1)                         // les banters sont initiés
END

//Activation du mode Banter
IF  Global("CKmodebanter","GLOBAL",0)                             // si le mode banter est inactif
  RealGlobalTimerExpired("CKBanterTimer","GLOBAL")              // le timer est terminer
THEN
  RESPONSE #100
    SetGlobal("CKmodebanter","GLOBAL",1)                        // Activation du mode banter
    RealSetGlobalTimer("CKBanterTimer","GLOBAL",20)             // on relance le timer
END


// AERIE                            //
// Banter 1
IF
  Global("CKmodebanter","GLOBAL",1)                             // Le mode banter est activé
  Global("CKlareAerie","GLOBAL",0)                              // Aucune discution n'a encore eu lieu
  Global("KlareAerieEND","GLOBAL",0)                            // Banter non fini
  CombatCounter(0)
  !Detect([ENEMY])
  InParty(Myself)
  InParty("Aerie")  // ~Aerie~
  See("Aerie")      // ~Aerie~
  !Dead("Aerie")    // ~Aerie~
THEN
  RESPONSE #100
	SetGlobal("BCKAerie","GLOBAL",1)                            // C'est Aerie qui parle avec Klare
    ActionOverride("Aerie",StartDialogOverride("BCKlare","CKlare"))// lancement du banter par Aerie
END

// Banter 2
IF
  Global("CKmodebanter","GLOBAL",1)                             // Le mode banter est activé
  Global("CKlareAerie","GLOBAL",1)                              // 1 discution a  eu lieu
  Global("KlareAerieEND","GLOBAL",0)                            // Banter non fini
  CombatCounter(0)
  !Detect([ENEMY])
  InParty(Myself)
  InParty("Aerie")  // ~Aerie~
  See("Aerie")      // ~Aerie~
  !Dead("Aerie")    // ~Aerie~
THEN
  RESPONSE #100
	SetGlobal("BCKAerie","GLOBAL",1)                            // C'est Aerie qui parle avec Klare
    ActionOverride("Aerie",StartDialogOverride("BCKlare","CKlare"))// lancement du banter par Aerie
END

// Banter 3
IF
  Global("CKmodebanter","GLOBAL",1)                             // Le mode banter est activé
  Global("CKlareAerie","GLOBAL",2)                              // 2 discutions ont eu lieu
  Global("KlareAerieEND","GLOBAL",0)                            // Banter non fini
  CombatCounter(0)
  !Detect([ENEMY])
  InParty(Myself)
  InParty("Aerie")  // ~Aerie~
  See("Aerie")      // ~Aerie~
  !Dead("Aerie")    // ~Aerie~
THEN
  RESPONSE #100
	SetGlobal("BCKAerie","GLOBAL",1)                            // C'est Aerie qui parle avec Klare
    SetGlobal("KlareAerieEND","GLOBAL",1)                      // Les banters sont terminés
    StartDialogOverride("BCKlare","Aerie")                     // lancement du banter par Klare	
END
Et voici le fichier BCKlare que j'avais crée dans l'espoir de liberer du volume dans mon CklareJ

Code : Tout sélectionner

/* code dialogue :          
@00*** Klare                 
@01*** AERIE               */
APPEND CKlareJ
END

// AERIE                            //
APPEND BAERIE
END
//Banter 1
CHAIN
IF ~Global("CKmodebanter","GLOBAL",1)                             // Le mode banter est actif
    Global("CKlareAerie","GLOBAL",0)                              // On a pas encore de discution
    Global("BCKAerie","GLOBAL",1)~                                 // C'est Aerie qui parle avec Klare
THEN BAERIE CKlareAerieB1                                       // Debut banter 1
~Test~
== CKlareJ ~Test~
== BAERIE ~Test~
== CKlareJ ~Test~
== BAERIE ~Test~ 
END
IF~~ THEN DO ~ SetGlobal("BCKAerie","GLOBAL",0)        // Aerie a parlé
SetGlobal("CKlareAerie","GLOBAL",1)                             // Un banter fait
SetGlobal("CKmodebanter","GLOBAL",0)~ EXIT             // mode banter inactif

//Banter 2
CHAIN
IF ~Global("CKmodebanter","GLOBAL",1)                  // Le mode banter est actif
    Global("CKlareAerie","GLOBAL",1)                   // On a 1 discution
    Global("BCKAerie","GLOBAL",1)~                     // C'est Aerie qui parle avec Klare
THEN BAERIE CKlareAerieB2                              // Debut banter 2
~Test~
== CKlareJ ~Test~
== BAERIE ~Test~
== CKlareJ ~Test~
== BAERIE ~Test~ 
END
IF~~ THEN DO ~ SetGlobal("BCKAerie","GLOBAL",0)        // Aerie a parlé
SetGlobal("CKlareAerie","GLOBAL",2)                             // Deux banter fait
SetGlobal("CKmodebanter","GLOBAL",0)~ EXIT             // mode banter inactif

//Banter 3
CHAIN
IF ~Global("CKmodebanter","GLOBAL",1)                  // Le mode banter est actif
    Global("CKlareAerie","GLOBAL",2)                   // On a 2 discutions
    Global("BCKAerie","GLOBAL",1)~                     // C'est Aerie qui parle avec Klare
THEN BAERIE CKlareAerieB3                              // Debut banter 3
~Test~
== BAERIE ~Test~
== CKlareJ ~Test~
== BAERIE ~Test~ 
END
IF~~ THEN DO ~ SetGlobal("BCKAerie","GLOBAL",0)        // Aerie a parlé
SetGlobal("CKlareAerie","GLOBAL",3)                             // Deux banter fait
SetGlobal("CKmodebanter","GLOBAL",0)~ EXIT             // mode banter inactif

Je ne pense pas avoir faire d'erreur (au moins j'y crois!) et donc que mettre ceci directement dans le CklareJ et changer le script devrait fonctionner.

J'ai bien réfléchi a une magouille pour compiler le BCklare en tête du fichier .D via WeiDU, mais même si ça venait a fonctionner, je n'ai pas de méthode pour pouvoir ajouter le texte, ou je vois pas comment faire.

Reste donc la solution, tout coller dans le fichier de dialogue classique. Mais j'aimerais vraiment éviter :gign:

Donc ma question, y a-t-il un moyen de magouiller qui m'a échappé ?
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 »

Désolé, je n'ai pas le temps de poster trop longtemps.
Mais pour te permettre d'avancer, je vais t'indiquer 3 pistes que j'ai repérées au premier coup d'oeil :

1. Vérifie tes variables. J'ai repéré un ou deux trucs "bizarres".
2. Le 1° banter indique à Aerie de s'adresser à Klare en utilisant le fichier BCKlare alors qu'elle doit utiliser le fichier BAERIE !
3. Utilise la commande 137 StartDialogue(S:DialogFile*,O:Target*) car je n'ai jamais vu celle-ci : StartDialogOverride("BCKlare","CKlare")).


Je retourne à la finalisation de mes trois cartes et à la modification du Basilic d'Infinity Animations. Si j'ai le temps d'ici ce soir, je reverrai ton code, sinon, il faudra attendre la semaine prochaine.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Klare
Tasloï
Messages : 75
Enregistré le : lun. 16 avr. 2012, 17:16
Localisation : Picardie, fausses terres de la pluie annuelle.
Statut : Hors ligne
.

Message par Klare »

Donc j'ai modifier la commande de lancement de dialogue (j'ai trouver ma version dans la liste des actions/triggers) avec le fichier BAERIE et ca ce lance !

Je pense donc que mon probleme est resolu, je verrai ca ce soir ou demain pour plus de test.

Merci !
Avatar du membre
Klare
Tasloï
Messages : 75
Enregistré le : lun. 16 avr. 2012, 17:16
Localisation : Picardie, fausses terres de la pluie annuelle.
Statut : Hors ligne
.

Message par Klare »

Bon, mon jeu de variable marche plus ou moins, vu que le dialogue se lance.

Mais ceux ci sont capricieuse et seule Aerie pour lancer la discution avec Clare.

Code : Tout sélectionner

Soit la commande : ActionOverride("Aerie",StartDialog("BAERIE","CKlare"))
Celle pour que Klare soit motivé a parler :

Code : Tout sélectionner

StartDialog("BCklare","Aerie"))
Ne semble pas fonctionner.

J'ai donc tenter de passer par la .D de Klare CklareJ.

Code : Tout sélectionner

StartDialog("CklareJ","Aerie"))
La encore, queue de poisson, que nenni, nada niet.

Pourtant je suppose que le banter se lance dans le cas 1 (ou aerie parle) car mon BCKlare utilise la fonction APPEND BAERIE.
Ce qui permet aux CHAIN d'etre provoquées même si elle sont stockée sur BCKlare et non pas directement dans BAERIE.

Suis je trop naif de penser que l'APPEND CKlareJ utilisé quelque ligne plus tôt devrais me donner le même resultat? :'(


EDIT :

Erf, mes banters se bloque a 2/3 x meme avec la commande qui fonctionne pour lancer le dialogue. T.T
Avatar du membre
Klare
Tasloï
Messages : 75
Enregistré le : lun. 16 avr. 2012, 17:16
Localisation : Picardie, fausses terres de la pluie annuelle.
Statut : Hors ligne
.

Message par Klare »

Donc donc donc...

Et bien pour une raison obscure, je bloque a deux banters avec Aerie... J'ai donc jetté un petit oeil sur le mod de kim (ma reference en cas de pépin) et j'ai réécrit tout en propre.

Et ca coince toujours -_-

Ici le script de Klare pour ses banters,
On les inities
On inities si le NPC voulu est la
On lance un dialogue
On relance la machine

Code : Tout sélectionner

// Lancement de cette "competance" du NPC
IF
  InParty(Myself)
  Global("CKBanterON","LOCALS",0)                              // les banters n'ont pas encore été initiés
THEN
  RESPONSE #100
    RealSetGlobalTimer("CKBanterTimer","GLOBAL",40)            // Lance un timer pour les banters
    SetGlobal("CKBanterON","LOCALS",1)                         // les banters sont initiés
END



//Activation du mode Banter                                                       // AERIE                            //

IF
  CombatCounter(0)
  !Detect([ENEMY])
  InParty(Myself)
  See(Player1)
  !StateCheck(Player1,CD_STATE_NOTVALID)
  Global("CKmodebanter","GLOBAL",0)
  RealGlobalTimerExpired("CKBanterTimer","GLOBAL")
  InParty("Aerie")  // ~Aerie~
  See("Aerie")  // ~Aerie~
  !Dead("Aerie")  // ~Aerie~
  Global("KlareAerieEND","GLOBAL",0)                            // Banter d'aerie non fini
THEN
  RESPONSE #100
    SetGlobal("CKmodebanter","GLOBAL",1)
    RealSetGlobalTimer("CKBanterTimer","GLOBAL",100)
END

// Banter 1                                                                         //
IF
  Global("CKmodebanter","GLOBAL",1)
  CombatCounter(0)
  !Detect([ENEMY])
  InParty(Myself)
  InParty("Aerie")      // ~Aerie~
  See("Aerie")          // ~Aerie~
  !Dead("Aerie")        // ~Aerie~
  Global("CKlareAerie","GLOBAL",0)
THEN
  RESPONSE #100
    SetGlobal("CKlareAerie","GLOBAL",1)                       //Activation du banter 1
    SetGlobal("CKmodebanter","GLOBAL",2)                      // retour etat de base
    ActionOverride("Aerie",StartDialogue("BAERIE","Cklare"))  // Lancement dialogue
END


IF
  Global("CKmodebanter","GLOBAL",1)
  CombatCounter(0)
  !Detect([ENEMY])
  InParty(Myself)
  InParty("Aerie")      // ~Aerie~
  See("Aerie")          // ~Aerie~
  !Dead("Aerie")        // ~Aerie~
  Global("CKlareAerie","GLOBAL",1)
THEN
  RESPONSE #100
    SetGlobal("CKlareAerie","GLOBAL",2)                       //Activation du banter 2
    SetGlobal("CKmodebanter","GLOBAL",2)                      // retour etat de base
    ActionOverride("Aerie",StartDialogue("BAERIE","Cklare"))  // Lancement dialogue
END

IF
  Global("CKmodebanter","GLOBAL",1)
  CombatCounter(0)
  !Detect([ENEMY])
  InParty(Myself)
  InParty("Aerie")      // ~Aerie~
  See("Aerie")          // ~Aerie~
  !Dead("Aerie")        // ~Aerie~
  Global("CKlareAerie","GLOBAL",2)
THEN
  RESPONSE #100
    SetGlobal("CKlareAerie","GLOBAL",3)                       //Activation du banter 3
    SetGlobal("CKmodebanter","GLOBAL",2)                      // retour etat de base
    ActionOverride("Aerie",StartDialogue("BAERIE","Cklare"))  // Lancement dialogue
END

IF
  Global("CKmodebanter","GLOBAL",2)
THEN
  RESPONSE #100
    Wait(2)
    SetGlobal("CKmodebanter","GLOBAL",0)                      // retour etat de base
END
Et le coté dialogue, épuré au possible

Code : Tout sélectionner

/* code dialogue :          
@00*** Klare                 
@01*** AERIE               */
APPEND CKlareJ
END

// AERIE                            //
APPEND BAERIE
END
//Banter 1
CHAIN
IF ~ Global("CKlareAerie","GLOBAL",1)                              // On est au banter 1
    Global("BCKAerieb1","LOCALS",0)~                                
THEN BAERIE CKlareAerieB1                                       // Debut banter 1
~Test~
DO ~SetGlobal("BCKAerieb1","LOCALS",1)~
== CKlareJ ~B1~
== BAERIE ~B1~
== CKlareJ ~B1~
== BAERIE ~B1~ EXIT 


//Banter 2
CHAIN
IF ~ Global("CKlareAerie","GLOBAL",2)                              // On est au banter 2
    Global("BCKAerieb2","LOCALS",0)~                                
THEN BAERIE CKlareAerieB2                                       // Debut banter 2
~Test~
DO ~SetGlobal("BCKAerieb2","LOCALS",1)~
== CKlareJ ~B2~
== BAERIE ~B2~
== CKlareJ ~B2~
== BAERIE ~B2~ EXIT                                  


//Banter 3
CHAIN
IF ~ Global("CKlareAerie","GLOBAL",3)                              // On est au banter 3
    Global("BCKAerieb3","LOCALS",0)~                                
THEN BAERIE CKlareAerieB3                                         // Debut banter 3
~Test~
DO ~SetGlobal("BCKAerieb3","LOCALS",1) SetGlobal("KlareAerieEND","GLOBAL",1)~     
== CKlareJ ~B3~
== BAERIE ~B3~
== CKlareJ ~B3~
== BAERIE ~B3~ EXIT 
Je voix pas ou ca peu coincé :gign: ... je veux dire le modele de chain des banters est similaires, pareil pour le script.
La création d'une boucle infinie devrais etre possible vu que j'ai deja eu un bug similaire... Bref, je seche.
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 »

J'avoue ne pas m'être penché en détail sur ce que tu as écrit. Mes remarques portent plutôt sur ton approche des banters, qui me semble erronée.

Sauf cas particulier, les banters entre personnage du groupe (hors PJ) ne sont pas déclenchés par un script. Il existe un mécanisme intrinsèque au jeu, au travers du fichier INTERDIA.2DA, qui déclare le fichier de banter associé au script name (= death variable) d'un personnage. Grâce à cette information, le jeu trouve tout seul le fichier DLG qui contient les discussions que peut lancer un personnage.
Le déclenchement d'un banter par le jeu est plus ou moins aléatoire, mais il est possible, dans une certaine mesure (ça n'en déclenche pas un à chaque fois), de forcer le déclenchement d'un banter avec la combinaison Ctrl-I (parmi les cheatkeys).
En général, on crée un fichier spécifique Bxxxxxxx.DLG pour les banters (exemple BAERIE).

Il existe un accélérateur de banter écrit par J Compton et intégré dans de nombreux mods (dont le BG1 NPC), qui vient modifier le script Baldur.BCS pour gérer lui-même un timer et déclencher des discussions. La commande utilisée pour initier le dialogue est Interact et non StartDialog.

Le seul cas particulier de banter contrôlé par script, c'est quand on veut le lier à un événement particulier. Dans ce cas, le dialogue qui semble souvent utilisé est plutôt xxxxxxxJ.DLG (dans BG1 NPC notamment) et on n'utilise pas Interact mais plutôt StartDialogueNoSet (pas besoin de préciser le dialogue, on prend celui par défaut de la créature, soit le xxxxxxxJ.DLG).


Sur le fond, tes bidouilles en utilisant StartDialogue au travers de ActionOverride, avec comme paramètre "BAERIE" et "CKlare", sont particulièrement risquées. En effet la description de StartDialogue est la suivante (cf IESDP) :
StartDialogue(S: DialogFile*,O:Target*)
This action instructs the active creature to start the specified dialog with the specified target. The dialog can be initiated from a distance and must have at least one state with all its top level conditions true else it will not initiate. The active creature has its dialog file permanently set to the file specified by the DialogFile parameter.
Autrement dit, en utilisant la commande StartDialogue sur Aérie, en précisant le dialogue BAERIE, tu es en train d'écraser son dialogue normal lorsqu'elle fait partie du groupe, AERIEJ, par celui qui sert seulement aux banters, BAERIE. De sorte que le script qui contrôle Aerie pourrait vouloir déclencher une discussion d'Aérie avec le PJ (romance ou autre raison) et échouer lamentablement puisque le dialogue d'Aerie est désormais BAERIE, qui ne contient aucun texte de romance ou de discussion avec le PJ. Bref le personnage d'Aerie va être quasiment complément désactivé par ton mod tel qu'il est.

Par ailleurs, tu as parfaitement le droit d'ajouter un morceau de script à celui d'Aerie afin que ce soit le script d'Aerie qui déclenche une discussion avec ton personnage (mais voir ma remarque initiale sur le fait que ce n'est pas utile dans la majorité des cas de banter). Cela éviterait aussi des ActionOverride partout.
:!: 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 !
Avatar du membre
Klare
Tasloï
Messages : 75
Enregistré le : lun. 16 avr. 2012, 17:16
Localisation : Picardie, fausses terres de la pluie annuelle.
Statut : Hors ligne
.

Message par Klare »

Et bé... ca marche, merci Isaya ;)

Donc en effet en modifiant sauvagement le INTERDIA.2DA (enfin, l'ouvrir d'un coup de bloc note et ajouter deux mots) et en supprimant du même coup le code inutile dans le script du NPC, ca marche.

Je verrais bien IG si les dialogues se lancent, pour le moment le ctrl+I y arrive tres bien.

Je suppose donc que mes conditions de lancement doivent passer dans le .D "BCKlare" qui sert au banter maintenant
(ou bien les conditions X et Y se voient, sont vivants, etc... sont gérés par l'interdia?)

EDIT 1 :
Oui, d'apres BAERIE les conditions sont a ecrire dans le fichier texte du banter.

Et qu'il suffit d'une commande WEIDU pour étendre le .2DA et y ajouter trois mots?
(J'ai d'abord penser que c'etait dans le weidu qu'on devait utiliser ajouter le nom du banter... avant de trouver le .2DA dans l'override...)

EDIT 2 :

D'apres le BG1 NPC Pack, ca sera la commande suivante :
APPEND ~interdia.2da~ ~IMOEN BIMOEN2~
Qui retouchée
APPEND ~interdia.2da~ ~Cklare BCklare~

Permettrai d'ajouter automatiquement les banters a l'animal.
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 »

As-tu déjà lu un tutoriel de création de PNJ ? Ces points y sont systématiquement abordés.

Celui de xena, en français, n'est pas très détaillé sur ce point et est incomplet (pas de prise en charge de SoA et ToB), et il utilise aussi le B à la fin du nom et non au début. J'ai fait quelques remarques sur ce point, avec un exemple, à la suite du tutoriel.
En anglais, il ne manque pas de tutoriels plus précis. Je te suggère de partir de la la liste du site Spellhold Studios (voir liens dans le sujet épinglé sur les outils), qui a l'avantage de préciser si les tutoriels utilisent des méthodes un peu obsolètes.
:!: 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 !
Avatar du membre
Klare
Tasloï
Messages : 75
Enregistré le : lun. 16 avr. 2012, 17:16
Localisation : Picardie, fausses terres de la pluie annuelle.
Statut : Hors ligne
.

Message par Klare »

Et bien j'ai lu les tutorials de la couronne, dont celui de Xena, et deux document en anglais (que j'ai pas conservé, hélas) histoire de pas me lancer a corps perdu dans le mur.
si ce point a été abordé, je suis méchamment passé a côté. [Ou je l'ai pas compris sur le coup et j'ai oublié]

Spellhold avait un tutorial interessant sur les NPC mais les liens sont non fonctionnels, maintenant j'avoue ne pas avoir retourner la totalité des données ^^ "



Bon, c'est sur, les tutos sont les moyens les plus simples, mais les trouver c'est pas mon point fort (hahaha... haaaa)
Du coup j'essaye de comprendre les mecanismes en etudiant d'autres mods fonctionnels (d'ou ma tentative de forcer le banters via le script du NPC)
Répondre

Retourner vers « Dialogues »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités