Module botroyale.logic

Game mechanics.

The relevant modules for bot developers include botroyale.logic.state and botroyale.logic.battle.

Expand source code Browse git
"""Game mechanics.

The relevant modules for bot developers include `botroyale.logic.state` and
`botroyale.logic.battle`.
"""
from typing import Optional
from enum import IntEnum, auto as enum_auto
from botroyale.util import settings
from botroyale.util.hexagon import ORIGIN, Hexagon


class PlateType(IntEnum):
    """Enumerator for types of pressure plates. See: `botroyale.logic.plate.Plate`."""

    DEATH_RADIUS_TRAP = enum_auto()
    """Contracts the death radius."""
    PIT_TRAP = enum_auto()
    """Turns tiles into pits."""
    WALL_TRAP = enum_auto()
    """Turns tiles into walls."""


UNIT_COLORS = settings.get("gui.tilemap.colors.units")
"""All available colors for unit sprites. 12 colors in rainbow order."""
DEFAULT_CELL_BG = settings.get("gui.tilemap.colors.default_tile")
"""Color of an empty tile."""
OUT_OF_BOUNDS_CELL_BG = settings.get("gui.tilemap.colors.out_of_bounds")
"""Color of a tile outside the death radius."""
WALL_COLOR = settings.get("gui.tilemap.colors.walls")
"""Color of a wall."""
PIT_COLOR = settings.get("gui.tilemap.colors.pits")
"""Color of a pit."""
PLATE_NO_RESET_COLOR = settings.get("gui.tilemap.colors.plate_no_reset")
"""Color of a plate that will not reset its pressure."""
PLATE_RESET_COLOR = settings.get("gui.tilemap.colors.plate_reset")
"""Color of a plate that will reset its pressure."""


def get_tile_info(
    hex: Hexagon,
    state: "logic.state.State",  # noqa  (get F821 error for undefined name)
    disallow_double: bool = True,
) -> tuple[str, tuple[float, float, float]]:
    """Get a tile's background sprite and color.

    Args:
        hex: The tile.
        state: The state.
        disallow_double: If true, will show a special sprite/color when more
            than one solution was found. E.g. show the "error" sprite if the
            tile contains both a pit and a wall.

    Returns:
        A (sprite, color) tuple.
    """
    found = 0
    color = DEFAULT_CELL_BG
    sprite = "hex"
    if hex.get_distance(ORIGIN) >= state.death_radius:
        color = OUT_OF_BOUNDS_CELL_BG
    if hex in state.pits:
        found += 1
        color = PIT_COLOR
        sprite = "pit"
    if hex in state.walls:
        found += 1
        color = WALL_COLOR
        sprite = "wall"
    if hex in state.plates:
        found += 1
        plate = state.get_plate(hex)
        start_color = (
            PLATE_RESET_COLOR if plate.pressure_reset else PLATE_NO_RESET_COLOR
        )
        intensity = -1 / min(plate.pressure, -1)
        color = tuple(c * intensity for c in start_color)
        sprite = f"plate_{plate.plate_type.name.lower()}"
    if found > 1 and disallow_double:
        color = 1, 1, 1
        sprite = "error"
    return sprite, color


def get_tile_info_unit(
    hex: Hexagon,
    state: "logic.state.State",  # noqa  (get F821 error for undefined name)
    unit_sprites: Optional[list[str]] = None,
    unit_colors: Optional[list[tuple[float, float, float]]] = None,
    disallow_double: bool = True,
) -> tuple[str, tuple[float, float, float], str]:
    """Get a tile's foreground (unit) sprite, color, and text.

    Args:
        hex: The tile.
        state: The state.
        unit_sprites: A list of sprites for the units by uid.
        unit_colors: A list of colors for the units by uid.
        disallow_double: If true, will show a special sprite/color if more than
            one unit was found. I.e. show the "error" sprite if the tile
            contains more than one unit.

    Returns:
        A (sprite, color, text) tuple.
    """
    sprite = None
    color = None
    text = None
    unit_count = state.positions.count(hex)
    if unit_count > 1 and disallow_double:
        sprite = "error"
        color = 1, 1, 1
    elif unit_count == 1:
        if unit_colors is None:
            unit_colors = UNIT_COLORS
        uid = state.positions.index(hex)
        alive = state.alive_mask[uid]
        color = unit_colors[uid % len(unit_colors)] if alive else (0.5, 0.5, 0.5)
        if unit_sprites is None:
            sprite = "bot"
        else:
            sprite = unit_sprites[uid % len(unit_sprites)]
        text = str(uid)
    return sprite, color, text

Sub-modules

botroyale.logic.battle

Home of the Battle class …

botroyale.logic.battle_manager

Home of BattleManager.

botroyale.logic.game

Home of StandardGameAPI

botroyale.logic.map_editor

Home of MapEditor.

botroyale.logic.maps

Maps (initial states for battle) …

botroyale.logic.plate

Home of Plate.

botroyale.logic.prng

LCG (linear congruential generator) …

botroyale.logic.state

Home of the State class …

Global variables

var DEFAULT_CELL_BG

Color of an empty tile.

var OUT_OF_BOUNDS_CELL_BG

Color of a tile outside the death radius.

var PIT_COLOR

Color of a pit.

var PLATE_NO_RESET_COLOR

Color of a plate that will not reset its pressure.

var PLATE_RESET_COLOR

Color of a plate that will reset its pressure.

var UNIT_COLORS

All available colors for unit sprites. 12 colors in rainbow order.

var WALL_COLOR

Color of a wall.

Functions

def get_tile_info(hex: Hexagon, state: logic.state.State, disallow_double: bool = True) ‑> tuple[str, tuple[float, float, float]]

Get a tile's background sprite and color.

Args

hex
The tile.
state
The state.
disallow_double
If true, will show a special sprite/color when more than one solution was found. E.g. show the "error" sprite if the tile contains both a pit and a wall.

Returns

A (sprite, color) tuple.

Expand source code Browse git
def get_tile_info(
    hex: Hexagon,
    state: "logic.state.State",  # noqa  (get F821 error for undefined name)
    disallow_double: bool = True,
) -> tuple[str, tuple[float, float, float]]:
    """Get a tile's background sprite and color.

    Args:
        hex: The tile.
        state: The state.
        disallow_double: If true, will show a special sprite/color when more
            than one solution was found. E.g. show the "error" sprite if the
            tile contains both a pit and a wall.

    Returns:
        A (sprite, color) tuple.
    """
    found = 0
    color = DEFAULT_CELL_BG
    sprite = "hex"
    if hex.get_distance(ORIGIN) >= state.death_radius:
        color = OUT_OF_BOUNDS_CELL_BG
    if hex in state.pits:
        found += 1
        color = PIT_COLOR
        sprite = "pit"
    if hex in state.walls:
        found += 1
        color = WALL_COLOR
        sprite = "wall"
    if hex in state.plates:
        found += 1
        plate = state.get_plate(hex)
        start_color = (
            PLATE_RESET_COLOR if plate.pressure_reset else PLATE_NO_RESET_COLOR
        )
        intensity = -1 / min(plate.pressure, -1)
        color = tuple(c * intensity for c in start_color)
        sprite = f"plate_{plate.plate_type.name.lower()}"
    if found > 1 and disallow_double:
        color = 1, 1, 1
        sprite = "error"
    return sprite, color
def get_tile_info_unit(hex: Hexagon, state: logic.state.State, unit_sprites: Optional[list[str]] = None, unit_colors: Optional[list[tuple[float, float, float]]] = None, disallow_double: bool = True) ‑> tuple[str, tuple[float, float, float], str]

Get a tile's foreground (unit) sprite, color, and text.

Args

hex
The tile.
state
The state.
unit_sprites
A list of sprites for the units by uid.
unit_colors
A list of colors for the units by uid.
disallow_double
If true, will show a special sprite/color if more than one unit was found. I.e. show the "error" sprite if the tile contains more than one unit.

Returns

A (sprite, color, text) tuple.

Expand source code Browse git
def get_tile_info_unit(
    hex: Hexagon,
    state: "logic.state.State",  # noqa  (get F821 error for undefined name)
    unit_sprites: Optional[list[str]] = None,
    unit_colors: Optional[list[tuple[float, float, float]]] = None,
    disallow_double: bool = True,
) -> tuple[str, tuple[float, float, float], str]:
    """Get a tile's foreground (unit) sprite, color, and text.

    Args:
        hex: The tile.
        state: The state.
        unit_sprites: A list of sprites for the units by uid.
        unit_colors: A list of colors for the units by uid.
        disallow_double: If true, will show a special sprite/color if more than
            one unit was found. I.e. show the "error" sprite if the tile
            contains more than one unit.

    Returns:
        A (sprite, color, text) tuple.
    """
    sprite = None
    color = None
    text = None
    unit_count = state.positions.count(hex)
    if unit_count > 1 and disallow_double:
        sprite = "error"
        color = 1, 1, 1
    elif unit_count == 1:
        if unit_colors is None:
            unit_colors = UNIT_COLORS
        uid = state.positions.index(hex)
        alive = state.alive_mask[uid]
        color = unit_colors[uid % len(unit_colors)] if alive else (0.5, 0.5, 0.5)
        if unit_sprites is None:
            sprite = "bot"
        else:
            sprite = unit_sprites[uid % len(unit_sprites)]
        text = str(uid)
    return sprite, color, text

Classes

class PlateType (value, names=None, *, module=None, qualname=None, type=None, start=1)

Enumerator for types of pressure plates. See: Plate.

Expand source code Browse git
class PlateType(IntEnum):
    """Enumerator for types of pressure plates. See: `botroyale.logic.plate.Plate`."""

    DEATH_RADIUS_TRAP = enum_auto()
    """Contracts the death radius."""
    PIT_TRAP = enum_auto()
    """Turns tiles into pits."""
    WALL_TRAP = enum_auto()
    """Turns tiles into walls."""

Ancestors

  • enum.IntEnum
  • builtins.int
  • enum.Enum

Class variables

var DEATH_RADIUS_TRAP

Contracts the death radius.

var PIT_TRAP

Turns tiles into pits.

var WALL_TRAP

Turns tiles into walls.