Source code for scripts.engine.core.key
from __future__ import annotations
from typing import TYPE_CHECKING
import pygame
from scripts.engine.internal.constant import InputIntent, InputIntentType
from scripts.engine.internal.library import INPUT_CONFIG
if TYPE_CHECKING:
from typing import Optional, Tuple
[docs]def convert_vector_to_intent(direction: Tuple[int, int]) -> Optional[InputIntentType]:
direction_map = {
(0, 1): InputIntent.UP,
(0, -1): InputIntent.DOWN,
(1, 0): InputIntent.RIGHT,
(-1, 0): InputIntent.LEFT,
(1, 1): InputIntent.UP_RIGHT,
(-1, 1): InputIntent.UP_LEFT,
(1, -1): InputIntent.DOWN_RIGHT,
(-1, -1): InputIntent.DOWN_LEFT,
}
if direction in direction_map:
return direction_map[direction]
return None
[docs]def convert_to_intent(event: pygame.event) -> Optional[InputIntentType]:
"""
Convert input to an intent.
"""
intent = None
checks = {1: _check_directions, 2: _check_actions, 3: _check_dev_actions, 4: _check_mouse}
# loop each check in turn and return first value found
for check in checks.values():
intent = check(event)
if intent is not None:
return intent
return intent
def _check_mouse(event: pygame.event) -> Optional[InputIntentType]:
"""
Process mouse events such as clicks.
"""
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == pygame.BUTTON_LEFT:
return InputIntent.LEFT_CLICKED
return None
def _check_directions(event: pygame.event):
"""
Get directional input from the keyboard
"""
# handle key press events
if event.type == pygame.KEYDOWN:
if event.key in INPUT_CONFIG["up"]:
return InputIntent.UP
elif event.key in INPUT_CONFIG["down"]:
return InputIntent.DOWN
elif event.key in INPUT_CONFIG["left"]:
return InputIntent.LEFT
elif event.key in INPUT_CONFIG["right"]:
return InputIntent.RIGHT
elif event.key in INPUT_CONFIG["up_left"]:
return InputIntent.UP_LEFT
elif event.key in INPUT_CONFIG["up_right"]:
return InputIntent.UP_RIGHT
elif event.key in INPUT_CONFIG["down_left"]:
return InputIntent.DOWN_LEFT
elif event.key in INPUT_CONFIG["down_right"]:
return InputIntent.DOWN_RIGHT
def _check_actions(event: pygame.event):
"""
Get actions such as confirm or cancel, or skill usage.
"""
# handle key press events
if event.type == pygame.KEYDOWN:
if event.key in INPUT_CONFIG["skill0"]:
return InputIntent.SKILL0
elif event.key in INPUT_CONFIG["skill1"]:
return InputIntent.SKILL1
elif event.key in INPUT_CONFIG["skill2"]:
return InputIntent.SKILL2
elif event.key in INPUT_CONFIG["skill3"]:
return InputIntent.SKILL3
elif event.key in INPUT_CONFIG["skill4"]:
return InputIntent.SKILL4
elif event.key in INPUT_CONFIG["skill5"]:
return InputIntent.SKILL5
elif event.key in INPUT_CONFIG["confirm"]:
return InputIntent.CONFIRM
elif event.key in INPUT_CONFIG["exit"]:
return InputIntent.EXIT
elif event.key in INPUT_CONFIG["cancel"]:
return InputIntent.CANCEL
def _check_dev_actions(event: pygame.event):
"""
Get any dev intents
"""
# handle key press events
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_F1:
return InputIntent.DEBUG_TOGGLE
elif event.key == pygame.K_F2:
return InputIntent.DEV_TOGGLE
elif event.key == pygame.K_F3:
return InputIntent.BURST_PROFILE
elif event.key == pygame.K_F4:
return InputIntent.REFRESH_DATA
elif event.key == pygame.K_F5:
return InputIntent.DUNGEON_DEV_VIEW
elif event.key == pygame.K_F6:
return InputIntent.TOGGLE_UI
elif event.key == pygame.K_F12:
return InputIntent.TEST