RotorOps/Generator/RotorOpsConflict.py
2024-03-30 22:35:56 -07:00

245 lines
14 KiB
Python

import dcs
import random
jtf_red = "Combined Joint Task Forces Red"
jtf_blue = "Combined Joint Task Forces Blue"
def triggerSetup(rops, options):
# get the boolean value from ui option and convert to lua string
def lb(var):
return str(options[var]).lower()
game_flag = 100
# Add the first trigger
trig = dcs.triggers.TriggerOnce(comment="RotorOps Setup Scripts")
trig.rules.append(dcs.condition.TimeAfter(1))
trig.actions.append(dcs.action.DoScriptFile(rops.scripts["mist.lua"]))
trig.actions.append(dcs.action.DoScriptFile(rops.scripts["Splash_Damage_2_0.lua"]))
trig.actions.append(dcs.action.DoScriptFile(rops.scripts["CTLD.lua"]))
trig.actions.append(dcs.action.DoScriptFile(rops.scripts["RotorOps.lua"]))
if options["perks"]:
trig.actions.append(dcs.action.DoScriptFile(rops.scripts["RotorOpsPerks.lua"]))
script = ("--OPTIONS HERE!\n\n" +
"RotorOps.CTLD_crates = " + lb("crates") + "\n\n" +
"RotorOps.CTLD_sound_effects = true\n\n" +
"RotorOps.force_offroad = " + lb("force_offroad") + "\n\n" +
"RotorOps.voice_overs = " + lb("voiceovers") + "\n\n" +
"RotorOps.zone_status_display = " + lb("game_display") + "\n\n" +
"RotorOps.inf_spawn_messages = true\n\n" +
"RotorOps.inf_spawns_total = " + lb("inf_spawn_qty") + "\n\n" +
"RotorOps.apcs_spawn_infantry = " + lb("apc_spawns_inf") + " \n\n" +
"RotorOps.fighter_min_detection_alt = 609\n\n" +
"RotorOps.fighter_max_active = 2\n\n")
if not options["smoke_pickup_zones"]:
script = script + 'RotorOps.pickup_zone_smoke = "none"\n\n'
trig.actions.append(dcs.action.DoScript(dcs.action.String((script))))
if options["script"]:
trig.actions.append(dcs.action.DoScript(dcs.action.String((options["script"]))))
rops.m.triggerrules.triggers.append(trig)
# Add the second trigger
trig = dcs.triggers.TriggerOnce(comment="RotorOps Setup Zones")
trig.rules.append(dcs.condition.TimeAfter(2))
for s_zone in rops.staging_zones:
trig.actions.append(dcs.action.DoScript(dcs.action.String("RotorOps.addStagingZone('" + s_zone + "')")))
for c_zone in rops.conflict_zones:
zone_flag = rops.conflict_zones[c_zone].flag
trig.actions.append(
dcs.action.DoScript(dcs.action.String("RotorOps.addZone('" + c_zone + "'," + str(zone_flag) + ")")))
trig.actions.append(dcs.action.DoScript(dcs.action.String("RotorOps.setupConflict('" + str(game_flag) + "')")))
rops.m.triggerrules.triggers.append(trig)
# Add the start trigger
if options["start_trigger"] is not False:
trig = dcs.triggers.TriggerOnce(comment="RotorOps Conflict Start")
trig.rules.append(dcs.condition.TimeAfter(10))
trig.actions.append(dcs.action.DoScript(dcs.action.String("RotorOps.startConflict(100)")))
rops.m.triggerrules.triggers.append(trig)
if options["rotorops_server"]:
trig = dcs.triggers.TriggerOnce(comment="RotorOps Set Up Server")
trig.rules.append(dcs.condition.TimeAfter(4))
trig.actions.append(dcs.action.DoScriptFile(rops.scripts["RotorOpsServer.lua"]))
# Slot block the zone spawns if SSB is available
trig.actions.append(dcs.action.SetFlagValue('SSB', 100))
for c_zone in rops.conflict_zones:
for group in rops.all_zones[c_zone].player_helo_spawns:
trig.actions.append(dcs.action.SetFlagValue(group.name, 100))
rops.m.triggerrules.triggers.append(trig)
# Add generic zone-based triggers
for index, zone_name in enumerate(rops.conflict_zones):
z_active_trig = dcs.triggers.TriggerOnce(comment=zone_name + " Active")
z_active_trig.rules.append(dcs.condition.FlagEquals(game_flag, index + 1))
z_active_trig.actions.append(dcs.action.DoScript(dcs.action.String("--Add any action you want here!")))
rops.m.triggerrules.triggers.append(z_active_trig)
# # Add CTLD beacons - this might be cool but we'd need to address placement of the 3D objects
# trig = dcs.triggers.TriggerOnce(comment="RotorOps CTLD Beacons")
# trig.rules.append(dcs.condition.TimeAfter(5))
# trig.actions.append(dcs.action.DoScript(dcs.action.String("ctld.createRadioBeaconAtZone('STAGING','blue', 1440,'STAGING/LOGISTICS')")))
# for c_zone in rops.conflict_zones:
# trig.actions.append(
# dcs.action.DoScript(dcs.action.String("ctld.createRadioBeaconAtZone('" + c_zone + "','blue', 1440,'" + c_zone + "')")))
# rops.m.triggerrules.triggers.append(trig)
# # Zone protection SAMs
# if options["zone_protect_sams"]:
# for index, zone_name in enumerate(rops.conflict_zones):
# z_sams_trig = dcs.triggers.TriggerOnce(comment="Deactivate " + zone_name + " SAMs")
# z_sams_trig.rules.append(dcs.condition.FlagEquals(game_flag, index + 1))
# z_sams_trig.actions.append(dcs.action.DoScript(
# dcs.action.String("Group.destroy(Group.getByName('" + zone_name + " Protect Static'))")))
# rops.m.triggerrules.triggers.append(z_sams_trig)
# Deactivate zone FARPs and player slots in defensive mode:
# this will also deactivate players already in the air.
# if options["defending"]:
# for index, zone_name in enumerate(rops.conflict_zones):
# z_farps_trig = dcs.triggers.TriggerOnce(comment="Deactivate " + zone_name + " FARP")
# z_farps_trig.rules.append(dcs.condition.FlagEquals(game_flag, index + 1))
# z_farps_trig.actions.append(dcs.action.DeactivateGroup(rops.m.country(jtf_blue).find_group(zone_name + " FARP Static").id))
# for group in rops.all_zones[zone_name].player_helo_spawns:
# z_farps_trig.actions.append(
# dcs.action.DeactivateGroup(
# group.id))
# rops.m.triggerrules.triggers.append(z_farps_trig)
# Zone FARPS always
if options["zone_farps"] == "farp_always" and not options["defending"]:
for index, zone_name in enumerate(rops.conflict_zones):
if index > 0:
previous_zone = list(rops.conflict_zones)[index - 1]
if not rops.m.country(jtf_blue).find_group(previous_zone + " FARP Static"):
continue
z_farps_trig = dcs.triggers.TriggerOnce(comment="Activate " + previous_zone + " FARP")
z_farps_trig.rules.append(dcs.condition.FlagEquals(game_flag, index + 1))
z_farps_trig.actions.append(
dcs.action.ActivateGroup(rops.m.country(jtf_blue).find_group(previous_zone + " FARP Static").id))
# Activate late-activated helicopters at FARPs if SSB slot blocking script is available
for group in rops.all_zones[previous_zone].player_helo_spawns:
z_farps_trig.actions.append(
dcs.action.SetFlagValue(group.name, 0))
z_farps_trig.actions.append(dcs.action.DoScript(dcs.action.String(
"RotorOps.farpEstablished(" + str(index) + ", '" + previous_zone + "_FARP')")))
rops.m.triggerrules.triggers.append(z_farps_trig)
# Zone FARPS conditional on staged units remaining
if options["zone_farps"] == "farp_gunits" and not options["defending"]:
for index, zone_name in enumerate(rops.conflict_zones):
if index > 0:
previous_zone = list(rops.conflict_zones)[index - 1]
if not rops.m.country(jtf_blue).find_group(previous_zone + " FARP Static"):
continue
z_farps_trig = dcs.triggers.TriggerOnce(comment="Activate " + previous_zone + " FARP")
z_farps_trig.rules.append(dcs.condition.FlagEquals(game_flag, index + 1))
z_farps_trig.rules.append(dcs.condition.FlagIsMore(111, 20))
z_farps_trig.actions.append(dcs.action.DoScript(dcs.action.String(
"--The 100 flag indicates which zone is active. The 111 flag value is the percentage of staged units remaining")))
z_farps_trig.actions.append(
dcs.action.ActivateGroup(rops.m.country(jtf_blue).find_group(previous_zone + " FARP Static").id))
# Activate late-activated helicopters at FARPs if SSB slot blocking script is available
for group in rops.all_zones[previous_zone].player_helo_spawns:
z_farps_trig.actions.append(
dcs.action.SetFlagValue(group.name, 0))
z_farps_trig.actions.append(dcs.action.DoScript(dcs.action.String(
"RotorOps.farpEstablished(" + str(index) + ", '" + previous_zone + "_FARP')")))
rops.m.triggerrules.triggers.append(z_farps_trig)
# Add attack helos triggers
for index in range(options["e_attack_helos"]):
random_zone_obj = random.choice(list(rops.conflict_zones.items()))
zone = random_zone_obj[1]
z_weak_trig = dcs.triggers.TriggerOnce(comment=zone.name + " Attack Helo")
z_weak_trig.rules.append(dcs.condition.FlagIsMore(zone.flag, 1))
z_weak_trig.rules.append(dcs.condition.FlagIsLess(zone.flag, random.randrange(20, 90)))
z_weak_trig.actions.append(dcs.action.DoScript(dcs.action.String("---Flag " + str(
zone.flag) + " value represents the percentage of defending ground units remaining in zone. ")))
z_weak_trig.actions.append(dcs.action.DoScript(dcs.action.String("RotorOps.spawnAttackHelos()")))
rops.m.triggerrules.triggers.append(z_weak_trig)
# Add attack plane triggers
for index in range(options["e_attack_planes"]):
random_zone_obj = random.choice(list(rops.conflict_zones.items()))
zone = random_zone_obj[1]
z_weak_trig = dcs.triggers.TriggerOnce(comment=zone.name + " Attack Plane")
z_weak_trig.rules.append(dcs.condition.FlagIsMore(zone.flag, 1))
z_weak_trig.rules.append(dcs.condition.FlagIsLess(zone.flag, random.randrange(20, 90)))
z_weak_trig.actions.append(dcs.action.DoScript(dcs.action.String("---Flag " + str(
zone.flag) + " value represents the percentage of defending ground units remaining in zone. ")))
z_weak_trig.actions.append(dcs.action.DoScript(dcs.action.String("RotorOps.spawnAttackPlanes()")))
rops.m.triggerrules.triggers.append(z_weak_trig)
# Add transport helos triggers
for index in range(options["e_transport_helos"]):
random_zone_obj = random.choice(list(rops.conflict_zones.items()))
zone = random_zone_obj[1]
z_weak_trig = dcs.triggers.TriggerOnce(comment=zone.name + " Transport Helo")
z_weak_trig.rules.append(dcs.condition.FlagIsMore(zone.flag, 1))
z_weak_trig.rules.append(dcs.condition.FlagIsLess(zone.flag, random.randrange(20, 100)))
z_weak_trig.actions.append(dcs.action.DoScript(dcs.action.String(
"---Flag " + str(game_flag) + " value represents the index of the active zone. ")))
z_weak_trig.actions.append(dcs.action.DoScript(dcs.action.String("---Flag " + str(
zone.flag) + " value represents the percentage of defending ground units remaining in zone. ")))
z_weak_trig.actions.append(dcs.action.DoScript(
dcs.action.String("RotorOps.spawnTranspHelos(8," + str(options["transport_drop_qty"]) + ")")))
rops.m.triggerrules.triggers.append(z_weak_trig)
# Add enemy CAP spawn trigger
cap_trig = dcs.triggers.TriggerContinious(comment="Spawn Enemy CAP")
cap_trig.rules.append(dcs.condition.TimeAfter(10))
cap_trig.rules.append(dcs.condition.Predicate(dcs.action.String("return RotorOps.predSpawnRedCap()")))
cap_trig.actions.append(dcs.action.DoScript(dcs.action.String("RotorOps.deployFighters()")))
rops.m.triggerrules.triggers.append(cap_trig)
# Add game won/lost triggers
# Add game won triggers
mission_end_delay = 1200
trig = dcs.triggers.TriggerOnce(comment="RotorOps Conflict WON")
trig.rules.append(dcs.condition.FlagEquals(game_flag, 99))
trig.actions.append(
dcs.action.DoScript(dcs.action.String("---Add an action you want to happen when the game is WON")))
if options["end_trigger"] is not False:
trig.actions.append(
dcs.action.DoScript(dcs.action.String("RotorOps.gameMsg(RotorOps.gameMsgs.success)")))
trig.actions.append(dcs.action.DoScript(dcs.action.String(
"timer.scheduleFunction(function()trigger.action.setUserFlag('mission_end', 2) end, {}, timer.getTime() + " + str(
mission_end_delay) + ")")))
trig.actions.append(dcs.action.MessageToAll(dcs.action.String("Time to RTB. Mission will end soon."), mission_end_delay))
mission_end_trigger = dcs.triggers.TriggerOnce(comment="End the mission")
mission_end_trigger.rules.append(dcs.condition.FlagEquals("mission_end", 2))
mission_end_trigger.actions.append(dcs.action.EndMission(text=dcs.action.String("Blue forces won!")))
rops.m.triggerrules.triggers.append(mission_end_trigger)
rops.m.triggerrules.triggers.append(trig)
# Add game lost triggers
trig = dcs.triggers.TriggerOnce(comment="RotorOps Conflict LOST")
trig.rules.append(dcs.condition.FlagEquals(game_flag, 98))
trig.actions.append(
dcs.action.DoScript(dcs.action.String("---Add an action you want to happen when the game is LOST")))
if options["end_trigger"] is not False:
trig.actions.append(dcs.action.DoScript(dcs.action.String("RotorOps.gameMsg(RotorOps.gameMsgs.failure)")))
trig.actions.append(dcs.action.DoScript(dcs.action.String(
"timer.scheduleFunction(function()trigger.action.setUserFlag('mission_end', 1) end, {}, timer.getTime() + " + str(
mission_end_delay) + ")")))
trig.actions.append(
dcs.action.MessageToAll(dcs.action.String("Time to RTB. Mission will end soon."), mission_end_delay))
mission_end_trigger = dcs.triggers.TriggerOnce(comment="End the mission")
mission_end_trigger.rules.append(dcs.condition.FlagEquals("mission_end", 1))
mission_end_trigger.actions.append(dcs.action.EndMission(text=dcs.action.String("Red forces won!")))
rops.m.triggerrules.triggers.append(mission_end_trigger)
rops.m.triggerrules.triggers.append(trig)