参考项目
rust2genshin 不是凭空写出来的 —— 节点 ID、proto 字段、.gia 的字节格式都需要一个外部依据。这个依据是另一个非官方项目:rust2genshin 一样非官方,与米哈游 / HoYoverse 无任何关联。遇到问题去哪查
| 要查 | 去 |
| 节点 ID / 引脚 / 分类 | utils/node_data/data.json(约 3.8 MB,含描述、枚举、类型系统)或 game_nodes.ts |
| proto 字段含义 | utils/protobuf/gia.proto(每字段有用途说明,标了保留区)—— 改 core/proto/asset.proto 前先查它 |
.gia 头部格式 | utils/protobuf/decode.ts 的 unwrap_gia / wrap_gia —— 本站调试页那个 20 字节头 + 4 字节尾就是照它实现的 |
| 类型引擎的设计参考 | utils/node_data/node_type.ts |
| 节点导出/导入规则 | docs/utils/原神导入 GIA 文件的规则说明.md |
tools/node_data/nodes.json 是从 game_nodes.ts 解析出来的(tools/node_data/parse_nodes.py),core/src/node/*.rs 里 /// ...(ID N) 的注释和 NodeKind 的 id 参数靠它对齐。注意 nodes.json 只有结构,没有 InGameName / Description —— 要查节点语义、审命名、定类型边界,必须去 data.json。它的三层栈
DSL (.ts 风格文本) → IR (src/types/IR*.ts) → GIA 二进制 (utils/protobuf/gia.proto)
↑ tokenizer/parser ↑ gia_ir.ts ↑ decode.ts
↓ decompiler.ts和本项目的关键差异
- 没有 DSL 层 ——
rust2genshin直接吃 rustc MIR,跳过文本解析 - 没有显式 IR 阶段 ——
NodeGraph/Node/NodeKind直接对应.gia的 wire 结构,不是 AST - 类型系统不对等 —— 参考项目有完整的运行时类型引擎(
ConstraintType/StructType/reflects);本项目用轻量的NativeValuetrait +NativeKind枚举 - 节点元数据的组织方式不同 —— 参考项目用
data.json集中管理并自动生成game_nodes.ts;本项目在core/src/node/<域>.rs里手写构造函数,ID 靠注释对齐 - proto 字段一致但注释详略不同 —— 参考项目的
gia.proto是权威 schema - 复合节点的存法可能不同 —— 参考项目说明游戏端把复合节点内嵌在
NodeGraphData.Embedded(字段 7),本项目把CompositeNodeGraph拆成独立 asset