From 3966e03ea5002be1a93046eec1829b92d7a04e9a Mon Sep 17 00:00:00 2001 From: Raffson Date: Sun, 14 Aug 2022 19:17:30 +0200 Subject: [PATCH] Don't skip QuadPoint trigger zones Added code to deduce a radius given a QuadPoint trigger zone --- game/campaignloader/mizcampaignloader.py | 7 +---- game/scenery_group.py | 39 +++++++++++++++++------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/game/campaignloader/mizcampaignloader.py b/game/campaignloader/mizcampaignloader.py index b0139058..25364916 100644 --- a/game/campaignloader/mizcampaignloader.py +++ b/game/campaignloader/mizcampaignloader.py @@ -13,7 +13,6 @@ from dcs.planes import F_15C from dcs.ships import HandyWind, LHA_Tarawa, Stennis, USS_Arleigh_Burke_IIa from dcs.statics import Fortification, Warehouse from dcs.terrain import Airport -from dcs.triggers import TriggerZoneCircular from dcs.unitgroup import PlaneGroup, ShipGroup, StaticGroup, VehicleGroup from dcs.vehicles import AirDefence, Armor, MissilesSS, Unarmed @@ -240,11 +239,7 @@ class MizCampaignLoader: @property def scenery(self) -> List[SceneryGroup]: - return SceneryGroup.from_trigger_zones( - z - for z in self.mission.triggers._zones - if isinstance(z, TriggerZoneCircular) - ) + return SceneryGroup.from_trigger_zones(self.mission.triggers._zones) @cached_property def control_points(self) -> dict[UUID, ControlPoint]: diff --git a/game/scenery_group.py b/game/scenery_group.py index df6294e2..f3427a70 100644 --- a/game/scenery_group.py +++ b/game/scenery_group.py @@ -1,11 +1,27 @@ from __future__ import annotations from typing import Iterable, List -from dcs.triggers import TriggerZoneCircular +from dcs.triggers import TriggerZone, TriggerZoneCircular, TriggerZoneQuadPoint from game.theater.theatergroundobject import NAME_BY_CATEGORY +def _deduce_radius_from_quad(tz: TriggerZoneQuadPoint) -> float: + pos = tz.position + radius = 0.0 + mids = [] + for i in range(len(tz.verticies)): + for j in range(i, len(tz.verticies)): + if i is j: + continue + mids.append(tz.verticies[i].midpoint(tz.verticies[j])) + for point in mids: + dist = pos.distance_to_point(point) + if dist > radius: + radius = dist + return radius + + class SceneryGroupError(RuntimeError): """Error for when there are insufficient conditions to create a SceneryGroup.""" @@ -16,10 +32,7 @@ class SceneryGroup: """Store information about a scenery objective.""" def __init__( - self, - zone_def: TriggerZoneCircular, - zones: Iterable[TriggerZoneCircular], - category: str, + self, zone_def: TriggerZone, zones: Iterable[TriggerZone], category: str ) -> None: self.zone_def = zone_def @@ -28,9 +41,7 @@ class SceneryGroup: self.category = category @staticmethod - def from_trigger_zones( - trigger_zones: Iterable[TriggerZoneCircular], - ) -> List[SceneryGroup]: + def from_trigger_zones(trigger_zones: Iterable[TriggerZone]) -> List[SceneryGroup]: """Define scenery objectives based on their encompassing blue/red circle.""" zone_definitions = [] white_zones = [] @@ -46,7 +57,13 @@ class SceneryGroup: # For each objective definition. for zone_def in zone_definitions: - zone_def_radius = zone_def.radius + if isinstance(zone_def, TriggerZoneCircular): + zone_def_radius = zone_def.radius + elif isinstance(zone_def, TriggerZoneQuadPoint): + zone_def_radius = _deduce_radius_from_quad(zone_def) + else: + raise RuntimeError(f"Invalid trigger-zone: {zone_def}") + print(zone_def_radius, zone_def.__dict__) zone_def_position = zone_def.position zone_def_name = zone_def.name @@ -84,11 +101,11 @@ class SceneryGroup: return scenery_groups @staticmethod - def is_blue(zone: TriggerZoneCircular) -> bool: + def is_blue(zone: TriggerZone) -> bool: # Blue in RGB is [0 Red], [0 Green], [1 Blue]. Ignore the fourth position: Transparency. return zone.color[1] == 0 and zone.color[2] == 0 and zone.color[3] == 1 @staticmethod - def is_white(zone: TriggerZoneCircular) -> bool: + def is_white(zone: TriggerZone) -> bool: # White in RGB is [1 Red], [1 Green], [1 Blue]. Ignore the fourth position: Transparency. return zone.color[1] == 1 and zone.color[2] == 1 and zone.color[3] == 1