Page 1 sur 1

[TUTORIEL] Faire parler CHARNAME dans des moments décisifs

Posté : dim. 10 févr. 2013, 09:35
par Armand
Pour faire parler Charname.


Note d'Armand : Ce tutoriel a été écrit il y a déjà quelques années par phoeunix, je le reproduis ici aujourd'hui avec son aimable autorisation. Merci à lui.



Salutations ! J'inaugure ma contribution aux tutoriaux en espérant que ce sera le premier d'une longue liste.


Aujourd'hui je veux vous parler de la méthode pour faire parler Charname.
Alors vous me direz sans doute : "Oui mais Charname il parle déjà quand il donne des réponses."
Et vous avez parfaitement raison ! Mais ce n'est pas de ça dont je veux parler, non non non.
Je ne sais pas vous mais il y a des fois où l'on aimerait bien que Charname puisse débuter le dialogue ou insérer un didascalie narrative qui le concerne dans un dialogue avec les PNJ que vous créez.
Attention, je ne parle pas non plus de dialogues initiés par Charname qui va parler volontairement au PNJ comme dans les flirt pack par exemple car dans ce cas, c'est le PNJ qui parle et non Charname.

Pour vous donner un exemple de ce dont je parle, rappelez-vous quand vous atterrissez dans le labyrinthe de Spellhold après qu'Irenicus vous a volé votre âme. Quand vous approchez de la statue qui réclame la main du vampire, et bien boum ! Un dialogue se déclenche et c'est Charname qui parle et on a une description détaillée de ses états intérieurs.


Pré-requis : Ce tutoriel nécessite d'avoir consulté et bien assimilé les Chapitre 3 et 4 (en particulier le 3) du KIT DE SURVIE DE MODDER d'armand.


ATTENTION : Une chose très importante à retenir est qu'il faut IMPÉRATIVEMENT que le dialogue soit déclenché par Charname pour pouvoir ensuite intégrer d'autres interventions de Charname (APPEND) dans le dialogue.
Dans le cas contraire, ça pose problème puisque le dialogue sera interrompu au milieu.


Note d'Armand : Tout bloc faisant parler Charname nécessite en effet un APPEND, c'est le seul cas ou la mot clef CHAIN n'est pas utilisable.


POUR FAIRE COMMENCER LE DIALOGUE PAR CHARNAME :


Imaginons la situation suivante : Leila est sérieusement blessée, ses points de vie tombent en dessous de 10, un bloc du SFLeila.baf va déclencher un dialogue où Charname se rend compte de la situation et porte son attention sur Leila.
Voici l'extrait du SFLeila.baf

Code : Tout sélectionner

IF 
  HPLT("SFLeila",10)
  Global("LeilaEstGravementBlessée","GLOBAL",0)
THEN
  RESPONSE #100
    SetGlobal("LeilaEstGravementBlessée","GLOBAL",1)
    [color=red]ActionOverride(Player1,StartDialog("player1",Player1))[/color]
END

Je vous laisse deviner, la ligne en rouge est TRÈS importante !

Code : Tout sélectionner

IF 
  HPLT("SFLeila",10)
// HPLT signifie "HitPointsLowerThan" autrement dit "PointsDeVieInférieursà" donc ici :
// Si les points de vie de Leila sont inférieurs à 10


  Global("LeilaEstGravementBlessée","GLOBAL",0)
// Sécurité pour ne pas que le script tourne en boucle.


THEN
  RESPONSE #100
    SetGlobal("LeilaEstGravementBlessée","GLOBAL",1)
// ALORS on place la variable "LeilaEstGravementBlessée" à 1


    [color=red]ActionOverride(Player1,StartDialog("player1",Player1))[/color]
// et Leila ordonne à Charname grâce à l'ActionOverride de commencer le dialogue avec lui-même en quelque sorte. Pour cela il faut impérativement utiliser
// l'action StartDialog() et non pas StartDialogNoSet() qu'on utilise habituellement ! Le "player1" désigne le fichier dialogue auquel le jeu va se référer.
// Donc impérativement utiliser la commande StartDialog("player1",Player1) pour faire démarrer le dialogue par une phrase de Charname.


END
// Fin du bloc

Voilà, donc pour faire commencer le dialogue par Charname, on retient donc la commande StartDialog() !!


"C'est très bien tout ça mais comment ça se passe pour le .d ? On place le premier bloc où ? On fait comment pour que le jeu fasse débuter le dialogue à partir du bon endroit ?"


Très bonne question, Valentin ! J'aime pas ton prénom mais tu mérites un bon point !
Valentin a raison, ça ne coule peut-être pas de source.
Mais tout d'abord, imaginons les lignes de notre dialogue qui figurent dans le SFLeila.tra :

Code : Tout sélectionner

[color=red]@0 = ~(Le combat fut rude et touche enfin à sa fin. Vous regardez autour de vous pour évaluer l'étendue des dégâts et voir comment vont vos compagnons.)~
@1 = ~(Vos yeux tombent sur Leila, agenouillée contre un roc, se tordant de douleur, les mains couvertes de sang. Elle semble lutter pour ne pas s'évanouir.)~[/color]
[color="#00FF00"]@100 = ~Leila, tiens bon ! Un guérisseur, vite !~[/color]
[color=violet]@2 = ~Ho arrête de brailler comme ça ! Je peux très bien me débrouiller seule !~
@3 = ~(Elle lance un sort de soin sur ses blessures.) Tu vois ? Tout va bien, circulez, y a rien à voir !~[/color]

Et on peut passer au SFLeilaJ.d (oui on code bien le dialogue dans le SFLeilaJ.d même si c'est pas elle qui démarre le dialogue !) :

Code : Tout sélectionner

BEGIN ~SFLeilaJ~


IF ~~ THEN BEGIN SeDebrouilleSeule
  SAY @2 = @3
  IF ~~ THEN DO ~SetGlobal("LeilaEstGravementBlessée","GLOBAL",1)~ EXIT
END


APPEND ~Player1~

[color=red]IF ~Global("LeilaEstGravementBlessée","GLOBAL",1)~ THEN BEGIN AiderLeila
  SAY @0 = @1
  IF ~~ THEN REPLY @100 EXTERN ~SFLeila~ SeDebrouilleSeule
END[/color]


END

Le seul bloc important est donc celui en rouge, il répond à toutes les questions qu'on peut se poser :

Pour que Charname commence le dialogue, il faut donc que le premier bloc se trouve dans l'APPEND ~Player1~, ce premier bloc doit contenir la condition Global("LeilaEstGravementBlessée","GLOBAL",1) comme ça il sera reconnu comme étant le début du dialogue et ensuite tout s'enchaine comme sur des roulettes avec les EXTERN et le système d'APPEND.




FAIRE INTERVENIR CHARNAME, UN CAS PARTICULIER D'APPEND :


Voyons maintenant comment intégrer des interventions au milieu du dialogue dites par Charname.
Petit rappel : il faut impérativement que le dialogue soit déclenché par Charname comme expliqué juste au-dessus.
Imaginons un dialogue totalement imaginaire entre Charname et Leila dont le contenu du SFLeilaJ.tra serait le suivant (je ne me permettrais pas de faire parler Bella qui est sous le copyright de notre Cool Coyote bien aimée.) :


@0 = ~(Vous cheminez en tête devant une gallerie de magasins de couturiers quand vous surprenez Leila qui attire votre attention.)~
@1 = ~Dis donc <CHARNAME>, tu penses quoi de ma robe ? Tu la trouves jolie ? Holala, je devrais ptêtre en changer non ?~
@2 = ~Ho mais à ce moment-là, il faut que je change aussi mes chaussures pour qu'elles soient assorties, quel casse-tête !~

@3 = ~(OMG ! J'aurais jamais cru tomber sur une cruche superficielle comme elle... Avec Aerie, elles font vraiment la paire, celles-là !)~
@4 = ~Du calme femelle ! Tu ne crois tout de même pas que je vais investir la moitié de nos économies pour financer tes désirs excentriques ? Il n'en est pas question ! Et puis, tu es déjà bien assez sexy comme ça avec cette robe, si tu vois ce que je veux dire.~
@5 = ~Oh <CHARNAME>, quel séducteur tu fais !~



Les phrases en violet sont bien entendu celles de Leila.
Les phrases en rouge seront donc les phrases dites par Charname en tant que dialogue en son nom. En effet, on n'imagine pas charname utiliser ces phrases comme une réponse, il s'agit de pensées intérieures donc il sera logique qu'on veuille la faire dire par lui.
La phrase en vert est une réponse sur laquelle on clique.


Pour coder le bloc de la phrase @3 dans le SFLeilaJ.d, il suffira de créer un APPEND pour Player1 exactement de la même façon qu'on créerait un APPEND pour faire intervenir un autre PNJ du groupe.
De fait ça va donner ceci dans le SFLeilaJ.d :

Code : Tout sélectionner

[color=violet]BEGIN ~SFLeilaJ~[/color]

IF ~~ THEN BEGIN JolieRobe
  SAY [color=violet]@1 = @2[/color]
  IF ~~ THEN [color=cyan]EXTERN ~Player1~ QuelleConne[/color]
END


IF ~~ THEN BEGIN [color=violet]QuelSeducteur[/color]
  SAY [color=violet]@5[/color]
  IF ~~ THEN DO ~[color=blue]SetGlobal("LeilaVeutUneNouvelleRobe,"GLOBAL",2)[/color]~ EXIT
END


// APPEND de Charname :

[color=cyan]APPEND ~Player1~[/color]

IF ~[color=blue]Global("LeilaVeutUneNouvelleRobe","GLOBAL",1)[/color]~ THEN BEGIN [color=cyan]GalerieMarchande[/color]
  SAY @0
  IF ~~ THEN EXTERN ~SFLeila~ JolieRobe
END


IF ~~ THEN BEGIN [color=cyan]QuelleConne[/color]
  SAY [color=red]@3[/color]
  IF ~~ THEN REPLY [color=green]@4[/color] [color=violet]EXTERN ~SFLeilaJ~ QuelSeducteur[/color]
END
[color=cyan]END[/color]

On va reprendre bloc par bloc dans un ordre chronologique.


Le dialogue démarre donc dans l'APPEND de Player1 avec le premier bloc GalerieMarchande :

Code : Tout sélectionner

[color=cyan]APPEND ~Player1~
[/color]
// Ligne qui marque le début de l'APPEND de Player1.


IF ~[color=blue]Global("LeilaVeutUneNouvelleRobe","GLOBAL",1)[/color]~ THEN BEGIN [color=cyan]GalerieMarchande[/color]
// Voici la condition Global("LeilaVeutUneNouvelleRobe","GLOBAL",1) qui identifie le début du dialogue. Le script qui aura posé cette variable à la valeur 1 et qui aura
// initié le dialogue se trouve dans le SFLeila.baf, on en reparlera plus loin.


  SAY @0
// Charname dit la phrase @0


  IF ~~ THEN EXTERN ~SFLeila~ JolieRobe
// Puis nous renvoie vers le bloc JolieRobe qui se trouve dans SFLeila


END


[color=violet]BEGIN ~SFLeilaJ~[/color]
// Si vous avez bien suivi le tuto de Cool Coyote, vous vous souvenez que c'est la ligne qui démarre le .d


IF ~~ THEN BEGIN JolieRobe
//On commence donc le bloc ayant le label JolieRobe


  SAY [color=violet]@1 = @2[/color]
// Leila dit la phrase @1 puis @2


  IF ~~ THEN [color=cyan]EXTERN ~Player1~ QuelleConne[/color]
// L'EXTERN renvoie donc au bloc QuelleConne qui se trouve dans l'APPEND de Player1. On va tout de suite voir comment rédiger cet APPEND (qui se rédige comme tout autre APPEND)


END
// Fin du bloc


// On est donc redirigé vers un bloc contenu dans l'APPEND de Player1.


IF ~~ THEN BEGIN [color=cyan]QuelleConne[/color]
// Voici le début du bloc labellisé QuelleConne dans l'APPEND de Charname


  SAY [color=red]@3[/color]
// Charname dit la ligne @3


  IF ~~ THEN REPLY [color="#00FF00"]@4[/color] [color=violet]EXTERN ~SFLeilaJ~ QuelSeducteur[/color]
// Puis il donne la réponse @4 qui renvoie au bloc QuelSeducteur qui appartient à Leila.
 
END
// Ce premier END ferme le bloc.


[color=cyan]END[/color]
// Ce deuxième END ferme l'APPEND


Le dialogue se poursuit donc par le bloc labellisé QuelSeducteur chez SFLeila :


IF ~~ THEN BEGIN [color=violet]QuelSeducteur[/color]
// On démarre le bloc QuelSeducteur


  SAY [color=violet]@5[/color]
// Leila dit la ligne @5


  IF ~~ THEN DO ~[color=blue]SetGlobal("LeilaVeutUneNouvelleRobe,"GLOBAL",2)[/color]~ EXIT
// On passe la variable à 2 à la fin du dialogue pour que celui-ci ne boucle pas et on met fin au dialogue grâce à l'EXIT


END
// Fin du bloc.


Histoire de boucler la boucle, voyons un peu le SFLeila.baf pour voir comment ce dialogue sera déclenché :

Code : Tout sélectionner

IF
  See("VendeuseDeFringues")
THEN
  RESPONSE #100
    SetGlobal("LeilaVeutUneNouvelleRobe","GLOBAL",1)
    ActionOverride(Player1,StartDialogue("player1",Player1)
END

Hmm hmmmmm intéressant !!


Reprenons ligne par ligne :

Code : Tout sélectionner

IF
  See("VendeuseDeFringues")
// Si la condition "Leila voit la créature "VendeuseDeFringues"" est vérifiée


THEN
  RESPONSE #100
// alors


    SetGlobal("LeilaVeutUneNouvelleRobe","GLOBAL",1)
// On place la variable à 1, elle servira de référence pour le premier bloc du dialogue


    ActionOverride(Player1,StartDialogue("player1",Player1)
// Leila demande à Charname d'initier le dialogue.


END
// Fin du bloc.

Pour résumer, Leila vous casse les pieds pour acheter des fringues car elle a vu une vendeuse et une boutique sur sa route... Quelle emmerdeuse ! Mais au moins vous aurez pu exprimer correctement votre énervement en faisant parler Charname.


Et voilà que s'achève ce tutoriel sur les interventions de Charname dans les dialogues.
Je me rends compte qu'il est peut-être un peu long mais j'ai tenu à expliquer tous les .d et .baf, ça fait réviser et ça fait des rappels par rapport aux tutos d'armand. J'ai préféré bien tout expliquer plutôt que de m'accrocher sur le point méthode dont je parle et le noyer dans un amas de choses incompréhensibles.




Si vous avez des questions, vous pouvez postez à la suite de ce topic.