#parser #gamedev #ao-e2de

aoe2-probe

用于编辑AoE2 DE的aoe2scenario文件的Rust库

26个版本

0.3.2 2024年5月31日
0.3.1 2024年5月28日
0.3.0 2023年7月9日
0.2.20 2023年5月22日
0.1.1 2022年7月27日

#105 in 游戏开发

Download history 135/week @ 2024-05-24 161/week @ 2024-05-31 16/week @ 2024-06-07 8/week @ 2024-06-14 184/week @ 2024-07-26 25/week @ 2024-08-02

209 每月下载

GPL-3.0-or-later

175KB
4.5K SLoC

CircleCI Crates.io Crates.io GitHub License

什么是aoe2-probe?

这是一个用于编辑AoE2 DE的aoe2scenario文件的Rust库。

警告

  • 由于zlib实现的不同,导出的文件不能与导入的文件完全相同,而文件内容是恒定的(别担心,AoE2 DE仍然理解它)。备份原始文件总是推荐的。

设计目标

  • 完全访问aoe2scenario文件中每个字节的能力。
  • 以可靠的正确性检查编辑每个比特。 todo!()
  • 提供跨游戏版本一致的API兼容性。

入门指南

在目录 ./examples/ 下,您可以找到几个简单的示例。

导入和导出文件

use aoe2_probe::scenario::{Scenario, ExportFormat};

//Reading scenario content from the .aoe2scenario file
let scenario = Scenario::from_file("./resources/chapter_1.aoe2scenario").unwrap();

//saving content to a new .aoe2scenario file
scenario.to_file("./resources/temp.aoe2scenario", ExportFormat::AoE2Scenario);
//saving content to a new .json file
scenario.to_file("./resources/temp.json", ExportFormat::JSON);

更新属性

use aoe2_probe::scenario::Scenario;

//versio's structure definition can be found in the folder /src/prebuilt/ver1_46/versio.rs
let mut scenario = Scenario::from_file("./resources/chapter_1.aoe2scenario").unwrap();

let author = scenario.versio.get_by_path_mut("/file_header/creator_name");
//Update the creator name.
author.try_mut_str32().set_content("Arian");

自定义结构

//Define a score record
let mut root = PatchedMap::new();
root.push_back("score", Token::Int16(100));
root.push_back("name", Token::Str32(DynString::with_capacity(12, "anonymous")));

//serialize
root.to_le_vec();

//deserialize
root.from_le_vec();

序列化和反序列化到serde支持的所有格式

let scenario = Scenario::from_file("./resources/chapter_3.aoe2scenario").unwrap();
let json = serde_json::to_string( & scenario.versio).unwrap();
println!("{}", json);

使用以下命令运行示例

cargo run --example read_write

versio 的每个成员及其自身实现了 fmt::Debug 特性。如果您想了解更多,可以打印它们。

let scenario = Scenario::from_file("./resources/chapter_1.aoe2scenario").unwrap();
println!("{:?}", &scenario.versio())

更高级的示例可以在 misc-probe 中找到。详细信息可以在 文档 中找到。

支持

游戏版本 支持状态
ver.1.46 支持
ver.1.47 支持
ver.1.48 支持
ver.1.49 支持
ver.1.51 实验性
ver.1.53 实验性

目前,仅支持1.46版及更高版本。

使用的库

  • miniz_oxide:使用无安全代码的纯Rust miniz deflate/zlib 编码器/解码器的Rust替代品。
  • serde:Serde是一个用于高效和泛型序列化和反序列化Rust数据结构的框架。
  • serde_repr:此crate提供了一个derive宏,以将Serde的Serialize和Deserialize特性委派到底层repr的C-like枚举。
  • linked-hash-map:一个HashMap包装器,它按插入顺序持有键值对。
  • lazy-static:用于在Rust中声明延迟评估的静态的宏。
  • log:一个轻量级的日志门面。

致谢

本库受AoE2ScenarioParserTrigger Craft的启发。

依赖项

~1-2MB
~41K SLoC