eu4save/de/
gameplay_settings.rs1use 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}