summaryrefslogtreecommitdiff
path: root/src/scene.rs
blob: 8f7035022a8378eddcffb4a59cfed80941d1f27e (plain)
use rustc_hash::FxHashSet;
use serde::{Deserialize, Serialize};

use crate::{
	file::FileManager,
	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<'_>,
	files: &mut FileManager,
	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, files);
		} else {
			scripts.reset_script(*script, context);
		}
	}
}