nil_core/world/
ranking.rs1use 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}