dsh-sts2-agent
让 AI 轻轻松松玩《杀戮尖塔 2》(Slay the Spire 2)的 DSH 插件。
不碰游戏内存、不装 mod、不改存档。只做两件最小的事:
- 看一眼 —— 截一张游戏窗口的图,AI 直接看(
read_image)。 - 点一下 —— 在屏幕坐标点鼠标、按键(Windows
SendInput)。
外加一份游玩日志:每次截图、每次点击、每条决策都会记成一行 Markdown,玩完就是一篇能读的战报。
为什么不用 mod 接口
《杀戮尖塔 2》是 Godot 游戏,抢先体验阶段没有开放 mod 目录,.pck 里的脚本没有公开的挂载点。截图 + 鼠标键盘注入是最稳的路:不管游戏怎么更新,只要是窗口就行。
安装
dsh plugin --profile <你的 profile> add "link:<本插件目录>"
或者从 npm(如果已发布):
dsh plugin --profile <你的 profile> add dsh-sts2-agent
装完重启一次 DSH。要求:
- Windows(用
ctypes调user32) - Python 3.10+,带 Pillow(
pip install pillow)——截图用ImageGrab - 游戏窗口标题默认
Slay the Spire 2,全屏或窗口化都行 - 玩的时候别动鼠标:注入的点击抢的是真实光标
工具
| 工具 | 干什么 |
|---|---|
sts2_shot |
截图,返回 PNG 路径 + 窗口原点;label 会写进日志 |
sts2_click |
在屏幕绝对坐标点一下;note 会写进日志 |
sts2_drag |
按住鼠标从 A 拖到 B —— 出牌、打敌人都靠它 |
sts2_key |
按一个键(enter/space/escape/tab/方向键/数字/字母) |
sts2_log |
往游玩日志里加一行(决策理由、血量、战利品) |
sts2_lookup |
查本地牌表:卡牌/遗物/能力/药水的名字或效果关键词 |
sts2_status |
窗口在不在、路径、python 通不通 |
AI 的循环大概长这样:
sts2_shot → 看图像 → sts2_lookup 查牌 → 打评分 → sts2_drag / sts2_click / sts2_key → sts2_shot → …
每次出牌前先打分
日志里有个约定:行动前先写下计划分(0–10),行动后再补一句兑现情况。比如:
🧠 回合 2:能量 3,对面 199/400。候选:
① 防御×2 + 打击(0 费吃 3 点攻击)→ 预计掉血 16,评分 6
② 群星之子 + 防御(先铺能力)→ 长期赚,评分 8
选择 ②;出牌顺序:群星之子 → 防御 → 防御
✅ 兑现:本回合掉血 0,能力已铺,评分 8/10 成立
这样回看日志就知道「当时为什么这么打」,也方便把自己打烂的回合拎出来复盘。
本地牌表(sts2_lookup 的数据从哪来)
游戏自带的汉化 json 里就有全部牌/遗物/能力的名字和效果,从 SlayTheSpire2.pck 里只读提出来就行。tools/ 下三个脚本按顺序跑:
# 1. 看包里有什么(可选)
python tools/pck.py list "路径/SlayTheSpire2.pck" localization/zhs
# 2. 把汉化提出来(只读游戏文件,不写游戏目录)
python tools/pck.py extract "路径/SlayTheSpire2.pck" localization/zhs ./localization/zhs
# 3. 生成牌表
python tools/build-db.py --loc ./localization/zhs --out ./data
# -> data/cards.md / relics.md / powers.md / potions.md / index.tsv
index.tsv 每行 名称 \t 类型 \t 效果 \t ID,sts2_lookup 就在里面模糊搜;命令行下也可以用 python tools/lookup.py 群星之子。
效果里的 {伤害} 这类是占位符——具体数值随卡牌等级/力量变化,牌面上能看到。
提取出来的是你自己游戏里的文本,建议只在本机用,别把
data/提交进仓库(.gitignore已经忽略了)。
操作要点(踩过的坑)
- 出牌是拖不是点:单击只是把卡「拿起来」,要按住卡往上拖(拖到 y≈420 的空地)松手才算打出;打敌人的牌要拖到敌人身上。
escape会打开暂停菜单(继续/设置/百科大全/放弃/保存并退出),再点「继续」回去。- 手牌位置会随出牌变化,每一步之后重新截图核对比记死坐标靠谱。
- 鼠标是真被占用的:跑的时候别同时用鼠标,否则点击会落到别处。
配置
配置文件:$DSH_HOME/sts2/config.json(不写就用默认值)
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
关掉就整条链路不跑 |
pythonPath |
空 | 指定 python 解释器;空则用 python |
windowTitle |
Slay the Spire 2 |
窗口标题关键字 |
shotsDir |
$DSH_HOME/sts2/shots |
截图存放目录 |
logFile |
$DSH_HOME/sts2/run-log.md |
游玩日志 |
cardsFile |
$DSH_HOME/sts2/data/index.tsv |
本地牌表(sts2_lookup 用),可用绝对路径指到别处 |
日志长什么样
# 杀戮尖塔 2 · AI 游玩记录
- 2026-10-25 11:23:41 📷 截图:第 3 层 战斗开始 → F:\...\shot-1761.png
- 2026-10-25 11:23:52 🖱️ 点击 (612,1002):打出「打击」打左边那只
- 2026-10-25 11:23:58 ⌨️ 按键 e:结束回合
- 2026-10-25 11:24:05 🧠 血量 62/100,对面还剩 128,先防守
安全
- 只截图、只发键鼠事件;不写游戏目录、不改存档、不联网。
- 日志和截图都在
$DSH_HOME/sts2/下面,想清就整个删掉。 - 前提是你自己开着游戏;插件不会去启动或关闭游戏进程。
License
MIT
No comments yet. Be the first to write one.