from __future__ import annotations from datetime import datetime, timedelta from typing import TYPE_CHECKING from game.ato.starttype import StartType from .flightstate import FlightState from .navigating import Navigating from .startup import StartUp from .takeoff import Takeoff from .taxi import Taxi if TYPE_CHECKING: from game.ato.flight import Flight from game.settings import Settings from game.sim.gameupdateevents import GameUpdateEvents class WaitingForStart(FlightState): def __init__( self, flight: Flight, settings: Settings, start_time: datetime, ) -> None: super().__init__(flight, settings) self.start_time = start_time @property def start_type(self) -> StartType: return self.flight.start_type def on_game_tick( self, events: GameUpdateEvents, time: datetime, duration: timedelta ) -> None: if time < self.start_time: return new_state: FlightState if self.start_type is StartType.COLD: new_state = StartUp(self.flight, self.settings, time) elif self.start_type is StartType.WARM: new_state = Taxi(self.flight, self.settings, time) elif self.start_type is StartType.RUNWAY: new_state = Takeoff(self.flight, self.settings, time) else: new_state = Navigating(self.flight, self.settings, waypoint_index=0) self.flight.set_state(new_state) @property def is_waiting_for_start(self) -> bool: return True def time_remaining(self, time: datetime) -> timedelta: return self.start_time - time @property def spawn_type(self) -> StartType: return self.flight.start_type @property def description(self) -> str: if self.start_type is StartType.COLD: start_type = "startup" elif self.start_type is StartType.WARM: start_type = "taxi" elif self.start_type is StartType.RUNWAY: start_type = "takeoff" elif self.start_type is StartType.IN_FLIGHT: start_type = "air start" else: raise ValueError(f"Unhandled StartType: {self.start_type}") return f"Waiting for {start_type} at {self.start_time:%H:%M:%S}"