From ec40f6e3acc7874b82709ab81b254c741529fdff Mon Sep 17 00:00:00 2001 From: Mica White Date: Mon, 26 Oct 2026 10:52:04 -0400 Subject: Finish engine --- platforms/tortuise-script-compiled/src/lib.rs | 119 ++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 platforms/tortuise-script-compiled/src/lib.rs (limited to 'platforms/tortuise-script-compiled/src/lib.rs') diff --git a/platforms/tortuise-script-compiled/src/lib.rs b/platforms/tortuise-script-compiled/src/lib.rs new file mode 100644 index 0000000..47bc926 --- /dev/null +++ b/platforms/tortuise-script-compiled/src/lib.rs @@ -0,0 +1,119 @@ +use std::sync::Arc; + +use tortuise::{file::FileManager, script::WasmRunner}; + +pub mod buffer; +pub mod entity; +pub mod input; +pub mod process; +pub mod random; +pub mod scene; +pub mod script; +pub mod state; +pub mod storage; +pub mod time; + +pub struct ScriptContext<'a>(tortuise::script::FullScriptContext<'a>); + +pub struct TortuiseScript { + pub start: fn(cx: ScriptContext), + pub update: fn(cx: ScriptContext), + pub end: fn(cx: ScriptContext), +} + +#[derive(Debug, Default, Clone)] +pub struct TortuiseScene { + pub scripts: &'static [&'static str], +} + +fn default_script(_cx: ScriptContext) {} + +impl Default for TortuiseScript { + fn default() -> Self { + Self { + start: default_script, + update: default_script, + end: default_script, + } + } +} + +impl TortuiseScript { + pub const fn empty() -> Self { + Self { + start: default_script, + update: default_script, + end: default_script, + } + } +} + +#[doc(hidden)] +pub fn run_game( + name: &str, + author: &str, + tld: &str, + first_scene: &str, + scenes: &[(&str, TortuiseScene)], + scripts: &[(&str, TortuiseScript)], +) { + use tortuise::manifest::HumaneGameManifest; + + fn wrap_script_fn(f: fn(ScriptContext)) -> tortuise::script::StaticScriptFunction { + Some(Arc::new(move |c| f(ScriptContext(c)))) + } + + fn slice_to_boxed_slice(names: &[&str]) -> Box<[Box]> { + names.iter().cloned().map(Into::into).collect() + } + + let manifest = HumaneGameManifest { + name: Box::from(name), + author: Box::from(author), + tld: Box::from(tld), + first_scene: Box::from(first_scene), + scene: scenes + .iter() + .map(|(name, scene)| tortuise::manifest::PartialScene { + name: (*name).into(), + scripts: slice_to_boxed_slice(scene.scripts), + }) + .collect(), + script: scripts + .iter() + .map( + |(name, script)| tortuise::script::ScriptDeclaration::Static { + name: (*name).into(), + start: wrap_script_fn(script.start), + update: wrap_script_fn(script.update), + end: wrap_script_fn(script.end), + }, + ) + .collect(), + }; + + let mut files = FileManager::new(); + let wasm_runner = WasmRunner::new(); + let mut manifest = manifest.into(); + tortuise::init_logger(&manifest); + if let Err(e) = tortuise::apply_patches(&mut manifest, &mut files, &wasm_runner) { + log::error!("{e}"); + } + tortuise::run_game(files, wasm_runner, manifest) +} + +#[macro_export] +macro_rules! game { + { + name: $name: literal, + author: $author: literal, + tld: $tld: literal, + first_scene: $first_scene: literal, + scenes: { $($scene_name: literal => $scene: expr),* }, + scripts: { $($script_name: literal => $script: expr),* } + } => { + fn main() { + $crate::run_game($name, $author, $tld, $first_scene, &[$(($scene_name, $scene),)*], &[$(($script_name, $script),)*]); + } + }; +} -- cgit v1.3.1