use crate::prelude::*;
use bevy::{platform::collections::HashMap, prelude::*};
#[derive(Component, Default, Reflect, Clone, Debug)]
#[reflect(Component, Default, Debug)]
pub struct TiledMapStorage {
pub(crate) layers: HashMap<u32, Entity>,
pub(crate) objects: HashMap<u32, Entity>,
pub(crate) tiles: HashMap<(u32, tiled::TileId), Vec<Entity>>,
}
impl TiledMapStorage {
pub fn clear(&mut self, commands: &mut Commands) {
for layer_entity in self.layers.values() {
commands.entity(*layer_entity).despawn();
}
self.layers.clear();
self.objects.clear();
self.tiles.clear();
}
}
impl<'a> TiledMapStorage {
pub fn layers(&self) -> bevy::platform::collections::hash_map::Iter<'_, u32, Entity> {
self.layers.iter()
}
pub fn get_layer_entity(&self, layer_id: u32) -> Option<Entity> {
self.layers.get(&layer_id).cloned()
}
pub fn get_layer_id(&self, entity: Entity) -> Option<u32> {
self.layers
.iter()
.find(|(_, &e)| e == entity)
.map(|(&id, _)| id)
}
pub fn get_layer(&self, map: &'a tiled::Map, entity: Entity) -> Option<tiled::Layer<'a>> {
self.get_layer_id(entity)
.and_then(|id| get_layer_from_map(map, id))
}
pub fn tiles(
&self,
) -> bevy::platform::collections::hash_map::Iter<'_, (u32, tiled::TileId), Vec<Entity>> {
self.tiles.iter()
}
pub fn get_tile_entities(&self, tileset_id: u32, tile_id: tiled::TileId) -> Vec<Entity> {
self.tiles
.get(&(tileset_id, tile_id))
.cloned()
.unwrap_or_default()
}
pub fn get_tile_id(&self, entity: Entity) -> Option<(u32, tiled::TileId)> {
self.tiles
.iter()
.find(|(_, v)| v.contains(&entity))
.map(|(&id, _)| id)
}
pub fn get_tile(&self, map: &'a tiled::Map, entity: Entity) -> Option<tiled::Tile<'a>> {
self.get_tile_id(entity)
.and_then(|(tileset_id, tile_id)| get_tile_from_map(map, tileset_id, tile_id))
}
pub fn objects(&self) -> bevy::platform::collections::hash_map::Iter<'_, u32, Entity> {
self.objects.iter()
}
pub fn get_object_entity(&self, object_id: u32) -> Option<Entity> {
self.objects.get(&object_id).cloned()
}
pub fn get_object_id(&self, entity: Entity) -> Option<u32> {
self.objects
.iter()
.find(|(_, &e)| e == entity)
.map(|(&id, _)| id)
}
pub fn get_object(&self, map: &'a tiled::Map, entity: Entity) -> Option<tiled::Object<'a>> {
self.get_object_id(entity)
.and_then(|id| get_object_from_map(map, id))
}
}
pub(crate) fn plugin(app: &mut App) {
app.register_type::<TiledMapStorage>();
}