diff --git a/game/pretense/pretenseluagenerator.py b/game/pretense/pretenseluagenerator.py index cb1e34c7..2d0e2dd3 100644 --- a/game/pretense/pretenseluagenerator.py +++ b/game/pretense/pretenseluagenerator.py @@ -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) diff --git a/game/pretense/pretensetriggergenerator.py b/game/pretense/pretensetriggergenerator.py index 43fbb1de..352654b9 100644 --- a/game/pretense/pretensetriggergenerator.py +++ b/game/pretense/pretensetriggergenerator.py @@ -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 diff --git a/resources/plugins/pretense/init_body.lua b/resources/plugins/pretense/init_body.lua index 33a7f627..429b8c01 100644 --- a/resources/plugins/pretense/init_body.lua +++ b/resources/plugins/pretense/init_body.lua @@ -1,4 +1,6 @@ +end + ZoneCommand.setNeighbours(cm) bm = BattlefieldManager:new()