Skip to main content

nil_core/world/
ranking.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use crate::error::{Error, Result};
5use crate::ranking::RankingEntry;
6use crate::ranking::score::Score;
7use crate::ruler::Ruler;
8use crate::world::World;
9
10impl World {
11  pub fn get_score<R>(&self, ruler: R) -> Result<Score>
12  where
13    R: Into<Ruler>,
14  {
15    let ruler: Ruler = ruler.into();
16    let stats = self.stats.infrastructure.as_ref();
17    let mut score = self.military.score_of(ruler.clone());
18    score += self
19      .continent
20      .cities_of(ruler)
21      .try_fold(Score::default(), |mut score, city| {
22        score += city.score(stats)?;
23        Ok::<_, Error>(score)
24      })?;
25
26    Ok(score)
27  }
28
29  pub(super) fn update_ranking(&mut self) -> Result<()> {
30    let len = self.ranking.len();
31    let mut entries = Vec::with_capacity(len);
32
33    for ruler in self.rulers() {
34      let ruler = Ruler::from(ruler);
35      let score = self.get_score(ruler.clone())?;
36      let cities = self.count_cities(ruler.clone());
37      let entry = RankingEntry::builder()
38        .ruler(ruler)
39        .score(score)
40        .cities(cities)
41        .build();
42
43      entries.push(entry);
44    }
45
46    self.ranking.update(entries);
47
48    Ok(())
49  }
50}