use crate::app::ldtk_entity::*;
use bevy::prelude::*;
pub trait LdtkEntityAppExt {
fn register_ldtk_entity_for_layer_optional<B: LdtkEntity + Bundle>(
&mut self,
layer_identifier: Option<String>,
entity_identifier: Option<String>,
) -> &mut Self;
fn register_ldtk_entity_for_layer<B: LdtkEntity + Bundle>(
&mut self,
layer_identifier: &str,
entity_identifier: &str,
) -> &mut Self {
self.register_ldtk_entity_for_layer_optional::<B>(
Some(layer_identifier.to_string()),
Some(entity_identifier.to_string()),
)
}
fn register_ldtk_entity<B: LdtkEntity + Bundle>(
&mut self,
entity_identifier: &str,
) -> &mut Self {
self.register_ldtk_entity_for_layer_optional::<B>(None, Some(entity_identifier.to_string()))
}
fn register_default_ldtk_entity_for_layer<B: LdtkEntity + Bundle>(
&mut self,
layer_identifier: &str,
) -> &mut Self {
self.register_ldtk_entity_for_layer_optional::<B>(Some(layer_identifier.to_string()), None)
}
fn register_default_ldtk_entity<B: LdtkEntity + Bundle>(&mut self) -> &mut Self {
self.register_ldtk_entity_for_layer_optional::<B>(None, None)
}
}
impl LdtkEntityAppExt for App {
fn register_ldtk_entity_for_layer_optional<B: LdtkEntity + Bundle>(
&mut self,
layer_identifier: Option<String>,
entity_identifier: Option<String>,
) -> &mut Self {
let new_entry = Box::new(PhantomLdtkEntity::<B>::new());
match self
.world_mut()
.get_non_send_resource_mut::<LdtkEntityMap>()
{
Some(mut entries) => {
entries.insert((layer_identifier, entity_identifier), new_entry);
}
None => {
let mut bundle_map = LdtkEntityMap::new();
bundle_map.insert((layer_identifier, entity_identifier), new_entry);
self.world_mut()
.insert_non_send_resource::<LdtkEntityMap>(bundle_map);
}
}
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{
components::EntityInstance,
ldtk::{LayerInstance, TilesetDefinition},
};
#[derive(Default, Component, Debug)]
struct ComponentA;
#[derive(Default, Component, Debug)]
struct ComponentB;
#[derive(Default, Bundle, Debug)]
struct LdtkEntityBundle {
a: ComponentA,
b: ComponentB,
}
impl LdtkEntity for LdtkEntityBundle {
fn bundle_entity(
_: &EntityInstance,
_: &LayerInstance,
_: Option<&Handle<Image>>,
_: Option<&TilesetDefinition>,
_: &AssetServer,
_: &mut Assets<TextureAtlasLayout>,
) -> LdtkEntityBundle {
LdtkEntityBundle::default()
}
}
#[test]
fn test_ldtk_entity_registrations() {
let mut app = App::new();
app.register_ldtk_entity_for_layer::<LdtkEntityBundle>("layer", "entity_for_layer")
.register_ldtk_entity::<LdtkEntityBundle>("entity")
.register_default_ldtk_entity_for_layer::<LdtkEntityBundle>("default_entity_for_layer")
.register_default_ldtk_entity::<LdtkEntityBundle>();
let ldtk_entity_map = app
.world_mut()
.get_non_send_resource::<LdtkEntityMap>()
.unwrap();
assert!(ldtk_entity_map.contains_key(&(
Some("layer".to_string()),
Some("entity_for_layer".to_string())
)));
assert!(ldtk_entity_map.contains_key(&(None, Some("entity".to_string()))));
assert!(ldtk_entity_map.contains_key(&(Some("default_entity_for_layer".to_string()), None)));
assert!(ldtk_entity_map.contains_key(&(None, None)));
}
}