Skip to content
Snippets Groups Projects
asset_events.rs 1.8 KiB
Newer Older
use std::collections::HashMap;

use bevy::prelude::*;

use crate::assets::{LevelIndex, TileMetadata, TilesetIndex};
Louis's avatar
Louis committed
use crate::ldtk::{Level, 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() {
			AssetEvent::Added { id } | AssetEvent::Modified { id } => {
				let handle = Handle::Weak(*id);
				if let Some(project) = assets.get(handle) {
					for level in project.get_all_levels() {
Louis's avatar
Louis committed
						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));
					}
				}
			}
			_ => {}
		}
	}
}
Louis's avatar
Louis committed

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>,
) {
Louis's avatar
Louis committed
	for event in events.read() {
Louis's avatar
Louis committed
		match event {
			AssetEvent::Added { id } | AssetEvent::Modified { id } => {
				let handle = Handle::Weak(*id);
Louis's avatar
Louis committed
				if let Some(level) = assets.get(handle) {
					level_index.insert(level.identifier.clone(), LdtkLevel::from(level.clone()));
					update_events.send(LevelDataUpdated(level.identifier.clone()));
				}
			}
			_ => {}
		}
	}
}