Skip to main content

nil_core/world/
continent.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use 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}