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)
 |