[][src]Crate eu4save

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 extractor = Eu4Extractor::default();
let (save, encoding) = extractor.extract_save(Cursor::new(&data[..]))?;
assert_eq!(encoding, Encoding::TextZip);
assert_eq!(save.meta.player, CountryTag::from("ENG"));

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:

This example is not tested
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 extractor = Eu4Extractor::default();
let (save, _encoding) = extractor.extract_save(Cursor::new(&data[..]))?;
let save_query = Query::from_save(save);
let trade = save_query.save.game.countries.get(&CountryTag::from("ENG"))
    .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:

This example is not tested
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

dlc
query

Structs

Army
Battle
BattleSide
Country
CountryColors
CountryEvents
CountryHistory
CountryLedger
CountryTag
CountryTechnology
Estate
Eu4Date

A date in EU4. It has no concept of leap years!

Eu4Extractor
Eu4ExtractorBuilder
Eu4Save
Eu4SaveMeta
GameState
GameplayOptions
GameplaySettings
HRE
Hegemon
Leader
LedgerData
LedgerDatum
Loan
Meta
Monarch
Navy
ObjId
PreviousWar
Province
ProvinceId
Regiment
ReligionInstanceDatum
SavegameVersion
Ship
TokenLookup
WarEvents
WarGoal
WarHistory

Enums

CountryEvent
Encoding
Eu4Error
Extraction
FailedResolveStrategy

Customize how the deserializer reacts when a token can't be resolved

GameDifficulty
LeaderKind
TaxManpowerModifier
WarEvent

Constants

EU4_START_DATE

Functions

melt