RndName 5cdfe62e2d Implement advanced skynet functions
- factor out own class for the iadsnetwork within the conflicttheater
- This class will handle all Skynet related things - no specific group_name handling necessary in future
- make iadsbuilding own TGO class because SAM & EWRs are Vehicle Groups. IADS Elements dont have any groups attached.
- added command center, connection node and power source as Ground objects which can be added by the campaign designer
- adjust lua generator to support new iads units
- parse the campaign yaml to get the iads network information
- use the range as fallback if no yaml information was found
- complete rewrite of the skynet lua script
- allow destruction of iads network to be persistent over all rounds
- modified the presetlocation handling: the wrapper PresetLocation for PointWithHeading now stores the original name from the campaign miz to have the ability to process campaign yaml configurations based on the ground unit
- Implementation of the UI representation for the IADS Network
- Give user the option to enable or disable advanced iads
- Extended the layout system: Implement Sub task handling to support PD
2022-04-19 10:41:16 +02:00

77 lines
2.5 KiB
Python

from __future__ import annotations
from uuid import UUID
from pydantic import BaseModel
from game.server.leaflet import LeafletPoint
from game.theater.iadsnetwork.iadsnetwork import IadsNetworkNode, IadsNetwork
from game.theater.theatergroundobject import TheaterGroundObject
class IadsConnectionJs(BaseModel):
id: UUID
points: list[LeafletPoint]
node: UUID
connected: UUID
active: bool
blue: bool
is_power: bool
class Config:
title = "IadsConnection"
@staticmethod
def connections_for_tgo(
tgo_id: UUID, network: IadsNetwork
) -> list[IadsConnectionJs]:
for node in network.nodes:
if node.group.ground_object.id == tgo_id:
return IadsConnectionJs.connections_for_node(node)
return []
@staticmethod
def connections_for_node(network_node: IadsNetworkNode) -> list[IadsConnectionJs]:
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):
continue # Skip connections which are not from same coalition
iads_connections.append(
IadsConnectionJs(
id=id,
points=[
tgo.position.latlng(),
connection.ground_object.position.latlng(),
],
node=tgo.id,
connected=connection.ground_object.id,
active=(
tgo.alive_unit_count > 0
and connection.ground_object.alive_unit_count > 0
),
blue=tgo.is_friendly(True),
is_power="power"
in [tgo.category, connection.ground_object.category],
)
)
return iads_connections
class IadsNetworkJs(BaseModel):
advanced: bool
connections: list[IadsConnectionJs]
class Config:
title = "IadsNetwork"
@staticmethod
def from_network(network: IadsNetwork) -> IadsNetworkJs:
iads_connections = []
for connection in network.nodes:
if not connection.group.iads_role.participate:
continue # Skip
iads_connections.extend(IadsConnectionJs.connections_for_node(connection))
return IadsNetworkJs(
advanced=network.advanced_iads, connections=iads_connections
)