generated from tipragot/rust
This commit is contained in:
parent
c50d602268
commit
d557bf6d02
|
@ -21,6 +21,6 @@ pub enum CurrentScene {
|
||||||
/// When we play this wonderful game.
|
/// When we play this wonderful game.
|
||||||
Game,
|
Game,
|
||||||
|
|
||||||
/// When we are in the waiting menu.
|
/// TODO.
|
||||||
WaitingMenu,
|
AdminLobby,
|
||||||
}
|
}
|
||||||
|
|
110
crates/border-wars/src/scenes/admin_lobby.rs
Normal file
110
crates/border-wars/src/scenes/admin_lobby.rs
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
//! The lobby of the game.
|
||||||
|
|
||||||
|
use bevnet::{Connection, Receive, SendTo, Uuid};
|
||||||
|
use bevy::prelude::*;
|
||||||
|
use bevy_egui::{egui, EguiContexts};
|
||||||
|
|
||||||
|
use super::handle_new_players;
|
||||||
|
use crate::connection::{AddPlayer, AllPlayers, RemovePlayer, RequestConnection};
|
||||||
|
use crate::CurrentScene;
|
||||||
|
|
||||||
|
/// The plugin for the lobby.
|
||||||
|
pub struct LobbyPlugin;
|
||||||
|
|
||||||
|
impl Plugin for LobbyPlugin {
|
||||||
|
fn build(&self, app: &mut App) {
|
||||||
|
app.add_systems(
|
||||||
|
Update,
|
||||||
|
(lobby_ui, handle_request, admin_panel, handle_new_players)
|
||||||
|
.run_if(in_state(CurrentScene::AdminLobby)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Display the UI of the lobby.
|
||||||
|
fn lobby_ui(mut ctx: EguiContexts, connection: Res<Connection>) {
|
||||||
|
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(),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// TODO
|
||||||
|
fn admin_panel(
|
||||||
|
mut ctx: EguiContexts,
|
||||||
|
connection: Res<Connection>,
|
||||||
|
all_players: Res<AllPlayers>,
|
||||||
|
mut event: EventWriter<SendTo<RemovePlayer>>,
|
||||||
|
mut next_scene: ResMut<NextState<CurrentScene>>,
|
||||||
|
) {
|
||||||
|
egui::Window::new("Admin").show(ctx.ctx_mut(), |ui| {
|
||||||
|
for player in all_players.0.iter() {
|
||||||
|
ui.separator();
|
||||||
|
ui.label(player.1.to_string());
|
||||||
|
if Some(*player.0) == connection.identifier() {
|
||||||
|
ui.label("The most beautiful admin (You)");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let button = ui.button(format!("Kick {}", player.1));
|
||||||
|
if button.clicked() {
|
||||||
|
for target_player in all_players.0.iter() {
|
||||||
|
event.send(SendTo(*target_player.0, RemovePlayer { uuid: *player.0 }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ui.separator();
|
||||||
|
if ui.button("Run the game").clicked() {
|
||||||
|
next_scene.set(CurrentScene::Game);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// TODO
|
||||||
|
fn handle_request(
|
||||||
|
mut events: EventReader<Receive<RequestConnection>>,
|
||||||
|
all_players: Res<AllPlayers>,
|
||||||
|
mut new_players: EventWriter<SendTo<AddPlayer>>,
|
||||||
|
) {
|
||||||
|
for event in events.read() {
|
||||||
|
for player in all_players.0.iter() {
|
||||||
|
let player1 = (event.0, event.1.name.clone());
|
||||||
|
let player2 = (*player.0, player.1.clone());
|
||||||
|
link_two_players(player1, player2, &mut new_players);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// TODO
|
||||||
|
fn link_two_players(
|
||||||
|
player1: (Uuid, String),
|
||||||
|
player2: (Uuid, String),
|
||||||
|
event: &mut EventWriter<SendTo<AddPlayer>>,
|
||||||
|
) {
|
||||||
|
event.send(SendTo(
|
||||||
|
player1.0,
|
||||||
|
AddPlayer {
|
||||||
|
uuid: player2.0,
|
||||||
|
name: player2.1.clone(),
|
||||||
|
},
|
||||||
|
));
|
||||||
|
event.send(SendTo(
|
||||||
|
player2.0,
|
||||||
|
AddPlayer {
|
||||||
|
uuid: player1.0,
|
||||||
|
name: player1.1,
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
|
@ -1,90 +1,33 @@
|
||||||
//! The lobby of the game.
|
//! The file containing the lobby scene where players can wait.
|
||||||
|
|
||||||
use bevnet::{Connection, Receive, SendTo};
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy_egui::{egui, EguiContexts};
|
use bevy_egui::{egui, EguiContexts};
|
||||||
|
|
||||||
use crate::connection::{AddPlayer, AllPlayers, RemovePlayer, RequestConnection};
|
use super::handle_new_players;
|
||||||
|
use crate::connection::AllPlayers;
|
||||||
use crate::CurrentScene;
|
use crate::CurrentScene;
|
||||||
|
|
||||||
/// The plugin for the lobby.
|
/// The plugin for the lobby.
|
||||||
pub struct LobbyPlugin;
|
pub struct WaitingMenuPlugin;
|
||||||
|
|
||||||
impl Plugin for LobbyPlugin {
|
impl Plugin for WaitingMenuPlugin {
|
||||||
fn build(&self, app: &mut App) {
|
fn build(&self, app: &mut App) {
|
||||||
app.add_systems(
|
app.add_systems(
|
||||||
Update,
|
Update,
|
||||||
(lobby_ui, handle_request).run_if(in_state(CurrentScene::Lobby)),
|
(ui, handle_new_players).run_if(in_state(CurrentScene::Lobby)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Display the UI of the lobby.
|
/// TODO
|
||||||
fn lobby_ui(
|
fn ui(all_players: Res<AllPlayers>, mut ctx: EguiContexts) {
|
||||||
mut ctx: EguiContexts,
|
|
||||||
mut next_scene: ResMut<NextState<CurrentScene>>,
|
|
||||||
connection: Res<Connection>,
|
|
||||||
mut all_players: ResMut<AllPlayers>,
|
|
||||||
mut event: EventWriter<SendTo<RemovePlayer>>,
|
|
||||||
) {
|
|
||||||
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
|
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
|
||||||
ui.heading("Border Wars");
|
ui.heading("Border Wars");
|
||||||
|
|
||||||
ui.separator();
|
ui.separator();
|
||||||
|
|
||||||
ui.label("Game created");
|
for (uuid, name) in all_players.0.iter() {
|
||||||
ui.horizontal(|ui| {
|
ui.label(format!("{}: {}", uuid, name));
|
||||||
ui.label("Game ID: ");
|
|
||||||
// TODO : get the game ID and display it.
|
|
||||||
ui.text_edit_singleline(&mut connection.identifier().unwrap().to_string());
|
|
||||||
});
|
|
||||||
|
|
||||||
ui.separator();
|
|
||||||
|
|
||||||
if ui.button("Run the game").clicked() {
|
|
||||||
next_scene.set(CurrentScene::Game);
|
|
||||||
// TODO: run the game
|
|
||||||
}
|
|
||||||
});
|
|
||||||
egui::Window::new("Admin").show(ctx.ctx_mut(), |ui| {
|
|
||||||
for player in all_players.0.iter() {
|
|
||||||
ui.label(format!("{}", player.1));
|
|
||||||
ui.separator();
|
|
||||||
if player.0 == &connection.identifier().unwrap() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
let button = ui.button(format!("Kick {}", player.1));
|
|
||||||
if button.clicked() {
|
|
||||||
for target_player in all_players.0.iter() {
|
|
||||||
event.send(SendTo(*target_player.0, RemovePlayer { uuid: *player.0 }));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_request(
|
|
||||||
mut events: EventReader<Receive<RequestConnection>>,
|
|
||||||
mut all_players: ResMut<AllPlayers>,
|
|
||||||
mut new_players: EventWriter<SendTo<AddPlayer>>,
|
|
||||||
) {
|
|
||||||
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(),
|
|
||||||
},
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -23,10 +23,18 @@ fn menu_ui(
|
||||||
mut ctx: EguiContexts,
|
mut ctx: EguiContexts,
|
||||||
mut connection_string: Local<String>,
|
mut connection_string: Local<String>,
|
||||||
mut next_scene: ResMut<NextState<CurrentScene>>,
|
mut next_scene: ResMut<NextState<CurrentScene>>,
|
||||||
mut all_players: ResMut<AllPlayers>,
|
all_players: Res<AllPlayers>,
|
||||||
mut connection: Res<Connection>,
|
connection: Res<Connection>,
|
||||||
mut request_join_event: EventWriter<SendTo<RequestConnection>>,
|
mut request_join_event: EventWriter<SendTo<RequestConnection>>,
|
||||||
) {
|
) {
|
||||||
|
let Some(connection_id) = connection.identifier() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
let Ok(target_uuid) = Uuid::parse_str(&connection_string) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
|
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
|
||||||
ui.heading("Border Wars");
|
ui.heading("Border Wars");
|
||||||
|
|
||||||
|
@ -38,14 +46,14 @@ fn menu_ui(
|
||||||
ui.text_edit_singleline(&mut *connection_string);
|
ui.text_edit_singleline(&mut *connection_string);
|
||||||
|
|
||||||
if ui.button("Join").clicked() {
|
if ui.button("Join").clicked() {
|
||||||
next_scene.set(CurrentScene::WaitingMenu);
|
next_scene.set(CurrentScene::Lobby);
|
||||||
request_join_event.send(SendTo(
|
request_join_event.send(SendTo(
|
||||||
Uuid::parse_str(&connection_string).unwrap(),
|
target_uuid,
|
||||||
RequestConnection {
|
RequestConnection {
|
||||||
name: all_players
|
name: all_players
|
||||||
.0
|
.0
|
||||||
.get(&connection.identifier().unwrap())
|
.get(&connection_id)
|
||||||
.unwrap()
|
.unwrap_or(&"Unknown".to_string())
|
||||||
.clone(),
|
.clone(),
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
|
@ -55,25 +63,26 @@ fn menu_ui(
|
||||||
ui.separator();
|
ui.separator();
|
||||||
|
|
||||||
if ui.button("Create new game").clicked() {
|
if ui.button("Create new game").clicked() {
|
||||||
next_scene.set(CurrentScene::Lobby);
|
next_scene.set(CurrentScene::AdminLobby);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// TODO
|
||||||
fn name_settings(
|
fn name_settings(
|
||||||
mut ctx: EguiContexts,
|
mut ctx: EguiContexts,
|
||||||
mut all_players: ResMut<AllPlayers>,
|
mut all_players: ResMut<AllPlayers>,
|
||||||
mut local_name: Local<String>,
|
mut local_name: Local<String>,
|
||||||
mut connection: Res<Connection>,
|
connection: Res<Connection>,
|
||||||
) {
|
) {
|
||||||
|
let Some(connection_id) = connection.identifier() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
egui::Window::new("Name settings").show(ctx.ctx_mut(), |ui| {
|
egui::Window::new("Name settings").show(ctx.ctx_mut(), |ui| {
|
||||||
ui.label("Enter your name:");
|
ui.label("Enter your name:");
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
let text = ui.text_edit_singleline(&mut *local_name);
|
if ui.text_edit_singleline(&mut *local_name).changed() {
|
||||||
if text.changed() {
|
all_players.0.insert(connection_id, local_name.to_string());
|
||||||
all_players
|
|
||||||
.0
|
|
||||||
.insert(connection.identifier().unwrap(), local_name.to_string());
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
//! The file containing all scenes programs.
|
//! The file containing all scenes programs.
|
||||||
|
|
||||||
|
use bevnet::{Connection, Receive};
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy_egui::EguiPlugin;
|
use bevy_egui::EguiPlugin;
|
||||||
|
|
||||||
|
use crate::connection::{AddPlayer, AllPlayers, RemovePlayer};
|
||||||
use crate::{responsive_scale, CurrentScene};
|
use crate::{responsive_scale, CurrentScene};
|
||||||
|
|
||||||
|
pub mod admin_lobby;
|
||||||
pub mod lobby;
|
pub mod lobby;
|
||||||
pub mod menu;
|
pub mod menu;
|
||||||
pub mod waiting_menu;
|
|
||||||
|
|
||||||
/// The plugin for all scenes.
|
/// The plugin for all scenes.
|
||||||
pub struct ScenesPlugin;
|
pub struct ScenesPlugin;
|
||||||
|
@ -17,8 +19,30 @@ impl Plugin for ScenesPlugin {
|
||||||
app.add_plugins(EguiPlugin)
|
app.add_plugins(EguiPlugin)
|
||||||
.add_state::<CurrentScene>()
|
.add_state::<CurrentScene>()
|
||||||
.add_plugins(menu::MenuPlugin)
|
.add_plugins(menu::MenuPlugin)
|
||||||
.add_plugins(lobby::LobbyPlugin)
|
.add_plugins(admin_lobby::LobbyPlugin)
|
||||||
.add_plugins(waiting_menu::WaitingMenuPlugin)
|
.add_plugins(lobby::WaitingMenuPlugin)
|
||||||
.add_plugins(responsive_scale::ResponsiveScalingPlugin);
|
.add_plugins(responsive_scale::ResponsiveScalingPlugin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// TODO
|
||||||
|
pub fn handle_new_players(
|
||||||
|
mut all_players: ResMut<AllPlayers>,
|
||||||
|
mut new_players: EventReader<Receive<AddPlayer>>,
|
||||||
|
mut remove_players: EventReader<Receive<RemovePlayer>>,
|
||||||
|
self_uuid: Res<Connection>,
|
||||||
|
mut next_scene: ResMut<NextState<CurrentScene>>,
|
||||||
|
) {
|
||||||
|
for new_player in new_players.read() {
|
||||||
|
all_players
|
||||||
|
.0
|
||||||
|
.insert(new_player.1.uuid, new_player.1.name.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
for remove_player in remove_players.read() {
|
||||||
|
if remove_player.1.uuid == self_uuid.identifier().unwrap_or_default() {
|
||||||
|
next_scene.set(CurrentScene::Menu);
|
||||||
|
}
|
||||||
|
all_players.0.remove(&remove_player.1.uuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
//! TODO
|
|
||||||
|
|
||||||
use bevnet::{Connection, Receive};
|
|
||||||
use bevy::prelude::*;
|
|
||||||
use bevy_egui::{egui, EguiContexts};
|
|
||||||
|
|
||||||
use crate::connection::{AddPlayer, AllPlayers, RemovePlayer, 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<AllPlayers>, 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));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
fn handle_new_players(
|
|
||||||
mut all_players: ResMut<AllPlayers>,
|
|
||||||
mut new_players: EventReader<Receive<AddPlayer>>,
|
|
||||||
mut remove_players: EventReader<Receive<RemovePlayer>>,
|
|
||||||
self_uuid: Res<Connection>,
|
|
||||||
) {
|
|
||||||
for new_player in new_players.iter() {
|
|
||||||
all_players
|
|
||||||
.0
|
|
||||||
.insert(new_player.1.uuid, new_player.1.name.clone());
|
|
||||||
}
|
|
||||||
|
|
||||||
for remove_player in remove_players.iter() {
|
|
||||||
if remove_player.1.uuid == self_uuid.identifier().unwrap() {
|
|
||||||
todo!("end the game");
|
|
||||||
}
|
|
||||||
all_players.0.remove(&remove_player.1.uuid);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue