use std::collections::HashMap; use bevy::prelude::*; use crate::assets::{LevelIndex, TileMetadata, TilesetIndex}; use crate::ldtk::{Level, LevelSet, Project}; use crate::{LdtkLevel, LevelDataUpdated}; pub fn handle_ldtk_project_events( mut events: EventReader<AssetEvent<Project>>, assets: Res<Assets<Project>>, mut level_index: ResMut<LevelIndex>, mut tilset_index: ResMut<TilesetIndex>, mut update_events: EventWriter<LevelDataUpdated>, ) { for event in events.read() { match event { AssetEvent::LoadedWithDependencies { id } | AssetEvent::Modified { id } => { let handle = Handle::Weak(*id); if let Some(project) = assets.get(handle) { for level in project.get_all_levels() { if level.external_rel_path.is_none() { level_index .insert(level.identifier.clone(), LdtkLevel::from(level.clone())); update_events.send(LevelDataUpdated(level.identifier.clone())); } } for tileset in &project.defs.tilesets { let mut tile_meta = HashMap::new(); for custom in &tileset.custom_data { tile_meta.insert( custom.tile_id, serde_json::from_str(&custom.data).unwrap(), ); } tilset_index.insert(tileset.identifier.clone(), TileMetadata(tile_meta)); } } } _ => {} } } } pub(crate) fn handle_ldtk_level_set_events( mut events: EventReader<AssetEvent<LevelSet>>, level_sets: Res<Assets<LevelSet>>, assets: Res<Assets<Level>>, mut level_index: ResMut<LevelIndex>, mut update_events: EventWriter<LevelDataUpdated>, ) { for event in events.read() { match event { AssetEvent::LoadedWithDependencies { id } | AssetEvent::Modified { id } => { let handle = Handle::Weak(*id); if let Some(level) = level_sets.get(handle) { for level in level.0.iter().flat_map(|hd| assets.get(hd)) { level_index .insert(level.identifier.clone(), LdtkLevel::from(level.clone())); update_events.send(LevelDataUpdated(level.identifier.clone())); } } } _ => {} } } } pub fn handle_ldtk_level_events( mut events: EventReader<AssetEvent<Level>>, assets: Res<Assets<Level>>, mut level_index: ResMut<LevelIndex>, mut update_events: EventWriter<LevelDataUpdated>, ) { for event in events.read() { match event { AssetEvent::LoadedWithDependencies { id } | AssetEvent::Modified { id } => { let handle = Handle::Weak(*id); if let Some(level) = assets.get(handle) { level_index.insert(level.identifier.clone(), LdtkLevel::from(level.clone())); update_events.send(LevelDataUpdated(level.identifier.clone())); } } _ => {} } } }