Files
HEROLL/HEROLL_RULES_v0.2.8/03-建筑/Housing Support逆向依据.md
T

11 KiB
Raw Blame History

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、corner-rules.csv 与 event-reward-tables.csv。

1. 统一进入与退出框架

完成普通移动
  → 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。