查看源码下载文档
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. 证据可信度的层次

  1. 直接源码事实:具体字段、分支、循环、函数调用顺序,例如队列执行在 Logic.AI 之后。
  2. 跨函数推导:需要结合调用者、被调用者和数据结构,例如事件设置目的地可能同步准备路径,但持续行驶仍跨帧。
  3. 工程解释:根据结构说明收益与代价,例如类型共享减少重复,固定对象池约束规模。
  4. 教学输入:人为给定价格、伤害、地图或队伍,帮助手算和跟踪;不是原版资源实测。
  5. 待运行核验:源码异常在实际发行版中的可触发性、性能、网络表现及资源兼容性。

图中因果箭头不必等于直接函数调用;章节已在综合图和案例处作此区分。若要使用这些资料开发兼容实现,应把关键推导转成运行轨迹或差分测试,而不是只检验最终画面相似。

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位/现代编译器迁移 指针宽度、结构体布局、整数语义变化 先建类型布局清单,再做差分回归

这些是明确的后续实验,不是要求读者接受无条件免责声明。它们让“源码告诉了我们什么”与“还需要什么证据”保持可区分。

红色警戒初代 · 源码剖析18 章正文 / 5 份附录
输入关键词,检索 24 份完整文档
全文检索 · 点击结果直达对应小节