rust-sokoban/src/components.rs

84 lines
1.5 KiB
Rust

use specs::{Component, NullStorage, VecStorage, World, WorldExt};
use std::fmt;
use std::fmt::Display;
#[derive(PartialEq)]
pub enum BoxColor {
Red,
Blue,
}
impl Display for BoxColor {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt.write_str(match self {
BoxColor::Red => "red",
BoxColor::Blue => "blue",
})?;
Ok(())
}
}
#[derive(Debug, Component, Clone, Copy)]
#[storage(VecStorage)]
pub struct Position {
pub x: u8,
pub y: u8,
pub z: u8,
}
impl Position {
pub fn new(x: u8, y: u8) -> Self {
Position { x, y, z: 0 }
}
pub fn with_z(self, z: u8) -> Self {
Position { z, ..self }
}
}
#[derive(Component)]
#[storage(VecStorage)]
pub struct Renderable {
pub path: String,
}
#[derive(Component)]
#[storage(VecStorage)]
pub struct Wall {}
#[derive(Component)]
#[storage(VecStorage)]
pub struct Player {}
#[derive(Component)]
#[storage(VecStorage)]
pub struct Box {
pub color: BoxColor,
}
#[derive(Component)]
#[storage(VecStorage)]
pub struct BoxSpot {
pub color: BoxColor,
}
#[derive(Component, Default)]
#[storage(NullStorage)]
pub struct Movable;
#[derive(Component, Default)]
#[storage(NullStorage)]
pub struct Immovable;
pub fn register_components(world: &mut World) {
world.register::<Position>();
world.register::<Renderable>();
world.register::<Player>();
world.register::<Wall>();
world.register::<Box>();
world.register::<BoxSpot>();
world.register::<Movable>();
world.register::<Immovable>();
}