系统拆解报告 · Frost Valley 1.12.0 · com.liteorange.hometopia

Frost Valley 系统拆解

从策划视角拆解这款"合成 + 章节式家园修复"游戏的五大系统:合成玩法、家园与叙事、LiveOps 活动、商业化,以及合规与运营控制。数值都来自 APK 内置的默认配置,线上可能被远程配置或 AB 实验覆盖。

7 × 9合成棋盘
6 / 10生成器链 / 产物链
71 章默认开启,共 1,131 个建造点
200 级等级上限,默认内容最多到 83 级
33LiveOps 活动,28 天循环
122IAP SKU
291已解码的配置表
01

合成玩法

数据口径:包内默认配置(extracted/config/tables/*.json,表名即文件名)。线上可能被远端配置 / AB 覆盖。 标注:【确认】 = 配置值或代码(反编译 / ISIL)直接可见;【推断】 = 由字段名、数值关系或部分代码推出,未完全核实。 绘图数据:同目录 ch1-data.json(主链逐级 Price/EquivEnergy、ForceBlock 等级段、倍率、仓库价格、泡泡、Lucky 等)。


1.1 棋盘与新手初始盘

1.1.1 棋盘规格

  • 【确认】7 列 × 9 行 = 63 格,常量 BlueMergeCorePlayGame.Width=7 / Height=9;初始盘表 MergeNewUserBoardConfig_Board 为 9 行 × Column1..7。
  • 【确认】格子是一维下标,所有棋子同处一张持续存在的棋盘,没有关卡切换;进度靠玩家等级推进(等级来自家园剧情建造花金币)。
  • 【确认】棋盘外的容量:仓库(2 级开放,见 1.7.2)、顶部礼物区 StorageGiftsService(奖励无空位时暂存)。

1.1.2 新手初始盘(MergeNewUserBoardConfig_Board)

初始 63 格全部有内容:60 格压在障碍下,开局只有 3 格可直接操作。

行\列 1 2 3 4 5 6 7
1 ClothingA05 FlowerGenerator05 ClothingGenerator02 ClothingTrans01 FlowerA03 FoodB05 FruitB05
2 FlowerGenerator02 FruitA05 FoodB04 FruitGenerator03 FlowerA01 ClothingGenerator04 FlowerA06
3 FruitA02 FoodB01 FoodA04 FoodB02 FoodA06 FruitB01 FlowerA04
4 FoodA03 CoinChess01 FoodGenerator01(无障碍) FoodA05 FoodB01 FoodA07 FruitB02
5 FoodB03 FoodA07 FoodGenerator01(无障碍) FoodGenerator02(仅半障碍) FoodA02 FoodB03 FoodB02
6 FoodB02 FruitA01 FoodA05 FoodGenerator03 FoodA03 FruitA04 FruitA03
7 FlowerGenerator02 ClothingGenerator01 FoodB02 FoodA06 FoodA04 FruitGenerator02 ClothingTrans03
8 FoodA10 FruitB02 FruitGenerator01 FoodGenerator02 FoodGenerator01 CoinChess04 FlowerA05
9 ClothingA07 GemChess03 FlowerGenerator01 FruitB03 ClothingA05 FoodA09 FruitA10
  • 【确认】障碍定义 MergeNewUserBoardConfig_Blocker:
    BlockID 资源 类型 覆盖格数
    BlockerA_01 ~ A_05 SnowBox2A01~05(雪箱) full(完全遮挡) A_04:14、A_02:13、A_01:12、A_03:12、A_05:9
    BlockerB_01 BlockerTest02 half(半遮挡) 61 格(与 A 叠加)
    RewardBlocker_01~06 Yellow/TransparentBubble01 reward(奖励障碍) 初始盘未引用
  • 每格的 BlockID 是列表,绝大多数格子同时挂 BlockerA_0x + BlockerB_01,即"雪箱在上、半遮挡在下"两层。
  • 【确认】MergeNewUserBoardConfig_RewardBlocker 定义了 6 个奖励障碍的奖励:Energy_20 / 10 / 30 / GemChess04 / Energy_50 / Energy_100;初始盘所有格 ProgressRewardID=null,本版默认盘没有放置奖励障碍(这些配置供其他盘面或远端配置使用,【推断】)。
  • 开局可用资源:2 个 FoodGenerator01 + 1 个 FoodGenerator02(都低于可用等级 04,需要先合成)、初始资产 Coin 66 / Energy 100 / Gem 30(MergeAssetInfoConfig_AssetInfo),1 级奖励直接给 FoodGenerator04 + Energy_100(MergeLevelConfig_LevelCostReward)。
  • 盘面内容设计:障碍下压着的是各链 1~10 级棋子、5 条链的生成器碎片、金币/钻石棋子,解锁后直接成为可合成或可交付的资源(例如 FoodA10、FruitA10 埋在最下一行)。

1.2 生成器与产物链

生成器链(满级) 可用起始级 产物主链(满级) 共生链(满级) 备注
FoodGenerator(11) 04 FoodA(15) FoodB(7) 低级 01~03 是碎片,只能合成
FruitGenerator(11) 04 FruitA(14) FruitB(7) 同上
JoyGenerator(11) 05 JoyA(11) JoyB(7)
ClothingGenerator(11) 05 ClothingTrans(5)→ ClothingA(10) — 两段式:生成器出 Trans,Trans05 是"转化器"
FlowerGenerator(10) 06 FlowerA(7) — 自动生成、不耗体力
ToyGenerator(11) 05 ToyA(12) —
  • 【确认】CorePlayChessGenerateLink:A 链 MainChain=true,B 链 MainChain=false 且与 A 互为 SymbioticChain(共生链);ClothingTrans 与 ClothingA 都标为主链、互为共生;Flower、Toy 无共生链。
  • 【确认】MergeChessConfig_GeneratorSpaceChess 列出了各生成器 01~0x 碎片对应的"成品"等级(Food/Fruit→04,Clothing/Joy/Toy→05,Flower→06),与 MergeChessGeneratorInfo 中最低一条可用配置一致。生成器碎片收集功能 GeneratorSpaceSwitch=false(30 级解锁,本版关闭),碎片只能在棋盘上逐级合成。
  • 其余链(56 条)为资源/道具:CoinChess 5 级、GemChess 4 级、EnergyChess 5 级、LevelUP/LevelDownChess、6 种 CardPack、约 30 种宝箱/礼包/通行证道具/ChainPack。

1.2.2 生成器参数(MergeChessConfig_MergeChessGeneratorInfo,43 行)

字段语义:ChessGenerateMax = 一轮可点次数;用完进入 CD ChessRecoverCD(秒);ChessSpeedUPCost = 跳过 CD 钻石;StorageMax/StorageRecoverCD/StorageSpeeUPCost = 储存池上限/恢复/加速;BasicEnergyConsume = 单次基础耗能;AffectedByEnergyHelper = 是否吃体力倍率;GeneratorType 1=普通,2=转化器。

生成器 级 次数/轮 CD(s) 加速钻 Storage 上限/CD(s)/加速钻 耗能 吃倍率 自动
FoodGenerator 04 80 2 1 240 / 30 / 1 1 是 否
05 80 30 1 240 / 60 / 1 1 是 否
06–11 80 180 3 240 / 300 / 5 1 是 否
FruitGenerator 04 80 2 1 240 / 120 / 2 1 是 否
05 80 30 1 240 / 300 / 5 1 是 否
06–11 80 180 3 240 / 300 / 5 1 是 否
JoyGenerator 05–11 36 180 3 108 / 300 / 5 1 是 否
ClothingGenerator 05–11 26 180 3 78 / 300 / 5 1 是 否
ClothingTrans(转化器) 05 12 0 0 0 / 0 / 0 1 是 否
ToyGenerator 05–11 42 180 3 126 / 300 / 5 1 是 否
FlowerGenerator 06 6 3600 55 12 / 7200 / 97 0 否 是
07 8 4800 68 16 / 9600 / 121 0 否 是
08 10 6600 88 20 / 13200 / 165 0 否 是
09 12 9600 121 24 / 19200 / 234 0 否 是
10 12 9600 121 24 / 19200 / 234 0 否 是
  • 规律【确认】:StorageMax 恒为 ChessGenerateMax × 3(Flower 为 ×2);Food/Fruit 的 CD 在 04/05 级很短(新手期几乎无 CD),06 级起统一 180 s。Food/Fruit 是"体力消耗主力"(80 次/轮),Joy/Toy/Clothing 次数少(26–42 次),产能受 CD 约束更明显。Flower 不耗体力,靠时间产出,加速费用高(55–234 钻)。
  • 【确认】MergeChessConfig_Main:GeneratorChessSellSwitch=true(生成器可卖)、GeneratorSellConfirm / OrderChessSellConfirm / HarderChessSellConfirm=true(卖生成器、订单需要的棋子、难棋时二次确认)。

1.2.3 产出权重(Main / SecondGenerateWeight,ChessPower)

生成器级 Food(A 主 ∣ B 共生) Fruit Joy Clothing(Trans) Toy Flower
04 A01 100 A01 1000 — — — —
05 A01 350 / A02 20 ∣ B01 50 A01 370 ∣ B01 50 A01 1000 T01 1000 A01 1000 —
06 A01 340 / A02 20 / A03 10 ∣ B01 50 同 Food A01 340 ∣ B01 30 T01 900 / T02 100 A01 950 / A02 50 A01 100
07 330/30/10 ∣ 50 同 Food A01 330 / A02 10 ∣ B01 50 850/150 900/100 A01 900 / A02 100
08 320/40/10 ∣ 50 同 Food 340/10/10 ∣ 60 850/100/50 900/80/20 800/200
09 310/50/10 ∣ 50 同 Food 330/20/10 ∣ 60 820/130/50 890/80/30 750/250
10 310/40/20 ∣ 50 同 Food 320/30/10 ∣ 60 800/150/50 880/90/30 800/150/50(A03)
11 310/40/20 ∣ B01 40 / B02 10 同 Food 320/30/10 ∣ B01 50 / B02 10 800/150/50 ∣ ClothingA01 200 870/90/40 —
ClothingTrans05 — — — ClothingA01 950 / A02 50 — —
  • 读法:生成器升级不改变次数和耗能,只把权重从 01 级挪向 02/03 级,同时出共生链。以 FoodGenerator 为例,B 链占比 ≈ 50/420 ≈ 12%;单次点击期望得到的 A 链"折合 A01 个数"从 05 级的 0.93 提高到 11 级的 1.12(A02 折 2 个、A03 折 4 个 A01;剩余概率出 B 链。按配置权重计算,未考虑 DDA/Lucky 修正)。
  • 主/副权重如何合并抽取、倍率档位如何改变产物等级,见 1.4.3(代码确认部分)。

1.2.4 产物链数值(MergeChessConfig_CorePlayChessConfig,160 行)

主链逐级 Price / EquivEnergy 见 1.8;全量行(含 SellPrice、DiffScore、OrderUnlockLevel、SmileRewardChess)在 ch1-data.json → chains。要点【确认】:

  • 01/02 级 Price=0、EquivEnergy=0:最低两级不能当订单需求(OrderChessWeight 从 03 级开始)。
  • OrderUnlockLevel:FoodA 1 级、FruitA 3 级、Clothing 6 级起、Flower/Joy 9 级、Toy 10 级开始进入订单;每条链越高级解锁越晚(JoyA07 18 级、ToyA11 41 级);FoodA12+/FruitA12+/ToyA12 为 100 = 不进普通订单(OrderChessWeight.DefaultWeight=0),这些是 InstantOrderChess 顶级件(见 1.5.8)。
  • SellPrice:非常低(FoodA15 仅 11 金币,生成器 0–9 金币),卖出只是清格子用。

FoodA 主链逐级数值对数坐标。等价体力约每级翻倍,订单金币的增长比它慢。
等价体力 EquivEnergy订单金币 Price
1101001k10k100k123456789101112131415FoodA 等级

1.3 合成规则与特殊棋子

1.3.1 基本合成【确认,MergePlayGame.IsCanMerge / ExecuteMerge ISIL】

  1. 同链(ChessChain)同级(ChessLevel)且未满级(< MaxChessLevel)才能合;结果 = 目标格等级 +1,源格消失。
  2. 两格不能都在障碍下;被半遮挡(InObstaclePart)的棋子可以作为合成目标。
  3. 普通宝箱已经点开过(NowClickCount>0)就不能再合。
  4. 合成后 EnergyConsume 累加两者的体力消耗(记录这颗棋子"真实花了多少体力"),刷新时间戳。
  5. 合成后依次:解障碍 BlockerUnLock → 泡泡判定(1.7.1)→ 资产泡泡 → 一次性补丁(如 isMerge8GiveCoin)。
  6. 拖拽落点:仓库图标 → 存仓;可合成 → 合成;升/降级道具 → 道具逻辑;否则交换或弹回。支持"甩动"合成(_enableFlickMerge)。
  7. 生成产物落点规则 GetGeneratorManualLandingRule:GeneratorCenter / SameChain / SameChessAndChain / Random(【确认】枚举;各生成器用哪条规则未细查)。

1.3.2 障碍解锁【确认 + 推断】

  • 三种状态:InObstacleFull(雪箱,不可点/拖)、InObstaclePart(半遮挡,可作为合成目标)、InObstacleReward(奖励障碍,解开得 RewardBlocker.Reward)。
  • 在障碍格(或相邻格,【推断】)上完成一次合成触发 ReduceBlocker:Full → Part → None 逐层剥离;每次解锁有埋点 ReportBoardSpaceUnlock / ReportRewardBlockerUnlock;奖励障碍的奖励进入 BlockerRewardService 待发队列,由弹窗流程发放。
  • 初始盘双层设计(BlockerA full + BlockerB half)意味着同一格通常需要两次相关合成才能完全释放。

1.3.3 宝箱(MergeChestGachaConfig_ChestChessInfo 48 种,OrderRewardChest 3 种,TripleChoiceChestInfo 10 种)

  • 机制【确认】:宝箱是棋盘上的一颗棋子。UnlockTime>0 的要先倒计时解锁(可花钻 UnlockSkipGemCost 跳过,全局 MergeChestGachaConfig_Main.UnlockSkipGemCost=1),之后点一次吐一个物品,共 MaxClick 次;RewardContent = 固定清单(按 Count 给),RewardBackContent = 加权池(按 Weight 抽)。
  • 代表行:
宝箱 解锁(s) 点击次数 内容
RedChest01(14 级起每级奖励) 480 8 固定:FoodGenerator01×2、FruitGenerator01×1、ClothingGenerator01×1、CoinChess01×2、GemChess01×2
GreenChest01 480 8 固定:JoyGenerator01×2、FlowerGenerator01×1、ToyGenerator01×1、CoinChess01×2、GemChess01×2
Red/GreenChest02 1200 12 02 级碎片 + Coin/GemChess01~02
EnergyChest01(5 级起每级奖励) 0 5 池:EnergyChess01 40 / 02 30 / 03 20 / 04 10 → 期望 9.6 体力/次,约 48 体力/箱
CoinChest01 / GemChest01 0 5 池:Coin/GemChess01~04 = 40/30/20/10
DailyChest01/02/03 5 5/12/24 Coin/EnergyChess 低级为主
StarterChest01(5 级新手奖励) 0 10 FoodA/FruitA 03~05
TutorialChest01 0 6 CoinChess01×2、02×1、GemChess01×2、02×1
CoreplayChest01~03 0 7 某两三条链的 02~05 级
RoyalChestA~E 0 10/12/15/19/24 Coin/Gem/EnergyChess 混合
FoodChainPack 等 6 种 ChainPack 0 6 指定链 03~05 级(含共生链)
  • 三选一宝箱(TripleChoiceTreasure):GeneratorChest01/02(三选一生成器碎片)、OrderChoiceChest01~04(订单级棋子 04~08 级)、PickChestA/B、FancyPickChestA/B(A 链 7/8 级或 Joy/Toy 5/6 级)。
  • 订单奖励箱(OrderRewardTreasure):OrderChestA01/B01/C01,内容为 Food/Fruit 04~07 级等权池。

1.3.4 升/降级道具(MergeChessConfig_LevelChess)

  • 【确认】LevelUPChess(Feature=up)、LevelDownChess(Feature=down),各 1 级。拖到目标棋子上触发 TryHandleLevelChessEndDrag → ApplyLevelUp / ApplyLevelDown;满级不能升(IsMaxLevel)。
  • 【确认】降级道具有自己的 Addon LevelDownChessData,子类 IsCanMerge 先判 IsLevelDownChessMerge。【推断】降级会把一颗 N 级拆成两颗 N-1 级(常见设计,降级可"复制"出订单需要的下级件),未在代码中逐行核实。

1.3.5 资源棋子(MergeChessConfig_AssetChessInfo)

点两次(选中 → 再点)即领取并销毁(OnClickUseAsset),同链可以合成升级:

级 CoinChess(金币) GemChess(钻石) EnergyChess(体力)
01 2 1 2
02 6 3 6
03 14 7 15
04 30 15 40
05 62 — 100
  • 合成溢价:两颗 N 级合成 N+1 级,金币 2→6→14→30→62 每级都"大于两倍"(+2 余量),体力 2→6→15→40→100 溢价更大(EnergyChess04→05 两颗 80 换 100)。【推断】这鼓励玩家先合再领,同时占格子。

1.3.6 卡包(MergeChessConfig_CardChess + ActivityCardCollection_*)

  • 6 种卡包棋子:Green/Blue/Red/Yellow/Purple/Special,再点打开(TryOpenSelectedCardPack)。EnergyExchange 分别为 10/15/20/80/100/0(【推断】集卡活动未开时折算成体力)。
  • 发放【确认】:订单提交后 CardCollectionInstance.GrantOrderCardPacks,按订单 DiffScore 区间发包(ActivityCardCollection_OrderCard):DiffScore 9999–19999→Green,29999–39999→Blue,49999–59999→Red,69999–79999→Yellow,89999–99999→Purple,≥199999→Special。【推断】区间远高于单张订单 DiffScore(FoodA15 仅 3000),可能是按累计值或活动内另一套计分,需要另查。
  • 星星兑换 StarChangeNum:2/4/6/16/24/30。

1.4 体力系统

1.4.1 上限与恢复【确认,MergeEnergyConfig_Main】

  • 自然恢复上限 MaxEnergyRecovery=100;每 EnergyRecoveryInterval=120 秒回 EnergyRecoveryCount=1 点 → 每小时 30 点,0→100 需 200 分钟,一天理论自然恢复上限 720 点。
  • 上限只限制自然恢复,宝箱、购买等途径可以把体力堆到 100 以上(×8 倍率要求体力 ≥400,说明设计上允许高于上限,【推断】)。
  • 初始体力 100(MergeAssetInfoConfig_AssetInfo)。

1.4.2 倍率档位【确认,MergeEnergyConfig_EnergyBoost + GetEnergyConsume 反编译】

档位 倍率 单次耗能(Basic=1) 解锁等级 额外条件
1 ×1 1 — —
2 ×2 2 16 —
3 ×4 4 30 —
4 ×8 8 30 当前体力 ≥ 400(EnergyRequirement=400)
  • 耗能公式 BasicEnergyConsume << (档位-1)(反编译确认)。只对 AffectedByEnergyHelper=true 的生成器生效(Flower 不受影响,转化器 ClothingTrans05 受影响)。
  • 倍率由底栏 EnergyBetIconView 切换,记在存档 BlueMergeEnergyConsumeRatioKey。

(倍率对产出等级的影响见 1.4.3)

1.4.3 倍率与产出

一次点击的判定顺序【确认,BlueMergeCorePlayGame.TryResolveGeneratorProduceResult】: Lv5Patch(首次生成一次性替换)→ DDA 方向 → 高倍降级 DownLevel → 体力是否足够(不足弹购买)→ Fv 模型 → 普通产出(SpecialLucky → Lucky → 普通加权)

普通产出的两段抽取【确认,BlueMergeGameConfigLogic.GetGenerateSelectedChain / GetGenerateRealMetaByChain】:

  1. 选链:主链权重 = Σ MainGenerateWeight;副链(共生链)权重 = Σ SecondGenerateWeight + max(0, 计数器 × makeUp),两者在同一个池里加权随机。副链列表为空时直接出主链。
    • 计数器:全局一个(不分生成器),出副链清零,出主链就加上本次耗能(1/2/4/8)。即"越久没出共生链,共生链概率越高"。
    • makeUp 默认 SubChainMakeUp=1;DynamicMakeUpSwitch=true 时由动态补偿改写(DynamicGenerateCompensationLogic,MergeChessConfig_GeneratorMakeUp):记录每个生成器最近 WindowPeriod=10 次产出的主链占比,占比 ≥ SubRng=0.8 且订单里副链有缺口 → makeUp=HighSubChainMakeUp=20;订单里副链没有缺口 → makeUp=LowSubChainMakeUp=0;其余保持 1。
    • 例(FoodGenerator06,主 370 / 副 50):默认每耗 1 体力副链权重 +1;高补偿状态下每耗 1 体力 +20,约 15 次主链后副链权重翻到 350,与主链相当。
  2. 选等级:在选中链的列表里按 ChessPower 加权;较高级候选的权重 = round(Power × criticalRatio) + CriticalMakeUp × 计数(CriticalMakeUp=0,criticalRatio 平时为 1、DDA Help 时为 1.5)。

倍率抬高产出等级【确认,GetNormalGenerateChessGenerate】:产出等级 = 抽中等级 + (档位 − 1),超过满级则截到满级。

档位 耗能 产出等级偏移 体力对价
×1 1 +0 1 体力 ≈ 1 个 01
×2 2 +1 2 体力 ≈ 1 个 02(= 2 个 01)
×4 4 +2 4 体力 ≈ 1 个 03
×8 8 +3 8 体力 ≈ 1 个 04
  • 结论:倍率在体力价值上是等价交换(体力 ×2^n,产物也 ×2^n 个 01 当量),省的是点击次数和合成次数(以及格子),不省体力。Lucky 的产出也一样加 (档位−1)。
  • 【推断】次数池按"点击"扣(一次点击扣 1 次 ChessGenerateMax),如果成立,高倍率下每轮能换出的总当量翻倍,CD 约束会相对变松。
  • 高倍降级补偿 DownLevel【确认】:DownLevelGenerateCompensationSwitch=true 且档位 >1 时,从 L=1 到 档位−1 逐级检查"棋盘上该链 L 级数量 − 订单需求数量",结果为奇数或负数(即缺一颗凑对 / 订单缺这一级)就改为产出 L 级。作用是避免高倍率下低级件凑不成对。降级产出时的扣费细节未确认。

次数池与储存池【推断】:ChessGenerateMax 为每轮次数,用完进入 ChessRecoverCD;StorageMax / StorageRecoverCD 为额外的储存次数,按 CD 回复;两者都可花钻加速(ChessSpeedUPCost / StorageSpeeUPCost)。广告位 GeneratorRecharge(5 级、每日 5 次)可看广告恢复生成器(AdConfig_Reward)。

1.4.4 体力来源汇总

来源 数值 证据
自然恢复 1 点/120 s,恢复到 100 为止 MergeEnergyConfig_Main
初始 100 MergeAssetInfoConfig_AssetInfo
升级奖励 1 级 Energy_100、2 级 150、3 级 150、4 级 100(合计 500);5 级起每级 1 个 EnergyChest01(期望 ≈48) MergeLevelConfig_LevelCostReward
新手等级奖励 3–10 级每级 Energy_20(共 160,11 级条目关闭) MergeTutorialConfig_NewUserReward
钻石购买 每次 +100,价格 10/20/40/80/160 钻(每日第 1~5 次,翻倍) MergeEnergyConfig_EnergyRecharge,EnergyPurchaseService
广告补体力 AdRestoresEnergy=25/次,EnergyRefill 广告位 5 级开放、每日 15 次 AdConfig_Main、AdConfig_Reward
广告资产泡泡 Energy_30(3 个策略,日上限 5/5/20)或 Gem_10(日上限 7);12 级开放、每日 30 次、AssetBubbleChance=0.5、CD 60 s、棋盘同时 1 个 AdConfig_AssetBubble、AdConfig_Main
体力棋子 EnergyChess01~05 = 2/6/15/40/100 MergeChessConfig_AssetChessInfo
宝箱 EnergyChest01(≈48)、DailyChest、RoyalChest 等 MergeChestGachaConfig_ChestChessInfo
活动 Gacha 如 GachaEnergyLottery 200–400、MonopolyLike Energy_200/300/500、RoundDuel 25/35/50 MergeChestGachaConfig_AssetGacha / MixedGacha
奖励障碍 Energy_10~100(本版初始盘未放置) MergeNewUserBoardConfig_RewardBlocker
内购 体力通行证 IAPEnergyBattlePass_*、礼包(见商业化章节) —

1.5 订单系统

1.5.1 托盘数与解锁

  • 【确认】MergeOrderConfig_Main.MaxTrayCount=6,MergeOrderConfig_TrayCount 各等级段均为 6:同屏最多 6 张订单。
  • 托盘有 8 个(MergeOrderConfig_TrayStrategy),按 UnlockLevel ≤ 玩家等级 过滤后由权重排序填充(OrderConfigService.BuildStrategyFicationList)。新手期(1–8 级)改由 MergeTutorialConfig_TutorialTrayUnlock 指定可用托盘(BuildNewUserUnLockStrategyList):
等级 1 2 3 4–5 6–8
可用托盘 2 2,4 2,4,6 2,4,5,6 2,3,4,5,6

1.5.2 托盘策略串

托盘 解锁级 策略串 TrayWeight SmileWeight
4 3 TutorialFixed03 | Daily01 8 1006
6 3 TutorialFixed04 | NewMole01 | Mole02 | Daily03 7 1004
5 3 TutorialFixed02 | Mole01 | Daily02 6 1005
1 10 NewMole04 | Main01 5 1003
2 7 TutorialFixed01 | NewMole02 | Mole03 | Main02 4 1008
3 12 NewMole03 | Mole04 | Main03 3 1007
7 3 Side01 2 1002
8 3 Special01 1 1001

执行方式【确认,BlueMergeCorePlayOrder.OrderFillStrategyFication】:

  1. 托盘按 TrayWeight 降序(笑脸活动期间改用 SmileWeight);跳过已有订单的托盘。
  2. 策略串按 | 拆开,逐项检查是否可用:TutorialFixed 只在新手订单没发完时保留;Mole/NewMole 需要对应活动开启且并发未满;然后检查当日上限 GetTodayStrategyGenerateCount 和策略 CD GetStrategyCooldownRemain。
  3. 第一个可用的策略出单:新手策略走 AddOrderByNewUser,其余走 AddOrderByLogic → GenerateOrderByOrderLevelRandom。
  4. 订单提交时 StartOrderStrategyCooldown(strategyID) 开始该策略的刷新 CD。
  • 【推断】策略串不是"完成 N 次后切换",而是"前面的不可用就落到后面":新手单发完后固定落到 Mole/Main/Daily;鼹鼠单当天出过 1 单或活动没开就落到常规策略。

1.5.3 订单策略(MergeOrderConfig_OrderStrategy 25 个)

类型 策略 刷新 CD(s) 每日上限
1 常规 Main01 / Main02 / Main03 1200 / 900 / 300 不限
1 常规 Daily01 / Daily02 / Daily03 3600 / 3600 / 1800 5 / 不限 / 不限
1 常规(鼹鼠) Mole01~04、NewMole01~04 9999 各 1
2 侧单 Side01、Special01 0 不限
3 新手 TutorialFixed01~04 900 不限
4 活动 ActivityLadderOrder01~05 0 0(由活动发单 GenerateActivityOrder)

另有两类代码内置策略【确认】:Special999(合成出顶级件时即时生成,见 1.5.8)、Overlimit998(超限棋子回收单,OverlimitChessRecoverySwitch=false 关闭)。

1.5.4 订单生成算法(BlueMergeOrderGenerateLogic.GenerateOrderByOrderLevelRandom)【确认】

步骤 1:取难度状态值 StateValue。 MergeOrderDiffStateConfig_Main.StateValueType=1 → 直接取状态量 10013(今日累计完成订单的 DiffScore 之和)。类型为其他值时用分子 ÷ 分母两个状态量。

步骤 2:匹配 OrderLevelRandom 行。 按(策略 × 玩家等级段 × StateValue 区间)找到一行,得到第 1/2/3 个棋子的 DiffLevel 区间(注意不是 ChessLevel;DiffLevel 与棋子等级基本对应,共生链/Clothing/Flower 有偏移,见 CorePlayChessConfig.DiffLevel)。共 89 行,代表行:

策略 等级段 StateValue 第 1 件 第 2 件 第 3 件
Daily01 1–15 全部 3–4 3–4 3
Main02 1–7 全部 6 3–4 3
Main02 16–29 0–2000 / ≥2001 7–8 3–6 3–5
Main02 44–60 0–2000 / 2001–4500 / ≥4501 8–9 / 8–9 / 8–10 3–6 3–5
Main03 30–43 0–2000 8–10 3–7 3–6
Main03 81+ 0–2000 / 2001–4500 / ≥4501 10 / 10 / 10–11 3–6 3–5
Mole03 1–35 全部 9 4–6 3–5
NewMole03 30–50 全部 8–11 3–7 3–6
Special01 全部 全部 3–11 3–11 3–11
ActivityLadderOrder01→05 全部 全部 4–6 → 9–11 3–5 → 6–8 3

读法:第 1 件是"主菜",难度随等级抬升(6→10/11);第 2、3 件始终在 3–7 低难度区间。StateValue 只在 16 级以上的 Main/Daily 行有分段,当日完成的难度越高(≥4501),第 1 件上限 +1。

步骤 3:订单包含几种棋子。 GetOrderChessCount 使用"洗牌袋":袋里 1 种 ×3、2 种 ×3、3 种 ×4(MergeOrderConfig_OrderChessCount,各等级段相同),共 10 张,每次不放回抽一张,抽空重装(存档 BlueMergeOrderChessCountNumKey)。所以每 10 单里正好 3 单 1 件、3 单 2 件、4 单 3 件。

步骤 4:每个位置的难度随机游走(难度状态机)。 每个"策略 × 位置"记住上一单的 DiffLevel(BlueMergeOrderLevelRandomHistoryKey):

  • 没有历史,或历史值不在本次区间内 → 在 [Min, Max] 内均匀随机;
  • 有历史 → 按 PKeep 40 / PDown 45 / PUp 15(MergeOrderConfig_Main)决定保持、降 1 级或升 1 级;已在 Max 时"升"的概率并入"降";已在 Min 时"降"的概率归给"升";结果限制在 [Min, Max]。
  • 效果:下降概率(45%)大于上升(15%),难度会向区间下沿回落;出现过高难度单后,后续倾向于给更容易的单。

步骤 5:选择具体棋子。 候选条件:玩家拥有该链的生成器、玩家等级 ≥ OrderUnlockLevel、DiffLevel 落在本位区间、OrderChessWeight.DefaultWeight>0(74 行,Clothing 默认 200,其他 100,顶级件 0)。权重乘子(OrderContentWeightModel=1,按 MergeOrderConfig_OrderContentWeight 等级段取值):

因子 值(1–8 级 → 81+ 级) 作用
BoardPressureThreshold 0.35 / 0.40 / 0.55 / 0.60 / 0.60 / 0.60 棋盘压力 CalculateBoardPressure() 超过阈值时,Stack/Space 因子才生效,偏向选棋盘上已有的棋子以腾格子
StackWeightFactor / SpaceWeightFactor 0.2 / 1.0 Space 项 = SpaceFactor × 盘上同款数 ÷ ((占用格+1)/63)
WeightHistoryOrderUnfinishFactor 20 不在最近 HistoryOrderWindow=7 单里的棋子 ×20(避免重复)
WeightHistoryOrderSameChain 0.2 链在最近 7 单中出现过 ×0.2
CurrentOrderSameChainFactor 0.5 同链 DiffScore 差距项,除数下限 0.1
WeightSameChain 0 同一张订单里已选过的链权重归 0(一张订单内不重复同链)
共生链 CalculateSymbioticWeight — 共生链加权(精确公式未展开)
ProductionRatio / EnergyTolerance / WasteRecycleWeightFactor 7.3→8.9 / 0.55–0.66 / 1.1 未找到读取点(【推断】未使用或用于其他模型)
  • OrderChessWeightChooseType=0:取最高权重,并列时随机一个;非 0 时加权随机。
  • Flower 订单同时最多 1 张(FlowerOrderMaxConcurrentNum=1)。
  • 各乘子的精确组合方式为【推断】,因子名称、数值和读取函数为【确认】。

步骤 6:数量与奖励。 订单中每种棋子要求 1 颗(【推断】,OrderData.orderChessInfos 是逐颗列表);金币 rewardCoin = Σ 各棋子 CorePlayChessConfig.Price,在生成时写入并存档,提交时 GainAsset("Coin", rewardCoin, "order_submit") 原值发放。【确认,07 笔记反编译】4 处 OrderData 构造都只是累加,没有倍率。

1.5.5 OrderStateFactor 的实际作用

  • 配置:MergeOrderDiffStateConfig_OrderStateFactor Normal(StateValue≥0)=0.7、High(≥2500)=1.0、SuperHigh(≥4500)=1.3。
  • 【确认】托管代码里没有任何业务代码引用这张表的 Meta 类型(只有 ConfigMeta 自身和 MessagePack 格式化器);OrderConfigService 也不加载它。因此 本版本中它既不影响金币,也不影响难度。
  • 不确定性:只能排除客户端使用,不能排除服务端或远端配置下发的新版本代码使用。它的阈值(2500/4500)与 OrderLevelRandom 的 StateValue 分段(2000/4500)接近,【推断】为同一套"当日难度"设计的遗留或预留。

1.5.6 笑脸订单(Smile)

  • 【确认】SmileOrderOpenLevel=4、SmileOrderSwitch=true。代码实际读的是 ActivitySmileOrder_* 表(不是 MergeOrderConfig_SmileReward):
    • 笑脸分要求 SmileScoreRequirement:[6,6,6,6,8,8,8,8,10,10,10,10,12](按轮次递增);
    • 分数 → 奖励档 RewardScore:1→12 … 6→75、8→125、10→180、12→250(缺省 200);
    • 等价体力返还率 SmileEquivEnergyReturnRate:3–15 级 0.25、16–25 级 0.20、26–40 级 0.15、41+ 级 0.10(MergeOrderConfig_SmileReward 里 3–15 级写的是 0.35,代码不读);
    • 奖励物品 8–12 个。
  • 【确认】奖励物品通过 SmileOrderChooseLogic.CalculateGlobalReward 按"当前订单缺口"挑选,只从 SmileRewardChess=1 的棋子中选(各链 03~11 级)。
  • 托盘字段 SmileWeight(1001–1008)在笑脸期间替换排序权重;SmileOrderNum / SmileScoreNum / SmileBackup 【推断】表示托盘能出几张笑脸单、每单记几分、是否备选。

1.5.7 鼹鼠单(Mole / NewMole)

  • 【确认】旧版 Mole:需要 MoleChestOrderInstance.IsOpen(MoleChestOrder 活动),并发 < CurMoleOrderMax=2。
  • 【确认】NewMole:NewMoleChestOrderInstance.TryRollStrategy,参数 ActivityNewMoleChestOrder_Strategy:
策略 CD(s) 出单概率 分值
NewMole01 7200 5% 75
NewMole02 60 20% 90
NewMole03 90 20% 100
NewMole04 120 20% 110

并发上限 2;奖励 ActivityMoleChestOrder_Reward(88 行,ReturnRate 0.6,返还 5~12 颗棋子,备选 EnergyChess01)。鼹鼠单的难度行(Mole03/04 第 1 件 9–11)普遍高于同期 Main。

1.5.8 即时订单、新手订单与"难棋"

  • 即时订单(Special999)【确认,AddOrderByMerge】:合成出 InstantOrderChess(各链顶级:FoodA15、FoodB07、FruitA14、FruitB07、JoyA11、JoyB07、ClothingA10、ToyA12、FlowerA07),且它不在现有订单中时,立刻生成一张只要这一颗的订单,奖励 = 它的 Price(如 FoodA15 = 612 金币)。顶级件因此不会卡在棋盘上。
  • 新手订单【确认】:MergeTutorialConfig_TutorialOrderFlow 共 111 单,覆盖 1–8 级(每级 4/6/14/15/15/16/19/22 单),其中 1 件 60 单、2 件 45 单、3 件 6 单;第 1 单 FoodA03,第 2 单 FoodA08,最后一单 FruitA07。金币同样是 Σ Price。
  • 难棋 HarderChess【确认】:BlueMergeGameConfigLogic.GetChessIsHard(EquivEnergy, 玩家等级):1–8 级 EquivEnergy ≥30(FoodA06 起)、9 级以上 ≥100(FoodA08 起)视为难棋。订单生成不调用它;【推断】只用于卖出时的二次确认(HarderChessSellConfirm=true)。
  • OrangeOrderInterval=5、ChainReturnRate=0.6、MaxGapChainReturnRate=0.8:没有找到订单生成里的读取点。ChainReturnRate=0.6、RandomChessRewardNum 2–5 同时出现在 ActivitySmileOrder_Main/SmileReward 中(【推断】用于笑脸奖励"同链返还比例")。

1.6 DDA 与 Lucky 产出

1.6.0 默认开关一览(重要)

机制 开关(默认值) 本版默认是否生效
Lucky 幸运产出 MergeLuckyProduceConfig_Main.LPSwitch=true,4 级开放 生效
共生链动态补偿 MergeChessConfig_Main.DynamicMakeUpSwitch=true 生效
高倍降级补偿 MergeEnergyConfig_Main.DownLevelGenerateCompensationSwitch=true 生效(档位 >1 时)
DDA Help(及 SpecialLucky、Help 链加权) 需要 HeySession:MergeHeyStatusConfig_Main.HeyStatusSwitch=false 不生效
DDA ForceBlock / ForceHelp MergeGeneratorDDAConfig_Main.NearlySuccessForceLogicSwitch=false 不生效
Koilab FV 模型 Report_Koi_Main.KoiSDKSwitch=false 不生效

【确认】这些开关值都来自包内默认配置;DDA 与 FV 需要远端配置或 AB 打开才会启用。

1.6.1 DDA 方向判定(BlueMergeCorePlayGame.ResolveGeneratorDda)【确认】

方向枚举:None / Help / Block / ForceHelp / ForceBlock(Block 在判定函数中未见赋值)。

  1. 玩家处于 HeySession("兴奋期",MergeHeyStatusConfig_* 判定,9 级开放、窗口 7 天、付费 30 等参数)→ Help。
  2. 否则尝试"差一点完成"(NearlySuccess)逻辑:开关打开、等级 ≥ NearlySuccessUnlockLevel=3、通过每日门槛,且存在一张"差一点完成"、缺口在副链上的订单 → 建立一条 NearlySuccess 记录,目标体力 TargetEnergy 取自 ForceBlockRange=[20,40](【推断】区间内随机):
    • 记录建立后累计耗能 ≤ TargetEnergy:ForceBlock,强制只出主链,不给订单缺的副链件;
    • 超过 TargetEnergy:ForceHelp,直接指定产出目标链。
    • 即"先卡 20~40 体力,再给",制造"差一点 → 终于出了"的体验。
  3. 都不满足 → None(普通产出)。

1.6.2 ForceBlock 每日门槛(MergeGeneratorDDAConfig_Factor)【确认】

进入条件:当日 ForceBlock 已消耗体力 < DailyForceBlockEnergyLimit,且距上次进入 ≥ DailyForceBlockInterval 秒。

等级段 ForceBlockRange(体力) 每日 ForceBlock 体力上限 两次间隔(s)
1–7 20–40 0(不触发) 1200
8–15 20–40 100 420
16–29 20–40 150 300
30–50 20–40 200 270
51–80 20–40 250 270
81+ 20–40 300 210

等级越高,每天允许被"卡"的体力越多、间隔越短。(默认开关关闭,见 1.6.0。)

1.6.3 Help 与 SpecialLucky【确认】

  • Help / ForceHelp 时:
    • 计算主、副链的订单缺口(CalculateGeneratorChainGap,HelpChainTargetModel=2),缺口链在选链时权重 ×HelpChainWeightBoostRatio=5;两条链都没有缺口时回到普通选链。
    • 高级候选权重 ×CriticalWeightBoostRatio=1.5;Lucky 基础概率 ×LuckyChanceBoostRatio=1.2。
  • SpecialLucky(只在 Help 方向生效,SpecialLuckySwitch=true、SpecialLuckyTargetModel=2):直接产出一颗未完成订单需要的棋子。频率限制 MergeGeneratorDDAConfig_SpecialLucky:1–9 级间隔 300 s、10 级以上 600 s,每日最多 5 次。

1.6.4 Lucky 幸运产出(MergeLuckyProduceConfig_*)【确认,objdump 核对公式】

  • 门槛:LPSwitch=true、等级 ≥ LPOpenLevel=4、过 CD。CD 按当次触发序号取 LPCD=[60,60,60,120,180,240] 秒,超出取最后一项(越触发越慢;计数何时重置未核实)。
  • 概率: P = LuckyChance1x × r + (LuckyChanceMax − LuckyChance1x) × (1 − (gap+1)^(−K)),截到 [0,1]
    • gap = max(0, Σ 相关链[订单需求等价体力 − 棋盘现有等价体力])(SearchEqPower;相关链见 LuckyGenerateChain:Food→FoodA/B、Fruit→FruitA/B、Joy→JoyA/B、ClothingTrans→ClothingA、Toy→ToyA);
    • LuckyChanceMax=0.05,K=0.1,r 平时为 1、Help 时 1.2。
  • 基础概率与保底(29 个生成器):
生成器 LuckyChance1x 保底 PityEnergyCost 产物池(代表)
Food/Fruit 05–06 0.65% 80 体力 A04 63 / A05 10 / B03 15 / B04 10 / B05 2
Food/Fruit 07–11 0.65% 80 A05 56 / A06 15 / A07 2 / B03 15 / B04 10 / B05 …
Joy 05 0.30% 100 A03 75 / A04 20 / A05 5
Joy 06–11 0.30% 100 A03(或 A04) 53 / … / B03–B05 各 12 左右
ClothingTrans05 0.65% 80 ClothingA04 90 / A05 10
Toy 05–07 / 08–11 0.45% 90 A03 60 / A04 30 / A05 10;08 起整体 +1 级
  • 概率随缺口变化(Food,r=1):
订单缺口(等价体力) 0 10 50 100 500 1000 5000
P 0.65% 1.58% 2.06% 2.26% 2.66% 2.82% 3.14%
  • 保底:每条链累计"上次 Lucky 以来的耗能"(每次加 1/2/4/8),超过 PityEnergyCost(80/90/100)必定触发。实际体感约为"每 80~100 体力至少一次幸运"。
  • 产物:在 LuckyProduceWeight 中加权抽取,权重再乘订单相关系数:订单正好需要该链该级 → TargetFactor=1;订单需要该链更高级 → ValidFactor=1;与订单无关 → InvalidFactor=0(排除)。等级同样 + (档位−1)。产物比普通产出高 3~6 级(等价 4~32 个 01)。
Lucky 幸运产出概率随"距上次幸运产出的体力消耗"上升,上限 5%。P=c1x*r+(Max-c1x)*(1-(gap+1)^-K),Max=0.05,K=0.1,r=1
food_fruit_0.0065toy_0.0045joy_0.003
00.010.020.03010501005001k5k距上次 Lucky 的体力消耗概率

1.6.5 13 个状态量(MergeGameStateConfig_StateInfo,BlueMergeIPlayerDataRecord.GetMergeGameStateValueByStateID)

ID 含义 窗口 代码实现
10001 平均每活跃日体力消耗 7 已实现
10002 平均每活跃日完成订单 7 未实现(返回 0)
10003 活跃日平均订单消耗体力 7 未实现
10004 平均每活跃日金币产出 7 未实现
10005 平均每自然日体力消耗 7 已实现
10006 平均每自然日完成订单 7 未实现
10007 自然日平均订单消耗体力 7 未实现
10008 平均每自然日金币产出 7 未实现
10009 今日累计真实体力消耗 当日 已实现
10010 今日累计完成订单 当日 已实现
10011 今日平均订单体力(10009/10010) 当日 已实现
10012 今日累计金币产出 当日 未实现
10013 今日累计完成订单的 DiffScore 之和 当日 已实现(订单难度 StateValue 使用)

未实现的 ID 走 "Not_Support_StateID" 分支,记错误日志并返回 0【确认】。当前唯一在用的是 10013(订单难度,1.5.4)。

1.6.6 Koilab FV 模型(FvGeneratorService,Tuyoo.Koilab.Fv.Runtime)

  • 开关与参数【确认,Report_Koi_Main】:KoiSDKSwitch=false(默认关闭)、KoiSDKInitLevel=9(9 级前不初始化)、KoiInferenceMode=Hybrid(另有 LocalOnly)、KoiProtocol=Http、云端预测服务地址已配置、KoiExperimentID 为空、ValueControlAlpha/Beta=1.19/1.09。
  • 输入【确认,PopulateGameState】:体力倍率、当前金币/钻石/体力、棋盘占用率与碎片率、解锁格数与空格数、订单等价体力、棋盘/订单/奖励/合成列表/活动状态等序列化信息。
  • 本地模型【确认】:config/fv_state_sequence.onnx;输入 state_features[191]、piece_sequence[63×2]、sequence_lengths;输出 retention(留存)与 ad(广告)两个预测分;版本 local.20260918,阈值类型 p85,lucky_target_rate 0.02;每个生成器有 normal / lucky / candidate_pool 配置(threshold、crit、cap、whitelist)。
  • 决策【确认】:在 DownLevel 之后、普通产出之前调用 TryGetFvProduceResult;返回物品属于本生成器链才采用(来源记为 FvLocal/Cloud),否则回退到普通产出("fallback to original generator")。
  • 【推断】在候选物中,选留存/广告预测分超过 p85 阈值的给出;ValueControl 用 α≥β≥1 在滑动窗口里限制"产出价值/体力",超限时硬/软降级(字段 HardDowngrade/SoftDowngrade)。lucky_target_rate 0.02 与 Lucky 概率区间(0.65%~5%)同一量级。

1.7 泡泡、仓库、商店直购

1.7.1 泡泡(MergeBubbleConfig_Main + BubbleStrategy 74 行)

  • 【确认】开关与限制:4 级开放;泡泡显示 BubbleShowTime=60 秒后破裂;棋盘同时最多 4 个;至少保留 1 个空格才会出;OrderOneAwayBubbleSwitch=false。
  • 【确认】泡泡是"合成结果的复制品":合成出 X 后按概率在空格生成一个被泡泡包住的 X,60 秒内花 BubblePrice 钻买下即得到 X;超时破裂给 BubbleRewardID(全部是 CoinChess01)。
  • 概率【确认 + 推断】:OnMergeEnd 里 p = BubbleChance + ProbabilityConstant(0.01) × 计数,计数存在 BlueMergeBubblePatchKey,【推断】为"连续未出泡次数",即每次没出泡概率 +1%,出泡后清零;到达开放等级后的首次合成有一次性必出(GamePatchData 标记)。
  • 代表行(BubbleChance / 价格钻):FoodA04 3%/2、A06 8%/7、A08 15%/25、A10 33%/89、A15 33%/2210;ClothingA10 33%/2040;ToyA12 40%/1840。高级棋子出泡概率更高、价格≈ 商店直购价(两表价格一致)。
  • 合成奖励 MergeRewardSwitch:10 级开放,MergeRewardChance 1%~10%,奖励 CoinChess01。
  • 广告买泡泡:AdConfig_Main.BubbleBuyMaxGem=11,价格 ≤11 钻的泡泡可以看广告买(BubbleBuy 广告位每日 5 次)【推断】。

1.7.2 仓库扩格(MergeInventoryConfig_*)

  • 【确认】2 级开放,共 32 格,前 5 格免费;之后逐格花钻解锁:
格 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27–32
钻 50 55 65 80 100 130 165 180 250 350 490 535 695 900 1170 1285 1605 2005 2505 2755 3305 各 3965
  • 累计:开到 10 格 350 钻、15 格 1,425 钻、20 格 5,215 钻、26 格 18,675 钻、32 格 42,465 钻。前段每格增幅 10%~30%,后段约 1.1~1.4 倍跳涨,27 格起封顶。
  • 只有 IsCanEnterWareHouse() 为真的棋子能存(【推断】生成器/宝箱等有限制,未细查);仓库里的棋子也能直接交付订单(TryConsumeByOrder)。
仓库扩格价格第 1–5 格免费,第 27–32 格每格 3,965 钻。
01k2k3k161116212631钻石

1.7.3 商店棋子直购(MergeShopPageConfig_*,只列合成相关)

  • 【确认】3 级开放;刷新 20 钻,CD 15(单位未确认);每日特价 3 格:CoinChest01 25 钻、EnergyChest01 10 钻、DailyChest01 免费(付费/默认两版相同)。
  • ShopChessConfig 96 行,按格位分档:格 1–3 低级(03~07 级,1–13 钻)、格 4–5 中级(08~10 级,25–140 钻)、格 6 高级/稀有(11 级、生成器碎片 01 级 40–80 钻、ShopWeight=0 的顶级件不上架)。每次上架数量 ShopCount:棋子 5 个、生成器碎片 1 个。
  • 主链价格:FoodA03 1 → A05 4 → A08 25 → A10 89 → A11 170 钻(≈每级 ×1.9)。生成器碎片:Food/Fruit 40、Flower/Joy/Toy 45、Clothing 80 钻。

1.8 单位体力 → 金币估算

口径:EquivEnergy(配置里的"等价体力")≈ 从 01 级合到该级平均要花的体力;Price = 订单交付这颗棋子得到的金币(订单金币 = Σ Price,已确认)。比值 = 金币/体力。表值全部来自 MergeChessConfig_CorePlayChessConfig。

1.8.1 主链 1→满级

级 FoodA Price / EE / 比值 FruitA JoyA ClothingA FlowerA ToyA
01–02 0 / 0 / — 0 / 0 / — 0 / 0 / — A02: 4 / 16 / 0.25 A02: 4 / 10 / 0.40 0 / 0 / —
03 2 / 4 / 0.50 2 / 4 / 0.50 8 / 4 / 2.00 8 / 18 / 0.44 8 / 20 / 0.40 8 / 4 / 2.00
04 4 / 8 / 0.50 4 / 8 / 0.50 14 / 8 / 1.75 14 / 21 / 0.67 14 / 41 / 0.34 14 / 7 / 2.00
05 8 / 15 / 0.53 8 / 16 / 0.50 24 / 17 / 1.41 24 / 34 / 0.71 24 / 81 / 0.30 24 / 14 / 1.71
06 12 / 31 / 0.39 14 / 31 / 0.45 36 / 33 / 1.09 36 / 67 / 0.54 36 / 162 / 0.22 36 / 28 / 1.29
07 20 / 62 / 0.32 24 / 62 / 0.39 56 / 66 / 0.85 56 / 134 / 0.42 54 / 325 / 0.17 56 / 57 / 0.98
08 32 / 123 / 0.26 36 / 124 / 0.29 88 / 133 / 0.66 88 / 268 / 0.33 — 88 / 114 / 0.77
09 50 / 246 / 0.20 56 / 248 / 0.23 132 / 266 / 0.50 132 / 536 / 0.25 — 132 / 228 / 0.58
10 78 / 493 / 0.16 88 / 496 / 0.18 202 / 531 / 0.38 202 / 1073 / 0.19 — 202 / 457 / 0.44
11 118 / 986 / 0.12 132 / 992 / 0.13 318 / 1063 / 0.30 — — 304 / 913 / 0.33
12 178 / 1972 / 0.090 202 / 1983 / 0.10 — — — 458 / 1826 / 0.25
13 270 / 3943 / 0.068 304 / 3966 / 0.077 — — — —
14 406 / 7887 / 0.051 458 / 7932 / 0.058 — — — —
15 612 / 15774 / 0.039 — — — — —

共生链 FoodB(03–07):8/37/0.22、14/75/0.19、24/149/0.16、38/299/0.13、58/597/0.10;FruitB 基本相同。

单位体力换到的金币(订单 Price ÷ 等价体力)按棋子等级,对数坐标。等级越高,每点体力换到的金币越少。
FoodAFruitAJoyAToyAClothingA
0.010.111023456789101112131415棋子等级金币 / 体力

1.8.2 规律【确认(数值)+ 推断(解释)】

  • 越高级越不划算:EquivEnergy 每级约 ×2(与"两颗合一颗"一致),Price 每级只涨约 ×1.5(FoodA:2→4→8→12→20→32→50→78→118→178→270→406→612)。所以金币/体力从低级的约 0.5 一路降到满级 0.04,FoodA15 每点体力的金币只有 FoodA05 的 7%。
  • 例外:Food/Fruit 03~05 级比值持平(0.50~0.53),是最"划算"的区间。
  • Joy/Toy 每点体力的金币是 Food/Fruit 的 3~4 倍(03 级 2.0 vs 0.5),因为这两条链 EquivEnergy 低但 Price 高。代价是生成器每轮只能点 36/42 次(Food/Fruit 80 次)、开放晚(订单 9/10 级起);【推断】这两条链用 CD 而不是体力来限制产出。
  • ClothingA 曲线不是 2 倍规律(A02=16、A03=18、A04=21),【推断】是把"生成器 → Trans01~05 → 转化器 12 次"这段固定成本平摊进了前几级。
  • FlowerA 不耗体力(自动生成),EquivEnergy 只是折算值,实际限制是时间(1~2.7 小时一轮)。
  • 订单对玩家的意义:订单需要哪一级是系统定的(1.5),玩家不能自选"划算等级";高等级订单需要更多体力,每点体力换到的金币却更少,所以等级越高,单位体力的金币产出自然下降。
  • 体力倍率不改变上表比值:×2^n 档位耗能 ×2^n、产物高 n 级(1.4.3),等价体力对价不变。Lucky(期望每 80~100 体力至少一次、产物高 3~6 级)会让实际金币/体力略高于表值。
  • 对照钻石价值:商店直购 FoodA08 = 25 钻 ≈ 123 体力(0.20 钻/体力),钻石买体力第 1 档 10 钻/100 体力(0.10 钻/体力),第 3 档起 0.4 钻/体力以上;【推断】低档买体力比直购棋子划算,高档反过来。
02

家园与叙事

对象:Frost Valley(com.liteorange.hometopia v1.12.0)。数据来自包内默认配置(extracted/config/tables/*.json),线上远程配置可能覆盖这些值。 标注:【确认】 表示配置表或代码签名、反汇编里直接能看到;【推断】 表示根据命名、结构或数值关系推出来的。 画图数据在 ch2-data.json:建造花费分段、逐点花费、每章花费、200 级曲线、等级解锁时间轴、建造奖励分布。


2.0 一句话概括

家园不是自由装修,而是章节式的"花金币修房子 + 看剧情"。每章是一个场景,场景里有 16 个建造点。玩家在合成棋盘交订单赚金币,再到剧情页花金币点亮建造点。每点亮一个点,播放建造动画,可能触发对话,可能发额外奖励,同时给玩家等级加进度。玩家等级只靠剧情建造增长,而大量系统和活动按等级解锁,所以剧情建造是全游戏的进度主轴。【确认:LevelSys.GrantStoryBuildProgress 是等级唯一的进度入口;TryCommitBuild 扣 "Coin"】


2.1 章节结构

2.1.1 规模

项目 数值 证据
配置的章节(StoryId) 73 个:1001–1089 中的 72 章,外加 2001 StoryIndex_NewStorySort 73 行,StoryContent_BuildInfo 覆盖 73 个 StoryId【确认】
默认开启的章节 71 个(1007_S_1、1013_S_3 两章 Switch=false) 同上【确认】
每章建造点 72 章 × 16 个,2001 章 11 个,共 1163 个 StoryContent_BuildInfo【确认】
默认序列实际可玩的点 1131 个(1163 减去两个关闭章的 32 个) 计算
生涯花费表长度 1163 行(StoryStrategy_LTProgress),超出部分按最后一行计价 07 笔记:FindLtProgressMetaClamped【确认】
场景资源 StoryPackage 里有 91 个 storyId、190 个场景 prefab,比配置多出 18 个 storyId(1069、1078、1090–1107 等) 清单【确认】;多出来的是未上线的储备章【推断】
资源体积 StoryPackage 约 1.79 GB;APK 只内置第一章 1001_9 和公共资源,其余按需下载,并预下载后 2 章(PreDownloadChapterCount=2,下载超时 30s) 清单、StoryInteraction_Main【确认】

全部章节都打完后,显示 story_all_finish_coming_soon("Coming Soon");下一章资源没准备好时,提示 story_next_not_ready_toast【确认:语言表 key】。

2.1.2 播放顺序(默认序列,Switch=true,按 StorySort 排序)

序 资源 序 资源 序 资源 序 资源
1 1001_S_9 6 1029_S_2 11 1002_S_2 16 1004_S_2
2 1053_S_3 7 1038_S_1 12 1011_S_1 17 1015_S_2
3 1056_S_3(AB 槽位) 8 1017_S_2 13 1012_S_1 18 1003_S_2
4 1047_S_3 9 1039_S_2 14 1009_S_1 19 1014_S_3
5 1050_S_3 10 1020_S_2 15 1010_S_1 20 1008_S_3

中段依次是 1018 → 1016 → 1019 → 1023 → 1024 → 1025 → 1030 → 1027 → 1036 → 1032 → 1048 → 1037 → 1046 → 1035 → 1040 → 1043 → 1058 → 1067 → 1057 → 1042 → 1051 → 1052 → 1034 → 1062 → 1066 → 1059 → 1064 → 1041 → 1060 → 1063 → 1085 → 1086 → 1044 → 1065 → 1073 → 1049 → 1061 → 1021 → 1076 → 1068 → 1071 → 1055 → 1075。

结尾:…第 64 章 1079_S_1 → 第 65 章 2001_S_1(Key=1000,StorySort=670,插在 Key 66 和 Key 67 之间)→ 1083_S_1 → 1070_S_1 → 1087_S_1 → 1084_S_1 → 1088_S_1 → 第 71 章 1089_S_1。

  • 原表里 Key 14 是 1007、Key 21 是 1013,两章都关闭。因此按开启后的序号算,原 Key 66 的 1079 实际是第 64 章,2001 是第 65 章。
  • 章节 ID 不按数字顺序排。前期主要放 1053/1056/1047/1050 这类 _S_3 资源,带完整对话资源的 1002、1011、1012、1009、1010、1004、1015 排在第 11–17 章。

2.1.3 AB 测试章节(StoryIndex_StoryIndexTest)

Key StoryIndex(章节位置) 比例 轮次 候选资源
1 2 0% 1 none(未启用)
2 3 30% 11 18 个:1056_S_3, 1011_S_1, 1020_S_2, 1060_S_1, 1087_S_1, 1084_S_1, 1059_S_2, 1059_S_1, 1064_S_2, 1064_S_1, 1041_S_2, 1041_S_1, 1060_S_2, 1060_S_1, 1062_S_2, 1062_S_1, 1066_S_2, 1066_S_1
  • 【确认:代码结构】ChapterProvider.DetermineMetaForPosition 和 BuildFullSequence 遇到测试位置时,先调用 BuildTestCandidate(testRes, playedIds),再调用 PickDeterministicTestRes(storyIndex, ratio, round, candidates)。后者用 StableHash 加用户种子 _userSeedKey 做确定性挑选。
  • 【推断】第 3 章的位置上有 30% 用户被分进测试组,从候选里确定性地拿到一个资源;已经玩过的章节会被 BuildTestCandidate 排除。改 TestRound(现在是第 11 轮)就会重新分组。
  • 候选覆盖 11 个不同章节。其中 1056_S_3 就是对照组本身;1087、1084 原本是第 68、69 章的末尾内容。同一章同时有 _S_1 和 _S_2 两个版本,说明测试的是"把哪一章、哪一版美术放到第 3 章"。

2.1.4 特殊章与 _S_n 变体

  • _S_n 变体:同一 StoryId 在 StoryPackage 里最多有 9 个场景版本(1001 有 9 个,1002 有 7 个,多数章 1–3 个)。StoryContent_BuildInfo 只按 StoryId 定义建造点,不区分 _n,所以各变体共用同一套 16 个点和前置关系,区别只在场景美术和表现【确认:表结构;"只换美术"是推断】。线上第一章用 1001_S_9,APK 里内置的也正是这个版本。
  • 2001 章:11 个点,点位类型是 mg2_window / mg2_fireplace / mg2_chandelier / babycare / table / broom / wrench / paint / hammer / carpet / clothes,AnimationType 全空。点与点严格线性串联(第 n 个点以前 n−1 个点为前置)。StoryMergeMinigame_Bottom53 里有对应的 mg2_window53 / mg2_fireplace53 / mg2_chandelier53 三套 5×3 底部小游戏棋盘,语言表也有 build_story_2001_1_window("太冷了!我得赶紧修好这扇窗户!")、build_story_2001_4_baby。【推断】2001 是按"新手第一章"标准做的第二套剧情和小游戏方案(mg2 = minigame 2),资源有 2001_S_1 和 2001_S_2 两版,目前作为普通章节排在第 65 章。它的 MergeMinigame 字段为空,所以在默认配置下不会弹小游戏【确认:字段为空】。
  • 9001 章 = 序章:StoryInteraction_Main.PrologueStoryRes=9001_S_1,序章视频 PrologueVideoRes=9001_chebeizi,PrologueStorySwitch=false,默认关闭【确认】。

2.1.5 章节主题

配置里没有章节标题字段(两张语言表都没有 chapter 名),只能从角色表 StoryCharacterContent_Character(51 个角色,分属 9 章和一个万圣节活动)和对话标题(*_D_n_title)归纳主题:

StoryId 默认序 主要角色 代表性对话标题(英文原文) 主题【推断】
1001 1 母亲 Chloe、女儿 Luna、丈夫/前夫 Ryan、情妇 Elena、警察、医生 Help! / We're DIVORCED! / He CHEATED! / Ryan's Demise 丈夫出轨,母女雪夜被赶出家门后重建家园
1002 11 Mary、外甥 Hans、男友 Steven、祖母 Tracy、婴儿 Julian Where's the Money / The TRUE Heir / Cyber Theft / The Arrest 遗产争夺加网络诈骗
1011 12 Emily、对手 Melissa、评委 Hans Only 120,000 Hot Dogs / Grand Finale 热狗大赛和商战
1012 13 Rosey、老人 Joe、儿子 Theodore、保险员 The Homelander / The Insurance Clash / Termite Busters 灾后重建和保险纠纷
1009 14 姐姐 Claire、姨妈 Linda、妹妹 Lily、前任 Jason Grandma's Proof / This Is Our Home 守住祖宅
1010 15 Clara、猫 Ginger、初恋 John、骗子 Kevin Nothing Left / Perfect Shot 被骗光之后翻身
1004 16 Angela、假医生 Hans、警察 Rich、编辑 Judy Who Is Dr. Hans? / Conning The Conman 揭穿冒牌医生
1015 17 母亲 Danielle、孩子 Ember、男友 Timothy The Fire / The Amnesia / The Scam 火灾、失忆加诈骗
1007 关闭 Isabella、继母 Hannah、父亲 James Exiled / Daddy's Return 被继母赶出家门
Halloween26 活动 麦琪、佩妮 南瓜之王 / 失踪的南瓜 StorySeasonMerge 万圣节活动剧情,不在主线里

所有题材都是"女性或家庭遭遇困境,然后反击"的短剧风格,配合"冰天雪地里修房子"的求助式引导文案("我们冷得要命,有没有好心人可以帮帮我们?")。


2.2 建造点

2.2.1 类型分布

BuildPointType(39 种,决定图标;StoryInteraction_BuildPointType 配了 42 种图标,特效和音效全部是 common):

类型 数量 类型 数量 类型 数量
hammer 183 photo 54 carbinet 32
paint 81 chandelier 54 food / chair / box 25 / 23 / 23
clothes 78 window 49 bed / sofa 22 / 20
table 73 carpet 48 fireplace / fire / house 17 / 15 / 15
plant 55 toy 47 lamp / seat / fire_extinguisher 14 / 13 / 12
wrench 54 shelf / broom 46 / 44 其余 15 种 ≤11

AnimationType(建造时角色或道具的动作):

动画 数量 主要搭配的点位
hammer(锤子敲) 743(64%) hammer、table、photo、chandelier、window…
none(无动作,直接换图) 191 paint、hammer、fire、first_aid
clothes 102 clothes
sweep / sweep_2 50 / 18 broom、carpet
plant_left / plant_right 23 / 13 plant、tree
firefighter_left / right 10 / 2 fire_extinguisher
空(2001 章) 11 —

另有 210 个点配了 AnimationOffset(如 -50|0),用来微调动画的落点位置。

2.2.2 前置条件结构

  • Condition 列出前置建造点的 ID,用 | 分隔。前置点全部完成后,这个点才可建造【确认:字段】。
  • 每章入口点(无前置)的数量:1 个的有 37 章,2 个的 17 章,3 个的 12 章,4 个的 4 章,6–7 个的 3 章。
  • 每章依赖链的最大深度从 2 到 12 不等,最常见的是 5、7、10。因此有的章接近线性推进,有的章前期能同时开好几个点。
  • 同一时刻最多显示 3 个可建造图标(BuildPointShowMaxCount=3)。未解锁的点显示为灰色(BuildPointGrayScaleSwitch=true);点击灰点的处理方式由 GreyBuildPointClickType=2 决定,具体行为未确认【确认:配置;表现是推断】。
  • ID 尾号 ≥80 的点有 236 个(如 1001_90、1001_80),多是 none 动画或特殊表现点(第一章的急救、面包、衣服、画)【推断】。
  • 配置瑕疵:1030 章有 29 处前置 ID 带空格(如 "1030_1 ")。代码如果不做 trim,这些前置会匹配不上【确认:数据;影响是推断】。

第一章(1001)16 个点的顺序:急救(medicine 小游戏)→ 门(wooddoor 小游戏)→ 窗(window 小游戏)→ 面包 → 吊灯 → 椅子 → 婴儿用品 → 地毯 → 锤子 → 衣服 → 照片 → 玩具(sweep)→ 锤子 → 植物 → 桌子 → 画。几乎是线性的。

2.2.3 合成小游戏挂载点

  • 只有 3 个点挂了 MergeMinigame,全在第一章的前 3 个点:1001_90→medicine、1001_2→wooddoor、1001_1→window【确认】。代码常量 MiniGameChapterIndex=1、FirstChapterMiniGameBuildCount=3 与此对应【确认】。
  • 小游戏类型由 StoryMinigameType 决定,取值 DefaultMinigame=0 / BottomMinigame=1,当前配置是 DefaultMinigame【确认】。棋盘数据:
    • ChessBoardInfo33:3×3 棋盘,medicine33 / wooddoor33 / window33 各 3 行;
    • Bottom53:5 列 × 3 行的底部棋盘,有 medicine53 / wooddoor53 / window53 和 mg2 系列 3 套,带 BottomBlocker 遮挡;
    • StoryChessBoardInfo:4 列棋盘,32 种类型(对应 BuildPointType);
    • PrologueChess:56 种小游戏棋子,最高 3–4 级,棋盘尺寸 44。
  • 【推断】Default 模式用 3×3 或 4×4 弹窗棋盘,Bottom 模式用剧情页底部的 5×3 条带棋盘。玩家在小游戏里把物品合成到指定等级才算完成,之后进入扣费和建造。小游戏引导(build_bottom_minigame_click/submit_01–03)在建造 5 次后停止(StoryMergeMinigameGuaidStopBuildCount=5)。

2.2.4 建造花费曲线(StoryStrategy_LTProgress.CoinCost)

计价规则【确认:07 笔记反汇编】:建造货币是 "Coin"。某个点的价格 = LT 表[本章开始时的生涯已建点数 + 该点在章内的 Sort 序号]。花费按生涯累计序号查表,与是哪一章无关。进入章节时,本章所有点的价格会冻结写进存档(chapterPointCostMap),之后配置变化不影响已开章节。找不到对应行时价格为 1。

全表:1163 个点,合计 371,722 金币;单点最低 16(第 1 个点),最高 600(第 1135 个点起)。按默认序列打完 1131 个点需要 357,622 金币。

每 50 个点分段(逐点数据见 ch2-data.json → build_cost_by_index):

序号 最小 最大 均值 段合计 累计
1–50 16 150 46.9 2,346 2,346
51–100 30 180 92.5 4,626 6,972
101–150 70 200 118.8 5,942 12,914
151–200 58 200 132.5 6,623 19,537
201–250 65 405 205.5 10,275 29,812
251–300 150 405 262.8 13,140 42,952
301–350 150 435 271.2 13,560 56,512
351–400 165 450 298.2 14,910 71,422
401–450 180 510 328.8 16,440 87,862
451–500 210 525 361.8 18,090 105,952
501–600 225 525 366 36,600 142,552
601–700 225 540 370.5 37,050 179,602
701–800 240 570 404.4 40,440 220,042
801–900 270 570 411 41,100 261,142
901–1000 270 580 415 41,500 302,642
1001–1100 280 580 421 42,100 344,742
1101–1163 280 600 428.3 26,980 371,722

节奏特征【确认:数值】:

  • 第 1–2 章是"压价期":单点 16–60,前 5 个点几乎都是 25。
  • 第 3 章起,每章的 16 个点分成低、中、高三档价格,点数比例 6 : 5 : 5,三档混排。例如第 3 章是 30/60/90,第 10 章 70/130/200,第 15 章 120/270/390,第 30 章 225/375/525,第 64–71 章 280/430/580。
  • 第 15 章(序号 225 附近)有一次明显跳价:单章总花费从 2,295 跳到 4,170。
  • 第 30–40 章、第 50–60 章、第 61–71 章三段,每章总价基本不变(分别约 5,850、6,570、6,730),属于平台期。

每章总花费(默认序列):

章 资源 合计 章 资源 合计 章 资源 合计
1 1001 506 9 1039 1,846 17 1015 4,275
2 1053 670 10 1020 2,118 20 1008 4,275
3 1056 960 11 1002 2,080 25 1024 4,980
4 1047 1,060 12 1011 2,165 30 1032 5,850
5 1050 1,486 13 1012 2,050 40 1042 5,850
6 1029 1,836 14 1009 2,295 50 1063 6,570
7 1038 1,764 15 1010 4,170 60 1068 6,570
8 1017 1,926 16 1004 4,035 65 2001(11 点) 5,030

后段每章 6,090–6,780 金币。71 章全部数据见 ch2-data.json → chapter_costs。由于价格跟着生涯序号走,被分进 AB 组或少玩一章,后续章节的价格都会整体平移【推断】。

建造点花费(按生涯建造序号)共 1163 个建造点,每点 16–600 金币。按每 10 个点取平均。
01002003004002004006008001k建造序号金币 / 点
每章建造总花费(默认播放顺序)71 章,横轴为章节播放序号。
02k4k6k1611162126313641465156616671金币

2.2.5 额外奖励(250 个点)

StoryStrategy_LTProgress.RewardItems1/2 有值的点共 250 个,约占 21.5%;其中 67 个点同时发两件。奖励在建造完成后由进度奖励流程发放(AppendPendingProgressRewardItems 支持断点恢复)【确认】。

类别 件数 主要物品
合成棋子 121 FoodA06 12、FruitA06 12、FlowerA02 10、JoyA04 9、ToyA04/A05 各 7…
宝箱 103 RedChest01 58、GreenChest01 45
生成器 92 FlowerGenerator01 18、ClothingGenerator01 15、ToyGenerator01 12、FoodGenerator01 11、JoyGenerator01 11、FruitGenerator01 10,以及若干 02/03 级
金币棋子 1 CoinChess02(第 36 个点)

分布(每 100 个点里有奖励的点数):24 / 28 / 33 / 20 / 19 / 18 / 23 / 18 / 18 / 20 / 18 / 11(最后一段只有 63 个点)。第 201–300 个点(第 13–19 章)最密。相邻奖励点多相隔 3–6 个点。第一个奖励在第 6 个点(FoodB02),前 32 个点里集中发了 FoodGenerator01、FlowerGenerator01/02/03 等生成器,作用是给新手扩充生产线【推断】。


2.3 等级系统

2.3.1 规则

  • 【确认】MergeLevelConfig_Main.CostType=2,即金币模式;LevelExpPerBuildPoint=15。LevelSys 有两种模式:CostTypeExp=1 读 ExpCost,CostTypeCoin=2 读 CoinCost。切换模式时由 MigrateProgressIfCostTypeChanged 换算已有进度。
  • 【确认】等级进度只来自剧情建造:LevelHelper.GrantBuildProgress(exp, coinCost) → LevelSys.GrantStoryBuildProgress。金币模式下,每次建造花掉的金币直接计入升级进度。
  • 【推断】Level=N 那一行的 CoinCost 是从 N 级升到 N+1 级所需的金币;奖励在升级时由 GetLevelReward 发放,弹出升级弹窗 LevelPopupHelper.ShowLevelUpPopup。
  • 200 级合计:CoinCost 1,965,242,ExpCost 46,200。

2.3.2 200 级曲线(每 10 级一段)

等级 首级 Coin 末级 Coin 段合计 累计 ExpCost 首→末
1–10 116 570 2,616 2,616 45→105
11–20 460 1,166 9,568 12,184 120→150
21–30 1,590 3,075 20,703 32,887 165→195
31–40 3,585 4,530 39,495 72,382 195→225
41–50 4,980 5,700 53,220 125,602 225→240
51–60 5,850 6,090 59,610 185,212 240
61–70 6,540 7,000 65,480 250,692 240
71–80 7,100 8,100 76,000 326,692 240→255
81–90 8,200 9,200 87,150 413,842 255
91–100 9,300 10,350 98,300 512,142 255
101–150 10,500 15,300 672,350 1,184,492 255
151–200 15,200 16,000 780,750 1,965,242 255
等级所需金币(金币模式)每级 CoinCost 与累计值。累计值与建造花费的累计值逐段对齐。
05k10k15k255075100125150175200等级金币 / 级

2.3.3 金币模式与建造花费的对齐

  • 【确认:数值】前 63 级(另有第 68、74 级)的累计 CoinCost,正好等于某个建造点的累计花费。也就是说,每次升级都刚好落在一次建造完成的瞬间,不会出现"差几个金币才升级"的情况。例子:
    • 1 级 116 = 第 1–5 个点(16+25+25+25+25);
    • 2 级累计 214 = 前 8 个点;3 级 342 = 前 12 个点;
    • 4 级累计 506 = 前 16 个点 = 第一章总花费,所以打完第一章正好升到 5 级;
    • 10 级累计 2,616 = 前 54 个点;20 级 12,184 = 前 145 个点;30 级 32,887 = 前 263 个点;50 级 125,602 = 前 554 个点;63 级 = 前 762 个点。
  • 每级需要的建造次数:1–4 级依次是 5/3/4/4 次;之后逐步增加,5 级 5 次、8 级 7 次、17 级 10 次、25 级 12 次、38 级 15 次,50–63 级每级 16 次,相当于一级一章。
  • 【确认:数值】经验模式(ExpCost/15)和金币模式在 1–63 级给出的升级时点完全一致:前 3 个点各给 5 经验,第 16 个点给 30 经验,正好补齐差额。两种模式切换时节奏不变。
  • 上限:默认序列的 1131 个点能升到 83 级;全表 1163 个点能升到 85 级。85 级以后要等新章节上线【推断】。

2.3.4 每级奖励

级 奖励 级 奖励 级 奖励
1 Energy_100、FoodGenerator04 11 EnergyChest01 21 RedChest01、EnergyChest01
2 CoinChest01、FruitGenerator04、Energy_150 12 EnergyChest01 22 GreenChest01、EnergyChest01
3 Energy_150、FruitGenerator04 13 EnergyChest01、JoyGenerator05 23 RedChest01、EnergyChest01
4 Energy_100、TutorialChest01 14 RedChest01、EnergyChest01 24 RedChest01、EnergyChest01
5 EnergyChest01、ClothingGenerator04 15 EnergyChest01 25 GreenChest01、EnergyChest01
6 EnergyChest01、FlowerGenerator04 16 JoyGenerator05、EnergyChest01 26 RedChest01、EnergyChest01
7 EnergyChest01、FlowerGenerator05 17 RedChest01、EnergyChest01 27 RedChest01、EnergyChest01
8 EnergyChest01 18 RedChest01、EnergyChest01 28 GreenChest01、EnergyChest01
9 EnergyChest01 19 RedChest01、EnergyChest01 29 RedChest01、EnergyChest01
10 EnergyChest01 20 ToyGenerator05、EnergyChest01 30 GreenChest01、EnergyChest01

31–200 级全部是"宝箱 + EnergyChest01":RedChest01 + EnergyChest01 共 88 级,GreenChest01 + EnergyChest01 共 82 级,没有例外。生成器奖励集中在 1–20 级:Food/Fruit/Clothing/Flower 04–05 级、Joy05、Toy05。

此外 2–10 级还有新手升级奖励(见 2.6.4),升级时作为弹窗单独发放。

2.3.5 按等级解锁时间轴

"建造数 / 章"是按金币模式换算出来的:达到该等级需要的生涯建造数,以及它落在默认序列的第几章【推断换算】。⊘ 表示包内默认配置关闭。

等级 建造数 / 章 解锁内容 来源表
2 5 / 第 1 章 仓库 Inventory MergeInventoryConfig_Main.InventoryOpenLevel
3 8 / 第 1 章 商店(刷新 20 钻);MoonlitStories(3 级 Lifetime 触发);CozyRenovation(3 级解锁,建造 10 次触发);订单托盘第 3 档;DDA NearlySuccess;⊘SnowstormRush MergeShopPageConfig_Main、ActivityInfo、ActivityLifetime、MergeOrderConfig_TrayCount
4 12 / 第 1 章 泡泡 Bubble、Lucky Produce、笑脸订单 SmileOrder、新手礼包 BeginnerPack(CozyHearth_01 升到 4 级触发,持续 2880) MergeBubbleConfig_Main、MergeLuckyProduceConfig_Main、ActivityInfo、ActivityLifetime
5 16 / 第 1 章末 激励广告:首次请求、EnergyRefill、GeneratorRecharge、BubbleBuy、ShopSlot、ShopRefresh、OrderInterstitialReward;卡牌收集;新手操作提示(MaxLevel=4)到此失效 AdConfig_Reward、AdConfig_Main.LTFirstRequestLevel
6 21 / 第 2 章 WeeklyTask、24hTask、能量推送权限弹窗;⊘StorySeasonMerge ActivityInfo、MergePushConfig_PushPopUpInfo
7 27 / 第 2 章 PinataScore、MonopolyLike、ThemeGiftPack;升级礼包 SKU 映射起点(TriggerLevel=7);⊘DailyRewards ActivityInfo、IAPLevelUpPackageConfig_PurchaseInfo
8 33 / 第 3 章 ScoreStage、CoinPve、CoinRace、MergeSingleBoard、MergeMultiBoard、MergeBattlePass;⊘CoinDash、⊘LadderOrder ActivityInfo
9 40 / 第 3 章 Tournament、EndlessTreasure;评分弹窗开始(9–20 级);生成器充能推送弹窗;订单托盘第 4 档;⊘EnergyBattlePass;⊘Koi(9 级);⊘HeyStatus(9 级) ActivityInfo、MergeRateAlertConfig_Main 等
10 47 / 第 3 章 BattlePass(PrizePath)、合成奖励 MergeReward ActivityInfo、MergeBubbleConfig_Main.MergeRewardOpenLevel
12 62 / 第 4 章 LevelUpPackage、NewMoleChestOrder、广告泡泡 AssetBubble 激励位;⊘插屏 ActivityInfo、AdConfig_*
15 87 / 第 6 章 ⊘开屏广告 AppOpen AdConfig_AppOpen
16 96 / 第 6 章 体力倍率 ×2、PenguinSki、Escape MergeEnergyConfig_EnergyBoost、ActivityInfo
18 115 / 第 8 章 RoundDuel ActivityInfo
20 135 / 第 9 章 评分弹窗区间结束;⊘OrderInterstitialAD
30 250 / 第 16 章 体力倍率 ×4 / ×8;⊘生成器空间 GeneratorSpace MergeEnergyConfig_EnergyBoost、MergeInventoryConfig_Main
35 316 / 第 20 章 FlamingFrenzy ActivityInfo

另有两项按建造次数(不是等级)触发:SnowstormRush01 和 StoryLuckyRiver_01(即 CozyRenovation),都是 TriggerType=buildpoint, Trigger=10【确认:ActivityManageConfig_ActivityLifetime】。

节奏:第一章 16 个点内就开放了仓库、商店、泡泡、笑脸订单、新手礼包、激励广告,共 4 次升级;第 2–3 章(第 17–47 个点)开放大部分常规周期活动;第 6 章开放体力倍率 ×2;第 16 章开放 ×4/×8。


2.4 单个建造的完整流程

【确认:ChapterContentController.RunBuildFlowAsync 等的 ISIL 调用顺序;扣费步骤见 07 笔记反汇编】

  1. 点击图标 HandleIconClicked:场景上最多同时显示 3 个可建造图标,未解锁的显示灰色。图标上显示价格:金币足够时显示 出发 🪙{cost},不够时显示 🪙{have}/{cost}(story_popup_coin_enough / not_enough)。点击时关闭当前引导,并上报 ReportStoryBuildClick。
  2. 建造前对话 ShowBuildStartDialogueAsync → DialogueController.TryShowDialog(BuildStart):按(章、时机、已建数)查 StoryContent_DialogueRes。
  3. 合成小游戏(仅第一章前 3 个点):TryRunBuildMinigameAsync / RunBottomMinigameAsync,配有 click/submit 两步引导。
  4. 提交和扣费 TryCommitBuild:
    • 校验该点未完成,且 GetAssetCount("Coin") ≥ Cost;任一不满足就判失败,走"金币不足"分支;
    • 冻结顶栏金币显示(TopAssetHelper),为后面的飞币动画做准备;
    • ConsumeAssetCount("Coin", cost, "story_build") → AssetMgr.ConsumeAsset;
    • MarkBuildPointCompleted,生涯建造数加 1,上报 ReportStoryBuildFinish(pointId, cost)。
  5. 建造动画 PlayBuildingAnim → PlayPreBuildAndBuildAnimAsync:先放预建造动画(PreBuildAnimationSwitch=true,锤子飞向点位),再播点位的 Spine、视频或特效,点位状态 BeforeBuild → Building → AfterBuild。飞币数量分档 FlyAssetNumber="30-3;80-5;160-7;450-9"【推断:花费 ≤30 飞 3 枚,≤80 飞 5 枚,依此类推】。动画速度倍率是 1.0。
  6. 收尾 CompleteBuildPresentationAsync → TryShowDialog(BuildEnd) → ResolveBuildMode(Standard 或 Focus 镜头模式)。
  7. 奖励 AfterBuild → TryPlayGrantRewardAnim:发 LTProgress 额外奖励;刷新可建造图标;尝试显示下一条引导。
  8. 经验和外部联动(TestHome 注入的回调):
    • LevelHelper.GrantBuildProgress(exp, coinCost),升级时弹出升级弹窗;
    • StoryBuildPointFinishFlow.Execute(isLevelUp),执行建造后弹窗队列(见 2.7.2);
    • ActivityMgr.TryTriggerLifetime / OnStoryBuild、HeartbeatService.OnStoryBuild:建造计数驱动活动任务(如"在故事中建造 {0} 个点")和 Lifetime 活动触发。
  9. 章节完成:HandleChapterCompleted → ShowNextChapterIntro → StoryNextChapter 弹窗("新剧情已解锁")→ TryEnterNextChapter,按需下载新章节资源后切章。

金币不足的引导【确认:签名和配置;表现细节是推断】:

  • OnInsufficientAssets → StoryMainView.HandleInsufficientAssetsAsync → ShowInsufficientAssetsInteractionAsync。
  • 弹出 NotEnoughCoinPopup(ShortagePage,ShortagePageUiType=1,ShortagePageJumpType=1)。弹窗有三行说明,对应语言表 story_how_to_play_step1–3:"完成订单 → 获得金币 → 花费金币助一臂之力",标题是"玩法说明"。下方按钮"Go to Merge"(story_htp_dialogue_button)点击后以 StoryExitType.NotEnoughEnterGame 退出剧情,进入合成棋盘。
  • 首次金币不足时,还可能先播一段玩法说明对话 StoryHTPDialogueRes=1001_D_900(标题 "Bread For Luna",5 句),由 ShouldShowHTPDialogue 控制。

2.5 叙事内容量

项目 数值 证据
角色 51 个,分属 9 章各 4–10 人,加 Halloween26 的 2 人;表情条目 157 个,其中 82 个带视频参数(色键抠像) StoryCharacterContent_Character / CharacterEmojiRes
对话句子 3,412 句,分属 224 个对话组:Dialogue 2,716、Thinking 320、Title 224、Illustration 152 StoryContent_DialogueSentenceRes
按章分布 1001:1,038 句(含多个版本的对话组 D_1–D_80,以及 D_900);1002:432;1009:295;1007:286;1004:279;1015:276;1012:274;1011:257;1010:213;Halloween26:62 同上
触发表 StoryContent_DialogueRes 143 条,覆盖 9 章,时机为 BuildStart 128 条、BuildEnd 15 条(ChapterStart/End 未使用) 【确认】
默认配置里实际挂上的对话 只有第一章的 5 组:建完第 3/6/9/12/16 个点时触发 1001_D_2 / D_3 / D_37 / D_41 / D_45,共 79 句。其余 8 章 128 条触发全是 none,另有 HTP / 首次进入合成用的 1001_D_900(5 句) 【确认】
头像图 / 头像视频 / 插画 StoryPackage 里分别有 154 / 154 / 128 个资源,9 章都有专属资源;1001 有三版(无后缀、_3、_4),1002 有两版 清单【确认】
剧情视频 StoryContent_VideoRes 只有 1002_V_1 一条;清单里实际只有 Video_1001/1001_V_1(含音轨)。配置的 FirstCoreplayEnterVideoRes=1001_V_900_1 在清单里没找到 【确认】;名称不一致的原因未知
首启视频 1001_cheating_2,开启,不可跳过(FirstLaunchVideoSkipSwitch=false);视频和音轨打包在 DefaultPackage 内 StoryInteraction_Main、DefaultPackage 清单
序章 PrologueStorySwitch=false,9001_S_1 和视频 9001_chebeizi 未启用 【确认】
对话表现开关 对话、可跳过、插画、角色视频头像都开启;背景遮罩 75%;BGM 不自动降音量 StoryInteraction_Main

【推断】对话文本已经写好约 3,400 句,但默认配置只把第一章接入了触发表,其他章是否显示对话取决于远程配置。另一种可能是线上已经把多数章节改成"只有建造、没有对话",以缩短单点建造时长。1001 有 D_1–30、D_31–45、D_46–52、D_61–75、D_76–80 多套版本,和 1001_S_1…S_9 多个场景版本相互对应,说明第一章做过多轮 AB 和迭代。


2.6 新手期

2.6.1 首启流程

【确认:TestHome.RunStartupAsync 的 ISIL 调用顺序】

  1. 初始化服务和剧情(StoryLauncher.InitializeStory,下载或显示第一章)。
  2. 首启视频 FirstLaunchVideoPlayer.TryPrepare/TryPlay,播放 1001_cheating_2,不可跳过。
  3. 初始化弹窗流程和引导(InitFlowAndGuide)。
  4. 决定首页:ShouldEnterStoryDirectly 基于 StoryLauncher.IsFirstChapterFirstThreePointsFinished。【推断】第一章前 3 个点(三个小游戏点)完成之前,冷启动直接进剧情页;之后进 Home 页,并启动 HomeFlow 弹窗队列。
  5. HomeFlow 结束后,按 IsLTFirstPointFinished 选择引导:TryShowGuideLTFirstEnterStory(引导去剧情)或 TryShowGuideFirstEnterCorePlay(引导去合成)。
  6. 前 3 个点完成后,首次进入合成的交互是 FirstCoreplayEnterInteractionType=1,播放对话 1001_D_900("Bread For Luna"),配套视频 1001_V_900_1。
  • 新手初始棋盘 MergeNewUserBoardConfig_Board 是 9 行 × 7 列,大部分格子被雪块(Blocker)覆盖;清掉部分奖励格各得 Energy_10–30【确认】。

2.6.2 强引导规模

表 行数 开启 说明
MergeTutorialConfig_StrongGuide 49(1 个总开关 + 48 步) 45 每步对应一个文案 key
MergeTutorialConfig_NewUserTutorial 58(1 个总开关 + 57 项) 41 旧版线性引导(FirstMerge、FirstEnterStory_Linear 等)全部关闭,改用带 _2 后缀的新版
MergeTutorialConfig_TutorialOrderFlow 111 单 111 1–8 级的引导订单:1 级 4 单、2 级 6 单、3 级 14 单、4 级 15 单、5 级 15 单、6 级 16 单、7 级 19 单、8 级 22 单
MergeTutorialConfig_NewUserOperation 9 种操作提示 9 4 级及以下生效:进合成、进剧情、交订单、点待领奖励、点宝箱、合成、生成、点建造点、从剧情进合成;提示延迟 2.5s,遮罩不透明度 45
TutorialTrayUnlock 8 级 — 订单托盘按等级逐步开放:1 级 1 个 → 3 级 3 个 → 4 级 4 个 → 6 级 5 个

2.6.3 强引导主要步骤

【推断:执行顺序根据表顺序、文案和解锁等级排列;文案为语言表原文,部分只有英文】

阶段 步骤(开启的) 在教什么
A. 剧情开场 lt_first_enter_story_2("太冷了…有没有好心人帮帮我们")→ build_story_1001_medicine("女儿发烧了!我得找到药")+ build_bottom_minigame_click/submit_01 → build_story_1001_door + 小游戏 02 → build_story_1001_window + 小游戏 03 先从剧情进入:点建造点 → 在小游戏里合成 → 提交,连做 3 次。这 3 个点几乎不花钱(16/25/25)
B. 合成基础 first_merge_2(把它们合在一起)→ first_clear_blocker_2(雪下有东西,在旁边合成把它挖出来)→ first_generate_chess_2(找到食材了,Luna 会高兴)→ first_submit_order_2(趁热交给 Luna)→ second_submit_order_2 合成、解除障碍、点生成器、交订单。引导订单是 FoodA03 → FoodA08 → FoodA04 → FoodA06
C. 回剧情消费 first_enter_story_2("房间里有动静,去看看")→ build_story_1001_bread("Luna 饿了,给她找点吃的")→ first_story_htp_click_2(玩法说明)→ second_enter_story_2("金币够了,继续修房子") 建立"赚金币 → 花金币"的循环
D. 生成器成长 first_generator_level_up_step_1/2("又多了一台烤箱" / "合并两台烤箱")→ first_unlock_sub_chain(新烤箱带火腿片)→ second_generate_chess(新的水果篮)→ second_unlock_sub_chain(点果汁图标查看获取方式)→ third_enter_story 生成器合成升级、副产物链、查看棋子信息
E. 系统介绍(按解锁等级触发) 商店 shop_tutorial_1/2(3 级)、笑脸订单 smile_tutorial_1/2(4 级)、体力用完 first_restore_energy、开宝箱 first_unlock_chest、pinata_score(7 级)、monopoly_like(7 级)、coin_race(8 级)、bp_tutorial_1(10 级)、molechest_order(12 级)、escape(16 级)、snowstorm_rush、inventory_generatorspace_1/2、story_season_merge* 3 条、daily_rewards 每个系统或活动第一次出现时的单步说明
已关闭 first_enter_core_play、first_show_bubble、story_build_click_04、first_story_coreplay_button_click —

2.6.4 新手奖励(MergeTutorialConfig_NewUserReward)

升到等级 奖励
2 Gem_50
3、4、6、7、8、9、10 Gem_10 + Energy_20
5 StarterChest01 + Energy_20
11 (Switch=false)

升到 10 级累计 Gem 120、Energy 180,外加 1 个 StarterChest01。发放渠道是 HomeFlow 的 newUserRewardFlow 和建造后队列的 LevelUp_NewUserReward。


2.7 弹窗队列

2.7.1 首页 HomeFlow(FlowScene "HomePage")

排序规则【确认:反汇编】:FlowPriorityConfig.Apply 把配置权重换算成 Priority = 10000 − FlowWeight;FlowExecutor.Start 先过滤出 ShouldExecute 为真的单元,再按 Priority 升序排序,逐个串行执行。所以 FlowWeight 越大越先弹。RateAlert 不在配置表里,代码写死 Priority=999,999,999,永远排最后。弹窗关闭(UIMgr.PopupDidClose)后,HomeFlow.TryStart 会继续执行后面的单元。配置表名叫 FlowChance,但只有权重,没有概率字段;是否弹出完全由各单元自己的 ShouldExecute 条件决定。

顺位 FlowUnit FlowWeight
1 Account_AutoPopup(账号绑定) 30000
2 GachaFlowQueue_HomePage(未领的宝箱、盲盒奖励) 20000
3 InboxMail(奖励邮件自动弹出) 16000
4 CardCollection_OpenAndCollect 15000
5 LevelUp 9991
6 IAPRedeliver(掉单补发) 9990
7 AdCompensation(广告补偿) 9980
8 newUserRewardFlow 9970
9 Tournament_RewardPopup 9960
10 各活动结束补领 *_ForceReward:WeeklyTask、ScoreStage、CoinPve、PinataScore、PenguinSki、CoinRace、CoinDash、BattlePass、MergeBattlePass、MergeSingleBoard、MergeMultiBoard、24hTask、SnowstormRush、MonopolyLike、EnergyBattlePass、EndlessTreasure(16 项) 9950
11 DailyRewards_Popup 9940
12 LevelUpPackage_Popup 9930
13 BeginnerPack_Popup 9920
14 ThemeGiftPack 9915
15 SnowstormRush 9910
16 CardCollection_Start / CozyRenovation / StorySeasonMerge 9905
17 DirectedReissueOfChessPieces(定向补发棋子) 9900
18 MonopolyLike 9890
19 EndlessTreasure_AutoPopup / EnergyBattlePass_AutoPopup 9880
20 SBM_AutoPopup / MMB_AutoPopup(单棋盘、多棋盘合成活动) 9870
21 Escape_AutoPopup 9860
22 RoundDuel_AutoPopup 9850
末位 RateAlert(代码常量) —

顺序是:账号和奖励补发 → 升级 → 补偿和新手奖励 → 活动结算 → 礼包 → 活动开场 → 评分。权重相同的单元用 List.Sort 排序,这种排序不稳定,先后顺序不保证【推断】。

2.7.2 建造后和升级时的队列(FlowScene "StoryBuildPointFinish",权重表 MergeFlowChanceConfig_LevelUpFlow)

每次建造完成后,调用 StoryBuildPointFinishFlow.Execute(isLevelUp),在剧情页内依次检查:

顺位 FlowUnit FlowWeight
1 LevelUp_NewUserReward(新手升级奖励,2–10 级) 10000
2 LevelUp_LevelUpPackage(升级礼包,按 TriggerLevel 映射 SKU) 9990
3 LevelUp_BeginnerPack(4 级触发的新手礼包) 9980
4 StoryBuild_CozyRenovation(建造 10 次触发) 9975
5 StoryBuild_SnowstormRush(建造 10 次触发,默认关闭) 9970
6 LevelUp_EnergyBattlePass(默认关闭) 9960

升级时,先通过 LevelHelper 回调弹出升级奖励弹窗(LevelPopupHelper.ShowLevelUpPopup,"等级提升 / 领取"),再执行上表的队列。如果当时不在首页,回到首页时 HomeFlow 的 LevelUp(9991)单元会补弹【推断】。


2.8 元系统

2.8.1 用户资料(MergeProfileConfig_*,UserProfileService)

  • 字段:昵称、头像、头像框、昵称特效、徽章。存档 key 是 UserProfile.Data【确认】。
  • 头像 9 个(Avatar001–009),全部免费;默认 Avatar001。
  • 头像框 6 个(Blue/Orange/Purple/Red/Silver/White),全部免费;默认 FrameSilver(权重最高,1100)。
  • 徽章 4 个,全部来自活动:卡牌收集 FluffyCollection 给"愤怒小猫·黄金/钻石",Halloween2026 给"黄金南瓜 / 钻石幽灵"(MergeProfileConfig_RewardConfig 按 CalendarID 绑定)。机器人不会使用徽章(RobotAvailable=false)。
  • 头像和头像框带 RobotAvailable 与 Weight,供 Tournament、RoundDuel 等 PvP 活动生成机器人对手时按权重抽取【推断】。
  • 昵称最长 15 个字形单位,有本地敏感词库;改名失败时提示"请确保未使用任何不支持的字符"【确认】。界面分 Avatar / Frame / Badge / Name 四个页签。

2.8.2 邮件(Inbox)

【确认:签名和常量,见 03 笔记 §5.2】邮件来自服务端,每页 10 封。类型分通知和奖励,状态分未读、已读、过期。每封奖励最多 4 件,并支持负数资产(运营扣回)。刷新时机:冷启动进首页、进入合成、打开收件箱、热启动。奖励邮件通过 HomeFlow 第 3 顺位的 InboxMail 自动弹出;通知邮件要点首页的邮件按钮查看,有红点提示。界面上显示"{0} 天后过期"。

2.8.3 本地推送

项目 值 来源
总开关 开启 MergePushConfig_Main.PushSwitch
每日上限 2 条(DailyPushMax),两条间隔 3(DailyPushInterval,单位推断为小时) 同上
召回推送时间 18 点(CallBackTime) 同上
允许推送的时段 9–22 点 代码 PassAllowedWindow【确认:03 笔记】
推送类型(每种的日上限 / 冲突权重) EnergyRefilledPush 能量回满 3/100;ItemRechargedPush 生成器充能 3/80;CallBack_24h / 48h / 72h / 168h 离线召回各 2/60 PushBannerinfo
权限引导弹窗 EnergyPushPopUp 6 级、GeneratorChargePushPopUp 9 级,各自终身 1 次;两次弹窗间隔 3(PushPopUpInterval,单位推断为天) PushPopUpInfo
文案 "能量已补充 / 您的能量已补满!";"物品已充能 / 植物准备生成新物品!";召回"尽快处理!下一次雪暴将在 5 分钟后袭来!立刻修复!" 语言表

多条推送时间冲突时,按 Weight 保留一条(ResolveCollision);每次回到前台重新排期【确认】。

2.8.4 评分弹窗(MergeRateAlertConfig_Main)

  • 开启;只在 9–20 级 之间弹出;终身最多 3 次;两次间隔 7(单位推断为天);RateAlertFiveStarsSwitch=true。
  • 在 HomeFlow 中排最后(Priority 999,999,999)。文案"Having Fun? / Show your love by giving us 5 Stars!",有 0–5 星选项(Not Fun … Excellent)。
  • 【推断】选 5 星才跳转商店评分(项目集成了 Google Play Review),低星不跳转。

附:证据速查

结论 表 / 函数
建造扣 Coin,价格按生涯序号查表并冻结 ChapterContentController.TryCommitBuild、ChapterProvider.LoadStoryChapter / FindLtProgressMetaClamped / FreezeChapterPointCostMapIfNeeded、StoryStrategy_LTProgress
章节顺序和 AB StoryIndex_NewStorySort、StoryIndex_StoryIndexTest、ChapterProvider.PickDeterministicTestRes
建造点 StoryContent_BuildInfo、StoryInteraction_BuildPointType、StoryInteraction_Main
等级 MergeLevelConfig_LevelCostReward / Main、LevelSys
对话 StoryContent_DialogueRes / DialogueSentenceRes、StoryCharacterContent_*、DialogueController.TryShowDialog
弹窗队列 MergeFlowChanceConfig_HomeFlow / LevelUpFlow、FlowPriorityConfig.Apply(Priority = 10000 − Weight)、FlowExecutor.Start
新手 MergeTutorialConfig_*、MergeNewUserBoardConfig_*、TestHome.RunStartupAsync
元系统 MergeProfileConfig_*、MergePushConfig_*、MergeRateAlertConfig_Main、InboxMailService
03

LiveOps 活动

版本:Frost Valley(com.liteorange.hometopia)v1.12.0,数据取自 APK 内置配置(extracted/config/tables/)。远程配置可能覆盖这些值。 标记:【配】 表示配置表或代码里能直接看到的值;【推】 表示根据字段名、表结构或调用关系推出来的结论。证据写在括号里,给出表名或类名。 时间:周循环表的 StartTime/Duration 单位是小时【配:WeeklyTask 168=7 天、BattlePass 672=28 天】。


3.1 活动框架

3.1.1 开启条件(三道闸)

层 规则 证据
总开关 GeneralActivitySwitch=true。关闭后所有活动失效 【配】ActivityManageConfig_Main
单活动开关 ActivityInfo.Switch。生效开关 = 单活动开关 && 总开关 【配】ActivityController.IsEffectiveSwitchOn
解锁等级 玩家等级 ≥ UnlockLevel 才会解析时间窗口;等级变化时重新计算(OnLevelChanged → Refresh) 【配】ActivityController.Refresh
分群 UsergGroupList:只有 EnergyBattlePass 填了 SilencePeriodNone/Small/Medium/Big,其余都是 All。解析器没有读这个字段 【配】表值;【推】分群在服务端或出表时处理

33 个活动中,内置配置里 25 个开、8 个关。关闭的是:MoleChestOrder、DailyRewards、SnowstormRush、EnergyBattlePass、OrderInterstitialAD、StorySeasonMerge、CoinDash、LadderOrder。

解锁等级分布:3 级(CozyRenovation、MoonlitStories、SnowstormRush)→ 4 级(SmileOrder、BeginnerPack)→ 5 级(CardCollection)→ 6 级(WeeklyTask、24hTask、StorySeasonMerge)→ 7 级(PinataScore、MonopolyLike、ThemeGiftPack、DailyRewards)→ 8 级(ScoreStage、CoinPve、CoinRace、MergeSingleBoard、MergeMultiBoard、MergeBattlePass、CoinDash、LadderOrder)→ 9 级(Tournament、EndlessTreasure、EnergyBattlePass)→ 10 级(BattlePass)→ 12 级(LevelUpPackage、MoleChestOrder、NewMoleChestOrder)→ 16 级(PenguinSki、Escape)→ 18 级(RoundDuel)→ 20 级(OrderInterstitialAD)→ 35 级(FlamingFrenzy)。

3.1.2 四种档期类型(ActivityLoopType)

LoopType 名称 时间来源 使用的活动
1 Permanent 常驻 无时间窗;自身逻辑决定何时有内容(CD、触发) SmileOrder、PenguinSki、LevelUpPackage、NewMoleChestOrder、DailyRewards(关)、MergeBattlePass、FlamingFrenzy、OrderInterstitialAD(关)
2 WeeklyLoop 28 天循环 ActivityLoop:StartDay(1–28)+StartTime(h)+Duration(h) 18 个,见 3.2
3 Calendar 日历 ActivityCalendar:绝对日期 yyyymmdd + 小时 CardCollection、StorySeasonMerge(关);ScoreStage 另有一条日历档 SpringtimeBonus_01(20260105–20260205),但它的 LoopType 是 2
4 Lifetime 个人触发 ActivityLifetime:TriggerType(levelup / buildpoint)+Trigger 值+Duration BeginnerPack、SnowstormRush(关)、CozyRenovation、MoonlitStories

Lifetime 触发表【配:ActivityManageConfig_ActivityLifetime】:

LifetimeID 触发 活动 Duration
CozyHearth_01 升到 4 级 BeginnerPack 2880(【推】分钟,即 48h;与 IAPBeginnerPackConfig_Main.Duration=2880 一致)
Icebreak01 levelup -1 BeginnerPack 2880(【推】-1 表示该条不启用或任意等级)
MoonlitStories_01 升到 3 级 MoonlitStories -1(不限时,完成为止)
StoryLuckyRiver_01 家园建造点累计 10 CozyRenovation -1
SnowstormRush01 家园建造点累计 10 SnowstormRush 30(【推】分钟)

3.1.3 28 天循环的锚点

【配:伪C WeeklyLoopResolver..cctor,与 ActivityMgr.ReCalculate28DayCycleWeekAndDay 共用同一个静态值】锚点是 new DateTime(2025,12,8,0,0,0,Utc)。第 1 天 = 锚点 + 28k 天,固定是周一 UTC 0 点;WeekIndex = 天/7+1,DayOfWeek = 天%7+1。因此 StartDay 1/8/15/22 都是周一,5/12/19/26 都是周五。全服统一按 UTC 切日,不按本地时区。

  • 例:2026-10-20 是本轮第 9 天,本轮第 1 天是 2026-10-12。日历档 CardCollectionHalloween2026 的结束日 20261207 恰好是新一轮的第 1 天。

3.1.4 状态机

ActivityStatus【配】:Expired=0 → Signup=10 → Running=20 → Settling=30。

(等级/开关满足 且 时间窗命中)
      │  TryResolveNextWindow → 新建 ActivityBaseData → EnsureResReady
      ▼
  Signup ──IsAutoSignup 或 TryMarkEnrollSuccess──▶ Running ──到期/TryMarkSettling──▶ Settling ──领完/CanExitSettling──▶ Expired
      ▲                                                                                              │
      └──────────────────────────── 下一个窗口(LoopID 不同 = 新实例) ◀──────────────────────────────┘
  • 【配】主玩法事件只会分发给 GetEffectiveStatus()==Running 的活动(ActivityMgr.OnXxx)。
  • 【推】Signup 用于需要玩家确认的活动,例如 Escape 先选难度(EscapePhase.NeedSignup、EscapeDifficulty Easy/Normal/Hard)。其余多数活动自动报名。
  • 【推】Settling 是结算展示和领奖阶段,例如 Tournament 的排名奖励弹窗 Tournament_RewardPopup。
  • 结束补发【配:ActivityInstanceBase.DoActEndAction】:活动结束时,未领取的奖励写入 ForceRewardSaveKey,由首页流程 HomeFlow.ActivityEndAction 统一补发,随后删除记录。弹窗优先级:_ForceReward=9950【配:MergeFlowChanceConfig_HomeFlow】。合成棋盘类活动结束时,棋盘和待发放队列里的棋子按 Recycle 表折算成资源(CollectForceRecycleRewards,见 3.4)。主棋盘上残留的活动棋子由 IActivityChessCleanupProvider 清理(PinataScore)。
  • 状态以 Activity.BaseData.<name> 为键存到本地(MessagePack),排行和机器人也在本地模拟,活动程序集里没有网络请求。

3.1.5 Leader / Follower

【配】MergeBattlePassInstance.IsFollower=true,通过 BindLeader / SyncStatusWithLeader 跟随 leader。ActivityMergeBattlePass_Main 只有两个键 MergeSingleBoard、MergeMultiBoard(值都是商品 bpmsb_399)。因此 MergeBattlePass 虽然配成常驻(LoopType=1),实际窗口与当周的合成棋盘活动同开同关。

3.1.6 入口位置与权重

ActivityInfo 有 4 个字段:HomeLocation / CorePlayLocation / OrderLocation / LocationWeight。

  • 【配:伪C ActivityUiService.GetHomeIconInfos/GetCorePlayIconInfos 的插入谓词】图标先按 Location 升序分组,同组内按 LocationWeight 降序排(权重大的排在前)。首页用 HomeLocation,局内用 CorePlayLocation。
  • 取值分布与含义:
字段 值 → 活动 含义
HomeLocation 0:WeeklyTask/ScoreStage/CoinPve/CoinRace/24hTask/Pinata/PenguinSki/Moonlit 等;1:Tournament、MSB、MMB、Monopoly、RoundDuel、Escape、StorySeason、Snowstorm;2:全部 iap 类(BattlePass、LevelUp、BeginnerPack、EndlessTreasure、ThemeGift、EnergyBP、MergeBP);3:CardCollection、CozyRenovation 【推】首页 3 组槽位(HomePageView.PlaceIconGroup 共 3 组):0/1 是活动栏,2 是礼包栏,3 是功能入口(集卡、家园)。0 是否表示不显示首页图标,未确认
CorePlayLocation 0:只在首页;2:局内侧栏(大多数);3:CoinPve/CoinRace/CoinDash/Pinata/LadderOrder;5:SmileOrder/FlamingFrenzy/OrderInterstitialAD 【推】3=金币/顶部区,5=订单栏内嵌表现
OrderLocation 1:SmileOrder、Pinata、FlamingFrenzy;2:ScoreStage、Tournament、MSB、MMB、Monopoly、RoundDuel、Escape、Moonlit、StorySeason 【推】1=订单卡上显示活动角标或棋子,2=交单后积分飞向局内图标(TryGetActivityOrderRewardIcon、BeginOrderSubmitFlyCollect)
LocationWeight 1000 OrderInterstitialAD;900 BattlePass、FlamingFrenzy;100 Moonlit;99 多数;98 24hTask;90 SmileOrder、LevelUp;89 RoundDuel;50 BeginnerPack;30 PenguinSki;20 Monopoly、EnergyBP、EndlessTreasure、CozyRenovation;11 MMB;10 MSB;5 Escape、ThemeGift;2 Tournament;1 ScoreStage 【配】同组排序权重,越大越靠前

3.1.7 资源预下载

【配:ActivityPreDownloadScheduler、ActivityResConst】

  • 资源包是 ActivityPackage(YooAsset),CDN 目录 .../ActivityRes,锁定版本 activity-1.12.0。共 1091 个 bundle,其中 303 个随包,其余按需下载。
  • 每次 Refresh 结束时调度预下载:挑出即将开启的窗口;用 ActivityLevelEtaTable.LevelEtaHours 估算玩家还要多少小时到达解锁等级(MaxLevel=30),只预下 ETA ≤ 48h 的活动;玩家等级要 ≥3;单任务超时 60s、冷却 60s、失败重试 1 次;每次只下载队头一个。
  • 活动开启时资源没准备好的话,EnsureResReady 失败,隔 5000ms 重试;资源就绪前活动不会进入运行。结束后调用 UnloadUnusedActivityAssetsAsync 卸载。
  • 【推】随包的是新手期和常驻活动:WeeklyTask、BattlePass、BeginnerPack、Pinata、MoonlitStories、CozyRenovation、NewUserReward。周循环和日历类活动靠预下载,体积较大的有 CardCollection 每套主题约 26MB、StorySeasonMerge 约 18.6MB。

3.2 28 天活动日历

数据:ActivityManageConfig_ActivityLoop(101 行)对照 ActivityInfo。■ = 档期开始日,□ = 档期延续日。跨过第 28 天的档期回绕到下一轮第 1 天:RoundDuel 第 28 天开的 48h 档会延续到下一轮第 1 天。完整数据见 ch3-data.json。

活动 开关 1一 2二 3三 4四 5五 6六 7日 8一 9二 10三 11四 12五 13六 14日 15一 16二 17三 18四 19五 20六 21日 22一 23二 24三 25四 26五 27六 28日
BattlePass 672h 开 ■ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □
WeeklyTask 168h 开 ■ □ □ □ □ □ □ ■ □ □ □ □ □ □ ■ □ □ □ □ □ □ ■ □ □ □ □ □ □
MergeSingleBoard 166h(+2h) 开 ■ □ □ □ □ □ □ ■ □ □ □ □ □ □ ■ □ □ □ □ □ □
MergeMultiBoard 166h(+2h) 开 ■ □ □ □ □ □ □
PinataScore 72h 开 ■ □ □ ■ □ □ ■ □ □ ■ □ □
EndlessTreasure 96h 开 ■ □ □ □ ■ □ □ □ ■ □ □ □ ■ □ □ □
ScoreStage 24h 开 ■ ■ ■ ■
Tournament 48h 开 ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □
24hTask 24h 开 ■ ■ ■ ■
Escape 24h 开 ■ ■ ■ ■
MonopolyLike 24h 开 ■ ■ ■ ■
ThemeGiftPack 72h 开 ■ □ □ ■ □ □ ■ □ □ ■ □ □
CoinRace 72h 开 ■ □ □ ■ □ □
CoinPve 72h 开 ■ □ □ ■ □ □
RoundDuel 48h 开 □ ■ □ ■ □ ■ □ ■
EnergyBattlePass 72h 关 ■ □ □ ■ □ □ ■ □ □ ■ □ □
CoinDash 72h 关 ■ □ □
LadderOrder 24h 关 ■ ■ ■ ■
MoleChestOrder 24h 关 ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
同时在线(周循环,开) 6 6 6 7 6 6 7 6 6 6 7 6 6 7 6 6 6 7 6 6 7 6 6 6 7 6 6 7
同时在线(含关闭项) 7 7 6 8 7 8 8 7 7 6 8 8 9 9 7 7 6 8 7 8 8 7 7 6 8 7 8 8

此外每天都在线、但受等级、触发或 CD 限制的活动:常驻 6 个(SmileOrder、PenguinSki、LevelUpPackage、NewMoleChestOrder、MergeBattlePass、FlamingFrenzy);日历档的 CardCollection;Lifetime 类的 MoonlitStories、CozyRenovation、BeginnerPack。高等级玩家同一时刻一般有 13–15 个活动入口。【配】计数口径:某天任一时刻在线即计入。

周节奏(每周相同骨架)【配】

  • 周一:WeeklyTask(整周)、合成棋盘活动(周一 02:00 起 166h,到周日 24:00 结束)、PinataScore 72h、EndlessTreasure 96h
  • 周二:ScoreStage 24h
  • 周三:Tournament 第 1 场 48h
  • 周四:24hTask 与 Escape 同日,各 24h
  • 周五:MonopolyLike 24h、ThemeGiftPack 72h;第 1、3 周加 CoinRace 72h,第 2、4 周加 CoinPve 72h
  • 周六:Tournament 第 2 场 48h
  • 周日:RoundDuel 48h(跨到下周一)
  • 整轮:BattlePass 28 天

_Ignore 档期与主题轮换

  • 【配】7 个虚拟活动名 ScoreStage_Ignore / CoinPve_Ignore / CoinRace_Ignore / MergeSingleBoard_Ignore / MergeMultiBoard_Ignore / 24hTask_Ignore / CoinDash_Ignore 共 27 行,都匹配不到 ActivityInfo,因此不生效。【推】这是"保留行、改名停用"的排期方式:把 ActivityName 改回真名就恢复档期。例如 ScoreStage 原来每周二、五各一场,现在只保留周二;24hTask 原来周四、六,现在只保留周四。
  • 主题由 LoopID 前缀决定(ActivityHelper.GetWrapperWithLoopId 切分 LoopID)【配】。当前轮换的合成棋盘:第 1 周 SurfsideTreasures(SurfsideTreasures_01)→ 第 2 周 CozyKitchen(_02)→ 第 3 周 MuseumQuest(_03)→ 第 4 周 MergeMultiBoard LatteHaze(_04)。每个主题 4 个 LoopID 里只启用 1 个,其余 3 个标成 _Ignore。【推】调整排期时只需在 4 行之间挪动 _Ignore 标记。
  • 其他活动在 v1.12.0 只有一个主题(如 Tournament=CookieFest、CoinRace=BankHeist),LoopID 序号只用来区分实例。

28 天活动日历深色表示当天全天在线,浅色表示当天部分时段在线。常驻和个人触发的活动不在此表中;“同时在线”只统计默认开启的活动。
全天部分时段不在线
12345678910111213141516171819202122232425262728
WeeklyTask
ScoreStage
CoinPve
CoinRace
Tournament
MoleChestOrder(关)
BattlePass
MergeSingleBoard
MergeMultiBoard
24hTask
PinataScore
MonopolyLike
EnergyBattlePass(关)
EndlessTreasure
RoundDuel
Escape
ThemeGiftPack
CoinDash(关)
LadderOrder(关)
同时在线6667667666766766676676667667

3.3 逐活动详解

3.3.0 通用积分源:棋子积分表

很多活动的分数来自同一张表 ActivityManageConfig_ActivityChessTicketRate【配】(160 行,每颗主线棋子一行)。每个活动在自己的 Main 表里用 TicketSource 指定取哪几列(ActivityTicketScoreType 共 10 种):

列 触发动作【推:按列名和 OnXxx 钩子对应】 数值特征(以 FoodA 链 Lv3→Lv15 为例)
OrderScoreA 交单时按订单内每颗棋子计分 3,3,5,8,15,30,58,116,234,470,935,974,1169(约每级 ×2)
OrderScoreB / C / E 同上,数值约为 A 的 0.63 倍 2,2,3,5,10,19,37,73,147,295,587,611,733
OrderScoreD 同上,封顶 5 1,1,1,2,3,3,4,4,5,5,5,5,5
MergeScore 合成出该棋子时 0,1,2…11(线性 +1/级)
MergeScoreRace 同上,竞速用的低值版 0,1,1,1,2,2,2,3,3,3,4,4
BubblePurchaseScore / ShopPurchaseScore 买泡泡棋子 / 商店棋子 2…14 线性;生成器 Lv1:泡泡 2、商店 5
DiffScore 订单难度分(不作为活动积分源) 2,4,8,…,2400,2500,3000

各活动使用的积分源【配:各 *_Main】:

活动 积分源
ScoreStage、MoonlitStories MergeScore + OrderScoreA + BubblePurchaseScore
Escape OrderScoreA + MergeScoreRace + ShopPurchaseScore + BubblePurchaseScore
RoundDuel MergeScore + OrderScoreA
Tournament OrderScoreC
MonopolyLike OrderScoreD(骰子票)
PinataScore、MergeSingleBoard、MergeMultiBoard、StorySeasonMerge OrderScoreA(转成活动棋子 ticket)

OrderScoreB 和 E 没有活动引用。ActivityOrderTicketRate(Deco1 一类 8 档:订单 Diffscore 0/47/197/314/498/791/1258/1998 → Token 20…200)只在 Meta 类里出现,代码中没有读取它的地方【配】。【推】这张表在 v1.12.0 未使用。


A. 任务类

WeeklyTask(7 日任务)|开|6 级|每周一 0 点,168h|pve

  • 规则【配:ActivityWeeklyTask_Weekly 28 行 = 4 周 × 7 天】:每天 5 个任务。第 N 天的任务组 WeeklyTaskX_N 第 1 个固定是 login_day_N(累计登录 N 天)。【推】第 N 天解锁当天的任务组,之前的任务组可以补做。第 3 周的 DiffDes=hard 只是标签,任务内容与其他周相同。
  • 积分来源【配:ActivityWeeklyTask_TaskPool 61 行】:每个任务完成后给固定 Score,另有一份小奖励(多为 Energy_5~50 或能量棋子)。代表行:
任务 要求 Score 任务奖励
merge_times_1 / _7 合成 250 / 2000 次 10 / 30 Energy_10 / 30
order_submit_1 / _7 交单 15 / 120 10 / 30 Energy_10 / 30
energy_use_1 / _7 耗体 500 / 3500 10 / 30 Energy_10 / 30
coin_get_1 / _7 得金币 2000 / 15000 20 / 90 Energy_15 / EnergyChest01
smile_get_1 / _7 得笑脸 20 / 150 20 / 90 EnergyChess01 / EnergyChest01
story_build_1 / _7 建造 12 / 100 20 / 90 Energy_15 / 50
gem_use_2 / _4 花钻 20 / 50 30 / 50 GemChess02 / 03

任务池里另有 deco_token_get 和 iap_times 两类,但没有排进任何一天。

  • 每天的可得分:70 / 100 / 90 / 175 / 145 / 200 / 210,合计 990。
  • 阶段奖励【配:ActivityWeeklyTask_Reward,4 周相同】:100 → Energy_75;220 → EnergyChest01;530 → Energy_125;750 → Gem_30;920 → Energy_250 + Gem_50 + CardPackYellow01。全部完成的额外奖励 StarReward = GreenChest01 + Gem_100 + Energy_300(【推】达成全部阶段后发放)。

24hTask(DiscoParty)|开|6 级|每周四,24h|pve

  • 【配:Activity24hTask_DiscoTaskList 10 个任务 + DiscoTaskPool】依次为:得金币 200 / 350 / 500,花钻 5,合成 100,交单 10,笑脸 8 / 20,交单 30,耗体 1000。每个任务给一份小奖励:Energy_10、BoxOfFries01、GemChess03、PicnicBasket01、GemChess02、DrinkCarrier01、JoyGift01、Energy_15、PotOfSeafood01 等。
  • 10 个全部完成后领 DiscoPartyFinalReward = Energy_50 + Gem_10 + SimpleChest01。【推】任务按 TaskIndex 顺序逐个出现。

SnowstormRush|关|3 级|Lifetime:建造点 10 触发,Duration 30|pve

  • 【配:ActivitySnowstormRush_TaskInfo】只有 2 个任务:交单 16、建造 8。全部完成奖励 CoinChest01 + GemChest01。结束前 10 分钟推送(ApproachingEndPush=10)。首页、建造页、局内都有表现开关,另有冰冻和风声 BGM 开关。

B. 积分 / 阶段类

ScoreStage(SpringtimeBonus)|开|8 级|每周二 24h(另有日历档 2026-01-05~02-05)|pve

  • 积分:MergeScore + OrderScoreA + BubblePurchaseScore。
  • 【配:ActivityScoreStage_SpringtimeBonus 20 档】每档需要的分数是增量(序列不单调,所以是逐档追加),合计 5150 分。代表档:50 → Energy_10;200 → EnergyChess04;300 → OrderChestA01;500 → Gem_15;第 20 档 600 → OrderChestB01。奖励在 Energy_10、OrderChoiceChest01、EnergyChess04、OrderChest 之间交替。

MoonlitStories(表名 LTStoreStage)|开|3 级|Lifetime:3 级触发,不限时|pve

  • 积分源同 ScoreStage【配:ActivityLTStoreStage_Main.MoonlitStories_01】。
  • 【配:ActivityLTStoreStage_Bonus】20 个节点,增量需求 30→300。前 12 个节点的 LifetimeID=MoonlitStories_01,需求合计 880,奖励是 Energy_10、EnergyChess01/02/04、Coin_10、OrderChoiceChest01。后 8 个节点 LifetimeID="none"(需求 100~300,奖励含 OrderChestA01/B01、Gem_15),【推】当前不生效,留给后续轮次。这是新手期的积分引导活动。

CozyRenovation(StoryLuckyRiver)|开|3 级|Lifetime:建造点 10 触发,不限时|story

  • 积分:家园剧情建造 OnStoryBuild,【推】每次建造得 1 分。
  • 【配:ActivityStoryLuckyRiver_NewBonus】10 档,增量需求 1,1,1,2,2,2,2,3,3,3(合计 20 次建造)。奖励是 Coin_10/20/30、Energy_10/20,最后一档 DailyChest02。

CoinPve(ShinyCoinParade,NPC Vivian)|开|8 级|第 12、26 天(周五)72h|pve

  • 积分:主线获得金币 OnCoinGet。
  • 【配:ActivityCoinPve_ShinyCoinParade】11 个节点,增量金币需求 50→1000,合计 4550 金币。每个节点有 Vivian 对话(VivianDialogueContent)。奖励偏宝箱和卡包:节点 1 DailyChest01 + CardPackGreen01;节点 4 GeneratorChest01 + DailyChest01 + CardPackGreen01;节点 10 GeneratorChest01 + DailyChest02 + CardPackRed01;节点 11 GeneratorChest01 + OrderChestA01 + OrderChestB01。

PinataScore(BeachEscape,NPC Luna)|开|7 级|每周一 72h|pve

  • 规则【配:ActivityPinataScore_*;PinataScoreInstance.TryGrantTicketChess → GiveActivityChessRewards】:
    1. 交单得到 OrderScoreA ticket。
    2. 按 ChessTicket 把 ticket 换成"贝壳"活动棋子并放到主棋盘:Lv1=5、Lv2=10、Lv3=20、Lv4=40、Lv5=80 ticket。每单最多 5 颗(MaxOrderChessNum=5)。
    3. 贝壳可以在主棋盘上合成(链 PinataScoreChess 最高 5 级)。点击收集得 PinataScore 分:Lv1→4、Lv2→8、Lv3→16、Lv4→35、Lv5→72(PinataAssetInfo)。只有 4、5 级合成后有溢价(2×16=32<35,2×35=70<72)。
    4. 积分推进 11 个阶段。
  • 阶段【配:ActivityPinataScore_Stage】:增量 30,90,120,225,90,165,270,180,360,600,600,合计 2730。奖励结构与 CoinPve 基本一致(最后一档 GeneratorChest01 + OrderChestA01 + OrderChestB01)。
  • 结束时清理主棋盘上残留的贝壳(IActivityChessCleanupProvider)。

PenguinSki(PenguinReward)|开|16 级|常驻,自带开启条件和 CD|pve

  • 开启【配:ActivityPenguinSki_Main】:OpenRequirementType=1,FixedEnergyUseRequirement=100,FixedEnergyLeftRequirement=50。【推】累计耗体 100 且剩余体力 ≤50 时触发一轮。每轮持续 Duration=360(【推】分钟,即 6h),轮间 CD=24(【配:PenguinSkiInstance 用 AddHours】小时)。
  • 积分:OnEnergyUse 与 OnGenerateChessToEdge。【推】ActivityPenguinSki_RewardChess(15 行)给出生成指定棋子时的得分,如 FoodA04=6、FoodA05=12、FoodB03=15、ClothingA04=15。
  • 3 个阶段 350 / 850 / 1400 分。达成后按 RewardScore 175 / 245 / 280 发奖:从 ActivityLoopRewardGeneralConfig_RewardChess 里 PenguinStageNAvailable=true 的 50 种棋子中,按棋子 Score 凑够这个预算(【推】预算制随机组合)。棋子 Score 示例:FoodA03=3、A08=96、FoodB06=128、GemChess03=70。

FlamingFrenzy|开|35 级|常驻,Duration 840 / CD 120(【配:FlamingFrenzyActivity 用 FromMinutes】分钟)|pve

  • 【配:ActivityFlamingFrenzy_Stage】按玩家等级分 3 段(1–45 / 46–80 / 81+),每段 3 个阶段:

    • 1–45 级:600 / 1400 / 2400
    • 46–80 级:700 / 1600 / 2700
    • 81 级以上:800 / 1800 / 3000

    三个阶段的返还率 ReturnRate 分别为 15% / 25% / 35%。

  • 【推】玩法由局内的 BlueMergeGame/FlamingFrenzyActivity 实现:积累火热值升阶,阶段越高,交单时附带的奖励棋子越多(按订单价值 × ReturnRate)。订单上有火焰标记(OrderIconRes),交单后有金币收集动效(PrepareFlamingFrenzyCoinCollect)。


C. 竞速 / PvP 机器人类

机器人通用模型

  • 表结构【配:Activity*_Robot】:DiffType(Top/Strong/Upper/Medium/Weak)、Number(人数)、InitialScoreBase、RatioLowLimit/HighLimit、OffsetValue[min,max]、UpdateInterval、ExceedScoreAdd[]、StandbyRatio、StandbyRatioNoPlayer。
  • 更新逻辑【推,依据伪C RobotHandler.OnUpdateScore / GetCurrentCap / GetRandomOffset / GetRandomExceedAdd】:
    • 每个机器人有一个 [Low,High] 区间内的随机比例。每过 UpdateInterval,目标分 ≈ 玩家当前分 × 比例 + 随机 Offset,再乘以本轮的 RoundRatio,四舍五入。
    • 已经超过玩家的机器人,从 ExceedScoreAdd 数组中随机取一个值作为增量(数组里多是 0,所以超过玩家后基本停住)。
    • 机器人分数不超过当前 Cap。Tournament 的 Cap 按"开赛后第几天"取(day0=2000,day1=3800)。
    • 回到前台时(OnEnterForeground)按 StandbyRatio 补算离线期间的增长;玩家没有参与时用 StandbyRatioNoPlayer。
    • UpdateInterval 与 Time.time 比较,【推】单位是秒。
  • 名字池:ActivityRobot_Name 600 个(如 Alex、CalebSky);Tournament 另用 ActivityTournament_RobotName 60 个(LunaM、JakeR…)。

Tournament(CookieFest 锦标赛)|开|9 级|每周三、周六各 48h|pvp

  • 积分:OrderScoreC(只计交单)。
  • 30 人榜:玩家 + 29 个机器人【配:ActivityTournament_Robot】:
档 人数 初始分 比例 Offset 间隔 待机比(有/无玩家)
Top 1 25 1.00–1.30 10–25 1 0.18 / 0.05
Strong 2 15 0.80–1.15 0–20 2 0.12 / 0.035
Upper 10 10 0.50–0.90 0–15 3 0.07 / 0.03
Medium 10 5 0.20–0.60 0–10 5 0.04 / 0.02
Weak 6 0 0–0.30 0–5 10 0.03 / 0.015

Cap=[2000,3800]。RoundRatio=[0.8,1.1,1.0,1.2,0.9,1.2](【推】按场次取用,6 个值对应 8 场时循环使用)。Top 机器人的比例上限 1.3 > 1,所以玩家要拿第一,需要在 Cap 限制下拉开差距。

  • 排名奖励【配:ActivityTournament_Reward】:第 1 名 Gem_20 + Energy_100 + DailyChest01;第 2 名 Gem_15 + Energy_80;第 3 名 Gem_10 + Energy_50;4–10 名 Energy_50;11–20 名 Energy_20;21–30 名无奖励。

CoinRace(BankHeist)|开|8 级|第 5、19 天(周五)72h|pvp

  • 积分:获得金币。5 人赛:玩家 + 4 个机器人(Weak 档 Number=0)。
  • 机器人【配:ActivityCoinRace_Robot】:
档 比例 Offset 间隔 StandbyRatio
Top 0.98–1.05 2–6 2 0.68
Strong 0.85–0.92 0–4 3 0.62
Upper 0.65–0.75 0–4 4 0.50
Medium 0.40–0.55 0–2 5 0.30

初始分都是 0;无玩家时待机比为 0,即玩家不在线时机器人不涨分。

  • 关卡【配:ActivityCoinRace_BankHeist】:12 轮,RoundCap(本轮目标金币)为 250, 300, 400, 500, 500, 500, 650, 650, 650, 800, 800, 1000,合计 7000。RoundRatio=[0.8,1,1,1.2,0.8,1.2] 调节每轮机器人强度。【推】先到 RoundCap 的前 3 名获奖,然后进入下一轮。
  • 奖励示例:第 1 轮第 1 名 DailyChest01 + Energy_15 + Energy_10;第 3 名 DailyChest01 + CardPackGreen01。第 4、8、12 轮另有里程碑奖:Energy_25 + DailyChest01 + OrderChestA01 → Energy_50 + DailyChest02 + OrderChestB01 → Energy_100 + DailyChest03 + OrderChestC01。

CoinDash(IslandClash)|关|8 级|第 12 天 72h(其余 3 档 _Ignore)|pvp

  • 机器人表、RoundRatio、12 轮 RoundCap 和里程碑与 CoinRace 完全相同【配:ActivityCoinDash_Robot / RewardInfo】。区别只在奖励:第 2、3 名不含卡包。【推】这是 CoinRace 的换皮版本(赛跑 RacerView 表现),目前停用。

RoundDuel(GooseDuel,与"鹅"对决)|开|18 级|每周日 48h|pvp

  • 积分:MergeScore + OrderScoreA。每轮 1v1,对手是 1 个 Upper 机器人【配:ActivityRoundDuel_Robot】:比例 0.65–0.95,Offset 0–4,间隔 1,StandbyRatio=1.0(离线时照常增长),无玩家时 0。
  • 轮次【配:ActivityRoundDuel_Task 113 轮】:前 8 轮 RoundCap 为 120,150,180,200,250,300,350,400,之后按 300/350/400 循环,合计 38700。【推】先到 RoundCap 的一方赢下本轮,玩家赢才进入下一轮。RoundRatio 有 12 个值:0.7,0.8,1.0,0.8,0.8,1.0,1.0,1.0,1.2,1.0,1.5,2.0,机器人逐轮变强。【推】超过 12 轮后沿用最后一个值。
  • 每轮奖励 SingleReward:Energy_15、PicnicBasket01 + CardPackGreen01、LevelDownChess01、各链 ChainPack、LevelUPChess01(第 113 轮)等。里程碑 Gacha 在第 2、5、8 轮,之后每 6 轮一次(12、18…108):GachaRoundDuel01 = Energy_25 + Gem_10;02 = Energy_35 + OrderChoiceChest01;03 = Energy_50 + RoyalChestA01【配:MergeChestGachaConfig_MixedGacha】。

Escape(DungeonEscape,地牢逃脱)|开|16 级|每周四 24h|pvp

  • 报名:先选难度 Easy / Normal / Hard(EscapePhase.NeedSignup)。积分:OrderScoreA + MergeScoreRace + ShopPurchaseScore + BubblePurchaseScore。
  • 关卡【配:ActivityEscape_DungeonEscape,3 难度 × 10 关】:
关 Easy 目标 Normal 目标 Hard 目标 胜者名额 过关奖励
1 60 90 120 100 —
2 80 120 150 70 CardPackGreen01
4 125 170 230 50 Energy_10/15/25 + CardPackBlue01
7 160 230 350 30 Energy_25/30/35 + CardPackRed01
10 200 290 500 5 大奖:E:Energy_100 + LevelDownChess01 + CardPackRed01;N:Energy_125 + OrderChestA01 + CardPackYellow01;H:Energy_150 + OrderChestB01 + CardPackPurple01
  • 机器人抢名额模型【配:伪C EscapeArrivalPressure;参数来自 ActivityEscape_Main】:
    • 压力值 p += GrowthPerMin × 经过分钟 × 关卡机器人速度。在线时 ActiveGrowthPerMin=0.004,离线时 OfflineGrowthPerMin=0.008(离线涨得更快);关卡机器人速度在 RobotSpeedLimit 0.85–1.05 之间随机。
    • 已被机器人占掉的名额 = floor(p × WinnerNum),p 最大为 1。
    • GetMaxPressureReservingLastSlot = (N−0.5)/N:最后 1 个名额始终留给玩家。【推】玩家不会因为机器人占满名额而失败,失败只来自时间。
    • 每关限时 StageFinishTimeLimit=60(StageFinishTimeLimitMin,分钟)。【推】60 分钟内达到目标即进入下一关,超时判负。
    • 以 Easy 第 1 关为例:在线 60 分钟,p ≈ 0.24,约有 24/100 个名额被占。

D. 订单改造类

SmileOrder(笑脸订单)|开|4 级|常驻|pve

  • 【配:ActivitySmileOrder_*;玩法在局内的 BlueMergeGame/Smile/SmileActivity】部分订单附带笑脸,交单得笑脸。累计到 SmileScoreRequirement 后开一次奖励,需求序列为 [6,6,6,6,8,8,8,8,10,10,10,10,12],【推】第 13 次之后保持 12。
  • 每次开奖的预算:笑脸数 → RewardScore(1→12、6→75、8→125、12→250)。按预算从 RewardChess 池里(SmileRewardAvailable 的 50 种)组合出 2–5 颗随机棋子,奖励物品数 8–12。体力等价返还率随等级递减:3–15 级 25%,16–25 级 20%,26–40 级 15%,41 级以上 10%。

NewMoleChestOrder(新鼹鼠订单)|开|12 级|常驻|pve

  • 【配】同时最多 2 单(CurNewMoleOrderMax=2)。交单后按策略掷骰(OnOrderSubmitted)决定是否出现鼹鼠宝箱订单:
策略 CD 概率 奖励预算
NewMole01 7200 5% 75
NewMole02 60 20% 90
NewMole03 90 20% 100
NewMole04 120 20% 110

【推】CD 单位为秒。奖励按预算从 RewardChess 池的 NewMoleNNAvailable 子集里组合;Mole01 只能出 9 种(Score 6–70)。

  • 旧版 MoleChestOrder(关):每周 12 档、各 24h;同时 2 单,返还率 60%,返还 5–12 颗棋子;ActivityMoleChestOrder_Reward 有 88 行,记录每种棋子的 EquivEnergy 和单次上限。

LadderOrder(SweetTiers,阶梯订单)|关|8 级|每周二 24h,ActivityDuration=30|pve

  • 【配:ActivityLadderOrder_OrderManage】一串 5 张订单,每张 2 颗棋子,用主棋盘或仓库里的棋子提交(LadderOrderBoardAdapter.TryConsume)。每张给笑脸 1/1/2/2/2,体力返还 5%→25%。全部完成大奖 CardPackPurple01。交单会经 ActivityMgr.OnActivityOrderSubmit 再分发给其他活动。

OrderInterstitialAD(EnergyRush)|关|20 级|常驻|pve

  • 【配】每完成 7 单(OrderRequirement=7)弹一次:基础奖励 Energy_10;看激励视频 ×3(RVRewardRatio=3)。

MonopolyLike(CandyCargo,糖果大富翁)|开|7 级|每周五 24h|pve

  • 骰子票:交单按 OrderScoreD 得票(每颗棋子 1–5 票),开局送 5 票【配:ActivityMonopolyLike_Main】。
  • 棋盘:24 格环形【配:ActivityMonopolyLike_BoardInfo】,按"Bonus、1、2、x2、5、10"的 6 格周期重复 4 次。骰子 1–6;倍注 [1,5,10,20,50],每次掷骰消耗 BaseCost(1) × 倍注 张票,【推】得分 × 倍注。
    • 格子类型:Normal 格给格子面值;x2 格固定 25 分;Bonus 格基础 50 分,SuperBonus ×2。
    • 落点加权(【推】用于控制掷骰结果):Normal 300 / x2 400 / Bonus 400,补偿权重 50 / 50。
  • 进度【配:ActivityMonopolyLike_Reward 35 档 = 7 组 × 5 档】:每组内累计需求递增,如第 1 组 200/400/600/1000/2800,第 7 组 8500/12000/15000/18000/25000。奖励交替为卡包(Green→Blue→Red→Yellow→Purple 逐组升级)、OrderChoiceChest、GeneratorChest、CoreplayChest。每组最后一档是大奖:CoinChest01、EnergyChest01、GemChest01、Joy/Flower/Toy ChainPack,最后是 CardPackPurple01。

E. 独立合成棋盘类(详见 3.4)

活动 开关/等级 档期 要点
MergeSingleBoard 开 / 8 第 1/8/15 天 +2h,166h,三主题轮换 8×6 单棋盘,MainChess 12 级
MergeMultiBoard(LatteHaze) 开 / 8 第 22 天 +2h,166h 4 块棋盘 + 传送门,MainChess 13 级
StorySeasonMerge(StorySeasonHalloween) 关 / 6 日历 2026-10-21~11-03 14×7 剧情棋盘,MainChess 15 级,自带等级、通行证、奖杯和无尽礼包

F. 通行证类

BattlePass(PrizePath)|开|10 级|第 1 天起 672h(整轮 28 天)|iap

  • 积分任务【配:IAPBattlePass_Task,【推】每满 RequireNum 计一次分,可重复】:
任务 每满 分 折合
login_day 1 天 30 30/天
order_submit 5 单 100 20/单
merge_times 100 次 10 0.1/次
coin_get 100 金币 50 0.5/金币
story_build 2 次 60 30/次
smile_get 2 个 20 10/个
gem_use 5 钻 30 6/钻
  • 曲线【配:IAPBattlePass_Reward 46 行】:阶段 1=0 分,2=300,3=800,之后每阶段 +100,第 45 阶段=5000。第 46 行是无尽宝箱:满级后每 1000 分开一次,只有付费线有奖励(Premium1st=OrderChestB01)。【推】按 28 天平均,每天约需 180 分。
  • 付费【配:IAPBattlePass_Main】:
    • VIP bp499($4.99):额外 +3000 分、+100 体力。
    • Deluxe bp799($7.99):额外 +3000 分、+150 体力,此后积分 ×1.5。
    • VIP 升级到 Deluxe:bp399($3.99)。
    • 活动过期后仍可以购买 VIP(RequestExpiredPurchaseVIP)。
    • 【推】VIP 解锁 Premium1st 列,Deluxe 解锁 Premium1st/2nd/3rd 三列。
  • 代表档位:
阶段 分 免费 Premium1st Premium2nd Premium3rd
1 0 EnergyChest01 Energy_150
10 1500 OrderChoiceChest01 FoodB05 FoodA08 FruitA08
22 2700 Energy_150 FoodA09 CardPackRed01
36 4100 DailyChest03 EnergyChest01 DailyChest03 DailyChest03
45 5000 Energy_200 Gem_80 CardPackBlue01 CardPackPurple01

MergeBattlePass(棋盘通行证,follower)|开|8 级|跟随当周的 MSB/MMB|iap

  • 推进方式【配:ActivityMergeBattlePass_MergeSingleBoard/MergeMultiBoard 各 13 阶】:没有积分,第一次合成出 ChessUnlock 指定的棋子(图鉴解锁)就推进一阶(SynchronizeBookProgress)。
    • MSB:MainChess02→…→MainChess11、SideChess07、MainChess12、SideChess08。
    • MMB:从 MainChess03 起,到 MainChess13、SideChess08。
  • 免费线:前期给 MainChess01/02(1→8 颗,反哺棋盘),后期 Gem_20、Energy_150。
  • 付费线 bpmsb_399($3.99):
    • MSB:Energy_100、EnergyChest01、Gem_50、OrderChoiceChest03、OrderChestB01/C01、Gem_100 等。
    • MMB:付费线改成卡包为主(CardPackBlue/Red/Yellow/Purple)。

EnergyBattlePass(EnergyStorm)|关|9 级|每周五 72h,仅 Silence 分群|iap

  • 【配:IAPEnergyBattlePass_TaskList】15 档,按累计获得金币 250→5500 解锁体力奖励(50 为主,第 5、10 档 100,第 15 档 200,合计 1050 体力)。
  • 付费【配:IAPEnergyBattlePass_UserSeg 13 档】:energybp01_99~energybp13_4999,Ratio 1.0–12.1(【推】奖励倍数),ValueRate 220–400(展示性价比)。DynamicBundlePricing="up"。默认商品 energybp01_99。3 个分群表与默认表相同。【推】要购买后才能领取体力。

G. 付费礼包类

活动 开关/等级/档期 规则与价位【配】
EndlessTreasure(MailboxTreasure) 开 / 9 / 每周一 96h 57 格无尽链:第 1–3 格免费且不循环,第 4 格起循环(IsLoop=T)。每 6 格一个付费格,位于第 4、10、16…52 格,价格 $0.99 / 1.99 / 2.99 / 4.99 / 7.99 / 9.99 / 15.99 / 24.99 / 39.99。付费格奖励从 Energy_100 + Gem_30 到 Energy_1500 + Gem_1200。免费格是 Energy_15~、Gem_5~、各链棋子和 OrderChoiceChest。【推】要按顺序领取,付费格不买就无法继续往后领。首页自动弹窗每天最多 2 次。3 个付费分群表与默认表相同
ThemeGiftPack(MerryGoRound) 开 / 7 / 每周五 72h 17 个价位 theme_gift_pack_99~3999,奖励 Gem_30 + Energy_100 + RoyalChestA01 + CoinChest01($0.99)到 Gem_3200 + Energy_800 + RoyalChestB01 + OrderChoiceChest01($39.99)。初始商品 $0.99。DynamicBundlePricing="30day_avg_auto"(【推】按 30 日平均付费额选档)。每日限购 -1(不限)。展示时长 240。首页弹窗每天 1 次
LevelUpPackage 开 / 12 / 常驻,升级触发 IAPLevelUpPackageConfig_PurchaseInfo 194 行,覆盖第 7–200 级的每次升级:7–16 级是 levelup_maintain_199,17–29 级的奇数级是 levelup_generator_199,30 级以上是 levelup_199。RewardInfo 21 个价位 $1.99–39.99(ValueRate 3.0–3.5),例:levelup_199 = Gem_100 + Energy_50 + PickChestA01 + OrderChoiceChest02 + StarterChest01 + …。Duration=3600(【推】秒,限时 1h)。DynamicBundlePricing="down"。3 个分群表与默认表相同
BeginnerPack(NewBeginnerPackage / CozyHearth) 开 / 4 / Lifetime:4 级触发 48h 10 个价位 $0.99–9.99。$0.99 档 = Gem_100 + Energy_300 + BeginnerPack01 棋子包;高价位档含 BeginnerPack01_2/_3。默认商品 beginnerpack01_99。有 IAP Banner
DailyRewards(DailySign) 关 / 7 / 常驻 7 日签到:Energy_10、FoodA06、Energy_20、FoodB04、FruitB04、OrderChoiceChest03、GemChess03。月度里程碑(第 8/15/22/30 天):PickChestA01 + Energy_25 → … → OrderChestC01 + Energy_100 + Gem_10

付费点汇总:BattlePass($4.99 / $7.99 / 升级 $3.99)、MergeBattlePass($3.99)、StorySeasonMerge 通行证(bpseason_merge_399,$3.99)及其无尽礼包($0.99–39.99)、EndlessTreasure、ThemeGiftPack、LevelUpPackage、BeginnerPack、EnergyBattlePass。


H. 个人触发类(Lifetime)

BeginnerPack(G)、MoonlitStories、CozyRenovation(B)、SnowstormRush(A)。触发与时长见 3.1.2。触发点:ActivityMgr.OnLevelChanged → TryTriggerLifetime(升级)和 TestHome 的建造点回调(BuildPoint)【配】。

I. 集卡:CardCollection(详见 3.5)


3.4 独立合成棋盘活动

三个活动共用 ActivityMergeGame 程序集(MergeActivityPlayGame + ActivityMergeBoard),通过 ActivityMergeEnterParams 复用主线的合成规则【配】。

3.4.1 对比总表

项 MergeSingleBoard MergeMultiBoard(LatteHaze) StorySeasonMerge(Halloween26)
主题 SurfsideTreasures / CozyKitchen / MuseumQuest。三套共用同一份 Board、ChessChain、Ticket、Recycle 表,只有棋子和障碍资源表(*Chess 43 行、*Blocker 4 行)不同【配】 LatteHaze StorySeasonHalloween_01(其他表里已有 Dec 预留行)
棋盘 8 行×6 列 = 48 格:38 格双层遮挡(A+B)、6 格单层(B)、4 格空 4 块:5×5、8×5、8×6、8×6;每块有一个传送门 Portal01 14 行×7 列 = 98 格:73 格 A+B、4 格 B、21 格空(底部 3 行)
链与级数 MainChess 1–12,SideChess 1–8;活动金币 2–8、钻石 3–7、体力 3–8 MainChess 1–13,SideChess 1–8;三种资源链同左;Portal MainChess 1–15,SideChess 1–8,资源链;另有 GreenExp / RedExp 经验链 1–4
开局 StartChess=MainChess01_5(5 颗) 同左 同左;自动解锁 2 行(AutoUnlockRowCount=2);剩 7 个障碍时解锁(BlockerUnlockRemainingCount=7)
Ticket 来源 主线交单的 OrderScoreA,每单最多 5 颗 同左,每单最多 5 颗 同左,每单最多 15 颗
图鉴奖励 Main 链 Energy_50 + GemChess03;Side 链同;全图鉴 Energy_100 + Gem_20 Main 链 Energy_50,Side 链 Energy_100;全图鉴 Energy_100 + Gem_20 走等级、奖杯、通行证
挂载通行证 MergeBattlePass(bpmsb_399) MergeBattlePass(bpmsb_399) 自带 Pass 16 阶(bpseason_merge_399)
付费礼包 — — 57 格无尽礼包,付费格价位同 EndlessTreasure

障碍【推】:BlockerA/B 是两层遮挡,格子下面预置了棋子(如 MainChess07)。逐层解开后棋子才能使用,相当于棋盘上的"宝藏"。

3.4.2 Ticket 兑换率(主线交单 → 活动棋子)

【配:*_ChessTicket】【推:MergeSingleBoardInstance.GetRewardChessInfoWithScore 对按 TicketScore 升序的表取不超过分数的最高一档,换出的棋子进入待发放队列 WaitToGrant,玩家在棋盘上逐颗领取】

棋子 MSB ticket MMB ticket StorySeason ticket
MainChess01 6 10 3
MainChess02 12 20 6
03 / 04 / 05 24 / 48 / 96 40 / 80 / 160 —
06 / 07 / 08 192 / 384 / 768 320 / 640 / 1280 —
09 1536 5120(不再按 2 倍递增) —

换算示例【配:OrderScoreA】:一单含 FoodA07(15)+ FruitA06(10),ticket 为 25:MSB 换 1 颗 MainChess03(24),MMB 换 1 颗 MainChess02(20),StorySeason 换 MainChess02(6)。高价值订单,如含 FoodA10(116),在 MSB 能直接换到 MainChess05(96)。因为 ticket 档位按 ×2 设计,与合成的 2 合 1 等价,所以玩家直接拿高级棋子和拿多颗低级棋子再合成,得到的价值相同。

3.4.3 生成器与产出

  • 【配:*_AutoGeneratorInfo / ChessGeneratorInfo;GenerateType=1、SpreadType=1】没有点击式生成器。【推】合成出某级 Main/Side 棋子时,按 SpreadWeight 列表向周围喷出资源棋子(名称_数量)。例:
    • MSB 合出 MainChess05:喷 ActivityCoinChess03 ×2。
    • MSB 合出 MainChess12:喷 Coin06×7、Energy06×2、Energy05×3、Energy04×1、Gem04×7、Gem03×1、SideChess01×3。
    • MMB 合出 SideChess07 / 08:额外喷 ActivityLevelDownChess01 / ActivityLevelUPChess01。
    • StorySeason 每级都喷 GreenExpChess,作为赛季经验来源。
  • 宝箱棋子【配:ActivityMergeBoardGeneraConfig_GeneratorInfo】:
    • ActivityMainChest01:点 9 次,产出 MainChess02/03/04 和 Energy03/04。
    • ActivityCoinChest01 / EnergyChest01:各点 5 次,产出 Lv4–7(权重 40/30/20/10)。
    • ActivityGemChest01:点 3 次。
  • 资源棋子收集【配:*_Asset】:Coin04–08 → 金币 2/6/14/30/62;Gem04–07 → 钻石 1/3/7/15;Energy04–08 → 体力 2/6/15/40/100(约每级 ×2.3)。
  • 反哺主线【配:CoreplayReward】:ActivityLevelUPChess01 / LevelDownChess01 收集后变成主线的 LevelUPChess01 / LevelDownChess01(升级 / 降级道具)。

3.4.4 回收(Recycle,活动结束清算)

【配:*_Recycle;CollectForceRecycleRewards】活动结束时,棋盘和待发放队列里的棋子折算成资源:

  • MSB:MainChess03→1 体力,然后每级 ×2,MainChess11→256 体力;MainChess12(终点)→0。SideChess01→1 … 07→64,08→0。资源棋子按 Asset 表的值折算。
  • MMB:从 MainChess04 起算(1 体力),MainChess12→256,MainChess13→0。另有宝箱:CoinChest→50 金币、GemChest→10 钻、EnergyChest→50 体力、MainChest→10 体力。
  • StorySeason:Main、Side、经验链全部按 0 回收,只有资源链有回收值。

3.4.5 MergeMultiBoard 专有

  • BoardUnlock【配】4 个阶段,对应 UnlockMainChess 9 / 11 / 12 / 13。【推】合成出该级 MainChess 时解锁下一块棋盘或终局。
  • 传送门【推】:棋子拖到 Portal 上会转移到另一块棋盘(BoardTransferPopup、PortalUnlockPopup)。
  • 第 2–4 块棋盘的下半区预铺了整片资源棋子:第 2 块 15 格 Coin04,第 3 块约 20 格 Energy04,第 4 块约 16 格 Gem03。

3.4.6 StorySeasonMerge 专有(关闭中)

  • 赛季等级【配:_Level 10 级】:Exp 0,80,120,200,300,500,700,900,1200,1500,奖励从 Energy_30 到 Energy_200 + Gem_80 + Coin_100 + DailyChest02 + OrderChoiceChest03。【推】经验来自收集 GreenExpChess。
  • 奖杯【配:_Trophy】:
    • Halloween26_01_1:MainChess 解锁到 6/8/10/12/15 级,奖励 Energy_100 + Gem_20。
    • Halloween26_01_2:解锁到 13 级,奖励 Energy_50。
  • 剧情节点【配:_StoryNodeRes】:开局播视频和对话,之后合出 MainChess 7/9/11/13/14/15 时各播一段对话,共 7 个节点(通过 PlayDialogueVideoAsync 调用主线剧情系统)。
  • 通行证 16 阶:用 MainChess02–15、SideChess07/08 的解锁推进。免费线 MainChess01/02 ×1~8;付费线 Energy、Gem、OrderChest。
  • 无尽礼包【配:_Package】:结构同 EndlessTreasure,但奖励全是 MainChess01(免费格 1–2 颗,付费格 2/4/6 颗)。

3.5 集卡 CardCollection

  • 档期【配】:Calendar 类型,解锁 5 级。FluffyCollection 2026-08-20~10-22,Halloween2026 2026-10-23~12-07,两期首尾相接。活动开始送 InitialCardPackReward=CardPackBlue01。
  • 卡册【配:CardGroup 15 组、CardInfo 135 张,每组 9 张】:
    • 每组集齐的奖励随组号递增:组 1–4 Energy_60,5 Energy_70,6 Energy_80,7–9 Energy_100,10–12 Energy_120,13–14 Energy_200,15 Energy_400。
    • 全册集齐:第 1 次、第 2 次和之后每次都是 Energy_600 + Gem_200 + LevelUPChess01(First/Second/OtherCollectionReward)。
  • 稀有度【配:CardType】:
稀有度 张数 初始掉率
silver_1(1 星) 33 34.34%
silver_2 28 26.23%
silver_3 23 17.56%
silver_4 18 10.62%
silver_5 15 6.25%
gold_5(金 5 星) 18 5.00%

前几组以低星卡为主,组 13–15 集中了金卡(各 3 张)。

  • 卡包【配:CardPack;伪C CardCollectionDropLogic.GetCardCount / CanDropGold】:
卡包 卡数 能出金卡 回合末兑星 StarChangeNum 作为棋子换体力 EnergyExchange
Green 2 否 2 10
Blue 3 是 4 15
Red 4 是 6 20
Yellow 6 是 16 80
Purple 6 是 24 100
Special 6 是 30 0
  • 保底与权重【配:CardCollectionDropLogic 常量与伪C】:
    • 每张卡先按稀有度权重抽类型,再在该类型内抽具体卡。
    • 某组只剩最后一张未收集时,该卡权重 ×1.8。
    • Yellow 包第 3 / 4 次开(统计值 = 2 / 3)时,未收集卡权重 ×1.33 / ×1.66。
    • 强制出新卡:Yellow 在统计值 >3 时、Purple 在 >1 时(ShouldForceMissing)。【推】统计值是连续未出新卡的开包次数。
    • Special 包有 50% 概率只从未收集卡中抽。
    • 高星保底 HighStarMinNum=3:【推】部分卡包至少出 1 张 3 星及以上的卡,必要时替换掉重复卡或低星卡(FindDuplicateReplaceIndex / FindLowStarReplaceIndex)。
  • 订单掉卡【配:ActivityCardCollection_OrderCard;伪C BlueMergeCorePlayGameManager.FinishOrderEvent → CardCollectionOrderCardResolver.Resolve(OrderData.basicOrderDifficulty)】:交单时当订单的 basicOrderDifficulty 落在 [Min,Max] 区间内就掉对应卡包:
区间 卡包
9999–19999 Green
29999–39999 Blue
49999–59999 Red
69999–79999 Yellow
89999–99999 Purple
≥199999 Special

区间之间留有空档,落在空档里不掉包。【推】单颗棋子的 DiffScore 最高只有 3000,普通订单很难达到这些阈值,所以卡包主要来自其他活动的奖励。

  • 卡包的其他来源【配:全表检索】:RoundDuel(48 处,最多)、BattlePass(25)、MonopolyLike(15)、Escape(18)、CoinRace(16)、CoinPve、Pinata、MergeBattlePass(MMB)、WeeklyTask(每周 Yellow)、LadderOrder(Purple)、星星宝箱。
  • 星星【配:CardCollectionDataService.GetStarNum(cardType)、ConsumeDuplicateCardStars、ExchangeRoundResourcesForStars】:
    • 卡的星数取 CardType 末尾数字(1–5)。
    • 重复卡转成对应星数的星星。【推】
    • 一期结束时,手上没开的卡包按 StarChangeNum 换成星星。
    • 星星宝箱【配:StarChest + MixedGacha】:100 星 → GachaStarChest01(Energy_30 + CardPackBlue01),200 星 → 02(Energy_50 + CardPackYellow01),400 星 → 03(Energy_100 + CardPackPurple01)。宝箱会再开出卡包,形成"重复卡 → 星星 → 卡包"的循环。
  • 弹窗优先级:CardCollection_OpenAndCollect 15000(仅次于账号和 Gacha),CardCollection_Start 9905【配:MergeFlowChanceConfig_HomeFlow】。

3.6 活动与主玩法的耦合点

【配:各 *Instance.cs 中覆写的 OnXxx 钩子与实现的接口;调用方见 RecordHelper、OtherMgrModule、TestHome、ShopService、BlueMergeCorePlayGameManager】

主玩法事件(钩子) 主玩法调用方 使用的活动
OnOrderSubmit(交单) RecordHelper WeeklyTask、24hTask、BattlePass、ScoreStage、Tournament、Escape、RoundDuel、MonopolyLike、PinataScore、MoonlitStories、MergeSingleBoard、MergeMultiBoard、StorySeasonMerge、SnowstormRush、OrderInterstitialAD
IOrderSubmitScoreProvider(交单按棋子计分 + 飞行动效) OrderSubmitScoreQuery ScoreStage、Tournament、Escape、RoundDuel、MonopolyLike、PinataScore、MoonlitStories、MSB、MMB、StorySeasonMerge
OnOrderSubmitted / 订单数据直改 BlueMergeCorePlayOrder / GameManager NewMoleChestOrder、MoleChestOrder、SmileOrder、FlamingFrenzy、CardCollection(GrantOrderCardPacks)
OnMerge(合成) RecordHelper WeeklyTask、24hTask、BattlePass、ScoreStage、Tournament、Escape、RoundDuel、MonopolyLike、PinataScore、MoonlitStories、MSB、StorySeasonMerge
OnBubbleChessBuy / OnShopChessBuy(买泡泡 / 商店棋子) RecordHelper / ShopService ScoreStage、Tournament、Escape、RoundDuel、MonopolyLike、PinataScore、MoonlitStories、MSB、StorySeasonMerge
OnEnergyUse(耗体) OtherMgrModule WeeklyTask、24hTask、BattlePass、PenguinSki
OnGenerateChessToEdge(生成器出棋) RecordHelper PenguinSki
OnCoinGet(得金币) OtherMgrModule WeeklyTask、24hTask、BattlePass、CoinPve、CoinRace、CoinDash、EnergyBattlePass
OnGemUse(花钻) OtherMgrModule WeeklyTask、24hTask、BattlePass
OnSmileGet(得笑脸) RecordHelper / LadderOrder WeeklyTask、24hTask、BattlePass
OnStoryBuild(家园建造) TestHome WeeklyTask、24hTask、BattlePass、CozyRenovation、SnowstormRush
OnLogin(登录日) ActivityMgr WeeklyTask、24hTask、BattlePass
OnAssetGet(资源变化) OtherMgrModule / CorePlayTopOrderPrefab PinataScore、FlamingFrenzy
OnLevelChanged / OnLevelGranted(升级) OtherMgrModule 所有活动的解锁判定;LevelUpPackage;Lifetime 触发(BeginnerPack、MoonlitStories)
BuildPoint 触发 TestHome CozyRenovation、SnowstormRush
OnActivityOrderSubmit(活动订单再分发) LadderOrderBoardAdapter LadderOrder → 其他活动
反向:GiveActivityChessRewards / ClearActivityChesses(往主棋盘发或清活动棋子) BlueMergeCorePlayGame PinataScore、各活动的棋子奖励、StorySeason 反哺
反向:ShowOrderInterstitialAd OrderInterstitialAdController OrderInterstitialAD
反向:PlayDialogueVideoAsync / IsStoryAllFinished StoryLauncher StorySeasonMerge、CoinPve / Pinata 对话
IAP 回调 / IAPBanner ShopService / IAPBanner BattlePass、BeginnerPack、MergeBattlePass、EnergyBattlePass、EndlessTreasure、ThemeGiftPack、LevelUpPackage、StorySeasonMerge

附:配置确认与推断对照

结论 性质
28 天循环锚点为 2025-12-08 周一 UTC;Loop 的时间单位是小时 配置确认(伪C 常量;168/672 换算)
图标按 Location 升序、Weight 降序排列 配置确认(伪C 比较谓词)
HomeLocation / CorePlayLocation / OrderLocation 各值对应屏幕哪个位置 推断
_Ignore 行是停用的档期,用来做主题轮换 推断(表现上不匹配任何 ActivityInfo 是确认的)
机器人分数 ≈ 玩家分 × 比例 + Offset,乘 RoundRatio,受 Cap 限制 推断(依据伪C 的算术形态)
Escape 压力值公式、名额计算、最后一个名额留给玩家 配置确认(伪C)
卡包张数(2/3/4/6/6/6)、Green 包不出金卡、强制出新卡的阈值 配置确认(伪C)
订单掉卡按 basicOrderDifficulty 落区间判断 配置确认(伪C 调用与字段偏移)
Ticket 换"不超过分数的最高一档"棋子 推断
FlamingFrenzy 的时间单位是分钟;PenguinSki 的 CD 单位是小时 配置确认(FromMinutes / AddHours);PenguinSki Duration 的单位是推断
Lifetime / BeginnerPack Duration 2880 单位为分钟;LevelUpPackage 3600 单位为秒 推断
内置配置里的开关状态 配置确认;线上可能被远程配置改写
04

商业化

适用版本:Frost Valley(com.liteorange.hometopia)v1.12.0,包内默认配置。线上可被 AB 实验 / 远程配置整表覆盖(见第 05 笔记 §6.1),本章数值只代表出包默认值。

标记约定:【配】 配置表直接读到;【码】 C# 签名或伪 C 里能确认的逻辑;【推】 推断(附依据)。证据只写表名 / 函数名。价格单位:配置里 USDPrice 以美分存(199 = $1.99),下文统一写美元。

图表数据:notes/design/ch4-data.json(价格带分布、钻石档每美元钻石、仓库扩格曲线、各礼包每美元货币量、体力通行证各档)。


4.1 货币体系

游戏有三种硬通货:金币 Coin、钻石 Gem、体力 Energy。另有活动代币(如季节活动的 MainChess)不在本章范围。初始持有 Coin 66 / Energy 100 / Gem 30【配】MergeAssetInfoConfig_AssetInfo。

4.1.1 金币(Coin)——建造货币,不能直接买

方向 内容 证据
来源 提交订单(主来源;订单金币 ≈ 棋子 Price × 当日难度系数 0.7/1.0/1.3) 【配】MergeChessConfig_CorePlayChessConfig.Price、MergeOrderDiffStateConfig_OrderStateFactor;系数用法【推】
来源 金币棋子 CoinChess01–05 点击兑现 2 / 6 / 14 / 30 / 62 【配】MergeChessConfig_AssetChessInfo
来源 普通泡泡破裂、泡泡合成奖励都给 CoinChess01 【配】MergeBubbleConfig_BubbleStrategy
来源 金币宝箱 CoinChest01(每日特价 25 钻、主题礼包附赠、升级包附赠) 【配】MergeShopPageConfig_DailySpecial*、IAPThemeGiftPack_RewardInfo
来源 出售棋子 SellPrice(1–11) 【配】CorePlayChessConfig.SellPrice;币种为金币属【推】
来源 各类活动奖励 【配】Activity*_Reward*
消耗 家园建造:1163 个建造点每点 16→600 金币,合计 371,722 【配】StoryStrategy_LTProgress.CoinCost
消耗 等级进度按“花掉的金币”计(CostType=2),等级不单独扣币 【配】MergeLevelConfig_Main;【码】LevelSys.GetLevelCost
可否购买 不能直接买:122 个 SKU 里没有一个直接给 Coin;只能间接买 CoinChest01(钻石或礼包) 【配】IAPInfo_PurchaseInfo 全表

4.1.2 钻石(Gem)——付费主货币

方向 内容 证据
来源 IAP:6 个钻石档、新手包、升级包、主题礼包、无尽宝藏付费格 【配】见 4.2
来源 新手奖励:2 级 50;3、4、6–10 级各 10(5 级换 StarterChest01) 【配】MergeTutorialConfig_NewUserReward
来源 钻石棋子 GemChess01–04 = 1 / 3 / 7 / 15;钻石宝箱 GemChest01 【配】MergeChessConfig_AssetChessInfo
来源 资源气泡广告 Gem_10(每日 7 次) 【配】AdConfig_AssetBubble
来源 通行证付费轨(BattlePass Premium1st 合计 145 钻;合成通行证 Premium 200 钻) 【配】IAPBattlePass_Reward、ActivityMergeBattlePass_*
来源 无尽宝藏免费格(每轮 5→28,共 143 钻)、钻石抽奖 GachaGemLottery(5–25) 【配】IAPEndlessTreasure_RewardInfo、MergeChestGachaConfig_AssetGacha
来源 周任务、锦标赛、阶段活动等活动奖励 【配】ActivityWeeklyTask_Reward、ActivityTournament_Reward 等
消耗 体力购买、仓库扩格、泡泡、生成器加速、商店棋子、商店刷新、每日特价 见 4.4
可否购买 可以(商店钻石页 + 各类礼包) —

4.1.3 体力(Energy)——行动力

方向 内容 证据
来源 自然恢复:每 120 秒 +1,上限 100(0→满 200 分钟) 【配】MergeEnergyConfig_Main
来源 钻石购买:每次 +100,当日第 1–5 次 10 / 20 / 40 / 80 / 160 钻 【配】MergeEnergyConfig_EnergyRecharge;按日计数【码】EnergyPurchaseService.GetTodayBuyCount
来源 激励广告:体力不足弹窗 +25;资源气泡 +30 【配】AdConfig_Main.AdRestoresEnergy、AdConfig_AssetBubble
来源 体力棋子 EnergyChess01–05 = 2 / 6 / 15 / 40 / 100;体力宝箱 EnergyChest01 【配】MergeChessConfig_AssetChessInfo
来源 升级奖励(200 级合计 Energy 500 + 宝箱)、新手奖励(3–10 级各 20) 【配】MergeLevelConfig_LevelCostReward、MergeTutorialConfig_NewUserReward
来源 IAP:几乎所有礼包都带体力;体力通行证专卖体力 【配】见 4.2
来源 体力抽奖 GachaEnergyLottery(200–400) 【配】MergeChestGachaConfig_AssetGacha
消耗 点击生成器:基础 1 点 × 体力倍率(×2 16 级解锁,×4 / ×8 30 级解锁,×8 需持有 ≥400) 【配】MergeEnergyConfig_EnergyBoost、MergeChessGeneratorInfo.BasicEnergyConsume
可否购买 可以(钻石兑换、礼包、体力通行证) —

4.2 IAP 商品:122 个 SKU 全表

【配】IAPInfo_PurchaseInfo 共 122 行,只有 6 个钻石档的 RewardInfo 直接写了内容,其余为空,内容由各礼包表按 PurchaseID 提供。

4.2.1 类别总览

类别 SKU 数 价格范围 内容来源表 默认是否开放
钻石档 6 $1.99–99.99 IAPInfo_PurchaseInfo 是(3 级商店)
新手包 10 $0.99–9.99 IAPBeginnerPackConfig_PurchaseInfo 是,但默认只卖 $0.99
升级包 21 $1.99–39.99 IAPLevelUpPackageConfig_RewardInfo 是
主题礼包 17 $0.99–39.99 IAPThemeGiftPack_RewardInfo 是
无尽宝藏 25 $0.99–99.99 IAPEndlessTreasure_RewardInfo 是,只用到其中 9 个
体力通行证 13 $0.99–49.99 IAPEnergyBattlePass_* 否(活动 Switch=false)
通行证(BattlePass) 3 $3.99 / 4.99 / 7.99 IAPBattlePass_* 是
合成活动通行证 1 $3.99 ActivityMergeBattlePass_* 是
季节合成通行证 1 $3.99 ActivityStorySeasonMerge_Pass 活动默认关,有日历档期
季节无尽宝藏 25 $0.99–99.99 ActivityStorySeasonMerge_Package 同上,只用到其中 9 个
合计 122

4.2.2 价格带分布

共 29 个价位。图表数据见 ch4-data.json → price_band。

价位 SKU 数 价位 SKU 数 价位 SKU 数
$0.99 5 $8.99 3 $49.99 3
$1.99 11 $9.99 6 $54.99 2
$2.99 7 $12.99 5 $59.99 2
$3.99 6 $15.99 4 $64.99 2
$4.99 7 $19.99 6 $69.99 2
$5.99 4 $24.99 5 $74.99 2
$6.99 3 $29.99 5 $79.99 2
$7.99 7 $34.99 5 $84.99 / 89.99 / 94.99 各 2
$39.99 6 $99.99 3
$44.99 3
  • ≤$9.99:59 个(48%);$10–39.99:36 个;≥$44.99:27 个。$44.99 以上只有“无尽宝藏 / 季节无尽宝藏 / 体力通行证 / gem7450”。
  • $1.99 最密集(11 个),其中 5 个是升级包变体。
IAP 价格带分布122 个 SKU 按美元价格计数。
02.557.5105$0.9911$1.997$2.996$3.997$4.994$5.993$6.997$7.993$8.996$9.995$12.994$15.996$19.995$24.995$29.995$34.996$39.993$44.993$49.992$54.992$59.992$64.992$69.992$74.992$79.992$84.992$89.992$94.993$99.99SKU 数

4.2.3 钻石档

SKU 价格 钻石 钻石/$ 相对首档增幅
gem100 $1.99 100 50.3 —
gem265 $4.99 265 53.1 +5.7%
gem580 $9.99 580 58.1 +15.5%
gem1260 $19.99 1,260 63.0 +25.4%
gem3350 $39.99 3,350 83.8 +66.7%
gem7450 $99.99 7,450 74.5 +48.3%

【配】IAPInfo_PurchaseInfo、MergeShopPageConfig_GemPurchase(6 档对应图标 shop_gem01–06)。每美元钻石从首档到 $39.99 单调上升,$99.99 档反而低于 $39.99 档(74.5 < 83.8)。

钻石档:每美元钻石$39.99 档单价最高,$99.99 档反而回落。
02040608050.2$1.9953.1$4.9958.1$9.9963$19.9983.8$39.9974.5$99.99钻石 / 美元

4.2.4 新手包(10 个)

【配】IAPBeginnerPackConfig_PurchaseInfo;默认售卖 SKU 写在 IAPBeginnerPackConfig_Main.PurchaseID = beginnerpack01_99,其余 9 个 SKU 默认配置不会被选中,【推】留给 AB 替换。

SKU 价格 货币 棋子礼盒 钻石/$
beginnerpack01_99 $0.99 Gem 100 + Energy 300 BeginnerPack01 101
beginnerpack01_199 $1.99 Gem 150 + Energy 100 BeginnerPack01 75
beginnerpack01_299 $2.99 Gem 220 + Energy 100 BeginnerPack01 74
beginnerpack01_399 $3.99 Gem 300 + Energy 150 BeginnerPack01 75
beginnerpack01_499 $4.99 Gem 400 + Energy 150 BeginnerPack01 80
beginnerpack01_599 $5.99 Gem 450 + Energy 200 BeginnerPack01_2 75
beginnerpack01_699 $6.99 Gem 510 + Energy 200 BeginnerPack01_2 73
beginnerpack01_799 $7.99 Gem 620 + Energy 250 BeginnerPack01_2 78
beginnerpack01_899 $8.99 Gem 700 + Energy 250 BeginnerPack01_2 78
beginnerpack01_999 $9.99 Gem 800 + Energy 300 BeginnerPack01_3 80

默认的 $0.99 包是全游戏每美元钻石最高的商品(101 钻/$,约为 gem100 的 2 倍),另送 300 体力。

4.2.5 升级包(21 个)

【配】IAPLevelUpPackageConfig_RewardInfo(ValueRate 是界面上的“超值倍数”,PackageWeight 用于同价位择优,见 4.3.3)。

SKU 价格 钻石 体力 主要道具 ValueRate Weight
levelup_maintain_199 $1.99 100 50 PickChestA01、OrderChoiceChest02、OrderChestA01、DailyChest03 3.0 0
levelup_generator_199 $1.99 100 50 DailyChest03、OrderChoiceChest02、CoinChest01、GreenChest01(生成器宝箱) 3.5 0
levelup_199 $1.99 100 50 PickChestA01、OrderChoiceChest02、StarterChest01、JoyGift01、EnergyChest01、CoinChest01 3.2 0
levelup_generator_199_2 $1.99 100 300 DailyChest01、OrderChoiceChest02、SimpleChest01、GreenChest01 3.5 99
levelup_199_2 $1.99 100 300 PickChestA01、OrderChoiceChest03、SimpleChest01、JoyGift01、CoinChest01、LevelDownChess01 3.0 98
levelup_generator_299 $2.99 150 400 PickChestA01、OrderChoiceChest03、SimpleChest01、GreenChest01 3.5 99
levelup_299 $2.99 150 400 PickChestA01/B01、RoyalChestA01、JoyGift01×2、GemChest01×2、LevelDownChess01 3.0 98
levelup_399 $3.99 200 500 PickChestA01/B01、RoyalChestA01、DelightGift01×2、GemChest01×2、LevelDownChess01 3.2 99
levelup_499 $4.99 250 600 同上,GemChest01×3 3.2 99
levelup_599 $5.99 300 650 FancyPickChestA01/B01、RoyalChestB01、PotOfSeafood01×2、GemChest01×3、LevelDownChess01 3.2 99
levelup_699 $6.99 350 750 同 599 3.2 99
levelup_799 $7.99 400 850 FancyPick A/B、RoyalChestC01、OrderChestB01×2、GemChest01×3、LevelDownChess01 3.2 96
levelup_899 $8.99 450 950 同 799 3.2 97
levelup_999 $9.99 500 1,000 FancyPick A/B ×2、RoyalChestC01、OrderChestB01×2、GemChest01×3、LevelDownChess01 3.2 99
levelup_1299 $12.99 650 1,300 FancyPick A/B ×2、RoyalChestC01×2、OrderChestC01×2、GemChest01×3、LevelDownChess01×2 3.2 99
levelup_1599 $15.99 800 1,600 同上,OrderChestC01×3 3.2 99
levelup_1999 $19.99 1,000 2,000 OrderChoiceChest04×3、RoyalChestD01、RoyalChestC01×3、OrderChestC01×3、LevelUPChess01、LevelDownChess01×2 3.2 99
levelup_2499 $24.99 1,250 2,500 OrderChoiceChest04×4、RoyalD×2、RoyalC×4、OrderChestC01×4、LevelUPChess01、LevelDown×3 3.2 99
levelup_2999 $29.99 1,500 3,000 OrderChoiceChest04×5、RoyalE×2、RoyalD×4、OrderChestC01×5、LevelUPChess01、LevelDown×4 3.2 99
levelup_3499 $34.99 1,750 3,500 OrderChoiceChest04×6、RoyalE×3、RoyalD×5、OrderChestC01×7、LevelUPChess01×2、LevelDown×5 3.2 99
levelup_3999 $39.99 2,000 4,000 OrderChoiceChest04×7、RoyalE×4、RoyalD×6、OrderChestC01×10、LevelUPChess01×2、LevelDown×6 3.2 99

货币部分整条线都是 50 钻/$;体力从 $1.99 档的 150/$(_2 变体)降到 $9.99 起的 100/$。

4.2.6 主题礼包(17 个,活动名 ThemeGiftPack,界面包装 MerryGoRound)

【配】IAPThemeGiftPack_RewardInfo(TaskID 1–17 按价格升序)。

SKU 价格 钻石 体力 道具 钻石/$
theme_gift_pack_99 $0.99 30 100 RoyalChestA01 + CoinChest01 30
theme_gift_pack_199 $1.99 100 150 同上 50
theme_gift_pack_299 $2.99 180 150 同上 60
theme_gift_pack_399 $3.99 260 200 同上 65
theme_gift_pack_499 $4.99 340 200 同上 68
theme_gift_pack_599 $5.99 420 250 同上 70
theme_gift_pack_699 $6.99 500 250 同上 72
theme_gift_pack_799 $7.99 580 300 同上 73
theme_gift_pack_899 $8.99 660 300 同上 73
theme_gift_pack_999 $9.99 700 300 RoyalChestB01 + OrderChoiceChest01 70
theme_gift_pack_1299 $12.99 950 400 同上 73
theme_gift_pack_1599 $15.99 1,200 500 RoyalChestB01 + OrderChoiceChest02 75
theme_gift_pack_1999 $19.99 1,550 600 RoyalChestB01 + OrderChoiceChest01 78
theme_gift_pack_2499 $24.99 2,000 700 同上 80
theme_gift_pack_2999 $29.99 2,500 700 同上 83
theme_gift_pack_3499 $34.99 3,000 700 同上 86
theme_gift_pack_3999 $39.99 3,200 800 同上 80

4.2.7 无尽宝藏(25 个,活动名 EndlessTreasure,包装 MailboxTreasure)

SKU:endlesstreasure01_99 / 02_199 / 03_299 / 04_499 / 05_799 / 06_999 / 07_1299 / 08_1599 / 09_1999 / 10_2499 / 11_2999 / 12_3499 / 13_3999 / 14_4499 / 15_4999 / 16_5499 / 17_5999 / 18_6499 / 19_6999 / 20_7499 / 21_7999 / 22_8499 / 23_8999 / 24_9499 / 25_9999($0.99–$99.99,07 起每档 +$5 左右)。

【配】IAPEndlessTreasure_RewardInfo 是一条 57 格的奖励链:第 1–3 格为一次性免费格(Energy_10、Gem_3、OrderChoiceChest01),第 4–57 格 IsLoop=T 循环。循环段每 6 格一个付费格,共 9 个付费格,默认只引用 9 个 SKU:

格 SKU 价格 内容 钻石/$
4 endlesstreasure01_99 $0.99 Energy 100 + Gem 30 30
10 endlesstreasure02_199 $1.99 Energy 150 + Gem 60 30
16 endlesstreasure03_299 $2.99 Energy 200 + Gem 90 30
22 endlesstreasure04_499 $4.99 Energy 350 + Gem 150 30
28 endlesstreasure05_799 $7.99 Energy 500 + Gem 240 30
34 endlesstreasure06_999 $9.99 Energy 650 + Gem 300 30
40 endlesstreasure08_1599 $15.99 Energy 800 + Gem 480 30
46 endlesstreasure10_2499 $24.99 Energy 1000 + Gem 750 30
52 endlesstreasure13_3999 $39.99 Energy 1500 + Gem 1200 30
  • 付费格之间夹 5 个免费格:棋子(FoodA05、FruitA05、ClothingA04、ToyA03…)、体力 15→55、钻石 5→28、宝箱 / 链包(DrinkCarrier01、FoodChainPack01、FreshPass01、RedChest01、GreenChest01 等)。
  • 一轮循环付费合计 $110.91,得 Gem 3,300 + Energy 5,250;免费格合计 Gem 143 + Energy 315 + 棋子 / 宝箱。
  • 【推】玩法为“买下当前付费格才能继续领后面的免费格”的链式礼包(从 TaskID 顺序和 IsLoop 推出,未逐指令确认)。

4.2.8 通行证类

SKU 价格 内容 证据
bp499 $4.99 BattlePass VIP:额外 3,000 积分 + 100 体力,解锁付费轨 【配】IAPBattlePass_Main.VIPPurchaseID / VIPExtra*
bp799 $7.99 BattlePass Deluxe:积分 ×1.5,额外 3,000 积分 + 150 体力 【配】DeluxePurchaseID / DeluxeScoreRatio / DeluxeExtra*
bp399 $3.99 VIP → Deluxe 补差价 【配】DeluxeExtraPurchaseID
bpmsb_399 $3.99 合成活动通行证,MergeSingleBoard 与 MergeMultiBoard 共用;13 档,付费轨合计 Energy 550 + Gem 200(Single)或 Energy 550 + 卡包(Multi) 【配】ActivityMergeBattlePass_Main/_MergeSingleBoard/_MergeMultiBoard
bpseason_merge_399 $3.99 季节合成活动通行证,16 档(含 Energy_100、Gem_50 等) 【配】ActivityStorySeasonMerge_Main.BPActivityStory、_Pass

BattlePass 本体【配】IAPBattlePass_Reward / _Task:

  • 46 档,积分门槛 0, 300, 800, 900, 1000 … 5000(步长 100);第 46 档门槛 1000,【推】为满级后的循环档。
  • 奖励分 Basic + Premium1st / 2nd / 3rd。Basic 轨合计 Energy 790;Premium1st 合计 Gem 145 + Energy 175,其余为宝箱、棋子、卡包。【推】VIP 解锁 Premium1st,Deluxe 解锁 2nd / 3rd。
  • 积分任务:登录 30、合成 100 次 10、提交 5 单 100、获得 100 金币 50、建造 2 次 60、获得 2 笑脸 20、消耗 5 钻 30。

4.2.9 体力通行证(13 个,活动名 EnergyBattlePass,默认关闭)

【配】IAPEnergyBattlePass_UserSeg + _TaskList。机制:活动期间累计赚取金币达到 250→5,500(15 档),每档领体力,基础合计 1,000。买哪一档决定体力倍率 Ratio。

SKU 价格 Ratio 体力合计【推】 体力/$ ValueRate
energybp01_99 $0.99 1.0 1,000 1,010 400
energybp02_199 $1.99 1.2 1,200 603 220
energybp03_299 $2.99 1.8 1,800 602 220
energybp04_599 $5.99 3.6 3,600 601 220
energybp05_799 $7.99 4.8 4,800 601 220
energybp06_1299 $12.99 3.1 3,100 239 220
energybp07_1999 $19.99 5.6 5,600 280 310
energybp08_2499 $24.99 7.3 7,300 292 310
energybp09_2999 $29.99 9.2 9,200 307 330
energybp10_3499 $34.99 11.2 11,200 320 350
energybp11_3999 $39.99 8.1 8,100 203 350
energybp12_4499 $44.99 9.8 9,800 218 380
energybp13_4999 $49.99 12.1 12,100 242 400

“体力合计 = 基础 1,000 × Ratio”是【推】,依据 EnergyBattlePassConfig.ScaleTaskEnergyReward / ScaleInt / NormalizeRatio 的签名。Ratio 不随价格单调($12.99 和 $39.99 档回落),原因未确认。

4.2.10 季节无尽宝藏(25 个)

SKU:endless_season_merge01_99 … endless_season_merge25_9999,价位与 4.2.7 一一对应。【配】ActivityStorySeasonMerge_Package 与无尽宝藏同构(57 格,付费格同为第 4/10/16/22/28/34/40/46/52 格,同样只引用 9 个 SKU),奖励换成季节活动代币 MainChess01(付费格 ×2→×6)+ 体力 / 钻石等。


4.3 礼包触发与投放节奏

4.3.1 活动框架

【配】ActivityManageConfig_ActivityInfo 把礼包也当“活动”管理(ActivityType=iap),用 LoopType 区分投放方式:1 = 常驻 / 条件触发,2 = 按循环档期,3 = 日历档期,4 = 生命周期(一次性)。【推】循环档期以 28 天为一个周期(BattlePass 一期 672h = 28 天,其他循环活动的 StartDay 都在 1–28 之间)。

活动 类型 开关 解锁等级 投放档期(28 天周期内) 单次时长 分群限制
BeginnerPack 新手包 生命周期 开 4 升到 4 级触发(CozyHearth_01) 2,880 分钟 = 48h All
LevelUpPackage 升级包 常驻触发 开 12(活动) 每次升级(触发表从 7 级起) 3,600 秒 = 1h All
ThemeGiftPack 主题礼包 循环 开 7 第 5 / 12 / 19 / 26 天起 72h All
EndlessTreasure 无尽宝藏 循环 开 9 第 1 / 8 / 15 / 22 天起 96h All
EnergyBattlePass 体力通行证 循环 关 9 第 5 / 12 / 19 / 26 天起 72h 仅 SilencePeriod* 四组
BattlePass 通行证 循环 开 10 第 1 天起 672h = 28 天 All
MergeBattlePass 合成通行证 常驻(挂在合成活动上) 开 8 随 MergeSingleBoard / MultiBoard(均 8 级、循环) 随活动 All
StorySeasonMerge 季节合成 日历 关 6 日历 StorySeasonHalloween_01:2026-10-21 ~ 11-03 14 天 All
DailyRewards 签到 常驻 关 7 — — All

证据:【配】ActivityManageConfig_ActivityInfo / _ActivityLoop / _ActivityLifetime / _ActivityCalendar。

4.3.2 各礼包规则

新手包

  • 【配】IAPBeginnerPackConfig_Main:售卖 SKU beginnerpack01_99,Duration=2880(48h),PopUpType=2。
  • 【配】Lifetime 有两条:Icebreak01(Trigger = -1)和 CozyHearth_01(Trigger = 4)。【码】BeginnerPack 里两者是不同包装(Icebreak = NewBeginnerPackage,CozyHearth = CozyHearth 弹窗 / 首页图标 / 商店横幅)。【推】Trigger = -1 表示默认不触发,实际生效的是 4 级的 CozyHearth。
  • 【配】IAPBannerConfig_Banner:商店顶部挂 BeginnerPack 横幅(权重 100)。

升级包

  • 【配】IAPLevelUpPackageConfig_PurchaseInfo 194 行:触发等级 7–200 各对应一个 SKU,并给出 ValueRate。
  • 【配】Duration=3600(1 小时限时),DynamicBundlePricing=down。
  • 【码】LevelUpPackageInstance 维护 ActivePackages 列表(每个包有 TriggerLevel、EndTimeTicks、PopupAutoShown)以及已消费 ID,有 ActivatePendingPackages。【推】7–11 级攒下的触发会等活动在 12 级解锁后再激活;同时可能挂着多个未过期的包,按触发等级倒序排(SortActivePackagesDescending)。

主题礼包

  • 【配】IAPThemeGiftPack_Main:首页每天最多自动弹 1 次(MainPagePopMaxNum=1),每日购买次数不限(DailyBuyMaxCount=-1),起始 SKU theme_gift_pack_99,DisplayDuration=240(4h),定价 30day_avg_auto。
  • 【码】ThemeGiftPackUserData 记录当前档位 TaskID / PurchaseID / USDPrice / BundleStartUtcTicks / PendingNextBundle、按日购买次数、当日弹窗次数;常量 MaxBuyCountDays=8。【推】每个包展示 4 小时,过期或买下后切下一个包(重新定价),72 小时档期内可滚动出多个包。

无尽宝藏

  • 【配】IAPEndlessTreasure_Main:首页每天最多自动弹 2 次。不做动态定价,价格由链条格位固定(见 4.2.7)。

体力通行证(默认关)

  • 【配】IAPEnergyBattlePass_Main:定价 up,默认 SKU energybp01_99,首页每天最多弹 2 次。活动只对 SilencePeriod 组(距上次付费 ≥6 天)开放。

BattlePass

  • 【配】体力购买页挂 BattlePass 横幅(IAPBannerConfig_Banner)。

4.3.3 动态定价(DynamicBundlePricing)

【码】DynamicBundlePricingResolver.Parse 把字符串映射为枚举:up=1、down=2、avg_auto=3、30day_avg_auto=4,其他值为 0(不启用,IsDynamic 返回 false)。三类礼包的配置:

礼包 策略 价格梯
升级包 down IAPLevelUpPackageConfig_RewardInfo 中 Switch=true 的各档价格($1.99–39.99)
主题礼包 30day_avg_auto 17 档($0.99–39.99)
体力通行证 up 13 档($0.99–49.99)

规则(ResolveUp / ResolveDown / ResolveAverageAuto / ResolveLowerAnchor / FindNextLowerPrice):

策略 锚点 选价规则 无历史付费时
up 历史单笔最高付费价 价格梯中比锚点高的最低一档;没有更高档时取最高档 锚点 0 → 最低档
down 历史单笔最高付费价 价格梯中比锚点低的最高一档;没有更低档时取最低档 最低档
avg_auto 生涯平均单笔付费价(向上取整到整美元) 见下 平均 0 → 最低档
30day_avg_auto 近 30 天平均单笔付费价(向上取整到整美元) 见下 同上
  • 选价规则(“比锚点高 / 低的一档”)是【码】,从比较逻辑读出。
  • 锚点是哪个数是【推】:up / down 的锚点按 ResolveTargetPrice(prices, strategy, maxPurchasePrice) 的参数名,对应 IAPService.GetMaxPurchaseUSDPrice。两种 avg 的锚点按 GetAveragePrice 在 strategy==4 时调用的方法,对应 IAPService.GetThirtyDayAveragePurchaseUSDPriceRoundedUpToWholeDollar,否则对应 GetAveragePurchaseUSDPriceRoundedUpToWholeDollar。两者都是按虚表槽位推断的。

avg_auto 的“未购降档”【码 + 推】:每个活动的每个价格槽都存一份状态 DynamicBundlePricingState {ConsecutiveUnpurchasedCount, PreviousPurchaseSucceeded, Offers[slot].TargetPrice}。

  1. 生成新报价时,如果上一次报价还挂着、没买,记一次“未购”:连续未购次数 +1,“上次已购”置 false(MarkPricingSlotUnpurchased)。
  2. 买下后清零:连续未购次数 = 0,“上次已购”置 true(MarkOfferPurchased)。
  3. 定价:
    • 若上次未购且连续未购次数 > 0:先取 ≤ 平均价的最高档,再按“连续未购次数 − 1”逐档往下降,降到最低档为止。
    • 否则(首次报价,或上次买了):取 > 平均价的最低一档(【推】由 ResolveAverageAuto 尾部跳转到 ResolveUp 得出)。
    • 结果写入 Offers[slot].TargetPrice 锁定,下次报价前不变。

举例(主题礼包,【推】):30 日均单笔 $5 的用户,首个包给 $5.99(>$5 的最低档)。没买 → 下个包给 $4.99(≤$5 的最高档)。再没买 → $3.99。买了 → 回到“高于均价一档”。

升级包 SKU 选择:

  • 【码】LevelUpPackageConfig.GetPurchaseId 先判断是否开了动态定价。开了就走 ResolveDynamicPurchaseId:算出目标价,再用 ResolveHighestWeightPurchaseId 在该价位选 PackageWeight 最高的 SKU。解析失败才回退到按等级查表的 SKU。
  • 【推】默认配置下:
    • 未付费用户:目标价 = 最低档 $1.99 → 同价位权重最高的是 levelup_generator_199_2(权重 99)。
    • 历史最高单笔 $9.99 的用户:目标价 $8.99 → levelup_899。
    • 等级表里那 3 个权重为 0 的 $1.99 SKU 只在动态定价关闭或解析失败时用到。
    • ResolveTargetPrice(triggerLevel, …) 带等级参数,价格梯是否按等级截取,伪 C 未能确认。

4.3.4 升级包:等级 → SKU 映射(关闭动态定价时 / 回退值)

【配】IAPLevelUpPackageConfig_PurchaseInfo:

触发等级 SKU ValueRate
7–16 levelup_maintain_199 3.0
17 levelup_generator_199 3.5
18–20 levelup_maintain_199 3.0
21, 23, 25, 27, 29 levelup_generator_199 3.5
22, 24, 26, 28 levelup_maintain_199 3.0
30–200 levelup_199 3.2

合计 maintain 17 级、generator 6 级、levelup_199 171 级。generator 包(含 GreenChest01 生成器宝箱)只出现在 17 级和 21–29 级的奇数级。


4.4 钻石消耗点与价格

4.4.1 仓库扩格

【配】MergeInventoryConfig_Main / _InventorySlot:2 级开放,共 32 格,前 5 格免费。图表数据见 ch4-data.json → inventory_unlock。

格 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27–32
钻石 50 55 65 80 100 130 165 180 250 350 490 535 695 900 1170 1285 1605 2005 2505 2755 3305 各 3965
  • 累计:到第 10 格 350 钻,到 15 格 1,425,到 20 格 5,215,到 26 格 18,675,全部 32 格 42,465 钻。按最优钻石档(83.8 钻/$)折算约 $507。
  • GeneratorSpaceSwitch=false(生成器专用格,30 级,未启用)。

4.4.2 泡泡(棋子泡泡)

【配】MergeBubbleConfig_Main:4 级开放,泡泡存在 60 秒,棋盘最多 4 个,至少留 1 个空格;合成奖励 10 级开放。【配】MergeBubbleConfig_BubbleStrategy 74 个棋子:出现概率随等级升高,价格就是该棋子的钻石直购价。74 个棋子的泡泡价与商店直购价逐个相同。破泡和合成奖励都是 CoinChess01。泡泡价 ≤11 钻时可以看广告解锁(AdConfig_Main.BubbleBuyMaxGem=11,【推】)。

链 等级:概率 / 钻石
FoodA 04: 3%/2 · 05: 5%/4 · 06: 8%/7 · 07: 10%/13 · 08: 15%/25 · 09: 20%/47 · 10–15: 33%/89, 170, 320, 610, 1160, 2210
FoodB 03: 5%/4 · 04: 10%/7 · 05: 15%/14 · 06: 15%/25
FruitA 03: 3%/1 · 04: 5%/2 · 05: 8%/4 · 06: 10%/7 · 07: 15%/13 · 08: 20%/25 · 09–14: 33%/47, 89, 170, 320, 610, 1160
FruitB 03: 5%/6 · 04: 10%/11 · 05: 15%/21 · 06: 15%/35
ClothingTrans 02: 3%/6 · 03: 5%/10 · 04: 8%/20 · 05: 10%/50
ClothingA 02: 1%/12 · 03: 3%/23 · 04: 5%/43 · 05: 10%/82 · 06: 15%/160 · 07: 20%/300 · 08: 25%/560 · 09: 33%/1070 · 10: 33%/2040
FlowerA 02: 5%/5 · 03: 10%/10 · 04: 15%/18 · 05: 25%/34 · 06: 25%/65
JoyA 03: 5%/2 · 04: 10%/4 · 05: 15%/7 · 06: 20%/14 · 07: 25%/26 · 08: 30%/50 · 09: 35%/94 · 10: 40%/180
JoyB 02: 10%/8 · 03: 15%/15 · 04: 20%/29 · 05: 25%/55 · 06: 30%/100 · 07: 35%/200
ToyA 03: 5%/6 · 04: 10%/11 · 05: 15%/21 · 06: 20%/39 · 07: 25%/74 · 08: 30%/140 · 09: 35%/270 · 10–12: 40%/510, 970, 1840

主链价格大约每升一级 ×1.9。

4.4.3 生成器加速

【配】MergeChessConfig_MergeChessGeneratorInfo:

  • 普通生成器(Food / Fruit / Joy / Clothing / Toy):单次充能 CD 180 秒的,加速 3 钻;仓储回满 CD 300 秒的,加速 5 钻。低级 Food / Fruit 04–05 为 1–2 钻。
  • 花朵生成器(自动产出,不耗体力):单次加速 55 / 68 / 88 / 121 / 121 钻(06–10 级),仓储加速 97 / 121 / 165 / 234 / 234 钻。
  • 可用激励广告 GeneratorRecharge 替代,每天 5 次(见 4.5)。

【推】ChessSpeedUPCost 对应跳过单次充能 CD,StorageSpeeUPCost 对应把仓储一次回满(按字段名推断)。

4.4.4 商店

【配】MergeShopPageConfig_*;【码】ShopTabType {Gems, Chess}、ShopSectionType {DailySpecials, HotSales, Gems}、ShopSlotPayType {Gem, Money, Ad}。

  • 开放:3 级(OpenLevel=3)。

  • 每日特价:Default 与 Paid 两套表内容完全相同。

    格 内容 价格 广告位
    1 CoinChest01 25 钻 ShopSlot_1(关)
    2 EnergyChest01 10 钻 ShopSlot_2(开,每日 1 次)
    3 DailyChest01 免费 ShopSlot_3(关)

    【推】Paid 表为付费用户预留。

  • 热卖棋子(ShopChessConfig 96 条):

    • 6 个格位:1–3 号格放低级棋子(约 01–07 级),4–5 号格放中级,6 号格放高级棋子和 01 级生成器。
    • 每格可买 5 个(ShopCount=5);生成器 Rare=1、只能买 1 个。
    • ShopWeight=0 的高级棋子不会出现在货架上,例如 FoodA12–15、FruitA12–14、ClothingA09–10、ToyA10–12。
    • 【码】货架按“当前订单需求链”推货(ShopService.GetActiveOrderDemands / IsChainMatchDemand)。
  • 手动刷新:20 钻,RefreshCD=15(单位未确认),或看广告刷新(每日 1 次)。

  • 钻石页:6 个 IAP 钻石档;页内有恢复购买入口(RestorePurchases)。

商店棋子直购价(钻石,与泡泡价相同):

链 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
FoodA 1 2 4 7 13 25 47 89 170 320* 610* 1160* 2210*
FoodB 1 2 4 7 14 25 48*
FruitA 1 2 4 7 13 25 47 89 170 320* 610* 1160*
FruitB 1 3 6 11 21 35 67*
ClothingTrans 3 6 10 20 50*
ClothingA 6 12 23 43 82 160 300 560 1070* 2040*
FlowerA 2 5 10 18 34 65 118*
JoyA 1 2 4 7 14 26 50 94 180* 342*
JoyB 4 8 15 29 55 100 200*
ToyA 1 3 6 11 21 39 74 140 270 510* 970* 1840*
生成器 01 级 Food 40 · Fruit 40 · Clothing 80 · Flower 45 · Joy 45 · Toy 45

* = ShopWeight=0,不会上货架,价格只在泡泡中使用。

4.4.5 体力购买

【配】MergeEnergyConfig_EnergyRecharge:每次 +100 体力,当日第 1–5 次分别 10 / 20 / 40 / 80 / 160 钻。5 次合计 310 钻换 500 体力。第 5 次之后的价格【推】维持 160 钻(表里只有 5 行)。

4.4.6 换算参考(【推】,仅按配置数值折算)

钻石 → 美元:最优档 83.8 钻/$(gem3350),首档 50.3 钻/$。

钻石 → 体力:

当日第 n 次购买 钻石/100 体力 体力/钻 折合美元/100 体力(按 50.3–83.8 钻/$)
1 10 10 $0.12–0.20
2 20 5 $0.24–0.40
3 40 2.5 $0.48–0.80
4 80 1.25 $0.95–1.59
5 160 0.63 $1.91–3.18

钻石 → 棋子:用棋子的 EquivEnergy(合出该棋子的等价体力)除以直购价,得到“每钻石买到多少体力当量”:

链 体力当量 / 钻 对照
FoodA / FruitA 03–15 4.0 → 7.1(级越高越划算) 介于当日第 2 次(5)和第 3 次(2.5)体力购买之间,高级棋子接近第 1 次(10)
FoodB 03–07 9.2 → 12.4 优于所有体力购买档
FruitB 03–07 6.2 → 8.9
JoyA / JoyB 2.0 → 3.1
FlowerA 2.0 → 2.8
ClothingA 0.4 → 1.3 低于体力购买第 4 次
ToyA 0.6 → 1.0 同上

IAP → 体力(每美元):

商品 体力/$
体力通行证 $0.99 档 ≈1,010
体力通行证 $1.99–7.99 档 ≈600
新手包 $0.99 303
升级包 _2 变体 151
升级包 $9.99 起 100
无尽宝藏付费格 37–101
主题礼包 20–101

广告 → 货币:

  • 1 次体力广告 = 25 体力,相当于当日第 1 次体力购买的 1/4(2.5 钻)。
  • 1 次资源气泡广告 = 30 体力或 10 钻。

4.5 广告

4.5.1 总开关与通用参数【配】AdConfig_Main

参数 值 含义
SDKInitializationSwitch / RewardShowSwitch true / true 广告 SDK 初始化、激励视频开启
LTFirstRequestLevel 5 5 级起才首次请求广告
EnergyRefillRequestThreshold 30 【推】体力低于 30 时预加载体力广告
AdRestoresEnergy 25 体力广告奖励
BubbleBuyMaxGem 11 泡泡价 ≤11 钻可看广告解锁
AssetBubbleChance / BoardMaxCount / ShowCD 0.5 / 1 / 60s 资源气泡出现概率、棋盘同时上限、出现 CD
AppOpenAdsSwitch false 开屏广告关闭
PauseDayAfterIAP 0 付费后不停广告
DailyAdCompensationMaxCount / ValidTime -1 / 20 广告失败补偿:不限次数,有效期 20(单位未确认)
SDKInitializationMemoryThreshold 2500 【推】内存(MB)低于阈值的设备不初始化广告

【配】AdConfig_RequestChance:预加载时机有 6 个(冷启动、广告展示成功、体力补充、打开商店、打开泡泡购买、打开生成器加速),每个每天最多请求 10 次。

4.5.2 激励视频位(默认 / Default 组)【配】AdConfig_Reward

广告位 场景与奖励 解锁 日上限 CD 开关
EnergyRefill 体力不足弹窗看广告 +25 体力 5 15 0 开
GeneratorRecharge 生成器耗尽时看广告立即充能(替代 1–5 钻 / 花朵 55–234 钻) 5 5 0 开
BubbleBuy 看广告解锁 ≤11 钻的棋子泡泡 5 5 0 开
AssetBubble 棋盘资源气泡:Energy 30 或 Gem 10 12 30 0 开
ShopSlot_1 每日特价第 1 格(CoinChest01,原价 25 钻) 5 1 0 关
ShopSlot_2 每日特价第 2 格(EnergyChest01,原价 10 钻) 5 1 0 开
ShopSlot_3 每日特价第 3 格(DailyChest01,本身免费) 5 1 0 关
ShopRefresh 热卖货架刷新(原价 20 钻) 5 1 0 开
OrderInterstitialReward 订单插屏活动的奖励翻倍(Energy_10 ×3) 5 99 0 开(宿主活动关闭)
  • 默认组每日激励上限合计 = 15 + 5 + 5 + 30 + 1 + 1 = 57 次(不计 OrderInterstitialReward)。
  • ShopSlot 与每日特价格子的对应关系为【推】(编号一致)。
  • 【配】ActivityOrderInterstitialAD_Main:每完成 7 单触发,基础奖励 Energy_10,看激励 ×3。宿主活动 OrderInterstitialAD Switch=false(20 级)。

4.5.3 资源气泡广告规则

【配】AdConfig_AssetBubble 有 4 条策略:

权重 奖励 每日上限
100 Energy 30 5
90 Energy 30 5
80 Energy 30 20
70 Gem 10 7

均为黄色气泡,AssetBubbleInteractionType=2,显示广告图标。

【推】按权重从高到低(或加权)选一条未达上限的策略,因此每天最多 30 次体力气泡 + 7 次钻石气泡。广告位层面另有 AssetBubble 日上限 30,两者取更严的一个。气泡 12 级起出现,同时最多 1 个,间隔 ≥60 秒,每次触发判定 50% 出现。

4.5.4 插屏 / 开屏 / Banner 现状

类型 配置 现状
插屏 只有 1 个位 ActivityOrderInterstitial:12 级,每日 10 次;CD 默认 0,UserGroup1 为 30s,UserGroup2–4 为 120s 关闭:5 个分组的 AdConfig_UserGroupMain.InterstitialShowSwitch 都是 false,宿主活动也关着
开屏 AdConfig_AppOpen:热启动,离开 ≥300s 回来,15 级,每日 3 次,加载 5s 关闭:PositioSwitch=false、AppOpenAdsSwitch=false;AdBox 默认策略的开屏聚合列表为空
Banner / MREC / Native SDK 有接口 无:AdBox 默认策略对应列表为空
礼包横幅(IAPBanner) 商店放新手包横幅,体力购买页放通行证横幅 开(是礼包推广位,不是广告)

4.5.5 付费后的广告策略

  • 【配】PauseDayAfterIAP=0:付费后不触发“IAP 保护期”停广告。【码】AdService.IsIAPBlocked / AdBlockReason.IapProtection 这套机制存在,只是天数配成 0。
  • 实际差异靠分群实现(见 4.6.3):累计付费 >$50 的用户(IAAMedium / IAABig)会被关掉所有主动激励位。

4.5.6 AdBox 本地默认策略概述【配】apk_base/assets/adbox/default.json

  • 来源:strategy_source=default(本地兜底;线上由 AdBox 服务端下发覆盖),聚合平台为 MAX。
  • 激励视频 10 个实例:地板价依次 $10 / 9 / 8 / 7 / 6 / 5 / 4 / 3 / 2 / 1(按 eCPM),每个实例另配一个 $0 地板的兜底单元。流量权重都是 100,最后一档标记 probe_role=base。【推】这是 multi-MAX 的地板价瀑布分层。
  • 插屏 1 个实例:$0 地板。Banner / MREC / Native / 开屏为空。
  • 全局参数:缓存 TTL 1,800 秒;展示窗口内最多 70 次请求;最小请求间隔 5 秒;请求超时 10 秒;在初始化完成和加载失败时触发预加载;单元加载最小间隔 10 秒。
  • experiments 为空,segment(value_tier / geo_tier / cohort)为空。【推】服务端可以按价值层级 / 地区 / 同期群下发不同策略,本地默认不分层。

4.6 用户分群

4.6.1 维度与标签【配】MergeUserGroupConfig_*

维度 标签 阈值 统计口径
LTIAPRevenue 累计付费 None / Small / Medium / Big 0 / 0.0001–5,000 / 5,001–50,000 / ≥50,001 【推】美分,即 $0 / ≤$50 / $50–500 / >$500
PeriodIAPRevenue 周期付费 PeriodNone / Small / Medium / Big 0 / 0.1–5,000 / 5,001–50,000 / ≥50,001 窗口 30 天(Main.PeriodIAPRevenueWindow)
IAPRecency 付费间隔(距上次付费天数) TodayIAP / RecentIAP / CoolingIAP / SilenceIAP 0 / 1–2 / 3–5 / 6–9999 【码】CalendarIAPUserGroupDimensionProvider 按自然日刷新
RVDailyAverage 日均激励 RVDailylow / RVDailyhigh 0.0001–6 / >6 生涯激励次数 ÷ 登录天数(【码】MaxLauncher.RegisterRvDailyAverageDimension)

【码】IAPService 提供生涯总额、30 日均价、历史最高单笔、最近购买时间(GetLifetimePurchaseUSDPrice / GetThirtyDayAverage… / GetMaxPurchaseUSDPrice / GetLastPurchaseTimestamp),数据来自本地购买记录。

4.6.2 14 个分组【配】MergeUserGroupConfig_UserGroup

全部 Switch=true;按维度全匹配,空字段表示不限。

# GroupID 条件 被谁使用
1 IAPNone 累计付费 = 0 —
2 IAASmall 累计 ≤$50 广告 UserGroup3
3 IAAMedium 累计 $50–500 广告 UserGroup2
4 IAABig 累计 >$500 广告 UserGroup1
5 RVDailylow 日均激励 ≤6 —
6 RVDailyhigh 日均激励 >6 广告 UserGroup4
7 IAPPeriodNone 30 天付费 = 0 —
8 IAPPeriodSmall 30 天 ≤$50 礼包变体表 1
9 IAPPeriodMedium 30 天 $50–500 礼包变体表 2
10 IAPPeriodBig 30 天 >$500 礼包变体表 3
11 SilencePeriodNone 沉默(≥6 天未付)且 30 天付费 = 0 体力通行证变体 1、活动准入
12 SilencePeriodSmall 沉默且 30 天 ≤$50 体力通行证变体 1、活动准入
13 SilencePeriodMedium 沉默且 30 天 $50–500 体力通行证变体 2、活动准入
14 SilencePeriodBig 沉默且 30 天 >$500 体力通行证变体 3、活动准入
  • TodayIAP / RecentIAP / CoolingIAP 三个间隔标签没有分组引用。
  • 30 天内有付费的用户最近一次付费也在 30 天内,所以 SilencePeriodSmall–Big 指“30 天内付过、但最近 6 天没付”。【推】由阈值组合推出。

4.6.3 分群 → 广告位差异

【码】AdUserGroupConfigResolver:

  • ToBusinessGroupId 映射:UserGroup1 = IAABig,UserGroup2 = IAAMedium,UserGroup3 = IAASmall,UserGroup4 = RVDailyhigh,其余为 Default。
  • GetGroupPriority:UserGroup1 → 4 的优先级依次为 1 → 4,其余为最低。【推】同时命中多个组时取编号最小的组,即付费分层优先于激励活跃度。

【配】AdConfig_UserGroup{1..4}Reward(格式:开关 / 日上限):

广告位 Default UG1 IAABig(>$500) UG2 IAAMedium($50–500) UG3 IAASmall(≤$50) UG4 RVDailyhigh
EnergyRefill 开 / 15 关 关 开 / 2 开 / 15
GeneratorRecharge 开 / 5 关 关 开 / 5 开 / 5
BubbleBuy 开 / 5 关 关 开 / 5 开 / 5
AssetBubble 开 / 30 关 关 开 / 7 开 / 30
ShopSlot_1 关 关 关 关 关
ShopSlot_2 开 / 1 关 关 关 开 / 1
ShopSlot_3 关 关 关 关 关
ShopRefresh 开 / 1 关 关 开 / 1 开 / 1
OrderInterstitialReward 开 / 99 开 / 99 开 / 99 开 / 99 开 / 99
插屏 CD(开关均为关) 0 30s 120s 120s 120s
日激励上限合计(不含订单位) 57 0 0 20 57

所有组的解锁等级与默认相同(5 / 12 级),CD 全为 0;AdConfig_UserGroupMain 中各组 RewardShowSwitch=true、LTFirstRequestLevel=5、AssetBubbleChance=0.5。UG4 与 Default 完全相同。

4.6.4 分群 → 礼包档位

  • 【码】Activity/GiftGroupConfig 调用 UserGroupSelector.SelectTable(first, second, third),在 *UserGroup1/2/3List* 三套表里选一套。【配】分组名写在各礼包 Main 表:
    • 升级包 / 主题礼包 / 无尽宝藏:UserGroup1/2/3List = IAPPeriodSmall / IAPPeriodMedium / IAPPeriodBig。
    • 体力通行证:UserGroup1List = SilencePeriodNone|SilencePeriodSmall,2 = SilencePeriodMedium,3 = SilencePeriodBig。
  • 【配】12 张变体表(4 类礼包 × 3 组)与各自默认表逐行完全一致:
    • IAPEndlessTreasure_UserGroup{1,2,3}ListRewardInfo 各 57 行;
    • IAPLevelUpPackageConfig_UserGroup{1,2,3}ListRewardInfo 各 21 行;
    • IAPThemeGiftPack_UserGroup{1,2,3}ListRewardInfo 各 17 行;
    • IAPEnergyBattlePass_UserGroup{1,2,3}ListUserSeg 各 13 行。
  • 因此出包默认下,分群对礼包内容和价格梯没有实际差异;礼包价格的个性化只来自 4.3.3 的动态定价(基于个人付费历史)。

4.6.5 HeyStatus(“嗨点”状态,未启用)

【配】MergeHeyStatusConfig_Main.HeyStatusSwitch=false(9 级解锁,计算窗口 7 天,周期付费窗口 30 天)。

  • HeyDay:按 6 个等级段,用在线时长、钻石、DiffScore、活跃天数、付费间隔加权算“嗨日”概率。
  • HeySession:用付费、接近成功次数(NearlySuccess)算“嗨局”,每段每日 1–2 次,间隔 120。
  • PeriodIAPRevenue:另有 21 档细分付费层(0–98、99–199 … >5,000,000,单位同为美分)。

【推】这是预留的“按情绪 / 付费状态调节体验”的系统,默认不生效。


4.7 付费点按等级出现的时间轴

等级 新增付费 / 广告点 证据
1 体力钻石购买(10→160 钻 / 100 体力);初始 30 钻 【配】MergeEnergyConfig_EnergyRecharge、MergeAssetInfoConfig_AssetInfo;开放等级【推】(表中无解锁等级)
2 仓库开放(第 6 格起付钻);新手奖励 50 钻 【配】MergeInventoryConfig_Main、MergeTutorialConfig_NewUserReward
3 商店开放:钻石 IAP 6 档、每日特价、热卖棋子、刷新 20 钻 【配】MergeShopPageConfig_Main.OpenLevel
4 新手包(CozyHearth,$0.99,48h);棋子泡泡开放(钻石解锁) 【配】ActivityLifetime CozyHearth_01、MergeBubbleConfig_Main
5 激励广告开始请求;EnergyRefill / GeneratorRecharge / BubbleBuy / ShopSlot_2 / ShopRefresh 解锁 【配】AdConfig_Main.LTFirstRequestLevel、AdConfig_Reward
6 (季节合成活动 + 季节通行证 / 季节无尽宝藏,默认关,按日历开) 【配】ActivityInfo StorySeasonMerge
7 主题礼包(每 28 天 4 期 × 72h,动态定价);升级包触发表起点(活动本身 12 级) 【配】ActivityInfo ThemeGiftPack、IAPLevelUpPackageConfig_PurchaseInfo
8 合成活动通行证 $3.99(随 MergeSingleBoard / MultiBoard) 【配】ActivityInfo MergeBattlePass
9 无尽宝藏(每 28 天 4 期 × 96h);(体力通行证默认关) 【配】ActivityInfo EndlessTreasure / EnergyBattlePass
10 BattlePass(28 天一期,VIP $4.99 / Deluxe $7.99) 【配】ActivityInfo BattlePass
12 升级包活动解锁(每次升级 1h 限时);资源气泡广告;(订单插屏,关) 【配】ActivityInfo LevelUpPackage、AdConfig_Reward AssetBubble、AdConfig_Interstitial
15 (开屏广告,关) 【配】AdConfig_AppOpen
16 体力倍率 ×2(体力消耗翻倍) 【配】MergeEnergyConfig_EnergyBoost
17、21–29 奇数级 升级包回退 SKU 为生成器包 levelup_generator_199 【配】IAPLevelUpPackageConfig_PurchaseInfo
20 (OrderInterstitialAD 活动,关) 【配】ActivityInfo OrderInterstitialAD
30 体力倍率 ×4 / ×8;升级包回退 SKU 切为 levelup_199 【配】同上

4.8 证据与未确认项汇总

  • 配置确认:
    • 122 个 SKU 的价格与内容;
    • 礼包档期、时长、弹窗频控;
    • 广告位全表和分组差异;
    • 14 个分组阈值;
    • 礼包变体表与默认表一致;
    • 仓库、泡泡、商店、体力购买价格。
  • 代码确认:
    • 动态定价的 4 种策略字符串,以及“高一档 / 低一档 / 未购逐档下降 / 购买清零”的选价逻辑(DynamicBundlePricingResolver);
    • 升级包同价位按 PackageWeight 择优(LevelUpPackageConfig.ResolveHighestWeightPurchaseId);
    • 广告分组映射 UG1–4 = IAABig / IAAMedium / IAASmall / RVDailyhigh 及优先级(AdUserGroupConfigResolver);
    • 体力购买按日计数(EnergyPurchaseService)。
  • 推断:
    • 动态定价的锚点具体是哪个付费统计量(按参数名和虚表槽位推断);
    • avg_auto 在“首次 / 上次已购”时走“高于均价一档”;
    • 升级包价格梯是否按触发等级截取;
    • 7–11 级升级包是否延迟到 12 级激活;
    • 无尽宝藏“买下才能继续”;
    • 体力通行证体力 = 1,000 × Ratio;
    • 付费金额单位为美分;
    • 28 天循环周期;
    • 资源气泡策略的选取方式;
    • ShopSlot 与每日特价格子的对应。
  • 线上实际值可能被 AB / 远程配置和 AdBox 服务端策略覆盖,本章未访问任何服务端。
05

合规、审核与运营控制

数据口径:包内默认配置 extracted/config/tables/*.json(表名即文件名);访客配置 config/v_cfg(外壳)+ v_cfg.tables.json(解码);访客规则 config/v_rule.decoded.json。 标注:【确认】 = 配置值或代码(C# 签名 / ISIL / 伪 C)直接可见;【推断】 = 由字段名、数值或部分代码推出,未完全核实。 隐私:设备 ID、IP 名单只给数量;不记录任何密钥。


5.0 本章要点

  1. 「访客(Visitor)」不是"未登录用户",而是受限/审核模式。首次启动判定一次,结果写进存档后不再变化。国家为 CN 或系统语言为简体中文的设备会被判为访客;白名单设备(179 个设备 ID、4 个 IP、1 个机型名)和 Debug 包始终按正常用户处理。
  2. 访客覆盖配置是稀疏补丁:列表表按主键整行替换,_Main 单行表只改 MainMap 里点名的字段。所以访客实际受影响的只有这些:FlamingFrenzy 活动关闭、AssetBubble 广告泡泡关闭、本地推送关闭、评分弹窗关闭、剧情对话和立绘关闭、序章打开、1–7 级升级门槛提高。其余活动和激励广告位照常。这一点修正了 07 笔记"活动、广告、视频全关"的说法,见 5.1.3。
  3. 访客不拉远端 AB、不用远端配置,只用包内默认配置加 v_cfg 补丁。
  4. GDPR:首次启动先弹一个只有"接受"按钮的自定义告知弹窗;之后由 AdBox/UMP(consentMode=Sdk、Deferred)收集广告同意。同意结果会持久化,并作为 hasUserConsent 传给广告 SDK。
  5. 配置优先级:包内/远端主配置 < AB < 访客。老用户的远端配置/AB 只等 0.001 秒,所以基本用的是上次启动缓存;新装和升级用户最多等 6 秒。

5.1 访客(审核)模式

5.1.1 判定时机与持久化【确认】

  • 存档键 Config.VisitorStatus:-1 = 未判定,0 = 正常用户,1 = 访客。VisitorHandler 构造时读取这个值,只有 -1 时才计算;算出结果后立即保存,之后每次启动都直接沿用(VisitorHandler::.ctor、UpdateIsVisitorStatus)。
  • 两种情况会强制判为正常用户,并在每次调用时覆盖存档里的值:Debug 包,或安装来源为 TestFlight / Xcode。
  • 触发点:Config.Init,以及 Visitor / Ab / MsgPack 三个配置子模块的 HandleData(都会调用 UpdateIsVisitorStatus)。
  • 【推断】判定时设备 ID 和公网 IP 是异步获取的(DeviceAsyncResolver,Forget 方式)。如果首启判定时还没拿到,设备 ID/IP 名单规则就匹配不上,结果会落到后面的地区/语言规则,并被永久固化。

5.1.2 11 条规则(v_rule,四元组 = 维度 / 模式 / 名单名 / 是否启用)【确认】

按序号 1→11 依次检查,第一条命中的规则决定结果;全部不命中则为正常用户。white 命中 = 正常用户,black 命中 = 访客。名单匹配是完整字符串、忽略大小写、不支持通配。

序 维度 模式 命中条件 名单规模 启用
1 device_id 白 设备 ID 在名单内 179 个 是
2 device_id 黑 同上 0(空) 是
3 ip 白 公网 IP 在名单内 4 个 是
4 ip 黑 同上 0(空) 是
5 device_name 白 设备名在名单内 1 个机型名 是
6 debug_package 白 Debug 包 — 是
7 region_cn 黑 国家码 = CN — 是
8 language_cn 黑 系统语言为 ChineseSimplified 或 Chinese(不含繁体) — 是
9 no_sim 黑 无 SIM 卡 — 否
10 not_from_google_market 黑 安装来源不是 Google Play — 否
11 has_rooted 黑 已 root — 否
  • 实际效果:白名单设备(内部测试机)永远看到完整游戏;其余设备只要满足"中国地区"或"简体中文系统"任一条件,就进入访客模式。9–11 三条风控规则虽然存在,但处于关闭状态,可以靠配置启用。
  • 【推断】用途是对中国区/中文环境(含国内审核、渠道人员)展示"降级版"游戏,属于合规屏蔽。

5.1.3 访客配置的生效方式(决定"实际改了什么")【确认,伪 C】

  • v_cfg 外壳是一个 RemoteAbTestMeta(TestIdentifier="Visitor"),带 Md5、加密内容,以及 MainMap。
  • 列表表(Config.LoadMetas → ApplyAbData):先用现有行建立"主键→行"字典,再逐行处理补丁里的行:主键已存在就整行替换,不存在就追加;最后重新排序。补丁不能删除行。
  • _Main 单行表(GetMainMeta → ApplyAbData):先查 MainMap[表名],只把列出的字段通过反射写到当前对象上;没列出的字段一律不改;表名不在 MainMap 里时整张表都不生效。
  • 叠加顺序:主配置(远端缓存或本地 message_bytes)→ AB 补丁 → 访客补丁(最后应用,优先级最高)。
  • 本包的 MainMap:ActivityManageConfig_Main:[GeneralActivitySwitch]、MergeOrderRoleConfig_Main:[ResType]、MergePushConfig_Main:[PushSwitch]、MergeRateAlertConfig_Main:[RateAlertPopupSwitch]、StoryInteraction_Main:[StorySoundSwitch, FirstLaunchVideoSwitch, DialogueSwitch, DialogueIllustrationSwitch, PrologueStorySwitch]。
  • 因此 v_cfg 解码结果里其他字段的 0/false/null 只是序列化时的占位值,不会生效。07 笔记 §4 里"推送/评分全关、对话视频高亮全 false"的描述需要按这里修正。

5.1.4 8 张表逐字段对比(默认值 → 访客值)

(1) ActivityManageConfig_ActivityInfo(列表,按 ActivityName 整行替换)

行 字段 默认 访客
FlamingFrenzy Switch true false
UsergGroupList All (缺失 → null)
其余(LoopType 1 / pve / 解锁 35 / 位置 0·5·1 / 权重 900) 同 同

其余 32 个活动行不受影响。

(2) ActivityManageConfig_Main:GeneralActivitySwitch true → true(生效,值不变)。

(3) AdConfig_Reward(列表,按 RewardPosition 整行替换)

行 字段 默认 访客
AssetBubble UnlockLevel 12 6
PositionSwitch true false
DailyMaxShow / DailyShowCD 30 / 0 30 / 0

EnergyRefill、GeneratorRecharge、BubbleBuy、ShopSlot_2、ShopRefresh、OrderInterstitialReward 等其他激励位保持默认。

(4) MergeLevelConfig_LevelCostReward(列表,按 Level 整行替换 1–7 级;8–200 级不变)

级 ExpCost 默认→访客 CoinCost 默认→访客 Reward1 Reward2 默认→访客 Reward3
1 45 → 45 116 → 116 Energy_100 FoodGenerator04 —
2 45 → 45 98 → 98 CoinChest01 FruitGenerator04 → FruitGenerator03 Energy_150
3 60 → 75 128 → 164 Energy_150 FruitGenerator04 —
4 75 → 90 164 → 164 Energy_100 TutorialChest01 —
5 75 → 90 212 → 244 EnergyChest01 ClothingGenerator04 —
6 90 → 105 244 → 480 EnergyChest01 FlowerGenerator04 —
7 90 → 105 304 → 480 EnergyChest01 FlowerGenerator05 —
合计 1–7 480 → 555 1266 → 1746(+38%)

【推断】MergeLevelConfig_Main.CostType=2 是金币模式,升级进度来自剧情建造花掉的金币,所以真正起作用的是 CoinCost。访客前 7 级需要多花约 38% 的建造金币,2 级奖励的水果生成器低一级。

(5) MergeOrderRoleConfig_Main:ResType 1 → 1(不变)。

(6) MergePushConfig_Main

字段 默认 访客 是否生效
PushSwitch true false 生效
PushPopUpInterval / DailyPushInterval / DailyPushMax / CallBackTime 3 / 3 / 2 / 18 (占位 0) 不生效,保持默认

(7) MergeRateAlertConfig_Main

字段 默认 访客 是否生效
RateAlertPopupSwitch true false 生效
MinLevel / MaxLevel / LTMaxLimit / Interval / FiveStarsSwitch 9 / 20 / 3 / 7 / true (占位) 不生效

(8) StoryInteraction_Main(只列 MainMap 内字段)

字段 默认 访客 体验含义
DialogueSwitch true false 剧情对话不播放
DialogueIllustrationSwitch true false 对话立绘不显示
PrologueStorySwitch false true 打开序章(默认资源 9001_S_1)
StorySoundSwitch true true 不变
FirstLaunchVideoSwitch true true 首启视频照常

VideoSwitch、HighlightSwitch、StoryMergeMinigameSwitch、DialogueSkipSwitch、各类 UiType 等字段在 v_cfg 里虽然是 0/false,但不在 MainMap 中,不生效。

5.1.5 对访客玩家体验的影响

  • 【确认】消失的内容:FlamingFrenzy 活动(默认 35 级解锁,所以前期玩家本来也看不到);棋盘上的广告资产泡泡(AssetBubble);全部本地推送,以及推送权限引导弹窗(PushSwitch=false 时 LocalPushService 不初始化监听和发送);评分弹窗;剧情对话和立绘。
  • 【确认】新增或改变:序章剧情开启;前 7 级升级更慢。
  • 【确认】保持不变:活动总开关和其余 24 个开启的活动、能量/生成器/泡泡购买/商店/订单插屏奖励等激励视频位、内购商店、剧情视频与建造。
  • 【推断】对访客的定位是"弱化运营打扰"(推送、评分、对话),而不是彻底去掉商业化。

5.1.6 访客跳过远端配置与 AB【确认】

  • Config.Ab::DoHandleData:IsVisitor 为真时不调用 IRemoteAb 拉取 Tuyoo AB 数据,因此不进实验、不上报曝光。
  • Config.MsgPack::PrepareBytesMapFromRemote:IsVisitor 为真时直接返回,不使用 Config.LatestRemoteConfig 缓存的远端配置,只用包内 message_bytes。
  • 影响:线上通过远端配置打开的活动档期(如 StorySeasonMerge 万圣节)、Koi/FV 开关、线上调参,访客都拿不到。访客看到的是包内默认配置 + v_cfg 补丁。
  • 【推断】章节 AB(StoryIndex_StoryIndexTest,见 5.3.3)是本地按用户哈希分流的,不走 AB SDK,所以访客同样会被分流。

5.2 GDPR / CMP

5.2.1 启动时序【确认,ISIL 调用序列】

GdprLauncher 是第 4 个启动模块,依赖 BasicMgr,与 UserInfo、YooAsset 并行。流程如下:

  1. 读 PlayerPrefs Key_MaxGDPRPopup_Done。
  2. 值为 0(新装或从未同意):调用 ShowCustomGdprAsync,显示自定义弹窗 GdprPopup 并上报 show_gdpr。弹窗只有"接受"按钮,另带隐私政策(pp)和服务条款(tos)两个链接;没有"拒绝"按钮。玩家点接受后写 Key_MaxGDPRPopup_Done=1、保存,加载流程继续。弹窗预制体加载失败时直接写 1 并跳过。
  3. 值不为 0(老用户):通过 JNI 读 Android SharedPreferences <包名>_preferences 中的 TCF 字段 IABTCF_PurposeConsents(TcfConsentReader)。
    • Purpose 1、3、4 都为 "1" 时视为已同意 → CmpService.MigrateLegacyAdConsent(granted);
    • TCF 字符串非空 → MigrateLegacyPrivacyOptionsRequired,即视为需要提供隐私选项入口(【推断】含义为该用户在 GDPR 地区)。
    • 作用:把旧版 MAX 自带 CMP 的同意结果迁移到新的 CmpService 键上。
  4. 两条路径最后都执行 CmpService.ApplyConsentToAdbox() 和 StartBackgroundUpdate()。
  • 【推断】第 2 步没有地区判断,所有新玩家首启都会看到这个告知弹窗。

5.2.2 广告 SDK 侧(MaxLauncher / CmpService)【确认】

  • 广告 SDK 初始化有三个前提:AdConfig_Main.SDKInitializationSwitch=true;不在购买保护期内(AdService.IsIAPBlocked,PauseDayAfterIAP=0);不是低内存设备(SDKInitializationMemoryThreshold=2500)。
  • TYAdSdk.InitializeSdk 的实参:consentMode=Sdk(1)、consentTiming=Deferred(1)、hasUserConsent = CmpService.HasPersistedAdConsent、doNotSell=false、隐私/条款 URL 传 null、debug=isDebugBuild。也就是说,弹窗由 AdBox SDK(Google UMP)负责,并且推迟到 SDK 初始化之后再弹。
  • SDK 初始化完成后依次执行:NotifyAdboxInitialized → TrySilentGatherAtStartupAsync(静默收集同意)→ AdService.Initialize → 上报 gdpr_consents(字段 purpose_consents、type ∈ {Gdpr, Other, Unknown}、status)。其中 type 的判定:IsPrivacyOptionsRequired 为真记 Gdpr;状态为 not_required 记 Other;其他情况记 Unknown。
  • 持久化:同意状态存在 PlayerPrefs 键 Key_UmpConsentObtained_Done、Key_AdConsentGranted_Done、Key_PrivacyOptionsRequired_Done 中。状态枚举 CmpState {Unknown, NotRequired, Required, Obtained}。
  • 结果同步给广告:TYAdSdk.UpdateExternalConsentState(canRequestAds)。加载广告前 AdService 会先等待 EnsureGatherBeforeLoadAsync,并订阅 AdConsentResolved 事件,同意结果出来后再开始加载。
  • 超时与恢复:UMP 更新默认超时 3 秒,CMP 展示超时 30 秒,仅隐私选项初始化超时 10 秒;迟到回调保护 120 秒。另有后台恢复循环 BackgroundConsentRecoveryLoop(按退避间隔重试),回到前台时也会重新检查(OnEnterForeground)。
  • 玩家入口:设置页的"隐私设置"按钮只在 IsPrivacyOptionsRequired 为真时出现,点击调用 ShowPrivacyOptionsAfterInitAsync,可以重新打开 UMP 隐私选项。广告 SDK 未初始化时,有 InitializeAdboxForPrivacyOptionsOnly,只为隐私选项拉起 AdBox。设置页另有隐私政策和服务条款入口。
  • 换存档:CloudSync 在应用云存档时会清空账号相关的 PlayerPrefs,但会先捕获 AccountCmpPreferences(CustomGdprDone、UmpConsentObtained、AdConsentGranted、PrivacyOptionsRequired 四项),之后再写回。【推断】这样恢复进度后不会重复弹同意窗。

5.2.3 未同意时的行为

  • 【确认】自定义弹窗不能拒绝,不点接受就无法进入游戏。
  • 【确认】hasUserConsent 取持久化的广告同意结果,没有同意时为 false。
  • 【推断】UMP 中拒绝或尚未完成时 canRequestAds=false:广告要么不请求,要么由 MAX 按无同意/非个性化处理。AdBlockReason 枚举里没有"无同意"这一项,所以具体表现以 AdBox SDK 内部逻辑为准,本次未核实。

5.3 远程配置与 AB

5.3.1 主配置下发(Config.MsgPack)【确认】

  1. CDN 基址是 merge01-awscdn 下按 {android|ios}/{release|debug}/config/ 区分的目录。先取 latest.txt 得到版本号,再下载 cfg_{版本}.bytes(RemoteConfigMeta:Version/Md5/Content/Flag/Extra/ConfigCommitId/AppVersion)。
  2. 校验 Md5 后存入 Config.LatestRemoteConfig(module RemoteConfig)。使用缓存前还会校验 md5 和 AppVersion。
  3. 兜底:没有可用远端配置时,使用包内 Resources/config/message_bytes。
  4. 等待时长:Config 默认总超时 6 秒;既不是新用户也不是升级用户时,超时改为 0.001 秒(Config.Init)。【推断】老用户本次启动用的是上次缓存的远端配置,新下载的配置下次启动才生效;新装和升级用户最多等 6 秒,争取首启就拿到最新配置。
  5. 上报 config_request,公共字段 config_version={Version}-{CommitId}。

5.3.2 Tuyoo AB(Config.Ab + TuyooRemoteAbAdapter)【确认】

  • 拉取 /config/fetch,分流条件 Lib 包括包名、OS、语言、注册天数、等级、版本、是否 debug。SDK 本地缓存为 TY_ABTEST_LOCAL_CACHE。
  • 每个实验值是一个 RemoteAbTestMeta(Base64 内容 + MD5 + MainMap + IsDnuTest)。补丁规则与访客相同(5.1.3):列表按主键整行替换或追加,_Main 表只改 MainMap 中列出的字段。因此 AB 可以覆盖或追加任意配置表的行和字段,但不能删行,要关闭内容只能把开关置为 false。
  • 应用成功后 ReportAppliedAb 上报曝光;成功和失败的 ID 记录在 Config.AppliedAbList、Config.AppliedAbList_SuccessIds,并上报变体结果。
  • 【推断】玩家所在分组由 Tuyoo AB 服务端按 proj_uid 决定,客户端靠 SDK 缓存和 AppliedAbList 保证分组稳定。分组同样受 5.3.1 的超时规则影响:老用户本次启动用的是缓存。
  • 访客、DebugIsDisableAb 都不走 AB。另有调试覆盖 LoadDebugAbData,读 persistentDataPath 下的文件。

5.3.3 已知 AB 点

AB 点 机制 参数 分组持久化
章节序列 本地确定性分流 ChapterProvider.PickDeterministicTestRes + StableHash(userSeed) StoryIndex_StoryIndexTest:从第 3 章起,30% 用户进入测试序列,第 11 轮,18 个候选资源(_S_1/_S_2 变体) 【确认】Story.Key_Chapter_Storage 中的 isTest、testRound
Koilab FV(生成器产出) 由 Koi SDK 决定下一个棋子;实验 ID、开关等从公共字段读取 Report_Koi_Main:KoiSDKSwitch=false、AllowKoiData=false、KoiExperimentID=""、Hybrid、InitLevel 9 【推断】由远端配置或 AB 打开并写入实验 ID
广告策略 AdBox 服务端 /v2/ad-strategy(含 experiments/segment);本地按 UserGroup 选择 AdConfig_UserGroup{1..4}* 本地默认策略 merge_android_s01_all_multimax_10_local 【推断】服务端分层;UserGroup 根据付费和看广告数据实时计算
任意配置表 Tuyoo AB 补丁 — Config.AppliedAbList

5.4 运营开关总表(包内默认值)【确认:配置值;作用描述多为字段名推断】

系统 开关(表.字段) 默认 访客
活动总控 ActivityManageConfig_Main.GeneralActivitySwitch true true
各活动 ActivityInfo.Switch(33 个活动) 25 开 / 8 关:MoleChestOrder、DailyRewards、SnowstormRush、EnergyBattlePass、OrderInterstitialAD、StorySeasonMerge、CoinDash、LadderOrder 为关 FlamingFrenzy 改为关
活动细项 ActivityMergeSingleBoard_Main.TickSwitch true —
ActivitySnowstormRush_Main:HomePage/BuildPage/MainPlay/两种 BGM 开关 全 true(活动本身关闭) —
ActivitySmileOrder_Main.SmileRewardAuto false —
推送 MergePushConfig_Main.PushSwitch true false
PushBannerinfo.Switch(6 种横幅) / PushPopUpInfo.Switch(2 种权限引导) 全 true —
评分 MergeRateAlertConfig_Main.RateAlertPopupSwitch / RateAlertFiveStarsSwitch true / true 弹窗开关改为 false
广告总控 AdConfig_Main.SDKInitializationSwitch / RewardShowSwitch / AFAdRevenueSwitch true / true / true —
AdConfig_Main.AppOpenAdsSwitch / EnableNewRequestStrategy / SetMaxAdMuted false / false / false —
广告位 AdConfig_Reward.PositionSwitch(9 个位) 7 开;ShopSlot_1、ShopSlot_3 关 AssetBubble 关
AdConfig_AppOpen.PositioSwitch(HotStart) false —
AdConfig_Interstitial.Switch / AdConfig_UserGroupMain.InterstitialShowSwitch true / 5 组全 false(插屏实际关闭) —
AdConfig_UserGroup1/2Reward 只开 OrderInterstitialReward —
AdConfig_UserGroup3Reward ShopSlot_1/2/3 关,其余开 —
AdConfig_RequestChance.Switch(6 行) 全 true —
Koi / FV Report_Koi_Main.KoiSDKSwitch / AllowKoiData / KoiShortCodeEnable / RidChangedPointSwitch false / false / true / false —
HeyStatus MergeHeyStatusConfig_Main.HeyStatusSwitch false —
剧情 StoryInteraction_Main:DialogueSwitch / VideoSwitch / HighlightSwitch / DialogueSkipSwitch / DialogueIllustrationSwitch / StoryDialogueRoleVideoSwitch / PreBuildAnimationSwitch / StoryMergeMinigameSwitch / StorySoundSwitch / BuildPointGrayScaleSwitch / LTFirstEnterHomeSwitch 全 true 对话、立绘改为 false
FirstLaunchVideoSwitch / FirstLaunchVideoSkipSwitch true / false 不变
PrologueStorySwitch / StoryHomeEntrySwitch false / false 序章改为 true
StoryIndex_NewStorySort.Switch(73 章) 71 开(1007_S_1、1013_S_3 关) —
加载界面 MergeThemeConfig_Main.FirstStoryCoreplayUISwitch / LoadingVideoSwitch false / false —
账号 AccountConfig_Main.AccountSwitch / CloudSwitch true / true —
商店 / 礼包 MergeShopPageConfig_Main.ShopSwitch / SheetTitleOpen true / true —
IAPBannerConfig_Main.EnergyRechargBannerSwitch / ShopBannerSwitch;IAPBannerConfig_Banner.BannerSwitch 全 true —
IAPEndlessTreasure / IAPEnergyBattlePass / IAPThemeGiftPack 的 _Main.MainPagePopSwitch true —
IAPLevelUpPackage / ThemeGiftPack / EnergyBattlePass 各分群奖励行 Switch 全 true —
用户分群 MergeUserGroupConfig_UserGroup.Switch(14 组) 全 true —
合成核心 MergeBubbleConfig_Main.BubbleSwitch / MergeRewardSwitch / OrderOneAwayBubbleSwitch true / true / false —
MergeInventoryConfig_Main.InventorySwitch / GeneratorSpaceSwitch true / false —
MergeLuckyProduceConfig_Main.LPSwitch true —
MergeGeneratorDDAConfig_Main:SpecialLucky / PendingRewardCalculation / BagCalculation / NearlySuccessForceLogic true / true / true / false —
MergeOrderConfig_Main:SmileOrderSwitch / OverlimitChessRecoverySwitch true / false —
MergeChessConfig_Main.DynamicMakeUpSwitch / EnableDoubleRoll / GeneratorChessSellSwitch true / false / true —
MergeEnergyConfig_Main:TipOpen / MaxTipOpen / DownLevelGenerateCompensationSwitch;EnergyBoost.Switch false / true / true;3 档全 true —
交互 MergeInteractionConfig_Main:BgmSwitch / SoundSwitch / VibrationSwitch false / true / true —
新手 MergeTutorialConfig_NewUserTutorial.Switch(58 条) / StrongGuide.Switch(49 步) 41 开 / 45 开 —
MergeTutorialConfig_Main:NoOrderPromptSwitch / SmileExtraReward / TutorialOrderFlowCycleSwitch true / false / false —
等级 MergeLevelConfig_Main.LevelDetailPageSwitch true —

【推断】默认关闭的活动(如 StorySeasonMerge 的万圣节档期)、Koi、HeyStatus 预计由远端配置或 AB 打开;访客拿不到这些线上开关。


5.5 推送与评分弹窗规则

5.5.1 本地推送【确认:配置值、常量;字段单位为推断】

参数 默认 访客 含义
PushSwitch true false 总开关;为 false 时推送服务不初始化(LocalPushService 判断 +0x1C)
DailyPushMax 2 2(不生效,PushSwitch 已关) 每日推送总上限
DailyPushInterval 3 同上 【推断】两条推送的最小间隔,单位小时
PushPopUpInterval 3 同上 【推断】权限引导弹窗的间隔,单位天
CallBackTime 18 同上 【推断】召回推送的发送时刻(18 点)
发送时段 9:00–22:00 — 代码常量 PushStartHour/PushEndHour
  • 横幅(MergePushConfig_PushBannerinfo):EnergyRefilledPush(单日上限 3、权重 100)、ItemRechargedPush(3、80)、CallBack_24h/48h/72h/168h(各 2、60)。时间冲突时按权重保留(ResolveCollision)。
  • 权限引导弹窗(PushPopUpInfo):EnergyPushPopUp 6 级解锁,终身 1 次;GeneratorChargePushPopUp 9 级解锁,终身 1 次。SDK 不主动申请通知权限(ty_disable_request_notification_permission=true),由这两个弹窗引导。
  • 设置页有推送开关(LocalPushStorage.SetUserSwitch)。远程推送走 FCM,token 由 Tuyoo SDK 上报。

5.5.2 评分弹窗(ReteAlertServices.CanShowAlertPopup)【确认,伪 C】

同时满足以下条件才弹出:

  1. 开关 RateAlertPopupSwitch=true;
  2. 当前等级在 9–20 之间(含两端);
  3. 没有存档 User.ReteAlertData 时直接可以弹;有存档时还需满足:玩家没有点过"评分"、已弹次数小于 3(RateAlertLTMaxLimit)、距上次弹出至少 7×24 小时(RateAlertInterval 天)。
  • 玩家点"评分"按钮后记 RateSubmitted=true,此后不再弹。选 5 星并点评分时会调起 Google Play 应用内评价(NativeRateHelper.LaunchInAppReviewOrFallback,失败时跳转商店)。关闭时上报 rate_submit_end(status=rate/close、星数、停留时长)。
  • 【推断】RateAlertFiveStarsSwitch 控制 5 星是否引导到商店评价,代码引用点未定位。
  • 访客:只有 RateAlertPopupSwitch 改为 false,评分弹窗永不出现。

5.6 账号与云存档(玩家视角)

  • 登录方式【确认】:首启自动游客登录;有保存的 token 时静默登录(LoginOnStartup)。登录失败最多重试 3 次,每次间隔 2 秒。Android 可绑定 Google 或 Facebook(AccountLoginChannel;Apple 仅 iOS)。
  • 绑定【确认】:先检查渠道账号是否已存在(NativeInterface.Check),再执行 Bind/UnBind。界面包括:渠道登录选择、成功、失败、已关联、退出成功等弹窗(IAccountUi)。另有账号自动弹窗 Account_AutoPopup,在 Home 和 Merge 两个场景出现,弹窗优先级最高(30000)。
  • 换设备恢复【确认】:在新设备登录渠道账号后,如果本地和云端进度不一致,会弹出 ShowProgressChoicePopup,并排展示两边的金币、钻石、等级、剧情进度、更新时间,由玩家选择保留哪一份。云端存档如果来自更高版本客户端,会提示先升级(client_version_too_high → ShowCloudSaveUpgradeRequiredPopup)。
  • 云存档上传【确认】:上传前用 hall/user_info 校验会话;内购成功后强制上传一次(iap_purchase_succeeded);设置页有"保存进度"按钮(ZBtnSaveProgress);本地按用户 ID 保存设备快照。同一账号在别处登录时会弹 kick_offline 顶号提示,并走恢复流程。
  • 删除账号【确认】:需要经过验证、带 6 秒冷却的确认、最终确认三步,然后提交到途游注销接口。
  • 恢复购买【确认】:商店的 Restore 按钮(30 秒限频)不走 Google 的 queryPurchases,而是从游戏服务器邮件(hall)里取商品邮件,复用发货流程补发,发完删除邮件。
  • 开关【确认】:AccountConfig_Main.AccountSwitch=true、CloudSwitch=true,访客不覆盖。【推断】这两个开关分别控制账号入口(IsChannelEntryVisible)和云同步是否启用。

5.7 未确认项

  • 列表表的"主键"取的是哪个字段(推断为首列 ActivityName/RewardPosition/Level),伪 C 里只看到接口分派,没有逐指令核对。
  • Config.VisitorStatus 是否包含在云存档模块中(换设备后是否沿用访客身份)未核实。
  • UMP 拒绝后广告的实际表现、BgRetrySeconds 的具体数值未提取。
  • 推送各间隔字段的单位、RateAlertFiveStarsSwitch 的作用点未定位。
  • 线上远端配置和 AB 的实际内容没有获取(未访问任何 URL)。