《解域》jieyu-1 · 架构 · 进度 · 路线图

工作副本 D:\Godot4.7_Proj\jieyu-1(Godot 4.7.1 · 纯 2D 俯视 · 960×540) · 实测日期 2026-10-05 · 对应 第六十五版 · 敌人按最近的可见目标选敌 · HEAD fd94c9d (真机帧时间对照:大厅 60 fps / 20v20 对局 ≥7.6 fps)

● 已落地并验收 ● 部分落地 / 有未完项 ● 计划内(文档已定,工程未做) ● 待拍板 ● 后续版本(已降级) ● 第六十五版为止新增

一、体检卡(全部本轮真跑 / 真数)

176
个 .gd / 31338 行(LF 字节口径 · 不含 addons)
352
Main.gd 行数(硬线 ≤400 · 余量 48)
52 / 1876
测试脚本 / 断言(全绿 · 退出码 0)
5 + 25 + 21
几何门禁:HUD 5 + 外壳 25 + 规模接线 21
263
集成冒烟项(真实例化 Main.tscn)
65
版本轮次(本页随版本同步)
≥7.6 / 60
真机帧率:20v20 对局 / 大厅对照(fps)
口径(别用别的数):行数一律 LF 字节数(pwsh 的 Get-Content 在中文 UTF-8 上会少数约 6%, 历史上因此把 Main.gd 数成 911 行);测试项数一律取跑批日志的汇总行,没全绿就写「有失败 + 失败项原文」,不报绿。

二、整体架构(分层)

命名约定:不写 class_name 的模块,引用方必须 preload —— 新 class_name 在 --script 模式下不在全局类缓存里,裸写名字会解析失败。

① 外壳层 第四十七版新增

② 对局层(一局的世界)

③ 系统层 systems/

④ 实体层 entities/

⑤ 数据层

⑥ 核心 / 自动加载 / 门禁

⑦ 地图工具链 addons/jieyu_map/ 第五十版起

界面跳转(第四十七版把「怎么进对局」正式化了)

启动 ─► 大厅(lobby) ──push──► 模式选择(modes) ──开始对局──► 对局(MatchHost + Main.tscn) │ │ │ │ │ └─push─► 说明(info) │ ├─暂停键─► 暂停(pause) └──push──► 设置(settings) ◄┘ │ │ (从暂停进设置时暂停留在栈底) │ └─push─► 设置(settings) └─胜负─► 结算(result)

跳转纪律:同一时刻只有一屏可见 · 栈底不能退(返回按钮只在能退时出现)· 重复 push 被忽略 · 返回键只有一个出口(ESC / ui_cancel / Android 实体返回)· 菜单层 layer 100(HUD 1 / 战术地图 10 / AI 参谋 90)。

三、可玩循环(验收那条线)

环节发生什么玩家看到的证据状态
启动出大厅而不是直接进对局大厅四按钮 + 「下一局配置」面板新
0–3 s选完模式点开始对局,世界按模式规则建起来玩家小人在出生区,相机已对准✅
3–8 s手指在右半屏滑动 → 地图跟着走准心=屏心=相机中心三者恒等✅
8–15 s走到棱线后,敌兵消失(通视断)敌兵在通视恢复的那一帧出现✅
15–25 s按开火 → 曳光 → 命中 / 脱靶命中走弹道表,不是瞬间射线✅
25–40 s占点 / 报点 / 快捷指令 / 烟雾 / 间瞄HUD 三列按键 + 轮盘 + 地图图层✅
结束胜负判定 → 结算屏 → 再来一局 / 回大厅竞技三级判定(见下表)· 结算战报✅

四、三个模式:差别都接了线(22.10 第一版)

人数与编成(2026-10-03 使用者拍板 · docx 5.8):PVP 各模式 20 v 20、PVEVP 4P v 30E, 基本战术单位 = 4 人战斗小组(PVP 每方 5 组)。第一版无服务器 ⇒ 两个数字都靠 AI 填充。

模式人数 / 编成胜负口径时长 / 加时友伤AI 参谋出处
PVP 竞技 20 v 20
4 人一战斗小组 · 每方 5 组
占领数:全占立即胜 / 重生预算(进攻方人数 ×2)耗尽即负 / 到点比点数 15 分钟 → 加时 3 分钟突然死亡 → 仍平即平局 开关闭5.3 / 5.7 · 20 章
PVP 休闲 20 v 20(同竞技) 与竞技完全同表 同上 关开放5.3(「与竞技同表」)
PVEVP 4P v 30E
4P = 一个 4 人战斗小组
战术目标:达成=胜 / 未达成=败(本版=完成当前主线任务) 20 分钟 · 无加时、无平局 关开放5.3 · 22.6
PVP 装甲对抗20 v 20(同竞技)后续版本(22.10 降级)——界面上置灰并写明理由
困难模式20 v 20(同竞技)后续版本(22.10 降级)——困难项未逐条定标
兵棋模式未定(待拍板)后续版本(22.10 降级)——兵棋 SOP 与回合系统未做
每模式人数是 2026-10-03 使用者新拍的(docx 5.8 + 模式表新增「人数 / 编成」列):这条**推翻**了第四十七版 「刻意不设每模式敌人数」的处置(当时的理由是 docx 没有人数口径 —— 现在口径由使用者给定)。 人数已接线(第四十九版):模式定义人数 → MatchHost / WorldSetup 按模式建场(PVP 20+19 / PVEVP 30+3; 单跑 Main.tscn 仍回落 2+3)。队友编队已铺开(旧实现取模 3 个角度 ⇒ 19 人会叠成 3 堆)。 编成(第五十版):systems/match/Organization.gd 算出「组 4 人 / 一小队 ≥ 2 组」并逐人发到 Ally —— PVP 20 人 = 5 组 / 2 小队(2+3)、PVEVP 4 人 = 1 组 / 0 小队;端到端已被网关断言。 编成命令层(第五十三版):systems/match/SquadOrders.gd 把主线下发给小队长、按模板把小队内子任务派到每个组 (0 组占领 A / 1 组守住 B / 其余侦察循环),结果写回 world.squad_orders,端到端已被网关断言(9 → 18 项)。 执行层(第五十四版):队友真的按自己组的任务行动(有组任务去自己的占领节点、组内在 4 m 上错开; 没有则逐字沿用旧的「跟在玩家后方」),HUD 任务卡多一行「[组任务] 小队长:占领 A」(只往已有 Label 里拼)。 性能 · 桌面 headless(仿真口径):第五十一 / 五十二版两刀(感知节流 + 地形层快速排除 + 拆层节流) 把 20v20 脚本侧从 9.79 压到 1.29 ms/帧(has_sight 282 → 195 µs,敌人一帧 137~155 → 21~32 µs); 第六十五版改「目标选择」时一度涨到 44.95 ms(整帧墙钟,7× 回归),收紧重挑闸门后回到 中位 4.58 ms / p95 20.91 ms(130 s 推进场景 · 40 单位同场)。 性能 · 真机(PCE-W30 / Android 12):大厅 60 fps(p50 = p95 = p99 = 16.7 ms,连续 35 s 稳如磐石), 而 20v20 对局只有 ≥7.6 fps(p50 ≈ 133 ms)⇒ 瓶颈是渲染 + 我们自己的负载,不是设备限帧。 口径提醒:headless 不渲染,所以上面那组桌面数字**测不到渲染那一半**;真机又不能用 dumpsys gfxinfo (Godot 走原生 SurfaceView、不进 HWUI,永远报 0 帧),改用**引擎自报**逐帧 delta。详见 docs/性能预算.md 十一 / 十二节。 平衡:第六十四版量清了「敌人 AI 只锁玩家、队友对敌方火力免疫」是单向屠杀的根因(节点 3 名守军 0.5 s 被清光、19 名队友零阵亡); 第六十五版按拍板 B 让敌人能打队友,**但实测友军仍零阵亡** ⇒ 瓶颈在队友火力密度与 AI 反应(待拍板)。 默认模式=PVP 休闲:它是唯一「既有占领规则 + AI 参谋开放 + 关友伤」的组合,与第四十六版为止的行为最接近,回归面为零。

五、版本时间线(每一版都有真跑的验收数字)

第一版 ~ 第十八版

第十九版 ~ 第二十九版

第三十版 ~ 第四十一版

第四十二版 ~ 第四十六版

第四十七版

第四十八版 ~ 第五十四版

第五十五版 ~ 第五十九版

第六十版 ~ 第六十三版

第六十四版 ~ 第六十五版 本页对应

下一版(未开工)

六、门禁健康度(三道,全绿才允许提交)

门禁命令项数状态它钉住什么
单元测试--script res://tools/run_tests_headless.gd52 脚本 / 1876 项 全绿纯逻辑:规则表 / 弹道 / 任务 / 标记 / 模式表 / 设置 / 路由栈 等
HUD 几何门禁--script res://tools/geom_assertions.gd5 项 全绿不出屏 / 同级不新增重叠(基线 6 组)/ 点按 ≥32 px / 层号合法
外壳几何门禁--script res://tools/screen_geom_check.gd25 项 全绿大厅 / 模式 / 设置 / 暂停 / 结算五屏各 5 条(零重叠)
规模接线门禁--script res://tools/scale_wiring_check.gd21 项 全绿人数 / 编成 / 队友组任务是否真的接到装配链上(不是「常量在那儿」就算接线)
集成冒烟--script res://tools/run_integration_headless.gd263 项 全绿真实例化 Main.tscn:装配关系 + 交互链(含炸药 / 相机三档 / 地图数据驱动 / 敌人驻守与支援)
解析 / 导入自检--import—通过脚本能编译、场景能加载
真启动冒烟--headless --quit-after 90—退出码 0真主场景 App.tscn 跑起来无 ERROR
门禁也会「空跑通过」:App 起不来 ⇒ 一屏都没注册 ⇒ 零重叠零失败,看着像全绿。 所以外壳门禁加了两道自检:屏幕注册清单体检 + 「这一屏必须真的采集到可见控件」。 另外跑批里「子进程没起来」按 失败 计,不再算「跳过」——历史上把跳过的红当成绿提交过。

七、未来计划(严格按文档,不自创)

7.1 22.10「第一版范围」的完成度

22.10 原文口径工程实际进度
2 个阵营(泛亚 + 蓝方) 工程里没有阵营系统;首版大厅不列阵营选择(列了就是空壳按钮) 🔵 未做(待拍板:4 选 1 / 2 选 1 / 整块不做)
1 张地图(grassland_demo 1 km × 1 km) 已落地:1000×1000 / 1 m 网格 / 最大海拔 150 m,自制灰度高度图可导入 ✅ 已做
3 个模式(PVP 竞技 + PVP 休闲 + PVEVP) 已落地并可选;三个模式的规则差别全接线;另外 3 个模式置灰写明理由 ✅ 已做
人数与编成(PVP 20 v 20 / PVEVP 4P v 30E / 4 人战斗小组) 已落地:模式定人数(PVP 20+19 / PVEVP 30+3)· Organization 组 4 人 / 一小队 ≥2 组 · SquadOrders 主线 → 小队长 → 组任务 · 队友按组任务行动 · 敌人按节点驻守 + 东侧预备队 ✅ 已做(第四十九~五十四 / 六十三版;单跑 Main.tscn 仍回落 2+3)
1 张地图(第一张 正式图) 已落地「青岭走廊」并成为默认对局地图(第五十五 / 五十九版):五节点 / 河谷 / 三条道路 / 235 遮挡体, validate ERROR 0 / WARN 0;出生区与白旗点都读地图数据 ✅ 已做

7.2 下一批建议(来自 本项目开发进度.txt 四、接下来)

7.3 docx 20.6「文档里有设计、工程为零」——可直接当任务清单

条目状态
4.1 五节点 RAAS 的推进细则与单局计时🔵 未做
4.4 剩余部分:RALLY 集结点 · 兵力续航区与预算🔵 未做
4.8 信誉分🔵 未做
第九章 单兵装备与资产体系 + 资产 CSV(17 个装备槽)🔵 未做
12.7.1 人物帧动画 · 12.7.2 载具履带 / 后坐 · 12.7.6 帧规格表🔵 未做(需美术)
8.3 载具数据存储的正式方案🔵 未做
4.12 发烟弹 / 白磷来源 + 表现层真遮挡混合🟡 部分
11.4 对局外界面:阵营选择 · 组队 · 好友 · 仓库 · 高光录像 · 匹配🟡 大厅与模式选择已做,其余未做
5.3 除 PVP 竞技之外各模式的胜负表✅ 第四十七版划掉
4.13 / 4.14 / 4.15 / 4.16 / 4.17 五节✅ 第三十~三十三版落地
4.10.11 模板池剩余 5 条 · 4.4 的 FOB 与补给 · 12.3 阴影 · 10 章音频✅ 已落地(各自未完项见 docx 20.5)

7.4 待拍板(需要使用者定,工程不替用户决定)

编号问题工程当前处置
㊱「竞技 / 严格对抗」到底包含哪几个模式?原文只写「只有竞技 / 严格对抗才关闭 AI 参谋」, 而休闲「与竞技同表」、困难「同竞技」、兵棋在 13.1.2 与竞技并列禁用共享皮肤 待拍板 只有 PVP 竞技关闭,休闲 / PVEVP 开放
㊲AI 参谋在竞技模式下的可见性:入口按钮仍可见(点开只得一句「已关闭」) 待拍板 不隐藏入口,只写提示
㊳PVEVP 的「VP」那一半(21.3.8 明确「无来源、待撰写」)——战术目标体系要正式定标 待拍板 占位:完成当前主线任务(本版=夺下第一个节点)
㊴首版大厅的阵营选择:11.4 列 4 个,22.10 只做 2 个 —— 4 选 1 / 2 选 1 / 整块不做? 待拍板 整块不做
新增模式差异要不要再拉大?当前差别全在「规则层」;若要做「编成层」差异(步兵对抗 / 装甲对抗:有没有载具、坦克几辆)需在 ModeTable 加字段并接线 待拍板 未做
㊵「4 人战斗小组」与 4.10.8「小队 = 5 人」的关系 —— 已结清:组 = 4 人、一小队 ≥ 2 组 ✅ 已结清(第四十九 / 五十版落地;docx 4.10.8 与 21 章同步改口径)
㊶兵棋模式的人数与编成:使用者只拍了 PVP(20 v 20)与 PVEVP(4P v 30E) 待拍板 模式表该行标「未定」
㊷22.7 / ㉑ 的旧规模口径要按 20 v 20 复核:原文写「32v32」「压测 1 / 16 / 32 人」「1 个 16v16 房间」—— 20 v 20 的房间是 40 人 待拍板 未改(等确认)
㊹20 v 20 的 AI 阵营不平衡 —— 第六十四版量清了根因:Enemy 的 AI 只锁玩家、从不打队友, 而队友会打敌人 ⇒ 单向屠杀(节点 3 名守军 0.5 s 被清光、19 名队友零阵亡)。第六十五版按拍板 B 让敌人能打队友了, 但**实测友军仍然零阵亡** ⇒ 真正的瓶颈是队友火力密度与 AI 反应 待拍板 怎么配平:队友降火力 / 给敌人驻守姿态与掩体利用 / 缩小队友编成
㊿敌人要不要能打队友 ✅ 已拍板 B 并落地(第六十五版:按最近的可见目标选敌,玩家与队友同权)
㊺ ㊻ ㊼炸药的三条尾巴:要不要给自己人吃爆炸伤害(第一版有意不打自己人)· 要不要投掷形态(与 4.12 投掷物同一套)· 要不要安放时间 / 起爆倒计时 待拍板 现状:只打 enemy / fob_enemy 组 · 只贴放 · 都是瞬时
㊽地形内容层的表达方式:正式图 material.png 解出 205 片(泥 5 / 雪 139 / 草 61),每片画成等面积圆 ⇒ 观感像一地碎圆饼 待拍板 A 调大 MATERIAL_MIN_CELLS · B 改多边形 / 逐格查询 · C 保持现状
19 ①逻辑分辨率与 PPU:文档 1920×1080 + 64/32/16,工程 960×540 + 32/16/8保持工程口径
19 ⑥数据表规模口径:文档写全量、工程按切片(任务模板已结清)已扩到武器 25 / 载具 18
19 ⑨4.8 信誉分是否进第一版只有战力分,无信誉分
㉛ / ㉜AI 参谋的 key 是否上 Android Keystore · 是否做流式(SSE)混淆存放 · 非流式
—Enemy.detection_range 保留 20 m(近视)还是退回 120 m ✅ 已是 120 m(Enemy.gd 默认值,无场景覆盖;测试用例里单独设 60 m)

7.5 工程债(docx 20.5 · 已修 / 仍欠)

条目状态
真机 20v20 只有 ≥7.6 fps(大厅对照 60 fps ⇒ 不是设备限帧) 🟡 第六十五版登记 · 待「渲染 vs 仿真」判别后再优化
内容层是等面积圆:正式图解出 205 片(雪 139 / 草 61 是碎块),观感像一地碎圆饼 🟠 待拍板
地图的 rally_zones 与 flags 压制圈仍未读进工程 🟡 登记未做
Main.gd 破线 403(第五十一版结构值接线后超 ≤400 硬线)✅ 第五十六版拆出 PlayerFireController 后 337
ATGM 载具 2000 m 拖拽上限(常量在、但根本没接上,实际一直用 500 m)✅ 第五十八版已接并做出三档
地图工具链两个盲点(不压平出生区 / 校验只看顶点)✅ 第六十二版已修
HUD 控件重叠 6 组(含 3 组「有意」、3 组「无意待修」)🟡 已建基线,逐条定案
地图报点与准心报点的通视口径不一致🟡 登记未修
烟雾表现层不是真遮挡(程序绘制圆饼,后生成的单位画在烟上面)🟡 登记未修
敌方载具 AI 被烟挡住后没有盲射路径🟡 登记未修
载具里镜头与准心不跟车🟡 登记未修
软键盘弹出顶掉面板下半部分🟡 登记未处理
16 辆新载具与 20 把新枪的模板值未做平衡校验🟡 登记未做
音量设置界面(AudioSystem 头部自述「未做」)✅ 第四十七版已修
操作提示开关(HudBuilder「设置界面后置,先给 API」)✅ 第四十七版已修
全工程字体隐患(全角标点豆腐块)✅ 第四十四版已修
面板翻页死区 / 「清除 key」误删✅ 第四十四版已修

八、这一页的数据从哪来(可复现)

数字取证方式
176 个 .gd / 31338 行LF 字节口径统计(不含 addons/ gdtoolkit/ .godot/),用只读检查脚本与本机实测交叉核对
52 / 1876 · 5 · 25 · 21 · 263本轮真跑:run_tests_headless.gd + run_integration_headless.gd + geom_assertions.gd / screen_geom_check.gd / scale_wiring_check.gd,取日志汇总行,退出码均为 0
真机 ≥7.6 / 60 fps平板 PCE-W30:测量专用包(引导脚本按 PVP_RANKED 起对局)+ 引擎自报逐帧 delta 的 p50/p95/p99; dumpsys gfxinfo 对 Godot 无效(SurfaceView 不进 HWUI,永远 0 帧)—— 详见 docs/性能预算.md 十二节
版本 / git HEADgit log -1
数据表行数直接数 data/*.txt(含表头)

同步的文档(本轮一起改的)