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:
parent
455b8f2d80
commit
85efe13dc5
93 changed files with 1528 additions and 770 deletions
|
|
@ -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)
|
||||
),
|
||||
));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(§ion, 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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) &&
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue