bevy_tiles 0.1.0

Bevy library for working with entities in grids.
Documentation
use bevy::ecs::{entity::Entity, system::Command, world::World};

use super::{insert_tile, insert_tile_into_map, remove_map, take_tile, take_tile_from_map};

pub struct SpawnTile<const N: usize = 2> {
    pub map_id: Entity,
    pub tile_c: [i32; N],
    pub tile_id: Entity,
}

impl<const N: usize> Command for SpawnTile<N> {
    fn apply(self, world: &mut World) {
        insert_tile::<N>(world, self.map_id, self.tile_c, self.tile_id)
    }
}

pub struct DespawnTile<const N: usize> {
    pub map_id: Entity,
    pub tile_c: [i32; N],
}

impl<const N: usize> Command for DespawnTile<N> {
    fn apply(self, world: &mut World) {
        let tile_id = take_tile::<N>(world, self.map_id, self.tile_c);
        if let Some(id) = tile_id {
            world.despawn(id);
        }
    }
}

pub struct SwapTile<const N: usize> {
    pub map_id: Entity,
    pub tile_c_1: [i32; N],
    pub tile_c_2: [i32; N],
}

impl<const N: usize> Command for SwapTile<N> {
    fn apply(self, world: &mut World) {
        if self.tile_c_1 == self.tile_c_2 {
            return;
        }

        let Some(mut map) = remove_map::<N>(world, self.map_id) else {
            return;
        };

        let tile_id_1 = take_tile_from_map::<N>(world, &mut map, self.tile_c_1);

        let tile_id_2 = take_tile_from_map::<N>(world, &mut map, self.tile_c_2);

        if let Some(tile_id) = tile_id_1 {
            insert_tile_into_map(world, &mut map, self.map_id, self.tile_c_2, tile_id);
        }

        if let Some(tile_id) = tile_id_2 {
            insert_tile_into_map(world, &mut map, self.map_id, self.tile_c_1, tile_id);
        }

        world.get_entity_mut(self.map_id).unwrap().insert(map);
    }
}

pub struct MoveTile<const N: usize> {
    pub map_id: Entity,
    pub old_c: [i32; N],
    pub new_c: [i32; N],
}

impl<const N: usize> Command for MoveTile<N> {
    fn apply(self, world: &mut World) {
        if self.old_c == self.new_c {
            return;
        }

        let Some(mut map) = remove_map::<N>(world, self.map_id) else {
            return;
        };

        let tile_id = take_tile_from_map::<N>(world, &mut map, self.old_c);

        if let Some(tile_id) = tile_id {
            insert_tile_into_map(world, &mut map, self.map_id, self.new_c, tile_id);
        }

        world.get_entity_mut(self.map_id).unwrap().insert(map);
    }
}