EU4 Save is a library to ergonomically work with EU4 saves (ironman + mp).
use eu4save::{Eu4File, Encoding, CountryTag, EnvTokens};
let data = std::fs::read("assets/saves/eng.txt.compressed.eu4")?;
let file = Eu4File::from_slice(&data)?;
let save = file.parse_save(&EnvTokens)?;
assert_eq!(file.encoding(), Encoding::TextZip);
assert_eq!(save.meta.player, "ENG".parse()?);
Even once decoded, the data might be too low level. For example a country can have an income ledger that looks like:
income = { 1.000 0 2.000 0.000 1.500 }
While the structure will decoded successfully into a vector, the context of what each index means is missing. What value represents the income from trade?
To help solve questions like these, the Query
API was created
use eu4save::{Eu4Extractor, Encoding, CountryTag, query::Query};
let data = std::fs::read("assets/saves/eng.txt.compressed.eu4")?;
let file = Eu4File::from_slice(&data)?;
let save = file.parse_save(&EnvTokens)?;
let save_query = Query::from_save(save);
let trade = save_query.country(&"ENG".parse()?)
.map(|country| save_query.country_income_breakdown(country))
.map(|income| income.trade);
assert_eq!(Some(17.982), trade);
Ironman saves are supported, but not by default, as the token resolver can't be distributed, per PDS counsel.
You may look to other projects EU4 ironman projects like ironmelt or paperman for inspiration.