mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
83e4cdfe76
Allow the camera's zoom to be locked by a keybind or a Gameplay setting. The zoom lock behavior can be changed between Toggle and Auto, where Auto only locks the camera zoom while specific movement/combat inputs are being pressed. (closes !1528) A temporary fading notification is shown at the top of the screen, informing the player of the setting change (when the keybind is used) or that the zoom is locked (when the player might have forgotten the zoom is locked, and is trying to zoom). i18n strings are added for English and German, but no other languages. To implement the simplistic fading text, the behavior was extracted into an impl called `ChangeNotification`, where reasons are quantified by `NotificationReason`.
197 lines
5.8 KiB
Rust
197 lines
5.8 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use std::convert::AsRef;
|
|
use strum::{AsRefStr, EnumIter, EnumString};
|
|
|
|
/// Represents a key that the game recognises after input mapping.
|
|
#[derive(
|
|
Clone,
|
|
Copy,
|
|
Debug,
|
|
PartialEq,
|
|
Eq,
|
|
PartialOrd,
|
|
Ord,
|
|
Hash,
|
|
Deserialize,
|
|
Serialize,
|
|
AsRefStr,
|
|
EnumIter,
|
|
EnumString,
|
|
)]
|
|
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-zoomlock")]
|
|
ZoomLock,
|
|
#[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,
|
|
#[strum(serialize = "gameinput-map-locationmarkerbutton")]
|
|
MapSetMarker,
|
|
#[strum(serialize = "gameinput-spectatespeedboost")]
|
|
SpectateSpeedBoost,
|
|
#[strum(serialize = "gameinput-spectateviewpoint")]
|
|
SpectateViewpoint,
|
|
#[strum(serialize = "gameinput-mutemaster")]
|
|
MuteMaster,
|
|
#[strum(serialize = "gameinput-muteinactivemaster")]
|
|
MuteInactiveMaster,
|
|
#[strum(serialize = "gameinput-mutemusic")]
|
|
MuteMusic,
|
|
#[strum(serialize = "gameinput-mutesfx")]
|
|
MuteSfx,
|
|
#[strum(serialize = "gameinput-muteambience")]
|
|
MuteAmbience,
|
|
}
|
|
|
|
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,
|
|
}
|
|
}
|
|
}
|