dcs-retribution/game/sim/combat/defendingsam.py
Dan Albert 895a4eb0dc Make flight death chance not impossible.
The odds of random.random() returning exactly 1.0 are basically nil, and
that was the only way a non-solo flight could lose this.
2022-03-07 19:35:19 -08:00

50 lines
1.5 KiB
Python

from __future__ import annotations
import logging
import random
from collections.abc import Iterator
from datetime import timedelta
from typing import TYPE_CHECKING
from game.ato.flightstate import InCombat
from .frozencombat import FrozenCombat
from .. import GameUpdateEvents
if TYPE_CHECKING:
from game.ato import Flight
from game.theater import TheaterGroundObject
from ..simulationresults import SimulationResults
class DefendingSam(FrozenCombat):
def __init__(
self,
freeze_duration: timedelta,
flight: Flight,
air_defenses: list[TheaterGroundObject],
) -> None:
super().__init__(freeze_duration)
self.flight = flight
self.air_defenses = air_defenses
def because(self) -> str:
sams = ", ".join(str(d) for d in self.air_defenses)
return f"{self.flight} is engaged by enemy air defenses: {sams}"
def describe(self) -> str:
return f"engaged by enemy air defenses"
def iter_flights(self) -> Iterator[Flight]:
yield self.flight
def resolve(self, results: SimulationResults, events: GameUpdateEvents) -> None:
assert isinstance(self.flight.state, InCombat)
if random.random() >= 0.5:
logging.debug(f"Air defense combat auto-resolved with {self.flight} lost")
self.flight.kill(results, events)
else:
logging.debug(
f"Air defense combat auto-resolved with {self.flight} surviving"
)
self.flight.state.exit_combat()