本附录不是已复现 bug 清单。它集中记录名字、旧注释、现代习惯与当前函数体之间的区别,帮助读者避免把错误前提带入后续分析。
1. 运行时和对象
| 容易形成的印象 |
源码支持的准确理解 |
证据 |
| 每帧先处理所有命令再模拟 |
常规主循环的 Logic.AI 先于 Queue_AI;等待阶段还会处理输入和显示 |
Main_Loop |
| Assign_Mission 立即换当前任务 |
先写 MissionQueue;Commence 再切换 Mission |
任务切换 |
| 所有移动工作都等下一帧开始 |
Assign_Destination 可立即调用 Start_Of_Move 做准备 |
目的地赋值 |
| 新建对象就已出现在战场 |
对象初始 Limbo,入场要维护占位、显示层和逻辑集合 |
入场 |
| Limbo 就是 delete |
它撤出世界和跟踪关系,内存生命周期还需另看 |
离场 |
| Radio 是语音或网络 |
它直接调用对象的 Receive_Message,是协作协议 |
Radio 发送 |
| fixed 是浮点或16.16 |
此实现是无符号8.8布局,不同运算的取整也不同 |
布局 |
2. 地图、AI 和配置
| 容易形成的印象 |
准确理解 |
证据或章节 |
| 寻路必然是 A* |
这里是直线路径、沿两侧障碍边缘搜索与后续平滑,不提供全局最短路径保证 |
04 寻路 |
| In_Radar 表示在雷达视野里 |
实际判断可玩地图矩形范围 |
In_Radar |
| IsMapped/IsVisible 就是现代 explored/current LOS |
它们有本地遮蔽和边缘显示语义,不应直接移植现代双层迷雾概念 |
04 视野 |
| 每个 AI_* 名字都实现了对应智能行为 |
Expert_AI 中一些建造处理是空壳,实际建造选择在其他函数 |
09 战略AI |
| Team 是玩家 Ctrl 编队 |
AI Team 还有模板、招募和脚本任务,快捷选择编组另有实现 |
09 队伍 |
| 新写一个 INI 段落就能新增任意类型 |
车辆、武器、弹头都有已有注册集合 |
固定武器清单 |
| 所有配置项都继承旧值 |
多数如此,但难度和 Verses 等字段有自己的缺省策略 |
05 缺省值 |
| 地图规则在所有模式下最后生效 |
外层还可能应用 MPLAYER.INI |
附加多人规则 |
| 触发器 AND 代表先后执行 |
锁存条件和当前条件不同;Elapsed 计时开始点也需看 Reset |
10 条件组合 |
| 增援返回 true 证明全部成员抵达 |
普通结尾返回值不逐一证明所有成员 Unlimbo 成功 |
增援结束路径 |
3. 战斗和生产
| 容易形成的印象 |
准确理解 |
证据或章节 |
| AI 总选 DPS 最高的武器 |
主副武器选择并未完整计算伤害除射速 |
武器选择 |
| Burst=n 就是通用 n 连发 |
通用路径可见的是双发判定与交替状态,不能按字段名扩展含义 |
双发条件 |
| 所有爆炸都扫描大圆内全部对象 |
普通爆炸先查九格和有界候选,再检查距离;空中命中另有路径 |
普通爆炸 |
| forced 必然穿透一切保护 |
派生层仍可能先拦截,铁幕就是需要跟完整调用链的例子 |
铁幕检查 |
| Wide_Area_Damage 注释可直接当衰减公式 |
当前字面表达式与直觉衰减不同,还叠加多个局部爆炸;实际分布待运行验证 |
大范围函数、06 解释 |
| 致命攻击按旧注释总留一滴血 |
当前基础扣血实现可真正降到零并处理击杀 |
扣血函数体 |
| 生产只是一段倒计时 |
阶段推进与逐步付款耦合,缺钱时回退阶段 |
工厂AI |
| Building 卸矿函数就是矿车实际结算链 |
应沿 Unit::Mission_Unload 的现存调用,不能只按旧函数名判断 |
07 卸矿 |
| 出售、死亡与储量变化可仅看一个布尔参数 |
调用者选择的参数决定实际分支,不能把未使用分支当普遍行为 |
07 容量与出售 |
4. 同步、存档和底层库
| 容易形成的印象 |
准确理解 |
证据或章节 |
| 校验 CRC 完全不改变模拟 |
Compute_Game_CRC 中的随机对象整数转换会取随机数 |
CRC 调用、转换运算符 |
| 录像只保存命令 |
还记录视口、选择等本地状态,且有布局/版本约束 |
13 录像 |
| 有录像代码就代表所有模式回放已可靠 |
单机/多人/回放路径需分别检查,本次未运行确认 |
13 验证边界 |
| 连接层注释说不保序就完全不保序 |
当前 DATA_ACK 交付按序,NOACK 行为不同 |
Get_Packet |
| Host 就是计算全部战斗的权威服务器 |
主机承担时间/会话协调不能推出权威战斗服务器架构 |
13 协议 |
| 存档是自包含、跨平台的数据协议 |
大量原始对象布局、池槽与类型恢复依赖编译环境,也依赖外部规则 |
14 存档 |
| SAVEGAME_VERSION 是完整 schema 版本 |
当前为若干 sizeof 的组合及分支修正,不能覆盖所有布局变化 |
14 版本 |
| 写存档不碰运行中的世界 |
编码指针会临时改写部分对象内引用,之后再解码 |
14 编码流程 |
| 所有 LCW 解码器的边界行为相同 |
多份 C++/汇编实现和编译归属不同;部分汇编使用 length 裁剪输出 |
12 LCW |
| 计算了 pan 就证明 Win32 已实现左右声像 |
上层传递和底层使用要分别检查 |
12 音频 |
| MAKEFILE 引用但 Git 没有的都是丢文件 |
WIN95.LNK 等本来会生成;SDK 和特定外部库则是另一类缺口 |
01 构建 |
| WW_WIN/WINDOWS.CPP 一定是 OS 消息循环 |
此处是文本窗口打印系统;名字不能替代函数阅读 |
15 平台库 |
5. 遇到新疑点时如何记录
使用“条件—字面行为—调用者—可观察后果—验证方法”的格式。例如:在指定宏开启、输入满足某范围时,函数把某字段设为何值;上层是否采用该返回值;如果发生,玩家会观察到什么;如何用最小场景验证。这样记录的疑点可以继续研究,不会在二手传播中变成没有条件的游戏传说。