{{tag>graphic skin texture fileformat}} [[:start|Start Page]] >> [[:gamedev|Game Development with the Drag[en]gine]] >> **Simple Conversation** ====== Simple Conversation ====== {{ youtube>W6Pd6kT94Ro?1000x591 }} \\ Video explaining what simple conversation are, what they can be used for and how they are created. Shown using Epsylon game project which uses simple conversation a lot. Simple conversations provide a quicker and easier way to create simple conversations compared to the [[gamedev:deigde:editors:conversation|IGDE Conversation Editor]]. In contrary to regular conversations simple conversations are created using XML files. Yet they are still regular conversations but using an XML syntax and a converter which creates regular conversations for you. It is important to note that simple conversations already require a regular conversation to be present. The reason is that simple conversation reuse various definitions present inside regular conversations like camera shots, gestures, look-at targets as well as pre-made topics for reuse. In the examples below it is expected such a regular conversation is present and contains the required camera shots, gestures and look-at targets. Conversations in general compose of a series of actors speaking with camera angle changes in between. Furthermore actors do mouth animation, perform gestures, perform facial animation and looking at the currently speaking actor or other targets. For the majority of conversations the same type of camera shots are used with the same delays. This process can be sped up by generating actor speaking and camera changes according to common rules. Also speaking gestures or automatically looking at whatever actor is speaking is a common task that can be automated. All this is done by the simple conversation system to make conversations faster to build for which you do not need full control. To achieve this simple conversations uses these main facilities: ===== Camera Definitions ===== Camera definitions provide a list of camera shots or other types of camera changes. Upon using a camera a random shot is selected from the list of possible camera shots. You can use camera shots, conversation snippets, game commands and actor commands to change a camera. By randomly picking from a list of possible camera shots conversations are quickly augmented in fidelity without extra work. ===== Actor Definitions ===== Actor definitions define what actor is speak, formating information and what camera to use. Upon encountering an actor tag the camera definition linked to the actor is used to produce a camera shot conversation action. Then an actor speak conversation action is created. The action is set up with the appropriate parameters and styles defined in the actor definition. Furthermore a default set of gestures, face poses and look-ats can be defined. These will be used unless actor tags define their own. This way actors will perform default actions while speaking which already increases fidelity a lot. Hence actor definitions are like blueprints of actor speak conversation actions you usually have to manually create (or typically copy around). Using actor definitions you can also preconfigure typical moods like an actor thinking something or shouting. The required settings can be stored in multiple actor definitions and used as blueprint. ===== Snippets ===== This is where the actual conversations are defined In contrary to regular conversations which contain topic groups which contain topics a simple conversation contains only snippets. This simplifies the process of working with conversations for common tasks. This is no real restriction since you can always fold regular conversation topic-group -> topic identifiers into a snippet for example like ''topic-group:topic'' or similar formating rules. What you do here is up to you. Important to note is that inside simple conversation snippets you can also run regular conversation snippets using topic-group and topic identifiers. You can thus extend simple conversation with pre-made regular conversations where it makes sense. ===== Workflow ===== The main workflow of creation simple conversations has been designed to align with how conversations are typically created. This accelerates the process of creating such conversations in XML form. ==== Camera and Actor Definition ==== First let's start with some example camera and actor definitions. You usually create them once and store them in a file you can include as basics to use. Here the definitions used for the examples to come: 0.25 ots left medium 0.25 ots right medium player player actor0 actor0 actor0 player Here ''ots'' means ''over the shoulder'' which is an often used camera shot used in movie and tv productions. ''actor0'' is the npc the player is talking to. These camera shots are only going to choose from one single camera shot. By adding more than one camera shot to each camera definition the shots would be randomized. ==== Dialog Text ==== With this out of the way let's head over to a conversation text grouped by actor. This is what you usually start out with in text editors when you plan a conversation. This is an example: georgo: For how long are you working here already? nono: Has to be 15 or 16 years. georgo: Not bad at all. Have you been tinkering around all this time? nono: Most certainly I did. I'm responsible for all technical things around here. No matter if devices or computers I ensure everything is working as it should and is secure. Sometimes I even do programming work on some of Odjin's implants. Basically you wrote down who is telling what and in what order. So far we are already close to working simple conversation but not there yet. ==== Actor Tags ==== As next step replace the actor speaking notes with actual actor tags. Here you have to possibilities: the long tags and the short tags. In the next text the first line speech uses the long tag form and the others the short tag form: For how long are you working here already? Has to be 15 or 16 years. Not bad at all. Have you been tinkering around all this time? Most certainly I did. I'm responsible for all technical things around here. No matter if devices or computers I ensure everything is working as it should and is secure. Sometimes I even do programming work on some of Odjin's implants. As you can see the short version makes your simple conversation files shorter and easier to read. For this reason some tags have short versions. You can also see the actor tags are empty and not wrapping the affecting text. This design choice makes it easier to sprinkle the tags into the text at the desired location without needing to deal with correctly wrapping text. ==== Multiline Speech ==== Now the simple conversation knows what actor is speaking and what actor definitions to use to generate the conversation actions. If you would run this simple conversation right now you would get 4 speeches because the last three lines are collapsed into one. This is because simple conversations ignore whitespaces like HTML does. Hence the last three lines become one. But might want to show them as 3 individual speeches performed by the same actor. To achieve this you have to add some more actor tags at the end of the line (or the start of the next) to separate them. These actor tags are empty which means to repeat the last actor tag used but without camera change. The result looks now like this: For how long are you working here already? Has to be 15 or 16 years. Not bad at all. Have you been tinkering around all this time? Most certainly I did. I'm responsible for all technical things around here. No matter if devices or computers I ensure everything is working as it should and is secure. Sometimes I even do programming work on some of Odjin's implants. As you can see two instances of '''' have been added. Now the speech is split into 3 individual speeches instead of 1 large speech. Depending on your needs both situations are viable. You could also use the long tag '''' but '''' is shorter. This simple conversation would be already playing out. If the [[behavior_conversationactor|ECBehaviorConversationActor]] added to each actor contains a [[speech animation]] then the simple conversation system uses the words in the text to create mouth animations and to determine how long an actor is speaking. Without speech animation no mouth animation is done and the length of speech is estimated. ==== Gestures, Facials and Look-Ats ==== You can now spice things up by adding gestures, face poses and look-ats. You can do this in the actor definition or the snippet itself. By doing in the action definition you do not have to repeat them all the time. Let's update the actor definition: player player actor0 actor0 close speak neutral actor0 actor0 player player close speak neutral Now the actors will look at the other actor when they speak. Another solution for doing this is to use behaviors which automatically track speaking actors and update looking to face them. For this discussion we keep it simple and do it here. ==== Inline Gestures, Facials and Look-Ats ==== To extend this example a bit more let's modify the actual conversation and force a different gesture for one actor: For how long are you working here already? Has to be 15 or 16 years. Not bad at all. Have you been tinkering around all this time? Most certainly I did. I'm responsible for all technical things around here. No matter if devices or computers I ensure everything is working as it should and is secure. Sometimes I even do programming work on some of Odjin's implants. Here some ''g'' tags haven been added (long form ''gesture'' with attribute ''id''). On the affected lines the gestures defined in the actor definition are ignored and the provided ones used. Two versions are shown here. The first version puts the gestures in a specific location in the text. The simple conversation system will add the gestures with the correct duration to make the be in sync with the mouth animation. For such gestures using held gestures works best. Not held gestures will stretch in time which can look silly depending on how much they are stretched. Held gestures play on until finished and thus keep their normal pacing. The second form places both gestures right behind each other. This works best with non-held gestures. The simple conversation system puts the gestures behind each other with their duration set to their default duration. The default duration is stored in the regular conversation file where the gesture is defined. The second form works best if the last gesture is a held one. The gestures will play one after the other with the last one held out long. This does not necessarily line up with the mouth animation but it is a typical design for visual novel type conversations. As a side note. If more than one gesture is added to an actor definition then they play out like the second form, hence one played after the other. The ''f'' tag is the short form for ''facePose''. The ''l'' tag would be the short form for ''lookAt'' but this one is not used in the example above. ==== Dynamic Text ==== Let's modify the text a bit to cover a special case: For how long are you working here already? Has to be 15 or 16 years. Not bad at all. Have you been tinkering around all this time? Most certainly I did. I'm responsible for all {actorProfession} around here. No matter if devices or computers I ensure everything is working as it should and is secure. Sometimes I even do programming work on some of Odjin's implants. The text ''technical things'' has been now replaced with a conversation system tag. [[behavior_ctrrbindings|ECBCTRRBindings]] allows to adds rules which allow to replace such text in conversations with dynamic content. Depending on what kind of information you need to add these tags can be complex with parameters and what not else. Trying to use speech animation to speak them does not make sense. To solve this problem ''t'' tags (or long ''tag'' with attribute ''anim'') exist. They wrap such tags and tell the simple conversation system what text they should use instead of them for conversation purpose. The example would then look like this: For how long are you working here already? Has to be 15 or 16 years. Not bad at all. Have you been tinkering around all this time? Most certainly I did. I'm responsible for all {actorProfession} around here. No matter if devices or computers I ensure everything is working as it should and is secure. Sometimes I even do programming work on some of Odjin's implants. Now the tag has been wrapped in a ''t'' tag with the attribute indicating what text should be spoken (and used for measuring speech length). With this the simple conversation would be ready to be used. Behaviors like [[behavior_conversation|ECBehaviorConversation]] are able to run simple conversations using a regular conversation as base. There are many other tags supported. The description of them is outlined below. ==== Translations ==== With the simple conversation working one last thing to do sooner or later is translations to make the game available to people speaking a different language. Regular conversations require using language packs. This is the typical way translations are done. For large conversations this can be cumbersome to use. Simple conversation provide a nifty way to handle this. You can create a second simple conversation file which you load only if a specific language is used in your game. You load then first the original simple conversation and then the translated one. By calling SimpleConversation.importTranslation() you can then import the translated simple conversation and "patch" the original simple conversation with it. Remember the dialog text with which our example started out with? You can take nearly the same text but skip the actor notes and just translate the lines. The result is looking then like this: Wie lange arbeitest du schon hier? 15 oder 16 Jahre. Nicht schlecht. Und die ganze Zeit am tüffteln? Kann man so sagen. Ich bin hier für die technischen Dinge zuständig. Ob Geräte oder Computer, ich sorge dafür, dass alles funktioniert und sicher ist. Selbst an Odjin's Implantaten muss ich manchmal rum programmieren. That's pretty close to what we need for the translation to be usable. Here too we have the problem that without separating the text lines the simple conversation system does not know where one actor speak starts and the other ends. Simple add '''' after each end of spoken line (the last line does not need one). The result looks now like this: Wie lange arbeitest du schon hier? 15 oder 16 Jahre. Nicht schlecht. Und die ganze Zeit am tüffteln? Kann man so sagen. Ich bin hier für die technischen Dinge zuständig. Ob Geräte oder Computer, ich sorge dafür, dass alles funktioniert und sicher ist. Selbst an Odjin's Implantaten muss ich manchmal rum programmieren. And that's it. This file is now a valid translated snippet. When you patch an original simple conversation like this you get the translation properly applied. What happens under the hood? The simple conversation system walks over all actor speeches in the original file. It will then apply, one by one, the lines actor speeches from the translated file and update the original line with it. It is thus important the translated conversation has the exact same count of actor speech lines as the original. Otherwise the mapping is wrong. What about gestures, face pose, look-ats and ''t'' tags? Simple drop them all. In the translation only text has to be present and no tags (except '''' to end a line). This makes simple conversation files easy to translate for translation companies. Simply paste the translated text into your ''snippet'' tags and add the '''' tags at the end of the lines and you are all set. ====== File Format (*.desconvo) ====== The simple conversation file format is recognized by the LoadSimpleConversation script class. The file is an XML file with a simple structure to define a simple conversation using XML. @startuml object "simpleConversation" as simpleConversation { <#transparent,#transparent>|import| string| |camera|| |actor|| |snippet|| } object "camera" as camera { <#transparent,#transparent>|cameraShot| string| |snippet| string| |command| string| |delay| float| } simpleConversation --> camera object "actor" as actor { <#transparent,#transparent>|actorId| string| |camera| string| |style| string| |gesture| string| |facePose| string| |lookAt| string| |delay| float| |prolongLastGesture| boolean| |useSpeechAnimation| boolean| } simpleConversation --> actor object "snippet" as snippet { <#transparent,#transparent>|actor|| |a|| |gesture|| |g|| |facePose|| |f|| |lookAt|| |l|| |tag| unicode string| |t| unicode string| |command| string| |stopTopic|| |stopConversation|| |variable|| |trigger|| |if|| |elif|| |else|| |choice|| |option|| |wait|| |snippet| string| |music| string| |add|| |remove|| |pause| float| |p| float| |waitMode| enum| |endActorSpeak|| } simpleConversation --> snippet object "if" as if { <#transparent,#transparent>|variable|| |trigger|| |command|| |has|| |none|| |any|| |all|| } snippet --> if object "elif" as elif { <#transparent,#transparent>|variable|| |trigger|| |command|| |has|| |none|| |any|| |all|| } snippet --> elif object "option" as option { <#transparent,#transparent>|variable|| |trigger|| |command|| |has|| |none|| |any|| |all|| } snippet --> option object "wait" as wait { <#transparent,#transparent>|variable|| |trigger|| |command|| |has|| |none|| |any|| |all|| } snippet --> wait @enduml ====== Tags ====== ===== simpleConversation ===== ^Tag^Description^Occurance^Default^ |import|Load simple conversation using path from tag text content. Replaces elements with same name if present.|0..N|-| |camera|Define camera. Replaces camera with same name if present.|0..N|-| |actor|Define actor. Replaces actor with same name if present.|0..N|-| |snippet|Define snippet. Replaces snippet with same name if present.|0..N|-| ===== camera ===== Defines a camera. Can contain one or more camera shot definitions to randomly choose one. ^Attribute^Description^Occurance^Default^ |id|Name of camera.|Required|-| ^Tag^Description^Occurance^Default^ |cameraShot|Add camera shot from regular conversation. Attributes: * ''cameraTarget'': Set camera shot target. Refers to a target defined in the regular conversation. Optional. * ''lookAtTarget'': Set look-at target. Refers to a target defined in the regular conversation. Optional. * ''duration'': Set camera shot duration in seconds. Optional. |0..N|-| |snippet|Add camera shot by running a simple or conversation snippet. Attributes: * ''group'': If set run regular conversation topic located in ''group''. Otherwise run simple conversation snippet. Optional. |0..N|-| |command|Add camera shot by running a game or actor command. Attributes: * ''actor'': If set run actor command on conversation actor with id or alias ''actor''. Otherwise run game command. Optional. |0..N|-| |delay|Delay in seconds for created camera shot action.|0..1|''0.25''| ===== actor ===== Defines an actor. ^Attribute^Description^Occurance^Default^ |id|Name of actor.|Required|-| ^Tag^Description^Occurance^Default^ |actorId|Conversation actor identifier or alias.|1|-| |camera|Name of camera definition to use. If not set no camera switch is used.|0..1|-| |style|Text box style to use.|0..1|empty string| |gesture|Identifier of gesture to add to play for each new speech line if not overwritten in the speech line. Gestures are played one behond the other with the last one stretched to the speech length.|0..N|-| |facePose|Identifier of face pose to use for each new speech line if not overwritten in the speech line.|0..1|empts string| |lookAt|Identifier of head/eye look-at to use for each new speech line if not overwritten in the speech line.|0..1|empty string| |delay|Delay in seconds for created action shot action.|0..1|''0.25''| |prolongLastGesture|Increase the duration of the last gesture played in a speech line by this many seconds. This makes gestures play a bit longer than the mouth animation played which is more natural.|0..1|''0''| |useSpeechAnimation|Use speech animation to animate mouth. Typically for thinking speech animation has to be disabled.|0..1|''true''| ===== snippet ===== Defines a conversation snippet. ^Attribute^Description^Occurance^Default^ |id|Name of snippet.|Required|-| ^Tag^Description^Occurance^Default^ |actor|Switch speaking actor. Adds a camera change if the actor definition contains one. Attributes: * ''id'': Name of actor definition to use. If missing this tag only starts a new speech line without changing actor nor camera. Optional. * ''mode'': Special modes to apply. Optional: * ''noCameraDelay'': Use 0 second delay for actor camera change. * ''noCameraDelayWait'': Use 0 second delay for actor camera change and no waiting. * ''noSpeakDelay'': Use 0 second delay for actor speak. * ''noDelay'': Use 0 second delay for actor camera change and speak. * ''noDelayWait'': Use 0 second delay for actor camera change and speak and no waiting. * ''noCamera'': Do not change camera. * ''noCameraNoDelay'': Do not change camera and use 0 second delay for speak. |0..N|-| |a|Short version of ''actor'' tag. Attributes: * ''i'': Same as ''id'' attribute of ''actor'' tag. Optional. * ''m'': Same as ''mode'' attribute of ''actor'' tag. Optional |0..N|-| |gesture|Add gesture to play back. Replaces gestures defined in active actor definition. Attributes: * ''id'': Identifier of regular conversation gesture to play. Optional. |0..N|-| |g|Short version of ''gesture'' tag. Attributes: * ''i'': Same as ''id'' attribute in ''gesture'' tag. Optional. |0..N|-| |facePose|Add face pose to play back. Replaces face poses defined in active actor definition. Attributes: * ''id'': Identifier of regular conversation face pose to play. Optional. * ''duration'': Duration in seconds. Optional. Default is ''0.5''. |0..N|-| |f|Short version of ''facePose'' tag. Attributes: * ''i'': Same as ''id'' attribute in ''facePose'' tag. Optional. * ''d'': Same as ''delay'' attribute in ''facePose'' tag. Optional. Default is ''0.5''. |0..N|-| |lookAt|Add head/eyes look-at to play back. Replaces look-ats defined in active actor definition. Attributes: * ''id'': Identifier of regular conversation target to look-at. Optional. * ''duration'': Duration in seconds. Optional. Default is ''0.5''. |0..N|-| |l|Short version of ''lookAt'' tag. Attributes: * ''i'': Same as ''id'' attribute in ''lookAt'' tag. Optional. * ''d'': Same as ''delay'' attribute in ''lookAt'' tag. Optional. Default is ''0.5''. |0..N|-| |tag|Define animation text to use for tag text content. Used for dynamic text special tags to get a usable mouth animation. Attributes: * ''anim'': Text to use for mouth animation only. Required. |0..N|-| |t|Short version of ''tag'' tag. Attributes: * ''a'': Same as ''anim'' attribute in ''tag'' tag. Required. |0..N|-| |command|Run game or actor command using text content of tag. Attributes: * ''actor'': If set run actor command on conversation actor with id or alias ''actor''. Otherwise run game command. Optional. |0..N|-| |stopTopic|Stop simple conversation topic. Continues conversation after the action running the simple conversation snippet.|0..N|-| |stopConversation|Stop conversation.|0..N|-| |variable|Set conversation playback variable or actor parameter to tag content text. Tag content text can be of this form: * ''+number'': Increment variable or parameter by ''number''. * ''-number'': Decrement variable or parameter by ''number''. * ''~number'': Set variable or parameter to random value in the range from ''0'' to ''number'' inclusive. * ''number'': Set variable or parameter to ''number''. Tag Attributes: * ''name'': Name of playback variable or actor parameter to set. Required. * ''actor'': If set sets parameter of conversation actor with id or alias ''actor'' ([[behavior_parametertable|ECBehaviorParameterTable]]). Otherwise sets conversation playback variable. Optional. |0..N|-| |trigger|Operate trigger. Attributes: * ''name'': Name of trigger to operate. Required. * ''action'': Action to apply to trigger. Required: * ''fire'': Fire trigger. * ''reset'': Reset trigger. * ''pulse'': Fire and immediately reset the trigger. * ''fullReset'': Fully resets the trigger. |0..N|-| |if|Begin if-else block. Block ends at the next line which is not ''elif'' or ''else''. Attributes: * ''snippet'': Name of simple conversation snippet to run if the condition is true. Snippet is added directly to current snippet. ''stopTopic'' skips out of this snippet not the referred one. If the snippet does not exist it is skipped. Optional. |0..N|-| |elif|Continue if-else block with an elif clause. Attributes: * ''snippet'': Name of simple conversation snippet to run if the condition is true. Snippet is added directly to current snippet. ''stopTopic'' skips out of this snippet not the referred one. If the snippet does not exist it is skipped. Optional. |0..N|-| |else|Continues if-else block with an else clause then closes block. Attributes: * ''snippet'': Name of simple conversation snippet to run if the previous ''if'' and ''elif'' conditions are ''false''. Snippet is added directly to current snippet. ''stopTopic'' skips out of this snippet not the referred one. If the snippet does not exist it is skipped. Optional. |0..N|-| |choice|Begins player choice block. Blocks ends at the next line which is not ''option''. Attributes: * ''variable'': Conversation playback variable to assign the index of the chosen option to. First option is index ''0''. Optional. |0..N|-| |option|Continues player choice block with the next option. Option is only added if no condition is ''false''. Attributes: * ''text'': Unicode text to display. Optional. * ''snippet'': Name of simple conversation snippet to run if option is chosen. Snippet is added directly to current snippet. ''stopTopic'' skips out of this snippet not the referred one. If the snippet does not exist it is skipped. Optional. |0..N|-| |wait|Wait until any condition becomes ''false''. Attributes: * ''snippet'': Name of simple conversation snippet to run while waiting. Snippet is added directly to current snippet. ''stopTopic'' skips out of this snippet not the referred one. If the snippet does not exist it is skipped. Optional. |0..N|-| |snippet|Run regular or simple conversation snippet. Topic or identifier is text content. For simple conversation snippet is added directly to current snippet and ''stopTopic'' skips out of this snippet not the referred one. If the snippet/topic does not exist it is skipped. Attributes: * ''group'': Run regular conversation topic from group ''group''. Otherwise runs simple conversation snippet. Optional. * ''random'': For use with simple conversation only. Select random number in the range from ''0'' to ''random-1''. Then runs snippet with this number appended to the snippet identifier. Hence if the text content is ''snippet identifier|v'' and the randomly chosen number is ''2'' then the snippet to run is ''snippet identifier|v2''. Optional. |0..N|-| |music|Switch music using name from content text.|0..N|empty string| |add|Add actor or coordinate system. Attributes: * ''actor'': Add conversation actor with id ''actor'' to conversation. Optional. * ''coordSystem'': Add conversation coordinate system with id ''coordSystem'' to conversation. Optional. * ''alias'': Alias to use for added actor/coordSystem. Optional. |0..N|-| |remove|Remove actor or coordinate system. Attributes: * ''actor'': Remove conversation actor with id or alias ''actor'' from conversation. Optional. * ''coordSystem'': Remove conversation coordinate system with id or alias ''coordSystem'' from conversation. Optional. |0..N|-| |pause|Add pause with content text as length in seconds. Effect depends on where the tag is used: * Inside speech line: Pause is applied before the next word. Typically used to prolong pauses after interpuntuations or to add artificial pauses. * At end of speech line: Pause after speech line. Useful to prelong gestures. * Before ''actor''/''a'' or other tags: Delay before running respective action If you want a pause after a speech line to not affect the speech line but the next action use ''endActorSpeak''. |0..N|-| |p|Short version of ''pause'' tag.|0..N|-| |endActorSpeak|End last actor speech line. Required to apply ''pause'' tag to the next tag instead of the speec line.|0..N|-| |music|Switch music using name from content text.|0..N|empty string| |waitMode|Switch wait mode. Affects how the next tags set waiting of generated conversation actions. Valid values: * ''wait'': Wait for all actors finish speaking and finish waitable actions. * ''waitSpeak'': Wait for all actors finish speaking. * ''waitCameraSpeak'': Same as ''wait'' but for camera switch in ''actor''/''a'' actions use ''waitSpeak''. * ''noWait'': No waiting. |0..N|-| Content text is used as actor speech lines. If actor speech line contains no words (empty line) then the line is skipped. Hence whitespaces and newlines are collapsed into a single whitespace similar to HTML. ===== variable (condition) ===== Adds a conversation playback variable or actor parameter condition to ''if'', ''elif'', ''option'' or ''wait''. ^Attribute^Description^Occurance^Default^ |name|Name of playback variable or actor parameter to evaluate.|Required|-| |actor|If set use parameter from conversation actor ''actor''. Otherwise use playback variable.|Optional|-| |test|Test to apply to value. Can be of this form: * ''<=number'': Value is less than or equal to ''number''. * ''=number'': Value is greater than or equal to ''number''. * ''>number'': Value is greater than ''number''. * ''!=number'': Value is not equal to ''number''. * ''=number'': Value is equal to ''number''. * ''number'': Value is equal to ''number''. |Required|-| ===== trigger (condition) ===== Adds a trigger condition to ''if'', ''elif'', ''option'' or ''wait''. ^Attribute^Description^Occurance^Default^ |name|Name of trigger to evaluate.|Required|-| |test|Test to apply to trigger state. Allowed values: * ''fired'': Trigger is in the fired state. * ''notFired'': Trigger is in the reset state. * ''everFired'': Trigger has been fired at least once. * ''neverFired'': Trigger has never been fired. |Required|-| ===== command (condition) ===== Adds a game or actor command condition to ''if'', ''elif'', ''option'' or ''wait''. Command to run is content text. ^Attribute^Description^Occurance^Default^ |actor|If set test condition of conversation actor ''actor''. Otherwise test game condition.|Optional|-| |test|Test to apply to result of condition. Allowed values: * ''true'': Condition evaluates to ''true''. * ''false'': Condition evaluates to ''false''. |Required|-| ===== has (condition) ===== Adds a has actor condition to ''if'', ''elif'', ''option'' or ''wait''. ^Attribute^Description^Occurance^Default^ |actor|Test if conversation actor with id or alias ''actor'' is present.|Required|-| |test|Test to apply to result of condition. Allowed values: * ''true'': Is present. * ''false'': Is not present. |Required|-| ===== all (condition) ===== Adds a logic all condition to ''if'', ''elif'', ''option'' or ''wait''. Condition evaluates to ''true'' if all child conditions evaluate to true. If no child conditions are present condition evaluates to ''false''. ===== any (condition) ===== Adds a logic any condition to ''if'', ''elif'', ''option'' or ''wait''. Condition evaluates to ''true'' if one or more child conditions evaluate to true. ===== none (condition) ===== Adds a logic none condition to ''if'', ''elif'', ''option'' or ''wait''. Condition evaluates to ''true'' if no child condition evaluate to true. ====== Examples ======