Module botroyale.logic.plate
Home of Plate
.
Expand source code Browse git
"""Home of `Plate`."""
from typing import Any, Optional
import copy
from botroyale.util.hexagon import Hexagon, Hex
from botroyale.logic import PlateType
class Plate(Hexagon):
"""Pressure Plate.
Plates will be equal to and hash like all other instances of
`botroyale.util.hexagon.Hexagon` subclasses if their cube is equal.
"""
def __init__(
self,
cube: tuple[int, int, int],
plate_type: PlateType,
pressure: int,
min_pressure: Optional[int] = None,
pressure_reset: bool = False,
targets: Optional[set[Hexagon]] = None,
):
"""Initialize the class.
Args:
cube: The cube of the `botroyale.util.hexagon.Hexagon`
plate_type: One of `botroyale.logic.PlateType`
pressure: Negative integer
min_pressure: Negative integer
pressure_reset: If the pressure resets after popping
targets: A set of `botroyale.util.hexagon.Hexagon` that the plate targets
"""
super().__init__(*cube)
self.plate_type: PlateType = plate_type
assert pressure < 0
self.pressure: int = pressure
if min_pressure is None:
min_pressure = pressure
assert min_pressure < 0
self.min_pressure: int = min_pressure
self.pressure_reset: bool = pressure_reset
if targets is None:
targets = set()
self.targets: set[Hexagon] = targets
def with_new_hex(self, hex: Hexagon) -> "Plate":
"""Create an identical `Plate` but with a different *hex*."""
return self._with_new_hex(hex, self)
@classmethod
def _with_new_hex(cls, hex: Hexagon, plate: "Plate") -> "Plate":
"""Create an identical `Plate` to *plate* but with a different *hex*."""
return cls(
hex.cube,
plate_type=plate.plate_type,
pressure=plate.pressure,
min_pressure=plate.min_pressure,
pressure_reset=plate.pressure_reset,
targets=copy.copy(plate.targets),
)
def export(self) -> dict:
"""Export plate data to serializable dictionary."""
return {
"xy": self.xy,
"plate_type": self.plate_type.name,
"min_pressure": self.min_pressure,
"pressure": self.pressure,
"pressure_reset": self.pressure_reset,
"targets": [h.xy for h in self.targets],
}
@classmethod
def from_exported(cls, data: dict) -> "Plate":
"""Get a Plate from `Plate.export` dictionary."""
plate_type = getattr(PlateType, data["plate_type"])
hex = Hex(*data["xy"])
targets = {Hex(*xy) for xy in data["targets"]}
return cls(
cube=hex.cube,
plate_type=plate_type,
min_pressure=data["min_pressure"],
pressure=data["pressure"],
pressure_reset=data["pressure_reset"],
targets=targets,
)
def __eq__(self, other: Any) -> bool:
"""Equality."""
if isinstance(other, Hexagon):
return self.cube == other.cube
return False
def __hash__(self):
"""Hash."""
return hash(self.cube)
def __repr__(self):
"""Repr."""
return f"<Plate {self.xy} {self.plate_type.name}>"
Classes
class Plate (cube: tuple[int, int, int], plate_type: PlateType, pressure: int, min_pressure: Optional[int] = None, pressure_reset: bool = False, targets: Optional[set[Hexagon]] = None)
-
Pressure Plate.
Plates will be equal to and hash like all other instances of
Hexagon
subclasses if their cube is equal.Initialize the class.
Args
Expand source code Browse git
class Plate(Hexagon): """Pressure Plate. Plates will be equal to and hash like all other instances of `botroyale.util.hexagon.Hexagon` subclasses if their cube is equal. """ def __init__( self, cube: tuple[int, int, int], plate_type: PlateType, pressure: int, min_pressure: Optional[int] = None, pressure_reset: bool = False, targets: Optional[set[Hexagon]] = None, ): """Initialize the class. Args: cube: The cube of the `botroyale.util.hexagon.Hexagon` plate_type: One of `botroyale.logic.PlateType` pressure: Negative integer min_pressure: Negative integer pressure_reset: If the pressure resets after popping targets: A set of `botroyale.util.hexagon.Hexagon` that the plate targets """ super().__init__(*cube) self.plate_type: PlateType = plate_type assert pressure < 0 self.pressure: int = pressure if min_pressure is None: min_pressure = pressure assert min_pressure < 0 self.min_pressure: int = min_pressure self.pressure_reset: bool = pressure_reset if targets is None: targets = set() self.targets: set[Hexagon] = targets def with_new_hex(self, hex: Hexagon) -> "Plate": """Create an identical `Plate` but with a different *hex*.""" return self._with_new_hex(hex, self) @classmethod def _with_new_hex(cls, hex: Hexagon, plate: "Plate") -> "Plate": """Create an identical `Plate` to *plate* but with a different *hex*.""" return cls( hex.cube, plate_type=plate.plate_type, pressure=plate.pressure, min_pressure=plate.min_pressure, pressure_reset=plate.pressure_reset, targets=copy.copy(plate.targets), ) def export(self) -> dict: """Export plate data to serializable dictionary.""" return { "xy": self.xy, "plate_type": self.plate_type.name, "min_pressure": self.min_pressure, "pressure": self.pressure, "pressure_reset": self.pressure_reset, "targets": [h.xy for h in self.targets], } @classmethod def from_exported(cls, data: dict) -> "Plate": """Get a Plate from `Plate.export` dictionary.""" plate_type = getattr(PlateType, data["plate_type"]) hex = Hex(*data["xy"]) targets = {Hex(*xy) for xy in data["targets"]} return cls( cube=hex.cube, plate_type=plate_type, min_pressure=data["min_pressure"], pressure=data["pressure"], pressure_reset=data["pressure_reset"], targets=targets, ) def __eq__(self, other: Any) -> bool: """Equality.""" if isinstance(other, Hexagon): return self.cube == other.cube return False def __hash__(self): """Hash.""" return hash(self.cube) def __repr__(self): """Repr.""" return f"<Plate {self.xy} {self.plate_type.name}>"
Ancestors
Static methods
def from_exported(data: dict) ‑> Plate
-
Get a Plate from
Plate.export()
dictionary.Expand source code Browse git
@classmethod def from_exported(cls, data: dict) -> "Plate": """Get a Plate from `Plate.export` dictionary.""" plate_type = getattr(PlateType, data["plate_type"]) hex = Hex(*data["xy"]) targets = {Hex(*xy) for xy in data["targets"]} return cls( cube=hex.cube, plate_type=plate_type, min_pressure=data["min_pressure"], pressure=data["pressure"], pressure_reset=data["pressure_reset"], targets=targets, )
Methods
def export(self) ‑> dict
-
Export plate data to serializable dictionary.
Expand source code Browse git
def export(self) -> dict: """Export plate data to serializable dictionary.""" return { "xy": self.xy, "plate_type": self.plate_type.name, "min_pressure": self.min_pressure, "pressure": self.pressure, "pressure_reset": self.pressure_reset, "targets": [h.xy for h in self.targets], }
def with_new_hex(self, hex: Hexagon) ‑> Plate
-
Create an identical
Plate
but with a different hex.Expand source code Browse git
def with_new_hex(self, hex: Hexagon) -> "Plate": """Create an identical `Plate` but with a different *hex*.""" return self._with_new_hex(hex, self)
Inherited members