veloren/voxygen/src/game_input.rs
2021-08-06 22:58:36 +03:00

178 lines
5.2 KiB
Rust

use serde::{Deserialize, Serialize};
use std::convert::AsRef;
use strum::{AsRefStr, EnumIter};
/// Represents a key that the game recognises after input mapping.
#[derive(
Clone,
Copy,
Debug,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Deserialize,
Serialize,
AsRefStr,
EnumIter,
)]
pub enum GameInput {
#[strum(serialize = "gameinput.primary")]
Primary,
#[strum(serialize = "gameinput.secondary")]
Secondary,
#[strum(serialize = "gameinput.block")]
Block,
#[strum(serialize = "gameinput.slot1")]
Slot1,
#[strum(serialize = "gameinput.slot2")]
Slot2,
#[strum(serialize = "gameinput.slot3")]
Slot3,
#[strum(serialize = "gameinput.slot4")]
Slot4,
#[strum(serialize = "gameinput.slot5")]
Slot5,
#[strum(serialize = "gameinput.slot6")]
Slot6,
#[strum(serialize = "gameinput.slot7")]
Slot7,
#[strum(serialize = "gameinput.slot8")]
Slot8,
#[strum(serialize = "gameinput.slot9")]
Slot9,
#[strum(serialize = "gameinput.slot10")]
Slot10,
#[strum(serialize = "gameinput.togglecursor")]
ToggleCursor,
#[strum(serialize = "gameinput.moveforward")]
MoveForward,
#[strum(serialize = "gameinput.moveback")]
MoveBack,
#[strum(serialize = "gameinput.moveleft")]
MoveLeft,
#[strum(serialize = "gameinput.moveright")]
MoveRight,
#[strum(serialize = "gameinput.jump")]
Jump,
#[strum(serialize = "gameinput.sit")]
Sit,
#[strum(serialize = "gameinput.dance")]
Dance,
#[strum(serialize = "gameinput.greet")]
Greet,
#[strum(serialize = "gameinput.glide")]
Glide,
#[strum(serialize = "gameinput.climb")]
Climb,
#[strum(serialize = "gameinput.climbdown")]
ClimbDown,
#[strum(serialize = "gameinput.swimup")]
SwimUp,
#[strum(serialize = "gameinput.swimdown")]
SwimDown,
#[strum(serialize = "gameinput.fly")]
Fly,
#[strum(serialize = "gameinput.sneak")]
Sneak,
#[strum(serialize = "gameinput.togglelantern")]
ToggleLantern,
#[strum(serialize = "gameinput.mount")]
Mount,
#[strum(serialize = "gameinput.chat")]
Chat,
#[strum(serialize = "gameinput.command")]
Command,
#[strum(serialize = "gameinput.escape")]
Escape,
#[strum(serialize = "gameinput.map")]
Map,
#[strum(serialize = "gameinput.bag")]
Bag,
#[strum(serialize = "gameinput.trade")]
Trade,
#[strum(serialize = "gameinput.social")]
Social,
#[strum(serialize = "gameinput.crafting")]
Crafting,
#[strum(serialize = "gameinput.spellbook")]
Spellbook,
#[strum(serialize = "gameinput.settings")]
Settings,
#[strum(serialize = "gameinput.toggleinterface")]
ToggleInterface,
#[strum(serialize = "gameinput.help")]
Help,
#[strum(serialize = "gameinput.toggledebug")]
ToggleDebug,
#[cfg(feature = "egui-ui")]
#[strum(serialize = "gameinput.toggle_egui_debug")]
ToggleEguiDebug,
#[strum(serialize = "gameinput.togglechat")]
ToggleChat,
#[strum(serialize = "gameinput.fullscreen")]
Fullscreen,
#[strum(serialize = "gameinput.screenshot")]
Screenshot,
#[strum(serialize = "gameinput.toggleingameui")]
ToggleIngameUi,
#[strum(serialize = "gameinput.roll")]
Roll,
#[strum(serialize = "gameinput.respawn")]
Respawn,
#[strum(serialize = "gameinput.interact")]
Interact,
#[strum(serialize = "gameinput.togglewield")]
ToggleWield,
#[strum(serialize = "gameinput.swaploadout")]
SwapLoadout,
#[strum(serialize = "gameinput.freelook")]
FreeLook,
#[strum(serialize = "gameinput.autowalk")]
AutoWalk,
#[strum(serialize = "gameinput.cameraclamp")]
CameraClamp,
#[strum(serialize = "gameinput.cyclecamera")]
CycleCamera,
#[strum(serialize = "gameinput.select")]
Select,
#[strum(serialize = "gameinput.acceptgroupinvite")]
AcceptGroupInvite,
#[strum(serialize = "gameinput.declinegroupinvite")]
DeclineGroupInvite,
#[strum(serialize = "gameinput.mapzoomin")]
MapZoomIn,
#[strum(serialize = "gameinput.mapzoomout")]
MapZoomOut,
}
impl GameInput {
pub fn get_localization_key(&self) -> &str { self.as_ref() }
/// Return true if `a` and `b` are able to be bound to the same key at the
/// same time without conflict. For example, the player can't jump and climb
/// at the same time, so these can be bound to the same key.
pub fn can_share_bindings(a: GameInput, b: GameInput) -> bool {
a.get_representative_binding() == b.get_representative_binding()
}
/// If two GameInputs are able to be bound at the same time, then they will
/// return the same value from this function (the representative value for
/// that set). This models the Find operation of a disjoint-set data
/// structure.
fn get_representative_binding(&self) -> GameInput {
match self {
GameInput::Jump => GameInput::Jump,
GameInput::Climb => GameInput::Jump,
GameInput::SwimUp => GameInput::Jump,
GameInput::Respawn => GameInput::Jump,
GameInput::FreeLook => GameInput::FreeLook,
GameInput::AutoWalk => GameInput::FreeLook,
_ => *self,
}
}
}