Utilisez les dialogue avec les objets plaçables et les déclencheurs .

Il y a beaucoup d’effets qu’un MD intelligent peut simuler juste en utilisant un petit peu les dialogue en même temps que les objets placables et les déclencheurs.

Vous pouvez avoir une description ambiente d’une zone ou d’un objet, commencer un "dialogue" avec un objet étrange qui permet au joueur d’interagir avec lui, avoir quelqu’un de l’autre côté d’une porte qui parle à travers elle, informer les joueur des événements qui peuvent arriver…il y a beaucoup de possibilités.

La première chose que vous devez savoir est quelles options vous avez. Ci-dessous, vous avez des commandes qui peuvent être utilisées pour initier un dialogue ou afficher un texte :

ActionSpeakString et SpeakString
La seule différence entre ces deux actions est que ActionSpeakString pousse la commande dans la file des actions (ça veut dire qu’elle ne sera pas effectuée avant que les actions placées au dessus dans la liste, comme ActionWait ou ActionMoveToObject, n’aient été effectuées) et que SpeakString est effectuée immédiatement.
Qu’est ce que ca fait: une ligne de texte est affichée au dessus de celui qui a effectué cette commande. Cela est affiché pour le joueur comme un dialogue normal, le texte apparaît derrière le nom du personnage et son portrait (si c’est possible)

Advantages: Un volume peut être appliqué au texte en placant la constante TALKVOLUME_* appliquée dans la commande. TALKVOLUME_TALK est utilisé par défaut et est entendu par tous avec une portée normale. TALKVOLUME_SHOUT est entendu par tout le monde dans le module. TALKVOLUME_WHISPER est entendu par tout la monde dans une zone réduite. TALKVOLUME_SILENT_TALK et TALKVOLUME_SILENT_SHOUT
sont des variante du "talk" et du "shout" normal... mais il sera affiché et entendu uniquement par les NPC.

La particularité d’avoir un module est que le texte est aussi "entendu" par les objets du jeu. Les créatures sans portée auditive tourneront la tête, et si vous faite un script qui reconnais le texte via SetListenPattern et
GetListenPatternNumber (comme les "cris" de combat), SpeakString peut être utilisé pour cela.

ActionStartConversation
Qu’est ce que ça fait : Ca demande à l’éxécuteur de la commande d’initier le dialogue avec la cible. Ca doit faire partie de l’événement OnDialogue de la cible (si elle en a un, et que le PC n’en pas). Si aucun fichier de dialogue resref est spécifié, celui attaché à la créature ou à l’objet sera utilisé (celui que vous avez spécifié dans le toolset). L’interlocuteur dans la conversation doit toujours être l’objet cible.

Advantages: Vous pouvez démarrer un conversation entière de cette manière, avec des choix de réponse et de multiples conditions de départ et de script. Vous pouvez aussi spécifier dans la commande principale si c’est ou non une conversation privée…Si c’est le cas, seule la cible verra le texte apparaître sur l’écran (c’est bien pour interagir avec les objets sans que les autres joueurs entendent cette conversation).

BeginConversation
Qu’est ce que ça fait: Cette commande est normallement seulement utilisée dans le "OnDialogue event" de la créature. C’est la commande qui lui demande de débuter la conversation avec le joueur qui vient juste de lui cliquer dessus. L’utiliser sur un objet ne lancera pas son "OnDialgue event". Si la cible de l’action n’est pas spécifiée, l’objet qui a initié le OnDialgue event sera utilisé.

Advantages: Peut être utilisé pour une conversation de NPC à NPC... autrement ActionStartConversation doit toujours être utilisé hors du OnDialogue event.

FloatingTextStringOnCreature
Qu’est ce que ça fait: Quand vous accomplissez de nombreuses actions dans le jeu, vous avez remarqué le texte qui apparaît au dessus de la tête du joueur flotte puis disparaît. Cette commande faît la même chose. Le texte est aussi montré dans la fenêtre du chat du joueur…Mais il n’est pas montré comme originaire d’une créature et ne montrera aucun portrait. Le texte est simplement marqué en jaune, comme la plupart des texts ambiants.

Advantages: C’est bien pour un texte d’ambiance ou simuler un message décrivant une action, puisqu’il n’ajoute pas un préfixe au début du texte et ne ressemble pas au texte des dialogues.

Une chose dont il faut être conscient: Un texte flottant, par défault, ne peut être vu que par la créature au dessus de laquelle il flotte. Si vous sélectionnez la commande "display to faction", alors les membres de la même faction verront aussi le texte s’afficher. Cela veut dire que le texte flottant est utile uniquement pour les PC, puisque aucune créature non PC ne peut être attribuée à la faction PC.

SpeakOneLinerConversation
Qu’est ce que je fais: Cela marche presque comme ActionStartConversation, mais son usage est plus spécifique. Il est utilisé pour accèder au fichier dialogue, mais seulement pour une ligne de dialogue unique sans réponses ni liens.

Advantages: Vous pouvez encore scripter les conditions de lancement du dialogue, vous pouvez avoir une longue sélection de ligne simple. Le locuteur ne se tourne vers aucune cible avant de parler…et l’objet identifié dans la commande (si il y en a un) devient la référence pour chaque marque utilisée dans le dialogue (seulement si elles ne sont pas présentes).

Faire dire un texte à un objet placable.

Pour l’exemple que je vais utiliser ici, nous allons faire qu’un objet placable "signpost" affiche un texte quand on clique dessus.

Important! Si vous voulez avoir un objet placable qui interagit avec les autres de cette manière, vérifiez que la case "Statique" est décochée !Si un objet placable est statique, il fera partit de l’arrière plan et ne sera pas sélectionnable. La plupart des objets sont marqués statique par défaut !

Donc sélectionnez un "signpost" (une pancarte) dans la liste des objets placables et placez le ou vous voulez. Ensuite allez dans ces propriétés et soyez sur que la case statique est décochée. Comme je veux que le joueur soit capable de cliquer dessus, la case "useable" (elle doit être cochée). Allez dans la section script et mettes le script suivant dans le OnUsed event :


void main()
{
SpeakString("North: Waterdeep, 20 miles");
}

Maintenant, quand vous êtes dans le jeu et que vous cliquez sur la pancarte, elle affichera le texte précédé de son portrait (qui est par défault une pancarte) et de son nom. Naturellement vous pouvez toujourzs changer le portrait comme vous voulez, ainsi que le nom, et l’affichage sera différent.

Faire apparaître un texte flottant à un déclencheur (trigger)

Dans cet exemple nous voulons que quand un joueur traverse la zone du déclencheur, un texte ambient apparaît au dessus de sa tête.

Allez dans le menu déclencheur (trigger menu) et sélectionnez "generic trigger". Ca vous permettra de dessiner les limites du trigger. Si je veux afficher une description de quelque chose que le joueur voit dans la zone, par exemple, je peux le mettre juste derrière la porte.

Allez dans la section script du trigger. Comme nous voulons que le texte apparaisse quand le joueur entre dans le déclencheur, nous mettrons le script dans la section OnEnter. Quelques choses à prendre en compte : est ce que nous voulons qu’il l’affiche seulement pour les PC ou pour toutes les créatures entrantes ? Est ce que nous voulons qu’il s’affiche à chaque fois que le PC entre, ou seulement une fois ? Cette fois, nous voulons que le texte apparaisse à tout le monde…mais une fois seulement.


void main()
{
object oPC = GetEnteringObject();
if (GetLocalInt(oPC, "Saw_Trigger_Text") == FALSE)
{
FloatingTextStringOnCreature("La pièce est sombre et angoissante.", oPC);
SetLocalInt(oPC, "Saw_Trigger_Text", TRUE);
}
}


Quand le joueur entre dans le trigger pendant le jeu, le texte apparaît au dessus de sa tête et flotte, puis disparaît. Cela l’affichera aussi dans la fenêtre de chat en jaune. Notez que le déclencheur ne peut pas utiliser SpeakString oou ActionSpeakString. Il ne peut tout simplement pas parler. Mais, il peut cependant demander à un autre objet de parler…et cet objet peut aussi être invisible ou non. Si j’ai à proximité un objet placable avec le tag "DISPLAY_HERE" (qui souvenez vous a la case "Static" décochée) et que je veux que le déclencheur le fasse afficher un texte, j’utiliserais le script suivant:




void main()
{
object oPC = GetEnteringObject();
object oDisplay = GetObjectByTag("DISPLAY_HERE");
if (GetLocalInt(oPC, "Saw_Trigger_Text") == FALSE)
{
AssignCommand(oDisplay, SpeakString("La pièce est sombre et angoissante."));
SetLocalInt(oPC, "Saw_Trigger_Text", TRUE);
}
}

Avoir un objet qui affiche un texte quand un personnage vient à proximité.

Dans cet exemple, je vais poser un objet invisible (que le personnage de peut ni voir ni toucher) qui va afficher un texte quand le joueur approche à moins de 10 mêtres.

Premièrement, sélectionnez l’objet invisible dans le menu des objets placables et placez le. Allez dans ces propriétées et vérifiez que "Static" est décoché. Je ne veux pas que le joueur puisse cliquer dessus, donc laissez "Useable" décoché. Changez le nom de l’objet en "Unknow Person" et laissez le portrait blanc.
Allez dans la section des scripts. Mettez le script suivant dans le OnHearbeat event:


void main()
{
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
if (GetIsObjectValid(oPC) && (GetDistanceToObject(oPC) < 10.0))
{
SpeakString("Psst! Viens par ici!");
}
}

Dans le jeu, quand le player viens à moins de 10 mètres de l’objet, le texte apparaîtra à l’écran…et dans la fenêtre de chat et le PC pourra lire "Unknown Person : Psst ! Viens par ici !". Je pourrais dévelloper un petit peu plus le script…par exemple, vérifier si le personnage s’approche à moins de 3 mètres la personne inconnu apparaîtra au dessus de l’objet placable.

Une chose que vous devez savoir est que l’objet placable est un petit peu petit… et l’affichage du texte est un peu bas sur le sol (ca dépend du zoom de la caméra). Il y a un truc pour l’afficher un peu plus haut : avant de placer cet objet invisible, sélectionnez un autre objet placable qui est aussi haut que vous le souhaitez…Placez le en premier. Puis sélectionnez l’objet invisible dans le menu, placez le curseur directement au dessus du premier objet avant de cliquer pour le poser. Il apparaîtra au sommet du premier objet. Maintenant, effacez le premier objet et l’objet invisible flottera au milieu de la pièce (et y restera).

Avoir un objet placable qui lance un dialogue.

Admettons que je veuille un objet aue le joueur puisse sélectionner et avoir un dialogue interactif…ou peut être avoir un objet qui parle. Premièrement, allez dans la liste des objets placable et sélectionnez un objet. Par exemple un piédestal et placez le dans le module. Allez dans ces propriétés et vérifiez que "Static" est décoché et "Usable" est cochée.

Allez dans l’onglet advance. Ecrivez dans un fichier dialogue ce que nous allons créer et appuyez sur Edit. Vous pouvez commencer par une ligne comme "Il y a quelque chose décrit sur le piédestal dans un language étrange. Est ce que vous essyez de le déchiffrer ?" Vous pouvez ensuite continuer à donner des réponses et faire un dialogue aussi long que vous le voulez, comme un dialogue normal. Allez dans l’onglet script et placez le script suivant dans OnUsed:


void main()
{
object oPC = GetLastUsedBy();
ActionStartConversation(oPC, "", TRUE);
}

Dans le jeu, quand le joueur clique sur le piédestal, il s’approche de lui et le dialogue commence normalement. Puisque j’ai spécifié TRUE dans le paramêtre bPrivateConversation de la commande, lui seul verra la commande…un autre joueur étant a proximité ne verra et n’entendera rien. Si je ne me souciais pas du texte affiché, j’aurais pu simplement avoir écrit ActionStartConversation(oPC), puisque les " " signifient que le fichier dialogue attaché est utilisé.

Commencer une conversation avec une porte

Admettons que je veuille simuler ça : le joueur essaie d’ouvrir une porte mais la trouve fermée. Une voie parle de l’autre côté : "Quel est le mot de passe ?"

Premièrement, placez la porte normalement. Allez dans ses propriétées et changez le nom. Une chose pratique dans le nom de la porte : c’est qu’il n’est montré à aucun endroit (même si on l’examine) sauf dans le dialogue…donc changez le en "Le garde de l’autre côté", puisque c’est ce que le joueur verra.

Marquez la porte comme "plot" pour qu’elle ne puisse être cassée (mais vous pouvez aussi la laisser comme tels, et écrire un script avec les évènements OnDamaged ou OnPhysicalAttacked). Allez dans l’onglet lock et cochez la case "Locked". Si vous ne voulez pas qu’elle soit crochetable, cochez "Key required to lock or unlock" (encore une fois, vous pouvez faire comme vous voulez). Allez ensuite dans l’onglet advanced et mettez un nom dans conversation puis appyuez sur Edit. Nous pouvons créer la première ligne "Quel est le mot de passe ?" et continuez comme vous le souhaitez…quand vous avez fini et que vous avez crée une réponse ou le garde accepte d’ouvrir la porte, placez le script suivant dans la section "Action Taken" du nœud ou ce dernier accepte d’ouvrir.


void main()
{
ActionDoCommand(SetLocked(OBJECT_SELF, FALSE));
ActionOpenDoor(OBJECT_SELF);
}

Maintenant, nous devons placer le script qui démarre la conversation. Placez le script suivant dans le OnFailToOpen event:


void main()
{
object oPC = GetClickingObject();
if (!IsInConversation(OBJECT_SELF))
{
ActionStartConversation(oPC);
}
}

Dans le jeu, lorsque le joueur cliquera sur la porte et s’en approchera, il entendra le son habituel quand une porte refuse de s’ouvrir, et soudain le dialogue apparaît. Le joueur verra le portrait de la porte et "Le garde de l’autre côté" s’afficher au dessus avec le texte "quel est le mot de passe ?" affiché. Quand le moment arrive dans le dialogu ou le guarde doit ouvrir la porte, elle est déverouillée puis s’ouvre d’elle même…le joueur peut aintenant
entrer.

__________________
Théranthil, Mage Elfe prêtre de Mystra Membre des GdE
Parti Elmotiste pour un parler jowilien: Ministre supérieur de la corruption

"Les langues vont toujours bon train. Les pieds ont du mal à suivre."
(les bourses aussi NdT )
Mespert de la porte de Baldur