veloren_rtsim/gen/
site.rs

1use 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        // TODO: This is stupid, do better
23        let good_or_evil = match &world_site.kind {
24            // Good
25            Some(
26                SiteKind::Refactor
27                | SiteKind::CliffTown
28                | SiteKind::DesertCity
29                | SiteKind::SavannahTown
30                | SiteKind::CoastalTown
31                | SiteKind::Citadel,
32            ) => Some(true),
33            // Evil
34            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            // Neutral
52            Some(SiteKind::GiantTree | SiteKind::GliderCourse | SiteKind::Bridge(..)) | None => {
53                None
54            },
55        };
56
57        Self {
58            // This is assigned later
59            uid: 0,
60            seed: rng.gen(),
61            wpos,
62            world_site: Some(world_site_id),
63            faction: good_or_evil.and_then(|good_or_evil| {
64                nearby_factions
65                    .iter()
66                    .filter(|(_, faction)| {
67                        factions
68                            .get(*faction)
69                            .is_some_and(|f| f.good_or_evil == good_or_evil)
70                    })
71                    .min_by_key(|(faction_wpos, _)| {
72                        faction_wpos
73                            .as_::<i64>()
74                            .distance_squared(wpos.as_::<i64>())
75                    })
76                    .map(|(_, faction)| *faction)
77            }),
78            count_loaded_chunks: 0,
79            population: Default::default(),
80            known_reports: Default::default(),
81            nearby_sites_by_size: Vec::new(),
82        }
83    }
84}