diff --git a/theater/conflicttheater.py b/theater/conflicttheater.py index 03d50e05..9d7a634a 100644 --- a/theater/conflicttheater.py +++ b/theater/conflicttheater.py @@ -70,14 +70,18 @@ class ConflictTheater: if not self.landmap: return False - return poly_contains(point.x, point.y, self.landmap[0][0]) + for inclusion_zone in self.landmap[0]: + if poly_contains(point.x, point.y, inclusion_zone): + return False + + return True def is_on_land(self, point: Point) -> bool: if not self.landmap: return True is_point_included = False - for i, inclusion_zone in enumerate(self.landmap[0]): + for inclusion_zone in self.landmap[0]: if poly_contains(point.x, point.y, inclusion_zone): is_point_included = True diff --git a/theater/controlpoint.py b/theater/controlpoint.py index e748aba1..b418285a 100644 --- a/theater/controlpoint.py +++ b/theater/controlpoint.py @@ -23,7 +23,7 @@ class ControlPoint: has_frontline = True frontline_offset = 0.0 - def __init__(self, id: int, name: str, position: Point, at, radials: typing.Collection[int], size: int, importance: int, has_frontline=True): + def __init__(self, id: int, name: str, position: Point, at, radials: typing.Collection[int], size: int, importance: float, has_frontline=True): import theater.base self.id = id @@ -42,7 +42,7 @@ class ControlPoint: self.base = theater.base.Base() @classmethod - def from_airport(cls, airport: Airport, radials: typing.Collection[int], size: int, importance: int, has_frontline=True): + def from_airport(cls, airport: Airport, radials: typing.Collection[int], size: int, importance: float, has_frontline=True): assert airport return cls(airport.id, airport.name, airport.position, airport, radials, size, importance, has_frontline) diff --git a/theater/persiangulf.py b/theater/persiangulf.py index 6de1fdba..e9a1caeb 100644 --- a/theater/persiangulf.py +++ b/theater/persiangulf.py @@ -19,31 +19,32 @@ class PersianGulfTheater(ConflictTheater): "night": (0, 5), } - al_dhafra = ControlPoint.from_airport(persiangulf.Al_Dhafra_AB, LAND, SIZE_BIG, IMPORTANCE_HIGH) - al_maktoum = ControlPoint.from_airport(persiangulf.Al_Maktoum_Intl, LAND, SIZE_BIG, IMPORTANCE_HIGH) - al_minhad = ControlPoint.from_airport(persiangulf.Al_Minhad_AB, LAND, SIZE_REGULAR, IMPORTANCE_HIGH) - sir_abu_nuayr = ControlPoint.from_airport(persiangulf.Sir_Abu_Nuayr, [0, 330], SIZE_SMALL, 1.3, has_frontline=False) + al_dhafra = ControlPoint.from_airport(persiangulf.Al_Dhafra_AB, LAND, SIZE_BIG, IMPORTANCE_LOW) + al_maktoum = ControlPoint.from_airport(persiangulf.Al_Maktoum_Intl, LAND, SIZE_BIG, IMPORTANCE_LOW) + al_minhad = ControlPoint.from_airport(persiangulf.Al_Minhad_AB, LAND, SIZE_REGULAR, 1.1) + sir_abu_nuayr = ControlPoint.from_airport(persiangulf.Sir_Abu_Nuayr, [0, 330], SIZE_SMALL, 1.1, has_frontline=False) - dubai = ControlPoint.from_airport(persiangulf.Dubai_Intl, COAST_DL_E, SIZE_LARGE, IMPORTANCE_HIGH) - sharjah = ControlPoint.from_airport(persiangulf.Sharjah_Intl, LAND, SIZE_BIG, 1.3) - fujairah = ControlPoint.from_airport(persiangulf.Fujairah_Intl, COAST_V_W, SIZE_REGULAR, IMPORTANCE_HIGH) - khasab = ControlPoint.from_airport(persiangulf.Khasab, LAND, SIZE_SMALL, IMPORTANCE_HIGH) + dubai = ControlPoint.from_airport(persiangulf.Dubai_Intl, COAST_DL_E, SIZE_LARGE, IMPORTANCE_MEDIUM) + sharjah = ControlPoint.from_airport(persiangulf.Sharjah_Intl, LAND, SIZE_BIG, 1.0) + fujairah = ControlPoint.from_airport(persiangulf.Fujairah_Intl, COAST_V_W, SIZE_REGULAR, 1.0) + khasab = ControlPoint.from_airport(persiangulf.Khasab, LAND, SIZE_SMALL, IMPORTANCE_MEDIUM) sirri = ControlPoint.from_airport(persiangulf.Sirri_Island, COAST_DL_W, SIZE_REGULAR, IMPORTANCE_LOW, has_frontline=False) abu_musa = ControlPoint.from_airport(persiangulf.Abu_Musa_Island_Airport, LAND, SIZE_SMALL, IMPORTANCE_MEDIUM, has_frontline=False) - tunb_island = ControlPoint.from_airport(persiangulf.Tunb_Island_AFB, [0, 270, 330], IMPORTANCE_LOW, 1.1, has_frontline=False) - tunb_kochak = ControlPoint.from_airport(persiangulf.Tunb_Kochak, [135, 180], SIZE_SMALL, 1.2, has_frontline=False) + tunb_island = ControlPoint.from_airport(persiangulf.Tunb_Island_AFB, [0, 270, 330], SIZE_SMALL, IMPORTANCE_MEDIUM, has_frontline=False) + tunb_kochak = ControlPoint.from_airport(persiangulf.Tunb_Kochak, [135, 180], SIZE_SMALL, 1.1, has_frontline=False) - bandar_lengeh = ControlPoint.from_airport(persiangulf.Bandar_Lengeh, [270, 315, 0, 45], SIZE_SMALL, 1.1) - qeshm = ControlPoint.from_airport(persiangulf.Qeshm_Island, [270, 315, 0, 45, 90, 135, 180], SIZE_SMALL, 1.2, has_frontline=False) + bandar_lengeh = ControlPoint.from_airport(persiangulf.Bandar_Lengeh, [270, 315, 0, 45], SIZE_SMALL, IMPORTANCE_HIGH) + qeshm = ControlPoint.from_airport(persiangulf.Qeshm_Island, [270, 315, 0, 45, 90, 135, 180], SIZE_SMALL, 1.1, has_frontline=False) - havadarya = ControlPoint.from_airport(persiangulf.Havadarya, COAST_DL_W, SIZE_REGULAR, 1.1) - bandar_abbas = ControlPoint.from_airport(persiangulf.Bandar_Abbas_Intl, LAND, SIZE_BIG, 1.2) - lar = ControlPoint.from_airport(persiangulf.Lar_Airbase, LAND, SIZE_REGULAR, IMPORTANCE_LOW) - shiraz = ControlPoint.from_airport(persiangulf.Shiraz_International_Airport, LAND, SIZE_BIG, IMPORTANCE_LOW) - kerman = ControlPoint.from_airport(persiangulf.Kerman_Airport, LAND, SIZE_BIG, IMPORTANCE_LOW) + havadarya = ControlPoint.from_airport(persiangulf.Havadarya, COAST_DL_W, SIZE_REGULAR, IMPORTANCE_HIGH) + bandar_abbas = ControlPoint.from_airport(persiangulf.Bandar_Abbas_Intl, LAND, SIZE_BIG, IMPORTANCE_HIGH) + lar = ControlPoint.from_airport(persiangulf.Lar_Airbase, LAND, SIZE_REGULAR, IMPORTANCE_HIGH) + shiraz = ControlPoint.from_airport(persiangulf.Shiraz_International_Airport, LAND, SIZE_BIG, IMPORTANCE_HIGH) + kerman = ControlPoint.from_airport(persiangulf.Kerman_Airport, LAND, SIZE_BIG, IMPORTANCE_HIGH) - west_carrier = ControlPoint.carrier("East carrier", Point(-100531.972946, 60939.275818)) + west_carrier = ControlPoint.carrier("West carrier", Point(-69043.813952358, -159916.65947136)) + east_carrier = ControlPoint.carrier("East carrier", Point(59514.324335475, 28165.517980635)) def __init__(self): super(PersianGulfTheater, self).__init__() @@ -71,7 +72,9 @@ class PersianGulfTheater(ConflictTheater): self.add_controlpoint(self.havadarya, connected_to=[self.lar, self.qeshm, self.bandar_abbas]) self.add_controlpoint(self.bandar_abbas, connected_to=[self.havadarya]) + self.add_controlpoint(self.east_carrier) self.add_controlpoint(self.west_carrier) self.west_carrier.captured = True - self.kerman.captured = True + self.east_carrier.captured = True + self.al_dhafra.captured = True diff --git a/theater/start_generator.py b/theater/start_generator.py index e89a69b8..e3e70b2f 100644 --- a/theater/start_generator.py +++ b/theater/start_generator.py @@ -46,10 +46,12 @@ def generate_groundobjects(theater: ConflictTheater): with open("resources/groundobject_templates.p", "rb") as f: tpls = pickle.load(f) - def find_ground_location(near, theater, max, min) -> typing.Optional[Point]: + def find_location(on_ground, near, theater, min, max) -> typing.Optional[Point]: for _ in range(500): p = near.random_point_within(max, min) - if theater.is_on_land(p): + if on_ground and theater.is_on_land(p): + return p + elif not on_ground and theater.is_in_sea(p): return p return None @@ -57,7 +59,13 @@ def generate_groundobjects(theater: ConflictTheater): group_id = 0 for cp in theater.enemy_points(): for _ in range(0, random.randrange(3, 6)): - point = find_ground_location(cp.position, theater, 120000, 5000) + available_categories = list(tpls) + tpl_category = random.choice(available_categories) + + tpl = random.choice(list(tpls[tpl_category].values())) + + point = find_location(tpl_category != "oil", cp.position, theater, 15000, 80000) + if point is None: print("Couldn't find point for {}".format(cp)) continue @@ -67,9 +75,6 @@ def generate_groundobjects(theater: ConflictTheater): if another_cp.position.distance_to_point(point) < dist: cp = another_cp - tpl = random.choice(list(random.choice(list(tpls.values())).values())) - random_heading = random.randrange(0, 360) - group_id += 1 object_id = 0 @@ -82,7 +87,7 @@ def generate_groundobjects(theater: ConflictTheater): g.cp_id = cp.id g.dcs_identifier = object["type"] - g.heading = object["heading"] + random_heading + g.heading = object["heading"], g.position = Point(point.x + object["offset"].x, point.y + object["offset"].y) cp.ground_objects.append(g) diff --git a/theater/theatergroundobject.py b/theater/theatergroundobject.py index 28c976fc..60a18676 100644 --- a/theater/theatergroundobject.py +++ b/theater/theatergroundobject.py @@ -32,7 +32,7 @@ ABBREV_NAME = { CATEGORY_MAP = { "aa": ["AA"], - "power": ["Workshop A", "Electric power box", "Garage A"], + "power": ["Workshop A", "Electric power box", "Garage small A"], "warehouse": ["Warehouse", "Hangar A"], "fuel": ["Tank", "Tank 2", "Tank 3", "Fuel tank"], "ammo": [".Ammunition depot", "Hangar B"],