37 lines
880 B
Python
37 lines
880 B
Python
from dataclasses import dataclass
|
|
from typing import List
|
|
|
|
from .position import Point2
|
|
|
|
|
|
@dataclass
|
|
class PowerSource:
|
|
position: Point2
|
|
radius: float
|
|
unit_tag: int
|
|
|
|
def __post_init__(self):
|
|
assert self.radius > 0
|
|
|
|
@classmethod
|
|
def from_proto(cls, proto):
|
|
return PowerSource(Point2.from_proto(proto.pos), proto.radius, proto.tag)
|
|
|
|
def covers(self, position: Point2) -> bool:
|
|
return self.position.distance_to(position) <= self.radius
|
|
|
|
def __repr__(self):
|
|
return f"PowerSource({self.position}, {self.radius})"
|
|
|
|
|
|
@dataclass
|
|
class PsionicMatrix:
|
|
sources: List[PowerSource]
|
|
|
|
@classmethod
|
|
def from_proto(cls, proto):
|
|
return PsionicMatrix([PowerSource.from_proto(p) for p in proto])
|
|
|
|
def covers(self, position: Point2) -> bool:
|
|
return any(source.covers(position) for source in self.sources)
|