Crate eu4save[−][src]
EU4 Save is a library to ergonomically work with EU4 saves (ironman + mp).
use eu4save::{Eu4Extractor, Encoding, CountryTag}; use std::io::Cursor; let data = std::fs::read("assets/saves/eng.txt.compressed.eu4")?; let (save, encoding) = Eu4Extractor::extract_save(Cursor::new(&data[..]))?; assert_eq!(encoding, Encoding::TextZip); assert_eq!(save.meta.player, "ENG".parse()?);
Eu4Extractor
will deserialize both plaintext (used for mods, multiplayer,
non-ironman saves) and binary (ironman) encoded saves into the same structure.
Querying
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}; use std::io::Cursor; let data = std::fs::read("assets/saves/eng.txt.compressed.eu4")?; let (save, _encoding) = Eu4Extractor::extract_save(Cursor::new(&data[..]))?; let save_query = Query::from_save(save); let trade = save_query.save().game.countries.get(&"ENG".parse()?) .map(|country| save_query.country_income_breakdown(country)) .map(|income| income.trade); assert_eq!(Some(17.982), trade);
Ironman
By default, ironman saves will not be decoded properly.
To enable support, one must supply an environment variable
(EU4_IRONMAN_TOKENS
) that points to a newline delimited
text file of token descriptions. For instance:
0xffff my_test_token 0xeeee my_test_token2
PDS has declared that in order to comply with EU4’s terms of use, the list of tokens must not be shared. I am also restricted from divulging how the list of tokens can be derived.
You may look to other projects EU4 ironman projects like ironmelt or paperman for inspiration.
Modules
models | Repository of raw structs extracted from a save file |
query | Ergonomic module for querying info from a save file |
Structs
CountryTag | Wrapper around a Country’s unique three byte tag |
Eu4Error | An EU4 Error |
Eu4Extractor | Logic container for extracting data from an EU4 save |
Eu4ExtractorBuilder | Customize how a save is extracted |
ProvinceId | An province numerical identifier |
TagResolver | The tag resolver is important to answering questions like “where are they now?” when looking at historic events like province changes or wars. When countries tag switch the tag resolver is able to connect historic events to country’s current selves. For instance in a TYR -> IRE -> GBR game, the provinces and wars gained while playing as TYR should still be aggregated under the current GBR tag. |
Enums
Encoding | Describes the format of the save before decoding |
Eu4ErrorKind | Specific type of error |
Extraction | The memory allocation strategy for handling zip files |
FailedResolveStrategy | Customize how the deserializer reacts when a token can’t be resolved |
Functions
dlc_id | Map dlc name to its id |
eu4_start_date | EU4’s start date |
is_tagc | |
melt | Convert ironman data to plaintext |
Type Definitions
Eu4Date | Struct specialized to parsing, formatting, and manipulating dates in EU4 |