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.get_origin();
21
22        // TODO: This is stupid, do better
23        let good_or_evil = match &world_site.kind {
24            // Good
25            SiteKind::Refactor(_)
26            | SiteKind::CliffTown(_)
27            | SiteKind::DesertCity(_)
28            | SiteKind::SavannahTown(_)
29            | SiteKind::CoastalTown(_) => Some(true),
30            // Evil
31            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            // Neutral
47            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}