diff --git a/crates/border-wars/src/scenes/admin_lobby.rs b/crates/border-wars/src/scenes/admin_lobby.rs index ff3f61c..f5effdb 100644 --- a/crates/border-wars/src/scenes/admin_lobby.rs +++ b/crates/border-wars/src/scenes/admin_lobby.rs @@ -1,4 +1,4 @@ -//! The lobby of the game. +//! The admin lobby of the game. use bevnet::{Connection, Receive, SendTo, Uuid}; use bevy::prelude::*; @@ -8,10 +8,10 @@ use super::handle_new_players; use crate::connection::{AddPlayer, AllPlayers, RemovePlayer, RequestConnection}; use crate::CurrentScene; -/// The plugin for the lobby. -pub struct LobbyPlugin; +/// The plugin for the amdin lobby. +pub struct AdminLobbyPlugin; -impl Plugin for LobbyPlugin { +impl Plugin for AdminLobbyPlugin { fn build(&self, app: &mut App) { app.add_systems( Update, @@ -20,28 +20,26 @@ impl Plugin for LobbyPlugin { ); } } - /// Display the UI of the lobby. fn lobby_ui(mut ctx: EguiContexts, connection: Res) { + let Some(connection) = connection.identifier() else { + egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { + ui.label("Connecting..."); + }); + return; + }; + egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { ui.heading("Border Wars"); ui.separator(); - ui.label("Game created"); - ui.horizontal(|ui| { - ui.label("Game ID: "); - ui.text_edit_singleline( - &mut connection - .identifier() - .unwrap_or_else(Uuid::nil) - .to_string(), - ); - }); + ui.label("Game ID: "); + ui.text_edit_singleline(&mut connection.to_string()); }); } -/// TODO +/// Display the admin panel. fn admin_panel( mut ctx: EguiContexts, connection: Res, @@ -57,8 +55,7 @@ fn admin_panel( ui.label("The most beautiful admin (You)"); continue; } - let button = ui.button(format!("Kick {}", player.1)); - if button.clicked() { + if ui.button("Kick").clicked() { for target_player in all_players.0.iter() { event.send(SendTo(*target_player.0, RemovePlayer { uuid: *player.0 })); } @@ -72,13 +69,20 @@ fn admin_panel( }); } -/// TODO +/// Handle the request to join the game. fn handle_request( mut events: EventReader>, all_players: Res, mut new_players: EventWriter>, ) { for event in events.read() { + new_players.send(SendTo( + event.0, + AddPlayer { + uuid: event.0, + name: event.1.name.clone(), + }, + )); for player in all_players.0.iter() { let player1 = (event.0, event.1.name.clone()); let player2 = (*player.0, player.1.clone()); @@ -87,7 +91,7 @@ fn handle_request( } } -/// TODO +/// Link two players. fn link_two_players( player1: (Uuid, String), player2: (Uuid, String), diff --git a/crates/border-wars/src/scenes/lobby.rs b/crates/border-wars/src/scenes/lobby.rs index 3d60ad1..898b228 100644 --- a/crates/border-wars/src/scenes/lobby.rs +++ b/crates/border-wars/src/scenes/lobby.rs @@ -3,31 +3,31 @@ use bevy::prelude::*; use bevy_egui::{egui, EguiContexts}; -use super::handle_new_players; +use super::{handle_new_players, handle_remove_players}; use crate::connection::AllPlayers; use crate::CurrentScene; /// The plugin for the lobby. -pub struct WaitingMenuPlugin; +pub struct LobbyPlugin; -impl Plugin for WaitingMenuPlugin { +impl Plugin for LobbyPlugin { fn build(&self, app: &mut App) { app.add_systems( Update, - (ui, handle_new_players).run_if(in_state(CurrentScene::Lobby)), + (lobby_ui, handle_new_players, handle_remove_players) + .run_if(in_state(CurrentScene::Lobby)), ); } } -/// TODO -fn ui(all_players: Res, mut ctx: EguiContexts) { +/// Display the UI of the lobby. +fn lobby_ui(all_players: Res, mut ctx: EguiContexts) { egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { ui.heading("Border Wars"); - ui.separator(); - - for (uuid, name) in all_players.0.iter() { - ui.label(format!("{}: {}", uuid, name)); + for name in all_players.0.values() { + ui.separator(); + ui.label(name.to_string()); } }); } diff --git a/crates/border-wars/src/scenes/menu.rs b/crates/border-wars/src/scenes/menu.rs index 43e997b..b21ce18 100644 --- a/crates/border-wars/src/scenes/menu.rs +++ b/crates/border-wars/src/scenes/menu.rs @@ -4,7 +4,7 @@ use bevnet::{Connection, SendTo, Uuid}; use bevy::prelude::*; use bevy_egui::{egui, EguiContexts}; -use crate::connection::{AllPlayers, RequestConnection}; +use crate::connection::RequestConnection; use crate::CurrentScene; /// The plugin for the menu. @@ -12,30 +12,37 @@ pub struct MenuPlugin; impl Plugin for MenuPlugin { fn build(&self, app: &mut App) { - app.add_systems( - Update, - (menu_ui, name_settings).run_if(in_state(CurrentScene::Menu)), - ); + app.add_systems(Update, (menu_ui).run_if(in_state(CurrentScene::Menu))); } } + /// Display the UI of the menu to host a game or join one. fn menu_ui( mut ctx: EguiContexts, mut connection_string: Local, mut next_scene: ResMut>, - all_players: Res, - connection: Res, mut request_join_event: EventWriter>, + mut name: Local, + connection: Res, ) { - let Some(connection_id) = connection.identifier() else { + let Some(connection) = connection.identifier() else { + egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { + ui.label("Connecting..."); + }); return; }; - egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { ui.heading("Border Wars"); ui.separator(); + ui.horizontal(|ui| { + ui.label("Enter your name:"); + ui.text_edit_singleline(&mut *name); + }); + + ui.separator(); + ui.label("Connect to an existing game:"); ui.horizontal(|ui| { ui.label("Game ID: "); @@ -49,11 +56,7 @@ fn menu_ui( request_join_event.send(SendTo( target_uuid, RequestConnection { - name: all_players - .0 - .get(&connection_id) - .unwrap_or(&"Unknown".to_string()) - .clone(), + name: name.to_string(), }, )); } @@ -63,26 +66,13 @@ fn menu_ui( if ui.button("Create new game").clicked() { next_scene.set(CurrentScene::AdminLobby); + // Add it-self to the list of players. + request_join_event.send(SendTo( + connection, + RequestConnection { + name: name.to_string(), + }, + )); } }); } - -/// TODO -fn name_settings( - mut ctx: EguiContexts, - mut all_players: ResMut, - mut local_name: Local, - connection: Res, -) { - let Some(connection_id) = connection.identifier() else { - return; - }; - egui::Window::new("Name settings").show(ctx.ctx_mut(), |ui| { - ui.label("Enter your name:"); - ui.horizontal(|ui| { - if ui.text_edit_singleline(&mut *local_name).changed() { - all_players.0.insert(connection_id, local_name.to_string()); - } - }); - }); -} diff --git a/crates/border-wars/src/scenes/mod.rs b/crates/border-wars/src/scenes/mod.rs index 7285aed..31d4108 100644 --- a/crates/border-wars/src/scenes/mod.rs +++ b/crates/border-wars/src/scenes/mod.rs @@ -19,30 +19,41 @@ impl Plugin for ScenesPlugin { app.add_plugins(EguiPlugin) .add_state::() .add_plugins(menu::MenuPlugin) - .add_plugins(admin_lobby::LobbyPlugin) - .add_plugins(lobby::WaitingMenuPlugin) + .add_plugins(admin_lobby::AdminLobbyPlugin) + .add_plugins(lobby::LobbyPlugin) .add_plugins(responsive_scale::ResponsiveScalingPlugin); } } -/// TODO +/// Handle the new players. pub fn handle_new_players( mut all_players: ResMut, mut new_players: EventReader>, - mut remove_players: EventReader>, - self_uuid: Res, - mut next_scene: ResMut>, ) { for new_player in new_players.read() { all_players .0 .insert(new_player.1.uuid, new_player.1.name.clone()); } +} +/// Handle the remove players. +pub fn handle_remove_players( + mut all_players: ResMut, + mut remove_players: EventReader>, + connection: Res, + mut next_scene: ResMut>, +) { for remove_player in remove_players.read() { - if remove_player.1.uuid == self_uuid.identifier().unwrap_or_default() { + let Some(connection) = connection.identifier() else { + return; + }; + + if remove_player.1.uuid == connection { next_scene.set(CurrentScene::Menu); + all_players.0.clear(); + } else { + all_players.0.remove(&remove_player.1.uuid); } - all_players.0.remove(&remove_player.1.uuid); } }