Source code for libretro.api.input.joypad
"""
Joypad (RetroPad) button input types.
Corresponds to the ``RETRO_DEVICE_ID_JOYPAD_*`` constants in ``libretro.h``.
"""
from dataclasses import dataclass
from enum import IntEnum
from typing import Literal, overload
from .device import InputDeviceState
RETRO_DEVICE_ID_JOYPAD_B = 0
RETRO_DEVICE_ID_JOYPAD_Y = 1
RETRO_DEVICE_ID_JOYPAD_SELECT = 2
RETRO_DEVICE_ID_JOYPAD_START = 3
RETRO_DEVICE_ID_JOYPAD_UP = 4
RETRO_DEVICE_ID_JOYPAD_DOWN = 5
RETRO_DEVICE_ID_JOYPAD_LEFT = 6
RETRO_DEVICE_ID_JOYPAD_RIGHT = 7
RETRO_DEVICE_ID_JOYPAD_A = 8
RETRO_DEVICE_ID_JOYPAD_X = 9
RETRO_DEVICE_ID_JOYPAD_L = 10
RETRO_DEVICE_ID_JOYPAD_R = 11
RETRO_DEVICE_ID_JOYPAD_L2 = 12
RETRO_DEVICE_ID_JOYPAD_R2 = 13
RETRO_DEVICE_ID_JOYPAD_L3 = 14
RETRO_DEVICE_ID_JOYPAD_R3 = 15
RETRO_DEVICE_ID_JOYPAD_MASK = 256
[docs]
class DeviceIdJoypad(IntEnum):
"""
Button IDs for the standard joypad.
Corresponds to the ``RETRO_DEVICE_ID_JOYPAD_*`` constants in ``libretro.h``.
>>> from libretro.api.input import DeviceIdJoypad
>>> DeviceIdJoypad.A
<DeviceIdJoypad.A: 8>
"""
B = RETRO_DEVICE_ID_JOYPAD_B
Y = RETRO_DEVICE_ID_JOYPAD_Y
SELECT = RETRO_DEVICE_ID_JOYPAD_SELECT
START = RETRO_DEVICE_ID_JOYPAD_START
UP = RETRO_DEVICE_ID_JOYPAD_UP
DOWN = RETRO_DEVICE_ID_JOYPAD_DOWN
LEFT = RETRO_DEVICE_ID_JOYPAD_LEFT
RIGHT = RETRO_DEVICE_ID_JOYPAD_RIGHT
A = RETRO_DEVICE_ID_JOYPAD_A
X = RETRO_DEVICE_ID_JOYPAD_X
L = RETRO_DEVICE_ID_JOYPAD_L
R = RETRO_DEVICE_ID_JOYPAD_R
L2 = RETRO_DEVICE_ID_JOYPAD_L2
R2 = RETRO_DEVICE_ID_JOYPAD_R2
L3 = RETRO_DEVICE_ID_JOYPAD_L3
R3 = RETRO_DEVICE_ID_JOYPAD_R3
MASK = RETRO_DEVICE_ID_JOYPAD_MASK
type DeviceIdJoypadButton = Literal[
DeviceIdJoypad.B,
DeviceIdJoypad.Y,
DeviceIdJoypad.SELECT,
DeviceIdJoypad.START,
DeviceIdJoypad.UP,
DeviceIdJoypad.DOWN,
DeviceIdJoypad.LEFT,
DeviceIdJoypad.RIGHT,
DeviceIdJoypad.A,
DeviceIdJoypad.X,
DeviceIdJoypad.L,
DeviceIdJoypad.R,
DeviceIdJoypad.L2,
DeviceIdJoypad.R2,
DeviceIdJoypad.L3,
DeviceIdJoypad.R3,
]
[docs]
@dataclass(frozen=True, slots=True)
class JoypadState(InputDeviceState):
"""
Snapshot of a standard joypad's button states.
>>> from libretro.api.input import JoypadState
>>> state = JoypadState(a=True)
>>> state.a
True
"""
b: bool = False
y: bool = False
select: bool = False
start: bool = False
up: bool = False
down: bool = False
left: bool = False
right: bool = False
a: bool = False
x: bool = False
l: bool = False
r: bool = False
l2: bool = False
r2: bool = False
l3: bool = False
r3: bool = False
@overload
def __getitem__(self, item: Literal[DeviceIdJoypad.MASK]) -> int: ...
@overload
def __getitem__(self, item: DeviceIdJoypadButton) -> bool: ...
@overload
def __getitem__(self, item: int) -> bool | int: ...
[docs]
def __getitem__(self, item: DeviceIdJoypad | int) -> bool | int:
"""
Get the state of a joypad button or the bitmask of all buttons.
>>> from libretro.api.input import JoypadState, DeviceIdJoypad
>>> state = JoypadState(a=True)
>>> state[DeviceIdJoypad.A]
True
>>> state[DeviceIdJoypad.MASK]
256
"""
match item:
case DeviceIdJoypad.B:
return self.b
case DeviceIdJoypad.Y:
return self.y
case DeviceIdJoypad.SELECT:
return self.select
case DeviceIdJoypad.START:
return self.start
case DeviceIdJoypad.UP:
return self.up
case DeviceIdJoypad.DOWN:
return self.down
case DeviceIdJoypad.LEFT:
return self.left
case DeviceIdJoypad.RIGHT:
return self.right
case DeviceIdJoypad.A:
return self.a
case DeviceIdJoypad.X:
return self.x
case DeviceIdJoypad.L:
return self.l
case DeviceIdJoypad.R:
return self.r
case DeviceIdJoypad.L2:
return self.l2
case DeviceIdJoypad.R2:
return self.r2
case DeviceIdJoypad.L3:
return self.l3
case DeviceIdJoypad.R3:
return self.r3
case DeviceIdJoypad.MASK:
return self.mask
case int():
raise IndexError(f"Index {item} is not a valid DeviceIdJoypad")
case _:
raise TypeError(f"Expected an int or DeviceIdJoypad, got {item!r}")
@property
def mask(self) -> int:
"""Bitmask of all button states, where bit 0 corresponds to ``B``, bit 1 to ``Y``, and so on."""
return (
(self.b << 0)
| (self.y << 1)
| (self.select << 2)
| (self.start << 3)
| (self.up << 4)
| (self.down << 5)
| (self.left << 6)
| (self.right << 7)
| (self.a << 8)
| (self.x << 9)
| (self.l << 10)
| (self.r << 11)
| (self.l2 << 12)
| (self.r2 << 13)
| (self.l3 << 14)
| (self.r3 << 15)
)
__all__ = ["DeviceIdJoypad", "JoypadState"]