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