Page 1 sur 1

Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 01:58
par Answald
Salut,
J'ai fait apparaître un garde demi-ogre, un ogre et un capitaine hobgobelin par clua console. Je les ai enrôlé grâce au ctrl+q. Je leur ai donné des classes par Shadowkeeper et j'ai fait quelques ajustements. Mais j'ai un problème : l'ogre (et seulement lui) disparaît du plateau dès qu'il passe en dehors du champ de vision d'un autre de mes persos. Son image reste bien sur la droite. Que dois-je modifier dans son profil de variables et valeurs diverses ?

D'autre part, j'aimerais aller plus loin en permettant d'enrôler ces personnages. J'ai NearInfinity.jar. Comment définir une position à ses personnages et comment leur mettre un dialogue simple de recrutement ?

PS : j'ai plein de mods dont BGT qui changent les numérotations des cartes de BG 1 (ARxxxx).

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 09:09
par Akadis
Tu trouveras des liens vers tutoriaux NPC dont certains sont en français sur ce sujet

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 11:10
par Answald
Merci,
C'est vrai que je me suis précipité. J'ai vu qu'il y avait ensuite une page pour apprendre les bases du modding.
J'ai vraiment envie de réussir à rendre ces monstres recrutables. Je vous tiens au courant par ce topic.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 16:27
par Answald
Le rapport de Weidu me signale une erreur de syntaxe au niveau du premier EXIT.

IF ~~ THEN BEGIN Fight
SAY ~WAAARG ! Môa toujours écrabouiller moucherons qui menacent !~ EXIT
END

Quelle est la bonne syntaxe pour positionner ce EXIT ?

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 16:50
par Armand
Eh bien en fait tout bloc de condition est composé de la même manière à savoir une condition SI/ALORS ou IF/THEN. Par conséquent : IF ~~ THEN BEGIN Fight SAY ~WAAARG ! Môa toujours écrabouiller moucherons qui menacent !~ IF ~~ THEN EXIT END Après les possibilités sont multiple mais il est bon de savoir qu'un .d veut dire : - Say pour la réplique du personnage concerné et - Une réponse de via un then reply ou - Une fin de dialogue via un EXIT ou - Un APPEND via un then extern P.S : Désolé pour la présentation mais mon p***** de pc ne veut rien comprendre. Si ça continue je sens que je vais emmener cette saleté dans un p**** où il pourra à loisir faire c*** (fin de phrase censuré, trop de grossièreté qui me font grincer les oreilles).

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 17:17
par Answald
Jai remplacé le simple EXIT par un IF ~~ THEN EXIT.
Ce problème est résolu.

Mon nouveau problème est que le WeiDU me dit que l'apostrophe est un caractère invalide.

Edit : L'apostrophe étai invalide car j'avais mis deux vaguelettes au début de la phrase, au lieu d'une seule.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 18:07
par phoeunix
Tu as utilisé l'apostrophe à quel endroit ?

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 18:21
par Answald
Mon problème d'apostrophe est réglé.

Par contre, j'ai un nouveau problème (on s'en serait douté).
WeiDU me signale une PARSE ERROR near : Non, à la ligne 42. Voici la ligne :
IF ~~ THEN REPLY ~Non, pardon, je voulais désengager quelqu'un d'autre.~ DO ~JoinParty()~ EXIT
Je ne sais pas ce qu'est une Parse error et je ne vois pas ce qui cloche dans cette ligne.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 19:11
par phoeunix
Hmmm en l'état, cette ligne me parait correcte, est-ce que tu pourrais mettre le bloc en entier pour qu'on ait une vue d'ensemble, le souci peut venir d'une autre ligne du bloc.

Sinon la parse error, c'est une erreur de syntaxe, à comprendre de syntaxe Weidu, qui fait que le compilateur n'arrive pas à interpréter ce qui a été écrit et donc à faire la compilation.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 20:40
par Answald
En fait, je me suis trompé de ligne, mais je ne vois pas non plus l'erreur. Voilà tout le bloc.

IF ~NumTimesTalkedTo(1) Global("UgarJoined","LOCALS",0)~ THEN BEGIN Rejoin
SAY ~Ah, salut ! Alors, toi encore besoin de môa en fait ?~
IF ~~ THEN REPLY ~Oui, si tu veux toujours venir avec moi, tu peux. J'ai besoin de quelqu'un de fort. GOTO JoinYes
IF ~~ THEN REPLY ~Non, je n'ai pas besoin de toi pour le moment.~ GOTO JoinNo
END
//Charname avait renvoyé l'ogre du groupe et revient le voir pour l'engager (ou non).

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 23:05
par Isaya
Il te manque un tilde (ce que tu appelles une "vaguelette" ;) ) à la fin d'un texte :
quelqu'un de fort.~ GOTO JoinYes
Contre les tildes manquants ou en trop, il n'y a rien de mieux qu'un éditeur qui dispose d'un surlignage syntaxique (highlighter en anglais) pour les fichiers de WeiDU. Tu en trouveras notamment sur ce site.
L'avantage est que l'absence de tilde modifie automatiquement la couleur habituelle que devrait avoir le GOTO (parce que c'est une commande de fichier d) et le fait apparaître comme un texte, ce qui montre clairement le problème.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : ven. 10 avr. 2009, 23:53
par Answald
Merci !

J'ai réussi à créer le pnj et à le voir sur la carte !

Malheureusement, deux nouveaux problèmes :
- d'abord, ce dialogue n'arrive pas :
IF ~NumTimesTalkedTo(1)~ THEN BEGIN Join2
SAY ~Alors, tôa vouloir de môa ou pas ? Ici môa m'ennuyer...~
IF ~~ THEN REPLY ~J'ai réfléchi, tu peux venir. Mais ne tape pas n'importe qui, n'importe où, n'importe quand. D'accord ?~ GOTO JoinYes
IF ~~ THEN REPLY ~Non, merci, peut-être une autre fois.~ GOTO JoinNo
END
//Charname a déjà parlé au moins une fois à l'ogre et avait décliné la proposition. Il revient le voir pour l'engager (ou non)
A chaque fois, le bonhomme se présente avec le dialogue Join1, comme si mon perso ne l'avait jamais rencontré :-(.

- Le jeu me crée un bonhomme toutes les secondes.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : sam. 11 avr. 2009, 00:20
par phoeunix
Qu'entends-tu précisément par "le dialogue n'arrive pas" ? Je vois que tu as mis un NumTimesTalkedTo(1), je suppose donc que ce dialogue est censé lorsque l'on parle pour la 2ème fois au personnage. Dans quelle situation cela se produit-il ? Est-ce ton personnage ou Charname qui déclenche la conversation ?

Sinon concernant l'apparition à l'infini de ton personnage, cela signifie que le script qui permet de créer ta créature tourne en boucle : les conditions de déclenchement de ce script sont toujours vraies après que le script s'est exécuté, du coup il recommence inféfiniment.

Pour éviter ça, il faut poser une variable en trigger qui change de valeur une fois que le script s'est exécuté, empêchant ainsi que le script tourne en boucle.

Exemple :

IF
/*Triggers*/
Global("XXCreatureExists","GLOBAL",0)
THEN
RESPONSE #100
CreateCreature("XXCreature",[XXX.XXX])
SetGlobal("XXCreatureExists","GLOBAL",1)
END

La variable passe à 1 quand XXCreature est créée, du coup le Global("XXCreatureExists","GLOBAL",0) ne se vérifie plus donc le bloc ne se reproduit pas en boucle mais bien une seule et unique fois.

Je suppose que tu dois faire apparaître ton personnage à partir d'un script de zone, je te propose de le copier ici pour te montrer concrètement où ton script pêche.

Sinon j'ai remarqué que tu ne passais pas par un .tra pour coder tes dialogues : tu mets directement les lignes de texte entre ~~ dans le .d. Est-ce un choix délibéré ou pas vraiment ? Car je ne saurais que te conseiller d'utiliser un .tra, avec des lignes référencées par des numéros précédés de @, car ça apporte pas mal d'avantages, notamment celui de pouvoir être facilemetn traduit en d'autres langues par exemple.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : sam. 11 avr. 2009, 08:23
par Isaya
Ton problème de création multiple de personnage provient de l'absence de contrôle pour s'assurer qu'il n'est créé qu'une seule fois. La solution de phoeunix t'évitera ce problème.
Il doit aussi expliquer ton problème de dialogue. Si tu as plein de personnage à l'écran (même s'il est fort possible qu'ils apparaissent les uns sur les autres, donc ça ne se voit pas beaucoup), il y a fort à parier que tu parles avec un autre personnage que celui à qui tu as parlé la première fois (je veux un des multiples qui ont été créés depuis). Du coup, tu te retrouves de nouveau au premier échange avec ce nouveau personnage.

Même si je suis d'accord avec phoeunix sur l'usage d'un fichier tra pour stocker les textes, je te suggère néanmoins de continuer pour l'instant à mettre tes textes dans le fichier d comme tu fais actuellement, le temps de te familiariser avec les dialogues.
Il existe une option de ligne de commande de WeiDU (--traify) qui permet de convertir le fichier d pour transférer tous les textes dans un fichier tra. Tu n'auras donc pas beaucoup d'effort à faire à terme pour passer à cette autre façon d'écrire.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : sam. 11 avr. 2009, 11:17
par Answald
Merci de vos réponses.
J'ai écrit ceci dans un fichier appelé ar0015.baf :
IF
See([PC])
NumTimesTalkedTo(0)
THEN
RESPONSE #100
Dialogue(Nearest([PC]))
END //

IF
Global("Ug#Ugar","AR0015",0)
THEN
RESPONSE #100
SetGlobal("Ug#UgarExists","AR0015",1)
CreateCreature("Ug#Ugar",[1291.517],1)
END


J'ai fait mes fichiers grâce aux tutos de Xena et Greyfein.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : sam. 11 avr. 2009, 11:36
par phoeunix
Answald a écrit : IF
Global("Ug#Ugar","AR0015",0)
THEN
RESPONSE #100
SetGlobal("Ug#UgarExists","AR0015",1)
CreateCreature("Ug#Ugar",[1291.517],1)
END
Ici, ce qui fait que le script tourne en boucle, c'est qu'en condition de déclenchement (trigger), tu as la variable "Ug#Ugar" qui est prise comme condition à 0.
Dans les actions, tu passes la variable "Ug#UgarExists" à 1 et non pas la variable "Ug#Ugar", du coup tu te retrouves avec deux variables différentes :
- "Ug#Ugar" qui reste à 0 et qui fait tourner le script en boucle.
- "Ug#UgarExists" qui est à 1 mais qui n'est prise en compte dans aucun script.
La solution est simple, il faut harmoniser les deux variables pour qu'il n'en reste qu'une. Dans le cas présent je te conseille de garder "Ug#UgarExists" car elle est plus parlante. Du coup le script devient :

IF
Global("Ug#UgarExists","AR0015",0)
THEN
RESPONSE #100
SetGlobal("Ug#UgarExists","AR0015",1)
CreateCreature("Ug#Ugar",[1291.517],1)
END

IF
See([PC])
NumTimesTalkedTo(0)
THEN
RESPONSE #100
Dialogue(Nearest([PC]))
END
Sinon concernant le déclenchement du dialogue, le script que tu as mis ne peut pas fonctionner car il n'est pas au bon endroit.
En effet, celui-ci se trouve dans le fichier Ar0015.baf qui est un fichier de script de zone.
Pour ce dialogue qui sera déclenché par ton ogre, il te faut donc un fichier script associé à ta créature. Il te faut créer un Ug#Ugar.baf par exemple (qui colle avec le nom du .cre) et mettre le bloc dedans .
Pour que l'association soit faite entre le script et la créature, il faut que tu modifies le .cre pour que figure le nom du script de la créature dans la case "Override Script" du .cre.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : sam. 11 avr. 2009, 13:20
par Answald
J'ai fait ce que vous m'ave dit. Je n'ai plus le problème des créations multiples de personnage. D'autre part, le "deuxième dialogue" est actif.

Les nouveaux problèmes : Ugar entame le dialogue dès qu'il voit mon personnage. Je voudrais que la discussion ne commence qu'au moment où je clique sur lui.
Si je refuse l'offre la deuxième fois que je lui parle, alors je ne peux plus lui adresser la parole (ugar n'a rien à vous dire). J'engage alors Ugar avec ctrl+q, puis je le renvoie du groupe et ce n'est pas le dialogue que j'ai établi qui commence. J'ai un dialogue "par défaut", calqué pour BG2, qui est peut-être dû à BG2, ou à Baldur's Gate Trilogy, ou bien à un autre mod encore.

C'est de ce genre :
Ugar - Ce fut un plaisir de travailler avec toi. On se reverra peut-être.
1- Attends-moi ici.
2- Va nous attendre à la Couronne de Cuivre
3- Reste, j'ai encore besoin de toi.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : sam. 11 avr. 2009, 16:08
par Isaya
Le script que tu as assigné à ton personnage dit en substance : dès que tu vois le personnage principal (See([PC])), je lui adresse la parole (Dialogue(Nearest([PC])), même si cette forme devrait faire qu'il s'adresse au personnage le plus proche du personnage principal). Si tu ne veux pas qu'Ugar parle en premier, supprime tout simplement tout ce bloc.

Le fait que tu ne puisses pas lui parler plus de deux fois dépend de ton dialogue. Tu as mis une condition super stricte avec NumTimesTalkedTo(1). Elle n'est vrai que la deuxième fois que tu parles. Si tu n'as pas une autre réplique avec des conditions moins strictes que des égalités, aucune condition prévue dans ton dialogue ne sera vérifié et le jeu te dira alors par la phrase "Untel n'a rien à vous dire" que le dialogue ne prévoit aucune réplique dans les conditions actuelles. Et ça, c'est de ta faute, pas de celle du jeu. :tongue:
Si tu veux que ton deuxième dialogue réapparaisse tant qu'on ne l'a pas recruté, utilise NumTimesTalkedGT(0) au lieu de NumTimesTalkedTo(1).
Si tu veux que le personnage ignore le joueur au delà du deuxième échange au lieu d'avoir le fameux message "n'a rien à vous dire", ajoute une nouvelle réplique dont la condition serait NumTimesTalkedGT(1) et qui enverrait balader le joueur.

Le recours à des dialogues existants quand tu vires le personnage provient du fait que tu n'as pas défini les tiens propres, en tout cas tels que le jeu les attend.

Les dialogues de séparation ou de réengagement, il te faut les écrire toi-même et les affecter à un dialogue particulier, généralement avec un suffixe P. Si ton dialogue principal commence par BEGIN Ug#Ugar, alors il te faudrait avoir un bloc qui commence par BEGIN Ug#UgarP qui contiendrait les échanges de départ et de retour dans le groupe.
Ensuite, il y a un fichier à renseigner, pdialog.2DA, dans lequel tu vas indiquer le nom de fichier dialogue (le nom employé avec BEGIN) pour les 4 cas concrets de dialogue. Vois les tutoriels de création de PNJ pour plus d'explications sur les différents fichiers dialogue et les morceaux de code pour ajouter l'information dans le fichier pdialog.2DA. Consulte par exemple ce tutoriel qui traite de ces deux points.

De façon générale, je te propose de bien lire, assimiler et appliquer les tutoriels. Ils balisent la route. Sinon tu vas encore rencontrer bien des obstacles de ce type sur des cas pourtant "simples". Les tutoriels ne couvrent pas toutes les possibilités, loin de là, mais ils devraient te permettre de créer un personnage qui possède toutes les caractéristiques minimums d'un personnage recrutable.

Re : Empêcher mon ogre de disparaître + pouvoir recruter mes 3 monstres

Posté : lun. 20 avr. 2009, 17:16
par Answald
Après quelques jours d'interruption, j'ai réussi aujourd'hui à rendre le PNJ recrutable sans aucun bug dans les dialogues. Ce n'est pas grand chose mais je suis content de moi.

Grâce à Near Infinity, il a l'apparence et le comportement d'un ogre.

J'aimerais lui donner l'infravision et lui interdire tout autre type d'arme que les morgensterns et les gourdins, pour coller à son apparence. Comment faire ? J'ai regardé tous les éléments de la fiche du perso, ue l'on peut modifier avec Near Infinity mais je n'ai pas trouvé.

Edit : je ne vais pas inclure de hobgobelin dans le mod. Je vais y mettre un demi-ogre, qui sera le demi-frère de l'ogre. Il sera videur dans une auberge (probablement Nashkel).