Page 1 sur 1

[PNJ] Je n'arrive pas à implanter correctement mon NPC dans le jeu

Posté : mar. 01 avr. 2008, 19:44
par phoeunix
Salutations.
Je suis actuellement en train de créer un mod introduisant un PNJ recrutable supplémentaire qui s'appellera normalement Leila.
A ce titre, j'ai voulu dès à présent créer une petite installation pour implanter Leila sur son point d'apparition dans le Bosquet aux Druides, lui mettre un dialogue de recrutement basique et lui permettre de rejoindre le groupe.

Je me heurte à plusieurs problèmes :
- Leila apparaît dès qu'on arrive dans le Bosquet aux Druides de n'importe quel point de la carte plutot que du point voulu.
- Ce n'est pas une seule Leila mais une nuée de Leila qui apparaît en cascade.
- Quand chaque Leila apparait elle lance un premier dialogue "Salut." avec le son "Bonjour la compagnie" attribué habituellement aux bourgeoises.
- Puis elle vient au contact du groupe et enclenche le dialogue de recrutement mais le texte est désordonné : elle dit le texte @00000 au lieu du @0 et le PJ a le texte @1 à la place du choix @00001. Les autres textes sont les bons et le recrutement fonctionne avec la bonne séquence de dialogue.

A part ça, le perso une fois dans le groupe est opérationnel et a les caractéristiques prévues.

L'éventreuse a testé l'install aussi chez elle et a eu exactement le même résultat que moi.
Voici ci-dessous le détail des fichiers de l'install.
Merci d'avance à ceux qui m'aideront, j'espère qu'ils pourront me donner des précisions détaillées sur ce qui cloche. Vu que je débute, une correction précise serait la bienvenue. :)

Le fichier DDLeila.d :

Code : Tout sélectionner

BEGIN ~DDLeila~

// Rencontre :

IF ~NumTimesTalkedTo(0)
   
 Global("DDLeilaExists","AR1900",1)~ THEN BEGIN Coucou
  SAY @0
  IF ~~ THEN REPLY @00000 GOTO Welcome
  IF ~~ THEN REPLY @00001 GOTO CasseToi
END

IF ~~ THEN BEGIN Welcome
  SAY @1
  IF ~~ THEN DO ~JoinParty()~ EXIT
END

IF ~~ THEN BEGIN CasseToi
  SAY @2
  IF ~~ THEN DO ~EscapeArea()~ EXIT
END
Le setup.tra

Code : Tout sélectionner

@0 = ~Leila NPC : version Beta 0.00~
Le script DDLeila.baf :

Code : Tout sélectionner

IF
See([PC])
NumTimesTalkedTo(0)
THEN
RESPONSE #100
Dialogue(Nearest([PC]))
END
Le script DDAr1900.baf

Code : Tout sélectionner

// Spawn Bosquet des Druides

IF
  Global("DDLeila","AR1900",0)
THEN
  RESPONSE #100
    SetGlobal("DDLeilaExists","AR1900",1)
    CreateCreature("DDLeila",[62.43],10)
END
Le setup.tp2 :

Code : Tout sélectionner

BACKUP ~Leila/backup~
AUTHOR ~...~

LANGUAGE ~Francais~
     ~french~
     ~Leila/Translations/French/Setup.tra~


BEGIN @0

// Creatures
COPY ~Leila/Creatures/DDLeila.cre~ ~override~

// Dialogues
COMPILE ~Leila/Dialogues/DDLeila.d~
    USING ~Leila/Translations/French/DDLeila.tra~

// Scripts
COMPILE ~Leila/Scripts/DDLeila.baf~
    USING ~Leila/Translations/French/DDLeila.tra~

// Pictures
COPY ~Leila/Pictures~ ~override~

// Scripts of Area
EXTEND_BOTTOM ~AR1900.bcs~ ~Leila/Scripts/DDAr1900.baf~

Re : Problème d'implantation du personnage.

Posté : mar. 01 avr. 2008, 23:03
par Isaya
Petit exercice de mathématique amusante dans un autre contexte. Supposons que tu gagnes 1 € par mois et que tu veuilles négocier un changement de salaire (a priori une augmentation). Irais-tu demander à ton patron de modifier ton salaire pour le passer à 00001 € ?

Bref, pour répondre à un de tes problèmes, l'apparition des "mauvaises" répliques, il te suffira de t'assurer que chaque valeur attribuée à un texte est bien différente des autres. WeiDU considère la valeur indiquée après le '@' comme un nombre et, comme j'ai cherché à le suggérer par mon petit exercice, ajouter des 0 devant un nombre n'en a jamais changé la valeur. Dès lors WeiDU prend le premier texte qui porte la valeur 0 lorsque tu précises @0 ou @0000.

Quand au problème concernant l'apparition multiple de ton personnage, cette fois-ci je ferai plutôt appel au rappel de langue française. Oui, c'est ma journée professeur ! ;)

Dans le jeu, les scripts s'exécutent en permanence. En pratique, le jeu exécute les scripts au rythme de répétition indiqué dans la configuration de BGConfig. En général la fréquence de l'IA est fixée à 30, donc 30 répétitions par seconde (si les actions demandées sont très courtes). Donc ton script n'arrête pas de s'exécuter et faute d'un mécanisme adapté pour l'empêcher, tes actions vont se répéter à l'infini (la création du personnage). C'est l'objectif du test Global("xxxx", "AR1900", 0) qui vérifie que la variable "xxxx" est bien à 0 pour déclencher l'action.
Par ailleurs les variables dans des scripts sont identifiées par des textes. Comme dans tous les langages, deux mots qui ne s'écrivent pas pareils désignent des variables différents.

Donc quand tu testes la variable "DDLeila" à 0 et qu'ensuite tu mets à 1 la variable "DDLeilaExists" (note bien que tu as ajouté "Exists" en plus), forcément la variable "DDLeila" reste à 0, donc le script se dit que la condition est encore vérifié et qu'il faut effectuer l'action, à savoir créer le personnage. Et ainsi de suite...

Jeune phoeunix / Shalendra, vous me copierez 100 fois : "je ne remettrai plus ma copie sans l'avoir préalablement relue". :tongue:

En ce qui concerne les conditions d'apparition du personnage, rien dans ce que tu as écrit ne permet de conditionner son apparition en fonction de ton point d'arrivée sur la carte. D'une part, ton script la crée dès que tu arrives sur la carte, la seule condition étant qu'elle n'existe pas déjà (enfin, dès que tu auras corrigé le problème de nom de variable). D'autre part, la commande qui force son apparition définit de façon fixe le point de création en [62.43], soit en haut à gauche de la carte. Ta remarque laisse entendre que tu n'es pas satisfait du point auquel Leila apparaît mais je ne sais pas ce que tu souhaitais obtenir. Il te faudrait le préciser pour qu'on comprenne ce qui ne satisfait pas.

Pour terminer, comme tu n'as pas fourni le contenu du fichier .tra associé à ton dialogue, il n'est pas possible de répondre à ta remarque concernant le doublage vocal. C'est en effet sur la ligne @0 (contenant a priori @0 = ~Salut.~ si j'ai bien compris ce que tu attendais) qu'on pourrait trouver les éléments permettant de comprendre. Le doublage vocal dépend d'une association entre le texte et le son qui se fait à partir du fichier .tra en indiquant après le texte le nom du fichier son associé sous la forme [NOMFIC] ou NOMFIC désigne un nom de fichier de jusqu'à 8 caractères.

Il faut également savoir que WeiDU n'ajoute de nouveau texte dans le fichier dialog.tlk que si les textes de ton mod n'existent pas déjà dans le fichier. Si le texte est déjà présent, WeiDU se contente de faire pointer ton dialogue sur le texte existant. Or une phrase aussi simple et courante que ~Salut.~ a de très grandes chances d'exister. Si le jeu original a associé au texte ~Salut.~ le son "Bonjour la compagnie", ton dialogue récupérera donc et le texte et le son.
Je ne suis pas certain de la façon de procéder pour éviter un tel problème. La meilleure solution consiste à trouver une réplique initiale plus originale pour éviter que WeiDU ne puisse réutiliser un texte existant et le son éventuellement associé.
De toute façon, il faudrait que tu nous fournisses le contenu du fichier .tra du dialogue pour en avoir le coeur net.

Sur ce, bienvenue et bonne continuation dans le monde merveilleux mais sans pitié de la création de mod.

Re : Problème d'implantation du personnage.

Posté : mer. 02 avr. 2008, 13:31
par phoeunix
Des nouvelles du front... De bonnes nouvelles même :)

Grâce à tes précieuses indictions Isaya, j'ai pu avec l'aide de Jack l'éventreuse, régler la plupart des problèmes :

- Le dialogue de recrutement marche impecc, les réponses s'emboitent bien.
- Y a plus le dialogue subsidiaire avec le "Salut" et le son. (le "salut" ne faisait pas partie d'un des dialogues du .tra)
- Une seule et unique Leila apparait. ^^
- Leila apparait effectivement en haut à gauche de la carte. Je voudrais la placer ailleurs mais je sais pas faire mais c'est pas bien grave pour l'instant. :)


Donc tout va bien SAUF un dernier truc dont je me suis rendu compte qu'aujourd'hui : Leila n'a pas son prénom dans la fiche de personnage, ni dans les dialogues, ni dans le jeu quand je mets le curseur dessus, ni dans l'inventaire (nulle part quoi).
Ca me chiffonne un peu et je sais pas comment m'y prendre.
C'est donc l'occasion d'en remettre une couche :

Le SFLeila.d (j'ai changé de préfix, celui là est le définitif que j'ai fait enregistrer ; j'ai fait toutes les modifs de préfixe dans tous les fichiers) :

Code : Tout sélectionner

BEGIN ~SFLeila~

// Rencontre :

IF ~NumTimesTalkedTo(0)
    Global("SFLeilaExists","AR1900",2)
    Global("SFLeila","AR1900",2)~ THEN BEGIN Coucou
  SAY @1
  IF ~~ THEN REPLY @10000 GOTO Welcome
  IF ~~ THEN REPLY @10001 GOTO CasseToi
END

IF ~~ THEN BEGIN Welcome
  SAY @2
  IF ~~ THEN DO ~JoinParty()
                 IncrementGlobal("SFLeilaExists","AR1900",1)
                 IncrementGlobal("SFLeila","AR1900",1)~ EXIT
END

IF ~~ THEN BEGIN CasseToi
  SAY @3
  IF ~~ THEN DO ~EscapeArea()~ EXIT
END
Le SFLeila.tra (celui-ci n'était pas spécialement destiné à la lecture par autrui et je n'ai pas la prétention de penser qu'il fera dire d'autres que moi... la vie est triste parfois) :

Code : Tout sélectionner

@50000 = ~Leila~

// Rencontre :

@1 = ~Salut toi, tu m'emmenes faire un tour ?~
@10000 = ~Oui pourquoi pas, tu m'as l'air physiquement intelligente !~
@10001 = ~Je crois que tu es un petit trop complètement trop sûre de toi, alors tu vas rester ici sagement comme une conne à attendre que la pluie te tombe sur la gueule. Hahaha je t'ai cassée !~
@2 = ~Ca promet ! En route !~
@3 = ~Lol, connard ! Mais dégage de là, vas te faire buter par un dragon !~
Le setup.tra :

Code : Tout sélectionner

@0 = ~Leila NPC : version Beta 0.00~
Le SFLeila.baf :

Code : Tout sélectionner

IF
  Global("SFLeilaExists","AR1900",1)
  Global("SFLeila","AR1900",1)
  !StateCheck(Player1,STATE_SLEEPING)
  !Detect([ENEMY])
  See([PC])
  NumTimesTalkedTo(0)
THEN
  RESPONSE #100
  IncrementGlobal("SFLeilaExists","AR1900",1)
  IncrementGlobal("SFLeila","AR1900",1) 
  ActionOverride("SFLeila",StartDialogueNoSet(Player1))
END
Le SFAr1900.baf :

Code : Tout sélectionner

// Spawn Bosquet des Druides

IF
  Global("SFLeila","AR1900",0)
THEN
  RESPONSE #100
    SetGlobal("SFLeilaExists","AR1900",1)
    SetGlobal("SFLeila","AR1900",1)
    CreateCreature("SFLeila",[62.43],10)
   
END
Le setup.tp2 :

Code : Tout sélectionner

BACKUP ~Leila/backup~
AUTHOR ~...~

LANGUAGE ~Francais~
     ~french~
     ~Leila/Translations/French/Setup.tra~


BEGIN @0

// Creatures
COPY ~Leila/Creatures/SFLeila.cre~ ~override~

// Dialogues
COMPILE ~Leila/Dialogues/SFLeila.d~
    USING ~Leila/Translations/French/SFLeila.tra~

// Scripts
COMPILE ~Leila/Scripts/SFLeila.baf~
    USING ~Leila/Translations/French/SFLeila.tra~

// Pictures
COPY ~Leila/Pictures~ ~override~

// Scripts of Area
EXTEND_BOTTOM ~AR1900.bcs~ ~Leila/Scripts/SFAr1900.baf~
Concernant le SFLeila.cre :
- quand je met Leila dans shortname, que je sauvegarde et que je rouvre, le prénom n'y est lus : est-ce normal ?
- dans la section other attributes / scripting and dialog j'ai mis SFLeila dans Override script, Death Variable et Dialog file.


D'avance, d'autres remerciements pour m'aider à doner son nom à Leila.

Re : Problème d'implantation du personnage.

Posté : mer. 02 avr. 2008, 19:03
par Akadis
Il faut que tu rajoute une ligne dans ton setup.tra
@1 = ~Leila~
et que tu complètes l'instruction suivante dans ton setup.tp2
COPY ~Leila/Creatures/SFLeila.cre~ ~override~
SAY NAME1 @1
SAY NAME2 @1

Re : Problème d'implantation du personnage.

Posté : mer. 02 avr. 2008, 19:27
par Isaya
Certaines questions relèvent du b-a-ba de la création de mod. Je t'invite à lire tous les tutoriels référencés dans le sujet épinglé du forum sur les outils.
En particulier, les deux sites indiqués en premier, même s'ils sont assez ancien, comportent des informations techniques (appelées "théorie" sur l'un d'entre eux) qui permettent de mieux appréhender certaines contraintes du moteur de jeu Infinity Engine. Les outils décrits sont un peu dépassés mais les informations restent vraies.
Par ailleurs, xena a écrit un tutoriel sur la création de mod qui devrait également t'apporter des informations ou des exemples (j'y reviendrai).

Sans développer (je te laisse le soin de lire les tutoriels pour mieux comprendre), voici quelques réponses.

En ce qui concerne le nom de ton personnage, tu verras que les fichiers CRE, ITM, ... ne mémorisent pas les noms et descriptions. Ils se contentent de pointer sur le texte qui se trouvent dans le fichier dialog.tlk. C'est la raison pour laquelle tu ne retrouves pas le nom du personnage quand tu recharges le fichier CRE.
Pour que le personnage ait un nom une fois dans le jeu, il faut que tu t'assures de l'ajouter au moment où la procédure d'installation (le fichier TP2) copie le fichier CRE. Si tu regardes le tutoriel de Xena, tu verras qu'elle a ajouté des lignes "SAY ..." juste après l'instruction "COPY ... xxxx.CRE ...".
Puisque tu utilises (contrairement à son tutoriel) un fichier .tra pour les textes, il te faut remplacer le nom entre ~~ par une référence @50000 (valeur reprise de ton fichier SFLeila.tra) et déplacer la ligne @50000 = ~Leila~ dans ton fichier setup.tra. C'est en effet dans ce fichier que WeiDU ira chercher la référence, pas dans le fichier SFLeila.tra, qu'il n'utilisera que pour compiler le fichier SFLeila.d.
Pour résumer, un fichier .tra est généralement associé à un fichier .d ou à un fichier .tp2. Il faut mettre dans Toto.tra les textes référencés dans Toto.d. Et il faut mettre dans setup.tra (plus précisément le fichier indiqué au tout début du fichier tp2) les textes référencés dans le fichier tp2.

Dans un tout autre registre, j'ai noté que tu avais tenu compte de la modification du nom de variable pour la création. Mais maintenant tu as deux variables, c'est à dire très probablement une de trop. D'ailleurs tu testes partout les deux (sauf au début du script de la zone) et tu les modifies partout de la même façon. Très clairement, il y en a une d'inutile. Tu dois donc pourvoir supprimer celle qui n'est pas testée au moment de la création du personnage (SFLeilaExists).
Par ailleurs, la modification des variables quand le personnage rejoint le groupe est inutile. Etant donné que tu lui as déjà parlé, la condition NumTimesTalkedTo(0) suffira à interdire de réutiliser la réplique initiale du dialogue (pas besoin de modifier les variables pour ça).

Le point d'apparition de Leila est choisi par [62.43], des coordonnées X, Y. Si cette valeur ne te convient pas, utilise les touches rapides (peut-être X de mémoire) pour montrer le nom de la zone et qui donne également les valeurs X,Y sous le pointeur de la souris. Va à l'endroit souhaité et reprend les valeurs affichées pour la commande CreateCreature.