mod storage;
use bevy::{
math::{UVec2, Vec2},
prelude::{Bundle, Color, Component, Reflect, ReflectComponent},
render::sync_world::SyncToRenderWorld,
};
pub use storage::*;
use crate::TilemapSize;
use crate::map::TilemapId;
#[derive(Component, Reflect, Default, Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[reflect(Component)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TilePos {
pub x: u32,
pub y: u32,
}
impl TilePos {
pub const fn new(x: u32, y: u32) -> Self {
Self { x, y }
}
pub fn to_index(&self, tilemap_size: &TilemapSize) -> usize {
((self.y * tilemap_size.x) + self.x) as usize
}
pub fn within_map_bounds(&self, map_size: &TilemapSize) -> bool {
self.x < map_size.x && self.y < map_size.y
}
}
impl From<TilePos> for UVec2 {
fn from(pos: TilePos) -> Self {
UVec2::new(pos.x, pos.y)
}
}
impl From<&TilePos> for UVec2 {
fn from(pos: &TilePos) -> Self {
UVec2::new(pos.x, pos.y)
}
}
impl From<UVec2> for TilePos {
fn from(v: UVec2) -> Self {
Self { x: v.x, y: v.y }
}
}
impl From<TilePos> for Vec2 {
fn from(pos: TilePos) -> Self {
Vec2::new(pos.x as f32, pos.y as f32)
}
}
impl From<&TilePos> for Vec2 {
fn from(pos: &TilePos) -> Self {
Vec2::new(pos.x as f32, pos.y as f32)
}
}
#[derive(Component, Reflect, Default, Clone, Copy, Debug, Hash, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[reflect(Component)]
pub struct TileTextureIndex(pub u32);
#[derive(Component, Reflect, Default, Clone, Copy, Debug)]
#[reflect(Component)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TileColor(pub Color);
impl From<Color> for TileColor {
fn from(color: Color) -> Self {
TileColor(color)
}
}
#[derive(Component, Reflect, Clone, Copy, Debug, Hash, PartialEq, Eq)]
#[reflect(Component)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TileVisible(pub bool);
impl Default for TileVisible {
fn default() -> Self {
Self(true)
}
}
#[derive(Component, Reflect, Default, Clone, Copy, Debug, Hash, PartialEq, Eq)]
#[reflect(Component)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TileFlip {
pub x: bool,
pub y: bool,
pub d: bool, }
#[derive(Bundle, Default, Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TileBundle {
pub position: TilePos,
pub texture_index: TileTextureIndex,
pub tilemap_id: TilemapId,
pub visible: TileVisible,
pub flip: TileFlip,
pub color: TileColor,
pub old_position: TilePosOld,
#[cfg_attr(feature = "serde", serde(skip))]
pub sync: SyncToRenderWorld,
}
#[derive(Component, Reflect, Default, Clone, Copy, Debug)]
#[reflect(Component)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TilePosOld(pub TilePos);
#[derive(Component, Reflect, Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AnimatedTile {
pub start: u32,
pub end: u32,
pub speed: f32,
}