9.8 KiB
HEROLL 2.0.1 局内装备等级、词条、星级与 Boss 中途掉落逆向报告
范围:仅 HEROLL 2.0.1 Unity IL2CPP 版本;仅用于本机内部玩法验证。
标签:[源码确认]可直接还原;[实机观察]来自用户/录像;[验证版新增]是原作证据不足时的明确设计选择。
样本:libil2cpp.runtime-decrypted.so,SHA-256AC357FBA5BF8A68BA02829593020F29DA220EAC8D5ECA91212C1A6744B0100DA。
结论摘要
| 问题 | 可实施结论 | 证据等级 |
|---|---|---|
| 装备等级 | 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 给出:
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 百分比的专属调用链。因此不能把任意百分比标成原作事实。
玩法验证版采用以下覆盖规则:
[验证版新增] boss_0 首次由 HP > 50% 向下越过 HP <= 50% 时,追加生成 1 件装备。
midBossGearDropped 为单场战斗幂等标记;复活不重置。
若一击同时越过 50% 并致死,先产生中途装备,再执行死亡结算。
Boss 死亡掉落与该追加掉落是两个独立来源。
这个选择可见、易测、不会伪装成原作恢复结论。若未来动态 Hook 得到真实阈值,只替换配置,不改变事务结构。
生成流程图
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-001path_type: callflow- steps:
gameconfig.LoopRatio → BattleController.GetWeaponLoop → GetMonoWeaponData → status generator → GetStatus → GetRandomValues evidence_ids: [E-DROP-LEVEL-001, E-DROP-AFFIX-001]
复现入口
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增加修正;本报告的实现目标是无局外成长的主线玩法验证版。