Skip to main content

nil_core/world/player/
mod.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4#[cfg(test)]
5mod tests;
6
7use crate::city::City;
8use crate::error::{Error, Result};
9use crate::military::Military;
10use crate::player::{Player, PlayerId, PlayerStatus};
11use crate::report::ReportId;
12use crate::resources::maintenance::Maintenance;
13use crate::world::World;
14
15impl World {
16  #[inline]
17  pub fn get_player_maintenance(&self, player: &PlayerId) -> Result<Maintenance> {
18    self.get_maintenance(player)
19  }
20
21  pub fn get_player_military(&self, player: &PlayerId) -> Result<Military> {
22    let coords = self.continent.coords_of(player);
23    self.military.intersection(coords)
24  }
25
26  pub fn get_player_reports(&self, player: &PlayerId) -> Vec<ReportId> {
27    self.report.reports_of(player).collect()
28  }
29
30  #[inline]
31  pub fn has_player(&self, id: &PlayerId) -> bool {
32    self.player_manager.has(id)
33  }
34
35  pub fn set_player_status(&mut self, id: &PlayerId, status: PlayerStatus) -> Result<()> {
36    *self
37      .player_manager
38      .player_mut(id)?
39      .status_mut() = status;
40
41    self.emit_player_updated(id.clone());
42
43    Ok(())
44  }
45
46  pub fn spawn_player(&mut self, mut player: Player) -> Result<()> {
47    let id = player.id();
48    if self.has_player(&id) {
49      Err(Error::PlayerAlreadySpawned(id))
50    } else {
51      let (coord, field) = self.find_spawn_point()?;
52      *field = City::builder(coord)
53        .name(&*id)
54        .owner(&id)
55        .build()
56        .into();
57
58      *player.status_mut() = PlayerStatus::Active;
59      self.player_manager.manage(player);
60
61      self.emit_public_city_updated(coord);
62
63      Ok(())
64    }
65  }
66}