WIP: Add a selection of the spawnpoint for every players #108

Draft
CoCo_Sol wants to merge 12 commits from select-spawnpoint into main
2 changed files with 31 additions and 47 deletions
Showing only changes of commit 7fbce4aaa6 - Show all commits

View file

@ -31,10 +31,11 @@ fn setup_ownership_resources(mut commands: Commands) {
/// Render the ownership of the tiles by applying colors. /// Render the ownership of the tiles by applying colors.
fn render_ownership( fn render_ownership(
mut query: Query<(&mut Sprite, &Owner), Changed<Owner>>, mut query: Query<(&mut Sprite, &Owner), (Changed<Owner>, Changed<Sprite>)>,
contrast: Res<OwnershipColorContrast>, contrast: Res<OwnershipColorContrast>,
) { ) {
for (mut sprite, owner) in query.iter_mut() { for (mut sprite, owner) in query.iter_mut() {
println!("{:?}", contrast.0);
let (r, g, b) = owner.0.color; let (r, g, b) = owner.0.color;
let target = mix_colors(Color::rgb_u8(r, g, b), sprite.color, 1. - contrast.0); let target = mix_colors(Color::rgb_u8(r, g, b), sprite.color, 1. - contrast.0);

View file

@ -6,7 +6,8 @@ use bevy::utils::hashbrown::HashSet;
use bevy::utils::HashMap; use bevy::utils::HashMap;
use super::generation::EndMapGeneration; use super::generation::EndMapGeneration;
use super::TilePosition; use super::ownership::Owner;
use super::{Tile, TilePosition};
use crate::Player; use crate::Player;
/// The plugin for the spawn point. /// The plugin for the spawn point.
@ -22,68 +23,50 @@ impl Plugin for SpawnPointPlugin {
fn init_spawn_point( fn init_spawn_point(
mut commands: Commands, mut commands: Commands,
mut end_map_event: EventReader<EndMapGeneration>, mut end_map_event: EventReader<EndMapGeneration>,
players: Query<(Entity, &Player)>, players: Query<&Player>,
map: Query<(Entity, &TilePosition)>, mut map: Query<(Entity, &TilePosition, &mut Tile)>,
connection: Res<Connection>, connection: Res<Connection>,
) { ) {
if end_map_event.is_empty() { for _ in end_map_event.iter() {
return; let Some(radius) = map.iter().map(|(_, p, _)| p.0.abs()).max() else {
}
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 {
return; return;
}; };
if i % (radius as usize * 3 / nb_player) != 0 { if radius == 0 {
continue; return;
} }
spawnpoints.push((*target_entity, target_position));
}
let mut sorted_players = players.iter().collect::<Vec<_>>(); let ring: HashSet<TilePosition> =
sorted_players.sort_by(compare_player); TilePosition::new(0, 0).ring(radius as usize / 2).collect();
spawnpoints.sort_by(compare_spawnpoint_entity);
for (i, (target_entity, target_position)) in spawnpoints.iter().enumerate() { let mut sorted_tiles = map
let player = sorted_players[i].1; .iter_mut()
if Some(player.uuid) == connection.identifier() { .filter(|(_, p, _)| ring.contains(*p))
commands.entity(*target_entity).despawn(); .collect::<Vec<_>>();
sorted_tiles.sort_by(|a, b| compare_spawnpoint_entity(a.1, b.1));
let mut sorted_players = players.iter().collect::<Vec<_>>();
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 /// 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) a.uuid.cmp(&b.uuid)
} }
/// TODO /// TODO
fn compare_spawnpoint_entity( fn compare_spawnpoint_entity(a: &TilePosition, b: &TilePosition) -> std::cmp::Ordering {
(_, a): &(Entity, TilePosition),
(_, b): &(Entity, TilePosition),
) -> std::cmp::Ordering {
let r = a.0.abs().cmp(&b.0.abs()); let r = a.0.abs().cmp(&b.0.abs());
if r == std::cmp::Ordering::Equal { if r == std::cmp::Ordering::Equal {
a.1.cmp(&b.1) a.1.cmp(&b.1)