added scripting because of course i did

This commit is contained in:
Schrottkatze 2025-06-18 19:29:45 +02:00
parent 3a3c238cd8
commit d43b5b64e1
Signed by: schrottkatze
SSH key fingerprint: SHA256:FPOYVeBy3QP20FEM42uWF1Wa/Qhlk+L3S2+Wuau/Auo
6 changed files with 95 additions and 25 deletions

View file

@ -1,34 +1,15 @@
//! Seperate out debugging uis/plugins in it's own module for cleanliness.
use std::{fs, path::PathBuf};
use bevy::prelude::*;
use bevy_inspector_egui::bevy_egui::EguiPlugin;
use clap::Subcommand;
use console::ConsoleLog;
use util::{console_err, console_log};
use console::{ConsoleLog, exec_script};
use crate::AppState;
mod console;
mod util {
use bevy::prelude::*;
use super::DebugEvent;
pub fn console_log(dbg_writer: &mut EventWriter<DebugEvent>, s: impl Into<String>) {
dbg_writer.write(DebugEvent::PrintToConsole {
error: false,
text: s.into(),
});
}
pub fn console_err(dbg_writer: &mut EventWriter<DebugEvent>, s: impl Into<String>) {
dbg_writer.write(DebugEvent::PrintToConsole {
error: false,
text: s.into(),
});
}
}
/// Debug system set.
#[derive(SystemSet, Debug, Clone, PartialEq, Eq, Hash)]
pub struct DebugSet;
@ -37,8 +18,12 @@ pub fn plugin(app: &mut App) {
app.add_plugins(EguiPlugin {
enable_multipass_for_primary_context: true,
})
.add_systems(Update, start_game.in_set(DebugSet))
.add_event::<DebugEvent>()
.add_systems(
Update,
(handle_debug_logs, start_game, run_file.pipe(exec_script)).in_set(DebugSet),
)
.add_systems(Startup, startup_file.pipe(exec_script))
.add_plugins(console::plugin);
}
@ -49,17 +34,32 @@ enum DebugEvent {
CloseDebugConsole,
/// Output a string to the console.
///
/// Needed for logging in startup scripts, since the console isn't initialized yet.
#[command(name = "echo", aliases = ["print", "print-to-console"])]
PrintToConsole {
/// Print as error
/// Print as error.
#[arg(short, long)]
error: bool,
/// The text to be printed in the console.
text: String,
},
/// Log as INFO or ERROR to stdout.
Log {
/// Log as error.
#[arg(short, long)]
error: bool,
/// The text to be logged.
text: String,
},
/// Start the game
StartGame,
/// Run a tx file (the games debug scripting lang :3)
#[command(name = "run")]
RunFile { file: PathBuf },
}
fn start_game(
@ -79,3 +79,40 @@ fn start_game(
}
}
}
fn handle_debug_logs(mut dbg_reader: EventReader<DebugEvent>) {
for ev in dbg_reader.read() {
if let DebugEvent::Log { error, text } = ev {
if *error {
error!("{text}")
} else {
info!("{text}")
};
}
}
}
fn run_file(mut dbg_reader: EventReader<DebugEvent>) -> Option<(String, String)> {
for ev in dbg_reader.read() {
if let DebugEvent::RunFile { file } = ev {
let f = std::fs::read_to_string(file);
if let Ok(f) = f {
return Some((f, String::from(file.file_name().unwrap().to_string_lossy())));
}
}
}
None
}
fn startup_file() -> Option<(String, String)> {
let path: PathBuf = "./startup.tx".into();
fs::exists(&path).unwrap_or(false).then(|| {
Some((
fs::read_to_string(&path).unwrap(),
path.file_name().unwrap().to_string_lossy().to_string(),
))
})?
}