petejm/NuclearesCommandDoc

GitHub: petejm/NuclearesCommandDoc

为核电站模拟游戏 Nucleares 的本地 Web API 提供完整的可写变量映射和协议文档,填补官方文档为空的空白。

Stars: 0 | Forks: 0

# NuclearesCommandDoc [Nucleares](https://store.steampowered.com/app/1585670/Nucleares/) 可写 Web API 的完整映射。 已针对游戏构建版本 **V 2.2.25.220** 进行验证。 游戏的官方文档仓库提供了一个大小为 0 字节的 `settable.md`。 本仓库填补了这一空白:包含所有 91 个可写变量、它们的 payload 类型、 在已知情况下的接受值,并对所有未知内容使用了明确的诚实性标记。 ## 重点:游戏发布了其自身的清单 你无需去探测可写变量。直接询问游戏即可: ``` GET http://localhost:8785/?Variable=WEBSERVER_LIST_VARIABLES_JSON → {"GET":[...332 names...],"POST":[...91 names...]} ``` 一次调用即可返回*哪些内容*可写的真实基准。原始抓取数据位于 [`data/manifest.json`](data/manifest.json)。 该调用**不会**告诉你接受值、payload 类型或 valve 寻址间接方式。这些 需要对七个社区客户端代码库进行交叉引用,并结合运行中的游戏进行实测。 这就是本仓库其余部分的内容。 ## 目录 | 文档 | 涵盖内容 | |---|---| | [docs/writable-variables.md](docs/writable-variables.md) | 全部 91 个 POST 变量,按子系统分组,包含 payload、回读双生子及证据 | | [docs/valves.md](docs/valves.md) | valve 元命令间接寻址,以及全部 55 个 valve 标识符 | | [docs/wire-format.md](docs/wire-format.md) | 协议陷阱:HTTP 411、HTTP 200 的五种含义、enum 大小写、locale 陷阱 | | [docs/emergency-controls.md](docs/emergency-controls.md) | 10 个从未有客户端写入过的紧急变量的实测结果 | | [docs/fun-family.md](docs/fun-family.md) | 15 个 `FUN_*` 事件触发器,以及为什么它们需要严格的 blocklist | | [docs/unexplored.md](docs/unexplored.md) | 什么是只读的、没有客户端触及的内容,以及未知领域在哪里 | | [docs/diagnostics-endpoint.md](docs/diagnostics-endpoint.md) | `AO_AGENT_DIAGNOSTICS_JSON`,一个没有任何客户端读取的、预计算的 10 KB 电站模型 | | [docs/plant-mechanics.md](docs/plant-mechanics.md) | 导致遥测数据容易被误读的模拟行为:磨损 vs 完整性、稳压器水位、未安装的设备 | | [docs/scraping.md](docs/scraping.md) | **如何自己重新生成这里的每一个表格**,以及导致困难的重重陷阱 | 原始抓取数据位于 [`data/`](data/)。 ## 即使你跳过其他内容,也值得阅读的五大发现 **1. Valve 不是通过名称寻址的。** 确切地只有三个 valve 的 POST endpoint(`VALVE_OPEN`、`VALVE_CLOSE`、`VALVE_OFF`),而你 POST 的*值* 就是目标 valve 的标识符,例如带有 body 为 `value=VALVULA_ENTRADA_NUCLEO_01` 的 `VALVE_OPEN`。这 55 个标识符是西班牙语的 工程名称,它们仅作为 key 存在于 `VALVE_PANEL_JSON` 内部,并且 它们从未作为顶层的 `?Variable=` 名称出现过。将它们作为变量名进行探测 什么也找不到。详见 [docs/valves.md](docs/valves.md)。 **2. HTTP 200 不能证明任何事情。** 在此 API 上它有五种截然不同的含义, 在状态行上无法区分它们。每次写入后都要进行回读。详见 [docs/wire-format.md](docs/wire-format.md)。 **3. 91 个可写变量中有 56 个无法通过名称回读。** 对这些 确切名称进行 GET 会返回 `The readable variable 'X' does not exist.` 回读存在于一个*不同*的名称下:你写入 `MSCV_0_OPENING_ORDERED` 并 读取 `MSCV_0_OPENING_ACTUAL`。结合发现 2,这是编写正确客户端的决定性 约束,完整的映射位于 [docs/writable-variables.md](docs/writable-variables.md) 中的 Read-back 列。已通过 对全部 91 个名称单独进行 GET 探测验证:35 个可读,56 个只写,与清单 零偏差。 **4. 一个未读取的 endpoint 返回了整个电站,并且已经被解析过。** `AO_AGENT_DIAGNOSTICS_JSON` 在单次调用中提供大约 10 KB 的派生状态: 已评估的布尔安全值、游戏自带的压力损失因果规则 (包括量化的“完整性低于 70% 时持续泄漏”),以及 指明每项物品受损*原因*的逐组件损坏日志。它在未安装 AO DLC 的情况下也能工作。详见 [docs/diagnostics-endpoint.md](docs/diagnostics-endpoint.md)。 **5. 有两条可用的停堆路径,但没有可用的重置方法。** `CORE_SCRAM_BUTTON` 和 `CORE_EMERGENCY_STOP` 均可停堆反应堆。 `CORE_END_EMERGENCY_STOP` 返回 HTTP 200 且毫无作用。任何自动化 该电站的系统都能获得可靠的终止机制,但没有程序化的恢复手段,因此 停堆必须被视为终结状态,并交还给人工处理。详见 [docs/emergency-controls.md](docs/emergency-controls.md)。 ## 声明是如何标记的 本仓库中的每一个声明都带有证据标签。重点在于你能够 一眼区分测量结果与推论,并且没有任何声明的肯定程度 超过其证据所能支撑的范围。 | 标签 | 含义 | |---|---| | `live-manifest` | 从游戏自身的 `WEBSERVER_LIST_VARIABLES_JSON` endpoint 针对运行中的游戏拉取 | | `live-probe` | 针对运行中的游戏通过直接请求验证,并附带回读 | | `repo:file:line` | 引用自社区客户端的源码,位于该确切位置 | | `inferred` | 根据相邻事实推断,非直接证据。已显式标记,绝不作为事实断言 | 当社区客户端证据与清单冲突时,**清单 优先**,冲突会被记录在案,而不是被默默解决。 返回结果模棱两可的发现会按原样(模棱两可地)发布。请参阅 [docs/emergency-controls.md](docs/emergency-controls.md) 中的“Unattributed”部分以及同一 文档中披露的方法局限性。 ## 安全 在写入任何内容之前,请先阅读 [docs/fun-family.md](docs/fun-family.md)。 这 15 个 `FUN_*` 变量是触发器写入:写入的行为*就是* 动作本身。这使得常见的“写回当前值”的 no-op 安全模式对它们 无效,因为没有当前值可供恢复。不要将它们包含在 通用的可写性扫描中。 ## 贡献 非常欢迎纠正,特别是针对任何标记为 `manifest-only` 或 `inferred` 的内容的实测结果。有关 证据标准,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 许可证 [CC BY 4.0](LICENSE)。使用它、fork 它、将它向上游合并。署名可以保持 测量结果来源的可追溯性。
标签:API文档, Homebrew安装, HTTP API, Python脚本, Web API, 协议分析, 权限提升, 核电模拟, 游戏, 防御加固