scion 0.6.0

Game making library on top of wgpu, winit, legion
Documentation
use scion::{
    config::{scion_config::ScionConfigBuilder, window_config::WindowConfigBuilder},
    core::{
        components::{
            maths::{coordinates::Coordinates, transform::Transform},
            tiles::{sprite::Sprite, tileset::Tileset},
        },
        legion_ext::{ScionResourcesExtension, ScionWorldExtension},
        resources::inputs::inputs_controller::InputsController,
        scene::Scene,
    },
    legion::{system, Resources, World},
    utils::file::app_base_path,
    Scion,
};


#[derive(Debug)]
struct Case(Coordinates);

enum MoveDirection {
    Left,
    Top,
    Right,
    Bottom,
    None,
}

struct Taquin {
    board: [[bool; 4]; 4],
}

impl Taquin {
    fn new() -> Self {
        let mut board = [[true; 4]; 4];
        board[3][3] = false;
        Self { board }
    }

    fn try_move(&mut self, column: usize, line: usize) -> MoveDirection {
        self.board[column][line] = false;
        if column > 0 && !self.board[column - 1][line] {
            self.board[column - 1][line] = true;
            MoveDirection::Left
        } else if line > 0 && !self.board[column][line - 1] {
            self.board[column][line - 1] = true;
            MoveDirection::Top
        } else if column < 3 && !self.board[column + 1][line] {
            self.board[column + 1][line] = true;
            MoveDirection::Right
        } else if line < 3 && !self.board[column][line + 1] {
            self.board[column][line + 1] = true;
            MoveDirection::Bottom
        } else {
            self.board[column][line] = true;
            MoveDirection::None
        }
    }
}

#[system(for_each)]
fn taquin(
    #[resource] inputs: &InputsController,
    #[resource] taquin: &mut Taquin,
    case: &mut Case,
    transform: &mut Transform,
) {
    inputs.on_left_click_pressed(|mouse_x, mouse_y| {
        if mouse_x > (case.0.x() * 192.) as f64
            && mouse_y > (case.0.y() * 192.) as f64
            && mouse_x < (case.0.x() * 192. + 192.) as f64
            && mouse_y < (case.0.y() * 192. + 192.) as f64
        {
            match taquin.try_move(case.0.x() as usize, case.0.y() as usize) {
                MoveDirection::Left => {
                    case.0.set_x(case.0.x() - 1.);
                    transform.append_translation(-192., 0.);
                }
                MoveDirection::Top => {
                    case.0.set_y(case.0.y() - 1.);
                    transform.append_translation(0., -192.);
                }
                MoveDirection::Right => {
                    case.0.set_x(case.0.x() + 1.);
                    transform.append_translation(192., 0.);
                }
                MoveDirection::Bottom => {
                    case.0.set_y(case.0.y() + 1.);
                    transform.append_translation(0., 192.);
                }
                MoveDirection::None => {}
            };
        }
    })
}

#[derive(Default)]
struct MainScene;

impl Scene for MainScene {
    fn on_start(&mut self, world: &mut World, resources: &mut Resources) {
        let tileset_ref = resources.assets().register_tileset(Tileset::new(
            app_base_path().join("examples/taquin/assets/taquin.png").get(),
            4,
            4,
            192,
        ));
        for line in 0..4 {
            for column in 0..4 {
                if !(line == 3 && column == 3) {
                    let square = (
                        Transform::from_xy(column as f32 * 192., line as f32 * 192.),
                        tileset_ref.clone(),
                        Sprite::new(line * 4 + column),
                        Case(Coordinates::new(column as f32, line as f32)),
                    );
                    world.push(square);
                }
            }
        }
        world.add_default_camera();

        resources.insert(Taquin::new());
    }
}

fn main() {
    Scion::app_with_config(
        ScionConfigBuilder::new()
            .with_window_config(
                WindowConfigBuilder::new().with_resizable(false).with_dimensions((768, 768)).get(),
            )
            .get(),
    )
    .with_system(taquin_system())
    .with_scene::<MainScene>()
    .run();
}