nil_core/world/player/
mod.rs1#[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 has_any_active_player(&self) -> bool {
36 self
37 .player_manager
38 .players()
39 .any(Player::is_active)
40 }
41
42 pub fn set_player_status(&mut self, id: &PlayerId, status: PlayerStatus) -> Result<()> {
43 *self
44 .player_manager
45 .player_mut(id)?
46 .status_mut() = status;
47
48 self.emit_player_updated(id.clone());
49
50 Ok(())
51 }
52
53 pub fn spawn_player(&mut self, mut player: Player) -> Result<()> {
54 let id = player.id();
55 if self.has_player(&id) {
56 Err(Error::PlayerAlreadySpawned(id))
57 } else {
58 let (coord, field) = self.find_spawn_point()?;
59 *field = City::builder(coord)
60 .name(&*id)
61 .owner(&id)
62 .build()
63 .into();
64
65 *player.status_mut() = PlayerStatus::Active;
66 self.player_manager.manage(player);
67
68 self.emit_public_city_updated(coord);
69
70 Ok(())
71 }
72 }
73}