khanat-client-data-NeL/data/ryz/ryz_ring/r2_features_bandits_camp.lua

901 lines
30 KiB
Lua
Raw Blame History

r2.Features.BanditCampFeature = {}
local feature = r2.Features.BanditCampFeature
feature.Name = "BanditCampFeature"
feature.BanditCount = 0
feature.Description = "A bandits camp feature"
feature.Components = {}
local BanditZoneRadius = 5
local BanditZoneNumCorners = 6
local BanditCampVersion = 2
feature.Components.BanditCamp =
{
BaseClass = "LogicEntity",
Name = "BanditCamp",
InEventUI = true,
Menu = "ui:interface:r2ed_feature_menu",
Version = BanditCampVersion,
DisplayerUI = "R2::CDisplayerLua",
DisplayerUIParams = "defaultUIDisplayer",
DisplayerVisual = "R2::CDisplayerVisualEntity",
-----------------------------------------------------------------------------------------------
Parameters = {
},
ApplicableActions = {
"activate",
"deactivate", "Wander", "Sit Down",
"Kill"
},
Events = {
"activation",
"deactivation",
"member death", "group death",
"head to wander zone", "arrive at wander zone", "head to camp",
"arrive at camp"
},
Conditions = {
"is active", "is inactive",--"is dead",
"is wandering", "is sitting",
"is heading to wander zone", "is heading to camp"
},
TextContexts = {
},
TextParameters = {
"max bandits number", "still alive bandits number"
},
LiveParameters = {
"is active", "alive bandits number",
"max bandits number", state = {"sitting", "heading to wander", "wandering or heading home"}
},
-----------------------------------------------------------------------------------------------
--Category = "uiR2EDRollout_BanditsCamp",
Prop =
{
{Name = "InstanceId", Type = "String", WidgetStyle = "StaticText", Visible = false},
{Name = "Components", Type = "Table"},
{Name = "Name", Type="String", MaxNumChar="32"},
{Name = "BanditsCount", Type = "String", WidgetStyle = "StaticText"},
{Name = "Race", Type = "String", WidgetStyle = "StaticText"},
{Name = "BanditsLevel", Type = "String", WidgetStyle = "StaticText"},
--{Name = "Cycle", Type = "Number", Min = "10", Max = "999999", DefaultValue = "30"},
{Name = "SitDuration", Type = "Number", Min = "10", Max = "999999", DefaultValue = "20"},
{Name = "WanderDuration", Type = "Number", Min = "10", Max = "999999", DefaultValue = "20"},
--{Name = "Behavior", Type = "Table"},
{Name = "Cost", Type = "Number", Visible = false },
{Name = "Ghosts", Type = "Table", Visible = false },
{Name = "Active", Type = "Number", WidgetStyle="Boolean", DefaultValue="1" },
{Name = "NoRespawn", Type ="Number", WidgetStyle = "Boolean", DefaultValue="0"},
},
-----------------------------------------------------------------------------------------------
-- from base class
getParentTreeNode = function(this)
return this:getFeatureParentTreeNode()
end,
---------------------------------------------------------------------------------------------------------
-- from base class
appendInstancesByType = function(this, destTable, kind)
assert(type(kind) == "string")
--this:delegate():appendInstancesByType(destTable, kind)
r2.Classes.LogicEntity.appendInstancesByType(this, destTable, kind)
for k, component in specPairs(this.Components) do
component:appendInstancesByType(destTable, kind)
end
end,
---------------------------------------------------------------------------------------------------------
-- from base class
getSelectBarSons = function(this)
return Components
end,
---------------------------------------------------------------------------------------------------------
-- from base class
canHaveSelectBarSons = function(this)
return false;
end,
onPostCreate = function(this)
--this:createGhostComponents()
if this.User.DisplayProp and this.User.DisplayProp == 1 then
r2:setSelectedInstanceId(this.InstanceId)
r2:showProperties(this)
this.User.DisplayProp = nil
end
end,
translate = function(this, context)
r2.Translator.translateAiGroup(this, context)
r2.Translator.translateFeatureActivation(this, context)
end,
pretranslate = function(this, context)
r2.Translator.createAiGroup(this, context)
end,
updateVersion = function(this, scenarioValue, currentValue )
local patchValue = scenarioValue
if patchValue < 1 then
r2.requestEraseNode(this.InstanceId, "Cost", -1)
patchValue = 1
end
if patchValue < 2 then
local invalidEvents = {}
invalidEvents["desactivation"] = "deactivation"
r2.updateLogicEvents(this, invalidEvents)
r2.requestSetNode(this.InstanceId, "BanditsLevel", "22")
patchValue = 2
end
if patchValue == currentValue then return true end
return false
end,
}
local component = feature.Components.BanditCamp
function component.onPostCreate(this)
if this.User.DisplayProp and this.User.DisplayProp == 1 then
r2:setSelectedInstanceId(this.InstanceId)
r2:showProperties(this)
this.User.DisplayProp = nil
end
this:setLocalCost(_BanditCount)
local comp = this
if comp._Seed then math.randomseed(comp._Seed) end
do
local x = comp.Position.x
local y = comp.Position.y
local n = comp._BanditsCount
local pas = (2 * math.pi)/n
local r = (n/(2*math.pi))+2
for i = 1, n do
local npc = r2:randomNPC( component.getBanditPaletteId(comp), component.Races[comp._Race + 1])
npc.Position.x = (r-1) * math.cos((i-1)*pas) -- make position relative to the feature positio
npc.Position.y = (r-1) * math.sin((i-1)*pas)
npc.Position.z = 0
npc.Angle = (i-1)*pas + math.pi
r2.requestInsertGhostNode(this.InstanceId, "Ghosts", -1, "", npc)
local comp = r2:getInstanceFromId(npc.InstanceId)
comp.Selectable = false
end
end
end
function component.onPostHrcMove(this)
for i=0, this.Ghosts.Size-1 do
local entity = this.Ghosts[i]
entity.DisplayerVisual:updateName()
entity:updatePermanentStatutIcon()
end
r2.events:updateElementsUI()
end
function component:getLogicTranslations()
local logicTranslations = {
["ApplicableActions"] = {
["activate"] = { menu=i18n.get( "uiR2AA0Spawn" ):toUtf8(),
text=i18n.get( "uiR2AA1Spawn" ):toUtf8()},
["deactivate"] = { menu=i18n.get( "uiR2AA0Despawn" ):toUtf8(),
text=i18n.get( "uiR2AA1Despawn" ):toUtf8()},
["Wander"] = { menu=i18n.get( "uiR2AA0BanditWander" ):toUtf8(),
text=i18n.get( "uiR2AA1BanditWander" ):toUtf8()},
["Sit Down"] = { menu=i18n.get( "uiR2AA0BanditSitDown" ):toUtf8(),
text=i18n.get( "uiR2AA1BanditSitDown" ):toUtf8()},
["Kill"] = { menu=i18n.get( "uiR2AA0BanditKill" ):toUtf8(),
text=i18n.get( "uiR2AA1BanditKill" ):toUtf8()},
},
["Events"] = {
["activation"] = { menu=i18n.get( "uiR2Event0Spawn" ):toUtf8(),
text=i18n.get( "uiR2Event1Spawn" ):toUtf8()},
["deactivation"] = { menu=i18n.get( "uiR2Event0Despawn" ):toUtf8(),
text=i18n.get( "uiR2Event1Despawn" ):toUtf8()},
["member death"] = { menu=i18n.get( "uiR2Event0MemberDeath" ):toUtf8(),
text=i18n.get( "uiR2Event1MemberDeath" ):toUtf8()},
["group death"] = { menu=i18n.get( "uiR2Event0GroupDeath" ):toUtf8(),
text=i18n.get( "uiR2Event1GroupDeath" ):toUtf8()},
["head to wander zone"] = { menu=i18n.get( "uiR2Event0BanditHeadWander" ):toUtf8(),
text=i18n.get( "uiR2Event1BanditHeadWander" ):toUtf8()},
["arrive at wander zone"] = { menu=i18n.get( "uiR2Event0BanditArriveWander" ):toUtf8(),
text=i18n.get( "uiR2Event1BanditArriveWander" ):toUtf8()},
["head to camp"] = { menu=i18n.get( "uiR2Event0BanditHeadCamp" ):toUtf8(),
text=i18n.get( "uiR2Event1BanditHeadCamp" ):toUtf8()},
["arrive at camp"] = { menu=i18n.get( "uiR2Event0BanditArriveCamp" ):toUtf8(),
text=i18n.get( "uiR2Event1BanditArriveCamp" ):toUtf8()},
},
["Conditions"] = {
["is active"] = { menu=i18n.get( "uiR2Test0Spawned" ):toUtf8(),
text=i18n.get( "uiR2Test1Spawned" ):toUtf8()},
["is inactive"] = { menu=i18n.get( "uiR2Test0Despawned" ):toUtf8(),
text=i18n.get( "uiR2Test1Despawned" ):toUtf8()},
["is dead"] = { menu=i18n.get( "uiR2Test0BanditDead" ):toUtf8(),
text=i18n.get( "uiR2Test1BanditDead" ):toUtf8()},
["is wandering"] = { menu=i18n.get( "uiR2Test0BanditPatrolZone" ):toUtf8(),
text=i18n.get( "uiR2Test1BanditPatrolZone" ):toUtf8()},
["is sitting"] = { menu=i18n.get( "uiR2Test0BanditAtCamp" ):toUtf8(),
text=i18n.get( "uiR2Test1BanditAtCamp" ):toUtf8()},
["is heading to wander zone"]= {menu=i18n.get( "uiR2Test0BanditHeadPatrolZone" ):toUtf8(),
text=i18n.get( "uiR2Test1BanditHeadPatrolZone" ):toUtf8()},
["is heading to camp"] = { menu=i18n.get( "uiR2Test0BanditHeadCamp" ):toUtf8(),
text=i18n.get( "uiR2Test1BanditHeadCamp" ):toUtf8()},
}
}
return logicTranslations
end
component.getLogicAction = function(entity, context, action)
assert( action.Class == "ActionStep")
local component = r2:getInstanceFromId(action.Entity)
assert(component)
local rtNpcGrp = r2.Translator.getRtGroup(context, component.InstanceId)
assert(rtNpcGrp)
local banditEntity = r2:getInstanceFromId(component.User._BanditGroup)
BOMB_IF(banditEntity, "In feature '".. component.Name .. "' associated bandit camp not found.")
local banditRtNpcGrp = r2.Translator.getRtGroup( context, banditEntity.InstanceId)
BOMB_IF(banditEntity, "In feature '" .. component.Name .. "' associated bandit camp rtGroup not found.")
if action.Action.Type == "deactivate" then
local action1 = r2.Translator.createAction("set_value", rtNpcGrp.Id, "Active", 0)
local action2 = r2.Translator.getNpcLogicActionDeactivate(banditEntity, context, action, banditRtNpcGrp)
local action3 = r2.Translator.createAction("user_event_trigger", rtNpcGrp.Id, 5)
local multiaction = r2.Translator.createAction("multi_actions", {action1, action2, action3})
return multiaction, multiaction
elseif action.Action.Type == "activate" then
local action1 = r2.Translator.createAction("set_value", rtNpcGrp.Id, "Active", 1)
local action2 = r2.Translator.getNpcLogicActionActivate(banditEntity, context, action, banditRtNpcGrp)
local action3 = r2.Translator.createAction("user_event_trigger", rtNpcGrp.Id, 4)
local multiaction = r2.Translator.createAction("multi_actions", {action1, action2, action3})
return multiaction, multiaction
elseif action.Action.Type == "Kill" then
return r2.Translator.getNpcLogicActionKill(banditEntity, context, action, banditRtNpcGrp)
elseif action.Action.Type == "Sit Down" then
return r2.Translator.getGenericLogicActionBeginActivitySequence(entity.User._SequenceHeadToFire, banditRtNpcGrp)
elseif action.Action.Type == "Wander" then
return r2.Translator.getGenericLogicActionBeginActivitySequence(entity.User._SequenceHeadToWander, banditRtNpcGrp)
end
local firstAction, lastAction = nil,nil
return firstAction, lastAction
end
component.getLogicCondition = function(this, context, condition)
assert( condition.Class == "ConditionStep")
local component = r2:getInstanceFromId(condition.Entity)
assert(component)
local rtNpcGrp = r2.Translator.getRtGroup(context, component.InstanceId)
assert(rtNpcGrp)
local banditEntity = r2:getInstanceFromId(component.User._BanditGroup)
BOMB_IF(banditEntity, "In feature '".. component.Name .. "' associated bandit camp not found.")
local banditRtNpcGrp = r2.Translator.getRtGroup( context, banditEntity.InstanceId)
BOMB_IF(banditEntity, "In feature '" .. component.Name .. "' associated bandit camp rtGroup not found.")
local conditionType = condition.Condition.Type
if conditionType == "is wandering" then
return r2.Translator.getGenericLogicConditionIsInActivitySequence(banditEntity, component.User._SequenceWander, banditRtNpcGrp)
elseif conditionType == "is sitting" then
return r2.Translator.getGenericLogicConditionIsInActivitySequence(banditEntity, component.User._SequenceStayNearFire, banditRtNpcGrp)
elseif conditionType == "is heading to wander zone" then
return r2.Translator.getGenericLogicConditionIsInActivitySequence(banditEntity, component.User._SequenceHeadToWander, banditRtNpcGrp)
elseif conditionType == "is heading to camp" then
return r2.Translator.getGenericLogicConditionIsInActivitySequence(banditEntity, component.User._SequenceHeadToFire, banditRtNpcGrp)
end
return r2.Translator.getFeatureActivationCondition(condition, rtNpcGrp)
end
component.getLogicEvent = function(this, context, event)
assert( event.Class == "LogicEntityAction")
local component = this -- r2:getInstanceFromId(event.Entity)
assert(component)
local rtNpcGrp = r2.Translator.getRtGroup(context, component.InstanceId)
assert(rtNpcGrp)
local banditEntity = r2:getInstanceFromId(component.User._BanditGroup)
BOMB_IF(banditEntity, "In feature '".. component.Name .. "' associated bandit camp not found.")
local banditRtNpcGrp = r2.Translator.getRtGroup( context, banditEntity.InstanceId)
BOMB_IF(banditEntity, "In feature '" .. component.Name .. "' associated bandit camp rtGroup not found.")
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)
elseif eventType == "member death" or eventType == "group death" then
return r2.Translator.getNpcLogicEvent(banditEntity, context, event)
elseif eventType == "head to wander zone" then
return r2.Translator.getNpcLogicEventBeginOfActivityStepImpl(this.User._StepHeadToWander, banditRtNpcGrp)
elseif eventType == "arrive at wander zone" then
return r2.Translator.getNpcLogicEventEndOfActivityStepImpl(this.User._StepHeadToWander, banditRtNpcGrp)
elseif eventType == "head to camp" then
return r2.Translator.getNpcLogicEventBeginOfActivityStepImpl(this.User._StepHeadToFire, banditRtNpcGrp)
elseif eventType == "arrive at camp" then
return r2.Translator.getNpcLogicEventEndOfActivityStepImpl(this.User._StepHeadToFire, banditRtNpcGrp)
end
local eventHandler, firsCondition, lastCondition = nil, nil, nil
return eventHandler, firsCondition, lastCondition
end
component.Races = { [1] = "Fyros", [2] = "Matis", [3] = "Tryker", [4] = "Zorai"}
component.RacesId = { [1] = "f", [2] = "m", [3] = "t", [4] = "z"}
component.LevelsId = { [1] = "20", [2] = "70", [3] = "120", [4] = "170", [5] = "220"}
component.RolesId = {
[1] = "melee_dd", [2] = "melee_tank", [3] = "light_melee", [4] = "mage_damage_dealer",
[5] = "mage_aoe", [6] = "mage_atysian_curser", [7] = "mage_celestial_curser"
}
--component.createComponent = function(x, y, banditsCount, race, banditsLevel, cycle, ZoneSize)
component.createComponent = function(x, y, banditsCount, race, banditsLevel, ZoneSize)
r2.requestNewAction(i18n.get("uiR2EDCreateBanditCampAction"))
local comp = r2.newComponent("BanditCamp")
assert(comp)
-- base is the camp fire, to display the bandit camp as a camp fire
comp.Base = "palette.entities.botobjects.campfire"
--feature.BanditCount = feature.BanditCount + 1
--comp.Name = "BanditCampFeature[".. feature.BanditCount .."]"
comp.Name = r2:genInstanceName(i18n.get("uiR2EDNameBanditCampFeature")):toUtf8()
local fire = comp.Fire
--do
-- fire.Base = "palette.entities.botobjects.campfire"
-- fire.Name = "Camp Fire"
-- local tmpPosition = fire.Position
-- tmpPosition.x = x
-- tmpPosition.y = y
-- tmpPosition.z = r2:snapZToGround(x, y)
--end
comp.Position.x = x
comp.Position.y = y
comp.Position.z = r2:snapZToGround(x, y)
comp._BanditsCount = banditsCount
comp._Race = race
comp._BanditsLevel = banditsLevel
comp.BanditsCount = tostring(banditsCount)
comp.Race = component.Races[race+1]
comp.BanditsLevel = component.LevelsId[banditsLevel + 1]
--comp.Cycle = cycle
comp.WanderDuration = 20
comp.SitDuration = 20
comp.ZoneSize = tostring(ZoneSize)
local zone = r2.newComponent("Region")
r2.Utils.createNonDeleteableRegion(zone, 0, 0, BanditZoneRadius, BanditZoneNumCorners) -- the region doesn't inherit the feature position, so must give its pos
zone.Deletable = 0
zone.Position.x = comp.Position.x
zone.Position.y = comp.Position.y
zone.Position.z = comp.Position.z
zone.InheritPos = 0 -- don't inherit position of parents
zone.Name = r2:genInstanceName(i18n.get("uiR2EDNameWanderRegion")):toUtf8()
comp._Zone = zone.InstanceId
table.insert(comp.Components, zone)
comp._Seed = os.time()
-- r2.registerText("Pas fach<63> que cette journ<72>e se termine !")
-- r2.registerText("On rentre a la maison!")
-- r2.registerText("Asseyez vous mes fr<66>res!")
-- r2.registerText("Allons detrousser les honnetes gens!")
-- r2.registerText("Allez, au boulot!")
-- r2.registerText("A l'attaque!!")
return comp
end
-- Global function are bad
function updateBanditCampEnum()
local currentForm = r2.CurrentForm
if (currentForm == nil) then
return
end
local formRace = currentForm:find("Race")
if not formRace then
return
end
local formLevel = currentForm:find("BanditsLevel")
if not formLevel then
return
end
local previousLevel = formLevel.selection
formLevel:resetTexts()
local k, v = next(component.LevelsId, nil)
while k do
local race = component.RacesId[formRace.selection + 1]
local level = v
local elementName = "palette.entities.npcs.bandits."..race.."_melee_dd_"..tostring(level)
local ok = false
if r2.isInPalette(elementName) then
local paletteElt = r2.getPaletteElement(elementName)
if paletteElt and paletteElt.RingAccess and r2.RingAccess.testAccess(paletteElt.RingAccess) then
formLevel:addText(ucstring(tostring(level)))
ok = true
-- local levelEnum = currentForm:find(creature.."Level")
end
end
if k == previousLevel and not ok then
formLevel.selection = 0
end
k, v = next(component.LevelsId, k)
end
end
local function initValue()
local toRet = {}
local k, v = next(component.LevelsId, nil)
while k do
local race = component.RacesId[0+ 1]
local level = v
local elementName = "palette.entities.npcs.bandits."..race.."_melee_dd_"..tostring(level)
if r2.isInPalette(elementName) then
local paletteElt = r2.getPaletteElement(elementName)
if paletteElt and paletteElt.RingAccess and r2.RingAccess.testAccess(paletteElt.RingAccess) then
table.insert(toRet, level)
end
end
k, v = next(component.LevelsId, k)
end
return toRet
end
function feature.registerForms()
r2.Forms.BanditCamp_Form =
{
Caption = "uiR2EDBanditCamp",
Prop =
{
-- following field are tmp for property sheet building testing
{Name = "BanditsCount", Type = "Number", Category = "uiR2EDRollout_BanditsCamp", Min = "1", Max = "12", Default = "6"},
{Name = "Race", Type = "Number", WidgetStyle = "EnumDropDown", Category = "uiR2EDRollout_BanditsCamp",
Enum = component.Races,
onChange = updateBanditCampEnum
},
{Name = "BanditsLevel", Type = "Number", WidgetStyle = "EnumDropDown", Category = "uiR2EDRollout_BanditsCamp",
Enum = initValue(),
onChange = updateBanditCampEnum
},
--{Name = "Cycle", Type = "Number", Category = "uiR2EDRollout_BanditsCamp", Min = "0", Max = "999999", Default = "30"},
}
}
end
-- read values from a BanditsComp and get Sheet Id
component.getBanditPaletteId = function(comp)
-- local tmpId = "palette.entities.npcs.cuthroats.cuthroat_b_melee_a_z_f"
-- return tmpId
local id = "palette.entities.npcs.bandits." ..
component.RacesId[comp._Race + 1] .."_" ..
component.RolesId[math.random(0,5) + 1] .."_" ..
component.LevelsId[comp._BanditsLevel + 1]
return id
end
component.init = function()
math.randomseed( os.time() ) -- To remove
end
component.createGhostComponents = function(comp, act)
local bandits
local npcGroup = r2.newComponent("NpcGrpFeature")
assert(npcGroup)
local leader = nil
local sequences = {}
local stepSitDown = nil
local stepStandUp = nil
do
local fire = r2.newComponent("Npc")
fire.Name = "Fire"
fire.Base = "palette.entities.botobjects.campfire"
fire.Position.x = comp.Position.x
fire.Position.y = comp.Position.y
fire.Position.z = 0
fire.Angle = 0
r2.requestInsertGhostNode(act.Features[0].InstanceId, "Components", -1, "", fire)
end
if comp._Seed then math.randomseed(comp._Seed) end
do
local x = comp.Position.x
local y = comp.Position.y
local n = comp._BanditsCount
local pas = (2 * math.pi)/n
local r = (n/(2*math.pi))+2
for i = 1, n do
local npc = r2:randomNPC( component.getBanditPaletteId(comp), component.Races[comp._Race + 1])
npc.Position.x = (r-1) * math.cos((i-1)*pas) -- make position relative to the feature positio
npc.Position.y = (r-1) * math.sin((i-1)*pas)
npc.Position.z = 0
npc.Angle = (i-1)*pas + math.pi
if comp.Active == 1 then npc.AutoSpawn = 1 else npc.AutoSpawn = 0 end
if i == 1 then leader = npc end
if comp.NoRespawn then
-- debugInfo("setting no respawn for a bandit -- value : " ..comp.NoRespawn)
npc.NoRespawn = comp.NoRespawn
end
table.insert(npcGroup.Components, npc)
end
npcGroup.Name = r2:genInstanceName(i18n.get("uiR2EDNameBanditCamp")):toUtf8()
bandits = npcGroup
bandits.Position.x = x
bandits.Position.y = y
bandits.InheritPos = 0
end
-- Sequence1 standUp -> Wander
do
local sequence = r2.newComponent("ActivitySequence")
table.insert(leader.Behavior.Activities, sequence)
table.insert(bandits.ActivitiesId, sequence.InstanceId)
sequences[1] = sequence
sequence.Name = "Head to Wander"
sequence.Repeating = 0
-- Initial wait
do
local step = r2.newComponent("ActivityStep")
table.insert(sequence.Components, step)
step.Type = "None"
step.Name = "Stand Up"
step.Activity = "Stand Up"
step.ActivityZoneId = r2.RefId("")
step.TimeLimit = "Few Sec"
step.TimeLimitValue = "5"
end
-- head to Wander
do
local step = r2.newComponent("ActivityStep")
comp.User._StepHeadToWander = step.InstanceId
table.insert(sequence.Components, step)
step.Type = "None"
step.Activity = "Go To Zone"
step.ActivityZoneId = r2.RefId(comp._Zone)
step.TimeLimit = "No Limit"
-- step.TimeLimitValue = ""
-- step.Chat = r2.RefId("")
end
-- Go to zone until arrived
end
-- Sequence2 Wander
do
local sequence = r2.newComponent("ActivitySequence")
table.insert(leader.Behavior.Activities, sequence)
table.insert(bandits.ActivitiesId, sequence.InstanceId)
sequences[2] = sequence
sequence.Name = "Wander"
sequence.Repeating = 0
-- Stand up
do
local step = r2.newComponent("ActivityStep")
table.insert(sequence.Components, step)
step.Type = "None"
step.Name = "Wander"
step.Activity = "Wander"
step.ActivityZoneId = r2.RefId(comp._Zone)
--if comp.Cycle ~= 0 then
if comp.WanderDuration ~= 0 then
step.TimeLimit = "Few Sec"
step.TimeLimitValue = tostring( math.ceil(comp.WanderDuration) )
else
step.TimeLimit = "No Limit"
end
-- step.TimeLimitValue = ""
-- step.Chat = r2.RefId("")
end
-- Go to zone until arrived
end
-- Sequence3 wander - >sit
do
local sequence = r2.newComponent("ActivitySequence")
sequence.Name = "Head to Fire"
sequence.Repeating = 0
table.insert(leader.Behavior.Activities, sequence)
table.insert(bandits.ActivitiesId, sequence.InstanceId)
sequences[3] = sequence
-- to fire
do
local step = r2.newComponent("ActivityStep")
comp.User._StepHeadToFire = step.InstanceId
table.insert(sequence.Components, step)
step.Type = "None"
step.Name = "head to fire"
step.Activity = "Go To Start Point"
step.ActivityZoneId = r2.RefId("")
step.TimeLimit = "No Limit"
stepSitDown = step
-- step.TimeLimitValue = ""
-- step.Chat = r2.RefId("")
end
do
local step = r2.newComponent("ActivityStep")
table.insert(sequence.Components, step)
step.Type = "None"
step.Name = "Sit Down"
step.Activity = "Sit Down"
step.ActivityZoneId = r2.RefId("")
step.TimeLimit = "Few Sec"
step.TimeLimitValue = "5"
end
end
-- Sequence3 wander - >sit
do
local sequence = r2.newComponent("ActivitySequence")
sequence.Name = "Head to Fire"
sequence.Repeating = 0
table.insert(leader.Behavior.Activities, sequence)
table.insert(bandits.ActivitiesId, sequence.InstanceId)
sequences[4] = sequence
-- stand up : go to start point
do
local step = r2.newComponent("ActivityStep")
table.insert(sequence.Components, step)
step.Type = "None"
step.Name = "Initial Wait"
step.Activity = "Stand On Start Point"
step.ActivityZoneId = r2.RefId("")
--if comp.Cycle ~= 0 then
if comp.SitDuration ~= 0 then
step.TimeLimit = "Few Sec"
step.TimeLimitValue = tostring( math.ceil(comp.SitDuration) )
else
step.TimeLimit = "No Limit"
end
-- step.Chat = r2.RefId("")
end
end
-- activitySequence1 -> activitySequence2
do
local eventHandler = r2.newComponent("LogicEntityAction")
eventHandler.Name = "Heading to wander"
table.insert(leader.Behavior.Actions, eventHandler)
local action = r2.newComponent("ActionStep")
table.insert(eventHandler.Actions, action)
action.Entity = r2.RefId(leader.InstanceId)
action.Action.Type = "begin activity sequence"
action.Action.Value = r2.RefId(sequences[2].InstanceId)
eventHandler.Event.Type = "end of activity sequence"
eventHandler.Event.Value = r2.RefId(sequences[1].InstanceId)
end
-- activitySequence3 -> activitySequence4
do
local eventHandler = r2.newComponent("LogicEntityAction")
eventHandler.Name = "Wander"
table.insert(leader.Behavior.Actions, eventHandler)
local action = r2.newComponent("ActionStep")
table.insert(eventHandler.Actions, action)
action.Entity = r2.RefId(leader.InstanceId)
action.Action.Type = "begin activity sequence"
action.Action.Value = r2.RefId(sequences[4].InstanceId)
eventHandler.Event.Type = "end of activity sequence"
eventHandler.Event.Value = r2.RefId(sequences[3].InstanceId)
end
--if comp.Cycle ~= 0 then
if comp.WanderDuration ~= 0 then
-- activitySequence2 -> activitySequence3
do
local eventHandler = r2.newComponent("LogicEntityAction")
eventHandler.Name = "Heading to Fire"
table.insert(leader.Behavior.Actions, eventHandler)
local action = r2.newComponent("ActionStep")
table.insert(eventHandler.Actions, action)
action.Entity = r2.RefId(leader.InstanceId)
action.Action.Type = "begin activity sequence"
action.Action.Value = r2.RefId(sequences[3].InstanceId)
eventHandler.Event.Type = "end of activity sequence"
eventHandler.Event.Value = r2.RefId(sequences[2].InstanceId)
end
end
-- activitySequence4 -> activitySequence1
if comp.SitDuration ~= 0 then
do
local eventHandler = r2.newComponent("LogicEntityAction")
eventHandler.Name = "Stay around fire"
table.insert(leader.Behavior.Actions, eventHandler)
local action = r2.newComponent("ActionStep")
table.insert(eventHandler.Actions, action)
action.Entity = r2.RefId(leader.InstanceId)
action.Action.Type = "begin activity sequence"
action.Action.Value = r2.RefId(sequences[1].InstanceId)
eventHandler.Event.Type = "end of activity sequence"
eventHandler.Event.Value = r2.RefId(sequences[4].InstanceId)
end
end
r2.requestInsertGhostNode(act.InstanceId, "Features", -1, "", bandits)
-- r2.requestInsertGhostNode(this.InstanceId, "Ghost", -1, "", ghostNpc)
-- r2.requestInsertGhostNode(r2:getCurrentAct().InstanceId, "Features", -1, "", bandits)
--
local k, sequence = next(sequences, nil)
while k do
r2.requestInsertGhostNode(act.InstanceId, "ActivitiesIds", -1, "", sequence.InstanceId)
k, sequence = next(sequences, k)
end
local k, bandit = next(npcGroup.Components, nil)
while k do
r2:getInstanceFromId(bandit.InstanceId).Selectable = true -- for debug
k, bandit = next(npcGroup.Components, k)
end
comp.User._BanditGroup = npcGroup.InstanceId
comp.User._SequenceHeadToWander = sequences[1].InstanceId
comp.User._SequenceWander = sequences[2].InstanceId
comp.User._SequenceHeadToFire = sequences[3].InstanceId
comp.User._SequenceStayNearFire = sequences[4].InstanceId
end
component.create = function()
if not r2:checkAiQuota() then return end
local function paramsOk(resultTable)
local banditsCount = tonumber( resultTable["BanditsCount"] )
if not r2:checkAiQuota(banditsCount) then return end
local race = tonumber( resultTable["Race"] )
local banditsLevel = tonumber( resultTable["BanditsLevel"] )
local x = tonumber( resultTable["X"] )
local y = tonumber( resultTable["Y"] )
--local cycle = tonumber( resultTable["Cycle"] )
--local sitDuration = tonumber( resultTable["SitDuration"] )
--local wanderDuration= tonumber( resultTable["WanderDuration"] )
local ZoneSize = tonumber(resultTable["ZoneSize"])
if banditsCount == nil or race == nil or banditsLevel == nil
then
debugInfo("Can't create Feature")
return
end
--local component = feature.Components.BanditCamp.createComponent( x, y, banditsCount, race, banditsLevel, cycle,ZoneSize)
local component = feature.Components.BanditCamp.createComponent( x, y, banditsCount, race, banditsLevel, ZoneSize)
r2:setCookie(component.InstanceId, "DisplayProp", 1)
r2.requestInsertNode(r2:getCurrentAct().InstanceId, "Features", -1, "", component)
-- feature.createContent(component)
end
local function paramsCancel()
debugInfo("Cancel form for bandit camp creation")
end
local function posOk(x, y, z)
debugInfo(string.format("Validate creation of bandit camp at pos (%d, %d, %d)", x, y, z))
if r2.mustDisplayInfo("BanditCamp") == 1 then
r2.displayFeatureHelp("BanditCamp")
end
r2:doForm("BanditCamp_Form", {X = x, Y = y}, paramsOk, paramsCancel)
updateBanditCampEnum()
end
local function posCancel()
debugInfo("Cancel choice of bandit camp position")
end
local poly = {}
local step = 2 * math.pi / BanditZoneNumCorners
for k = 0, BanditZoneNumCorners - 1 do
table.insert(poly, CVector2f(BanditZoneRadius * math.cos(k * step), BanditZoneRadius * math.sin(k * step)))
end
r2:choosePos("object_campfire.creature", posOk, posCancel, "createFeatureBanditCamp",
"curs_create.tga",
"curs_stop.tga",
{ poly }, r2.PrimRender.ComponentRegionLook, r2.PrimRender.ComponentRegionInvalidLook)
end
function feature.hasScenarioCost(this)
return true
end
component.init()
r2.Features["BanditCampFeature"] = feature