barracks dungeon feature
This commit is contained in:
parent
6f99b879ff
commit
050973eae4
3 changed files with 60 additions and 4 deletions
|
|
@ -111,6 +111,26 @@
|
||||||
{ "id": "horse_large", "weight": 2, "difficulty": 9}
|
{ "id": "horse_large", "weight": 2, "difficulty": 9}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "squad_goblin",
|
||||||
|
"table": [
|
||||||
|
{ "id": "goblin", "weight": 3, "difficulty": 1}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "squad_kobold",
|
||||||
|
"table": [
|
||||||
|
{ "id": "kobold", "weight": 3, "difficulty": 1},
|
||||||
|
{ "id": "kobold_large", "weight": 2, "difficulty": 2}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "squad_orc",
|
||||||
|
"table": [
|
||||||
|
{ "id": "orc", "weight": 2, "difficulty": 2},
|
||||||
|
{ "id": "orc_hill", "weight": 1, "difficulty": 4}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "traps",
|
"id": "traps",
|
||||||
"table": [
|
"table": [
|
||||||
|
|
|
||||||
|
|
@ -287,7 +287,8 @@ fn random_room_builder(rng: &mut rltk::RandomNumberGenerator, builder: &mut Buil
|
||||||
_ => builder.with(VoronoiSpawning::new()),
|
_ => builder.with(VoronoiSpawning::new()),
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.with(ThemeRooms::grass(12));
|
builder.with(ThemeRooms::grass(12)); // 12% chance of an overgrown treant room.
|
||||||
|
builder.with(ThemeRooms::barracks(5)); // 5% chance of a squad barracks.
|
||||||
}
|
}
|
||||||
|
|
||||||
fn random_shape_builder(rng: &mut rltk::RandomNumberGenerator, builder: &mut BuilderChain, end: bool) -> bool {
|
fn random_shape_builder(rng: &mut rltk::RandomNumberGenerator, builder: &mut BuilderChain, end: bool) -> bool {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
use super::{ BuilderMap, MetaMapBuilder, Rect, TileType };
|
use super::{ BuilderMap, MetaMapBuilder, Rect, TileType };
|
||||||
use crate::tile_walkable;
|
use crate::tile_walkable;
|
||||||
|
use crate::raws;
|
||||||
use rltk::RandomNumberGenerator;
|
use rltk::RandomNumberGenerator;
|
||||||
|
|
||||||
pub enum Theme {
|
pub enum Theme {
|
||||||
Grass,
|
Grass,
|
||||||
Forest,
|
Barrack,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ThemeRooms {
|
pub struct ThemeRooms {
|
||||||
|
|
@ -23,8 +24,8 @@ impl ThemeRooms {
|
||||||
pub fn grass(percent: i32) -> Box<ThemeRooms> {
|
pub fn grass(percent: i32) -> Box<ThemeRooms> {
|
||||||
return Box::new(ThemeRooms { theme: Theme::Grass, percent });
|
return Box::new(ThemeRooms { theme: Theme::Grass, percent });
|
||||||
}
|
}
|
||||||
pub fn forest(percent: i32) -> Box<ThemeRooms> {
|
pub fn barracks(percent: i32) -> Box<ThemeRooms> {
|
||||||
return Box::new(ThemeRooms { theme: Theme::Forest, percent });
|
return Box::new(ThemeRooms { theme: Theme::Barrack, percent });
|
||||||
}
|
}
|
||||||
|
|
||||||
fn grassify(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap, room: &Rect) {
|
fn grassify(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap, room: &Rect) {
|
||||||
|
|
@ -60,6 +61,39 @@ impl ThemeRooms {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn place_barracks(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap, room: &Rect) {
|
||||||
|
let mut possible: Vec<usize> = Vec::new();
|
||||||
|
let (x1, x2, y1, y2) = (room.x1 + 1, room.x2 - 1, room.y1 + 1, room.y2 - 1);
|
||||||
|
for x in x1..x2 {
|
||||||
|
for y in y1..y2 {
|
||||||
|
let idx = build_data.map.xy_idx(x, y);
|
||||||
|
if tile_walkable(build_data.map.tiles[idx]) && build_data.map.tiles[idx] != TileType::DownStair {
|
||||||
|
possible.push(idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut needs_captain = if rng.roll_dice(1, 3) == 1 { false } else { true };
|
||||||
|
let (captain, squad) = match rng.roll_dice(1, 4) {
|
||||||
|
1 => ("goblin_chieftain", "squad_goblin"),
|
||||||
|
2 => ("kobold_captain", "squad_kobold"),
|
||||||
|
_ => ("orc_captain", "squad_orc"),
|
||||||
|
};
|
||||||
|
for idx in possible {
|
||||||
|
if idx % 2 == 0 && rng.roll_dice(1, 2) == 1 {
|
||||||
|
build_data.spawn_list.push((idx, "prop_bed".to_string()));
|
||||||
|
} else if rng.roll_dice(1, 5) == 1 {
|
||||||
|
let mob = if needs_captain {
|
||||||
|
captain.to_string()
|
||||||
|
} else {
|
||||||
|
raws::table_by_name(&raws::RAWS.lock().unwrap(), squad, None).roll(rng)
|
||||||
|
};
|
||||||
|
needs_captain = false;
|
||||||
|
build_data.spawn_list.push((idx, mob));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
|
fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
|
||||||
let rooms: Vec<Rect>;
|
let rooms: Vec<Rect>;
|
||||||
if let Some(rooms_builder) = &build_data.rooms {
|
if let Some(rooms_builder) = &build_data.rooms {
|
||||||
|
|
@ -72,6 +106,7 @@ impl ThemeRooms {
|
||||||
if rng.roll_dice(1, 100) < self.percent {
|
if rng.roll_dice(1, 100) < self.percent {
|
||||||
match self.theme {
|
match self.theme {
|
||||||
Theme::Grass => self.grassify(rng, build_data, room),
|
Theme::Grass => self.grassify(rng, build_data, room),
|
||||||
|
Theme::Barrack => self.place_barracks(rng, build_data, room),
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
build_data.take_snapshot();
|
build_data.take_snapshot();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue