# 角色公式采样操作说明

## 监控程序

使用 `build\bin\GBFR PE Patch Tool.exe`，进入「内存监测（只读） → 角色公式采样」。该页面只以
`PROCESS_QUERY_INFORMATION | PROCESS_VM_READ` 打开游戏，不复用修改器句柄，不安装 Hook，
也不会写游戏内存或存档。

目前已经有直接标签、可逐位稳定回读的最终数值只有四项：HP、攻击力、暴击率、昏厥值。
专精、防御力和伤害上限没有冒充成必然改变四项已知面板的实验；选择这些类型时，采样器允许上述四项保持不变，
并从角色状态对象的 24 KiB 窗口导出可逆标量候选。拿到多轮样本并交叉复现后，才能把候选
升级成有语义的字段。防御的最终受伤公式仍需训练场受击样本验证，当前程序不
会在没有证据时声称已经读到了绝对防御力。

每个证据包只允许研究一个变量。页面会记录四个阶段：

1. `A1`：原配置基准。
2. `B1`：只改变一个可逆项目后的结果。
3. `A2`：把该项目恢复到 A1。
4. `B2`：再次做出与 B1 完全相同的改变。

每阶段都会在 24 KiB 状态窗口采样前后各读取三次最终人物面板，并要求六次面板逐位一致；
状态窗口本身也必须连续三次逐位一致。A2 必须精确回到 A1，B2 必须精确复现 B1，否则本轮拒绝导出。

## 开始前

- 使用游戏 DLC 2.0.2，进入已加载完成的存档和安全区域，不在读盘、结算、联机或战斗动画中采样。
- 打开目标角色的装备/人物属性界面，确认 HP、攻击、暴击率、昏厥值已停止变化。
- 一轮中不要切角色，不要同时换武器、因子、专精和召唤石，也不要让 HP 或战斗状态自动变化。
- 先做一轮「空白对照」。空白对照的 A1/B1/A2/B2 全程什么都不改，用于检查背景噪声。

## 在游戏里看哪一页

在城镇或安全区域打开游戏菜单，进入角色的「装备/配装」页，再打开右侧「人物属性/角色详情」。
目标是能同时看到 `HP、攻击力、暴击率、昏厥值` 的那张人物属性卡。不同输入设备的“详情”
按键提示可能不同，但只要这四项和当前角色都正确即可。采样器直接读游戏内角色状态对象，
不是截图识别；人物属性页的作用是让你人工核对当前角色和 A/B 数字，采集时不要切到另一个角色。

专精或装备切换建议预先准备 A/B 两个配装：两套除一个待测项目外完全相同。采 A1 后切到 B，
采 B1 后切回 A，采 A2 后再切 B，最后采 B2。不要在同一轮一边改专精、一边换武器或召唤石。

## 每轮实际操作

1. 在「本轮唯一变更类型」选择本轮类型，在「目标角色」选择游戏里当前查看的角色。
2. 点击「连接只读采样器」。如果提示版本、角色或状态对象不匹配，停在当前页面，等稳定后重新连接。
3. 保持 A 配置不变，点击「采集当前阶段 A1」。
4. 只执行预先写下的一个改变；回到同一角色的人物属性卡，等四项数字稳定，点击「采集当前阶段 B1」。
5. 撤销刚才的唯一改变，逐项确认恢复 A1，点击「采集当前阶段 A2」。
6. 再次执行与第 4 步完全相同的改变，等稳定后点击「采集当前阶段 B2」。
7. 点击「导出脱敏证据包」，在系统保存窗口选择目录。页面随后会显示实际「保存路径」。建议文件名使用 `角色_类型_具体变量_序号.gbfr-formula-sample.zip`。
8. 点击「安全断开」。下一种变量重新建立一轮，不在同一包里继续改第二项。

## 建议采样顺序

| 顺序 | 页面类型 | 只做的一个改变 | 注意事项 |
|---:|---|---|---|
| 1 | 空白对照 | 什么都不改变 | 每个目标角色至少 1 轮 |
| 2 | 因子 | 在一个空槽装备/卸下一个明确词条的因子 | 不换槽位外的其他因子；先测固定 HP、攻击、暴击、昏厥，再测百分比 |
| 3 | 召唤石 | 在一个槽位装备/卸下一颗已知召唤石 | 其余 3 槽和装备顺序保持不变 |
| 4 | 专精 | 只点入/移除一个可恢复的专精子词条 | 不同时切换专精方向或第二个节点 |
| 5 | 武器 | 只在两套预先记录的武器配置间切换 | 把本轮标成「武器实例」；若武器技能也不同，不要把结果解释成纯基础攻击 |
| 6 | 武器技能 | 只改变一个可逆的武器技能效果 | 只有能保证武器基础值和其他技能完全相同时才使用该类型 |
| 7 | 上限突破 | 只改变一个可完整恢复的上限突破词条 | 无法恢复原始值时不要采样，A2 会失败 |
| 8 | HP 条件 | 只改变当前 HP 档位 | 装备完全不变；分别记录精确 HP 百分比和是否在城镇/任务中 |
| 9 | 战斗条件 | 只切换一个 buff、debuff 或战斗状态 | 每种状态单独一包，不要和 HP 条件混合 |
| 10 | 防御力 | 只装备/卸下一个已知固定防御加成，或只切一个防御专精节点 | 四项人物面板可以不变；有候选时用于定位，无候选仍导出为“负观察”，但不能单独证明没有效果 |
| 11 | 伤害上限 | 只装备/卸下一个明确的伤害上限词条 | 不要同时改变攻击力；此轮先定位状态候选，不等于已经验证实际伤害结算公式 |

### 示例：两类高价值专精样本

1. `专精解锁边界`：选择一个角色强化 Lv1 或相应阶尚未开放的角色，A/B 配装只差一个越级节点。
   如果最终人物面板和候选都保持不变，包会明确标成“负观察”；请仍记录该角色强化等级和确实完成 A/B 切换的截图。负观察必须重复，不能单包证明游戏一定不生效。
2. `昏厥值+0.4`：使用已解锁 EX 的伊欧，A/B 配装只差节点 `1F52146F`。该节点的 2.0.2
   原始效果动作是 `Value1=0.4`，中文原文也是“昏厥值+0.4”。现场 A/B/A/B 已确认人物
   面板显示为 `+4`，即该面板字段的显示尺度为原始 `f32 × 10`；后续样本仍应单变量采集，
   不应把此结论外推到其他字段。

角色等级、Fate/命运剧情、Master 永久强化等不可逆项目不适合在同一进程会话里强行做 A/B/A/B。
这些项目需要使用成对存档或专门的匹配角色协议采集；不要为了通过向导去修改多个永久字段。

## 提交样本用于复核

如果愿意把脱敏证据包用于改进公式校准，可在本仓库新建 Issue，并附上导出的 `.gbfr-formula-sample.zip`。提交时写清楚：

- 文件名对应的角色；
- B 相对 A 唯一改变的项目、等级和数值；
- 采样地点（城镇/训练场/任务）及 HP/战斗条件；
- 是否为重复实验。

不要解压、改名包内文件或重新压缩，也不要附带真实存档或未经脱敏的截图。每个 Issue 只提交一个变量的证据包；同一变量建议独立重复至少 3 次。

包内的 `SHA256SUMS` 会先验证文件完整性。`formula-model.json` 只陈述可重复差值，不会把相对偏移候选冒充已验证公式；需要多轮相互独立的样本才能提升结论等级。

## 包内隐私边界

证据包包含 `manifest.json`、`events.json`、`observations.json`、`candidates.json`、
`formula-model.json`、`redaction-report.json`、`README.txt` 和 `SHA256SUMS`。
它不包含原始内存块、PID、模块基址、堆地址、本地路径、用户名、绝对时间或自由备注。
捕获时和导出前都会用 `VirtualQueryEx` 删除实际映射地址的两个 32 位半字，并把四阶段命中过的偏移掩码取并集；候选只导出状态对象内的相对偏移、i32/f32 类型和 A→B 差值，不导出未知字段的 A/B 原始位模式。
