mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
refactor of previous commits
refactor to enum typing and many other fixes fix tests attempt to fix some typescript more typescript fixes more typescript test fixes revert all API changes update to pydcs mypy fixes Use properties to check if player is blue/red/neutral update requirements.txt black -_- bump pydcs and fix mypy add opponent property bump pydcs
This commit is contained in:
@@ -29,12 +29,16 @@ class ControlPointJs(BaseModel):
|
||||
destination = None
|
||||
if control_point.target_position is not None:
|
||||
destination = control_point.target_position.latlng()
|
||||
if control_point.captured.is_blue:
|
||||
blue = True
|
||||
else:
|
||||
blue = False
|
||||
return ControlPointJs(
|
||||
id=control_point.id,
|
||||
name=control_point.name,
|
||||
blue=control_point.captured,
|
||||
blue=blue,
|
||||
position=control_point.position.latlng(),
|
||||
mobile=control_point.moveable and control_point.captured,
|
||||
mobile=control_point.moveable and control_point.captured.is_blue,
|
||||
destination=destination,
|
||||
sidc=str(control_point.sidc()),
|
||||
)
|
||||
|
||||
@@ -6,6 +6,7 @@ from fastapi import APIRouter, Body, Depends, HTTPException, status
|
||||
from starlette.responses import Response
|
||||
|
||||
from game import Game
|
||||
from game.theater.player import Player
|
||||
from .models import ControlPointJs
|
||||
from ..dependencies import GameContext
|
||||
from ..leaflet import LeafletPoint
|
||||
@@ -75,7 +76,7 @@ def set_destination(
|
||||
)
|
||||
if not cp.moveable:
|
||||
raise HTTPException(status.HTTP_403_FORBIDDEN, detail=f"{cp} is not mobile")
|
||||
if not cp.captured:
|
||||
if not cp.captured.is_blue:
|
||||
raise HTTPException(
|
||||
status.HTTP_403_FORBIDDEN, detail=f"{cp} is not owned by the player"
|
||||
)
|
||||
@@ -120,7 +121,7 @@ def cancel_travel(cp_id: UUID, game: Game = Depends(GameContext.require)) -> Non
|
||||
)
|
||||
if not cp.moveable:
|
||||
raise HTTPException(status.HTTP_403_FORBIDDEN, detail=f"{cp} is not mobile")
|
||||
if not cp.captured:
|
||||
if not cp.captured.is_blue:
|
||||
raise HTTPException(
|
||||
status.HTTP_403_FORBIDDEN, detail=f"{cp} is not owned by the player"
|
||||
)
|
||||
|
||||
@@ -15,6 +15,7 @@ from game.server.mapzones.models import ThreatZonesJs, UnculledZoneJs
|
||||
from game.server.navmesh.models import NavMeshJs
|
||||
from game.server.supplyroutes.models import SupplyRouteJs
|
||||
from game.server.tgos.models import TgoJs
|
||||
from game.theater import Player
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from game import Game
|
||||
@@ -26,9 +27,9 @@ class GameUpdateEventsJs(BaseModel):
|
||||
new_combats: list[FrozenCombatJs]
|
||||
updated_combats: list[FrozenCombatJs]
|
||||
ended_combats: list[UUID]
|
||||
navmesh_updates: dict[bool, NavMeshJs]
|
||||
navmesh_updates: dict[Player, NavMeshJs]
|
||||
updated_unculled_zones: list[UnculledZoneJs]
|
||||
threat_zones_updated: dict[bool, ThreatZonesJs]
|
||||
threat_zones_updated: dict[Player, ThreatZonesJs]
|
||||
new_flights: list[FlightJs]
|
||||
updated_flights: list[FlightJs]
|
||||
deleted_flights: set[UUID]
|
||||
|
||||
@@ -41,9 +41,13 @@ class FlightJs(BaseModel):
|
||||
waypoints = None
|
||||
if with_waypoints:
|
||||
waypoints = waypoints_for_flight(flight)
|
||||
if flight.blue.is_blue:
|
||||
blue = True
|
||||
else:
|
||||
blue = False
|
||||
return FlightJs(
|
||||
id=flight.id,
|
||||
blue=flight.blue,
|
||||
blue=blue,
|
||||
position=position,
|
||||
sidc=str(flight.sidc()),
|
||||
waypoints=waypoints,
|
||||
|
||||
@@ -5,6 +5,7 @@ from uuid import UUID
|
||||
from pydantic import BaseModel
|
||||
|
||||
from game.server.leaflet import LeafletPoint
|
||||
from game.theater.player import Player
|
||||
from game.theater.iadsnetwork.iadsnetwork import IadsNetworkNode, IadsNetwork
|
||||
|
||||
|
||||
@@ -34,8 +35,16 @@ class IadsConnectionJs(BaseModel):
|
||||
iads_connections = []
|
||||
tgo = network_node.group.ground_object
|
||||
for id, connection in network_node.connections.items():
|
||||
if connection.ground_object.is_friendly(True) != tgo.is_friendly(True):
|
||||
if connection.ground_object.is_friendly(Player.BLUE) != tgo.is_friendly(
|
||||
Player.BLUE
|
||||
):
|
||||
continue # Skip connections which are not from same coalition
|
||||
if tgo.is_friendly(Player.BLUE):
|
||||
blue = True
|
||||
elif tgo.is_friendly(Player.RED):
|
||||
blue = False
|
||||
else:
|
||||
continue # Skip neutral
|
||||
iads_connections.append(
|
||||
IadsConnectionJs(
|
||||
id=id,
|
||||
@@ -49,7 +58,7 @@ class IadsConnectionJs(BaseModel):
|
||||
network_node.group.alive_units > 0
|
||||
and connection.alive_units > 0
|
||||
),
|
||||
blue=tgo.is_friendly(True),
|
||||
blue=blue,
|
||||
is_power="power"
|
||||
in [tgo.category, connection.ground_object.category],
|
||||
)
|
||||
|
||||
@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING
|
||||
from pydantic import BaseModel
|
||||
|
||||
from game.server.leaflet import LeafletPoint, LeafletPoly, ShapelyUtil
|
||||
from game.theater import ConflictTheater
|
||||
from game.theater import ConflictTheater, Player
|
||||
from game.threatzones import ThreatZones
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@@ -85,9 +85,9 @@ class ThreatZoneContainerJs(BaseModel):
|
||||
def for_game(game: Game) -> ThreatZoneContainerJs:
|
||||
return ThreatZoneContainerJs(
|
||||
blue=ThreatZonesJs.from_zones(
|
||||
game.threat_zone_for(player=True), game.theater
|
||||
game.threat_zone_for(player=Player.BLUE), game.theater
|
||||
),
|
||||
red=ThreatZonesJs.from_zones(
|
||||
game.threat_zone_for(player=False), game.theater
|
||||
game.threat_zone_for(player=Player.RED), game.theater
|
||||
),
|
||||
)
|
||||
|
||||
@@ -2,12 +2,13 @@ from fastapi import APIRouter, Depends
|
||||
|
||||
from game import Game
|
||||
from game.server import GameContext
|
||||
from game.theater.player import Player
|
||||
from .models import NavMeshJs
|
||||
|
||||
router: APIRouter = APIRouter(prefix="/navmesh")
|
||||
|
||||
|
||||
@router.get("/", operation_id="get_navmesh", response_model=NavMeshJs)
|
||||
def get(for_player: bool, game: Game = Depends(GameContext.require)) -> NavMeshJs:
|
||||
def get(for_player: Player, game: Game = Depends(GameContext.require)) -> NavMeshJs:
|
||||
mesh = game.coalition_for(for_player).nav_mesh
|
||||
return NavMeshJs.from_navmesh(mesh, game)
|
||||
|
||||
@@ -76,6 +76,10 @@ class SupplyRouteJs(BaseModel):
|
||||
def for_link(
|
||||
game: Game, a: ControlPoint, b: ControlPoint, points: list[Point], sea: bool
|
||||
) -> SupplyRouteJs:
|
||||
if a.captured.is_blue:
|
||||
blue = True
|
||||
else:
|
||||
blue = False
|
||||
return SupplyRouteJs(
|
||||
# Although these are not persistent objects in the backend, the frontend
|
||||
# needs unique IDs for anything that it will use in a list. That means that
|
||||
@@ -93,7 +97,7 @@ class SupplyRouteJs(BaseModel):
|
||||
points=[p.latlng() for p in points],
|
||||
front_active=not sea and a.front_is_active(b),
|
||||
is_sea=sea,
|
||||
blue=a.captured,
|
||||
blue=blue,
|
||||
active_transports=TransportFinder(game, a, b).describe_active_transports(
|
||||
sea
|
||||
),
|
||||
|
||||
@@ -34,12 +34,16 @@ class TgoJs(BaseModel):
|
||||
def for_tgo(tgo: TheaterGroundObject) -> TgoJs:
|
||||
threat_ranges = [group.max_threat_range().meters for group in tgo.groups]
|
||||
detection_ranges = [group.max_detection_range().meters for group in tgo.groups]
|
||||
if tgo.control_point.captured.is_blue:
|
||||
blue = True
|
||||
else:
|
||||
blue = False
|
||||
return TgoJs(
|
||||
id=tgo.id,
|
||||
name=tgo.name,
|
||||
control_point_name=tgo.control_point.name,
|
||||
category=tgo.category,
|
||||
blue=tgo.control_point.captured,
|
||||
blue=blue,
|
||||
position=tgo.position.latlng(),
|
||||
units=[unit.display_name for unit in tgo.units],
|
||||
threat_ranges=threat_ranges,
|
||||
|
||||
Reference in New Issue
Block a user