veloren/world/src/sim/location.rs

69 lines
2.4 KiB
Rust
Raw Normal View History

use core::hash::BuildHasherDefault;
use fxhash::FxHasher64;
use hashbrown::HashSet;
use rand::{seq::SliceRandom, Rng};
2019-06-18 21:22:31 +00:00
use vek::*;
2019-06-11 18:39:25 +00:00
#[derive(Clone, Debug)]
pub struct Location {
2019-06-25 15:59:09 +00:00
pub(crate) name: String,
pub(crate) center: Vec2<i32>,
pub(crate) kingdom: Option<Kingdom>,
// We use this hasher (FxHasher64) because
// (1) we don't care about DDOS attacks (ruling out SipHash);
// (2) we care about determinism across computers (ruling out AAHash);
// (3) we have 8-byte keys (for which FxHash is fastest).
pub(crate) neighbours: HashSet<u64, BuildHasherDefault<FxHasher64>>,
2019-06-18 21:22:31 +00:00
}
impl Location {
2019-06-25 15:59:09 +00:00
pub fn generate(center: Vec2<i32>, rng: &mut impl Rng) -> Self {
2019-06-18 21:22:31 +00:00
Self {
name: generate_name(rng),
center,
kingdom: None,
neighbours: HashSet::default(),
2019-06-18 21:22:31 +00:00
}
}
pub fn name(&self) -> &str { &self.name }
2019-06-18 21:22:31 +00:00
pub fn kingdom(&self) -> Option<&Kingdom> { self.kingdom.as_ref() }
2019-06-11 18:39:25 +00:00
}
#[derive(Clone, Debug)]
pub struct Kingdom {
#[allow(dead_code)]
2019-06-19 09:38:20 +00:00
region_name: String,
2019-06-11 18:39:25 +00:00
}
2019-07-29 13:42:26 +00:00
fn generate_name(rng: &mut impl Rng) -> String {
let firstsyl = [
"Eri", "Val", "Gla", "Wilde", "Cold", "Deep", "Dura", "Ester", "Fay", "Dark", "West",
2019-06-22 14:30:53 +00:00
"East", "North", "South", "Ray", "Eri", "Dal", "Som", "Sommer", "Black", "Iron", "Grey",
"Hel", "Gal", "Mor", "Lo", "Nil", "Bel", "Lor", "Gold", "Red", "Marble", "Mana", "Gar",
"Mountain", "Red", "Cheo", "Far", "High",
2019-06-11 18:39:25 +00:00
];
2019-06-22 14:30:53 +00:00
let mid = ["ka", "se", "au", "da", "di"];
2019-06-11 18:39:25 +00:00
let tails = [
/* "mill", */ "ben", "sel", "dori", "theas", "dar", "bur", "to", "vis", "ten",
"stone", "tiva", "id", "and", "or", "el", "ond", "ia", "eld", "ald", "aft", "ift", "ity",
"well", "oll", "ill", "all", "wyn", "light", " Hill", "lin", "mont", "mor", "cliff", "rok",
"den", "mi", "rock", "glenn", "rovi", "lea", "gate", "view", "ley", "wood", "ovia",
"cliff", "marsh", "kor", "ice", /* "river", */ "acre", "venn", "crest", "field",
"vale", "spring", " Vale", "grasp", "fel", "fall", "grove", "wyn", "edge",
2019-06-11 18:39:25 +00:00
];
let mut name = String::new();
if rng.gen() {
2019-07-29 13:42:26 +00:00
name += firstsyl.choose(rng).unwrap();
name += mid.choose(rng).unwrap();
name += tails.choose(rng).unwrap();
2019-06-19 09:38:20 +00:00
name
} else {
2019-07-29 13:42:26 +00:00
name += firstsyl.choose(rng).unwrap();
name += tails.choose(rng).unwrap();
2019-06-19 09:38:20 +00:00
name
}
2019-06-11 18:39:25 +00:00
}