《红色警戒》初代源码剖析
面向同时喜欢游戏和编程的读者:从一局即时战略游戏如何运行,读到对象、地图、战斗、经济、AI、图形、联机、存档和底层工具。
分析对象:Electronic Arts 官方 CnC_Red_Alert 仓库。
固定提交:0dc09bb1d6188d1ec79ab4765b22a48b75ffee32,提交日期 2025-02-27。
分析日期:2026-09-20。
工作方式:获取实际源码,沿函数体与调用关系进行静态分析,按子系统研读后交叉核验。所有源码行号链接固定到同一提交。
先弄清楚这套资料的范围
这是 Red Alert 1,不是《红色警戒2》,也不是 OpenRA 或重制版引擎。代码含资料片、不同平台、DVD 和联网服务相关历史分支,不能将整个仓库视为最初发行版的一套无条件生效实现。
文档力求覆盖制作这款游戏的完整主要技术链路,重点分析关键算法、数据结构、状态机与跨模块关系。它不是对全部 798,402 个可计数文本行逐行完成的审计,也不是已经复原并运行的游戏版本。全量文件盘点和重点代码研读是不同层次的工作。
官方 README 明示源码当前不能完整编译。文档中的“源码事实”来自该提交;“工程解释”是据此作出的设计分析;“教学示例”是帮助理解的输入或伪代码;“待验证”表示尚无运行证据。尤其不能把构造默认值当成最终发行版数值,因为游戏资源和关卡配置仍会覆盖它。官方构建说明。
目录
| 章 | 阅读主题 | 你将能回答的问题 |
|---|---|---|
| 00 | 整体制作原理 | 一堆代码、图片和规则怎样形成一场战争? |
| 01 | 仓库、历史与构建 | 拿到的是什么版本?为什么不能直接编译? |
| 02 | 启动、主循环与时间 | 一帧究竟执行什么?游戏速度与画面刷新如何联系? |
| 03 | 对象模型与内存 | 坦克、建筑、子弹怎样组织?对象消失后引用怎么办? |
| 04 | 地图、坐标与寻路 | 格子和像素如何对应?坦克怎样绕过障碍? |
| 05 | 规则、类型与数据驱动 | INI 改的是哪层数据?可以任意新增单位吗? |
| 06 | 射击、弹体与伤害 | 命中、装甲、范围伤害和死亡如何算? |
| 07 | 经济、生产与建筑 | 采矿、扣钱、电力、建造、出售怎样闭环? |
| 08 | 兵种与特殊机制 | 飞机、潜艇、运输、工程师、超武怎样实现? |
| 09 | AI、队伍与任务状态机 | 电脑为什么会进攻?单位自己的 AI 又是什么? |
| 10 | 关卡、触发器与战役 | 增援、计时器、过关条件和剧情如何编排? |
| 11 | 渲染、界面与输入 | 坦克为什么像立体的?鼠标点击如何变成命令? |
| 12 | 资源、音频与视频 | MIX、精灵、调色板、音乐和过场怎样工作? |
| 13 | 联机、同步与录像 | 多台电脑为何能维持同一场战斗? |
| 14 | 存档与二进制表示 | 内存中的对象关系怎样保存到磁盘又恢复? |
| 15 | 底层库、工具与移植 | 哪些属于引擎底座?今天修复应从哪里开始? |
| 16 | 跨模块追踪 | 一次移动、开火、生产和过关如何串起各章? |
| 17 | 阅读实验与设计启示 | 如何亲手验证理解,并用于自己的游戏项目? |
三种阅读路线
- 先从玩家视角理解:00 → 16 → 04 → 06 → 07 → 08 → 09 → 10,再回头补 02、03、05。
- 按程序员的依赖顺序:01 → 00 → 02 → 03 → 05 → 04 → 06 → 07 → 09 → 13 → 14,再读表现和平台部分。
- 准备改代码或做自己的 RTS:01 → 05 → 16 → 17 → 15;遇到具体机制再进入对应章节。
不必顺序读完才有收获。每章都包含源码入口、具体例子和验证边界。阅读时把章内解释与源码并排打开,比连续阅读几十个头文件更容易建立因果关系。
附录和可复核材料
- A1 全部源码文件索引:2,084 个文件,含大小、文本行数和固定提交链接。
- A2 术语与问题导航:从玩家用语找到工程概念与源码模块。
- A3 分析覆盖、证据与未验证事项:解释哪些结论可以确认,哪些需要资源或运行环境。
- A4 容易误读的实现细节:集中记录旧注释、宏分支和字面行为的陷阱。
- A5 正文源码引用覆盖索引:按源文件反查相关章节,正文涉及164个带行号引用的源文件。
- 源码清单与 SHA-256:每个跟踪文件的可复核摘要。
- 文档链接检查报告:检查提交、源文件、行号范围和本地文件链接。
获取与复核
分析时已在工作区克隆源码。若在自己的电脑阅读,可执行:
git clone https://github.com/electronicarts/CnC_Red_Alert.git
cd CnC_Red_Alert
git checkout --detach 0dc09bb1d6188d1ec79ab4765b22a48b75ffee32将本资料目录和源码目录放在同一父目录,使用 Python 3 复核:
python RedAlert-Source-Guide/scripts/index_source.py CnC_Red_Alert
python RedAlert-Source-Guide/scripts/audit_guide.py CnC_Red_Alert这两项只做文件盘点和文档结构核验,不编译游戏,也不证明全部语义正确。需要精确定位时可使用章内固定提交链接,或在本地用 rg -n 查找函数名。检索可能命中文件顶部的旧函数目录,务必继续找到函数体。
使用边界
原始代码的许可及附加条款以仓库 LICENSE.md为准。本资料以解释、链接和少量教学示意为主,没有打包原版游戏资源,也没有构建或分发可执行游戏。