#!/usr/bin/env python3 # Eryn Wells import logging import tcod from .actions import ExitAction, MovePlayerAction, RegenerateRoomsAction from .events import EventHandler from .geometry import Point, Size from .map import Map from .object import Entity from typing import AbstractSet LOG = logging.getLogger('engine') EVENT_LOG = logging.getLogger('events') class Configuration: def __init__(self, map_size: Size): self.map_size = map_size self.random_seed = None class Engine: def __init__(self, event_handler: EventHandler, configuration: Configuration): self.event_handler = event_handler self.configuration = configuration self.rng = tcod.random.Random(seed=configuration.random_seed) map_size = configuration.map_size self.map = Map(map_size) first_room = self.map.generator.rooms[0] player_start_position = first_room.center self.player = Entity('@', position=player_start_position, fg=tcod.white) self.entities: AbstractSet[Entity] = {self.player} for _ in range(self.rng.randint(5, 15)): position = self.map.random_walkable_position() self.entities.add(Entity('@', position=position, fg=tcod.yellow)) self.update_field_of_view() def handle_event(self, event: tcod.event.Event): action = self.event_handler.dispatch(event) if not action: return action.perform(self, self.player) self.update_field_of_view() def print_to_console(self, console): self.map.print_to_console(console) for ent in self.entities: # Only print entities that are in the field of view if not self.map.visible[tuple(ent.position)]: continue ent.print_to_console(console) def update_field_of_view(self) -> None: '''Compute visible area of the map based on the player's position and point of view.''' self.map.visible[:] = tcod.map.compute_fov( self.map.tiles['transparent'], tuple(self.player.position), radius=8) # Visible tiles should be added to the explored list self.map.explored |= self.map.visible