Page 1 sur 1
Encore un truc de dialogue que je n'arrive pas à faire
Posté : mer. 10 août 2022, 21:34
par deratiseur
Soit le dialogue :
Code : Tout sélectionner
IF ~~ THEN BEGIN Explication SAY @1408
++ @1409 GOTO Altruisme
++ @14010 GOTO Proposition
++ @14011 DO ~Enemy()~ EXIT
END
IF ~~ THEN BEGIN Altruisme SAY @14012
++ DO ~SetGlobal("pxl2revn","LOCALS",1)~ EXIT
END
IF ~~ THEN BEGIN Proposition SAY @14014
++ @14015 DO ~SetGlobal("pxl2revn","LOCALS",3)~ EXIT
++ @14016 DO ~Enemy()~ EXIT
Comment faire pour 14012, que le pnj dise sa réplique, mette la valeur à jour et termine le dialogue sans que le pj puisse agir ?
(le valeur pxl2revn sert pour le script associé au pnj : avec la valeur à 1 il fait un truc, donne de l'xp puis disparait)
Posté : jeu. 11 août 2022, 08:01
par Akadis
Code : Tout sélectionner
IF ~~ THEN BEGIN Altruisme SAY @14012
IF ~~ THEN DO ~SetGlobal("pxl2revn","LOCALS",1)~ EXIT
END
J’utilise jamais la forme abrégée ++
D'ailleurs ça fait un bon moment que je ne l'ai pas vu dans le code source d'un mod.
Je me demande si n'est pas du old weidu.
Posté : ven. 12 août 2022, 10:52
par deratiseur
Alors ça c'est ballot. J'ai écris tous mes précédents dialogues avec "IF ~~ THEN DO" avant de trouver ++ dans certains mods, et je pensais que c’était le ++ "l'évolution", alors je l'ai adopté. Comme quoi "quand un système marche, il ne faut pas chercher à en changer"
Posté : ven. 12 août 2022, 10:57
par deratiseur
Bon, mon dialogue marche maintenant. mais j'ai un autre problème : je dois cliquer sur le npj pour lui parler, alors que son script est ceci :
Code : Tout sélectionner
IF
HasItem("pxl2vrid",Player1)
THEN
RESPONSE #100
SetGlobal("Player","LOCALS",1)
MoveToObject(Player1)
END
IF
Global("Player","LOCALS",1)
Global("pxl2revntalk","GLOBAL",0)
Range(Player1,6)
THEN
RESPONSE #100
SetGlobal("pxl2revntalk","GLOBAL",1)
StartDialogNoSet(Player1)
END
Il va bien vers le pc, mais ensuite il reste là coté sans entamer le dialogue. WTF ?
Posté : ven. 12 août 2022, 11:48
par Akadis
Essaye en ajoutant True() ou NumTimesTalkedTo(0)
Choisis celui qui convient à la situation.
Code : Tout sélectionner
IF ~[color=#00ff00]True()[/color]~ THEN BEGIN Explication SAY @1408
Code : Tout sélectionner
IF ~[color=#00ff00]NumTimesTalkedTo(0)[/color]~ THEN BEGIN Explication SAY @1408
Le problème avec ++ c'est qu'il est équivalant à
Et c'est le REPLY qui provoquait ton premier problème.
Posté : ven. 12 août 2022, 16:52
par deratiseur
J'ai essayé avec True() : pas mieux. Pourtant j'ai simplifié le code et passé les variables en GLOBAL :
Code : Tout sélectionner
IF
HasItem("pxl2vrid",Player1)
THEN
RESPONSE #100
SetGlobal("revnPlayer","GLOBAL",1)
MoveToObject(Player1)
END
IF
Global("revnPlayer","GLOBAL",1)
Range(Player1,6)
THEN
RESPONSE #100
StartDialogNoSet(Player1)
END
Posté : sam. 13 août 2022, 09:35
par Akadis
Tu as oublié de changer la valeur de revnPlayer avant de lancer ton StartDialogNoSet.
Dans ce genre de cas je remplace (temporairement
) le StartDialogNoSet(Player1) par un bon vieux DestroySelf()
- Si le PNJ se suicide bel et bien : mon script et bon. Le problème vient du dialogue.
- Si le PNJ reste en vie : c'est mon script qui est à revoir.
Sinon tu es bien sûr d'avoir bien lié ton fichier dlg au fichier cre de ton pnj ?
Posté : sam. 13 août 2022, 18:42
par deratiseur
Alors j'ai changé mon script en ça :
Code : Tout sélectionner
IF
HasItem("pxl2vrid",Player1)
THEN
RESPONSE #100
SetGlobal("revnPlayer","GLOBAL",1)
MoveToObject(Player1)
END
IF
Global("revnPlayer","GLOBAL",1)
Range(Player1,6)
THEN
RESPONSE #100
SetGlobal("revnPlayer","GLOBAL",0)
DestroySelf()
END
La créature s'approche toujours du pj1 et se colle à lui, mais ne se détruit pas.
Le dialogue est bon, si je clique sur le monstre je dialogue avec lui, jusqu'à la conclusion. Le dialogue complet :
► Afficher le texte
Code : Tout sélectionner
BEGIN ~pxl2revn~
IF ~True()~ THEN BEGIN Rencontre SAY @1401
IF ~~ THEN REPLY @1402 GOTO Baton
IF ~~ THEN REPLY @1403 DO ~Enemy()~ EXIT
END
IF ~~ THEN BEGIN Baton SAY @1404
IF ~~ THEN REPLY @1405 GOTO Explication
IF ~~ THEN REPLY @1406 GOTO Explication
IF ~~ THEN REPLY @1407 GOTO Explication
END
IF ~~ THEN BEGIN Explication SAY @1408
IF ~~ THEN REPLY @1409 GOTO Altruisme
IF ~~ THEN REPLY @14010 GOTO Proposition
IF ~~ THEN REPLY @14011 DO ~Enemy()~ EXIT
END
IF ~~ THEN BEGIN Altruisme SAY @14012
IF ~~ THEN DO ~TakePartyItem("pxl2vrid") DestroyItem("pxl2vrid")
DisplayStringHead(Myself,@14013)
DisplayStringNoName(Myself,@14013)
AddexperienceParty(30000)
Wait (2)
Kill(Myself)~
EXIT
END
IF ~~ THEN BEGIN Proposition SAY @14014
IF ~~ THEN REPLY @14015 GOTO Pouvoirs
IF ~~ THEN REPLY @14016 DO ~Enemy()~ EXIT
END
IF ~~ THEN BEGIN Pouvoirs SAY @14012
IF ~~ THEN DO ~TakePartyItem("pxl2vrid") DestroyItem("pxl2vrid")
ForceSpellRES("sppr607",LastTalkedToBy(Myself))
AddXPObject(LastTalkedToBy(Myself),5000)
DisplayStringHead(Myself,@14017)
DisplayStringNoName(Myself,@14017)
Wait(2)
Kill(Myself)~
EXIT
END
Spoiler : en finalité sppr607 n'est là que pour le test : ce sera bien autre chose quand tout sera bouclé
Posté : sam. 13 août 2022, 21:56
par rivvers
Hello deratiseur,
Par défaut, les scripts exécutent les blocs un à un dans l'ordre, jusqu'à en trouver un qui soit valide puis s'arrête, avant de recommencer du début.
Autrement dit, tant que les conditions du bloc n°1 sont valides, il n'ira jamais voir le bloc n°2...
Posté : dim. 14 août 2022, 05:07
par deratiseur
Heu.... Alors comment il fait Nevin dans le cimetière pour aller voir le pc pour lui dire "au secours, mon oncle Lester se relève d'entre les mort" ? Parce qu'il coure clairement après le pc pour pouvoir lui parler, et je ne vois rien dans son script qui corresponde à ça.
En plus là j'ai un soucis, je ne peux pas généraliser cette rencontre avec [PC], ça doit être le pj qui porte l'objet. Et le bloc répété 6 fois, une fois par personne (player1-6).
Posté : dim. 14 août 2022, 08:09
par rivvers
De la façon la plus simple qui soit :
Code : Tout sélectionner
IF
See([PC])
NumTimesTalkedTo(0)
THEN
RESPONSE #100
Dialog([PC])
END
Un Dialog impliquant une distance assez faible pour l'entamer, il se rapproche donc du joueur pour le brin de causette.
Contrainte que n'a pas à respecter un StartDialogNoSet.
Peut-être quelque chose comme ça ?
Code : Tout sélectionner
IF
See(Player1)
HasItem("pxl2vrid", Player1)
!Range(Player1, 6)
THEN
RESPONSE #100
MoveToObject(Player1)
END
IF
See(Player1)
HasItem("pxl2vrid", Player1)
Range(Player1, 6)
THEN
RESPONSE #100
SetGlobal("pxl2revntalk","GLOBAL",1)
StartDialogNoSet(Player1)
END
Posté : dim. 14 août 2022, 17:43
par deratiseur
Ça marche, mais il manque un IF GLOBAL("pxl2revntalk","GLOBAL",0) dans le premier bloc. Sinon le pnj recommence son dialogue quand on l'egresse et qu'il devient ennemi.
En fait tout ce qu'il manquait dans mon script c’était un "!range".
Ok, merci
L'interpan v8 avance.
Posté : dim. 14 août 2022, 18:48
par rivvers
deratiseur a écrit :Ça marche, mais il manque un IF GLOBAL("pxl2revntalk","GLOBAL",0) dans le premier bloc. Sinon le pnj recommence son dialogue quand on l'egresse et qu'il devient ennemi.
En fait tout ce qu'il manquait dans mon script c’était un "!range".
Ok, merci
L'interpan v8 avance.
Ce qu'il manquait c'était un moyen de libérer l'accès du bloc n°2.
Tu aurais pu inverser les deux blocs, ça aurait aussi fonctionné...
Posté : dim. 14 août 2022, 19:33
par deratiseur
On se demande comment en étant aussi nul j'ai pu créer autant de trucs.
Posté : dim. 14 août 2022, 19:50
par rivvers
deratiseur a écrit :On se demande comment en étant aussi nul j'ai pu créer autant de trucs.
Tes "autant de trucs" sont autant de preuves du contraire.