僵尸突围(1–4 人)
「僵尸突围」统一为一套城市合作活动。步行、寻找电动车、骑行、双座共乘和停车下车都在同一局内完成,不再让玩家选择“城市合作”或“双座共乘”。旧两人固定路线房只保留旧邀请与云端连接兼容,说明见双座路线兼容记录。
僵尸突围是自由探索里的可选城市玩法。首页「僵尸突围」进入 /district.html?mechanism=zombies 并直接开始;街区欢迎页、暂停菜单和地图的城市游览分类也能开启。单人无需建房或准备,复用已经加载的地图、街景、画布和渲染循环,不重新下载地图或创建第二套城市场景。挑战从当前地点附近的可通行地面道路开始,在暂停或结算菜单选择「返回自由探索」即可恢复原来的骑行/步行/游览状态和位置。
邀请好友时使用 /coop.html 的组队大厅,/city-coop.html 保留为相同玩法的兼容入口。1–4 人使用同一套地图和战斗规则,各自有独立生命和弹药;上车、后座、驾驶、停车与下车状态由同一权威快照同步。从街区进入好友大厅,退出本局后返回保存的探索位置。本地单人环境也可以一键开始,无需手动建房或准备。
挑战期间暂停原有探索模拟并释放其骑行操作;地图、城市外观、画面设置、人物外观、武器规则、HUD、声音、触屏和手柄操作复用既有实现。室内、配送、追逐和拦停期间不能开始挑战。本局电动车由僵尸突围权威管理,结束后继续原有探索;好友房同步玩家、双座电动车和僵尸,不同步街区的配送、车流、NPC、地铁、塔内游览和存档。
组队与目标
房主创建房间,可以直接单人开始,也可以把房间号交给其他玩家。每位成员准备后,由房主开始;最少一人、最多四人,第五人无法加入,开始后不接收新成员。人数改变不切换模式,清路敌人数为 3 +(队员数 − 1)。
玩家依次完成取得物资、骑行抵达、停车清路、下车救人和集合撤离五个阶段。每人独立使用冲锋枪或霰弹枪;射击不伤害队友。生命耗尽后倒地,由附近仍能行动的队友按住救援,约三秒后恢复部分生命。所有成员倒地则失败,所有当前队员与幸存者安全撤离则胜利;单人没有队友救援,倒地即结束本局。每人的击杀数和弹药由同一份权威快照统计。近战默认使用扫把,可以切换雨伞、平底锅和锅盖,均不消耗弹药,也不会伤害队友。建筑阻挡命中;击退沿城市碰撞逐步计算,不穿墙、不掉进水里。倒地时不能攻击;冷却中收到的挥击被消费,不会在冷却结束后突然补打。
丽园雅庭、丽影广场和7号电动车门店附近各有三个固定停车位,可以在同一局内前往找车。靠近空闲且停稳的双座电动车可上车。先上车的玩家驾驶,第二名玩家进入后座;每辆最多两人,四人可分乘不同车辆。司机负责方向、前进、倒车和刹车,后座继续瞄准射击、换弹和换武器。司机不同时操作枪械,车上不能近战或救援;停稳后下车继续步战。换座通过停车、下车和重新上车完成,不需要另一场对局。上下车保留生命、弹药和战斗进度,客户端不能自己指定座位或位置。
九个固定车位之外,出生点附近最多补充两辆,本局车辆上限为十一辆。权威检查完整车身的地面支撑、建筑与水域碰撞、车辆间距,以及司机和后座的安全下车位置;不满足条件的车位会跳过,实际数量可能更少,不会强行放车或阻塞通路。上车距离为 2.8 m,车辆绝对速度不高于 1.5 m/s 才允许上下车;普通下车还要找到可通行落点,不能穿墙或落入水域。每辆车有独立 100 点耐久,碰撞及僵尸攻击可以伤车;车坏会强制下车,继续按个人生命和救援目标判断胜负。司机离车、倒地或断线会停车并释放司机位,后座留在车上,可以下车后接手驾驶。司机有效输入超时 500 ms 只停车并保留座位,恢复操作后继续骑行;菜单或失焦不会自动下车。
普通街区的路边电动车也可以直接骑走,包含同一份九个固定车位。停好当前车辆,步行靠近另一辆停稳的电动车,按 X、手柄 RB 或触屏「上车」即可借用;原车留在原处,借车下车后停在新位置,换车和停车位置随探索存档保留。两种玩法共用 vehicleBoarding.ts 的距离、高差、车速和安全落脚候选规则,各自检查地图碰撞。进入僵尸突围后由本局权威管理车辆与双座共乘,街区车辆随探索模拟隐藏,退出后恢复探索时的借车和停车状态。
联机战斗期间打开菜单、失去窗口焦点、切到后台或失去 WebGL 上下文,只释放本人的操作。房间和其他队员继续运行;画面恢复后可以继续。本地单人模式在菜单、隐藏页面或画面中断时暂停模拟,恢复画面并关闭菜单后继续,避免独自玩时菜单期间被僵尸攻击;单纯失去窗口焦点仍只释放输入。普通成员断线会被移出本局,其他成员仍能继续;房主离开或失联结束房间,不迁移房主。结束后重新创建并加入下一间房,不在已开始的对局中重入。
移动救援路线
物资箱优先放在出生点前方;任务根据附近连通的地面道路安排约 140 m 路线。HUD 显示当前阶段、方向和距离,地面短线指引前往路口与撤离点,场景标签受建筑遮挡。
- 下车靠近物资箱,按住 F、手机「领取物资」或手柄方向键下 1 秒,补充全队弹药与少量生命。
- 找车独驾或双座共乘,沿路线前往救援点,抵达后停稳。步行抵达不能跳过骑行阶段。
- 清理路口敌人;车辆须留在任务区。司机可停车下车战斗,后座也可射击支援。
- 下车靠近倒地幸存者,用相同任务键按住 3 秒。受伤、离开、松开、切换操作人或输入超时都会重置进度,多人同时操作不会加速。
- 幸存者沿安全道路跟随附近队员,也会搭载停稳且有司机的空后座;队友已占后座时继续步行。司机离车或车坏后安全下车。全体当前队员和幸存者进入撤离区并保持 2 秒,显示「移动救援完成」。队员倒地时需先救起;成员离队后更新集合人数。
单人可以独驾接送;多人可以分工驾驶、射击、救援与接应,也可分乘不同车辆。任务与倒地队友救援分别使用 F/方向键下和 E/LT,手机有独立长按按钮。阶段变化、上下车、菜单和失焦释放持续输入,避免旧长按继续触发。
人物步行使用按实际位移与速度混合的左右交替迈步,包含反向和侧向移动;停止后回到站立,跳跃、倒地和骑行使用对应姿态。幸存者步行也使用同一动画。模型仍由轻量程序几何生成,无新增动画文件下载;减少动态效果时降低摆幅并关闭身体起伏。
操作
| 动作 | 键鼠 | 手机 |
|---|---|---|
| 步行 / 驾驶 | WASD;驾驶时 W/S 前进/倒车、A/D 转向 | 前进、后退、左、右 |
| 上车 / 下车 | X | 「上车」/「下车」 |
| 步行跳跃 | Space | 「跳跃」 |
| 步行奔跑 | 按住 Shift | 按住「奔跑」 |
| 驾驶急刹 | 按住 Shift | 按住「急刹」 |
| 瞄准 / 环顾 | 点击场景后移动鼠标 / 方向键;无鼠标锁时拖动 | 拖动场景 |
| 切换视角 | V | HUD 视角按钮 |
| 肩射观察 | 按住鼠标右键 | 默认第三人称 |
| 开火 | 鼠标左键 / J | 按住「开火」 |
| 近战挥击 | Q / 鼠标中键 | 「近战」 |
| 切换近战工具 | Z | 「工具」 |
| 换弹 | R | 「换弹」 |
| 切换武器 | 1 / 2 | 「切换武器」 |
| 领取物资 / 救起幸存者 | 按住 F | 按住「领取物资」/「救援幸存者」 |
| 救援附近倒地队友 | 按住 E | 按住「救援队友」 |
| 菜单 | 未捕获时 Escape / HUD 菜单 | HUD 菜单 |
HUD 按实际人数显示生命与倒地状态、当前任务及方向/距离和本人的弹药,并显示当前步行、驾驶或后座状态及上下车提示。驾驶转向以车身方向为准,侧看不会改变 W/S 的行驶方向。触屏司机显示驾驶与急刹按钮,后座显示枪械按钮;菜单关闭后恢复场景焦点,取消指针、后台或菜单打开时释放按住状态。
默认第三人称,V 切换第一人称;两种视角均瞄准权威枪口射线的第一个命中点,不从肩后绕墙射击。镜头遇墙、地面或地图边界自动回缩,贴墙时隐藏本地身体。首次鼠标捕获手势不会射击,Esc 先释放鼠标;失焦、后台、菜单和画面中断会释放移动、射击与肩射。鼠标捕获被拒绝后保留拖动瞄准与正常开火,触屏仍可拖动观察。
僵尸命中后短暂闪红,头顶血条朝向镜头并显示权威剩余生命;每次命中刷新 3 秒显示时间,击倒后立即隐藏,建筑仍会遮挡血条。血条模块在第一只僵尸出现时按需预热,候场不加载;加载失败会提示并在下一次命中重试,迟到的加载不会恢复已退出的场景。本人被攻击时,屏幕边缘短暂泛红并产生轻微视角震动,队友受伤不会触发本人的屏幕效果。系统开启「减少动态效果」时保留受伤颜色反馈、关闭视角震动。暂停、后台、渲染中断、退出和新对局会清理本人受击效果,不改变瞄准输入或伤害规则。双座僵尸突围复用同一套僵尸闪红和血条,按各自僵尸类型的满生命显示比例。
标准映射手柄使用方向键上切换视角、左摇杆步行/驾驶、右摇杆瞄准/环顾、RB 上下车、LT 急刹、RT 步行/后座开火、B 步行近战、LB 切换近战工具、X 换弹、Y 切换武器、A 步行跳跃、按住左摇杆奔跑、按住 LT 救援倒地队友、按住方向键下领取物资/救起幸存者,以及 Menu 菜单键;候场与菜单沿用共享手柄导航。
步行跳跃与奔跑由权威模拟计算,客户端只发送意图;空中不允许再次起跳或上车,跳跃不绕过建筑与水域碰撞。一次按下只跳一次,输入超时仍会自然落地。暂停、失焦和上下车释放跳跃及奔跑输入。
战斗反馈与情境标记
命中反馈来自权威事件,只提示本人的攻击结果;同次攻击击倒敌人时优先展示「击倒」,不重复播放命中声。锅盖格挡使用独立短音和「格挡成功 · 仍会受到部分伤害」提示,救援者和获救者分别看到完成提示。弹匣为空时显示换弹提示;备用弹药也耗尽时提示改用近战。提示不改变伤害、击退、冷却或瞄准,不增加视角震动;暂停、失焦、后台、退出及新对局清除临时反馈,恢复时不补播旧事件。
| 操作 | 键鼠 | 手机 | 标准手柄 |
|---|---|---|---|
| 一键情境标记 | G;桌面右下角「标记」按钮 | 点击「标记」;倒地后显示「求救」 | 方向键左 |
对准敌人提示「注意敌人」,对准停稳且有空座的电驴提示「这里有车」或「上后座」,对准倒地队友提示「我来救」。司机停稳且后座空闲时可以邀请队友上车。没有明确目标时在前方可通行地面放置「走这边」;对准队友已有标记回复「收到」。倒地玩家仍可发出「需要救援」,不会恢复移动或攻击。
房主/服务器根据玩家朝向、距离和建筑遮挡选择标记目标,客户端只发送有序按键请求;标记不穿墙选择敌人,敌人离开后只保留标记时的位置。每人最多一个标记,间隔至少 1.2 秒,6 秒后过期;冷却期间的请求被消费,不会延后补发。队友 HUD 显示发送者、说明、距离和相对方向,视野内额外显示受建筑遮挡的场景标签;标记用文字、图形和语义色共同表达,状态播报仅针对新标记,避免连续距离变化重复播报。触屏移动仍使用指针捕获,标记不释放正在按住的移动或开火。
城市房协议升级为 dayun-city-coop-v5,规则版本包含移动救援阶段与参数、标记时限、范围与冷却以及既有出生安全规则。开发 WebSocket、Steam 房主、平台 SDK、BFF 与云函数票据使用同一版本;v4 及更旧客户端须同步升级,不混入新版房间。本地单人可以离线使用标记。生产多人云端与真实 Steam 多设备仍需独立部署和验收。
生活用品近战
默认携带扫把,Z / 手柄 LB /「工具」依次切换扫把、雨伞、平底锅、锅盖。枪械仍独立用 1 / 2 或 Y 切换。HUD 显示所选工具和冷却;工具外观由少量共享几何体生成,没有新增媒体下载。近战只在步行时使用,Z 不用于本局骑行加速;F 用于物资和幸存者的持续交互。
以下是集中在 cityMelee.ts 的可调整初始参数,尚未完成真实手感试玩定稿:
| 工具 | 作用 | 距离 / 总角度 | 伤害 | 冷却 | 最远击退 |
|---|---|---|---|---|---|
| 扫把 | 广角横扫 | 2.25 m / 144° | 35 | 650 ms | 1.1 m |
| 雨伞 | 快速直刺 | 2.8 m / 36° | 25 | 380 ms | 0.45 m |
| 平底锅 | 慢速重击 | 1.8 m / 90° | 55 | 1000 ms | 1.65 m |
| 锅盖 | 推击与短暂正面格挡 | 1.7 m / 120° | 12 | 800 ms | 0.9 m |
锅盖每次被权威接受的挥击提供 200 ms 的正面 120° 格挡,最多减伤 70%,仍会受伤。方向锁定在挥击开始时;转身不能旋转保护角度,切换工具立即结束格挡,背后攻击不受保护。持续按住、重复网络包和冷却期间的新请求均不能续上格挡。所有工具共享当前冷却,切换不能缩短重击冷却。模拟以 60 Hz 运行,非整帧冷却向上取整。
细节工具模型与挥击轨迹在首次攻击时按需载入,基础挥击立即反馈。可选外观载入失败时保留基础反馈并在控制台提示,下次攻击重试;离开、重入和迟到的异步加载不会复活已销毁场景。系统减少动态效果偏好下使用短暂静态姿势/轨迹,不做大幅横扫。声音服务首次用户操作只开始按需载入,不在异步 import 回调中假定浏览器授权仍有效;载入完成后的准备/开始,或下一次键盘/指针操作,在原生手势调用栈中同步尝试解锁声音。静音设置即时持久化,载入失败可重试;迟到的解锁在后台、暂停或销毁后会释放声音。自动播放策略仍需真实浏览器验收,单元测试不代替浏览器权限验证。游戏规则、地图和关键错误处理没有移出必需启动依赖。
开发试玩与平台边界
运行 pnpm dev,打开 /district.html?mechanism=zombies 直接开始本地单人挑战。测试联机时,打开 /coop.html;在最多四个独立浏览器窗口或浏览器 context 打开同一开发服务器,一人创建,其余玩家输入同一房间号加入,全员准备后房主开始。开发 WebSocket 路径为同源 /__city-coop,服务器按 60 Hz 运行规则,以 20 Hz 发送快照。寻找同一辆车、先后上车并停车下车,检查两端座位、车辆和个人状态一致。
开发服务预构建既有 Three/WebGPU、场景辅助模块和物理依赖,避免首次按需载入时由依赖发现触发重载、丢掉刚创建的房间;生产场景继续按需加载。开发服务重启或连接中断后,再次创建、加入或重开会重新建立连接,无需刷新页面。连接恢复不会自动加入旧房间或继续已开始的对局;首次连接失败也可在服务恢复后重试。
完整街景初始化可能短暂阻塞浏览器心跳。开发房在候场时允许 60 秒无消息,涵盖既有 45 秒地图下载期限与场景初始化;进入战斗后仍按 10 秒失联处理,连续输入仍在 500 ms 无更新时释放。Steam 心跳由 Electron 主进程发送,保持原有 10 秒规则。
coop.html 和兼容地址 city-coop.html 都加载 src/city-coop/main.ts,由 Vue 挂载 CityCoopApp.vue;.html 是 Vite 多页面入口地址,界面由 Vue 单文件组件构建。原双人固定路线 HTML 移至 coop-legacy.html,保持旧规则与旧邀请兼容。
Steam 桌面版的统一突围房使用 dayun-city-coop-v5 和 NetworkingSockets 虚拟端口 2;竞速使用端口 0,旧固定路线兼容房使用端口 1。规则运行在房主的 Electron 主进程,页面发送操作并渲染快照。v3 增加上下车请求、车辆操控、座位与车辆快照,客户端、开发服务、Steam 房主及云端规则制品须一起更新;旧 v2 城市客户端不能加入新版房间。房间连接仍互斥,接受邀请时新突围协议进入 /coop.html,旧双座协议进入 /coop-legacy.html。
生产网页没有多人云端服务、或桌面 Steam 不可用时,旧城市入口自动使用本地单人权威,按钮显示「直接开始挑战」,不显示加入控件、房间号或准备步骤。本地权威使用同一套城市规则运行,不需要 Steam、WebSocket 或账号。首页入口直接进入自由探索内的挑战。桌面安装包包含地图资源,可离线运行;网页首次加载仍需取得应用和地图文件。
当前 Steam App ID 仍为 0。开发四浏览器和 Steam 协议模拟测试不代表真实四账号、四设备、跨网络和 Steam 中继已经验收。统一僵尸突围尚未接入生产多人云端服务器,默认生产网页使用本地单人权威;旧网页双人云端房保留旧规则,不会自动转为 v3 城市房。本轮代码合并不表示官网已部署,云端适配与验收边界见Play 云端适配。
实现与校验
packages/dayun-kicker-coop/src/city*:无 DOM、Three 或 Steam 依赖的城市规则、地图碰撞、输入和快照契约。服务器决定位移、车辆、座位、上下车、命中、伤害、倒地、救援、波次和终局;客户端无法通过输入指定另一个玩家或抢占已满座位;移动救援阶段、幸存者跟随与撤离集合由同一权威结算。packages/dayun-kicker-coop/src/cityParking.ts:导出CITY_SCOOTER_PARKING_SITES,以地点 ID、车位 ID、坐标和朝向维护三处停车;普通街区和突围权威共用位置。CityWorld.scooterParking提供车位,车辆快照的parkingSiteId / parkingSlotId在车驶离后仍保留来源。停车定义与车辆规则计入规则 hash,车位变化需要同步更新客户端和权威规则制品。apps/dayun-kicker/src/city-coop:独立入口、第一/第三人称城市渲染、人物和僵尸可视化、输入与 HUD,以及使用同一规则的本地单人权威。Three 与城市地图在需要场景时加载,开发检查接口仅在开发模式存在。apps/dayun-kicker/src/district/zombieChallenge.ts与ui/DistrictZombieChallenge.vue:按需接入自由探索;从已组装地图选取安全地面出生点,借用现有场景运行同一份本地权威与战斗界面。退出只释放战斗资源,保留原有城市与存档。apps/dayun-kicker/src/district/guangzhouCityMap.ts:城市游览、合作客户端与房主共同使用的纯地图组装。复用既有客村、滨江、琶洲、立交、广州塔中心和街区补全六份 JSON,以及同一套 TIT、丽影、桥梁、水岸、地铁入口修正;合作画面直接调用createDistrictScene,共享道路、建筑、树木、路灯、天空、阴影和反射水。单人、开发服务器与 Steam 房主都从组装结果生成战斗碰撞,不维护另一份广州地图。apps/dayun-kicker/dev与桌面城市房:WebSocket / Steam 身份、准备、容量、序号校验、快照和连接生命周期。连续输入超过 500 ms 无有效更新自动释放,重复射击或近战序号不重复结算,近战预测画面与权威回包去重。e2e/city-rescue.spec.ts:通过真实步行、骑行、战斗及幸存者后座完成单人路线;检查 320 / 390 px 手机任务长按中断、步行动画和标准映射手柄操作。开发 WebSocket 测试另覆盖真实双连接共乘与救援分工。e2e/city-coop.spec.ts:单人建房、准备、移动、射击、换弹与菜单释放;四个真实浏览器 context 的组队、超员、独立移动、射击同步、WebGL 恢复、离开后重新组队,以及 320 / 390 px 手机 HUD、多指移动与持续开火验证。另覆盖地图加载中离开,再创建房间时成功恢复加载与准备。设置CITY_COOP_PRODUCTION_URL可验证 Web 构建中的本地单人、暂停和退出,不依赖开发检查接口。e2e/district-zombies.spec.ts:同画布、地图无重复请求、无需大厅、操作切换、单人暂停、退出后恢复位置、重复进入及手机横竖屏验证。e2e-desktop/city-coop.spec.ts:实际 Electron 使用 App ID 0 启动,验证正式桌面产物直接开始单人城市挑战、开火、换弹、暂停、恢复和返回自由探索。
突围车辆外观复用既有双座电动车模型,按观察者位置只保留 110 m 内最近的最多八套模型,并优先保留本人的乘坐车辆。离开可视范围释放模型资源;权威仍保留全部车辆姿态、耐久与座位,画面裁剪不改变找车、驾驶或联机同步规则。
本地渲染验收使用仓库 GPU 配置:
pnpm exec playwright test --config playwright.gpu.config.ts e2e/city-coop.spec.ts生产网页单人验证先运行 pnpm build,再在独立终端启动 PORT=43180 node scripts/serve-performance-preview.mjs,最后执行:
CITY_COOP_PRODUCTION_URL=http://127.0.0.1:43180/city-coop.html PLAYWRIGHT_BASE_URL=http://127.0.0.1:43180 pnpm exec playwright test --config playwright.gpu.config.ts e2e/city-coop.spec.ts --grep 'production web'这项生产测试需要明确指定构建产物 URL;普通开发 E2E 会跳过它,避免把开发房误当作生产本地权威。生产预览启动时会载入当次构建文件,重新构建后需重启该预览。
截图保存到 /tmp/dayun-kicker-city-coop-playtest 并作为测试附件提供。相关类型检查、规则与 transport 测试、Web / 桌面构建、现有性能预算及发布产物校验也需通过。真实 Steam 验收仍需正式 App ID、四台设备 / 四个账号,并覆盖好友邀请、不同网络、后台、房主退出和第五人加入。
2026-10-11 v3 联机适配验证
联机适配相关 12 个测试文件、81 项通过:真实开发 WebSocket 拒绝旧城市 v2 包,完成同一房间上车、驾驶、刹车、下车和车辆快照;Steam 模拟两人共乘、后座射击、停车下车与座位同步;平台 SDK 转发车辆操作,BFF/CloudBase ticket 拒绝旧版本;新邀请进入 /coop.html,旧固定路线邀请和登录返回进入 /coop-legacy.html,云端分享/复制均使用统一入口。BFF、Functions、平台 SDK 类型检查与文档构建/类型检查通过。
这些结果确认协议、身份与传输行为,不代替本次完整 GPU 画面、发布性能预算、生产云端或真实 Steam 多设备验收。本轮未部署外部服务。
既有城市步战验证记录
以下是合并骑行前的历史记录;本次 v3 的上下车、共乘、车辆同步和性能须另外验证,不能沿用旧结果宣称通过。
2026-10-09 本机 macOS 原生 GPU / Chromium 验收中,三个城市 E2E 案例分别通过:四个真实客户端的组队与同步、320 / 390 px 手机及多指操作、地图加载中离开后重新建房。桌面截图为 1280×720,手机为 320×844 和 390×844;已检查 HUD、触控尺寸和页面溢出。游戏应用类型检查与构建目标 / 安装包预算夹具的 16 项测试通过,预算上限沿用仓库现有定义。此记录仍不替代真实 Steam 或生产云端验收。
全量单元测试通过 188 个文件、1199 项,随后输入控制 5 项及道路宽度相关 70 项回归通过。全仓类型检查、Web / desktop renderer 构建、两种构建目标的性能预算与产物校验,以及原生 Electron 城市离线入口通过;城市入口启动 JavaScript 为 293.7 KiB gzip。手机多指检查还覆盖按住开火时拖动场景瞄准,松开瞄准手指后持续开火,再松开开火手指停止。
既有双人共乘的真实双客户端驾驶、弹药、菜单、WebGL 恢复与断线结算回归也通过,确认共享道路宽度依赖调整没有影响原双人入口。
单人支持追加验收通过:开发 WebSocket 房间的 1 人建房、准备、开始、权威移动、射击、换弹、菜单释放和退出;同一轮四客户端、320 / 390 px 手机多指及延迟地图加载回归也通过。Web 正式构建在没有多人服务器时完成本地单人、暂停、恢复和退出,全程没有创建 WebSocket,开发检查接口未打包;另检查 390 px 单人 HUD 的触控尺寸和溢出。实际 Electron 正式产物在 Steam App ID 0 下完成同一套单人战斗流程,并保持 40 px 桌面标题栏和返回首页行为。单人桌面、Web 和手机截图已逐张检查。
本次相关规则、传输与输入测试 134 项、构建预算测试 17 项通过;全仓类型检查、Web / desktop renderer 与桌面主进程构建、双平台性能预算和发布产物校验通过。城市入口的启动闭包计入场景渲染与本地单人权威,当前为 300.2 KiB gzip,继续沿用既有预算上限。
开发连接恢复追加验收通过:相关城市规则、传输和输入 49 项单元测试,以及首次连接失败重试、候场断线后创建和加入、战斗断线后手动新组队、单人战斗和四客户端同步 6 项浏览器回归。断线恢复始终在原文档中完成,不丢弃表单输入,不自动重入旧对局。
完整广州地图复用追加验收通过:8 个开发浏览器案例验证单人、四客户端同步、WebGL 恢复、重新组队、连接恢复、加载中退出及 320 / 390 px 多点触控。六份既有地图资源实际加载,各客户端均使用正式场景工厂,包含 1150 个建筑轮廓、1557 个道路对象,以及 TIT、丽影、滨江、琶洲和腾讯前场节点;地铁入口修正按普通街区原有顺序执行。地图组装与碰撞单测、候场心跳真实 WebSocket 回归、生产 Web 和 Electron 离线单人,以及普通城市加载、首页按需模型和语言切换回归通过。候场宽限修复保留运行期失联与输入释放行为。
最终 Web / desktop renderer 与桌面主进程构建、类型检查、两种性能预算、发布产物及 Git 资源策略检查通过。城市入口为约 346.3 KiB gzip,继续计入完整街景和本地单人权威;未提高预算。地图场景核对信息仅在开发模式收集。截图与地图 / 渲染统计保存在 /tmp/dayun-kicker-city-coop-playtest 和测试附件中;四浏览器实测仍不替代真实 Steam 跨设备验收。