dcs-retribution/game/sim/gameupdateevents.py
Dan Albert 2585dcc130 Add (very!) rough simulation of frozen combat.
There are some TODOs here but th behavior is flagged off by default. The
biggest TODO here is that the time spent frozen is not simulated, so
flights that are engaged by SAMs will unfreeze, move slightly, then re-
freeze.

https://github.com/dcs-liberation/dcs_liberation/issues/1680
2022-02-26 13:01:46 -08:00

101 lines
3.2 KiB
Python

from __future__ import annotations
from dataclasses import dataclass, field
from typing import TYPE_CHECKING
from uuid import UUID
from dcs import Point
if TYPE_CHECKING:
from game.ato import Flight, Package
from game.sim.combat import FrozenCombat
@dataclass
class GameUpdateEvents:
simulation_complete = False
new_combats: list[FrozenCombat] = field(default_factory=list)
updated_combats: list[FrozenCombat] = field(default_factory=list)
ended_combats: list[FrozenCombat] = field(default_factory=list)
updated_flight_positions: list[tuple[Flight, Point]] = field(default_factory=list)
navmesh_updates: set[bool] = field(default_factory=set)
unculled_zones_updated: bool = False
threat_zones_updated: bool = False
new_flights: set[Flight] = field(default_factory=set)
updated_flights: set[UUID] = field(default_factory=set)
deleted_flights: set[UUID] = field(default_factory=set)
selected_flight: UUID | None = None
deselected_flight: bool = False
shutting_down: bool = False
@property
def empty(self) -> bool:
return self == GameUpdateEvents()
def complete_simulation(self) -> GameUpdateEvents:
self.simulation_complete = True
return self
def new_combat(self, combat: FrozenCombat) -> GameUpdateEvents:
self.new_combats.append(combat)
return self
def update_combat(self, combat: FrozenCombat) -> GameUpdateEvents:
self.updated_combats.append(combat)
return self
def end_combat(self, combat: FrozenCombat) -> None:
self.ended_combats.append(combat)
def update_flight_position(
self, flight: Flight, new_position: Point
) -> GameUpdateEvents:
self.updated_flight_positions.append((flight, new_position))
return self
def update_navmesh(self, player: bool) -> GameUpdateEvents:
self.navmesh_updates.add(player)
return self
def update_unculled_zones(self) -> GameUpdateEvents:
self.unculled_zones_updated = True
return self
def update_threat_zones(self) -> GameUpdateEvents:
self.threat_zones_updated = True
return self
def new_flight(self, flight: Flight) -> GameUpdateEvents:
self.new_flights.add(flight)
return self
def update_flight(self, flight: Flight) -> GameUpdateEvents:
self.updated_flights.add(flight.id)
return self
def update_flights_in_package(self, package: Package) -> GameUpdateEvents:
self.updated_flights.update({f.id for f in package.flights})
return self
def delete_flight(self, flight: Flight) -> GameUpdateEvents:
self.deleted_flights.add(flight.id)
return self
def delete_flights_in_package(self, package: Package) -> GameUpdateEvents:
self.deleted_flights.update({f.id for f in package.flights})
return self
def select_flight(self, flight: Flight) -> GameUpdateEvents:
self.selected_flight = flight.id
self.deselected_flight = False
return self
def deselect_flight(self) -> GameUpdateEvents:
self.deselected_flight = True
self.selected_flight = None
return self
def shut_down(self) -> GameUpdateEvents:
self.shutting_down = True
return self