From 109ecd9a54435f785cad6a36a14e370ae198ce37 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Sat, 30 Mar 2024 17:54:20 +0100 Subject: [PATCH 1/7] save --- crates/border-wars/src/map/generation.rs | 3 ++- crates/border-wars/src/networking/mod.rs | 24 +++++++++++++++++++++-- crates/border-wars/src/scenes/lobby.rs | 25 +++++++++++++++++++----- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/crates/border-wars/src/map/generation.rs b/crates/border-wars/src/map/generation.rs index f1ce9ee..4f9088e 100644 --- a/crates/border-wars/src/map/generation.rs +++ b/crates/border-wars/src/map/generation.rs @@ -2,6 +2,7 @@ use bevy::prelude::*; use noise::{NoiseFn, Perlin}; +use serde::{Deserialize, Serialize}; use super::hex::*; use super::{Tile, TilePosition}; @@ -25,7 +26,7 @@ impl Plugin for MapGenerationPlugin { } /// An event to trigger the generation of the map. -#[derive(Event)] +#[derive(Event, Serialize, Deserialize, Clone, Copy)] pub struct StartMapGeneration { /// The seed used to generate the map. pub seed: u32, diff --git a/crates/border-wars/src/networking/mod.rs b/crates/border-wars/src/networking/mod.rs index e3f4f8a..a58c6ad 100644 --- a/crates/border-wars/src/networking/mod.rs +++ b/crates/border-wars/src/networking/mod.rs @@ -1,10 +1,12 @@ //! All the code related to the networking. -use bevnet::NetworkPlugin; +use bevnet::{NetworkAppExt, NetworkPlugin, Receive}; use bevy::prelude::*; use serde::{Deserialize, Serialize}; use self::connection::ConnectionPlugin; +use crate::map::generation::StartMapGeneration; +use crate::CurrentScene; pub mod connection; @@ -14,7 +16,9 @@ pub struct NetworkingPlugin; impl Plugin for NetworkingPlugin { fn build(&self, app: &mut App) { app.add_plugins(NetworkPlugin::new("relay.cocosol.fr".to_string())) - .add_plugins(ConnectionPlugin); + .add_plugins(ConnectionPlugin) + .add_systems(Update, start_game) + .add_network_event::(); } } @@ -30,3 +34,19 @@ pub enum PlayerRank { /// The player. He can join the game and play. Player, } + +/// TODO +#[derive(Event, Serialize, Deserialize)] +pub struct StartGame(pub StartMapGeneration); + +/// TODO +fn start_game( + mut next_stats: ResMut>, + mut start_game_events: EventReader>, + mut start_map_generation_writer: EventWriter, +) { + for event in start_game_events.read() { + next_stats.set(CurrentScene::Game); + start_map_generation_writer.send(event.1.0); + } +} diff --git a/crates/border-wars/src/scenes/lobby.rs b/crates/border-wars/src/scenes/lobby.rs index 89201c9..d396cee 100644 --- a/crates/border-wars/src/scenes/lobby.rs +++ b/crates/border-wars/src/scenes/lobby.rs @@ -4,8 +4,9 @@ use bevnet::{Connection, SendTo}; use bevy::prelude::*; use bevy_egui::{egui, EguiContexts}; +use crate::map::generation::StartMapGeneration; use crate::networking::connection::RemovePlayer; -use crate::networking::PlayerRank; +use crate::networking::{PlayerRank, StartGame}; use crate::{CurrentScene, Player}; /// The plugin for the lobby. @@ -20,10 +21,11 @@ impl Plugin for LobbyPlugin { /// Display the UI of the lobby. fn lobby_ui( mut ctx: EguiContexts, - mut next_scene: ResMut>, connection: Res, all_players_query: Query<&Player>, mut kick_player: EventWriter>, + mut map_size: Local, + mut start_game_event: EventWriter>, ) { // Get our player info. let Some(self_player) = all_players_query @@ -63,9 +65,22 @@ fn lobby_ui( ui.separator(); } - if self_player.rank == PlayerRank::Admin && ui.button("Run the game").clicked() { - next_scene.set(CurrentScene::Game); - // TODO: run the game + if self_player.rank != PlayerRank::Admin { + return; + } + + ui.add(egui::Slider::new(&mut (*map_size), 0..=10).text("map size")); + + if ui.button("Run the game").clicked() { + for player in all_players_query.iter() { + start_game_event.send(SendTo( + player.uuid, + StartGame(StartMapGeneration { + seed: 0, + radius: 10, + }), + )); + } } }); } -- 2.43.4 From 80ffd17257ba7a698821e24fb1806eb36907b59a Mon Sep 17 00:00:00 2001 From: CoCo_Sol Date: Sat, 30 Mar 2024 18:25:08 +0100 Subject: [PATCH 2/7] save work --- crates/border-wars/src/scenes/lobby.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/crates/border-wars/src/scenes/lobby.rs b/crates/border-wars/src/scenes/lobby.rs index d396cee..237bfb5 100644 --- a/crates/border-wars/src/scenes/lobby.rs +++ b/crates/border-wars/src/scenes/lobby.rs @@ -69,7 +69,7 @@ fn lobby_ui( return; } - ui.add(egui::Slider::new(&mut (*map_size), 0..=10).text("map size")); + ui.add(egui::Slider::new(&mut (*map_size), 0..=5).text("map size")); if ui.button("Run the game").clicked() { for player in all_players_query.iter() { @@ -77,10 +77,27 @@ fn lobby_ui( player.uuid, StartGame(StartMapGeneration { seed: 0, - radius: 10, + radius: get_map_sizes(all_players_query.iter().count() as u64) + [*map_size as usize] as u16 + * 2, }), )); } } }); } + +fn get_map_sizes(number_of_players: u64) -> Vec { + let mut result = Vec::with_capacity(6); + + let mut current = 0; + while result.len() < 6 { + current += 1; + + if (current * 6) % number_of_players == 0 { + result.push(current); + } + } + + result +} -- 2.43.4 From f044b9678a1215f3d462f53f384873041b5d4a27 Mon Sep 17 00:00:00 2001 From: CoCo_Sol Date: Sat, 30 Mar 2024 19:28:11 +0100 Subject: [PATCH 3/7] add doc --- crates/border-wars/src/networking/mod.rs | 4 ++-- crates/border-wars/src/scenes/lobby.rs | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/border-wars/src/networking/mod.rs b/crates/border-wars/src/networking/mod.rs index a58c6ad..6bf9be0 100644 --- a/crates/border-wars/src/networking/mod.rs +++ b/crates/border-wars/src/networking/mod.rs @@ -35,11 +35,11 @@ pub enum PlayerRank { Player, } -/// TODO +/// The event to start the game send by the admin. #[derive(Event, Serialize, Deserialize)] pub struct StartGame(pub StartMapGeneration); -/// TODO +/// A fonction that handle the start of the game. fn start_game( mut next_stats: ResMut>, mut start_game_events: EventReader>, diff --git a/crates/border-wars/src/scenes/lobby.rs b/crates/border-wars/src/scenes/lobby.rs index 237bfb5..4a2f63b 100644 --- a/crates/border-wars/src/scenes/lobby.rs +++ b/crates/border-wars/src/scenes/lobby.rs @@ -87,6 +87,7 @@ fn lobby_ui( }); } +/// Get the map sizes form a given number of players. fn get_map_sizes(number_of_players: u64) -> Vec { let mut result = Vec::with_capacity(6); -- 2.43.4 From 4faf8b781d76228054f3786dadfc73fc11f59b19 Mon Sep 17 00:00:00 2001 From: CoCo_Sol Date: Sat, 30 Mar 2024 23:54:21 +0100 Subject: [PATCH 4/7] save --- Cargo.lock | 1 + crates/border-wars/Cargo.toml | 1 + crates/border-wars/src/scenes/lobby.rs | 29 ++++++++++++++------------ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ee4f5e6..7621658 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1319,6 +1319,7 @@ dependencies = [ "bevy_egui", "noise", "paste", + "rand 0.8.5", "serde", ] diff --git a/crates/border-wars/Cargo.toml b/crates/border-wars/Cargo.toml index fabf283..68e7ebf 100644 --- a/crates/border-wars/Cargo.toml +++ b/crates/border-wars/Cargo.toml @@ -17,3 +17,4 @@ noise = "0.8.2" paste = "1.0.14" bevnet = { path = "../bevnet" } serde = "1.0.197" +rand = "0.8.5" diff --git a/crates/border-wars/src/scenes/lobby.rs b/crates/border-wars/src/scenes/lobby.rs index 1bbbfa5..ffdbb2b 100644 --- a/crates/border-wars/src/scenes/lobby.rs +++ b/crates/border-wars/src/scenes/lobby.rs @@ -3,6 +3,7 @@ use bevnet::{Connection, SendTo}; use bevy::prelude::*; use bevy_egui::{egui, EguiContexts}; +use rand::Rng; use crate::map::generation::StartMapGeneration; use crate::networking::connection::RemovePlayer; @@ -70,24 +71,26 @@ fn lobby_ui( ui.add(egui::Slider::new(&mut (*map_size), 0..=5).text("map size")); - if ui.button("Run the game").clicked() { - for player in all_players_query.iter() { - start_game_event.send(SendTo( - player.uuid, - StartGame(StartMapGeneration { - seed: 0, - radius: get_map_sizes(all_players_query.iter().count() as u64) - [*map_size as usize] as u16 - * 2, - }), - )); - } + if !ui.button("Run the game").clicked() { + return; + } + + let seed = rand::thread_rng().gen::(); + let radius = + get_map_sizes(all_players_query.iter().count() as u32)[*map_size as usize] as u16; + + // Start the game. + for player in all_players_query.iter() { + start_game_event.send(SendTo( + player.uuid, + StartGame(StartMapGeneration { seed, radius }), + )); } }); } /// Get the map sizes form a given number of players. -fn get_map_sizes(number_of_players: u64) -> Vec { +fn get_map_sizes(number_of_players: u32) -> Vec { let mut result = Vec::with_capacity(6); let mut current = 0; -- 2.43.4 From c090fabbd57bd5e444cc0f5ea1b0b5f98aa7eb57 Mon Sep 17 00:00:00 2001 From: CoCo_Sol Date: Sun, 31 Mar 2024 00:16:58 +0100 Subject: [PATCH 5/7] save --- crates/border-wars/src/networking/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/border-wars/src/networking/mod.rs b/crates/border-wars/src/networking/mod.rs index f881add..3b2892a 100644 --- a/crates/border-wars/src/networking/mod.rs +++ b/crates/border-wars/src/networking/mod.rs @@ -19,7 +19,7 @@ impl Plugin for NetworkingPlugin { fn build(&self, app: &mut App) { app.add_plugins(NetworkPlugin::new("relay.cocosol.fr".to_string())) .add_plugins(ConnectionPlugin) - .add_systems(Update, start_game) + .add_systems(Update, handle_start_game) .add_network_event::() .add_plugins(CheckConnectionPlugin); } @@ -43,7 +43,7 @@ pub enum PlayerRank { pub struct StartGame(pub StartMapGeneration); /// A fonction that handle the start of the game. -fn start_game( +fn handle_start_game( mut next_stats: ResMut>, mut start_game_events: EventReader>, mut start_map_generation_writer: EventWriter, -- 2.43.4 From 90cdfb5dcba142bc2aafd0f0327f2bbb39601838 Mon Sep 17 00:00:00 2001 From: CoCo_Sol Date: Sun, 31 Mar 2024 00:18:56 +0100 Subject: [PATCH 6/7] save --- crates/border-wars/src/networking/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/border-wars/src/networking/mod.rs b/crates/border-wars/src/networking/mod.rs index 3b2892a..9b31654 100644 --- a/crates/border-wars/src/networking/mod.rs +++ b/crates/border-wars/src/networking/mod.rs @@ -38,7 +38,7 @@ pub enum PlayerRank { Player, } -/// The event to start the game send by the admin. +/// The event to start the game, that is send by the admin. #[derive(Event, Serialize, Deserialize)] pub struct StartGame(pub StartMapGeneration); -- 2.43.4 From 4e5f7155aba1bacee5b815b5a41bf8e01b7725ba Mon Sep 17 00:00:00 2001 From: CoCo_Sol Date: Sun, 31 Mar 2024 00:36:32 +0100 Subject: [PATCH 7/7] save --- crates/border-wars/src/scenes/lobby.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/border-wars/src/scenes/lobby.rs b/crates/border-wars/src/scenes/lobby.rs index ffdbb2b..d3762cc 100644 --- a/crates/border-wars/src/scenes/lobby.rs +++ b/crates/border-wars/src/scenes/lobby.rs @@ -69,15 +69,17 @@ fn lobby_ui( return; } - ui.add(egui::Slider::new(&mut (*map_size), 0..=5).text("map size")); + ui.add(egui::Slider::new(&mut (*map_size), 1..=5).text("map size")); if !ui.button("Run the game").clicked() { return; } let seed = rand::thread_rng().gen::(); - let radius = - get_map_sizes(all_players_query.iter().count() as u32)[*map_size as usize] as u16; + let index = *map_size as usize; + let nomber_of_players = all_players_query.iter().count() as u32; + + let radius = get_map_sizes(nomber_of_players)[index] as u16 * 2; // Start the game. for player in all_players_query.iter() { -- 2.43.4