barracks dungeon feature

This commit is contained in:
Llywelwyn 2023-08-30 11:41:39 +01:00
parent 6f99b879ff
commit 050973eae4
3 changed files with 60 additions and 4 deletions

View file

@ -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": [

View file

@ -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 {

View file

@ -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();