mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-12-05 09:44:47 +00:00
2638 lines
79 KiB
Lua
2638 lines
79 KiB
Lua
|
|
|||
|
--
|
|||
|
--
|
|||
|
|
|||
|
Logic = {}
|
|||
|
|
|||
|
Logic.Activities = {"Follow Route", "Patrol", "Repeat Road", "Deploy", "Wander", "Rest In Zone", "Feed In Zone", "Hunt In Zone", "Guard Zone", "Stand Still", "Stand On Start Point", "Go To Start Point"}
|
|||
|
Logic.TimeLimits = {"No Limit", "Until", "Few Sec", "Few Min", "Chat", "Season", "Day", "Month"}
|
|||
|
Logic.Seasons = {"Spring", "Summer", "Autumn", "Winter"}
|
|||
|
Logic.Days = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
|
|||
|
Logic.Months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
|
|||
|
Logic.ScriptActions ={"Sit Down", "Stand Up", "Go To Step", "Set Activity", "Stop Actions", "Start Mission"}
|
|||
|
|
|||
|
Logic.EventModes ={"Once Only", "Repeating"}
|
|||
|
Logic.EventTypes ={"Time", "Place", "Entity or Group", "State Machine", "Counter"}
|
|||
|
Logic.ConditionTypes ={
|
|||
|
{},
|
|||
|
{"Any player in zone", "All players in zone", "No players in zone", "Some players in zone"},
|
|||
|
{"At Destination", "Enters State", "Leaves State", "Activity Is", "Die", "Is Attacked"},
|
|||
|
{},
|
|||
|
{"v0_changed", "v3_changed", "Equals", "Lesser", "Greater", ""},
|
|||
|
}
|
|||
|
|
|||
|
Logic.ChatTypes = {"None", "Repeating", "Non Repeating", "Continue"}
|
|||
|
Logic.InteractionTypes = {"Give", "Say"}
|
|||
|
|
|||
|
Logic.Name = "Activity"
|
|||
|
Logic.Description = "A feature for describing activities sequences"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Logic.Components = {}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
-- ACTION -------------------
|
|||
|
Logic.Components.LogicEntityAction =
|
|||
|
{
|
|||
|
BaseClass ="BaseClass",
|
|||
|
Name = "LogicEntityAction",
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "logicEntityActionPropertySheetDisplayer",
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name ="Name", Type ="String"},
|
|||
|
{Name ="Event", Type ="EventType"},
|
|||
|
{Name ="Actions", Type ="Table"}, -- "ActionStep" list
|
|||
|
{Name ="Conditions", Type ="Table"}, -- "ConditionStep" list
|
|||
|
},
|
|||
|
|
|||
|
getName = function(this)
|
|||
|
|
|||
|
local logicEntity = this.Parent.Parent.Parent
|
|||
|
assert(logicEntity)
|
|||
|
|
|||
|
if logicEntity:isGrouped() then
|
|||
|
logicEntity = logicEntity.ParentInstance
|
|||
|
end
|
|||
|
|
|||
|
local coloredName = (logicEntity.InstanceId == r2.events.filteredLogicEntityId)
|
|||
|
|
|||
|
local eventType = r2.events.keyWordsColor .. i18n.get("uiR2EdEventTxtPreEvent"):toUtf8() .. " "
|
|||
|
|
|||
|
if coloredName then
|
|||
|
eventType = eventType .. r2.events.filterWordColor
|
|||
|
else
|
|||
|
eventType = eventType .. r2.events.entityWordColor
|
|||
|
end
|
|||
|
local name = "No name"
|
|||
|
if logicEntity.getName then
|
|||
|
name = logicEntity:getName()
|
|||
|
elseif logicEntity.Name then
|
|||
|
name = logicEntity.Name
|
|||
|
end
|
|||
|
eventType = eventType .. name .. " "
|
|||
|
eventType = eventType .. r2.events.communWordsColor
|
|||
|
|
|||
|
eventType = eventType ..r2.getLogicAttribute(logicEntity.Class, "Events", this.Event.Type).text
|
|||
|
|
|||
|
if this.Event.Value~="" then
|
|||
|
local instance = r2:getInstanceFromId(this.Event.Value)
|
|||
|
assert(instance)
|
|||
|
|
|||
|
eventType = eventType .. " " .. instance:getShortName()
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
if this.Event.ValueString and this.Event.ValueString ~= "" then
|
|||
|
if string.gfind(eventType, "%%1")() then
|
|||
|
eventType = string.gsub(eventType, "%%1", "'"..tostring(this.Event.ValueString).."'")
|
|||
|
else
|
|||
|
eventType = eventType .. " '" .. tostring(this.Event.ValueString).. "'"
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
eventType = eventType .. ", "
|
|||
|
|
|||
|
|
|||
|
-- conditions
|
|||
|
local conditionsList = ""
|
|||
|
for i=0, this.Conditions.Size-1 do
|
|||
|
local conditionInst = this.Conditions[i]
|
|||
|
|
|||
|
if conditionInst.Entity~="" and conditionInst.Condition.Type~="" then
|
|||
|
|
|||
|
conditionsList = conditionsList .. "\n" .. r2.events.keyWordsColor
|
|||
|
..string.upper(i18n.get("uiR2EdEventTxtPreCondition"):toUtf8()).." "
|
|||
|
.. r2.events.communWordsColor
|
|||
|
|
|||
|
local conditionLogicEntity = r2:getInstanceFromId(tostring(conditionInst.Entity))
|
|||
|
assert(conditionLogicEntity)
|
|||
|
|
|||
|
coloredName = (conditionLogicEntity.InstanceId == r2.events.filteredLogicEntityId)
|
|||
|
if coloredName then
|
|||
|
conditionsList = conditionsList .. r2.events.filterWordColor
|
|||
|
else
|
|||
|
conditionsList = conditionsList .. r2.events.entityWordColor
|
|||
|
end
|
|||
|
conditionsList = conditionsList .. conditionLogicEntity.Name .. " "
|
|||
|
conditionsList = conditionsList .. r2.events.communWordsColor
|
|||
|
|
|||
|
conditionsList = conditionsList ..r2.getLogicAttribute(conditionLogicEntity.Class, "Conditions", conditionInst.Condition.Type).text
|
|||
|
|
|||
|
if conditionInst.Condition.Value~="" then
|
|||
|
local instance = r2:getInstanceFromId(conditionInst.Condition.Value)
|
|||
|
assert(instance)
|
|||
|
conditionsList = conditionsList .. " '" .. instance:getShortName() .."'"
|
|||
|
end
|
|||
|
|
|||
|
conditionsList = conditionsList .. ", "
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- actions
|
|||
|
local actionsList = ""
|
|||
|
for i=0, this.Actions.Size-1 do
|
|||
|
local actionInst = this.Actions[i]
|
|||
|
|
|||
|
if actionInst.Entity~="" and actionInst.Action.Type~="" then
|
|||
|
|
|||
|
actionsList = actionsList .. "\n" .. r2.events.keyWordsColor
|
|||
|
..string.upper(i18n.get("uiR2EdEventTxtPreActions"):toUtf8()).." "
|
|||
|
.. r2.events.communWordsColor
|
|||
|
|
|||
|
local actionLogicEntity = r2:getInstanceFromId(tostring(actionInst.Entity))
|
|||
|
assert(actionLogicEntity)
|
|||
|
|
|||
|
coloredName = (actionLogicEntity.InstanceId == r2.events.filteredLogicEntityId)
|
|||
|
if coloredName then
|
|||
|
actionsList = actionsList .. r2.events.filterWordColor
|
|||
|
else
|
|||
|
actionsList = actionsList .. r2.events.entityWordColor
|
|||
|
end
|
|||
|
local name = "No name"
|
|||
|
if actionLogicEntity.getName then
|
|||
|
name = actionLogicEntity:getName()
|
|||
|
elseif actionLogicEntity.Name then
|
|||
|
name = actionLogicEntity.Name
|
|||
|
end
|
|||
|
actionsList = actionsList .. name .. " "
|
|||
|
actionsList = actionsList .. r2.events.communWordsColor
|
|||
|
|
|||
|
actionsList = actionsList ..r2.getLogicAttribute(actionLogicEntity.Class, "ApplicableActions", actionInst.Action.Type).text
|
|||
|
if actionInst.Action.Value~="" then
|
|||
|
local instance = r2:getInstanceFromId(actionInst.Action.Value)
|
|||
|
assert(instance)
|
|||
|
actionsList = actionsList .. " '" .. instance:getShortName() .. "'"
|
|||
|
end
|
|||
|
|
|||
|
if actionInst.Action.ValueString and actionInst.Action.ValueString ~= "" then
|
|||
|
|
|||
|
if string.gfind(actionsList, "%%1")() then
|
|||
|
actionsList = string.gsub(actionsList, "%%1", "'"..tostring(actionInst.Action.ValueString).."'")
|
|||
|
else
|
|||
|
actionsList = actionsList .. " '" .. tostring(actionInst.Action.ValueString).. "'"
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if i~=this.Actions.Size-1 then
|
|||
|
actionsList = actionsList .. ","
|
|||
|
else
|
|||
|
actionsList = actionsList .. "."
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if actionsList=="" then
|
|||
|
actionsList = "\n..."
|
|||
|
end
|
|||
|
|
|||
|
return eventType .. conditionsList .. actionsList --.. "\n"
|
|||
|
end,
|
|||
|
|
|||
|
getLogicEntityParent = function(this)
|
|||
|
|
|||
|
local logicEntity = this.Parent.Parent.Parent
|
|||
|
if logicEntity:isGrouped() then logicEntity = logicEntity.Parent.Parent end
|
|||
|
|
|||
|
return logicEntity
|
|||
|
end,
|
|||
|
|
|||
|
-- The act of the event
|
|||
|
getLogicAct = function(this)
|
|||
|
|
|||
|
local currentAct = r2:getCurrentAct()
|
|||
|
local baseAct = r2.Scenario:getBaseAct()
|
|||
|
local isBaseAct = false
|
|||
|
local presentActs = {}
|
|||
|
local isCurrentAct = false
|
|||
|
local counter = 0
|
|||
|
|
|||
|
|
|||
|
local entity = this:getLogicEntityParent()
|
|||
|
if entity and entity.getParentAct then
|
|||
|
local act = entity:getParentAct()
|
|||
|
if act then
|
|||
|
if act==currentAct then
|
|||
|
isCurrentAct=true
|
|||
|
elseif act==baseAct then
|
|||
|
isBaseAct = true
|
|||
|
else
|
|||
|
presentActs[act.InstanceId] = act.InstanceId
|
|||
|
counter = counter+1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local function verifyAct ( container)
|
|||
|
|
|||
|
local key, value = next(container, nil)
|
|||
|
while key do
|
|||
|
if value.Action and value.Action.Type == "Start Act" then
|
|||
|
else
|
|||
|
local entityId = value.Entity
|
|||
|
local entity= r2:getInstanceFromId(entityId)
|
|||
|
if entity and entity.getParentAct then
|
|||
|
local act = entity:getParentAct()
|
|||
|
if act then
|
|||
|
if act==currentAct then
|
|||
|
isCurrentAct=true
|
|||
|
elseif act==baseAct then
|
|||
|
isBaseAct = true
|
|||
|
else
|
|||
|
presentActs[act.InstanceId] = act.InstanceId
|
|||
|
counter = counter+1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
key, value = next(container, key)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
verifyAct(this.Actions)
|
|||
|
verifyAct(this.Conditions)
|
|||
|
|
|||
|
if counter>=2 or (counter==1 and isCurrentAct) then
|
|||
|
return nil
|
|||
|
elseif counter==1 and not isCurrentAct and isBaseAct then
|
|||
|
local act = nil
|
|||
|
for k, actId in pairs(presentActs) do
|
|||
|
act = r2:getInstanceFromId(actId)
|
|||
|
break
|
|||
|
end
|
|||
|
--inspect(act)
|
|||
|
return act
|
|||
|
else
|
|||
|
--inspect(currentAct)
|
|||
|
return currentAct
|
|||
|
end
|
|||
|
end,
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
----------
|
|||
|
-- called upon translation
|
|||
|
getLogicActForTranslate = function(this)
|
|||
|
local currentAct = this:getLogicEntityParent():getParentAct()
|
|||
|
local baseAct = r2.Scenario:getBaseAct()
|
|||
|
|
|||
|
local entity = this.Event.Entity
|
|||
|
if entity and entity.getParentAct then
|
|||
|
local act = entity:getParentAct()
|
|||
|
if currentAct == nil then
|
|||
|
currentAct = act
|
|||
|
elseif act ~= currentAct then
|
|||
|
if currentAct == baseAct then
|
|||
|
currentAct = act
|
|||
|
elseif act == baseAct then
|
|||
|
-- do nothing
|
|||
|
else
|
|||
|
return nil
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
local function verifyAct ( container)
|
|||
|
local key, value = next(container, nil)
|
|||
|
while key do
|
|||
|
if value.Action and value.Action.Type == "Start Act" then
|
|||
|
else
|
|||
|
local entityId = value.Entity
|
|||
|
local entity= r2:getInstanceFromId(entityId)
|
|||
|
if entity and entity.getParentAct then
|
|||
|
local act = entity:getParentAct()
|
|||
|
if act then
|
|||
|
if currentAct == nil then
|
|||
|
currentAct = act
|
|||
|
elseif act ~= currentAct then
|
|||
|
if currentAct == baseAct then
|
|||
|
currentAct = act
|
|||
|
elseif act == baseAct then
|
|||
|
-- do nothing
|
|||
|
else return false
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
key, value = next(container, key)
|
|||
|
end
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
if not verifyAct(this.Actions) then return false end
|
|||
|
if not verifyAct(this.Conditions) then return false end
|
|||
|
return currentAct
|
|||
|
end,
|
|||
|
--
|
|||
|
getLogicActInstanceId = function(this)
|
|||
|
--local ok, act = pcall(Logic.Components.LogicEntityAction.getLogicAct, this)
|
|||
|
local ok, act = pcall(Logic.Components.LogicEntityAction.getLogicActForTranslate, this)
|
|||
|
if not ok or not act then
|
|||
|
return r2.RefId("")
|
|||
|
end
|
|||
|
|
|||
|
return act.InstanceId
|
|||
|
end,
|
|||
|
}
|
|||
|
|
|||
|
Logic.Components.EventType =
|
|||
|
{
|
|||
|
BaseClass ="BaseClass",
|
|||
|
Name = "EventType",
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "eventTypePropertySheetDisplayer",
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name ="Type", Type ="String"},
|
|||
|
{Name ="Value", Type ="RefId"}, -- if type is end of activity/chat step/sequence, instance id
|
|||
|
{Name ="ValueString", Type ="String", DefaultValue="", DefaultInBase=1}, -- if type is emit user event, sub timer...
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
local classActionStepVersion = 2
|
|||
|
Logic.Components.ActionStep = {
|
|||
|
BaseClass ="BaseClass",
|
|||
|
Name = "ActionStep",
|
|||
|
Version = classActionStepVersion,
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "actionStepPropertySheetDisplayer",
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name ="Entity", Type ="RefId"}, -- entity target id
|
|||
|
{Name ="Action", Type ="ActionType"} -- sequence id
|
|||
|
},
|
|||
|
|
|||
|
updateVersion = function(this, scenarioValue, currentValue )
|
|||
|
|
|||
|
local patchValue = scenarioValue
|
|||
|
if patchValue < 1 then
|
|||
|
local invalidActions = {}
|
|||
|
invalidActions["desactivate"] = "deactivate"
|
|||
|
invalidActions["Desactivate"] = "deactivate"
|
|||
|
r2.updateLogicActions(this, invalidActions, "BanditCamp")
|
|||
|
patchValue = 1
|
|||
|
end
|
|||
|
|
|||
|
if patchValue < 2 then
|
|||
|
|
|||
|
local action = this.Action
|
|||
|
if action.Type == "Add 10 Seconds" then
|
|||
|
r2.requestSetNode(action.InstanceId, "Type", "add seconds")
|
|||
|
r2.requestInsertNode(action.InstanceId, "", -1, "ValueString", "10")
|
|||
|
end
|
|||
|
|
|||
|
if action.Type == "Sub 10 seconds" then
|
|||
|
r2.requestSetNode(action.InstanceId, "Type", "sub seconds")
|
|||
|
r2.requestInsertNode(action.InstanceId, "", -1, "ValueString", "10")
|
|||
|
end
|
|||
|
if action.Type == "Add 1 minute" then
|
|||
|
r2.requestSetNode(action.InstanceId, "Type", "add seconds")
|
|||
|
r2.requestInsertNode(action.InstanceId, "", -1, "ValueString", "60")
|
|||
|
end
|
|||
|
|
|||
|
if action.Type == "Sub 1 minute" then
|
|||
|
r2.requestSetNode(action.InstanceId, "Type", "sub seconds")
|
|||
|
r2.requestInsertNode(action.InstanceId, "", -1, "ValueString", "60")
|
|||
|
end
|
|||
|
|
|||
|
patchValue = 2
|
|||
|
end
|
|||
|
|
|||
|
if patchValue == currentValue then return true end
|
|||
|
return false
|
|||
|
end,
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Logic.Components.ActionType =
|
|||
|
{
|
|||
|
BaseClass ="BaseClass",
|
|||
|
Name = "ActionType",
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "actionTypePropertySheetDisplayer",
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name ="Type", Type ="String"},
|
|||
|
{Name ="Value", Type ="RefId"}, -- if type is begin of activity/chat sequence, instance id
|
|||
|
{Name ="ValueString", Type ="String", DefaultValue="", DefaultInBase=1}, -- if type is emit user event, sub timer...
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Logic.Components.ConditionStep =
|
|||
|
{
|
|||
|
BaseClass ="BaseClass",
|
|||
|
Name = "ConditionStep",
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "conditionStepPropertySheetDisplayer",
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name ="Entity", Type ="RefId"}, -- entity id
|
|||
|
{Name ="Condition", Type ="ConditionType"}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Logic.Components.ConditionType =
|
|||
|
{
|
|||
|
BaseClass ="BaseClass",
|
|||
|
Name = "ConditionType",
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "conditionTypePropertySheetDisplayer",
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name ="Type", Type ="String"},
|
|||
|
{Name ="Value", Type ="RefId"}, -- if type is being in activity/chat step/sequence, instance id
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
-- REACTION -----------------
|
|||
|
|
|||
|
Logic.Components.LogicEntityReaction =
|
|||
|
{
|
|||
|
BaseClass ="BaseClass",
|
|||
|
Name = "LogicEntityReaction",
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "logicEntityReactionPropertySheetDisplayer",
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name ="Name", Type ="String"},
|
|||
|
{Name ="LogicEntityAction", Type ="String"}, -- id of associated LogicEntityAction
|
|||
|
{Name ="ActionStep", Type ="String"}, -- id of associated ActionStep
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Logic.Components.ChatAction=
|
|||
|
{
|
|||
|
BaseClass ="BaseClass",
|
|||
|
Name ="ChatAction",
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "chatActionPropertySheetDisplayer",
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name ="Who", Type ="RefId"},
|
|||
|
{Name ="WhoNoEntity", Type ="String"},
|
|||
|
{Name ="Says", Type ="String"},
|
|||
|
{Name ="Emote", Type ="String"},
|
|||
|
{Name ="Facing", Type ="RefId"},
|
|||
|
-- {Name ="FacingNoEntity", Type ="String"},
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Logic.Components.ChatStep = {
|
|||
|
BaseClass ="BaseClass",
|
|||
|
Name = "ChatStep",
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "chatStepPropertySheetDisplayer",
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name ="Actions", Type ="Table"},
|
|||
|
{Name ="Time", Type ="Number" },
|
|||
|
{Name ="Name", Type ="String" }
|
|||
|
},
|
|||
|
|
|||
|
getName = function(this)
|
|||
|
|
|||
|
-- after time
|
|||
|
local minNb, secNb = r2.dialogs:calculMinSec(this.Time)
|
|||
|
local time = ""
|
|||
|
if minNb ~= 0 then
|
|||
|
time = tostring(minNb)..i18n.get("uiR2EdShortMinutes"):toUtf8()
|
|||
|
end
|
|||
|
time = time.." " ..tostring(secNb)..i18n.get("uiR2EdShortSeconds"):toUtf8()
|
|||
|
local afterTime = "(" ..i18n.get("uiR2EdAfter"):toUtf8().." ".. time..") "
|
|||
|
|
|||
|
-- says
|
|||
|
local whoToWho = ""
|
|||
|
local action = this.Actions[0]
|
|||
|
local who = action.Who
|
|||
|
if who=="" then who=action.WhoNoEntity end
|
|||
|
if who and who ~= "" then
|
|||
|
|
|||
|
if r2:getInstanceFromId(who) then
|
|||
|
who=r2:getInstanceFromId(who).Name
|
|||
|
else
|
|||
|
who = r2.dialogs.whoToWhoTranslation[who]
|
|||
|
end
|
|||
|
|
|||
|
whoToWho = who .. " "
|
|||
|
|
|||
|
local facing = action.Facing
|
|||
|
if facing~="" then
|
|||
|
whoToWho = whoToWho ..i18n.get("uiR2EdSaysTo"):toUtf8().. " " .. r2:getInstanceFromId(facing).Name .. " "
|
|||
|
end
|
|||
|
|
|||
|
local emote = action.Emote
|
|||
|
if emote~="" and r2.dialogs.fromEmoteIdToName[emote] ~= nil then
|
|||
|
whoToWho = whoToWho .."(" .. r2.dialogs.fromEmoteIdToName[emote] .. ") :"
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return afterTime..whoToWho
|
|||
|
|
|||
|
end,
|
|||
|
|
|||
|
getShortName = function(this)
|
|||
|
|
|||
|
-- says
|
|||
|
local saysWhat = ""
|
|||
|
local action = this.Actions[0]
|
|||
|
local who = action.Who
|
|||
|
if who ~= "" or WhoNoEntity~="" then
|
|||
|
who = r2:getInstanceFromId(who)
|
|||
|
if who then
|
|||
|
saysWhat = who.Name
|
|||
|
elseif action.WhoNoEntity=="_System" then
|
|||
|
saysWhat = i18n.get("uiR2EdSystem"):toUtf8()
|
|||
|
elseif action.WhoNoEntity=="_DM" then
|
|||
|
saysWhat = i18n.get("uiR2EdDonjonMaster"):toUtf8()
|
|||
|
end
|
|||
|
|
|||
|
saysWhat = saysWhat .. " " ..i18n.get("uiR2EdSays"):toUtf8().. " "
|
|||
|
|
|||
|
local says = action.Says
|
|||
|
if says ~= "" then
|
|||
|
local inst=r2:getInstanceFromId(says)
|
|||
|
if inst then
|
|||
|
says = inst.Text
|
|||
|
local uc_says = ucstring()
|
|||
|
uc_says:fromUtf8(says)
|
|||
|
uc_says = uc_says:substr(0, 4)
|
|||
|
says = uc_says:toUtf8()
|
|||
|
end
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
saysWhat = saysWhat .. says .. "..."
|
|||
|
end
|
|||
|
|
|||
|
return saysWhat
|
|||
|
|
|||
|
end,
|
|||
|
|
|||
|
--------------------------------------------------------------------------------------------
|
|||
|
-- from 'BaseClass'
|
|||
|
getParentTreeNode = function(this)
|
|||
|
end,
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
local classChatSequenceVersion = 1
|
|||
|
Logic.Components.ChatSequence = {
|
|||
|
PropertySheetHeader = r2.getDisplayButtonHeader("r2.dialogs:openEditor()", "uiR2EdEditDialogButton"),
|
|||
|
BaseClass = "LogicEntity",
|
|||
|
Name = "ChatSequence",
|
|||
|
InEventUI = true,
|
|||
|
Menu="ui:interface:r2ed_feature_menu",
|
|||
|
Version = classChatSequenceVersion,
|
|||
|
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "chatSequencePropertySheetDisplayer",
|
|||
|
|
|||
|
DisplayerUI = "R2::CDisplayerLua",
|
|||
|
DisplayerUIParams = "defaultUIDisplayer",
|
|||
|
DisplayerVisual = "R2::CDisplayerVisualEntity",
|
|||
|
|
|||
|
Parameters = {},
|
|||
|
ApplicableActions = {
|
|||
|
"activate", "deactivate", "starts dialog", "stops dialog", "starts chat" , "continues dialog"
|
|||
|
},
|
|||
|
Events = {
|
|||
|
"start of dialog", "end of dialog" ,
|
|||
|
"start of chat", "end of chat",
|
|||
|
"activation", "deactivation"
|
|||
|
},
|
|||
|
Conditions = {
|
|||
|
"is not in dialog", "is in dialog", "is in chat"
|
|||
|
},
|
|||
|
TextContexts = {},
|
|||
|
TextParameters = {},
|
|||
|
LiveParameters = {},
|
|||
|
|
|||
|
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name = "Type", Type="String",DefaultValue = "None", Visible=false},
|
|||
|
{Name ="Repeating", Type="Number" ,DefaultValue = "0", Visible=false},
|
|||
|
{Name="Components",Type="Table"},
|
|||
|
{Name="SubComponents", Type="Table"},
|
|||
|
{Name="Name", Type="String", MaxNumChar="32"},
|
|||
|
{Name="AutoStart", Type="Number", WidgetStyle="Boolean", DefaultValue="1", Visible=function(this) return this:mustDisplayAutostart() end},
|
|||
|
{Name="Active", Type="Number", WidgetStyle="Boolean", DefaultValue = "1"},
|
|||
|
},
|
|||
|
|
|||
|
|
|||
|
mustDisplayAutostart = function(this)
|
|||
|
if this.Class == "ProximityDialog" then
|
|||
|
return false
|
|||
|
end
|
|||
|
return true
|
|||
|
end,
|
|||
|
|
|||
|
-- it's a feature
|
|||
|
getParentTreeNode = function(this)
|
|||
|
return this:getFeatureParentTreeNode()
|
|||
|
end,
|
|||
|
|
|||
|
onPostCreate = function(this)
|
|||
|
--this:createGhostComponents()
|
|||
|
if this.User.DisplayProp and this.User.DisplayProp == 1 then
|
|||
|
r2:setSelectedInstanceId(this.InstanceId)
|
|||
|
r2:showProperties(this)
|
|||
|
this.User.DisplayProp = nil
|
|||
|
end
|
|||
|
|
|||
|
end,
|
|||
|
|
|||
|
create = function()
|
|||
|
|
|||
|
--if r2:getLeftQuota() <= 0 then -- ??
|
|||
|
-- r2:makeRoomMsg()
|
|||
|
-- return
|
|||
|
--end
|
|||
|
|
|||
|
local function posOk(x, y, z)
|
|||
|
if r2.mustDisplayInfo("ChatSequence") == 1 then
|
|||
|
r2.displayFeatureHelp("ChatSequence")
|
|||
|
end
|
|||
|
debugInfo(string.format("Validate creation of 'Dialog' at pos (%d, %d, %d)", x, y, z))
|
|||
|
r2.dialogs:newSequenceInst(x, y, z)
|
|||
|
end
|
|||
|
local function posCancel()
|
|||
|
debugInfo("Cancel choice 'Dialog' position")
|
|||
|
end
|
|||
|
|
|||
|
local creature = r2.Translator.getDebugCreature("object_component_dialog.creature")
|
|||
|
r2:choosePos(creature, posOk, posCancel, "createDialog")
|
|||
|
end,
|
|||
|
|
|||
|
---- get Name ------
|
|||
|
getName = function(this)
|
|||
|
|
|||
|
local name = this.Name
|
|||
|
if name == "" then
|
|||
|
|
|||
|
local index = r2.logicComponents:searchElementIndex(this)
|
|||
|
if index >= 0 then
|
|||
|
name = i18n.get("uiR2EDDialog"):toUtf8() .. index
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return name
|
|||
|
end,
|
|||
|
|
|||
|
---- get Name ------
|
|||
|
getShortName = function(this)
|
|||
|
|
|||
|
return this:getName()
|
|||
|
end,
|
|||
|
|
|||
|
---------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
editDialogs = function(this)
|
|||
|
r2.dialogs:openEditor()
|
|||
|
end,
|
|||
|
|
|||
|
getAvailableCommands = function(this, dest)
|
|||
|
r2.Classes.LogicEntity.getAvailableCommands(this, dest)
|
|||
|
table.insert(dest, this:buildCommand(this.editDialogs, "edit_dialogs", "uiR2EDEditDialogs", "r2ed_edit_dialog.tga", true))
|
|||
|
this:getAvailableDisplayModeCommands(dest)
|
|||
|
end,
|
|||
|
|
|||
|
initEventValuesMenu = function(this, menu, categoryEvent)
|
|||
|
for ev=0,menu:getNumLine()-1 do
|
|||
|
|
|||
|
local eventType = tostring(menu:getLineId(ev))
|
|||
|
|
|||
|
if r2.events.eventTypeWithValue[eventType] == "Number" then
|
|||
|
menu:addSubMenu(ev)
|
|||
|
local subMenu = menu:getSubMenu(ev)
|
|||
|
local func = ""
|
|||
|
for i=0, 9 do
|
|||
|
local uc_name = ucstring()
|
|||
|
uc_name:fromUtf8( tostring(i) )
|
|||
|
func = "r2.events:setEventValue('','" .. categoryEvent .."','".. tostring(i).."')"
|
|||
|
subMenu:addLine(uc_name, "lua", func, tostring(i))
|
|||
|
end
|
|||
|
|
|||
|
elseif r2.events.eventTypeWithValue[eventType]=="ChatStep" then
|
|||
|
|
|||
|
menu:addSubMenu(ev)
|
|||
|
local subMenu = menu:getSubMenu(ev)
|
|||
|
|
|||
|
for c=0, this.Components.Size-1 do
|
|||
|
local chat = this.Components[c]
|
|||
|
local uc_name = ucstring()
|
|||
|
uc_name:fromUtf8(chat:getShortName())
|
|||
|
subMenu:addLine(uc_name, "lua",
|
|||
|
"r2.events:setEventValue('".. chat.InstanceId .."','" .. categoryEvent .. "')", chat.InstanceId)
|
|||
|
end
|
|||
|
|
|||
|
if this.Components.Size==0 then
|
|||
|
subMenu:addLine(i18n.get("uiR2EdNoSelelection"), "", "", "")
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end,
|
|||
|
|
|||
|
getLogicAction = function(this, context, action)
|
|||
|
return r2.Translator.getDialogLogicAction(this, context, action)
|
|||
|
end,
|
|||
|
getLogicEvent = function(this, context, event)
|
|||
|
return r2.Translator.getDialogLogicEvent(this, context, event)
|
|||
|
end,
|
|||
|
getLogicCondition = function(this, context, condition)
|
|||
|
return r2.Translator.getDialogLogicCondition(this, context, condition)
|
|||
|
end,
|
|||
|
|
|||
|
pretranslate = function(this, context)
|
|||
|
r2.Translator.createAiGroup(this, context)
|
|||
|
end,
|
|||
|
|
|||
|
translate = function(this, context)
|
|||
|
r2.Translator.translateFeatureActivation(this, context)
|
|||
|
r2.Translator.translateDialog( this, context)
|
|||
|
end,
|
|||
|
|
|||
|
updateVersion = function(this, scenarioValue, currentValue )
|
|||
|
local patchValue = scenarioValue
|
|||
|
if patchValue < 1 then
|
|||
|
local subComponents = {}
|
|||
|
r2.requestInsertNode(this.InstanceId, "", -1, "SubComponents", subComponents)
|
|||
|
r2.requestInsertNode(this.InstanceId, "", -1, "AutoStart", this.Active)
|
|||
|
r2.requestSetNode(this.InstanceId, "Active", 1)
|
|||
|
r2.requestSetNode(this.InstanceId, "Base", r2.Translator.getDebugBase("palette.entities.botobjects.dialog"))
|
|||
|
patchValue = 1
|
|||
|
end
|
|||
|
|
|||
|
if patchValue == currentValue then return true end
|
|||
|
return false
|
|||
|
end,
|
|||
|
|
|||
|
initLogicEntitiesInstancesMenu = function(this, subMenu, calledFunction)
|
|||
|
|
|||
|
local entitiesTable = r2.Scenario:getAllInstancesByType(this.Name)
|
|||
|
for key, entity in pairs(entitiesTable) do
|
|||
|
local uc_name = ucstring()
|
|||
|
uc_name:fromUtf8(entity.Name)
|
|||
|
subMenu:addLine(uc_name, "lua", calledFunction.."('".. entity.InstanceId .."')", entity.InstanceId)
|
|||
|
end
|
|||
|
|
|||
|
if table.getn(entitiesTable)==0 then
|
|||
|
subMenu:addLine(i18n.get("uiR2EdNoSelelection"), "", "", "")
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
local ActivityStepVersion = 1
|
|||
|
Logic.Components.ActivityStep = {
|
|||
|
BaseClass ="BaseClass",
|
|||
|
Name ="ActivityStep",
|
|||
|
Version = ActivityStepVersion,
|
|||
|
BuildPropertySheet = true,
|
|||
|
Menu ="ui:interface:r2ed_feature_menu",
|
|||
|
|
|||
|
BuildPropertySheet = false,
|
|||
|
DisplayerVisualParams =
|
|||
|
{
|
|||
|
Look = r2.PrimRender.GroupLook,
|
|||
|
ArrayName = "Components"
|
|||
|
},
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "activityStepPropertySheetDisplayer",
|
|||
|
|
|||
|
Prop =
|
|||
|
{
|
|||
|
{Name="Activity", Type="String"},
|
|||
|
{Name="ActivityZoneId",Type="RefId",Category="ActivityStep"},
|
|||
|
{Name="TimeLimit",Type="String",Category="ActivityStep"},
|
|||
|
{Name="TimeLimitValue", Type="String",Category="ActivityStep",Category="ActivityStep"},
|
|||
|
{Name="RoadCountLimit", Type="String",Category="ActivityStep",Category="ActivityStep", DefaultInBase = 1, DefaultValue = "0"},
|
|||
|
{Name="Chat",Type="RefId"},
|
|||
|
{Name = "Type", Type="String",DefaultValue = "None"}, --TEMP TEMP TEMP
|
|||
|
{Name="EventsIds",Type="Table"},
|
|||
|
{Name="Name", Type="String", MaxNumChar="32"}
|
|||
|
},
|
|||
|
-- get sequencable parent for this activity step
|
|||
|
getSequencableParent = function(this)
|
|||
|
local currParent = this.Parent
|
|||
|
while currParent do
|
|||
|
if currParent.InstanceId and currParent:isSequencable() then
|
|||
|
return currParent
|
|||
|
end
|
|||
|
currParent = currParent.Parent
|
|||
|
end
|
|||
|
return nil
|
|||
|
end,
|
|||
|
getVerbLookupString = function(this)
|
|||
|
local seqParent = this:getSequencableParent()
|
|||
|
if seqParent then
|
|||
|
return seqParent:getActivityVerbLookupName(this.Activity)
|
|||
|
else
|
|||
|
return this.Activity
|
|||
|
end
|
|||
|
end,
|
|||
|
-- do lookup from the verb lookup string used to know the display name, and button texture
|
|||
|
doLookupFromVerb = function(this, lookupTable)
|
|||
|
local lookupString = this:getVerbLookupString()
|
|||
|
-- activity type
|
|||
|
local value = lookupTable[lookupString]
|
|||
|
if not value then
|
|||
|
debugInfo(colorTag(255,0,0).."The activity '".. lookupString .."' is not properly registred")
|
|||
|
return nil
|
|||
|
end
|
|||
|
return value
|
|||
|
end,
|
|||
|
-- get texture for the button displayed in the mini activity view
|
|||
|
getMiniButtonTexture = function(this)
|
|||
|
local result = this:doLookupFromVerb(r2.miniActivities.activityTextures)
|
|||
|
if result then return result end
|
|||
|
return "brick_default.tga"
|
|||
|
end,
|
|||
|
-- get the verb for this activity (rest, feed, patrol etc...)
|
|||
|
getVerb = function(this)
|
|||
|
local result = this:doLookupFromVerb(r2.activities.activityTypeTranslation)
|
|||
|
if result then result = result.trans end
|
|||
|
if result then return result end
|
|||
|
return ucstring("Activity not registered : " .. lookupString)
|
|||
|
end,
|
|||
|
-- element name
|
|||
|
getName = function(this)
|
|||
|
local activityType = this:getVerb() .. " "
|
|||
|
if this.ActivityZoneId~= "" then
|
|||
|
local place = r2:getInstanceFromId(tostring(this.ActivityZoneId))
|
|||
|
if place~=nil then
|
|||
|
activityType = activityType.. place.Name .." "
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- activity time
|
|||
|
local activityTime = ""
|
|||
|
if this.TimeLimit == "Few Sec" then
|
|||
|
|
|||
|
local hourNb, minNb, secNb = r2.logicComponents:calculHourMinSec(tonumber(this.TimeLimitValue))
|
|||
|
|
|||
|
local timeLimitText = i18n.get("uiR2EdFor"):toUtf8() .. " "
|
|||
|
if hourNb ~= 0 then timeLimitText = timeLimitText .. hourNb .. i18n.get("uiR2EdShortHours"):toUtf8() .. " " end
|
|||
|
if minNb ~= 0 then timeLimitText = timeLimitText .. minNb .. i18n.get("uiR2EdShortMinutes"):toUtf8() .. " " end
|
|||
|
timeLimitText = timeLimitText .. secNb .. i18n.get("uiR2EdShortSeconds"):toUtf8()
|
|||
|
|
|||
|
activityTime = timeLimitText
|
|||
|
|
|||
|
elseif r2.activities.timeLimitsTranslation[this.TimeLimit] ~= nil then
|
|||
|
activityTime = string.lower(r2.activities.timeLimitsTranslation[this.TimeLimit])
|
|||
|
end
|
|||
|
|
|||
|
return activityType..activityTime
|
|||
|
end,
|
|||
|
|
|||
|
-- element name
|
|||
|
getShortName = function(this)
|
|||
|
|
|||
|
-- activity type
|
|||
|
local activityType = this:getVerb()
|
|||
|
if this.ActivityZoneId~= "" then
|
|||
|
local place = r2:getInstanceFromId(tostring(this.ActivityZoneId))
|
|||
|
if place~=nil then
|
|||
|
activityType = activityType.. " " .. place.Name
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return activityType
|
|||
|
end,
|
|||
|
|
|||
|
updateVersion = function(this, scenarioValue, currentValue )
|
|||
|
local patchValue = scenarioValue
|
|||
|
|
|||
|
if patchValue < 1 then
|
|||
|
local activity = this.Activity
|
|||
|
if (activity and activity == "Inactive") then
|
|||
|
r2.requestSetNode(this.InstanceId, "Activity", "Stand Still")
|
|||
|
end
|
|||
|
local name = this.Name
|
|||
|
|
|||
|
patchValue = 1
|
|||
|
end
|
|||
|
if patchValue == currentValue then return true end
|
|||
|
return false
|
|||
|
end
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Logic.Components.ActivitySequence = {
|
|||
|
BaseClass="BaseClass",
|
|||
|
Name="ActivitySequence",
|
|||
|
BuildPropertySheet = true,
|
|||
|
Menu ="ui:interface:r2ed_feature_menu",
|
|||
|
|
|||
|
--DisplayerUI = "R2::CDisplayerLua",
|
|||
|
--DisplayerUIParams = "defaultUIDisplayer",
|
|||
|
BuildPropertySheet = false,
|
|||
|
DisplayerVisual = "R2::CDisplayerVisualActivitySequence",
|
|||
|
DisplayerProperties = "R2::CDisplayerLua",
|
|||
|
DisplayerPropertiesParams = "activitySequencePropertySheetDisplayer",
|
|||
|
|
|||
|
Prop =
|
|||
|
{
|
|||
|
--{Name ="InstanceId", Type ="String"},
|
|||
|
{Name ="Repeating", Type ="Number" , DefaultValue = "1"},
|
|||
|
{Name ="Components", Type ="Table"},
|
|||
|
{Name ="Name", Type ="String"}
|
|||
|
},
|
|||
|
|
|||
|
---- get Name ------
|
|||
|
getName = function(this)
|
|||
|
|
|||
|
local name = this.Name
|
|||
|
if name == "" then
|
|||
|
|
|||
|
local index = r2.logicComponents:searchElementIndex(this)
|
|||
|
|
|||
|
if index >= 0 then
|
|||
|
name = i18n.get("uiR2EdSeq"):toUtf8() .. index
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return name
|
|||
|
end,
|
|||
|
|
|||
|
---- get Name ------
|
|||
|
getShortName = function(this)
|
|||
|
|
|||
|
return this:getName()
|
|||
|
end,
|
|||
|
|
|||
|
-- get ActiveLogicEntity parent
|
|||
|
getActiveLogicEntityParent = function(this)
|
|||
|
|
|||
|
-- ActiveLogicEntity.Behavior.Activities
|
|||
|
local activeLogicEntity = this.Parent.Parent.Parent
|
|||
|
|
|||
|
-- NpcGrpFeature.Components
|
|||
|
--if activeLogicEntity:isGrouped() then activeLogicEntity = activeLogicEntity.Parent.Parent end
|
|||
|
|
|||
|
return activeLogicEntity
|
|||
|
end,
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--this function must be called when we delete a ChatAction,
|
|||
|
--to unregister the text
|
|||
|
onDeleteChatAction = function(chatAction)
|
|||
|
if chatAction.User.DeleteInProgress == true then return end
|
|||
|
chatAction.User.DeleteInProgress = true
|
|||
|
if chatAction.Says ~= nil and chatAction.Says ~= ""
|
|||
|
then
|
|||
|
|
|||
|
debugInfo("onDeleteChatAction")
|
|||
|
r2.unregisterTextFromId(chatAction.Says)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--counts the states created, to ensure states names uniqueness
|
|||
|
|
|||
|
--timer used to time the sequences steps
|
|||
|
Logic.activityStepTimer = "t0"
|
|||
|
Logic.activityStepTimerId = 0
|
|||
|
--timer used to time the chat steps
|
|||
|
Logic.chatTimer = "t1"
|
|||
|
Logic.chatTimerId = 1
|
|||
|
--timer used inside activities
|
|||
|
Logic.activityInternalTimer = "t2"
|
|||
|
Logic.activityInternalTimerId = 2
|
|||
|
|
|||
|
--variable used to know which action of the current chat sequence
|
|||
|
--must be played
|
|||
|
Logic.chatStepVar = "v1"
|
|||
|
--variable used to know which chat sequence is currently played
|
|||
|
Logic.chatSequenceVar = "v0"
|
|||
|
--variable used to know which activity sequence is currently played
|
|||
|
Logic.activityStepVar = "v2"
|
|||
|
--variable used to know which interrupt action must be executed
|
|||
|
Logic.triggerEventVar = "v3"
|
|||
|
|
|||
|
Logic.EndOfActivitySequenceEvent = 9
|
|||
|
Logic.EndOfChatSequenceEvent = 8
|
|||
|
|
|||
|
--switch_action which hold all chat sequences
|
|||
|
Logic.DialogAction = nil
|
|||
|
--switch action holding chat sequences transitions
|
|||
|
Logic.DialogAction2 = nil
|
|||
|
|
|||
|
--switch_action which hold all sequence steps
|
|||
|
Logic.SequenceAction = nil
|
|||
|
Logic.ActionStepCounter =0
|
|||
|
Logic.ChatSequenceCounter = 0
|
|||
|
--used to know the names of all the states generated
|
|||
|
--to translate this activity
|
|||
|
Logic.StatesByName = ""
|
|||
|
|
|||
|
--timer_triggered event, triggered
|
|||
|
--each time we must enter a new chat step
|
|||
|
Logic.DialogEvent = nil
|
|||
|
|
|||
|
Logic.DialogEvent2 = nil
|
|||
|
|
|||
|
--timer_triggered event, triggered
|
|||
|
--each time we must enter a new sequence step
|
|||
|
Logic.SequenceEvent = nil
|
|||
|
|
|||
|
--hold the states used in the current activity.
|
|||
|
--all the states are created at the start of the translation,
|
|||
|
--before translating the events and actions.
|
|||
|
Logic.States = {}
|
|||
|
|
|||
|
--hold the states used in all the activities
|
|||
|
--of the group
|
|||
|
Logic.ActivitiesStates ={}
|
|||
|
|
|||
|
--the activity which is currently being translated.
|
|||
|
Logic.CurrentActivity = nil
|
|||
|
|
|||
|
----------------------------------------------------
|
|||
|
--to be called once for each sequence of each group
|
|||
|
--complete the AiActivity field of the first state of this sequence
|
|||
|
--and create the actions to go to the first step
|
|||
|
Logic.initGroupActivitiesTranslation = function(context, hlComponent, sequence, first, activityIndex, aiActivity, rtGrp)
|
|||
|
assert(context and hlComponent and sequence and activityIndex and aiActivity and rtGrp)
|
|||
|
--get the states of this activity
|
|||
|
|
|||
|
local activityStates = Logic.ActivitiesStates[ tostring(sequence.InstanceId) ]
|
|||
|
assert(sequence.Class == "ActivitySequence")
|
|||
|
if not activityStates then
|
|||
|
|
|||
|
if hlComponent then
|
|||
|
printWarning("Error while translating '" .. hlComponent.Name .. "' activities in sequence " .. sequence.Name)
|
|||
|
-- pretranslate sequence.InstanceId errors instanceId not added in currentAct.ActivitiesId ?
|
|||
|
return nil
|
|||
|
end
|
|||
|
end
|
|||
|
--get the initial state of this activity
|
|||
|
local aiState = activityStates[sequence.InstanceId][1]
|
|||
|
Logic.StatesByName = ""
|
|||
|
for k, v in pairs(activityStates)
|
|||
|
do
|
|||
|
if v.Class ~= "RtAiState"
|
|||
|
then
|
|||
|
local k1, v1 = next( v, nil)
|
|||
|
while k1 do
|
|||
|
Logic.StatesByName = r2.Utils.concat(Logic.StatesByName, v1.Name)
|
|||
|
k1, v1 = next(v, k1)
|
|||
|
end
|
|||
|
else
|
|||
|
Logic.StatesByName = r2.Utils.concat(Logic.StatesByName, v.Name)
|
|||
|
end
|
|||
|
end
|
|||
|
aiState.AiActivity = aiActivity
|
|||
|
assert(aiState.AiActivity)
|
|||
|
local event = r2.Translator.createEvent("start_of_state", aiState.Name, rtGrp.Name)
|
|||
|
-- local event = r2.Translator.createEvent("group_spawned", aiState.Name, rtGrp.Name)
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
if first == true
|
|||
|
then
|
|||
|
table.insert(aiState.Children, rtGrp.Id)
|
|||
|
end
|
|||
|
|
|||
|
local speed = ""
|
|||
|
|
|||
|
if hlComponent.Speed and hlComponent.Speed == "run" then speed = "()addProfileParameter(\"running\");\n" end
|
|||
|
|
|||
|
local code = "currentActivitySequenceVar = " .. tostring(activityIndex -1 ) ..";\n"
|
|||
|
.. "oldActivitySequenceVar = currentActivitySequenceVar;\n"
|
|||
|
.. "RoadCountLimit=0;\n"
|
|||
|
.. "oldActivityStepVar = -1;\n"
|
|||
|
.. "oldActivityStepVar2 = 0;\n"
|
|||
|
.. Logic.activityStepVar .." = 0;\n"
|
|||
|
.. speed
|
|||
|
.."alive = 0;\n"
|
|||
|
.."(alive)isAlived();\n"
|
|||
|
.. "if (alive == 1)\n{\n"
|
|||
|
.. "\t()setTimer(30, " .. Logic.activityStepTimerId .. ");\n"
|
|||
|
.. "\tinit = 1;\n"
|
|||
|
.. "}\n"
|
|||
|
|
|||
|
|
|||
|
-- Fauna activities
|
|||
|
|
|||
|
|
|||
|
local action = r2.Translator.createAction("code", code)
|
|||
|
action.Name = "startActivitySequence"
|
|||
|
|
|||
|
table.insert(context.RtAct.Actions, action)
|
|||
|
table.insert(event.ActionsId, action.Id)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
do
|
|||
|
local event = r2.Translator.createEvent("group_spawned", aiState.Name, rtGrp.Name)
|
|||
|
local action = r2.Translator.createAction("code", "if (init != 1)\n{\n\t()setTimer(30, " .. Logic.activityStepTimerId .. ");\n}\n")
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
table.insert(context.RtAct.Actions, action)
|
|||
|
table.insert(event.ActionsId, action.Id)
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local leader = hlComponent
|
|||
|
|
|||
|
if hlComponent:isKindOf("NpcGrpFeature") then
|
|||
|
if hlComponent.Components.Size ~= 0 then
|
|||
|
leader = hlComponent.Components[0]
|
|||
|
else
|
|||
|
leader = nil
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--insert an activity step at the specified position
|
|||
|
Logic.insertActivityStep = function(sequence, step, pos)
|
|||
|
local n = table.getn(sequence.Components)
|
|||
|
if n < pos
|
|||
|
then
|
|||
|
table.insert(sequence.Components, step)
|
|||
|
else
|
|||
|
table.insert(sequence.Components, pos, step)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--insert a chat step at the specified position
|
|||
|
Logic.insertChatStep = function(chatSequence, chatStep, pos)
|
|||
|
local n = table.getn(chatSequence.Components)
|
|||
|
if n < pos
|
|||
|
then
|
|||
|
table.insert(chatSequence.Components, chatStep)
|
|||
|
else
|
|||
|
table.insert(chatSequence.Components, pos)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
Logic.createInteraction = function(action, parameter)
|
|||
|
local index = Logic.find(Logic.InteractionTypes, action)
|
|||
|
local interaction
|
|||
|
|
|||
|
if index == nil or parameter == nil
|
|||
|
then
|
|||
|
-- debugInfo(colorTag(255,0,0).."unknown interaction : " .. action .." !")
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
interaction = r2.newComponent("Interaction")
|
|||
|
interaction.Type = action
|
|||
|
interaction.Parameter = parameter
|
|||
|
return interaction
|
|||
|
end
|
|||
|
|
|||
|
Logic.createActivityStep = function(activity, timeLimit, zoneId, time)
|
|||
|
local activityStep = nil
|
|||
|
|
|||
|
if activity == nil or timeLimit == nil
|
|||
|
then
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
--checking activity type and time limit type
|
|||
|
if Logic.find(Logic.Activities, activity)~= nil and Logic.find(Logic.TimeLimits, timeLimit)~= nil
|
|||
|
then
|
|||
|
--checking activity parameter
|
|||
|
if ( (activity ~= "Stand Still") and (activity ~= "Inactive") and (zoneId == nil) )
|
|||
|
then
|
|||
|
--this activity need a zone, and no zone id is given
|
|||
|
-- debugInfo(colorTag(255,0,0).."activity <" .. activity .."> need a zone id!")
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
--checking time parameter
|
|||
|
--if time parameter needed, check its presence
|
|||
|
if timeLimit~="No Limit" and timeLimit~="Chat" and time == nil
|
|||
|
then
|
|||
|
--this activity needs a time limit and no limit is given
|
|||
|
-- debugInfo(colorTag(255,0,0).."Time limit <" .. timeLimit .."> need a time limit parameter!")
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
--check season validity
|
|||
|
if (timeLimit == "Season") and (Logic.find(Logic.Seasons, time) == nil)
|
|||
|
then
|
|||
|
-- debugInfo(colorTag(255,0,0).."Unknown season: " .. time)
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
--check day validity
|
|||
|
if (timeLimit == "Day") and (Logic.find(Logic.Days, time) == nil)
|
|||
|
then
|
|||
|
debugInfo(colorTag(255,0,0).."Uknown week day: " .. time)
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
if (timeLimit == "Month") and (Logic.find(Logic.Months, time)== nil)
|
|||
|
then
|
|||
|
-- debugInfo(colorTag(255,0,0,0).."Uknown month: " .. time)
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
activityStep = r2.newComponent("ActivityStep")
|
|||
|
activityStep.Activity = activity
|
|||
|
activityStep.TimeLimit = timeLimit
|
|||
|
activityStep.ActivityZoneId = zoneId
|
|||
|
activityStep.TimeLimitValue = time
|
|||
|
else
|
|||
|
-- debugInfo(colorTag(255,0,0).."Unknown activity !")
|
|||
|
end
|
|||
|
return activityStep
|
|||
|
end
|
|||
|
|
|||
|
Logic.createState = function()
|
|||
|
local aiState = r2.newComponent("RtAiState")
|
|||
|
aiState.Name = aiState.Id
|
|||
|
Logic.StatesByName = Logic.StatesByName .."\n" .. aiState.Name
|
|||
|
return aiState
|
|||
|
end
|
|||
|
|
|||
|
--create the AiStates necessay to translate this step
|
|||
|
Logic.createStepStates = function(step, context)
|
|||
|
local states = {}
|
|||
|
local state = Logic.createState()
|
|||
|
table.insert(states, state)
|
|||
|
table.insert(context.RtAct.AiStates, state)
|
|||
|
if step.Activity == "Patrol"
|
|||
|
then
|
|||
|
local state = Logic.createState()
|
|||
|
table.insert(states, state)
|
|||
|
table.insert(context.RtAct.AiStates, state)
|
|||
|
end
|
|||
|
return states
|
|||
|
end
|
|||
|
|
|||
|
--assign a zone or a road to an AiState
|
|||
|
--if invert is true, invert the road
|
|||
|
Logic.assignZone = function(rtAiState, zone, invert)
|
|||
|
assert( zone and type(zone) == "userdata")
|
|||
|
local points = zone.Points
|
|||
|
assert( points ~= nil)
|
|||
|
|
|||
|
local size = points.Size + 1
|
|||
|
rtAiState.Pts = {}
|
|||
|
local i =0
|
|||
|
local j
|
|||
|
|
|||
|
local k, v = next(points, nil)
|
|||
|
while k ~= nil
|
|||
|
do
|
|||
|
assert(v ~= nil)
|
|||
|
i = i +1
|
|||
|
if invert == true
|
|||
|
then
|
|||
|
j = size - i
|
|||
|
else
|
|||
|
j = i
|
|||
|
end
|
|||
|
rtAiState.Pts[j]={}
|
|||
|
rtAiState.Pts[j].x = r2.getWorldPos(v).x
|
|||
|
rtAiState.Pts[j].y = r2.getWorldPos(v).y
|
|||
|
rtAiState.Pts[j].z = r2.getWorldPos(v).z
|
|||
|
k, v = next(points, k)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--create all the states used in this activity Sequence
|
|||
|
Logic.createActivityStates = function(context, sequence)
|
|||
|
assert( sequence ~= nil)
|
|||
|
|
|||
|
local activityStates ={}
|
|||
|
--activity's initial stat, aiStopStatee
|
|||
|
|
|||
|
-- init state
|
|||
|
local aiStartState = r2.newComponent("RtAiState")
|
|||
|
aiStartState.Name = aiStartState.Id
|
|||
|
Logic.StatesByName = aiStartState.Name
|
|||
|
aiStartState.AiMovement = "idle" -- "stand_on_start_point"
|
|||
|
table.insert(context.RtAct.AiStates, aiStartState)
|
|||
|
|
|||
|
|
|||
|
-- end state
|
|||
|
local aiStopState = r2.newComponent("RtAiState")
|
|||
|
aiStopState.Name = aiStopState.Id
|
|||
|
--Logic.StatesByName = aiStopState.Name
|
|||
|
aiStopState.AiMovement = "idle" -- "stand_on_start_point"
|
|||
|
table.insert(context.RtAct.AiStates, aiStopState)
|
|||
|
|
|||
|
activityStates[sequence.InstanceId]= { aiStartState, aiStopState}
|
|||
|
|
|||
|
|
|||
|
if (sequence.Components == nil) then assert(nil) end
|
|||
|
--creation of the states of the step
|
|||
|
local k, v = next(sequence.Components, nil)
|
|||
|
while k do
|
|||
|
local states = Logic.createStepStates(v, context)
|
|||
|
activityStates[v.InstanceId]= states
|
|||
|
k, v = next(sequence.Components, k)
|
|||
|
end
|
|||
|
Logic.ActivitiesStates[sequence.InstanceId] = activityStates
|
|||
|
end
|
|||
|
|
|||
|
Logic.translateActivitySequence = function(context, hlComponent, activitySequence, sequenceId, rtNpcGrp)
|
|||
|
assert(rtNpcGrp ~= nil)
|
|||
|
if context.Real == false
|
|||
|
then
|
|||
|
return
|
|||
|
end
|
|||
|
Logic.ActionStepCounter = 0
|
|||
|
Logic.ChatSequenceCounter = 0
|
|||
|
--Logic.States = {}
|
|||
|
Logic.CurrentActivity = activitySequence
|
|||
|
local ok = false
|
|||
|
|
|||
|
local nbSteps = activitySequence.Components.Size
|
|||
|
local aiState
|
|||
|
local action
|
|||
|
local event
|
|||
|
local sequence = activitySequence
|
|||
|
|
|||
|
|
|||
|
if sequence.Components.Size ==0
|
|||
|
then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
Logic.initSequence(context, rtNpcGrp)
|
|||
|
if Logic.ActivitiesStates[sequence.InstanceId] then
|
|||
|
Logic.States = Logic.ActivitiesStates[sequence.InstanceId]
|
|||
|
else
|
|||
|
Logic.States = ""
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
local i =1
|
|||
|
local k, activityStep = next(sequence.Components, nil)
|
|||
|
while k do
|
|||
|
--translate step
|
|||
|
Logic.translateActivityStep(context, hlComponent, activitySequence, activityStep, i, rtNpcGrp)
|
|||
|
i = i + 1
|
|||
|
k, activityStep = next(sequence.Components, k)
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
--create actions to repeat the sequence
|
|||
|
if sequence.Repeating == 1
|
|||
|
then
|
|||
|
|
|||
|
local code =
|
|||
|
"//sequence will repeat"..
|
|||
|
"oldChatSequenceVar = " .. Logic.chatSequenceVar .. ";\n" ..
|
|||
|
"RoadCountLimit=0;\n" ..
|
|||
|
"oldActivityStepVar = " .. Logic.activityStepVar .. ";\n" ..
|
|||
|
"oldActivityStepVar2 = " .. Logic.activityStepVar .. " + 1" .. ";\n" ..
|
|||
|
"v2=0;\n" ..
|
|||
|
"()setTimer(1, " ..Logic.activityStepTimerId .. ");\n"
|
|||
|
-- .. "()setEvent(" .. Logic.EndOfActivitySequenceEvent ..");\n"
|
|||
|
|
|||
|
local action = r2.Translator.createAction("code", code)
|
|||
|
action.Name = "repeat_sequence"
|
|||
|
table.insert(Logic.SequenceAction.Children, action)
|
|||
|
|
|||
|
else
|
|||
|
|
|||
|
local backupState =
|
|||
|
"//sequence will not repeat"..
|
|||
|
"oldChatSequenceVar = " .. Logic.chatSequenceVar .. ";\n" ..
|
|||
|
"RoadCountLimit=0;\n"..
|
|||
|
"oldActivityStepVar = " .. Logic.activityStepVar .. ";\n" ..
|
|||
|
"oldActivityStepVar2 = " .. Logic.activityStepVar .. " + 1" .. ";\n"
|
|||
|
|
|||
|
local stateName = Logic.ActivitiesStates[sequence.InstanceId][sequence.InstanceId][2].Id
|
|||
|
|
|||
|
local setNextActivityState = "()postNextState(\"" .. r2.getNamespace() .. stateName .."\");\n"
|
|||
|
|
|||
|
local action = r2.Translator.createAction("code", backupState
|
|||
|
-- .."()setEvent(" .. Logic.EndOfActivitySequenceEvent ..");\n"
|
|||
|
..setNextActivityState)
|
|||
|
|
|||
|
|
|||
|
action.Name = "end_of_activity_sequence"
|
|||
|
table.insert(Logic.SequenceAction.Children, action)
|
|||
|
end
|
|||
|
|
|||
|
Logic.SequenceEvent.StatesByName = Logic.StatesByName
|
|||
|
Logic.DialogEvent = nil
|
|||
|
Logic.SequenceEvent = nil
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Logic._obsolete_TranslateScriptAction = function(context, step, nextTime)
|
|||
|
local actionType = Logic.getAction(step)
|
|||
|
assert(actionType~= nil)
|
|||
|
-- debugInfo(colorTag(0,255,0).. actionType)
|
|||
|
|
|||
|
if actionType == "stop_actions"
|
|||
|
then
|
|||
|
local action = r2.Translator.createAction("set_timer_" ..Logic.chatTimer, "0")
|
|||
|
return action
|
|||
|
end
|
|||
|
|
|||
|
if actionType == "start_mission"
|
|||
|
then
|
|||
|
local counterMission = context.Components[step.Parameter]
|
|||
|
local action = r2.Translator.createAction("trigger_event_1", context.RtCounters[counterMission.InstanceId].RtGroup.Name)
|
|||
|
-- debugInfo("action created!!")
|
|||
|
return action
|
|||
|
end
|
|||
|
|
|||
|
if 0==1 and actionType == "go_to_step"
|
|||
|
then
|
|||
|
--TODO
|
|||
|
local param = tonumber(step.Parameter)
|
|||
|
debugInfo("param = " .. param)
|
|||
|
if (param < 1) or (Logic.CurrentActivity.Components[param]== nil)
|
|||
|
then
|
|||
|
-- debugInfo(colorTag(255,0,0).."Impossible to go to step " .. param .." !")
|
|||
|
return nil
|
|||
|
end
|
|||
|
debugInfo(context.Feature.Class)
|
|||
|
return Logic.selectActivityStep(param)
|
|||
|
end
|
|||
|
|
|||
|
if actionType == "set_activity"
|
|||
|
then
|
|||
|
local group = nil
|
|||
|
local param
|
|||
|
local rtGroup
|
|||
|
if step.Who ~= "" and step.Who ~= nil
|
|||
|
then
|
|||
|
group = step.Who
|
|||
|
rtGroup = r2.Translator.getRtGroup(context, group)
|
|||
|
end
|
|||
|
|
|||
|
param = tonumber(step.Parameter)
|
|||
|
|
|||
|
-- debugInfo("param = " .. param)
|
|||
|
|
|||
|
local action
|
|||
|
if group ~= nil
|
|||
|
then
|
|||
|
action = r2.Translator.createAction("begin_state", Logic.getActivityInitialStateName(group, param, context))
|
|||
|
assert(action ~= nil)
|
|||
|
local index = Logic.addTriggeredAction(context, context.RtGroups[group].Name, action)
|
|||
|
action = r2.Translator.createAction("modify_variable", rtGroup.Name ..":" ..Logic.triggerEventVar .." = " .. index)
|
|||
|
action.Name ="set_activity"
|
|||
|
else
|
|||
|
action = r2.Translator.createAction("begin_state", Logic.getActivityInitialStateName(context.Group.Name, param, context))
|
|||
|
assert(action ~= nil)
|
|||
|
end
|
|||
|
return action
|
|||
|
end
|
|||
|
|
|||
|
local action = r2.Translator.createAction(actionType)
|
|||
|
assert(action ~= nil)
|
|||
|
return action
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Logic.translateChatAction = function(context, chatSequenceNumber, chatStepNumber, chatSequence, chatStep, chatAction, rtMAction)
|
|||
|
local getRtId = r2.Features["TextManager"].getRtId
|
|||
|
if chatAction.Class == "ChatAction"
|
|||
|
then
|
|||
|
local who = r2.Utils.getNpcParam( tostring( chatAction.Who), context)
|
|||
|
-- create say action
|
|||
|
if not who then
|
|||
|
|
|||
|
local whoInstance = r2:getInstanceFromId( tostring(chatAction.Who) )
|
|||
|
local chatSequenceInstance = r2:getInstanceFromId(chatSequence.InstanceId)
|
|||
|
|
|||
|
local whoName = ""
|
|||
|
if whoInstance then whoName = "(" .. whoInstance.Name ..")" end
|
|||
|
|
|||
|
if false then
|
|||
|
printWarning( "Error in ChatStep '" .. chatStep:getName()
|
|||
|
.. "' of the ChatSequence '" .. chatSequence:getName() .. "'"
|
|||
|
.. " the field Who '" .. chatAction.Who .."' is invalid " )
|
|||
|
end
|
|||
|
|
|||
|
return nil
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
if chatAction.Says ~= "" and chatAction.Says ~= nil
|
|||
|
then
|
|||
|
local param = getRtId(context, tostring(chatAction.Says))
|
|||
|
if param then
|
|||
|
action = r2.Translator.createAction("npc_say", param, who);
|
|||
|
|
|||
|
-- action = r2.newComponent("RtNpcEventHandlerAction")
|
|||
|
-- action.Action = "npc_say"
|
|||
|
|
|||
|
-- action.Parameters = who .."\n" .. param
|
|||
|
table.insert(rtMAction.Children, action)
|
|||
|
else
|
|||
|
debugInfo(colorTag(255,255,0).."WRN: Text " .. chatAction.Says .. " error")
|
|||
|
end
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
-- create emot action
|
|||
|
if tostring(chatAction.Emote) ~= "" and chatAction.Emote ~= nil
|
|||
|
then
|
|||
|
action = r2.newComponent("RtNpcEventHandlerAction")
|
|||
|
action.Action = "emot"
|
|||
|
action.Parameters = tostring(chatAction.Emote).."\n" .. who
|
|||
|
table.insert(rtMAction.Children, action)
|
|||
|
end
|
|||
|
|
|||
|
-- create facing action
|
|||
|
if tostring(chatAction.Facing) ~= "" and chatAction.Facing ~= nil
|
|||
|
then
|
|||
|
local facing = r2.Utils.getNpcParam(tostring(chatAction.Facing), context)
|
|||
|
if facing then
|
|||
|
action = r2.newComponent("RtNpcEventHandlerAction")
|
|||
|
action.Action = "facing"
|
|||
|
action.Parameters = facing .."\n" .. who
|
|||
|
table.insert(rtMAction.Children, action)
|
|||
|
else
|
|||
|
printWarning("Can not find npc")
|
|||
|
end
|
|||
|
end
|
|||
|
else
|
|||
|
printWarning( chatAction.Class .. " not implemented yet")
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
Logic.translateChatStep = function(context, chatSequenceNumber, chatSequence, chatStepNumber, chatStep, rtActionSwitchChatStep)
|
|||
|
|
|||
|
assert(chatStep)
|
|||
|
assert(chatStep.Class == "ChatStep")
|
|||
|
|
|||
|
if chatStep.Actions.Size > 0 then
|
|||
|
|
|||
|
local rtMAction = r2.Translator.createAction("multi_actions")
|
|||
|
table.insert(rtActionSwitchChatStep.Children, rtMAction)
|
|||
|
|
|||
|
local k, chatAction = next(chatStep.Actions, nil)
|
|||
|
while k do
|
|||
|
Logic.translateChatAction(context, chatSequenceNumber, chatStepNumber, chatSequence, chatStep, chatAction, rtMAction)
|
|||
|
|
|||
|
local oldChatAction = chatAction
|
|||
|
-- next wait
|
|||
|
do
|
|||
|
|
|||
|
if (chatStepNumber < chatSequence.Components.Size and chatSequence.Components[chatStepNumber ]) then
|
|||
|
|
|||
|
local action = r2.Translator.createAction("code",
|
|||
|
"oldChatStepVar = " .. tostring(chatStepNumber)..";\n" ..
|
|||
|
Logic.chatStepVar .." = " .. tostring(chatStepNumber+1)..";\n" ..
|
|||
|
"()setTimer(" .. tostring(1+chatSequence.Components[chatStepNumber].Time*10) .. ", " .. Logic.chatTimerId .. ");\n");
|
|||
|
action.Name = "next"
|
|||
|
table.insert(rtMAction.Children, action)
|
|||
|
|
|||
|
else
|
|||
|
local action = r2.Translator.createAction("code",
|
|||
|
"oldChatStepVar = " .. tostring(chatStepNumber)..";\n" ..
|
|||
|
Logic.chatStepVar .." = " .. tostring(chatStepNumber+1)..";\n" ..
|
|||
|
"()setEvent(" ..Logic.EndOfChatSequenceEvent ..");\n" ..
|
|||
|
"if (repeatSequence == 1)\n{\n " .. Logic.chatSequenceVar .."=" ..Logic.chatSequenceVar ..";\n" ..
|
|||
|
"}\n")
|
|||
|
|
|||
|
action.Name = "end_of_chat_sequence"
|
|||
|
table.insert(rtMAction.Children, action)
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
k, chatAction = next(chatStep.Actions, k)
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
else
|
|||
|
local action = r2.Translator.createAction("null_action")
|
|||
|
action.Name = "empty_chat_step_" .. chatStepNumber
|
|||
|
table.insert(rtActionSwitchChatStep.Children, action)
|
|||
|
end
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
Logic.translateChatSequence = function (context, chatSequenceNumber, chatSequence, rtSwitchChatSequence)
|
|||
|
assert(chatSequence)
|
|||
|
assert(chatSequence.Class == "ChatSequence")
|
|||
|
if chatSequence.Components.Size > 0 then
|
|||
|
|
|||
|
local rtActionSwitchChatStep = r2.Translator.createAction("switch_actions", Logic.chatStepVar)
|
|||
|
rtActionSwitchChatStep.Name = "switch_chat_step"
|
|||
|
table.insert(rtSwitchChatSequence.Children, rtActionSwitchChatStep)
|
|||
|
|
|||
|
local chatStepNumber = 0
|
|||
|
|
|||
|
-- initial wait
|
|||
|
do
|
|||
|
local action = r2.Translator.createAction("code", "oldChatStepVar = 0;\n"
|
|||
|
.. Logic.chatStepVar .." = 1;\n()setTimer(" .. tostring( tonumber(chatSequence.Components[0].Time)*10 + 1) .. ", " .. Logic.chatTimerId ..");\n");
|
|||
|
action.Name = "initial_wait"
|
|||
|
table.insert(rtActionSwitchChatStep.Children, action)
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local k, chatStep = next(chatSequence.Components, nil)
|
|||
|
while k do
|
|||
|
chatStepNumber = chatStepNumber + 1
|
|||
|
Logic.translateChatStep(context, chatSequenceNumber, chatSequence, chatStepNumber, chatStep, rtActionSwitchChatStep)
|
|||
|
k, chatStep = next(chatSequence.Components, k)
|
|||
|
end
|
|||
|
else
|
|||
|
local action = r2.Translator.createAction("null_action")
|
|||
|
action.Name = "empty_chat_sequence_" .. chatSequenceNumber
|
|||
|
table.insert(rtSwitchChatSequence.Children, action)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
Logic.translateChatSequences = function (context, hlComponent, behavior, rtNpcGrp)
|
|||
|
assert(behavior.ChatSequences)
|
|||
|
if behavior.ChatSequences.Size > 0 then
|
|||
|
assert(rtNpcGrp)
|
|||
|
|
|||
|
do
|
|||
|
local event = r2.Translator.createEvent("variable_" ..Logic.chatSequenceVar .."_changed", "", rtNpcGrp.Name)
|
|||
|
event.Name = "activity_sequence_changed"
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
|
|||
|
local rtInitChatStep = r2.Translator.createAction("code", "oldChatStepVar = -1;\n" .. Logic.chatStepVar .." = 0;\n()setTimer(1, " ..Logic.chatTimerId .. ")\;\n")
|
|||
|
rtInitChatStep.Name = "init_chat_step"
|
|||
|
table.insert(context.RtAct.Actions, rtInitChatStep)
|
|||
|
table.insert(event.ActionsId, rtInitChatStep.Id)
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local event = r2.Translator.createEvent("timer_" ..Logic.chatTimer .."_triggered", "", rtNpcGrp.Name)
|
|||
|
event.Name = "dialog_event"
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
|
|||
|
local rtSwitchChatSequence = r2.Translator.createAction("switch_actions", Logic.chatSequenceVar)
|
|||
|
rtSwitchChatSequence.Name = "switch_chat_sequence"
|
|||
|
table.insert(context.RtAct.Actions, rtSwitchChatSequence)
|
|||
|
table.insert(event.ActionsId, rtSwitchChatSequence.Id)
|
|||
|
|
|||
|
local chatSequenceNumber = 0
|
|||
|
local k, chatSequence = next(behavior.ChatSequences, nil)
|
|||
|
while k do
|
|||
|
context.Feature = nil
|
|||
|
chatSequenceNumber = chatSequenceNumber + 1
|
|||
|
Logic.translateChatSequence(context, chatSequenceNumber, chatSequence, rtSwitchChatSequence)
|
|||
|
k, chatSequence = next(behavior.ChatSequences, k)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
function Logic.isWanderActivity(activity)
|
|||
|
return activity == "Wander" or activity == "Go To Zone" or activity == "Rest In Zone" or activity == "Feed In Zone"
|
|||
|
or activity == "Hunt In Zone" or activity == "Guard Zone"
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
-------------------------------------------------
|
|||
|
--create a transition to go to step number stepNb
|
|||
|
--set a timer to go to next step
|
|||
|
--select the step
|
|||
|
--goto the step's state
|
|||
|
Logic.createTransition = function(context, hlComponent, activitySequence, activityStep, activityStepIndex, stepAction)
|
|||
|
local findChatSequenceIdByInstanceId = function (chat)
|
|||
|
|
|||
|
local parent = chat.ParentInstance.ChatSequences
|
|||
|
assert(parent)
|
|||
|
|
|||
|
|
|||
|
local nbSequence = 0
|
|||
|
local k, sequence = next(parent, nil)
|
|||
|
while k do
|
|||
|
if tostring(sequence.InstanceId) == tostring(chat.InstanceId) then return nbSequence end
|
|||
|
nbSequence = nbSequence + 1
|
|||
|
k, sequence = next(parent, k)
|
|||
|
end
|
|||
|
return -1
|
|||
|
end
|
|||
|
|
|||
|
assert(activityStep)
|
|||
|
|
|||
|
local chat = nil
|
|||
|
|
|||
|
|
|||
|
if activityStep.Chat ~= "" then
|
|||
|
chat = r2:getInstanceFromId( tostring(activityStep.Chat) )
|
|||
|
end
|
|||
|
|
|||
|
local code = ""
|
|||
|
|
|||
|
|
|||
|
local backupState = ""
|
|||
|
local setChatSequence = ""
|
|||
|
local setNextActivity = ""
|
|||
|
local setNextActivityTimer = ""
|
|||
|
local setNextActivityState = ""
|
|||
|
|
|||
|
|
|||
|
backupState =
|
|||
|
"oldChatSequenceVar = " .. Logic.chatSequenceVar .. ";\n" ..
|
|||
|
"RoadCountLimit=0;\n"..
|
|||
|
"oldActivityStepVar = " .. Logic.activityStepVar .. ";\n" ..
|
|||
|
"oldActivityStepVar2 = " .. Logic.activityStepVar.. " + 1;\n"
|
|||
|
|
|||
|
|
|||
|
if chat~= nil then
|
|||
|
local id = findChatSequenceIdByInstanceId( chat )
|
|||
|
assert(id ~= -1 )
|
|||
|
setChatSequence = Logic.chatSequenceVar .. " = " .. tostring( id ) .. ";\n"
|
|||
|
if (activityStep.Type == "Repeating") then
|
|||
|
setChatSequence = setChatSequence .. "repeatSequence = 1;\n"
|
|||
|
else
|
|||
|
setChatSequence = setChatSequence .. "repeatSequence = 0;\n"
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- next activity
|
|||
|
setNextActivity = Logic.activityStepVar .. " = " .. activityStepIndex ..";\n"
|
|||
|
|
|||
|
-- next activity timer
|
|||
|
local param = Logic.getTimeLimit(activityStep)
|
|||
|
if param ~= nil then
|
|||
|
if Logic.isWanderActivity(activityStep.Activity) then
|
|||
|
-- The time limite is use by the activity
|
|||
|
else
|
|||
|
setNextActivityTimer = "()setTimer(" .. param ..", " ..Logic.activityStepTimerId .. ");\n"
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local states = Logic.States[activityStep.InstanceId]
|
|||
|
local stateName = states[1].Name
|
|||
|
|
|||
|
-- next activity state
|
|||
|
|
|||
|
setNextActivityState = "()postNextState(\"" .. r2.getNamespace() .. stateName .."\");\n"
|
|||
|
local action = r2.Translator.createAction("code", backupState .. setChatSequence .. setNextActivity .. setNextActivityTimer .. setNextActivityState)
|
|||
|
|
|||
|
|
|||
|
action.Name = "process_activity_step" .. activityStepIndex
|
|||
|
|
|||
|
if stepAction then
|
|||
|
local tmpAction = r2.Translator.createAction("multi_actions")
|
|||
|
table.insert(tmpAction.Children, action)
|
|||
|
table.insert(tmpAction.Children, stepAction)
|
|||
|
action = tmpAction
|
|||
|
end
|
|||
|
|
|||
|
action.Name = "process_activity_step" .. activityStepIndex
|
|||
|
return action
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
------------------------------------------
|
|||
|
--cr<63>e une action qui permet de
|
|||
|
--s<>lectionner une s<>quence de chat
|
|||
|
Logic.selectDialog = function(dialogNb, rtNpcGrp)
|
|||
|
local action
|
|||
|
local prefix = ""
|
|||
|
if (rtNpcGrp ~= nil) then
|
|||
|
prefix = r2.getNamespace() .. rtNpcGrp .. "."
|
|||
|
end
|
|||
|
|
|||
|
action = r2.Translator.createAction("code",
|
|||
|
prefix .."oldChatSequenceVar =" .. prefix..Logic.chatSequenceVar ..";\n" ..
|
|||
|
prefix .. Logic.chatSequenceVar .." = " ..(dialogNb-1)..";\n")
|
|||
|
action.Name = "select_dialog"
|
|||
|
return action
|
|||
|
end
|
|||
|
|
|||
|
--create the actions and events necessary to choose
|
|||
|
--the dialog while running sequence
|
|||
|
Logic.initDialog = function(context)
|
|||
|
local event = r2.Translator.createEvent("variable_" ..Logic.chatSequenceVar .."_changed", "all_sequence_states", context.Group.Name)
|
|||
|
event.Name = "change_dialog_event"
|
|||
|
Logic.DialogEvent2 = event
|
|||
|
local action
|
|||
|
local mAction = r2.Translator.createAction("multi_actions")
|
|||
|
action = r2.Translator.createAction("code", "oldChatStepVar = " .. Logic.chatStepVar ..";\n" .. Logic.chatStepVar .." = 0;\n")
|
|||
|
action.Name = "reset_dialog"
|
|||
|
table.insert(mAction.Children, action)
|
|||
|
action = r2.Translator.createAction("switch_actions", Logic.chatSequenceVar)
|
|||
|
action.Name = "init_dialog_timer"
|
|||
|
table.insert(mAction.Children, action)
|
|||
|
Logic.DialogAction2 = action
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
table.insert(context.RtAct.Actions, mAction)
|
|||
|
table.insert(event.ActionsId, mAction.Id)
|
|||
|
|
|||
|
|
|||
|
event = r2.Translator.createEvent("timer_" ..Logic.chatTimer .."_triggered", "all_sequence_states", context.Group.Name)
|
|||
|
event.Name = "dialog_event"
|
|||
|
Logic.DialogEvent = event
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
|
|||
|
Logic.DialogAction = r2.Translator.createAction("switch_actions", Logic.chatSequenceVar)
|
|||
|
table.insert(context.RtAct.Actions, Logic.DialogAction)
|
|||
|
table.insert(event.ActionsId, Logic.DialogAction.Id)
|
|||
|
end
|
|||
|
|
|||
|
Logic.initSequence = function(context, rtNpcGrp)
|
|||
|
assert(context)
|
|||
|
assert(rtNpcGrp)
|
|||
|
|
|||
|
event = r2.Translator.createEvent("timer_" ..Logic.activityStepTimer .."_triggered", "all_sequence_states", rtNpcGrp.Name)
|
|||
|
event.Name = "sequence_event"
|
|||
|
Logic.SequenceEvent = event
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
|
|||
|
Logic.SequenceAction = r2.Translator.createAction("switch_actions", Logic.activityStepVar)
|
|||
|
table.insert(context.RtAct.Actions, Logic.SequenceAction)
|
|||
|
table.insert(event.ActionsId, Logic.SequenceAction.Id)
|
|||
|
end
|
|||
|
|
|||
|
-- ust to implement translateEvents used to implement event created for implementing
|
|||
|
Logic.translateEvent = function( context, hlComponent, activitySequence, activityStep, activityStepIndex, event, rtNpcGrp, statesByName)
|
|||
|
local chat = nil
|
|||
|
-- context, groups, states, actionToAdd)
|
|||
|
local eventType, eventParam = Logic.getEvent(event)
|
|||
|
local eventHandler = nil
|
|||
|
|
|||
|
if context.Events[event.InstanceId] == nil
|
|||
|
then
|
|||
|
eventHandler = r2.Translator.createEvent(eventType, states, groups)
|
|||
|
assert(eventHandler ~= nil)
|
|||
|
|
|||
|
local stepAction = Logic.translateChatStep(context, event.Action, nil)
|
|||
|
|
|||
|
if actionToAdd ~= nil
|
|||
|
then
|
|||
|
table.insert(stepAction.Children, actionToAdd)
|
|||
|
end
|
|||
|
|
|||
|
assert(stepAction ~= nil)
|
|||
|
|
|||
|
table.insert(context.RtAct.Actions, stepAction)
|
|||
|
table.insert(eventHandler.ActionsId, stepAction.Id)
|
|||
|
context.Events[event.InstanceId] = eventHandler
|
|||
|
else
|
|||
|
eventHandler = context.Events[event.InstanceId]
|
|||
|
|
|||
|
if string.find(eventHandler.StatesByName, states) == nil
|
|||
|
then
|
|||
|
eventHandler.StatesByName = eventHandler.StatesByName .. "\n" .. states
|
|||
|
end
|
|||
|
|
|||
|
if string.find(eventHandler.GroupsByName, groups) == nil
|
|||
|
then
|
|||
|
eventHandler.GroupsByName = eventHandler.GroupsByName .. "\n" .. groups
|
|||
|
end
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
return eventHandler
|
|||
|
end
|
|||
|
|
|||
|
-- translateEvents
|
|||
|
Logic.translateEvents = function(context, hlComponent, activitySequence, activityStep, activityStepIndex, rtNpcGrp, statesByName)
|
|||
|
|
|||
|
local activityStep
|
|||
|
|
|||
|
local last = nil
|
|||
|
|
|||
|
if activityStepIndex == activitySequence.Components.Size then
|
|||
|
last = true
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local k, eventId = next(step.EventsIds, nil)
|
|||
|
do
|
|||
|
local eventHandler = r2:getInstanceFromId(eventId)
|
|||
|
assert(eventHandler ~= nil)
|
|||
|
local action = nil
|
|||
|
|
|||
|
if eventHandler.Condition.Type == "At Destination" then
|
|||
|
if step.Activity == "Follow Route" and last ~= true then
|
|||
|
action = Logic.selectActivityStep(activityStepIndex + 1)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--the event returned here is a RtNpcEventHandler
|
|||
|
event = translateEvent(context, groups, states, action)
|
|||
|
assert(event ~= nil)
|
|||
|
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
k, eventId = next(step.EventsIds, k)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--translate an activity step
|
|||
|
Logic.translateActivityStep = function(context, hlComponent, activitySequence, activityStep, activityStepIndex, rtNpcGrp)
|
|||
|
|
|||
|
--translate this activity activityStep's events
|
|||
|
assert(rtNpcGrp)
|
|||
|
local aiState
|
|||
|
local aiState2
|
|||
|
local statesByName
|
|||
|
local groupsByName = rtNpcGrp.Name
|
|||
|
local zone = nil
|
|||
|
local chat = nil
|
|||
|
local aiScriptDebug = false
|
|||
|
|
|||
|
local activityStep = activityStep
|
|||
|
|
|||
|
if activityStep.Chat ~= "" then
|
|||
|
chat = r2:getInstanceFromId(activityStep.Chat)
|
|||
|
if not chat then
|
|||
|
printErr("translation error: in the activitySequence " .. activitySequence.Name .. " in component " .. hlComponent.Name .. ": " .. " the chat sequence associated to this activity sequence can not be found")
|
|||
|
return nil
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local states = Logic.States[activityStep.InstanceId]
|
|||
|
--states creation
|
|||
|
aiState = states[1] -- 1 is first ( a lua object not a instance )
|
|||
|
|
|||
|
--setting state AiMovement
|
|||
|
aiState.AiMovement = Logic.getAiMovement(activityStep.Activity)
|
|||
|
assert(aiState.AiMovement ~= "")
|
|||
|
--setting state zone or road
|
|||
|
|
|||
|
|
|||
|
local positionalActivity= {["Patrol"] = "road",
|
|||
|
["Wander"] = "zone",
|
|||
|
["Repeat Road"] = "road",
|
|||
|
["Follow Route"] = "road",
|
|||
|
["Rest In Zone"] = "zone",
|
|||
|
["Feed In Zone"] = "zone",
|
|||
|
["Hunt In Zone"] = "zone",
|
|||
|
["Guard Zone"] = "zone",
|
|||
|
["Go To Zone"] = "zone",
|
|||
|
}
|
|||
|
if positionalActivity[activityStep.Activity] then
|
|||
|
local zone = r2:getInstanceFromId(activityStep.ActivityZoneId)
|
|||
|
if zone == nil then
|
|||
|
aiState = states[1]
|
|||
|
aiState.AiMovement = "idle"
|
|||
|
return aiState
|
|||
|
else
|
|||
|
if positionalActivity[activityStep.Activity] == "zone" then
|
|||
|
if table.getn(zone.Points) < 3 then
|
|||
|
aiState = states[1]
|
|||
|
aiState.AiMovement = "idle"
|
|||
|
return aiState
|
|||
|
end
|
|||
|
else
|
|||
|
if table.getn(zone.Points) < 2 then
|
|||
|
aiState = states[1]
|
|||
|
aiState.AiMovement = "idle"
|
|||
|
return aiState
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if activityStep.Activity == "Patrol" then
|
|||
|
local zone = r2:getInstanceFromId(activityStep.ActivityZoneId)
|
|||
|
if (zone == nil)
|
|||
|
then
|
|||
|
printErr("translation error: in the activitySequence " .. activitySequence.Name .. " in component " .. hlComponent.Name .. ": " .. " the zone associated to the action can not be found")
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
--un etat aller, un etat retour
|
|||
|
aiState2 = states[2]
|
|||
|
aiState2.AiMovement = "follow_route"
|
|||
|
Logic.assignZone(aiState, zone, false)
|
|||
|
Logic.assignZone(aiState2, zone, true)
|
|||
|
|
|||
|
statesByName = aiState.Name .."\n" .. aiState2.Name
|
|||
|
elseif activityStep.Activity == "Repeat Road" or activityStep.Activity == "Follow Route" or activityStep.Activity == "Wander"
|
|||
|
or activityStep.Activity == "Rest In Zone" or activityStep.Activity == "Feed In Zone" or activityStep.Activity == "Hunt In Zone"
|
|||
|
or activityStep.Activity == "Guard Zone" or activityStep.Activity == "Go To Zone" then
|
|||
|
local zone = r2:getInstanceFromId(activityStep.ActivityZoneId)
|
|||
|
if (zone == nil) then
|
|||
|
printErr("translation error: in the activitySequence " .. activitySequence.Name .. " in component " .. hlComponent.Name .. ": " .. " the zone associated to the action can not be found")
|
|||
|
return nil
|
|||
|
end
|
|||
|
Logic.assignZone(aiState, zone, false)
|
|||
|
statesByName = aiState.Name
|
|||
|
else
|
|||
|
statesByName = aiState.Name
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
if activityStep.Activity == "Repeat Road" then
|
|||
|
local action
|
|||
|
local event
|
|||
|
--when at end of the road, ...
|
|||
|
event = r2.Translator.createEvent("destination_reached_all", statesByName, groupsByName)
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
--return to the start of the road
|
|||
|
local repeatCount = activityStep.RoadCountLimit
|
|||
|
if not repeatCount then repeatCount = 2 end
|
|||
|
|
|||
|
action = r2.Translator.createAction("next_road", groupsByName, aiState.Name, activityStepIndex , repeatCount)
|
|||
|
table.insert(context.RtAct.Actions, action)
|
|||
|
table.insert(event.ActionsId, action.Id)
|
|||
|
|
|||
|
elseif activityStep.Activity == "Patrol" then
|
|||
|
local action
|
|||
|
local event
|
|||
|
local repeatCount = activityStep.RoadCountLimit
|
|||
|
if not repeatCount then repeatCount = 2 end
|
|||
|
event = r2.Translator.createEvent("destination_reached_all", aiState.Name, groupsByName)
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
action = r2.Translator.createAction("next_road", groupsByName, aiState2.Name, activityStepIndex, repeatCount)
|
|||
|
action.Name = "return"
|
|||
|
table.insert(context.RtAct.Actions, action)
|
|||
|
table.insert(event.ActionsId, action.Id)
|
|||
|
|
|||
|
event = r2.Translator.createEvent("destination_reached_all", aiState2.Name, groupsByName)
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
action = r2.Translator.createAction("next_road", groupsByName, aiState.Name, activityStepIndex , repeatCount)
|
|||
|
action.Name = "go"
|
|||
|
table.insert(context.RtAct.Actions, action)
|
|||
|
table.insert(event.ActionsId, action.Id)
|
|||
|
|
|||
|
elseif activityStep.Activity == "Follow Route" or activityStep.Activity == "Go To Start Point" or activityStep.Activity == "Go To Zone" then
|
|||
|
local action
|
|||
|
local event
|
|||
|
event = r2.Translator.createEvent("destination_reached_all", aiState.Name, groupsByName)
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
action = Logic.selectActivityStep(activityStepIndex + 1)
|
|||
|
table.insert(context.RtAct.Actions, action)
|
|||
|
table.insert(event.ActionsId, action.Id)
|
|||
|
elseif activityStep.Activity == "Rest In Zone" then
|
|||
|
local wanderTime = 100
|
|||
|
local restTime = 300
|
|||
|
r2.Translator.createActivityInZone(context, aiState.Name, groupsByName, "Rest", Logic.activityInternalTimerId, wanderTime, restTime, aiScriptDebug)
|
|||
|
elseif activityStep.Activity == "Feed In Zone" then
|
|||
|
local wanderTime = 50
|
|||
|
local feedTime = 150
|
|||
|
r2.Translator.createActivityInZone(context, aiState.Name, groupsByName, "Eat", Logic.activityInternalTimerId, wanderTime, feedTime, aiScriptDebug)
|
|||
|
elseif activityStep.Activity == "Hunt In Zone" then
|
|||
|
local wanderTime = 100
|
|||
|
local alertTime = 25
|
|||
|
local eatTime = 80
|
|||
|
r2.Translator.createHuntActivityInZone(context, aiState.Name, groupsByName, Logic.activityInternalTimerId, wanderTime, alertTime, eatTime, aiScriptDebug)
|
|||
|
elseif activityStep.Activity == "Guard Zone" then
|
|||
|
r2.Translator.createSimpleActivityInZone(context, aiState.Name, groupsByName, "Alert", false, aiScriptDebug)
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
if Logic.isWanderActivity(activityStep.Activity) and activityStep.TimeLimit == "Few Sec" then
|
|||
|
local event = r2.Translator.createEvent("destination_reached_all", aiState.Name, groupsByName)
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
local number = tonumber(activityStep.TimeLimitValue)
|
|||
|
if number == nil then
|
|||
|
number = 0
|
|||
|
end
|
|||
|
local action = r2.Translator.createAction("wander_destination_reached", groupsByName, aiState.Name, activityStepIndex, number)
|
|||
|
table.insert(context.RtAct.Actions, action)
|
|||
|
table.insert(event.ActionsId, action.Id)
|
|||
|
end
|
|||
|
|
|||
|
local stepAction = nil
|
|||
|
if activityStep.Activity == "Stand Up" then
|
|||
|
stepAction = r2.Translator.createAction("stand_up", rtNpcGrp.Id )
|
|||
|
elseif activityStep.Activity == "Sit Down" then
|
|||
|
stepAction = r2.Translator.createAction("sit_down", rtNpcGrp.Id )
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
-- translate event create by activitySequence (eg patrol)
|
|||
|
if activityStep.EventsIds.Size ~= 0
|
|||
|
then
|
|||
|
Logic.translateEvents(context, hlComponent, activitySequence, activityStep, activityStepIndex, rtNpcGrp, statesByName)
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--go to next activityStep
|
|||
|
local action = Logic.createTransition(context, hlComponent, activitySequence, activityStep, activityStepIndex, stepAction)
|
|||
|
table.insert(Logic.SequenceAction.Children, action)
|
|||
|
|
|||
|
|
|||
|
-- if ActivityStep.TimeLimit == "Chat" creates a eventhandler to go to next state
|
|||
|
|
|||
|
if activityStep.TimeLimit == "Chat" then
|
|||
|
local action
|
|||
|
local condition
|
|||
|
local event
|
|||
|
|
|||
|
local number = Logic.findChatSequenceIdByInstanceId(hlComponent, chat.InstanceId)
|
|||
|
if (number == nil or number == -1) then
|
|||
|
printWarning("Error in translation: in component '" .. hlComponent.Name .. " the chat sequence selected as time limit of Activity Step " .. activityStepIndex .. " does not exist.")
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
event = r2.Translator.createEvent("user_event_8", aiState.Name, rtNpcGrp.Id)
|
|||
|
table.insert(context.RtAct.Events, event)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
condition = r2.Translator.createAction("condition_if", "v0 == "..tostring(number-1))
|
|||
|
table.insert(context.RtAct.Actions, condition)
|
|||
|
|
|||
|
|
|||
|
action = Logic.selectActivityStep(activityStepIndex + 1)
|
|||
|
table.insert(condition.Children, action)
|
|||
|
table.insert(event.ActionsId, condition.Id)
|
|||
|
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
assert(State ~= "")
|
|||
|
return aiState
|
|||
|
end
|
|||
|
|
|||
|
---------------------------------------------------------------------------------------
|
|||
|
--helpers functions--
|
|||
|
---------------------------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
Logic.getAiMovement = function(activity)
|
|||
|
assert(activity and type(activity) == "string")
|
|||
|
if (activity == "Follow Route") or (activity == "Patrol") or (activity == "Repeat Road") then
|
|||
|
return "follow_route"
|
|||
|
elseif activity == "Deploy" then
|
|||
|
return "stand_on_vertices"
|
|||
|
elseif activity == "Wander" or activity == "Go To Zone" or activity == "Rest In Zone" or activity == "Feed In Zone"
|
|||
|
or activity == "Hunt In Zone" or activity == "Guard Zone" then
|
|||
|
return "wander"
|
|||
|
elseif activity == "Stand Still" or activity == "Inactive" or activity == "Stand Up" or activity == "Sit Down" then
|
|||
|
return "idle"
|
|||
|
elseif activity == "Stand On Start Point" or activity == "Go To Start Point" then
|
|||
|
return "stand_on_start_point"
|
|||
|
end
|
|||
|
|
|||
|
printWarning("Undef activity '"..activity.."'")
|
|||
|
assert(nil)
|
|||
|
return ""
|
|||
|
end
|
|||
|
|
|||
|
Logic.getAction = function(action)
|
|||
|
local action_type = action.Action
|
|||
|
|
|||
|
if action_type == "Sit Down"
|
|||
|
then
|
|||
|
return "sit_down"
|
|||
|
end
|
|||
|
if action_type == "Stand Up"
|
|||
|
then
|
|||
|
return "stand_up"
|
|||
|
end
|
|||
|
if action_type == "Go To Step"
|
|||
|
then
|
|||
|
if action.Parameter == nil or action.Parameter == ""
|
|||
|
then
|
|||
|
return nil
|
|||
|
end
|
|||
|
return "go_to_step"
|
|||
|
end
|
|||
|
if action_type == "Set Activity"
|
|||
|
then
|
|||
|
if action.Parameter == nil or action.Parameter == ""
|
|||
|
then
|
|||
|
return nil
|
|||
|
end
|
|||
|
return "set_activity"
|
|||
|
end
|
|||
|
|
|||
|
if action_type == "Stop Actions"
|
|||
|
then
|
|||
|
return "stop_actions"
|
|||
|
end
|
|||
|
|
|||
|
if action_type == "Start Mission"
|
|||
|
then
|
|||
|
return "start_mission"
|
|||
|
end
|
|||
|
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
Logic.getEvent = function(Event)
|
|||
|
local i = Logic.find(Logic.EventTypes, Event.Condition.SourceType)
|
|||
|
--Time event type
|
|||
|
if i == 0
|
|||
|
then
|
|||
|
end
|
|||
|
|
|||
|
--place event type
|
|||
|
if i == 1
|
|||
|
then
|
|||
|
end
|
|||
|
|
|||
|
--entity event type
|
|||
|
if i == 2
|
|||
|
then
|
|||
|
if Event.Condition.Type == "At Destination"
|
|||
|
then
|
|||
|
return "destination_reached_all"
|
|||
|
end
|
|||
|
|
|||
|
if Event.Condition.Type == "Is Attacked"
|
|||
|
then
|
|||
|
return "group_under_attack"
|
|||
|
end
|
|||
|
|
|||
|
if Event.Condition.Type == "Enters State"
|
|||
|
then
|
|||
|
return "start_of_state"
|
|||
|
end
|
|||
|
|
|||
|
if Event.Condition.Type == "Leaves State"
|
|||
|
then
|
|||
|
return "end_of_state"
|
|||
|
end
|
|||
|
if Event.Condition.Type == "Activity Is"
|
|||
|
then
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--State Machine event type
|
|||
|
if i == 3
|
|||
|
then
|
|||
|
end
|
|||
|
|
|||
|
--Counter event type
|
|||
|
if i == 4
|
|||
|
then
|
|||
|
local counterName = Event.Parameter
|
|||
|
local param
|
|||
|
|
|||
|
if counterName == nil
|
|||
|
then
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
if string.find(Event.Condition.Type, "v%d_changed") ~= nil
|
|||
|
then
|
|||
|
return "variable_" ..Event.Condition.Type
|
|||
|
end
|
|||
|
|
|||
|
if Event.Condition.Type == "Equals"
|
|||
|
then
|
|||
|
param = " = "
|
|||
|
else
|
|||
|
if Event.Condition.Type == "Lesser"
|
|||
|
then
|
|||
|
param = " < "
|
|||
|
else
|
|||
|
if Event.Condition.Type == "Greater"
|
|||
|
then
|
|||
|
param = " > "
|
|||
|
else
|
|||
|
param = nil
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
if param == nil
|
|||
|
then
|
|||
|
return nil
|
|||
|
end
|
|||
|
param = param ..Event.Condition.ConditionParameter
|
|||
|
|
|||
|
return "variable_changed", param
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
Logic.checkEvent = function(eventMode, sourceType, sourceId, conditionType, parameter)
|
|||
|
local eventTypeInd = Logic.find(Logic.EventTypes, sourceType)
|
|||
|
local conditionTypeInd
|
|||
|
if eventTypeInd == nil
|
|||
|
then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--{"Time", "Place", "Entity or Group", "State Machine", "Counter"}
|
|||
|
|
|||
|
conditionTypeInd = Logic.find(Logic.ConditionTypes[eventTypeInd], conditionType)
|
|||
|
if eventTypeInd == nil
|
|||
|
then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--Time event type
|
|||
|
if eventTypeInd == 0
|
|||
|
then
|
|||
|
end
|
|||
|
|
|||
|
--Place event type
|
|||
|
if eventTypeInd == 1
|
|||
|
then
|
|||
|
end
|
|||
|
|
|||
|
--Entity or Group event type
|
|||
|
if eventTypeInd == 2
|
|||
|
then
|
|||
|
if parameter == nil or parameter == ""
|
|||
|
then
|
|||
|
if conditionType == "At Destination" or conditionType == "Is Attacked"
|
|||
|
then
|
|||
|
return true
|
|||
|
else
|
|||
|
return false
|
|||
|
end
|
|||
|
else
|
|||
|
if conditionType == "Enters State" or conditionType == "Leaves State"
|
|||
|
then
|
|||
|
return true
|
|||
|
else
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--State Machine event type
|
|||
|
if eventTypeInd == 3
|
|||
|
then
|
|||
|
end
|
|||
|
|
|||
|
--Counter event type
|
|||
|
if eventTypeInd == 4
|
|||
|
then
|
|||
|
if string.find(conditionType, "v%d_changed") ~= nil
|
|||
|
then
|
|||
|
return true
|
|||
|
end
|
|||
|
if conditionType == "Lesser" or conditionType == "Greater" or conditionType == "Equals"
|
|||
|
then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return false
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
Logic.fillCondition = function(condition, sourceType, sourceId, conditionType, conditionParameter)
|
|||
|
condition.SourceType = sourceType
|
|||
|
condition.SourceId = sourceId
|
|||
|
condition.Type = conditionType
|
|||
|
condition.ConditionParameter = conditionParameter
|
|||
|
end
|
|||
|
|
|||
|
Logic.fillEvent = function(event, eventMode, sourceType, sourceId, conditionType, conditionParameter)
|
|||
|
if Logic.checkEvent(eventMode, sourceType, sourceId, conditionType, conditionParameter) == false
|
|||
|
then
|
|||
|
assert(0)
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
Logic.fillCondition(event.Condition, sourceType, sourceId, conditionType, conditionParameter)
|
|||
|
event.EventMode = eventMode
|
|||
|
return true
|
|||
|
end
|
|||
|
-----------------------------------------
|
|||
|
--genere le parametre de l'action set_timer
|
|||
|
Logic.getTimeLimit = function(step)
|
|||
|
local param = ""
|
|||
|
|
|||
|
if step.TimeLimit == "Few Sec" then
|
|||
|
local limit = tonumber(step.TimeLimitValue)
|
|||
|
if limit == nil then
|
|||
|
limit = 0
|
|||
|
end
|
|||
|
limit = 1 + limit * 10
|
|||
|
param = tostring( limit )
|
|||
|
return param
|
|||
|
end
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
Logic.getActivityInitialStateName = function(groupId, activityNb, context)
|
|||
|
local group = context.Components[groupId]
|
|||
|
local activity = group.Components[1].Behavior.Activities[activityNb]
|
|||
|
|
|||
|
if activity == nil
|
|||
|
then
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
local activityStates = Logic.ActivitiesStates[activity.InstanceId]
|
|||
|
return activityStates[activity.InstanceId][0].Name
|
|||
|
end
|
|||
|
|
|||
|
--return the states used to represent this step activity
|
|||
|
Logic.getActivityStepStates = function(activity, stepNb)
|
|||
|
local activityStates = Logic.ActivitiesStates[activity.InstanceId]
|
|||
|
local states = activityStates[activity.Components[stepNb].InstanceId]
|
|||
|
return states
|
|||
|
end
|
|||
|
|
|||
|
Logic.find = function(array, elem)
|
|||
|
local i = 0
|
|||
|
for k, v in pairs(array)
|
|||
|
do
|
|||
|
if k ~="Keys"
|
|||
|
then
|
|||
|
if elem == v
|
|||
|
then
|
|||
|
return i
|
|||
|
end
|
|||
|
i = i + 1
|
|||
|
end
|
|||
|
end
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Logic.findChatSequenceIdByInstanceIdImpl = function(instance, instanceId)
|
|||
|
local behvior = instance:getBehavior()
|
|||
|
local k, sequence = next(behvior.ChatSequences, nil)
|
|||
|
local nbSequence = 0
|
|||
|
while k do
|
|||
|
nbSequence = nbSequence + 1
|
|||
|
if tostring(sequence.InstanceId) == instanceId then return nbSequence end
|
|||
|
k, sequence = next(behvior.ChatSequences, k)
|
|||
|
end
|
|||
|
return -1
|
|||
|
end
|
|||
|
|
|||
|
Logic.findChatSequenceIdByInstanceId = function(target, instanceId)
|
|||
|
local instance =target
|
|||
|
return Logic.findChatSequenceIdByInstanceIdImpl(instance, instanceId)
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
-- target -> hlNpc or hlNpcGrp
|
|||
|
Logic.findChatStepIdByInstanceId = function(target, instanceId)
|
|||
|
assert( type(target) == "userdata")
|
|||
|
local nbSequence = 0
|
|||
|
local nbStep = 0
|
|||
|
|
|||
|
local instance = target
|
|||
|
assert(instance ~= nil)
|
|||
|
local behavior = instance:getBehavior()
|
|||
|
assert(behavior ~= nil)
|
|||
|
local k2, sequence = next(behavior.ChatSequences, nil)
|
|||
|
while k2 do
|
|||
|
|
|||
|
nbSequence = nbSequence + 1
|
|||
|
nbStep = 0
|
|||
|
local k, step = next(sequence.Components, nil)
|
|||
|
while k do
|
|||
|
nbStep = nbStep +1
|
|||
|
if tostring(step.InstanceId) == instanceId then return {nbStep, nbSequence} end
|
|||
|
k, step = next(sequence.Components, k)
|
|||
|
end
|
|||
|
k2, sequence = next(behavior.ChatSequences, k2)
|
|||
|
end
|
|||
|
assert(0)
|
|||
|
return {-1, -1}
|
|||
|
end
|
|||
|
|
|||
|
-- target is a NpcGrp or a Npc or a CustomNpc
|
|||
|
Logic.findActivitySequenceIdByInstanceId = function(target, instanceId)
|
|||
|
assert( type(target) == "userdata")
|
|||
|
|
|||
|
local nbSequence = 0
|
|||
|
local behavior = nil
|
|||
|
|
|||
|
behavior = target:getBehavior()
|
|||
|
|
|||
|
if behavior == nil then
|
|||
|
debugInfo("Error: try to find activity Sequence on an unknown entity of type " .. target.Class )
|
|||
|
assert(nil)
|
|||
|
end
|
|||
|
|
|||
|
local npc = behavior.ParentInstance
|
|||
|
local grp = behavior.ParentInstance.ParentInstance
|
|||
|
if not npc:isGrouped() then grp = nil end
|
|||
|
|
|||
|
|
|||
|
local k, sequence = next(behavior.Activities, nil)
|
|||
|
while (k ~= nil) do
|
|||
|
|
|||
|
nbSequence = nbSequence + 1
|
|||
|
if sequence.InstanceId == instanceId then
|
|||
|
if grp then return {nbSequence, grp} end
|
|||
|
if npc then return {nbSequence, npc} end
|
|||
|
assert(nil)
|
|||
|
end
|
|||
|
k, sequence = next(behavior.Activities, k)
|
|||
|
end
|
|||
|
return {-1, nil}
|
|||
|
end
|
|||
|
|
|||
|
Logic.findActivityStepIdByInstanceId = function(target, instanceId)
|
|||
|
assert( type(target) == "userdata")
|
|||
|
local nbSequence = 0
|
|||
|
local nbStep = 0
|
|||
|
local comp = target
|
|||
|
local behavior = comp:getBehavior()
|
|||
|
|
|||
|
local k, sequence = next(behavior.Activities, nil)
|
|||
|
while k do
|
|||
|
|
|||
|
if tostring(sequence.InstanceId) == instanceId then
|
|||
|
assert(nil) -- use findActivityStep instead of findactivitySequence
|
|||
|
end
|
|||
|
|
|||
|
nbSequence = nbSequence + 1
|
|||
|
nbStep = 0
|
|||
|
local k2, step = next(sequence.Components, nil)
|
|||
|
while (k2) do
|
|||
|
nbStep = nbStep +1
|
|||
|
if tostring(step.InstanceId) == instanceId then return {nbStep, nbSequence} end
|
|||
|
k2, step = next(sequence.Components, k2)
|
|||
|
end
|
|||
|
k, sequence = next(behavior.Activities, k)
|
|||
|
end
|
|||
|
return {-1, -1}
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Logic.selectActivityStep = function(stepNb)
|
|||
|
local action
|
|||
|
stepNb = stepNb - 1
|
|||
|
|
|||
|
action = r2.Translator.createAction("code",
|
|||
|
Logic.activityStepVar .. " = " .. stepNb ..";\n"
|
|||
|
.. "()setTimer(1, " ..Logic.activityStepTimerId .. ");\n")
|
|||
|
action.Name = "select_activity_step " .. stepNb
|
|||
|
|
|||
|
return action
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
----------------------------------------------------------------------------
|
|||
|
-- add a line to the event menu
|
|||
|
|
|||
|
local component = Logic.Components.ChatSequence
|
|||
|
|
|||
|
|
|||
|
----------------------------------------------------------------------------
|
|||
|
-- add a line to the event menu
|
|||
|
function component:getLogicTranslations()
|
|||
|
|
|||
|
local logicTranslations = {
|
|||
|
["ApplicableActions"] = {
|
|||
|
["starts dialog"] = { menu=i18n.get( "uiR2AA0ChatSeqStart" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2AA1ChatSeqStart" ):toUtf8()},
|
|||
|
["stops dialog"] = { menu=i18n.get( "uiR2AA0ChatSeqStop" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2AA1ChatSeqStop" ):toUtf8()},
|
|||
|
["starts chat"] = { menu=i18n.get( "uiR2AA0ChatStepStart" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2AA1ChatStepStart" ):toUtf8()},
|
|||
|
["continues dialog"] = { menu=i18n.get( "uiR2AA0ChatStepContinue" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2AA1ChatStepContinue" ):toUtf8()},
|
|||
|
},
|
|||
|
["Events"] = {
|
|||
|
["start of dialog"] = { menu=i18n.get( "uiR2Event0ChatSeqStart" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2Event1ChatSeqStart" ):toUtf8()},
|
|||
|
["end of dialog"] = { menu=i18n.get( "uiR2Event0ChatSeqEnd" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2Event1ChatSeqEnd" ):toUtf8()},
|
|||
|
["start of chat"] = { menu=i18n.get( "uiR2Event0ChatStepStart" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2Event1ChatStepStart" ):toUtf8()},
|
|||
|
["end of chat"] = { menu=i18n.get( "uiR2Event0ChatStepEnd" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2Event1ChatStepEnd" ):toUtf8()},
|
|||
|
},
|
|||
|
["Conditions"] = {
|
|||
|
["is in dialog"] = { menu=i18n.get( "uiR2Test0ChatSeq" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2Test1ChatSeq" ):toUtf8()},
|
|||
|
["is not in dialog"] = { menu=i18n.get( "uiR2Test0ChatNotSeq" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2Test1ChatNotSeq" ):toUtf8()},
|
|||
|
["is in chat"] = { menu=i18n.get( "uiR2Test0ChatStep" ):toUtf8(),
|
|||
|
text=i18n.get( "uiR2Test1ChatStep" ):toUtf8()},
|
|||
|
}
|
|||
|
}
|
|||
|
return logicTranslations
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
r2.Features["ActivitySequence"] = Logic
|
|||
|
|