# 实施计划：坦克大作战商业化

> 基于 [requirements.md](./requirements.md) 商业化需求文档，按版本阶段拆解为可执行的编码任务。

---

## V1.0 基础版 — 激励广告 + 插屏广告

- [ ] 1. 扩展 AdManager，实现场景化广告触发与频控机制
  - [ ] 1.1 在 `js/managers/AdManager.js` 中新增广告场景枚举（REVIVE、DOUBLE_REWARD、CHEST_SPEED、STAMINA、FREE_GIFT），为每个场景维护独立的冷却计时器（15分钟内不重复展示同一场景广告）
    - 新增 `_sceneCooldowns` Map 和 `canShowScene(sceneType)` 方法
    - 新增 `showRewardedVideoForScene(sceneType, callback)` 方法，内部调用 `canShowScene` 检查后再调用 `showRewardedVideo`
    - 新增每日广告次数计数（体力恢复场景每日上限5次），使用 StorageManager 持久化当日计数
    - _需求：1.6 广告体验优化（验收标准15、16、17）、1.4 体力恢复广告（验收标准12）_

  - [ ] 1.2 在 `js/managers/AdManager.js` 中实现广告预加载机制
    - 新增 `preloadRewardedVideo()` 方法，在关卡加载时提前调用
    - 在 GameScene 和 TeamGameScene 的初始化阶段调用预加载
    - _需求：1.6 广告体验优化（验收标准15）_

  - [ ] 1.3 优化插屏广告频控逻辑
    - 将现有的 `_gamesPlayed` 计数改为基于"距上次展示的局数"判断（每3局展示一次）
    - 确保 `_adFreeEnabled` 标志正确跳过所有插屏广告
    - 插屏广告加载失败时静默跳过，不阻塞流程
    - _需求：2 插屏广告（验收标准1、2、3、4）_

- [ ] 2. 实现复活续关广告功能
  - [ ] 2.1 在 `js/scenes/GameScene.js` 的玩家死亡流程中集成复活广告
    - 在玩家生命数降为0时，弹出"观看广告复活"弹窗（而非直接进入失败结算）
    - 新增 `_showReviveAdDialog()` 方法，展示选择界面（观看广告 / 放弃）
    - 新增 `_reviveAdUsed` 标志，确保每关最多使用1次复活
    - 观看完成后调用 `_revivePlayer()` 方法：保留火力等级，在出生点重生，恢复1条生命
    - 选择放弃或广告不可用时，正常进入失败结算
    - _需求：1.1 复活续关广告（验收标准1、2、3、4）_

  - [ ] 2.2 在 `js/scenes/TeamGameScene.js` 中同步实现 PvP 模式的复活广告（如适用）
    - 根据 PvP 模式规则决定是否支持复活广告（可配置开关）
    - _需求：1.1 复活续关广告（验收标准1）_

- [ ] 3. 实现双倍结算广告功能
  - [ ] 3.1 在 `js/scenes/ResultScene.js` 的结算界面中添加"双倍奖励"按钮
    - 在结算界面新增"观看广告获得双倍奖励"按钮
    - 调用 `AdManager.showRewardedVideoForScene('DOUBLE_REWARD', callback)`
    - 观看完成后将金币和经验值翻倍显示并发放
    - 广告加载失败时提示"广告暂时不可用"，按正常倍率发放
    - _需求：1.2 双倍结算广告（验收标准5、6、7）_

  - [ ] 3.2 在 `js/scenes/TeamResultScene.js` 中同步实现 PvP 结算的双倍奖励广告
    - _需求：1.2 双倍结算广告（验收标准5、6、7）_

- [ ] 4. 在结算流程中集成插屏广告触发
  - 在 ResultScene 和 TeamResultScene 退出关卡时调用 `AdManager.showInterstitial()`
  - 确保去广告特权用户不展示
  - _需求：2 插屏广告（验收标准1、2、3）_

---

## V1.5 内购版 — 货币体系 + 支付 + 皮肤商店

- [ ] 5. 实现货币系统（CurrencyManager）
  - [ ] 5.1 新建 `js/managers/CurrencyManager.js`，实现金币和钻石的管理
    - 实现 `getGold()` / `addGold(amount)` / `spendGold(amount)` 方法
    - 实现 `getDiamonds()` / `addDiamonds(amount)` / `spendDiamonds(amount)` 方法
    - 所有货币变动通过 EventBus 发送事件（`currency:gold:changed`、`currency:diamonds:changed`），供 UI 监听更新
    - 使用 StorageManager 持久化货币数据，并纳入云同步数据
    - 设置货币上限防止溢出（金币上限999999，钻石上限99999）
    - _需求：3.1 金币系统（验收标准1、2、3）、3.2 钻石系统（验收标准5、6、7）_

  - [ ] 5.2 在 `js/base/GameGlobal.js` 中注册 CurrencyManager 实例
    - 在全局初始化流程中创建并挂载 `GameGlobal.currencyManager`
    - _需求：3.1、3.2_

  - [ ] 5.3 在 ResultScene / TeamResultScene 的结算逻辑中集成金币发放
    - 根据击杀数、通关时间等计算金币奖励并调用 `CurrencyManager.addGold()`
    - _需求：3.1 金币系统（验收标准1）_

- [ ] 6. 实现体力系统（StaminaManager）
  - [ ] 6.1 新建 `js/managers/StaminaManager.js`，实现体力管理
    - 实现 `getStamina()` / `consumeStamina()` / `recoverStamina(amount)` 方法
    - 实现自然恢复逻辑：每6分钟恢复1点，上限20点，使用定时器 + 离线时间差计算
    - 实现钻石购买体力：每日上限3次，价格递增（5/10/20钻石）
    - 实现广告恢复体力：每次恢复5点，每日上限5次
    - 通过 EventBus 发送 `stamina:changed` 事件
    - 使用 StorageManager 持久化体力值和上次恢复时间戳
    - _需求：8 体力系统（验收标准1、2、3、4、5）、1.4 体力恢复广告（验收标准10、11、12）_

  - [ ] 6.2 在 GameScene 开始关卡前检查体力
    - 进入经典模式/无尽模式前调用 `StaminaManager.consumeStamina()`
    - 体力不足时弹出恢复选项弹窗（等待/广告/钻石）
    - PvP 模式（TeamGameScene）不消耗体力
    - _需求：8 体力系统（验收标准1、2、5）_

- [ ] 7. 实现支付模块（PaymentManager）
  - [ ] 7.1 新建 `js/managers/PaymentManager.js`，封装微信支付接口
    - 封装 `wx.requestMidasPayment` 调用，实现 `purchase(productId, callback)` 方法
    - 实现订单状态查询和补发逻辑（网络中断后自动重试）
    - 实现商品配置表：去广告特权（¥30）、月卡（¥12）、钻石包（¥6/¥30/¥68）、新手礼包（¥1）、皮肤礼包（¥18-68）、高级通行证（¥18）
    - 购买成功后通过 EventBus 发送 `purchase:completed` 事件
    - 将购买记录同步至 StorageManager 和云端
    - _需求：4.6 支付与安全（验收标准15、16、17）_

  - [ ] 7.2 实现去广告特权购买逻辑
    - 购买成功后调用 `AdManager.enableAdFree()`
    - 保留激励视频入口，仅移除插屏广告
    - _需求：4.1 去广告特权（验收标准1、2、3）_

  - [ ] 7.3 实现钻石充值包购买逻辑
    - 按规格发放钻石（60/360/880），首充双倍
    - 使用 StorageManager 记录首充状态
    - _需求：4.3 钻石充值包（验收标准8、9）_

  - [ ] 7.4 实现新手礼包逻辑
    - 新用户首次进入游戏后24小时内展示购买入口
    - 倒计时结束后自动移除入口
    - _需求：4.5 新手礼包（验收标准13、14）_

- [ ] 8. 实现皮肤系统与商店场景
  - [ ] 8.1 新建 `js/data/SkinData.js`，定义皮肤配置数据
    - 定义皮肤分类（基础/高级/限定）、价格（金币/钻石）、获取途径、皮肤资源映射
    - _需求：7 皮肤商店系统（验收标准1、5）_

  - [ ] 8.2 新建 `js/managers/SkinManager.js`，实现皮肤解锁与装备管理
    - 实现 `getOwnedSkins()` / `unlockSkin(skinId)` / `equipSkin(skinId)` / `getCurrentSkin()` 方法
    - 使用 StorageManager 持久化已解锁皮肤和当前装备
    - 纳入云同步数据
    - _需求：7 皮肤商店系统（验收标准2、3、4）_

  - [ ] 8.3 新建 `js/scenes/ShopScene.js`，实现商店界面
    - 展示皮肤列表（分类标签页：基础/高级/限定）
    - 展示皮肤预览、价格、购买/装备按钮
    - 集成 CurrencyManager 扣款和 SkinManager 解锁
    - 展示去广告特权、钻石充值包等 IAP 商品入口
    - _需求：7 皮肤商店系统（验收标准1、2、5）、4.1、4.3_

  - [ ] 8.4 在 `js/scenes/MenuScene.js` 中添加商店入口按钮
    - 点击后通过 SceneManager 跳转到 ShopScene
    - _需求：7 皮肤商店系统_

  - [ ] 8.5 在 Tank 渲染逻辑中集成皮肤系统
    - 修改 `js/entities/Tank.js` 或 `PlayerTank.js`，根据 `SkinManager.getCurrentSkin()` 加载对应皮肤资源
    - _需求：7 皮肤商店系统（验收标准3）_

---

## V2.0 赛季版 — 战斗通行证 + 任务体系

- [ ] 9. 实现战斗通行证系统（BattlePassManager）
  - [ ] 9.1 新建 `js/data/BattlePassData.js`，定义赛季配置
    - 定义赛季时长（28天）、等级数（免费20级/高级40级）、每级奖励内容
    - 定义每日任务池、每周任务池、赛季成就列表及对应经验值
    - _需求：5.1 赛季基础设计（验收标准1、2、3）、5.2 任务体系（验收标准5、6、7）_

  - [ ] 9.2 新建 `js/managers/BattlePassManager.js`，实现通行证核心逻辑
    - 实现赛季状态管理：当前赛季ID、开始/结束时间、玩家等级、经验值
    - 实现 `addExp(amount)` / `getLevel()` / `claimReward(level)` 方法
    - 实现免费/高级通行证奖励轨道区分
    - 实现任务生成与完成追踪（每日3+2任务、每周5+3任务、赛季10成就）
    - 赛季结束时保留赛季币余额，提供3天奖励领取缓冲期
    - 使用 StorageManager 持久化赛季进度
    - _需求：5.1（验收标准1、2、3、4）、5.2（验收标准5、6、7、8）_

  - [ ] 9.3 新建 `js/scenes/BattlePassScene.js`，实现通行证界面
    - 展示等级进度条、免费/高级奖励轨道
    - 展示每日任务、每周任务、赛季成就列表及完成状态
    - 高级通行证购买入口（集成 PaymentManager）
    - 免费玩家达到10级时展示高级版奖励预览
    - 赛季剩余不足3天时展示8折优惠
    - _需求：5.1（验收标准2、3、4）、5.3 转化策略（验收标准9、10）_

  - [ ] 9.4 在 MenuScene 中添加通行证入口，在 GameScene/TeamGameScene 结算时触发任务进度更新
    - 对局结束后检查并更新任务完成状态（如"击杀N个敌人"、"通关N次"等）
    - _需求：5.2 任务体系（验收标准8）_

- [ ] 10. 实现月卡系统
  - [ ] 10.1 在 `js/managers/PaymentManager.js` 中新增月卡购买与状态管理
    - 实现月卡有效期检查、每日登录领取100钻石、专属头像框解锁/过期
    - 使用 StorageManager 记录月卡购买时间和每日领取状态
    - _需求：4.2 月卡（验收标准4、5、6）_

  - [ ] 10.2 在游戏启动流程中检查月卡状态并弹出每日领取弹窗
    - _需求：4.2 月卡（验收标准5）_

---

## V2.5 社交版 — 分享裂变 + 付费引导 + 合规

- [ ] 11. 扩展 ShareManager，实现分享激励体系
  - [ ] 11.1 在 `js/managers/ShareManager.js` 中新增分享奖励逻辑
    - 每日首次分享发放50金币（通过 CurrencyManager）
    - 分享战绩概率发放稀有道具，每日上限3次
    - 使用 StorageManager 记录每日分享次数和奖励领取状态
    - _需求：6.1 分享激励（验收标准1、4）_

  - [ ] 11.2 实现邀请新用户奖励机制
    - 新用户完成新手引导后，向邀请者发放200金币（每日上限5人）
    - 新用户获得双倍经验卡（3天有效期）
    - 实现 IP + 设备指纹去重防作弊（服务端校验）
    - _需求：6.1 分享激励（验收标准2、3）、6.2 防作弊机制（验收标准6、7）_

- [ ] 12. 实现付费节奏引导系统
  - [ ] 12.1 新建 `js/managers/PromotionManager.js`，实现生命周期付费引导
    - 根据玩家累计登录天数判断所处阶段（新手期/成长期/成熟期）
    - 新手期（1-3天）：展示新手礼包弹窗（最多3次）、去广告特权推荐
    - 成长期（4-14天）：高亮月卡推荐、钻石充值促销（限时加赠20%）
    - 成熟期（15天+）：推送通行证购买引导、限量皮肤预告
    - 使用 StorageManager 记录弹窗展示次数和登录天数
    - _需求：9.1（验收标准1、2）、9.2（验收标准3、4）、9.3（验收标准5、6）_

  - [ ] 12.2 在 `game.js` 启动流程和 MenuScene 中集成 PromotionManager 的引导触发
    - 登录时检查阶段并展示对应引导弹窗
    - _需求：9 付费节奏与引导_

- [ ] 13. 实现未成年人保护与合规机制
  - [ ] 13.1 新建 `js/managers/ComplianceManager.js`，实现合规检查
    - 实现未成年人识别（调用微信平台用户年龄信息接口）
    - 实现游戏时间限制：22:00-8:00禁止未成年人登录
    - 实现消费限制：月消费上限¥400，单次>¥50弹出确认
    - 实现广告展示限制：未成年人每日广告不超过5次
    - _需求：10.1 未成年人保护（验收标准1、2、3）_

  - [ ] 13.2 在宝箱/抽奖等随机奖励界面添加概率公示
    - 在对应 UI 中明确展示所有物品的掉落概率
    - _需求：10.2 概率公示（验收标准4）_

  - [ ] 13.3 在服务端 `server/index.js` 中新增反作弊检测逻辑
    - 广告反刷：同一IP短时间大量请求时限制广告展示
    - 异常充值检测：大额充值触发人工审核标记
    - 对局数据校验：异常击杀数/速度标记封禁
    - _需求：10.4 反作弊（验收标准7、8、9）_

- [ ] 14. 国际化支持：为所有商业化 UI 文案添加 i18n 翻译
  - 在 `js/i18n/zh.js` 和 `js/i18n/en.js` 中新增商店、通行证、体力、货币、弹窗等所有商业化相关的翻译键值
  - 确保所有新增场景和弹窗使用 `I18n.t()` 获取文案
  - _需求：全部商业化需求的 UI 文案_
