#save #ironman #ergonomically #multiplayer #binary #eu4 #country-tag

bin+lib eu4save

以人体工程学的方式处理所有 EU4 存档(铁人模式和多人模式)

34 个版本

0.8.2 2022年10月25日
0.7.1 2022年7月8日
0.6.1 2022年3月20日
0.5.3 2021年7月4日
0.3.3 2020年11月10日

#894 in 游戏开发

Download history 143/week @ 2024-03-30 35/week @ 2024-04-06

73 每月下载量

MIT 许可证

190KB
5K SLoC

ci Version

EU4 Save

EU4 Save 是一个库,用于以人体工程学的方式处理 EU4 存档(铁人模式 + 多人模式)。

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, CountryTag::from("ENG"));

Eu4Extractor 将将明文(用于模组、多人模式、非铁人模式存档)和二进制(铁人模式)编码的存档反序列化为相同的结构。

查询

即使解码后,数据可能仍然过于底层。例如,一个国家可以有收入账本,看起来像这样

income = { 1.000 0 2.000 0.000 1.500 }

虽然结构成功解码为向量,但每个索引的含义的上下文缺失。哪个值代表贸易收入?

为了帮助解决这类问题,创建了 Query API

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(&CountryTag::from("ENG"))
    .map(|country| save_query.country_income_breakdown(country))
    .map(|income| income.trade);
assert_eq!(Some(17.982), trade);

铁人模式

默认情况下,铁人模式存档将无法正确解码。

要启用支持,必须提供一个环境变量(EU4_IRONMAN_TOKENS),该变量指向一个包含令牌描述的换行符分隔的文本文件。例如

0xffff my_test_token
0xeeee my_test_token2

PDS 已宣布,为了遵守 EU4 的使用条款,令牌列表不得共享。我也被限制不得透露如何推导令牌列表。

您可以参考其他 EU4 铁人模式项目,如 ironmelt 或 paperman,以获取灵感。

依赖关系

~1.9–2.8MB
~62K SLoC