Initial import of HEROLL source and design documents

This commit is contained in:
toshiocn
2026-10-26 16:05:39 +08:00
commit fdb55672c1
1846 changed files with 290692 additions and 0 deletions
@@ -0,0 +1,60 @@
# Stage 2.5.3 纠错报告
## 1. Critical Rate
### 已废止结论
`0x549B934` 位于防御者侧 `BaseMonoCharacter.HitAndGetResult`,属于 Hit/Miss 判定。任何把它解释成 Critical Rate RNG 的结论均标记为 `SUPERSEDED`。
### 新闭环
`CRITICAL_RATE / EMonoStatus 11` → `CharacterStatus.GetFinalStatus(11)` → 整数 RNG `[0,101)` → `chance > roll` → `DamageMeta.isCritical (+0x28)`。
入口是攻击者覆写 `BaseMonoPlayer.OnBeforeAttack @ 0x55A95EC`。`BaseActor.<RunAttackSequence>d__44.MoveNext @ 0x5496AB0` 先构造 `DamageMeta`,将 `isCritical` 初始化为 false,再调用攻击者攻击前钩子。攻击者钩子在公共尾部以 `cset gt` 生成布尔值并写入 DamageMeta。
结论:`VERIFIED / HIGH`。
## 2. Gacha
### Selector
`GachaProduct.RewardGacha @ 0x52F22E4` 使用 `<RewardGacha>b__21_0 @ 0x52F4840` 读取 `Gacha.prob (+0x28)`,并调用通用选择器 `0x50EDB34`。
选择器先获得权重总和,将其乘以常数 `10000`,调用 RNG 助手 `0x513C53C` 取得整数随机游标,再遍历候选项:若游标仍大于当前权重则减去当前权重并继续,否则返回当前索引。
结论:`VERIFIED / HIGH`。
### Pity counter
配置表明确给出三组 `ceilCount`:20、50、400。运行时计数更新助手 `0x51138F0` 已定位:它按抽数参数更新一个持久化 Gacha 记录的计数,并存在不同的分支处理;命中检查助手 `0x510078C` 会读取持久化记录并与传入的 ceil 参数比较。`RewardGacha` 在 `0x52F3D1C` 调用该检查助手,成功分支进入指定保底奖励选择。
但当前静态证据尚不能把 `0x51138F0` 的两个分支安全命名为“普通 increment”和“reset”,也没有看到可独立证明的 `count = 0` 写入。因此本包不把“何时归零、是否跨十连逐抽归零、提前出货是否归零”写成事实。
结论:`PARTIAL / MEDIUM`。已闭合 `count update → ceil compare → guaranteed branch`,未闭合精确 reset 语义。
## 3. Boss Gauge
### 关键纠正
`stageinfo.csv` 中 `bossSpawnRule=DiceGauge, bossSpawnRuleValue=50` 的 50 是每次格子结算加入 Gauge 的配置值,不是“当前 Gauge 与 50 比较”的阈值。
格子执行状态机 `<ExecuteAsync>d__0.MoveNext @ 0x553EEEC` 在 `0x55445E8` 读取配置增量,随后:
```text
current = GetRuntimeGauge() // 0x52E4DA8
next = clamp(current + configValue, 0, 100)
SetRuntimeGauge(next) // 0x52E4E10
```
实时 Gauge 存储在运行时数据对象 `+0x2E0`。setter 写入后还会通知相关事件/UI。`MoveTile` 在 `0x56C038C` 调用 `TrySpawnBossTilesByGauge @ 0x569FEC0`;生成流程完成后的后续状态机在 `0x52E6064–0x52E6068` 对同一 setter 传入 0,形成清零证据。
`NewStagePlayData.highestBossTileGauge (+0x1C)` 是历史最高 Gauge 存档字段,不能替代实时字段。
结论:Gauge 更新式与实时字段为 `VERIFIED / HIGH`;“具体哪一个布尔资格检查代表满 Gauge”仍为 `PARTIAL / MEDIUM`,因为该检查被共享/间接调用封装,未恢复出可靠托管名称。
## 4. 对 GDD 反推的约束
- 暴击率可写为客户端判定:`critical = CRITICAL_RATE > RandomInt(0,101)`。
- Gacha 可写为权重抽取,但不得擅自把 `prob` 解释成百分比;它是相对权重,内部按 10000 精度离散化。
- Pity 可写配置阈值与已定位计数助手,不得补写未经证明的 reset 时机。
- Boss Gauge 应写成 0–100 的进度,配置 50 是单次增量;不要写成“Gauge >= 50 触发 Boss”。