From 7acbc42adcc93ff24a304bbe9f963bcda869bdca Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Sat, 16 Mar 2024 22:50:26 +0100 Subject: [PATCH] save --- Cargo.lock | 10 ++-- crates/border-wars/Cargo.toml | 2 + crates/border-wars/src/connection.rs | 43 ++++++++++++++++ crates/border-wars/src/lib.rs | 4 ++ crates/border-wars/src/scenes/lobby.rs | 41 ++++++++++++++-- crates/border-wars/src/scenes/menu.rs | 43 ++++++++++++++-- crates/border-wars/src/scenes/waiting_menu.rs | 49 +++++++++++++++++++ 7 files changed, 181 insertions(+), 11 deletions(-) create mode 100644 crates/border-wars/src/connection.rs create mode 100644 crates/border-wars/src/scenes/waiting_menu.rs diff --git a/Cargo.lock b/Cargo.lock index 6ac8535..ee4f5e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1314,10 +1314,12 @@ dependencies = [ name = "border-wars" version = "0.1.0" dependencies = [ + "bevnet", "bevy", "bevy_egui", "noise", "paste", + "serde", ] [[package]] @@ -3805,18 +3807,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", diff --git a/crates/border-wars/Cargo.toml b/crates/border-wars/Cargo.toml index fc84f96..fabf283 100644 --- a/crates/border-wars/Cargo.toml +++ b/crates/border-wars/Cargo.toml @@ -15,3 +15,5 @@ bevy = "0.12.1" bevy_egui = "0.24.0" noise = "0.8.2" paste = "1.0.14" +bevnet = { path = "../bevnet" } +serde = "1.0.197" diff --git a/crates/border-wars/src/connection.rs b/crates/border-wars/src/connection.rs new file mode 100644 index 0000000..c1c55eb --- /dev/null +++ b/crates/border-wars/src/connection.rs @@ -0,0 +1,43 @@ +//! All the code related to the connection to an host. + +use std::collections::HashMap; + +use bevnet::{NetworkAppExt, Uuid}; +use bevy::prelude::*; +use serde::{Deserialize, Serialize}; + +/// The plugin that manages the connection to the host. +pub struct ConnectionPlugin; + +impl Plugin for ConnectionPlugin { + fn build(&self, app: &mut App) { + app.add_network_event::() + .add_network_event::() + .add_network_event::() + .init_resource::(); + } +} + +/// All the players in the game. +#[derive(Resource, Default, Deserialize, Serialize)] +pub struct AllPlayers(pub HashMap); + +/// The message sent by the client to the server to request a connection. +#[derive(Event, Deserialize, Serialize)] +pub struct RequestConnection { + /// The name of the player. + pub name: String, +} + +/// The message sent in order to update the list of players. +#[derive(Deserialize, Serialize, Event)] +pub struct AddPlayer { + pub uuid: Uuid, + pub name: String, +} + +/// The packet sent when a player is removed. +#[derive(Event, Deserialize, Serialize)] +pub struct RemovePlayer { + pub uuid: String, +} diff --git a/crates/border-wars/src/lib.rs b/crates/border-wars/src/lib.rs index 257aefb..c988c19 100644 --- a/crates/border-wars/src/lib.rs +++ b/crates/border-wars/src/lib.rs @@ -3,6 +3,7 @@ use bevy::prelude::*; pub mod camera; +pub mod connection; pub mod map; pub mod responsive_scale; pub mod scenes; @@ -19,4 +20,7 @@ pub enum CurrentScene { /// When we play this wonderful game. Game, + + /// When we are in the waiting menu. + WaitingMenu, } diff --git a/crates/border-wars/src/scenes/lobby.rs b/crates/border-wars/src/scenes/lobby.rs index 84a0348..776550d 100644 --- a/crates/border-wars/src/scenes/lobby.rs +++ b/crates/border-wars/src/scenes/lobby.rs @@ -1,8 +1,10 @@ //! The lobby of the game. +use bevnet::{Connection, Receive, SendTo}; use bevy::prelude::*; use bevy_egui::{egui, EguiContexts}; +use crate::connection::{AddPlayer, AllPlayers, RequestConnection}; use crate::CurrentScene; /// The plugin for the lobby. @@ -10,12 +12,19 @@ pub struct LobbyPlugin; impl Plugin for LobbyPlugin { fn build(&self, app: &mut App) { - app.add_systems(Update, lobby_ui.run_if(in_state(CurrentScene::Lobby))); + app.add_systems( + Update, + (lobby_ui, handle_request).run_if(in_state(CurrentScene::Lobby)), + ); } } /// Display the UI of the lobby. -fn lobby_ui(mut ctx: EguiContexts, mut next_scene: ResMut>) { +fn lobby_ui( + mut ctx: EguiContexts, + mut next_scene: ResMut>, + connection: Res, +) { egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { ui.heading("Border Wars"); @@ -25,7 +34,7 @@ fn lobby_ui(mut ctx: EguiContexts, mut next_scene: ResMut>, + mut all_players: ResMut, + mut new_players: EventWriter>, +) { + for event in events.iter() { + all_players.0.insert(event.0, event.1.name.clone()); + for player in all_players.0.iter() { + new_players.send(SendTo( + *player.0, + AddPlayer { + uuid: event.0, + name: event.1.name.clone(), + }, + )); + new_players.send(SendTo( + event.0, + AddPlayer { + uuid: *player.0, + name: player.1.clone(), + }, + )) + } + } +} diff --git a/crates/border-wars/src/scenes/menu.rs b/crates/border-wars/src/scenes/menu.rs index c5c84c7..eac3051 100644 --- a/crates/border-wars/src/scenes/menu.rs +++ b/crates/border-wars/src/scenes/menu.rs @@ -1,8 +1,10 @@ //! The main menu of the game. +use bevnet::{Connection, SendTo, Uuid}; use bevy::prelude::*; use bevy_egui::{egui, EguiContexts}; +use crate::connection::{AllPlayers, RequestConnection}; use crate::CurrentScene; /// The plugin for the menu. @@ -10,7 +12,10 @@ pub struct MenuPlugin; impl Plugin for MenuPlugin { fn build(&self, app: &mut App) { - app.add_systems(Update, menu_ui.run_if(in_state(CurrentScene::Menu))); + app.add_systems( + Update, + (menu_ui, name_settings).run_if(in_state(CurrentScene::Menu)), + ); } } /// Display the UI of the menu to host a game or join one. @@ -18,6 +23,9 @@ fn menu_ui( mut ctx: EguiContexts, mut connection_string: Local, mut next_scene: ResMut>, + mut all_players: ResMut, + mut connection: Res, + mut request_join_event: EventWriter>, ) { egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { ui.heading("Border Wars"); @@ -30,8 +38,17 @@ fn menu_ui( ui.text_edit_singleline(&mut *connection_string); if ui.button("Join").clicked() { - next_scene.set(CurrentScene::Game); - // TODO: connect to the game + next_scene.set(CurrentScene::WaitingMenu); + request_join_event.send(SendTo( + Uuid::parse_str(&connection_string).unwrap(), + RequestConnection { + name: all_players + .0 + .get(&connection.identifier().unwrap()) + .unwrap() + .clone(), + }, + )); } }); @@ -39,7 +56,25 @@ fn menu_ui( if ui.button("Create new game").clicked() { next_scene.set(CurrentScene::Lobby); - // TODO: create a new game } }); } + +fn name_settings( + mut ctx: EguiContexts, + mut all_players: ResMut, + mut local_name: Local, + mut connection: Res, +) { + egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { + ui.label("Enter your name:"); + ui.horizontal(|ui| { + let text = ui.text_edit_singleline(&mut *local_name); + if text.changed() { + all_players + .0 + .insert(connection.identifier().unwrap(), local_name.to_string()); + } + }); + }); +} diff --git a/crates/border-wars/src/scenes/waiting_menu.rs b/crates/border-wars/src/scenes/waiting_menu.rs new file mode 100644 index 0000000..3f304a8 --- /dev/null +++ b/crates/border-wars/src/scenes/waiting_menu.rs @@ -0,0 +1,49 @@ +//! TODO + +use bevy::prelude::*; +use bevy_egui::{egui, EguiContexts}; + +use crate::connection::{AllPlayers, RequestConnection}; +use crate::CurrentScene; + +/// The plugin for the lobby. +pub struct WaitingMenuPlugin; + +impl Plugin for WaitingMenuPlugin { + fn build(&self, app: &mut App) { + app.add_systems( + Update, + (ui, handle_new_players).run_if(in_state(CurrentScene::WaitingMenu)), + ); + } +} + +fn 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.iter() { + ui.label(format!("{}: {}", uuid, name)); + } + }) +} + +fn handle_new_players( + mut all_players: ResMut, + mut new_players: EventReader, + mut remove_players: EventReader, + self_uuid: Res, +) { + for new_player in new_players.iter() { + all_players.insert(new_player.uuid, new_player.name.clone()); + } + + for remove_player in remove_players.iter() { + if remove_player.uuid == self_uuid.identifier().unwrap() { + todo!("end the game"); + } + all_players.remove(&remove_player.uuid); + } +}