veloren_rtsim/gen/
site.rs1use crate::data::{FactionId, Factions, Site};
2use common::store::Id;
3use rand::prelude::*;
4use vek::*;
5use world::{
6 IndexRef, World,
7 site::{Site as WorldSite, SiteKind},
8};
9
10impl Site {
11 pub fn generate(
12 world_site_id: Id<WorldSite>,
13 _world: &World,
14 index: IndexRef,
15 nearby_factions: &[(Vec2<i32>, FactionId)],
16 factions: &Factions,
17 rng: &mut impl Rng,
18 ) -> Self {
19 let world_site = index.sites.get(world_site_id);
20 let wpos = world_site.get_origin();
21
22 let good_or_evil = match &world_site.kind {
24 SiteKind::Refactor(_)
26 | SiteKind::CliffTown(_)
27 | SiteKind::DesertCity(_)
28 | SiteKind::SavannahTown(_)
29 | SiteKind::CoastalTown(_) => Some(true),
30 SiteKind::Myrmidon(_)
32 | SiteKind::ChapelSite(_)
33 | SiteKind::Terracotta(_)
34 | SiteKind::Gnarling(_)
35 | SiteKind::Cultist(_)
36 | SiteKind::Sahagin(_)
37 | SiteKind::PirateHideout(_)
38 | SiteKind::JungleRuin(_)
39 | SiteKind::RockCircle(_)
40 | SiteKind::TrollCave(_)
41 | SiteKind::Camp(_)
42 | SiteKind::Haniwa(_)
43 | SiteKind::Adlet(_)
44 | SiteKind::VampireCastle(_)
45 | SiteKind::DwarvenMine(_) => Some(false),
46 SiteKind::Settlement(_)
48 | SiteKind::Castle(_)
49 | SiteKind::Tree(_)
50 | SiteKind::GiantTree(_)
51 | SiteKind::GliderCourse(_)
52 | SiteKind::Bridge(_) => None,
53 };
54
55 Self {
56 seed: rng.gen(),
57 wpos,
58 world_site: Some(world_site_id),
59 faction: good_or_evil.and_then(|good_or_evil| {
60 nearby_factions
61 .iter()
62 .filter(|(_, faction)| {
63 factions
64 .get(*faction)
65 .is_some_and(|f| f.good_or_evil == good_or_evil)
66 })
67 .min_by_key(|(faction_wpos, _)| {
68 faction_wpos
69 .as_::<i64>()
70 .distance_squared(wpos.as_::<i64>())
71 })
72 .map(|(_, faction)| *faction)
73 }),
74 population: Default::default(),
75 known_reports: Default::default(),
76 nearby_sites_by_size: Vec::new(),
77 }
78 }
79}