From 9a17ee0e31c4ee4fbf75e5f1bc007a99bbe5ed4b Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 15 Aug 2024 01:35:46 +0200 Subject: pc: add username setting --- pixel-client/src/config.rs | 2 +- pixel-client/src/game.rs | 5 +++-- pixel-client/src/main.rs | 19 ++++++++++++------- pixel-client/src/menu/main.rs | 6 ++++-- pixel-client/src/menu/settings.rs | 40 +++++++++++++++++++++++++++++++++++---- 5 files changed, 56 insertions(+), 16 deletions(-) (limited to 'pixel-client/src') diff --git a/pixel-client/src/config.rs b/pixel-client/src/config.rs index 8f051b99..4d50ae10 100644 --- a/pixel-client/src/config.rs +++ b/pixel-client/src/config.rs @@ -25,7 +25,7 @@ use std::{ #[derive(Serialize, Deserialize)] pub struct Config { - username: String, + pub username: String, } impl Config { diff --git a/pixel-client/src/game.rs b/pixel-client/src/game.rs index 0a0fc22d..318b9a02 100644 --- a/pixel-client/src/game.rs +++ b/pixel-client/src/game.rs @@ -16,6 +16,7 @@ */ use crate::{ + config::Config, helper::InterpolateExt, render::{ misc::MiscTextures, @@ -82,10 +83,10 @@ pub struct Item { } impl Game { - pub fn new(mut network: Network, layout: &AtlasLayout) -> Self { + pub fn new(mut network: Network, config: &Config, layout: &AtlasLayout) -> Self { network.queue_out.push_back(PacketS::Join { id: None, - name: "pixel".to_string(), + name: config.username.clone(), character: 0, }); diff --git a/pixel-client/src/main.rs b/pixel-client/src/main.rs index 24421994..a073d0ed 100644 --- a/pixel-client/src/main.rs +++ b/pixel-client/src/main.rs @@ -16,7 +16,9 @@ */ #![feature(map_many_mut, path_add_extension)] +use anyhow::Result; use clap::{Parser, Subcommand}; +use config::Config; use game::Game; use hurrycurry_client_lib::network::sync::Network; use hurrycurry_protocol::glam::Vec2; @@ -57,10 +59,11 @@ pub enum State { Quit, } -fn main() { +fn main() -> Result<()> { env_logger::init_from_env("LOG"); let args = Args::parse(); + let mut config = Config::load()?; rustls::crypto::ring::default_provider() .install_default() @@ -93,6 +96,7 @@ fn main() { Action::Menu => State::MainMenu(MainMenu::new(renderer.atlas_layout())), Action::Join { server_address } => State::Ingame(Box::new(Game::new( Network::connect(&server_address).unwrap(), + &config, renderer.atlas_layout(), ))), }; @@ -108,24 +112,25 @@ fn main() { let keyboard = KeyboardState::new(&events); let mouse = MouseState::new(&events); - let dt = last_tick.elapsed().min(Duration::from_secs_f32(1. / 30.)); + let actual_dt = last_tick.elapsed(); + last_tick += actual_dt; + let dt = actual_dt.min(Duration::from_secs_f32(1. / 30.)); + let next = match &mut state { State::Ingame(x) => x.tick(dt.as_secs_f32(), &keyboard, renderer.atlas_layout()), State::MainMenu(x) => { x.tick(dt.as_secs_f32(), &keyboard, &mouse, renderer.atlas_layout()) } - State::Quit => break, + State::Quit => break Ok(()), }; if let Some(next) = next { state = *next; } - last_tick += dt; - renderer.set_ui_view(4.); match &mut state { State::Ingame(x) => x.draw(&mut renderer), - State::MainMenu(x) => x.draw(&mut renderer), + State::MainMenu(x) => x.draw(&mut renderer, &mut config), State::Quit => (), } @@ -137,7 +142,7 @@ fn main() { for event in events.poll_iter() { match event { - Event::Quit { .. } => break 'mainloop, + Event::Quit { .. } => break 'mainloop Ok(()), Event::KeyUp { keycode: Some(keycode), .. diff --git a/pixel-client/src/menu/main.rs b/pixel-client/src/menu/main.rs index 54b0fe9c..7045931e 100644 --- a/pixel-client/src/menu/main.rs +++ b/pixel-client/src/menu/main.rs @@ -17,6 +17,7 @@ */ use super::{background::MenuBackground, credits::CreditsMenu, settings::SettingsMenu}; use crate::{ + config::Config, game::Game, render::{sprite::SpriteDraw, AtlasLayout, Renderer}, ui::UiState, @@ -66,12 +67,12 @@ impl MainMenu { pub fn keyboard_event(&mut self, keycode: Keycode, down: bool) { self.ui_state.keyboard_event(keycode, down); } - pub fn draw(&mut self, ctx: &mut Renderer) { + pub fn draw(&mut self, ctx: &mut Renderer, config: &mut Config) { self.background.draw(ctx); self.ui_state.draw(ctx, |ui| { if let Some(settings) = &mut self.settings { - if settings.draw(ui) { + if settings.draw(ui, config) { self.settings = None; } return; @@ -85,6 +86,7 @@ impl MainMenu { if ui.button(80., "Join") { self.next_state = Some(Box::new(State::Ingame(Box::new(Game::new( Network::connect(&self.server_address).unwrap(), + &config, ui.renderer.atlas_layout(), ))))) } diff --git a/pixel-client/src/menu/settings.rs b/pixel-client/src/menu/settings.rs index 90668039..aef56f2f 100644 --- a/pixel-client/src/menu/settings.rs +++ b/pixel-client/src/menu/settings.rs @@ -15,7 +15,9 @@ along with this program. If not, see . */ -use crate::ui::Ui; +use crate::{config::Config, render::sprite::SpriteDraw, ui::Ui}; +use hurrycurry_protocol::glam::Vec2; +use log::warn; pub struct Settings { pub username: String, @@ -25,9 +27,39 @@ pub struct Settings { pub struct SettingsMenu {} impl SettingsMenu { - pub fn draw(&mut self, ui: &mut Ui) -> bool { - ui.text("Settings placeholder"); + pub fn draw(&mut self, ui: &mut Ui, config: &mut Config) -> bool { + ui.renderer.draw_ui(SpriteDraw::overlay( + ui.renderer.misc_textures.solid, + Vec2::ZERO, + ui.renderer.ui_size, + Some([0, 0, 0, 150]), + )); - return ui.button(80., "Back"); + let mut back = false; + + ui.horizontal(|ui| { + ui.advance(Vec2::splat(20.)); + ui.vertical(|ui| { + ui.advance(Vec2::splat(10.)); + ui.text("Settings"); + + ui.horizontal(|ui| { + ui.text("Username: "); + ui.textedit(100., &mut config.username); + }); + + ui.advance(ui.get_remaining() - Vec2::Y * 30.); + + if ui.button(80., "Back") { + if let Err(e) = config.save() { + warn!("cannot save config: {e}"); + } else { + back = true + } + } + }); + }); + + return back; } } -- cgit v1.2.3-70-g09d2