Difference between revisions of "Dialog System"
(→Attaching dialogs to npcs) |
(→Attaching dialogs to npcs) |
||
(2 intermediate revisions by the same user not shown) | |||
Line 58: | Line 58: | ||
require 'base_ai_npc' | require 'base_ai_npc' | ||
− | |||
--- opens up the npc greetings dialog menu | --- opens up the npc greetings dialog menu | ||
--@param user - (gameobject) the user interacting with this dialog | --@param user - (gameobject) the user interacting with this dialog | ||
Line 87: | Line 86: | ||
end | end | ||
</syntaxhighlight > | </syntaxhighlight > | ||
+ | |||
+ | Now we need a NPC file to test our new dialog script. copy this template file and save it as mydialognpc.xml in your mods templates directory. | ||
+ | |||
+ | mydialognpc.xml | ||
+ | <syntaxhighlight lang="Xml"> | ||
+ | <ObjectTemplate> | ||
+ | <ClientId>1</ClientId> | ||
+ | <Hue>176</Hue> | ||
+ | <Name>Billy Bob</Name> | ||
+ | <ObjectVariableComponent> | ||
+ | <StringVariable Name="MobileTeamType">Villagers</StringVariable> | ||
+ | <StringVariable Name="MobileKind">Humanoid</StringVariable> | ||
+ | <DoubleVariable Name="BaseHealth">300</DoubleVariable> | ||
+ | <DoubleVariable Name="Armor">87</DoubleVariable> | ||
+ | <DoubleVariable Name="Attack">44</DoubleVariable> | ||
+ | <BoolVariable Name="NoDisrobe">True</BoolVariable> | ||
+ | <BoolVariable Name="ImportantNPC">True</BoolVariable> | ||
+ | <BoolVariable Name="noloot">True</BoolVariable> | ||
+ | <BoolVariable Name="GuardProtect">True</BoolVariable> | ||
+ | </ObjectVariableComponent> | ||
+ | <ScriptEngineComponent> | ||
+ | <LuaModule Name="ai_mynpcdialog"> | ||
+ | <Initializer> | ||
+ | { | ||
+ | Stats = { Str=40, Agi=30, Int=21, Wis=10, Wil=10 }, | ||
+ | Skills = { Brawling=100 }, | ||
+ | EquipTable = | ||
+ | { | ||
+ | BodyPartHead = TemplateDefines.MaleHeads, | ||
+ | BodyPartHair = TemplateDefines.MaleHairVillage, | ||
+ | BodyPartFacialHair= TemplateDefines.MaleFacialHair, | ||
+ | Chest= {"merchant_clothing_chest"}, | ||
+ | Legs= {"merchant_clothing_legs"}, | ||
+ | Backpack= {"backpack",}, | ||
+ | } | ||
+ | } | ||
+ | </Initializer> | ||
+ | </LuaModule> | ||
+ | </ScriptEngineComponent> | ||
+ | <MobileComponent> | ||
+ | <BaseRunSpeed>1</BaseRunSpeed> | ||
+ | <MobileType>Friendly</MobileType> | ||
+ | </MobileComponent> | ||
+ | </ObjectTemplate> | ||
+ | </syntaxhighlight > | ||
+ | |||
+ | == Testing your new dialog and npc == | ||
+ | *Load up your standalone or cluster server | ||
+ | *when you log in to your God character type in /create mydialognpc and target the ground. | ||
+ | *when you double click the npc to interact you will see your new dialog window if everything went okay. |
Latest revision as of 20:07, 26 May 2021
Introduction
The dialog system for Legnds of Aria comes in various shapes. We have dialogs for npc conversations, progress bars and all things in between. In this section you will learn the structure and basics to creating your very own npc conversations for your players to enjoy. The general npc dialog system is a series of function calls where inside each of these functions is the information for the given dialog screen currently showing. Every page of the npc conversation has a npc dialog text area, and the player response area. The magic of the npc dialog system starts off with the NPCInteractionLongButton function lets look at the parts below.
--- opens up the npc dialog menu
--@param text - (string) a string containing the current message the npc is talking about
--@param npc - (gameobject) the npc currently interacting with the player
--@param player - (gameobject) the player currently interacting with this npc
--@param eventId - (string)a string identifying the event response of the dialog
--@param response - (table)a table containing response array table
function NPCInteractionLongButton(text,npc,player,eventId,response)
end
When you first interact with a npc or use the talk context menu, the npc ai script will fire up the Dialog.OpenGreetingsDialog function. This function lives inside the base_ai_npc.lua script file. Notice how the function is camel case OpenGreetingsDialog. The way dialogs are setup is by player response and response handles. All dialog functions must be named Open + Handle Name + Dialog, you will see why looking below at a basic greetings override.
--- opens up the npc greetings dialog menu
--@param user - (gameobject) the user interacting with this dialog
function Dialog.OpenGreetingsDialog(user)
text = "Welcome traveler to Eldier Village, how can I be of assistance?"
response = {}
response[1] = {}
response[1].text = "Can you tell me about chickens?"
response[1].handle = "AboutChickens"
NPCInteraction(text,this,user,"Responses",response)
end
The above example will load up and work, but we do not have a AboutChickens function made. As discussed earlier the function name is Open + AboutChickens + Dialog so lets make this function and populate it with a response. Also lets loop back to the greetings message after the player gets to this dialog response page.
--- opens up the npc aboutchickens dialog menu
--@param user - (gameobject) the user interacting with this dialog
function Dialog.OpenAboutChickensDialog(user)
text = "I like the taste of them hmm? They lay eggs, make clucking noises... saw one fly for darn near 13 seconds."
response = {}
response[1] = {}
response[1].text = "Golly Gee Mister"
response[1].handle = "Greetings"
NPCInteraction(text,this,user,"Responses",response)
end
Attaching dialogs to npcs
Every npc has a basic AI file. lets go ahead and create our new npc ai file. we will save this file in your mods scripts folder as ai_mynpcdialog.lua
ai_mynpcdialog.lua
-- require the dialog system and basic npc ai functions
require 'base_ai_npc'
--- opens up the npc greetings dialog menu
--@param user - (gameobject) the user interacting with this dialog
function Dialog.OpenGreetingsDialog(user)
text = "Welcome traveler to Eldier Village, how can I be of assistance?"
response = {}
response[1] = {}
response[1].text = "Can you tell me about chickens?"
response[1].handle = "AboutChickens"
NPCInteraction(text,this,user,"Responses",response)
end
--- opens up the npc aboutchickens dialog menu
--@param user - (gameobject) the user interacting with this dialog
function Dialog.OpenAboutChickensDialog(user)
text = "I like the taste of them hmm? They lay eggs, make clucking noises... saw one fly for darn near 13 seconds."
response = {}
response[1] = {}
response[1].text = "Golly Gee Mister"
response[1].handle = "Greetings"
NPCInteraction(text,this,user,"Responses",response)
end
Now we need a NPC file to test our new dialog script. copy this template file and save it as mydialognpc.xml in your mods templates directory.
mydialognpc.xml
<ObjectTemplate>
<ClientId>1</ClientId>
<Hue>176</Hue>
<Name>Billy Bob</Name>
<ObjectVariableComponent>
<StringVariable Name="MobileTeamType">Villagers</StringVariable>
<StringVariable Name="MobileKind">Humanoid</StringVariable>
<DoubleVariable Name="BaseHealth">300</DoubleVariable>
<DoubleVariable Name="Armor">87</DoubleVariable>
<DoubleVariable Name="Attack">44</DoubleVariable>
<BoolVariable Name="NoDisrobe">True</BoolVariable>
<BoolVariable Name="ImportantNPC">True</BoolVariable>
<BoolVariable Name="noloot">True</BoolVariable>
<BoolVariable Name="GuardProtect">True</BoolVariable>
</ObjectVariableComponent>
<ScriptEngineComponent>
<LuaModule Name="ai_mynpcdialog">
<Initializer>
{
Stats = { Str=40, Agi=30, Int=21, Wis=10, Wil=10 },
Skills = { Brawling=100 },
EquipTable =
{
BodyPartHead = TemplateDefines.MaleHeads,
BodyPartHair = TemplateDefines.MaleHairVillage,
BodyPartFacialHair= TemplateDefines.MaleFacialHair,
Chest= {"merchant_clothing_chest"},
Legs= {"merchant_clothing_legs"},
Backpack= {"backpack",},
}
}
</Initializer>
</LuaModule>
</ScriptEngineComponent>
<MobileComponent>
<BaseRunSpeed>1</BaseRunSpeed>
<MobileType>Friendly</MobileType>
</MobileComponent>
</ObjectTemplate>
Testing your new dialog and npc
- Load up your standalone or cluster server
- when you log in to your God character type in /create mydialognpc and target the ground.
- when you double click the npc to interact you will see your new dialog window if everything went okay.