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.origin;
21
22 let good_or_evil = match &world_site.kind {
24 Some(
26 SiteKind::Refactor
27 | SiteKind::CliffTown
28 | SiteKind::DesertCity
29 | SiteKind::SavannahTown
30 | SiteKind::CoastalTown
31 | SiteKind::Citadel,
32 ) => Some(true),
33 Some(
35 SiteKind::Myrmidon
36 | SiteKind::ChapelSite
37 | SiteKind::Terracotta
38 | SiteKind::Gnarling
39 | SiteKind::Cultist
40 | SiteKind::Sahagin
41 | SiteKind::PirateHideout
42 | SiteKind::JungleRuin
43 | SiteKind::RockCircle
44 | SiteKind::TrollCave
45 | SiteKind::Camp
46 | SiteKind::Haniwa
47 | SiteKind::Adlet
48 | SiteKind::VampireCastle
49 | SiteKind::DwarvenMine,
50 ) => Some(false),
51 Some(SiteKind::GiantTree | SiteKind::GliderCourse | SiteKind::Bridge(..)) | None => {
53 None
54 },
55 };
56
57 Self {
58 seed: rng.gen(),
59 wpos,
60 world_site: Some(world_site_id),
61 faction: good_or_evil.and_then(|good_or_evil| {
62 nearby_factions
63 .iter()
64 .filter(|(_, faction)| {
65 factions
66 .get(*faction)
67 .is_some_and(|f| f.good_or_evil == good_or_evil)
68 })
69 .min_by_key(|(faction_wpos, _)| {
70 faction_wpos
71 .as_::<i64>()
72 .distance_squared(wpos.as_::<i64>())
73 })
74 .map(|(_, faction)| *faction)
75 }),
76 count_loaded_chunks: 0,
77 population: Default::default(),
78 known_reports: Default::default(),
79 nearby_sites_by_size: Vec::new(),
80 }
81 }
82}