nil_core/world/infrastructure/building/
prefecture.rs1use crate::continent::Coord;
5use crate::error::{Error, Result};
6use crate::infrastructure::building::prefecture::build_queue::PrefectureBuildOrderRequest;
7use crate::world::World;
8use std::sync::Arc;
9
10impl World {
11 pub fn add_prefecture_build_order(&mut self, req: &PrefectureBuildOrderRequest) -> Result<()> {
12 let stats = Arc::clone(&self.stats.infrastructure);
13 let table = stats.building(req.building)?;
14
15 let player_id = self.city(req.coord)?.player();
16 let curr_res = if let Some(id) = &player_id {
17 Some(self.player(id)?.resources().clone())
18 } else {
19 None
20 };
21
22 let order = self
23 .city_mut(req.coord)?
24 .infrastructure_mut()
25 .add_prefecture_build_order(req, table, curr_res.as_ref())?
26 .clone();
27
28 if let Some(id) = player_id {
29 let kind = order.kind();
30 if kind.is_construction() {
31 let player = self.player_mut(&id)?;
32 let resources = player.resources_mut();
33 *resources = resources
34 .checked_sub(order.resources())
35 .ok_or(Error::InsufficientResources)?;
36
37 self.emit_player_updated(id);
38 }
39
40 self.emit_city_updated(req.coord);
41 }
42
43 Ok(())
44 }
45
46 pub fn cancel_prefecture_build_order(&mut self, coord: Coord) -> Result<()> {
47 let city = self.city_mut(coord)?;
48 if let Some(order) = city
49 .infrastructure_mut()
50 .cancel_prefecture_build_order()
51 && let Some(id) = city.player()
52 {
53 let kind = order.kind();
54 if kind.is_construction() {
55 let player = self.player_mut(&id)?;
56 let resources = player.resources_mut();
57 *resources += order.resources();
58
59 self.emit_player_updated(id);
60 }
61
62 self.emit_city_updated(coord);
63 }
64
65 Ok(())
66 }
67}