当前版本:v1.1.0。这是基于 svr2kos2/IronNestFCS 的 MIT 许可下游增强版,由
electron56维护。它保留原程序集与配置路径,安装时会替换上游版本,请勿同时安装两者。
Iron Nest: Heavy Turret Simulator 的 MelonLoader Mod,为游戏中的重型炮塔加入一套自动化火控系统(Fire Control System, FCS):在地图上点选目标,Mod 会自动解算弹道、采购/装填炮弹、调整炮塔方向与仰角,并完成确认与击发的全套流程。
以游戏正式版为主要支持目标,使用 IL2CPP + MelonLoader,并保留 Demo 的兼容绑定。
| 项目 | 支持范围 |
|---|---|
| 增强版 | v1.1.0 |
| 游戏 | Steam 正式版(App ID 2950790);Demo 绑定为尽力兼容 |
| Mod 加载器 | MelonLoader 的 .NET 6 / IL2CPP 环境 |
| 安装关系 | 替换原版 IronNestFCS,不支持并装 |
| CustomRecords | 可选组件,版本 v1.0.2 |
- 便捷选弹:把炮兵标记放到地图有效区域后弹出带圆形弹种徽记的选弹轮盘;内圈为 AP / HE / HCHE / STAR,外圈为其余弹种,中心用于取消任务。轮盘左右各有一列与轮盘等高、沿外环圆弧连续衔接的全尺寸交互翼板:左侧为最大装药与高优先级,右侧为双炮齐射与预期落弹时刻;中文标题与状态使用放大的 TextMeshPro 原生字号,点击定时区域后会在该区域内原位完成时间编辑。尚未随游戏流程解锁的弹药会在轮盘与 Quick Bind 下拉中灰显且无法选择。20 枚徽记是随 Mod 嵌入的独立原创资源,仅保留易辨识的圆形图形;若资源加载失败则回退到游戏运行时图标,再不满足时保留纯文字选项。
- 快速装订:可在地图右侧面板设置预置诸元,包括弹种、齐射、最大装药及队首/队尾;开启后用红笔在地图上点击即可直接入队,红色标线不会触发,任务完成后自动删除该红点。
- 双炮管任务调度:左右炮拥有独立的装弹、装药、仰角与射后复位管线;一炮等待定时击发或弹丸飞行时,另一炮仍可继续准备后续任务。等待中的定时单发会在实际派发时迁移到最早空闲的炮管。
- 自动弹道解算:读取目标的方向角与距离,自动设定装药、弹种并解算所需仰角。
- 完整弹种支持:支持正式版全部 20 种弹药;弹仓缺弹时自动到采购台购买。
- 自动击发(可选):通过面板上的
Auto Fire开关切换是手动还是自动完成最后的击发动作。 - 双炮齐射(可选):罗盘中开启
Salvo后,同一目标只解算并打印一张火力卡,由左右炮各发射一发;两炮完成准备后共同待发,并遵循Auto Fire的手动/自动设置。 - 高优先级与定时落弹(可选):高优先级任务调整等待顺序但不会抢占确认或击发。开启
Auto Fire后,可输入游戏任务时钟上的绝对落弹时刻;系统以 15 秒保守余量和双炮并行可用时间校验期限,并在“最晚准备点减去一次最小完整射击周期”时提前保留炮管。发射药装填完成、射击流程进入不可逆阶段后立即向独立方位调度器提交请求,使方位转动与后续闭锁等待及仰角动作重叠;只有本炮(齐射时为两炮)闭锁且仰角到位后才允许进入不可抢占的确认阶段。远期定时任务不挡普通任务,进入击发点前 45 秒保护窗口后按最早期限优先,可抢占尚在纯转向阶段的低优先级方向。炮弹出膛即释放方位,不等待落弹或本炮复位。 - 自动整理(可选):任务完成后自动回收标记;标记归位及火力卡移至打击点时会沿抛物线平滑飞行。右侧面板可选择把对应火力卡标为
COMPLETED后移到打击点、保持原位不处理,或直接删除。开关与火力卡处理模式都会持久化。 - 地图队列面板:地图右侧实时显示左右炮的当前任务、等待队列、目标参数和进度;等待任务的地图标记变为深灰色、编号文字变为白色并锁定拖动,调度后改为带发光效果的琥珀色脉冲;光标悬停等待任务时显示高亮轮廓,右键可直接取消,正在执行的当前任务保持只读;开启自动整理时,取消任务的标记也会自动回收。
- 热重载开发:火控逻辑独立成可卸载的程序集,开发时改完代码按 F9 即可在不重启游戏的情况下重新加载。
- 自定义唱片机(附带的独立 Mod):把
UserData/CustomRecords/下的音频文件(.mp3/.wav/.flac,封面取同名图片或内嵌封面)自动克隆成场景内的 RecordDisk,换上合成封面与音轨。
工程拆分为四个程序集,核心是为热重载服务的宿主 / 逻辑分离设计:
| 项目 | 角色 | 说明 |
|---|---|---|
IronNestFCS |
宿主 Mod | 稳定加载、永不重载。负责首次加载 Logic、监听 F9 触发热重载、转发生命周期回调。 |
IronNestFCS.Abstractions |
契约 | 仅含 IFcsModule 接口。只加载一份,是唯一能安全跨 AssemblyLoadContext 边界传递的类型。 |
IronNestFCS.Logic |
火控逻辑 | 所有高频改动的火控代码:弹道解算、任务调度、炮塔/炮管操控、UI。被装进可回收的 ALC,按 F9 卸载并重载。 |
IronNestFCS.CustomRecords |
独立 Mod | 与火控无关的场景装饰,扫描 UserData/CustomRecords/ 下的音频文件,为每个文件克隆一张 RecordDisk 并替换音轨与封面。 |
热重载的关键点:Logic 程序集从内存字节加载(不锁住磁盘 dll),装进 isCollectible 的 AssemblyLoadContext;重载时先 Shutdown(撤销 Harmony 补丁、停止协程、清空 IL2CPP 引用)再卸载旧 ALC,最后从磁盘重新加载新版本。详见 LogicReloader.cs 与 FSC.cs 中的注释。
- 安装适用于游戏正式版的 MelonLoader。
- 删除或备份旧版
Mods/IronNestFCS.dll、UserLibs/IronNestFCS.Abstractions.dll和UserData/IronNestFCS/IronNestFCS.Logic.dll。 - 将
IronNestFCS-Enhanced-v1.1.0.zip直接解压到游戏根目录,保持Mods、UserLibs和UserData目录结构。 - 如需自定义唱片功能,再将
IronNestFCS-CustomRecords-v1.0.2.zip解压到游戏根目录。 - 首次启动后检查 MelonLoader 日志中是否出现
IronNestFCS Enhanced v1.1.0,并在包含地图桌和炮塔的场景完成一次手动试射。
发布包由 scripts/New-ReleasePackage.ps1 生成,并随附 SHA256SUMS.txt。完整变更见 CHANGELOG.md,来源与素材说明见 NOTICE.md。
- 已安装 .NET 6 SDK(见 global.json)。
- 游戏本体,并已为其安装 MelonLoader(IL2CPP)。
构建会按以下优先级解析游戏目录:MSBuild 的 GameDir 参数、环境变量 IRON_NEST_GAME_DIR、标准 Steam 正式版安装路径。
dotnet build IronNestFCS.sln -c Release /p:GameDir="你的路径\Iron Nest Heavy Turret Simulator"dotnet build IronNestFCS.sln -c Release各程序集的输出位置:
- 宿主 Mod(
IronNestFCS.dll):放入游戏的Mods/目录,由 MelonLoader 自动加载。 - 火控逻辑(
IronNestFCS.Logic.dll):输出到UserData/IronNestFCS/(不放进Mods/,由宿主在运行时反射加载)。 - 契约(
IronNestFCS.Abstractions.dll):放入UserLibs/,确保宿主与逻辑共用同一份接口。 - 自定义唱片机(
IronNestFCS.CustomRecords.dll):放入Mods/。把音频文件(.mp3/.wav/.flac)放入游戏的UserData/CustomRecords/目录,封面两种方式任选:① 同名图片文件(song.mp3配song.png/.jpg/.jpeg,音频与图片分开存放);② 音频文件内嵌封面(TagLib 标签)。进场景后自动为每个文件克隆一张 RecordDisk;两种封面都没有的文件会被跳过。目录不存在时首次运行会自动创建,无需手工准备素材。构建时依赖(CSCore、TagLibSharp)会自动拷贝到UserLibs/(不能留在Mods/,否则会被 MelonLoader 误当作 Mod 加载)。
IronNestFCS.Logic.csproj默认已把OutputPath指向$(GameDir)\UserData\IronNestFCS\,构建即就位,改完代码进游戏按 F9 即可生效。
- 启动已安装 MelonLoader 与本 Mod 的游戏。
- 进入包含炮塔与地图桌的关卡场景。若火控面板提示
Dial 未绑定,按 F9 在当前场景重新绑定。 - 按需切换地图右侧的
Auto Fire与Auto Clean。 - 常规瞄准:拖动炮兵红色标记到地图有效区域,松开后在双层罗盘中设置两侧的最大装药、齐射和高优先级选项,再选择已解锁弹种;灰色弹种尚未解锁且无法选择,点中心
CANCEL不会创建任务。 - 定时落弹:先开启
Auto Fire,点击轮盘右下整块“预期落弹时间”区域;该区域会原位切换为编辑器。使用靠近轮盘侧排列的 H/M/S 加减按钮或键盘输入六位HHMMSS后按 Enter,Escape 放弃草稿,清除键立即取消定时。早于最早可行时刻的输入会以高对比警告条拒绝;轮盘打开期间记录板按钮和可拖动物件会暂停交互,关闭后恢复;有定时任务时Auto Fire会锁定为开启。 - 快速装订:先在右侧“红笔点预设”中从弹种下拉菜单选择已解锁弹药,并设置齐射、最大装药和队首/队尾,再开启
Quick Bind,用红笔在地图上单击标点即可直接入队。未解锁选项会灰显;若旧预设已锁定,Mod 会自动改用首个已解锁弹种。拖动形成的红色标线会被忽略;任务完成后对应红点自动删除。 - 预设参数会跨场景和重启保存,
Quick Bind开关每次进入场景或热重载后恢复关闭。 - 任务会自动分配到负载较低的左/右炮队列,并完成解算、采购、装填、瞄准与确认;等待任务对应的普通标记和快速装订红点显示为深灰色,普通标记的编号文字显示为白色,并在等待和执行期间均不可拖动;任务调度后标记改为带发光效果的琥珀色脉冲。地图右侧面板实时显示两管炮的任务进度与等待队列;将光标移到等待任务上会显示高亮轮廓,右键可直接取消该任务;齐射任务会同时从左右队列移除,当前执行任务不可取消。开启
Auto Clean后,取消任务对应的普通标记也会自动回收到记录板。
修改 IronNestFCS.Logic 内的代码后,重新构建该项目(dll 会直接输出到游戏的 UserData/IronNestFCS/),切回游戏按 F9 即可加载新逻辑,无需重启游戏。
Debug 配置还会在首次成功绑定采购台后,把当前已加载的游戏弹药卡图标和统一调试图卡导出到 UserData/IronNestFCS/Debug/AmmoAssets/,并生成缺失项清单,供本机视觉核对。该导出器受 IRONNESTFCS_DEBUG_ASSET_EXPORT 条件编译保护;Release DLL 只包含轮盘所需的 Mod 原创圆形徽记及其内存加载逻辑,不包含调试导出入口、PNG 编码或写盘逻辑,也不会读取本地调试图片。
欢迎提交 Issue 和 Pull Request。
- 发现 Bug、有功能建议或疑问,请提交 Issue。
- 改进代码请提交 Pull Request。改动火控逻辑时请留意
FSC.cs中关于热重载与协程的约定(不要在 Logic 中注册新的 IL2CPP 类型、协程必须登记以便卸载时停止、跨 ALC 只能传递IFcsModule)。
本项目为非官方的第三方 Mod,与游戏开发商无关。仅供学习与单机娱乐使用,使用风险自负。