veloren/rtsim/src/gen/site.rs
2023-05-13 09:30:51 -04:00

63 lines
1.9 KiB
Rust

use crate::data::{FactionId, Factions, Site};
use common::store::Id;
use rand::prelude::*;
use vek::*;
use world::{
site::{Site as WorldSite, SiteKind},
IndexRef, World,
};
impl Site {
pub fn generate(
world_site_id: Id<WorldSite>,
_world: &World,
index: IndexRef,
nearby_factions: &[(Vec2<i32>, FactionId)],
factions: &Factions,
rng: &mut impl Rng,
) -> Self {
let world_site = index.sites.get(world_site_id);
let wpos = world_site.get_origin();
// TODO: This is stupid, do better
let good_or_evil = match &world_site.kind {
// Good
SiteKind::Refactor(_)
| SiteKind::CliffTown(_)
| SiteKind::DesertCity(_)
| SiteKind::SavannahPit(_) => Some(true),
// Evil
SiteKind::Dungeon(_)
| SiteKind::ChapelSite(_)
| SiteKind::Gnarling(_)
| SiteKind::Adlet(_) => Some(false),
// Neutral
SiteKind::Settlement(_)
| SiteKind::Castle(_)
| SiteKind::Tree(_)
| SiteKind::GiantTree(_)
| SiteKind::Bridge(_) => None,
};
Self {
seed: rng.gen(),
wpos,
world_site: Some(world_site_id),
faction: good_or_evil.and_then(|good_or_evil| {
nearby_factions
.iter()
.filter(|(_, faction)| {
factions
.get(*faction)
.map_or(false, |f| f.good_or_evil == good_or_evil)
})
.min_by_key(|(faction_wpos, _)| faction_wpos.distance_squared(wpos))
.map(|(_, faction)| *faction)
}),
population: Default::default(),
known_reports: Default::default(),
nearby_sites_by_size: Vec::new(),
}
}
}