use std::fmt::Debug;
use bevy::prelude::KeyCode;
use serde::{Deserialize, Serialize};
use crate::bindings::{
ContinuousBinding, DualAxisBinding, InputBinding, PulseBinding, SingleAxisBinding,
};
pub trait InputAction {
fn group_id() -> &'static str
where
Self: Sized;
fn action_id(&self) -> &'static str;
fn index(&self) -> usize;
fn kind(&self) -> InputKind;
fn iter() -> impl Iterator<Item = Self>
where
Self: Sized;
}
#[derive(Debug, Serialize, Deserialize, Copy, Clone, PartialEq, Eq, Hash)]
pub enum InputKind {
DualAxis,
SingleAxis,
Continuous,
Pulse,
}
impl InputKind {
#[must_use]
pub(crate) fn explain(self) -> &'static str {
match self {
InputKind::SingleAxis => {
"Indicates a direction along a single axis. Example: mouse wheel."
}
InputKind::DualAxis => "Indicates a direction along two axes. Example: joystick.",
InputKind::Continuous => {
"Binary signal, either on or off. Example: holding down the sprint button."
}
InputKind::Pulse => {
"An instantaneous event. Example: clicking the mouse button to shoot."
}
}
}
#[must_use]
pub(crate) fn example(self) -> InputBinding {
match self {
InputKind::SingleAxis => {
SingleAxisBinding::hold()
.set_negative(KeyCode::PageDown)
.set_positive(KeyCode::PageUp)
.build()
.0
}
InputKind::DualAxis => {
DualAxisBinding::builder()
.set_x(
SingleAxisBinding::hold()
.set_negative(KeyCode::A)
.set_positive(KeyCode::D)
.build(),
)
.set_y(
SingleAxisBinding::hold()
.set_negative(KeyCode::S)
.set_positive(KeyCode::W)
.build(),
)
.build()
.0
}
InputKind::Continuous => ContinuousBinding::hold(KeyCode::ShiftLeft).0,
InputKind::Pulse => PulseBinding::just_pressed(KeyCode::E).0,
}
}
}