From b4b5b6d4d672e94cacf31348ec9f7eb5a7c50500 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 3 Apr 2024 16:19:23 +0200 Subject: [PATCH 01/10] save --- crates/border-wars/src/main.rs | 2 + crates/border-wars/src/map/mod.rs | 1 + crates/border-wars/src/map/spawnpoint.rs | 55 ++++++++++++++++++++++++ crates/border-wars/src/scenes/lobby.rs | 22 ++-------- 4 files changed, 61 insertions(+), 19 deletions(-) create mode 100644 crates/border-wars/src/map/spawnpoint.rs diff --git a/crates/border-wars/src/main.rs b/crates/border-wars/src/main.rs index 8019933..d5a1f1b 100644 --- a/crates/border-wars/src/main.rs +++ b/crates/border-wars/src/main.rs @@ -5,6 +5,7 @@ use border_wars::camera::CameraPlugin; use border_wars::map::generation::MapGenerationPlugin; use border_wars::map::renderer::RendererPlugin; use border_wars::map::selected_tile::SelectTilePlugin; +use border_wars::map::spawnpoint::SpawnPointPlugin; use border_wars::networking::NetworkingPlugin; use border_wars::scenes::ScenesPlugin; use border_wars::ui::UiPlugin; @@ -19,5 +20,6 @@ fn main() { .add_plugins(NetworkingPlugin) .add_plugins(MapGenerationPlugin) .add_plugins(UiPlugin) + .add_plugins(SpawnPointPlugin) .run(); } diff --git a/crates/border-wars/src/map/mod.rs b/crates/border-wars/src/map/mod.rs index 839b7e8..c11dc8e 100644 --- a/crates/border-wars/src/map/mod.rs +++ b/crates/border-wars/src/map/mod.rs @@ -4,6 +4,7 @@ pub mod generation; pub mod hex; pub mod renderer; pub mod selected_tile; +pub mod spawnpoint; use bevy::prelude::*; diff --git a/crates/border-wars/src/map/spawnpoint.rs b/crates/border-wars/src/map/spawnpoint.rs new file mode 100644 index 0000000..c926855 --- /dev/null +++ b/crates/border-wars/src/map/spawnpoint.rs @@ -0,0 +1,55 @@ +//! TODO + +use bevy::prelude::*; +use bevy::utils::hashbrown::HashSet; +use bevy::utils::HashMap; + +use super::generation::EndMapGeneration; +use super::TilePosition; +use crate::Player; + +/// The plugin for the spawn point. +pub struct SpawnPointPlugin; + +impl Plugin for SpawnPointPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Update, init_spawn_point); + } +} + +/// Initialize the spawn point when the map is generated. +fn init_spawn_point( + mut commands: Commands, + mut end_map_event: EventReader, + players: Query<(Entity, &Player)>, + map: Query<(Entity, &TilePosition)>, +) { + if end_map_event.is_empty() { + return; + } + + let radius = map + .iter() + .max_by(|(_, a), (_, b)| a.0.cmp(&b.0)) + .unwrap() + .1 + .0 + .abs(); + + let map_hashmap: HashMap<&TilePosition, Entity> = map.iter().map(|(e, p)| (p, e)).collect(); + + let nb_player = players.iter().count(); + for (i, target_position) in TilePosition::new(0, 0) + .ring(radius as usize / 2) + .enumerate() + { + let Some(target_entity) = map_hashmap.get(&target_position) else { + return; + }; + + if i % (radius as usize * 3 / nb_player) != 0 { + continue; + } + commands.entity(*target_entity).despawn(); + } +} diff --git a/crates/border-wars/src/scenes/lobby.rs b/crates/border-wars/src/scenes/lobby.rs index d3762cc..8ce1de7 100644 --- a/crates/border-wars/src/scenes/lobby.rs +++ b/crates/border-wars/src/scenes/lobby.rs @@ -69,17 +69,17 @@ fn lobby_ui( return; } - ui.add(egui::Slider::new(&mut (*map_size), 1..=5).text("map size")); + ui.add(egui::Slider::new(&mut (*map_size), 1..=3).text("map size")); if !ui.button("Run the game").clicked() { return; } let seed = rand::thread_rng().gen::(); - let index = *map_size as usize; + let index = *map_size as u16; let nomber_of_players = all_players_query.iter().count() as u32; - let radius = get_map_sizes(nomber_of_players)[index] as u16 * 2; + let radius = nomber_of_players as u16 * 2 * index; // Start the game. for player in all_players_query.iter() { @@ -90,19 +90,3 @@ fn lobby_ui( } }); } - -/// Get the map sizes form a given number of players. -fn get_map_sizes(number_of_players: u32) -> 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 ad4c55678a7421426ee13fefe44e109fa5d496fc Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 3 Apr 2024 17:02:15 +0200 Subject: [PATCH 02/10] save --- crates/border-wars/src/map/spawnpoint.rs | 40 +++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/crates/border-wars/src/map/spawnpoint.rs b/crates/border-wars/src/map/spawnpoint.rs index c926855..2968e70 100644 --- a/crates/border-wars/src/map/spawnpoint.rs +++ b/crates/border-wars/src/map/spawnpoint.rs @@ -1,5 +1,6 @@ //! TODO +use bevnet::Connection; use bevy::prelude::*; use bevy::utils::hashbrown::HashSet; use bevy::utils::HashMap; @@ -23,6 +24,7 @@ fn init_spawn_point( mut end_map_event: EventReader, players: Query<(Entity, &Player)>, map: Query<(Entity, &TilePosition)>, + connection: Res, ) { if end_map_event.is_empty() { return; @@ -36,9 +38,16 @@ fn init_spawn_point( .0 .abs(); + if radius == 0 { + panic!("Map radius must be greater than 0"); + } + let map_hashmap: HashMap<&TilePosition, Entity> = map.iter().map(|(e, p)| (p, e)).collect(); let nb_player = players.iter().count(); + + let mut spawnpoints = Vec::with_capacity(nb_player); + for (i, target_position) in TilePosition::new(0, 0) .ring(radius as usize / 2) .enumerate() @@ -50,6 +59,35 @@ fn init_spawn_point( if i % (radius as usize * 3 / nb_player) != 0 { continue; } - commands.entity(*target_entity).despawn(); + spawnpoints.push((*target_entity, target_position)); + } + + let mut sorted_players = players.iter().collect::>(); + sorted_players.sort_by(compare_player); + spawnpoints.sort_by(compare_spawnpoint_entity); + + for (i, (target_entity, target_position)) in spawnpoints.iter().enumerate() { + let player = sorted_players[i].1; + if Some(player.uuid) == connection.identifier() { + commands.entity(*target_entity).despawn(); + } + } +} + +/// TODO +fn compare_player((_, a): &(Entity, &Player), (_, b): &(Entity, &Player)) -> std::cmp::Ordering { + a.uuid.cmp(&b.uuid) +} + +/// TODO +fn compare_spawnpoint_entity( + (_, a): &(Entity, TilePosition), + (_, b): &(Entity, TilePosition), +) -> std::cmp::Ordering { + let r = a.0.abs().cmp(&b.0.abs()); + if r == std::cmp::Ordering::Equal { + a.1.cmp(&b.1) + } else { + r } } -- 2.43.4 From 54eb8d77b57477a72d75be113de32106dfcd8990 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 3 Apr 2024 19:23:08 +0200 Subject: [PATCH 03/10] save --- crates/border-wars/src/map/spawnpoint.rs | 2 +- crates/border-wars/src/scenes/lobby.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/border-wars/src/map/spawnpoint.rs b/crates/border-wars/src/map/spawnpoint.rs index 2968e70..df4e2d5 100644 --- a/crates/border-wars/src/map/spawnpoint.rs +++ b/crates/border-wars/src/map/spawnpoint.rs @@ -39,7 +39,7 @@ fn init_spawn_point( .abs(); if radius == 0 { - panic!("Map radius must be greater than 0"); + return; } let map_hashmap: HashMap<&TilePosition, Entity> = map.iter().map(|(e, p)| (p, e)).collect(); diff --git a/crates/border-wars/src/scenes/lobby.rs b/crates/border-wars/src/scenes/lobby.rs index 8ce1de7..c35c8dd 100644 --- a/crates/border-wars/src/scenes/lobby.rs +++ b/crates/border-wars/src/scenes/lobby.rs @@ -79,7 +79,7 @@ fn lobby_ui( let index = *map_size as u16; let nomber_of_players = all_players_query.iter().count() as u32; - let radius = nomber_of_players as u16 * 2 * index; + let radius = nomber_of_players as u16 * 2 * (index+1); // Start the game. for player in all_players_query.iter() { -- 2.43.4 From 7fbce4aaa62010b9b314f95f64faa74f4eff0bf0 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 3 Apr 2024 21:34:46 +0200 Subject: [PATCH 04/10] save --- crates/border-wars/src/map/ownership.rs | 3 +- crates/border-wars/src/map/spawnpoint.rs | 75 +++++++++--------------- 2 files changed, 31 insertions(+), 47 deletions(-) diff --git a/crates/border-wars/src/map/ownership.rs b/crates/border-wars/src/map/ownership.rs index 8a5b792..bd2f39c 100644 --- a/crates/border-wars/src/map/ownership.rs +++ b/crates/border-wars/src/map/ownership.rs @@ -31,10 +31,11 @@ fn setup_ownership_resources(mut commands: Commands) { /// Render the ownership of the tiles by applying colors. fn render_ownership( - mut query: Query<(&mut Sprite, &Owner), Changed>, + mut query: Query<(&mut Sprite, &Owner), (Changed, Changed)>, contrast: Res, ) { for (mut sprite, owner) in query.iter_mut() { + println!("{:?}", contrast.0); let (r, g, b) = owner.0.color; let target = mix_colors(Color::rgb_u8(r, g, b), sprite.color, 1. - contrast.0); diff --git a/crates/border-wars/src/map/spawnpoint.rs b/crates/border-wars/src/map/spawnpoint.rs index df4e2d5..b38e7ae 100644 --- a/crates/border-wars/src/map/spawnpoint.rs +++ b/crates/border-wars/src/map/spawnpoint.rs @@ -6,7 +6,8 @@ use bevy::utils::hashbrown::HashSet; use bevy::utils::HashMap; use super::generation::EndMapGeneration; -use super::TilePosition; +use super::ownership::Owner; +use super::{Tile, TilePosition}; use crate::Player; /// The plugin for the spawn point. @@ -22,68 +23,50 @@ impl Plugin for SpawnPointPlugin { fn init_spawn_point( mut commands: Commands, mut end_map_event: EventReader, - players: Query<(Entity, &Player)>, - map: Query<(Entity, &TilePosition)>, + players: Query<&Player>, + mut map: Query<(Entity, &TilePosition, &mut Tile)>, connection: Res, ) { - if end_map_event.is_empty() { - return; - } - - let radius = map - .iter() - .max_by(|(_, a), (_, b)| a.0.cmp(&b.0)) - .unwrap() - .1 - .0 - .abs(); - - if radius == 0 { - return; - } - - let map_hashmap: HashMap<&TilePosition, Entity> = map.iter().map(|(e, p)| (p, e)).collect(); - - let nb_player = players.iter().count(); - - let mut spawnpoints = Vec::with_capacity(nb_player); - - for (i, target_position) in TilePosition::new(0, 0) - .ring(radius as usize / 2) - .enumerate() - { - let Some(target_entity) = map_hashmap.get(&target_position) else { + for _ in end_map_event.iter() { + let Some(radius) = map.iter().map(|(_, p, _)| p.0.abs()).max() else { return; }; - if i % (radius as usize * 3 / nb_player) != 0 { - continue; + if radius == 0 { + return; } - spawnpoints.push((*target_entity, target_position)); - } - let mut sorted_players = players.iter().collect::>(); - sorted_players.sort_by(compare_player); - spawnpoints.sort_by(compare_spawnpoint_entity); + let ring: HashSet = + TilePosition::new(0, 0).ring(radius as usize / 2).collect(); - for (i, (target_entity, target_position)) in spawnpoints.iter().enumerate() { - let player = sorted_players[i].1; - if Some(player.uuid) == connection.identifier() { - commands.entity(*target_entity).despawn(); + let mut sorted_tiles = map + .iter_mut() + .filter(|(_, p, _)| ring.contains(*p)) + .collect::>(); + + sorted_tiles.sort_by(|a, b| compare_spawnpoint_entity(a.1, b.1)); + + let mut sorted_players = players.iter().collect::>(); + sorted_players.sort_by(|a: &&Player, b: &&Player| compare_player(a, b)); + + for (i, tile) in sorted_tiles.iter_mut().enumerate() { + let Some(player) = sorted_players.get(i) else { + continue; + }; + println!("{:?}", player); + *tile.2 = Tile::Castle; + commands.entity(tile.0).insert(Owner(Player::clone(player))); } } } /// TODO -fn compare_player((_, a): &(Entity, &Player), (_, b): &(Entity, &Player)) -> std::cmp::Ordering { +fn compare_player(a: &Player, b: &Player) -> std::cmp::Ordering { a.uuid.cmp(&b.uuid) } /// TODO -fn compare_spawnpoint_entity( - (_, a): &(Entity, TilePosition), - (_, b): &(Entity, TilePosition), -) -> std::cmp::Ordering { +fn compare_spawnpoint_entity(a: &TilePosition, b: &TilePosition) -> std::cmp::Ordering { let r = a.0.abs().cmp(&b.0.abs()); if r == std::cmp::Ordering::Equal { a.1.cmp(&b.1) -- 2.43.4 From 8f8f1953d1fc38b685e707a6f09d67d0d95c1fd0 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 3 Apr 2024 21:59:11 +0200 Subject: [PATCH 05/10] save --- crates/border-wars/src/map/ownership.rs | 6 ++++-- crates/border-wars/src/map/spawnpoint.rs | 5 +---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/border-wars/src/map/ownership.rs b/crates/border-wars/src/map/ownership.rs index bd2f39c..c563518 100644 --- a/crates/border-wars/src/map/ownership.rs +++ b/crates/border-wars/src/map/ownership.rs @@ -29,13 +29,15 @@ fn setup_ownership_resources(mut commands: Commands) { commands.insert_resource(OwnershipColorContrast(0.4)); } +/// The type condition for update ownership. +type OwnershipUpdate = Or<(Changed, Changed)>; + /// Render the ownership of the tiles by applying colors. fn render_ownership( - mut query: Query<(&mut Sprite, &Owner), (Changed, Changed)>, + mut query: Query<(&mut Sprite, &Owner), OwnershipUpdate>, contrast: Res, ) { for (mut sprite, owner) in query.iter_mut() { - println!("{:?}", contrast.0); let (r, g, b) = owner.0.color; let target = mix_colors(Color::rgb_u8(r, g, b), sprite.color, 1. - contrast.0); diff --git a/crates/border-wars/src/map/spawnpoint.rs b/crates/border-wars/src/map/spawnpoint.rs index b38e7ae..0cff0e8 100644 --- a/crates/border-wars/src/map/spawnpoint.rs +++ b/crates/border-wars/src/map/spawnpoint.rs @@ -1,9 +1,7 @@ //! TODO -use bevnet::Connection; use bevy::prelude::*; use bevy::utils::hashbrown::HashSet; -use bevy::utils::HashMap; use super::generation::EndMapGeneration; use super::ownership::Owner; @@ -25,9 +23,8 @@ fn init_spawn_point( mut end_map_event: EventReader, players: Query<&Player>, mut map: Query<(Entity, &TilePosition, &mut Tile)>, - connection: Res, ) { - for _ in end_map_event.iter() { + for _ in end_map_event.read() { let Some(radius) = map.iter().map(|(_, p, _)| p.0.abs()).max() else { return; }; -- 2.43.4 From 956f00d8f06b72df82018d9732978761e9f4603f Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Thu, 4 Apr 2024 07:51:17 +0200 Subject: [PATCH 06/10] save --- crates/border-wars/src/map/spawnpoint.rs | 27 +++++++++++++++++------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/crates/border-wars/src/map/spawnpoint.rs b/crates/border-wars/src/map/spawnpoint.rs index 0cff0e8..f6036f9 100644 --- a/crates/border-wars/src/map/spawnpoint.rs +++ b/crates/border-wars/src/map/spawnpoint.rs @@ -30,29 +30,40 @@ fn init_spawn_point( }; if radius == 0 { + warn!("The map radius is 0 "); return; } - let ring: HashSet = - TilePosition::new(0, 0).ring(radius as usize / 2).collect(); + let target_ring = TilePosition::new(0, 0) + .ring(radius as usize / 2) + .collect::>(); let mut sorted_tiles = map .iter_mut() - .filter(|(_, p, _)| ring.contains(*p)) + .filter(|(_, p, _)| target_ring.contains(*p)) .collect::>(); + println!("{}", sorted_tiles.len()); + sorted_tiles.sort_by(|a, b| compare_spawnpoint_entity(a.1, b.1)); let mut sorted_players = players.iter().collect::>(); sorted_players.sort_by(|a: &&Player, b: &&Player| compare_player(a, b)); + let mut sorted_players = sorted_players.iter(); - for (i, tile) in sorted_tiles.iter_mut().enumerate() { - let Some(player) = sorted_players.get(i) else { + let number_players = sorted_players.len(); + + for (i, (entity, _, tile)) in sorted_tiles.iter_mut().enumerate() { + if i % radius as usize * 3 / number_players != 0 { + continue; + } + **tile = Tile::Castle; + let Some(player) = sorted_players.next() else { continue; }; - println!("{:?}", player); - *tile.2 = Tile::Castle; - commands.entity(tile.0).insert(Owner(Player::clone(player))); + commands + .entity(*entity) + .insert(Owner(Player::clone(player))); } } } -- 2.43.4 From b9ffb82db54d0a4b283737c48dfcfddb24fa934f Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Thu, 4 Apr 2024 18:30:40 +0200 Subject: [PATCH 07/10] save --- crates/border-wars/src/map/spawnpoint.rs | 32 +++++++++--------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/crates/border-wars/src/map/spawnpoint.rs b/crates/border-wars/src/map/spawnpoint.rs index f6036f9..0b46769 100644 --- a/crates/border-wars/src/map/spawnpoint.rs +++ b/crates/border-wars/src/map/spawnpoint.rs @@ -1,7 +1,6 @@ //! TODO use bevy::prelude::*; -use bevy::utils::hashbrown::HashSet; use super::generation::EndMapGeneration; use super::ownership::Owner; @@ -34,36 +33,29 @@ fn init_spawn_point( return; } - let target_ring = TilePosition::new(0, 0) - .ring(radius as usize / 2) - .collect::>(); - - let mut sorted_tiles = map - .iter_mut() - .filter(|(_, p, _)| target_ring.contains(*p)) - .collect::>(); - - println!("{}", sorted_tiles.len()); - - sorted_tiles.sort_by(|a, b| compare_spawnpoint_entity(a.1, b.1)); - let mut sorted_players = players.iter().collect::>(); sorted_players.sort_by(|a: &&Player, b: &&Player| compare_player(a, b)); let mut sorted_players = sorted_players.iter(); let number_players = sorted_players.len(); - for (i, (entity, _, tile)) in sorted_tiles.iter_mut().enumerate() { - if i % radius as usize * 3 / number_players != 0 { + for (i, target_pos) in TilePosition::new(0, 0) + .ring(radius as usize / 2) + .enumerate() + { + let Some((entity, _, mut tile)) = map.iter_mut().find(|(_, p, _)| **p == target_pos) + else { + continue; + }; + + if i % ((radius as usize * 3) / number_players) != 0 { continue; } - **tile = Tile::Castle; + *tile = Tile::Castle; let Some(player) = sorted_players.next() else { continue; }; - commands - .entity(*entity) - .insert(Owner(Player::clone(player))); + commands.entity(entity).insert(Owner(Player::clone(player))); } } } -- 2.43.4 From 49976391ec39da1401c9454b3f73ba9d525b68db Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Thu, 4 Apr 2024 20:57:57 +0200 Subject: [PATCH 08/10] save --- crates/border-wars/src/main.rs | 4 +-- crates/border-wars/src/map/spawnpoint.rs | 45 ++++++++++-------------- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/crates/border-wars/src/main.rs b/crates/border-wars/src/main.rs index 3428129..b6b2301 100644 --- a/crates/border-wars/src/main.rs +++ b/crates/border-wars/src/main.rs @@ -6,7 +6,7 @@ use border_wars::map::generation::MapGenerationPlugin; use border_wars::map::ownership::OwnershipPlugin; use border_wars::map::renderer::RendererPlugin; use border_wars::map::selected_tile::SelectTilePlugin; -use border_wars::map::spawnpoint::SpawnPointPlugin; +use border_wars::map::spawnpoint::SpawnpointPlugin; use border_wars::networking::NetworkingPlugin; use border_wars::scenes::ScenesPlugin; use border_wars::ui::UiPlugin; @@ -21,7 +21,7 @@ fn main() { .add_plugins(NetworkingPlugin) .add_plugins(MapGenerationPlugin) .add_plugins(UiPlugin) - .add_plugins(SpawnPointPlugin) + .add_plugins(SpawnpointPlugin) .add_plugins(OwnershipPlugin) .run(); } diff --git a/crates/border-wars/src/map/spawnpoint.rs b/crates/border-wars/src/map/spawnpoint.rs index 0b46769..9bfff25 100644 --- a/crates/border-wars/src/map/spawnpoint.rs +++ b/crates/border-wars/src/map/spawnpoint.rs @@ -1,4 +1,4 @@ -//! TODO +//! All code related to set the spawn point of the players. use bevy::prelude::*; @@ -7,10 +7,10 @@ use super::ownership::Owner; use super::{Tile, TilePosition}; use crate::Player; -/// The plugin for the spawn point. -pub struct SpawnPointPlugin; +/// The plugin that initialize the spawn point at the start of the game. +pub struct SpawnpointPlugin; -impl Plugin for SpawnPointPlugin { +impl Plugin for SpawnpointPlugin { fn build(&self, app: &mut App) { app.add_systems(Update, init_spawn_point); } @@ -24,53 +24,46 @@ fn init_spawn_point( mut map: Query<(Entity, &TilePosition, &mut Tile)>, ) { for _ in end_map_event.read() { + // Calculate the radius of the map. let Some(radius) = map.iter().map(|(_, p, _)| p.0.abs()).max() else { + warn!("The map is empty"); return; }; if radius == 0 { - warn!("The map radius is 0 "); + warn!("The map is empty"); return; } let mut sorted_players = players.iter().collect::>(); - sorted_players.sort_by(|a: &&Player, b: &&Player| compare_player(a, b)); + sorted_players.sort_by(|a: &&Player, b: &&Player| a.uuid.cmp(&b.uuid)); let mut sorted_players = sorted_players.iter(); - let number_players = sorted_players.len(); + let interval = radius as usize * 3 / sorted_players.len(); - for (i, target_pos) in TilePosition::new(0, 0) + for (i, position) in TilePosition::new(0, 0) .ring(radius as usize / 2) .enumerate() { - let Some((entity, _, mut tile)) = map.iter_mut().find(|(_, p, _)| **p == target_pos) + // Find the target tile. + let Some((entity, _, mut tile)) = map.iter_mut().find(|(_, p, _)| **p == position) else { continue; }; - if i % ((radius as usize * 3) / number_players) != 0 { + // Check the interval between players. + if i % interval != 0 { continue; } - *tile = Tile::Castle; + + // Get the current player. let Some(player) = sorted_players.next() else { continue; }; + + // Set the spawn point. + *tile = Tile::Castle; commands.entity(entity).insert(Owner(Player::clone(player))); } } } - -/// TODO -fn compare_player(a: &Player, b: &Player) -> std::cmp::Ordering { - a.uuid.cmp(&b.uuid) -} - -/// TODO -fn compare_spawnpoint_entity(a: &TilePosition, b: &TilePosition) -> std::cmp::Ordering { - let r = a.0.abs().cmp(&b.0.abs()); - if r == std::cmp::Ordering::Equal { - a.1.cmp(&b.1) - } else { - r - } -} -- 2.43.4 From d4bec3ac3d64426d4d432fbe65630ec4bb92f042 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Thu, 4 Apr 2024 21:09:22 +0200 Subject: [PATCH 09/10] add truc --- crates/border-wars/src/map/spawnpoint.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/border-wars/src/map/spawnpoint.rs b/crates/border-wars/src/map/spawnpoint.rs index 9bfff25..f128acf 100644 --- a/crates/border-wars/src/map/spawnpoint.rs +++ b/crates/border-wars/src/map/spawnpoint.rs @@ -37,6 +37,7 @@ fn init_spawn_point( let mut sorted_players = players.iter().collect::>(); sorted_players.sort_by(|a: &&Player, b: &&Player| a.uuid.cmp(&b.uuid)); + let mut sorted_players = sorted_players.iter(); let interval = radius as usize * 3 / sorted_players.len(); -- 2.43.4 From cc8579771a49bc5a5b65e71d392be28a21944fe3 Mon Sep 17 00:00:00 2001 From: CoCo_Sol Date: Sat, 6 Apr 2024 14:41:06 +0200 Subject: [PATCH 10/10] save --- crates/border-wars/src/map/spawnpoint.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/border-wars/src/map/spawnpoint.rs b/crates/border-wars/src/map/spawnpoint.rs index f128acf..5dd59e6 100644 --- a/crates/border-wars/src/map/spawnpoint.rs +++ b/crates/border-wars/src/map/spawnpoint.rs @@ -40,23 +40,25 @@ fn init_spawn_point( let mut sorted_players = sorted_players.iter(); + // Calculate the distance between the players. It must be an integer because + // this is how the map is generated. let interval = radius as usize * 3 / sorted_players.len(); for (i, position) in TilePosition::new(0, 0) .ring(radius as usize / 2) .enumerate() { + // Check the interval between players. + if i % interval != 0 { + continue; + } + // Find the target tile. let Some((entity, _, mut tile)) = map.iter_mut().find(|(_, p, _)| **p == position) else { continue; }; - // Check the interval between players. - if i % interval != 0 { - continue; - } - // Get the current player. let Some(player) = sorted_players.next() else { continue; -- 2.43.4