eu4save/de/
gameplay_settings.rs

1use crate::models::{GameDifficulty, GameplayOptions, TaxManpowerModifier};
2use serde::{de, Deserialize, Deserializer};
3use std::fmt;
4
5impl<'de> Deserialize<'de> for GameplayOptions {
6    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
7    where
8        D: Deserializer<'de>,
9    {
10        struct GameplayOptionsVisitor;
11
12        impl<'de> de::Visitor<'de> for GameplayOptionsVisitor {
13            type Value = GameplayOptions;
14
15            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
16                formatter.write_str("struct GameplayOptions")
17            }
18
19            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
20            where
21                A: de::SeqAccess<'de>,
22            {
23                let difficulty = seq.next_element::<i32>()?;
24                let difficulty =
25                    difficulty.ok_or_else(|| de::Error::custom("missing difficulty setting"))?;
26                let difficulty = match difficulty {
27                    -1 => GameDifficulty::VeryEasy,
28                    0 => GameDifficulty::Easy,
29                    1 => GameDifficulty::Normal,
30                    2 => GameDifficulty::Hard,
31                    3 => GameDifficulty::VeryHard,
32                    _ => return Err(de::Error::custom("unrecognized difficulty setting")),
33                };
34
35                let _handicap = seq.next_element::<i32>()?;
36                let _lucky_nations = seq.next_element::<i32>()?;
37                let _allow_players_to_hotjoin = seq.next_element::<i32>()?;
38                let _allow_players_to_play_same_country = seq.next_element::<i32>()?;
39                let _unknown1 = seq.next_element::<i32>()?;
40                let _unknown2 = seq.next_element::<i32>()?;
41                let _terra_incognita = seq.next_element::<i32>()?;
42                let _only_host_observer_save = seq.next_element::<i32>()?;
43                let _editable_savegame = seq.next_element::<i32>()?;
44                let _locked_ledger = seq.next_element::<i32>()?;
45                let _use_dynamic_province_names = seq.next_element::<i32>()?;
46                let _custom_nation_difficulty = seq.next_element::<i32>()?;
47                let _nations = seq.next_element::<i32>()?;
48
49                let tax_manpower_modifier = seq.next_element::<i32>()?;
50                let tax_manpower_modifier = tax_manpower_modifier
51                    .ok_or_else(|| de::Error::custom("missing difficulty setting"))?;
52                let tax_manpower_modifier = match tax_manpower_modifier {
53                    0 => TaxManpowerModifier::Historical,
54                    1 => TaxManpowerModifier::Random,
55                    2 => TaxManpowerModifier::Equal,
56                    _ => return Err(de::Error::custom("unrecognized difficulty setting")),
57                };
58
59                Ok(GameplayOptions {
60                    difficulty,
61                    tax_manpower_modifier,
62                })
63            }
64        }
65
66        deserializer.deserialize_seq(GameplayOptionsVisitor)
67    }
68}