10 KiB
10 KiB
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 刷新机制
原生函数确认如下:
打开商店: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。 - 未使用互联网补全:本地逆向数据已足够回答清单、刷新、价格和购买增长问题;唯一未闭合的黑市加价百分比明确保留为未知,没有以网络二手资料替代源码证据。