From 72d5013a5445ec68b649d4bf24324dbf2651e06a Mon Sep 17 00:00:00 2001 From: Monty Marz Date: Wed, 1 Jul 2020 19:05:44 +0000 Subject: [PATCH] Loot ChatType, Update german translation, map zooming --- CHANGELOG.md | 1 + .../voxygen/element/icons/chat/loot_small.png | Bin 0 -> 512 bytes assets/voxygen/element/slider/indicator.png | Bin 0 -> 224 bytes assets/voxygen/element/slider/indicator.vox | Bin 1296 -> 0 bytes .../element/slider/indicator_round.png | Bin 0 -> 181 bytes assets/voxygen/element/slider/track.png | Bin 0 -> 173 bytes assets/voxygen/element/slider/track.vox | Bin 4248 -> 0 bytes assets/voxygen/i18n/de_DE.ron | 21 +++++- assets/voxygen/i18n/en.ron | 16 +++- client/src/lib.rs | 1 + common/src/comp/chat.rs | 4 + server/src/state_ext.rs | 1 + server/src/sys/message.rs | 2 +- voxygen/src/hud/chat.rs | 5 +- voxygen/src/hud/img_ids.rs | 8 +- voxygen/src/hud/map.rs | 71 +++++++++++++----- voxygen/src/hud/mod.rs | 22 ++++-- voxygen/src/menu/char_selection/ui.rs | 5 +- voxygen/src/session.rs | 32 ++++++-- voxygen/src/settings.rs | 2 + 20 files changed, 146 insertions(+), 45 deletions(-) create mode 100644 assets/voxygen/element/icons/chat/loot_small.png create mode 100644 assets/voxygen/element/slider/indicator.png delete mode 100644 assets/voxygen/element/slider/indicator.vox create mode 100644 assets/voxygen/element/slider/indicator_round.png create mode 100644 assets/voxygen/element/slider/track.png delete mode 100644 assets/voxygen/element/slider/track.vox diff --git a/CHANGELOG.md b/CHANGELOG.md index e30efd1c49..5f77b5fe83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added regional, local, and global chat (`/region`, `/say`, and `/world`, respectively) - Added command shortcuts for each of the above chat modes (`/g`, `/f`, `/r`, `/s`, and `/w`, respectively and `/t` for `/tell`) - Ability to wield 2 × 1h weapons and shields (Note: 1h weapons & shields are not currently avaliable, see [!1095](https://gitlab.com/veloren/veloren/-/merge_requests/1095) for more info) +- Zoomable Map ### Changed diff --git a/assets/voxygen/element/icons/chat/loot_small.png b/assets/voxygen/element/icons/chat/loot_small.png new file mode 100644 index 0000000000000000000000000000000000000000..daafc31e8d2ed931e66e11e8168328ed1125e099 GIT binary patch literal 512 zcmV+b0{{JqP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-hDk(0RCwBilfOzNK@i4&T{F9~I7}dd7c7Fyu{fHVnVA^~n;2YhxzA!^>_Zp| z2loKS!6m}6qu!y(B8q>4=Gb+2+HQm1nVq@4y(wtuE~>t&>hCM%oWorz7MSBdrZ$}l z^M@q!0XBu+VVBHW8X|@N;^#HD=`@cT8)pXlW-Gp}t&hb$T$E^2-+t2a$?3@Wih*!` z_PZVc;P_LU!C=5n`vcvz7=WYGe(?nhN64!$GD%SX?4X>uySIu26Gokb()6lm8cjm9eLoTMo4C7v`U$838XlA0zhUgNz0!&jw_<7 z6;hp5StuzkX<0Jk-(Ow~TE7CIwdTjS;XHr@QfcjKV!3%SbixUb&wq$xFC?_C2x*Rm zGN664EHy&Lnc?x_9-v%ZsZCb^)UNK|n><}--Uk5OSfauz5@X!}0000Qh{OUNoK9^}uQZYh*%?|9m?`o61k(S694|=>LD~)+-(( zBO{)Tbz%P{B_t#wv^F35clwl{?f6W*fJ3cB8AtEt_S?hK zCR?0ZN43=dB^JdGwMealGDaLCNEt)KPl6vr{2=^1=^P9xe)Yhg|M{P{ z``r878`-^~3m<-opEDD7pN}Ke*2=?uqo`{nhe{5#jt7K z7B?GK&0FIZ!>-z{+M?Q`a~$fgQGZR$BKEjNY;lulYz5jQ*0`Z@BOfkVZ?*EMOM zNqv*fGiiKneBaK;c8KmfZ!Ik?B$G*QjS0KnU!dCcC%?N~%+Gg`w@cyA{u4z(H)V&t zcu&>gA8$oMR;0fGnYag8a8uMJlpYf{jtUQ4799P;+LTbN+I>-I>T=R~tcd98V&0g& zmyV>+ofe**76z|tZ?}hvSQRzN0L|GTJEaAo@<-z$Drq)!UdZwvEN!qqFPgTh2e_@rqRSb3e$Q*4T`P5c2eeKM@{xrW##;B`y)7DVQ z?niwbjcldAQ%F4{jK3(%y(KhPcnAk-IMlqEL`N%;fSXuTIU_r3$@Xqx@c9V+hxd>? zagfYwFA$AJNhA_vvsrSv98RZ`4aMv6dcD;9t7zVQKMyzf3ANR;_wiOnU)jj?hgJM= zHNf(lq2}3a-7gCKZTx#dHAA3lgD`Mmm7gw&Au}tOvzW>I?MqcVk zv88^3ZNq0MOO>(sk#OUnaM9<(@AuPJJ-`#YW{}hnC5aMd&)@!sr#yOhDk^xnHqG{J zV;nj6DjRxBx%O!-v(Ylf^vwQ!{`tE6tOGquB>G_R{1mB=v%ER;HSd0vy4D#zBh(p02m~+C-FK&MyXV0$WZ^`QUo5zo%PjKa(&Ap@ijo#mX^c~J8 S@A#|nYO%X}?)F!ymA?Vdmpi`z diff --git a/assets/voxygen/element/slider/indicator_round.png b/assets/voxygen/element/slider/indicator_round.png new file mode 100644 index 0000000000000000000000000000000000000000..0595ae321e3f5d67e31ae23996c7e0bb2afa7c49 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJ3i-X*q7}lMWc?sm?d%8G=aLi0j zXlQyP(f@yAUD*G`8nGD*wr#WWdGr5~?{SGpt<8u2oj&Ddq;vnliG-{d=Myp`4*V945)zUU5)ui!fP}=lxVB2+&0uRgwPwTrsga2V arx_X8<>##~VYUTY&EV_WLuUk`65}qN%GyYW%({&WLvi7n{3&Z?@r2+g?5z~qRC80 z>vmgKvW3h`JJ^gggF+YP=$i7i>qZR{8U71YCM+tiih z=iw;Y1bGjZu#ZG_tD{E`j6Z zEbJ|2rij`~rX0_PSApI{A3|Saz6T7@SCY+w?dTD-LGqer(Ji=Q+ki< zu%hj8Ryq0}=i4&6eh-YvQfez)4wq$W{e3m0+Q1lR`I!%8u0M-sL8ZIt!{l1fCYjqM zV?y)cRl*}^*>DAD2BTziU>oQs(@8(TYzMhPW`{T@7cWG;hF?w{$IpY;(X8+WnS6MY znKC%RjtR7J{4ug2=BCiX_-6c4Pyk9mA+Ug9ymn?r$Q98CnJI?b*kOnJ*<*xTVFx^b zZh%|J4Kmlo+$?n`d%EaXsn^KH$xYI4gLN=Lzd>dkZ+74P3JGaqxc?Net zm)^r$AOSW(C)x%a)_1}&@^N^Q-D_|M{wh4dzEv=e-;OrJIcsF5IV+yI9%Hf|e~5k< zZv*s^okI(P7&}(LGFSqOfDd}^MOLbV`2o;Q-A1;Rxo+mW*foV7B^SnLQ*+#uc# z^#DAJ-wzMKL3j|q4-SA{G6CjVIj@f$EpU*XKDZO^Kx@bECEEl1pc{07P7on8LuQ)H z6uaixJ;yn_%p1^+=pE$RK^tfVEx-r*$qkV2g-!GUY9rjq9=?is&$MJUd%D@vgH}V` zi{|IdTI#LL89e`ZUS?O=;{m<+^UQegqtvDB>Y)#SGU_(+e)d?YyQ!DSG=nAlMf3%< zRrWcVcY!+K20iTVBe#oRPv1+XgSwNME@r#&*3cHwme6A4SJ0O6$~nuASA~9n?jUo> zXKXIo0d<~!-R#UKZzf+rt`OaY@5HM`uR*UyuR_m3&qdEe&qp_-7ogW=_8C$xyhA)E zILCKeEtwiJ)nu~CvqO44G+o1nig6teT4>s_;yq+kY2cE}k zhMPbmXaIBUon>c)eKX{J^j>-oeKUOR>+^7wiPJpoh6$=1u4x zGR@?h*ckvTcrm;ha;x;!a204Jvj!a0c2Eht`fDIFM}C&MO%P${V&;1IE+W&%Oak9V z9Yo(Ezm2v-9c6w2w4nLOY%%L)#~_-AdH`OB`{8!-L3jhd4{l>e6Lm9l9_GFDJ~9UK zn`jBNEwpVkKfK6H4|PLkm;PC2;xmuu9K^sXXl15_Ss#17?CBui&TO1|9j%ef2L2|w z1o{?!0BxVwwy!h&KKefXKDh?aNZo|ijMu@AY<4wevRcwazfW%@w}gMd9s~J0G&f#- zW``lw3GcC^5j2s@!OzAwp&Q8?(Dz^$`Z<1Q*WsPxceWee;ve$6Glxtz850>Jel4C8&xKxx?nbXi z&qvQg&qdEcKcLRWJIC);lfDh=wJv|Vb5UCA zZ8FsDl(|ulJQMGeOS4Ljca+@vs*;D_RT8LmNW|A5+ktjTP4-LNXOoLPRdQ{*QBHR| z|Mnj*|C(qvS7tP;%v>N8UL0%j35uIN$NF= zT>H6I-ucijPsI6ufBk;HU%nPQmX5C5GI;f6u^-#z-JdG?XiLeP9*=mvUb#@8mid|c zqK>afd8%9-Yu}K{-3s~O7me~DVV4`+v;V&TdQRW9 z8GBz+7ep? message.to_string(), comp::ChatType::CommandError => message.to_string(), comp::ChatType::CommandInfo => message.to_string(), + comp::ChatType::Loot => message.to_string(), comp::ChatType::FactionMeta(_) => message.to_string(), comp::ChatType::GroupMeta(_) => message.to_string(), comp::ChatType::Kill => message.to_string(), diff --git a/common/src/comp/chat.rs b/common/src/comp/chat.rs index c53d85df4c..17cd3987f4 100644 --- a/common/src/comp/chat.rs +++ b/common/src/comp/chat.rs @@ -81,6 +81,8 @@ pub enum ChatType { Npc(Uid, u16), /// Anything else Meta, + // Looted items + Loot, } impl ChatType { @@ -134,6 +136,7 @@ impl ChatMsg { ChatType::Offline => SpeechBubbleType::None, ChatType::CommandInfo => SpeechBubbleType::None, ChatType::CommandError => SpeechBubbleType::None, + ChatType::Loot => SpeechBubbleType::None, ChatType::FactionMeta(_) => SpeechBubbleType::None, ChatType::GroupMeta(_) => SpeechBubbleType::None, ChatType::Kill => SpeechBubbleType::None, @@ -154,6 +157,7 @@ impl ChatMsg { ChatType::Offline => None, ChatType::CommandInfo => None, ChatType::CommandError => None, + ChatType::Loot => None, ChatType::FactionMeta(_) => None, ChatType::GroupMeta(_) => None, ChatType::Kill => None, diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index 9566c083fe..ad9ca3f5e1 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -246,6 +246,7 @@ impl StateExt for State { | comp::ChatType::Offline | comp::ChatType::CommandInfo | comp::ChatType::CommandError + | comp::ChatType::Loot | comp::ChatType::Kill | comp::ChatType::Meta | comp::ChatType::World(_) => { diff --git a/server/src/sys/message.rs b/server/src/sys/message.rs index 7543bb1b02..0038449bb3 100644 --- a/server/src/sys/message.rs +++ b/server/src/sys/message.rs @@ -272,7 +272,7 @@ impl<'a> System<'a> for Sys { if !client.login_msg_sent { new_chat_msgs.push((None, ChatMsg { chat_type: ChatType::Online, - message: format!("[{}] is now online.", &player.alias), + message: format!("[{}] is now online.", &player.alias), // TODO: Localize this })); client.login_msg_sent = true; diff --git a/voxygen/src/hud/chat.rs b/voxygen/src/hud/chat.rs index 9e2cd3fc5f..675f9622d6 100644 --- a/voxygen/src/hud/chat.rs +++ b/voxygen/src/hud/chat.rs @@ -1,6 +1,6 @@ use super::{ - img_ids::Imgs, ERROR_COLOR, FACTION_COLOR, GROUP_COLOR, INFO_COLOR, KILL_COLOR, OFFLINE_COLOR, - ONLINE_COLOR, REGION_COLOR, SAY_COLOR, TELL_COLOR, TEXT_COLOR, WORLD_COLOR, + img_ids::Imgs, ERROR_COLOR, FACTION_COLOR, GROUP_COLOR, INFO_COLOR, KILL_COLOR, LOOT_COLOR, + OFFLINE_COLOR, ONLINE_COLOR, REGION_COLOR, SAY_COLOR, TELL_COLOR, TEXT_COLOR, WORLD_COLOR, }; use crate::{ui::fonts::ConrodVoxygenFonts, GlobalState}; use client::{cmd, Client}; @@ -479,6 +479,7 @@ fn render_chat_line(chat_type: &ChatType, imgs: &Imgs) -> (Color, conrod_core::i ChatType::Offline => (OFFLINE_COLOR, imgs.chat_offline_small), ChatType::CommandError => (ERROR_COLOR, imgs.chat_command_error_small), ChatType::CommandInfo => (INFO_COLOR, imgs.chat_command_info_small), + ChatType::Loot => (LOOT_COLOR, imgs.chat_loot_small), ChatType::GroupMeta(_) => (GROUP_COLOR, imgs.chat_group_small), ChatType::FactionMeta(_) => (FACTION_COLOR, imgs.chat_faction_small), ChatType::Kill => (KILL_COLOR, imgs.chat_kill_small), diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs index f73921253b..3a47770581 100644 --- a/voxygen/src/hud/img_ids.rs +++ b/voxygen/src/hud/img_ids.rs @@ -44,8 +44,6 @@ image_ids! { settings_button_pressed: "voxygen.element.buttons.settings_button_pressed", settings_button_hover: "voxygen.element.buttons.settings_button_hover", settings_button_press: "voxygen.element.buttons.settings_button_press", - slider: "voxygen.element.slider.track", - slider_indicator: "voxygen.element.slider.indicator", esc_frame: "voxygen.element.frames.esc_menu", // Chat-Arrows @@ -95,6 +93,11 @@ image_ids! { quest_bg: "voxygen.element.misc_bg.temp_quest_bg", + // Slider + slider: "voxygen.element.slider.track", + slider_indicator: "voxygen.element.slider.indicator", + slider_indicator_small: "voxygen.element.slider.indicator_round", + // Buttons settings: "voxygen.element.buttons.settings", @@ -316,6 +319,7 @@ image_ids! { chat_command_info_small: "voxygen.element.icons.chat.command_info_small", chat_online_small: "voxygen.element.icons.chat.online_small", chat_offline_small: "voxygen.element.icons.chat.offline_small", + chat_loot_small: "voxygen.element.icons.chat.loot_small", chat_faction: "voxygen.element.icons.chat.faction", chat_group: "voxygen.element.icons.chat.group", diff --git a/voxygen/src/hud/map.rs b/voxygen/src/hud/map.rs index b15e24772f..b6871ff88e 100644 --- a/voxygen/src/hud/map.rs +++ b/voxygen/src/hud/map.rs @@ -4,12 +4,13 @@ use super::{ }; use crate::{ i18n::VoxygenLocalization, - ui::{fonts::ConrodVoxygenFonts, img_ids}, + ui::{fonts::ConrodVoxygenFonts, img_ids, ImageSlider}, + GlobalState, }; use client::{self, Client}; use common::{comp, terrain::TerrainChunkSize, vol::RectVolSize}; use conrod_core::{ - color, + color, position, widget::{self, Button, Image, Rectangle, Text}, widget_ids, Colorable, Positionable, Sizeable, Widget, WidgetCommon, }; @@ -29,6 +30,7 @@ widget_ids! { grid, map_title, qlog_title, + zoom_slider, } } @@ -44,6 +46,7 @@ pub struct Map<'a> { common: widget::CommonBuilder, _pulse: f32, localized_strings: &'a std::sync::Arc, + global_state: &'a GlobalState, } impl<'a> Map<'a> { #[allow(clippy::too_many_arguments)] // TODO: Pending review in #587 @@ -56,6 +59,7 @@ impl<'a> Map<'a> { fonts: &'a ConrodVoxygenFonts, pulse: f32, localized_strings: &'a std::sync::Arc, + global_state: &'a GlobalState, ) -> Self { Self { _show: show, @@ -67,6 +71,7 @@ impl<'a> Map<'a> { common: widget::CommonBuilder::default(), _pulse: pulse, localized_strings, + global_state, } } } @@ -76,11 +81,12 @@ pub struct State { } pub enum Event { + MapZoom(f64), Close, } impl<'a> Widget for Map<'a> { - type Event = Option; + type Event = Vec; type State = State; type Style = (); @@ -96,7 +102,8 @@ impl<'a> Widget for Map<'a> { #[allow(clippy::useless_format)] // TODO: Pending review in #587 fn update(self, args: widget::UpdateArgs) -> Self::Event { let widget::UpdateArgs { state, ui, .. } = args; - + let zoom = self.global_state.settings.gameplay.map_zoom * 0.8; + let mut events = Vec::new(); // Frame Image::new(self.imgs.map_bg) .w_h(1052.0, 886.0) @@ -154,7 +161,7 @@ impl<'a> Widget for Map<'a> { .set(state.ids.close, ui) .was_clicked() { - return Some(Event::Close); + events.push(Event::Close); } // Location Name @@ -182,11 +189,6 @@ impl<'a> Widget for Map<'a> { let (world_map, worldsize) = self.world_map; let worldsize = worldsize.map2(TerrainChunkSize::RECT_SIZE, |e, f| e as f64 * f as f64); - Image::new(world_map.none) - .mid_top_with_margin_on(state.ids.map_align, 10.0) - .w_h(760.0, 760.0) - .parent(state.ids.bg) - .set(state.ids.grid, ui); // Coordinates let player_pos = self .client @@ -195,27 +197,56 @@ impl<'a> Widget for Map<'a> { .read_storage::() .get(self.client.entity()) .map_or(Vec3::zero(), |pos| pos.0); + let w_src = worldsize.x / TerrainChunkSize::RECT_SIZE.x as f64 / zoom; + let h_src = worldsize.y / TerrainChunkSize::RECT_SIZE.y as f64 / zoom; + let rect_src = position::Rect::from_xy_dim( + [ + player_pos.x as f64 / TerrainChunkSize::RECT_SIZE.x as f64, + (worldsize.y - player_pos.y as f64) / TerrainChunkSize::RECT_SIZE.y as f64, + ], + [w_src, h_src], + ); + Image::new(world_map.none) + .mid_top_with_margin_on(state.ids.map_align, 10.0) + .w_h(760.0, 760.0) + .parent(state.ids.bg) + .source_rectangle(rect_src) + .set(state.ids.grid, ui); + + if let Some(new_val) = ImageSlider::discrete( + self.global_state.settings.gameplay.map_zoom as i32, + 1, + 30, + self.imgs.slider_indicator_small, + self.imgs.slider, + ) + .w_h(600.0, 22.0 * 2.0) + .mid_bottom_with_margin_on(state.ids.grid, -55.0) + .track_breadth(12.0 * 2.0) + .slider_length(22.0 * 2.0) + .pad_track((12.0, 12.0)) + .set(state.ids.zoom_slider, ui) + { + events.push(Event::MapZoom(new_val as f64)); + } // Cursor pos relative to playerpos and widget size // Cursor stops moving on an axis as soon as it's position exceeds the maximum - // size of the widget - let rel = Vec2::from(player_pos).map2(worldsize, |e: f32, sz: f64| { + // // size of the widget + + /*let rel = Vec2::from(player_pos).map2(worldsize, |e: f32, sz: f64| { (e as f64 / sz).clamped(0.0, 1.0) - }); - let xy = rel * 760.0; + });*/ + //let xy = rel * 760.0; let scale = 0.6; let arrow_sz = Vec2::new(32.0, 37.0) * scale; Image::new(self.rot_imgs.indicator_mmap_small.target_north) - .bottom_left_with_margins_on( - state.ids.grid, - xy.y - arrow_sz.y / 2.0, - xy.x - arrow_sz.x / 2.0, - ) + .middle_of(state.ids.grid) .w_h(arrow_sz.x, arrow_sz.y) .color(Some(UI_HIGHLIGHT_0)) .floating(true) .parent(ui.window) .set(state.ids.indicator, ui); - None + events } } diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 80fb0f4da5..602ba98fa5 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -99,6 +99,8 @@ const REGION_COLOR: Color = Color::Rgba(0.8, 1.0, 0.8, 1.0); const KILL_COLOR: Color = Color::Rgba(1.0, 0.17, 0.17, 1.0); /// Color for global messages const WORLD_COLOR: Color = Color::Rgba(0.95, 1.0, 0.95, 1.0); +/// Color for collected loot messages +const LOOT_COLOR: Color = Color::Rgba(0.69, 0.57, 1.0, 1.0); // UI Color-Theme const UI_MAIN: Color = Color::Rgba(0.61, 0.70, 0.70, 1.0); // Greenish Blue @@ -249,6 +251,7 @@ pub enum Event { ChangeMaxFPS(u32), ChangeFOV(u16), ChangeGamma(f32), + MapZoom(f64), AdjustWindowSize([u16; 2]), ToggleFullscreen, ChangeAaMode(AaMode), @@ -360,7 +363,7 @@ impl Show { fn map(&mut self, open: bool) { self.map = open; self.bag = false; - self.want_grab = true; + self.want_grab = !open; } fn social(&mut self, open: bool) { @@ -1794,7 +1797,7 @@ impl Hud { } // Map if self.show.map { - match Map::new( + for event in Map::new( &self.show, client, &self.imgs, @@ -1803,14 +1806,19 @@ impl Hud { &self.fonts, self.pulse, &self.voxygen_i18n, + &global_state, ) .set(self.ids.map, ui_widgets) { - Some(map::Event::Close) => { - self.show.map(false); - self.force_ungrab = true; - }, - None => {}, + match event { + map::Event::Close => { + self.show.map(false); + self.force_ungrab = true; + }, + map::Event::MapZoom(map_zoom) => { + events.push(Event::MapZoom(map_zoom)); + }, + } } } diff --git a/voxygen/src/menu/char_selection/ui.rs b/voxygen/src/menu/char_selection/ui.rs index 7e6d7ff201..01a8d47cd0 100644 --- a/voxygen/src/menu/char_selection/ui.rs +++ b/voxygen/src/menu/char_selection/ui.rs @@ -185,8 +185,6 @@ image_ids! { selection: "voxygen.element.frames.selection", selection_hover: "voxygen.element.frames.selection_hover", selection_press: "voxygen.element.frames.selection_press", - slider_range: "voxygen.element.slider.track", - slider_indicator: "voxygen.element.slider.indicator", // Info Window info_frame: "voxygen.element.frames.info_frame", @@ -200,6 +198,9 @@ image_ids! { name_input: "voxygen.element.misc_bg.textbox_mid", + slider_range: "voxygen.element.slider.track", + slider_indicator: "voxygen.element.slider.indicator", + // Tool Icons daggers: "voxygen.element.icons.daggers", sword: "voxygen.element.icons.sword", diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index 1df6d69822..84fc0f3765 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -12,7 +12,7 @@ use crate::{ }; use client::{self, Client}; use common::{ - assets::{load_watched, watch}, + assets::{load_expect, load_watched, watch}, clock::Clock, comp, comp::{ChatMsg, ChatType, InventoryUpdateEvent, Pos, Vel, MAX_PICKUP_RANGE_SQR}, @@ -42,6 +42,7 @@ pub struct SessionState { key_state: KeyState, inputs: comp::ControllerInputs, selected_block: Block, + voxygen_i18n: std::sync::Arc, } /// Represents an active game session (i.e., the one being played). @@ -63,6 +64,9 @@ impl SessionState { .ecs_mut() .insert(MyEntity(my_entity)); } + let voxygen_i18n = load_expect::(&i18n_asset_key( + &global_state.settings.language.selected_language, + )); Self { scene, client, @@ -70,6 +74,7 @@ impl SessionState { inputs: comp::ControllerInputs::default(), hud, selected_block: Block::new(BlockKind::Normal, Rgb::broadcast(255)), + voxygen_i18n, } } } @@ -81,6 +86,9 @@ impl SessionState { let mut client = self.client.borrow_mut(); for event in client.tick(self.inputs.clone(), dt, crate::ecs::sys::add_local_systems)? { + self.voxygen_i18n = load_expect::(&i18n_asset_key( + &global_state.settings.language.selected_language, + )); match event { client::Event::Chat(m) => { self.hud.new_message(m); @@ -96,16 +104,17 @@ impl SessionState { match inv_event { InventoryUpdateEvent::CollectFailed => { self.hud.new_message(ChatMsg { - message: String::from( - "Failed to collect item. Your inventory may be full!", - ), + message: self.voxygen_i18n.get("hud.chat.loot_fail").to_string(), chat_type: ChatType::CommandError, }); }, InventoryUpdateEvent::Collected(item) => { self.hud.new_message(ChatMsg { - message: format!("Picked up {}", item.name()), - chat_type: ChatType::CommandInfo, + message: self + .voxygen_i18n + .get("hud.chat.loot_msg") + .replace("{item}", item.name().to_string().as_str()), + chat_type: ChatType::Loot, }); }, _ => {}, @@ -114,8 +123,11 @@ impl SessionState { client::Event::Disconnect => return Ok(TickAction::Disconnect), client::Event::DisconnectionNotification(time) => { let message = match time { - 0 => String::from("Goodbye!"), - _ => format!("Connection lost. Kicking in {} seconds", time), + 0 => String::from(self.voxygen_i18n.get("hud.chat.goodbye")), + _ => self + .voxygen_i18n + .get("hud.chat.connection_lost") + .replace("{time}", time.to_string().as_str()), }; self.hud.new_message(ChatMsg { @@ -805,6 +817,10 @@ impl PlayState for SessionState { .camera_mut() .compute_dependents(&*self.client.borrow().state().terrain()); }, + HudEvent::MapZoom(map_zoom) => { + global_state.settings.gameplay.map_zoom = map_zoom; + global_state.settings.save_to_file_warn(); + }, HudEvent::ChangeGamma(new_gamma) => { global_state.settings.graphics.gamma = new_gamma; global_state.settings.save_to_file_warn(); diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index 3427b3a8fe..23f3eaa5fc 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -473,6 +473,7 @@ pub struct GameplaySettings { pub free_look_behavior: PressBehavior, pub auto_walk_behavior: PressBehavior, pub stop_auto_walk_on_input: bool, + pub map_zoom: f64, } impl Default for GameplaySettings { @@ -501,6 +502,7 @@ impl Default for GameplaySettings { free_look_behavior: PressBehavior::Toggle, auto_walk_behavior: PressBehavior::Toggle, stop_auto_walk_on_input: true, + map_zoom: 4.0, } } }