# 《红色警戒》初代源码剖析

面向同时喜欢游戏和编程的读者：从一局即时战略游戏如何运行，读到对象、地图、战斗、经济、AI、图形、联机、存档和底层工具。

**分析对象**：[Electronic Arts 官方 CnC_Red_Alert 仓库](https://github.com/electronicarts/CnC_Red_Alert)。  
**固定提交**：`0dc09bb1d6188d1ec79ab4765b22a48b75ffee32`，提交日期 2025-02-27。  
**分析日期**：2026-09-20。  
**工作方式**：获取实际源码，沿函数体与调用关系进行静态分析，按子系统研读后交叉核验。所有源码行号链接固定到同一提交。

## 先弄清楚这套资料的范围

这是 **Red Alert 1**，不是《红色警戒2》，也不是 OpenRA 或重制版引擎。代码含资料片、不同平台、DVD 和联网服务相关历史分支，不能将整个仓库视为最初发行版的一套无条件生效实现。

文档力求覆盖制作这款游戏的完整主要技术链路，重点分析关键算法、数据结构、状态机与跨模块关系。它不是对全部 798,402 个可计数文本行逐行完成的审计，也不是已经复原并运行的游戏版本。全量文件盘点和重点代码研读是不同层次的工作。

官方 README 明示源码当前不能完整编译。文档中的“源码事实”来自该提交；“工程解释”是据此作出的设计分析；“教学示例”是帮助理解的输入或伪代码；“待验证”表示尚无运行证据。尤其不能把构造默认值当成最终发行版数值，因为游戏资源和关卡配置仍会覆盖它。[官方构建说明](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/README.md#L8-L28)。

## 目录

| 章 | 阅读主题 | 你将能回答的问题 |
|---|---|---|
| [00](chapters/00-how-an-rts-is-built.md) | 整体制作原理 | 一堆代码、图片和规则怎样形成一场战争？ |
| [01](chapters/01-repository-history-and-build.md) | 仓库、历史与构建 | 拿到的是什么版本？为什么不能直接编译？ |
| [02](chapters/02-runtime-and-game-loop.md) | 启动、主循环与时间 | 一帧究竟执行什么？游戏速度与画面刷新如何联系？ |
| [03](chapters/03-object-model-and-memory.md) | 对象模型与内存 | 坦克、建筑、子弹怎样组织？对象消失后引用怎么办？ |
| [04](chapters/04-map-coordinates-and-pathfinding.md) | 地图、坐标与寻路 | 格子和像素如何对应？坦克怎样绕过障碍？ |
| [05](chapters/05-rules-types-and-data-driven-design.md) | 规则、类型与数据驱动 | INI 改的是哪层数据？可以任意新增单位吗？ |
| [06](chapters/06-combat-and-damage.md) | 射击、弹体与伤害 | 命中、装甲、范围伤害和死亡如何算？ |
| [07](chapters/07-economy-production-and-buildings.md) | 经济、生产与建筑 | 采矿、扣钱、电力、建造、出售怎样闭环？ |
| [08](chapters/08-units-and-special-mechanics.md) | 兵种与特殊机制 | 飞机、潜艇、运输、工程师、超武怎样实现？ |
| [09](chapters/09-ai-teams-and-missions.md) | AI、队伍与任务状态机 | 电脑为什么会进攻？单位自己的 AI 又是什么？ |
| [10](chapters/10-scenarios-triggers-and-campaign.md) | 关卡、触发器与战役 | 增援、计时器、过关条件和剧情如何编排？ |
| [11](chapters/11-rendering-ui-and-input.md) | 渲染、界面与输入 | 坦克为什么像立体的？鼠标点击如何变成命令？ |
| [12](chapters/12-assets-audio-and-video.md) | 资源、音频与视频 | MIX、精灵、调色板、音乐和过场怎样工作？ |
| [13](chapters/13-network-lockstep-and-replay.md) | 联机、同步与录像 | 多台电脑为何能维持同一场战斗？ |
| [14](chapters/14-save-load-and-binary-formats.md) | 存档与二进制表示 | 内存中的对象关系怎样保存到磁盘又恢复？ |
| [15](chapters/15-platform-libraries-tools-and-porting.md) | 底层库、工具与移植 | 哪些属于引擎底座？今天修复应从哪里开始？ |
| [16](chapters/16-end-to-end-gameplay-traces.md) | 跨模块追踪 | 一次移动、开火、生产和过关如何串起各章？ |
| [17](chapters/17-reading-labs-and-design-lessons.md) | 阅读实验与设计启示 | 如何亲手验证理解，并用于自己的游戏项目？ |

## 三种阅读路线

- **先从玩家视角理解**：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 全部源码文件索引](appendices/A1-all-source-files.md)：2,084 个文件，含大小、文本行数和固定提交链接。
- [A2 术语与问题导航](appendices/A2-glossary-and-navigation.md)：从玩家用语找到工程概念与源码模块。
- [A3 分析覆盖、证据与未验证事项](appendices/A3-evidence-coverage-and-limitations.md)：解释哪些结论可以确认，哪些需要资源或运行环境。
- [A4 容易误读的实现细节](appendices/A4-code-reading-pitfalls.md)：集中记录旧注释、宏分支和字面行为的陷阱。
- [A5 正文源码引用覆盖索引](appendices/A5-source-evidence-map.md)：按源文件反查相关章节，正文涉及164个带行号引用的源文件。
- [源码清单与 SHA-256](appendices/source-manifest.json)：每个跟踪文件的可复核摘要。
- [文档链接检查报告](appendices/validation-report.json)：检查提交、源文件、行号范围和本地文件链接。

## 获取与复核

分析时已在工作区克隆源码。若在自己的电脑阅读，可执行：

```bash
git clone https://github.com/electronicarts/CnC_Red_Alert.git
cd CnC_Red_Alert
git checkout --detach 0dc09bb1d6188d1ec79ab4765b22a48b75ffee32
```

将本资料目录和源码目录放在同一父目录，使用 Python 3 复核：

```bash
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](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/LICENSE.md)为准。本资料以解释、链接和少量教学示意为主，没有打包原版游戏资源，也没有构建或分发可执行游戏。
