Support for fixed position & heading in layouts

This commit is contained in:
Raffson 2024-10-06 22:12:31 +02:00
parent 2b780e3d69
commit 4c3b16e1da
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
4 changed files with 56 additions and 9 deletions

View File

@ -15,7 +15,12 @@ from game.dcs.helpers import static_type_from_name
from game.dcs.shipunittype import ShipUnitType from game.dcs.shipunittype import ShipUnitType
from game.dcs.unittype import UnitType from game.dcs.unittype import UnitType
from game.layout import LAYOUTS from game.layout import LAYOUTS
from game.layout.layout import TgoLayout, TgoLayoutUnitGroup from game.layout.layout import (
TgoLayout,
TgoLayoutUnitGroup,
FIXED_POS_ARG,
FIXED_HDG_ARG,
)
from game.point_with_heading import PointWithHeading from game.point_with_heading import PointWithHeading
from game.theater.theatergroundobject import ( from game.theater.theatergroundobject import (
IadsGroundObject, IadsGroundObject,
@ -249,7 +254,11 @@ class ForceGroup:
# No units to be created so dont create a theater group for them # No units to be created so dont create a theater group for them
return return
# Generate Units # Generate Units
units = unit_group.generate_units(ground_object, unit_type, unit_count) fixed_pos = FIXED_POS_ARG in unit_group.name
fixed_hdg = FIXED_HDG_ARG in unit_group.name
units = unit_group.generate_units(
ground_object, unit_type, unit_count, fixed_pos, fixed_hdg
)
# Get or create the TheaterGroup # Get or create the TheaterGroup
ground_group = ground_object.group_by_name(group_name) ground_group = ground_object.group_by_name(group_name)
if ground_group is not None: if ground_group is not None:
@ -304,7 +313,7 @@ class ForceGroup:
# Reverse the heading of the unit # Reverse the heading of the unit
unit.position.heading = unit.position.heading.opposite unit.position.heading = unit.position.heading.opposite
# Rotate unit around the center to align the orientation of the group # Rotate unit around the center to align the orientation of the group
unit.position.rotate(ground_object.position, rotation) unit.rotate_position_clockwise(ground_object.position, rotation)
@classmethod @classmethod
def _load_all(cls) -> None: def _load_all(cls) -> None:

View File

@ -33,6 +33,10 @@ if TYPE_CHECKING:
from game.theater.controlpoint import ControlPoint from game.theater.controlpoint import ControlPoint
FIXED_POS_ARG = "--fix-pos"
FIXED_HDG_ARG = "--fix-hdg"
class LayoutException(Exception): class LayoutException(Exception):
pass pass
@ -152,7 +156,12 @@ class TgoLayoutUnitGroup:
return len(self.layout_units) return len(self.layout_units)
def generate_units( def generate_units(
self, go: TheaterGroundObject, unit_type: Type[DcsUnitType], amount: int self,
go: TheaterGroundObject,
unit_type: Type[DcsUnitType],
amount: int,
fixed_pos: bool,
fixed_hdg: bool,
) -> list[TheaterUnit]: ) -> list[TheaterUnit]:
"""Generate units of the given unit type and amount for the TgoLayoutGroup""" """Generate units of the given unit type and amount for the TgoLayoutGroup"""
if amount > len(self.layout_units): if amount > len(self.layout_units):
@ -160,7 +169,14 @@ class TgoLayoutUnitGroup:
f"{self.name} has incorrect unit_count for {unit_type.id}" f"{self.name} has incorrect unit_count for {unit_type.id}"
) )
return [ return [
TheaterUnit.from_template(i, unit_type, self.layout_units[i], go) TheaterUnit.from_template(
i,
unit_type,
self.layout_units[i],
go,
fixed_pos,
fixed_hdg,
)
for i in range(amount) for i in range(amount)
] ]

View File

@ -267,8 +267,8 @@ class TheaterGroundObject(MissionTarget, SidcDescribable, ABC):
self.heading = heading self.heading = heading
# Rotate the whole TGO to match the new heading # Rotate the whole TGO to match the new heading
for unit in self.units: for unit in self.units:
unit.position.heading += rotation unit.rotate_heading_clockwise(rotation)
unit.position.rotate(self.position, rotation) unit.rotate_position_clockwise(self.position, rotation)
@property @property
def should_head_to_conflict(self) -> bool: def should_head_to_conflict(self) -> bool:

View File

@ -3,6 +3,7 @@ from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any, Optional, TYPE_CHECKING, Type from typing import Any, Optional, TYPE_CHECKING, Type
from dcs import Point
from dcs.triggers import TriggerZone from dcs.triggers import TriggerZone
from dcs.unittype import ShipType, StaticType, UnitType as DcsUnitType, VehicleType from dcs.unittype import ShipType, StaticType, UnitType as DcsUnitType, VehicleType
@ -16,7 +17,7 @@ from game.theater.iadsnetwork.iadsrole import IadsRole
from game.utils import Heading, Distance, meters from game.utils import Heading, Distance, meters
if TYPE_CHECKING: if TYPE_CHECKING:
from game.layout.layout import LayoutUnit from game.layout.layout import LayoutUnit, FIXED_POS_ARG, FIXED_HDG_ARG
from game.sim import GameUpdateEvents from game.sim import GameUpdateEvents
from game.theater.theatergroundobject import TheaterGroundObject from game.theater.theatergroundobject import TheaterGroundObject
@ -35,12 +36,21 @@ class TheaterUnit:
position: PointWithHeading position: PointWithHeading
# The parent ground object # The parent ground object
ground_object: TheaterGroundObject ground_object: TheaterGroundObject
# Should the unit's position remain fixed?
fixed_pos: bool = False
# Should the unit's heading remain fixed?
fixed_hdg: bool = False
# State of the unit, dead or alive # State of the unit, dead or alive
alive: bool = True alive: bool = True
@staticmethod @staticmethod
def from_template( def from_template(
id: int, dcs_type: Type[DcsUnitType], t: LayoutUnit, go: TheaterGroundObject id: int,
dcs_type: Type[DcsUnitType],
t: LayoutUnit,
go: TheaterGroundObject,
fixed_pos: bool,
fixed_hdg: bool,
) -> TheaterUnit: ) -> TheaterUnit:
return TheaterUnit( return TheaterUnit(
id, id,
@ -48,6 +58,8 @@ class TheaterUnit:
dcs_type, dcs_type,
PointWithHeading.from_point(t.position, Heading.from_degrees(t.heading)), PointWithHeading.from_point(t.position, Heading.from_degrees(t.heading)),
go, go,
fixed_pos or FIXED_POS_ARG in t.name,
fixed_hdg or FIXED_HDG_ARG in t.name,
) )
@property @property
@ -132,6 +144,16 @@ class TheaterUnit:
unit_range = getattr(self.type, "threat_range", None) unit_range = getattr(self.type, "threat_range", None)
return meters(unit_range if unit_range is not None and self.alive else 0) return meters(unit_range if unit_range is not None and self.alive else 0)
def rotate_heading_clockwise(self, rotation: Heading) -> None:
if self.fixed_hdg:
return
self.position.heading += rotation
def rotate_position_clockwise(self, position: Point, rotation: Heading) -> None:
if self.fixed_pos:
return
self.position.rotate(position, rotation)
class SceneryUnit(TheaterUnit): class SceneryUnit(TheaterUnit):
"""Special TheaterUnit for handling scenery ground objects""" """Special TheaterUnit for handling scenery ground objects"""