Initial import of HEROLL source and design documents
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
# 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` 增加修正;本报告的实现目标是无局外成长的主线玩法验证版。
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
# HEROLL 2.0.1 掉落规则逆向报告
|
||||
|
||||
> 样本:`com.percent.aos.rollinghero`,versionName `2.0.1`,versionCode `113296145`
|
||||
> 原始 XAPK SHA-256:`439D532704AFCCDBEBA8C01AF7869552387CDE31651963D0A45541F252B94E2F`
|
||||
> 结论等级:**确认**=配置或 Native 正文直接证明;**高置信推导**=多项独立证据闭合;**未知**=不得用于原作还原。
|
||||
|
||||
## 1. 核心结论
|
||||
|
||||
HEROLL 的局内装备生成不是一次抽完,而是至少拆成四步:
|
||||
|
||||
1. 从 `WeaponDrop` 的 40 条局内装备中随机选装备身份。
|
||||
2. 以六档相对权重生成品质,并叠加 Joker/局内效果及圈数相关修正。
|
||||
3. 另行生成 `loopGrade` 与随机属性。
|
||||
4. 检查封印等后处理,生成装备槽;槽满时先进入回收路径。
|
||||
|
||||
基础品质权重为:
|
||||
|
||||
`NORMAL : RARE : EPIC : LEGEND : MYTH : ARCANE = 210 : 60 : 28 : 4 : 1 : 4`
|
||||
|
||||
这些数值是**相对权重,不是百分比**。未激活任何动态修正时,总权重为 307,基线概率如下:
|
||||
|
||||
| 品质 | 权重 | 基线概率 |
|
||||
|---|---:|---:|
|
||||
| NORMAL | 210 | 68.4039% |
|
||||
| RARE | 60 | 19.5440% |
|
||||
| EPIC | 28 | 9.1205% |
|
||||
| LEGEND | 4 | 1.3029% |
|
||||
| MYTH | 1 | 0.3257% |
|
||||
| ARCANE | 4 | 1.3029% |
|
||||
|
||||
`ARCANE` 的基础权重确实高于 `MYTH`;这是样本原值,不能为了“看起来合理”而改写。
|
||||
|
||||
## 2. Native 生成链
|
||||
|
||||
### 2.1 装备身份
|
||||
|
||||
`BattleController.GetMonoWeaponData`(VA `0x55BDCC0`)读取 `WeaponDrop` 表的总行数,以随机整数索引取一条,再写入 `weaponStringId`。
|
||||
|
||||
`weapondrop.csv` 正好有 40 条数据:
|
||||
|
||||
| 槽位类型 | 数量 | 基础身份概率 |
|
||||
|---|---:|---:|
|
||||
| Ingame_Weapon | 10 | 25%(单件 2.5%) |
|
||||
| Ingame_Ring | 10 | 25%(单件 2.5%) |
|
||||
| Ingame_Gauntlet | 10 | 25%(单件 2.5%) |
|
||||
| Ingame_Boots | 10 | 25%(单件 2.5%) |
|
||||
|
||||
该等概率结论仅适用于走基础 `GetMonoWeaponData` 随机重载的奖励。`SpawnFixWeapon`、`SpawnTypeWeapon` 及其他带筛选参数的入口可以固定身份或限制类型,不能套用 2.5%。
|
||||
|
||||
### 2.2 品质
|
||||
|
||||
`BattleController.GetEWeaponGrade`(VA `0x55BDE8C`)执行以下流程:
|
||||
|
||||
```text
|
||||
weights = [210, 60, 28, 4, 1, 4]
|
||||
for gradeIndex in 0..5:
|
||||
weights[gradeIndex] *= JokerEffectController.GetWeaponProbMultiplier(gradeIndex)
|
||||
|
||||
apply_loop_or_grade_related_modifiers(weights)
|
||||
|
||||
if excludeNormal:
|
||||
weights[0] = 0
|
||||
|
||||
gradeIndex = Utils.GetRatioPercent(weights)
|
||||
```
|
||||
|
||||
`Utils.GetRatioPercent` 是加权选择器,因此最终概率为 `修正后本档权重 / 修正后总权重`。
|
||||
|
||||
当调用入口设置 `excludeNormal=true` 且没有其他修正时,归一化结果为:RARE 61.8557%、EPIC 28.8660%、LEGEND 4.1237%、MYTH 1.0309%、ARCANE 4.1237%。这不是普通掉落率,只是该特殊分支的数学基线。
|
||||
|
||||
### 2.3 `loopGrade`、属性与后处理
|
||||
|
||||
`BattleController.GetWeaponLoop`(VA `0x55BE240`)另建一个三项权重列表,经 `Utils.GetRatioPercent` 抽取并叠加圈数/品质相关值。它不是六档品质抽取。
|
||||
|
||||
随后 `GetMonoWeaponData` 继续生成状态值、检查封印并写入 `MonoWeaponData`。随机装备协程的已闭合调用链为:
|
||||
|
||||
```text
|
||||
CheckFullSlotRecycleFirstExtra
|
||||
-> GetMonoWeaponData
|
||||
-> MonoWeaponSlot.Spawn
|
||||
-> AddWeaponRewardForEventLog
|
||||
-> HandleJokerWeaponSpawnPostProcess
|
||||
```
|
||||
|
||||
因此以下行为已确认:
|
||||
|
||||
- 满槽会在生成前进入回收处理。
|
||||
- Joker 不只修正品质权重,装备生成后还有独立后处理。
|
||||
- `GetWeaponDropDestroyChance` 表明某些 Joker 效果可令掉落销毁;具体活动值取决于当前效果状态。
|
||||
|
||||
## 3. 掉落“出现机会”与“掉落品质”必须分开
|
||||
|
||||
`ingameWeaponDropRatio` 只证明**已经进入装备生成时的品质分布**,不等于“每只敌人有多少概率掉装备”。
|
||||
|
||||
当前静态证据能确认多个系统会调用随机、固定或类型限定装备生成接口,包括战斗相关奖励、宝箱/事件、碎片交互、小游戏和特殊祝福效果。但 APK 中没有发现一个可直接解释为“所有普通敌人的统一装备掉率”的全局配置。
|
||||
|
||||
两个启用的祝福配置会改变装备出现机会:
|
||||
|
||||
| ID | StringId | 关键配置 | 可确认内容 | 尚未确认内容 |
|
||||
|---:|---|---|---|---|
|
||||
| 124 | KillInTimeGetGear | `timeValue=2.5` | 祝福启用,名称指向限时击杀装备奖励 | 2.5 的精确单位、触发对象及是否必掉 |
|
||||
| 132 | KillForHeroGear | `Value=10` | 祝福启用,名称指向击杀换高品质装备 | “10”的计数/概率语义及品质下限 |
|
||||
|
||||
仅凭 StringId 不足以把这两项写成确定公式;需要继续闭合祝福消费者 Native 正文或做指定种子的动态采样。
|
||||
|
||||
## 4. 局内非装备奖励表
|
||||
|
||||
`ingamereward.csv` 配置了以下节点:
|
||||
|
||||
| 时机 | 奖励 | 配置 |
|
||||
|---|---|---|
|
||||
| `killStrong` | 钻石(item 101) | 数量 0、概率 0,等同关闭 |
|
||||
| `loopClear` | 钻石(item 101) | 数量 1、概率 80 |
|
||||
| `loopEndTileMove` | 金币(item 100) | 基数 10、概率 100、随目标关卡乘 `stageMult` |
|
||||
| `loopClear` | 金币(item 100) | 基数 330、概率 100、随目标关卡乘 `stageMult` |
|
||||
| `loopClear` | 四槽卷轴(119–122) | 各数量 1、配置概率数组均为 20 |
|
||||
| `loopClear` | 四槽强化材料(126–129) | 各数量 1、配置概率数组均为 20 |
|
||||
| `gameEnd` | 鱼饼(item 111) | 数量 1、概率 100 |
|
||||
|
||||
金币 `stageMult`:
|
||||
|
||||
| 目标关卡索引 | stageMult |
|
||||
|---|---:|
|
||||
| -1–16 | 0.30 |
|
||||
| 17–21 | 0.29 |
|
||||
| 22–25 | 0.28 |
|
||||
| 26–30 | 0.27 |
|
||||
| 31–33 | 0.26 |
|
||||
| 34–37 | 0.25 |
|
||||
| 38–44 | 0.24 |
|
||||
| 45–99 | 0.23 |
|
||||
|
||||
表中 `itemCount × stageMult` 的小数取整规则尚未由消费者正文证明,不应自行选择 floor、round 或 ceil。四项 `20` 是配置事实,但“各自独立判定”还是“先选一项再判空”也需 Native 消费者闭合。
|
||||
|
||||
## 5. 抓娃娃掉落配置
|
||||
|
||||
`clawcraneminigame.csv` 说明场内出现 20 个胶囊,配置项包括:
|
||||
|
||||
| 奖励 | 普通 Prob | goodProb |
|
||||
|---|---:|---:|
|
||||
| 空 | 40 | 0 |
|
||||
| 点数 | 70 | 0 |
|
||||
| 药水 | 14 | 0 |
|
||||
| NORMAL 装备 | 40 | 0 |
|
||||
| RARE 装备 | 0 | 0 |
|
||||
| EPIC 装备 | 0 | 0 |
|
||||
| LEGEND 装备 | 0 | 1 |
|
||||
| 祝福 | 0 | 0 |
|
||||
| 药水祝福 | 0 | 0 |
|
||||
|
||||
这些是胶囊生成器的输入权重/概率字段,不应直接归一化为单次抓取概率;胶囊层级、20 个场内对象、好胶囊分支和物理抓取成功率都会影响最终获得率。
|
||||
|
||||
## 6. 保底与重复保护
|
||||
|
||||
结论:**未发现局内 `BattleController` 装备品质抽取的保底计数器或重复品排除逻辑。**
|
||||
|
||||
搜索到的保底实现属于其他系统:
|
||||
|
||||
- `gachaceildata.csv`:局外抽卡保底。
|
||||
- `IdleDungeonController.RollGuaranteedIdleDungeonEquipmentGrade`:挂机地牢装备保底。
|
||||
- `DestinyStatPage.RollGuaranteedHighGrade`:命运属性重掷保底。
|
||||
|
||||
它们不能迁移为普通局内装备掉落规则。公开社区所说的“20 抽保底”和 S 级装备抽取率也属于 Mimic Hunt/局外抽取,不是局内棋盘掉落。
|
||||
|
||||
## 7. 仍然未知的精确项
|
||||
|
||||
以下项目不应冒充已经还原:
|
||||
|
||||
1. 普通敌人自然产生一次装备奖励的基础触发率。
|
||||
2. `GetEWeaponGrade` 中圈数对 EPIC/LEGEND/MYTH/ARCANE 的完整倍率公式。
|
||||
3. 当前运行中各 Joker 的实际倍率、掉落销毁率及远程配置覆盖值。
|
||||
4. `GetWeaponLoop` 三项权重的语义名称及最终 `loopGrade` 分布。
|
||||
5. 卷轴/强化材料概率数组的精确判定顺序。
|
||||
6. 小数奖励数量的取整方式。
|
||||
|
||||
要闭合 1–4,最小动态采样方案是固定 seed,分别在无祝福、获取 ID 124、获取 ID 132、不同圈数及指定 Joker 状态下,Hook `GetEWeaponGrade` 的入参、六项修正后权重和返回值,并记录每个 `SpawnRandomWeapon` 的调用栈。互联网资料无法替代这一步。
|
||||
|
||||
## 8. 证据索引
|
||||
|
||||
| 证据 | SHA-256 | 用途 |
|
||||
|---|---|---|
|
||||
| `gameconfig.csv` | `A57510DEDE13DAF1A597DE1EE73E47B0ABD830D96719DAD24B2CA7370E8DFE3D` | 六档基础权重 |
|
||||
| `weapondrop.csv` | `AF8C97D022A83C1FF898D33FC541F157CAD1DC6C5732FF57D61A502E82914809` | 40 条局内装备身份 |
|
||||
| `ingamereward.csv` | `BCD0E607C0F31A378960F3CD3BA25518A3F3D72D377EEDE11064A276849A9A74` | 圈结算与关卡结束奖励 |
|
||||
| `augment.csv` | `E0B14AF4709E3F0D548973E124F679EF091589D7C99B0E35DE78C628A73D032A` | 装备掉落相关祝福 |
|
||||
| `clawcraneminigame.csv` | `AE52FA502303678DE55D910BF07CD222C29A6995D0A4D96A785E84C660035015` | 抓娃娃胶囊配置 |
|
||||
| `assembly-csharp.json` | `BA6D3F4BD91B0D3977EB1229AB46FE563118CC55793346796F93816BA7FEF526` | IL2CPP 类型、字段、方法映射 |
|
||||
| `libil2cpp.runtime-decrypted.so` | `AC357FBA5BF8A68BA02829593020F29DA220EAC8D5ECA91212C1A6744B0100DA` | Native 规则正文 |
|
||||
| `battlecontroller-drop-code.bin` | `DC28F8583A8AA60C2C3ED7CED8E5B9A60EDBF4A10E82370B32F2C169424FC0ED` | 原 SO 的只读函数区切片,便于 ARM64 复核 |
|
||||
|
||||
## 9. 互联网交叉检索结论
|
||||
|
||||
- [Heroll Wiki 的 Equipment 页面](https://heroll.fandom.com/wiki/Equipment)描述的是局外装备、Mimic Hunt、合成与升级,没有公开局内 `EMonoWeaponGrade` 的生成算法。
|
||||
- [Heroll 社区的 S Legendary 讨论](https://www.reddit.com/r/heroll/comments/1mtb15a/the_thing_about_s_legendary_equipment/)出现了玩家声称的 0.5964% 以及评论中的“20 抽保底”,上下文明确是局外抽取/合成,不可用于本报告的局内掉落率。
|
||||
|
||||
因此,互联网没有补上 Native 中尚缺的圈数倍率;本报告以 APK 2.0.1 本地证据为准。
|
||||
@@ -0,0 +1,12 @@
|
||||
# 07-奖励与掉落
|
||||
|
||||
死亡掉落、战斗奖励、Floor奖励、Boss中途装备与事件奖励。
|
||||
|
||||
## 文件
|
||||
|
||||
- [2026-08-31_逆向-HEROLL装备等级词条星级与Boss掉落-report.md](./2026-08-31_%E9%80%86%E5%90%91-HEROLL%E8%A3%85%E5%A4%87%E7%AD%89%E7%BA%A7%E8%AF%8D%E6%9D%A1%E6%98%9F%E7%BA%A7%E4%B8%8EBoss%E6%8E%89%E8%90%BD-report.md) — report;来源:`analysis/drop-rules/2026-08-31_逆向-HEROLL装备等级词条星级与Boss掉落-report.md`
|
||||
- [event-reward-tables.csv](./event-reward-tables.csv) — table;来源:`analysis/tile-event-rules/tables/event-reward-tables.csv`
|
||||
- [gear-rarity-affix-rules.csv](./gear-rarity-affix-rules.csv) — table;来源:`analysis/drop-rules/gear-rarity-affix-rules.csv`
|
||||
- [HEROLL_2.0.1_DROP_RULES_REPORT.md](./HEROLL_2.0.1_DROP_RULES_REPORT.md) — report;来源:`analysis/drop-rules/HEROLL_2.0.1_DROP_RULES_REPORT.md`
|
||||
|
||||
模块内Markdown与CSV均来自同一v0.2.8规则域;跨模块综合报告会在相关模块中保留副本。
|
||||
@@ -0,0 +1,22 @@
|
||||
event,key,condition,reward,amount_or_weight,source
|
||||
Lucky Scratch,first_prize,preselected weighted result,point,30 at weight 10,newtile.csv values 30|10|1|10|50|40
|
||||
Lucky Scratch,second_prize,preselected weighted result,point,10 at weight 50,newtile.csv
|
||||
Lucky Scratch,third_prize,preselected weighted result,point,1 at weight 40,newtile.csv
|
||||
Claw Machine,guaranteed_good,one per layout,Legendary gear,1,newtile.csv plus clawcraneminigame.csv
|
||||
Claw Machine,normal_empty,normal capsule sample,none,weight 40,clawcraneminigame.csv
|
||||
Claw Machine,normal_point,normal capsule sample,point 1,weight 70,clawcraneminigame.csv
|
||||
Claw Machine,normal_potion,normal capsule sample,potion 1,weight 14,clawcraneminigame.csv
|
||||
Claw Machine,normal_gear,normal capsule sample,Normal gear 1,weight 40,clawcraneminigame.csv
|
||||
Dicereel,pair_face_1,exactly one pair,point,5,dicemachine.csv id0
|
||||
Dicereel,triple_face_1,triple,point,20,dicemachine.csv id6
|
||||
Dicereel,pair_face_2,exactly one pair,Normal gear,1,dicemachine.csv id1
|
||||
Dicereel,triple_face_2,triple,Rare gear,1,dicemachine.csv id7
|
||||
Dicereel,pair_face_3,exactly one pair,free spin,1,dicemachine.csv id2
|
||||
Dicereel,triple_face_3,triple,free spin,2,dicemachine.csv id8
|
||||
Dicereel,pair_face_4,exactly one pair,blessing,1,dicemachine.csv id3
|
||||
Dicereel,triple_face_4,triple,blessing,2,dicemachine.csv id9
|
||||
Dicereel,pair_face_5,exactly one pair,Good Tile,1,dicemachine.csv id4
|
||||
Dicereel,triple_face_5,triple,Good Tile,3,dicemachine.csv id10
|
||||
Dicereel,pair_face_6,exactly one pair,potion,1,dicemachine.csv id5
|
||||
Dicereel,triple_face_6,triple,potion,3,dicemachine.csv id11
|
||||
Dicereel,no_match,three distinct faces,none,0,dicemachine.csv id12
|
||||
|
@@ -0,0 +1,8 @@
|
||||
grade_enum,rarity_cn,rarity_en,base_weight,base_probability,affix_count,sorted_star_pattern,main_effect,source_tag
|
||||
0,灰,Normal,210,0.6840390879,0,none,none,源码确认
|
||||
1,绿,Rare,60,0.1954397394,1,"1",none,源码确认
|
||||
2,蓝,Epic,28,0.0912052117,2,"1|1",none,源码确认
|
||||
3,金,Legend,4,0.0130293160,3,"2|1|1",none,源码确认
|
||||
4,彩,Myth,1,0.0032573290,3,"4|1|1 OR 3|2|1 OR 2|2|2",main_effective_level_plus_1,源码确认
|
||||
5,红,Arcane,4,0.0130293160,3,"4|1|1",selected_affix_arcane_marked,源码确认
|
||||
|
||||
|
Reference in New Issue
Block a user