going-rogue/roguebasin/events.py
Eryn Wells 4002b64640 Attack!!!
Refactor MovePlayerAction into a few different Action subclasses. Move direction
to a parent MoveAction, and create three new subclasses of MoveAction:

    - BumpAction: perform the test that an action can be performed in the given direction
    - WalkAction, take a step in the given direction
    - MeleeAction, attack another Entity in the given direction

Add an ActionResult class that communicates the result of performing an Action.

    - ActionResult.succeeded indicates whether the action succeeded.
    - ActionResult.done indicates if the action is fully complete or requires followup.
    - ActionResult.alternate specifies the follow-up action to perform.

Convert all the key handling actions to BumpActions.

In the Engine's event handler method, loop until an action is completed,
performing specified alternate actions until the result object indicates the
action is done.
2022-05-07 11:16:17 -07:00

37 lines
1.3 KiB
Python

#!/usr/bin/env python3
# Eryn Wells <eryn@erynwells.me>
import tcod
from .actions import Action, ExitAction, RegenerateRoomsAction, BumpAction
from .geometry import Direction
from typing import Optional
class EventHandler(tcod.event.EventDispatch[Action]):
def ev_quit(self, event: tcod.event.Quit) -> Optional[Action]:
return ExitAction()
def ev_keydown(self, event: tcod.event.KeyDown) -> Optional[Action]:
action: Optional[Action] = None
sym = event.sym
if sym == tcod.event.KeySym.b:
action = BumpAction(Direction.SouthWest)
elif sym == tcod.event.KeySym.h:
action = BumpAction(Direction.West)
elif sym == tcod.event.KeySym.j:
action = BumpAction(Direction.South)
elif sym == tcod.event.KeySym.k:
action = BumpAction(Direction.North)
elif sym == tcod.event.KeySym.l:
action = BumpAction(Direction.East)
elif sym == tcod.event.KeySym.n:
action = BumpAction(Direction.SouthEast)
elif sym == tcod.event.KeySym.u:
action = BumpAction(Direction.NorthEast)
elif sym == tcod.event.KeySym.y:
action = BumpAction(Direction.NorthWest)
elif sym == tcod.event.KeySym.SPACE:
action = RegenerateRoomsAction()
return action