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

[DLG] Comment lancer un dialogue avec la condition "J'ai l'objet 'untel' " ?

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

[DLG] Comment lancer un dialogue avec la condition "J'ai l'objet 'untel' " ?

.

Message par Klare »

C'est encore moi !
La question du jour portera sur les objets... L'exemple du jour sera la romance de SAERILEJ qui m'est revenue en tête parce qu'elle offrait la fonction que je souhaite reprendre dans mon mod :
Retirer un item de CHARNAME pour valider une quête (même si ici c'est un poil différent)

Bref, l'idée est simple : On lance la quête, on va pougner un pauvre NPC hostile dans un coin et on récupère un Item.
On retourne voir le PNJ avec l'item et paf quête accomplie, go étape suivante.

Sauf que... j'ai toujours pas deviner comment en faire une condition pour lancer le dialogue de fin a savoir : CHARNAME a un item précis sur lui.


Le mod me laisse supposer divers truc quand je fouine dedans en diagonale :

Code : Tout sélectionner

BEGIN SAERILEJ
IF ~Global("NSRingofGaxx","LOCALS",1)~ THEN BEGIN NSRingofGaxx
SAY @1349
IF ~~ THEN DO ~SetGlobal("NSRingofGaxx","LOCALS",2)DropItem("ring39",[-1.-1])~ EXIT
END
En gros... j'ai tendance a comprendre : si 'donne anneau a PJ' > lui faire dire 'non' > Jeter l'item au sol
Pas ce que je veux, même si ça peut être utile à autre chose.

Code : Tout sélectionner

IF ~Global("NSRingofGaxx","LOCALS",3)~ THEN BEGIN NSDestroyGaxx
SAY @1351 
IF ~~ THEN DO ~SetGlobal("NSRingofGaxx","LOCALS",4)DestroyItem("ring39")~ EXIT
END
Ici, on s'est acharné à donner l'item à la demoiselle vu que la variable a loupé, du coup elle le détruit.
C'est bien la fin de mon étape où l'item apporté disparait pour pas encombrer le jeu.

Code : Tout sélectionner

IF ~Global("NSGiftofTyrSOA","LOCALS",1)~ THEN BEGIN NSBooksSOA
SAY @1347
=
@1348
IF ~~ THEN DO ~GiveItemCreate("NSCHBOOK","Saerileth",0,0,0)GiveItemCreate("NSWSBOOK","Saerileth",0,0,0)SetGlobal("NSGiftofTyrSOA","LOCALS",2)~
EXIT
END
La on apporte un journal à la demoiselle? du coup elle écrit deux trucs et on bloque le texte.
En gros la fonction peut être utilisée pour donner une récompense.

Tout ça m'est bien utile et demande une vérification, mais... reste mon problème. Comment être sur que CHARNAME a bien l'item?
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 »

Comme je n'ai jamais joué ce mod (les mods NPC me plaisent plutôt moyennement), je suis allé faire un tour dans ses fichiers pour te donner la manière de lancer ces dialogues.

Autant partir sur une base connue que de se lancer dans un long discours théorique... ;)


>> Ce qui importe, ce sont les "actions" et les "triggers".

D'ailleurs, je te conseille vivement de télécharger la doc IESDP afin de l'avoir en permanence lorsque tu codes.


Bref, si tu veux initier ton dialogue à partir de conditions ("triggers"), tu dois définir ces conditions dans un script. Lorsqu'elles sont remplies, le script lance le dialogue.



Dans le mod que tu cites, les conditions se trouvent dans les fichiers .baf de Saerileth, notamment SAERILET.baf et SAERIL25.baf (pour ToB).


On y trouve ceci :

Code : Tout sélectionner

IF
 [color="#FFFF00"]HasItem("ring39",Myself)[/color] <-- Condition : Saerileth possède l'anneau de Gaxx
 Global("NSRingofGaxx","LOCALS",0)
THEN
 RESPONSE #100
  [color="#00FF00"]SetGlobal("NSRingofGaxx","LOCALS",1)[/color] <-- Variable remplissant la condition précédente
  [color="#00FFFF"]StartDialogueNoSet(Player1)[/color] <-- Action : Saerileth s'adresse à <CHARNAME>
END

D'où le Dialogue :

Code : Tout sélectionner

IF ~[color="#00FF00"]Global("NSRingofGaxx","LOCALS",1)[/color]~ THEN BEGIN NSRingofGaxx
 SAY @1349 = ~Cet anneau est mauvais, <CHARNAME>! Je ne souffrirai pas à son toucher, ni ne le porterai.~
  IF ~~ THEN DO ~[color="#00FF00"]SetGlobal("NSRingofGaxx","LOCALS",2)[/color] <-- La variable est incrémentée d'une unité pour éviter de reprendre le dialogue en boucle
           [color="#00FFFF"]DropItem("ring39",[-1.-1])[/color]~ EXIT <-- [B]ACTION : Jette l'anneau[/B]
END

Puis le bloc de script

Code : Tout sélectionner

IF
 HasItem("ring39",Myself)
 Global("NSRingofGaxx","LOCALS",2)
THEN
 RESPONSE #100
  [color="#00FF00"]SetGlobal("NSRingofGaxx","LOCALS",3)[/color]
  StartDialogueNoSet(Player1)
END

renvoie au dialogue suivant :

Code : Tout sélectionner

IF ~[color="#00FF00"]Global("NSRingofGaxx","LOCALS",3)[/color]~ THEN BEGIN NSDestroyGaxx
 SAY @1351 = ~Le fait que tu me redonnes cet anneau me dit que tu le détruirais par la lumière de Tyr.~ 
  IF ~~ THEN DO ~[color="#00FF00"]SetGlobal("NSRingofGaxx","LOCALS",4)[/color]
                 DestroyItem("ring39")~ EXIT
END

De même :

Code : Tout sélectionner

IF
 [color="#FFFF00"]InParty(Myself)[/color] <-- Saerileth est dans le groupe
 [color="#FFFF00"]Dead("Demogor2")[/color] <-- Démogorgon est retourné au "Paradis des Démons"
 [color="#FFFF00"]AreaCheck("AR3000")[/color] <-- On se trouve dans cette zone
 Global("NSGiftofTyrSOA","LOCALS",0)
THEN
 RESPONSE #100
  [color="#00FF00"]SetGlobal("NSGiftofTyrSOA","LOCALS",1)[/color] <-- Variable résumant les conditions précédentes
  StartDialogueNoSet(Player1)
END

lance ce dialogue :

Code : Tout sélectionner

IF ~[color="#00FF00"]Global("NSGiftofTyrSOA","LOCALS",1)[/color]~ THEN BEGIN NSBooksSOA
 SAY @1347 = ~<CHARNAME>! Qu'est ce que c'est? Il semble que l'Aveugle Tyr m'a béni avec sa faveur avec ces présents~
 =
     @1348 = ~Peut être que ces tomes contiennent un message du Dieu Mutilé. Regardons les!!~
  IF ~~ THEN DO ~GiveItemCreate("NSCHBOOK","Saerileth",0,0,0)
                 GiveItemCreate("NSWSBOOK","Saerileth",0,0,0)
                 [color="#00FF00"]SetGlobal("NSGiftofTyrSOA","LOCALS",2)[/color]~
EXIT
END

Klare a écrit :Sauf que... j'ai toujours pas deviner comment en faire une condition pour lancer le dialogue de fin a savoir : CHARNAME a un item precis sur lui.
C'est donc le trigger HasItem("ring39",Myself) !

"Myself" renvoyant à Saerileth, utilise "Player1" pour <CHARNAME> si tu lances le dialogue à partir du script de ton NPC, ou conserve "Myself" si tu le lances à partir d'un des scripts de <CHARNAME> (mais évite le plus possible d'intervenir dans ces derniers).


Tu peux aussi utiliser celui-ci :

0x4042 PartyHasItem(S:Item*)
Returns true if any of the party members have the specified item in their inventory. This trigger also checks with container items (e.g. Bags of Holding).



:rtfm: Petite note : la variable Global("NSGiftofTyrSOA","LOCALS",1) utilise le code "LOCALS" qui n'est pris en compte que pour le script de Saerileth, si tu voulais une variable lançable n'importe quand et par n'importe qui, il faudrait utiliser le code "GLOBAL". On peut même utiliser des variables de zone (en remplaçant "LOCALS" par "AR3000" par exemple) opérationnelles uiquement dans certaines zones.
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 »

Tout marche, ma petite quete est réalisée. Snif, j'en pleurerai presque, j'ai plus que du dialogue a coder et ca devrais pas être un probleme.

Merci beaucoup ;)

[Notament pour la doc que je ne retrouvais plus.]
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 »

De rien.

Mais je te conseille de lire les tutos d'Armand : presque toutes les opérations de base sur les dialogues y sont expliquées. ;)


Et bon courage pour la suite !
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Répondre

Retourner vers « Dialogues »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité