From 7051720d1226e8d190e21db0521e3693880d4a77 Mon Sep 17 00:00:00 2001 From: Joey Maher Date: Sat, 6 Jun 2020 13:09:01 -0500 Subject: [PATCH 1/3] Adds simple auto walk functionality. Toggleable or push to hold --- CHANGELOG.md | 1 + assets/voxygen/i18n/en.ron | 4 ++ voxygen/src/hud/mod.rs | 35 +++++++++++++++ voxygen/src/hud/settings_window.rs | 71 +++++++++++++++++++++++++++++- voxygen/src/key_state.rs | 5 ++- voxygen/src/session.rs | 58 ++++++++++++++++++++++-- voxygen/src/settings.rs | 6 +++ voxygen/src/window.rs | 2 + 8 files changed, 176 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3d2e299df..2eba85b7c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/assets/voxygen/i18n/en.ron b/assets/voxygen/i18n/en.ron index ff4ed07b8c..04f30c9a16 100644 --- a/assets/voxygen/i18n/en.ron +++ b/assets/voxygen/i18n/en.ron @@ -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 diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index adab3db211..7b5770395b 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -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; } } diff --git a/voxygen/src/hud/settings_window.rs b/voxygen/src/hud/settings_window.rs index df81814a16..e3fc95b383 100644 --- a/voxygen/src/hud/settings_window.rs +++ b/voxygen/src/hud/settings_window.rs @@ -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 -------------------------------- diff --git a/voxygen/src/key_state.rs b/voxygen/src/key_state.rs index e2ebc8e703..91fbaf1583 100644 --- a/voxygen/src/key_state.rs +++ b/voxygen/src/key_state.rs @@ -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, @@ -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::::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 diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index fb4fd12f8a..e6d981b4be 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -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; + }, } } diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index 5ae6d87294..140ca54732 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -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, } } } diff --git a/voxygen/src/window.rs b/voxygen/src/window.rs index 78f60f3db2..70db080825 100644 --- a/voxygen/src/window.rs +++ b/voxygen/src/window.rs @@ -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", From d43ae06e0055fa60ac664a64e54ac6a9124e24cd Mon Sep 17 00:00:00 2001 From: Pfauenauge90 <44173739+Pfauenauge90@users.noreply.github.com> Date: Sat, 6 Jun 2020 21:29:35 +0200 Subject: [PATCH 2/3] update default keybindings file, en.ron, de_DE.ron --- assets/voxygen/element/help.png | Bin 15596 -> 16021 bytes assets/voxygen/i18n/de_DE.ron | 3 ++- assets/voxygen/i18n/en.ron | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/voxygen/element/help.png b/assets/voxygen/element/help.png index a4d3611943259e35adc756889970737358e743bb..eb357419e792238156cf6368bc409328673b0516 100644 GIT binary patch literal 16021 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 B7gPWM literal 15596 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

EEH9q1Yw+SR}0m@bSYLgCX+v+c~W-JKPcqy?Et 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 diff --git a/assets/voxygen/i18n/de_DE.ron b/assets/voxygen/i18n/de_DE.ron index 979379fbab..df54b77e7d 100644 --- a/assets/voxygen/i18n/de_DE.ron +++ b/assets/voxygen/i18n/de_DE.ron @@ -347,7 +347,8 @@ magischen Gegenstände ergattern?"#, "gameinput.charge": "Anstürmen", "gameinput.togglewield": "Waffe ziehen/wegstecken", "gameinput.interact": "Interagieren", - "gameinput.freelook": "Freie Sicht", + "gameinput.freelook": "Freie Sicht", + "gameinput.autowalk": "Automatisch Laufen", "gameinput.dance": "Tanzen", /// End GameInput section diff --git a/assets/voxygen/i18n/en.ron b/assets/voxygen/i18n/en.ron index 04f30c9a16..cc2da69520 100644 --- a/assets/voxygen/i18n/en.ron +++ b/assets/voxygen/i18n/en.ron @@ -352,6 +352,7 @@ magically infused items?"#, "gameinput.interact": "Interact", "gameinput.freelook": "Free Look", "gameinput.autowalk": "Auto Walk", + "gameinput.dance": "Dance", /// End GameInput section From 5b579105750e99339d2db2f80b068265bf0992a5 Mon Sep 17 00:00:00 2001 From: Pfauenauge90 <44173739+Pfauenauge90@users.noreply.github.com> Date: Sat, 6 Jun 2020 21:46:53 +0200 Subject: [PATCH 3/3] Added spanish translation file --- assets/voxygen/i18n/es_ES.ron | 439 ++++++++++++++++++++++++++++++++++ 1 file changed, 439 insertions(+) create mode 100644 assets/voxygen/i18n/es_ES.ron diff --git a/assets/voxygen/i18n/es_ES.ron b/assets/voxygen/i18n/es_ES.ron new file mode 100644 index 0000000000..bede5e50c4 --- /dev/null +++ b/assets/voxygen/i18n/es_ES.ron @@ -0,0 +1,439 @@ +/// Translation document instructions +/// +/// In order to keep localization documents readible please follow the following +/// rules: +/// - separate the string map sections using a commentary describing the purpose +/// of the next section +/// - prepend multi-line strings with a commentary +/// - append one blank lines after a multi-line strings and two after sections +/// +/// To add a new language in Veloren, just write an additional `.ron` file in +/// `assets/voxygen/i18n` and that's it! +/// +/// Localization for Spanish (Spain) + +VoxygenLocalization( + metadata: ( + language_name: "Español de España", + language_identifier: "es_ES", + ), + convert_utf8_to_ascii: false, + fonts: { + "opensans": Font ( + asset_key: "voxygen.font.OpenSans-Regular", + scale_ratio: 1.0, + ), + "metamorph": Font ( + asset_key: "voxygen.font.Metamorphous-Regular", + scale_ratio: 1.0, + ), + "alkhemi": Font ( + asset_key: "voxygen.font.Alkhemikal", + scale_ratio: 1.0, + ), + "wizard": Font ( + asset_key: "voxygen.font.wizard", + scale_ratio: 1.0, + ), + "cyri": Font ( + asset_key: "voxygen.font.haxrcorp_4089_cyrillic_altgr_extended", + scale_ratio: 1.0, + ), + }, + string_map: { + /// Start Common section + // Texts used in multiple locations with the same formatting + "common.username": "Usuario", + "common.singleplayer": "Solo", + "common.multiplayer": "Multijugador", + "common.servers": "Servidores", + "common.quit": "Salir", + "common.settings": "Opciones", + "common.languages": "Idiomas", + "common.interface": "Interfaz", + "common.gameplay": "Juego", + "common.controls": "Controles", + "common.video": "Gráficos", + "common.sound": "Sonido", + "common.resume": "Continuar", + "common.characters": "Personajes", + "common.close": "Cerrar", + "common.yes": "Sí", + "common.no": "No", + "common.back": "Atrás", + "common.create": "Crear", + "common.okay": "Okay", + "common.accept": "Aceptar", + "common.disclaimer": "Atención", + "common.cancel": "Cancelar", + "common.none": "Ninguno", + "common.error": "Error", + "common.fatal_error": "Error Fatal", + + // Message when connection to the server is lost + "common.connection_lost": r#"¡Conexión perdida! +¿Se reinició el servidor? +¿Está el cliente actualizado?"#, + + + "common.species.orc": "Orco", + "common.species.human": "Humano", + "common.species.dwarf": "Enano", + "common.species.elf": "Elfo", + "common.species.undead": "No muerto", + "common.species.danari": "Danari", + + "common.weapons.axe": "Hacha", + "common.weapons.sword": "Espada", + "common.weapons.staff": "Bastón", + "common.weapons.bow": "Arco", + "common.weapons.hammer": "Martillo", + /// End Common section + + + /// Start Main screen section + "main.connecting": "Conectando", + "main.creating_world": "Creando mundo", + + // Welcome notice that appears the first time Veloren is started + "main.notice": r#"¡Bienvenido a la versión alfa de Veloren! + +Antes de que te adentres en la diversión, por favor ten en cuenta un par de cosas: + +- Esto es una alfa muy temprana. Espera errores, mecánicas de juego extremadamente sin terminar, mecánicas sin pulir, y características que faltan. + +- Si tienes feedback constructivo o reportes de error, puedes contactar con nosotros vía Reddit, GitLab, o nuestro servidor de Discord comunitario. + +- Veloren se licencia bajo la licencia de código abierto GPL 3. Esto quiere decir que eres libre para jugar, modificar y redistribuir el juego tal y como desees (siempre y cuando tal trabajo se licencie también bajo la GPL 3). + +- Veloren es un proyecto comunitario sin ánimo de lucro, y todo aquel que trabaja en él es un voluntario. +Si te gusta lo que ves, ¡eres bienvenido de unirte a los equipos de desarrollo o arte! + +Gracias por tomarte el tiempo de leer esta noticia, ¡esperamos que disfrutes del juego! + +~ Los desarrolladores de Veloren"#, + + // Login process description + "main.login_process": r#"Información sobre el proceso de login: + +Si estás experimentando problemas para autenticarte: + +Por favor, ten en cuenta que ahora necesitas una cuenta +para jugar en servidores con autenticación activada. + +Puedes crear una cuenta en + +https://account.veloren.net."#, + "main.login.server_not_found": "Servidor no encontrado", + "main.login.authentication_error": "Error de autenticación al servidor", + "main.login.server_full": "El servidor está lleno", + "main.login.untrusted_auth_server": "Servidor con autenticación sin confianza", + "main.login.outdated_client_or_server": "ServerEnloquecido: Probablemente las versiones son incompatibles, revisa si hay actualizaciones.", + "main.login.timeout": "Timeout: El servidor no respondió a tiempo. (Sobrecargado o con problemas de red).", + "main.login.server_shut_down": "Servidor apagado", + "main.login.already_logged_in": "Ya estás accediendo al servidor.", + "main.login.network_error": "Error de red", + "main.login.failed_sending_request": "Petición al servidor de autenticación fallida", + "main.login.invalid_character": "El personaje seleccionado no es válido", + "main.login.client_crashed": "El cliente se cerró inesperadamente", + + /// End Main screen section + + + /// Start HUD Section + "hud.do_not_show_on_startup": "No muestres esto al inicio", + "hud.show_tips": "Mostrar ayuda", + "hud.quests": "Misiones", + "hud.you_died": "Has muerto", + "hud.waypoint_saved": "Punto de ruta guardado", + + "hud.press_key_to_show_keybindings_fmt": "Pulsa {key} para mostrar atajos de teclado", + "hud.press_key_to_show_debug_info_fmt": "Pulsa {key} para mostrar información de depuración", + "hud.press_key_to_toggle_keybindings_fmt": "Pulsa {key} para alternar los atajos de teclado", + "hud.press_key_to_toggle_debug_info_fmt": "Pulsa {key} para alternar la información de depuración", + + // Respawn message + "hud.press_key_to_respawn": r#"Pulsa {key} para reaparecer en el último campamento que visitaste."#, + + // Welcome message + "hud.welcome": r#"¡Bienvenido a la alfa de Veloren! + + +Algunos consejos antes de empezar: + + +Pulsa F1 para ver los comandos disponibles. + +Escribe /help en el chat para ver los comandos de chat + + +¡Cofres y otros objetos aparecen aleatoriamente en el mundo! + +Click derecho para recogerlos. + +Para utilizar lo que recojas de esos cofres, abre tu inventario con 'B'. + +Haz doble click sobre los objetos en tu inventario para usarlos o equipártelos. + +Deshazte de ellos haciendo click una vez sobre ellos y haciendo click fuera del inventario + + +Las noches pueden ser muy oscuras en Veloren. + +Enciende tu linterna pulsando 'G' + + +¿Quieres liberar tu cursor para cerrar esta ventana? ¡Pulsa TAB! + + +Disfruta de tu estancia en el mundo de Veloren."#, + +"hud.temp_quest_headline": r#"¡Por favor, ayúdanos Viajero!"#, +"hud.temp_quest_text": r#"¡Mazmorras llenas de fanáticos +han emergido en cada rincón de nuestras pacíficas ciudades! + + +Encuentra algo de compañía, acumula comida +y derrota a sus viles líderes y acólitos. + + +¿Quizás podrías obtener incluso uno de sus +objetos imbuidos de magia?"#, + + + + // Inventory + "hud.bag.inventory": "Inventario de {playername}", + "hud.bag.stats_title": "Atributos de {playername}", + "hud.bag.exp": "Exp", + "hud.bag.armor": "Armadura", + "hud.bag.stats": "Atributos", + "hud.bag.head": "Cabeza", + "hud.bag.neck": "Cuello", + "hud.bag.tabard": "Tabardo", + "hud.bag.shoulders": "Hombros", + "hud.bag.chest": "Pecho", + "hud.bag.hands": "Manos", + "hud.bag.lantern": "Linterna", + "hud.bag.belt": "Cinturón", + "hud.bag.ring": "Anillo", + "hud.bag.back": "Espalda", + "hud.bag.legs": "Piernas", + "hud.bag.feet": "Pies", + "hud.bag.mainhand": "Mano principal", + "hud.bag.offhand": "Mano secundaria", + + + // Map and Questlog + "hud.map.map_title": "Mapa", + "hud.map.qlog_title": "Misiones", + + // Settings + "hud.settings.general": "General", + "hud.settings.none": "Ninguno", + "hud.settings.press_behavior.toggle": "Alternar", + "hud.settings.press_behavior.hold": "Mantener", + "hud.settings.help_window": "Ventana de ayuda", + "hud.settings.debug_info": "Información de depuración", + "hud.settings.tips_on_startup": "Consejos-Al-Iniciar", + "hud.settings.ui_scale": "Escala-IU", + "hud.settings.relative_scaling": "Escala relativa", + "hud.settings.custom_scaling": "Escala personalizada", + "hud.settings.crosshair": "Punto de mira", + "hud.settings.transparency": "Transparencia", + "hud.settings.hotbar": "Barra rápida", + "hud.settings.toggle_shortcuts": "Alternar atajos", + "hud.settings.toggle_bar_experience": "Alternar barra de experiencia", + "hud.settings.scrolling_combat_text": "Texto de combate deslizante", + "hud.settings.single_damage_number": "Números de daño único", + "hud.settings.cumulated_damage": "Daño acumulado", + "hud.settings.incoming_damage": "Daño inminente", + "hud.settings.cumulated_incoming_damage": "Daño inminente acumulado", + "hud.settings.speech_bubble_dark_mode": "Modo oscuro de burbuja de diálogo", + "hud.settings.energybar_numbers": "Números de barra de energía", + "hud.settings.values": "Valores", + "hud.settings.percentages": "Porcentaje", + "hud.settings.chat": "Chat", + "hud.settings.background_transparency": "Transparencia del fondo", + + "hud.settings.pan_sensitivity": "Sensibilidad de paneo", + "hud.settings.zoom_sensitivity": "Sensibilidad de zoom", + "hud.settings.invert_scroll_zoom": "Invertir el deslizamiento del zoom", + "hud.settings.invert_mouse_y_axis": "Invertir eje Y del ratón", + "hud.settings.enable_mouse_smoothing": "Suavizado de cámara", + "hud.settings.free_look_behavior": "Comportamiento de vista libre", + + "hud.settings.view_distance": "Ver distancia", + "hud.settings.sprites_view_distance": "Distancia de visión de sprites", + "hud.settings.figures_view_distance": "Distancia de visión de entidades", + "hud.settings.maximum_fps": "FPS máximos", + "hud.settings.fov": "Campo de visión (grados)", + "hud.settings.gamma": "Gamma", + "hud.settings.antialiasing_mode": "Modo AntiAliasing", + "hud.settings.cloud_rendering_mode": "Modo renderizado de nubes", + "hud.settings.fluid_rendering_mode": "Modo de renderizado fluido", + "hud.settings.fluid_rendering_mode.cheap": "Barato", + "hud.settings.fluid_rendering_mode.shiny": "Brillante", + "hud.settings.cloud_rendering_mode.regular": "Regular", + "hud.settings.fullscreen": "Pantalla completa", + "hud.settings.save_window_size": "Guardar tamaño de ventana", + + "hud.settings.music_volume": "Volumen de música", + "hud.settings.sound_effect_volume": "Volumen de efectos de sonido", + "hud.settings.audio_device": "Dispositivo de audio", + + "hud.settings.awaitingkey": "Pulsa una tecla...", + + "hud.social": "Social", + "hud.social.online": "Conectado", + "hud.social.friends": "Amigos", + "hud.social.not_yet_available": "No disponible todavía", + "hud.social.faction": "Facción", + "hud.social.play_online_fmt": "{nb_player} jugador(es) conectados", + + "hud.spell": "Hechizos", + + "hud.free_look_indicator": "Vista libre activa", + + /// End HUD section + + + /// Start GameInput section + + "gameinput.primary": "Ataque básico", + "gameinput.secondary": "Ataque secundario/Bloquear/Apuntar", + "gameinput.slot1": "Ranura 1 de barra rápida", + "gameinput.slot2": "Ranura 2 de barra rápida", + "gameinput.slot3": "Ranura 3 de barra rápida", + "gameinput.slot4": "Ranura 4 de barra rápida", + "gameinput.slot5": "Ranura 5 de barra rápida", + "gameinput.slot6": "Ranura 6 de barra rápida", + "gameinput.slot7": "Ranura 7 de barra rápida", + "gameinput.slot8": "Ranura 8 de barra rápida", + "gameinput.slot9": "Ranura 9 de barra rápida", + "gameinput.slot10": "Ranura 10 de barra rápida", + "gameinput.swaploadout": "Intercambiar armamento", + "gameinput.togglecursor": "Alternar cursor", + "gameinput.help": "Alternar ventana de ayuda", + "gameinput.toggleinterface": "Alternar interfaz", + "gameinput.toggledebug": "Alternar FPS e información de depuración", + "gameinput.screenshot": "Tomar captura de pantalla", + "gameinput.toggleingameui": "Alternar nombres de usuario", + "gameinput.fullscreen": "Alternar pantalla completa", + "gameinput.moveforward": "Moverse hacia delante", + "gameinput.moveleft": "Moverse a la izquierda", + "gameinput.moveright": "Moverse a la derecha", + "gameinput.moveback": "Moverse hacia atrás", + "gameinput.jump": "Saltar", + "gameinput.glide": "Planear", + "gameinput.roll": "Rodar", + "gameinput.climb": "Trepar", + "gameinput.climbdown": "Trepar hacia abajo", + "gameinput.wallleap": "Salto en muro", + "gameinput.togglelantern": "Alternar linterna", + "gameinput.mount": "Montar", + "gameinput.enter": "Entrar", + "gameinput.command": "Comando", + "gameinput.escape": "Escapar", + "gameinput.map": "Mapa", + "gameinput.bag": "Inventario", + "gameinput.social": "Social", + "gameinput.sit": "Sentarse", + "gameinput.spellbook": "Hechizos", + "gameinput.settings": "Opciones", + "gameinput.respawn": "Revivir", + "gameinput.charge": "Cargar", + "gameinput.togglewield": "Alternar empuñadura", + "gameinput.interact": "Interactuar", + "gameinput.freelook": "Vista libre", + "gameinput.autowalk": "Auto Correr", + + /// End GameInput section + + + /// Start chracter selection section + "char_selection.loading_characters": "Cargando personajes...", + "char_selection.delete_permanently": "¿Borrar permanentemente este personaje?", + "char_selection.deleting_character": "Borrando personaje...", + "char_selection.change_server": "Cambiar de servidor", + "char_selection.enter_world": "Entrar al mundo", + "char_selection.logout": "Salir", + "char_selection.create_new_charater": "Crear nuevo personaje", + "char_selection.creating_character": "Creando personaje...", + "char_selection.character_creation": "Creación de personaje", + + "char_selection.human_default": "Humano Predeterminado", + "char_selection.level_fmt": "Nivel {level_nb}", + "char_selection.uncanny_valley": "Tierra salvaje", + "char_selection.plains_of_uncertainty": "Llanuras de la incertidumbre", + "char_selection.beard": "Barba", + "char_selection.hair_style": "Estilo de pelo", + "char_selection.hair_color": "Color de pelo", + "char_selection.eye_color": "Color de ojos", + "char_selection.skin": "Piel", + "char_selection.eyeshape": "Detalle de los ojos", + "char_selection.accessories": "Accesorios", + "char_selection.create_info_name": "¡Tu personaje necesita un nombre!", + + /// End chracter selection section + + + /// Start character window section + "character_window.character_name": "Nombre del personaje", + // Charater stats + "character_window.character_stats": r#"Resistencia + +Aptitud + +Fuerza de voluntad +"#, + /// End character window section + + + /// Start Escape Menu Section + "esc_menu.logout": "Salir", + "esc_menu.quit_game": "Salir del juego", + /// End Escape Menu Section + }, + + vector_map: { + "npc.speech.villager_under_attack": [ + "Ayuda, ¡me atacan!", + "¡Ayuda! ¡Me atacan!", + "¡Auch! ¡Me atacan!", + "¡Auch! ¡Me atacan! ¡Ayuda!", + "¡Ayúdame! ¡Me atacan!", + "¡Me atacan! ¡Ayuda!", + "¡Me atacan! ¡Ayúdame!", + "¡Ayuda!", + "¡Ayuda! ¡Ayuda!", + "¡Ayuda! ¡Ayuda! ¡Ayuda!", + "¡Me atacan!", + "¡AAAHHH! ¡Me atacan!", + "¡AAAHHH! ¡Me atacan! ¡Ayuda!", + "¡Ayuda! ¡Nos están atacando!", + "¡Ayuda! ¡Asesino!", + "¡Ayuda! ¡Hay un asesino suelto!", + "¡Ayuda! ¡Me están intentando matar!", + "Guardias, ¡me están atacando!", + "Guardias, ¡me están atacando!", + "¡Me están atacando! ¡Guardias!", + "¡Ayuda! ¡Guardias! ¡Me están atacando!", + "¡Guardias! ¡Venid rápido!", + "¡Guardias! ¡Guardias!", + "¡Guardias! ¡Un villano me ataca!", + "Guardias, ¡acabad con este infame villano!", + "¡Guardias! ¡Hay un asesino!", + "¡Guardias! ¡Ayudadme!", + "¡No te saldrás con la tuya! ¡Guardias!", + "¡Desalmado!", + "¡Ayúdame!", + "¡Ayuda! ¡Por favor!", + "¡Auch! ¡Guardias! ¡Ayuda!", + "¡Vienen a por mí!", + "¡Ayuda! ¡Ayuda! Me están reprimiendo", + "Ah, ahora vemos la violencia inherente al sistema.", + "¡No es más que un rasguño!" + ], + } +)