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::score::Score;
6use crate::ranking::{Ranking, RankingEntry};
7use crate::ruler::Ruler;
8use crate::world::World;
9
10impl World {
11  #[inline]
12  pub fn ranking(&self) -> &Ranking {
13    &self.ranking
14  }
15
16  pub fn get_score<R>(&self, ruler: R) -> Result<Score>
17  where
18    R: Into<Ruler>,
19  {
20    let ruler: Ruler = ruler.into();
21    let stats = self.stats.infrastructure.as_ref();
22    let mut score = self.military.score_of(ruler.clone());
23    score += self
24      .continent
25      .cities_of(ruler)
26      .try_fold(Score::default(), |mut score, city| {
27        score += city.score(stats)?;
28        Ok::<_, Error>(score)
29      })?;
30
31    Ok(score)
32  }
33
34  pub(super) fn update_ranking(&mut self) -> Result<()> {
35    let len = self.ranking.len();
36    let mut entries = Vec::with_capacity(len);
37
38    for ruler in self.rulers() {
39      let ruler = Ruler::from(ruler);
40      let score = self.get_score(ruler.clone())?;
41      let cities = self.count_cities(ruler.clone());
42      let entry = RankingEntry::builder()
43        .ruler(ruler)
44        .score(score)
45        .cities(cities)
46        .build();
47
48      entries.push(entry);
49    }
50
51    self.ranking.update(entries);
52
53    Ok(())
54  }
55}