Introduction à la création de dialogues
Ce tutorial vous montre comment créer des dialogues in-game :
Préparation
Créez le dossier pour vos fichiers de script .dlg (voir le tutorial approprié si vous ne savez pas faire), appelons celui-ci "dlgtutorial".
Téléchargez le niveau utilisé pour ce tutorial ICI. C'est une simple pièce avec Aida et une porte qui ne peut pas (encore) s'ouvrir. Aida est pour l'instant sous l'influence de "inert.u2s" (qui viens avec le jeu), pour rester immobile et ne pas se balader.
Créez un fichier texte vide et sauvez-le sous le nom "aidadialog.dlg" dans votre dossier "../Dialog/dlgtutorial". Il s'agit du fichier de dialogue que nous allons utiliser. Soyez bien sur que votre éditeur de texte n'ajoute pas une extension .txt à la fin !
Ouvrez ensuite les Level Properties en appyuant sur F6 ou en cliquant sur View -> Level Properties, et sous LevelInfo, assurez vous que le contenu du champ MapNam soit similaire au nom de votre fichier de dialogue, dans notre cas, "dlgtutorial".
Sélectionnez Aida et ouvrez ses propriétés. Dans l'onglet "Dialog", entrez "Aida" dans le champ" speaker". C'est le nom qu'Unreal 2 va essayer de faire correspondre au fichier de dialogue. Sauvez la map.
Les premiers nodes
Tout d'abord, réfléchissons à ce que nous allons faire voici un schéma de la conversation:
Plutôt simple : quand on s'adressera à elle, Aida demandera si elle peut faire quelque chose pour le jour. Si ce dernier lui demande d'ouvrir la porte, elle le fera et répondra "OK, la porte est ouverte". Sinon, Aida dira simplement "Si on me cherche, je suis là".
Une conversation est définie par des "nodes" de dialogue. Créons le premier node, où Aida accueille le joueur. Ouvrez le fichier vide "aidadialog.dlg" et ajoutez les lignes suivantes:
[AidaDialog]
Speaker=Aida
LongText=Salut ! Que puis-je faire pour vous ?
Vous venez de créer un node fonctionnel (même si vous ne pouvez pas encore parler à Aida). Voyons un peu ces quelques lignes:
- [AidaDialog] - C'est le titre de ce node, entre les crochets [ ]. Tout ce qui suit, jusqu'au prochain [ Est considéré comme faisant partie de ce node.
- Speaker= - A qui appartient ce node. Dans notre cas, c'est Aida. C'est la ligne qui est relié au champ "Speaker" du pawn de votre map. Il y a un paramètre Speaker codé en dur : "Player", qui se réfère toujours au joueur.
- LongText= - le texte qui s'affiche. Si vous parlez à Aida, le sous-titre "Que puis-je faire pour vous ?" apparaitra.
Finissons ce dialogue pour rendre la conversation possible. Modifiez le fichier .dlg pour qu'il ressemble à cela:
[AidaDialog]
Speaker=Aida
LongText=Que puis-je faire pour vous ?
NextNode=AidaDialogA
[AidaDialogA]
Speaker=Player
ShortText=Open door
LongText=Ouvre la porte s'il te plait.
Jouez la map. En regardant Aida, votre réticule vous permettra de lui parler.
Maintenant que cela fonctionne, voyons ce que nous avons ajouté:
- NextNode - Relie ce node à un autre. Si celui qui prononce ce node n'est pas "Player", le node suivra automatiquement. Si celui qui parle est "Player" le système utilisera ce noeud comme une option, en affichant le "Shorttext"dans la liste des réponses possibles. Quand le joueur fait son choix, le LongText est affiché.
- ShortText - le texte affiché dans la liste des réponses possibles. Seulement utilisable si la phrase est prononcée par le joueur.
Conversations
Vous avez créé un fichier de dialogue qui fonction et vous avez pu parler à Aida quand vous avez joué le niveau, mais ou et quand avez vous spécifié ma conversation active, ou avez spécifié à Aida son fichier de dialogue ? C'est simple : vous n'en avez pas besoin. Quand un niveau est chargé et qu'un dossier de dialogues correspondant au MapName de la map existe, Unreal 2 scannera automatiquement les fichiers .dlg qu'il trouve et gardera en mémoire les conversations disponibles, qui seront automatiquement disponibles in-game. Quand vous essayez de parler à quelqu'un, le jeu vérifie s'il y a une conversation disponible (en scannant les champs speaker), et s'il en trouve une, ce dialogue est chargé.
Cela veut aussi dire que le jeu devra choisir une conversation s'il y en a plusieurs disponibles, et la conversation choisie pourrait ne pas être celle que vous voulez. Lisez la fin de ce tutorial pour voir comment vous assurez que le jeu choisissez toujours le sujet qui vous intéresse. Pour l'instant, nous n'avons pas à nous en inquiéter vu que nous n'avons qu'un seul sujet de discussion entre vous et Aida.
L'exemple actuel est très simple. Me fichier .dlg contient une conversation à deux nodes entre le joueur et Aida. Quand vous agissez sur Aida, Unreal 2 saura exactement ce qu'il doit dire et où commencer la conversation 'le premier node du fichier .dlg), donc le Level fonctionnera. Pour rendre les choses plus sympa (et vous préparer à des dialogues plus complexes avec plusieurs sujets abordables), nous allons dire au jeu quels sujets sont disponibles, et nous allons le faire grâce au node [Root]. Ajoutez deux lignes à "aidadialog.dlg" pour qu'il ressemble à ce qui suit :
[Root]
Conversation=AidaDialog
[AidaDialog]
Speaker=Aida
LongText=Que puis-je faire pour vous ?
NextNode=AidaDialogA
[AidaDialogA]
Speaker=Player
ShortText=Open door
LongText=Ouvre la porte s'il te plait.
Plutôt facile. Maintenant, le jeu sait qu'il y a une conversation et qu'elle commence au node [AidaDialog] En ajoutant des sujets supplémentaires à Aida, ajoutez des lignes Conversation= en haut. Vérifiez les fichiers .dlg files de l'Atlantis pour comprendre.
Finaliser le dialogue
Nous n'avons créé qu'un dialogue à deux nodes. Finissons le dialogue complet.
[Root]
Conversation=AidaDialog
[AidaDialog]
Speaker=Aida
LongText=Salut ! Que puis-je faire pour vous ?
NextNode=AidaDialogA
NextNode=AidaDialogB
[AidaDialogA]
Speaker=Player
ShortText=Open door
ShortText=Open door
LongText=Ouvre la porte s'il te plait.
NextNode=AidaDialog1
[AidaDialogB]
Speaker=Player
ShortText=Nothing
LongText=Rien pour l'instant.
NextNode=AidaDialog2
[AidaDialog1]
Speaker=Aida
LongText=OK, la porte est ouverte.
//end
[AidaDialog2]
Speaker=Aida
LongText=Si on me cherche, je suis là.
//end
Ce dialogue est toujours plutôt facile. Aida accueille le joueur et lui donne deux options. Comme le node [AidaDialog] a deux lignes NextNode qui conduisent toutes deux à des nodes du joueur, le jeu affichera les deux nodes à l'écran, avec leur ligne ShortText= comme options. Chaque node (une fois choisi par le joueur) mène ensuite à la réponse appropriée d'Aida.
Events
Aida a beau vous dire qu'elle va vous ouvrir la porte, les femmes passent leur vie à mentir et Aida ne fait pas exception ;) Ajoutons donc l'event pour qu'elle fasse ce qu'elle dit. Il y a deux moyens d'envoyer un event depuis un dialogue : Event= et ExitEvent=.
Event= Prend un pourcentage de temps auquel que l'event a lieu. Par défaut, il est à zéro. Si vous utilisez Event=ExampleName" dans un node, l'event "ExampleName" sera envoyé dès le déclenchement du node. Event=ExampleName,,50 (Deux virgules!) envoie l'event après 50% de la durée du node. Notez que les pourcentages trop haut ne sont pas fiables et risquent d'être avalé par le jeu (notamment en cas de fort lag). Event=ExampleName,99 risque de ne pas avoir lieu (tout ce qui est en dessous de 90 est à peu près certain d'être déclenché).
ExitEvent= envoi l'event quand la conversation est finie. Quand le dialogue rencontre un ExitEvent, il le garde en mémoire et le déclenche quand le dernier node est fini. ExiteEvent est très fiable, utilisez-le quand vous voulez être sur du déclenchement d'un event.
Ajoutons l'event déclenchant la porte à Aida.
[AidaDialog1]
Speaker=Aida
LongText=OK, la porte est ouverte.
ExitEvent=Door
//end
Vous auriez aussi pu mettre l'ExitEvent dans le node [AidaDialogA] quand le joueur choisi la réponse positive. Les ExitEvents sont déclenché à la fin de la conversation, pas du node.
SpokenMax
Vous noterez aussi que vous ne pouvez parler qu'une seule fois à Aida. Après, le réticule ne permet plus l'interaction. Si vous avez répondu non à la question d'Aida, vous êtes dans le pétrin vu que vous n'avez aucun moyen de refaire la demande à Aida.
Le dialogue disparait car tout les nodes ont un compteur interne, qui spécifie combien de fois ils peuvent apparaitre, et ce compteur est par défaut à 1. Une fois que le node a été joué, il est supprimé du jeu (et sans les nodes supprimés, le jeu ne peut plus trouver de dialogue entre vous et Aida, vous empêchant de l'utiliser). Pour changer cela, utilisez la commande SpokenMax= :
[Root]
Conversation=AidaDialog
[AidaDialog]
Speaker=Aida
-> SpokenMax=5
LongText=Salut, vous voulez que j'ouvre la porte ?
NextNode=AidaDialogA
NextNode=AidaDialogB
SpokenMax vous laisse choisir combien de fois le node peut être joué, par défaut, une fois. Pour que le mode puisse être joué en boucle, choisissez SpokenMax=0. Ce node sera alors toujours disponible.
Allez-y, mettez SpokenMax=0 à chaque node de votre fichier. Dans un jeu normal, cela semble stupide, mais pour ce tutorial, nous l'utiliserons pour apprendre de nouvelles fonctionnalités. Jouez la ma et soyez sur que vous pouvez parler à Aida tant que vous voulez.
Ouvrir et fermer des nodes
Maintenant que vous avez ajouté "SpokenMax=0" à tout vos noeuds, vous pouvez vous retrouver dans la situation absurde où vous pouvez demander à Aida d'ouvrir une porte déjà ouverte, ce qui est idiot (la porte est un mover TriggerOnce qui reste ouvert indéfiniment). Pour y remédier, vous allez fermer le node "Open door" une fois qu'Aida s'est exécutée.
Modifiez le node [AidaDialog1] comme suit (n'entrez pas le "->"):
[AidaDialog1]
Speaker=Aida
SpokenMax=0
LongText=OK, la porte est ouverte.
ExitEvent=Door
-> DisableNode=AidaDialogA
//end
Jouez la map. Parlez à Aida et utilisez l'option "Nothing" en premier. Reparlez-lui et choisissez "Open Door". Reparlez-lui encore. Le node "Open door" [AidaDialogA] a été fermé, vous ne pouvez plus que choisir "Nothing".
Vous pouviez aussi obtenir l'effet différemment : Choisissez un SpokenMax=0 pour tout vos nodes sauf le node "Open door". Comme vous n'avez pas mis SpokenMax=0 au node OpenDoor, le paramètre par défaut "1" s'applique, et après avoir été joué, le node est supprimé. Seul le choix "Nothing" reste disponible.
DisableNode= a un contraire: EnableNode=, que vous pouvez utiliser pour réactiver des nodes fermés. Tout les nodes sont ouverts par défaut. Si vous voulez qu'un node soit désactivé au début, vous pouvez l'appeler plus tard en ajoutant la ligne Enabled=false à ce node.
Dialogues et fichiers .u2s
Si vous voulez qu'un NPC engage la conversation avec le joueur, vous pouvez le faire avec la commande dialoginitiate :
dialoginitiate [Personne à qui parler] (DialogNode) - Force le NPC à taper la discute avec [Personne à qui parler]. si [Personne à qui parler] n'est pas spécifié, le jeu considère qu'il faut parler au joueur.
Vous pouvez aussi désactiver des nodes depuis le script.u2s:
dialogenable (DialogNode)
dialogdisable (DialogNode)
Plus d'options
Il y a encore bien des commandes utilisables dans un node, mais ce tutorial ne couvrira que la base. Rappelez-vous que si un NPC a plus d'un sujet de discussion (paramétré dans le node [Root] avec Conversation=), vous devez toujours désactiver toutes les discussions sauf une, ou le jeu va s'emmêler les pinceaux, ne pas savoir quoi choisir et balancer un truc au hasard. Désactivez le premier node de toutes les conversations qui doivent être désactivées par défaut, et activez-les plus tard depuis le script .u2s du NPC.
Quelque chose dont je n'ai pas parlé dans ce tutorial est le son, jouable avec la ligne SoundFile=, mais le nom est assez explicite. Si vous enregistrez le dialogue parlé de votre niveau, cherchez dans les fichiers .dlg du jeu original pour comprendre le fonctionnement. SoundFile= peut se référer à des fichiers .ogg (du dossier ../Voice), ou des .wav (empaqueté dans un fichier .uax).
Tutorial de Matthias Worch.