大肥鱼种白饭 Blind Whale Farmer
让 DeepSeek 不靠视觉玩星露谷:闭着眼睛也能种田(种白饭)的大肥鱼 🐋🍚
dsh-stardew-blind-whale-farmer:一个 SMAPI 星露谷模组,加一个 DeepSeek Harness(DSH)插件。
一个 SMAPI 模组。它把游戏画面"翻译"成纯文字(状态、背包、文字地图、物体坐标、作物、出口、对话框/商店内容),交给 DeepSeek;DeepSeek 通过函数调用(tool calling)发出高层指令,模组负责寻路、走过去、用工具、播种、浇水、对话、购物、睡觉。整个过程不需要截图,也不需要视觉模型。
游戏 ──(主线程读取)──> 文字观察 ──> DeepSeek API ──> 工具调用 ──> 模组在游戏里执行(寻路+游戏原生操作)
^ |
└──────────────────────────── 结果写进行动记录,进入下一轮 ────────────────┘
安装(第一次)
- 安装 SMAPI(星露谷的模组加载器)
- 下载:https://smapi.io(开发时用的是 SMAPI 4.5.2 + 游戏 1.6.15)
- 解压后运行安装程序(Windows 是
install on Windows.bat),按提示选择游戏目录 - Steam 里给星露谷设置启动选项:
"<游戏目录>\StardewModdingAPI.exe" %command%
- 安装本模组:从 GitHub Releases 下载压缩包,把里面的
BlindWhaleFarmer文件夹放进游戏目录的Mods里。 从源码安装的话,在仓库根目录运行(会自动在 Steam / GOG 的安装位置找游戏,包括装在其他盘的 Steam 库):powershell -ExecutionPolicy Bypass -File build.ps1powershell -ExecutionPolicy Bypass -File install.ps1 - 填 API Key:打开
游戏目录\Mods\BlindWhaleFarmer\config.json,把ApiKey填成你的 DeepSeek Key(https://platform.deepseek.com)。也可以不写在文件里,改设系统环境变量DEEPSEEK_API_KEY。
使用
- 通过 SMAPI 启动游戏,读取存档(建议先备份存档,或者新开一个存档给 AI 玩,AI 睡觉时会自动保存)。
- 按 F8 启动 / 停止 AI。屏幕左上角会显示 AI 的想法和正在执行的动作。
- 游戏窗口失去焦点时星露谷默认会暂停,想让它在后台跑:游戏设置里关闭"窗口不活动时暂停"。
SMAPI 控制台命令(调试用):
| 命令 | 作用 |
|---|---|
dsai_start / dsai_stop |
启动 / 停止 AI |
dsai_state |
打印当前发给 AI 的文字状态(不调用 API,可以先看看它"看到"了什么) |
dsai_do <工具> <JSON> |
手动执行一个工具,例如 dsai_do travel_to {"location":"SeedShop"}、dsai_do water_crops {} |
dsai_notes [内容] |
查看 / 改写 AI 的长期笔记 |
dsai_tokens |
本次运行消耗的 token 数 |
每次运行的完整行动记录在 Mods\BlindWhaleFarmer\logs\transcript-*.log。AI 的笔记按存档保存在 Mods\BlindWhaleFarmer\data\。
用 WorkBuddy(或其他 MCP 客户端)来玩:不需要 API Key
模组启动时会在本机开一个 MCP 服务器:http://127.0.0.1:18080/mcp(只监听本机,别的电脑连不上)。WorkBuddy、Claude Code、Cursor 这类支持 MCP 的客户端连上来后,由客户端自己的 AI 思考、调用模组的工具玩游戏,消耗的是客户端的额度,不需要 DeepSeek API Key。
WorkBuddy 设置:
- 先通过 SMAPI 启动游戏、读取存档(SMAPI 控制台会显示
MCP 服务器已启动:http://127.0.0.1:18080/mcp)。 - WorkBuddy → 设置 / 连接器 → 自定义连接器 → Configure MCP(会打开
~/.workbuddy/mcp.json),加上:
保存后在 My MCP 列表里打开它的开关。不同版本菜单名可能不一样,以你的客户端界面为准;如果它要求选传输方式,选 Streamable HTTP。{ "mcpServers": { "stardew": { "url": "http://127.0.0.1:18080/mcp" } } } - 对 WorkBuddy 说:"用 stardew 工具玩星露谷:先 get_state 看看状态,然后今天把作物浇完、出货,晚上睡觉。"
说明:
- 工具:
get_state(读取文字状态)、get_guide(读攻略),加上内置 AI 用的全部工具;连接时还会把操作规则和攻略(和内置 AI 的提示词一样)发给客户端。 - 客户端思考(两次调用之间)时游戏时间自动冻结;超过
McpIdleSeconds(默认 120 秒)没有调用就恢复走时。屏幕左上角会显示[MCP 客户端思考中,时间已冻结]。 - 按 F8 启动的内置 AI 和 MCP 客户端不能同时操作:内置 AI 运行时,MCP 的工具调用会返回提示让你先按 F8 停掉它。
- 长动作(钓鱼、浇大片地、wait)可能要几十秒到几分钟,个别客户端的工具调用超时比这短,遇到超时就让它把动作拆小(比如 fish 的 casts 设小一点)。
- 客户端的一次任务通常只能连续玩一段时间,需要你隔一会儿让它"继续"。
- 端口冲突时改
config.json的McpPort;不想开就设EnableMcp: false。
用 DeepSeek Harness(DSH)玩: 装上本仓库的 DSH 插件(dsh-stardew-blind-whale-farmer)。它会:
- 提供一个 “大肥鱼种白饭”会话预设(默认关闭,在插件设置里打开):新建会话时选它,那个会话才连上游戏、拿到玩游戏的工具;其他会话里完全没有这些工具和说明,不占上下文;已经对话过的会话不能再换预设(DSH 的规定),要玩请新建会话;AI 的长期笔记会出现在 get_state 最前面,新会话能接着玩。
- 也可以在所有会话(包括老会话)里提供一个很小的 stardew 入口工具(默认关闭):不用换预设,常驻上下文只多一个工具的简短说明,AI 要玩时先
action="help"再按需调用各个动作。 - 在 DSH 的「设置 → 插件」里提供设置:每次玩几个游戏日 / 多少分钟、思考时冻结时间、给 AI 的额外要求、攻略文件等,改了自动推送到游戏,不用重启。
桌面版和网页版用不同的 profile,各自都要装。不要再在 profile 里全局挂 @deepseek-ai/dsh-mcp-client 连星露谷,否则每个会话都会带上这些工具。
AI 能看到什么(纯文字)
- 时间、天气(含明天天气预报)、金钱、体力、生命、技能等级、未读邮件
- 当前界面:对话内容和选项、商店商品和价格、信件内容、升级职业描述、其他菜单的可点击元素
- 背包每一格
- 本地点的所有出口(含营业时间)、村民位置和好感度、生日、今天是否聊过天
- 作物:需要浇水/可收获/枯死的坐标,生长中作物还剩几天
- 附近物体:石头、杂草、树、树枝、采集品、机器(加工状态)、箱子、建筑、可交互的地图格,带坐标和建议工具
- 以玩家为中心的字符地图(29×19 格,带图例和坐标)
- 动物待办汇总(没摸的、可挤奶/剪毛的、地上的蛋、食槽缺的干草、筒仓存量),以及当前地点每只动物的好感和状态
- 附近村民对你背包里物品的喜好(最爱/喜欢/讨厌)
- 背包里能捐给博物馆的东西、能交给社区中心收集包的材料
- 附近能不能钓鱼;矿洞层数、下楼梯/竖井/电梯/出口的坐标
AI 能做什么(43 个工具)
| 类别 | 工具 |
|---|---|
| 移动 | move_to(A* 寻路)、travel_to(跨地图自动规划路线,会自动开门) |
| 单个操作 | use_tool、interact(聊天/开门/捡东西/收机器/送礼)、place_item、eat |
| 批量农活 | till_area、plant_seeds、water_crops(水壶空了自动去灌水)、harvest_crops、clear_area |
| 钓鱼 | fish(自动找岸边、按钓鱼等级算抛竿力度、等咬钩、提竿、自动玩钓鱼小游戏、收宝箱,一次最多连钓 20 竿) |
| 动物 | care_animals(自动进每个鸡舍/畜棚:捡蛋和羊毛、清空自动采集器、食槽放干草、摸动物、挤奶/剪毛;可开关动物门) |
| 经营 | build(找 Robin 建造/升级建筑,自动找空地)、upgrade_house、buy_animal(找 Marnie 买动物,自动入住、起名)、upgrade_tool(找 Clint 升级/领取工具)、quest_board(告示板委托) |
| 冒险 | fight(自动靠近打怪,血少自动吃回血食物)、explore_mine(自动打怪、敲石头找楼梯、往下走,可坐电梯直达) |
| 生活 | cook(厨房做菜,冰箱材料也能用)、check_crab_pots(收蟹笼、补鱼饵) |
| 社交 | gift_info(查喜好/生日/本周送礼次数)、give_gift(自动找到村民送礼,先检查次数限制) |
| 收集 | bundle_info / donate_bundles(社区中心收集包:看缺什么、自动去交,领奖励、触发修复过场)、donate_museum(捐矿物古物并领奖励) |
| 经济 | ship_items(出货箱)、open_shop、buy、sell、craft、store_items / take_items(箱子存取) |
| 界面 | dialogue、menu_click、close_menu、choose_profession、skip_event、leave_festival |
| 时间 | sleep(自动回家上床)、wait |
| 记忆 | update_notes |
工具执行都走游戏自己的逻辑(BeginUsingTool、checkAction、tryToPlaceItem、出货箱 shipItem 等),体力消耗、动画、掉落都和手动操作一致;走路是逐格移动并播放走路动画。
配置项(config.json)
| 字段 | 默认 | 说明 |
|---|---|---|
ApiKey |
空 | DeepSeek API Key |
BaseUrl |
https://api.deepseek.com |
任何 OpenAI 兼容接口都可以 |
Model |
deepseek-v4-flash |
需要支持 function calling 的模型;想要更聪明可改成 deepseek-v4-pro(更贵更慢)。旧名 deepseek-chat 已停用 |
MaxTokens |
4096 | 每次回复最多输出多少 token(只按实际输出计费;模型如果开了思考模式,思考内容也算在里面) |
ToggleKey |
F8 |
开关快捷键 |
FreezeTimeWhileThinking |
true |
等模型回复时冻结游戏时钟,思考不占游戏时间 |
MaxActionsPerStep |
6 | 模型一次回复最多执行几个工具调用 |
HistoryLines |
25 | 提示词里保留多少条最近行动记录 |
MapRadiusX / MapRadiusY |
14 / 9 | 文字地图大小 |
ScanRadius |
16 | 附近物体扫描半径 |
AutoConfirmNightMenus |
true |
自动确认出货结算、普通升级界面 |
ExtraInstructions |
空 | 写给 AI 的额外目标,例如 "第一年专心种地赚钱,每天和 Abigail 聊天" |
GuideFile |
guide/zh-CN.md |
攻略文件(游戏常识和打法路线,见下方“攻略”)。想换打法就复制一份改名,再把这里指过去 |
LogPrompts |
false |
把完整提示词写进 transcript,调试用 |
EnableMcp |
true |
开启本机 MCP 服务器(给 WorkBuddy 等客户端用) |
McpPort |
18080 | MCP 端口,地址 http://127.0.0.1:端口/mcp |
McpFreezeTime |
true |
MCP 客户端思考时冻结游戏时间 |
McpIdleSeconds |
120 | 多久没有 MCP 调用就视为客户端不玩了,恢复走时 |
SessionDays |
0 | 每次游玩最多玩几个游戏日(睡一觉算一天),到了 AI 停下汇报。0 = 不限,每次读档重新计 |
SessionMinutes |
0 | 每次游玩最多玩多少现实分钟,到了先回家睡觉存档再停下。0 = 不限 |
以上 SessionDays、SessionMinutes、McpFreezeTime、McpIdleSeconds、ExtraInstructions、GuideFile 也可以在 DSH 里用 dsh-stardew-blind-whale-farmer 插件改,改完会写回这个文件。
攻略(AI 的打法)
AI 收到的提示分两部分:
- 操作规则(写在
Agent.cs):怎么用工具、先处理界面、失败别重复、按时睡觉……跟着工具代码一起改。 - 攻略(
guide/zh-CN.md,纯文本):游戏常识和第一年的打法路线。启动时读取,不用重新编译;MCP 客户端也能用get_guide工具随时查。
想让 AI 换个玩法(比如专心钓鱼、走 Joja 路线),或者翻译成别的语言:把 guide/zh-CN.md 复制成新文件(比如 guide/my.md)改内容,再把 config.json 的 GuideFile 指过去。自带的攻略会随模组更新覆盖,自己的文件不会。
攻略内容参考了社区的新手攻略,具体数字(营业时间、配方、剧情触发条件等)都对照游戏数据核对过,欢迎提 PR 补充改进。
费用估计
每一步请求大约 10k~14k 输入 token(系统提示 + 43 个工具定义约 7.5k,固定不变,能命中 DeepSeek 的缓存;游戏状态 3k~6k),输出几百 token。AI 大约每 10~20 秒一步,所以每小时大约一两百万输入 token。具体价格以 DeepSeek 官网为准,可以用 dsai_tokens 查看实际消耗。
已知限制
- 钓鱼:小游戏由模组按帧自动操作(模型只决定去哪钓、钓几竿)。用复刻的小游戏物理离线模拟过:难度 70 以下的普通鱼几乎都能钓上,难度 90 以上的(传说鱼等)钓鱼等级低时成功率很低。蟹笼、鱼饵/浮漂的装配没有专门支持。
- 战斗比较朴素:
fight/explore_mine的策略是“靠近、挥最好的近战武器、血少就吃”,不会走位躲技能、不用弹弓和炸弹,矿洞深层(40 层以后)和骷髅洞穴会很危险。竖井不会自动跳。 - 动物:喂干草直接调用游戏的
feedAllAnimals(从筒仓扣干草放进食槽,结果和手动放一样,但省掉了来回走到饲料槽取干草)。孵蛋没有专门支持。 - 建造时位置由程序自动选(农舍附近、不压耕地和树),也可以指定坐标;拆除、移动、换皮肤没有支持。
- 装修、节日小游戏、特别订单(Special Orders)没有专门支持(可以用
interact/menu_click硬来,效果看模型发挥)。 - 节日:节日进行中(比如春 13 日 9:00-14:00 的 Town),
travel_to不会走进或路过节日地图,因为一进去时间就停住、普通工具都用不了;万一进去了,用leave_festival离开。状态里会提前提示今天的节日。 - 晚上:19:00 以后状态里会显示“回家上床大约要多少分钟”(按回家路线的距离和走路速度估算);来不及在 24:00 前躺下或体力快见底时,每个动作结果后面都会附上警告。
- 寻路只在当前地图内做 A*,跨地图靠出口图做 BFS;个别特殊入口(比如需要钥匙的门、沙漠巴士)可能走不通,会返回失败原因。
- 只支持单人模式。
目录结构
dsh-stardew-blind-whale-farmer/
├─ package.json / cordis.patch.yml / lib/ DSH 插件(就在仓库根目录,DSH 可以直接从 GitHub 装)
├─ docs/dsh-plugin.md DSH 插件的说明
├─ BlindWhaleFarmer/ 星露谷模组源码(C#,net6.0)
│ ├─ ModEntry.cs 入口、快捷键、HUD、控制台命令、时间冻结
│ ├─ Agent.cs AI 主循环和操作规则
│ ├─ Guide.cs 读取攻略文件
│ ├─ guide/zh-CN.md 攻略(游戏常识和第一年路线)
│ ├─ McpServer.cs 本机 MCP 服务器(WorkBuddy 等客户端接入)
│ ├─ DeepSeekClient.cs OpenAI 兼容接口客户端(重试、超时)
│ ├─ Tools.cs 所有工具的 JSON Schema 和参数解析
│ ├─ GameActions.Storage.cs 箱子存取
│ ├─ GameActions.cs 所有动作的实现(协程,逐帧执行)
│ ├─ GameActions.Fishing.cs 钓鱼动作和钓鱼小游戏自动操作
│ ├─ GameActions.Animals.cs 照顾动物
│ ├─ GameActions.Knowledge.cs 送礼、博物馆捐赠、社区中心收集包
│ ├─ GameActions.Adventure.cs 烹饪、蟹笼、战斗、自动下矿
│ ├─ GameActions.Town.cs 工具升级、告示板、买动物、建造、升级农舍
│ ├─ Knowledge.cs 送礼喜好/收集包/博物馆数据解析
│ ├─ Observer.cs 游戏状态 → 文字
│ ├─ Exits.cs 出口识别和跨地图路线规划
│ ├─ Pathfinder.cs A* 寻路
│ ├─ MainThread.cs 后台线程 ↔ 游戏主线程调度
│ └─ Util.cs 物品/工具查找等工具函数
├─ tests/HarnessTest/ 模组的离线测试(不需要启动游戏)
├─ tests/DshPlugin/ DSH 插件的测试(node --test tests/DshPlugin/sync.test.mjs)
├─ tools/MapDump/ 读本机游戏的地图/数据文件:画碰撞图、模拟寻路和钓点(排查“走不到”时用)
├─ release/BlindWhaleFarmer/ build.ps1 生成的模组,直接复制进 Mods
├─ Directory.Build.props 各项目共用的游戏路径设置
├─ common.ps1 脚本共用:找 dotnet 和游戏目录
├─ local.ps1.example 本机路径设置示例(复制成 local.ps1,不会提交)
├─ build.ps1 编译
├─ test.ps1 编译并跑离线测试
└─ install.ps1 安装到游戏
从源码编译
需要 .NET 6 或更新的 SDK,以及装好 SMAPI 的星露谷。
powershell -ExecutionPolicy Bypass -File build.ps1
powershell -ExecutionPolicy Bypass -File test.ps1
脚本会自动在 Steam(包括其他盘的 Steam 库)和 GOG 的默认位置找游戏。找不到、或者 dotnet 不在 PATH 里时,把 local.ps1.example 复制成 local.ps1 填上路径。直接用 dotnet build 也行,设置环境变量 STARDEW_PATH 指向游戏目录即可。
No comments yet. Be the first to write one.