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            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}