Update RotorOps.lua

This commit is contained in:
spencer-ki 2022-01-02 20:54:52 -08:00
parent e6517dbbaa
commit 0b7647d034

View File

@ -198,7 +198,7 @@ function RotorOps.spawnInfantryOnGrp(grp, src_grp_name, ai_task) --allow to spaw
end end
function RotorOps.chargeEnemy(vars) function RotorOps.chargeEnemy(vars)
trigger.action.outText("charge enemies: "..mist.utils.tableShow(vars), 5) --trigger.action.outText("charge enemies: "..mist.utils.tableShow(vars), 5)
local grp = vars.grp local grp = vars.grp
local search_radius = vars.radius or 5000 local search_radius = vars.radius or 5000
---- ----
@ -214,7 +214,7 @@ function RotorOps.chargeEnemy(vars)
local volS local volS
if vars.zone then if vars.zone then
local sphere = trigger.misc.getZone('town') local sphere = trigger.misc.getZone(vars.zone)
volS = { volS = {
id = world.VolumeType.SPHERE, id = world.VolumeType.SPHERE,
params = { params = {
@ -265,7 +265,7 @@ end
function RotorOps.patrolRadius(vars) function RotorOps.patrolRadius(vars)
debugMsg("patrol radius: "..mist.utils.tableShow(vars.grp)) --debugMsg("patrol radius: "..mist.utils.tableShow(vars.grp))
local grp = vars.grp local grp = vars.grp
local search_radius = vars.radius or 100 local search_radius = vars.radius or 100
local first_valid_unit local first_valid_unit
@ -338,30 +338,35 @@ local function changeGameState(new_state)
trigger.action.setUserFlag(RotorOps.game_state_flag, new_state) trigger.action.setUserFlag(RotorOps.game_state_flag, new_state)
end end
function RotorOps.aiTask(group_name, task) function RotorOps.aiTask(group_name, task, zone)
if tableHasKey(RotorOps.ai_tasks, group_name) == true then --if we already have this group id in our list of timers if tableHasKey(RotorOps.ai_tasks, group_name) == true then --if we already have this group id in our list of timers
--debugMsg("timer already active, updating task for "..group_name.." : ".. RotorOps.ai_tasks[group_name].ai_task.." to "..task) debugMsg("timer already active, updating task for "..group_name.." : ".. RotorOps.ai_tasks[group_name].ai_task.." to "..task)
RotorOps.ai_tasks[group_name].ai_task = task
RotorOps.ai_tasks[group_name].zone = zone
else else
--debugMsg("adding timer: "..group_name) debugMsg("adding timer: "..group_name.." task: "..task)
local vars = {} local vars = {}
vars.group_name = group_name vars.group_name = group_name
vars.last_task = task vars.last_task = task
if zone then
vars.zone = zone
end
local timer_id = timer.scheduleFunction(RotorOps.aiExecute, vars, timer.getTime() + 5) local timer_id = timer.scheduleFunction(RotorOps.aiExecute, vars, timer.getTime() + 5)
RotorOps.ai_tasks[group_name] = {['timer_id'] = timer_id, ['ai_task'] = task} RotorOps.ai_tasks[group_name] = {['timer_id'] = timer_id, ['ai_task'] = task, ['zone'] = zone}
end end
end end
function RotorOps.aiExecute(vars) function RotorOps.aiExecute(vars)
local last_task = vars.last_task local last_task = vars.last_task
local group_name = vars.group_name local group_name = vars.group_name
local task = RotorOps.ai_tasks[group_name].ai_task local task = RotorOps.ai_tasks[group_name].ai_task
local zone = vars.zone
debugMsg("aiExecute: "..group_name.." : "..task) debugMsg("aiExecute: "..group_name.." : "..task)
--debugMsg("task:"..RotorOps.ai_tasks[group_name].ai_task) --debugMsg("task:"..RotorOps.ai_tasks[group_name].ai_task)
--we should remove inactive/dead groups and cancel timer here --we should remove inactive/dead groups and cancel timer here
if Group.isExist(Group.getByName(group_name)) ~= true then if Group.isExist(Group.getByName(group_name)) ~= true or #Group.getByName(group_name):getUnits() < 1 then
debugMsg("group no longer exists") debugMsg("group no longer exists")
return return
end end
@ -373,20 +378,25 @@ function RotorOps.aiExecute(vars)
vars.grp = Group.getByName(group_name) vars.grp = Group.getByName(group_name)
vars.radius = 150 vars.radius = 150
RotorOps.patrolRadius(vars) --takes a group object, not name RotorOps.patrolRadius(vars) --takes a group object, not name
end elseif task == "aggressive" then
if task == "aggressive" then
local vars = {} local vars = {}
vars.grp = Group.getByName(group_name) vars.grp = Group.getByName(group_name)
vars.radius = 5000 vars.radius = 5000
RotorOps.chargeEnemy(vars) --takes a group object, not name RotorOps.chargeEnemy(vars) --takes a group object, not name
end elseif task == "clear_zone" then
local vars = {}
vars.grp = Group.getByName(group_name)
vars.zone = zone
RotorOps.chargeEnemy(vars) --takes a group object, not name
elseif task == "move_to_zone" then
--placeholder only, we currently use sendUnitsToZone function
end
-- end -- end
vars.last_task = task vars.last_task = task
local update_interval = math.random(10,20) --this can be higher since we will check for changes local update_interval = math.random(10,20)
local timer_id = timer.scheduleFunction(RotorOps.aiExecute, vars, timer.getTime() + update_interval) local timer_id = timer.scheduleFunction(RotorOps.aiExecute, vars, timer.getTime() + update_interval)
end end
@ -402,13 +412,13 @@ function RotorOps.aiActiveZone(var)
for index, group in pairs(RotorOps.ai_blue_infantry_groups) do for index, group in pairs(RotorOps.ai_blue_infantry_groups) do
if group then if group then
RotorOps.aiTask(group, "aggressive") RotorOps.aiTask(group, "clear_zone", RotorOps.active_zone)
end end
end end
for index, group in pairs(RotorOps.ai_blue_vehicle_groups) do for index, group in pairs(RotorOps.ai_blue_vehicle_groups) do
if group then if group then
RotorOps.aiTask(group, "aggressive") RotorOps.aiTask(group, "clear_zone", RotorOps.active_zone)
end end
end end
@ -429,10 +439,10 @@ function RotorOps.assessUnitsInZone(var)
local blue_vehicles = RotorOps.sortOutInfantry(blue_ground_units).not_infantry local blue_vehicles = RotorOps.sortOutInfantry(blue_ground_units).not_infantry
--is the active zone cleared? --is the active zone cleared?
local active_zone_status_flag = RotorOps.zones[RotorOps.active_zone_index].zone_status_flag local active_zone_status_flag = RotorOps.zones[RotorOps.active_zone_index].zone_status_flag
local active_zone_status = trigger.misc.getUserFlag(active_zone_status_flag) local active_zone_status = trigger.misc.getUserFlag(active_zone_status_flag)
---we should grab these after the clearActiveZone below
if #red_ground_units <= RotorOps.max_units_left then if #red_ground_units <= RotorOps.max_units_left then
RotorOps.clearActiveZone() RotorOps.clearActiveZone()
@ -548,8 +558,9 @@ function RotorOps.sendUnitsToZone(units_table, zone, _formation, _final_heading,
local force_offroad = _force_offroad or false local force_offroad = _force_offroad or false
local groups = RotorOps.groupsFromUnits(units_table) local groups = RotorOps.groupsFromUnits(units_table)
for index, group in pairs(groups) do for index, group in pairs(groups) do
--debugMsg("sending to zone: "..zone.." grp: "..group) debugMsg("sending to zone: "..zone.." grp: "..group)
mist.groupToPoint(group, zone, formation, final_heading, speed, force_offroad) mist.groupToPoint(group, zone, formation, final_heading, speed, force_offroad)
RotorOps.aiTask(group, "move_to_zone", zone)
end end
end end
@ -706,7 +717,7 @@ function RotorOps.addPickupZone(zone_name, smoke, limit, active, side)
RotorOps.ctld_pickup_zones[#RotorOps.ctld_pickup_zones + 1] = zone_name RotorOps.ctld_pickup_zones[#RotorOps.ctld_pickup_zones + 1] = zone_name
ctld.pickupZones[#ctld.pickupZones + 1] = {zone_name, smoke, limit, active, side} ctld.pickupZones[#ctld.pickupZones + 1] = {zone_name, smoke, limit, active, side}
end end
function RotorOps.startConflict() function RotorOps.startConflict()
if RotorOps.game_state == RotorOps.game_states.in_progress then return end if RotorOps.game_state == RotorOps.game_states.in_progress then return end