Files
HEROLL/HEROLL_RULES_v0.2.8/04-局内装备/2026-08-31_逆向-HEROLL装备等级词条星级与Boss掉落-report.md

209 lines
9.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HEROLL 2.0.1 局内装备等级、词条、星级与 Boss 中途掉落逆向报告
> 范围:仅 HEROLL 2.0.1 Unity IL2CPP 版本;仅用于本机内部玩法验证。
> 标签:`[源码确认]` 可直接还原;`[实机观察]` 来自用户/录像;`[验证版新增]` 是原作证据不足时的明确设计选择。
> 样本:`libil2cpp.runtime-decrypted.so`,SHA-256 `AC357FBA5BF8A68BA02829593020F29DA220EAC8D5ECA91212C1A6744B0100DA`。
## 结论摘要
| 问题 | 可实施结论 | 证据等级 |
|---|---|---|
| 装备等级 | `GearLevel = max(1, Floor + Δ)`;普通主线 `Δ={0,1,2}`,权重 `90:5:1`,即 `93.75% / 5.2083% / 1.0417%` | `[源码确认]` |
| 六品质影响 | 品质不使用全局倍率直接放大局内装备;它决定副词条数、星级分配,且仅 Myth 主属性多 1 个有效等级 | `[源码确认]` |
| 部位词条池 | 四个局内部位共用同一组 9 个副词条,抽取不重复;没有发现部位过滤 | `[源码确认]` |
| 星级维度 | 星级是每条 `Status.plusLevel`,不是装备等级、品质或另一套 Affix Tier;每星把该词条的有效等级提高 1 | `[源码确认]` |
| Boss 中途掉装 | 已观察存在,但未恢复 `boss_0` 可审计阈值;验证版采用首次向下越过 50% HP 时追加 1 件 | `[实机观察] + [验证版新增]` |
## 1. 装备等级公式
配置 `gameconfig.csv` 给出:
```text
LoopRatio = 90, 5, 1
```
`BattleController.GetWeaponLoop @ 0x55BE240` 构造三项权重并抽取偏移;函数尾部把当前零基圈数加一,再加抽到的偏移。因此普通主线可写为:
\[
Floor = LoopIndex + 1
\]
\[
GearLevel = \max(1, Floor + \Delta)
\]
| Δ | 权重 | 归一化概率 | Floor 10 示例 |
|---:|---:|---:|---:|
| 0 | 90 | 93.7500% | Lv.10 |
| 1 | 5 | 5.2083% | Lv.11 |
| 2 | 1 | 1.0417% | Lv.12 |
这与实机观察“Floor 10 不低于 Lv.10、最高 Lv.12”一致。原生函数还含模式/研究相关的下限或上限分支;本地玩法验证版没有局外研究,故应使用上表作为普通主线基线,不引入元成长修正。
## 2. 品质、主属性和副词条
### 2.1 六品质
| enum | 品质 | 基础权重 | 基础概率 | 副词条数 | 主属性特殊规则 |
|---:|---|---:|---:|---:|---|
| 0 | Normal / 灰 | 210 | 68.4039% | 0 | 无 |
| 1 | Rare / 绿 | 60 | 19.5440% | 1 | 无 |
| 2 | Epic / 蓝 | 28 | 9.1205% | 2 | 无 |
| 3 | Legend / 金 | 4 | 1.3029% | 3 | 无 |
| 4 | Myth / 彩 | 1 | 0.3257% | 3 | 主属性有效等级 +1 |
| 5 | Arcane / 红 | 4 | 1.3029% | 3 | 无;一条副词条带 Arcane 隐藏/观察标记 |
这些百分比是无其他修正时的基础品质分布。`GrageMultiplier=1,2,4,8,16` 虽存在于 `gameconfig.csv`,但没有进入本报告追踪到的局内 `GetMonoWeaponData → GetStatus` 数值路径,不能把它当作局内品质乘区。
### 2.2 四部位主属性
| 局内部位 | 固定主属性 |
|---|---|
| Ingame_Weapon | ATTACK_POWER |
| Ingame_Ring | HEALTH |
| Ingame_Gauntlet | AIM |
| Ingame_Boots | DEFENSE |
先抽 40 件装备之一,再独立生成品质、等级和属性;装备 ID 与品质不是预组合的独立掉落项。
### 2.3 属性值公式
对 `weaponstatus.csv` 中任意属性 `s`:
\[
EffectiveLevel_{main}=GearLevel-1+MythBonus+ResearchBonus
\]
其中 `MythBonus=1` 仅品质 enum 4 生效;验证版 `ResearchBonus=0`。
\[
EffectiveLevel_{affix}=GearLevel+Star-1
\]
\[
MinValue=BaseMin_s+PlusValue_s\times EffectiveLevel
\]
\[
MaxValue=BaseMax_s+PlusValue_s\times EffectiveLevel
\]
随后在 `[MinValue, MaxValue]` 内取随机值。`isFloat=true` 保留 1 位小数,`isFloat=false` 取整数。源码内部生成两个有间距的候选值,当前调用链采用第一个;要做逐 seed 精确复刻时,必须保持原随机流调用次数。
## 3. 四部位允许的随机副词条
原生生成器显式建立枚举集合 `{6,5,7,8,9,10,11,12,13}`,对应下列 9 项;四个部位均使用此池,单件装备内无重复。
| 副词条 | Base 范围 | 每星 Plus | 百分比 | 小数 |
|---|---:|---:|---|---|
| EVASION | 14–20 | 7 | 否 | 否 |
| REGEN_PER_SECOND | 1–2 | 2.4 | 否 | 是 |
| TOTAL_DAMAGE | 1–2 | 1 | 否 | 是 |
| TRUE_DAMAGE | 1–2.5 | 1.7 | 否 | 否 |
| KILL_HEAL | 6–9 | 2.5 | 否 | 否 |
| COUNTER_ATTACK | 7–9 | 1.5 | 是 | 否 |
| ATTACK_SPEED | 7–9 | 1.4 | 是 | 否 |
| CRITICAL_RATE | 10–12 | 1.5 | 是 | 否 |
| LIFE_STEAL | 4.5–7.5 | 1.5 | 是 | 否 |
注意:`HEALTH` 不是随机副词条,而是 Ring 固定主属性;`ATTACK_POWER/AIM/DEFENSE` 同理属于各自部位主属性。
## 4. 星级的真实含义及品质分配
运行时数据没有独立 `AffixTier` 字段。每条属性使用 `Status.plusLevel` 表达星级;因此实现中不要再叠加一套隐藏 T1/T2/T3。
| 品质 | 生成结果(副词条星级) | 精确规则 |
|---|---|---|
| Normal | 无 | 0 条副词条 |
| Rare | `[1]` | 1 条,初始 1 星 |
| Epic | `[1,1]` | 2 条,各 1 星 |
| Legend | `[2,1,1]` | 3 条各 1 星,再随机给其中一条 +1 |
| Myth | 见下表 | 3 条各 1 星,再独立随机分配 3 个星点,可重复命中 |
| Arcane | `[4,1,1]` | 3 条各 1 星;随机选一条集中获得 +3,并设置 Arcane 标记 |
Myth 的排序后分布:
| 星级组合 | 概率 |
|---|---:|
| `[4,1,1]` | 1/9 = 11.1111% |
| `[3,2,1]` | 2/3 = 66.6667% |
| `[2,2,2]` | 2/9 = 22.2222% |
原生额外星点循环调用 `Common.Roll(1.0)`;该条件恒真,所以 Legend 精确增加 1 点,Myth/Arcane 精确增加 3 点,不是“最多增加”。Arcane 被选中的 4 星词条还会设置 `isHideStatusIndex=true`、`arcaneWatchIndex=0`;本报告不把尚未闭环的 UI 揭示时序扩写成规则。
## 5. Boss HP 中途追加装备
用户实机观察表明 Boss 在战斗中 HP 降低到某阶段时会追加 1 件装备。当前逆向可以确认多个 `SpawnRandomWeapon` 调用入口,也能确认 `GoldCarriageEnemy` 有独立阈值奖励结构,但没有恢复到足以证明 `boss_0` HP 百分比的专属调用链。因此不能把任意百分比标成原作事实。
玩法验证版采用以下覆盖规则:
```text
[验证版新增] boss_0 首次由 HP > 50% 向下越过 HP <= 50% 时,追加生成 1 件装备。
midBossGearDropped 为单场战斗幂等标记;复活不重置。
若一击同时越过 50% 并致死,先产生中途装备,再执行死亡结算。
Boss 死亡掉落与该追加掉落是两个独立来源。
```
这个选择可见、易测、不会伪装成原作恢复结论。若未来动态 Hook 得到真实阈值,只替换配置,不改变事务结构。
## 生成流程图
```mermaid
flowchart TD
A[当前 Floor] --> B[GetWeaponLoop]
B --> C{Δ 加权抽取 90:5:1}
C --> D[GearLevel = Floor + Δ]
D --> E[抽 40 件装备之一]
E --> F[抽六品质]
F --> G[部位固定主属性]
F --> H[按品质确定副词条数]
H --> I[四部位共享 9 词条池\n单件不重复]
I --> J[按品质分配 plusLevel 星级]
G --> K[GetStatus 数值区间]
J --> K
K --> L[按 isFloat 整数或 1 位小数]
```
## Evidence → Finding → Path
### Findings
- `F-DROP-001`(validated,高):普通主线装备等级为 `Floor + Weighted(0,1,2; 90,5,1)`。`evidence_ids: [E-DROP-LEVEL-001]`
- `F-DROP-002`(validated,高):六品质通过副词条数量、星级分配和 Myth 主属性 +1 有效等级影响属性,不在此路径使用全局品质倍率。`evidence_ids: [E-DROP-AFFIX-001]`
- `F-DROP-003`(validated,高):四局内部位共用 9 项无重复副词条池。`evidence_ids: [E-DROP-AFFIX-001]`
- `F-DROP-004`(validated,高):星级等于每条 `Status.plusLevel`,每星提升该词条一个有效等级;没有独立 Affix Tier。`evidence_ids: [E-DROP-AFFIX-001]`
- `F-DROP-005`(partial,中):Boss 中途追加装备被实机观察支持,但 `boss_0` 精确 HP 阈值尚未由静态调用链闭环;50% 是验证版新增。`evidence_ids: [E-DROP-BOSS-001]`
### Path
- `P-DROP-001`
- `path_type: callflow`
- steps: `gameconfig.LoopRatio → BattleController.GetWeaponLoop → GetMonoWeaponData → status generator → GetStatus → GetRandomValues`
- `evidence_ids: [E-DROP-LEVEL-001, E-DROP-AFFIX-001]`
## 复现入口
```powershell
rg -n "LoopRatio|GrageMultiplier" HEROLL_APK_REVERSE_ONLY/01_core_reverse_archive/resource-tables/extracted/csv/gameconfig.csv
rg -n "ATTACK_POWER|EVASION|LIFE_STEAL" HEROLL_APK_REVERSE_ONLY/01_core_reverse_archive/resource-tables/extracted/csv/weaponstatus.csv
radare2 -q -c "s 0x55BE240; pd 420" work/heroll-stage-2-5/libil2cpp.runtime-decrypted.so
radare2 -q -c "s 0x55BDCC0; pd 1450" work/heroll-stage-2-5/libil2cpp.runtime-decrypted.so
radare2 -q -c "s 0x55C0840; pd 360" work/heroll-stage-2-5/libil2cpp.runtime-decrypted.so
radare2 -q -c "s 0x55C0D70; pd 320" work/heroll-stage-2-5/libil2cpp.runtime-decrypted.so
```
## 互联网交叉检索
公开资料没有给出上述局内精确权重或公式。Google Play 只描述掷骰、战斗和装备循环;社区 Wiki 的 Equipment 页面主要是局外持久装备系统,不能与本报告的局内 `MonoWeaponData/Status.plusLevel` 混用。社区讨论“等级通常比稀有度更重要”仅与本报告的线性等级增长方向相容,不构成公式证据。
- Google Play:https://play.google.com/store/apps/details?hl=en_SG&id=com.percent.aos.rollinghero
- Heroll Wiki Equipment:https://heroll.fandom.com/wiki/Equipment
- Reddit 社区讨论:https://www.reddit.com/r/heroll/comments/1l1x8qx
## 限制
- Arcane 词条的完整 UI 揭示/观察生命周期尚未闭环,本报告只保留已确认字段语义。
- `boss_0` 的原作中途掉落阈值尚未闭环;50% 仅为验证版配置。
- 模式和局外研究可能给 `GetWeaponLoop/GetStatus` 增加修正;本报告的实现目标是无局外成长的主线玩法验证版。