made the switch to using bracket-lib directly, instead of rltk wrapper

this should solve the build issues; it makes using the non-crashing github build a lot easier, because it lets the explicit rltk dependency be removed.
This commit is contained in:
Llywelwyn 2023-09-05 02:23:31 +01:00
parent 455b8f2d80
commit 85efe13dc5
93 changed files with 1528 additions and 770 deletions

View file

@ -1,5 +1,6 @@
use super::{ BuilderMap, MetaMapBuilder, Position };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
use bracket_lib::prelude::*;
#[allow(dead_code)]
pub enum XStart {
@ -21,7 +22,7 @@ pub struct AreaStartingPosition {
}
impl MetaMapBuilder for AreaStartingPosition {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -64,9 +65,12 @@ impl AreaStartingPosition {
if crate::tile_walkable(*tiletype) {
available_floors.push((
idx,
rltk::DistanceAlg::PythagorasSquared.distance2d(
rltk::Point::new((idx as i32) % build_data.map.width, (idx as i32) / build_data.map.width),
rltk::Point::new(seed_x, seed_y)
DistanceAlg::PythagorasSquared.distance2d(
Point::new(
(idx as i32) % build_data.map.width,
(idx as i32) / build_data.map.width
),
Point::new(seed_x, seed_y)
),
));
}

View file

@ -1,5 +1,5 @@
use super::{ BuilderMap, InitialMapBuilder, Rect, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct BspDungeonBuilder {
rects: Vec<Rect>,
@ -7,7 +7,7 @@ pub struct BspDungeonBuilder {
impl InitialMapBuilder for BspDungeonBuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}

View file

@ -1,5 +1,5 @@
use super::{ draw_corridor, BuilderMap, InitialMapBuilder, Rect, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
const MIN_ROOM_SIZE: i32 = 8;
@ -9,7 +9,7 @@ pub struct BspInteriorBuilder {
impl InitialMapBuilder for BspInteriorBuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}

View file

@ -1,5 +1,5 @@
use super::{ BuilderMap, InitialMapBuilder, MetaMapBuilder, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct CellularAutomataBuilder {
floor_tile: TileType,
@ -7,14 +7,14 @@ pub struct CellularAutomataBuilder {
impl InitialMapBuilder for CellularAutomataBuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
impl MetaMapBuilder for CellularAutomataBuilder {
#[allow(dead_code)]
fn build_map(&mut self, _rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, _rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.apply_iteration(build_data);
}
}
@ -69,16 +69,28 @@ impl CellularAutomataBuilder {
if build_data.map.tiles[idx + (build_data.map.width as usize)] == TileType::Wall {
neighbors += 1;
}
if build_data.map.tiles[idx - ((build_data.map.width as usize) - 1)] == TileType::Wall {
if
build_data.map.tiles[idx - ((build_data.map.width as usize) - 1)] ==
TileType::Wall
{
neighbors += 1;
}
if build_data.map.tiles[idx - ((build_data.map.width as usize) + 1)] == TileType::Wall {
if
build_data.map.tiles[idx - ((build_data.map.width as usize) + 1)] ==
TileType::Wall
{
neighbors += 1;
}
if build_data.map.tiles[idx + ((build_data.map.width as usize) - 1)] == TileType::Wall {
if
build_data.map.tiles[idx + ((build_data.map.width as usize) - 1)] ==
TileType::Wall
{
neighbors += 1;
}
if build_data.map.tiles[idx + ((build_data.map.width as usize) + 1)] == TileType::Wall {
if
build_data.map.tiles[idx + ((build_data.map.width as usize) + 1)] ==
TileType::Wall
{
neighbors += 1;
}

View file

@ -1,11 +1,11 @@
use super::{ BuilderMap, MetaMapBuilder, TileType };
use crate::tile_walkable;
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct CullUnreachable {}
impl MetaMapBuilder for CullUnreachable {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -21,7 +21,7 @@ impl CullUnreachable {
let start_idx = build_data.map.xy_idx(starting_pos.x, starting_pos.y);
build_data.map.populate_blocked();
let map_starts: Vec<usize> = vec![start_idx];
let dijkstra_map = rltk::DijkstraMap::new(
let dijkstra_map = DijkstraMap::new(
build_data.map.width as usize,
build_data.map.height as usize,
&map_starts,

View file

@ -1,11 +1,11 @@
use super::{ BuilderMap, MetaMapBuilder, TileType };
use crate::tile_walkable;
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct DistantExit {}
impl MetaMapBuilder for DistantExit {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -21,7 +21,7 @@ impl DistantExit {
let start_idx = build_data.map.xy_idx(starting_pos.x, starting_pos.y);
build_data.map.populate_blocked();
let map_starts: Vec<usize> = vec![start_idx];
let dijkstra_map = rltk::DijkstraMap::new(
let dijkstra_map = DijkstraMap::new(
build_data.map.width as usize,
build_data.map.height as usize,
&map_starts,

View file

@ -1,5 +1,5 @@
use super::{ paint, BuilderMap, InitialMapBuilder, MetaMapBuilder, Position, Symmetry, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
#[derive(PartialEq, Copy, Clone)]
#[allow(dead_code)]
@ -18,14 +18,14 @@ pub struct DLABuilder {
impl InitialMapBuilder for DLABuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
impl MetaMapBuilder for DLABuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -94,7 +94,10 @@ impl DLABuilder {
#[allow(clippy::map_entry)]
fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
// Carve a starting seed
let starting_position = Position { x: build_data.map.width / 2, y: build_data.map.height / 2 };
let starting_position = Position {
x: build_data.map.width / 2,
y: build_data.map.height / 2,
};
let start_idx = build_data.map.xy_idx(starting_position.x, starting_position.y);
build_data.take_snapshot();
build_data.map.tiles[start_idx] = TileType::Floor;
@ -189,10 +192,10 @@ impl DLABuilder {
let mut prev_y = digger_y;
let mut digger_idx = build_data.map.xy_idx(digger_x, digger_y);
let mut path = rltk::line2d(
rltk::LineAlg::Bresenham,
rltk::Point::new(digger_x, digger_y),
rltk::Point::new(starting_position.x, starting_position.y)
let mut path = line2d(
LineAlg::Bresenham,
Point::new(digger_x, digger_y),
Point::new(starting_position.x, starting_position.y)
);
while build_data.map.tiles[digger_idx] == TileType::Wall && !path.is_empty() {

View file

@ -1,11 +1,11 @@
use super::{ BuilderMap, MetaMapBuilder, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct DoorPlacement {}
impl MetaMapBuilder for DoorPlacement {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.doors(rng, build_data);
}
}
@ -30,7 +30,11 @@ impl DoorPlacement {
// There are no corridors - scan for possible places
let tiles = build_data.map.tiles.clone();
for (i, tile) in tiles.iter().enumerate() {
if *tile == TileType::Floor && self.door_possible(build_data, i) && rng.roll_dice(1, 6) == 1 {
if
*tile == TileType::Floor &&
self.door_possible(build_data, i) &&
rng.roll_dice(1, 6) == 1
{
build_data.spawn_list.push((i, "door".to_string()));
}
}

View file

@ -1,5 +1,5 @@
use super::{ paint, BuilderMap, InitialMapBuilder, MetaMapBuilder, Position, Symmetry, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
#[derive(PartialEq, Copy, Clone)]
#[allow(dead_code)]
@ -22,14 +22,14 @@ pub struct DrunkardsWalkBuilder {
impl InitialMapBuilder for DrunkardsWalkBuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
impl MetaMapBuilder for DrunkardsWalkBuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -107,7 +107,10 @@ impl DrunkardsWalkBuilder {
fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
// Set a central starting point
let starting_position = Position { x: build_data.map.width / 2, y: build_data.map.height / 2 };
let starting_position = Position {
x: build_data.map.width / 2,
y: build_data.map.height / 2,
};
let start_idx = build_data.map.xy_idx(starting_position.x, starting_position.y);
build_data.map.tiles[start_idx] = TileType::Floor;
@ -144,7 +147,13 @@ impl DrunkardsWalkBuilder {
if build_data.map.tiles[drunk_idx] == TileType::Wall {
did_something = true;
}
paint(&mut build_data.map, self.settings.symmetry, self.settings.brush_size, drunk_x, drunk_y);
paint(
&mut build_data.map,
self.settings.symmetry,
self.settings.brush_size,
drunk_x,
drunk_y
);
build_data.map.tiles[drunk_idx] = TileType::DownStair;
let stagger_direction = rng.roll_dice(1, 4);

View file

@ -1,6 +1,6 @@
use super::{ BuilderMap, MetaMapBuilder, TileType };
use crate::tile_walkable;
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct FillEdges {
fill_with: TileType,
@ -9,7 +9,7 @@ pub struct FillEdges {
impl MetaMapBuilder for FillEdges {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.fill_edges(rng, build_data);
}
}

View file

@ -1,5 +1,5 @@
use super::{ BuilderMap, MetaMapBuilder, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct Foliage {
start_tile: TileType,
@ -8,7 +8,7 @@ pub struct Foliage {
impl MetaMapBuilder for Foliage {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.apply(rng, build_data);
}
}

View file

@ -11,12 +11,12 @@ use super::{
YStart,
Foliage,
};
use rltk::prelude::*;
use bracket_lib::prelude::*;
use crate::data::names::*;
pub fn forest_builder(
new_id: i32,
_rng: &mut rltk::RandomNumberGenerator,
_rng: &mut RandomNumberGenerator,
width: i32,
height: i32,
difficulty: i32,

View file

@ -1,11 +1,11 @@
use super::{ BuilderMap, InitialMapBuilder, Map, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct MazeBuilder {}
impl InitialMapBuilder for MazeBuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -75,7 +75,14 @@ struct Grid<'a> {
impl<'a> Grid<'a> {
fn new(width: i32, height: i32, rng: &mut RandomNumberGenerator) -> Grid {
let mut grid = Grid { width, height, cells: Vec::new(), backtrace: Vec::new(), current: 0, rng };
let mut grid = Grid {
width,
height,
cells: Vec::new(),
backtrace: Vec::new(),
current: 0,
rng,
};
for row in 0..height {
for column in 0..width {
@ -122,7 +129,9 @@ impl<'a> Grid<'a> {
if neighbors.len() == 1 {
return Some(neighbors[0]);
} else {
return Some(neighbors[(self.rng.roll_dice(1, neighbors.len() as i32) - 1) as usize]);
return Some(
neighbors[(self.rng.roll_dice(1, neighbors.len() as i32) - 1) as usize]
);
}
}
None
@ -141,7 +150,9 @@ impl<'a> Grid<'a> {
// __lower_part__ __higher_part_
// / \ / \
// --------cell1------ | cell2-----------
let (lower_part, higher_part) = self.cells.split_at_mut(std::cmp::max(self.current, next));
let (lower_part, higher_part) = self.cells.split_at_mut(
std::cmp::max(self.current, next)
);
let cell1 = &mut lower_part[std::cmp::min(self.current, next)];
let cell2 = &mut higher_part[0];
cell1.remove_walls(cell2);

View file

@ -1,4 +1,6 @@
use super::{ spawner, Map, Position, Rect, TileType };
use bracket_lib::prelude::*;
mod bsp_dungeon;
use bsp_dungeon::BspDungeonBuilder;
mod bsp_interior;
@ -143,7 +145,7 @@ impl BuilderChain {
self.builders.push(metabuilder);
}
pub fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator) {
pub fn build_map(&mut self, rng: &mut RandomNumberGenerator) {
match &mut self.starter {
None => panic!("Cannot run a map builder chain without a starting build system"),
Some(starter) => {
@ -165,20 +167,20 @@ impl BuilderChain {
spawner::spawn_entity(ecs, &(&entity.0, &entity.1));
}
if CONFIG.logging.log_spawning {
rltk::console::log(format!("DEBUGINFO: SPAWNED ENTITIES = {:?}", spawned_entities));
console::log(format!("DEBUGINFO: SPAWNED ENTITIES = {:?}", spawned_entities));
}
}
}
pub trait InitialMapBuilder {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap);
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap);
}
pub trait MetaMapBuilder {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap);
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap);
}
fn random_start_position(rng: &mut rltk::RandomNumberGenerator) -> (XStart, YStart) {
fn random_start_position(rng: &mut RandomNumberGenerator) -> (XStart, YStart) {
let x;
let xroll = rng.roll_dice(1, 3);
match xroll {
@ -210,11 +212,7 @@ fn random_start_position(rng: &mut rltk::RandomNumberGenerator) -> (XStart, YSta
(x, y)
}
fn random_room_builder(
rng: &mut rltk::RandomNumberGenerator,
builder: &mut BuilderChain,
end: bool
) {
fn random_room_builder(rng: &mut RandomNumberGenerator, builder: &mut BuilderChain, end: bool) {
let build_roll = rng.roll_dice(1, 3);
// Start with a room builder.
match build_roll {
@ -296,7 +294,7 @@ fn random_room_builder(
}
fn random_shape_builder(
rng: &mut rltk::RandomNumberGenerator,
rng: &mut RandomNumberGenerator,
builder: &mut BuilderChain,
end: bool
) -> bool {
@ -368,7 +366,7 @@ pub enum BuildType {
pub fn random_builder(
new_id: i32,
rng: &mut rltk::RandomNumberGenerator,
rng: &mut RandomNumberGenerator,
width: i32,
height: i32,
difficulty: i32,
@ -377,7 +375,7 @@ pub fn random_builder(
end: bool,
build_type: BuildType
) -> BuilderChain {
rltk::console::log(format!("DEBUGINFO: Building random (ID:{}, DIFF:{})", new_id, difficulty));
console::log(format!("DEBUGINFO: Building random (ID:{}, DIFF:{})", new_id, difficulty));
let mut builder = BuilderChain::new(
false,
new_id,
@ -441,7 +439,7 @@ pub fn random_builder(
pub fn level_builder(
new_id: i32,
rng: &mut rltk::RandomNumberGenerator,
rng: &mut RandomNumberGenerator,
width: i32,
height: i32,
initial_player_level: i32

View file

@ -1,5 +1,5 @@
use super::{ spawner, BuilderMap, InitialMapBuilder, MetaMapBuilder, Position, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub mod prefab_levels;
pub mod prefab_sections;
pub mod prefab_vaults;
@ -25,14 +25,14 @@ pub struct PrefabBuilder {
}
impl MetaMapBuilder for PrefabBuilder {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
impl InitialMapBuilder for PrefabBuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -65,7 +65,8 @@ impl PrefabBuilder {
fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
match self.mode {
PrefabMode::Overmap => self.load_ascii_map(&prefab_levels::OVERMAP, rng, build_data, true),
PrefabMode::Overmap =>
self.load_ascii_map(&prefab_levels::OVERMAP, rng, build_data, true),
PrefabMode::Constant { level } => self.load_ascii_map(&level, rng, build_data, false),
PrefabMode::Sectional { section } => self.apply_sectional(&section, rng, build_data),
PrefabMode::RoomVaults => self.apply_room_vaults(rng, build_data),
@ -73,7 +74,13 @@ impl PrefabBuilder {
build_data.take_snapshot();
}
fn char_to_map(&mut self, ch: char, idx: usize, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
fn char_to_map(
&mut self,
ch: char,
idx: usize,
rng: &mut RandomNumberGenerator,
build_data: &mut BuilderMap
) {
let difficulty = (build_data.map.difficulty + build_data.initial_player_level) / 2;
match ch {
' ' => {
@ -123,7 +130,10 @@ impl PrefabBuilder {
}
'!' => {
build_data.map.tiles[idx] = TileType::Floor;
build_data.spawn_list.push((idx, spawner::potion_table(Some(difficulty)).roll(rng)));
build_data.spawn_list.push((
idx,
spawner::potion_table(Some(difficulty)).roll(rng),
));
}
'/' => {
build_data.map.tiles[idx] = TileType::Floor;
@ -131,14 +141,20 @@ impl PrefabBuilder {
}
'?' => {
build_data.map.tiles[idx] = TileType::Floor;
build_data.spawn_list.push((idx, spawner::scroll_table(Some(difficulty)).roll(rng)));
build_data.spawn_list.push((
idx,
spawner::scroll_table(Some(difficulty)).roll(rng),
));
}
')' => {
build_data.map.tiles[idx] = TileType::Floor;
build_data.spawn_list.push((idx, spawner::equipment_table(Some(difficulty)).roll(rng)));
build_data.spawn_list.push((
idx,
spawner::equipment_table(Some(difficulty)).roll(rng),
));
}
_ => {
rltk::console::log(format!("Unknown glyph '{}' when loading prefab", ch as u8 as char));
console::log(format!("Unknown glyph '{}' when loading prefab", ch as u8 as char));
}
}
}
@ -185,14 +201,19 @@ impl PrefabBuilder {
build_data.map.tiles[idx] = TileType::ToLocal(ID_INFINITE);
}
_ => {
rltk::console::log(format!("Unknown glyph '{}' when loading overmap", ch as u8 as char));
console::log(format!("Unknown glyph '{}' when loading overmap", ch as u8 as char));
}
}
}
#[allow(dead_code)]
fn load_rex_map(&mut self, path: &str, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
let xp_file = rltk::rex::XpFile::from_resource(path).unwrap();
fn load_rex_map(
&mut self,
path: &str,
rng: &mut RandomNumberGenerator,
build_data: &mut BuilderMap
) {
let xp_file = rex::XpFile::from_resource(path).unwrap();
for layer in &xp_file.layers {
for y in 0..layer.height {

View file

@ -1,10 +1,10 @@
use super::{ spawner, BuilderMap, MetaMapBuilder };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct RoomBasedSpawner {}
impl MetaMapBuilder for RoomBasedSpawner {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}

View file

@ -1,10 +1,10 @@
use super::{ BuilderMap, MetaMapBuilder, TileType };
use rltk::prelude::*;
use bracket_lib::prelude::*;
pub struct RoomBasedStairs {}
impl MetaMapBuilder for RoomBasedStairs {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}

View file

@ -1,10 +1,10 @@
use super::{ BuilderMap, MetaMapBuilder, Position };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct RoomBasedStartingPosition {}
impl MetaMapBuilder for RoomBasedStartingPosition {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}

View file

@ -1,10 +1,10 @@
use super::{ BuilderMap, MetaMapBuilder, Rect, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct RoomCornerRounder {}
impl MetaMapBuilder for RoomCornerRounder {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}

View file

@ -1,10 +1,10 @@
use super::{ BuilderMap, MetaMapBuilder, Rect, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct RoomDrawer {}
impl MetaMapBuilder for RoomDrawer {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -29,14 +29,11 @@ impl RoomDrawer {
fn circle(&mut self, build_data: &mut BuilderMap, room: &Rect) {
let radius = (i32::min(room.x2 - room.x1, room.y2 - room.y1) as f32) / 2.0;
let center = room.center();
let center_pt = rltk::Point::new(center.x, center.y);
let center_pt = Point::new(center.x, center.y);
for y in room.y1..=room.y2 {
for x in room.x1..=room.x2 {
let idx = build_data.map.xy_idx(x, y);
let distance = rltk::DistanceAlg::Pythagoras.distance2d(
center_pt,
rltk::Point::new(x, y)
);
let distance = DistanceAlg::Pythagoras.distance2d(center_pt, Point::new(x, y));
if
idx > 0 &&
idx < ((build_data.map.width * build_data.map.height - 1) as usize) &&

View file

@ -1,10 +1,10 @@
use super::{ paint, BuilderMap, MetaMapBuilder, Rect, Symmetry, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct RoomExploder {}
impl MetaMapBuilder for RoomExploder {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}

View file

@ -1,5 +1,5 @@
use super::{ BuilderMap, MetaMapBuilder, Rect };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
#[allow(dead_code)]
pub enum RoomSort {
@ -16,7 +16,7 @@ pub struct RoomSorter {
impl MetaMapBuilder for RoomSorter {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.sorter(rng, build_data);
}
}
@ -50,21 +50,18 @@ impl RoomSorter {
.unwrap()
.sort_by(|a, b| b.y2.cmp(&a.y2)),
RoomSort::CENTRAL => {
let map_centre = rltk::Point::new(
build_data.map.width / 2,
build_data.map.height / 2
);
let map_centre = Point::new(build_data.map.width / 2, build_data.map.height / 2);
build_data.rooms
.as_mut()
.unwrap()
.sort_by(|a: &Rect, b: &Rect| {
let a_centre_pt = rltk::Point::new(a.center().x, a.center().y);
let b_centre_pt = rltk::Point::new(b.center().x, b.center().y);
let distance_a = rltk::DistanceAlg::Pythagoras.distance2d(
let a_centre_pt = Point::new(a.center().x, a.center().y);
let b_centre_pt = Point::new(b.center().x, b.center().y);
let distance_a = DistanceAlg::Pythagoras.distance2d(
a_centre_pt,
map_centre
);
let distance_b = rltk::DistanceAlg::Pythagoras.distance2d(
let distance_b = DistanceAlg::Pythagoras.distance2d(
b_centre_pt,
map_centre
);

View file

@ -7,7 +7,7 @@ use crate::data::messages::{
FEATURE_BARRACKS_ORC,
};
use crate::raws;
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
use std::collections::HashSet;
pub enum Theme {
@ -22,7 +22,7 @@ pub struct ThemeRooms {
}
impl MetaMapBuilder for ThemeRooms {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -173,7 +173,7 @@ fn roll_until_fail(rng: &mut RandomNumberGenerator, target: i32) -> i32 {
loop {
if rng.roll_dice(1, 100) <= target - accumulator {
accumulator += 1;
rltk::console::log(accumulator);
console::log(accumulator);
} else {
break;
}

View file

@ -1,12 +1,12 @@
use super::{ BuilderMap, MetaMapBuilder, Rect, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
use std::collections::HashSet;
pub struct BresenhamCorridors {}
impl MetaMapBuilder for BresenhamCorridors {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.corridors(rng, build_data);
}
}
@ -30,12 +30,12 @@ impl BresenhamCorridors {
for (i, room) in rooms.iter().enumerate() {
let mut room_distance: Vec<(usize, f32)> = Vec::new();
let room_centre = room.center();
let room_centre_pt = rltk::Point::new(room_centre.x, room_centre.y);
let room_centre_pt = Point::new(room_centre.x, room_centre.y);
for (j, other_room) in rooms.iter().enumerate() {
if i != j && !connected.contains(&j) {
let other_centre = other_room.center();
let other_centre_pt = rltk::Point::new(other_centre.x, other_centre.y);
let distance = rltk::DistanceAlg::Pythagoras.distance2d(
let other_centre_pt = Point::new(other_centre.x, other_centre.y);
let distance = DistanceAlg::Pythagoras.distance2d(
room_centre_pt,
other_centre_pt
);
@ -46,10 +46,10 @@ impl BresenhamCorridors {
if !room_distance.is_empty() {
room_distance.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap());
let dest_centre = rooms[room_distance[0].0].center();
let line = rltk::line2d(
rltk::LineAlg::Bresenham,
let line = line2d(
LineAlg::Bresenham,
room_centre_pt,
rltk::Point::new(dest_centre.x, dest_centre.y)
Point::new(dest_centre.x, dest_centre.y)
);
let mut corridor = Vec::new();
for cell in line.iter() {

View file

@ -1,11 +1,11 @@
use super::{ draw_corridor, BuilderMap, MetaMapBuilder, Rect };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct BspCorridors {}
impl MetaMapBuilder for BspCorridors {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.corridors(rng, build_data);
}
}
@ -30,8 +30,10 @@ impl BspCorridors {
let next_room = rooms[i + 1];
let start_x = room.x1 + (rng.roll_dice(1, i32::abs(room.x1 - room.x2)) - 1);
let start_y = room.y1 + (rng.roll_dice(1, i32::abs(room.y1 - room.y2)) - 1);
let end_x = next_room.x1 + (rng.roll_dice(1, i32::abs(next_room.x1 - next_room.x2)) - 1);
let end_y = next_room.y1 + (rng.roll_dice(1, i32::abs(next_room.y1 - next_room.y2)) - 1);
let end_x =
next_room.x1 + (rng.roll_dice(1, i32::abs(next_room.x1 - next_room.x2)) - 1);
let end_y =
next_room.y1 + (rng.roll_dice(1, i32::abs(next_room.y1 - next_room.y2)) - 1);
let corridor = draw_corridor(&mut build_data.map, start_x, start_y, end_x, end_y);
corridors.push(corridor);
build_data.take_snapshot();

View file

@ -1,11 +1,11 @@
use super::{ apply_horizontal_tunnel, apply_vertical_tunnel, BuilderMap, MetaMapBuilder, Rect };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct DoglegCorridors {}
impl MetaMapBuilder for DoglegCorridors {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.corridors(rng, build_data);
}
}

View file

@ -1,12 +1,12 @@
use super::{ draw_corridor, BuilderMap, MetaMapBuilder, Rect };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
use std::collections::HashSet;
pub struct NearestCorridors {}
impl MetaMapBuilder for NearestCorridors {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.corridors(rng, build_data);
}
}
@ -30,12 +30,12 @@ impl NearestCorridors {
for (i, room) in rooms.iter().enumerate() {
let mut room_distance: Vec<(usize, f32)> = Vec::new();
let room_centre = room.center();
let room_centre_pt = rltk::Point::new(room_centre.x, room_centre.y);
let room_centre_pt = Point::new(room_centre.x, room_centre.y);
for (j, other_room) in rooms.iter().enumerate() {
if i != j && !connected.contains(&j) {
let other_centre = other_room.center();
let other_centre_pt = rltk::Point::new(other_centre.x, other_centre.y);
let distance = rltk::DistanceAlg::Pythagoras.distance2d(
let other_centre_pt = Point::new(other_centre.x, other_centre.y);
let distance = DistanceAlg::Pythagoras.distance2d(
room_centre_pt,
other_centre_pt
);

View file

@ -1,10 +1,10 @@
use super::{ spawner, BuilderMap, MetaMapBuilder };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct CorridorSpawner {}
impl MetaMapBuilder for CorridorSpawner {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}

View file

@ -2,7 +2,7 @@ use super::{
generate_voronoi_spawn_regions, remove_unreachable_areas_returning_most_distant, spawner, Map, MapBuilder,
Position, TileType, SHOW_MAPGEN,
};
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
use specs::prelude::*;
use std::collections::HashMap;

View file

@ -1,5 +1,5 @@
use super::{ BuilderMap, InitialMapBuilder, Rect };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
pub struct SimpleMapBuilder {
room_params: (i32, i32, i32),
@ -7,7 +7,7 @@ pub struct SimpleMapBuilder {
impl InitialMapBuilder for SimpleMapBuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build_rooms(rng, build_data);
}
}

View file

@ -1,16 +1,17 @@
use super::{ BuilderChain, BuilderMap, InitialMapBuilder, Position, TileType, FillEdges };
use std::collections::HashSet;
use crate::data::names::*;
use bracket_lib::prelude::*;
pub fn town_builder(
new_id: i32,
_rng: &mut rltk::RandomNumberGenerator,
_rng: &mut RandomNumberGenerator,
width: i32,
height: i32,
difficulty: i32,
initial_player_level: i32
) -> BuilderChain {
rltk::console::log(format!("DEBUGINFO: Building town (ID:{}, DIFF:{})", new_id, difficulty));
console::log(format!("DEBUGINFO: Building town (ID:{}, DIFF:{})", new_id, difficulty));
let mut chain = BuilderChain::new(
false,
new_id,
@ -32,7 +33,7 @@ pub struct TownBuilder {}
impl InitialMapBuilder for TownBuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build_map(rng, build_data);
}
}
@ -52,7 +53,7 @@ impl TownBuilder {
return Box::new(TownBuilder {});
}
pub fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
pub fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
// Make visible for snapshot
for t in build_data.map.visible_tiles.iter_mut() {
*t = true;
@ -64,8 +65,20 @@ impl TownBuilder {
let (mut available_building_tiles, wall_gap_y) = self.town_walls(rng, build_data);
let mut buildings = self.buildings(rng, build_data, &mut available_building_tiles);
let doors = self.add_doors(rng, build_data, &mut buildings, wall_gap_y);
self.path_from_tiles_to_nearest_tiletype(build_data, &doors, TileType::Road, TileType::Road, true);
self.path_from_tiles_to_nearest_tiletype(build_data, &piers, TileType::Road, TileType::Road, false);
self.path_from_tiles_to_nearest_tiletype(
build_data,
&doors,
TileType::Road,
TileType::Road,
true
);
self.path_from_tiles_to_nearest_tiletype(
build_data,
&piers,
TileType::Road,
TileType::Road,
false
);
// Spawn entities
let building_size = self.sort_buildings(&buildings);
@ -81,7 +94,10 @@ impl TownBuilder {
build_data.take_snapshot();
}
fn sort_buildings(&mut self, buildings: &[(i32, i32, i32, i32)]) -> Vec<(usize, i32, BuildingTag)> {
fn sort_buildings(
&mut self,
buildings: &[(i32, i32, i32, i32)]
) -> Vec<(usize, i32, BuildingTag)> {
// Sort buildings by size, defaulting them to Unassigned buildings
let mut building_size: Vec<(usize, i32, BuildingTag)> = Vec::new();
for (i, building) in buildings.iter().enumerate() {
@ -105,7 +121,7 @@ impl TownBuilder {
fn building_factory(
&mut self,
rng: &mut rltk::RandomNumberGenerator,
rng: &mut RandomNumberGenerator,
build_data: &mut BuilderMap,
buildings: &[(i32, i32, i32, i32)],
building_index: &[(usize, i32, BuildingTag)]
@ -124,7 +140,7 @@ impl TownBuilder {
}
}
fn spawn_dockers(&mut self, build_data: &mut BuilderMap, rng: &mut rltk::RandomNumberGenerator) {
fn spawn_dockers(&mut self, build_data: &mut BuilderMap, rng: &mut RandomNumberGenerator) {
for (idx, tt) in build_data.map.tiles.iter().enumerate() {
if *tt == TileType::Bridge && rng.roll_dice(1, 20) == 1 {
let roll = rng.roll_dice(1, 2);
@ -139,7 +155,7 @@ impl TownBuilder {
fn spawn_townsfolk(
&mut self,
build_data: &mut BuilderMap,
rng: &mut rltk::RandomNumberGenerator,
rng: &mut RandomNumberGenerator,
available_building_tiles: &mut HashSet<usize>
) {
for idx in available_building_tiles.iter() {
@ -176,7 +192,7 @@ impl TownBuilder {
&mut self,
building: &(i32, i32, i32, i32),
build_data: &mut BuilderMap,
rng: &mut rltk::RandomNumberGenerator,
rng: &mut RandomNumberGenerator,
to_place: &mut Vec<&str>,
avoid_tile: usize
) {
@ -201,9 +217,12 @@ impl TownBuilder {
&mut self,
building: &(i32, i32, i32, i32),
build_data: &mut BuilderMap,
rng: &mut rltk::RandomNumberGenerator
rng: &mut RandomNumberGenerator
) {
let player_idx = build_data.map.xy_idx(building.0 + building.2 / 2, building.1 + building.3 / 2);
let player_idx = build_data.map.xy_idx(
building.0 + building.2 / 2,
building.1 + building.3 / 2
);
// Place other items
let mut to_place: Vec<&str> = vec![
@ -224,7 +243,7 @@ impl TownBuilder {
&mut self,
building: &(i32, i32, i32, i32),
build_data: &mut BuilderMap,
rng: &mut rltk::RandomNumberGenerator
rng: &mut RandomNumberGenerator
) {
let mut to_place: Vec<&str> = vec![
"npc_priest",
@ -244,10 +263,13 @@ impl TownBuilder {
&mut self,
building: &(i32, i32, i32, i32),
build_data: &mut BuilderMap,
rng: &mut rltk::RandomNumberGenerator
rng: &mut RandomNumberGenerator
) {
// Place exit
let exit_idx = build_data.map.xy_idx(building.0 + building.2 / 2, building.1 + building.3 / 2);
let exit_idx = build_data.map.xy_idx(
building.0 + building.2 / 2,
building.1 + building.3 / 2
);
build_data.map.tiles[exit_idx] = TileType::DownStair;
let mut to_place: Vec<&str> = vec!["npc_miner", "npc_miner", "npc_guard", "prop_chair"];
self.random_building_spawn(building, build_data, rng, &mut to_place, exit_idx)
@ -257,9 +279,15 @@ impl TownBuilder {
&mut self,
building: &(i32, i32, i32, i32),
build_data: &mut BuilderMap,
rng: &mut rltk::RandomNumberGenerator
rng: &mut RandomNumberGenerator
) {
let mut to_place: Vec<&str> = vec!["prop_bed", "prop_table", "dog_little", "prop_chair", "prop_chair"];
let mut to_place: Vec<&str> = vec![
"prop_bed",
"prop_table",
"dog_little",
"prop_chair",
"prop_chair"
];
self.random_building_spawn(building, build_data, rng, &mut to_place, 0);
}
@ -267,9 +295,14 @@ impl TownBuilder {
&mut self,
building: &(i32, i32, i32, i32),
build_data: &mut BuilderMap,
rng: &mut rltk::RandomNumberGenerator
rng: &mut RandomNumberGenerator
) {
let mut to_place: Vec<&str> = vec!["npc_townsperson", "prop_bed", "prop_table", "prop_chair"];
let mut to_place: Vec<&str> = vec![
"npc_townsperson",
"prop_bed",
"prop_table",
"prop_chair"
];
self.random_building_spawn(building, build_data, rng, &mut to_place, 0);
}
@ -277,7 +310,7 @@ impl TownBuilder {
&mut self,
building: &(i32, i32, i32, i32),
build_data: &mut BuilderMap,
rng: &mut rltk::RandomNumberGenerator
rng: &mut RandomNumberGenerator
) {
let mut to_place: Vec<&str> = vec!["rat", "rat", "rat", "prop_table", "prop_chair"];
self.random_building_spawn(building, build_data, rng, &mut to_place, 0);
@ -291,7 +324,11 @@ impl TownBuilder {
build_data.take_snapshot();
}
fn water_and_piers(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) -> Vec<usize> {
fn water_and_piers(
&mut self,
rng: &mut RandomNumberGenerator,
build_data: &mut BuilderMap
) -> Vec<usize> {
let mut n = (rng.roll_dice(1, 65535) as f32) / 65535f32;
let mut water_width: Vec<i32> = Vec::new();
let variance = 5;
@ -300,7 +337,8 @@ impl TownBuilder {
let sand_width = shallow_width + 4;
for y in 0..build_data.height {
let n_water = ((f32::sin(n) * (variance as f32)) as i32) + minimum_width + rng.roll_dice(1, 2);
let n_water =
((f32::sin(n) * (variance as f32)) as i32) + minimum_width + rng.roll_dice(1, 2);
water_width.push(n_water);
n += 0.1;
for x in 0..n_water {
@ -374,7 +412,7 @@ impl TownBuilder {
fn town_walls(
&mut self,
rng: &mut rltk::RandomNumberGenerator,
rng: &mut RandomNumberGenerator,
build_data: &mut BuilderMap
) -> (HashSet<usize>, i32) {
let mut available_building_tiles: HashSet<usize> = HashSet::new();
@ -385,7 +423,10 @@ impl TownBuilder {
const HALF_PATH_THICKNESS: i32 = 3;
let wall_gap_y =
build_data.height / 2 + rng.roll_dice(1, PATH_OFFSET_FROM_CENTRE * 2) - 1 - PATH_OFFSET_FROM_CENTRE;
build_data.height / 2 +
rng.roll_dice(1, PATH_OFFSET_FROM_CENTRE * 2) -
1 -
PATH_OFFSET_FROM_CENTRE;
for y in BORDER..build_data.height - BORDER {
if !(y > wall_gap_y - HALF_PATH_THICKNESS && y < wall_gap_y + HALF_PATH_THICKNESS) {
@ -438,7 +479,7 @@ impl TownBuilder {
fn buildings(
&mut self,
rng: &mut rltk::RandomNumberGenerator,
rng: &mut RandomNumberGenerator,
build_data: &mut BuilderMap,
available_building_tiles: &mut HashSet<usize>
) -> Vec<(i32, i32, i32, i32)> {
@ -452,7 +493,9 @@ impl TownBuilder {
const MAX_BUILDING_SIZE: i32 = 10;
while n_buildings < REQUIRED_BUILDINGS {
let bx = rng.roll_dice(1, build_data.map.width - OFFSET_FROM_LEFT - BORDER) + OFFSET_FROM_LEFT;
let bx =
rng.roll_dice(1, build_data.map.width - OFFSET_FROM_LEFT - BORDER) +
OFFSET_FROM_LEFT;
let by = rng.roll_dice(1, build_data.map.height) - BORDER;
let bw = rng.roll_dice(1, MAX_BUILDING_SIZE - MIN_BUILDING_SIZE) + MIN_BUILDING_SIZE;
let bh = rng.roll_dice(1, MAX_BUILDING_SIZE - MIN_BUILDING_SIZE) + MIN_BUILDING_SIZE;
@ -500,10 +543,16 @@ impl TownBuilder {
if build_data.map.tiles[idx + 1] != TileType::WoodFloor {
neighbours += 1;
}
if build_data.map.tiles[idx - (build_data.width as usize)] != TileType::WoodFloor {
if
build_data.map.tiles[idx - (build_data.width as usize)] !=
TileType::WoodFloor
{
neighbours += 1;
}
if build_data.map.tiles[idx + (build_data.width as usize)] != TileType::WoodFloor {
if
build_data.map.tiles[idx + (build_data.width as usize)] !=
TileType::WoodFloor
{
neighbours += 1;
}
if neighbours > 0 {
@ -520,7 +569,7 @@ impl TownBuilder {
fn add_doors(
&mut self,
rng: &mut rltk::RandomNumberGenerator,
rng: &mut RandomNumberGenerator,
build_data: &mut BuilderMap,
buildings: &mut Vec<(i32, i32, i32, i32)>,
wall_gap_y: i32
@ -556,23 +605,26 @@ impl TownBuilder {
build_data.map.populate_blocked();
for tile_idx in tiles.iter() {
let mut nearest_tiletype: Vec<(usize, f32)> = Vec::new();
let tile_pt = rltk::Point::new(
let tile_pt = Point::new(
(*tile_idx as i32) % (build_data.map.width as i32),
(*tile_idx as i32) / (build_data.map.width as i32)
);
for r in roads.iter() {
nearest_tiletype.push((
*r,
rltk::DistanceAlg::Manhattan.distance2d(
DistanceAlg::Manhattan.distance2d(
tile_pt,
rltk::Point::new((*r as i32) % build_data.map.width, (*r as i32) / build_data.map.width)
Point::new(
(*r as i32) % build_data.map.width,
(*r as i32) / build_data.map.width
)
),
));
}
nearest_tiletype.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap());
let destination = nearest_tiletype[0].0;
let path = rltk::a_star_search(*tile_idx, destination, &mut build_data.map);
let path = a_star_search(*tile_idx, destination, &mut build_data.map);
if path.success {
for step in path.steps.iter() {
let idx = *step as usize;

View file

@ -1,5 +1,5 @@
use super::{ BuilderMap, InitialMapBuilder, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
#[derive(PartialEq, Copy, Clone)]
#[allow(dead_code)]
@ -16,7 +16,7 @@ pub struct VoronoiBuilder {
impl InitialMapBuilder for VoronoiBuilder {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -40,20 +40,21 @@ impl VoronoiBuilder {
#[allow(clippy::map_entry)]
fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
// Make a Voronoi diagram. We'll do this the hard way to learn about the technique!
let mut voronoi_seeds: Vec<(usize, rltk::Point)> = Vec::new();
let mut voronoi_seeds: Vec<(usize, Point)> = Vec::new();
while voronoi_seeds.len() < self.n_seeds {
let vx = rng.roll_dice(1, build_data.map.width - 1);
let vy = rng.roll_dice(1, build_data.map.height - 1);
let vidx = build_data.map.xy_idx(vx, vy);
let candidate = (vidx, rltk::Point::new(vx, vy));
let candidate = (vidx, Point::new(vx, vy));
if !voronoi_seeds.contains(&candidate) {
voronoi_seeds.push(candidate);
}
}
let mut voronoi_distance = vec![(0, 0.0f32); self.n_seeds];
let mut voronoi_membership: Vec<i32> = vec![0; build_data.map.width as usize * build_data.map.height as usize];
let mut voronoi_membership: Vec<i32> =
vec![0; build_data.map.width as usize * build_data.map.height as usize];
for (i, vid) in voronoi_membership.iter_mut().enumerate() {
let x = (i as i32) % build_data.map.width;
let y = (i as i32) / build_data.map.width;
@ -62,13 +63,16 @@ impl VoronoiBuilder {
let distance;
match self.distance_algorithm {
DistanceAlgorithm::Pythagoras => {
distance = rltk::DistanceAlg::PythagorasSquared.distance2d(rltk::Point::new(x, y), pos.1);
distance = DistanceAlg::PythagorasSquared.distance2d(
Point::new(x, y),
pos.1
);
}
DistanceAlgorithm::Manhattan => {
distance = rltk::DistanceAlg::Manhattan.distance2d(rltk::Point::new(x, y), pos.1);
distance = DistanceAlg::Manhattan.distance2d(Point::new(x, y), pos.1);
}
DistanceAlgorithm::Chebyshev => {
distance = rltk::DistanceAlg::Chebyshev.distance2d(rltk::Point::new(x, y), pos.1);
distance = DistanceAlg::Chebyshev.distance2d(Point::new(x, y), pos.1);
}
}
voronoi_distance[seed] = (seed, distance);

View file

@ -1,12 +1,12 @@
use super::{ spawner, BuilderMap, MetaMapBuilder, TileType };
use super::{ spawner, BuilderMap, MetaMapBuilder };
use crate::tile_walkable;
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
use std::collections::HashMap;
pub struct VoronoiSpawning {}
impl MetaMapBuilder for VoronoiSpawning {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -20,10 +20,10 @@ impl VoronoiSpawning {
#[allow(clippy::map_entry)]
fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
let mut noise_areas: HashMap<i32, Vec<usize>> = HashMap::new();
let mut noise = rltk::FastNoise::seeded(rng.roll_dice(1, 65536) as u64);
noise.set_noise_type(rltk::NoiseType::Cellular);
let mut noise = FastNoise::seeded(rng.roll_dice(1, 65536) as u64);
noise.set_noise_type(NoiseType::Cellular);
noise.set_frequency(0.08);
noise.set_cellular_distance_function(rltk::CellularDistanceFunction::Manhattan);
noise.set_cellular_distance_function(CellularDistanceFunction::Manhattan);
for y in 1..build_data.map.height - 1 {
for x in 1..build_data.map.width - 1 {

View file

@ -1,7 +1,13 @@
use super::{Map, MapChunk, TileType};
use super::{ Map, MapChunk, TileType };
use std::collections::HashSet;
use bracket_lib::prelude::*;
pub fn build_patterns(map: &Map, chunk_size: i32, include_flipping: bool, dedupe: bool) -> Vec<Vec<TileType>> {
pub fn build_patterns(
map: &Map,
chunk_size: i32,
include_flipping: bool,
dedupe: bool
) -> Vec<Vec<TileType>> {
let chunks_x = map.width / chunk_size;
let chunks_y = map.height / chunk_size;
let mut patterns = Vec::new();
@ -49,16 +55,22 @@ pub fn build_patterns(map: &Map, chunk_size: i32, include_flipping: bool, dedupe
// Dedupe
if dedupe {
rltk::console::log(format!("Pre de-duplication, there are {} patterns.", patterns.len()));
console::log(format!("Pre de-duplication, there are {} patterns.", patterns.len()));
let set: HashSet<Vec<TileType>> = patterns.drain(..).collect(); // Dedupes
patterns.extend(set.into_iter());
rltk::console::log(format!("There are {} patterns.", patterns.len()));
console::log(format!("There are {} patterns.", patterns.len()));
}
return patterns;
}
pub fn render_pattern_to_map(map: &mut Map, chunk: &MapChunk, chunk_size: i32, start_x: i32, start_y: i32) {
pub fn render_pattern_to_map(
map: &mut Map,
chunk: &MapChunk,
chunk_size: i32,
start_x: i32,
start_y: i32
) {
let mut i = 0usize;
for tile_y in 0..chunk_size {
for tile_x in 0..chunk_size {
@ -70,25 +82,25 @@ pub fn render_pattern_to_map(map: &mut Map, chunk: &MapChunk, chunk_size: i32, s
}
for (x, northbound) in chunk.exits[0].iter().enumerate() {
if *northbound {
let map_idx = map.xy_idx(start_x + x as i32, start_y);
let map_idx = map.xy_idx(start_x + (x as i32), start_y);
map.tiles[map_idx] = TileType::DownStair;
}
}
for (x, southbound) in chunk.exits[1].iter().enumerate() {
if *southbound {
let map_idx = map.xy_idx(start_x + x as i32, start_y + chunk_size - 1);
let map_idx = map.xy_idx(start_x + (x as i32), start_y + chunk_size - 1);
map.tiles[map_idx] = TileType::DownStair;
}
}
for (x, westbound) in chunk.exits[2].iter().enumerate() {
if *westbound {
let map_idx = map.xy_idx(start_x, start_y + x as i32);
let map_idx = map.xy_idx(start_x, start_y + (x as i32));
map.tiles[map_idx] = TileType::DownStair;
}
}
for (x, eastbound) in chunk.exits[3].iter().enumerate() {
if *eastbound {
let map_idx = map.xy_idx(start_x + chunk_size - 1, start_y + x as i32);
let map_idx = map.xy_idx(start_x + chunk_size - 1, start_y + (x as i32));
map.tiles[map_idx] = TileType::DownStair;
}
}

View file

@ -1,5 +1,5 @@
use super::{ BuilderMap, Map, MetaMapBuilder, TileType };
use rltk::RandomNumberGenerator;
use bracket_lib::prelude::*;
mod common;
use common::*;
mod constraints;
@ -11,7 +11,7 @@ use solver::*;
pub struct WaveFunctionCollapseBuilder {}
impl MetaMapBuilder for WaveFunctionCollapseBuilder {
fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) {
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.build(rng, build_data);
}
}
@ -54,7 +54,12 @@ impl WaveFunctionCollapseBuilder {
build_data.spawn_list.clear();
}
fn render_tile_gallery(&mut self, constraints: &[MapChunk], chunk_size: i32, build_data: &mut BuilderMap) {
fn render_tile_gallery(
&mut self,
constraints: &[MapChunk],
chunk_size: i32,
build_data: &mut BuilderMap
) {
build_data.map = Map::new(
false,
0,

View file

@ -1,5 +1,6 @@
use super::{Map, MapChunk};
use super::{ Map, MapChunk };
use std::collections::HashSet;
use bracket_lib::prelude::*;
pub struct Solver {
constraints: Vec<MapChunk>,
@ -16,7 +17,7 @@ impl Solver {
let chunks_x = (map.width / chunk_size) as usize;
let chunks_y = (map.height / chunk_size) as usize;
let mut remaining: Vec<(usize, i32)> = Vec::new();
for i in 0..(chunks_x * chunks_y) {
for i in 0..chunks_x * chunks_y {
remaining.push((i, 0));
}
@ -32,7 +33,7 @@ impl Solver {
}
fn chunk_idx(&self, x: usize, y: usize) -> usize {
return ((y * self.chunks_x) + x) as usize;
return (y * self.chunks_x + x) as usize;
}
fn count_neighbours(&self, chunk_x: usize, chunk_y: usize) -> i32 {
@ -99,8 +100,11 @@ impl Solver {
self.remaining = remain_copy;
// Pick a random chunk we haven't dealt with yet and get its index, remove from remaining list
let remaining_index =
if !neighbours_exist { (rng.roll_dice(1, self.remaining.len() as i32) - 1) as usize } else { 0usize };
let remaining_index = if !neighbours_exist {
(rng.roll_dice(1, self.remaining.len() as i32) - 1) as usize
} else {
0usize
};
let chunk_index = self.remaining[remaining_index].0;
self.remaining.remove(remaining_index);
@ -158,10 +162,10 @@ impl Solver {
// There is nothing nearby, so we can have anything!
let new_chunk_idx = (rng.roll_dice(1, self.constraints.len() as i32) - 1) as usize;
self.chunks[chunk_index] = Some(new_chunk_idx);
let left_x = chunk_x as i32 * self.chunk_size as i32;
let right_x = (chunk_x as i32 + 1) * self.chunk_size as i32;
let top_y = chunk_y as i32 * self.chunk_size as i32;
let bottom_y = (chunk_y as i32 + 1) * self.chunk_size as i32;
let left_x = (chunk_x as i32) * (self.chunk_size as i32);
let right_x = ((chunk_x as i32) + 1) * (self.chunk_size as i32);
let top_y = (chunk_y as i32) * (self.chunk_size as i32);
let bottom_y = ((chunk_y as i32) + 1) * (self.chunk_size as i32);
let mut i: usize = 0;
for y in top_y..bottom_y {
@ -195,18 +199,21 @@ impl Solver {
}
if possible_options.is_empty() {
rltk::console::log("Oh no! It's not possible!");
console::log("Oh no! It's not possible!");
self.possible = false;
return true;
} else {
let new_chunk_idx =
if possible_options.len() == 1 { 0 } else { rng.roll_dice(1, possible_options.len() as i32) - 1 };
let new_chunk_idx = if possible_options.len() == 1 {
0
} else {
rng.roll_dice(1, possible_options.len() as i32) - 1
};
self.chunks[chunk_index] = Some(new_chunk_idx as usize);
let left_x = chunk_x as i32 * self.chunk_size as i32;
let right_x = (chunk_x as i32 + 1) * self.chunk_size as i32;
let top_y = chunk_y as i32 * self.chunk_size as i32;
let bottom_y = (chunk_y as i32 + 1) * self.chunk_size as i32;
let left_x = (chunk_x as i32) * (self.chunk_size as i32);
let right_x = ((chunk_x as i32) + 1) * (self.chunk_size as i32);
let top_y = (chunk_y as i32) * (self.chunk_size as i32);
let bottom_y = ((chunk_y as i32) + 1) * (self.chunk_size as i32);
let mut i: usize = 0;
for y in top_y..bottom_y {