mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Move spawn_manifest to Index
This commit is contained in:
parent
23a020f602
commit
80f61e34a5
@ -1,4 +1,5 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
|
layer::wildlife::{self, DensityFn, SpawnEntry},
|
||||||
site::{economy::TradeInformation, Site},
|
site::{economy::TradeInformation, Site},
|
||||||
Colors,
|
Colors,
|
||||||
};
|
};
|
||||||
@ -19,6 +20,7 @@ pub struct Index {
|
|||||||
pub noise: Noise,
|
pub noise: Noise,
|
||||||
pub sites: Store<Site>,
|
pub sites: Store<Site>,
|
||||||
pub trade: TradeInformation,
|
pub trade: TradeInformation,
|
||||||
|
pub wildlife_spawn_handles: Vec<(AssetHandle<SpawnEntry>, DensityFn)>,
|
||||||
colors: AssetHandle<Arc<Colors>>,
|
colors: AssetHandle<Arc<Colors>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,6 +60,10 @@ impl Index {
|
|||||||
/// NOTE: Panics if the color manifest cannot be loaded.
|
/// NOTE: Panics if the color manifest cannot be loaded.
|
||||||
pub fn new(seed: u32) -> Self {
|
pub fn new(seed: u32) -> Self {
|
||||||
let colors = Arc::<Colors>::load_expect(WORLD_COLORS_MANIFEST);
|
let colors = Arc::<Colors>::load_expect(WORLD_COLORS_MANIFEST);
|
||||||
|
let wildlife_spawn_handles = wildlife::spawn_manifest()
|
||||||
|
.into_iter()
|
||||||
|
.map(|(e, f)| (SpawnEntry::load_expect(e), f))
|
||||||
|
.collect();
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
seed,
|
seed,
|
||||||
@ -65,6 +71,7 @@ impl Index {
|
|||||||
noise: Noise::new(seed),
|
noise: Noise::new(seed),
|
||||||
sites: Store::default(),
|
sites: Store::default(),
|
||||||
trade: Default::default(),
|
trade: Default::default(),
|
||||||
|
wildlife_spawn_handles,
|
||||||
colors,
|
colors,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,15 +36,18 @@ impl assets::Asset for SpawnEntry {
|
|||||||
impl SpawnEntry {
|
impl SpawnEntry {
|
||||||
pub fn from(asset_specifier: &str) -> Self { Self::load_expect(asset_specifier).read().clone() }
|
pub fn from(asset_specifier: &str) -> Self { Self::load_expect(asset_specifier).read().clone() }
|
||||||
|
|
||||||
pub fn request(&self, requested_period: DayPeriod, underwater: bool) -> Option<&Pack> {
|
pub fn request(&self, requested_period: DayPeriod, underwater: bool) -> Option<Pack> {
|
||||||
self.rules.iter().find(|pack| {
|
self.rules
|
||||||
let time_match = pack
|
.iter()
|
||||||
.day_period
|
.find(|pack| {
|
||||||
.iter()
|
let time_match = pack
|
||||||
.any(|period| *period == requested_period);
|
.day_period
|
||||||
let water_match = pack.is_underwater == underwater;
|
.iter()
|
||||||
time_match && water_match
|
.any(|period| *period == requested_period);
|
||||||
})
|
let water_match = pack.is_underwater == underwater;
|
||||||
|
time_match && water_match
|
||||||
|
})
|
||||||
|
.cloned()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,9 +72,9 @@ impl Pack {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type DensityFn = fn(&SimChunk, &ColumnSample) -> f32;
|
pub type DensityFn = fn(&SimChunk, &ColumnSample) -> f32;
|
||||||
|
|
||||||
pub fn wildlife_spawn_manifest() -> Vec<(&'static str, DensityFn)> {
|
pub fn spawn_manifest() -> Vec<(&'static str, DensityFn)> {
|
||||||
// NOTE: Order matters.
|
// NOTE: Order matters.
|
||||||
// Place entries with more strict requirements before more general ones
|
// Place entries with more strict requirements before more general ones
|
||||||
vec![
|
vec![
|
||||||
@ -218,14 +221,6 @@ pub fn wildlife_spawn_manifest() -> Vec<(&'static str, DensityFn)> {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn wildlife_spawn_entries() -> Vec<(SpawnEntry, DensityFn)> {
|
|
||||||
let manifest = wildlife_spawn_manifest();
|
|
||||||
manifest
|
|
||||||
.into_iter()
|
|
||||||
.map(|(e, f)| (SpawnEntry::from(e), f))
|
|
||||||
.collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(clippy::eval_order_dependence)]
|
#[allow(clippy::eval_order_dependence)]
|
||||||
pub fn apply_wildlife_supplement<'a, R: Rng>(
|
pub fn apply_wildlife_supplement<'a, R: Rng>(
|
||||||
// NOTE: Used only for dynamic elements like chests and entities!
|
// NOTE: Used only for dynamic elements like chests and entities!
|
||||||
@ -233,12 +228,12 @@ pub fn apply_wildlife_supplement<'a, R: Rng>(
|
|||||||
wpos2d: Vec2<i32>,
|
wpos2d: Vec2<i32>,
|
||||||
mut get_column: impl FnMut(Vec2<i32>) -> Option<&'a ColumnSample<'a>>,
|
mut get_column: impl FnMut(Vec2<i32>) -> Option<&'a ColumnSample<'a>>,
|
||||||
vol: &(impl BaseVol<Vox = Block> + RectSizedVol + ReadVol + WriteVol),
|
vol: &(impl BaseVol<Vox = Block> + RectSizedVol + ReadVol + WriteVol),
|
||||||
_index: IndexRef,
|
index: IndexRef,
|
||||||
chunk: &SimChunk,
|
chunk: &SimChunk,
|
||||||
supplement: &mut ChunkSupplement,
|
supplement: &mut ChunkSupplement,
|
||||||
time: Option<TimeOfDay>,
|
time: Option<TimeOfDay>,
|
||||||
) {
|
) {
|
||||||
let scatter = wildlife_spawn_entries();
|
let scatter = &index.wildlife_spawn_handles;
|
||||||
|
|
||||||
for y in 0..vol.size_xy().y as i32 {
|
for y in 0..vol.size_xy().y as i32 {
|
||||||
for x in 0..vol.size_xy().x as i32 {
|
for x in 0..vol.size_xy().x as i32 {
|
||||||
@ -269,6 +264,7 @@ pub fn apply_wildlife_supplement<'a, R: Rng>(
|
|||||||
(density > 0.0)
|
(density > 0.0)
|
||||||
.then(|| {
|
.then(|| {
|
||||||
entry
|
entry
|
||||||
|
.read()
|
||||||
.request(current_day_period, underwater)
|
.request(current_day_period, underwater)
|
||||||
.and_then(|pack| {
|
.and_then(|pack| {
|
||||||
(dynamic_rng.gen::<f32>() < density * col_sample.spawn_rate
|
(dynamic_rng.gen::<f32>() < density * col_sample.spawn_rate
|
||||||
@ -325,7 +321,7 @@ mod tests {
|
|||||||
// Checks that each entry in spawn manifest is loadable
|
// Checks that each entry in spawn manifest is loadable
|
||||||
#[test]
|
#[test]
|
||||||
fn test_load_entries() {
|
fn test_load_entries() {
|
||||||
let scatter = wildlife_spawn_manifest();
|
let scatter = spawn_manifest();
|
||||||
for (entry, _) in scatter.into_iter() {
|
for (entry, _) in scatter.into_iter() {
|
||||||
std::mem::drop(SpawnEntry::from(entry));
|
std::mem::drop(SpawnEntry::from(entry));
|
||||||
}
|
}
|
||||||
@ -334,7 +330,7 @@ mod tests {
|
|||||||
// Check that each spawn entry has unique name
|
// Check that each spawn entry has unique name
|
||||||
#[test]
|
#[test]
|
||||||
fn test_name_uniqueness() {
|
fn test_name_uniqueness() {
|
||||||
let scatter = wildlife_spawn_manifest();
|
let scatter = spawn_manifest();
|
||||||
let mut names = HashMap::new();
|
let mut names = HashMap::new();
|
||||||
for (entry, _) in scatter.into_iter() {
|
for (entry, _) in scatter.into_iter() {
|
||||||
let SpawnEntry { name, .. } = SpawnEntry::from(entry);
|
let SpawnEntry { name, .. } = SpawnEntry::from(entry);
|
||||||
@ -348,7 +344,7 @@ mod tests {
|
|||||||
// Quite strict rule, but otherwise may produce unexpected behaviour
|
// Quite strict rule, but otherwise may produce unexpected behaviour
|
||||||
#[test]
|
#[test]
|
||||||
fn test_check_day_periods() {
|
fn test_check_day_periods() {
|
||||||
let scatter = wildlife_spawn_manifest();
|
let scatter = spawn_manifest();
|
||||||
for (entry, _) in scatter.into_iter() {
|
for (entry, _) in scatter.into_iter() {
|
||||||
let mut day_periods = HashSet::with_capacity(4);
|
let mut day_periods = HashSet::with_capacity(4);
|
||||||
let SpawnEntry { rules, .. } = SpawnEntry::from(entry);
|
let SpawnEntry { rules, .. } = SpawnEntry::from(entry);
|
||||||
@ -382,7 +378,7 @@ mod tests {
|
|||||||
// Checks that each entity is loadable
|
// Checks that each entity is loadable
|
||||||
#[test]
|
#[test]
|
||||||
fn test_load_entities() {
|
fn test_load_entities() {
|
||||||
let scatter = wildlife_spawn_manifest();
|
let scatter = spawn_manifest();
|
||||||
for (entry, _) in scatter.into_iter() {
|
for (entry, _) in scatter.into_iter() {
|
||||||
let SpawnEntry { rules, .. } = SpawnEntry::from(entry);
|
let SpawnEntry { rules, .. } = SpawnEntry::from(entry);
|
||||||
for pack in rules {
|
for pack in rules {
|
||||||
@ -401,7 +397,7 @@ mod tests {
|
|||||||
// Checks that group distribution has valid form
|
// Checks that group distribution has valid form
|
||||||
#[test]
|
#[test]
|
||||||
fn test_group_choose() {
|
fn test_group_choose() {
|
||||||
let scatter = wildlife_spawn_manifest();
|
let scatter = spawn_manifest();
|
||||||
for (entry, _) in scatter.into_iter() {
|
for (entry, _) in scatter.into_iter() {
|
||||||
let SpawnEntry { rules, .. } = SpawnEntry::from(entry);
|
let SpawnEntry { rules, .. } = SpawnEntry::from(entry);
|
||||||
for pack in rules {
|
for pack in rules {
|
||||||
|
Loading…
Reference in New Issue
Block a user