169 lines
10 KiB
Markdown
169 lines
10 KiB
Markdown
# HEROLL 2.0.1 祝福、装备与局内商店逆向清单
|
||
|
||
> 范围:仅 HEROLL 2.0.1。结论来自本地 XAPK/Unity 配置、本地化资产及解密后的 `libil2cpp`;未混用其他项目资料。本文用于内部玩法验证,不代表发行授权。
|
||
|
||
## 1. 结论摘要
|
||
|
||
| 模块 | 逆向结论 | 置信度 |
|
||
|---|---|---|
|
||
| 祝福 | `augment.csv` 共 58 行,其中原作启用 31 条;名称和效果模板均已从原作简中本地化资产还原 | 高 |
|
||
| 装备 | 局内装备 40 件,武器/戒指/护手/鞋子各 10 件;装备 ID 不绑定品质与随机词条 | 高 |
|
||
| 品质 | 六档:灰/绿/蓝/金/彩/红;基础权重 `210/60/28/4/1/4`,副词条数 `0/1/2/3/3/3` | 高 |
|
||
| 装备等级 | 普通关卡 `GearLevel = Floor + Weighted(0,1,2; 90,5,1)` | 高 |
|
||
| 商店 | 源码商品 96 条:地块 12、祝福 31、药水 9、属性 13、固定升级 30、彩票 1 | 高 |
|
||
| 刷新 | 商店打开时付费刷新计数归零;第 `k` 次付费刷新价格为 `3 + 2k`,所以依次为 3、5、7、9…… | 高 |
|
||
| 重复购买 | 没有通用“重复购买涨价”。普通商品只减少剩余购买次数,价格不变;固定升级通过不同等级商品行形成预设价格链 | 高 |
|
||
| 黑市 | 独立加价公式 `最终价 = 基础价 + trunc(基础价 × 加价百分比 / 100)`;当前样本未闭合序列化的百分比常量 | 中高 |
|
||
|
||
完整逐行数据见同目录的 `tables/` CSV 和 Excel 工作簿。
|
||
|
||
## 2. 启用祝福列表(31 条)
|
||
|
||
效果文字保留原作占位符:`{n}` 为数值、`{sec}` 为秒数、`{stat}` 为属性名。升级数组、可叠加标志、触发概率、图标和依赖字段在完整表中保留。
|
||
|
||
| ID | 祝福 | 原作简中效果模板 | 配置值 |
|
||
|---:|---|---|---|
|
||
| 100 | 守护一击 | 每攻击敌人 {n} 次,获得防护罩 | 6 |
|
||
| 102 | 吸血 | 额外恢复 {n}% 暴击伤害 | 15/20/25/30 |
|
||
| 103 | 攻击弱点 | 暴击攻击力 +{n}% | 30/35/40 |
|
||
| 106 | 奇迹骰子 | 濒临死亡时,当骰子总和大于 {n},将复活 | 4 |
|
||
| 108 | 起始一击 | 首次攻击伤害 +{n}% | 70/80/90 |
|
||
| 109 | 攻击力加速 | 开始战斗 3 秒后,攻击力 +{n}% | 30 |
|
||
| 110 | 攻击速度加速 | 开始战斗 3 秒后,攻击速度 +{n}% | 30 |
|
||
| 111 | 恢复骰子 | 当骰子双倍时,恢复 {n}% 生命值 | 8 |
|
||
| 112 | 战斗狂 | 每失去 5% 生命值,攻击速度 +{n}% | 3 |
|
||
| 113 | 祝福的开始 | 战斗开始时,以 {n}% 概率恢复所有生命值 | 10 |
|
||
| 114 | 快速回避 | 被攻击时,以 {n}% 概率仅受到 1 点伤害 | 4 |
|
||
| 115 | 幸运骰子 | 当骰子总和为 7,攻击力 +{n}% | 30/40/50 |
|
||
| 116 | 守护骰子 | 当骰子总和为 6 以上,获得防护罩 | 1 |
|
||
| 117 | 吸收灵魂 | 每次击杀敌人,生命值永久增加 {n} | 5 |
|
||
| 118 | 腐蚀一击 | 每次攻击命中,使敌人防御力降低 {n}% | 10/20/30 |
|
||
| 121 | 多多益善 | 战斗开始时,按敌人数量使 {stat} +{n}% | 8 |
|
||
| 122 | 奇数骰子 | 当所有骰子点数为奇数时,暴击率 +{n}% | 20 |
|
||
| 124 | 掠夺者 | 在 {sec} 秒内击杀敌人时,获得装备 | 0(时间字段另存) |
|
||
| 125 | 顽强生命 | 战斗开始 {sec} 秒后,恢复 {n}% 已损生命值 | 20 |
|
||
| 126 | 呼唤闪电 | 每 {sec} 秒以 {n}% 概率召唤一次闪电 | 10 |
|
||
| 132 | 质重于量 | 每击杀 {n} 个敌人,获得英雄阶级装备 | 10 |
|
||
| 147 | 调整数量 | 移除所有各 1 个敌人 | 0 |
|
||
| 148 | 支援金 | 该回合结束时,获得 {n} 点数 | 20 |
|
||
| 149 | 补充骰子 | 当骰子总和大于 11,补充 1 个药水 | 0 |
|
||
| 150 | 掠夺药水 | 每击杀 {n} 个敌人,获得 1 个药水 | 10 |
|
||
| 151 | 领袖气质 | 每次进入商店时,增加 {n} 次免费刷新 | 1 |
|
||
| 152 | 都市计划 | 于空地建设时,额外建设 {n} 个建筑 | 2 |
|
||
| 153 | 刺激 | 回避时,恢复生命值上限的 {n}% | 1/2/3 |
|
||
| 154 | 战后休息 | 战斗结束后,恢复生命值上限的 {n}% | 10 |
|
||
| 156 | 残火 | 受到烧伤的敌人死亡时爆炸,对全体造成攻击力 {n}% 的伤害 | 150 |
|
||
| 157 | 点燃 | 战斗开始时,以 {n}% 概率使所有敌人烧伤 +1 | 10 |
|
||
|
||
说明:表内对繁体/异体字做了便于开发阅读的简体规范化;CSV 中保留原始 `zh-cn` 文本和英文模板。
|
||
|
||
## 3. 装备列表与生成规则
|
||
|
||
### 3.1 40 件装备本体
|
||
|
||
| 部位 | 主属性 | 10 件原作装备 |
|
||
|---|---|---|
|
||
| 武器 | `ATTACK_POWER` | 冒险者匕首、誓约匕首、破碎匕首、樵夫匕首、亡者匕首、神圣匕首、霜光匕首、光之匕首、祭坛匕首、烈火匕首 |
|
||
| 戒指 | `HEALTH` | 冒险者戒指、誓约戒指、星星戒指、樵夫戒指、亡者戒指、龙之戒指、霜光戒指、幸运戒指、堕落戒指、永存戒指 |
|
||
| 护手 | `AIM` | 冒险者手套、誓约手套、古代手套、樵夫手套、神圣手套、龙之手套、霜光手套、幸运手套、侏儒手套、永劫手套 |
|
||
| 鞋子 | `DEFENSE` | 冒险者靴子、誓约靴子、古代靴子、樵夫靴子、神圣靴子、猎龙者靴子、霜光靴子、幸运靴子、堕落靴子、永劫靴子 |
|
||
|
||
### 3.2 品质、等级与词条
|
||
|
||
装备本体、品质、等级和随机词条是分阶段生成,不能把某件装备固化成某个品质。
|
||
|
||
| 品质 | 基础权重 | 无修正基础概率 | 副词条数 |
|
||
|---|---:|---:|---:|
|
||
| Normal(灰) | 210 | 68.40% | 0 |
|
||
| Rare(绿) | 60 | 19.54% | 1 |
|
||
| Epic(蓝) | 28 | 9.12% | 2 |
|
||
| Legend(金) | 4 | 1.30% | 3 |
|
||
| Myth(彩) | 1 | 0.33% | 3 |
|
||
| Arcane(红) | 4 | 1.30% | 3 |
|
||
|
||
- 等级:`Floor + Δ`,`Δ=0/1/2` 的权重为 `90/5/1`;归一化概率约为 93.75%/5.21%/1.04%。
|
||
- 所有四个部位共享九项不重复随机副词条池:闪避、每秒恢复、总伤害、真实伤害、击杀恢复、反击、攻击速度、暴击率、生命偷取。
|
||
- 星级是 `Status.plusLevel`,属于词条强化层,不是装备等级或品质的别名。
|
||
- 品质决定副词条数量及可用强化资源,但装备名称本身不决定品质、等级或词条。
|
||
- 主属性/副词条数值公式和星级分配证据已在既有掉落规则报告闭合,本清单直接复用,不重复创造一套规则。
|
||
|
||
## 4. 商店商品(96 条)
|
||
|
||
### 4.1 商品构成
|
||
|
||
| 类型 | 数量 | ID 范围 | 定价/限购方式 |
|
||
|---|---:|---|---|
|
||
| 地块 `TILE` | 12 | 100–111 | 每行固定价格;通常限购 1 |
|
||
| 祝福 `AUGMENT` | 31 | 112–142 | 每行固定价格;限购 1 |
|
||
| 药水 `POTION` | 9 | 143–151 | 每行固定价格;限购 1 |
|
||
| 直接属性 `STAT` | 13 | 152–164 | 每行固定价格;限购 3/5/10 |
|
||
| 固定升级 `FIXED` | 30 | 165–194 | 等级链逐行预设价格;末项药水补充可重复购买 |
|
||
| 彩票 `LOTTO` | 1 | 195 | 价格 5;限购 1 |
|
||
|
||
96 条商品的中文名称、效果、价格、`buyCount`、等级和键值见 `tables/shop-catalog.csv`。
|
||
|
||
### 4.2 刷新机制
|
||
|
||
原生函数确认如下:
|
||
|
||
```text
|
||
打开商店:paidRerollCount = 0
|
||
|
||
当前付费刷新价:
|
||
nowRerollCost = 3 + 2 * paidRerollCount
|
||
|
||
点击刷新:
|
||
if freeRerollCount >= 1:
|
||
freeRerollCount -= 1
|
||
不扣点数,不增加 paidRerollCount
|
||
else:
|
||
扣除 nowRerollCost
|
||
paidRerollCount += 1
|
||
```
|
||
|
||
因此每次进入商店后的付费刷新序列是 **3、5、7、9、11……**。免费刷新优先消耗,不推进付费价格。刷新随机商品槽;固定升级槽的进度不因刷新重置。
|
||
|
||
### 4.3 重复购买与价格增长
|
||
|
||
这里需要纠正一个常见误解:源码不存在“同一普通商品每买一次按百分比涨价”的通用逻辑。
|
||
|
||
- 普通商品购买成功后,只执行 `remainBuyCount -= 1`;归零后售罄,价格字段不变化。
|
||
- 直接属性商品可购买多次,但每次价格仍是该商品行的固定价格,直到达到限购。
|
||
- 固定升级看似“重复购买涨价”,实际是买完当前等级后切换到下一条预配置商品行。
|
||
|
||
固定升级价格链:
|
||
|
||
| 升级族 | 价格序列 | 相邻涨幅 |
|
||
|---|---|---|
|
||
| 药水持有上限 `potionCount` | 10, 15, 21, 28, 36, 45, 55, 66, 78 | +5,+6,+7,+8,+9,+10,+11,+12 |
|
||
| 药水恢复量 `potionHeal` | 7, 11, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100 | +4,+4,+5,之后每级 +5 |
|
||
| 补充 1 瓶药水 `potionAdd` | 5 | 无限次;单价不增长 |
|
||
|
||
黑市加价是另一套机制,与购买次数无关:
|
||
|
||
`price = basePrice + trunc(basePrice × surchargePercent / 100)`
|
||
|
||
当前逆向样本已恢复公式和字段 `priceSurchargePer`,但没有足够证据确定所有场景使用的序列化百分比,因此不填猜测值。
|
||
|
||
## 5. Evidence → Finding → Design Path
|
||
|
||
本轮证据记录:`E-CATALOG-BLESSING-001`、`E-CATALOG-EQUIP-001`、`E-CATALOG-SHOP-001`、`E-SHOP-RUNTIME-001`。
|
||
|
||
| Evidence | Finding | 可实施规则 |
|
||
|---|---|---|
|
||
| `augment.csv` + 本地化资产 | 31 条启用祝福及原作文本 | 祝福池严格取启用行,展示文案按键值格式化 |
|
||
| `weapondrop.csv` + `weaponstatus.csv` + 原生生成函数 | 40 件装备、四部位主属性、动态品质/词条 | 装备本体与品质/等级/词条分离抽取 |
|
||
| `ingameshoplist.csv` + 关联表 | 96 条商品、价格和购买上限 | 以商品行作为唯一配置源,不自行拼价 |
|
||
| `gameconfig.shopRerollCost=3,2` + `0x54E1FD4` | 刷新成本为线性公式 | 每次进店重置付费计数;免费刷新优先 |
|
||
| `BuyItem @ 0x54DE518` | 购买只递减剩余次数 | 普通重复购买不涨价 |
|
||
| `SetSurcharge @ 0x54DE0A4` | 黑市使用独立百分比加价 | 不把黑市加价误写成重复购买涨价 |
|
||
|
||
## 6. 复现、限制与来源
|
||
|
||
- 结构化抽取脚本:`analysis/catalog-reverse/scripts/extract_catalogs.py`
|
||
- 原生刷新公式:`IngameShopView` 方法 `0x06002CD2 @ 0x54E1FD4`,核心 `madd` 位于约 `0x54E2188`。
|
||
- 刷新动作:`0x06002CD3 @ 0x54E2250`;免费次数优先分支约 `0x54E22F0–0x54E23A4`。
|
||
- 购买计数:`IngameShopItemSlot.BuyItem @ 0x54DE518`,递减与售罄约 `0x54DE724–0x54DE74C`。
|
||
- 黑市加价:`IngameShopItemSlot.SetSurcharge @ 0x54DE0A4`。
|
||
- 未使用互联网补全:本地逆向数据已足够回答清单、刷新、价格和购买增长问题;唯一未闭合的黑市加价百分比明确保留为未知,没有以网络二手资料替代源码证据。
|