REFERENCE / A3
分析覆盖、证据与未验证事项
1. 可复现的分析基线
| 项目 | 结果 |
|---|---|
| 仓库 | electronicarts/CnC_Red_Alert |
| 提交 | 0dc09bb1d6188d1ec79ab4765b22a48b75ffee32 |
| 提交日期 | 2025-02-27 |
| 跟踪文件 | 2,084 |
| 文件内容总大小 | 32,336,476 字节,不含 Git 元数据 |
| C/C++、头文件和汇编 | 1,630 个(扩展名 .c/.cpp/.h/.asm) |
| 可计数文本行 | 798,402,含注释与空行,不能称为有效代码行数 |
| 正文章节 | 18 章,00—17 |
| 原仓库修改 | 无 |
| 原游戏编译或执行 | 未进行 |
文件计数依据 git ls-files;“文本”以不含 NUL 字节的启发式识别,不是完整文件格式鉴定。每个文件的路径、大小、行数与 SHA-256 记录于source-manifest.json。获取的是固定源码快照,不以完整历史提交演化分析为任务成果。
2. 覆盖如何理解
本资料覆盖完整主要系统,但各类覆盖的深度不同:
| 层级 | 已完成的工作 | 不应被解释成 |
|---|---|---|
| 全仓库盘点 | 所有跟踪文件、目录与摘要 | 每个文件已逐行读完 |
| 子系统深读 | 核心函数体、数据结构、关键宏和调用链 | 所有平台分支都已编译验证 |
| 跨模块核验 | 输入到命令、任务到移动、生产到入场、伤害到触发、序列化与身份关系 | 每一种实战情形都有测试数据 |
| 文档结构检查 | 不可变提交、文件存在、行号范围、本地链接 | 自动检查已经证明结论语义正确 |
| 静态疑点记录 | 对照函数体与旧注释,记录边界 | 发现的每一疑点都是已复现的运行 bug |
分析没有以源文件头部的函数目录代替函数体阅读。也没有把网上攻略中的数值、其他重实现项目的行为或对原版的记忆填入证据空缺。
3. 主要子系统覆盖表
| 子系统 | 重点已读入口 | 文档 |
|---|---|---|
| 启动与模式 | STARTUP、INIT、Main_Game、Select_Game | 01、02 |
| 帧循环与计时 | Main_Loop、Sync_Delay、Call_Back、Logic::AI、计时模板 | 02 |
| 对象关系与生命周期 | Abstract/Object/Mission/Radio/Techno/Foot 及派生类、Heap、TARGET、CCPtr | 03 |
| 空间与寻路 | Cell、Map、Coord、Basic_Path、Find_Path、Follow_Edge、Drive | 04 |
| 规则和类型 | Rules、INI/CCINI、UDATA/BDATA、TechnoType、Weapon、Warhead | 05 |
| 战斗闭环 | Firing_AI、Can_Fire、Fire_At、Bullet、Explosion_Damage、Take_Damage | 06 |
| 经济与生产 | House、Factory、矿车任务、建筑产电/修理/出售与交付 | 07 |
| 兵种和超武 | Infantry、Unit、Aircraft、Vessel、Super、Vortex、特殊任务 | 08 |
| 多层 AI | Mission、TeamType、Team、House::Expert_AI/AI_Building/AI_Unit | 09 |
| 关卡编排 | Scenario、TriggerType、Trigger、TEvent、TAction、Reinf、胜负和编辑器 | 10 |
| 显示与交互 | GScreen/Display 层、Radar/Sidebar、Gadget/Mouse、Draw_It、CC_Draw_Shape | 11 |
| 资源与视听 | CCFile、MixFile、Shape/Keyframe、LCW、WSA、Audio、Theme、VQA | 12 |
| 联机同步 | Event、Queue、Connect、IPX managers、UDP/IPX transport、WOL 集成 | 13 |
| 存档与录像 | SaveLoad、Heap IO、IOObj、IOMap、Session、记录/回放入口 | 13、14 |
| 底层与构建 | Makefiles、内存/文件/计时/绘图、Straw/Pipe、压缩、平台/工具差异 | 01、15 |
| 综合理解 | 移动、开火、生产、触发与胜负的跨模块路径 | 00、16、17 |
“重点入口”表示读过相关主体或有针对性的实现片段,不表示每个列出的超大源文件全部逐行审核。可以从各章引用进一步反查,或使用A5 引用覆盖索引。
4. 九个源码目录均有说明,但深度有所区别
| 目录 | 本次处理范围 | 保留的边界 |
|---|---|---|
| CODE | 核心玩法、逻辑、显示、场景、通信、存档和配置的重点深读 | 未穷举所有语言文本、对话框或全部宏组合 |
| WIN32LIB | 主要平台子库与实际构建对象、文件/内存/显示/计时/声音样例 | 未对每个汇编指令及历史副本做等价性证明 |
| WWFLAT32 | DOS 平台职责、构建分支和与 Win32 的差异 | 未安装 DOS 环境逐项运行 |
| IPX | DLL/thunk 工程、接口层及其与游戏通信封装的关系 | 未测试真实 IPX 或旧 Windows 兼容链 |
| VQ | 视频体系、公共数据与 DOS 播放/解码路径 | 未建立所有编码工具的可运行环境 |
| WINVQ | Win32 视频/音频相关路径和播放器构建 | 未测真实媒体文件的完整播放 |
| LAUNCH | 启动辅助逻辑与工程角色 | 不等于已验证现行安装或分发机制 |
| LAUNCHER | Windows 启动器职责、资源与构建关系 | 未复原完整历史安装流程 |
| TOOLS | 素材制作工具分类与可见源码边界 | 包含二进制工具,不能从可执行文件名称声称已读其实现 |
5. 证据可信度的层次
- 直接源码事实:具体字段、分支、循环、函数调用顺序,例如队列执行在 Logic.AI 之后。
- 跨函数推导:需要结合调用者、被调用者和数据结构,例如事件设置目的地可能同步准备路径,但持续行驶仍跨帧。
- 工程解释:根据结构说明收益与代价,例如类型共享减少重复,固定对象池约束规模。
- 教学输入:人为给定价格、伤害、地图或队伍,帮助手算和跟踪;不是原版资源实测。
- 待运行核验:源码异常在实际发行版中的可触发性、性能、网络表现及资源兼容性。
图中因果箭头不必等于直接函数调用;章节已在综合图和案例处作此区分。若要使用这些资料开发兼容实现,应把关键推导转成运行轨迹或差分测试,而不是只检验最终画面相似。
6. 交叉审读中已经修正的事项
| 事项 | 最终采用的准确表述 |
|---|---|
| Assign_Mission | 通常提交 MissionQueue,Commence 再切换当前 Mission |
| 寻路开始时机 | Assign_Destination 可同步进行 Start_Of_Move/Basic_Path 准备,不能全推迟到下一帧 |
| 配置优先级 | 地图后还可能有条件性的 MPLAYER.INI 层 |
| LCW 变体 | 主工程中的 C++ 与库汇编实现要分开,长度参数处理并不一致 |
| 存档 PendingObject | 延后修复顺序可确认;历史注释的理由不当作现有类型模型下的绝对限制 |
| 入场检查 | 普通 Unlimbo 的可进入性检查存在 ScenarioInit 例外 |
| 触发后的胜利 | 从摧毁通知、触发动作到 House 延迟/阻挡检查,再到主循环胜负出口 |
这类修正反映了分析的证据标准:保持简单解释,但不抹掉会改变时序或行为的条件。
7. 为什么没有声称“已经完整编译并玩过”
官方 README 明确说明当前源码不能完整编译,历史工具链与若干依赖需要恢复或替代。仓库还不等于完整发行版资源包。本次任务的目标是理解源码并形成分析文档,没有把建立一套可运行移植版作为未经验证的附带成果。官方 README。
构建章节区分了缺失依赖、可由 make 生成的文件、路径历史差异及不应执行的现成旧工具。我们没有通过“运行 make 报了一条错误”就宣布完成全部构建诊断;也没有把可能替代的现代库误写成已接通的后端。
8. 后续最值得验证的具体问题
| 问题 | 为什么静态阅读不足 | 建议验证方式 |
|---|---|---|
| 不同速度设置下实际逻辑速率 | 受系统计时、负载和协议调节影响 | 记录真实时间与 Frame 增量 |
| 拥堵和复杂障碍下寻路表现 | 有动态占位和跨帧重试 | 固定地图与输入,记录每次路径/阻塞原因 |
| 大范围伤害字面公式的实际分布 | 多次局部爆炸和保护状态叠加 | 固定靶场逐对象记录伤害调用 |
| 单机录像的随机一致性 | 记录与回放存在 CRC 取随机数路径差异 | 固定种子和命令流逐帧比较 |
| 存档往返后的状态一致性 | ABI、类型配置和资源都会影响恢复 | 同帧分叉,比较继续运行轨迹 |
| 混合触发条件与 AllowWin 特例 | 锁存、重复方式和动作槽不完全对称 | 构造最小任务逐条件验证 |
| 增援全部入场与桥梁伤亡 | 返回成功不等于每个对象放置成功 | 记录 Unlimbo、清理与触发事件 |
| 不同 LCW/Shape/VQA 实现一致性 | 历史分支、布局和解码优化不同 | 使用合法样本和受控输入比较输出 |
| Win32 声像与语音缓存 | 上层计算与底层实际使用存在差别 | 观察后端调用、声道输出与缓存命中 |
| 64位/现代编译器迁移 | 指针宽度、结构体布局、整数语义变化 | 先建类型布局清单,再做差分回归 |
这些是明确的后续实验,不是要求读者接受无条件免责声明。它们让“源码告诉了我们什么”与“还需要什么证据”保持可区分。