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::military::maneuver::ManeuverDirection;
11use crate::player::{Player, PlayerId, PlayerManager, PlayerStatus};
12use crate::report::ReportId;
13use crate::resources::maintenance::Maintenance;
14use crate::ruler::Ruler;
15use crate::world::World;
16
17impl World {
18 #[inline]
19 pub fn player_manager(&self) -> &PlayerManager {
20 &self.player_manager
21 }
22
23 #[inline]
24 pub fn player(&self, id: &PlayerId) -> Result<&Player> {
25 self.player_manager.player(id)
26 }
27
28 #[inline]
29 pub(crate) fn player_mut(&mut self, id: &PlayerId) -> Result<&mut Player> {
30 self.player_manager.player_mut(id)
31 }
32
33 pub fn players(&self) -> impl Iterator<Item = &Player> {
34 self.player_manager.players()
35 }
36
37 #[inline]
38 pub fn get_player_maintenance(&self, player: &PlayerId) -> Result<Maintenance> {
39 self.get_maintenance(player)
40 }
41
42 pub fn get_player_military(&self, player: &PlayerId) -> Result<Military> {
43 let ruler = Ruler::from(player);
44 let coords = self.continent.coords_of(player);
45 let mut military = self.military.intersection(coords)?;
46
47 military.retain_maneuvers(|maneuver| {
48 if let ManeuverDirection::Returning = maneuver.direction() {
50 self
51 .military
52 .army(maneuver.army())
53 .is_ok_and(|army| army.is_owned_by(&ruler))
54 } else {
55 true
56 }
57 });
58
59 Ok(military)
60 }
61
62 pub fn get_player_reports(&self, player: &PlayerId) -> Vec<ReportId> {
63 self
64 .report_manager
65 .reports_of(player)
66 .collect()
67 }
68
69 #[inline]
70 pub fn has_player(&self, id: &PlayerId) -> bool {
71 self.player_manager.has(id)
72 }
73
74 pub fn has_any_active_player(&self) -> bool {
75 self
76 .player_manager
77 .players()
78 .any(Player::is_active)
79 }
80
81 pub fn set_player_status(&mut self, id: &PlayerId, status: PlayerStatus) -> Result<()> {
82 *self
83 .player_manager
84 .player_mut(id)?
85 .status_mut() = status;
86
87 self.emit_player_updated(id.clone())?;
88
89 Ok(())
90 }
91
92 pub fn spawn_player(&mut self, mut player: Player) -> Result<()> {
93 let id = player.id();
94 if self.has_player(&id) {
95 Err(Error::PlayerAlreadySpawned(id))
96 } else {
97 let (coord, field) = self.find_spawn_point()?;
98 *field = City::builder(coord)
99 .name(&*id)
100 .owner(&id)
101 .build()
102 .into();
103
104 *player.status_mut() = PlayerStatus::Active;
105 self.player_manager.manage(player)?;
106
107 self.emit_public_city_updated(coord)?;
108
109 Ok(())
110 }
111 }
112}