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;
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}