atomises spawn tables

This commit is contained in:
Llywelwyn 2023-07-11 03:43:14 +01:00
parent f61af23c56
commit aaa5376544
2 changed files with 39 additions and 12 deletions

View file

@ -50,7 +50,7 @@ impl RandomTable {
// the roll by the weight and test the next entry. // the roll by the weight and test the next entry.
let mut roll = rng.roll_dice(1, self.total_weight) - 1; let mut roll = rng.roll_dice(1, self.total_weight) - 1;
let mut index: usize = 0; let mut index: usize = 0;
while roll > 0 { while roll >= 0 {
if roll < self.entries[index].weight { if roll < self.entries[index].weight {
return self.entries[index].name.clone(); return self.entries[index].name.clone();
} }

View file

@ -3,7 +3,7 @@ use super::{
Item, MagicMapper, Monster, Name, Player, Position, ProvidesHealing, Ranged, Rect, Renderable, SerializeMe, Item, MagicMapper, Monster, Name, Player, Position, ProvidesHealing, Ranged, Rect, Renderable, SerializeMe,
Viewshed, AOE, MAPWIDTH, Viewshed, AOE, MAPWIDTH,
}; };
use rltk::{RandomNumberGenerator, RGB}; use rltk::{console, RandomNumberGenerator, RGB};
use specs::prelude::*; use specs::prelude::*;
use specs::saveload::{MarkedBuilder, SimpleMarker}; use specs::saveload::{MarkedBuilder, SimpleMarker};
use std::collections::HashMap; use std::collections::HashMap;
@ -70,7 +70,6 @@ const MAX_ENTITIES: i32 = 4;
#[allow(clippy::map_entry)] #[allow(clippy::map_entry)]
pub fn spawn_room(ecs: &mut World, room: &Rect, map_depth: i32) { pub fn spawn_room(ecs: &mut World, room: &Rect, map_depth: i32) {
let spawn_table = room_table(map_depth);
let mut spawn_points: HashMap<usize, String> = HashMap::new(); let mut spawn_points: HashMap<usize, String> = HashMap::new();
// Scope for borrow checker // Scope for borrow checker
@ -91,6 +90,19 @@ pub fn spawn_room(ecs: &mut World, room: &Rect, map_depth: i32) {
let y = (room.y1 + rng.roll_dice(1, i32::abs(room.y2 - room.y1))) as usize; let y = (room.y1 + rng.roll_dice(1, i32::abs(room.y2 - room.y1))) as usize;
let idx = (y * MAPWIDTH) + x; let idx = (y * MAPWIDTH) + x;
if !spawn_points.contains_key(&idx) { if !spawn_points.contains_key(&idx) {
let category = category_table().roll(&mut rng);
let spawn_table;
match category.as_ref() {
"mob" => {
spawn_table = mob_table(map_depth);
}
"item" => {
spawn_table = item_table(map_depth);
}
_ => {
spawn_table = debug_table();
}
}
spawn_points.insert(idx, spawn_table.roll(&mut rng)); spawn_points.insert(idx, spawn_table.roll(&mut rng));
added = true; added = true;
} else { } else {
@ -120,25 +132,40 @@ pub fn spawn_room(ecs: &mut World, room: &Rect, map_depth: i32) {
"magic missile scroll" => magic_missile_scroll(ecs, x, y), "magic missile scroll" => magic_missile_scroll(ecs, x, y),
"magic map scroll" => magic_map_scroll(ecs, x, y), "magic map scroll" => magic_map_scroll(ecs, x, y),
"cursed magic map scroll" => cursed_magic_map_scroll(ecs, x, y), "cursed magic map scroll" => cursed_magic_map_scroll(ecs, x, y),
_ => {} _ => console::log("Tried to spawn nothing. Bugfix needed!"),
} }
} }
} }
fn room_table(map_depth: i32) -> RandomTable { // 3 mobs : 1 item
fn category_table() -> RandomTable {
return RandomTable::new().add("mob", 3).add("item", 1);
}
fn debug_table() -> RandomTable {
return RandomTable::new().add("debug", 1);
}
// 6 goblins : 1 goblin chief : 2 orcs
fn mob_table(map_depth: i32) -> RandomTable {
return RandomTable::new() return RandomTable::new()
// Monsters // Monsters
.add("goblin", 15) .add("goblin", 6)
.add("goblin chieftain", 2 + map_depth) .add("goblin chieftain", 1)
.add("orc", 4 + map_depth) .add("orc", 2 + map_depth);
}
// 25 potions : 10 scrolls : 2 cursed scrolls
fn item_table(_map_depth: i32) -> RandomTable {
return RandomTable::new()
// Potions // Potions
.add("weak health potion", 4) .add("weak health potion", 20)
.add("health potion", 1 + (map_depth / 2)) .add("health potion", 5)
// Scrolls // Scrolls
.add("fireball scroll", 1 + (map_depth / 3)) .add("fireball scroll", 1)
.add("cursed fireball scroll", 1) .add("cursed fireball scroll", 1)
.add("confusion scroll", 2) .add("confusion scroll", 2)
.add("magic missile scroll", 4) .add("magic missile scroll", 5)
.add("magic map scroll", 2) .add("magic map scroll", 2)
.add("cursed magic map scroll", 1); .add("cursed magic map scroll", 1);
} }