Initial import of HEROLL source and design documents
This commit is contained in:
@@ -0,0 +1,136 @@
|
||||
# HEROLL 2.0.1 Good Tile 与 Corner 规则逆向报告
|
||||
|
||||
> 仅限本机内部玩法验证。本文只分析 HEROLL;其他项目资料不构成证据。
|
||||
|
||||
## 结论摘要
|
||||
|
||||
用户指定的六个 Good Tile 已闭合为六套独立状态机:Chest、Forge、Dice Battle、Lucky Scratch、Claw Machine、Dicereel。用户所说的“四类 Corner”不是 `newtile.csv` 中全部 Corner,而是 `ingamereward.csv` 基础四项 `126–129`:Piggy Bank、Race、Flower Garden、Housing Support。原作另有 Wall of Thorns、Black Market、Dice Catapult、Warp;本文列出它们用于防止配置误归类,但不把它们伪装成基础四类。
|
||||
|
||||
最重要的纠错:
|
||||
|
||||
- Chest 一次生成 **3 件**随机局内装备,不是旧验证表中的 1 件。
|
||||
- Dice Battle 没有“支付 3 点下注”的证据。配置 `3,10,2.5,5,10` 与原生字段更支持“开局 3 骰、首胜 10 点、连胜倍率 2.5/5/10”。
|
||||
- Lucky Scratch 对应 `GoodEventSpito(169)`,不是 `GoodEventLotto(142)`;后者是另一个 Drawing Lots/抽签事件。
|
||||
- Claw 2.0.1 配置为基础 `1` 次、`15` 秒;截图中的 2 次处于额外继续入口。社区资料所称“两次基础抓取”属于版本冲突,开发还原以本 APK 为准。
|
||||
- Dicereel 的 `value` 列不是概率。奖励由三骰配对/三连模式决定;不能拿 `20,25,50...` 归一化成掉率。
|
||||
|
||||
完整结构化规则见 [good-tile-rules.csv](tables/good-tile-rules.csv)、[corner-rules.csv](tables/corner-rules.csv) 与 [event-reward-tables.csv](tables/event-reward-tables.csv)。
|
||||
|
||||
## 1. 统一进入与退出框架
|
||||
|
||||
```text
|
||||
完成普通移动
|
||||
→ HandlePlayerTileLanding(tile)
|
||||
→ GetETileEvent(ETileEvent)
|
||||
→ ExecuteAsync(tile)
|
||||
→ 锁定下一次掷骰/移动
|
||||
→ 事件 UI 或被动 Corner 状态机
|
||||
→ 结果写入角色/棋盘状态
|
||||
→ 完成动画与回调
|
||||
→ ExecuteAsync 返回
|
||||
→ 恢复棋盘操作
|
||||
```
|
||||
|
||||
自然生成资格先受 `newtile.isEnabled/minStage/minLoop` 过滤;玩家安装地块则来自 `OutGameTile.refNewTileId` 牌组。两条入口进入的是同一事件执行器。`minLoop` 为零基索引,因此 `minLoop=3` 对应内部第 4 个 Loop,而不是可随意解释为 UI 第 3 层。
|
||||
|
||||
原作普遍使用 `isClick/isPicking/isRolling/canGrab/isResetting` 做重复输入保护。没有证据显示 2.0.1 会给局内小游戏建立独立、可恢复的事务快照;因此“进程被杀后精确恢复半局小游戏”不能写成原作规则。复刻时应在结果 RNG 产生后、表现前保存 `eventInstanceId + result + committed`,但这是工程防护,不是逆向确认的原作功能。
|
||||
|
||||
## 2. Good Tile 详细规则
|
||||
|
||||
### 2.1 Chest(141)
|
||||
|
||||
- 条件:启用,`minStage=0/minLoop=0`;默认 Good Tile 牌组也包含其 Rare 版本。
|
||||
- 操作:打开宝箱;一次生成 3 个独立装备实例。装备使用正常局内生成器,因此等级、品质、词条仍服从装备掉落报告,而不是 Chest 专属固定表。
|
||||
- 成败:必定完成,无空奖失败分支。
|
||||
- 奖励:3 件装备同时进入常规掉落/比较流程;是否装备由玩家后续决定,未选择项按正常掉落处理。
|
||||
- 退出:三次生成与飞入表现结束后,事件回调返回;不能在只生成 1–2 件时恢复棋盘。
|
||||
- 异常:打开按钮需幂等;如果资产或生成器异常,原生只有空引用防崩路径,没有补偿表。复刻应把三件实例作为一个原子批次保存。
|
||||
|
||||
### 2.2 Forge(137)
|
||||
|
||||
- 条件:启用,`minStage=0/minLoop=0`;落地创建一件 Normal 候选装备。
|
||||
- 操作:玩家在“直接领取”和“挑战强化”之间选择。强化成功后仍可领取或继续挑战。
|
||||
- 概率:当前 2.0.1/GDD 证据链采用 `80% → 50% → 30% → 10%` 四步。它支持从 Normal 逐步向更高品质推进;Arcane 是否可由 Forge 获得没有闭环,不能擅自加入。
|
||||
- 成功:候选装备升一档,继续显示下一档概率。
|
||||
- 失败:候选销毁,事件立即结束,不获得该装备。
|
||||
- 奖励:只有“直接领取”或最终停止时的当前候选装备。
|
||||
- 异常:强化点击必须在 RNG 结果写入后锁死;返回/重复点击不得重投。社区旧页记录 `80/50/10`,与当前四步版本冲突,本文不采用旧页覆盖 APK。
|
||||
|
||||
### 2.3 Dice Battle(143)
|
||||
|
||||
- 条件:启用,`minStage=0/minLoop=3`;落地打开 `BlackJackView`。
|
||||
- 操作:玩家初始掷 3 颗 D6;可反复 `HIT` 增加一颗或 `STAND`。对手随后自动行动。
|
||||
- 判定:目标是不超过 21 且比对手更接近 21。玩家超过 21 立即失败。原生只有 `UserWin/DealerWin` 两个终局函数,未发现独立 Push 奖励;平局进入 DealerWin 是强推断,需一条平局录像才能升级为确认。
|
||||
- 奖励:首次连胜基础 10 点;`GetCalculatedReward = baseReward × GetStreakMultiplier + accumulatedBonus`。配置提供 2.5、5、10 三档连胜倍率。胜利后可领取或继续;失败丢失尚未领取的连胜奖励。
|
||||
- 退出:领取提交并关闭;继续会重置双方本手、保留 winStreak;失败关闭且无领取。
|
||||
- 异常:`isRolling` 时 HIT/STAND 禁用。奖励在领取时计算,不能在每次胜利同时发放再允许重试,否则会重复产出。
|
||||
|
||||
### 2.4 Lucky Scratch(169)
|
||||
|
||||
- 条件:`minStage=1/minLoop=3`;这也解释了它不会在第 1 关 Stage 0 自然出现。
|
||||
- 操作:奖励先按权重选定,玩家拖动擦除遮罩。`ScratchPainter` 达到 prefab 的 `revealThreshold` 后只触发一次 `OnRevealed`。
|
||||
- 奖励:一等奖 30 点/权重 10,二等奖 10 点/权重 50,三等奖 1 点/权重 40。总权重 100,无空奖。
|
||||
- 退出:揭示并展示奖励后回调结束。局内版本不应把 `GoodEventLotto` 的五次抽签成本带进来。
|
||||
- 异常:`isRevealed` 防重复;`OnDestroy` 清理渲染纹理和订阅。遮罩阈值是 prefab 序列化字段,当前归档没有给出可靠数字,必须以原资产值或实机标定,不能填造百分比。
|
||||
|
||||
### 2.5 Claw Machine(151)
|
||||
|
||||
- 条件:启用,`minStage=0/minLoop=0`;进入时创建物理柜和胶囊。
|
||||
- 操作:抓钩自动横移;15 秒内按一次 `GRAB`,执行下落、闭爪、回程与投放。
|
||||
- 次数:2.0.1 基础值为 1。参考图中的“2 次”属于额外继续按钮;不应当作基础次数。
|
||||
- 胶囊:源表注明布局 20 个胶囊;一件 Legendary 装备为 guaranteed-good,位于底部。其余普通池按 `empty 40 / point 70 / potion 14 / Normal gear 40` 加权。Rare、Epic、祝福、药水祝福基础权重为 0,只有技能/额外状态可注入。
|
||||
- 成功:胶囊进入收集触发器才发对应奖励。夹起后途中掉落仍算失败。
|
||||
- 失败:时间到、回程无胶囊或抽到 empty 均不发奖。
|
||||
- 异常:`canGrab/isResetting` 阻止二次抓取,`OnDisable` 取消移动,奖励在 `OnCapsuleCollected` 触发,不在按键时预发。
|
||||
|
||||
### 2.6 Dicereel(164)
|
||||
|
||||
- 条件:启用,`minStage=0/minLoop=3`。
|
||||
- 操作:启动三格骰面转轮;结果使用 1–6 六种图标。逻辑按任意一对或三连归类,三颗均不同为空奖。
|
||||
- 奖励:完整 13 行映射见 `event-reward-tables.csv`。三连优先于对子;对子行的 `-1` 表示第三颗必须不参与该对,而不是通配后把三连重复结算。
|
||||
- 免费结果:面 3 的对子给 1 次免费转,三连给 2 次;免费次数回到同一状态机,不重复进入地块。
|
||||
- 退出:本次结果动画完成且免费次数为 0 后结束。`isClick/isAnyFail` 防止重复停止或重复发奖。
|
||||
|
||||
## 3. 基础四类 Corner
|
||||
|
||||
### Piggy Bank(126)
|
||||
|
||||
它是跨回合被动容器。只要该 Corner 存在,每次正常双骰掷出对子 `A,A`,向罐内加入 **A** 点,而不是骰子和 `2A`。玩家落到 Piggy Bank 时一次性领取余额并清零。非对子没有失败提示,也不改变余额。
|
||||
|
||||
### Race(127)
|
||||
|
||||
落地后启动 3-roll 计数。玩家继续执行普通棋盘掷骰;在三次内到达/跨过 Start 即成功,获得 1 件 Legendary 局内装备。第三次结算后仍未到达则失败、无奖励。`TryAddCornerRace` 表明竞速不能叠加创建;成功或失败均清除覆盖层与计数。
|
||||
|
||||
### Flower Garden(128)
|
||||
|
||||
落地后把“前方下一整行”所有可转换普通格改成 Chest。它没有骰子判定、失败率或额外领取按钮。Corner、Start 与受保护地块不是转换目标。公开说明的“every tile”应理解为该行可变地块,而不是覆盖角落/起点控制格。
|
||||
|
||||
### Housing Support(129)
|
||||
|
||||
落地后玩家掷两颗独立 D6,以和 `A+B` 作为建房尝试数,在下一行的可用格建房;实际数量受可用格上限限制。随后按实际建成数给点数。原生分支确认双骰、位置映射、逐项建造和奖励阶段,但 APK 暴露表中没有房屋数到点数的可读映射,本地化 bundle 也只含空壳 `New Table_en`;因此“每房 1 点”只能作为实现候选,不能标成原作确认值。该项是本报告唯一会影响奖励量的残余未知。
|
||||
|
||||
## 4. 异常与恢复验收矩阵
|
||||
|
||||
| 场景 | 原作证据支持的行为 | 复刻验收要求 |
|
||||
|---|---|---|
|
||||
| 连点进入/结果按钮 | 各视图有 click/rolling/picking 状态锁 | 同一事件实例只生成一次结果 |
|
||||
| 切后台 | 异步状态仍等待;Claw 可取消移动 | 恢复时显示既定结果,不重抽 |
|
||||
| 动画中退出 | 原作无独立安全点证据 | 表现可重播,资源不可重发 |
|
||||
| 奖励生成异常 | 原生以空对象检查为主,无补偿表 | 保持事件未提交并允许安全重试 |
|
||||
| Claw 夹取途中销毁视图 | OnDisable 取消、未进收集区不发奖 | 不根据“抓钩曾接触”发奖 |
|
||||
| Scratch 重复达到阈值 | isRevealed 单次触发 | OnRevealed 必须幂等 |
|
||||
| Race 中断 | 未发现独立 race checkpoint | 复刻需保存 rollsLeft/active/rewarded |
|
||||
| Corner 批量改格中断 | 未发现半批次恢复 | 目标列表和改格结果应原子提交 |
|
||||
|
||||
## 5. 证据、冲突与残余未知
|
||||
|
||||
Evidence → Finding → Design:
|
||||
|
||||
1. `newtile/outgametile/outgametileskill` 与三个小游戏配置表 → 事件 ID、门槛、基础值、奖励映射 → 结构化规则表。
|
||||
2. IL2CPP metadata 与 31 个 ARM64 方法切片 → 独立事件类、输入锁、状态回调、奖励函数 → 状态机与异常矩阵。
|
||||
3. 用户 `局内说明/局内_part4` → Chest 三装备、Forge 80% UI、Scratch 30/10/1、Claw 额外次数层级 → 纠正旧 GDD 假设。
|
||||
4. 社区 Tiles 页 → 自然语言名称、Race 三次、Corner 效果、Chest 三件与旧版 Claw/Forge 文本 → 仅作语义交叉验证,不覆盖 2.0.1 配置。
|
||||
|
||||
残余未知只有两项:Housing Support 的精确点数换算;Dice Battle 平局是否由 DealerWin 处理。它们已明确标记,未用近似值冒充逆向结论。
|
||||
|
||||
公开交叉资料:[Heroll Wiki – Tiles](https://heroll.fandom.com/wiki/Tiles)。
|
||||
@@ -0,0 +1,12 @@
|
||||
# 02-地块与事件
|
||||
|
||||
Good Tile、Corner、事件奖励及运行规则。
|
||||
|
||||
## 文件
|
||||
|
||||
- [2026-09-01_逆向-HEROLL-GoodTile与Corner规则-report.md](./2026-09-01_%E9%80%86%E5%90%91-HEROLL-GoodTile%E4%B8%8ECorner%E8%A7%84%E5%88%99-report.md) — report;来源:`analysis/tile-event-rules/2026-09-01_逆向-HEROLL-GoodTile与Corner规则-report.md`
|
||||
- [corner-rules.csv](./corner-rules.csv) — table;来源:`analysis/tile-event-rules/tables/corner-rules.csv`
|
||||
- [event-reward-tables.csv](./event-reward-tables.csv) — table;来源:`analysis/tile-event-rules/tables/event-reward-tables.csv`
|
||||
- [good-tile-rules.csv](./good-tile-rules.csv) — table;来源:`analysis/tile-event-rules/tables/good-tile-rules.csv`
|
||||
|
||||
模块内Markdown与CSV均来自同一v0.2.8规则域;跨模块综合报告会在相关模块中保留副本。
|
||||
@@ -0,0 +1,9 @@
|
||||
tile_id,source_id,display_name,group,min_stage,min_loop,entry,player_input,success_failure,reward_or_effect,exit_exception,confidence
|
||||
126,CornerDoubleStack,Piggy Bank,core_four,0,0,"corner exists on board; doubles are observed globally while it is present","none while charging; land on the bank to collect","no fail state; a non-double adds nothing","each double A=A adds A points to the bank, not 2A; landing transfers the full stored balance to player points and resets it to zero","passive state survives ordinary tile events; collection is one settlement; duplicate receipt must not pay twice",high
|
||||
127,CornerRace,Race,core_four,0,0,"landing starts a race only when no race is already active","make normal board rolls and reach/pass the Start tile within the next 3 rolls","success on reaching Start within 3 rolls; fail when the third roll ends without reaching Start","success gives one Legendary in-run gear; failure gives nothing","TryAddCornerRace prevents stacking; success/fail clears race overlay and counter; interrupted run has no separately proven race checkpoint",high
|
||||
128,CornerOneLineChest,Flower Garden,core_four,0,0,"landing resolves the next board row/line","no choice; transformation animation plays","no random failure","every transformable ordinary tile in the upcoming row becomes Chest; corner/start/protected tiles are not targets","event ends after line transformation; if no eligible target, it completes with zero changes; partial-animation crash behavior is not source-confirmed",high for effect; medium for empty-candidate fallback
|
||||
129,CornerDiceBuilding,Housing Support,core_four,0,0,"landing opens its two-dice construction event","roll two independent D6 once","no random failure; constructed count is capped by eligible spaces in the upcoming row","attempt to build A+B houses in the upcoming row and grant points according to actual houses constructed; exact point lookup/multiplier was not recoverable from exposed CSV/localization","dice/result input is single-flight; finishes after construction/reward animation; seed and chosen positions must be persisted in a reproduction",high for construction; partial for point amount
|
||||
125,CornerKillOneLineEnemy,Wall of Thorns,additional,0,0,"landing resolves upcoming row","none","no fail state","reduce enemy count on every Enemy tile in upcoming row by 1; zero-enemy tiles are not decremented below zero","immediate callback after mutation",high
|
||||
131,CornerBlackMarket,Black Market,additional,0,3,"eligible from zero-based loop 3; landing opens market","buy with points or exit","purchase only if affordable and not sold out","higher-price shop inventory; no reroll","purchase updates total and inventory; close cleans listeners",high
|
||||
167,CornerDiceCatapult,Dice Catapult,additional,0,5,"eligible from zero-based loop 5","event-specific launch input","not part of the requested core four; detailed reward path remains outside this work item","see source event class","normal event callback",not analyzed
|
||||
175,CornerWarp,Warp,additional,0,3,"eligible from zero-based loop 3; at most 3 per game by config","none","no fail state","move hero to a random board space and resolve warp movement rules","movement uses WarpTile visual/state path; destination-event chaining requires focused capture",medium-high
|
||||
|
@@ -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,7 @@
|
||||
tile_id,source_id,display_name,min_stage,min_loop,entry,player_input,success,failure,reward,exit,exception_handling,confidence
|
||||
141,GoodEventChest,Chest,0,0,"land on installed/eligible tile; board movement is suspended","open chest; inspect three generated gear items; equip or leave each item","chest opening completes and all three gear instances are generated",none,"3 random in-run gear instances through the normal gear generator","event callback returns after spawn animation; gear decisions remain in the normal drop UI","open is debounced; no reward is committed before generation; no source evidence for mid-event crash restoration",high
|
||||
137,GoodEventSmithy,Forge,0,0,"land on installed/eligible tile; a new Normal gear instance is created","claim current item or challenge the next rarity; after success choose again","upgrade roll passes the current 80/50/30/10 step and the same item advances one rarity","failed upgrade destroys the candidate and ends the event","claimed candidate gear; failed candidate gives no gear","claim or failure resolves callback and returns to board","challenge is single-flight; result must be stored before animation; current binary exposes four steps but Arcane eligibility is not proven",high
|
||||
143,GoodEventBlackJack,Dice Battle,0,3,"tile is naturally eligible from zero-based loop 3; landing opens Deoksoon view","start with 3 dice; choose HIT to add one D6 or STAND; after a win collect or rematch","not bust and final total beats dealer while approaching 21","sum over 21 loses; native has only UserWin/DealerWin and no independent push reward path","first consecutive win 10 points; later wins use streak multipliers 2.5x/5x/10x; losing forfeits unclaimed streak reward","collect closes and commits; rematch resets hand but preserves streak; loss closes without reward","isRolling disables duplicate HIT/STAND; reward is calculated at claim; dealer tie policy is strong inference to DealerWin, pending one focused capture",medium-high
|
||||
169,GoodEventSpito,Lucky Scratch,1,3,"only Stage >=1 and zero-based loop >=3; landing opens a single scratch card","drag over the cover until ScratchPainter reaches revealThreshold","cover threshold reached; preselected prize is revealed","no losing outcome; the lowest prize is 1 point","30 points at 10%; 10 points at 50%; 1 point at 40%","reveal invokes the completion callback; tap/close returns after reward display","isRevealed prevents duplicate callbacks; OnDestroy releases scratch resources; prefab revealThreshold remains unresolved; no mid-card crash recovery evidence",high
|
||||
151,GoodEventClawGrab,Claw Machine,0,0,"land on installed/eligible tile; cabinet creates its capsule layout","within 15 seconds press GRAB once while claw auto-moves; drop/close/return is automatic","a capsule crosses the collection trigger and its payload is granted","timer expires or claw returns without a capsule; empty capsule also grants nothing","20-capsule source pool; one guaranteed Legendary gear capsule at the bottom; remaining normal pool weights empty40/point70/potion14/common gear40; base attempt 1","after return/reset and no remaining attempts, event callback returns","canGrab/isResetting debounce input; OnDisable cancels movement; reward commits only on collection trigger; community two-play text conflicts with current 1,15 config",high for current APK
|
||||
164,GoodEventDiceMachine,Dicereel,0,3,"tile is naturally eligible from zero-based loop 3; landing opens three reels","press reel control; three faces resolve; free-spin results repeat the same flow","pair or triple pattern matches a dicemachine row","all three faces different grants none","pair/triple: face1 point5/20; face2 Normal gear1/Rare gear1; face3 free spin1/2; face4 blessing1/2; face5 good tile1/3; face6 potion1/3","when result animation and any free spins finish, confirm/end callback returns to board","isClick/isAnyFail prevent duplicate finish; rewards spawn by typed dispatch; no source evidence for restoring a partially spinning reel after process death",high
|
||||
|
Reference in New Issue
Block a user