First version of the generated Pretense campaign running in-game.

This commit is contained in:
MetalStormGhost 2023-09-14 21:10:50 +03:00
parent 0faa27dca5
commit 1dd9089477
3 changed files with 123 additions and 240 deletions

View File

@ -55,174 +55,17 @@ class PretenseLuaGenerator(LuaGenerator):
def generate_plugin_data(self) -> None:
self.mission.triggerrules.triggers.clear()
lua_data = LuaData("dcsRetribution")
install_path = lua_data.add_item("installPath")
install_path.set_value(os.path.abspath("."))
lua_data.add_item("Airbases")
carriers_object = lua_data.add_item("Carriers")
for carrier in self.mission_data.carriers:
carrier_item = carriers_object.add_item()
carrier_item.add_key_value("dcsGroupName", carrier.group_name)
carrier_item.add_key_value("unit_name", carrier.unit_name)
carrier_item.add_key_value("callsign", carrier.callsign)
carrier_item.add_key_value("radio", str(carrier.freq.mhz))
carrier_item.add_key_value(
"tacan", str(carrier.tacan.number) + carrier.tacan.band.name
)
tankers_object = lua_data.add_item("Tankers")
for tanker in self.mission_data.tankers:
tanker_item = tankers_object.add_item()
tanker_item.add_key_value("dcsGroupName", tanker.group_name)
tanker_item.add_key_value("callsign", tanker.callsign)
tanker_item.add_key_value("variant", tanker.variant)
tanker_item.add_key_value("radio", str(tanker.freq.mhz))
tanker_item.add_key_value(
"tacan", str(tanker.tacan.number) + tanker.tacan.band.name
)
awacs_object = lua_data.add_item("AWACs")
for awacs in self.mission_data.awacs:
awacs_item = awacs_object.add_item()
awacs_item.add_key_value("dcsGroupName", awacs.group_name)
awacs_item.add_key_value("callsign", awacs.callsign)
awacs_item.add_key_value("radio", str(awacs.freq.mhz))
jtacs_object = lua_data.add_item("JTACs")
for jtac in self.mission_data.jtacs:
jtac_item = jtacs_object.add_item()
jtac_item.add_key_value("dcsGroupName", jtac.group_name)
jtac_item.add_key_value("callsign", jtac.callsign)
jtac_item.add_key_value("zone", jtac.region)
jtac_item.add_key_value("dcsUnit", jtac.unit_name)
jtac_item.add_key_value("laserCode", jtac.code)
jtac_item.add_key_value("radio", str(jtac.freq.mhz))
jtac_item.add_key_value("modulation", jtac.freq.modulation.name)
logistics_object = lua_data.add_item("Logistics")
logistics_flights = logistics_object.add_item("flights")
crates_object = logistics_object.add_item("crates")
spawnable_crates: dict[str, str] = {}
transports: list[AircraftType] = []
for logistic_info in self.mission_data.logistics:
if logistic_info.transport not in transports:
transports.append(logistic_info.transport)
coalition_color = "blue" if logistic_info.blue else "red"
logistics_item = logistics_flights.add_item()
logistics_item.add_data_array("pilot_names", logistic_info.pilot_names)
logistics_item.add_key_value("pickup_zone", logistic_info.pickup_zone)
logistics_item.add_key_value("drop_off_zone", logistic_info.drop_off_zone)
logistics_item.add_key_value("target_zone", logistic_info.target_zone)
logistics_item.add_key_value("side", str(2 if logistic_info.blue else 1))
logistics_item.add_key_value("logistic_unit", logistic_info.logistic_unit)
logistics_item.add_key_value(
"aircraft_type", logistic_info.transport.dcs_id
)
logistics_item.add_key_value(
"preload", "true" if logistic_info.preload else "false"
)
for cargo in logistic_info.cargo:
if cargo.unit_type not in spawnable_crates:
spawnable_crates[cargo.unit_type] = str(200 + len(spawnable_crates))
crate_weight = spawnable_crates[cargo.unit_type]
for i in range(cargo.amount):
cargo_item = crates_object.add_item()
cargo_item.add_key_value("weight", crate_weight)
cargo_item.add_key_value("coalition", coalition_color)
cargo_item.add_key_value("zone", cargo.spawn_zone)
transport_object = logistics_object.add_item("transports")
for transport in transports:
transport_item = transport_object.add_item()
transport_item.add_key_value("aircraft_type", transport.dcs_id)
transport_item.add_key_value("cabin_size", str(transport.cabin_size))
transport_item.add_key_value(
"troops", "true" if transport.cabin_size > 0 else "false"
)
transport_item.add_key_value(
"crates", "true" if transport.can_carry_crates else "false"
)
spawnable_crates_object = logistics_object.add_item("spawnable_crates")
for unit, weight in spawnable_crates.items():
crate_item = spawnable_crates_object.add_item()
crate_item.add_key_value("unit", unit)
crate_item.add_key_value("weight", weight)
target_points = lua_data.add_item("TargetPoints")
for flight in self.mission_data.flights:
if flight.friendly and flight.flight_type in [
FlightType.ANTISHIP,
FlightType.DEAD,
FlightType.SEAD,
FlightType.STRIKE,
]:
flight_type = str(flight.flight_type)
flight_target = flight.package.target
if flight_target:
flight_target_name = None
flight_target_type = None
if isinstance(flight_target, TheaterGroundObject):
flight_target_name = flight_target.obj_name
flight_target_type = (
flight_type + f" TGT ({flight_target.category})"
)
elif hasattr(flight_target, "name"):
flight_target_name = flight_target.name
flight_target_type = flight_type + " TGT (Airbase)"
target_item = target_points.add_item()
if flight_target_name:
target_item.add_key_value("name", flight_target_name)
if flight_target_type:
target_item.add_key_value("type", flight_target_type)
target_item.add_key_value(
"positionX", str(flight_target.position.x)
)
target_item.add_key_value(
"positionY", str(flight_target.position.y)
)
for cp in self.game.theater.controlpoints:
coalition_object = (
lua_data.get_or_create_item("BlueAA")
if cp.captured
else lua_data.get_or_create_item("RedAA")
)
for ground_object in cp.ground_objects:
for g in ground_object.groups:
threat_range = g.max_threat_range()
if not threat_range:
continue
aa_item = coalition_object.add_item()
aa_item.add_key_value("name", ground_object.name)
aa_item.add_key_value("range", str(threat_range.meters))
aa_item.add_key_value("positionX", str(ground_object.position.x))
aa_item.add_key_value("positionY", str(ground_object.position.y))
# Generate IADS Lua Item
iads_object = lua_data.add_item("IADS")
for node in self.game.theater.iads_network.skynet_nodes(self.game):
coalition = iads_object.get_or_create_item("BLUE" if node.player else "RED")
iads_type = coalition.get_or_create_item(node.iads_role.value)
iads_element = iads_type.add_item()
iads_element.add_key_value("dcsGroupName", node.dcs_name)
if node.iads_role in [IadsRole.SAM, IadsRole.SAM_AS_EWR]:
# add additional SkynetProperties to SAM Sites
for property, value in node.properties.items():
iads_element.add_key_value(property, value)
for role, connections in node.connections.items():
iads_element.add_data_array(role, connections)
self.inject_plugin_script("base", "mist_4_5_107.lua", "mist_4_5_107")
self.inject_plugin_script(
"pretense", "pretense_compiled.lua", "pretense_compiled"
)
trigger = TriggerStart(comment="Pretense init")
init_header_file = open("./resources/plugins/pretense/init_header.lua", "r")
init_header = init_header_file.read()
lua_string = ""
lua_data = LuaData("products")
lua_string_zones = ""
for cp in self.game.theater.controlpoints:
cp_name_trimmed = "".join([i for i in cp.name.lower() if i.isalnum()])
@ -230,93 +73,129 @@ class PretenseLuaGenerator(LuaGenerator):
for side in range(1, 3):
if cp_name_trimmed not in self.game.pretense_air[cp_side]:
self.game.pretense_air[side][cp_name_trimmed] = {}
# if flight_type not in self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed]:
# self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed][flight_type] = list()
lua_string += f"zones.{cp_name_trimmed} = ZoneCommand:new('{cp.name}')\n"
lua_string += (
if cp_name_trimmed not in self.game.pretense_ground_supply[cp_side]:
self.game.pretense_ground_supply[side][cp_name_trimmed] = list()
if cp_name_trimmed not in self.game.pretense_ground_assault[cp_side]:
self.game.pretense_ground_assault[side][cp_name_trimmed] = list()
lua_string_zones += (
f"zones.{cp_name_trimmed} = ZoneCommand:new('{cp.name}')\n"
)
lua_string_zones += (
f"zones.{cp_name_trimmed}.initialState = "
+ "{ side="
+ str(cp_side)
+ " }\n"
)
lua_string += f"zones.{cp_name_trimmed}.keepActive = true\n"
lua_string_zones += f"zones.{cp_name_trimmed}.keepActive = true\n"
max_resource = 20000
if cp.has_helipads:
lua_string += f"zones.{cp_name_trimmed}.isHeloSpawn = true\n"
lua_string_zones += f"zones.{cp_name_trimmed}.isHeloSpawn = true\n"
max_resource = 30000
if isinstance(cp, Airfield) or cp.has_ground_spawns:
lua_string += f"zones.{cp_name_trimmed}.isPlaneSpawn = true\n"
lua_string += f"zones.{cp_name_trimmed}.maxResource = 50000\n"
lua_string += f"zones.{cp_name_trimmed}:defineUpgrades(" + "{\n"
lua_string += " [1] = { --red side\n"
lua_string += " presets.upgrades.basic.tent:extend({\n"
lua_string += f" name='{cp_name_trimmed}-tent-red',\n"
lua_string += " products = {\n"
lua_string += (
lua_string_zones += f"zones.{cp_name_trimmed}.isPlaneSpawn = true\n"
if cp.has_ground_spawns:
max_resource = 40000
if isinstance(cp, Airfield):
max_resource = 50000
lua_string_zones += (
f"zones.{cp_name_trimmed}.maxResource = {max_resource}\n"
)
lua_string_zones += f"zones.{cp_name_trimmed}:defineUpgrades(" + "{\n"
lua_string_zones += " [1] = { --red side\n"
lua_string_zones += " presets.upgrades.basic.tent:extend({\n"
lua_string_zones += f" name='{cp_name_trimmed}-tent-red',\n"
lua_string_zones += " products = {\n"
lua_string_zones += (
" presets.special.red.infantry:extend({ name='"
+ cp_name_trimmed
+ "-defense-red'})\n"
)
lua_string += " }\n"
lua_string += " }),\n"
lua_string += " presets.upgrades.basic.comPost:extend({\n"
lua_string += f" name = '{cp_name_trimmed}-com-red',\n"
lua_string += " products = {"
lua_string += (
lua_string_zones += " }\n"
lua_string_zones += " }),\n"
lua_string_zones += " presets.upgrades.basic.comPost:extend({\n"
lua_string_zones += f" name = '{cp_name_trimmed}-com-red',\n"
lua_string_zones += " products = {"
lua_string_zones += (
" presets.special.red.infantry:extend({ name='"
+ cp_name_trimmed
+ "-defense-red'}),\n"
)
lua_string += (
lua_string_zones += (
" presets.defenses.red.infantry:extend({ name='"
+ cp_name_trimmed
+ "-garrison-red' })\n"
)
lua_string += " }\n"
lua_string += " }),\n"
lua_string += " },\n"
lua_string += " [2] = --blue side\n"
lua_string += " {\n"
lua_string += " presets.upgrades.basic.tent:extend({\n"
lua_string += f" name='{cp_name_trimmed}-tent-blue',\n"
lua_string += " products = {\n"
lua_string += (
lua_string_zones += " }\n"
lua_string_zones += " }),\n"
lua_string_zones += " },\n"
lua_string_zones += " [2] = --blue side\n"
lua_string_zones += " {\n"
lua_string_zones += " presets.upgrades.basic.tent:extend({\n"
lua_string_zones += f" name='{cp_name_trimmed}-tent-blue',\n"
lua_string_zones += " products = {\n"
lua_string_zones += (
" presets.special.blue.infantry:extend({ name='"
+ cp_name_trimmed
+ "-defense-blue'})\n"
)
lua_string += " }\n"
lua_string += " }),\n"
lua_string += " presets.upgrades.basic.comPost:extend({\n"
lua_string += f" name = '{cp_name_trimmed}-com-blue',\n"
lua_string += " products = {\n"
lua_string += (
lua_string_zones += " }\n"
lua_string_zones += " }),\n"
lua_string_zones += " presets.upgrades.basic.comPost:extend({\n"
lua_string_zones += f" name = '{cp_name_trimmed}-com-blue',\n"
lua_string_zones += " products = {\n"
lua_string_zones += (
" presets.special.blue.infantry:extend({ name='"
+ cp_name_trimmed
+ "-defense-blue'}),\n"
)
lua_string += (
lua_string_zones += (
" presets.defenses.blue.infantry:extend({ name='"
+ cp_name_trimmed
+ "-garrison-blue' })\n"
)
lua_string += " }\n"
lua_string += " }),\n"
lua_string += " presets.upgrades.supply.fuelTank:extend({\n"
lua_string += (
lua_string_zones += " }\n"
lua_string_zones += " }),\n"
lua_string_zones += " presets.upgrades.supply.fuelTank:extend({\n"
lua_string_zones += (
" name = '" + cp_name_trimmed + "-fueltank-blue',\n"
)
lua_string += " products = {\n"
lua_string += " presets.missions.supply.convoy_escorted:extend({ name='batumi-supply-convoy-1'}),\n"
lua_string += " presets.missions.supply.helo:extend({ name='batumi-supply-blue-1' }),\n"
lua_string += " presets.missions.supply.transfer:extend({name='batumi-transfer-blue'})\n"
lua_string += " }\n"
lua_string += " }),\n"
lua_string += " presets.upgrades.airdef.comCenter:extend({\n"
lua_string += (
lua_string_zones += " products = {\n"
for ground_group in self.game.pretense_ground_supply[cp_side][
cp_name_trimmed
]:
lua_string_zones += (
" presets.missions.supply.convoy:extend({ name='"
+ ground_group
+ "'}),\n"
)
for ground_group in self.game.pretense_ground_assault[cp_side][
cp_name_trimmed
]:
lua_string_zones += (
" presets.missions.attack.surface:extend({ name='"
+ ground_group
+ "'}),\n"
)
for mission_type in self.game.pretense_air[cp_side][cp_name_trimmed]:
if mission_type == FlightType.AIR_ASSAULT.name:
mission_name = "supply.helo"
for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][
mission_type
]:
lua_string_zones += (
f" presets.missions.{mission_name}:extend"
+ "({name='"
+ air_group
+ "'}),\n"
)
lua_string_zones += " }\n"
lua_string_zones += " }),\n"
lua_string_zones += " presets.upgrades.airdef.comCenter:extend({\n"
lua_string_zones += (
f" name = '{cp_name_trimmed}-mission-command-blue',\n"
)
lua_string += " products = {\n"
lua_string += (
lua_string_zones += " products = {\n"
lua_string_zones += (
" presets.defenses.blue.shorad:extend({ name='"
+ cp_name_trimmed
+ "-sam-blue' }),\n"
@ -327,7 +206,7 @@ class PretenseLuaGenerator(LuaGenerator):
for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][
mission_type
]:
lua_string += (
lua_string_zones += (
f" presets.missions.{mission_name}:extend"
+ "({name='"
+ air_group
@ -338,7 +217,7 @@ class PretenseLuaGenerator(LuaGenerator):
for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][
mission_type
]:
lua_string += (
lua_string_zones += (
f" presets.missions.{mission_name}:extend"
+ "({name='"
+ air_group
@ -349,7 +228,7 @@ class PretenseLuaGenerator(LuaGenerator):
for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][
mission_type
]:
lua_string += (
lua_string_zones += (
f" presets.missions.{mission_name}:extend"
+ "({name='"
+ air_group
@ -360,7 +239,7 @@ class PretenseLuaGenerator(LuaGenerator):
for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][
mission_type
]:
lua_string += (
lua_string_zones += (
f" presets.missions.{mission_name}:extend"
+ "({name='"
+ air_group
@ -371,23 +250,12 @@ class PretenseLuaGenerator(LuaGenerator):
for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][
mission_type
]:
lua_string += (
lua_string_zones += (
f" presets.missions.{mission_name}:extend"
+ "({name='"
+ air_group
+ "', altitude=25000, range=25}),\n"
)
elif mission_type == FlightType.AIR_ASSAULT.name:
mission_name = "supply.helo"
for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][
mission_type
]:
lua_string += (
f" presets.missions.{mission_name}:extend"
+ "({name='"
+ air_group
+ "'}),\n"
)
elif mission_type == FlightType.REFUELING.name:
mission_name = "support.tanker"
for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][
@ -403,7 +271,7 @@ class PretenseLuaGenerator(LuaGenerator):
tanker_variant = "Boom"
else:
tanker_variant = "Drogue"
lua_string += (
lua_string_zones += (
f" presets.missions.{mission_name}:extend"
+ "({name='"
+ air_group
@ -424,7 +292,7 @@ class PretenseLuaGenerator(LuaGenerator):
for awacs in self.mission_data.awacs:
if awacs.group_name == air_group:
awacs_freq = awacs.freq.hertz / 1000000
lua_string += (
lua_string_zones += (
f" presets.missions.{mission_name}:extend"
+ "({name='"
+ air_group
@ -432,18 +300,32 @@ class PretenseLuaGenerator(LuaGenerator):
+ str(awacs_freq)
+ "}),\n"
)
lua_string += " }\n"
lua_string += " })\n"
lua_string += " }\n"
lua_string += "})\n"
lua_string_zones += " }\n"
lua_string_zones += " })\n"
lua_string_zones += " }\n"
lua_string_zones += "})\n"
init_body_file = open("./resources/plugins/pretense/init_body.lua", "r")
init_body = init_body_file.read()
lua_string_connman = " cm = ConnectionManager:new()"
for cp in self.game.theater.controlpoints:
for other_cp in cp.connected_points:
lua_string_connman += (
f" cm: addConnection('{cp.name}', '{other_cp.name}')"
)
init_footer_file = open("./resources/plugins/pretense/init_footer.lua", "r")
init_footer = init_footer_file.read()
lua_string = init_header + lua_string + init_body + init_footer
lua_string = (
init_header
+ lua_string_zones
+ lua_string_connman
+ init_body
+ init_footer
)
trigger.add_action(DoScript(String(lua_string)))
self.mission.triggerrules.triggers.append(trigger)

View File

@ -29,7 +29,7 @@ from dcs.triggers import Event, TriggerCondition, TriggerOnce
from dcs.unit import Skill
from game.theater import Airfield
from game.theater.controlpoint import Fob, TRIGGER_RADIUS_CAPTURE
from game.theater.controlpoint import Fob, TRIGGER_RADIUS_CAPTURE, OffMapSpawn
if TYPE_CHECKING:
from game.game import Game
@ -157,7 +157,7 @@ class PretenseTriggerGenerator:
Directly appends to the global `base_capture_events` var declared by `dcs_libaration.lua`
"""
for cp in self.game.theater.controlpoints:
if isinstance(cp, self.capture_zone_types) and not cp.is_fleet:
if not isinstance(cp, OffMapSpawn):
zone_color = {1: 0.0, 2: 0.0, 3: 0.0, 4: 0.15}
trigger_zone = self.mission.triggers.add_triggerzone(
@ -215,7 +215,6 @@ class PretenseTriggerGenerator:
self._set_skill(player_coalition, enemy_coalition)
self._set_allegiances(player_coalition, enemy_coalition)
self._gen_markers()
self._generate_pretense_zone_triggers(player_coalition, enemy_coalition)
@classmethod

View File

@ -1,4 +1,6 @@
end
ZoneCommand.setNeighbours(cm)
bm = BattlefieldManager:new()