From 89095ffd6848dd36c6916657352497aed596047d Mon Sep 17 00:00:00 2001 From: Jonni Liljamo Date: Fri, 27 Jan 2023 13:47:10 +0200 Subject: [PATCH] feat!(sdbclient): change to iyes_loopless states --- sdbclient/src/main.rs | 5 +- .../src/plugins/menu/accountlogin/mod.rs | 29 ++--- sdbclient/src/plugins/menu/accountlogin/ui.rs | 10 +- .../src/plugins/menu/accountregister/mod.rs | 29 ++--- .../src/plugins/menu/accountregister/ui.rs | 10 +- sdbclient/src/plugins/menu/mod.rs | 100 ++++++++++-------- sdbclient/src/plugins/phases/loading/mod.rs | 11 +- sdbclient/src/plugins/phases/splash/mod.rs | 22 ++-- 8 files changed, 118 insertions(+), 98 deletions(-) diff --git a/sdbclient/src/main.rs b/sdbclient/src/main.rs index db38d58..dd07132 100644 --- a/sdbclient/src/main.rs +++ b/sdbclient/src/main.rs @@ -16,6 +16,8 @@ use bevy_inspector_egui::quick::WorldInspectorPlugin; use bevy_mod_scripting::prelude::*; +use iyes_loopless::prelude::*; + mod api; mod cfg; mod constants; @@ -84,7 +86,8 @@ fn main() { .insert_resource(cfg::CfgUser::default()) .insert_resource(cfg::CfgDev::default()); - app.add_startup_system(setup).add_state(GameState::Splash); + app.add_startup_system(setup) + .add_loopless_state(GameState::Splash); app.add_plugin(plugins::config::ConfigPlugin) .add_plugin(plugins::connection_check::ConnectionCheckPlugin) diff --git a/sdbclient/src/plugins/menu/accountlogin/mod.rs b/sdbclient/src/plugins/menu/accountlogin/mod.rs index 7280a63..434fb5e 100644 --- a/sdbclient/src/plugins/menu/accountlogin/mod.rs +++ b/sdbclient/src/plugins/menu/accountlogin/mod.rs @@ -11,6 +11,7 @@ use bevy::{ tasks::{AsyncComputeTaskPool, Task}, }; use bevy_console::PrintConsoleLine; +use iyes_loopless::prelude::*; use futures_lite::future; @@ -31,18 +32,22 @@ pub struct AccountLoginPlugin; impl Plugin for AccountLoginPlugin { fn build(&self, app: &mut App) { - app.add_state(LoginState::None) + app.add_loopless_state(LoginState::None) // UI system .insert_resource(ui::InputsUserLogin::new()) .add_system_set( - SystemSet::on_update(LoginState::Input).with_system(ui::account_login_ui), + ConditionSet::new() + .run_in_state(LoginState::Input) + .with_system(ui::account_login_ui) + .into(), ) // Login system, as in calling the API + .add_enter_system(LoginState::LoggingIn, start_login_call) .add_system_set( - SystemSet::on_enter(LoginState::LoggingIn).with_system(start_login_call), - ) - .add_system_set( - SystemSet::on_update(LoginState::LoggingIn).with_system(handle_login_call), + ConditionSet::new() + .run_in_state(LoginState::LoggingIn) + .with_system(handle_login_call) + .into(), ); } } @@ -99,8 +104,6 @@ fn handle_login_call( mut commands: Commands, mut login_call_tasks: Query<(Entity, &mut LoginCall)>, mut inputs: ResMut, - mut login_state: ResMut>, - mut menu_state: ResMut>, mut cfg_user: ResMut, mut save_event_writer: EventWriter, mut console: EventWriter, @@ -127,22 +130,22 @@ fn handle_login_call( value: SaveEventValue::User(cfg_user.into_inner().clone()), }); - login_state.set(LoginState::None).unwrap(); - menu_state.set(MenuState::AccountLoggedIn).unwrap(); + commands.insert_resource(NextState(LoginState::None)); + commands.insert_resource(NextState(MenuState::AccountLoggedIn)); } ResponseUserInfoP::Error(error) => { console.send(PrintConsoleLine::new(format!( "Something went wrong with getting the user information after logging in, got error: '{}'", error ).into())); - login_state.set(LoginState::None).unwrap(); - menu_state.set(MenuState::AccountLoggedIn).unwrap(); + commands.insert_resource(NextState(LoginState::None)); + commands.insert_resource(NextState(MenuState::AccountLoggedIn)); } } } ResponseToken::Error(error) => { inputs.error = error.error.description; - login_state.set(LoginState::Input).unwrap(); + commands.insert_resource(NextState(LoginState::Input)); } } diff --git a/sdbclient/src/plugins/menu/accountlogin/ui.rs b/sdbclient/src/plugins/menu/accountlogin/ui.rs index 6c62988..74d1c6b 100644 --- a/sdbclient/src/plugins/menu/accountlogin/ui.rs +++ b/sdbclient/src/plugins/menu/accountlogin/ui.rs @@ -8,6 +8,7 @@ use bevy::prelude::*; use bevy_inspector_egui::bevy_egui::{egui, EguiContext}; +use iyes_loopless::prelude::*; use crate::util::eguipwd; @@ -34,9 +35,8 @@ impl InputsUserLogin { } pub fn account_login_ui( + mut commands: Commands, mut egui_context: ResMut, - mut menu_state: ResMut>, - mut login_state: ResMut>, mut inputs: ResMut, ) { egui::Window::new("Login") @@ -61,11 +61,11 @@ pub fn account_login_ui( ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { if ui.button("Cancel").clicked() { - login_state.set(LoginState::None).unwrap(); - menu_state.set(MenuState::AccountLoggedOut).unwrap(); + commands.insert_resource(NextState(LoginState::None)); + commands.insert_resource(NextState(MenuState::AccountLoggedOut)); } if ui.button("Login").clicked() { - login_state.set(LoginState::LoggingIn).unwrap(); + commands.insert_resource(NextState(LoginState::LoggingIn)); // Reset error field inputs.error = "".to_string(); } diff --git a/sdbclient/src/plugins/menu/accountregister/mod.rs b/sdbclient/src/plugins/menu/accountregister/mod.rs index be94ca2..ae00c32 100644 --- a/sdbclient/src/plugins/menu/accountregister/mod.rs +++ b/sdbclient/src/plugins/menu/accountregister/mod.rs @@ -11,6 +11,7 @@ use bevy::{ tasks::{AsyncComputeTaskPool, Task}, }; use bevy_console::PrintConsoleLine; +use iyes_loopless::prelude::*; use futures_lite::future; @@ -31,18 +32,22 @@ pub struct AccountRegisterPlugin; impl Plugin for AccountRegisterPlugin { fn build(&self, app: &mut App) { - app.add_state(RegisterState::None) + app.add_loopless_state(RegisterState::None) // UI system .insert_resource(ui::InputsUserRegister::new()) .add_system_set( - SystemSet::on_update(RegisterState::Input).with_system(ui::account_register_ui), + ConditionSet::new() + .run_in_state(RegisterState::Input) + .with_system(ui::account_register_ui) + .into(), ) // Register system, as in calling the API + .add_enter_system(RegisterState::Registering, start_register_call) .add_system_set( - SystemSet::on_enter(RegisterState::Registering).with_system(start_register_call), - ) - .add_system_set( - SystemSet::on_update(RegisterState::Registering).with_system(handle_register_call), + ConditionSet::new() + .run_in_state(RegisterState::Registering) + .with_system(handle_register_call) + .into(), ); } } @@ -96,8 +101,6 @@ fn handle_register_call( mut commands: Commands, mut register_call_tasks: Query<(Entity, &mut RegisterCall)>, mut inputs: ResMut, - mut register_state: ResMut>, - mut menu_state: ResMut>, mut cfg_user: ResMut, mut save_event_writer: EventWriter, mut console: EventWriter, @@ -124,8 +127,8 @@ fn handle_register_call( value: SaveEventValue::User(cfg_user.into_inner().clone()), }); - register_state.set(RegisterState::None).unwrap(); - menu_state.set(MenuState::AccountLoggedIn).unwrap(); + commands.insert_resource(NextState(RegisterState::None)); + commands.insert_resource(NextState(MenuState::AccountLoggedIn)); } ResponseToken::Error(error) => { // TODO: Handle? Is it possible to even get here without the server shitting itself between the register and token calls? @@ -134,14 +137,14 @@ fn handle_register_call( "Something went wrong with getting the user token after registering, got error: '{}'", error ).into())); - register_state.set(RegisterState::None).unwrap(); - menu_state.set(MenuState::AccountLoggedOut).unwrap(); + commands.insert_resource(NextState(RegisterState::None)); + commands.insert_resource(NextState(MenuState::AccountLoggedOut)); } } } ResponseRegister::Error(error) => { inputs.error = error.error.description; - register_state.set(RegisterState::Input).unwrap(); + commands.insert_resource(NextState(RegisterState::Input)); } } diff --git a/sdbclient/src/plugins/menu/accountregister/ui.rs b/sdbclient/src/plugins/menu/accountregister/ui.rs index 3157036..5837528 100644 --- a/sdbclient/src/plugins/menu/accountregister/ui.rs +++ b/sdbclient/src/plugins/menu/accountregister/ui.rs @@ -8,6 +8,7 @@ use bevy::prelude::*; use bevy_inspector_egui::bevy_egui::{egui, EguiContext}; +use iyes_loopless::prelude::*; use crate::util::eguipwd; @@ -40,9 +41,8 @@ impl InputsUserRegister { } pub fn account_register_ui( + mut commands: Commands, mut egui_context: ResMut, - mut menu_state: ResMut>, - mut register_state: ResMut>, mut inputs: ResMut, ) { egui::Window::new("Register") @@ -85,13 +85,13 @@ pub fn account_register_ui( ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { if ui.button("Cancel").clicked() { - register_state.set(RegisterState::None).unwrap(); - menu_state.set(MenuState::AccountLoggedOut).unwrap(); + commands.insert_resource(NextState(RegisterState::None)); + commands.insert_resource(NextState(MenuState::AccountLoggedOut)); } ui.add_enabled_ui(inputs.passwords_match, |ui| { if ui.button("Register").clicked() { - register_state.set(RegisterState::Registering).unwrap(); + commands.insert_resource(NextState(RegisterState::Registering)); // Reset error field inputs.error = "".to_string(); } diff --git a/sdbclient/src/plugins/menu/mod.rs b/sdbclient/src/plugins/menu/mod.rs index 81340eb..46b2482 100644 --- a/sdbclient/src/plugins/menu/mod.rs +++ b/sdbclient/src/plugins/menu/mod.rs @@ -7,6 +7,7 @@ */ use bevy::{app::AppExit, prelude::*}; +use iyes_loopless::prelude::*; use crate::cfg::CfgUser; @@ -47,34 +48,40 @@ impl Plugin for MenuPlugin { fn build(&self, app: &mut App) { app. // Start with no menu. The menu is loaded when the GameState::MainMenu is entered. - add_state(MenuState::None) - .add_system_set(SystemSet::on_enter(GameState::MainMenu).with_system(menu_setup)) + add_loopless_state(MenuState::None) + .add_enter_system(GameState::MainMenu, menu_setup) // Systems for main menu screen - .add_system_set(SystemSet::on_enter(MenuState::Main).with_system(main_menu_setup)) - .add_system_set(SystemSet::on_exit(MenuState::Main).with_system(despawn_screen::)) + .add_enter_system(MenuState::Main, main_menu_setup) + .add_exit_system(MenuState::Main, despawn_screen::) // Systems for settings menu screen - .add_system_set(SystemSet::on_enter(MenuState::Settings).with_system(settings_menu_setup)) - .add_system_set(SystemSet::on_exit(MenuState::Settings).with_system(despawn_screen::)) + .add_enter_system(MenuState::Settings, settings_menu_setup) + .add_exit_system(MenuState::Settings, despawn_screen::) // Systems for settings display screen - .add_system_set(SystemSet::on_enter(MenuState::SettingsDisplay).with_system(settings_display_setup)) - .add_system_set(SystemSet::on_exit(MenuState::SettingsDisplay).with_system(despawn_screen::)) + .add_enter_system(MenuState::SettingsDisplay, settings_display_setup) + .add_exit_system(MenuState::SettingsDisplay, despawn_screen::) // Systems for settings audio screen - .add_system_set(SystemSet::on_enter(MenuState::SettingsAudio).with_system(settings_audio_setup)) - .add_system_set(SystemSet::on_exit(MenuState::SettingsAudio).with_system(despawn_screen::)) + .add_enter_system(MenuState::SettingsAudio, settings_audio_setup) + .add_exit_system(MenuState::SettingsAudio, despawn_screen::) // Systems for settings misc screen - .add_system_set(SystemSet::on_enter(MenuState::SettingsMisc).with_system(settings_misc_setup)) - .add_system_set(SystemSet::on_exit(MenuState::SettingsMisc).with_system(despawn_screen::)) + .add_enter_system(MenuState::SettingsMisc, settings_misc_setup) + .add_exit_system(MenuState::SettingsMisc, despawn_screen::) // Systems for account loggedout screen - .add_system_set(SystemSet::on_enter(MenuState::AccountLoggedOut).with_system(account_loggedout_setup)) - .add_system_set(SystemSet::on_exit(MenuState::AccountLoggedOut).with_system(despawn_screen::)) + .add_enter_system(MenuState::AccountLoggedOut, account_loggedout_setup) + .add_exit_system(MenuState::AccountLoggedOut, despawn_screen::) // Systems for account loggedin screen - .add_system_set(SystemSet::on_enter(MenuState::AccountLoggedIn).with_system(account_loggedin_setup)) - .add_system_set(SystemSet::on_exit(MenuState::AccountLoggedIn).with_system(despawn_screen::)) + .add_enter_system(MenuState::AccountLoggedIn, account_loggedin_setup) + .add_exit_system(MenuState::AccountLoggedIn, despawn_screen::) // Systems for play screen - .add_system_set(SystemSet::on_enter(MenuState::Play).with_system(play_setup)) - .add_system_set(SystemSet::on_exit(MenuState::Play).with_system(despawn_screen::)) + .add_enter_system(MenuState::Play, play_setup) + .add_exit_system(MenuState::Play, despawn_screen::) // Common systems - .add_system_set(SystemSet::on_update(GameState::MainMenu).with_system(menu_action).with_system(button_system)); + .add_system_set( + ConditionSet::new() + .run_in_state(GameState::MainMenu) + .with_system(menu_action) + .with_system(button_system) + .into() + ); app.add_plugin(accountregister::AccountRegisterPlugin) .add_plugin(accountlogin::AccountLoginPlugin); @@ -133,49 +140,52 @@ enum MenuButtonAction { } fn menu_action( + mut commands: Commands, interaction_query: Query< (&Interaction, &MenuButtonAction), (Changed, With