# reara2 **Repository Path**: graviton/reara2 ## Basic Information - **Project Name**: reara2 - **Description**: reverse engineer red alert2 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-15 - **Last Updated**: 2026-11-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Red Alert 2 reconstruction research 本仓库以 `inputs/ra2install` 中的 Red Alert 2 样本为依据,用 Rust 重建资源读取、地图和部分游戏子系统。它不是 Westwood 原始源码,也不是完整可玩的 RA2。当前实现边界和待办见[当前实现状态](docs/current-status.md),研究方法和阶段验收见[逆向与实现计划](docs/reverse-engineering-plan.md)。 本机参考源码路径、提交和用途记录在被 Git 忽略的 `.local/environment.md`。换机器时先按 `docs/sample-inventory.md` 核对样本 SHA-256,再按 `AGENTS.md` 和 `docs/current-status.md` 重新建立工具与参考仓库记录;不要沿用旧工作站的绝对路径。 ## 快速验证 ```powershell cargo fmt --all -- --check cargo test --workspace cargo run -p ra2-game -- --headless --smoke-test cargo run -p ra2-game -- --map all01t.map --self-check --headless ``` 当前实现边界与最近验证见[当前状态](docs/current-status.md);地图和任务样本检查是本仓库重建程序的回归验证,不是零售版等价性证明。 ## 原生状态对照 ```powershell cargo run -p ra2-tools -- rocket-preflight 20 60 100 "4096,8192,0" 119 120 179 180 cargo run -p ra2-tools -- rocket-pitch 20 60 0 0.5 100 119 120 121 130 179 180 cargo run -p ra2-tools -- rocket-ascent 0.4 38 768 0 767 768 cargo run -p ra2-tools -- rocket-route 4096,8192,0 4099,8196,768 cargo run -p ra2-tools -- rocket-step 38 0 16383 4096,8192,768 16 cargo run -p ra2-tools -- rocket-facing 16383 0 100 60 4 130 cargo run -p ra2-tools -- rocket-facing-update 16383 0 100 60 4 130 0 cargo run -p ra2-tools -- rocket-target-facing 8192,12288,768 4096,8192,768 0 -1 0 0 4 200 cargo run -p ra2-tools -- rocket-target-pitch 8192,12288,-10000 4096,8192,768 0 0.05 cargo run -p ra2-tools -- rocket-state4-proximity 4096,8192,1000 4296,8192,900 cargo run -p ra2-tools -- rocket-detonation-gate inputs/ra2install DMisl 4096,8192,1000 4096,8192,1000 1 1000 sample 1 16383 cargo run -p ra2-tools -- rocket-lazy-curve 256 -0.5 24451 4096,8192,768 8192,12288,768 cargo run -p ra2-tools -- rocket-impact-gate 800 768 1 768 32 cargo run -p ra2-tools -- rocket-impact-gate 872 768 1 768 sample cargo run -p ra2-tools -- rocket-impact-position 256 0.7853981633974483 16383 4096,8192,768 cargo run -p ra2-tools -- rocket-impact-projection V3Rocket 256 200 400 0 0.7853981633974483 16383 4096,8192,768 cargo run -p ra2-tools -- rocket-impact-projection-rules inputs/ra2install V3Rocket 1 0.7853981633974483 16383 4096,8192,768 cargo run -p ra2-tools -- rocket-rules inputs/ra2install V3Rocket cargo run -p ra2-tools -- spawn-rules inputs/ra2install DRED cargo build -p ra2-tools uv run --extra research python -m reara2.rocket_probe inputs/ra2install/game.exe --rust-tools target/debug/ra2-tools.exe --output target/research/rocket-blast-entry-20261027.json --overwrite ``` 导弹预备阶段已实现构造、首次目标提交、Pause/Tilt 定时、状态 3 加速/高度门及状态 4 初始水平距离。Rust 现显式表示 State5;`process_state5_with_profile` 按数值门失败后的目标俯仰、位置 setter、格 getter 和 shared movement tail 顺序推进,`MapBattle::apply_rocket_state5_step` 再提供 Continue/Impact 到现有地图候选与 receiver 路径的显式边界适配。`RocketRuleProfile` 的严格规则读取结果可直接供应这些阶段;真实 locomotor 安装、完整爆炸副作用和 owner 生命周期仍未接入。 Python 工具执行已验证 SHA-256 的本地样本指令;上升阶段的 owner 类型与高度回调用 stub,路线初始化执行样本坐标 getter、开方与取整函数。 预备阶段 14 组/68 个快照、上升阶段 8 组/291 个快照、42 组路线案例及 46 组/708 个位移快照均与 Rust 一致。 Tilt pitch 已按本地帧时序建模并以 14 组原生案例逐位比对。位移使用显式 pitch 和稳定朝向,执行样本位置 setter;完整自主转向、命中/爆炸和场景导弹尚未接通。 方向重定向原语已按本地 `FUN_004b8a30` 实现;状态 4 的目标朝向计算、f32 截断、atan 查表量化和重定向调用也已接入,27 组多象限/比例边界与原生字段及方向采样一致。状态 4 回退接近门已按 `FUN_0063de90` 计算水平距离并与 owner/target 高度差比较;6 组 DMisl 原生重放与 Rust 一致,门通过时原版写入状态 5。Rust 对 V3/DMisl 都应用 `FUN_0063dcf0` 门;3 组 DMisl 原生重放覆盖默认失败、linked-target 容差通过及目标高度不匹配,成功案例执行至 `FUN_0063e7d0` 入口前停止。数值探针仍不执行 blast-entry 后的原版地图动画、owner cleanup、COM teardown 或完整 receiver 生命周期;MapBattle 适配只消费显式 Continue/Impact 结果。状态 5 俯仰目标和 TurnRate 限速已接入,4 组原生案例在 pitch 位模式 ±1 ULP 内一致;LazyCurve body-length 预测门也已接入,4 组预测 Z/分支通过。原生 atan 表字节尚未复制,目标 pitch 仍保留该限制。 `rocket_probe` 的 schema 19 报告还覆盖真实 400 桶初始化、候选桶遍历/pop、登记/移除/扩容复制、关联谓词和三轴候选距离 replay;Rust 的 `RocketReceiverCallSite` 只记录 `+0x158` ABI 参数与 opaque 对象 token,不执行 receiver。 证据和边界见[导弹发射专题](docs/rocket-launch-reconstruction.md)。 ## MIX 与场景检查 ```powershell cargo run -p ra2-tools -- mix-inspect inputs/ra2install/ra2.mix cargo run -p ra2-tools -- mix-inspect inputs/ra2install/ra2.mix local.mix rules.ini cargo run -p ra2-tools -- map-scenario inputs/ra2install/Maps02.mix ALL01t.MAP cargo run -p ra2-tools -- map-structures inputs/ra2install/Maps02.mix ALL01t.MAP --type CABHUT cargo run -p ra2-tools -- map-bridges inputs/ra2install/Multi.mix mp01t4.map --tiles cargo run -p ra2-tools -- path-tables cargo run -p ra2-tools -- csf-get inputs/ra2install/language.mix ra2.csf MISSION:ALL01l ``` `mix-inspect` 在内存中读取嵌套 MIX 和 INI,不导出资源;`csf-get` 从语言 MIX 查询一个本地化文本键。`map-scenario`、`map-structures` 和 `map-bridges` 是只读研究命令;命令输出只代表指定样本。 ## 地图与桥面探针 ```powershell cargo run -p ra2-game -- --map all01t.map --bridge-route 82,51 82,55 cargo run -p ra2-game -- --map all01t.map --native-route 55,18 62,20 cargo run -p ra2-game -- --map mp01t4.map --bridge-route 79,86 96,86 cargo run -p ra2-game -- --map all01t.map --passability-audit --headless ``` `--map` 打开真实地图预览;`--map-battle` 进入受限真实地图对战原型。当前移动使用有本地逆向证据支持的八邻接、对象占用、桥面层、特殊连接、坡度系数(`height_scale=104`)和 lepton 步进;工具链与真实地图战斗均支持按 owner 环境进行中途满格重规划。桥梁特殊边失效时,原型会等待连接恢复;已删除的 Tube 边会取消订单。局部让行仲裁、多级坡道完整语义、场景房屋驱动的完整开局和全部剧场仍未闭合。详见[地图格与移动](docs/map-grid-and-movement.md)、[地形渲染](docs/terrain-rendering.md)和[桥梁修复](docs/bridge-repair-reconstruction.md)。 ## 对战原型 ```powershell cargo run -p ra2-game -- --map mp01t4.map --map-battle --headless --smoke-test cargo run -p ra2-game -- --map mp01t4.map --map-battle --unit ORCA --enemy-unit HTNK --advance-ticks 200 --headless cargo run -p ra2-game -- --map mp01t4.map --map-battle --players 8 --teams 4 --units 1 --advance-ticks 2000 --headless cargo run -p ra2-game -- --map ALL01t.map --map-battle --units 1 --harvest --advance-ticks 3200 --headless cargo run -p ra2-game -- --map ALL01t.map --map-battle --units 1 --harvest --harvest-count 3 --advance-ticks 3000 --headless cargo run -p ra2-game -- --map ALL01t.map --scenario-preview --headless --snapshot preview.bmp cargo run -p ra2-tools -- trigger-plan inputs/ra2install/Maps01.mix ALL01t.MAP 120 cargo run -p ra2-tools -- script-plan inputs/ra2install/Maps01.mix ALL01t.MAP cargo run -p ra2-tools -- campaign-census inputs/ra2install cargo run -p ra2-game -- --map ALL01t.map --mission-log 120 --headless cargo run -p ra2-game -- --map ALL01t.map --team-spawn 0A67F6CC --headless cargo run -p ra2-game -- --map ALL01t.map --mission-run 10 --headless cargo run -p ra2-game -- --map ALL01t.map --map-battle --team-battle 0A67F6CC --advance-ticks 3000 --headless cargo run -p ra2-game -- --map ALL01t.map --mission-battle 120 --headless cargo run -p ra2-game -- --map ALL01t.map --mission-window cargo run -p ra2-game -- --map ALL01t.map --mission-window --headless --advance-ticks 1 cargo run -p ra2-game -- --map ALL01t.map --map-battle --units 1 --harvest --harvest-produce --harvest-load-ticks 80 --advance-ticks 12000 --headless cargo run -p ra2-game -- --map ALL01t.map --map-battle --units 1 --harvest --harvest-produce-unit E1 --harvest-load-ticks 80 --harvest-rally 74,45 --advance-ticks 12000 --headless cargo run -p ra2-game -- --map ALL01t.map --map-battle --units 1 --harvest --harvest-threat --advance-ticks 600 --headless cargo run -p ra2-game -- --map ALL01t.map --harvest-demo 52,35 --harvest-trips 5 --base-ai-demo --base-credits 0 --headless cargo run -p ra2-game -- --map ALL01t.map --harvest-demo 52,35 --harvest-trips 2 --base-ai-demo --base-order GAPOWR,GAPILE,E1 --build-first --map-battle --advance-ticks 300 --headless cargo run -p ra2-game -- --headless --smoke-test --snapshot target/skirmish.bmp cargo run -p ra2-game -- ``` 程序提供菜单、遭遇战设置、战役目录、生成地图对战和真实地图对战原型。`--mission-battle N` 在 N×30 个本地 tick 中串联部分触发器、团队脚本和战斗;`--mission-window` 可在真实地图窗口推进有限任务,响应 Action 46/47 输入锁定、解析 Action 11 的 CSF 文本键,并对已登记 Tag 对象投影 Action 14 转 House。其余生产、对象生命周期、完整任务/脚本、存档、音视频和联网仍有较大缺口;具体支持范围、样本结果与限制见[当前状态](docs/current-status.md)、[运行原型](docs/runnable-prototype.md)及[UI 与对战专题](docs/ui-battle-reconstruction.md)。 ## 资源与证据 - [当前实现状态](docs/current-status.md):能力、验证基线、缺口和专题索引。 - [逆向与实现计划](docs/reverse-engineering-plan.md):证据规则、阶段依赖和验收条件。 - [样本清单](docs/sample-inventory.md):目标样本身份和 SHA-256。 - [MIX 分析](docs/mix-analysis.md) / [上游交叉验证](docs/upstream-mix-research.md)。 - [战斗规则](docs/combat-rules-reconstruction.md) / [单位表现](docs/unit-presentation-reconstruction.md)。 - [战役触发器](docs/mission-trigger-reconstruction.md)。 - [开源工具调研与本地工具](docs/research-tooling.md):现有参考仓库、可选逆向工具和 campaign-census 的适用边界。 音频资源研究:Rust 格式层已支持 `audio.idx` v2 元数据读取与 BAG 范围校验,`ra2-tools mix-inspect inputs/ra2install/language.mix audio.mix audio.idx` 可只读验证实际索引。资源层 `AudioBank` 可按 ASCII 大小写不敏感名称借用压缩载荷,IDX/BAG 须来自同一选中挂载层。保留文件顺序和原始字段。`audio-block ` 可研究性解码完整 512 字节单声道块并输出 PCM 整数;已在两段实际音效的 94 个完整块上与原生回放逐字节对照;另有显式 `audio-tail ` 研究入口复现已观察的工作区尾部保留,并报告有效前缀样本数;资源层提供 `mono_chunks_retaining_tail` 惰性逐块消费及 `AudioPcmReader` 小缓冲读取;不包含设备播放或完整运行时调度。 `ra2-tools sound-profile ` 可审计 sound.ini 显式字段及其 BAG 样本连接,并分别标注 Volume/Limit/Control 来自事件或 Defaults;其他缺省键单独报告,尚未接入播放调度。 `unit-sound-profile ` 从显式 AuxSound1 追踪到声音事件和样本;未声明字段与无效引用分别报告,不推断实际触发时机。 `sound-delay [clock ...]` 审计原始音频时钟下的延时阈值与严格到期判断,不换算为对战 tick。 `sound-read ` 可审计显式单次请求,输出计数和 FNV 内容指纹,不导出 PCM 或播放声音。 任务窗口已接入一段受限设备音频路径:Action 21 从 `eva.ini` 解析字幕/阵营别名,按已载入地图预解码其引用的单声道 IMA ADPCM WAV,并在默认音频设备可用时通过 rodio 的独立 EVA 轨播放;Action 19 仅播放单样本、零延迟且没有随机 Control/音量频移的 SFX。ALL01t 的 `ma1ev10.wav` 与 `MessageText → umessage` 已实测解码。其它声音事件、SFX 随机/限流/空间增益、设备故障与原版队列策略仍未重建。 `random-audit ` 输出本地样本随机状态与确定性审计序列;Rust 实现已与六种子原生回放核对,未替换现有对战随机策略。