summaryrefslogtreecommitdiff
path: root/src/scene.rs
diff options
context:
space:
mode:
authorMica White <botahamec@outlook.com>2026-06-28 11:09:28 -0400
committerMica White <botahamec@outlook.com>2026-06-28 11:09:28 -0400
commit3eb02cbe5b106cd332f25d658430f7e0ae320745 (patch)
tree20153b185b2e7d5c41b2b2d29c6c28bba8bd31b9 /src/scene.rs
parentb9570962cfc214bbac0f3fef1e6c1f9848f52658 (diff)
initial commit
Diffstat (limited to 'src/scene.rs')
-rw-r--r--src/scene.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/scene.rs b/src/scene.rs
new file mode 100644
index 0000000..143eb0b
--- /dev/null
+++ b/src/scene.rs
@@ -0,0 +1,43 @@
+use rustc_hash::FxHashSet;
+use serde::{Deserialize, Serialize};
+
+use crate::script::{ScriptContext, ScriptManager};
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct Scene {
+ pub name: Box<str>,
+ pub scripts: ResourceRequirements,
+}
+
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+pub struct ResourceRequirements {
+ pub required: Box<[usize]>,
+ pub preload: Box<[usize]>,
+}
+
+pub fn scene_id_by_name(scenes: &[Scene], name: &str) -> Option<usize> {
+ for (i, scene) in scenes.iter().enumerate() {
+ if &*scene.name == name {
+ return Some(i);
+ }
+ }
+
+ None
+}
+
+pub fn switch_scenes(
+ scenes: &[Scene],
+ scripts: &mut ScriptManager,
+ context: &mut ScriptContext<'_>,
+ new: usize,
+) {
+ let active_scripts = FxHashSet::from_iter(scripts.active_scripts.iter().cloned());
+ let scripts_to_load = &scenes[new].scripts.required;
+ for script in scripts_to_load {
+ if !active_scripts.contains(script) {
+ scripts.activate_script(*script, context);
+ } else {
+ scripts.reset_script(*script, context);
+ }
+ }
+}