<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [ <!ENTITY copyrightDates '1999,2000,2001'> <!ENTITY % METACOSM SYSTEM "../en.metacosm.ent"> %METACOSM; ]> <article lang="EN"> <articleinfo> <title>RFC - Dialogs specification</title> <corpauthor>&author;</corpauthor> <revhistory> <revision> <revnumber>1.5.1</revnumber> <date>April, 16th 2000</date> <authorinitials>Janselmeer</authorinitials> <revremark>Small change in the 'expression modifiers' section</revremark> </revision> <revision> <revnumber>1.4</revnumber> <date>April, 9th 2000</date> <authorinitials>Janselmeer</authorinitials> <revremark>Improvement section 5.2, addition of notes about UI in sections 5.2 and 6.2, addition of expression modifiers</revremark> </revision> <revision> <revnumber>1.3</revnumber> <date>March, 30th 2000</date> <authorinitials>Janselmeer</authorinitials> <revremark>Conversion to metacosm-DTD</revremark> </revision> <revision> <revnumber>1.2</revnumber> <date>November, 21th 1999</date> <authorinitials>Janselmeer</authorinitials> <revremark>Addition of return codes and extension to dialogs between several creatures</revremark> </revision> <revision> <revnumber>1.1</revnumber> <date>November, 17th 1999</date> <authorinitials>Janselmeer</authorinitials> <revremark>Updates following discussions</revremark> </revision> <revision> <revnumber>1.0</revnumber> <date>July, 22th 1999</date> <authorinitials>Janselmeer</authorinitials> <revremark>First draft</revremark> </revision> </revhistory> <abstract> <simpara>This document describes the dialogs (and monologues too).</simpara> </abstract> </articleinfo> &license; &project; <sect1> <title>Notations</title> <para>Some terms are defined in the Vocabulary-RFC, which is available on the official web site.</para> <para>Concerning dialogs case, keywords can be entered in lowercase, in uppercase or even in mixed case without any problem.</para> </sect1> <sect1> <title>Bots Query Mode</title> <sect2> <title>Bases</title> <para>Here the current subject is bots query mode specification. Query mode by keywords has been chosen. Each bot possesses a set of words, with which are associated answers.</para> <example> <title>A bot whose name is Raoul and who is a baker</title> <blockquote><para><screen> Name -> My name is Raoul. Job -> I am the baker. </screen></para></blockquote> </example> <para>Each bot will have to answer the following keywords: <itemizedlist> <listitem><para>Name <listitem><para>Job <listitem><para>names of the creatures known by the bot <listitem><para>names of locations known by the bot </itemizedlist> </para> <para>Whereas the first two keywords are static, the following ones will be dynamic and will rely on bot memory. However, we have to nuance the staticity of the first two ones: a creature can lie or change job.</para> <example> <title>Raoul is a baker who lives in North Midgaard</title> <blockquote><para><screen> >Raoul Bot: Raoul the baker is a vile enemy of mine. You can find it in the vicinity of North Midgaard. >Marcel Bot: I don't know that. </screen></para></blockquote> </example> <para>Keywords should also allow to move forward in a conversation:</para> <example> <title>Keywords in conversation</title> <blockquote><para><screen> >Job Raoul: I am the baker. >baker Raoul: I cook breads, pies and cakes. >cakes Raoul: My cakes are the best in Midgaard. </screen></para></blockquote> </example> <para>But they can also be used as the thread of a quest:</para> <example> <title>Keywords in a quest</title> <blockquote><para><screen> >treasure Old Pirate: I had a map but I sold it to an adventurer called Raoul. (...) >treasure Raoul: I have only half of the map. Robert has the other part. (...) >treasure Robert: I have the other part of the map. </screen></para></blockquote> </example> </sect2> <sect2> <title>Active Bots</title> <para>Until now, we considered bots as completely passive, only answering players queries. But there is no reason and to the contrary bots should be more active in conversation.</para> <para>They can propose discussion subjects (talk about the weather, local news), start a discussion with a passer-by (be it player or not), especially if the bot has something to sell.</para> <example> <title>Meeting with a guard</title> <para>A guard meet Janselmeer. He does not know who he is. So he is asking Janselmeer.</para> <blockquote><para><screen> A guard is approaching. Guard: What's your name, stranger? case 1: >Janselmeer Guard: I am watching you, Janselmeer. case 2: >Oumph Guard: I am watching you, Oumph. </screen></para></blockquote> </example> <para>Janselmeer can say his true name (1) or not (2). Both answers will be accepted by the guard. Janselmeer will be known until that moment under the name he gave (Janselmeer or Oumph) by this guard, and potentially by other people in town.</para> <para>Now, let's take this example again but the guard already knows the name of Janselmeer.</para> <example> <title>Meeting with a guard (2)</title> <blockquote><para><screen> A guard is approaching. Guard: What's your name, stranger? case 1: >Janselmeer Guard: I am watching you, Janselmeer. case 2: >Oumph Guard: You lie! I know that you are not Oumph. A guard attacks you. </screen></para></blockquote> </example> <para>Here, the guard waited 'Janselmeer' as an answer. Any other answer, for instance 'Oumph', can be interpreted as a lie by the guard.</para> <para>This examples allows to touch two new aspects. First is the temporary addition of extra keywords. In the example above, it's Janselmeer which has been added.</para> <para>Second is the more interesting integration of player answers into the bot memory. In the examples, the guard will remember that the name of the player is Janselmeer. Of course, nothing prevents lying but the example shows incurred risks in a simplified way.</para> <para>It can happen that one does not wish to answer questions. In this case, a creature can use the keyword JOKER to mean it.</para> <para>The lack of an answer (after a limited time) could be considered as a refusal to communicate too.</para> <para>Players will generally use the second solution and bots the first one. If players have to use JOKER, it would be better to alias it as "..." (or something else) in the UI, that is more explicit.</para> </sect2> <sect2> <title>Communication between bots</title> <para>Let us apply what we previously defined to communication between 2 bots. Let us go over the guard example again.</para> <example> <title>Meeting with a guard (3)</title> <para>As seen by the player, it should give the following:</para> <blockquote><para><screen> Guard to Bot: What's your name, stranger? Bot to Guard: My name is Bot. Guard to Bot: I am watching you Bot. </screen></para></blockquote> <para>As seen by a bot:</para> <blockquote><para><screen> Guard to Bot: Name Bot to Guard: Bot Guard to Bot: "" </screen></para></blockquote> </example> <para>The main difficulty to achieve this is that the guard does not know that he talks to a bot. The one whom the guard talks to should be able to understand whether it is a bot or a player.</para> <para>In order to make sure he is understood, the guard must therefore speak to his interlocutor in a way understandable by players and non-players alike. Moreover, if there are other creatures who listen to the conversation, they will hence be able to understand too, whether they be bots or players.</para> <para>The solution that the example suggests is to integrate into a message both the short version interpretable by bots (corresponding to keywords), as well as a long version for players.</para> <example> <title>Meeting with a guard (4)</title> <para>As seen by the game:</para> <blockquote><para><screen> Guard to Bot: ("Name", "What's your name, stranger?") Bot to Guard: ("Bot", "My name is Bot.") Guard to Bot: ("", "I am watching you Bot.") </screen></para></blockquote> </example> <para>When a bot or a player sends a message which can not be understood or which does not need an answer, the short version will be empty. No processing will then be done in order to interpret the message. On the other hand, it could be repeated.</para> <example> <title>Meeting with a guard (5)</title> <para>As seen by the game:</para> <blockquote><para><screen> Guard: Now you die, Raoul! Message ("", "Now you die, Raoul!") </screen></para></blockquote> </example> <example> <title>The grocer</title> <blockquote><para><screen> Grocer: Look at my beautiful waterskins! Buy them! (a priori destined only to players, unless bots are uncannily clever) Message ("", "Look at my beautiful waterskins! Buy them!") </screen></para></blockquote> </example> </sect2> <sect2> <title>Application to user interface level</title> <para>The player has two ways of sending messages:</para> <itemizedlist> <listitem> <para>classical</para> <example> <title>Where was Oumph?</title> <para>tell Oumph "Where have you been?"</para> <para>This will generate this message ("", "Where have you been?"). It could not be understood by a non-player; however every creature is able to report the words that she hears (spy, gossip, etc).</para> </example> </listitem> <listitem> <para>with aliases</para> <example> <title>Oumph's job</title> <para>This will generate this message ("Job", "What's your job?") which can be understood by bots and players.</para> <para>An alias list will have to be implemented in the controller. The player will of course be able to modify them in his own way.</para> <para>If the alias does not exist, 'tell Oumph cloporte' will generate the message ("cloporte", "cloporte").</para> </example> </listitem> </itemizedlist> </sect2> <sect2> <title>Control codes</title> <para>In order that the bots could understand one another better, we add return codes NONE, ANS, WRONG_ANS and BAD_ANS. These codes are not readable by players and cannot be used directly by players either (the 'answer' commands will allow to send a message with the control code ANS). So the codes using is reserved to bots.</para> <para>NONE is the default control code. It does not mean anything. It is employed when no other control code is used.</para> <para>The code ANS means that the message is an answer to a previous question.</para> <para>WRONG_ANS is used to point out that the answer is regarded as wrong and deceitful. The interlocutor can therefore give another chance to say the truth (or rather what the bot considers as the truth), change topic of conversation or break the discussion with troublesome consequences (fight, reputation drop...).</para> <example> <title>A guard is questioning a player</title> <blockquote><para><screen> A guard is approaching. Guard: What's your name, stranger? (name, "What's your name, stranger?", NONE) >Janselmeer ("Janselmeer", "Janselmeer", ANS) Guard: You lie! I know you are not Janselmeer. ("", "You lie! I know you are not Janselmeer.", WRONG_ANS) >Oumph ("Oumph", "Oumph", ANS) case 1: Guard: You lie! I know that you are not Oumph. ("", "You lie! I know that you are not Oumph.", WRONG_ANS) A guard attacks you. case 2: Guard: I'm watching you Oumph. ("", "I'm watching you Oumph.", NONE) </screen></para></blockquote> </example> <para>It is advisable to limit the number of possible tries... BAD_ANS marks that the answer is incorrect, inconsistent with the answer type which was expected.</para> <example> <title>A guard is approaching</title> <blockquote><para><screen> A guard is approaching. Guard: What's your name, stranger? (name, "What's your name, stranger?", NONE) >43 ("43", "43", ANS) Guard: "I said 'What's your name?'." ("", "I said 'What's your name?'.", BAD_ANS) </screen></para></blockquote> </example> <para>A BAD_ANS code generated by a bot is a serious error in the game code or in the bot code. An error log must be made for debugging and correction.</para> <para>A BAD_ANS code generated by a player means a typo, a bad understanding of the question, a voluntary lie, a try at disturbing the bot, etc.</para> <para>The coder is free to make its bot react as she thinks best (polite and understanding, nervous and aggressive, etc). So the bot can repeat its question or not.</para> <note><para>the bot cannot and should not know whether it speaks to another bot or to a player. This is the reason why the number of BAD_ANS answers must be limited, in order to prevent buggy bots to induce infinite loops...</para></note> </sect2> <sect2> <title>Expression modifiers</title> <para>An Expression Modifier is a context information going with the message. This information is relevant for the bot receiving the message and help him decide how to react.</para> <para>For example, there are several ways to ask somebody its name: <itemizedlist> <listitem><para>polite: "Would you mind to tell me your name, please?"</para></listitem> <listitem><para>neutral: "What is your name?"</para></listitem> <listitem><para>insulting: "What is your name, alien scum?"</para></listitem> </itemizedlist> </para> <para>Each time, only the expression modifier changed. Below are the same messages understood by bots: <itemizedlist> <listitem><para>polite: (name, NONE, POLITE)</para></listitem> <listitem><para>neutral: (name, NONE, NEUTRAL)</para></listitem> <listitem><para>insulting: (name, NONE, INSULTING)</para></listitem> </itemizedlist> </para> <para>POLITE, NEUTRAL and INSULTING are Expression Modifiers. Here is a list of expression MODIFIERS:</para> <itemizedlist> <listitem><para>OBSEQUIOUS</para></listitem> <listitem><para>POLITE</para></listitem> <listitem><para>NEUTRAL</para></listitem> <listitem><para>RUDE</para></listitem> <listitem><para>THREATENING</para></listitem> <listitem><para>INSULTING</para></listitem> <listitem><para>CHARMING</para></listitem> </itemizedlist> <para>This list is not closed.</para> <para>The following example explains how Expression Modifiers could be used. Janselmeer meets Robert the butcher (Raoul's brother) and asks him about Raoul the baker.</para> <example> <title>Expression modifiers</title> <blockquote><para><screen> Janselmeer: (RAOUL, "Do you know RAOUL?", NONE, NEUTRAL) Robert: ("", "I am not concerned with that RAOUL.", ANS, RUDE) Janselmeer: (RAOUL, "O MIGHTY ONE, may I beg you a little of your knowledge about Raoul?", NONE, OBSEQUIOUS) Robert: ("", "RAOUL? This thing exists only in your sick mind.", ANS, INSULTING) Janselmeer: (RAOUL, "Tell me something about Raoul or I'll kill you!", NONE, THREATENING) Robert: ("", "I swear I don't know Raoul.", ANS, NEUTRAL) Janselmeer punches at Robert. Janselmeer: (RAOUL, "Tell me something about Raoul or I'll kill you!", NONE, THREATENING) Robert: ("", "Raoul is the baker. He lives North of here. Please don 't kill me!", ANS, POLITE) </screen></para></blockquote> </example> <para>There is no obligation using an Expression Modifier whether another. It is a pure matter of roleplay. Some people are used to be rude and some others are used to be polite only because it is their way. But of course creatures may not have the same reaction with the first than with the second. It depends on them. For example, a lord is normally used to be talked obsequiously and may be offended by someone that would act differently. So the choice of an expression modifier depends on both the personality of the character that is speaking and the expected reaction of the character that is listening.</para> </sect2> <sect2> <title>Future extensions of bots language</title> <para>The keywords system has been chosen on grounds of simplicity of implementation. Nevertheless, this should evolve and lead towards a true dialog with complete sentences (subject, verb, complement).</para> <para>The first extension to keywords could be the use of interrogative pronouns and adverbs: what, who, where, why, how, how many, which, when.</para> <example> <title>Pronouns</title> <blockquote><para><screen> >Who Raoul Bot: Raoul is the baker. >Where Raoul Bot: You can find it in the vicinity of North Midgaard. >What Raoul Bot: I've never heard of this. </screen></para></blockquote> </example> </sect2> </sect1> <sect1> <title>The various modes of verbal communication</title> <para>The content of this part can seem obvious but yet it is altogether essential. We distinguish two communication modes which are dialog and monologue, which will be used to different ends in the game.</para> <sect2> <title>The monologue</title> <para>What we call monologue is when a creature sends a self-supporting message and hence does not wait for an answer.</para> <para>This message can be intended for a creature in particular, but most of the time it is not specifically aimed.</para> <example> <title>A guard attacks Janselmeer</title> <blockquote><para><screen> Guard: Now you die, Janselmeer! A guard attacks Janselmeer. </screen></para></blockquote> </example> <para>This message is aimed merely to Janselmeer, but all creatures passing by can hear it.</para> <example> <title>A caravan arrives to the market place</title> <blockquote><para><screen> The caravan: The caravan has arrived! Look at my beautiful vegetables! </screen></para></blockquote> </example> <para>This message is intended for all creatures passing by.</para> <example> <title>Janselmeer has just bought something</title> <blockquote><para><screen> Janselmeer: That was my last silver... </screen></para></blockquote> </example> <para>The message is aimed to no one but can be heard by all present creatures (who will wonder about Janselmeer's health :).</para> <sect2> <title>The dialog</title> <para> <glosslist> <glossentry id="dialog"> <glossterm>Dialog</glossterm> <glossdef> <para>The dialog is an information exchange by means of messages between two or more creatures.</para> </glossdef> </glossentry> </glosslist> </para> <para>It is carried out in connected mode, with a connection phase, a conversation phase and a disconnection phase.</para> <para>Let us see an instance of dialog: a tourist who asks his way to a passer-by.</para> <blockquote><para><screen> -connection phase: tourist: Please, sir... The passer-by stops passer-by: Yes? -conversation phase: tourist: I'm looking for the local camp site. passer-by: You turn to the left 500m from here, then go straight ahead to the fountain and then turn to the right. -disconnection phase: tourist: Thank you, have a nice day! passer-by: You're welcome. </screen></para></blockquote> <para>It's this kind of dialog which we will attempt to reproduce. A dialog unfolds in the following way:</para> <blockquote><para><screen> The C1 creature wants to talk to creatures C2, C3, ..., Cn. 1- C1 asks to talk to C2, C3, ..., Cn. 2- Some Ci accept the request, others decline it. 3- C1 talks with the ones who have accepted. 4- Those taking part in the conversation withdraw gradually. The last but one leave will put an end to the conversation. </screen></para></blockquote> <para>The advantage of a connected mode is to make the control of bots easier. For example, if one speaks to a bot which is moving, this bot will stop during the conversation (hence during the connection).</para> <para>The dialog should then be the privileged communication mode with bots. As soon as a dialog is opened, some actions are forbidden (as going away for instance). These actions automatically break the conversation.</para> <para>A dialog can be interrupted by an external event only if this one requires a mandatory reaction from a creature involved in the conversation. Such an event can be a fight for example.</para> <blockquote><para><screen> Tourist | Passer-by ----------------------------------------------------------------------- >talk passer-by | Tourist: Please sir... | Tourist: Please sir... | A tourist wants to talk with you. | Do you accept? (Y/N) | >Y passer-by: Yes?... | passer-by: Yes?... >tell passer-by "I'm looking | for the local camp site." | tourist: I'm looking for the local | camp site. | >tell tourist "You turn to the left | 500m from here, then go straight | ahead to the fountain and then turn | to the right." passer-by: You turn to the left | 500m from here, then go on | straight ahead to the | fountain and then turn to the | right. | tell passer-by bye | Tourist: Thank you, have a nice | day! | tourist: Thank you, have a nice day! </screen></para></blockquote> <para>This is worth noting that the command 'talk' allows dialog opening and that the keyword 'bye' puts an end to the conversation.</para> <para>Note too, that an UI can provide some shortcuts in the dialog. for example, it is not needed to ask the players if they want to answer. It is possible just let them answer if yes and do something else if no. In a similar fashion, to break the dialog, it should be enough just to do something else and not to have to type bye.</para> <para>In order to open a dialog with more than one creature, one adds the names of the desired creatures in the parameters to 'talk', or one uses 'talk~all' in order to talk to all present creatures.</para> <example> <title>Hiring in a tavern</title> <blockquote><para><screen> Recruiter> talk all Recruiter: "I beg your attention, please." [To this stage, some listen, some others don't.] Recruiter: "I've got a job to offer, dangerous and underpaid." [Two or three creatures are still listening...] Recruiter: "3 silvers to go kill Skarkash." [Huge silence in the room] Recruiter: "Well, never mind!" Recruiter> bye Recruiter: "Thanks for your attention." </screen></para></blockquote> </example> <example> <title>Identity control in the street</title> <para>The guard is searching for an escaped elf prisoner.</para> <blockquote><para><screen> Guard> talk elf1 elf2 Guard: "Hey you, and you!" Guard: "Give me your names!" Elf1: "Celeborn" Elf2: "Galadriel" Guard> bye Guard: "All right, move along." </screen></para></blockquote> </example> <note><para>this example shows the underlying coding difficulties. The sentence associated to a keyword depends on the language level of the one who speaks (politeness, elocution, etc), on its work, on the number of persons to which one speaks to, on the sex of these persons, etc.</para></note> </sect2> <sect2> <title>Messages and perception</title> <para>The dialog system depends on perceptions. A message is indeed nothing but a special stimulus which holds a lot of information. A message is associated to one or several stimuli, which makes it possible to choose the medium (sound, telepathy, etc) and the intensity of the message. So it is possible to choose one's means to communicate.</para </sect2> </sect1> <sect1> <title>Multilingual dialogs</title> <sect2> <title>Various languages in the game</title> <para>Creatures in a given world do not have necessarily the same language nor the same way to express themselves.</para> <para>In order to manage the differences between languages, we introduce a 'language' attribute in messages.</para> <para>On receiving a message, a creature will have to verify that it knows the language in which this message is formulated, before being able to read it. If this is not the case, the message text will appear encrypted (and so unintelligible) to the player or to the script/AI which receives it.</para> <para>A creature can anyway memorize a message which it do not understand (language problem). To the contrary, it cannot memorize a message if it does not possess the sense required for the perception of the message.</para> </sect2> <sect2> <title>Multilingual support for players</title> <para>In order to face the objective of a multilingual game (English, French, Spanish, German...), it is required that dialogs be the same as much as we can.</para> <para>The solution would consist in integrating in the messages the same version of the text in various languages.</para> <para>It would concern messages sent by bots but also the texts of player aliases.</para> <example> <title>Multilingual example</title> <para>job -> ("What's your name?", "Comment t'appelles-tu~?", "Wie heisst du~?")</para> </example> <para>Therefore players could read messages from the desired version if this version is available, otherwise it will be the default version (which is always available). On the other hand, players will of course not have to formulate their messages in several languages.</para <para>The internal representation of standard keywords (name, job...) will always stay the same but it is not out of the question that these keywords be translated by the interface. Other keywords will definitely have to be translated in several languages by world creators or translators.</para> <para>The following example shows well the necessity of translating some keywords:</para> <example> <title>Example of the baker</title> <para>in English</para> <blockquote><para><screen> >Job Raoul: I am the baker. >baker Raoul: I cook breads, pies and cakes. >cakes Raoul: My cakes are the best in Midgaard. </screen></para></blockquote> <para>In French</para> <blockquote><para><screen> >Job Raoul: Je suis le boulanger. >boulanger Raoul: Je fais du pain, des tartes et des gâteaux. >gateaux Raoul: Mes gâteaux sont les meilleurs de Midgaard. </screen></para></blockquote> </example> <para>If we do not translate the keywords <screen>baker</screen> and <screen>cakes</screen>, a player in French version will have some trouble to advance in the conversation:</para> <example> <title>Bad translation</title> <blockquote><para><screen> >Job Raoul: Je suis le boulanger. >boulanger Raoul: Je ne connais pas. >gateaux. Raoul: Je ne connais pas. </screen></para></blockquote> </example> <para>This is a trap into which translators must not fall.</para> <para>Finally, we specify to avoid any misunderstanding, that a keyword in French does not mean that the answer will be merely in French, and ditto for other languages. In all events, the answer must remain multilingual so that the other players who listen to the message and who use another language, may understand. Actually, there will be only a set of keywords associated to a set of answers:</para> <blockquote><para><screen> (boulanger, baker)->("Je fais du pain, des tartes et des gâteaux.", "I cook breads, pies and cakes.") </screen></para></blockquote> </sect2> </sect1> <sect1> <title>Summary</title> <para>Standard keywords (valid for all bots):</para> <para> <itemizedlist> <listitem><para>job = "What is your job?": request of the activity of the creature.</para></listitem> <listitem><para>name = "What is your name?": request of the name of the creature.</para></listitem> <listitem><para>joker = refusal of answering a question.</para></listitem> </itemizedlist> </para> <para>Control codes:</para> <para> <itemizedlist> <listitem><para>NONE: default (no signification).</para></listitem> <listitem><para>ANS: answer.</para></listitem> <listitem><para>BAD_ANS: not a valid answer.</para></listitem> <listitem><para>WRONG_ANS: wrong answer.</para></listitem> </itemizedlist> </para> <para>Expression modifiers:</para> <para> <itemizedlist> <listitem><para>OBSEQUIOUS</para></listitem> <listitem><para>POLITE</para></listitem> <listitem><para>NEUTRAL</para></listitem> <listitem><para>RUDE</para></listitem> <listitem><para>THREATENING</para></listitem> <listitem><para>INSULTING</para></listitem> <listitem><para>CHARMING</para></listitem> </itemizedlist> </para> <para>A messages consists in:</para> <para> <itemizedlist> <listitem><para>an attribute giving the language,</para></listitem> <listitem><para>an attribute giving the addressee(s) of the message,</para></listitem> <listitem><para>a short text interpretable by bots,</para></listitem> <listitem><para>a long text for players available in several languages (including at least a default language),</para></listitem> <listitem><para>a control code,</para></listitem> <listitem><para>an expression modifier.</para></listitem> </itemizedlist> </para> <para>Commands:</para> <para> <itemizedlist> <listitem><para>tell: sends a message to one or several entities.</para></listitem> <listitem><para>talk: opens a dialog with one or several entities.</para></listitem> <listitem><para>bye: closes a dialog.</para></listitem> <listitem><para>answer: answers to a question.</para></listitem> </itemizedlist> </para> </article>