Frost Valley 系统拆解
从策划视角拆解这款"合成 + 章节式家园修复"游戏的五大系统:合成玩法、家园与叙事、LiveOps 活动、商业化,以及合规与运营控制。数值都来自 APK 内置的默认配置,线上可能被远程配置或 AB 实验覆盖。
合成玩法
数据口径:包内默认配置(
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 生成器与产物链
1.2.1 链的总览(MergeChessConfig_CorePlayChessInfo 72 条链,..._CorePlayChessGenerateLink 10 条产物链)
| 生成器链(满级) | 可用起始级 | 产物主链(满级) | 共生链(满级) | 备注 |
|---|---|---|---|---|
| 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 金币),卖出只是清格子用。
1.3 合成规则与特殊棋子
1.3.1 基本合成【确认,MergePlayGame.IsCanMerge / ExecuteMerge ISIL】
- 同链(
ChessChain)同级(ChessLevel)且未满级(< MaxChessLevel)才能合;结果 = 目标格等级 +1,源格消失。 - 两格不能都在障碍下;被半遮挡(
InObstaclePart)的棋子可以作为合成目标。 - 普通宝箱已经点开过(
NowClickCount>0)就不能再合。 - 合成后
EnergyConsume累加两者的体力消耗(记录这颗棋子"真实花了多少体力"),刷新时间戳。 - 合成后依次:解障碍
BlockerUnLock→ 泡泡判定(1.7.1)→ 资产泡泡 → 一次性补丁(如isMerge8GiveCoin)。 - 拖拽落点:仓库图标 → 存仓;可合成 → 合成;升/降级道具 → 道具逻辑;否则交换或弹回。支持"甩动"合成(
_enableFlickMerge)。 - 生成产物落点规则
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】:
- 选链:主链权重 = Σ 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,与主链相当。
- 选等级:在选中链的列表里按 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】:
- 托盘按 TrayWeight 降序(笑脸活动期间改用 SmileWeight);跳过已有订单的托盘。
- 策略串按
|拆开,逐项检查是否可用:TutorialFixed 只在新手订单没发完时保留;Mole/NewMole 需要对应活动开启且并发未满;然后检查当日上限GetTodayStrategyGenerateCount和策略 CDGetStrategyCooldownRemain。 - 第一个可用的策略出单:新手策略走
AddOrderByNewUser,其余走AddOrderByLogic → GenerateOrderByOrderLevelRandom。 - 订单提交时
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_OrderStateFactorNormal(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 在判定函数中未见赋值)。
- 玩家处于 HeySession("兴奋期",
MergeHeyStatusConfig_*判定,9 级开放、窗口 7 天、付费 30 等参数)→ Help。 - 否则尝试"差一点完成"(NearlySuccess)逻辑:开关打开、等级 ≥
NearlySuccessUnlockLevel=3、通过每日门槛,且存在一张"差一点完成"、缺口在副链上的订单 → 建立一条 NearlySuccess 记录,目标体力 TargetEnergy 取自ForceBlockRange=[20,40](【推断】区间内随机):- 记录建立后累计耗能 ≤ TargetEnergy:ForceBlock,强制只出主链,不给订单缺的副链件;
- 超过 TargetEnergy:ForceHelp,直接指定产出目标链。
- 即"先卡 20~40 体力,再给",制造"差一点 → 终于出了"的体验。
- 都不满足 → 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。
- gap = max(0, Σ 相关链[订单需求等价体力 − 棋盘现有等价体力])(
- 基础概率与保底(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)。
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 级开放,MergeRewardChance1%~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.7.3 商店棋子直购(MergeShopPageConfig_*,只列合成相关)
- 【确认】3 级开放;刷新 20 钻,CD 15(单位未确认);每日特价 3 格:CoinChest01 25 钻、EnergyChest01 10 钻、DailyChest01 免费(付费/默认两版相同)。
ShopChessConfig96 行,按格位分档:格 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 基本相同。
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 钻/体力以上;【推断】低档买体力比直购棋子划算,高档反过来。
家园与叙事
对象: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 组或少玩一章,后续章节的价格都会整体平移【推断】。
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 |
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 笔记反汇编】
- 点击图标
HandleIconClicked:场景上最多同时显示 3 个可建造图标,未解锁的显示灰色。图标上显示价格:金币足够时显示出发 🪙{cost},不够时显示🪙{have}/{cost}(story_popup_coin_enough / not_enough)。点击时关闭当前引导,并上报ReportStoryBuildClick。 - 建造前对话
ShowBuildStartDialogueAsync→DialogueController.TryShowDialog(BuildStart):按(章、时机、已建数)查StoryContent_DialogueRes。 - 合成小游戏(仅第一章前 3 个点):
TryRunBuildMinigameAsync/RunBottomMinigameAsync,配有 click/submit 两步引导。 - 提交和扣费
TryCommitBuild:- 校验该点未完成,且
GetAssetCount("Coin") ≥ Cost;任一不满足就判失败,走"金币不足"分支; - 冻结顶栏金币显示(
TopAssetHelper),为后面的飞币动画做准备; ConsumeAssetCount("Coin", cost, "story_build")→AssetMgr.ConsumeAsset;MarkBuildPointCompleted,生涯建造数加 1,上报ReportStoryBuildFinish(pointId, cost)。
- 校验该点未完成,且
- 建造动画
PlayBuildingAnim→PlayPreBuildAndBuildAnimAsync:先放预建造动画(PreBuildAnimationSwitch=true,锤子飞向点位),再播点位的 Spine、视频或特效,点位状态 BeforeBuild → Building → AfterBuild。飞币数量分档FlyAssetNumber="30-3;80-5;160-7;450-9"【推断:花费 ≤30 飞 3 枚,≤80 飞 5 枚,依此类推】。动画速度倍率是 1.0。 - 收尾
CompleteBuildPresentationAsync→TryShowDialog(BuildEnd)→ResolveBuildMode(Standard 或 Focus 镜头模式)。 - 奖励
AfterBuild→TryPlayGrantRewardAnim:发 LTProgress 额外奖励;刷新可建造图标;尝试显示下一条引导。 - 经验和外部联动(
TestHome注入的回调):LevelHelper.GrantBuildProgress(exp, coinCost),升级时弹出升级弹窗;StoryBuildPointFinishFlow.Execute(isLevelUp),执行建造后弹窗队列(见 2.7.2);ActivityMgr.TryTriggerLifetime / OnStoryBuild、HeartbeatService.OnStoryBuild:建造计数驱动活动任务(如"在故事中建造 {0} 个点")和 Lifetime 活动触发。
- 章节完成:
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 调用顺序】
- 初始化服务和剧情(
StoryLauncher.InitializeStory,下载或显示第一章)。 - 首启视频
FirstLaunchVideoPlayer.TryPrepare/TryPlay,播放1001_cheating_2,不可跳过。 - 初始化弹窗流程和引导(
InitFlowAndGuide)。 - 决定首页:
ShouldEnterStoryDirectly基于StoryLauncher.IsFirstChapterFirstThreePointsFinished。【推断】第一章前 3 个点(三个小游戏点)完成之前,冷启动直接进剧情页;之后进 Home 页,并启动 HomeFlow 弹窗队列。 - HomeFlow 结束后,按
IsLTFirstPointFinished选择引导:TryShowGuideLTFirstEnterStory(引导去剧情)或TryShowGuideFirstEnterCorePlay(引导去合成)。 - 前 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 |
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 序号只用来区分实例。
| 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 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| WeeklyTask | ||||||||||||||||||||||||||||
| ScoreStage | ||||||||||||||||||||||||||||
| CoinPve | ||||||||||||||||||||||||||||
| CoinRace | ||||||||||||||||||||||||||||
| Tournament | ||||||||||||||||||||||||||||
| MoleChestOrder(关) | ||||||||||||||||||||||||||||
| BattlePass | ||||||||||||||||||||||||||||
| MergeSingleBoard | ||||||||||||||||||||||||||||
| MergeMultiBoard | ||||||||||||||||||||||||||||
| 24hTask | ||||||||||||||||||||||||||||
| PinataScore | ||||||||||||||||||||||||||||
| MonopolyLike | ||||||||||||||||||||||||||||
| EnergyBattlePass(关) | ||||||||||||||||||||||||||||
| EndlessTreasure | ||||||||||||||||||||||||||||
| RoundDuel | ||||||||||||||||||||||||||||
| Escape | ||||||||||||||||||||||||||||
| ThemeGiftPack | ||||||||||||||||||||||||||||
| CoinDash(关) | ||||||||||||||||||||||||||||
| LadderOrder(关) | ||||||||||||||||||||||||||||
| 同时在线 | 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 |
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_Weekly28 行 = 4 周 × 7 天】:每天 5 个任务。第 N 天的任务组WeeklyTaskX_N第 1 个固定是login_day_N(累计登录 N 天)。【推】第 N 天解锁当天的任务组,之前的任务组可以补做。第 3 周的DiffDes=hard只是标签,任务内容与其他周相同。 - 积分来源【配:
ActivityWeeklyTask_TaskPool61 行】:每个任务完成后给固定 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_DiscoTaskList10 个任务 +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_SpringtimeBonus20 档】每档需要的分数是增量(序列不单调,所以是逐档追加),合计 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】:- 交单得到 OrderScoreA ticket。
- 按
ChessTicket把 ticket 换成"贝壳"活动棋子并放到主棋盘:Lv1=5、Lv2=10、Lv3=20、Lv4=40、Lv5=80 ticket。每单最多 5 颗(MaxOrderChessNum=5)。 - 贝壳可以在主棋盘上合成(链
PinataScoreChess最高 5 级)。点击收集得 PinataScore 分:Lv1→4、Lv2→8、Lv3→16、Lv4→35、Lv5→72(PinataAssetInfo)。只有 4、5 级合成后有溢价(2×16=32<35,2×35=70<72)。 - 积分推进 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_Name600 个(如 Alex、CalebSky);Tournament 另用ActivityTournament_RobotName60 个(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_Task113 轮】:前 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(离线涨得更快);关卡机器人速度在RobotSpeedLimit0.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 个名额被占。
- 压力值 p += GrowthPerMin × 经过分钟 × 关卡机器人速度。在线时
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_Reward35 档 = 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_Reward46 行】:阶段 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 三列。
- VIP
- 代表档位:
| 阶段 | 分 | 免费 | 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_UserSeg13 档】: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 专有(关闭中)
- 赛季等级【配:
_Level10 级】: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。 - 卡册【配:
CardGroup15 组、CardInfo135 张,每组 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;伪CCardCollectionDropLogic.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;伪CBlueMergeCorePlayGameManager.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 单位为秒 | 推断 |
| 内置配置里的开关状态 | 配置确认;线上可能被远程配置改写 |
商业化
适用版本: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 个是升级包变体。
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)。
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:售卖 SKUbeginnerpack01_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_PurchaseInfo194 行:触发等级 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),起始 SKUtheme_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,默认 SKUenergybp01_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,“上次已购”置 false(
MarkPricingSlotUnpurchased)。 - 买下后清零:连续未购次数 = 0,“上次已购”置 true(
MarkOfferPurchased)。 - 定价:
- 若上次未购且连续未购次数 > 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 表为付费用户预留。
-
热卖棋子(
ShopChessConfig96 条):- 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。宿主活动OrderInterstitialADSwitch=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)。
- 动态定价的 4 种策略字符串,以及“高一档 / 低一档 / 未购逐档下降 / 购买清零”的选价逻辑(
- 推断:
- 动态定价的锚点具体是哪个付费统计量(按参数名和虚表槽位推断);
- avg_auto 在“首次 / 上次已购”时走“高于均价一档”;
- 升级包价格梯是否按触发等级截取;
- 7–11 级升级包是否延迟到 12 级激活;
- 无尽宝藏“买下才能继续”;
- 体力通行证体力 = 1,000 × Ratio;
- 付费金额单位为美分;
- 28 天循环周期;
- 资源气泡策略的选取方式;
- ShopSlot 与每日特价格子的对应。
- 线上实际值可能被 AB / 远程配置和 AdBox 服务端策略覆盖,本章未访问任何服务端。
合规、审核与运营控制
数据口径:包内默认配置
extracted/config/tables/*.json(表名即文件名);访客配置config/v_cfg(外壳)+v_cfg.tables.json(解码);访客规则config/v_rule.decoded.json。 标注:【确认】 = 配置值或代码(C# 签名 / ISIL / 伪 C)直接可见;【推断】 = 由字段名、数值或部分代码推出,未完全核实。 隐私:设备 ID、IP 名单只给数量;不记录任何密钥。
5.0 本章要点
- 「访客(Visitor)」不是"未登录用户",而是受限/审核模式。首次启动判定一次,结果写进存档后不再变化。国家为 CN 或系统语言为简体中文的设备会被判为访客;白名单设备(179 个设备 ID、4 个 IP、1 个机型名)和 Debug 包始终按正常用户处理。
- 访客覆盖配置是稀疏补丁:列表表按主键整行替换,
_Main单行表只改MainMap里点名的字段。所以访客实际受影响的只有这些:FlamingFrenzy 活动关闭、AssetBubble 广告泡泡关闭、本地推送关闭、评分弹窗关闭、剧情对话和立绘关闭、序章打开、1–7 级升级门槛提高。其余活动和激励广告位照常。这一点修正了 07 笔记"活动、广告、视频全关"的说法,见 5.1.3。 - 访客不拉远端 AB、不用远端配置,只用包内默认配置加 v_cfg 补丁。
- GDPR:首次启动先弹一个只有"接受"按钮的自定义告知弹窗;之后由 AdBox/UMP(consentMode=Sdk、Deferred)收集广告同意。同意结果会持久化,并作为
hasUserConsent传给广告 SDK。 - 配置优先级:包内/远端主配置 < 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 并行。流程如下:
- 读 PlayerPrefs
Key_MaxGDPRPopup_Done。 - 值为 0(新装或从未同意):调用
ShowCustomGdprAsync,显示自定义弹窗GdprPopup并上报show_gdpr。弹窗只有"接受"按钮,另带隐私政策(pp)和服务条款(tos)两个链接;没有"拒绝"按钮。玩家点接受后写Key_MaxGDPRPopup_Done=1、保存,加载流程继续。弹窗预制体加载失败时直接写 1 并跳过。 - 值不为 0(老用户):通过 JNI 读 Android SharedPreferences
<包名>_preferences中的 TCF 字段IABTCF_PurposeConsents(TcfConsentReader)。- Purpose 1、3、4 都为 "1" 时视为已同意 →
CmpService.MigrateLegacyAdConsent(granted); - TCF 字符串非空 →
MigrateLegacyPrivacyOptionsRequired,即视为需要提供隐私选项入口(【推断】含义为该用户在 GDPR 地区)。 - 作用:把旧版 MAX 自带 CMP 的同意结果迁移到新的 CmpService 键上。
- Purpose 1、3、4 都为 "1" 时视为已同意 →
- 两条路径最后都执行
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)【确认】
- CDN 基址是
merge01-awscdn下按{android|ios}/{release|debug}/config/区分的目录。先取latest.txt得到版本号,再下载cfg_{版本}.bytes(RemoteConfigMeta:Version/Md5/Content/Flag/Extra/ConfigCommitId/AppVersion)。 - 校验 Md5 后存入
Config.LatestRemoteConfig(moduleRemoteConfig)。使用缓存前还会校验 md5 和 AppVersion。 - 兜底:没有可用远端配置时,使用包内
Resources/config/message_bytes。 - 等待时长:
Config默认总超时 6 秒;既不是新用户也不是升级用户时,超时改为 0.001 秒(Config.Init)。【推断】老用户本次启动用的是上次缓存的远端配置,新下载的配置下次启动才生效;新装和升级用户最多等 6 秒,争取首启就拿到最新配置。 - 上报
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】
同时满足以下条件才弹出:
- 开关
RateAlertPopupSwitch=true; - 当前等级在 9–20 之间(含两端);
- 没有存档
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)。