diff --git a/assets/voxygen/i18n/en.ron b/assets/voxygen/i18n/en.ron index 57ef0300db..cdcad13db1 100644 --- a/assets/voxygen/i18n/en.ron +++ b/assets/voxygen/i18n/en.ron @@ -192,6 +192,8 @@ Enjoy your stay in the World of Veloren."#, "hud.settings.general": "General", "hud.settings.none": "None", + "hud.settings.press_behavior.toggle": "Toggle", + "hud.settings.press_behavior.hold": "Hold", "hud.settings.help_window": "Help Window", "hud.settings.debug_info": "Debug Info", "hud.settings.tips_on_startup": "Tips-On-Startup", @@ -219,6 +221,7 @@ Enjoy your stay in the World of Veloren."#, "hud.settings.zoom_sensitivity": "Zoom Sensitivity", "hud.settings.invert_scroll_zoom": "Invert Scroll Zoom", "hud.settings.invert_mouse_y_axis": "Invert Mouse Y Axis", + "hud.settings.free_look_behavior": "Free look behavior", "hud.settings.view_distance": "View Distance", "hud.settings.maximum_fps": "Maximum FPS", @@ -308,6 +311,9 @@ Send Chat Message Scroll Chat +Free look + + Chat commands: /alias [Name] - Change your Chat Name diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 9a45e82156..af37606609 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -231,6 +231,7 @@ pub enum Event { Logout, Quit, ChangeLanguage(LanguageMetadata), + ChangeFreeLookBehavior(PressBehavior), } // TODO: Are these the possible layouts we want? @@ -271,6 +272,11 @@ pub enum ShortcutNumbers { On, Off, } +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub enum PressBehavior { + Toggle = 0, + Hold = 1, +} pub struct Show { ui: bool, @@ -1825,6 +1831,9 @@ impl Hud { settings_window::Event::AdjustWindowSize(new_size) => { events.push(Event::AdjustWindowSize(new_size)); }, + settings_window::Event::ChangeFreeLookBehavior(behavior) => { + events.push(Event::ChangeFreeLookBehavior(behavior)); + }, } } } diff --git a/voxygen/src/hud/settings_window.rs b/voxygen/src/hud/settings_window.rs index 1c63978804..d0aba49fff 100644 --- a/voxygen/src/hud/settings_window.rs +++ b/voxygen/src/hud/settings_window.rs @@ -1,6 +1,6 @@ use super::{ - img_ids::Imgs, BarNumbers, CrosshairType, Intro, ShortcutNumbers, Show, XpBar, MENU_BG, - TEXT_COLOR, + img_ids::Imgs, BarNumbers, CrosshairType, Intro, PressBehavior, ShortcutNumbers, Show, XpBar, + MENU_BG, TEXT_COLOR, }; use crate::{ i18n::{list_localizations, LanguageMetadata, VoxygenLocalization}, @@ -141,7 +141,8 @@ widget_ids! { sct_num_dur_text, sct_num_dur_slider, sct_num_dur_value, - + free_look_behavior_text, + free_look_behavior_list } } @@ -220,6 +221,7 @@ pub enum Event { SctPlayerBatch(bool), SctDamageBatch(bool), ChangeLanguage(LanguageMetadata), + ChangeFreeLookBehavior(PressBehavior), } pub enum ScaleChange { @@ -1254,6 +1256,45 @@ impl<'a> Widget for SettingsWindow<'a> { .graphics_for(state.ids.mouse_y_invert_button) .color(TEXT_COLOR) .set(state.ids.mouse_y_invert_label, ui); + + // Free look behaviour + Text::new( + &self + .localized_strings + .get("hud.settings.free_look_behavior"), + ) + .down_from(state.ids.mouse_zoom_invert_button, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.free_look_behavior_text, ui); + + let mode_label_list = [ + &self + .localized_strings + .get("hud.settings.press_behavior.toggle"), + &self + .localized_strings + .get("hud.settings.press_behavior.hold"), + ]; + + // Get which free look behavior is currently active + let selected = self.global_state.settings.gameplay.free_look_behavior as usize; + + if let Some(clicked) = DropDownList::new(&mode_label_list, Some(selected)) + .w_h(200.0, 30.0) + .color(MENU_BG) + .label_color(TEXT_COLOR) + .label_font_id(self.fonts.cyri.conrod_id) + .down_from(state.ids.free_look_behavior_text, 8.0) + .set(state.ids.free_look_behavior_list, ui) + { + match clicked { + 0 => events.push(Event::ChangeFreeLookBehavior(PressBehavior::Toggle)), + 1 => events.push(Event::ChangeFreeLookBehavior(PressBehavior::Hold)), + _ => unreachable!(), + } + } } // 3) Controls Tab -------------------------------- @@ -1367,6 +1408,9 @@ impl<'a> Widget for SettingsWindow<'a> { {}\n\ \n\ \n\ + {}\n\ + \n\ + \n\ \n\ \n\ \n\ @@ -1417,6 +1461,7 @@ impl<'a> Widget for SettingsWindow<'a> { controls.bag, controls.enter, "Mouse Wheel", // Scroll chat + controls.free_look )) .color(TEXT_COLOR) .right_from(state.ids.controls_text, 0.0) diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index 5e9d46b6fb..335b06b21d 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -1,6 +1,6 @@ use crate::{ ecs::MyEntity, - hud::{DebugInfo, Event as HudEvent, Hud}, + hud::{DebugInfo, Event as HudEvent, Hud, PressBehavior}, i18n::{i18n_asset_key, VoxygenLocalization}, key_state::KeyState, menu::char_selection::CharSelectionState, @@ -402,9 +402,18 @@ impl PlayState for SessionState { Event::InputUpdate(GameInput::Charge, state) => { self.inputs.charge.set_state(state); }, - Event::InputUpdate(GameInput::FreeLook, true) => { - free_look = !free_look; - self.hud.free_look(free_look); + Event::InputUpdate(GameInput::FreeLook, state) => { + match (global_state.settings.gameplay.free_look_behavior, state) { + (PressBehavior::Toggle, true) => { + free_look = !free_look; + self.hud.free_look(free_look); + }, + (PressBehavior::Hold, state) => { + free_look = state; + self.hud.free_look(free_look); + }, + _ => {}, + }; }, Event::AnalogGameInput(input) => match input { AnalogGameInput::MovementX(v) => { @@ -681,6 +690,9 @@ impl PlayState for SessionState { global_state.settings.graphics.window_size = new_size; global_state.settings.save_to_file_warn(); }, + HudEvent::ChangeFreeLookBehavior(behavior) => { + global_state.settings.gameplay.free_look_behavior = behavior; + }, } } diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index 5f47300544..a8ce79e0b4 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -1,5 +1,5 @@ use crate::{ - hud::{BarNumbers, CrosshairType, Intro, ShortcutNumbers, XpBar}, + hud::{BarNumbers, CrosshairType, Intro, PressBehavior, ShortcutNumbers, XpBar}, i18n, render::{AaMode, CloudMode, FluidMode}, ui::ScaleMode, @@ -102,7 +102,7 @@ impl Default for ControlSettings { interact: KeyMouse::Mouse(MouseButton::Right), toggle_wield: KeyMouse::Key(VirtualKeyCode::T), charge: KeyMouse::Key(VirtualKeyCode::Key1), - free_look: KeyMouse::Key(VirtualKeyCode::LAlt), + free_look: KeyMouse::Key(VirtualKeyCode::L), } } } @@ -346,6 +346,7 @@ pub struct GameplaySettings { pub shortcut_numbers: ShortcutNumbers, pub bar_numbers: BarNumbers, pub ui_scale: ScaleMode, + pub free_look_behavior: PressBehavior, } impl Default for GameplaySettings { @@ -367,6 +368,7 @@ impl Default for GameplaySettings { shortcut_numbers: ShortcutNumbers::On, bar_numbers: BarNumbers::Off, ui_scale: ScaleMode::RelativeToWindow([1920.0, 1080.0].into()), + free_look_behavior: PressBehavior::Toggle, } } }