Files
HEROLL/HEROLL_RULES_v0.2.8/06-天道赐福/祝福装备商店综合逆向报告.md

169 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`。
- 未使用互联网补全:本地逆向数据已足够回答清单、刷新、价格和购买增长问题;唯一未闭合的黑市加价百分比明确保留为未知,没有以网络二手资料替代源码证据。