mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Adds simple auto walk functionality. Toggleable or push to hold
This commit is contained in:
parent
8c68d7aace
commit
458ac4af5e
@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- Character name and level information to chat, social tab and `/players` command.
|
||||
- Added inventory, armour and weapon saving
|
||||
- Show where screenshots are saved to in the chat
|
||||
- Added basic auto walk
|
||||
|
||||
### Changed
|
||||
|
||||
|
@ -264,6 +264,8 @@ magically infused items?"#,
|
||||
"hud.settings.invert_mouse_y_axis": "Invert Mouse Y Axis",
|
||||
"hud.settings.enable_mouse_smoothing": "Camera Smoothing",
|
||||
"hud.settings.free_look_behavior": "Free look behavior",
|
||||
"hud.settings.auto_walk_behavior": "Auto walk behavior",
|
||||
"hud.settings.stop_auto_walk_on_input": "Stop auto walk on movement",
|
||||
|
||||
"hud.settings.view_distance": "View Distance",
|
||||
"hud.settings.sprites_view_distance": "Sprites View Distance",
|
||||
@ -296,6 +298,7 @@ magically infused items?"#,
|
||||
"hud.spell": "Spells",
|
||||
|
||||
"hud.free_look_indicator": "Free look active",
|
||||
"hud.auto_walk_indicator": "Auto walk active",
|
||||
|
||||
/// End HUD section
|
||||
|
||||
@ -348,6 +351,7 @@ magically infused items?"#,
|
||||
"gameinput.togglewield": "Toggle Wield",
|
||||
"gameinput.interact": "Interact",
|
||||
"gameinput.freelook": "Free Look",
|
||||
"gameinput.autowalk": "Auto Walk",
|
||||
|
||||
/// End GameInput section
|
||||
|
||||
|
@ -184,6 +184,10 @@ widget_ids! {
|
||||
free_look_txt,
|
||||
free_look_bg,
|
||||
|
||||
// Auto walk indicator
|
||||
auto_walk_txt,
|
||||
auto_walk_bg,
|
||||
|
||||
// Example Quest
|
||||
quest_bg,
|
||||
q_headline_bg,
|
||||
@ -255,6 +259,8 @@ pub enum Event {
|
||||
ChangeLanguage(LanguageMetadata),
|
||||
ChangeBinding(GameInput),
|
||||
ChangeFreeLookBehavior(PressBehavior),
|
||||
ChangeAutoWalkBehavior(PressBehavior),
|
||||
ChangeStopAutoWalkOnInput(bool),
|
||||
}
|
||||
|
||||
// TODO: Are these the possible layouts we want?
|
||||
@ -319,6 +325,7 @@ pub struct Show {
|
||||
want_grab: bool,
|
||||
stats: bool,
|
||||
free_look: bool,
|
||||
auto_walk: bool,
|
||||
}
|
||||
impl Show {
|
||||
fn bag(&mut self, open: bool) {
|
||||
@ -522,6 +529,7 @@ impl Hud {
|
||||
ingame: true,
|
||||
stats: false,
|
||||
free_look: false,
|
||||
auto_walk: false,
|
||||
},
|
||||
to_focus: None,
|
||||
//never_show: false,
|
||||
@ -1677,6 +1685,12 @@ impl Hud {
|
||||
settings_window::Event::ChangeFreeLookBehavior(behavior) => {
|
||||
events.push(Event::ChangeFreeLookBehavior(behavior));
|
||||
},
|
||||
settings_window::Event::ChangeAutoWalkBehavior(behavior) => {
|
||||
events.push(Event::ChangeAutoWalkBehavior(behavior));
|
||||
},
|
||||
settings_window::Event::ChangeStopAutoWalkOnInput(state) => {
|
||||
events.push(Event::ChangeStopAutoWalkOnInput(state));
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1795,6 +1809,25 @@ impl Hud {
|
||||
.set(self.ids.free_look_txt, ui_widgets);
|
||||
}
|
||||
|
||||
// Auto walk indicator
|
||||
if self.show.auto_walk {
|
||||
Text::new(&self.voxygen_i18n.get("hud.auto_walk_indicator"))
|
||||
.color(TEXT_BG)
|
||||
.mid_top_with_margin_on(
|
||||
ui_widgets.window,
|
||||
if self.show.free_look { 128.0 } else { 100.0 },
|
||||
)
|
||||
.font_id(self.fonts.cyri.conrod_id)
|
||||
.font_size(self.fonts.cyri.scale(20))
|
||||
.set(self.ids.auto_walk_bg, ui_widgets);
|
||||
Text::new(&self.voxygen_i18n.get("hud.auto_walk_indicator"))
|
||||
.color(KILL_COLOR)
|
||||
.top_left_with_margins_on(self.ids.auto_walk_bg, -1.0, -1.0)
|
||||
.font_id(self.fonts.cyri.conrod_id)
|
||||
.font_size(self.fonts.cyri.scale(20))
|
||||
.set(self.ids.auto_walk_txt, ui_widgets);
|
||||
}
|
||||
|
||||
// Maintain slot manager
|
||||
for event in self.slot_manager.maintain(ui_widgets) {
|
||||
use comp::slot::Slot;
|
||||
@ -2155,4 +2188,6 @@ impl Hud {
|
||||
}
|
||||
|
||||
pub fn free_look(&mut self, free_look: bool) { self.show.free_look = free_look; }
|
||||
|
||||
pub fn auto_walk(&mut self, auto_walk: bool) { self.show.auto_walk = auto_walk; }
|
||||
}
|
||||
|
@ -156,7 +156,11 @@ widget_ids! {
|
||||
speech_bubble_dark_mode_text,
|
||||
speech_bubble_dark_mode_button,
|
||||
free_look_behavior_text,
|
||||
free_look_behavior_list
|
||||
free_look_behavior_list,
|
||||
auto_walk_behavior_text,
|
||||
auto_walk_behavior_list,
|
||||
stop_auto_walk_on_input_button,
|
||||
stop_auto_walk_on_input_label,
|
||||
}
|
||||
}
|
||||
|
||||
@ -240,6 +244,8 @@ pub enum Event {
|
||||
ChangeLanguage(LanguageMetadata),
|
||||
ChangeBinding(GameInput),
|
||||
ChangeFreeLookBehavior(PressBehavior),
|
||||
ChangeAutoWalkBehavior(PressBehavior),
|
||||
ChangeStopAutoWalkOnInput(bool),
|
||||
}
|
||||
|
||||
pub enum ScaleChange {
|
||||
@ -1344,6 +1350,69 @@ impl<'a> Widget for SettingsWindow<'a> {
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
// Auto walk behavior
|
||||
Text::new(
|
||||
&self
|
||||
.localized_strings
|
||||
.get("hud.settings.auto_walk_behavior"),
|
||||
)
|
||||
.down_from(state.ids.mouse_zoom_invert_button, 10.0)
|
||||
.right_from(state.ids.free_look_behavior_text, 150.0)
|
||||
.font_size(self.fonts.cyri.scale(14))
|
||||
.font_id(self.fonts.cyri.conrod_id)
|
||||
.color(TEXT_COLOR)
|
||||
.set(state.ids.auto_walk_behavior_text, ui);
|
||||
|
||||
let auto_walk_selected =
|
||||
self.global_state.settings.gameplay.auto_walk_behavior as usize;
|
||||
|
||||
if let Some(clicked) = DropDownList::new(&mode_label_list, Some(auto_walk_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.auto_walk_behavior_text, 8.0)
|
||||
.set(state.ids.auto_walk_behavior_list, ui)
|
||||
{
|
||||
match clicked {
|
||||
0 => events.push(Event::ChangeAutoWalkBehavior(PressBehavior::Toggle)),
|
||||
1 => events.push(Event::ChangeAutoWalkBehavior(PressBehavior::Hold)),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
// Stop autowalk on input toggle
|
||||
let stop_auto_walk_on_input_toggle = ToggleButton::new(
|
||||
self.global_state.settings.gameplay.stop_auto_walk_on_input,
|
||||
self.imgs.checkbox,
|
||||
self.imgs.checkbox_checked,
|
||||
)
|
||||
.w_h(18.0, 18.0)
|
||||
.right_from(state.ids.auto_walk_behavior_text, 80.0)
|
||||
.hover_images(self.imgs.checkbox_mo, self.imgs.checkbox_checked_mo)
|
||||
.press_images(self.imgs.checkbox_press, self.imgs.checkbox_checked)
|
||||
.set(state.ids.stop_auto_walk_on_input_button, ui);
|
||||
|
||||
if self.global_state.settings.gameplay.stop_auto_walk_on_input
|
||||
!= stop_auto_walk_on_input_toggle
|
||||
{
|
||||
events.push(Event::ChangeStopAutoWalkOnInput(
|
||||
!self.global_state.settings.gameplay.stop_auto_walk_on_input,
|
||||
));
|
||||
}
|
||||
|
||||
Text::new(
|
||||
&self
|
||||
.localized_strings
|
||||
.get("hud.settings.stop_auto_walk_on_input"),
|
||||
)
|
||||
.right_from(state.ids.stop_auto_walk_on_input_button, 10.0)
|
||||
.font_size(self.fonts.cyri.scale(14))
|
||||
.font_id(self.fonts.cyri.conrod_id)
|
||||
.graphics_for(state.ids.stop_auto_walk_on_input_button)
|
||||
.color(TEXT_COLOR)
|
||||
.set(state.ids.stop_auto_walk_on_input_label, ui);
|
||||
}
|
||||
|
||||
// 3) Controls Tab --------------------------------
|
||||
|
@ -10,6 +10,7 @@ pub struct KeyState {
|
||||
pub toggle_wield: bool,
|
||||
pub toggle_sit: bool,
|
||||
pub toggle_dance: bool,
|
||||
pub auto_walk: bool,
|
||||
pub swap_loadout: bool,
|
||||
pub respawn: bool,
|
||||
pub analog_matrix: Vec2<f32>,
|
||||
@ -27,6 +28,7 @@ impl KeyState {
|
||||
toggle_wield: false,
|
||||
toggle_sit: false,
|
||||
toggle_dance: false,
|
||||
auto_walk: false,
|
||||
swap_loadout: false,
|
||||
respawn: false,
|
||||
analog_matrix: Vec2::zero(),
|
||||
@ -37,7 +39,8 @@ impl KeyState {
|
||||
let dir = if self.analog_matrix == Vec2::zero() {
|
||||
Vec2::<f32>::new(
|
||||
if self.right { 1.0 } else { 0.0 } + if self.left { -1.0 } else { 0.0 },
|
||||
if self.up { 1.0 } else { 0.0 } + if self.down { -1.0 } else { 0.0 },
|
||||
if self.up || self.auto_walk { 1.0 } else { 0.0 }
|
||||
+ if self.down { -1.0 } else { 0.0 },
|
||||
)
|
||||
} else {
|
||||
self.analog_matrix
|
||||
|
@ -142,6 +142,13 @@ impl PlayState for SessionState {
|
||||
|
||||
let mut ori = self.scene.camera().get_orientation();
|
||||
let mut free_look = false;
|
||||
let mut auto_walk = false;
|
||||
|
||||
fn stop_auto_walk(auto_walk: &mut bool, key_state: &mut KeyState, hud: &mut Hud) {
|
||||
*auto_walk = false;
|
||||
hud.auto_walk(false);
|
||||
key_state.auto_walk = false;
|
||||
}
|
||||
|
||||
// Game loop
|
||||
let mut current_client_state = self.client.borrow().get_client_state();
|
||||
@ -309,6 +316,7 @@ impl PlayState for SessionState {
|
||||
{
|
||||
self.key_state.toggle_sit = state;
|
||||
if state {
|
||||
stop_auto_walk(&mut auto_walk, &mut self.key_state, &mut self.hud);
|
||||
self.client.borrow_mut().toggle_sit();
|
||||
}
|
||||
}
|
||||
@ -317,13 +325,34 @@ impl PlayState for SessionState {
|
||||
{
|
||||
self.key_state.toggle_dance = state;
|
||||
if state {
|
||||
stop_auto_walk(&mut auto_walk, &mut self.key_state, &mut self.hud);
|
||||
self.client.borrow_mut().toggle_dance();
|
||||
}
|
||||
}
|
||||
Event::InputUpdate(GameInput::MoveForward, state) => self.key_state.up = state,
|
||||
Event::InputUpdate(GameInput::MoveBack, state) => self.key_state.down = state,
|
||||
Event::InputUpdate(GameInput::MoveLeft, state) => self.key_state.left = state,
|
||||
Event::InputUpdate(GameInput::MoveRight, state) => self.key_state.right = state,
|
||||
Event::InputUpdate(GameInput::MoveForward, state) => {
|
||||
if state && global_state.settings.gameplay.stop_auto_walk_on_input {
|
||||
stop_auto_walk(&mut auto_walk, &mut self.key_state, &mut self.hud);
|
||||
}
|
||||
self.key_state.up = state
|
||||
},
|
||||
Event::InputUpdate(GameInput::MoveBack, state) => {
|
||||
if state && global_state.settings.gameplay.stop_auto_walk_on_input {
|
||||
stop_auto_walk(&mut auto_walk, &mut self.key_state, &mut self.hud);
|
||||
}
|
||||
self.key_state.down = state
|
||||
},
|
||||
Event::InputUpdate(GameInput::MoveLeft, state) => {
|
||||
if state && global_state.settings.gameplay.stop_auto_walk_on_input {
|
||||
stop_auto_walk(&mut auto_walk, &mut self.key_state, &mut self.hud);
|
||||
}
|
||||
self.key_state.left = state
|
||||
},
|
||||
Event::InputUpdate(GameInput::MoveRight, state) => {
|
||||
if state && global_state.settings.gameplay.stop_auto_walk_on_input {
|
||||
stop_auto_walk(&mut auto_walk, &mut self.key_state, &mut self.hud);
|
||||
}
|
||||
self.key_state.right = state
|
||||
},
|
||||
Event::InputUpdate(GameInput::Glide, state) => {
|
||||
self.inputs.glide.set_state(state);
|
||||
},
|
||||
@ -442,6 +471,21 @@ impl PlayState for SessionState {
|
||||
_ => {},
|
||||
};
|
||||
},
|
||||
Event::InputUpdate(GameInput::AutoWalk, state) => {
|
||||
match (global_state.settings.gameplay.auto_walk_behavior, state) {
|
||||
(PressBehavior::Toggle, true) => {
|
||||
auto_walk = !auto_walk;
|
||||
self.key_state.auto_walk = auto_walk;
|
||||
self.hud.auto_walk(auto_walk);
|
||||
},
|
||||
(PressBehavior::Hold, state) => {
|
||||
auto_walk = state;
|
||||
self.key_state.auto_walk = auto_walk;
|
||||
self.hud.auto_walk(auto_walk);
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
},
|
||||
Event::AnalogGameInput(input) => match input {
|
||||
AnalogGameInput::MovementX(v) => {
|
||||
self.key_state.analog_matrix.x = v;
|
||||
@ -767,6 +811,12 @@ impl PlayState for SessionState {
|
||||
HudEvent::ChangeFreeLookBehavior(behavior) => {
|
||||
global_state.settings.gameplay.free_look_behavior = behavior;
|
||||
},
|
||||
HudEvent::ChangeAutoWalkBehavior(behavior) => {
|
||||
global_state.settings.gameplay.auto_walk_behavior = behavior;
|
||||
},
|
||||
HudEvent::ChangeStopAutoWalkOnInput(state) => {
|
||||
global_state.settings.gameplay.stop_auto_walk_on_input = state;
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,6 +140,7 @@ impl ControlSettings {
|
||||
GameInput::ToggleWield => KeyMouse::Key(VirtualKeyCode::T),
|
||||
//GameInput::Charge => KeyMouse::Key(VirtualKeyCode::Key1),
|
||||
GameInput::FreeLook => KeyMouse::Key(VirtualKeyCode::L),
|
||||
GameInput::AutoWalk => KeyMouse::Key(VirtualKeyCode::Period),
|
||||
GameInput::Slot1 => KeyMouse::Key(VirtualKeyCode::Key1),
|
||||
GameInput::Slot2 => KeyMouse::Key(VirtualKeyCode::Key2),
|
||||
GameInput::Slot3 => KeyMouse::Key(VirtualKeyCode::Key3),
|
||||
@ -200,6 +201,7 @@ impl Default for ControlSettings {
|
||||
GameInput::ToggleWield,
|
||||
//GameInput::Charge,
|
||||
GameInput::FreeLook,
|
||||
GameInput::AutoWalk,
|
||||
GameInput::Slot1,
|
||||
GameInput::Slot2,
|
||||
GameInput::Slot3,
|
||||
@ -467,6 +469,8 @@ pub struct GameplaySettings {
|
||||
pub bar_numbers: BarNumbers,
|
||||
pub ui_scale: ScaleMode,
|
||||
pub free_look_behavior: PressBehavior,
|
||||
pub auto_walk_behavior: PressBehavior,
|
||||
pub stop_auto_walk_on_input: bool,
|
||||
}
|
||||
|
||||
impl Default for GameplaySettings {
|
||||
@ -491,6 +495,8 @@ impl Default for GameplaySettings {
|
||||
bar_numbers: BarNumbers::Off,
|
||||
ui_scale: ScaleMode::RelativeToWindow([1920.0, 1080.0].into()),
|
||||
free_look_behavior: PressBehavior::Toggle,
|
||||
auto_walk_behavior: PressBehavior::Toggle,
|
||||
stop_auto_walk_on_input: true,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -63,6 +63,7 @@ pub enum GameInput {
|
||||
//Charge,
|
||||
SwapLoadout,
|
||||
FreeLook,
|
||||
AutoWalk,
|
||||
}
|
||||
|
||||
impl GameInput {
|
||||
@ -104,6 +105,7 @@ impl GameInput {
|
||||
GameInput::ToggleWield => "gameinput.togglewield",
|
||||
//GameInput::Charge => "gameinput.charge",
|
||||
GameInput::FreeLook => "gameinput.freelook",
|
||||
GameInput::AutoWalk => "gameinput.autowalk",
|
||||
GameInput::Slot1 => "gameinput.slot1",
|
||||
GameInput::Slot2 => "gameinput.slot2",
|
||||
GameInput::Slot3 => "gameinput.slot3",
|
||||
|
Loading…
Reference in New Issue
Block a user