# A4　最容易误读的实现细节

本附录不是已复现 bug 清单。它集中记录名字、旧注释、现代习惯与当前函数体之间的区别，帮助读者避免把错误前提带入后续分析。

## 1. 运行时和对象

| 容易形成的印象 | 源码支持的准确理解 | 证据 |
|---|---|---|
| 每帧先处理所有命令再模拟 | 常规主循环的 Logic.AI 先于 Queue_AI；等待阶段还会处理输入和显示 | [Main_Loop](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/CONQUER.CPP#L2230-L2303) |
| Assign_Mission 立即换当前任务 | 先写 MissionQueue；Commence 再切换 Mission | [任务切换](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/MISSION.CPP#L343-L391) |
| 所有移动工作都等下一帧开始 | Assign_Destination 可立即调用 Start_Of_Move 做准备 | [目的地赋值](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/DRIVE.CPP#L618-L627) |
| 新建对象就已出现在战场 | 对象初始 Limbo，入场要维护占位、显示层和逻辑集合 | [入场](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/OBJECT.CPP#L1391-L1420) |
| Limbo 就是 delete | 它撤出世界和跟踪关系，内存生命周期还需另看 | [离场](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/OBJECT.CPP#L1340-L1368) |
| Radio 是语音或网络 | 它直接调用对象的 Receive_Message，是协作协议 | [Radio 发送](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/RADIO.CPP#L204-L241) |
| fixed 是浮点或16.16 | 此实现是无符号8.8布局，不同运算的取整也不同 | [布局](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/FIXED.H#L216-L229) |

## 2. 地图、AI 和配置

| 容易形成的印象 | 准确理解 | 证据或章节 |
|---|---|---|
| 寻路必然是 A* | 这里是直线路径、沿两侧障碍边缘搜索与后续平滑，不提供全局最短路径保证 | [04 寻路](../chapters/04-map-coordinates-and-pathfinding.md) |
| In_Radar 表示在雷达视野里 | 实际判断可玩地图矩形范围 | [In_Radar](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/MAP.CPP#L645-L665) |
| IsMapped/IsVisible 就是现代 explored/current LOS | 它们有本地遮蔽和边缘显示语义，不应直接移植现代双层迷雾概念 | [04 视野](../chapters/04-map-coordinates-and-pathfinding.md) |
| 每个 AI_* 名字都实现了对应智能行为 | Expert_AI 中一些建造处理是空壳，实际建造选择在其他函数 | [09 战略AI](../chapters/09-ai-teams-and-missions.md) |
| Team 是玩家 Ctrl 编队 | AI Team 还有模板、招募和脚本任务，快捷选择编组另有实现 | [09 队伍](../chapters/09-ai-teams-and-missions.md) |
| 新写一个 INI 段落就能新增任意类型 | 车辆、武器、弹头都有已有注册集合 | [固定武器清单](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/RULES.CPP#L638-L704) |
| 所有配置项都继承旧值 | 多数如此，但难度和 Verses 等字段有自己的缺省策略 | [05 缺省值](../chapters/05-rules-types-and-data-driven-design.md) |
| 地图规则在所有模式下最后生效 | 外层还可能应用 MPLAYER.INI | [附加多人规则](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/SCENARIO.CPP#L422-L485) |
| 触发器 AND 代表先后执行 | 锁存条件和当前条件不同；Elapsed 计时开始点也需看 Reset | [10 条件组合](../chapters/10-scenarios-triggers-and-campaign.md) |
| 增援返回 true 证明全部成员抵达 | 普通结尾返回值不逐一证明所有成员 Unlimbo 成功 | [增援结束路径](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/REINF.CPP#L472-L529) |

## 3. 战斗和生产

| 容易形成的印象 | 准确理解 | 证据或章节 |
|---|---|---|
| AI 总选 DPS 最高的武器 | 主副武器选择并未完整计算伤害除射速 | [武器选择](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/TECHNO.CPP#L338-L379) |
| Burst=n 就是通用 n 连发 | 通用路径可见的是双发判定与交替状态，不能按字段名扩展含义 | [双发条件](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/TECHNO.CPP#L6188-L6193) |
| 所有爆炸都扫描大圆内全部对象 | 普通爆炸先查九格和有界候选，再检查距离；空中命中另有路径 | [普通爆炸](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/COMBAT.CPP#L162-L237) |
| forced 必然穿透一切保护 | 派生层仍可能先拦截，铁幕就是需要跟完整调用链的例子 | [铁幕检查](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/TECHNO.CPP#L3793-L3809) |
| Wide_Area_Damage 注释可直接当衰减公式 | 当前字面表达式与直觉衰减不同，还叠加多个局部爆炸；实际分布待运行验证 | [大范围函数](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/COMBAT.CPP#L393-L424)、[06 解释](../chapters/06-combat-and-damage.md) |
| 致命攻击按旧注释总留一滴血 | 当前基础扣血实现可真正降到零并处理击杀 | [扣血函数体](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/OBJECT.CPP#L1614-L1665) |
| 生产只是一段倒计时 | 阶段推进与逐步付款耦合，缺钱时回退阶段 | [工厂AI](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/FACTORY.CPP#L201-L239) |
| Building 卸矿函数就是矿车实际结算链 | 应沿 Unit::Mission_Unload 的现存调用，不能只按旧函数名判断 | [07 卸矿](../chapters/07-economy-production-and-buildings.md) |
| 出售、死亡与储量变化可仅看一个布尔参数 | 调用者选择的参数决定实际分支，不能把未使用分支当普遍行为 | [07 容量与出售](../chapters/07-economy-production-and-buildings.md) |

## 4. 同步、存档和底层库

| 容易形成的印象 | 准确理解 | 证据或章节 |
|---|---|---|
| 校验 CRC 完全不改变模拟 | Compute_Game_CRC 中的随机对象整数转换会取随机数 | [CRC 调用](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/QUEUE.CPP#L3870-L3875)、[转换运算符](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/RANDOM.H#L48-L67) |
| 录像只保存命令 | 还记录视口、选择等本地状态，且有布局/版本约束 | [13 录像](../chapters/13-network-lockstep-and-replay.md) |
| 有录像代码就代表所有模式回放已可靠 | 单机/多人/回放路径需分别检查，本次未运行确认 | [13 验证边界](../chapters/13-network-lockstep-and-replay.md) |
| 连接层注释说不保序就完全不保序 | 当前 DATA_ACK 交付按序，NOACK 行为不同 | [Get_Packet](https://github.com/electronicarts/CnC_Red_Alert/blob/0dc09bb1d6188d1ec79ab4765b22a48b75ffee32/CODE/CONNECT.CPP#L480-L537) |
| Host 就是计算全部战斗的权威服务器 | 主机承担时间/会话协调不能推出权威战斗服务器架构 | [13 协议](../chapters/13-network-lockstep-and-replay.md) |
| 存档是自包含、跨平台的数据协议 | 大量原始对象布局、池槽与类型恢复依赖编译环境，也依赖外部规则 | [14 存档](../chapters/14-save-load-and-binary-formats.md) |
| SAVEGAME_VERSION 是完整 schema 版本 | 当前为若干 sizeof 的组合及分支修正，不能覆盖所有布局变化 | [14 版本](../chapters/14-save-load-and-binary-formats.md) |
| 写存档不碰运行中的世界 | 编码指针会临时改写部分对象内引用，之后再解码 | [14 编码流程](../chapters/14-save-load-and-binary-formats.md) |
| 所有 LCW 解码器的边界行为相同 | 多份 C++/汇编实现和编译归属不同；部分汇编使用 length 裁剪输出 | [12 LCW](../chapters/12-assets-audio-and-video.md) |
| 计算了 pan 就证明 Win32 已实现左右声像 | 上层传递和底层使用要分别检查 | [12 音频](../chapters/12-assets-audio-and-video.md) |
| MAKEFILE 引用但 Git 没有的都是丢文件 | WIN95.LNK 等本来会生成；SDK 和特定外部库则是另一类缺口 | [01 构建](../chapters/01-repository-history-and-build.md) |
| WW_WIN/WINDOWS.CPP 一定是 OS 消息循环 | 此处是文本窗口打印系统；名字不能替代函数阅读 | [15 平台库](../chapters/15-platform-libraries-tools-and-porting.md) |

## 5. 遇到新疑点时如何记录

使用“条件—字面行为—调用者—可观察后果—验证方法”的格式。例如：在指定宏开启、输入满足某范围时，函数把某字段设为何值；上层是否采用该返回值；如果发生，玩家会观察到什么；如何用最小场景验证。这样记录的疑点可以继续研究，不会在二手传播中变成没有条件的游戏传说。
