diff --git a/src/components.rs b/src/components.rs new file mode 100644 index 0000000..f5180a4 --- /dev/null +++ b/src/components.rs @@ -0,0 +1,19 @@ +use specs::prelude::*; +use specs_derive::*; +use rltk::{RGB}; + +#[derive(Component)] +pub struct Position { + pub x: i32, + pub y: i32, +} + +#[derive(Component)] +pub struct Renderable { + pub glyph: rltk::FontCharType, + pub fg: RGB, + pub bg: RGB, +} + +#[derive(Component, Debug)] +pub struct Player {} diff --git a/src/main.rs b/src/main.rs index 90aae53..e6d0f3c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,127 +1,19 @@ -use rltk::{GameState, Rltk, VirtualKeyCode, RGB}; +use rltk::{GameState, Rltk, RGB}; use specs::prelude::*; -use specs_derive::Component; -use std::cmp::{max, min}; -#[derive(Component)] -struct Position { - x: i32, - y: i32, -} +mod components; +pub use components::*; +mod map; +pub use map::*; +mod player; +use player::*; +mod rect; +// pub use rect::Rect; -#[derive(Component)] -struct Renderable { - glyph: rltk::FontCharType, - fg: RGB, - bg: RGB, -} - -#[derive(Component, Debug)] -struct Player {} - -struct State { +pub struct State { ecs: World, } -#[derive(PartialEq, Copy, Clone)] -enum TileType { - Wall, - Floor, -} - -fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) { - let mut positions = ecs.write_storage::(); - let mut players = ecs.write_storage::(); - let map = ecs.fetch::>(); - - for (_player, pos) in (&mut players, &mut positions).join() { - let destination_idx = xy_idx(pos.x + delta_x, pos.y + delta_y); - if map[destination_idx] != TileType::Wall { - pos.x = min(79, max(0, pos.x + delta_x)); - pos.y = min(49, max(0, pos.y + delta_y)); - } - } -} - -fn player_input(gs: &mut State, ctx: &mut Rltk) { - // Player movement - match ctx.key { - None => {} // Nothing happened - Some(key) => match key { - VirtualKeyCode::Left => try_move_player(-1, 0, &mut gs.ecs), - VirtualKeyCode::Right => try_move_player(1, 0, &mut gs.ecs), - VirtualKeyCode::Up => try_move_player(0, -1, &mut gs.ecs), - VirtualKeyCode::Down => try_move_player(0, 1, &mut gs.ecs), - _ => {} - }, - } -} - -fn new_map() -> Vec { - let mut map = vec![TileType::Floor; 80 * 50]; - - // Make the boundary walls - for x in 0..80 { - map[xy_idx(x, 0)] = TileType::Wall; - map[xy_idx(x, 49)] = TileType::Wall; - } - for y in 0..50 { - map[xy_idx(0, y)] = TileType::Wall; - map[xy_idx(79, y)] = TileType::Wall; - } - - // Now randomly add a bunch of walls. - // First get the random number generator - let mut rng = rltk::RandomNumberGenerator::new(); - - for _i in 0..400 { - let x = rng.roll_dice(1, 79); - let y = rng.roll_dice(1, 49); - - let idx = xy_idx(x, y); - if idx != xy_idx(40, 25) { - map[idx] = TileType::Wall; - } - } - - map -} - -fn draw_map(map: &[TileType], ctx: &mut Rltk) { - let mut y = 0; - let mut x = 0; - - for tile in map.iter() { - match tile { - TileType::Floor => { - ctx.set( - x, - y, - RGB::from_f32(0.5, 0.5, 0.5), - RGB::from_f32(0., 0., 0.), - rltk::to_cp437('.'), - ); - } - TileType::Wall => { - ctx.set( - x, - y, - RGB::from_f32(0.0, 1.0, 0.0), - RGB::from_f32(0., 0., 0.), - rltk::to_cp437('#'), - ); - } - } - - // Move to the next set of coordinates - x += 1; - if x > 79 { - x = 0; - y += 1; - } - } -} - impl GameState for State { fn tick(&mut self, ctx: &mut Rltk) { ctx.cls(); @@ -147,10 +39,6 @@ impl State { } } -pub fn xy_idx(x: i32, y: i32) -> usize { - (y as usize * 80) + x as usize -} - fn main() -> rltk::BError { use rltk::RltkBuilder; diff --git a/src/map.rs b/src/map.rs new file mode 100644 index 0000000..294efb4 --- /dev/null +++ b/src/map.rs @@ -0,0 +1,78 @@ +use rltk::{ RGB, Rltk, RandomNumberGenerator }; +// use super::{Rect}; +use std::cmp::{min, max}; + +#[derive(PartialEq, Copy, Clone)] +pub enum TileType { + Wall, + Floor, +} + +pub fn xy_idx(x: i32, y: i32) -> usize { + (y as usize * 80) + x as usize +} + +pub fn new_map() -> Vec { + let mut map = vec![TileType::Floor; 80 * 50]; + + // Make the boundary walls + for x in 0..80 { + map[xy_idx(x, 0)] = TileType::Wall; + map[xy_idx(x, 49)] = TileType::Wall; + } + for y in 0..50 { + map[xy_idx(0, y)] = TileType::Wall; + map[xy_idx(79, y)] = TileType::Wall; + } + + // Now randomly add a bunch of walls. + // First get the random number generator + let mut rng = rltk::RandomNumberGenerator::new(); + + for _i in 0..400 { + let x = rng.roll_dice(1, 79); + let y = rng.roll_dice(1, 49); + + let idx = xy_idx(x, y); + if idx != xy_idx(40, 25) { + map[idx] = TileType::Wall; + } + } + + map +} + +pub fn draw_map(map: &[TileType], ctx: &mut Rltk) { + let mut y = 0; + let mut x = 0; + + for tile in map.iter() { + match tile { + TileType::Floor => { + ctx.set( + x, + y, + RGB::from_f32(0.5, 0.5, 0.5), + RGB::from_f32(0., 0., 0.), + rltk::to_cp437('.'), + ); + } + TileType::Wall => { + ctx.set( + x, + y, + RGB::from_f32(0.0, 1.0, 0.0), + RGB::from_f32(0., 0., 0.), + rltk::to_cp437('#'), + ); + } + } + + // Move to the next set of coordinates + x += 1; + if x > 79 { + x = 0; + y += 1; + } + } +} \ No newline at end of file diff --git a/src/player.rs b/src/player.rs new file mode 100644 index 0000000..27487b3 --- /dev/null +++ b/src/player.rs @@ -0,0 +1,32 @@ +use rltk::{VirtualKeyCode, Rltk}; +use specs::prelude::*; +use super::{Position, Player, TileType, xy_idx, State}; +use std::cmp::{min, max}; + +pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) { + let mut positions = ecs.write_storage::(); + let mut players = ecs.write_storage::(); + let map = ecs.fetch::>(); + + for (_player, pos) in (&mut players, &mut positions).join() { + let destination_idx = xy_idx(pos.x + delta_x, pos.y + delta_y); + if map[destination_idx] != TileType::Wall { + pos.x = min(79, max(0, pos.x + delta_x)); + pos.y = min(49, max(0, pos.y + delta_y)); + } + } +} + +pub fn player_input(gs: &mut State, ctx: &mut Rltk) { + // Player movement + match ctx.key { + None => {} // Nothing happened + Some(key) => match key { + VirtualKeyCode::Left => try_move_player(-1, 0, &mut gs.ecs), + VirtualKeyCode::Right => try_move_player(1, 0, &mut gs.ecs), + VirtualKeyCode::Up => try_move_player(0, -1, &mut gs.ecs), + VirtualKeyCode::Down => try_move_player(0, 1, &mut gs.ecs), + _ => {} + }, + } +} \ No newline at end of file diff --git a/src/rect.rs b/src/rect.rs new file mode 100644 index 0000000..e69de29