Files
MatchMaster/docs/home-popup-queue.md
T
2026-10-21 19:56:42 +08:00

7.0 KiB
Raw Blame History

HomeScene 自动弹窗管理器

本版仅调整弹窗调度;弹入、关闭、金币和奖励领取动画沿用现有实现。动画管理器及黄金矿工、每日任务的动画统一留给后续版本。

职责与批次

  • assets/home_popup_queue/HomePopupPolicy.ts:纯规则,负责频次、排序、实际展示数、购买限额、新手流程和每日记录。
  • HomePopupQueue.ts:首页队列,等待初始检查完成、执行任务、检查可见窗口和奖励链、取消离开首页的批次。
  • 活动 Host/View:检查业务状态、加载资源、真正显示后通知管理器;保留手动入口、发奖和活动协议。

成功启动登录调用 beginLogin,接下来第一次首页消耗该登录标记;同一次登录和首页进入合为一批。之后每次重新进入首页是返回批次。回前台、网络恢复、停留首页时到期仅刷新状态,不追加自动展示批次。

首页先收集七日、月卡领取/购买、礼包、战令、小鱼干、每日任务、金字塔、黄金矿工和百人赛的初始候选,再按固定顺序执行。异常检查最多等待 20 秒,随后关闭本批收集;迟到候选等待下次符合频次的批次。初始化查询完成后调用 completePreparation,二段查询可在收集阶段调用 holdPreparation。

频次与顺序

类型 0 不自动展示,手动入口可用;类型 1 每个北京时间自然日成功展示一次;类型 2 每次成功启动登录展示;类型 3 每次进入/返回首页展示。

顺序 意图 key 默认类型
10 sevenDayGift 新手七天签到 1
20 monthlyReward 月卡每日领取通知 1
30 / 31 / 32 / 33 pyramidSettlement / jungleSettlement / coinMadnessSettlement / battlePassSettlement 3
34 / 35 cloudRiseElimination / cloudRiseResult 百人赛未处理结果兜底 3
40 / 41 / 42 pyramidDailyReminder / jungleTreasure / goldMinerDailyReminder 普通活动 2
50 starterPack 新手礼包 2
70 dailyQuests 每日任务 2 或 3
80 cloudRiseDailyReminder 百人赛普通入口 3
90(停用) winStreak 连胜介绍 0,仅手动打开
100 / 101 passCheckIntro / monthlyCard 战令、月卡购买 1,满足本批数量限制

原来带 DailyReminder 名称的活动 key 为兼容接入保留;活动服务的旧日标记不再参与展示资格判断,频次由管理器统一控制。

  • 登录批次包含符合条件的 1、2、3;同日后续登录包含未展示的 1、新的 2、3。返回首页仅 3,未完成的新手强制展示除外。
  • 战令购买、月卡购买(含续费提示)每天最多自动展示一次,仅在登录批次检查,普通返回首页不自动展示。保留解锁与购买资格判断,月卡仍需剩余有效期不足 5 天。连胜介绍仍仅手动打开;战令结算、月卡每日奖励领取通知及连胜活动本身不受影响。
  • 每日任务保留解锁门槛;存在每日或每周可领红点时为 3,领完恢复 2,并在出队前复查。
  • 礼包存在有效可购买期即可按登录展示,不再要求低资源或连续失败;原有礼包重新激活规则保留。
  • 百人赛正常结果仍在对局内处理,首页只兜底尚未处理的结果,不重新启动已完成流程。

成功、失败和计数

只在节点实际激活或 Host 确认展示成功后计数、写入当天已展示记录。入队、开始加载、加载失败、透明发货遮罩不计数。

同一个弹窗及其领取奖励后的详情是一条展示链,算一次,并等该链结束后推进。金字塔结算弹窗与金字塔普通活动弹窗是不同意图,可以先后展示,各算一次。手动打开不计入自动批次数。

战令购买、月卡购买排在本批其他弹窗之后,先战令再月卡。独立的 otherPopupCount 只统计本批除这两个购买弹窗以外实际展示成功的弹窗,月卡每日奖励和战令结算仍计入;两个购买弹窗不互相消耗额度。

本批其他弹窗数 N 战令购买 月卡购买
0~2 允许 允许
3 允许 跳过
≥4 跳过 跳过

超限只跳过本批,不写当天禁止展示记录;旧版持久化的两个购买弹窗 blocked 标记在创建规则时清理,已成功展示的当天记录保留。加载失败不记展示,下次登录可重试。新批次计数从零开始,手动入口不受额度限制。

战令结算准备失败释放当前队列,但不把业务结算标记为已完成。小鱼干普通弹窗排队期间转为到期结算时,释放普通意图,本批已关闭收集则等待下次返回首页;手动打开仍可直接处理结算。月卡奖励发放与通知分离,已发放但没展示的通知持久化为 pending,下次登录展示不重复发奖。

每日记录按服务端校准时间取北京时间日期;存储 key 为 homePopup:v1:<apiBaseUrl>:<uid>,保存 shown、blocked、新手步骤和月卡待通知标记。退出首页、进关准备、账号/令牌切换取消剩余任务,异步展示回调检查当前任务是否仍有效。

新手回首页

GM_INFO.level 表示已经完成的关卡;当前 B 组通过第 15 关(待玩第 16 关),其他组通过第 23 关时达到门槛,统一通过 GameConfig.getNewPlayerHomeLevel() 取得。

点击下一关时,先完成本局结算和百人赛结果,再返回首页。强制七日签到、礼包排在本批最前(-20、-10),计入实际展示数,且不在本批重复入队。已领、已展示、已购买或已失效的对应步骤视为完成,加载失败保留。完成后恢复七日类型 1、礼包类型 2。

首次升级到本版时,已超过门槛的存量用户不补触发;恰好达到门槛或本次新跨越门槛的用户执行并持久化未完成步骤。

验证

针对新规则的主要命令:

node --test tools/test-home-popup-policy.cjs tools/test-monthly-card-lifecycle.cjs tools/test-pyramid-home-reminder.cjs tools/test-activity-schedule.cjs tools/coin-madness/check-daily-reminder.cjs tools/test-seven-day-loading.cjs tools/test-win-streak-popup.cjs tools/test-battle-pass-settlement-check.cjs
node tools/coin-madness/check-popup-queue.cjs
node tools/coin-madness/check-home-entry-ready.cjs

本次购买弹窗调整的主命令共 115 项通过,覆盖数量边界、购买弹窗末尾排序、失败不计数、每日频次、旧阻止记录清理和月卡奖励生命周期。

此前对战令结算、百人赛可用性、金字塔结算和商城奖励四组测试做了修改前后对比:共 119 项,前后均 91 通过、28 既有失败,失败用例集合一致。

上述是 Node 引擎桩与规则验证。发布前仍需在 Cocos/微信开发版验证:冷启动与二次登录、其他弹窗数为 2/3/4 时的购买弹窗、连胜介绍仅手动打开、同批结算加普通活动、领取后奖励详情占用、新手门槛、跨北京时间零点、资源失败后重登,以及加载中进关/切号。此轮没有运行真机视觉与点击验收。