Page 1 sur 1
[DLG, WsiDU] Interruption Dialogue déplacer CHARNAME, reprend Dialogue auto
Posté : mer. 28 mars 2018, 13:54
par Faust
Bonjour,
Lors de la rencontre avec mon PNJ se trouvant en face d'une cheminée, CHARNAME à le choix d'un banter:
~Je souhaite simplement profiter du feu, et recevoir un peu de chaleur.~
auquel la réponse est:
(L'Elfe ne répond pas et se tourne de nouveau vers le feu.)~
J'arrive à couper le dialogue (avec un simple EXIT, END), le temps de déplacer automatique CHARNAME face au feu de cheminée, et retourner le PNJ face au feu.
En revanche je n'arrive pas à forcer mon PNJ a reprendre le dialogue avec CHARNAME. Je veux simplement interrompre le dialogue le temps du déplacement de CHARNAME (quelques secondes), faire relancer automatiquement le banter suivant du dialogue pour poursuivre le recrutement de mon PNJ.
IF ~~ THEN BEGIN 10
SAY @21
IF ~~ THEN DO ~ Face(6)
ActionOverride(Player1,MoveToPointNoInterrupt([212.246]))~ // Elrin se retourne puis CHARNAME se déplace
EXIT
IF ~~ THEN DO ~ Wait(5)
Dialogue(Nearest([PC]))~
GOTO 11
END
IF ~~ THEN BEGIN 11
SAY @24 /* ~Vous examinez discrètement l'Elfe, ses yeux semblent envoutés par le mouvement des flammes~ */
IF ~~ THEN REPLY @25 /* TEXTE A DEFINIR */ GOTO 12
END
Malheureusement cela ne fonctionne pas, à la place le dialogue continue au Banter suivant. Une idée de comment procéder afin de pouvoir parvenir à ce résultat?
Merci pour votre aide!
Posté : mer. 28 mars 2018, 20:19
par Cocrane
fichier_PNJ.baf
Tu testes la distance entre ton PNJ et le player via RANGE.
Si la distance est adéquate, tu passes une variable à 1 et tu lances le dialogue.
Dans ton block BEGIN 11, tu vérifies que la condition est à 1 pour déclencher le block.
Il y a sans doute d'autres moyens. A chaud, je ferai comme ça.
Cocrane
Posté : mer. 28 mars 2018, 22:06
par Faust
Oui effectivement, ça marche!
Le script fait le lien:
BEGIN ~El[r]in~
IF ~ NumTimesTalkedTo(0)
THEN DO SetGlobal("HireEl[r]in","GLOBAL",0)
~ THEN BEGIN 1
----------------------------------------------------------------
[LEFT]IF ~~ THEN BEGIN 10
SAY @21
IF ~~ THEN DO ~ Face(6)
ActionOverride(Player1,MoveToPointNoInterrupt([212.246]))
SetGlobal("HireEl[r]in","GLOBAL",1)~
EXIT
END
[/LEFT]
[LEFT]IF
Global("HireEl[r]in","GLOBAL",1)
See([PC])
THEN
RESPONSE #100
Wait(2)
Dialogue(Nearest([PC]))
SetGlobal("HireEl[r]in","GLOBAL",2)
END[/LEFT]
[LEFT]
[/LEFT]
[LEFT]
IF WEIGHT #0 ~ Global("HireEl[r]in","GLOBAL",1)
~ THEN BEGIN 11
SAY @24
IF ~~ THEN REPLY @25 /* GOTO 12
END
[/LEFT]
J'aurais aimé pouvoir faire ça uniquement en passant par des triggers situés dans le fichiers D, mais en attendant un autre moyen c'est parfait.
Merci Coco!
Posté : jeu. 29 mars 2018, 12:10
par Freddy_Gwendo
Tu n'es pas obligé de passer par un script.
Voici deux extraits de dialogues :
1. Ernest appelle Albert qui arrive dans la carte. Une fois Albert arrivé, Ernest reprend le dialogue.
Code : Tout sélectionner
CHAIN GW0003ER Ernest002.03
@3002007 // ~Bon, bon, ça va. Vous m'avez l'air d'être de bons bougres. Sinon, vous n'auriez pas occis ces salopards.
// Mais faut pas m'en vouloir. On est un peu parano ces temps-ci. Bougez pas, j'vais le chercher. Albert ! Al...bert !~
DO ~SetCutSceneLite(TRUE)
Wait(1)
MoveToPointNoInterrupt([4986.1423])
Wait(2)
CreateCreature("GW0003Al",[5090.1250],2)
MoveToPointNoInterrupt([5040.1290])
FaceObject(Player1)
ActionOverride("GW0003Al",MoveToPointNoInterrupt([5065.1460]))
ActionOverride("GW0003Al",FaceObject("Player1"))
SmallWait(6)
Wait(4)
SetCutSceneLite(FALSE)
SetGlobal("GWPrison","GW0002",4)
ActionOverride("GW0003Er",StartDialogNoSet(Player1))~ EXIT
CHAIN IF ~AreaCheck("GW0002") Global("GWPrison","GW0002",4)~ THEN GW0003ER Ernest002.10
@3002008 // ~Vous êtes toujours là ? C'est ces gens qui veulent te parler, Albert.~
...
2. Une femme va ouvrir la porte derrière laquelle se sont cachés des enfants. L'un des enfants initie le dialogue.
Code : Tout sélectionner
...
== GW0007TI @3007204 // ~Bon, je vais aller les chercher.~
IF ~~ DO ~SetCutSceneLite(TRUE)
Wait(1)
MoveToObjectNoInterrupt("DOOR01")
Wait(2)
OpenDoor("DOOR01")
MoveToPoint([698.258])
CreateCreature("GW0007G1",[850.150],0)
ActionOverride("GW0007G1",MoveToPointNoInterrupt([735.262]))
ActionOverride("GW0007G1",FaceObject("GW0001Fi"))
Wait(3)
CreateCreature("GW0007B2",[850.150],0)
ActionOverride("GW0007B2",MoveToPointNoInterrupt([850.190]))
ActionOverride("GW0007B2",MoveToPointNoInterrupt([780.190]))
ActionOverride("GW0007B2",Face(4)) Wait(2) // SmallWait(6)
CreateCreature("GW0007G2",[850.150],0)
ActionOverride("GW0007G2",MoveToPointNoInterrupt([795.250]))
ActionOverride("GW0007G2",Face(4))
Wait(2) // SmallWait(6)
CreateCreature("GW0007Ja",[850.150],0)
ActionOverride("GW0007Ja",MoveToPointNoInterrupt([660.210]))
ActionOverride("GW0007Ja",FaceObject("GW0001Fi"))
SmallWait(6)
Wait(4)
SetCutSceneLite(FALSE)
SetGlobal("GWFirmin","GW0007",2)
ActionOverride("GW0007Ja",StartDialogNoSet("GW0001Fi"))~ EXIT
CHAIN IF ~AreaCheck("GW0007") Global("GWFirmin","GW0007",2) NumTimesTalkedTo(0)~ THEN GW0007JA Jeannot.41
@3007301 // ~Papa !~
DO ~SetGlobal("GWFirmin","GW0007",3)~
...
Le tout, c'est de bien jouer avec les Wait(n) et/ou les SmallWait(n). Ça va te demander de faire des essais.
Posté : jeu. 29 mars 2018, 14:17
par Faust
Cool, je vais essayer ça en rentrant ce soir !
Merci Freddy !
Posté : jeu. 29 mars 2018, 23:03
par Faust
Freddy_Gwendo a écrit :Tu n'es pas obligé de passer par un script.
Voici deux extraits de dialogues :
1. Ernest appelle Albert qui arrive dans la carte. Une fois Albert arrivé, Ernest reprend le dialogue.
Code : Tout sélectionner
CHAIN GW0003ER Ernest002.03
@3002007 // ~Bon, bon, ça va. Vous m'avez l'air d'être de bons bougres. Sinon, vous n'auriez pas occis ces salopards.
// Mais faut pas m'en vouloir. On est un peu parano ces temps-ci. Bougez pas, j'vais le chercher. Albert ! Al...bert !~
DO ~SetCutSceneLite(TRUE)
Wait(1)
MoveToPointNoInterrupt([4986.1423])
Wait(2)
CreateCreature("GW0003Al",[5090.1250],2)
MoveToPointNoInterrupt([5040.1290])
FaceObject(Player1)
ActionOverride("GW0003Al",MoveToPointNoInterrupt([5065.1460]))
ActionOverride("GW0003Al",FaceObject("Player1"))
SmallWait(6)
Wait(4)
SetCutSceneLite(FALSE)
SetGlobal("GWPrison","GW0002",4)
ActionOverride("GW0003Er",StartDialogNoSet(Player1))~ EXIT
CHAIN IF ~AreaCheck("GW0002") Global("GWPrison","GW0002",4)~ THEN GW0003ER Ernest002.10
@3002008 // ~Vous êtes toujours là ? C'est ces gens qui veulent te parler, Albert.~
...
2. Une femme va ouvrir la porte derrière laquelle se sont cachés des enfants. L'un des enfants initie le dialogue.
Code : Tout sélectionner
...
== GW0007TI @3007204 // ~Bon, je vais aller les chercher.~
IF ~~ DO ~SetCutSceneLite(TRUE)
Wait(1)
MoveToObjectNoInterrupt("DOOR01")
Wait(2)
OpenDoor("DOOR01")
MoveToPoint([698.258])
CreateCreature("GW0007G1",[850.150],0)
ActionOverride("GW0007G1",MoveToPointNoInterrupt([735.262]))
ActionOverride("GW0007G1",FaceObject("GW0001Fi"))
Wait(3)
CreateCreature("GW0007B2",[850.150],0)
ActionOverride("GW0007B2",MoveToPointNoInterrupt([850.190]))
ActionOverride("GW0007B2",MoveToPointNoInterrupt([780.190]))
ActionOverride("GW0007B2",Face(4)) Wait(2) // SmallWait(6)
CreateCreature("GW0007G2",[850.150],0)
ActionOverride("GW0007G2",MoveToPointNoInterrupt([795.250]))
ActionOverride("GW0007G2",Face(4))
Wait(2) // SmallWait(6)
CreateCreature("GW0007Ja",[850.150],0)
ActionOverride("GW0007Ja",MoveToPointNoInterrupt([660.210]))
ActionOverride("GW0007Ja",FaceObject("GW0001Fi"))
SmallWait(6)
Wait(4)
SetCutSceneLite(FALSE)
SetGlobal("GWFirmin","GW0007",2)
ActionOverride("GW0007Ja",StartDialogNoSet("GW0001Fi"))~ EXIT
CHAIN IF ~AreaCheck("GW0007") Global("GWFirmin","GW0007",2) NumTimesTalkedTo(0)~ THEN GW0007JA Jeannot.41
@3007301 // ~Papa !~
DO ~SetGlobal("GWFirmin","GW0007",3)~
...
Le tout, c'est de bien jouer avec les Wait(n) et/ou les SmallWait(n). Ça va te demander de faire des essais.
Bon a priori ta méthode est un poil plus compliquée car mon
[LEFT]
DO ~SetCutSceneLite(TRUE)[/LEFT]
ne se déclenche qu'à la fin du dialogue, je pensais que cela permettait d'interrompre le dialogue et de le reprendre avec
[LEFT]
DO ~SetCutSceneLite(FALSE).
Il y t'il besoin de faire comme dans ton exemple et d'utiliser des CHAIN pour que ça fonctionne?
Ici mon .D[/LEFT]
IF ~~ THEN BEGIN 10
SAY @21
IF ~~ THEN DO ~SetCutSceneLite(TRUE)
Wait(1)
Face(6)
Wait(2)
ActionOverride(Player1,MoveToPointNoInterrupt([212.246]))
SetCutSceneLite(FALSE)
Wait(2) ~
REPLY @24
REPLY @25 GOTO 12
END
Posté : ven. 30 mars 2018, 02:03
par Freddy_Gwendo
La procédure est lancée dans un bloc Action (DO), donc est indépendante de la manière d'écrire le dialogue (BEGIN ou CHAIN).
Si tu veux que des persos effectuent des actions pendant un dialogue, tu es obligé de simuler une fin de dialogue pour leur laisser le temps de le faire. Dans ton cas, le premier exemple devrait fonctionner parfaitement.
Posté : ven. 30 mars 2018, 21:14
par Faust
Freddy_Gwendo a écrit :La procédure est lancée dans un bloc Action (DO), donc est indépendante de la manière d'écrire le dialogue (BEGIN ou CHAIN).
Si tu veux que des persos effectuent des actions pendant un dialogue, tu es obligé de simuler une fin de dialogue pour leur laisser le temps de le faire. Dans ton cas, le premier exemple devrait fonctionner parfaitement.
J'ai réussi!
Merci Freddy, ca rend encore mieux avec une Cutscene!
IF ~~ THEN BEGIN 10
SAY @21
IF ~~ THEN DO ~
SetGlobal("HireEl[r]in","GLOBAL",1)
SetCutSceneLite(TRUE)
Wait(1)
Face(6)
ActionOverride(Player1,MoveToPointNoInterrupt([212.246]))
Wait(1)
ActionOverride("El[r]in",StartDialogNoSet(Player1))
Wait(4)
SetCutSceneLite(FALSE)~
EXIT
END
IF ~Global("HireEl[r]in","GLOBAL",1)~ THEN BEGIN 11
SAY @22
IF ~~ THEN REPLY @23 GOTO 12
END
Posté : sam. 31 mars 2018, 09:13
par Freddy_Gwendo
De rien.
L'avantage de la Cutscene, c'est que tu n'as pas l'impression d'interrompre le dialogue, et qu'aucun script extérieur ne vienne se superposer au dialogue.
Sinon, j'aurais plutôt inséré la variable SetGlobal("HireEl[r]in","GLOBAL",1) après le déplacement. Mais si ça fonctionne comme ça, c'est parfait.