going-rogue/roguebasin/engine.py

83 lines
2.6 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
# Eryn Wells <eryn@erynwells.me>
import logging
2022-05-05 08:38:06 -07:00
import random
import tcod
from .actions import ExitAction, MovePlayerAction, RegenerateRoomsAction
from .events import EventHandler
2022-05-05 08:38:06 -07:00
from .geometry import Direction, 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)
2022-05-05 08:38:06 -07:00
directions = list(Direction.all())
for ent in self.entities:
if ent == self.player:
continue
while True:
new_position = ent.position + random.choice(directions)
if self.map.tile_is_walkable(new_position):
ent.position = new_position
break
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