Skip to main content

nil_core/world/infrastructure/building/
prefecture.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use 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}