2021-07-21 11:23:45 +00:00
|
|
|
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,
|
2021-07-26 00:41:01 +00:00
|
|
|
#[strum(serialize = "gameinput.togglechat")]
|
|
|
|
ToggleChat,
|
2021-07-21 11:23:45 +00:00
|
|
|
#[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,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|