Milestone 4 · 规划

从「一个关卡 + 一套界面」
到「一个能持续出内容的战役框架」

M3 交付了完整的外壳:主菜单、战役地图、英雄名册、军需处、存档与英雄养成。 但外壳底下只有一个关卡、一名能上场的英雄。M4 要解决的是**内容产能**—— 让第二关、第二阵营、第二名英雄都能低成本地加进来。

当前版本 v0.3.0 已完成 M1 · M2 · M3 本轮额外交付 三层自动化测试体系

01M4 要解决什么

先把现状的缺口摆清楚,再谈做什么。缺口不是"功能不够多",而是"加一个新内容要改太多地方"。

缺口一:只有一名英雄能上场

英雄名册里 5 名英雄都能解锁、能升级、能配技能点,但进关卡时部署的永远是米勒中士。 LevelScene 虽然已经接收 heroKey,出击准备界面却还没把选择权交给玩家。 这是 M3 留下的最明显的一个"半成品"。

缺口二:技能只实装了效果,没实装成长

技能点能分配、等级能显示,但 skillLevelMul 只作用在数值倍率上, 技能的行为差异(手雷数量、烟幕半径、地雷伤害)还没有真正随等级变化。

缺口三:关卡数据与关卡场景耦合

LevelScene 里仍然写死了不少第一关的东西(简报文案、装饰物、波次表)。 要做第二关,必须先把它拆成"通用引擎 + 关卡数据"。

缺口四:内容生产全靠手写

每关的路径、建造位、波次都要手写坐标。M4 需要一套关卡编辑/校验工具, 否则第三关之后每加一关的成本都下不来。

02英雄系统 2.0

这是 M4 的主线。目标是让"选谁上场"成为一个真实的策略决策,而不是换张贴图。

出战英雄选择

项目M3 现状M4 目标
选择入口出击准备界面已列出 5 名英雄可点选,选中项写入存档 selectedHero
未解锁英雄显示价格但不可点点击跳转英雄名册并高亮该英雄
数值生效heroKey 已传入关卡等级、技能等级、装备加成全部在关卡内生效
英雄定位差异近战 / 远程两类补上"支援型"(医疗兵治疗、工兵修工事)

技能随等级产生行为差异

手雷 Lv1→Lv3

  • Lv1 单枚、半径 90
  • Lv2 双枚齐投、半径 105
  • Lv3 三枚覆盖 + 灼烧地面 3 秒

烟幕 Lv1→Lv3

  • Lv1 半径 110、减速 35%
  • Lv2 半径 140、减速 45%
  • Lv3 额外让区域内敌人无法被友军阻挡(强控)

地雷 Lv1→Lv3

  • Lv1 单颗、范围 84
  • Lv2 双颗、范围 100
  • Lv3 三颗 + 破甲(敌人护甲降一级)

英雄扩充到 8 名

英雄阵营定位解锁
米勒中士美国陆军突击 · 近战拦截初始
科瓦奇下士美国陆军狙击 · 远程单体6 章
里德卫生兵美国陆军支援 · 治疗10 章
黑尔工兵英国皇家工兵控场 · 地雷铁丝网16 章
迪亚兹喷火兵美国陆军清群 · 范围持续22 章
瓦西里狙击手苏联红军远程 · 高穿甲28 章
莫罗佐夫近卫军苏联红军坦克 · 高血量拦截34 章
琼斯中尉英国第八集团军指挥 · 全图增益光环40 章
为什么英雄按阵营铺开而不是一次性做满:英雄与阵营是绑定的。 每加一个阵营,顺带补 1-2 名该阵营英雄,美术与数值都能复用同一套设定流程, 比"先把 8 名英雄全做完再去做阵营"省一半返工。

03第二阵营:苏联红军 · 库尔斯克

第二阵营不是"换一层皮",它要证明现有的引擎能承载完全不同的战场形态。库尔斯克与诺曼底滩头恰好相反。

第一关 · 诺曼底滩头库尔斯克 · 反坦克防线
地形海滩、灌木篱笆、缓坡开阔草原、反坦克壕、雷场
路径形状大 S 形,视野好,建造位宽松近乎笔直的多车道,建造位稀少
核心压力步兵波次密集装甲洪流,重甲占比高
解法机枪 + 步兵班拦截反坦克炮 + 地雷,靠穿甲而非射速
新工事—ZIS-3 反坦克炮、喀秋莎火箭炮
新敌军—虎式坦克、斐迪南自行火炮、掷弹兵加强班

需要新增的引擎能力

多车道路径

同一关内多条独立路径同时刷怪,共享生命值。这是库尔斯克"装甲洪流"的基础, 也是后续所有大战役关卡的通用能力。

阵营主题包

把配色、UI 描边、地形色调、音效组打包成 Theme, 关卡按阵营取用。避免"苏联关卡却用盟军橄榄绿"这种出戏。

护甲分层

现有护甲只有 3 级。虎式需要第 4 级"超重甲",逼玩家必须用穿甲火力, 而不是堆机枪数量。

04内容:补齐诺曼底战役

第二关到第四关,让诺曼底战役成为一条完整的线,而不是一个孤零零的第一关。

关卡名称地形特征教学点
L02树篱迷宫密集树篱,路径曲折多弯教"多段射程覆盖",一个建造位服务两段路
L03卡朗唐路口三岔路口,两条路径汇合教"汇合点优先布防"
L04圣科姆教堂城镇废墟,建造位被建筑切割教"专精取舍"——本关强制二选一
关卡编辑与校验工具(M4 必做):用浏览器里的一个开发模式页面拖拽路径点与建造位, 导出 level0X.ts。导出时自动跑校验:路径是否自交、建造位是否覆盖路径、 射程是否够到、装饰物是否压住建造位。这四个检查本次开发中全是手工用 Python 算的, 下一关必须工具化。

05质量体系(本轮已建成,M4 常态化)

本轮针对"UI 经常卡住"的反馈,搭了一套三层测试体系。M4 的任务是把它接进日常流程, 而不是建完就放着。

三层结构

L1 单元测试 · Vitest

纯逻辑,毫秒级。存档容错、星级与货币规则、英雄养成、数值结构不变量、关卡数据完整性。

44 个用例

L2 场景生命周期 · Playwright

真浏览器里跑真引擎。断言场景集合、主循环是否停摆、面板开关后是否残留。 这一层专门抓"画面还在但点不动"。

卡死与残留检测

L3 泄漏与性能看门狗 · Playwright

循环做同一件事 6-8 遍,断言事件监听器、场景对象、定时器、堆内存不随循环增长; 战斗中采样帧时间,卡顿尖峰设上限。

增长即失败

为什么这么分层

塔防的缺陷几乎不在"某个函数算错了"。它集中在两类地方: 一是数值与规则(适合单元测试),二是场景生命周期(重开、切关、返回时 监听器没解绑、定时器没清、交互对象没销毁)。后者单次操作完全看不出来, 必须在循环里做差——这就是 L3 存在的理由。

反过来,L3 抓不了"手雷伤害写错了",L1 抓不了"返回菜单后 UI 盖在上面"。 三层缺一不可,但也不必再往上堆 E2E 用例数量——覆盖率不是目标,**抓住已知的失效模式**才是。

性能预算(M4 起作为验收线)

首屏启动< 8s
战斗长帧率< 35%
最大单帧< 900ms
8 轮循环堆增长< 60MB
监听器增长≤ +2

无头容器里达不到 60fps,所以预算按"卡顿尖峰"而不是"平均帧率"来定—— 玩家能感觉到的是单帧突然飙到几百毫秒,而不是平均少了 5 帧。

06商业化:从设计稿到骨架

M3 已经把军需处的入口和结构搭好,M4 把"能点的东西"补上,但底线一条不动。

M4 实装

  • 激励广告(骨架):结算后可选"看广告翻倍战地资金"。用本地开关模拟,不接真实 SDK
  • 外观:英雄皮肤、工事涂装。只改贴图不改数值
  • 加速包:一次性解锁 3 倍速(当前已有 2 倍,3 倍需付费)
  • 战地资金礼包:仅影响养成速度

永远不做的四件事

  • 不卖军功章:英雄解锁只能靠通关星级
  • 不卖数值上限:付费只做加速与外观
  • 不在战斗中弹广告:只放在结算后或主动点击
  • 不做抽卡与限时倒计时:面向的玩家群体里有未成年人
合规提醒:接入任何真实支付或广告 SDK 之前,必须先补齐隐私政策、 未成年人保护声明与广告标识。M4 只做本地骨架,不接任何真实第三方 SDK—— 这一步要等主体资质与合规文本齐备之后再单独排期。

07风险与取舍

风险:阵营铺得太快,每个都做不深

取舍:M4 只做第二阵营的第一关,不碰第三、第四阵营。 库尔斯克这一关必须做到与诺曼底第一关同等完成度,否则"多阵营"只是营销词。

风险:英雄数量膨胀,平衡失控

取舍:英雄总量控制在 8 名,且每名必须有一个"不可替代的战术位"。 凑数的英雄会稀释养成价值,也会让关卡设计难以兼顾。

风险:美术成本随阵营线性增长

取舍:建立"素材复用矩阵"——地形、特效、UI 跨阵营复用, 只重做单位与标志性建筑。库尔斯克的草原可以复用诺曼底的植被层。

风险:测试体系建完就烂

取舍:把 npm test 定为每次发布前的硬门槛, 并在文档里写清楚"新增一个场景必须同步补一条生命周期断言"。

08排期

阶段交付验收状态
M4.1 英雄出战选择实装 + 技能等级行为差异 5 名英雄都能上场,技能随等级有可感知的行为变化 待开始
M4.2 关卡引擎与数据解耦 + 关卡编辑校验工具 新增一关只需写一个数据文件,校验脚本自动跑四项检查 待开始
M4.3 诺曼底 L02-L04 三关可通、各有独立教学点、三星可达成 待开始
M4.4 第二阵营苏联红军 · 库尔斯克第一关 多车道路径、超重甲、反坦克工事全部可用 待开始
M4.5 军需处实装(本地骨架)+ 测试接入发布流程 npm test 全绿才能发布;商店条目可点、可生效 待开始
M3 完整 UI 系统、英雄养成、存档 主菜单 → 战役地图 → 战斗 → 结算 全链路可用 已完成
本轮 三层自动化测试体系 单元 + 生命周期 + 泄漏性能看门狗,可一条命令跑完 已完成
排期原则:M4.1 与 M4.2 是"能力",M4.3 与 M4.4 是"内容"。 能力必须先于内容——否则每做一关都要返工一次引擎, 做到第三关时就会开始出现"这个功能只在第一关能用"的分支。