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

9.8 KiB
Raw Permalink Blame History

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 给出:

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-001
    • path_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 混用。社区讨论“等级通常比稀有度更重要”仅与本报告的线性等级增长方向相容,不构成公式证据。

限制

  • Arcane 词条的完整 UI 揭示/观察生命周期尚未闭环,本报告只保留已确认字段语义。
  • boss_0 的原作中途掉落阈值尚未闭环;50% 仅为验证版配置。
  • 模式和局外研究可能给 GetWeaponLoop/GetStatus 增加修正;本报告的实现目标是无局外成长的主线玩法验证版。