Page 1 sur 1

[BANTERS] Comment donner la priorité à un lancement de dialogue ?

Posté : mer. 29 oct. 2003, 16:00
par Grenouillebleue
Pour briser un peu la monotonie, la première phrase de certains banters n'appartient pas à Kim, mais à quelqu'un d'autre. Par exemple, Cernd qui dit : "Oh, tu as de beaux seins" (Je simplifie).

Or, j'ai pas mal de soucis pour coder ça. J'y étais allé avec ce code-là:

Code : Tout sélectionner

IF
  Global("KIMBANTER","GLOBAL",1) // Si c'est le moment de discuter
  InParty("Kim") // que Kim est là
  InParty("Cernd") // et Cernd aussi
  See("Cernd")
  !Dead("Cernd")
  Global("CERNDKIM","GLOBAL",0) // Et qu'ils n'ont encore jamais discuté
THEN
  RESPONSE #100
    SetGlobal("CERNDKIM","GLOBAL",1) 
    ActionOverride("CERND",StartDialog("BCERND","Kim")) // Alors on lance le dialogue 1
END
A côté, j'ai un APPEND à BCERND qui fait:

Code : Tout sélectionner

APPEND BCERND

IF ~G("CerndKim",1)~ THEN BEGIN CerndKim1
  SAY ~ Oh, tu as de beaux seins.~
  IF ~~ THEN DO ~SG(KIMBANTER",0)~ EXTERN BKIM KimCernd1
END
Quand les deux personnages sont seuls dans le groupe, ça marche sans aucun problème. L'ennui, c'est quand il y a plus de monde: dans ce cas, et forcément, mon script enclenche un banter de Cernd qui n'est pas celui que je veux (puisqu'ils sont placés avant). Y aurait-il un moyen de faire que mon append se place au début, ou quelque chose comme ça ?

Posté : mer. 29 oct. 2003, 16:46
par Grenouillebleue
Ok, j'ai ma réponse, il faut que j'utilise les WEIGHT.

Posté : lun. 05 janv. 2004, 13:26
par Nysi
Je suis en train de créer mon pnj, jusqu’à présent tout va bien mais alors arrivé au banter :sad: , elle ne démarre pas.

J'ai regarder comment grenouille a fait pour kim (Et aussi dans les mods tashia et solaufein) mais rien a faire je pige pas.

Je sais qu'il faut définir une variable pour que le dialogue se lance (j'ai essayé), mais ça marche pas. (J'ai fait des CTRL+I avec la console pour tester si quelqu’un connait un autre moyen qu'il le dise)

Aussi a quoi serve les WEIGHT ?

Posté : mar. 06 janv. 2004, 21:06
par Isaya
Je n'ai pas trouvé Ctrl-I dans les références de la console. Quelle fonction cherches-tu ?

Sinon, pour les dialogues, il faut bien comprendre comment ça marche. Un dialogue de PNJ, c'est un ensemble d'interactions. Une interaction est provoquée par des conditions. Les conditions s'appuient généralement sur des variables qui doivent avoir des valeurs précises pour qu'un ensemble de conditions soient vérifiées et que le dialogue débute (mais ça peut aussi être des trucs du genre être à l'extérieur ou en plein jour, ...).
Quand un dialogue est initié, le jeu prend le fichier définissant le dialogue et le parcourt du début à la fin en cherchant le premier jeu de conditions vérifiées. Du coup, les premières interactions dans la liste ont la priorité si leurs conditions sont vérifiées. C'est là que la notion de WEIGHT peut intervenir. Quand tu ajoutes des interactions dans un dialogue, elles sont toujours à la fin. En donnant un "WEIGHT" approprié, tu peux modifier l'ordre d'évaluation des conditions et faire en sorte que les conditions d'interactions à la fin du fichier soient évaluées avant certaines placées avant elles.

Dans le cas des banters, les conditions sont généralement vérifiées dans le script du personnage (par exemple Jaheira.bcs) susceptible d'initier le dialogue. Alors le script met à jour une variable spécifique utilisée dans un jeu de conditions du dialogue. Puis il provoque le début du dialogue. Comme la modification de la variable entraîne la vérification des conditions propres à une interaction, celle-ci va alors débuter.
La modification de la variable dans le script lui permet aussi de s'assurer de ne pas réinitialiser de nouveau cette interaction.

Exemple de morceau de script (de Jaheira) :

Code : Tout sélectionner

IF
  InParty("Aerie")
  See("Aerie")
  !Dead("Aerie") // Aerie
  !StateCheck("Aerie",STATE_SLEEPING)
  HPLT("Aerie",10)
  !HP("Aerie",1)
  CombatCounter(0)
  GlobalLT("JaheiraAerie","LOCALS",2)
  Global("AerieBelow10","LOCALS",0)
  InParty(Myself)
THEN
  RESPONSE #100
    Interact("Aerie")
END
Si Aerie est gravement blessée et que le dialogue n'a jamais eu lieu (tests sur les variables JaheiraAerie et AerieBelow10), on lance une interaction avec Interact() en précisant "Aerie" pour indiquer avec qui. Le fait d'utiliser Interact fait que le jeu va chercher le dialogue d'interaction de Jaheira (BJAHEIR.DLG, voir INTERDIA.2DA) ou l'on trouve notamment une partie de ces conditions comme déclencheur d'une interaction.

Code : Tout sélectionner

  InParty("Aerie")
  See("Aerie")
  HPLT("Aerie",10)
  Global("JaheiraAerie","LOCALS",1)
  Global("AerieBelow10","LOCALS",0)
Le dialogue modifie alors les variables (dans la partie action du dialogue) pour éviter que le dialogue ne se produise à nouveau.

Code : Tout sélectionner

    SetGlobal("JaheiraAerie","LOCALS",2)
    SetGlobal("AerieBelow10","LOCALS",1)
Il y a d'autres façons de faire. Tu peux regarder les scripts des personnages de Bioware comme exemple (en complément des mods que tu as cités).

Posté : mar. 06 janv. 2004, 21:38
par Nysi
Mon probleme doit venir d'un manque de sript, ce soir je suis fatigué donc j'essayerai tout ça a tete reposée.
Merci de ta reponse Isaya.

Pour les CTRL-I c'est une commande (cheat) qui une fois activé permet de forcer les banter a se lancer.