nil_core/world/infrastructure/building/
prefecture.rs1use crate::continent::coord::Coord;
5use crate::error::{Error, Result};
6use crate::infrastructure::building::r#impl::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 ruler = self.city(req.coord)?.owner().clone();
16 let available_resources = self.ruler(&ruler)?.resources();
17
18 let order = self
19 .city_mut(req.coord)?
20 .infrastructure_mut()
21 .add_prefecture_build_order(req, table, available_resources)?
22 .clone();
23
24 let kind = order.kind();
25 if kind.is_construction() {
26 let mut ruler_ref = self.ruler_mut(&ruler)?;
27 let resources = ruler_ref.resources_mut();
28 *resources = resources
29 .checked_sub(order.resources())
30 .ok_or(Error::InsufficientResources)?;
31
32 self.emit_ruler(&ruler)?;
33 self.emit_city(req.coord)?;
34 }
35
36 Ok(())
37 }
38
39 pub fn cancel_prefecture_build_order(&mut self, coord: Coord) -> Result<()> {
40 let city = self.city_mut(coord)?;
41 let order = city
42 .infrastructure_mut()
43 .cancel_prefecture_build_order();
44
45 if let Some(order) = order {
46 let kind = order.kind();
47 if kind.is_construction() {
48 let ruler = city.owner().clone();
49 let mut ruler_ref = self.ruler_mut(&ruler)?;
50 let resources = ruler_ref.resources_mut();
51 *resources += order.resources();
52
53 self.emit_ruler(&ruler)?;
54 }
55
56 self.emit_city(coord)?;
57 }
58
59 Ok(())
60 }
61}