原版 FEATURETAGS 关系矩阵与包来源核验

本批结果

真实标签关系表已接到配额认领核心:

  • 基础 PAK 索引及 FEATURETAGS.HIE 内容核对完成。
  • 原版 643FC0 构表函数直接生成参考矩阵。
  • 索引范围 153,实际分配行 131,空行 22。
  • 20,045 次原版查询与核心结果一致。
  • 额外链式样例确认不自动补传递关系。
  • 实际 TEMPLATE 请求通过同源名称表、矩阵和 NativeFeatureLedger 完成认领。

1322 条核心断言、182 项相关 Python 回归通过;Godot C# 构建零警告、零错误,coresimlint 通过。

唯一性、实例条件上下文、具体世界宿主和所有武器验收仍有剩余。

本轮取证中纠正的遗漏

最初仅抽取名为 CHILD 的字段,漏掉了四处 INTEGER CHILD1:4

  • CHEST GHOST,ID 30。
  • CHEST LOCKED,ID 22。
  • ChestMimics,ID 81。
  • CHESTS RARE,ID 5。

原 643FC0 会处理这些数值关系字段,不限于键名正好等于 CHILD。它们是文件明确声明的关系,不应丢掉。

本轮中途关于“这四条关系不属于原版”的判断已撤回。输入提取修正后重新运行了原版构表与查询,最终矩阵包含上述四条。

另用独立输入 1→2、2→3(未声明 1→3)运行原构表函数,结果 1→3 为 0。这才是“不自动补传递闭包”的独立证据;不能以遗漏字段造成的差异作为证明。

原版加载的两个来源

CGameData 构造位置 64B857–64B863 调用 CHierarchy 构造器:

text
media/featuretags.hie
MEDIA/FEATURETAGS/

644EC0 → 644E20 → 643FC0 不只读取 HIE,还会扫描第二个目录的 DAT 定义。

因此本批没有根据解包目录缺文件夹就推断无额外数据,而是读取基础 DATA.PAK.MAN:

  • manifest 版本 2。
  • 81,132 个文件计数,3,403 个目录计数。
  • 完整消费 5,309,883 字节。
  • 只有 MEDIA/FEATURETAGS.HIE 条目。
  • 没有 MEDIA/FEATURETAGS/ 下的额外条目。

manifest SHA256: 9a7a640b8502edf27381fda4bc4cdcb00d75b325b99ec1277fe407f74d098c43

按该条目从 DATA.PAK 读取并解压原数据,再用现有 Rust 反编译器恢复类型化内容,与现有 FEATURETAGS.HIE 的定义比较一致。

范围仅为当前基础 PAK;不据此声称任意挂载 MOD 都没有新增标签定义。

构表规则

当前 HIE-only 路径的原构表:

  • 用声明的 ID 建立稀疏行表。
  • 已分配行先置零。
  • 为该声明 ID 设置自身关系。
  • 写入原数值关系字段,包括 CHILD、CHILD1。
  • 不在此构表阶段递归计算传递闭包。

当前配置 UNIQUEIDS=153;最终原表的逻辑范围/容量均为 153,名称表有 131 项,最大 ID 为 152。

本次输入检查拒绝未覆盖的额外 HIE 字段,避免又把未读字段当作不存在。原 HIE 和 PAK 内定义均参与输入核验。

额外 DAT 目录为空的事实已经从包索引确认,原参考以空目录扫描边界执行该路径;不是默默忽略了未知目录内容。

查询语义:643DE0

NativeFeatureTagMatrix 保留:

  1. child 或 parent 以 unsigned 解释后超出行范围,返回 0。
  2. 两者均在范围内时,取 child 对应行的 parent 字节。
  3. 不做对称匹配,不补自关系,不追加递归祖先查询。
  4. 实际存在的空行不被转换成一整行零。

区别:

  • parent 指向未分配 ID 的列,仍可从有效 child 行中读取已存在的字节。
  • child 指向未分配的行时,原版会触及空指针。核心明确报缺输入,不虚构一个合法的全零行。
  • 越界检查先于行指针读取。因此 child 是空行但 parent 越界时,仍先返回 0。

本表作为不可变数据使用,构造时复制字节,不受调用者修改输入数组影响。

与名称及请求的接线

新增:

  • core_sim/NativeFeatureTagMatrix.cs。
  • core_sim.io/F2NativeFeatureMatrix.cs。
  • F2NativeFeatureDefinitions.CreateLedger。

CreateLedger 核对名称表和矩阵的 HIE 源 hash,并逐名称核对 ID 后,才组合真实请求、真实关系表和同步 Mwc。

验证读取实际 TEMPLATE,执行总量/配额初始化,再通过真实标签关系认领并记录请求。没有把标签“名称存在”当作层级关系匹配。

A3_ROTCRYPTGEM2:

  • 当前 HIE 名称表不存在此名。
  • 基础 PAK 的补充目录也没有定义。
  • 名称解析仍为 -1,关系查询按越界返回 0。

没有猜替代标签或修改原 TEMPLATE。若以后加入 MOD 的额外定义,必须重新构建/核验,不能继续复用当前冻结表。

原版参考与验证边界

原 EXE SHA256: 186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e

原参考执行 643FC0 构表与 643DE0 查询。类型化 DataGroup 读取、名称容器、空目录扫描及内存分配为明确边界;数值字段写入和查询逻辑使用发行机器码。

  • 131 个有效 child 行 × 153 个 parent 列 = 20,043 次。
  • 另有两个 -1 哨兵/越界查询。
  • 独立三节点链样例验证没有未声明的传递关系。

不声称原始文件系统、DAT 解析器、任意附加 DAT 目录或名称容器的全部行为都在这个辅助进程里复原。针对的是已核实的基础 HIE 输入与构表/查询核心。

产物:

  • tools/build_native_feature_hierarchy.py。
  • build/native_feature_hierarchy/inputs.json。
  • build/native_feature_hierarchy/FEATURETAGS.BINDAT。
  • build/native_feature_hierarchy/FEATURETAGS_FROM_PAK.DAT。
  • tools/build_native_feature_matrix_oracle.py/tools/native_feature_matrix_oracle.c。
  • build/native_feature_matrix_oracle/results.json。
  • build/f2/native_feature_matrix.json。
  • build/native_feature_matrix_core.log:1322 断言。
  • build/native_feature_matrix_python.log:182 检查。
  • build/native_feature_matrix_godot.log:零警告、零错误。

剩余工作

接下来继续解析期 LEVEL UNIQUE 记录/剔除、实例条件门,以及实际节点/碰撞注册和世界分区宿主。普通 CHOICE、feature 配额核心、真实请求与标签矩阵已分别具备,但不能据这些单独验证宣称整个世界已实例化或所有武器已完成。

按 godot-master 的分层方式,本批没有替换正式地图画面。main 原地工作、未提交、未 attach 原游戏;快照 v29 未改,默认存档 SHA256 保持: 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f