From 186db167076d630a6dcd2633206ff4ad9ab24bbd Mon Sep 17 00:00:00 2001 From: timokoesters Date: Tue, 27 Aug 2019 13:15:26 +0200 Subject: [PATCH 1/3] Rename attack, block to main, alt --- voxygen/src/session.rs | 4 +-- voxygen/src/settings.rs | 8 +++--- voxygen/src/window.rs | 61 ++++++++++------------------------------- 3 files changed, 20 insertions(+), 53 deletions(-) diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index 854f1674b8..1eae6ba597 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -129,7 +129,7 @@ impl PlayState for SessionState { Event::Close => { return PlayStateResult::Shutdown; } - Event::InputUpdate(GameInput::Attack, state) => { + Event::InputUpdate(GameInput::Main, state) => { self.controller.respawn = state; // TODO: Move this into separate GameInput // Check the existence of CanBuild component. If it's here, use LMB to @@ -158,7 +158,7 @@ impl PlayState for SessionState { } } - Event::InputUpdate(GameInput::Block, state) => { + Event::InputUpdate(GameInput::Alt, state) => { let mut client = self.client.borrow_mut(); if state && client diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index 853a6cac08..e896e6f5cf 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -13,6 +13,8 @@ use std::{fs, io::prelude::*, path::PathBuf}; #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(default)] pub struct ControlSettings { + pub main: KeyMouse, + pub alt: KeyMouse, pub toggle_cursor: KeyMouse, pub escape: KeyMouse, pub enter: KeyMouse, @@ -36,8 +38,6 @@ pub struct ControlSettings { pub fullscreen: KeyMouse, pub screenshot: KeyMouse, pub toggle_ingame_ui: KeyMouse, - pub attack: KeyMouse, - pub block: KeyMouse, pub roll: KeyMouse, pub interact: KeyMouse, } @@ -45,6 +45,8 @@ pub struct ControlSettings { impl Default for ControlSettings { fn default() -> Self { Self { + main: KeyMouse::Mouse(MouseButton::Left), + alt: KeyMouse::Mouse(MouseButton::Right), toggle_cursor: KeyMouse::Key(VirtualKeyCode::Tab), escape: KeyMouse::Key(VirtualKeyCode::Escape), enter: KeyMouse::Key(VirtualKeyCode::Return), @@ -68,8 +70,6 @@ impl Default for ControlSettings { fullscreen: KeyMouse::Key(VirtualKeyCode::F11), screenshot: KeyMouse::Key(VirtualKeyCode::F4), toggle_ingame_ui: KeyMouse::Key(VirtualKeyCode::F6), - attack: KeyMouse::Mouse(MouseButton::Left), - block: KeyMouse::Mouse(MouseButton::Right), roll: KeyMouse::Mouse(MouseButton::Middle), interact: KeyMouse::Key(VirtualKeyCode::E), } diff --git a/voxygen/src/window.rs b/voxygen/src/window.rs index 2e9b9534ec..3a1323b710 100644 --- a/voxygen/src/window.rs +++ b/voxygen/src/window.rs @@ -11,6 +11,8 @@ use vek::*; /// Represents a key that the game recognises after keyboard mapping. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] pub enum GameInput { + Main, + Alt, ToggleCursor, MoveForward, MoveBack, @@ -34,8 +36,6 @@ pub enum GameInput { Fullscreen, Screenshot, ToggleIngameUi, - Attack, - Block, Roll, Respawn, Interact, @@ -109,6 +109,8 @@ impl Window { .map_err(|err| Error::BackendError(Box::new(err)))?; let mut key_map = HashMap::new(); + key_map.insert(settings.controls.main, GameInput::Main); + key_map.insert(settings.controls.alt, GameInput::Alt); key_map.insert(settings.controls.toggle_cursor, GameInput::ToggleCursor); key_map.insert(settings.controls.escape, GameInput::Escape); key_map.insert(settings.controls.enter, GameInput::Enter); @@ -141,8 +143,6 @@ impl Window { settings.controls.toggle_ingame_ui, GameInput::ToggleIngameUi, ); - key_map.insert(settings.controls.attack, GameInput::Attack); - key_map.insert(settings.controls.block, GameInput::Block); key_map.insert(settings.controls.roll, GameInput::Roll); key_map.insert(settings.controls.interact, GameInput::Interact); @@ -222,51 +222,21 @@ impl Window { Some(key) => match key_map.get(&KeyMouse::Key(key)) { Some(GameInput::Fullscreen) => { if input.state == glutin::ElementState::Pressed - && !Self::is_event_key_held(keypress_map, GameInput::Fullscreen) + && !Self::is_pressed(keypress_map, GameInput::Fullscreen) { toggle_fullscreen = !toggle_fullscreen; } - Self::update_keypress_map( - keypress_map, - GameInput::Fullscreen, - input.state, - ); + Self::set_pressed(keypress_map, GameInput::Fullscreen, input.state); } Some(GameInput::Screenshot) => { take_screenshot = input.state == glutin::ElementState::Pressed - && !Self::is_event_key_held( - keypress_map, - GameInput::Screenshot, - ); - Self::update_keypress_map( - keypress_map, - GameInput::Screenshot, - input.state, - ); - } - Some(&game_input) - if game_input == GameInput::MoveForward - || game_input == GameInput::MoveBack - || game_input == GameInput::MoveLeft - || game_input == GameInput::MoveRight - || game_input == GameInput::Jump - || game_input == GameInput::Glide - || game_input == GameInput::Attack - || game_input == GameInput::Roll => - { - events.push(Event::InputUpdate( - game_input, - input.state == glutin::ElementState::Pressed, - )) - } - Some(&game_input) => { - if input.state == glutin::ElementState::Pressed - && !Self::is_event_key_held(keypress_map, game_input) - { - events.push(Event::InputUpdate(game_input, true)); - } - Self::update_keypress_map(keypress_map, game_input, input.state); + && !Self::is_pressed(keypress_map, GameInput::Screenshot); + Self::set_pressed(keypress_map, GameInput::Screenshot, input.state); } + Some(&game_input) => events.push(Event::InputUpdate( + game_input, + input.state == glutin::ElementState::Pressed, + )), _ => {} }, _ => {} @@ -386,15 +356,12 @@ impl Window { } } - fn is_event_key_held( - map: &mut HashMap, - input: GameInput, - ) -> bool { + fn is_pressed(map: &mut HashMap, input: GameInput) -> bool { *(map.entry(input).or_insert(glutin::ElementState::Released)) == glutin::ElementState::Pressed } - fn update_keypress_map( + fn set_pressed( map: &mut HashMap, input: GameInput, state: glutin::ElementState, From 6b4dfcc533a6e9e5674339e6e4a2ab71cb1119b4 Mon Sep 17 00:00:00 2001 From: timokoesters Date: Tue, 27 Aug 2019 13:42:17 +0200 Subject: [PATCH 2/3] Allow mapping the same key to multile actions (LMB = attack + respawn) --- voxygen/src/session.rs | 5 +- voxygen/src/settings.rs | 2 + voxygen/src/window.rs | 195 +++++++++++++++++++++++++++------------- 3 files changed, 138 insertions(+), 64 deletions(-) diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index 1eae6ba597..edf4ec56b5 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -130,8 +130,6 @@ impl PlayState for SessionState { return PlayStateResult::Shutdown; } Event::InputUpdate(GameInput::Main, state) => { - self.controller.respawn = state; // TODO: Move this into separate GameInput - // Check the existence of CanBuild component. If it's here, use LMB to // place blocks, if not, use it to attack let mut client = self.client.borrow_mut(); @@ -204,6 +202,9 @@ impl PlayState for SessionState { self.controller.roll = state; } } + Event::InputUpdate(GameInput::Respawn, state) => { + self.controller.respawn = state; + } Event::InputUpdate(GameInput::Jump, state) => { self.controller.jump = state; } diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index e896e6f5cf..7ad1dcc2b6 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -39,6 +39,7 @@ pub struct ControlSettings { pub screenshot: KeyMouse, pub toggle_ingame_ui: KeyMouse, pub roll: KeyMouse, + pub respawn: KeyMouse, pub interact: KeyMouse, } @@ -71,6 +72,7 @@ impl Default for ControlSettings { screenshot: KeyMouse::Key(VirtualKeyCode::F4), toggle_ingame_ui: KeyMouse::Key(VirtualKeyCode::F6), roll: KeyMouse::Mouse(MouseButton::Middle), + respawn: KeyMouse::Mouse(MouseButton::Left), interact: KeyMouse::Key(VirtualKeyCode::E), } } diff --git a/voxygen/src/window.rs b/voxygen/src/window.rs index 3a1323b710..fafc9ac23f 100644 --- a/voxygen/src/window.rs +++ b/voxygen/src/window.rs @@ -81,7 +81,7 @@ pub struct Window { pub zoom_sensitivity: u32, fullscreen: bool, needs_refresh_resize: bool, - key_map: HashMap, + key_map: HashMap>, keypress_map: HashMap, supplement_events: Vec, focused: bool, @@ -108,43 +108,91 @@ impl Window { ) .map_err(|err| Error::BackendError(Box::new(err)))?; - let mut key_map = HashMap::new(); - key_map.insert(settings.controls.main, GameInput::Main); - key_map.insert(settings.controls.alt, GameInput::Alt); - key_map.insert(settings.controls.toggle_cursor, GameInput::ToggleCursor); - key_map.insert(settings.controls.escape, GameInput::Escape); - key_map.insert(settings.controls.enter, GameInput::Enter); - key_map.insert(settings.controls.command, GameInput::Command); - key_map.insert(settings.controls.move_forward, GameInput::MoveForward); - key_map.insert(settings.controls.move_left, GameInput::MoveLeft); - key_map.insert(settings.controls.move_back, GameInput::MoveBack); - key_map.insert(settings.controls.move_right, GameInput::MoveRight); - key_map.insert(settings.controls.jump, GameInput::Jump); - key_map.insert(settings.controls.glide, GameInput::Glide); - key_map.insert(settings.controls.map, GameInput::Map); - key_map.insert(settings.controls.bag, GameInput::Bag); - key_map.insert(settings.controls.quest_log, GameInput::QuestLog); - key_map.insert( - settings.controls.character_window, - GameInput::CharacterWindow, - ); - key_map.insert(settings.controls.social, GameInput::Social); - key_map.insert(settings.controls.spellbook, GameInput::Spellbook); - key_map.insert(settings.controls.settings, GameInput::Settings); - key_map.insert(settings.controls.help, GameInput::Help); - key_map.insert( - settings.controls.toggle_interface, - GameInput::ToggleInterface, - ); - key_map.insert(settings.controls.toggle_debug, GameInput::ToggleDebug); - key_map.insert(settings.controls.fullscreen, GameInput::Fullscreen); - key_map.insert(settings.controls.screenshot, GameInput::Screenshot); - key_map.insert( - settings.controls.toggle_ingame_ui, - GameInput::ToggleIngameUi, - ); - key_map.insert(settings.controls.roll, GameInput::Roll); - key_map.insert(settings.controls.interact, GameInput::Interact); + let mut map: HashMap<_, Vec<_>> = HashMap::new(); + map.entry(settings.controls.main) + .or_default() + .push(GameInput::Main); + map.entry(settings.controls.alt) + .or_default() + .push(GameInput::Alt); + map.entry(settings.controls.toggle_cursor) + .or_default() + .push(GameInput::ToggleCursor); + map.entry(settings.controls.escape) + .or_default() + .push(GameInput::Escape); + map.entry(settings.controls.enter) + .or_default() + .push(GameInput::Enter); + map.entry(settings.controls.command) + .or_default() + .push(GameInput::Command); + map.entry(settings.controls.move_forward) + .or_default() + .push(GameInput::MoveForward); + map.entry(settings.controls.move_left) + .or_default() + .push(GameInput::MoveLeft); + map.entry(settings.controls.move_back) + .or_default() + .push(GameInput::MoveBack); + map.entry(settings.controls.move_right) + .or_default() + .push(GameInput::MoveRight); + map.entry(settings.controls.jump) + .or_default() + .push(GameInput::Jump); + map.entry(settings.controls.glide) + .or_default() + .push(GameInput::Glide); + map.entry(settings.controls.map) + .or_default() + .push(GameInput::Map); + map.entry(settings.controls.bag) + .or_default() + .push(GameInput::Bag); + map.entry(settings.controls.quest_log) + .or_default() + .push(GameInput::QuestLog); + map.entry(settings.controls.character_window) + .or_default() + .push(GameInput::CharacterWindow); + map.entry(settings.controls.social) + .or_default() + .push(GameInput::Social); + map.entry(settings.controls.spellbook) + .or_default() + .push(GameInput::Spellbook); + map.entry(settings.controls.settings) + .or_default() + .push(GameInput::Settings); + map.entry(settings.controls.help) + .or_default() + .push(GameInput::Help); + map.entry(settings.controls.toggle_interface) + .or_default() + .push(GameInput::ToggleInterface); + map.entry(settings.controls.toggle_debug) + .or_default() + .push(GameInput::ToggleDebug); + map.entry(settings.controls.fullscreen) + .or_default() + .push(GameInput::Fullscreen); + map.entry(settings.controls.screenshot) + .or_default() + .push(GameInput::Screenshot); + map.entry(settings.controls.toggle_ingame_ui) + .or_default() + .push(GameInput::ToggleIngameUi); + map.entry(settings.controls.roll) + .or_default() + .push(GameInput::Roll); + map.entry(settings.controls.respawn) + .or_default() + .push(GameInput::Respawn); + map.entry(settings.controls.interact) + .or_default() + .push(GameInput::Interact); let keypress_map = HashMap::new(); @@ -157,7 +205,7 @@ impl Window { zoom_sensitivity: settings.gameplay.zoom_sensitivity, fullscreen: false, needs_refresh_resize: false, - key_map, + key_map: map, keypress_map, supplement_events: vec![], focused: true, @@ -210,35 +258,58 @@ impl Window { } glutin::WindowEvent::ReceivedCharacter(c) => events.push(Event::Char(c)), glutin::WindowEvent::MouseInput { button, state, .. } if cursor_grabbed => { - if let Some(&game_input) = key_map.get(&KeyMouse::Mouse(button)) { - events.push(Event::InputUpdate( - game_input, - state == glutin::ElementState::Pressed, - )) + if let Some(game_inputs) = key_map.get(&KeyMouse::Mouse(button)) { + for game_input in game_inputs { + events.push(Event::InputUpdate( + *game_input, + state == glutin::ElementState::Pressed, + )); + } } } glutin::WindowEvent::KeyboardInput { input, .. } => match input.virtual_keycode { - Some(key) => match key_map.get(&KeyMouse::Key(key)) { - Some(GameInput::Fullscreen) => { - if input.state == glutin::ElementState::Pressed - && !Self::is_pressed(keypress_map, GameInput::Fullscreen) - { - toggle_fullscreen = !toggle_fullscreen; + Some(key) => { + let game_inputs = key_map.get(&KeyMouse::Key(key)); + if let Some(game_inputs) = game_inputs { + for game_input in game_inputs { + match game_input { + GameInput::Fullscreen => { + if input.state == glutin::ElementState::Pressed + && !Self::is_pressed( + keypress_map, + GameInput::Fullscreen, + ) + { + toggle_fullscreen = !toggle_fullscreen; + } + Self::set_pressed( + keypress_map, + GameInput::Fullscreen, + input.state, + ); + } + GameInput::Screenshot => { + take_screenshot = input.state + == glutin::ElementState::Pressed + && !Self::is_pressed( + keypress_map, + GameInput::Screenshot, + ); + Self::set_pressed( + keypress_map, + GameInput::Screenshot, + input.state, + ); + } + _ => events.push(Event::InputUpdate( + *game_input, + input.state == glutin::ElementState::Pressed, + )), + } } - Self::set_pressed(keypress_map, GameInput::Fullscreen, input.state); } - Some(GameInput::Screenshot) => { - take_screenshot = input.state == glutin::ElementState::Pressed - && !Self::is_pressed(keypress_map, GameInput::Screenshot); - Self::set_pressed(keypress_map, GameInput::Screenshot, input.state); - } - Some(&game_input) => events.push(Event::InputUpdate( - game_input, - input.state == glutin::ElementState::Pressed, - )), - _ => {} - }, + } _ => {} }, glutin::WindowEvent::Focused(state) => { From cd061aba850d85ee1ac8972c907fd3cd6eb864b1 Mon Sep 17 00:00:00 2001 From: timokoesters Date: Tue, 27 Aug 2019 14:42:53 +0200 Subject: [PATCH 3/3] Make respawn hint text base on key bindings --- voxygen/src/hud/skillbar.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/voxygen/src/hud/skillbar.rs b/voxygen/src/hud/skillbar.rs index 273af66488..b947de8c6d 100644 --- a/voxygen/src/hud/skillbar.rs +++ b/voxygen/src/hud/skillbar.rs @@ -217,11 +217,14 @@ impl<'a> Widget for Skillbar<'a> { .font_size(40) .color(CRITICAL_HP_COLOR) .set(state.ids.death_message_1, ui); - Text::new("Press L-Mouse to respawn.") - .mid_bottom_with_margin_on(state.ids.death_message_1, -30.0) - .font_size(15) - .color(CRITICAL_HP_COLOR) - .set(state.ids.death_message_2, ui); + Text::new(&format!( + "Press {:?} to respawn.", + self.global_state.settings.controls.respawn + )) + .mid_bottom_with_margin_on(state.ids.death_message_1, -30.0) + .font_size(15) + .color(CRITICAL_HP_COLOR) + .set(state.ids.death_message_2, ui); } // Experience-Bar match self.global_state.settings.gameplay.xp_bar {