From adad88681eb5161dba5edd75e64860f740ddd8b4 Mon Sep 17 00:00:00 2001 From: Khopa Date: Thu, 10 Jun 2021 23:18:41 +0200 Subject: [PATCH] Generate helipads as neutral objects, so they do not interfer with base capture trigger --- game/game.py | 17 ++++++++++++++--- game/operation/operation.py | 16 +++++++++++++++- gen/groundobjectsgen.py | 9 ++++++--- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/game/game.py b/game/game.py index a6d3c97b..266fd073 100644 --- a/game/game.py +++ b/game/game.py @@ -4,9 +4,10 @@ import random import sys from datetime import date, datetime, timedelta from enum import Enum -from typing import Any, Dict, List, Iterator +from typing import Any, Dict, List from dcs.action import Coalition +from dcs.countries import Switzerland, UnitedNationsPeacekeepers, USAFAggressors from dcs.mapping import Point from dcs.task import CAP, CAS, PinpointStrike from dcs.vehicles import AirDefence @@ -16,7 +17,6 @@ from game import db from game.inventory import GlobalAircraftInventory from game.models.game_stats import GameStats from game.plugins import LuaPluginManager -from game.theater.theatergroundobject import MissileSiteGroundObject from gen.ato import AirTaskingOrder from gen.conflictgen import Conflict from gen.flights.ai_flight_planner import CoalitionMissionPlanner @@ -34,7 +34,7 @@ from .navmesh import NavMesh from .procurement import AircraftProcurementRequest, ProcurementAi from .profiling import logged_duration from .settings import Settings, AutoAtoBehavior -from .squadrons import Pilot, AirWing +from .squadrons import AirWing from .theater import ConflictTheater from .theater.bullseye import Bullseye from .theater.transitnetwork import TransitNetwork, TransitNetworkBuilder @@ -208,6 +208,17 @@ class Game: def enemy_faction(self) -> Faction: return db.FACTIONS[self.enemy_name] + @property + def neutral_country(self): + """Return the best fitting country that can be used as neutral faction in the generated mission""" + countries_in_use = [self.player_country, self.enemy_country] + if UnitedNationsPeacekeepers not in countries_in_use: + return UnitedNationsPeacekeepers + elif Switzerland.name not in countries_in_use: + return Switzerland + else: + return USAFAggressors + def faction_for(self, player: bool) -> Faction: if player: return self.player_faction diff --git a/game/operation/operation.py b/game/operation/operation.py index 2f683f78..20d54c3e 100644 --- a/game/operation/operation.py +++ b/game/operation/operation.py @@ -16,7 +16,7 @@ from dcs.triggers import TriggerStart from game.plugins import LuaPluginManager from game.theater.theatergroundobject import TheaterGroundObject -from gen import Conflict, FlightType, VisualGenerator +from gen import Conflict, FlightType, VisualGenerator, Bullseye from gen.aircraft import AIRCRAFT_DATA, AircraftConflictGenerator, FlightData from gen.airfields import AIRFIELD_DATA from gen.airsupportgen import AirSupport, AirSupportConflictGenerator @@ -114,9 +114,13 @@ class Operation: cls.current_mission.coalition["red"] = Coalition( "red", bullseye=cls.game.red_bullseye.to_pydcs() ) + cls.current_mission.coalition["neutrals"] = Coalition( + "neutrals", bullseye=Bullseye(Point(0, 0)).to_pydcs() + ) p_country = cls.game.player_country e_country = cls.game.enemy_country + cls.current_mission.coalition["blue"].add_country( country_dict[db.country_id_from_name(p_country)]() ) @@ -124,6 +128,16 @@ class Operation: country_dict[db.country_id_from_name(e_country)]() ) + belligerents = [ + db.country_id_from_name(p_country), + db.country_id_from_name(e_country), + ] + for country in country_dict.keys(): + if country not in belligerents: + cls.current_mission.coalition["neutrals"].add_country( + country_dict[country]() + ) + @classmethod def inject_lua_trigger(cls, contents: str, comment: str) -> None: trigger = TriggerStart(comment=comment) diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index f0407c02..319a368a 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -584,19 +584,22 @@ class HelipadGenerator: country_name = self.game.enemy_country country = self.m.country(country_name) + # Note : Helipad are generated as neutral object in order not to interfer with capture triggers + neutral_country = self.m.country(self.game.neutral_country.name) + for i, helipad in enumerate(self.cp.helipads): name = self.cp.name + "_helipad_" + str(i) logging.info("Generating helipad : " + name) - pad = SingleHeliPad(name=(name + "_unit")) + pad = SingleHeliPad(name=name) pad.position = Point(helipad.x, helipad.y) pad.heading = helipad.heading - # pad.heliport_frequency = self.radio_registry.alloc_uhf() TODO : alloc radio & callsign sg = unitgroup.StaticGroup(self.m.next_group_id(), name) sg.add_unit(pad) sp = StaticPoint() sp.position = pad.position sg.add_point(sp) - country.add_static_group(sg) + neutral_country.add_static_group(sg) + helipad.static_unit = sg helipad.occupied = False