2022-04-30 21:59:01 -07:00
#!/usr/bin/env python3
# Eryn Wells <eryn@erynwells.me>
2022-05-01 09:29:30 -07:00
import logging
2022-05-03 18:21:24 -07:00
from . geometry import Direction
from typing import TYPE_CHECKING
if TYPE_CHECKING :
from . engine import Engine
from . object import Entity
2022-05-01 09:29:30 -07:00
LOG = logging . getLogger ( ' events ' )
2022-04-30 21:59:01 -07:00
class Action :
2022-05-01 09:51:22 -07:00
def perform ( self , engine : ' Engine ' , entity : ' Entity ' ) - > None :
2022-05-01 09:29:30 -07:00
'''
Perform this action . This is an abstract method that all subclasses
should implement .
'''
raise NotImplementedError ( )
2022-04-30 21:59:01 -07:00
2022-05-01 09:51:22 -07:00
def __repr__ ( self ) :
return f ' { self . __class__ . __name__ } () '
2022-04-30 21:59:01 -07:00
class ExitAction ( Action ) :
2022-05-01 09:51:22 -07:00
def perform ( self , engine : ' Engine ' , entity : ' Entity ' ) - > None :
2022-05-01 09:29:30 -07:00
raise SystemExit ( )
2022-04-30 21:59:01 -07:00
class RegenerateRoomsAction ( Action ) :
2022-05-01 09:51:22 -07:00
def perform ( self , engine : ' Engine ' , entity : ' Entity ' ) - > None :
2022-05-01 09:29:30 -07:00
. . .
2022-04-30 21:59:01 -07:00
class MovePlayerAction ( Action ) :
def __init__ ( self , direction : Direction ) :
2022-05-01 09:29:30 -07:00
self . direction = direction
2022-05-01 09:51:22 -07:00
def perform ( self , engine : ' Engine ' , entity : ' Entity ' ) - > None :
2022-05-01 09:29:30 -07:00
new_player_position = entity . position + self . direction
2022-05-01 09:51:22 -07:00
position_is_in_bounds = engine . map . tile_is_in_bounds ( new_player_position )
position_is_walkable = engine . map . tile_is_walkable ( new_player_position )
overlaps_another_entity = any ( new_player_position == ent . position for ent in engine . entities if ent is not entity )
2022-05-01 09:29:30 -07:00
2022-05-01 09:51:22 -07:00
LOG . debug ( f ' Attempting to move player to { new_player_position } (in_bounds: { position_is_in_bounds } walkable: { position_is_walkable } overlaps: { overlaps_another_entity } ) ' )
if position_is_in_bounds and position_is_walkable and not overlaps_another_entity :
entity . position = new_player_position