nil_core/world/
continent.rs1use crate::continent::Continent;
5use crate::continent::coord::Coord;
6use crate::continent::field::Field;
7use crate::error::{Error, Result};
8use crate::world::World;
9use rand::seq::IteratorRandom;
10
11impl World {
12 #[inline]
13 pub fn continent(&self) -> &Continent {
14 &self.continent
15 }
16
17 pub(super) fn find_spawn_point(&mut self) -> Result<(Coord, &mut Field)> {
18 let size = self.continent.size();
19 let pm = &self.precursor_manager;
20 let coord = self
21 .continent
22 .enumerate_fields()
23 .filter(|(_, field)| field.is_empty())
24 .filter_map(|(idx, _)| idx.to_coord(size).ok())
25 .filter(|coord| !pm.is_within_territory(*coord, size))
26 .choose_stable(&mut rand::rng())
27 .ok_or(Error::WorldIsFull)?;
28
29 Ok((coord, self.continent.field_mut(coord)?))
30 }
31}