pub use crate::ldtk::EntityInstance;
use crate::ldtk::{LayerInstance, Type};
use bevy::prelude::*;
use std::{
collections::HashSet,
ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign},
};
#[allow(unused_imports)]
use crate::{
assets::LdtkLevel,
prelude::{LdtkEntity, LdtkIntCell},
resources::{LevelSelection, LevelSpawnBehavior},
utils::ldtk_grid_coords_to_grid_coords,
};
use bevy_ecs_tilemap::tiles::{TileBundle, TilePos};
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Default, Hash, Component, Reflect)]
#[reflect(Component)]
pub struct IntGridCell {
pub value: i32,
}
#[derive(Clone, Eq, PartialEq, Debug, Default, Component)]
pub struct LevelSet {
pub iids: HashSet<String>,
}
#[derive(Clone, Eq, PartialEq, Debug, Default, Hash, Component, Reflect)]
#[reflect(Component)]
pub struct Worldly {
pub entity_iid: String,
}
impl Worldly {
pub fn from_entity_info(entity_instance: &EntityInstance) -> Worldly {
Worldly {
entity_iid: entity_instance.iid.clone(),
}
}
}
#[derive(Copy, Clone, Eq, PartialEq, Debug, Default, Hash, Component, Reflect)]
#[reflect(Component)]
pub struct GridCoords {
pub x: i32,
pub y: i32,
}
impl From<IVec2> for GridCoords {
fn from(i_vec_2: IVec2) -> Self {
GridCoords {
x: i_vec_2.x,
y: i_vec_2.y,
}
}
}
impl From<GridCoords> for IVec2 {
fn from(grid_coords: GridCoords) -> Self {
IVec2::new(grid_coords.x, grid_coords.y)
}
}
impl From<TilePos> for GridCoords {
fn from(tile_pos: TilePos) -> Self {
GridCoords {
x: tile_pos.x as i32,
y: tile_pos.y as i32,
}
}
}
impl From<GridCoords> for TilePos {
fn from(grid_coords: GridCoords) -> Self {
TilePos::new(grid_coords.x as u32, grid_coords.y as u32)
}
}
impl Add<GridCoords> for GridCoords {
type Output = GridCoords;
fn add(self, rhs: GridCoords) -> Self::Output {
GridCoords {
x: self.x + rhs.x,
y: self.y + rhs.y,
}
}
}
impl AddAssign<GridCoords> for GridCoords {
fn add_assign(&mut self, rhs: GridCoords) {
self.x += rhs.x;
self.y += rhs.y;
}
}
impl Sub<GridCoords> for GridCoords {
type Output = GridCoords;
fn sub(self, rhs: GridCoords) -> Self::Output {
GridCoords {
x: self.x - rhs.x,
y: self.y - rhs.y,
}
}
}
impl SubAssign<GridCoords> for GridCoords {
fn sub_assign(&mut self, rhs: GridCoords) {
self.x -= rhs.x;
self.y -= rhs.y;
}
}
impl Mul<GridCoords> for GridCoords {
type Output = GridCoords;
fn mul(self, rhs: GridCoords) -> Self::Output {
GridCoords {
x: self.x * rhs.x,
y: self.y * rhs.y,
}
}
}
impl MulAssign<GridCoords> for GridCoords {
fn mul_assign(&mut self, rhs: GridCoords) {
self.x *= rhs.x;
self.y *= rhs.y;
}
}
impl GridCoords {
pub fn new(x: i32, y: i32) -> GridCoords {
GridCoords { x, y }
}
pub fn from_entity_info(
entity_instance: &EntityInstance,
layer_instance: &LayerInstance,
) -> GridCoords {
ldtk_grid_coords_to_grid_coords(entity_instance.grid, layer_instance.c_hei)
}
}
#[derive(Clone, Eq, PartialEq, Debug, Default, Hash, Component, Reflect)]
#[reflect(Component)]
pub struct TileMetadata {
pub data: String,
}
#[derive(Clone, Eq, PartialEq, Debug, Default, Hash, Component, Reflect)]
#[reflect(Component)]
pub struct TileEnumTags {
pub tags: Vec<String>,
pub source_enum_uid: Option<i32>,
}
#[derive(Clone, PartialEq, Debug, Default, Component, Reflect)]
#[reflect(Component)]
pub struct LayerMetadata {
pub c_hei: i32,
pub c_wid: i32,
pub grid_size: i32,
pub identifier: String,
pub opacity: f32,
pub px_total_offset_x: i32,
pub px_total_offset_y: i32,
pub tileset_def_uid: Option<i32>,
pub tileset_rel_path: Option<String>,
pub layer_instance_type: Type,
pub iid: String,
pub layer_def_uid: i32,
pub level_id: i32,
pub optional_rules: Vec<i32>,
pub override_tileset_uid: Option<i32>,
pub px_offset_x: i32,
pub px_offset_y: i32,
pub seed: i32,
pub visible: bool,
}
impl From<&LayerInstance> for LayerMetadata {
fn from(instance: &LayerInstance) -> Self {
LayerMetadata {
c_hei: instance.c_hei,
c_wid: instance.c_wid,
grid_size: instance.grid_size,
identifier: instance.identifier.clone(),
opacity: instance.opacity,
px_total_offset_x: instance.px_total_offset_x,
px_total_offset_y: instance.px_total_offset_y,
tileset_def_uid: instance.tileset_def_uid,
tileset_rel_path: instance.tileset_rel_path.clone(),
layer_instance_type: instance.layer_instance_type.clone(),
iid: instance.iid.clone(),
layer_def_uid: instance.layer_def_uid,
level_id: instance.level_id,
optional_rules: instance.optional_rules.clone(),
override_tileset_uid: instance.override_tileset_uid,
px_offset_x: instance.px_offset_x,
px_offset_y: instance.px_offset_y,
seed: instance.seed,
visible: instance.visible,
}
}
}
#[derive(Copy, Clone, Eq, PartialEq, Debug, Default, Hash, Component, Reflect)]
#[reflect(Component)]
pub struct Respawn;
#[derive(Copy, Clone, Debug, Default, Bundle)]
pub(crate) struct TileGridBundle {
#[bundle]
pub tile_bundle: TileBundle,
pub grid_coords: GridCoords,
}
#[derive(Clone, Default, Bundle)]
pub(crate) struct IntGridCellBundle {
pub int_grid_cell: IntGridCell,
}
#[derive(Clone, Bundle, Default)]
pub(crate) struct EntityInstanceBundle {
pub entity_instance: EntityInstance,
}
#[derive(Clone, Default, Bundle)]
pub struct LdtkWorldBundle {
pub ldtk_handle: Handle<crate::assets::LdtkAsset>,
pub level_set: LevelSet,
pub transform: Transform,
pub global_transform: GlobalTransform,
pub visibility: Visibility,
pub computed_visibility: ComputedVisibility,
}