From e205177d53a8de71e9fd7336ec97918622143c1f Mon Sep 17 00:00:00 2001 From: spencer-ki Date: Sat, 8 Jan 2022 20:32:14 -0800 Subject: [PATCH 1/2] .. --- RotorOps.lua | 222 ++++++++---------- documentation/images/conflict_setup.PNG | Bin 0 -> 42299 bytes sound/{ => embedded}/beacon.ogg | Bin sound/{ => embedded}/beaconsilent.ogg | Bin sound/{ => embedded}/cleared_active.ogg | Bin sound/{ => embedded}/cleared_alpha.ogg | Bin sound/{ => embedded}/cleared_bravo.ogg | Bin sound/{ => embedded}/cleared_charlie.ogg | Bin sound/{ => embedded}/cleared_delta.ogg | Bin sound/{ => embedded}/get_troops_alpha.ogg | Bin sound/{ => embedded}/get_troops_bravo.ogg | Bin sound/{ => embedded}/get_troops_charlie.ogg | Bin sound/{ => embedded}/get_troops_delta.ogg | Bin sound/{ => embedded}/get_troops_next_zone.ogg | Bin sound/{ => embedded}/mission_success.ogg | Bin sound/{ => embedded}/push_alpha.ogg | Bin sound/{ => embedded}/push_bravo.ogg | Bin sound/{ => embedded}/push_charlie.ogg | Bin sound/{ => embedded}/push_delta.ogg | Bin sound/{ => embedded}/push_next_zone.ogg | Bin sound/{ => embedded}/support_troops.ogg | Bin .../{ => embedded}/troops_dropped_active.ogg | Bin sound/{ => embedded}/troops_dropped_alpha.ogg | Bin sound/{ => embedded}/troops_dropped_bravo.ogg | Bin .../{ => embedded}/troops_dropped_charlie.ogg | Bin sound/{ => embedded}/troops_dropped_delta.ogg | Bin 26 files changed, 100 insertions(+), 122 deletions(-) create mode 100644 documentation/images/conflict_setup.PNG rename sound/{ => embedded}/beacon.ogg (100%) rename sound/{ => embedded}/beaconsilent.ogg (100%) rename sound/{ => embedded}/cleared_active.ogg (100%) rename sound/{ => embedded}/cleared_alpha.ogg (100%) rename sound/{ => embedded}/cleared_bravo.ogg (100%) rename sound/{ => embedded}/cleared_charlie.ogg (100%) rename sound/{ => embedded}/cleared_delta.ogg (100%) rename sound/{ => embedded}/get_troops_alpha.ogg (100%) rename sound/{ => embedded}/get_troops_bravo.ogg (100%) rename sound/{ => embedded}/get_troops_charlie.ogg (100%) rename sound/{ => embedded}/get_troops_delta.ogg (100%) rename sound/{ => embedded}/get_troops_next_zone.ogg (100%) rename sound/{ => embedded}/mission_success.ogg (100%) rename sound/{ => embedded}/push_alpha.ogg (100%) rename sound/{ => embedded}/push_bravo.ogg (100%) rename sound/{ => embedded}/push_charlie.ogg (100%) rename sound/{ => embedded}/push_delta.ogg (100%) rename sound/{ => embedded}/push_next_zone.ogg (100%) rename sound/{ => embedded}/support_troops.ogg (100%) rename sound/{ => embedded}/troops_dropped_active.ogg (100%) rename sound/{ => embedded}/troops_dropped_alpha.ogg (100%) rename sound/{ => embedded}/troops_dropped_bravo.ogg (100%) rename sound/{ => embedded}/troops_dropped_charlie.ogg (100%) rename sound/{ => embedded}/troops_dropped_delta.ogg (100%) diff --git a/RotorOps.lua b/RotorOps.lua index 2db9562..6c4b8d0 100644 --- a/RotorOps.lua +++ b/RotorOps.lua @@ -1,28 +1,33 @@ RotorOps = {} +--RotorOps settings that are safe to change dynamically (ideally from the mission editor in DO SCRIPT for ease of use) RotorOps.voice_overs = true RotorOps.ground_speed = 60 --max speed for ground vehicles moving between zones RotorOps.zone_status_display = true --constantly show units remaining and zone status on screen RotorOps.max_units_left = 0 --allow clearing the zone when a few units are left to prevent frustration with units getting stuck in buildings etc -RotorOps.ai_active_zone = true --allow the script to automatically create waypoints for ground units in the active zone +RotorOps.force_offroad = false --affects "move_to_zone" tasks only ---RotorOps.zone_states = {not_started = 0, all_remain = 1, cleared = 2, started = 3, most_remain = 4, half_remain = 5, quarter_remain = 6 } --zone level user flags will use these values. _remain flags compare the active red ground units vs their initial numbers +--RotorOps settings that are proabably safe to change +RotorOps.transports = {'UH-1H', 'Mi-8MT', 'Mi-24P', 'SA342M', 'SA342L', 'SA342Mistral'} --players flying these will have ctld transport access +RotorOps.auto_push = true --should attacking ground units move to the next zone after clearing? +RotorOps.CTLD_crates = false + +--RotorOps variables that are safe to read only RotorOps.game_states = {not_started = 0, alpha_active = 1, bravo_active = 2, charlie_active = 3, delta_active = 4, won = 99} --game level user flag will use these values - - -RotorOps.transports = {'UH-1H', 'Mi-8MT', 'Mi-24P'} --players flying these will have ctld transport access - RotorOps.game_state = 0 RotorOps.zones = {} RotorOps.active_zone = "" --name of the active zone RotorOps.active_zone_index = 0 RotorOps.game_state_flag = 1 --user flag to store the game state RotorOps.staging_zone = "" -RotorOps.auto_push = true --leave true for now - RotorOps.ctld_pickup_zones = {} --keep track of ctld zones we've added, mainly for map markup +RotorOps.ai_red_infantry_groups = {} +RotorOps.ai_blue_infantry_groups = {} +RotorOps.ai_red_vehicle_groups = {} +RotorOps.ai_blue_vehicle_groups = {} +RotorOps.ai_tasks = {} trigger.action.outText("ROTOR OPS STARTED", 5) env.info("ROTOR OPS STARTED") @@ -32,11 +37,6 @@ local commandDB = {} local game_message_buffer = {} local active_zone_initial_enemy_units -RotorOps.ai_red_infantry_groups = {} -RotorOps.ai_blue_infantry_groups = {} -RotorOps.ai_red_vehicle_groups = {} -RotorOps.ai_blue_vehicle_groups = {} -RotorOps.ai_tasks = {} --simply use the group ID for schedulefunction id local gameMsgs = { push = { @@ -46,12 +46,6 @@ local gameMsgs = { {'ALL GROUND UNITS, PUSH TO CHARLIE!', 'push_charlie.ogg'}, {'ALL GROUND UNITS, PUSH TO DELTA!', 'push_delta.ogg'}, }, - fallback = { - {'ALL GROUND UNITS, FALL BACK!', '.wav'}, - {'ALL GROUND UNITS, FALL BACK TO ALPHA!', '.wav'}, - {'ALL GROUND UNITS, FALL BACK TO BRAVO!', '.wav'}, - {'ALL GROUND UNITS, FALL BACK TO CHARLIE!', '.wav'}, - }, cleared = { {'ZONE CLEARED!', 'cleared_active.ogg'}, {'ALPHA CLEARED!', 'cleared_alpha.ogg'}, @@ -83,7 +77,7 @@ local gameMsgs = { } ---[[ UTILITY FUNCTIONS ]]-- +---UTILITY FUNCTIONS--- local function debugMsg(text) trigger.action.outText(text, 5) @@ -149,17 +143,11 @@ end function RotorOps.groupsFromUnits(units, table) local groups = {} - --debugTable(units) - - --local groupIndex = {} for i = 1, #units do if units[i]:isExist() then if hasValue(groups, units[i]:getGroup():getName()) == false then - --debugMsg("added: "..units[i]:getGroup():getName()) - --groups[units[i]:getGroup():getName()] = true - --groupIndex[#groupIndex + 1] = groups[units[i]:getGroup():getName()] groups[#groups + 1] = units[i]:getGroup():getName() - else --debugMsg(units[i]:getGroup():getName().." was already in the table") + else end end end @@ -204,7 +192,14 @@ function RotorOps.sortOutInfantry(mixed_units) return {infantry = _infantry, not_infantry = _not_infantry} end + function RotorOps.getValidUnitFromGroup(grp) + local group_obj + if type(grp) == 'string' then + group_obj = Group.getByName(grp) + else + group_obj = grp + end if grp:isExist() ~= true then return nil end local first_valid_unit for index, unit in pairs(grp:getUnits()) @@ -220,7 +215,9 @@ end ---spawn/clone a group onto the location of the first unit in a group (best to only use this for groups of one unit only for now!) See chargeEnemy for grabing first valid unit +----USEFUL PUBLIC FUNCTIONS FOR THE MISSION EDITOR--- + +--Spawn/clone a group onto the location of one unit in the group. This is similar to deployTroops, but it does not use CTLD. You must provide a source group to copy. function RotorOps.spawnInfantryOnGrp(grp, src_grp_name, ai_task) --allow to spawn on other group units local valid_unit = RotorOps.getValidUnitFromGroup(grp) if not valid_unit then return end @@ -239,7 +236,15 @@ function RotorOps.spawnInfantryOnGrp(grp, src_grp_name, ai_task) --allow to spaw end end -function RotorOps.deployTroops(quantity, target_group_obj) + +--Easy way to deploy troops from a vehicle with waypoint action. Spawns from the first valid unit found in a group +function RotorOps.deployTroops(quantity, target_group) + local target_group_obj + if type(target_group) == 'string' then + target_group_obj = Group.getByName(target_group) + else + target_group_obj = target_group + end local valid_unit = RotorOps.getValidUnitFromGroup(target_group_obj) if not valid_unit then return end local coalition = valid_unit:getCoalition() @@ -261,6 +266,37 @@ function RotorOps.deployTroops(quantity, target_group_obj) end end + +--see list of tasks in aiExecute. Zone is optional for many tasks +function RotorOps.aiTask(grp, task, zone) + local group_name + if type(grp) == 'string' then + group_name = grp + else + group_name = Group.getName(grp) + end + if tableHasKey(RotorOps.ai_tasks, group_name) == true then --if we already have this group in our list to manage + --debugMsg("timer already exists, 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 + local vars = {} + vars.group_name = group_name + --vars.last_task = task + if zone then + vars.zone = zone + end + local timer_id = timer.scheduleFunction(RotorOps.aiExecute, vars, timer.getTime() + 5) + RotorOps.ai_tasks[group_name] = {['timer_id'] = timer_id, ['ai_task'] = task, ['zone'] = zone} + end +end + + + + +---AI CORE BEHAVIOR-- + + function RotorOps.chargeEnemy(vars) --trigger.action.outText("charge enemies: "..mist.utils.tableShow(vars), 5) local grp = vars.grp @@ -288,7 +324,7 @@ function RotorOps.chargeEnemy(vars) } } else - debugMsg("CHARGE ENEMY in radius: "..search_radius) + --debugMsg("CHARGE ENEMY in radius: "..search_radius) volS = { id = world.VolumeType.SPHERE, params = { @@ -320,7 +356,7 @@ function RotorOps.chargeEnemy(vars) end --default path if no units found if false then - debugMsg("group going back to origin") + --debugMsg("group going back to origin") path[1] = mist.ground.buildWP(start_point, '', 5) path[2] = mist.ground.buildWP(vars.spawn_point, '', 5) @@ -397,47 +433,19 @@ end ------------------------------------------- - - -local function changeGameState(new_state) - RotorOps.game_state = new_state - trigger.action.setUserFlag(RotorOps.game_state_flag, new_state) -end - -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 - --debugMsg("timer already exists, 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 - --debugMsg("adding timer: "..group_name.." task: "..task) - local vars = {} - vars.group_name = group_name - --vars.last_task = task - if zone then - vars.zone = zone - end - local timer_id = timer.scheduleFunction(RotorOps.aiExecute, vars, timer.getTime() + 5) - RotorOps.ai_tasks[group_name] = {['timer_id'] = timer_id, ['ai_task'] = task, ['zone'] = zone} - end - -end - function RotorOps.aiExecute(vars) local update_interval = 60 local last_task = vars.last_task local group_name = vars.group_name local task = RotorOps.ai_tasks[group_name].ai_task local zone = vars.zone - --local zone = "" + if vars.zone then zone = vars.zone end - --debugMsg("aiExecute: "..group_name.." : "..task .." zone:"..zone) - --debugMsg("task:"..RotorOps.ai_tasks[group_name].ai_task) + --debugMsg("tasking: "..group_name.." : "..task .." zone:"..zone) - --we should remove inactive/dead groups and cancel timer here 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") + RotorOps.ai_tasks[group_name] = nil return end @@ -466,55 +474,32 @@ function RotorOps.aiExecute(vars) local formation = 'cone' local final_heading = nil local speed = RotorOps.ground_speed - local force_offroad = false + local force_offroad = RotorOps.force_offroad mist.groupToPoint(group_name, zone, formation, final_heading, speed, force_offroad) elseif task == "move_to_active_zone" then update_interval = math.random(90,120) local formation = 'cone' local final_heading = nil local speed = RotorOps.ground_speed - local force_offroad = false + local force_offroad = RotorOps.force_offroad mist.groupToPoint(group_name, RotorOps.active_zone, formation, final_heading, speed, force_offroad) end ---end - - vars.last_task = task local timer_id = timer.scheduleFunction(RotorOps.aiExecute, vars, timer.getTime() + update_interval) end -function RotorOps.aiActiveZone(var) --[[ - if RotorOps.ai_active_zone == false then return end - --debugMsg("aiActiveZone func") - - for index, group in pairs(RotorOps.ai_red_infantry_groups) do - if group then - RotorOps.aiTask(group, "patrol") - end - end - - for index, group in pairs(RotorOps.ai_blue_infantry_groups) do - if group then - RotorOps.aiTask(group, "clear_zone", RotorOps.active_zone) - end - end - - for index, group in pairs(RotorOps.ai_blue_vehicle_groups) do - if group then - RotorOps.aiTask(group, "clear_zone", RotorOps.active_zone) - end - end - - - local id = timer.scheduleFunction(RotorOps.aiActiveZone, 1, timer.getTime() + 10) ]]-- -end + +---CONFLICT ZONES GAME FUNCTIONS--- + +--take stock of the blue/red forces in zone and apply some logic to determine game/zone states function RotorOps.assessUnitsInZone(var) if RotorOps.game_state == RotorOps.game_states.not_started then return end + --find and sort units found in the active zone local red_ground_units = mist.getUnitsInZones(mist.makeUnitTable({'[red][vehicle]'}), {RotorOps.active_zone}) local red_infantry = RotorOps.sortOutInfantry(red_ground_units).infantry @@ -523,14 +508,12 @@ function RotorOps.assessUnitsInZone(var) local blue_infantry = RotorOps.sortOutInfantry(blue_ground_units).infantry local blue_vehicles = RotorOps.sortOutInfantry(blue_ground_units).not_infantry -------- --- --ground unit ai stuff +--ground unit ai stuff RotorOps.ai_red_infantry_groups = RotorOps.groupsFromUnits(red_infantry) RotorOps.ai_blue_infantry_groups = RotorOps.groupsFromUnits(blue_infantry) RotorOps.ai_red_vehicle_groups = RotorOps.groupsFromUnits(red_vehicles) RotorOps.ai_blue_vehicle_groups = RotorOps.groupsFromUnits(blue_vehicles) - for index, group in pairs(RotorOps.ai_red_infantry_groups) do if group then RotorOps.aiTask(group, "patrol") @@ -549,8 +532,8 @@ function RotorOps.assessUnitsInZone(var) end end - ----- + --let's compare the defending units in zone vs their initial numbers and set a game flag if not active_zone_initial_enemy_units then --debugMsg("taking stock of the active zone") active_zone_initial_enemy_units = red_ground_units @@ -558,21 +541,22 @@ function RotorOps.assessUnitsInZone(var) local defenders_status_flag = RotorOps.zones[RotorOps.active_zone_index].defenders_status_flag if #active_zone_initial_enemy_units == 0 then active_zone_initial_enemy_units = 1 end --prevent divide by zero - local defenders_remaining_percent = math.abs((#red_ground_units / #active_zone_initial_enemy_units) * 100) - --debugMsg(defenders_remaining_percent.."%") + local defenders_remaining_percent = math.floor((#red_ground_units / #active_zone_initial_enemy_units) * 100) if #red_ground_units <= RotorOps.max_units_left then --if we should declare the zone cleared active_zone_initial_enemy_units = nil defenders_remaining_percent = 0 trigger.action.setUserFlag(defenders_status_flag, 0) --set the zone's flag to cleared gameMsg(gameMsgs.cleared, RotorOps.active_zone_index) - if RotorOps.auto_push then + + if RotorOps.auto_push then --push units to the next zone RotorOps.setActiveZone(RotorOps.active_zone_index + 1) local staged_groups = RotorOps.groupsFromUnits(staged_units) for index, group in pairs(staged_groups) do RotorOps.aiTask(group,"move_to_active_zone", RotorOps.zones[RotorOps.active_zone_index].name) --send vehicles to next zone end end + else trigger.action.setUserFlag(defenders_status_flag, defenders_remaining_percent) --set the zones flage to indicate the status of remaining enemies end @@ -586,6 +570,7 @@ function RotorOps.assessUnitsInZone(var) end end + --is the game finished? if all_zones_clear then changeGameState(RotorOps.game_states.won) gameMsg(gameMsgs.success) @@ -594,7 +579,7 @@ function RotorOps.assessUnitsInZone(var) - --zone status display stuff + --zone status display local message = "" local header = "" local body = "" @@ -607,7 +592,6 @@ function RotorOps.assessUnitsInZone(var) message = header .. body if RotorOps.zone_status_display then - --trigger.action.outText(message , 5, true) game_message_buffer[#game_message_buffer + 1] = {message, ""} --don't load the buffer faster than it's cleared. end local id = timer.scheduleFunction(RotorOps.assessUnitsInZone, 1, timer.getTime() + 10) @@ -673,14 +657,11 @@ function RotorOps.drawZones() --this could use a lot of work, we should use tri end -function RotorOps.spawnInfantryAtZone(vars) - local side = vars.side - local inf = vars.inf - local zone = vars.zone - local radius = vars.radius - ctld.spawnGroupAtTrigger(side, inf, zone, radius) -end +local function changeGameState(new_state) + RotorOps.game_state = new_state + trigger.action.setUserFlag(RotorOps.game_state_flag, new_state) +end function RotorOps.setActiveZone(new_index) @@ -702,7 +683,6 @@ function RotorOps.setActiveZone(new_index) ctld.deactivatePickupZone(RotorOps.zones[new_index].name) changeGameState(new_index) if new_index < old_index then gameMsg(gameMsgs.fallback, new_index) end - --if new_index > old_index then gameMsg(gameMsgs.push, new_index) end if new_index > old_index then gameMsg(gameMsgs.get_troops_to_zone, new_index) end end @@ -713,9 +693,9 @@ function RotorOps.setActiveZone(new_index) end - +--make some changes to the CTLD script/settings function RotorOps.setupCTLD() - ctld.enableCrates = false + ctld.enableCrates = RotorOps.CTLD_crates ctld.enabledFOBBuilding = false ctld.JTAC_lock = "vehicle" ctld.location_DMS = true @@ -734,22 +714,20 @@ function RotorOps.setupCTLD() } ctld.loadableGroups = { - -- {name = "Mortar Squad Red", inf = 2, mortar = 5, side =1 }, --would make a group loadable by RED only - {name = "Standard Group (10)", inf = 6, mg = 2, at = 2 }, -- will make a loadable group with 6 infantry, 2 MGs and 2 anti-tank for both coalitions + {name = "Standard Group (8)", inf = 4, mg = 2, at = 2 }, -- will make a loadable group with 6 infantry, 2 MGs and 2 anti-tank for both coalitions {name = "Anti Air (5)", inf = 2, aa = 3 }, {name = "Anti Tank (8)", inf = 2, at = 6 }, {name = "Mortar Squad (6)", mortar = 6 }, {name = "Small Standard Group (4)", inf = 2, mg = 1, at = 1 }, - {name = "JTAC Group (5)", inf = 4, jtac = 1 }, -- will make a loadable group with 4 infantry and a JTAC soldier for both coalitions + {name = "JTAC Group (5)", inf = 4, jtac = 1 }, {name = "Single JTAC (1)", jtac = 1 }, + {name = "Small Platoon (16)", inf = 10, mg = 3, at = 3 }, {name = "Platoon (24)", inf = 12, mg = 4, at = 3, aa = 1 }, } end - - function RotorOps.setupRadioMenu() commandDB['conflict_zones_menu'] = missionCommands.addSubMenu( "ROTOR OPS") local conflict_zones_menu = commandDB['conflict_zones_menu'] @@ -759,7 +737,6 @@ end - function RotorOps.addZone(_name, _zone_defenders_flag) table.insert(RotorOps.zones, {name = _name, defenders_status_flag = _zone_defenders_flag}) trigger.action.setUserFlag(_zone_defenders_flag, 101) @@ -772,6 +749,7 @@ function RotorOps.stagingZone(_name) RotorOps.staging_zone = _name end + --function to automatically add transport craft to ctld, rather than having to define each in the mission editor function RotorOps.addPilots(var) for uName, uData in pairs(mist.DBs.humansByName) do @@ -785,10 +763,11 @@ function RotorOps.addPilots(var) local id = timer.scheduleFunction(RotorOps.addPilots, 1, timer.getTime() + 15) end + function RotorOps.setupConflict(_game_state_flag) RotorOps.addPilots(1) RotorOps.setupCTLD() - RotorOps.setupRadioMenu() + --RotorOps.setupRadioMenu() RotorOps.game_state_flag = _game_state_flag changeGameState(RotorOps.game_states.not_started) trigger.action.outText("ALL TROOPS GET TO TRANSPORT AND PREPARE FOR DEPLOYMENT!" , 10, false) @@ -806,15 +785,14 @@ function RotorOps.startConflict() if RotorOps.game_state ~= RotorOps.game_states.not_started then return end --make some changes to the radio menu - local conflict_zones_menu = commandDB['conflict_zones_menu'] - missionCommands.removeItem(commandDB['start_conflict']) + --local conflict_zones_menu = commandDB['conflict_zones_menu'] + --missionCommands.removeItem(commandDB['start_conflict']) --commandDB['clear_zone'] = missionCommands.addCommand( "[CHEAT] Force Clear Zone" , conflict_zones_menu , RotorOps.clearActiveZone) RotorOps.setActiveZone(1) gameMsg(gameMsgs.start) gameMsg(gameMsgs.push, 1) processMsgBuffer() - RotorOps.aiActiveZone() staged_units = mist.getUnitsInZones(mist.makeUnitTable({'[all][vehicle]'}), {RotorOps.staging_zone}) local staged_groups = RotorOps.groupsFromUnits(staged_units) diff --git a/documentation/images/conflict_setup.PNG b/documentation/images/conflict_setup.PNG new file mode 100644 index 0000000000000000000000000000000000000000..da48960fec68fb0b3639c841f7104277704d6acc GIT binary patch literal 42299 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 Nl)i~xsg6_V{{b#uu_gcj literal 0 HcmV?d00001 diff --git a/sound/beacon.ogg b/sound/embedded/beacon.ogg similarity index 100% rename from sound/beacon.ogg rename to sound/embedded/beacon.ogg diff --git a/sound/beaconsilent.ogg b/sound/embedded/beaconsilent.ogg similarity index 100% rename from sound/beaconsilent.ogg rename to sound/embedded/beaconsilent.ogg diff --git a/sound/cleared_active.ogg b/sound/embedded/cleared_active.ogg similarity index 100% rename from sound/cleared_active.ogg rename to sound/embedded/cleared_active.ogg diff --git a/sound/cleared_alpha.ogg b/sound/embedded/cleared_alpha.ogg similarity index 100% rename from sound/cleared_alpha.ogg rename to sound/embedded/cleared_alpha.ogg diff --git a/sound/cleared_bravo.ogg b/sound/embedded/cleared_bravo.ogg similarity index 100% rename from sound/cleared_bravo.ogg rename to sound/embedded/cleared_bravo.ogg diff --git a/sound/cleared_charlie.ogg b/sound/embedded/cleared_charlie.ogg similarity index 100% rename from sound/cleared_charlie.ogg rename to sound/embedded/cleared_charlie.ogg diff --git a/sound/cleared_delta.ogg b/sound/embedded/cleared_delta.ogg similarity index 100% rename from sound/cleared_delta.ogg rename to sound/embedded/cleared_delta.ogg diff --git a/sound/get_troops_alpha.ogg b/sound/embedded/get_troops_alpha.ogg similarity index 100% rename from sound/get_troops_alpha.ogg rename to sound/embedded/get_troops_alpha.ogg diff --git a/sound/get_troops_bravo.ogg b/sound/embedded/get_troops_bravo.ogg similarity index 100% rename from sound/get_troops_bravo.ogg rename to sound/embedded/get_troops_bravo.ogg diff --git a/sound/get_troops_charlie.ogg b/sound/embedded/get_troops_charlie.ogg similarity index 100% rename from sound/get_troops_charlie.ogg rename to sound/embedded/get_troops_charlie.ogg diff --git a/sound/get_troops_delta.ogg b/sound/embedded/get_troops_delta.ogg similarity index 100% rename from sound/get_troops_delta.ogg rename to sound/embedded/get_troops_delta.ogg diff --git a/sound/get_troops_next_zone.ogg b/sound/embedded/get_troops_next_zone.ogg similarity index 100% rename from sound/get_troops_next_zone.ogg rename to sound/embedded/get_troops_next_zone.ogg diff --git a/sound/mission_success.ogg b/sound/embedded/mission_success.ogg similarity index 100% rename from sound/mission_success.ogg rename to sound/embedded/mission_success.ogg diff --git a/sound/push_alpha.ogg b/sound/embedded/push_alpha.ogg similarity index 100% rename from sound/push_alpha.ogg rename to sound/embedded/push_alpha.ogg diff --git a/sound/push_bravo.ogg b/sound/embedded/push_bravo.ogg similarity index 100% rename from sound/push_bravo.ogg rename to sound/embedded/push_bravo.ogg diff --git a/sound/push_charlie.ogg b/sound/embedded/push_charlie.ogg similarity index 100% rename from sound/push_charlie.ogg rename to sound/embedded/push_charlie.ogg diff --git a/sound/push_delta.ogg b/sound/embedded/push_delta.ogg similarity index 100% rename from sound/push_delta.ogg rename to sound/embedded/push_delta.ogg diff --git a/sound/push_next_zone.ogg b/sound/embedded/push_next_zone.ogg similarity index 100% rename from sound/push_next_zone.ogg rename to sound/embedded/push_next_zone.ogg diff --git a/sound/support_troops.ogg b/sound/embedded/support_troops.ogg similarity index 100% rename from sound/support_troops.ogg rename to sound/embedded/support_troops.ogg diff --git a/sound/troops_dropped_active.ogg b/sound/embedded/troops_dropped_active.ogg similarity index 100% rename from sound/troops_dropped_active.ogg rename to sound/embedded/troops_dropped_active.ogg diff --git a/sound/troops_dropped_alpha.ogg b/sound/embedded/troops_dropped_alpha.ogg similarity index 100% rename from sound/troops_dropped_alpha.ogg rename to sound/embedded/troops_dropped_alpha.ogg diff --git a/sound/troops_dropped_bravo.ogg b/sound/embedded/troops_dropped_bravo.ogg similarity index 100% rename from sound/troops_dropped_bravo.ogg rename to sound/embedded/troops_dropped_bravo.ogg diff --git a/sound/troops_dropped_charlie.ogg b/sound/embedded/troops_dropped_charlie.ogg similarity index 100% rename from sound/troops_dropped_charlie.ogg rename to sound/embedded/troops_dropped_charlie.ogg diff --git a/sound/troops_dropped_delta.ogg b/sound/embedded/troops_dropped_delta.ogg similarity index 100% rename from sound/troops_dropped_delta.ogg rename to sound/embedded/troops_dropped_delta.ogg From a4035b9e7c264163c1ec7c0331d9eb61a798c910 Mon Sep 17 00:00:00 2001 From: spencer-ki Date: Sat, 8 Jan 2022 20:56:49 -0800 Subject: [PATCH 2/2] .. --- RotorOps.lua | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/RotorOps.lua b/RotorOps.lua index 6c4b8d0..437e995 100644 --- a/RotorOps.lua +++ b/RotorOps.lua @@ -543,23 +543,19 @@ function RotorOps.assessUnitsInZone(var) if #active_zone_initial_enemy_units == 0 then active_zone_initial_enemy_units = 1 end --prevent divide by zero local defenders_remaining_percent = math.floor((#red_ground_units / #active_zone_initial_enemy_units) * 100) - if #red_ground_units <= RotorOps.max_units_left then --if we should declare the zone cleared - active_zone_initial_enemy_units = nil - defenders_remaining_percent = 0 - trigger.action.setUserFlag(defenders_status_flag, 0) --set the zone's flag to cleared - gameMsg(gameMsgs.cleared, RotorOps.active_zone_index) + if #red_ground_units <= RotorOps.max_units_left then --if we should declare the zone cleared + active_zone_initial_enemy_units = nil + defenders_remaining_percent = 0 + trigger.action.setUserFlag(defenders_status_flag, 0) --set the zone's flag to cleared + gameMsg(gameMsgs.cleared, RotorOps.active_zone_index) + + if RotorOps.auto_push then --push units to the next zone + RotorOps.setActiveZone(RotorOps.active_zone_index + 1) + end - if RotorOps.auto_push then --push units to the next zone - RotorOps.setActiveZone(RotorOps.active_zone_index + 1) - local staged_groups = RotorOps.groupsFromUnits(staged_units) - for index, group in pairs(staged_groups) do - RotorOps.aiTask(group,"move_to_active_zone", RotorOps.zones[RotorOps.active_zone_index].name) --send vehicles to next zone - end - end - - else - trigger.action.setUserFlag(defenders_status_flag, defenders_remaining_percent) --set the zones flage to indicate the status of remaining enemies - end + else + trigger.action.setUserFlag(defenders_status_flag, defenders_remaining_percent) --set the zones flag to indicate the status of remaining enemies + end --are all zones clear? local all_zones_clear = true @@ -684,6 +680,11 @@ function RotorOps.setActiveZone(new_index) changeGameState(new_index) if new_index < old_index then gameMsg(gameMsgs.fallback, new_index) end if new_index > old_index then gameMsg(gameMsgs.get_troops_to_zone, new_index) end + + local staged_groups = RotorOps.groupsFromUnits(staged_units) + for index, group in pairs(staged_groups) do + RotorOps.aiTask(group,"move_to_active_zone", RotorOps.zones[RotorOps.active_zone_index].name) --send vehicles to next zone + end end @@ -789,17 +790,13 @@ function RotorOps.startConflict() --missionCommands.removeItem(commandDB['start_conflict']) --commandDB['clear_zone'] = missionCommands.addCommand( "[CHEAT] Force Clear Zone" , conflict_zones_menu , RotorOps.clearActiveZone) - RotorOps.setActiveZone(1) + gameMsg(gameMsgs.start) gameMsg(gameMsgs.push, 1) processMsgBuffer() staged_units = mist.getUnitsInZones(mist.makeUnitTable({'[all][vehicle]'}), {RotorOps.staging_zone}) - local staged_groups = RotorOps.groupsFromUnits(staged_units) - for index, group in pairs(staged_groups) do - RotorOps.aiTask(group,"move_to_active_zone") - end - + RotorOps.setActiveZone(1) local id = timer.scheduleFunction(RotorOps.assessUnitsInZone, 1, timer.getTime() + 5) end