mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Support for fixed position & heading in layouts
This commit is contained in:
parent
2b780e3d69
commit
4c3b16e1da
@ -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:
|
||||||
|
|||||||
@ -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)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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"""
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user