feat: add some basic settings

This commit is contained in:
2026-09-05 15:38:22 +02:00
parent 92fa5d0d86
commit c90b9b6f46
5 changed files with 87 additions and 15 deletions

View File

@@ -1,10 +1,16 @@
use checkers::ui::{ use checkers::{
settings::{
client_settings::ClientSettings, general_settings::SettingsLike,
server_settings::ServerSettings,
},
ui::{
macroquad::{ macroquad::{
difficulty_selection::draw_dificulty_selection, game::game::GameClient, difficulty_selection::draw_dificulty_selection, game::game::GameClient,
main_menu::draw_main_menu, mode_selection::draw_mode_selection, main_menu::draw_main_menu, mode_selection::draw_mode_selection,
server_selection::draw_server_selection, settings::draw_settings, server_selection::draw_server_selection, settings::draw_settings,
}, },
state::{GameContext, GuiState}, state::{GameContext, GuiState},
},
}; };
use macroquad::{ use macroquad::{
color::{BLACK, WHITE}, color::{BLACK, WHITE},
@@ -62,6 +68,9 @@ pub async fn main() {
let mut state = Default::default(); let mut state = Default::default();
let mut context = GameContext::default(); let mut context = GameContext::default();
let mut client_settings = ClientSettings::new();
let mut server_settings = ServerSettings::new();
let background = load_texture("assets/background.png").await.unwrap(); let background = load_texture("assets/background.png").await.unwrap();
let main_menu_style = get_general_style().await; let main_menu_style = get_general_style().await;
@@ -121,7 +130,13 @@ pub async fn main() {
} }
GuiState::Settings => { GuiState::Settings => {
draw_settings(&mut state).await; draw_settings(
&mut state,
&mut context,
&mut client_settings,
&mut server_settings,
)
.await;
} }
GuiState::Game(client) => { GuiState::Game(client) => {

View File

@@ -24,8 +24,8 @@ impl MenuBuilder {
} }
} }
pub fn text_input(&mut self, ui: &mut Ui, buffer: &mut String) { pub fn text_input(&mut self, ui: &mut Ui, id: &str, buffer: &mut String) {
InputText::new(hash!()) InputText::new(hash!(id))
.position(vec2(self.center_x, self.current_y)) .position(vec2(self.center_x, self.current_y))
.size(self.button_size) .size(self.button_size)
.ui(ui, buffer); .ui(ui, buffer);

View File

@@ -47,7 +47,7 @@ pub async fn draw_server_selection(state: &mut GuiState, context: &mut GameConte
menu_builder.label(ui, "Server selection"); menu_builder.label(ui, "Server selection");
menu_builder.text_input(ui, &mut context.server_url_buffer); menu_builder.text_input(ui, "server url", &mut context.server_url_buffer);
//context.normalise_url(); //context.normalise_url();
if menu_builder.button(ui, "Connect") { if menu_builder.button(ui, "Connect") {

View File

@@ -1,3 +1,4 @@
use log::error;
use macroquad::{ use macroquad::{
color::GRAY, color::GRAY,
math::vec2, math::vec2,
@@ -6,9 +7,23 @@ use macroquad::{
window::{screen_height, screen_width}, window::{screen_height, screen_width},
}; };
use crate::ui::{macroquad::menu_builder::MenuBuilder, state::GuiState}; use crate::{
settings::{
client_settings::ClientSettings, general_settings::SettingsLike,
server_settings::ServerSettings,
},
ui::{
macroquad::menu_builder::MenuBuilder,
state::{GameContext, GuiState},
},
};
pub async fn draw_settings(state: &mut GuiState) { pub async fn draw_settings(
state: &mut GuiState,
context: &mut GameContext,
client_settings: &mut ClientSettings,
server_settings: &mut ServerSettings,
) {
let menu_size = vec2(screen_width() * 0.5, screen_height() * 0.5); let menu_size = vec2(screen_width() * 0.5, screen_height() * 0.5);
let menu_pos = vec2( let menu_pos = vec2(
screen_width() / 2.0 - menu_size.x / 2.0, screen_width() / 2.0 - menu_size.x / 2.0,
@@ -21,11 +36,50 @@ pub async fn draw_settings(state: &mut GuiState) {
Group::new(hash!(), menu_size) Group::new(hash!(), menu_size)
.position(menu_pos) .position(menu_pos)
.ui(&mut root_ui(), |ui| { .ui(&mut root_ui(), |ui| {
// Client
menu_builder.label(ui, "Game settings"); menu_builder.label(ui, "Game settings");
menu_builder.label(ui, "Server settings"); menu_builder.label(ui, "Name");
menu_builder.text_input(ui, "name input", &mut client_settings.name);
if menu_builder.button(ui, "Go back") { menu_builder.label(ui, "Default server url");
menu_builder.text_input(ui, "url input", &mut context.server_url_buffer);
menu_builder.label(ui, "");
// Server
menu_builder.label(ui, "Server settings");
menu_builder.label(ui, "TODO");
if let Some(error_msg) = &context.latest_error_message {
menu_builder.label(ui, &error_msg);
}
// Exit
if menu_builder.button(ui, "Save and back") {
client_settings.server_url = match context.server_url_buffer.parse() {
Ok(result) => result,
Err(e) => {
context.latest_error_message =
Some(format!("Error while parsing url: {}", e));
return;
}
};
if let Err(e) = client_settings.save_to_file() {
context.latest_error_message = Some(format!("Error: {}", e));
error!("Error while saving client settings to file: {}", e);
return;
}
if let Err(e) = server_settings.save_to_file() {
context.latest_error_message = Some(format!("Error: {}", e));
error!("Error while saving server settings to file: {}", e);
return;
}
context.latest_error_message = None;
*state = GuiState::MainMenu; *state = GuiState::MainMenu;
} }
}); });

View File

@@ -36,6 +36,8 @@ pub struct GameContext {
pub difficulty: BotDificulty, pub difficulty: BotDificulty,
pub gamemode: GameMode, pub gamemode: GameMode,
pub server_url_buffer: String, pub server_url_buffer: String,
pub latest_error_message: Option<String>,
} }
impl Default for GameContext { impl Default for GameContext {
@@ -43,7 +45,8 @@ impl Default for GameContext {
Self { Self {
difficulty: BotDificulty::default(), difficulty: BotDificulty::default(),
gamemode: GameMode::default(), gamemode: GameMode::default(),
server_url_buffer: "127.0.0.1".to_string(), server_url_buffer: "127.0.0.1:6767".to_string(),
latest_error_message: None,
} }
} }
} }