From 8eccea69f699adac79d206d78ef6bd6ede041007 Mon Sep 17 00:00:00 2001 From: Benjamyn Love Date: Sun, 13 Nov 2022 22:58:12 +1100 Subject: [PATCH] lappy sync --- src/main.rs | 73 +++++++++----------------------------------------- src/map.rs | 6 ++--- src/spawner.rs | 58 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 63 deletions(-) create mode 100644 src/spawner.rs diff --git a/src/main.rs b/src/main.rs index 52771c4..6fc723b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,6 +34,9 @@ pub use gui::*; mod gamelog; pub use gamelog::*; +mod spawner; +use spawner::*; + pub struct State { pub ecs: World } @@ -128,73 +131,23 @@ fn main() -> rltk::BError { let (player_x, player_y) = map.rooms[0].center(); gs.ecs.insert(Point::new(player_x, player_y)); - let player_entity = gs.ecs - .create_entity() - .with(Position { - x: player_x, - y: player_y, - }) - .with(Renderable { - glyph: rltk::to_cp437('@'), - fg: RGB::named(rltk::YELLOW), - bg: RGB::named(rltk::BLACK), - }) - .with(Player {}) - .with(Viewshed { - visible_tiles: Vec::new(), - range: 8, - dirty: true, - }) - .with(Name { - name: "Player".to_string(), - }) - .with(CombatStats{max_hp: 30, hp: 30, defence: 2, power: 5}) - .build(); + let player_entity = spawner::player(&mut gs.ecs, player_x, player_y); - gs.ecs.insert(player_entity); - let mut rng = rltk::RandomNumberGenerator::new(); - for (i, room) in map.rooms.iter().skip(1).enumerate() { - let (x, y) = room.center(); + gs.ecs.insert(rltk::RandomNumberGenerator::new()); - let glyph: rltk::FontCharType; - let name: String; - let roll = rng.roll_dice(1, 2); - match roll { - 1 => { - glyph = rltk::to_cp437('g'); - name = "Goblin".to_string() - } - _ => { - glyph = rltk::to_cp437('o'); - name = "Orc".to_string() - } - } - - gs.ecs - .create_entity() - .with(Position { x, y }) - .with(Renderable { - glyph: glyph, - fg: RGB::named(rltk::RED), - bg: RGB::named(rltk::BLACK), - }) - .with(Viewshed { - visible_tiles: Vec::new(), - range: 8, - dirty: true, - }) - .with(Monster {}) - .with(Name { - name: format!("{} #{}", &name, i), - }) - .with(BlocksTile{}) - .with(CombatStats{max_hp: 16, hp: 16, defence: 1, power: 4}) - .build(); + for room in map.rooms.iter().skip(1) { + let(x,y) = room.center(); + spawner::random_monster(&mut gs.ecs, x, y); } + gs.ecs.insert(map); + gs.ecs.insert(player_entity); gs.ecs.insert(RunState::PreRun); gs.ecs.insert(gamelog::GameLog{ entries : vec!["Welcome to my rougelike".to_string()]}); + + + // Main loop runner rltk::main_loop(context, gs) } diff --git a/src/map.rs b/src/map.rs index 9698e21..928a2f3 100644 --- a/src/map.rs +++ b/src/map.rs @@ -3,9 +3,9 @@ use rltk::{Algorithm2D, BaseMap, Point, RandomNumberGenerator, Rltk, RGB}; use specs::prelude::*; use std::cmp::{max, min}; -const MAPWIDTH : usize = 80; -const MAPHIEGHT : usize = 43; -const MAPCOUNT : usize = MAPHIEGHT * MAPWIDTH; +pub const MAPWIDTH : usize = 80; +pub const MAPHIEGHT : usize = 43; +pub const MAPCOUNT : usize = MAPHIEGHT * MAPWIDTH; #[derive(PartialEq, Copy, Clone)] pub enum TileType { diff --git a/src/spawner.rs b/src/spawner.rs new file mode 100644 index 0000000..5461153 --- /dev/null +++ b/src/spawner.rs @@ -0,0 +1,58 @@ +use rltk::{ RGB, RandomNumberGenerator }; +use specs::prelude::*; +use super::{CombatStats, Player, Renderable, Name, Position, Viewshed, Monster, BlocksTile}; + +const MAX_MONSTERS : i32 = 4; +const MAX_ITEMS : i32 = 2; + +// Spawns the player and returns his/her entity object. +pub fn player(ecs : &mut World, player_x : i32, player_y : i32) -> Entity { + ecs + .create_entity() + .with(Position{x: player_x, y: player_y}) + .with(Renderable{ + glyph: rltk::to_cp437('@'), + fg: RGB::named(rltk::YELLOW), + bg: RGB::named(rltk::BLACK), + }) + .with(Player{}) + .with(Viewshed{visible_tiles : Vec::new(), range: 8, dirty : true}) + .with(Name{name: "Player".to_string()}) + .with(CombatStats{ max_hp: 30, hp: 30, defence: 2, power: 5}) + .build() +} + +pub fn random_monster(ecs: &mut World, x: i32, y: i32) { + let roll :i32; + { + let mut rng = ecs.write_resource::(); + roll = rng.roll_dice(1, 2); + } + match roll{ + 1 => { orc(ecs, x, y) } + _ => { goblin(ecs, x, y) } + } +} + +fn orc(ecs: &mut World, x: i32, y: i32) { monster(ecs, x, y, rltk::to_cp437('o'), "Orc"); } +fn goblin(ecs: &mut World, x: i32, y: i32) { monster(ecs, x, y, rltk::to_cp437('g'), "Goblin"); } + +fn monster(ecs: &mut World, x: i32, y: i32, glyph : rltk::FontCharType, name : S) { + ecs.create_entity() + .with(Position{x, y}) + .with(Renderable{ + glyph: glyph, + fg: RGB::named(rltk::RED), + bg: RGB::named(rltk::BLACK), + }) + .with(Viewshed{ visible_tiles : Vec::new(), range: 8, dirty: true}) + .with(Monster{}) + .with(Name{ name: name.to_string()}) + .with(BlocksTile{}) + .with(CombatStats{ max_hp: 16, hp: 16, defence: 1, power: 4}) + .build(); +} + +// https://bfnightly.bracketproductions.com/chapter_9.html +/// Still in spawner.rs, we create a new function - spawn_room that uses these constants +pub fn spawn_room() \ No newline at end of file