2012-07-02 20:46:08 +00:00
if r2.Translator == nil
then
r2.Translator = { }
end
local Translator = r2.Translator
Translator.PredatorEnemyFaction = " Player|guard|bandit|herbivore|karavan " ;
-- Namespace global
function printMsg ( str )
messageBox ( str )
debugInfo ( colorTag ( 255 , 255 , 0 ) .. str )
local ucStringMsg = ucstring ( )
ucStringMsg : fromUtf8 ( str )
displaySystemInfo ( ucStringMsg , " BC " )
messageBox ( str )
end
function printError ( str )
local msg = " Translation WRN: "
debugInfo ( colorTag ( 255 , 0 , 0 ) .. msg .. str )
-- local ucStringMsg = ucstring()
-- ucStringMsg:fromUtf8(str)
-- displaySystemInfo(ucStringMsg, "BC")
--messageBox(str)
assert ( nil )
end
r2.Translator . MultilineBc = { }
function Translator . updateEachSecond ( )
if table.getn ( Translator.MultilineBc ) > 0 then
local msg = table.remove ( Translator.MultilineBc , 1 )
if msg then
local ucStringMsg = ucstring ( )
ucStringMsg : fromUtf8 ( msg )
displaySystemInfo ( ucStringMsg , " BC " )
end
end
end
function printMsgML ( str )
local strs = r2.split ( str , " \n " )
for k , v in pairs ( strs ) do
table.insert ( Translator.MultilineBc , v )
end
end
--local devMode = false
local devMode = config.R2EDExtendedDebug
local dataDevMode = false
function printWarning ( str )
local msg = " Translation Error: " .. str
debugInfo ( colorTag ( 255 , 0 , 0 ) .. msg )
-- msg will be displayed when client is back to edition
-- Just report the last error
if ( r2.LastTranslationErrorMsg == nil ) then
r2.LastTranslationErrorMsg = str
local ucStringMsg = ucstring ( " Translation Error " )
-- ucStringMsg:fromUtf8(r2.LastTranslationErrorMsg)
displaySystemInfo ( ucStringMsg , " BC " )
messageBox ( str )
end
if devMode then
assert ( nil )
else
error ( str ) -- force to exit current translation
end
end
function BOMB_IF ( condition , str )
if ( not condition ) then
printWarning ( str )
end
end
-- Namespace r2
function r2 : getScenarioId ( )
local str = r2 : getNamespace ( )
str = string.gsub ( str , " r2_ " , " " )
str = string.gsub ( str , " _ " , " " )
local sessionId = tonumber ( str )
return sessionId
end
function r2 : getActId ( actIn )
assert ( actIn )
local index = - 1
local actId , act = next ( r2.Scenario . Acts )
while actId do
index = index + 1
if ( tostring ( act.InstanceId ) == tostring ( actIn.InstanceId ) ) then return index end
actId , act = next ( r2.Scenario . Acts , actId )
end
assert ( nil )
return - 1
end
-- Namespace Translator
function Translator . getRtGroup ( context , instanceId )
assert ( context.RtAct )
assert ( context ~= nil and type ( context ) == " table " )
assert ( instanceId ~= nil and type ( instanceId ) == " string " )
if context.RtGroups [ instanceId ] == nil
then
context.RtGroups [ instanceId ] = r2.newComponent ( " RtNpcGrp " )
context.RtGroups [ instanceId ] . Name = context.RtGroups [ instanceId ] . Id
table.insert ( context.RtAct . NpcGrps , context.RtGroups [ instanceId ] )
end
return context.RtGroups [ instanceId ]
end
function Translator . getRtStatesNames ( context , instanceId )
local rtNpcGrp = Translator.getRtGroup ( context , instanceId )
local statesNames = context.GroupStatesName [ rtNpcGrp.Name ]
return statesNames
end
r2.doTranslateFeatures = function ( scenario )
return Translator.doTranslateFeatures ( scenario.InstanceId )
end
r2.translateFeature = function ( context )
local component = context.Feature
if ( component == nil ) then return end
if component.translate ~= nil then
component : translate ( context )
end
end
r2.translateFeatures = function ( scenario )
local rtScenario = r2.doTranslateFeatures ( scenario )
r2.requestUpdateRtScenario ( rtScenario )
end
-- creat a context (mainly RtComponent)
Translator.createContext = function ( scenario )
local context = { }
context.Scenario = scenario
context.RtScenario = r2.newComponent ( " RtScenario " )
context.TextTranslateId = { }
context.Feature = scenario -- obsloete to remove
context.GroupStatesName = { }
context.GroupTriggeredActions = { }
context.Events = { }
context.ActivityStates = { }
context.RtGrps = { }
context.RtGroups = { }
context.CounterNames = { }
context.RtCounters = { }
--context.EasterEggUniqId = {} -- RtGrpId to uniqId
context.ActIdToRtAct = { }
context.InteractingSceneryObjects = { }
return context
end
-- return the equipment of a rtNpc by looking at the visual properties of an hlNpc
Translator.translateEquipment = function ( hlNpc )
local instanceId = hlNpc.InstanceId
local equipment = " "
local instance = r2 : getInstanceFromId ( instanceId )
if instance : isKindOf ( " NpcCustom " ) then
equipment = equipment .. r2.getVisualPropertiesFromInstanceId ( instanceId ) ;
end
if equipment == nil then
equipment = " "
end
local isFauna = hlNpc.IsFauna
if isFauna ~= nil and isFauna == 1 then
-- Npc with default name use default translation system name
local basename = hlNpc.Base
if basename then basename = r2.PaletteIdToTranslation [ basename ] end
if basename == nil or basename ~= hlNpc.Name then
equipment = equipment .. " FAUNA_BOT_USE_BOTNAME \n "
end
end
return equipment
end
-- get an rtNpc aiActivity from an hlNpc eg "civil" -> "normal"
Translator.getAiActivity = function ( hlNpc )
assert ( hlNpc and type ( hlNpc ) == " userdata " )
local aiActivity = hlNpc.AiActivity
local profile = hlNpc.Profile
local str = " no_change "
if profile then return " " end
if profile ~= nil then
if profile == " bandit " then str = " bandit " end
if profile == " guard " then str = " guard " end
if profile == " civil " then str = " normal " end
elseif aiActivity ~= nil then
str = aiActivity
end
return str ;
end
-- get rtNpc from hlNpc
Translator.translateNpc = function ( hlNpc , context )
local function findInTable ( instanceId )
for k , v in pairs ( context.InteractingSceneryObjects ) do
if v == instanceId then return true end
end
return false
end
assert ( hlNpc and type ( hlNpc ) == " userdata " )
local RtNpc = r2.newComponent ( " RtNpc " )
RtNpc.Name = hlNpc.Name
RtNpc.SheetClient = hlNpc.SheetClient
RtNpc.Sheet = hlNpc.Sheet
if RtNpc.Sheet == nil then RtNpc.Sheet = " " end
if hlNpc : isBotObject ( ) and context and context.InteractingSceneryObjects
and findInTable ( hlNpc.InstanceId ) then
RtNpc.IsStuck = 0
RtNpc.Sheet = " object_chest_wisdom_std_sel.creature "
else
RtNpc.IsStuck = hlNpc.IsStuck
end
RtNpc.Pt = r2.getWorldPos ( hlNpc )
RtNpc.Angle = hlNpc.Angle
RtNpc.Equipment = Translator.translateEquipment ( hlNpc )
local animProp = 0
if not hlNpc : getParentAct ( ) : isBaseAct ( ) then
animProp = animProp + 1 -- TODO test if default feature
end
if hlNpc.IsBotObject ~= 1 then
animProp = animProp + 2 -- Living Creature
end
if hlNpc.IsBotObject ~= 1 and hlNpc.IsPlant ~= 1 then
animProp = animProp + 4 -- Controlable creature
end
if hlNpc.IsBotObject ~= 1 and hlNpc.IsNpc == 1 then
animProp = animProp + 8 -- Creature that talk
end
RtNpc.DmProperty = animProp
return RtNpc
end
-- Behavior: the behavior of the npc (or the leader of an group)
-- translate the activitySequences of an npc/group
Translator.translateActivities = function ( context , hlComponent , behavior , rtNpcGrp , aiActivity )
assert ( context )
assert ( hlComponent )
assert ( behavior )
assert ( rtNpcGrp )
assert ( aiActivity )
local initFun = Logic.initGroupActivitiesTranslation
local translateActivitySequence = Logic.translateActivitySequence
--all the states names of all the sequences of this group
local statesNames = " "
local first = true
--for each group's activity
local activityIndex = 1
local firstState = " "
--creation of the group's initial state
local leader = hlComponent
if hlComponent : isKindOf ( " NpcGrpFeature " ) then
if table.getn ( hlComponent.Components ) >= 0 then
leader = hlComponent.Components [ 0 ]
else
leader = nil
end
end
if table.getn ( behavior.Activities ) == 0 then
-- create initial and only state
local aiState = r2.newComponent ( " RtAiState " )
statesNames = aiState.Id
r2.Utils . setState ( context , behavior , aiState )
aiState.Name = hlComponent.InstanceId .. " .init "
aiState.AiActivity = aiActivity
table.insert ( context.RtAct . AiStates , aiState )
table.insert ( aiState.Children , rtNpcGrp.Id )
firstState = aiState.Id
else
local k , v = next ( behavior.Activities , nil )
while k do
if ( v.Class == " ActivitySequence " ) then
initFun ( context , hlComponent , v , first , activityIndex , aiActivity , rtNpcGrp )
if first then
firstState = Logic.StatesByName
end
--translate the activity
translateActivitySequence ( context , hlComponent , v , activityIndex , rtNpcGrp )
statesNames = statesNames .. Logic.StatesByName .. " \n "
activityIndex = activityIndex + 1
first = false
else
error ( " Error while translating ' " .. hlComponent.Name .. " ' its " .. tostring ( nbActivity ) .. " ActiviySequence contains an element of type " .. v.Class )
end
k , v = next ( behavior.Activities , k )
end
end
if leader and not leader : isBotObject ( ) then
local category = leader.SubCategory
local aggro = leader.Aggro
if not category then
category = leader.Category
end
if category then
local event = r2.Translator . createEvent ( " start_of_state " , firstState , rtNpcGrp.Id )
table.insert ( context.RtAct . Events , event )
local action = r2.Translator . createAction ( " bot_init " , rtNpcGrp.Id , category , aggro , leader.BotAttackable , leader.PlayerAttackable )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
end
end
context.GroupStatesName [ rtNpcGrp.Name ] = statesNames
end
function Translator . initializeFactions ( context , leader , rtGrp , aiStateName )
if leader and not leader : isBotObject ( ) then
local category = leader.SubCategory
local aggro = leader.Aggro
if not category then
category = leader.Category
end
if category then
local event = r2.Translator . createEvent ( " start_of_state " , aiStateName , rtGrp.Id )
table.insert ( context.RtAct . Events , event )
local action = r2.Translator . createAction ( " faction_init " , rtGrp.Id , category , aggro , leader.BotAttackable , leader.PlayerAttackable )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
end
end
end
-- translate an eventHandler defined in the behavior of an npc / group
-- used to implement translateEventHandlers
Translator.translateEventHandler = function ( context , hlNpc , eventHandler , rtNpcGrp )
local getName = function ( object , optionalName )
if optionalName and object.optionalName then return " ' " .. object.optionalName .. " ' " end
if object.Name then return " ' " .. object.Name .. " ' " end
if object.InstanceId then return " ( " .. object.InstanceId .. " ) " end
return " ?? "
end
local event = nil
local firstCondition = nil
local lastCondition = nil
local target = nil
target = hlNpc
if not target then
printWarning ( " Error in component ' " .. eventHandler.Name .. " ' " )
end
if tostring ( eventHandler.Event . Type ) == " " then return nil end
if not target.getLogicEvent then
local eventName = eventHandler.Name
printWarning ( " The component ' " .. target.Name .. " ' seem to not be able to handle events ' " )
end
event , firstCondition , lastCondition = target.getLogicEvent ( target , context , eventHandler )
if not event then
printWarning ( " Error in ' " .. target.Name .. " ' the Event Handler ' " .. eventHandler : getName ( ) .. " ' don't seem to work because the event ' " .. eventHandler.Event . Type .. " ' don't seem to be implemented. " )
end
local kCondition , condition = next ( eventHandler.Conditions , nil )
while kCondition do
local conditionEntity = r2 : getInstanceFromId ( condition.Entity )
if condition.Condition . Type ~= " " and conditionEntity then
assert ( conditionEntity )
local firstCondition2 , lastCondition2 = conditionEntity : getLogicCondition ( context , condition )
if not firstCondition2 or not lastCondition2 then
printWarning ( " Unknown Condition ' " .. condition.Condition . Type .. " ' in EventHandler " .. eventHandler : getName ( ) .. " in component " .. getName ( target ) )
return nil
end
if not firstCondition then
firstCondition = firstCondition2
lastCondition = lastCondition2
else
table.insert ( lastCondition.Children , firstCondition2 )
lastCondition = lastCondition2
end
end
kCondition , condition = next ( eventHandler.Conditions , kCondition )
end
local firstAction = nil
local lastAction = nil
if eventHandler.Actions . Size > 0 then
local multiAction = nil
if eventHandler.Actions . Size > 1 then
multiAction = Translator.createAction ( " multi_actions " )
end
local kAction , action = next ( eventHandler.Actions , nil )
while kAction do
local actionEntity = r2 : getInstanceFromId ( action.Entity )
if action.Action . Type ~= " " and actionEntity then
local firstAction2 , lastAction2 = actionEntity : getLogicAction ( context , action )
if not firstAction2 or not lastAction2 then
printWarning ( " Unknown Action ' " .. action.Action . Type .. " ' in EventHandler " .. eventHandler : getName ( ) .. " in component " .. getName ( target ) )
end
if multiAction then
table.insert ( multiAction.Children , firstAction2 )
else
firstAction = firstAction2
end
end
kAction , action = next ( eventHandler.Actions , kAction )
end
if eventHandler.Actions . Size > 1 then
firstAction = multiAction
end
end
-- if there is actions then the first executed npc_event_handler_action are the dynamic_if from [firstCondition, lastCondition]
if lastCondition then
table.insert ( lastCondition.Children , firstAction )
firstAction = firstCondition
end
if event and firstAction then
local actInstanceId = eventHandler : getLogicActInstanceId ( )
if ( tostring ( actInstanceId ) == " " ) then
debugInfo ( " Invalid Multi act action: " .. eventHandler : getName ( ) )
return
end
local rtAct2 = context.ActIdToRtAct [ actInstanceId ]
local rtAct = context.RtAct
if rtAct2 ~= rtAct then
local baseAct = context.Scenario : getBaseAct ( )
local index = context.Scenario : getActIndex ( actInstanceId )
if index == - 1 then
printWarning ( " Invalid Scenario " )
end
local rtNpcGrpBase = r2.Translator . getRtGroup ( context , baseAct.InstanceId )
local action = Translator.createAction ( " test_act " , rtNpcGrpBase.Id , index )
table.insert ( action.Children , firstAction )
firstAction = action
end
-- insert a npc_event_handler
table.insert ( rtAct.Events , event ) -- TODO use eventHandler->
-- insert a npc_event_handler_action
table.insert ( event.ActionsId , firstAction.Id )
table.insert ( rtAct.Actions , firstAction )
end
end
-- translates eventHandlers of a npc/group (eventHandlers are defined in beahvior)
Translator.translateEventHandlers = function ( context , hlNpc , eventHandlers , rtNpcGrp )
assert ( rtNpcGrp )
assert ( context )
if ( eventHandlers ~= nil ) then
local k , v = next ( eventHandlers , nil )
while k do
local caller = nil
if devMode then
caller = function ( ... ) arg [ 1 ] ( arg [ 2 ] , arg [ 3 ] , arg [ 4 ] , arg [ 5 ] ) return true end
else
caller = pcall
end
if not caller ( Translator.translateEventHandler , context , hlNpc , v , rtNpcGrp ) then
local eventType = v.Event . Type
if eventType == nil then eventType = " " end
local componentName = hlNpc.Name
if componentName == nil then componentName = " " end
printWarning ( " Error in event handler ' " .. eventType .. " ' In component " .. componentName )
end
k , v = next ( eventHandlers , k )
end
end
end
-- translate a scenario
-- scenarioInstanceId the instanceId of the scenario that will be translated to rtData
-- returns rtScenario or nil
Translator.doTranslateFeatures = function ( scenarioInstanceId )
local ok
local result
r2.LastTranslationErrorMsg = nil
ok , result = pcall ( Translator.doTranslateFeaturesProtected , scenarioInstanceId )
if not ok then
printWarning ( result )
end
return result
end
function Translator . initStartingActIndex ( startingAct )
local startingAct = r2.Scenario . User.SelectedActInstanceId
local acts = r2.Scenario . Acts
local actId , act = next ( acts , nil )
local actIndex = 0
while ( actId ~= nil )
do
if startingAct and tostring ( act.InstanceId ) == startingAct then
r2.setStartingActIndex ( actIndex )
else
r2.setStartingActIndex ( 1 )
end
actIndex = actIndex + 1
actId , act = next ( acts , actId )
end
end
Translator.doTranslateFeaturesProtected = function ( scenarioInstanceId )
local scenario = r2 : getInstanceFromId ( scenarioInstanceId )
assert ( scenario ) -- something is broken elsewhere
assert ( r2.Features ~= nil )
local acts = scenario.Acts
local context = Translator.createContext ( scenario )
local cost = 0
local rtScenario = context.RtScenario
-----------------------------
--elements counting
local maxSecondaryActCost = 0
local baseActCost = 0
local first = true
--
-- Recursive method that call a specific function (ie createGhostComponent, pretranslate) on a component
-- and every components it contains. Each component level is treated, so that the function needs to be called
-- only once on the toplevel feature.
--
local function recursiveFunctionCall ( f , components , param )
if ( components == nil ) then
return
end
local k , v = next ( components , nil )
while k do
if v [ f ] then
v [ f ] ( v , param )
end
if v.Components then
recursiveFunctionCall ( f , v.Components , param )
end
if v.SubComponents then
recursiveFunctionCall ( f , v.SubComponents , param )
end
k , v = next ( components , k )
end
end
local function recursiveTranslate ( components , context )
if ( components == nil ) then
return
end
local k , v = next ( components , nil )
while k do
context.Feature = v
r2.translateFeature ( context )
if v.Components then
recursiveTranslate ( v.Components , context )
end
if v.SubComponents then
recursiveTranslate ( v.SubComponents , context )
end
k , v = next ( components , k )
end
end
local function recursivePretranslate2 ( components , context )
if ( components == nil ) then
return
end
local k , v = next ( components , nil )
while k do
context.Feature = v
if v.pretranslate2 then v.pretranslate2 ( v , context ) end
if v.Components then
recursivePretranslate2 ( v.Components , context )
end
if v.SubComponents then
recursivePretranslate2 ( v.SubComponents , context )
end
k , v = next ( components , k )
end
end
-- Management of items (Copy from Edition Data to Rt Data)
do
local plotItemId , plotItem = next ( scenario.PlotItems , nil )
while plotItemId do
assert ( type ( plotItem.SheetId ) == " number " )
assert ( type ( plotItem.Name ) == " string " )
assert ( type ( plotItem.Desc ) == " string " )
assert ( type ( plotItem.Comment ) == " string " )
assert ( string.len ( plotItem.Name ) < 256 )
assert ( string.len ( plotItem.Desc ) < 256 )
assert ( string.len ( plotItem.Comment ) < 256 )
local rtPlotItem = r2.newComponent ( " RtPlotItem " )
rtPlotItem.SheetId = plotItem.SheetId
rtPlotItem.Description = plotItem.Desc
rtPlotItem.Name = plotItem.Name
rtPlotItem.Comment = plotItem.Comment
table.insert ( rtScenario.PlotItems , rtPlotItem )
plotItemId , plotItem = next ( scenario.PlotItems , plotItemId )
end
end
-- ghost
do
local actId , act = next ( acts , nil )
while ( actId ~= nil ) do
local features = act.Features
recursiveFunctionCall ( " createGhostComponents " , features , act )
actId , act = next ( acts , actId )
end
end
-- pre Translation
do
local actId , act = next ( acts , nil )
while ( actId ~= nil ) do
local rtAct = r2.newComponent ( " RtAct " )
if act.WeatherValue ~= nil and act.ManualWeather == 1 then
rtAct.WeatherValue = 1 + act.WeatherValue
else
rtAct.WeatherValue = 0
end
rtAct.ActDescription = " "
rtAct.PreActDescription = " "
if act.ShortDescription then
rtAct.ActDescription = act.ShortDescription
end
if act.PreActDescription then
rtAct.PreActDescription = act.PreActDescription
end
context.RtAct = rtAct
context.ActIdToRtAct [ act.InstanceId ] = rtAct
context.Act = act
context.RtAct = rtAct
local features = act.Features
act : pretranslate ( context )
recursiveFunctionCall ( " pretranslate " , features , context )
actId , act = next ( acts , actId )
end
end
-----------------------------
--texts translation
context.Feature = scenario.Texts
r2.Features [ " TextManager " ] . Translator ( context )
--for each act
local actId , act = next ( acts , nil )
while ( actId ~= nil ) do
cost = 0
-- debugInfo("Act:: "..act.InstanceId)
local rtAct = context.ActIdToRtAct [ act.InstanceId ]
context.RtAct = rtAct
context.Act = act
table.insert ( rtScenario.Acts , rtAct )
local activitiesIds = act : getActivitiesIds ( )
--creating states for all the activities of all the groups in this act
local k , v = next ( activitiesIds , nil )
while k do
local sequence = r2 : getInstanceFromId ( v )
if sequence and sequence.Components
then
Logic.createActivityStates ( context , sequence )
end
k , v = next ( activitiesIds , k )
end
actId , act = next ( acts , actId )
end
-- translate activities
do
local actId , act = next ( acts , nil )
while ( actId ~= nil ) do
local rtAct = context.ActIdToRtAct [ act.InstanceId ]
context.RtAct = rtAct
context.Act = act
local features = act.Features
recursivePretranslate2 ( features , context )
actId , act = next ( acts , actId )
end
end
local first = true
actId , act = next ( acts , nil )
while ( actId ~= nil ) do
local rtAct = context.ActIdToRtAct [ act.InstanceId ]
context.RtAct = rtAct
context.Act = act
local features = act.Features
assert ( features ~= nil or actId == " Keys " )
recursiveTranslate ( features , context )
context.Feature = act
act : translate ( context ) ;
-- scenario
if first then
first = false
context.Feature = scenario
scenario : translate ( context ) ;
end
actId , act = next ( acts , actId )
end
-- Location Id
local locationId , location = next ( scenario.Locations )
local locationIndex = 0
local locationMap = { }
locationMap [ " " ] = 0
while locationId do
local rtLocation = r2.newComponent ( " RtLocation " )
rtLocation.Island = location.IslandName
rtLocation.EntryPoint = location.EntryPoint
local enumToInt = { Automatic = 0 , Spring = 1 , Summer = 2 , Autumn = 3 , Winter = 4 }
rtLocation.Season = enumToInt [ location.Season ]
locationMap [ location.InstanceId ] = locationIndex
table.insert ( rtScenario.Locations , rtLocation )
locationIndex = locationIndex + 1
locationId , location = next ( scenario.Locations , locationId )
end
local startingAct = r2.Scenario . User.SelectedActInstanceId
-- Act Name, position
local actId , act = next ( acts , nil )
local actIndex = 0
while ( actId ~= nil )
do
local rtAct = context.ActIdToRtAct [ act.InstanceId ]
rtAct.Name = act.Name
rtAct.LocationId = locationMap [ act.LocationId ]
if startingAct and tostring ( act.InstanceId ) == startingAct then
r2.setStartingActIndex ( actIndex )
else
r2.setStartingActIndex ( 1 )
end
actIndex = actIndex + 1
actId , act = next ( acts , actId )
end
-- Ring accss
if ( r2.getMustVerifyRingAccessWhileLoadingAnimation ( ) ) then
do
local ok , level , err = r2.RingAccess . verifyScenario ( )
r2.updateScenarioAck ( ok , level , err.What )
end
local ok , err = r2.RingAccess . verifyRtScenario ( rtScenario )
if not ok then
printWarning ( err.What )
end
end
-- inspect(rtScenario)
return rtScenario
end
-- Returns a RtNpcEventHandlerAction if the action is allowed
--first parameter: action type
Translator.createAction = function ( ... )
local debug = config.R2EDExtendedDebug
local function header ( toto )
if debug then
return " print( \" < " .. toto .. " > \" ); \n "
end
return " // " .. toto
end
local function footer ( toto )
if debug then
return " print( \" </ " .. toto .. " > \" ); \n "
end
return " "
end
local action = r2.newComponent ( " RtNpcEventHandlerAction " )
local actionType = arg [ 1 ]
action.Action = actionType
action.Name = actionType
if actionType == " test_act " then
assert ( type ( arg [ 2 ] ) == " string " )
assert ( type ( arg [ 3 ] ) == " number " )
local rtGrpId = arg [ 2 ] -- scenario
local actId = arg [ 3 ] -- actId
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Action = " dynamic_if "
action.Parameters = prefix .. " CurrentAct == " .. tostring ( actId )
return action
end
if actionType == " wander_destination_reached " then
assert ( type ( arg [ 2 ] ) == " string " )
assert ( type ( arg [ 3 ] ) == " string " )
assert ( type ( arg [ 4 ] ) == " number " )
assert ( type ( arg [ 5 ] ) == " number " )
local rtGrpId = arg [ 2 ]
local states = arg [ 3 ]
local nextStep = arg [ 4 ]
local time = arg [ 5 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Action = " code "
action.Parameters =
" v2 = " .. nextStep .. " ; \n " ..
" ()setTimer( " .. 1 + 10 * time .. " , 0); \n "
return action
end
if actionType == " next_road " then
assert ( type ( arg [ 2 ] ) == " string " )
assert ( type ( arg [ 3 ] ) == " string " )
assert ( type ( arg [ 4 ] ) == " number " )
assert ( type ( arg [ 5 ] ) == " string " )
action.Action = " code "
local paramCount = tonumber ( arg [ 5 ] )
if paramCount == nil then
paramCount = " 0 "
end
paramCount = tostring ( paramCount )
action.Parameters =
[ [ // next_road
if ( ParamRepeatCount == 0 || ParamGroup.RoadCountLimit < ParamRepeatCount - 1 ) {
if ( ParamRepeatCount ! = 0 ) { ParamGroup.RoadCountLimit = ParamGroup.RoadCountLimit + 1 ; }
( ) ParamGroup.postNextState ( " ParamState " ) ;
} else {
ParamGroup.RoadCountLimit = 0 ;
ParamGroup.v2 = ParamActivityIndex ;
( ) ParamGroup.setTimer ( 1 , 0 ) ;
}
] ]
action.Parameters = string.gsub ( action.Parameters , " ParamGroup " , r2 : getNamespace ( ) .. tostring ( arg [ 2 ] ) )
action.Parameters = string.gsub ( action.Parameters , " ParamState " , r2 : getNamespace ( ) .. tostring ( arg [ 3 ] ) )
action.Parameters = string.gsub ( action.Parameters , " ParamActivityIndex " , tostring ( arg [ 4 ] ) )
action.Parameters = string.gsub ( action.Parameters , " ParamRepeatCount " , paramCount )
return action
end
if actionType == " trigger_zone_min_player " then
assert ( type ( arg [ 2 ] ) == " string " )
assert ( type ( arg [ 3 ] ) == " string " )
assert ( type ( arg [ 4 ] ) == " number " )
local rtGrpId = arg [ 2 ]
local states = arg [ 3 ]
local nbMinPlayer = arg [ 4 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Action = " dynamic_if "
if nbMinPlayer == 0 then
action.Parameters = prefix .. " Active == 1 && " .. prefix .. " NbPlayer == 0 "
else
action.Parameters = prefix .. " Active == 1 && " .. prefix .. " NbPlayer >= " .. tostring ( nbMinPlayer )
end
return action
end
if actionType == " on_player_arrived_impl " then
assert ( arg [ 2 ] )
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters = header ( actionType ) ..
" if ( " .. prefix .. " Active == 1 ) \n { \n " ..
" \t if ( " .. prefix .. " Cyclic == 1 ) \n " ..
" \t { \n " ..
" \t \t " .. prefix .. " Enter = 0 ; \n " ..
" \t \t () " .. prefix .. " setEvent(1); \n " ..
" \t } \n " ..
" \t else if ( " .. prefix .. " Enter == 1 ) \n " ..
" \t { \n " ..
" \t \t " .. prefix .. " Enter = 0; \n " ..
" \t \t " .. " () " .. prefix .. " setEvent(1); \n " ..
" \t } \n " ..
" } \n " ..
footer ( actionType )
action.Action = " code "
return action
end
if actionType == " on_player_left_impl " then
assert ( arg [ 2 ] )
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters = header ( actionType ) ..
" if ( " .. prefix .. " Active == 1 ) \n { \n " ..
" \t if ( " .. prefix .. " Cyclic == 1 ) \n " ..
" \t { \n " ..
" \t \t " .. prefix .. " Leave = 0 ; \n " ..
" \t \t () " .. prefix .. " setEvent(2); \n " ..
" \t } \n " ..
" \t else if ( " .. prefix .. " Leave == 1 ) \n " ..
" \t { \n " ..
" \t \t " .. prefix .. " Leave = 0; \n " ..
" \t \t " .. " () " .. prefix .. " setEvent(2); \n " ..
" \t } \n " ..
" } "
.. footer ( actionType )
action.Action = " code "
return action
end
if actionType == " trigger_zone_init " then
assert ( arg [ 2 ] )
assert ( arg [ 3 ] )
assert ( arg [ 4 ] )
local rtGrpId = arg [ 2 ]
local auto = arg [ 3 ]
local cyclic = arg [ 4 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters = header ( actionType ) ..
" \t " .. prefix .. " Active = " .. auto .. " ; \n " ..
" \t " .. prefix .. " Leave = " .. auto .. " ; \n " ..
" \t " .. prefix .. " Enter = " .. auto .. " ; \n " ..
" \t " .. prefix .. " Cyclic = " .. tostring ( cyclic ) .. " ; \n " ..
" if ( " .. prefix .. " Active == 1) \n " ..
" { \n " ..
" \t () " .. prefix .. " setEvent(4); \n " ..
" } \n " ..
footer ( actionType )
action.Action = " code "
return action
end
if actionType == " trigger_zone_activates " then
assert ( arg [ 2 ] )
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters = header ( actionType ) ..
" if ( " .. prefix .. " Active == 1) \n " ..
" { " ..
" \t () " .. prefix .. " setEvent(4); \n " ..
" } \n " ..
" else \n " ..
" { \n " ..
" \t " .. prefix .. " Active = 1 ; \n " ..
" \t " .. prefix .. " Leave = 1 ; \n " ..
" \t " .. prefix .. " Enter = 1 ; \n " ..
" () " .. prefix .. " setEvent(4); \n " ..
" } \n " ..
footer ( actionType )
action.Action = " code "
return action
end
if actionType == " trigger_zone_deactivates " then
assert ( arg [ 2 ] )
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters = header ( actionType ) ..
" \t " .. prefix .. " Active = 0 ; \n " ..
" \t " .. prefix .. " Leave = 0; \n " ..
" \t " .. prefix .. " Enter = 0; \n " ..
" () " .. prefix .. " setEvent(5); \n " ..
footer ( actionType )
action.Action = " code "
return action
end
if actionType == " act_starts " then
assert ( arg [ 2 ] )
assert ( arg [ 3 ] )
assert ( type ( arg [ 4 ] ) == " number " )
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local rtGrpId2 = arg [ 3 ]
local prefix2 = " "
if rtGrpId2 and rtGrpId2 ~= " " then
prefix2 = r2 : getNamespace ( ) .. rtGrpId2 .. " . "
end
action.Parameters = header ( actionType ) ..
" () " .. prefix .. " setTimer(50,0); \n " .. -- act start in 1 second
prefix2 .. " CurrentAct = " .. tostring ( arg [ 4 ] ) .. " ; \n " ..
" if ( " .. prefix2 .. " v0 == 0 ) \n " ..
" { \n " ..
" \t () " .. prefix2 .. " setTimer(50,0); \n " ..
" \t " .. prefix2 .. " v0 = 0; \n " ..
" \t () " .. prefix2 .. " setTimer(150, 1); \n " ..
" \t " .. prefix2 .. " ScenarioPoints = 0; \n " ..
" } \n " ..
footer ( actionType )
action.Action = " code "
return action
end
if actionType == " random_chest_activate " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local eggId = tostring ( tonumber ( arg [ 3 ] ) )
local actId = tostring ( tonumber ( arg [ 4 ] ) )
local x = tostring ( tonumber ( arg [ 5 ] ) )
local y = tostring ( tonumber ( arg [ 6 ] ) )
local z = tostring ( tonumber ( arg [ 7 ] ) )
local scenario = tostring ( r2 : getScenarioId ( ) )
local item1Weight = arg [ 8 ]
local item1Id = arg [ 9 ]
local item1Qty = arg [ 10 ]
local item1Str = " "
if item1Id and item1Id ~= " " then
item1Str = tostring ( item1Id ) .. " : " .. tostring ( item1Qty )
end
local item2Weight = arg [ 11 ]
local item2Id = arg [ 12 ]
local item2Qty = arg [ 13 ]
local item2Str = " "
if item2Id and item2Id ~= " " then
item2Str = tostring ( item2Id ) .. " : " .. tostring ( item2Qty )
end
local item3Weight = arg [ 14 ]
local item3Id = arg [ 15 ]
local item3Qty = arg [ 16 ]
local item3Str = " "
if item3Id and item3Id ~= " " then
item3Str = tostring ( item3Id ) .. " : " .. tostring ( item3Qty )
end
local name = arg [ 17 ]
local sum12 = tostring ( item1Weight + item2Weight )
local sum123 = tostring ( item1Weight + item2Weight + item3Weight )
action.Parameters = " //random_chest_activate \n "
.. " ( " .. prefix .. " r)rndm(0,100); \n "
.. " if ( " .. prefix .. " r > 0 && " .. prefix .. " r <= " .. tostring ( item1Weight ) .. " ) \n "
.. " { \n \t "
.. " () " .. prefix .. " activateEasterEgg( " .. eggId .. " , " .. scenario .. " , " .. actId .. " , \" " .. item1Str .. " \" , " .. x .. " , " .. y .. " , " .. z .. " , 0, \" " .. r2 : getNamespace ( ) .. rtGrpId .. " \" , \" " .. name .. " \" , \" \" ); \n "
.. " } \n "
.. " if ( " .. prefix .. " r > " .. item1Weight .. " && " .. prefix .. " r <= " .. sum12 .. " ) \n "
.. " { \n \t "
.. " () " .. prefix .. " activateEasterEgg( " .. eggId .. " , " .. scenario .. " , " .. actId .. " , \" " .. item2Str .. " \" , " .. x .. " , " .. y .. " , " .. z .. " , 0, \" " .. r2 : getNamespace ( ) .. rtGrpId .. " \" , \" " .. name .. " \" , \" \" ); \n "
.. " } \n "
.. " if ( " .. prefix .. " r > " .. sum12 .. " && " .. prefix .. " r <= " .. sum123 .. " ) \n "
.. " { \n \t "
.. " () " .. prefix .. " activateEasterEgg( " .. eggId .. " , " .. scenario .. " , " .. actId .. " , \" " .. item3Str .. " \" , " .. x .. " , " .. y .. " , " .. z .. " , 0, \" " .. r2 : getNamespace ( ) .. rtGrpId .. " \" , \" " .. name .. " \" , \" \" ); \n "
.. " } \n "
.. " () " .. prefix .. " setEvent(4); \n "
action.Action = " code "
return action
end
if actionType == " easter_egg_activate " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local eggId = tostring ( tonumber ( arg [ 3 ] ) )
local actId = tostring ( tonumber ( arg [ 4 ] ) )
local items = tostring ( arg [ 5 ] )
local x = tostring ( tonumber ( arg [ 6 ] ) )
local y = tostring ( tonumber ( arg [ 7 ] ) )
local z = tostring ( tonumber ( arg [ 8 ] ) )
local heading = tostring ( tonumber ( arg [ 9 ] ) )
local name = tostring ( arg [ 10 ] )
if not name then name = " " end
local look = arg [ 11 ]
if not look then look = " " end
local scenario = tostring ( r2 : getScenarioId ( ) )
assert ( eggId and scenario and items and x and y and z )
if not heading then heading = tostring ( 0 ) end
action.Parameters = " // " .. actionType .. " \n " ..
" () " .. prefix .. " activateEasterEgg( " .. eggId .. " , " .. scenario .. " , " .. actId .. " , \" " .. items .. " \" , " .. x .. " , " .. y .. " , " .. z .. " , " .. heading .. " , \" " .. r2 : getNamespace ( ) .. rtGrpId .. " \" , \" " .. name .. " \" , \" " .. look .. " \" ); \n " ..
" () " .. prefix .. " setEvent(4); \n "
action.Action = " code "
return action
end
if actionType == " easter_egg_deactivate " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local eggId = tostring ( tonumber ( arg [ 3 ] ) )
local actId = tostring ( tonumber ( arg [ 4 ] ) )
local scenario = tostring ( r2 : getScenarioId ( ) )
assert ( eggId and scenario )
action.Parameters = " // " .. actionType .. " \n " ..
" () " .. prefix .. " deactivateEasterEgg( " .. eggId .. " , " .. scenario .. " , " .. actId .. " ); \n " ..
" () " .. prefix .. " setEvent(5); \n "
action.Action = " code "
return action
end
if actionType == " dialog_starts " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters =
" // " .. actionType .. " \n " ..
" " .. prefix .. " start=1; \n " ..
" " .. prefix .. " v1=0; \n " .. -- intial time before start of dialog is kind of long because we don't want in a start of state that the targeted npc don't exist
" () " .. prefix .. " setTimer(10, " .. Logic.chatTimerId .. " ); \n " ..
" () " .. prefix .. " setEvent(1); " .. " \t //start of dialog \n "
action.Action = " code "
return action
end
if actionType == " dialog_continues " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters =
" // " .. actionType .. " \n " ..
" if ( " .. prefix .. " break == 1) { \n " ..
" \t () " .. prefix .. " setTimer(1, " .. Logic.chatTimerId .. " ); \n " ..
" } \n "
action.Action = " code "
return action
end
if actionType == " chat_starts " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
assert ( type ( arg [ 3 ] ) == " number " )
local index = tonumber ( arg [ 3 ] )
action.Parameters =
" // " .. actionType .. " \n " ..
" " .. prefix .. " start=1; \n " ..
" " .. prefix .. " v1= " .. tostring ( index + 1 ) .. " ; \n " ..
" () " .. prefix .. " setTimer(1, " .. Logic.chatTimerId .. " ); \n "
action.Action = " code "
return action
end
if actionType == " dialog_stops " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters =
" // " .. actionType .. " \n " ..
" " .. prefix .. " start=0; \n " ..
" () " .. prefix .. " setEvent(2); " .. " \t //end of dialog \n "
action.Action = " code "
return action
end
if actionType == " dialog_deactivate " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters = prefix .. " start = 0; \n "
.. prefix .. " Active = 0; \n "
action.Action = " code "
return action
end
if actionType == " dialog_init " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local mustRepeat = tonumber ( arg [ 3 ] )
local autoStart = tonumber ( arg [ 4 ] )
assert ( mustRepeat )
action.Parameters =
" // " .. actionType .. " \n " ..
" " .. prefix .. " repeat= " .. mustRepeat .. " ; \n " ..
" " .. prefix .. " AutoStart= " .. autoStart .. " ; \n "
--.."()"..prefix.."setEvent(5); // spawned\n"
action.Action = " code "
return action
end
if actionType == " chat_step_first " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local initialWait = tonumber ( arg [ 3 ] )
assert ( initialWait )
action.Parameters =
" // " .. actionType .. " \n " ..
prefix .. Logic.chatStepVar .. " = 1; \n " ..
" () " .. prefix .. " setTimer( " .. tostring ( initialWait * 10 + 1 ) .. " , " .. Logic.chatTimerId .. " ); \n " ..
" () " .. prefix .. " setEvent(3); " .. " \t //start of chat \n "
action.Action = " code "
return action
end
if actionType == " chat_step_last " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local nbParam = arg [ 3 ]
assert ( nbParam and type ( nbParam ) == " number " )
action.Parameters =
" // " .. actionType .. " \n " ..
prefix .. Logic.chatStepVar .. " = " .. tostring ( 1 + nbParam ) .. " ; \n " .. --set because of setEvent
" () " .. prefix .. " setEvent(4); \n " ..
" if ( " .. prefix .. " repeat == 1) { \n " ..
" \t " .. prefix .. " start=1; \n " ..
" \t " .. prefix .. Logic.chatStepVar .. " =0; \n " ..
" \t () " .. prefix .. " setTimer(4, " .. Logic.chatTimerId .. " ); \n " ..
" \t () " .. prefix .. " setEvent(2); " .. " \t //end of dialog \n " ..
" \t () " .. prefix .. " setEvent(1); " .. " \t //start of dialog \n " ..
" } else { \n " ..
" \t " .. prefix .. " start=0; \n " ..
" \t () " .. prefix .. " setEvent(2); " .. " \t //end of dialog \n " ..
" } \n "
action.Action = " code "
return action
end
if actionType == " chat_step " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local param = arg [ 3 ]
assert ( type ( param ) == " table " )
--local m_action = action
--m_action.Action = "multi_actions"
local say = " "
local emote = " "
local facing = " "
local startChat = " () " .. prefix .. " setTimer(2, 0); \n \n " -- timer 0.4 in on seconde
-- create facing action
if param.Facing ~= " " and param.Facing ~= nil and param.Who ~= nil
then
facing = " //facing \n " ..
" (@group1) " .. r2 : getNamespace ( ) .. param.WhoGrp .. " .context(); \n "
.. " (@group2) " .. r2 : getNamespace ( ) .. param.FacingGrp .. " .context(); \n "
.. " () " .. r2 : getNamespace ( ) .. rtGrpId .. " .facing(@group1, \" " .. param.Who .. " \" , @group2, \" " .. param.Facing .. " \" ); \n \n "
startChat = " () " .. prefix .. " setTimer(10, 0); \n \n " -- timer 0.4 in on seconde
end
local mustBreak = prefix .. " break = " .. tostring ( param.Break ) .. " ; \n "
if param.Break == 0 then
mustBreak = mustBreak ..
" () " .. prefix .. " setTimer( " .. tostring ( 4 + 10 * tonumber ( param.Time ) ) .. " , " .. Logic.chatTimerId .. " ); \n \n "
else
mustBreak = mustBreak .. " \n "
end
do
-- local action = r2.newComponent("RtNpcEventHandlerAction")
action.Action = " code "
action.Parameters =
" // " .. actionType .. " - ChatStep " .. tostring ( param.Index ) .. " \n " ..
prefix .. " step = " .. tostring ( param.Index ) .. " ; \n \n " ..
say .. facing .. emote ..
" //set next chat step \n " ..
mustBreak ..
prefix .. Logic.chatStepVar .. " = " .. param.Index .. " + 1; \n \n " ..
startChat ..
" () " .. prefix .. " setTimer(25, 2); \n \n " .. -- timer 0.9 in on seconde
" //End of dialog \n " ..
" () " .. prefix .. " setEvent(4); \n \n "
-- table.insert(m_action.Children, action)
end
return action
end
if actionType == " chat_step_end " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local param = arg [ 3 ]
assert ( type ( param ) == " table " )
local baseActRtGrpId = arg [ 4 ]
assert ( type ( baseActRtGrpId ) == " string " )
if ( table.getn ( param.Emotes ) == 0 ) then return nil end
local code =
" // lauch emote at end of chat step \n \n " ..
" if ( " .. prefix .. " start == 1) \n " ..
" { \n " ..
" \t switch ( " .. prefix .. " step ) \n " ..
" \t { \n "
local i = 0
local n = table.getn ( param.Emotes )
while i ~= n do
i = i + 1
if param.WhoNoEntitys [ i ] == " _System " or param.WhoNoEntitys [ i ] == " _DM " then
local say = " "
who = " System "
local msg = param.Says [ i ]
if not msg then msg = " " end
if param.WhoNoEntitys [ i ] == " _DM " then
say = " \t \t \t " .. " () " .. r2 : getNamespace ( ) .. baseActRtGrpId .. " .dssMessage( " .. tostring ( r2 : getScenarioId ( ) ) .. " , "
.. " \" DM \" , \" " .. who .. " \" , \" " .. msg .. " \" ); \n \n "
else
--avoid to display "system :" when a system msg is broadcasted
who = " "
say = " \t \t \t " .. " () " .. r2 : getNamespace ( ) .. baseActRtGrpId .. " .dssMessage( " .. tostring ( r2 : getScenarioId ( ) ) .. " , "
.. " \" SYS \" , \" " .. who .. " \" , \" " .. msg .. " \" ); \n \n "
end
code = code ..
" \t \t " .. " case " .. param.Indexs [ i ] .. " : \n " ..
" \t \t " .. " { \n " ..
say ..
" \t \t " .. " } \n \n "
elseif rtGrpId and param.Whos [ i ] and param.Whos [ i ] ~= " " and param.Grps [ i ] and param.Grps [ i ] ~= " " then
local say = " "
if param.Says [ i ] ~= nil and param.Says [ i ] ~= " " then
say = " \t \t \t " .. " () " .. r2 : getNamespace ( ) .. rtGrpId .. " .npcSay(@group, \" " .. param.Whos [ i ] .. " \" , \" DSS_ " .. tostring ( r2 : getScenarioId ( ) ) .. " " .. param.Says [ i ] .. " \" ); \n \n "
end
local emote = " "
if param.Emotes [ i ] ~= " " and param.Emotes [ i ] ~= nil then
local behaviorValue = r2.getEmoteBehaviorFromEmoteId ( param.Emotes [ i ] )
emote = " \t \t \t " .. " () " .. r2 : getNamespace ( ) .. rtGrpId .. " .emote(@group, \" " .. param.Whos [ i ] .. " \" , \" " .. behaviorValue .. " \" ); \n "
end
code = code ..
" \t \t " .. " case " .. param.Indexs [ i ] .. " : \n " ..
" \t \t " .. " { \n " ..
" \t \t \t " .. " (@group) " .. r2 : getNamespace ( ) .. param.Grps [ i ] .. " .context(); \n \n " ..
say ..
emote ..
" \t \t " .. " } \n \n "
end
end
code = code .. " \t } \n } "
action.Action = " code "
action.Parameters = code
return action
end
--BROADCAST
if actionType == " broadcast_msg " then
local baseActRtGrpId = arg [ 2 ]
assert ( baseActRtGrpId )
assert ( type ( baseActRtGrpId ) == " string " )
local msg = arg [ 3 ]
assert ( msg )
assert ( type ( msg ) == " string " )
local who = " "
action.Parameters = " () " .. r2 : getNamespace ( ) .. baseActRtGrpId .. " .dssMessage( " .. tostring ( r2 : getScenarioId ( ) ) .. " , "
.. " \" SYS \" , \" " .. who .. " \" , \" " .. msg .. " \" ); \n "
action.Action = " code "
return action
end
--QUEST ACTIONS
if actionType == " validate_quest_step " then
local questRtGrpId = arg [ 2 ]
local prefix = " "
if questRtGrpId and questRtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. questRtGrpId .. " . "
end
local taskRtIds = arg [ 3 ]
local nbTasks = table.getn ( taskRtIds )
action.Parameters =
[ [
if ( ] ] .. prefix .. [ [ v2 ! = 0 )
{
switch ( ] ] .. prefix .. [ [ v2 )
{
] ]
--the case (1) never happens : when the quest begins and when the first task is completed, the step index
--is incremented before the action "validate_quest_step"
--
local i
for i = 2 , nbTasks do
action.Parameters = action.Parameters ..
[ [
case ] ] .. tostring ( i ) .. [ [ :
{
if ( ] ] .. taskRtIds [ i - 1 ] .. [ [ Active == 1 )
{
] ] .. taskRtIds [ i - 1 ] .. [ [ Active = 0 ;
( ) ] ] .. taskRtIds [ i - 1 ] .. [ [ setEvent ( 5 ) ;
}
( ) ] ] .. taskRtIds [ i ] .. [ [ setEvent ( 7 ) ;
] ] .. taskRtIds [ i ] .. [ [ Active = 1 ;
( ) ] ] .. taskRtIds [ i ] .. [ [ setEvent ( 4 ) ;
}
] ]
end
--last task
action.Parameters = action.Parameters ..
[ [
// default is only used by the last step of the quest
case ] ] .. tostring ( nbTasks + 1 ) .. [ [ :
{
if ( ] ] .. taskRtIds [ nbTasks ] .. [ [ Active == 1 )
{
] ] .. taskRtIds [ nbTasks ] .. [ [ Active = 0 ;
( ) ] ] .. taskRtIds [ nbTasks ] .. [ [ setEvent ( 5 ) ;
}
// if the quest is repeatable
if ( ] ] .. prefix .. [ [ v1 == 1 )
{
// resetting the index to 1 for first quest step
] ] .. prefix .. [ [ v2 = 1 ;
// ( ) ] ] .. taskRtIds [ 1 ] .. [ [ setEvent ( 7 ) ;
] ] .. taskRtIds [ 1 ] .. [ [ Active = 1 ;
( ) ] ] .. taskRtIds [ 1 ] .. [ [ setEvent ( 4 ) ;
}
else
{
] ] .. prefix .. [ [ v2 = 0 ;
}
( ) ] ] .. prefix .. [ [ setEvent ( 8 ) ;
}
} // ! switch
} // ! if
] ]
action.Action = " code "
return action
end
if actionType == " increment_quest_step_index " then
local currentNamespace = r2 : getNamespace ( )
local questRtGrpId = arg [ 2 ]
local prefix = " "
if questRtGrpId and questRtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. questRtGrpId .. " . "
end
local currentTaskIndex = arg [ 3 ]
action.Parameters = " if ( " .. prefix .. " v2 == " .. tostring ( currentTaskIndex ) .. " ) \n "
.. " { \n "
.. " \t " .. prefix .. " v2 = " .. prefix .. " v2 + 1; \n "
.. " \t () " .. prefix .. " setEvent(9); \n "
.. " } "
action.Action = " code "
return action
end
if actionType == " request_item " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local grpName = r2 : getNamespace ( ) .. rtGrpId
local items = tostring ( arg [ 3 ] )
assert ( items )
local phrase = tostring ( arg [ 4 ] )
assert ( phrase )
if phrase == " " then phrase = " Ok " end
action.Parameters =
" // request_item \n "
.. " (@groupToNotify) " .. grpName .. " .context(); \n "
.. " ()receiveMissionItems( \" " .. items .. " \" , \" " .. phrase .. " \" , @groupToNotify); \n "
action.Action = " code "
return action
end
if actionType == " give_item " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local grpName = r2 : getNamespace ( ) .. rtGrpId
local items = tostring ( arg [ 3 ] )
assert ( items )
local phrase = tostring ( arg [ 4 ] )
assert ( phrase )
if phrase == " " then phrase = " Ok " end
action.Parameters =
" // give_item \n "
.. " (@groupToNotify) " .. grpName .. " .context(); \n "
.. " ()giveMissionItems( \" " .. items .. " \" , \" " .. phrase .. " \" , @groupToNotify); \n "
action.Action = " code "
return action
end
if actionType == " give_reward " then
local rtGiverGrpId = arg [ 2 ]
local rtGiverName = arg [ 3 ]
local rtGiverGrpName = r2 : getNamespace ( ) .. rtGiverGrpId
local texts = arg [ 4 ]
local rewardText = texts [ " rewardText " ]
local rareRewardText = texts [ " rareRewardText " ]
local inventoryFullText = texts [ " inventoryFullText " ]
local notEnoughPointsText = texts [ " notEnoughPointsText " ]
local textsArgs = " \" " .. rewardText .. " \" , "
.. " \" " .. rareRewardText .. " \" , "
.. " \" " .. inventoryFullText .. " \" , "
.. " \" " .. notEnoughPointsText .. " \" "
action.Parameters = " //Give reward (giver : ' " .. rtGiverName .. " ') \n "
.. " (@groupToNotify) " .. rtGiverGrpName .. " .context(); \n "
.. " ()giveReward( " .. textsArgs .. " , @groupToNotify); \n "
action.Action = " code "
return action
end
if actionType == " teleport_near " then
local rtGiverGrpId = arg [ 2 ]
local rtGiverGrpName = r2 : getNamespace ( ) .. rtGiverGrpId
local uniqId = arg [ 3 ]
local x = arg [ 4 ]
local y = arg [ 5 ]
local z = arg [ 6 ]
action.Parameters = " //teleport Near \n "
.. " (@groupToNotify) " .. rtGiverGrpName .. " .context(); \n "
.. " ()teleportNear( " .. tostring ( x ) .. " , " .. tostring ( y ) .. " , " .. tostring ( z ) .. " , @groupToNotify); \n "
action.Action = " code "
return action
end
if actionType == " talk_to " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local grpName = r2 : getNamespace ( ) .. rtGrpId
local phrase = tostring ( arg [ 3 ] )
assert ( phrase )
if phrase == " " then phrase = " Ok " end
action.Parameters =
" // talk_to \n "
.. " (@groupToNotify) " .. grpName .. " .context(); \n "
.. " ()talkTo( \" " .. phrase .. " \" , @groupToNotify); \n "
action.Action = " code "
return action
end
if actionType == " set_value " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local variable = tostring ( arg [ 3 ] )
assert ( variable )
--local variableLen = string.len(variable)
--assert(variableLen < 8)
--variable = string.lower(variable)
local i = 0 ;
assert ( type ( arg [ 4 ] ) == ' number ' or type ( arg [ 4 ] ) == ' string ' )
local value = arg [ 4 ]
action.Parameters = prefix .. variable .. " = " .. value .. " ; \n "
action.Action = " code "
return action
end
--called each time some scenario points
if actionType == " add_scenario_points " then
--scenario rtId
local rtBaseActId = arg [ 2 ]
local points = arg [ 3 ]
local prefix = " "
if rtBaseActId and rtBaseActId ~= " " then
prefix = r2 : getNamespace ( ) .. rtBaseActId .. " . "
end
action.Parameters = prefix .. " ScenarioPoints = " .. prefix .. " ScenarioPoints + " .. tostring ( points ) .. " ; \n "
action.Action = " code "
return action
end
--called every 30 seconds or so to avoid sending network msg each time some points are added
if actionType == " set_scenario_points " then
local rtScenarioId = tostring ( r2 : getScenarioId ( ) )
local rtBaseActId = arg [ 2 ]
local prefix = " "
if rtBaseActId and rtBaseActId ~= " " then
prefix = r2 : getNamespace ( ) .. rtBaseActId .. " . "
end
action.Parameters = " ()setScenarioPoints( " .. rtScenarioId .. " , " .. prefix .. " ScenarioPoints); \n "
.. " () " .. prefix .. " setTimer(300,1); \n "
action.Action = " code "
return action
end
if actionType == " start_scenario_timing " then
local rtScenarioId = tostring ( r2 : getScenarioId ( ) )
action.Parameters = " ()startScenarioTiming( " .. rtScenarioId .. " ); \n "
action.Action = " code "
return action
end
if actionType == " stop_scenario_timing " then
local rtScenarioId = tostring ( r2 : getScenarioId ( ) )
action.Parameters = " ()endScenarioTiming( " .. rtScenarioId .. " ); \n "
action.Action = " code "
return action
end
if actionType == " if_value_equal " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local variable = tostring ( arg [ 3 ] )
assert ( variable )
local variableLen = string.len ( variable )
--variable = string.lower(variable)
local i = 0 ;
assert ( type ( arg [ 4 ] ) == ' number ' )
local value = arg [ 4 ]
action.Parameters = prefix .. variable .. " == " .. value
if ( arg [ 5 ] ~= nil ) then
assert ( type ( arg [ 5 ] ) == ' table ' )
local value = arg [ 4 ]
action.Parameters = prefix .. variable .. " == " .. value
table.insert ( action.Children , arg [ 5 ] )
end
action.Action = " dynamic_if "
return action
end
-- "validate_task" is used when the player completed part of a mission but didn't come back to the mission giver
if actionType == " validate_task " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters = " //validateTask \n "
.. " if ( " .. prefix .. " Active == 1 && " .. prefix .. " v2 == 1 ) \n "
.. " { "
.. " \n \t " .. prefix .. " v2 = 2; \n \t "
.. " () " .. prefix .. " setEvent(8); \n "
.. " } "
action.Action = " code "
return action
end
-- "complete_mission" is used when the player comes back to the mission giver after having validated the mission.
if actionType == " complete_mission " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters = " //complete_mission \n "
.. " if ( " .. prefix .. " Active == 1) \n "
.. " { "
.. " \n \t " .. prefix .. " v2 = 2; \n \t "
.. " () " .. prefix .. " setEvent(9); \n "
.. " } "
action.Action = " code "
return action
end
if string.find ( actionType , " timer_ " ) ~= nil
then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local timer = tonumber ( arg [ 3 ] )
assert ( 0 <= timer and timer <= 3 )
if actionType == " timer_trigger " then
action.Parameters = " () " .. prefix .. " setTimer(4, " .. timer .. " ); \n "
elseif actionType == " timer_disable " then
action.Parameters = " () " .. prefix .. " timerDisable( " .. timer .. " ); \n "
.. prefix .. " Active = 0; "
elseif actionType == " timer_suspend " then
action.Parameters = " () " .. prefix .. " timerSuspend( " .. timer .. " ); \n "
elseif actionType == " timer_resume " then
action.Parameters = " () " .. prefix .. " timerResume( " .. timer .. " ); \n "
elseif actionType == " timer_enable " then
printWarning ( " timerEnable is not implemented in AIS! " )
action.Parameters = " () " .. prefix .. " timerEnable( " .. timer .. " ); \n " -- !!!NOT IMPLEMENTED IN AIS!!!
elseif actionType == " timer_is_enable " then
action.Parameters = " ( " .. prefix .. " is_enable " .. " ) " .. prefix .. " timerIsEnabled( " .. timer .. " ); \n "
elseif actionType == " timer_is_suspended " then
action.Parameters = " ( " .. prefix .. " is_suspended " .. " ) " .. prefix .. " timerIsSuspended( " .. timer .. " ); \n "
elseif actionType == " timer_add " or actionType == " timer_sub " then
local wait = tonumber ( arg [ 4 ] )
assert ( wait and 0 <= wait )
wait = wait * 10 + 4
if actionType == " timer_sub " then
action.Parameters = " () " .. prefix .. " timerAdd( " .. timer .. " , " .. - wait .. " ); \n "
else
action.Parameters = " () " .. prefix .. " timerAdd( " .. timer .. " , " .. wait .. " ); \n "
end
elseif actionType == " timer_set " then
local wait = tonumber ( arg [ 4 ] )
assert ( wait and 0 <= wait )
wait = wait * 10 + 4
action.Parameters = " () " .. prefix .. " setTimer( " .. wait .. " , " .. timer .. " ); \n "
.. prefix .. " Active = 1; \n "
elseif actionType == " timer_set_daytime " then
local hours = tonumber ( arg [ 4 ] )
local minutes = tonumber ( arg [ 5 ] )
assert ( hours and 0 <= hours and hours <= 23 )
assert ( minutes and 0 <= minutes and minutes <= 60 )
action.Parameters = " () " .. prefix .. " timerSetRyzomDaytime( " .. timer .. " , " .. hours .. " , " .. minutes .. " ); \n "
else
debugInfo ( colorTag ( 255 , 0 , 0 ) .. " Unhandeld action ' " .. actionType .. " ' " )
assert ( nil )
end
action.Action = " code "
return action
end
-------------------------------------
-- Counter feature
-------------------------------------
if string.find ( actionType , " counter_ " ) ~= nil
then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
--
-- Action "Init": initializes the counter by storing the initial counter value in v1
-- and the triggerValue in v2.
--
if actionType == " counter_init " then
local value = arg [ 3 ]
local triggerValue = arg [ 4 ]
action.Parameters = prefix .. " v0 = 1; \n "
.. prefix .. " v1 = " .. value .. " ; \n "
.. prefix .. " v2 = " .. triggerValue .. " ; \n "
end
--
-- Action "increment": checks wether the counter is active or not (var v0 used as a boolean),
-- then increment the counter and enventually checks if the triggerValue (stored in v2) has
-- been reached to trigger a userEvent.
--
if actionType == " counter_inc " then
action.Name = " counter_inc "
action.Parameters = " if ( " .. prefix .. " v0 == 1) \n "
.. " { \n \t if ( " .. prefix .. " v1 >= 0) \n "
.. " \t { \n "
.. " \t \t " .. prefix .. " v1 = " .. prefix .. " v1 + 1; \n "
.. " \t \t if ( " .. prefix .. " v1 == " .. prefix .. " v2) \n "
.. " \t \t { \n "
.. " \t \t \t " .. prefix .. " e=3; \n "
.. " \t \t \t () " .. prefix .. " setEvent(0); \n "
.. " \t \t } \n "
.. " \t } \n } "
--.. "()"..prefix..'debug("v0=");'.."\n"
--.. "()"..prefix..'debug('..prefix..'v0'..');'.."\n"
--.. "()"..prefix..'debug("v1=");'.."\n"
--.. "()"..prefix..'debug('..prefix..'v1'..');'.."\n"
--.. "()"..prefix..'debug("v2=");'.."\n"
--.. "()"..prefix..'debug('..prefix..'v2'..');'.."\n"
end
--
-- Action "decrement": works the same as increment (checks if the counter can be decremented)
--
if actionType == " counter_dec " then
action.Name = " counter_dec "
action.Parameters = " if ( " .. prefix .. " v0 == 1) \n "
.. " { \n \t if ( " .. prefix .. " v1 > 0) \n "
.. " \t { \n "
.. " \t \t " .. prefix .. " v1 = " .. prefix .. " v1 - 1; \n "
.. " \t \t if ( " .. prefix .. " v1 == " .. prefix .. " v2) \n "
.. " \t \t { \n "
.. " \t \t \t " .. prefix .. " e=3; \n "
.. " \t \t \t () " .. prefix .. " setEvent(0); \n "
.. " \t \t } \n "
.. " \t } \n } \n "
.. " () " .. prefix .. ' debug("v0="); ' .. " \n "
.. " () " .. prefix .. ' debug( ' .. prefix .. ' v0 ' .. ' ); ' .. " \n "
.. " () " .. prefix .. ' debug("v1="); ' .. " \n "
.. " () " .. prefix .. ' debug( ' .. prefix .. ' v1 ' .. ' ); ' .. " \n "
.. " () " .. prefix .. ' debug("v2="); ' .. " \n "
.. " () " .. prefix .. ' debug( ' .. prefix .. ' v2 ' .. ' ); ' .. " \n "
end
if actionType == " counter_enable " then
action.Name = " counter_enable "
action.Parameters = prefix .. " v0 = 1; \n "
end
if actionType == " counter_disable " then
action.Name = " counter_disable "
action.Parameters = prefix .. " v0 = 0; \n "
end
if actionType == " counter_trigger " then
end
action.Action = " code "
if actionType == " counter_is_enable " then
action.Name = " counter_is_enable "
action.Action = " dynamic_if "
action.Parameters = prefix .. " v0 == 1 \n "
end
return action
end
-------------------------------------
-- GiveItem Feature
-------------------------------------
if string.find ( actionType , " giveItem_ " ) ~= nil
then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
if actionType == " giveItem_init " then
local qty = arg [ 3 ]
--local triggerValue = arg[4]
action.Parameters = prefix .. " v0 = 1; \n "
.. prefix .. " v1 = " .. qty .. " ; \n "
--..prefix.."v2 = "..triggerValue..";\n"
end
if actionType == " giveItem_enable " then
action.Name = " giveItem_enable "
action.Parameters = prefix .. " v0 = 1; \n "
end
if actionType == " giveItem_disable " then
action.Name = " giveItem_disable "
action.Parameters = prefix .. " v0 = 0; \n "
end
action.Action = " code "
if actionType == " giveItem_is_enable " then
action.Name = " giveItem_is_enable "
action.Action = " dynamic_if "
action.Parameters = prefix .. " v0 == 1 \n "
end
return action
end
-------------------------------------
-- RequestItem Feature
-------------------------------------
if string.find ( actionType , " requestItem_ " ) ~= nil
then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
if actionType == " requestItem_init " then
local qty = arg [ 3 ]
--local triggerValue = arg[4]
action.Parameters = prefix .. " v0 = 1; \n "
.. prefix .. " v1 = " .. qty .. " ; \n "
--..prefix.."v2 = "..triggerValue..";\n"
end
if actionType == " requestItem_enable " then
action.Name = " requestItem_enable "
action.Parameters = prefix .. " v0 = 1; \n "
end
if actionType == " requestItem_disable " then
action.Name = " requestItem_disable "
action.Parameters = prefix .. " v0 = 0; \n "
end
action.Action = " code "
if actionType == " requestItem_is_enable " then
action.Name = " requestItem_is_enable "
action.Action = " dynamic_if "
action.Parameters = prefix .. " v0 == 1 \n "
end
return action
end
if actionType == " bot_init " then
function indent ( s )
s = " \t " .. string.gsub ( s , " \n " , " \n \t " )
return s
end
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
assert ( type ( arg [ 3 ] ) == " string " )
assert ( type ( arg [ 4 ] ) == " number " )
assert ( type ( arg [ 5 ] ) == " number " )
assert ( type ( arg [ 6 ] ) == " number " )
local category = tostring ( arg [ 3 ] )
local aggroDist = tonumber ( arg [ 4 ] )
local botAttackable = tonumber ( arg [ 5 ] )
local playerAttackable = tonumber ( arg [ 6 ] )
local action = r2.Translator . createAction ( " faction_init " , rtGrpId , category , aggroDist , botAttackable , playerAttackable )
local code = action.Parameters
code = indent ( code )
action.Parameters = " if ( " .. prefix .. " factInit != 1) \n { \n " .. code .. prefix .. " factInit = 1; \n } \n "
return action
end
if actionType == " faction_init " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
assert ( type ( arg [ 3 ] ) == " string " )
assert ( type ( arg [ 4 ] ) == " number " )
assert ( type ( arg [ 5 ] ) == " number " )
assert ( type ( arg [ 6 ] ) == " number " )
local category = tostring ( arg [ 3 ] )
local aggroDist = tonumber ( arg [ 4 ] )
local botAttackable = tonumber ( arg [ 5 ] )
local playerAttackable = tonumber ( arg [ 6 ] )
local code = " "
code = code .. " () " .. prefix .. " setActivity( \" faction \" ); \n "
if category == " Civil " then
if botAttackable == 1 then
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" guard \" ); \n " -- don't assist
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n " -- don't assist
end
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
elseif category == " Guard " then
if botAttackable == 0 then
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" Player \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" guard \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" Player|guard \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" bandit|carnivore|kitin \" ); \n "
end
elseif category == " Karavan " then
if botAttackable == 0 then
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" Player \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" karavan \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" Player|karavan \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" bandit|carnivore|kitin|plant|kitinWorker \" ); \n "
end
elseif category == " Kami " then
if botAttackable == 0 then
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" Player \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" kami \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" Player|kami \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" bandit|kitin|kitinWorker \" ); \n "
end
elseif category == " Bandit " then
if botAttackable == 0 then
code = code .. " ()setFactionProp( \" faction \" , \" civil \" ); \n "
if playerAttackable == 1 then
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" Player \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
end
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" bandit \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" bandit \" ); \n "
if playerAttackable == 1 then
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" Player|guard|karavan|kami \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" guard|karavan|kami \" ); \n "
end
end
elseif category == " Carnivore " then
if botAttackable == 0 then
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n "
if playerAttackable == 1 then
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" Player \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
end
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" carnivore \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
if playerAttackable == 1 then
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" Player|guard|bandit|herbivore|karavan \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" guard|bandit|herbivore|karavan \" ); \n "
end
end
elseif category == " Herbivore " then
if botAttackable == 0 then
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" herbivore \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
end
elseif category == " Plant " then
if botAttackable == 0 then
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" plant \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" plant \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
end
elseif category == " Degen " then
if botAttackable == 0 then
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" degen \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" degen \" ); \n "
if playerAttackable == 1 then
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" Player|guard|bandit|plant|herbivore|carnivore|kitin|kitinWorker|kami|karavan \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" guard|bandit|plant|herbivore|carnivore|kitin|kitinWorker|kami|karavan \" ); \n "
end
end
elseif category == " WorkerKitin " then
if botAttackable == 0 then
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" kitinWorker \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" kitin|kitinWorker \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
end
elseif category == " SoldierKitin " then
if botAttackable == 0 then
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n "
if playerAttackable == 1 then
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" Player \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
end
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" kitin \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" kitin|kitinWorker \" ); \n "
if playerAttackable == 1 then
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" Player|guard|bandit|karavan|kami \" ); \n "
else
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" guard|bandit|karavan|kami \" ); \n "
end
end
else
code = code .. " () " .. prefix .. " setFactionProp( \" faction \" , \" civil \" ); \n " -- don't assist
code = code .. " () " .. prefix .. " setFactionProp( \" ennemyFaction \" , \" \" ); \n "
code = code .. " () " .. prefix .. " setFactionProp( \" friendFaction \" , \" \" ); \n "
end
code = code .. " () " .. prefix .. " setAggro( " .. tostring ( aggroDist ) .. " , 20); \n "
action.Parameters = code
action.Action = " code "
return action
end
--set player_attackable
if actionType == " set_player_attackable " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
assert ( type ( arg [ 3 ] ) == " number " )
local playerAttackable = arg [ 3 ]
action.Parameters = " () " .. prefix .. " setPlayerAttackable( " .. playerAttackable .. " ); "
action.Action = " code "
return action
end
--set bot_attackable
if actionType == " set_bot_attackable " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
assert ( type ( arg [ 3 ] ) == " number " )
local botAttackable = arg [ 3 ]
action.Parameters = " () " .. prefix .. " setBotAttackable( " .. botAttackable .. " ); "
action.Action = " code "
return action
end
--make a npc run
if actionType == " set_running_speed " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters = " () " .. prefix .. " addPersistentProfileParameter( \" running \" ); "
action.Action = " code "
return action
end
--make a npc walk
if actionType == " set_walking_speed " then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
action.Parameters = " () " .. prefix .. " removePersistentProfileParameter( \" running \" ); "
action.Action = " code "
return action
end
if actionType == " generic_event_trigger "
then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local eventId = tonumber ( arg [ 3 ] )
assert ( eventId and 0 <= eventId and eventId <= 9 )
action.Parameters = prefix .. " e= " .. eventId .. " ; \n " ..
" () " .. prefix .. " setEvent(0); \n "
action.Action = " code "
return action
end
if actionType == " user_event_trigger "
then
local rtGrpId = arg [ 2 ]
local prefix = " "
if rtGrpId and rtGrpId ~= " " then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local eventId = tonumber ( arg [ 3 ] )
assert ( eventId and 0 <= eventId and eventId <= 9 )
action.Parameters = " () " .. prefix .. " setEvent( " .. eventId .. " ); \n "
action.Action = " code "
return action
end
-- generci_event
--
if actionType == " dssStartAct " then
local actId = tonumber ( arg [ 2 ] )
assert ( actId )
local sessionId = r2 : getScenarioId ( )
assert ( sessionId )
action.Action = " code "
action.Parameters = " ()dssStartAct( " .. sessionId .. " , " .. actId .. " ); \n "
return action , action
end
--trigger_event action
if string.find ( actionType , " trigger_event_%d " ) ~= nil
then
action.Parameters = arg [ 2 ]
return action
end
--spawn/despawn action
if ( actionType == " null_action " )
then
return action
end
if actionType == " spawn " then
local rtNpcGrpId = arg [ 2 ]
action.Action = " code "
local prefix = " "
if rtNpcGrpId then
prefix = r2 : getNamespace ( ) .. rtNpcGrpId .. " . "
end
action.Parameters = " () " .. prefix .. actionType .. " (); "
return action
end
if actionType == " despawn " then
local rtNpcGrpId = arg [ 2 ]
action.Action = " code "
local prefix = " "
if rtNpcGrpId then
prefix = r2 : getNamespace ( ) .. rtNpcGrpId .. " . "
end
action.Parameters = " () " .. prefix .. actionType .. " (0); "
return action
end
if ( actionType == " sit_down " ) or ( actionType == " stand_up " ) then
local rtGrpId = arg [ 2 ]
action.Action = " code "
local prefix = " "
if rtGrpId then
prefix = r2 : getNamespace ( ) .. rtGrpId .. " . "
end
local sitting = 0
if actionType == " sit_down " then
sitting = 1
end
if sitting == 1 then
action.Parameters =
" () " .. prefix .. " sitDown(); \n " ..
" () " .. prefix .. " setTimer(40,1); \n " -- wait 4 second
.. prefix .. " isSitting = " .. tostring ( sitting ) .. " ; "
else
action.Parameters =
" () " .. prefix .. " standUp(); \n " ..
" () " .. prefix .. " setTimer(40,1); \n " -- wait 4 second
.. prefix .. " isSitting = " .. tostring ( sitting ) .. " ; "
end
end
--multi actions
if actionType == " multi_actions " then
local actions = arg [ 2 ]
if actions ~= nil then
local max = table.getn ( actions )
for i = 1 , max do
assert ( actions [ i ] )
table.insert ( action.Children , actions [ i ] )
end
end
return action
end
--say action
if actionType == " say "
then
action.Parameters = " say: " .. arg [ 2 ]
return action
end
if actionType == " switch_actions "
then
action.Parameters = arg [ 2 ]
return action
end
--npc_say action
if actionType == " npc_say "
then
action.Parameters = " "
local str = arg [ 2 ]
if str == nil then str = " \n " end
if ( string.find ( str , " \n " ) == nil ) then
str = str .. " \n "
end
if ( table.getn ( arg ) == 3 )
then
assert ( arg [ 3 ] )
assert ( tostring ( arg [ 3 ] ) )
action.Parameters = tostring ( arg [ 3 ] ) .. " \n "
end
action.Parameters = action.Parameters .. str
return action
end
--emot action
if actionType == " emot "
then
local max = table.getn ( arg )
debugInfo ( colorTag ( 255 , 0 , 0 , 255 ) .. " action emot " )
local parameters = " "
for i = 2 , max do
parameters = parameters .. arg [ i ]
parameters = parameters .. " \n "
end
action.Parameters = parameters
return action
end
--if action
--arg2: expression
--arg3: action if expression is true
--arg4(optional): action if expression false
if ( actionType == " condition_if " ) or ( actionType == " condition_if_else " ) or ( actionType == " dynamic_if " )
then
local max = table.getn ( arg )
if max == 4 then
-- action.Action="dynamic_if_else"
action.Action = " dynamic_if "
table.insert ( action.Children , arg [ 3 ] )
table.insert ( action.Children , arg [ 4 ] )
elseif max == 3 then
action.Action = " dynamic_if "
table.insert ( action.Children , arg [ 3 ] )
elseif max == 2 then
action.Action = " dynamic_if "
else
return nil
end
action.Parameters = arg [ 2 ]
return action
end
-- waraning
if actionType == " code "
then
action.Parameters = arg [ 2 ]
return action
end
--random action
if actionType == " random_select "
then
local max = table.getn ( arg )
for i = 2 , max do
table.insert ( action.Children , arg [ i ] )
end
return action
end
--set timer action
if string.find ( actionType , " set_timer_t " ) ~= nil
then
local max = table.getn ( arg )
parameters = " "
for i = 2 , max do
parameters = parameters .. arg [ i ]
end
action.Parameters = parameters
return action
end
--modify variable action
if actionType == " modify_variable " or actionType == " begin_state "
then
action.Parameters = arg [ 2 ]
return action
end
if actionType == " punctual_state "
then
action.Parameters = arg [ 2 ]
return action
end
if ( actionType == " stand_up " ) or ( actionType == " sit_down " ) or ( actionType == " punctual_state_end " )
then
return action
end
printWarning ( " Unhandled action " .. actionType )
return nil
end
--first param : event type
--second param: StatesByName
--third param : GroupsByName
--then, parameters
Translator.createEvent = function ( ... )
local event = r2.newComponent ( " RtNpcEventHandler " )
local eventType = arg [ 1 ]
event.Event = eventType
event.StatesByName = arg [ 2 ]
event.GroupsByName = arg [ 3 ]
assert ( arg [ 1 ] )
assert ( arg [ 2 ] )
assert ( arg [ 3 ] )
if eventType == nil then
debugInfo ( " Error invalid eventType " )
assert ( nil )
return nil
end
if string.find ( eventType , " timer_t%d_triggered " ) ~= nil or string.find ( eventType , " user_event_%d " )
then
return event
end
if ( eventType == " end_of_state " ) or ( eventType == " start_of_state " )
or ( eventType == " group_under_attack " ) or ( eventType == " destination_reached_all " )
or ( eventType == " bot_killed " ) or ( eventType == " group_eliminated " ) or ( eventType == " group_under_attack " )
or ( eventType == " destination_reached " ) or ( eventType == " variable_changed " )
or ( eventType == " group_despawned " ) or ( eventType == " group_spawned " ) or ( eventType == " bot_target_killed " )
or ( eventType == " player_target_npc " )
or string.find ( eventType , " variable_v%d_changed " ) ~= nil
then
return event
end
if ( eventType == " on_player_arrived " ) then
event.Event = " player_arrived_trigger_zone "
event.IsTriggerZone = 1
return event
end
if ( eventType == " on_player_left " ) then
event.Event = " player_left_trigger_zone "
event.IsTriggerZone = 1
return event
end
printWarning ( " Error invalid event " .. eventType )
return nil
end
-- it adds a new simple activity in zone within the given context
Translator.createSimpleActivityInZone = function ( context , zoneName , groupsByName , mode , static , aiScriptDebug )
local action
local event
local code
-- init when the group arrives in the zone
code = ' ()setMode(" ' .. mode .. ' "); \n '
if static then
code = code .. ' ()stopMoving(); \n ' ;
end
if aiScriptDebug then
code = ' log("destination_reached_all: zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' .. code
end
event = Translator.createEvent ( " destination_reached_all " , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
-- restore things when the group quits the zone
code = ' ()setMode("Normal"); '
if aiScriptDebug then
code = ' log("end_of_state: zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' .. code
end
event = Translator.createEvent ( " end_of_state " , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
end
-- it adds a new activity in zone within the given context
Translator.createActivityInZone = function ( context , zoneName , groupsByName , mode , timerId , wanderTime , activityTime , aiScriptDebug )
assert ( wanderTime > 0 )
assert ( activityTime > 0 )
local action
local event
local code
local timerEventName = " timer_t " .. timerId .. " _triggered "
-- init start of state
code = ' nextState = 0; \n '
if aiScriptDebug then
code = ' log("start_of_state: zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' .. code
end
event = Translator.createEvent ( " start_of_state " , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
-- init when the group arrives in the zone
code =
' if (nextState == 0) \n ' ..
' { \n '
if aiScriptDebug then
code = code ..
' log("destination_reached_all: zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n '
end
code = code ..
' nextState = 1; \n ' ..
' ()setTimer(1, ' .. timerId .. ' ); \n ' ..
' } \n '
event = Translator.createEvent ( " destination_reached_all " , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
-- activity states
code =
' if (nextState == 1) { \n ' ..
' nextState = 2; \n ' ..
' ()stopMoving(); \n ' ..
' ()setMode(" ' .. mode .. ' "); \n ' ..
' ()setTimer( ' .. activityTime .. ' , ' .. timerId .. ' ); \n ' ..
' } else if (nextState == 2) { \n ' ..
' nextState = 1; \n ' ..
' ()setMode("Normal"); \n ' ..
' ()wander(); \n ' ..
' ()setTimer( ' .. wanderTime .. ' , ' .. timerId .. ' ); \n ' ..
' } else { \n ' ..
' log("unknown state=", nextState, ", zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' ..
' ()break(); \n ' ..
' } \n '
if aiScriptDebug then
code = ' log(" ' .. timerEventName .. ' : state=", nextState, ", zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' .. code
end
event = Translator.createEvent ( timerEventName , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
-- restore things when the group quits the zone
code =
' ()timerDisable( ' .. timerId .. ' ); \n ' ..
' ()setMode("Normal"); \n '
if aiScriptDebug then
code = ' log("end_of_state: zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' .. code
end
event = Translator.createEvent ( " end_of_state " , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
end
-- it adds a new hunt activity in zone within the given context
Translator.createHuntActivityInZone = function ( context , zoneName , groupsByName , timerId , wanderTime , alertTime , eatTime , aiScriptDebug )
assert ( wanderTime > 0 )
assert ( alertTime > 0 )
assert ( eatTime > 0 )
local action
local event
local code
local timerEventName = " timer_t " .. timerId .. " _triggered "
-- init start of state
code = ' nextState = 0; \n '
if aiScriptDebug then
code = ' log("start_of_state: zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' .. code
end
event = Translator.createEvent ( " start_of_state " , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
-- init when the group arrives in the zone
code =
' if (nextState == 0) \n ' ..
' { \n '
if aiScriptDebug then
code = code ..
' log("destination_reached_all: zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n '
end
code = code ..
' nextState = 1; \n ' ..
--- ' ()setFactionProp("ennemyFaction", "' .. Translator.PredatorEnemyFaction .. '");\n' ..
' ()setTimer(1, ' .. timerId .. ' ); \n ' ..
' } \n '
event = Translator.createEvent ( " destination_reached_all " , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
-- activity states
code =
' if (nextState == 1) { \n ' ..
' nextState = 2; \n ' ..
' ()stopMoving(); \n ' ..
' ()setMode("Alert"); \n ' ..
' ()setTimer( ' .. alertTime .. ' , ' .. timerId .. ' ); \n ' ..
' } else if (nextState == 2) { \n ' ..
' nextState = 1; \n ' ..
' ()setMode("Normal"); \n ' ..
' ()wander(); \n ' ..
' ()setTimer( ' .. wanderTime .. ' , ' .. timerId .. ' ); \n ' ..
' } else if (nextState == 3) { \n ' ..
' nextState = 1; \n ' ..
-- ' ()setFactionProp("ennemyFaction", "'.. Translator.PredatorEnemyFaction .. '");\n' ..
' ()setMode("Normal"); \n ' ..
' ()wander(); \n ' ..
' ()setTimer( ' .. wanderTime .. ' , ' .. timerId .. ' ); \n ' ..
' } else { \n ' ..
' log("unknown state=", nextState, ", zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' ..
' ()break(); \n ' ..
' } \n '
if aiScriptDebug then
code = ' log(" ' .. timerEventName .. ' : state=", nextState, ", zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' .. code
end
event = Translator.createEvent ( timerEventName , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
-- eat the corpse when the target is killed
code =
' nextState = 3; \n ' ..
--. '()setFactionProp("ennemyFaction", "");\n' ..
' ()stopMoving(); \n ' ..
' ()setMode("Eat"); \n ' ..
' ()setTimer( ' .. eatTime .. ' , ' .. timerId .. ' ); \n '
if aiScriptDebug then
code = ' log("bot_target_killed: zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' .. code
end
event = Translator.createEvent ( " bot_target_killed " , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
-- restore things when the group quits the zone
code =
' ()timerDisable( ' .. timerId .. ' ); \n ' ..
' ()setMode("Normal"); \n '
-- .. '()setFactionProp("ennemyFaction", "Player");\n'
if aiScriptDebug then
code = ' log("end_of_state: zone= ' .. zoneName .. ' , group= ' .. groupsByName .. ' "); \n ' .. code
end
event = Translator.createEvent ( " end_of_state " , zoneName , groupsByName )
table.insert ( context.RtAct . Events , event )
action = Translator.createAction ( " code " , code )
table.insert ( context.RtAct . Actions , action )
table.insert ( event.ActionsId , action.Id )
end
-- set GroupParameters of a rt Group by readin a hl Np
-- eg set BotAttackable, aggro_range ..
Translator.setGroupParameters = function ( hlNpc , rtNpcGrp )
assert ( hlNpc and type ( hlNpc ) == " userdata " )
rtNpcGrp.GrpParameters = " ring \n " .. rtNpcGrp.GrpParameters
rtNpcGrp.AiProfilParams = " "
local botAttackable = hlNpc.BotAttackable
if botAttackable == 1
then
rtNpcGrp.GrpParameters = rtNpcGrp.GrpParameters .. " bot_attackable " .. " \n "
end
local playerAttackable = hlNpc.PlayerAttackable
if playerAttackable == 1
then
rtNpcGrp.GrpParameters = rtNpcGrp.GrpParameters .. " player_attackable " .. " \n "
end
local aggroRange = hlNpc.Aggro
if aggroRange ~= nil and aggroRange >= 0
then
if ( aggroRange > 120 ) then aggroRange = 120 end
rtNpcGrp.GrpParameters = rtNpcGrp.GrpParameters .. " aggro range: " .. aggroRange .. " \n "
end
-- if hlNpc.UseFame and hlNpc.UseFame == 1 and hlNpc.Fame then
-- rtNpcGrp.AiProfilParams = rtNpcGrp.AiProfilParams
-- .. "faction:" .. hlNpc.Fame .. "\n"
-- .. "fame_for_guard_attack:-300000\n"
-- end
local speed = hlNpc.Speed
if speed ~= nil and type ( speed ) == " number " and speed == 1 then
rtNpcGrp.AiProfilParams = rtNpcGrp.AiProfilParams .. " running \n "
end
local autoSpawn = hlNpc.AutoSpawn
if autoSpawn ~= nil and autoSpawn == 0 then
rtNpcGrp.AutoSpawn = 0
end
local noRespawn = hlNpc.NoRespawn
if noRespawn ~= nil and noRespawn == 1 then
rtNpcGrp.GrpParameters = rtNpcGrp.GrpParameters .. " respawn time:-1 \n "
end
local isFauna = hlNpc.IsFauna
if isFauna ~= nil and isFauna == 1 then
rtNpcGrp.GrpParameters = rtNpcGrp.GrpParameters .. " denied_astar_flags:WaterAndNoGo \n "
end
end
-- TODO doc
---- EventHandlers
-- Components
--- Condition
Translator.getComponentGenericEvent = function ( rtNpcGrp , id )
assert ( rtNpcGrp )
assert ( id )
local prefix = " "
if rtNpcGrp.Id and rtNpcGrp.Id ~= " " then
prefix = r2 : getNamespace ( ) .. rtNpcGrp.Id .. " . "
end
local eventHandler = Translator.createEvent ( " user_event_0 " , " " , rtNpcGrp.Id )
local condition = prefix .. " e == " .. tostring ( id )
local firstCondition = Translator.createAction ( " dynamic_if " , condition )
return eventHandler , firstCondition , firstCondition
end
Translator.getComponentUserEvent = function ( rtNpcGrp , id )
assert ( rtNpcGrp )
assert ( rtNpcGrp.Id )
assert ( id )
local eventHandler = Translator.createEvent ( " user_event_ " .. id , " " , rtNpcGrp.Id )
-- local condition = "1 == 1"
-- local firstCondition = Translator.createAction("dynamic_if", condition)
return eventHandler , nil , nil
--, firstCondition, firstCondition
end
-- NPC
-- Selecter
Translator.getNpcLogicCondition = function ( entity , context , condition )
assert ( condition.Class == " ConditionStep " )
local rtNpcGrp = Translator.getRtGroup ( context , condition.Entity )
assert ( rtNpcGrp )
local funs = { }
funs [ " is in activity sequence " ] = Translator.getNpcLogicConditionIsInActivitySequence
funs [ " is in activity step " ] = Translator.getNpcLogicConditionIsInActivityStep
funs [ " is in chat sequence " ] = Translator.getNpcLogicConditionIsInChatSequence
funs [ " is in chat step " ] = Translator.getNpcLogicConditionIsInChatStep
funs [ " is dead " ] = Translator.getNpcLogicConditionIsDead
funs [ " is alive " ] = Translator.getNpcLogicConditionIsAlive
local fun = funs [ condition.Condition . Type ]
if fun then
return fun ( entity , context , condition , rtNpcGrp )
end
local firstAction , lastAction = nil , nil
return firstAction , lastAction
end
Translator.getNpcLogicAction = function ( entity , context , action )
assert ( action.Class == " ActionStep " )
local rtNpcGrp = Translator.getRtGroup ( context , action.Entity )
assert ( rtNpcGrp )
local funs = { }
funs [ " Deactivate " ] = Translator.getNpcLogicActionDeactivate
funs [ " Activate " ] = Translator.getNpcLogicActionActivate
funs [ " Kill " ] = Translator.getNpcLogicActionKill
funs [ " begin activity sequence " ] = Translator.getNpcLogicActionBeginActivitySequence
funs [ " begin chat sequence " ] = Translator.getNpcLogicActionBeginChatSequence
funs [ " Stand Up " ] = Translator.getNpcLogicActionStandUp
funs [ " Sit Down " ] = Translator.getNpcLogicActionSitDown
funs [ " Fight with player " ] = Translator.getNpcLogicActionFightPlayer
funs [ " Fight with Npcs " ] = Translator.getNpcLogicActionFightNpcs
funs [ " Dont fight with player " ] = Translator.getNpcLogicActionDontFightPlayer
funs [ " Dont fight with Npcs " ] = Translator.getNpcLogicActionDontFightNpcs
funs [ " Run " ] = Translator.getNpcLogicActionRun
funs [ " Dont run " ] = Translator.getNpcLogicActionDontRun
funs [ " emits user event " ] = Translator.getNpcLogicActionEmitsUserEvent
local fun = funs [ action.Action . Type ]
if fun then
return fun ( entity , context , action , rtNpcGrp )
end
local firstAction , lastAction = nil , nil
return firstAction , lastAction
end
Translator.getNpcLogicEvent = function ( entity , context , event )
assert ( event.Class == " LogicEntityAction " )
local rtNpcGrp = Translator.getRtGroup ( context , entity.InstanceId )
assert ( rtNpcGrp )
local funs = { }
funs [ " activation " ] = Translator.getNpcLogicEventActivation
funs [ " desactivation " ] = Translator.getNpcLogicEventDesactivation
funs [ " death " ] = Translator.getNpcLogicEventDeath
funs [ " end of activity step " ] = Translator.getNpcLogicEventEndOfActivityStep
funs [ " begin of activity step " ] = Translator.getNpcLogicEventBeginOfActivityStep
funs [ " end of activity sequence " ] = Translator.getNpcLogicEventEndOfActivitySequence
funs [ " begin of activity sequence " ] = Translator.getNpcLogicEventBeginOfActivitySequence
funs [ " end of chat step " ] = Translator.getNpcLogicEventEndOfChatStep
funs [ " end of chat sequence " ] = Translator.getNpcLogicEventEndOfChatSequence
funs [ " user event emitted " ] = Translator.getNpcLogicEventUserEventEmitted
-- There is also group specific functions
local eventHandler , firsCondition , lastCondition = nil , nil , nil
local value = event.Event . Type
local fun = funs [ value ]
if fun then
return fun ( entity , context , event , rtNpcGrp )
end
if value == " member death " then
local eventHandler = Translator.createEvent ( " bot_killed " , " " , rtNpcGrp.Id )
return eventHandler , nil , nil
elseif value == " group death " then
local eventHandler = Translator.createEvent ( " group_eliminated " , " " , rtNpcGrp.Id )
return eventHandler , nil , nil
elseif value == " targeted by player " then
local eventHandler = Translator.createEvent ( " player_target_npc " , " " , rtNpcGrp.Id )
return eventHandler , nil , nil
end
return eventHandler , firsCondition , lastCondition
end
--- Event
Translator.getGenericLogicEventDesactivation = function ( rtNpcGrp )
local eventHandler , firsCondition , lastCondition = nil , nil , nil
eventHandler = Translator.createEvent ( " group_despawned " , " " , rtNpcGrp.Id )
return eventHandler , firsCondition , lastCondition
end
Translator.getNpcLogicEventDesactivation = function ( hlComponent , context , event , rtNpcGrp )
return Translator.getGenericLogicEventDesactivation ( rtNpcGrp )
end
Translator.getNpcLogicEventUserEventEmitted = function ( hlComponent , context , event , rtNpcGrp )
local eventHandler , firsCondition , lastCondition = nil , nil , nil
value = event.Event . ValueString
if value then value = tonumber ( value ) end
if not value then return end
return Translator.getComponentGenericEvent ( rtNpcGrp , value )
end
Translator.getNpcLogicEventActivation = function ( hlComponent , context , event , rtNpcGrp )
local eventHandler , firsCondition , lastCondition = nil , nil , nil
eventHandler = Translator.createEvent ( " group_spawned " , " " , rtNpcGrp.Id )
return eventHandler , firsCondition , lastCondition
end
Translator.getGenericLogicEventDeath = function ( rtNpcGrp )
local eventHandler , firsCondition , lastCondition = nil , nil , nil
eventHandler = Translator.createEvent ( " bot_killed " , " " , rtNpcGrp.Id )
return eventHandler , firsCondition , lastCondition
end
Translator.getNpcLogicEventDeath = function ( hlComponent , context , event , rtNpcGrp )
return Translator.getGenericLogicEventDeath ( rtNpcGrp )
end
Translator.getGenericLogicEventEndOfActivitySequence = function ( hlComponent , value , rtNpcGrp )
local sequenceInstanceId = tostring ( value )
local sequence = r2 : getInstanceFromId ( sequenceInstanceId )
assert ( sequence )
local n = table.getn ( sequence.Components )
if n > 0 then
local firstStep = sequence.Components [ n - 1 ] . InstanceId
eventHandler = Translator.createEvent ( " timer_t0_triggered " , " " , rtNpcGrp.Id )
local value = tostring ( firstStep )
local tab = Logic.findActivityStepIdByInstanceId ( sequence.Parent . Parent.Parent , value )
local id , id2 = tab [ 1 ] , tab [ 2 ]
if ( id == - 1 or id2 == - 1 ) then
printWarning ( " error in translation: the event ' " .. event.Name .. " ' in component ' " .. hlComponent.Name ..
" ': the selected activity step can not be found " ) ;
return nil , nil , nil
end
local prefix = " "
local condition1 = prefix .. " oldActivityStepVar2 == " .. tostring ( id + 1 ) -- in theory it must be (id-1) +1
local condition2 = prefix .. " currentActivitySequenceVar == " .. tostring ( id2 - 1 )
local firstCondition = Translator.createAction ( " dynamic_if " , condition1 )
local lastCondition = Translator.createAction ( " dynamic_if " , condition2 )
table.insert ( firstCondition.Children , lastCondition )
return eventHandler , firstCondition , lastCondition
else
local eventHandler , firsCondition , lastCondition = nil , nil , nil
eventHandler = Translator.createEvent ( " timer_t0_triggered " , " " , rtNpcGrp.Id )
local prefix = " "
local tab = Logic.findActivitySequenceIdByInstanceId ( sequence.Parent . Parent.Parent , value )
local id = tab [ 1 ]
local condition = prefix .. " currentActivitySequenceVar == " .. tostring ( id - 1 )
local firstCondition = Translator.createAction ( " dynamic_if " , condition )
return eventHandler , firstCondition , firstCondition
end
end
Translator.getGenericLogicEventStartOfActivitySequence = function ( value , rtNpcGrp )
local sequenceInstanceId = tostring ( value )
local sequence = r2 : getInstanceFromId ( sequenceInstanceId )
assert ( sequence )
local n = table.getn ( sequence.Components )
if n > 0 then
local firstStep = sequence.Components [ 0 ] . InstanceId
local eventHandler , firsCondition , lastCondition = nil , nil , nil
eventHandler = Translator.createEvent ( " timer_t0_triggered " , " " , rtNpcGrp.Id )
local value = tostring ( firstStep )
local tab = Logic.findActivityStepIdByInstanceId ( sequence.Parent . Parent.Parent , value )
local id , id2 = tab [ 1 ] , tab [ 2 ]
if ( id == - 1 or id2 == - 1 ) then
printWarning ( " error in translation: the event ' " .. event.Name .. " ' in component ' " .. hlComponent.Name ..
" ': the selected activity step can not be found " ) ;
return nil , nil , nil
end
local prefix = " "
local condition1 = prefix .. " oldActivityStepVar2 == " .. tostring ( id ) -- in theory it must be (id-1) +1
local condition2 = prefix .. " currentActivitySequenceVar == " .. tostring ( id2 - 1 )
local firstCondition = Translator.createAction ( " dynamic_if " , condition1 )
local lastCondition = Translator.createAction ( " dynamic_if " , condition2 )
table.insert ( firstCondition.Children , lastCondition )
return eventHandler , firstCondition , lastCondition
else
local eventHandler , firsCondition , lastCondition = nil , nil , nil
eventHandler = Translator.createEvent ( " timer_t0_triggered " , " " , rtNpcGrp.Id )
local prefix = " "
local tab = Logic.findActivitySequenceIdByInstanceId ( sequence.Parent . Parent.Parent , value )
local id = tab [ 1 ]
local condition = prefix .. " currentActivitySequenceVar == " .. tostring ( id - 1 )
local firstCondition = Translator.createAction ( " dynamic_if " , condition )
return eventHandler , firstCondition , firstCondition
end
end
Translator.getNpcLogicEventBeginOfActivitySequence = function ( hlComponent , context , event , rtNpcGrp )
local value = tostring ( event.Event . Value )
return Translator.getGenericLogicEventStartOfActivitySequence ( value , rtNpcGrp )
end
Translator.getNpcLogicEventEndOfActivitySequence = function ( hlComponent , context , event , rtNpcGrp )
local value = tostring ( event.Event . Value )
return Translator.getGenericLogicEventEndOfActivitySequence ( hlComponent , value , rtNpcGrp )
end
Translator.getNpcLogicEventEndOfActivityStepImpl = function ( value , rtNpcGrp )
local eventHandler , firsCondition , lastCondition = nil , nil , nil
eventHandler = Translator.createEvent ( " timer_t0_triggered " , " " , rtNpcGrp.Id )
local step = r2 : getInstanceFromId ( value )
assert ( step )
local sequence = step.Parent . Parent
assert ( sequence )
local hlComponent = sequence.Parent . Parent.Parent
assert ( hlComponent )
local tab = Logic.findActivityStepIdByInstanceId ( hlComponent , value )
local id , id2 = tab [ 1 ] , tab [ 2 ]
if ( id == - 1 or id2 == - 1 ) then
printWarning ( " error in translation: the event ' " .. event.Name .. " ' in component ' " .. hlComponent.Name ..
" ': the selected activity step can not be found " ) ;
return nil , nil , nil
end
local prefix = " "
local condition1 = prefix .. " oldActivityStepVar2 == " .. tostring ( id + 1 ) -- in theory it must be (id-1) +1
local condition2 = prefix .. " currentActivitySequenceVar == " .. tostring ( id2 - 1 )
local firstCondition = Translator.createAction ( " dynamic_if " , condition1 )
local lastCondition = Translator.createAction ( " dynamic_if " , condition2 )
table.insert ( firstCondition.Children , lastCondition )
return eventHandler , firstCondition , lastCondition
end
Translator.getNpcLogicEventEndOfActivityStep = function ( hlComponent , context , event , rtNpcGrp )
local value = tostring ( event.Event . Value )
return Translator.getNpcLogicEventEndOfActivityStepImpl ( value , rtNpcGrp )
end
Translator.getNpcLogicEventBeginOfActivityStepImpl = function ( value , rtNpcGrp )
local eventHandler , firsCondition , lastCondition = nil , nil , nil
assert ( rtNpcGrp )
local step = r2 : getInstanceFromId ( value )
assert ( step )
local sequence = step.Parent . Parent
assert ( sequence )
local hlComponent = sequence.Parent . Parent.Parent
assert ( hlComponent )
eventHandler = Translator.createEvent ( " timer_t0_triggered " , " " , rtNpcGrp.Id )
local tab = Logic.findActivityStepIdByInstanceId ( hlComponent , value )
local id , id2 = tab [ 1 ] , tab [ 2 ]
if ( id == - 1 or id2 == - 1 ) then
printWarning ( " error in translation: the event ' " .. event.Name .. " ' in component ' " .. hlComponent.Name ..
" ': the selected activity step can not be found " ) ;
return nil , nil , nil
end
local prefix = " "
local condition1 = prefix .. " oldActivityStepVar2 == " .. tostring ( id ) -- in theory it must be (id-1) +1
local condition2 = prefix .. " currentActivitySequenceVar == " .. tostring ( id2 - 1 )
local firstCondition = Translator.createAction ( " dynamic_if " , condition1 )
local lastCondition = Translator.createAction ( " dynamic_if " , condition2 )
table.insert ( firstCondition.Children , lastCondition )
return eventHandler , firstCondition , lastCondition
end
Translator.getNpcLogicEventBeginOfActivityStep = function ( hlComponent , context , event , rtNpcGrp )
local value = tostring ( event.Event . Value )
return Translator.getNpcLogicEventBeginOfActivityStepImpl ( value , rtNpcGrp )
end
Translator.getNpcLogicEventEndOfChatStepImpl = function ( hlComponent , context , event , rtNpcGrp )
local eventHandler , firsCondition , lastCondition = nil , nil , nil
eventHandler = Translator.createEvent ( " timer_t1_triggered " , " " , rtNpcGrp.Id )
local value = tostring ( event.Event . Value )
local tab = Logic.findChatStepIdByInstanceId ( hlComponent , value )
local id , id2 = tab [ 1 ] , tab [ 2 ]
if ( id ==- 1 or id2 == - 1 ) then
printWarning ( " error in translation: the event ' " .. event.Name .. " ' in component ' " .. hlComponent.Name ..
" ': the selected chat step can not be found " ) ;
return nil , nil , nil
end
local prefix = " "
local condition1 = prefix .. " oldChatStepVar == " .. tostring ( id - 1 )
local condition2 = prefix .. " v0 == " .. tostring ( id2 - 1 )
local firstCondition = Translator.createAction ( " dynamic_if " , condition1 )
local lastCondition = Translator.createAction ( " dynamic_if " , condition2 )
table.insert ( firstCondition.Children , lastCondition )
return eventHandler , firstCondition , lastCondition
end
Translator.getNpcLogicEventEndOfChatStep = function ( hlComponent , context , event , rtNpcGrp )
local value = tostring ( event.Event . Value )
return Translator.getNpcLogicEventEndOfChatStepImpl ( hlComponent , value , rtNpcGrp )
end
--- Conditions
Translator.getGenericLogicConditionIsInActivitySequence = function ( entity , conditionValue , rtNpcGrp )
local prefix = " "
if rtNpcGrp then prefix = r2.getNamespace ( ) .. rtNpcGrp.Id .. " . " end
local theValue = conditionValue
local tab = Logic.findActivitySequenceIdByInstanceId ( entity , theValue )
local id , id2 = tab [ 1 ] , tab [ 2 ]
assert ( id ~= - 1 )
local condition1 = prefix .. " oldActivitySequenceVar == " .. tostring ( id - 1 )
local firstCondition = Translator.createAction ( " dynamic_if " , condition1 )
local lastCondition = firstCondition
return firstCondition , lastCondition
end
Translator.getNpcLogicConditionIsInActivitySequence = function ( entity , context , condition , rtNpcGrp )
local theValue = condition.Condition . Value
return Translator.getGenericLogicConditionIsInActivitySequence ( entity , theValue , rtNpcGrp )
end
Translator.getGenericLogicConditionIsInActivityStep = function ( entity , conditionValue , rtNpcGrp )
assert ( entity and type ( entity ) == " userdata " )
assert ( conditionValue and type ( conditionValue ) == " string " )
assert ( rtNpcGrp and type ( rtNpcGrp ) == " table " )
local prefix = " "
if rtNpcGrp then prefix = r2.getNamespace ( ) .. rtNpcGrp.Id .. " . " end
local theValue = conditionValue
local tab = Logic.findActivityStepIdByInstanceId ( entity , theValue )
local id , id2 = tab [ 1 ] , tab [ 2 ]
assert ( id ~= - 1 and id2 ~= - 2 ) ;
local condition1 = prefix .. " oldActivityStepVar2 == " .. tostring ( id )
local condition2 = prefix .. " currentActivitySequenceVar == " .. tostring ( id2 - 1 )
local firstCondition = Translator.createAction ( " dynamic_if " , condition1 )
local lastCondition = Translator.createAction ( " dynamic_if " , condition2 )
table.insert ( firstCondition.Children , lastCondition )
return firstCondition , lastCondition
end
Translator.getNpcLogicConditionIsInActivityStep = function ( entity , context , condition , rtNpcGrp )
assert ( entity and type ( entity ) == " userdata " )
assert ( context and type ( context ) == " table " )
assert ( condition and type ( condition ) == " userdata " and condition.Class == " ConditionStep " )
assert ( rtNpcGrp and type ( rtNpcGrp ) == " table " )
local conditionValue = condition.Condition . Value
return Translator.getGenericLogicConditionIsInActivityStep ( entity , conditionValue , rtNpcGrp )
end
Translator.getNpcLogicConditionIsDeadOrAlive = function ( entity , context , condition , rtNpcGrp , isAlive )
assert ( entity and type ( entity ) == " userdata " )
assert ( context and type ( context ) == " table " )
assert ( condition and type ( condition ) == " userdata " and condition.Class == " ConditionStep " )
assert ( rtNpcGrp and type ( rtNpcGrp ) == " table " )
local prefix = " "
if rtNpcGrp then prefix = r2.getNamespace ( ) .. rtNpcGrp.Id .. " . " end
local lastCondition = Translator.createAction ( " dynamic_if " , prefix .. " alive == " .. tonumber ( isAlive ) )
local firstCondition = Translator.createAction ( " multi_actions " ,
{
Translator.createAction ( " code " , " ( " .. prefix .. " alive) " .. prefix .. " isAlived(); " ) ,
lastCondition
} )
return firstCondition , lastCondition
end
Translator.getNpcLogicConditionIsDead = function ( entity , context , condition , rtNpcGrp )
return Translator.getNpcLogicConditionIsDeadOrAlive ( entity , context , condition , rtNpcGrp , 0 )
end
Translator.getNpcLogicConditionIsAlive = function ( entity , context , condition , rtNpcGrp )
return Translator.getNpcLogicConditionIsDeadOrAlive ( entity , context , condition , rtNpcGrp , 1 )
end
-- Action
Translator.getNpcLogicActionDeactivate = function ( entity , context , action , rtNpcGrp )
if ( not entity or not rtNpcGrp ) then
return nil
end
local prefix = " "
if rtNpcGrp then prefix = r2.getNamespace ( ) .. rtNpcGrp.Id .. " . " end
local retAction = Translator.createAction ( " code " , " () " .. prefix .. " despawn(0); " , " " )
assert ( retAction )
retAction.Name = " desactivate "
return retAction , retAction
end
Translator.getNpcLogicActionActivate = function ( entity , context , action , rtNpcGrp )
if ( not entity or not rtNpcGrp ) then
return nil
end
local prefix = " "
if rtNpcGrp then prefix = r2.getNamespace ( ) .. rtNpcGrp.Id .. " . " end
--()setAutoSpawn(1);
local retAction = Translator.createAction ( " code " , " () " .. prefix .. " spawn(); " , " " )
assert ( retAction )
retAction.Name = " activate "
return retAction , retAction
end
Translator.getNpcLogicActionKill = function ( entity , context , action , rtNpcGrp )
local prefix = " "
if rtNpcGrp then prefix = r2.getNamespace ( ) .. rtNpcGrp.Id .. " . " end
local retAction = Translator.createAction ( " code " , " () " .. prefix .. " setHPScale(0); " )
assert ( retAction )
retAction.Name = " kill "
return retAction , retAction
end
Translator.getGenericLogicActionBeginActivitySequence = function ( sequenceInstanceId , rtNpcGrp )
local activityStates = Logic.ActivitiesStates [ sequenceInstanceId ]
assert ( activityStates )
local activityStatesId = activityStates [ sequenceInstanceId ] [ 1 ] . Id
local retAction = Translator.createAction ( " code " , " () " .. r2 : getNamespace ( ) .. rtNpcGrp.Id .. " . " .. " postNextState( \" " .. r2 : getNamespace ( ) .. activityStatesId .. " \" ); " , rtNpcGrp.Id )
return retAction , retAction
end
Translator.getNpcLogicActionBeginActivitySequence = function ( entity , context , action , rtNpcGrp )
local sequenceInstanceId = action.Action . Value
return Translator.getGenericLogicActionBeginActivitySequence ( sequenceInstanceId , rtNpcGrp )
end
Translator.getNpcLogicActionSitDown = function ( entity , context , action , rtNpcGrp )
local retAction = Translator.createAction ( " sit_down " , rtNpcGrp.Id )
assert ( retAction )
retAction.Name = " sitDown "
return retAction , retAction
end
Translator.getNpcLogicActionStandUp = function ( entity , context , action , rtNpcGrp )
local retAction = Translator.createAction ( " stand_up " , rtNpcGrp.Id )
retAction.Name = " standUp "
return retAction , retAction
end
Translator.getNpcLogicActionFightPlayer = function ( entity , context , action , rtNpcGrp )
local leader = entity
if entity : isKindOf ( " NpcGrpFeature " ) then
if table.getn ( entity.Components ) >= 0 then
leader = entity.Components [ 0 ]
else
leader = nil
end
end
assert ( leader )
local category = leader.SubCategory
local aggro = leader.Aggro
if not category then
category = leader.Category
end
local action1 = Translator.createAction ( " set_player_attackable " , rtNpcGrp.Id , 1 )
local action2 = r2.Translator . createAction ( " faction_init " , rtNpcGrp.Id , category , aggro , leader.BotAttackable , 1 )
local retAction = r2.Translator . createAction ( " multi_actions " , { action1 , action2 } )
retAction.Name = " Fight with player "
return retAction , retAction
end
Translator.getNpcLogicActionDontFightPlayer = function ( entity , context , action , rtNpcGrp )
local leader = entity
if entity : isKindOf ( " NpcGrpFeature " ) then
if table.getn ( entity.Components ) >= 0 then
leader = entity.Components [ 0 ]
else
leader = nil
end
end
assert ( leader )
local category = leader.SubCategory
local aggro = leader.Aggro
if not category then
category = leader.Category
end
local action1 = Translator.createAction ( " set_player_attackable " , rtNpcGrp.Id , 0 )
local action2 = r2.Translator . createAction ( " faction_init " , rtNpcGrp.Id , category , aggro , leader.BotAttackable , 0 )
local retAction = r2.Translator . createAction ( " multi_actions " , { action1 , action2 } )
retAction.Name = " Dont fight with player "
return retAction , retAction
end
Translator.getNpcLogicActionFightNpcs = function ( entity , context , action , rtNpcGrp )
local leader = entity
if entity : isKindOf ( " NpcGrpFeature " ) then
if table.getn ( entity.Components ) >= 0 then
leader = entity.Components [ 0 ]
else
leader = nil
end
end
assert ( leader )
local category = leader.SubCategory
local aggro = leader.Aggro
if not category then
category = leader.Category
end
local action1 = Translator.createAction ( " set_bot_attackable " , rtNpcGrp.Id , 1 )
local action2 = Translator.createAction ( " faction_init " , rtNpcGrp.Id , category , aggro , 1 , leader.PlayerAttackable )
local retAction = r2.Translator . createAction ( " multi_actions " , { action1 , action2 } )
retAction.Name = " Fight with Npcs "
--inspect(action2)
return retAction , retAction
end
Translator.getNpcLogicActionDontFightNpcs = function ( entity , context , action , rtNpcGrp )
local leader = entity
if entity : isKindOf ( " NpcGrpFeature " ) then
if table.getn ( entity.Components ) >= 0 then
leader = entity.Components [ 0 ]
else
leader = nil
end
end
assert ( leader )
local category = leader.SubCategory
local aggro = leader.Aggro
if not category then
category = leader.Category
end
local action1 = Translator.createAction ( " set_bot_attackable " , rtNpcGrp.Id , 0 )
local action2 = r2.Translator . createAction ( " faction_init " , rtNpcGrp.Id , category , aggro , 0 , leader.PlayerAttackable )
local retAction = r2.Translator . createAction ( " multi_actions " , { action1 , action2 } )
retAction.Name = " Dont fight with Npcs "
return retAction , retAction
end
Translator.getNpcLogicActionRun = function ( entity , context , action , rtNpcGrp )
local action1 = Translator.createAction ( " set_running_speed " , rtNpcGrp.Id )
action1.Name = " Run "
return action1 , action1
end
Translator.getNpcLogicActionDontRun = function ( entity , context , action , rtNpcGrp )
local action1 = Translator.createAction ( " set_walking_speed " , rtNpcGrp.Id )
action1.Name = " Dont run "
return action1 , action1
end
Translator.getNpcLogicActionEmitsUserEvent = function ( entity , context , action , rtNpcGrp )
if not action.Action . ValueString then return end
local value = tostring ( action.Action . ValueString )
local action1 = Translator.createAction ( " generic_event_trigger " , rtNpcGrp.Id , value )
action1.Name = " Trigger User Event "
return action1 , action1
end
-- TODO to up
-- Register an RtNpcGrp to a specific instanceId
Translator.registerManager = function ( context , comp )
local rtNpcGrp = r2.newComponent ( " RtNpcGrp " )
table.insert ( context.RtAct . NpcGrps , rtNpcGrp )
context.RtGroups [ tostring ( comp.InstanceId ) ] = rtNpcGrp
rtNpcGrp.Name = rtNpcGrp.Id
end
function Translator . createAiGroup ( entity , context )
local rtNpcGrp = Translator.getRtGroup ( context , entity.InstanceId )
rtNpcGrp.GrpParameters = " ring \n " .. rtNpcGrp.GrpParameters
rtNpcGrp.AutoSpawn = 0
local aiState = r2.newComponent ( " RtAiState " )
aiState.AiActivity = " normal "
table.insert ( context.RtAct . AiStates , aiState )
table.insert ( aiState.Children , rtNpcGrp.Id )
context.GroupStatesName [ rtNpcGrp.Id ] = aiState.Id
return rtNpcGrp , aiState
end
function Translator . translateAiGroup ( entity , context )
local rtNpcGrp = Translator.getRtGroup ( context , entity.InstanceId )
if entity.Behavior . Actions then
Translator.translateEventHandlers ( context , entity , entity.Behavior . Actions , rtNpcGrp )
end
end
function Translator . translateAiGroupEvent ( eventName , entity , context , rtAction )
assert ( rtAction )
--inspect(context)
local rtNpcGrp = Translator.getRtGroup ( context , entity.InstanceId )
local states = Translator.getRtStatesNames ( context , entity.InstanceId )
-- local rtAct = context.RtAct
local act = entity : getParentAct ( )
local rtAct2 = context.ActIdToRtAct [ act.InstanceId ]
local entityAct = context.Act
local entityIndex = context.Scenario : getActIndex ( act.InstanceId )
local componentIndex = context.Scenario : getActIndex ( context.Act . InstanceId )
-- entity on act2, component on act1 (they can not interact)
if entityIndex ~= componentIndex and entityIndex ~= 0 and componentIndex ~= 0 then
return
end
local rtAct = context.RtAct
if rtAct2 ~= rtAct then
local baseAct = context.Scenario : getBaseAct ( )
local index = context.Scenario : getActIndex ( context.Act . InstanceId )
if index == - 1 then
printWarning ( " Invalid Scenario " )
end
-- Permanent content is known by everyone
if index ~= 0 then
local rtNpcGrpBase = r2.Translator . getRtGroup ( context , baseAct.InstanceId )
local action = Translator.createAction ( " test_act " , rtNpcGrpBase.Id , index )
table.insert ( action.Children , rtAction )
rtAction = action
end
end
local rtEvent = Translator.createEvent ( eventName , states , rtNpcGrp.Id )
table.insert ( rtEvent.ActionsId , rtAction.Id )
table.insert ( rtAct2.Events , rtEvent )
table.insert ( rtAct2.Actions , rtAction )
end
function Translator . translateAiGroupInitialState ( entity , context , rtAction )
return Translator.translateAiGroupEvent ( " start_of_state " , entity , context , rtAction )
end
function Translator . translateAiGroupPlayerTargetNpc ( entity , context , rtAction )
return Translator.translateAiGroupEvent ( " player_target_npc " , entity , context , rtAction )
end
--Group
Translator.getNpcGroupLogicGroupDeath = function ( this , context , eventrtNpcGrp , rtNpcGrp )
local eventHandler , firsCondition , lastCondition = nil , nil , nil
eventHandler = Translator.createEvent ( " group_eliminated " , " " , rtNpcGrp.Id )
return eventHandler , firsCondition , lastCondition
end
function Translator . translateDialog ( entity , context )
local rtNpcGrp = Translator.getRtGroup ( context , entity.InstanceId )
local beforeWait = 0
if ( table.getn ( entity.Components ) > 0 ) then
local i = 0
while i < table.getn ( entity.Components ) and not entity.Components [ i ] : isKindOf ( " ChatStep " ) do
i = i + 1
end
if i < table.getn ( entity.Components ) and entity.Components [ i ] : isKindOf ( " ChatStep " ) then
beforeWait = entity.Components [ i ] . Time
end
end
local rtEventStart = Translator.createEvent ( " timer_t1_triggered " , " " , rtNpcGrp.Id ) -- Start Of Chat Step
local rtDialogOk = Translator.createAction ( " switch_actions " , Logic.chatStepVar )
local rtAction = nil
local rtAction2 = nil
rtAction = Translator.createAction ( " chat_step_first " , rtNpcGrp.Id , beforeWait )
table.insert ( rtDialogOk.Children , rtAction )
local chatStepIndex = 0
local componentIndex , component = next ( entity.Components )
local endParam = { Grps = { } , Whos = { } , Emotes = { } , Indexs = { } , Says = { } , WhoNoEntitys = { } }
while componentIndex do
if component and component : isKindOf ( " ChatStep " ) then
chatStepIndex = chatStepIndex + 1
local param = { }
local who = r2 : getInstanceFromId ( component.Actions [ 0 ] . Who )
local facing = r2 : getInstanceFromId ( component.Actions [ 0 ] . Facing )
local whoGrp = nil
local whoName = nil
local facingGrp = nil
local facingName = nil
if who then
whoGrp = Translator.getRtGroup ( context , who.InstanceId )
whoGrp = whoGrp.Id
whoName = who.Name
end
if facing then
facingGrp = Translator.getRtGroup ( context , facing.InstanceId )
facingGrp = facingGrp.Id
facingName = facing.Name
end
param.WhoGrp = whoGrp
param.Who = whoName
param.FacingGrp = facingGrp
param.Facing = facingName
if not param.Facing then param.Facing = " " end
param.Says = r2.Features . TextManager.getRtId ( context , component.Actions [ 0 ] . Says )
if not param.Says then param.Says = " " end
param.Emote = component.Actions [ 0 ] . Emote
if not param.Emote then param.Emote = " " end
param.Index = chatStepIndex
param.WhoNoEntity = component.Actions [ 0 ] . WhoNoEntity
if not param.WhoNoEntity then param.WhoNoEntity = " " end
param.Break = 0
if component.BreakAtEnd then
param.Break = component.BreakAtEnd
end
componentIndex , component = next ( entity.Components , componentIndex )
if component then
param.Time = component.Time
else
param.Time = 3
end
rtAction = Translator.createAction ( " chat_step " , rtNpcGrp.Id , param )
table.insert ( rtDialogOk.Children , rtAction )
table.insert ( endParam.Indexs , param.Index )
table.insert ( endParam.Grps , param.WhoGrp )
table.insert ( endParam.Whos , param.Who )
table.insert ( endParam.Emotes , param.Emote )
table.insert ( endParam.Says , param.Says )
table.insert ( endParam.WhoNoEntitys , param.WhoNoEntity )
else -- !if isKindOf("ChatStep")
componentIndex , component = next ( entity.Components , componentIndex )
end
end
rtAction = Translator.createAction ( " chat_step_last " , rtNpcGrp.Id , chatStepIndex + 1 )
table.insert ( rtDialogOk.Children , rtAction )
local rtDialogStart = Translator.createAction ( " dynamic_if " , " start == 1 " , rtDialogOk )
table.insert ( rtEventStart.ActionsId , rtDialogStart.Id )
table.insert ( context.RtAct . Events , rtEventStart )
table.insert ( context.RtAct . Actions , rtDialogStart )
local baseAct = context.Scenario : getBaseAct ( )
local rtNpcGrpBase = r2.Translator . getRtGroup ( context , baseAct.InstanceId )
local rtActionEnd = Translator.createAction ( " chat_step_end " , rtNpcGrp.Id , endParam , rtNpcGrpBase.Id )
if ( rtActionEnd ) then
local rtEvenEnd = Translator.createEvent ( " timer_t0_triggered " , " " , rtNpcGrp.Id ) -- Endo Of Chat Step
table.insert ( rtEvenEnd.ActionsId , rtActionEnd.Id )
table.insert ( context.RtAct . Events , rtEvenEnd )
table.insert ( context.RtAct . Actions , rtActionEnd )
end
do
local rtInitialState = Translator.createAction ( " dialog_init " , rtNpcGrp.Id , entity.Repeating , entity.AutoStart )
Translator.translateAiGroupInitialState ( entity , context , rtInitialState )
end
if ( entity.AutoStart == 1 ) then
local rtInitialState = r2.Translator . createAction ( " dynamic_if " , r2 : getNamespace ( ) .. rtNpcGrp.Id .. " .Active == 1 " ,
Translator.createAction ( " dialog_starts " , rtNpcGrp.Id )
)
Translator.translateAiGroupInitialState ( entity , context , rtInitialState )
end
Translator.translateAiGroup ( entity , context )
end
Translator.getNpcGroupLogicGroupAMemberDeath = Translator.getNpcLogicEventDeath
-- user Event 0
-- start = 1
--
-- TODO: d<> m<EFBFBD> ler les events (tmp: on utilise les events 7 et 8 pour respectivement activate et deactivate)
--
function Translator . getDialogLogicAction ( entity , context , action )
assert ( action.Class == " ActionStep " )
local firstAction , lastAction = nil , nil
assert ( action.Class == " ActionStep " )
local component = r2 : getInstanceFromId ( action.Entity )
assert ( component )
local rtNpcGrp = Translator.getRtGroup ( context , component.InstanceId )
assert ( rtNpcGrp )
if action.Action . Type == ' activate ' then
local action1 = r2.Translator . createAction ( " set_value " , rtNpcGrp.Id , " Active " , 1 )
local action2 = r2.Translator . createAction ( " user_event_trigger " , rtNpcGrp.Id , 7 )
local action3 = r2.Translator . createAction ( " dynamic_if " , r2 : getNamespace ( ) .. rtNpcGrp.Id .. " .AutoStart == 1 " ,
Translator.createAction ( " dialog_starts " , rtNpcGrp.Id )
)
local actionActivate = r2.Translator . createAction ( " multi_actions " , { action1 , action2 , action3 } )
local retAction = r2.Translator . createAction ( " dynamic_if " , r2 : getNamespace ( ) .. rtNpcGrp.Id .. " .Active == 0 " , actionActivate )
return retAction , retAction
elseif action.Action . Type == ' deactivate ' then
--local action1 = r2.Translator.createAction("set_value", rtNpcGrp.Id, "Active", 0)
local action1 = r2.Translator . createAction ( " dialog_deactivate " , rtNpcGrp.Id )
local action2 = r2.Translator . createAction ( " user_event_trigger " , rtNpcGrp.Id , 8 )
--local action3 = r2.Translator.createAction("dialog_stops", rtNpcGrp.Id)
local retAction = r2.Translator . createAction ( " if_value_equal " , rtNpcGrp.Id , " Active " , 1 ,
r2.Translator . createAction ( " multi_actions " , { action1 , action2 } ) )
return retAction , retAction
elseif action.Action . Type == ' starts dialog ' then
local retAction = r2.Translator . createAction ( " dynamic_if " , r2 : getNamespace ( ) .. rtNpcGrp.Id .. " .Active == 1 " ,
Translator.createAction ( " dialog_starts " , rtNpcGrp.Id )
)
return retAction , retAction
elseif action.Action . Type == ' continues dialog ' then
local retAction = r2.Translator . createAction ( " dynamic_if " , r2 : getNamespace ( ) .. rtNpcGrp.Id .. " .Active == 1 " ,
Translator.createAction ( " dialog_continues " , rtNpcGrp.Id )
)
return retAction , retAction
elseif action.Action . Type == ' starts chat ' then
local index = Translator.getChatPositionFromDialog ( component , action.Action . Value )
if index == - 1 then return nil end
local retAction = r2.Translator . createAction ( " dynamic_if " , r2 : getNamespace ( ) .. rtNpcGrp.Id .. " .Active == 1 " ,
Translator.createAction ( " chat_starts " , rtNpcGrp.Id , index )
)
return retAction , retAction
elseif action.Action . Type == ' stops dialog ' then
--add condition if Active == 1 ?
local retAction = Translator.createAction ( " dialog_stops " , rtNpcGrp.Id )
return retAction , retAction
end
printWarning ( ' Action not implemented yet : ' .. action.Action . Type )
assert ( nil )
return nil , nil
end
function Translator . getChatPositionFromDialog ( dialog , chatInstanceId )
assert ( dialog )
assert ( dialog.Class == ' ChatSequence ' or dialog.Class == " ProximityDialog " )
assert ( chatInstanceId ~= nil and chatInstanceId ~= " " )
local index = - 1
local componentIndex , component = next ( dialog.Components )
while componentIndex do
if component.Class == ' ChatStep ' then
index = index + 1
if tostring ( component.InstanceId ) == tostring ( chatInstanceId ) then
return index
end
end
componentIndex , component = next ( dialog.Components , componentIndex )
end
return - 1
end
--
-- TODO: d<> m<EFBFBD> ler les events (tmp: on utilise les events 7 et 8 pour respectivement activate et deactivate)
--
function Translator . getDialogLogicEvent ( entity , context , event )
assert ( entity )
assert ( event.Class == " LogicEntityAction " )
local component = entity -- r2:getInstanceFromId(event.Entity)
assert ( component )
local rtNpcGrp = Translator.getRtGroup ( context , component.InstanceId )
assert ( rtNpcGrp )
local states = Translator.getRtStatesNames ( context , entity.InstanceId )
local eventType = tostring ( event.Event . Type )
if eventType == ' activation ' then
return r2.Translator . getComponentUserEvent ( rtNpcGrp , 7 )
elseif eventType == ' deactivation ' then
return r2.Translator . getComponentUserEvent ( rtNpcGrp , 8 )
elseif eventType == ' end of chat ' then
local action = Translator.createEvent ( " timer_t2_triggered " , states , rtNpcGrp.Id )
local index = Translator.getChatPositionFromDialog ( component , event.Event . Value )
if index == - 1 then return nil end
local firstCondition = Translator.createAction ( " if_value_equal " , rtNpcGrp.Id , " v1 " , index + 2 , firstCondition )
return action , firstCondition , firstCondition
elseif eventType == ' end of dialog ' then
return Translator.getComponentUserEvent ( rtNpcGrp , 2 )
elseif eventType == ' start of chat ' then
local action = Translator.createEvent ( " user_event_4 " , states , rtNpcGrp.Id )
local index = Translator.getChatPositionFromDialog ( component , event.Event . Value )
if index == - 1 then return nil end
local firstCondition = Translator.createAction ( " if_value_equal " , rtNpcGrp.Id , " v1 " , index + 2 , firstCondition )
return action , firstCondition , firstCondition
elseif eventType == ' start of dialog ' then
return Translator.getComponentUserEvent ( rtNpcGrp , 1 )
end
printWarning ( ' Event not implemented yet : ' .. event.Event . Type )
assert ( nil )
end
Translator.getDialogLogicCondition = function ( entity , context , condition )
assert ( condition.Class == " ConditionStep " )
local rtNpcGrp = Translator.getRtGroup ( context , condition.Entity )
assert ( rtNpcGrp )
local funs = { }
if condition.Condition . Type == " is in dialog " then
local firstCondition = Translator.createAction ( " if_value_equal " , rtNpcGrp.Id , " start " , 1 )
return firstCondition , firstCondition
end
if condition.Condition . Type == " is not in dialog " then
local firstCondition = Translator.createAction ( " if_value_equal " , rtNpcGrp.Id , " start " , 0 )
return firstCondition , firstCondition
end
if condition.Condition . Type == " is in chat " then
local index = Translator.getChatPositionFromDialog ( entity , condition.Condition . Value )
assert ( index ~= - 1 )
local lastCondition = Translator.createAction ( " if_value_equal " , rtNpcGrp.Id , " v1 " , index + 2 )
local firstCondition = Translator.createAction ( " if_value_equal " , rtNpcGrp.Id , " start " , 1 , lastCondition )
return firstCondition , lastCondition
end
printWarning ( ' Condition not implemented yet : ' .. condition.Condition . Type )
return nil , nil
end
function Translator . translateDefaultFeature ( entity , context , translateActivity )
local components = entity.Components
--luaObject(context.Feature)
local key , comp = next ( components , nil )
while ( key ~= nil )
do
-- Npc case (npc alone not object)
if ( comp.isKindOf and comp : isKindOf ( " Npc " ) ) then
local hlNpc = comp
context.Feature = hlNpc
-- create and set rtNpc
local rtNpc = r2.Translator . translateNpc ( hlNpc , context )
table.insert ( context.RtAct . Npcs , rtNpc )
-- create or get rtGrp
-- set rtGrp.GroupParameter by reading hlNpc (Aggro, Player attackable..)
local rtNpcGrp = r2.Translator . getRtGroup ( context , hlNpc.InstanceId )
r2.Translator . setGroupParameters ( hlNpc , rtNpcGrp )
table.insert ( rtNpcGrp.Children , rtNpc.Id )
-- set activity
-- when translating a usercomponentholder (container which has aiActivities), we must translate the AiActivities
if translateActivity and translateActivity == true
then
local aiActivity = r2.Translator . getAiActivity ( hlNpc )
r2.Translator . translateActivities ( context , hlNpc , hlNpc : getBehavior ( ) , rtNpcGrp , aiActivity )
end
-- set eventHandlers
r2.Translator . translateEventHandlers ( context , hlNpc , hlNpc : getBehavior ( ) . Actions , rtNpcGrp )
end
key , comp = next ( components , key )
end
end
function Translator . pretranslateDefaultFeature ( this , context )
local components = this.Components
local key , comp = next ( components , nil )
while ( key ~= nil ) do
if ( comp.isKindOf and comp : isKindOf ( " Npc " ) ) then
local rtNpcGrp = r2.Translator . getRtGroup ( context , comp.InstanceId )
end
key , comp = next ( components , key )
end
end
function Translator . pretranslateDefaultFeature2 ( this , context )
local components = this.Components
local key , comp = next ( components , nil )
while ( key ~= nil ) do
if ( comp.isKindOf and comp : isKindOf ( " Npc " ) ) then
local rtNpcGrp = r2.Translator . getRtGroup ( context , comp.InstanceId )
-- set activity
local hlNpc = comp
context.Feature = hlNpc
local aiActivity = r2.Translator . getAiActivity ( hlNpc )
r2.Translator . translateActivities ( context , hlNpc , hlNpc : getBehavior ( ) , rtNpcGrp , aiActivity )
end
key , comp = next ( components , key )
end
end
function Translator . getDefaultFeatureActivitiesIds ( this )
local activitiesIds = { }
local function getActivitiesIdsFrom ( entity )
local components = entity.Components
local key , comp = next ( components , nil )
while ( key ~= nil )
do
-- Npc case (npc alone not object)
if ( comp.isKindOf and comp : isKindOf ( " Npc " ) ) then
local behavior = comp : getBehavior ( )
local k , v = next ( behavior.Activities , nil )
while k do
table.insert ( activitiesIds , v.InstanceId )
k , v = next ( behavior.Activities , k )
end
else
if comp.Components then
getActivitiesIdsFrom ( comp )
end
end
key , comp = next ( components , key )
end
end
getActivitiesIdsFrom ( this )
return activitiesIds
end
--function Translator.getTopParentTreeNode(instance)
-- local tmpInstance = instance
-- if tmpInstance.ParentInstance.Class ~= "LogicEntity" and tmpInstance.ParentInstance.Class ~= "DefaultFeature"
-- and tmpInstance.ParentInstance.Class ~= "Act" then
-- return tmpInstance:getFeatureParentTreeNode()--tmpInstance:getParentTreeNode()
-- else
-- return tmpInstance:getFeatureParentTreeNode()
-- end
--end
function Translator . getDebugBase ( base )
if dataDevMode then
return " palette.entities.botobjects.milestone "
else
return base
end
end
function Translator . getDebugCreature ( creature )
if dataDevMode then
return " object_milestone.creature "
else
return creature
end
end
-- feature generic activate & deactivate
function Translator . getFeatureActivationLogicAction ( rtNpcGrp , action )
if ( action.Action . Type == " activate " ) then
local action1 = r2.Translator . createAction ( " set_value " , rtNpcGrp.Id , " Active " , 1 )
local action2 = r2.Translator . createAction ( " user_event_trigger " , rtNpcGrp.Id , 4 )
local retAction = r2.Translator . createAction ( " multi_actions " , { action1 , action2 } )
assert ( retAction )
return retAction , retAction
elseif ( action.Action . Type == " deactivate " ) then
local action1 = r2.Translator . createAction ( " set_value " , rtNpcGrp.Id , " Active " , 0 )
local action2 = r2.Translator . createAction ( " user_event_trigger " , rtNpcGrp.Id , 5 )
local retAction = r2.Translator . createAction ( " multi_actions " , { action1 , action2 } )
assert ( retAction )
return retAction , retAction
end
return nil , nil
end
function Translator . getFeatureActivationLogicEvent ( rtNpcGrp , event )
local eventType = event.Event . Type
if eventType == " activation " then
return r2.Translator . getComponentUserEvent ( rtNpcGrp , 4 )
elseif eventType == " deactivation " then
return r2.Translator . getComponentUserEvent ( rtNpcGrp , 5 )
end
return nil , nil , nil
end
function Translator . getFeatureActivationCondition ( condition , rtNpcGrp )
if condition.Condition . Type == " is active " then
local action1 = r2.Translator . createAction ( " if_value_equal " , rtNpcGrp.Id , " Active " , 1 ) ;
return action1 , action1
elseif condition.Condition . Type == " is inactive " then
local action1 = r2.Translator . createAction ( " if_value_equal " , rtNpcGrp.Id , " Active " , 0 ) ;
return action1 , action1
end
return nil , nil
end
function Translator . translateFeatureActivation ( instance , context )
local rtNpcGrp = r2.Translator . getRtGroup ( context , instance.InstanceId )
assert ( rtNpcGrp )
if instance.Active and instance.Active == 1 then
local action1 = r2.Translator . createAction ( " set_value " , rtNpcGrp.Id , " Active " , 1 )
local action2 = r2.Translator . createAction ( " user_event_trigger " , rtNpcGrp.Id , 4 )
local retAction = r2.Translator . createAction ( " multi_actions " , { action1 , action2 } )
r2.Translator . translateAiGroupEvent ( " start_of_state " , instance , context , retAction )
else
local retAction = r2.Translator . createAction ( " set_value " , rtNpcGrp.Id , " Active " , 0 )
r2.Translator . translateAiGroupEvent ( " start_of_state " , instance , context , retAction )
end
end
function Translator . addActivationToTranslations ( logicTranslations )
if logicTranslations.ApplicableActions == nil then logicTranslations.ApplicableActions = { } end
--logicTranslations.ApplicableActions.activate = {menu=i18n.get("uiR2EdActivate"):toUtf8(), text="activates"}
--logicTranslations.ApplicableActions.deactivate = {menu=i18n.get("uiR2EdDesactivate"):toUtf8(), text="deactivates"}
--logicTranslations.ApplicableActions.trigger = {menu=i18n.get("uiR2EdTrigger"):toUtf8(), text="triggers"}
if logicTranslations.Events == nil then logicTranslations.Events = { } end
--logicTranslations.Events.activation = {menu=i18n.get("uiR2EdActivation"):toUtf8(), text=r2:lowerTranslate("uiR2EdActivation")}
--logicTranslations.Events.deactivation = {menu=i18n.get("uiR2EdDesactivation"):toUtf8(), text=r2:lowerTranslate("uiR2EdDesactivation")}
--logicTranslations.Events.trigger = {menu=i18n.get("uiR2EdTrigger"):toUtf8(), text=r2:lowerTranslate("uiR2EdTrigger")}
if logicTranslations.Conditions == nil then logicTranslations.Conditions = { } end
--logicTranslations.Conditions["is active"] = {menu=i18n.get("uiR2EdIsActive"):toUtf8(), text=r2:lowerTranslate("uiR2EdIsActive")}
--logicTranslations.Conditions["is inactive"] = {menu=i18n.get("uiR2EdIsInactive"):toUtf8(), text=r2:lowerTranslate("uiR2EdIsInactive")}
return logicTranslations
end
function Translator . CreateUserComponent ( featureName )
if not featureName or featureName == " " then
debugInfo ( " Translator: calling createUserComponent on nil or empty featureName " )
return
end
local function posOk ( x , y , z )
debugInfo ( string.format ( " Validate creation of ' " .. featureName .. " ' at pos (%d, %d, %d) " , x , y , z ) )
local component = r2.Features [ featureName ] . createUserComponent ( x , y )
component.Texts = nil
r2.requestInsertNode ( r2 : getCurrentAct ( ) . InstanceId , " Features " , - 1 , " " , component )
end
local function posCancel ( )
debugInfo ( " Cancel choice ' " .. featureName .. " ' position " )
end
r2 : choosePos ( " object_component_user_event.creature " , posOk , posCancel , " " )
end
function Translator . CheckPickedEntity ( component , prop )
local k , v = next ( prop , nil )
while k do
local property = v
if property.Type and property.Type == " RefId " then
local this = r2 : getInstanceFromId ( component.InstanceId )
local targetId = this [ property.Name ]
if targetId ~= r2.RefId ( " " ) then
debugInfo ( " targetId: " .. targetId )
local filterFunc = " return " .. property.PickFunction .. " (' " .. targetId .. " ') "
debugInfo ( " filterfunc: " .. filterFunc )
local ok = loadstring ( filterFunc ) ( )
if ok == false then
debugInfo ( " name: " .. property.Name )
r2.requestSetNode ( this.InstanceId , property.Name , r2.RefId ( " " ) )
end
end
end
k , v = next ( prop , k )
end
end
function Translator . checkActForPicking ( componentId , entityId )
local component = r2 : getInstanceFromId ( componentId )
assert ( component )
--debugInfo("CheckActForPicking: EntityId =" ..entityId)
--inspect(component)
local entity = r2 : getInstanceFromId ( entityId )
assert ( entity )
return entity : getParentAct ( ) . InstanceId == r2.Scenario . Acts [ 0 ] . InstanceId
or entity : getParentAct ( ) . InstanceId == component : getParentAct ( ) . InstanceId
end
function Translator . getEventFromType ( instance , context , eventType )
if not context or not instance or not instance.getLogicEvent then return nil end
local fakeEvent = { }
fakeEvent.Class = " LogicEntityAction "
fakeEvent.Event = { }
fakeEvent.Event . Type = eventType
return instance : getLogicEvent ( context , fakeEvent )
end
----------------------------------------
--- TASK MODULE ------------------------
----------------------------------------
Translator.Tasks = { }
--Start of state (init) = event 7
function Translator . Tasks . startOfStateLogic ( component , context , rtGrp )
do
local action = r2.Translator . createAction ( " user_event_trigger " , rtGrp.Id , 7 )
r2.Translator . translateAiGroupEvent ( " start_of_state " , component , context , action )
end
do
local repeatable = component.Repeatable
if not repeatable then repeatable = 0 end
local rtAction1 = r2.Translator . createAction ( " set_value " , rtGrp.Id , " Active " , component.Active )
local rtAction2 = r2.Translator . createAction ( " set_value " , rtGrp.Id , " v1 " , repeatable )
local rtAction3 = r2.Translator . createAction ( " set_value " , rtGrp.Id , " v2 " , 0 )
local rtAction3 = r2.Translator . createAction ( " set_value " , rtGrp.Id , " v3 " , 0 ) -- Success
local rtAction = r2.Translator . createAction ( " multi_actions " , { rtAction1 , rtAction2 , rtAction3 , } )
r2.Translator . translateAiGroupEvent ( " user_event_7 " , component , context , rtAction )
end
end
--Activation = event 4
function Translator . Tasks . activationLogic ( component , context , rtGrp )
do
local repeatable = component.Repeatable
if not repeatable then repeatable = 0 end
local rtAction1 = r2.Translator . createAction ( " set_value " , rtGrp.Id , " Active " , 1 )
local rtAction2 = r2.Translator . createAction ( " set_value " , rtGrp.Id , " v1 " , repeatable )
local rtAction3 = r2.Translator . createAction ( " set_value " , rtGrp.Id , " v2 " , 0 ) -- Success
local rtAction = r2.Translator . createAction ( " multi_actions " , { rtAction1 , rtAction2 , rtAction3 , } )
r2.Translator . translateAiGroupEvent ( " user_event_4 " , component , context , rtAction )
end
end
--Deactivation = event 5
function Translator . Tasks . deactivationLogic ( component , context , rtGrp )
do
local rtAction = r2.Translator . createAction ( " multi_actions " , {
r2.Translator . createAction ( " set_value " , rtGrp.Id , " Active " , 0 ) ,
r2.Translator . createAction ( " set_value " , rtGrp.Id , " v2 " , 0 ) ,
} )
r2.Translator . translateAiGroupEvent ( " user_event_5 " , component , context , rtAction )
end
end
--When using talkTo, giveItem or requestItem actions, event 3 is emitted when the player took the missin (contextual validation)
function Translator . Tasks . setStatusLogic ( component , context , rtGrp )
do
local action = r2.Translator . createAction ( " set_value " , rtGrp.Id , " v2 " , 1 )
r2.Translator . translateAiGroupEvent ( " user_event_3 " , component , context , action )
end
end
--Success = event 9
--No broadcast means the broadcast action is done elsewhere in the translate (not on success)
function Translator . Tasks . successNoBroadcastLogic ( component , context , rtGrp )
do
--if repeatable
local action1 = r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " v1 " , 1 ,
r2.Translator . createAction ( " multi_actions " , {
r2.Translator . createAction ( " set_value " , rtGrp.Id , " Active " , 1 ) ,
r2.Translator . createAction ( " set_value " , rtGrp.Id , " v2 " , 0 ) ,
r2.Translator . createAction ( " set_value " , rtGrp.Id , " v3 " , 1 ) ,
} )
) ;
--if not repeatable
local action2 = r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " v1 " , 0 ,
r2.Translator . createAction ( " multi_actions " , {
r2.Translator . createAction ( " set_value " , rtGrp.Id , " Active " , 0 ) ,
r2.Translator . createAction ( " set_value " , rtGrp.Id , " v2 " , 2 ) ,
r2.Translator . createAction ( " set_value " , rtGrp.Id , " v3 " , 1 ) ,
r2.Translator . createAction ( " user_event_trigger " , rtGrp.Id , 5 ) ,
} )
) ;
local actions = r2.Translator . createAction ( " multi_actions " , { action1 , action2 } )
local action = r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " v2 " , 2 ,
r2.Translator . createAction ( " condition_if " , r2 : getNamespace ( ) .. rtGrp.Id .. " .Active == 1 " , actions ) )
r2.Translator . translateAiGroupEvent ( " user_event_9 " , component , context , action )
end
end
--Success with broadcast : for components using event 8 as an intermediate step.
function Translator . Tasks . successBroadcastLogic ( component , context , rtGrp )
local validationNeeded = component.ValidationNeeded
local action2 = r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " v1 " , 1 , --if Repeatable
r2.Translator . createAction ( " multi_actions " , {
r2.Translator . createAction ( " set_value " , rtGrp.Id , " Active " , 1 ) ,
r2.Translator . createAction ( " set_value " , rtGrp.Id , " v2 " , 0 ) ,
r2.Translator . createAction ( " set_value " , rtGrp.Id , " v3 " , 1 ) ,
} )
) ;
local action3 = r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " v1 " , 0 , -- if not Repeatable
r2.Translator . createAction ( " multi_actions " , {
r2.Translator . createAction ( " set_value " , rtGrp.Id , " Active " , 0 ) ,
r2.Translator . createAction ( " set_value " , rtGrp.Id , " v2 " , 2 ) ,
r2.Translator . createAction ( " set_value " , rtGrp.Id , " v3 " , 1 ) ,
r2.Translator . createAction ( " user_event_trigger " , rtGrp.Id , 5 )
} )
) ;
local actions = { }
if validationNeeded == 1 then
actions = { action2 , action3 }
else
local baseAct = r2.Scenario : getBaseAct ( )
local baseActRtGrp = r2.Translator . getRtGroup ( context , baseAct.InstanceId )
local actionBroadcast = r2.Translator . createAction ( " broadcast_msg " , baseActRtGrp.Id , component : textAdapter ( component.BroadcastText ) )
actions = { action2 , action3 , actionBroadcast }
end
local multiActions = r2.Translator . createAction ( " multi_actions " , actions )
local action = r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " v2 " , 2 ,
r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " Active " , 1 , multiActions ) )
r2.Translator . translateAiGroupEvent ( " user_event_9 " , component , context , action )
end
--When validation is needed, emit success event when targeting mission giver
function Translator . Tasks . validationByMissionGiver ( component , giver , context , rtGrp )
local rtGiverGrp = r2.Translator . getRtGroup ( context , giver.InstanceId )
assert ( rtGiverGrp )
do
local actionEvent = r2.Translator . createAction ( " user_event_trigger " , rtGrp.Id , 9 )
local action1 = r2.Translator . createAction ( " npc_say " , component : textAdapter ( component.MissionSucceedText ) , rtGiverGrp.Id .. " : " .. giver.Name )
local action = r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " v2 " , 2 ,
r2.Translator . createAction ( " condition_if " , r2 : getNamespace ( ) .. rtGrp.Id .. " .Active == 1 " ,
r2.Translator . createAction ( " multi_actions " , { actionEvent , action1 } ) ) )
r2.Translator . translateAiGroupEvent ( " player_target_npc " , giver , context , action )
end
end
-- when receiving event 8, just broadcast a msg indicating that the mission is successful but that the player has
-- to go back to the giver to complete it.
function Translator . Tasks . broadcastOnEvent8 ( component , context )
local baseAct = r2.Scenario : getBaseAct ( )
local baseActRtGrp = r2.Translator . getRtGroup ( context , baseAct.InstanceId )
local actionBroadcast = r2.Translator . createAction ( " broadcast_msg " , baseActRtGrp.Id , component : textAdapter ( component.BroadcastText ) )
r2.Translator . translateAiGroupEvent ( " user_event_8 " , component , context , actionBroadcast )
end
function Translator . Tasks . giverLogic ( component , giver , context , rtGrp )
local rtGiverGrp = r2.Translator . getRtGroup ( context , giver.InstanceId )
assert ( rtGiverGrp )
local actionWaitValidation = r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " Active " , 1 , -- Active
r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " v2 " , 1 , -- giver has been spoken to
r2.Translator . createAction ( " multi_actions " , {
r2.Translator . createAction ( " npc_say " , component : textAdapter ( component.WaitValidationText ) , rtGiverGrp.Id .. " : " .. giver.Name ) ,
r2.Translator . createAction ( " user_event_trigger " , rtGrp.Id , 2 )
} ) ) )
--say mission text + contextual text (talk to)
local multiActions = r2.Translator . createAction ( " multi_actions " , {
r2.Translator . createAction ( " npc_say " , component : textAdapter ( component.MissionText ) , rtGiverGrp.Id .. " : " .. giver.Name ) ,
r2.Translator . createAction ( " talk_to " , rtGrp.Id , component : textAdapter ( component.ContextualText ) ) ,
} )
local actionTalkTo = r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " Active " , 1 , -- Active
r2.Translator . createAction ( " if_value_equal " , rtGrp.Id , " v2 " , 0 , multiActions ) )
local rtAction = r2.Translator . createAction ( " multi_actions " , { actionWaitValidation , actionTalkTo } )
r2.Translator . translateAiGroupEvent ( " player_target_npc " , giver , context , rtAction )
end