diff --git a/src/debug.rs b/src/debug.rs index e5c1173..63c5e1a 100644 --- a/src/debug.rs +++ b/src/debug.rs @@ -19,9 +19,16 @@ pub fn plugin(app: &mut App) { enable_multipass_for_primary_context: true, }) .add_event::() + .init_state::() .add_systems( Update, - (handle_debug_logs, start_game, run_file.pipe(exec_script)).in_set(DebugSet), + ( + handle_debug_logs, + handle_enable_debug_mode.run_if(not(in_state(DebugMode::Enabled))), + start_game, + run_file.pipe(exec_script), + ) + .in_set(DebugSet), ) .add_systems(Startup, startup_file.pipe(exec_script)) .add_plugins(console::plugin); @@ -60,6 +67,23 @@ enum DebugEvent { /// Run a tx file (the games debug scripting lang :3) #[command(name = "run")] RunFile { file: PathBuf }, + + /// Enable debug mode. + /// Will cause the game to behave differently (mostly, not do things by default it otherwise would.) + /// + /// Do note while all of this is part of the debug tooling, debug mode just gives the debug tools more controls of the game. + /// + /// Read: In debug mode, a lot of features of the normal game aren't enabled, and might have to be turned on explicitly. + /// This is to allow for easier testing. The console etc. will still stay available regardless, just might complain that debug mode isn't enabled on some commands. + /// + /// For best results, enable debug mode before starting the game. + /// + /// Debug mode cannot be disabled. Just restart the game lmao. + /// + /// Current debug mode behaviour: + /// - Nothing + #[command(name = "enable-debug", aliases = ["debug-enable"])] + EnableDebugMode, } fn start_game( @@ -80,6 +104,25 @@ fn start_game( } } +#[derive(States, Default, Debug, Clone, PartialEq, Eq, Hash, Reflect)] +pub enum DebugMode { + #[default] + Disabled, + Enabled, +} + +fn handle_enable_debug_mode( + mut dbg_reader: EventReader, + mut debug_state: ResMut>, +) { + for ev in dbg_reader.read() { + if matches!(ev, DebugEvent::EnableDebugMode) { + info!("Enabling debug mode. There be demons (hopefully the cute ones :3)!"); + debug_state.set(DebugMode::Enabled) + } + } +} + fn handle_debug_logs(mut dbg_reader: EventReader) { for ev in dbg_reader.read() { if let DebugEvent::Log { error, text } = ev { diff --git a/src/game.rs b/src/game.rs index 6b69f1b..8f59fdb 100644 --- a/src/game.rs +++ b/src/game.rs @@ -3,21 +3,28 @@ use bevy::prelude::*; use crate::{ AppState, cleanup::{self, despawn}, + debug::DebugMode, }; mod camera; mod scene; +mod debug {} /// Gameplay system set. All functions in this control the gameplay (duh). #[derive(SystemSet, Debug, Clone, PartialEq, Eq, Hash)] struct GameplaySet; pub fn plugin(app: &mut App) { - app.add_systems(OnEnter(AppState::Ingame), scene::setup.in_set(GameplaySet)) - .add_systems( - OnExit(AppState::Ingame), - despawn::.in_set(GameplaySet), - ) - .add_plugins(camera::plugin); + app.add_systems( + OnEnter(AppState::Ingame), + scene::setup + .in_set(GameplaySet) + .run_if(in_state(DebugMode::Disabled)), + ) + .add_systems( + OnExit(AppState::Ingame), + despawn::.in_set(GameplaySet), + ) + .add_plugins(camera::plugin); app.configure_sets(Update, GameplaySet.run_if(in_state(AppState::Ingame))); }