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 à

Code : Tout sélectionner

IF ~~ THEN [color=#ff0000]REPLY[/color]
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 :gign: ) le StartDialogNoSet(Player1) par un bon vieux DestroySelf() :diable:
  • 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

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.