use bevy::prelude::*;
use std::collections::HashMap;
#[derive(Resource, Default)]
pub struct MortarRegistry {
assets: HashMap<String, Handle<crate::MortarAsset>>,
}
impl MortarRegistry {
pub fn register(&mut self, path: impl Into<String>, handle: Handle<crate::MortarAsset>) {
self.assets.insert(path.into(), handle);
}
pub fn get(&self, path: &str) -> Option<&Handle<crate::MortarAsset>> {
self.assets.get(path)
}
}
#[derive(Resource)]
pub struct MortarRuntime {
pub active_dialogues: HashMap<Entity, crate::dialogue_state::DialogueState>,
pub primary_dialogue: Option<Entity>,
pub pending_starts: HashMap<Entity, (String, String)>,
pub pending_jumps: HashMap<Entity, (String, String)>,
pub functions: crate::MortarFunctionRegistry,
}
impl MortarRuntime {
pub fn get_dialogue(&self, entity: Entity) -> Option<&crate::dialogue_state::DialogueState> {
self.active_dialogues.get(&entity)
}
pub fn get_dialogue_mut(
&mut self,
entity: Entity,
) -> Option<&mut crate::dialogue_state::DialogueState> {
self.active_dialogues.get_mut(&entity)
}
pub fn primary_dialogue_state(&self) -> Option<&crate::dialogue_state::DialogueState> {
self.primary_dialogue
.and_then(|entity| self.active_dialogues.get(&entity))
}
pub fn primary_dialogue_state_mut(
&mut self,
) -> Option<&mut crate::dialogue_state::DialogueState> {
self.primary_dialogue
.and_then(|entity| self.active_dialogues.get_mut(&entity))
}
pub fn primary_dialogue(&self) -> Option<&crate::dialogue_state::DialogueState> {
self.primary_dialogue_state()
}
pub fn primary_dialogue_mut(&mut self) -> Option<&mut crate::dialogue_state::DialogueState> {
self.primary_dialogue_state_mut()
}
pub fn has_active_dialogues(&self) -> bool {
!self.active_dialogues.is_empty()
}
pub fn active_dialogue_count(&self) -> usize {
self.active_dialogues.len()
}
}
impl Default for MortarRuntime {
fn default() -> Self {
Self {
active_dialogues: HashMap::new(),
primary_dialogue: None,
pending_starts: HashMap::new(),
pending_jumps: HashMap::new(),
functions: crate::MortarFunctionRegistry::new(),
}
}
}