Spherewright开发日志

0x00 赛博具身智能——给伊卡洛斯接上AI,让他自己造戴森球

记录 Spherewright 的开发过程:让智能体通过 MCP 接口观察游戏状态、操作伊卡洛斯,在遵守正常游戏机制的前提下游玩《戴森球计划》。


Spherewright 现在的做法,是让一个 AI Agent 通过 MCP 操作伊卡洛斯。Agent 能读到位置、能量、背包和附近的设备,也能下达移动、采矿、建造和生产指令。它不能通过编辑存档文件改变资源和进度,也不能凭空往背包里塞东西。严格说,这不是现实里带摄像头和机械臂的机器人,身体和环境都是虚拟的。不过伊卡洛斯会被建筑卡住,会因为没电走不动,也得亲自飞去另一颗星球。蹭一下现在最火的赛道,叫它“赛博具身智能”应该不过分。

怎么接入使用

使用信息更新于 2026 年 9 月 6 日,对应已发布的 v0.3.3。

Mod 可以从 Thunderstore 的 Spherewright 页面 获取;完整的 Windows 发布包也可以从 GitHub Releases 下载。发布包里已经带了游戏内 Plugin、独立 MCP Server、安装脚本和接入说明,不需要拉源码,也不用自己安装 .NET SDK。

安装后默认只能读取状态。让 Agent 操作游戏需要启用 Safety.AllowWrites;接手玩家手动载入的旧档,还需要启用 Safety.AllowUserSaveImport,并在预检后的对话里单独确认另存副本。原档保持不变,具体步骤见 v0.3.3 使用说明

这个项目还在边玩边改,发布包会跟着已经跑通并验证过的功能及时更新。安装、升级、卸载和回滚说明会一起放在 Release 页面和压缩包里。

想先看看不同 Agent 实际接入后的表现,可以读仓库里的 Sol Max 与 Luna Max 黑盒验收对比

最后想做成什么

眼下最直接的目标,是让 Agent 从一个刚创建的新档开始,自己采矿、研究科技、铺生产线、跨星球运输,最后造出一个完整的戴森球。中间不换准备好的存档,也不需要人临时进去补材料或者收拾残局。

现在负责思考和推进游戏的还是外部 Agent,Spherewright 主要负责把游戏状态和操作能力接出来。等从开档到戴森球这条流程能够稳定跑通以后,我想再做一个自己的 Agent 应用,把现在分散在对话、工具返回和日志里的东西放到同一个界面里。

它大概会像一个操作台:中间是游戏画面,周围是资源和产线数据、整局进度、当前目标、刚刚执行的行为,以及遇到的阻塞和恢复状态。最好只打开这一个应用,就能同时看到伊卡洛斯正在做什么、Agent 为什么这么做,以及它下一步准备去哪里。

再往后,也许可以直接把游戏嵌进这个界面里,最后形成一个完整的 Agent 游戏客户端。

先定几条规则

目前的规则是:不通过编辑存档文件改变世界状态,不注入物品和科技,不瞬间完成建筑,也不加速游戏时间。保存和另存副本都走游戏正常的保存流程。如果 Agent 缺一台电弧熔炉,它得先把材料准备出来,不能让接口直接生成一台。

长期开发用的这局固定为单人、和平、非沙盒、资源倍率 1×,新建世界也沿用这套默认设置。早期接口曾把沙盒状态和倍率一起当成接手条件;从 v0.3.3 起,已有和平存档可以使用不同设置,Spherewright 会如实报告这些信息。确认和平模式仍是接手和写入的必要条件,存档归属、写入开关和每次操作的计划检查也都保留。提供的操作仍然遵守正常游戏机制。

Spherewright 在游戏内只依赖 BepInEx 5,不依赖 CommonAPI、LDBTool、DSPModSave 等功能 Mod。游戏外的 MCP Server 使用 .NET 8,正式发布包会把运行时一起带上。除了多出一组受控接口,实际玩的仍然是原版内容。

主要操作也不走截图识别和键鼠宏,MCP 返回的是结构化状态,比如坐标、能量、背包、矿脉、设备连接和科技进度。

状态可以直接读,动作还是要按游戏的规则来。移动是真的在地面上走,建筑会消耗背包里的物品,之后还要等建设无人机把它建好。

怎么控制伊卡洛斯

模型没有放进游戏进程。游戏里装一个 BepInEx Plugin,Agent 和 MCP Server 跑在游戏外面。

MCP Host / 外部 Agent

          │ stdio / MCP

Spherewright.Mcp                     .NET 8
把游戏能力整理成 MCP tools

          │ 当前用户可访问的 Named Pipe

Spherewright.Plugin                  BepInEx 5 / .NET Framework 4.7.2
读取游戏状态,调度和执行动作

          │ DSP 主线程调用

Dyson Sphere Program

Spherewright.Contracts              两端共用的数据和协议
Spherewright.Bridge.Core            认证、快照、计划和幂等逻辑

Plugin 负责读取游戏状态和执行动作。游戏对象只留在 DSP 进程里,而且只能从主线程访问,后台通信线程不会直接碰它们。

MCP Server 负责把 Agent 的工具调用转换成 Bridge 请求,再把返回结果整理好。它不直接读游戏内存。Spherewright.Contracts 放两边共用的数据结构,Spherewright.Bridge.Core 放认证、快照、计划和幂等这些不依赖游戏的逻辑。

游戏内外通过本机 Named Pipe 通信。Pipe 和启动凭据只允许当前 Windows 用户访问,Plugin 每次启动都会换一份凭据。这个接口能控制正在运行的游戏,所以即使不出本机,也不能默认谁都可以连。

一次操作怎么走

写操作大致会走下面这几步:

观察 → 准备 → 提交 → 等待 → 复查 → 保存

拿建造来说,准备阶段会确认要建什么、放在哪里、背包里缺不缺材料,但这时不会动游戏。提交时再检查一次玩家、星球、库存和目标位置,然后才调用游戏里的建造逻辑。

之所以分成两步,是因为游戏不会停下来等 Agent。Agent 从观察、思考到提交,中间可能已经过了几十秒。背包数量可能变了,原来的目标也可能被拆掉。遇到这种情况就让本次操作失败,不临时换一个相似目标。

每次提交还带一个幂等键。如果同一个请求因为超时又发了一遍,应该返回第一次的结果,不能多造一台机器。提交成功后还要等建设结束,再读取设备状态做一次确认。产线也是一样,要看到输入在消耗、输出确实增加,才算真的跑起来。

这套流程最初落在 34 个工具上:14 个只读工具负责观察状态,另外 20 个按十组准备/提交配对,分别对应开新档、移动、手采、手搓、科研、建造、配置、转移、补充燃料和保存。后来跨星球飞行、物流塔和存档导入又各自补了入口。完整的工具清单和后续新增记录,分别写在 0x010x02 里。

怎么接着上次玩

这条长期开发主线持续使用同一个存档,每次接着上次保存的进度往下走。发行包的开局验收会另建独立新档,记录也各自保留。因此保存、关闭和恢复都算功能的一部分。

正常关闭游戏前要先保存,并记录下次该读哪个档。跨星球飞行风险比较高,起飞前会另外留一份检查点,失败就从那里重来。第一次手搓或经产线产出一件物品、第一次选择一项科技或升级,也都会把现实时间和游戏时间写进本局日志。

实际运行中已经遇到过这样的情况:伊卡洛斯被建筑基座卡住,移动没有进展却一直耗电,直到没电才停下来。类似问题需要变成可检测的状态,处理办法也要写进仓库。后面发现原来的经验不合适,就直接改掉,不把旧结论当成永久规则。

后面写什么

这篇是 0x00,先写项目的起点、规则和当前架构。

0x01 开始记录具体进度。每篇尽量对应一次实际开发:当时要做什么,游戏里发生了什么,原来的判断哪里不对,代码怎么改,最后又怎么验证。

← 回到归档