跳到主要内容

Pokemon Player

通过无头模拟器与RAM读取游玩Pokemon游戏。

技能元数据

来源内置 (默认安装)
路径skills/gaming/pokemon-player
平台linux, macos, windows

参考:完整的 SKILL.md

信息

以下是当此技能被触发时,Hermes加载的完整技能定义。这是技能激活时智能体看到的指令。

Pokemon Player

通过无头模拟游玩Pokemon游戏,使用 pokemon-agent 包。

何时使用

  • 用户说“玩pokemon”、“启动pokemon”、“pokemon游戏”
  • 用户询问Pokemon红、蓝、黄、火红等版本
  • 用户想观看AI玩Pokemon
  • 用户引用ROM文件 (.gb, .gbc, .gba)

启动步骤

1. 首次设置 (克隆,虚拟环境,安装)

仓库是GitHub上的 NousResearch/pokemon-agent。克隆它,然后 设置一个Python 3.10+的虚拟环境。使用uv (首选,速度快) 创建虚拟环境并以可编辑模式安装包及pyboy扩展。 如果uv不可用,则回退到 python3 -m venv + pip。

在此机器上,它已在 /home/teknium/pokemon-agent 设置完毕, 虚拟环境已就绪——只需 cd 到那里并执行 source .venv/bin/activate。

你还需要一个ROM文件。向用户索要他们的ROM文件。在此机器上, 该目录下的 roms/pokemon_red.gb 存在一个。 绝对不要下载或提供ROM文件——始终向用户询问。

2. 启动游戏服务器

在已激活虚拟环境的 pokemon-agent 目录内,运行 pokemon-agent serve,其中 --rom 指向ROM文件,--port 为 9876。 使用 & 在后台运行。 要从保存的游戏恢复,添加 --load-state 和存档名称。 等待4秒启动,然后通过 GET /health 验证。

3. 为用户设置实时仪表盘以供观看

通过 localhost.run 使用SSH反向隧道,以便用户能在浏览器中查看 仪表盘。使用ssh连接,将本地端口9876转发到远程nokey@localhost.run的端口80。 将输出重定向到日志文件,等待10秒,然后grep日志文件查找 .lhr.life URL。向用户提供附加了 /dashboard/ 的URL。 隧道URL每次都会变化——如果重启,请向用户提供新的URL。

保存与加载

何时保存

  • 每进行15-20回合游戏
  • 始终在道馆战、对手遭遇或危险战斗前
  • 进入新城镇或地牢前
  • 在任何不确定的操作前

如何保存

使用描述性名称向 /save 发送POST请求。好的例子: before_brock, route1_start, mt_moon_entrance, got_cut

如何加载

使用存档名称向 /load 发送POST请求。

列出可用存档

GET /saves 返回所有保存的状态。

服务器启动时加载

在启动服务器时使用 --load-state 标志来自动加载存档。 这比在服务器启动后通过API加载更快。

游戏循环

步骤 1: 观察 — 检查状态并截屏

GET /state 获取位置、生命值、战斗、对话信息。 GET /screenshot 保存到 /tmp/pokemon.png,然后使用 vision_analyze。 始终执行两者 — RAM状态给出数字,视觉提供空间感知。

步骤 2: 判断

  • 屏幕上有对话/文本 → 推进它
  • 在战斗中 → 战斗或逃跑
  • 队伍受伤 → 前往精灵中心
  • 接近目标 → 小心导航

步骤 3: 决策

优先级: 对话 > 战斗 > 治疗 > 故事目标 > 训练 > 探索

步骤 4: 行动 — 移动2-4步,然后重新检查

使用SHORT动作列表(2-4个动作,而不是10-15个)向 /action 发送POST请求。

步骤 5: 验证 — 每次移动序列后截图

截图并使用 vision_analyze 确认你已移动到预期位置。 这是最重要的步骤。没有视觉你必将迷路。

步骤 6: 记录进度到记忆,使用 PKM: 前缀

步骤 7: 定期保存

动作参考

  • press_a — 确认,交谈,选择
  • press_b — 取消,关闭菜单
  • press_start — 打开游戏菜单
  • walk_up/down/left/right — 移动一格
  • hold_b_N — 按住B键N帧 (用于加速文本显示)
  • wait_60 — 等待约1秒 (60帧)
  • a_until_dialog_end — 重复按A键直到对话清除

来自经验的关键提示

持续使用视觉

  • 每移动2-4步截图一次
  • RAM状态告诉你位置和生命值,但不是你周围有什么
  • 崖边、围栏、指示牌、建筑门、NPC — 只有通过截图可见
  • 向视觉模型提出具体问题:“我北边一格是什么?”
  • 卡住时,在尝试随机方向前始终截图

传送过渡需要额外等待时间

穿过门或楼梯时,屏幕在地图过渡期间会变黑。 你必须等待它完成。在任何门/楼梯传送后添加2-3个 wait_60 动作。 不等待的话,位置读取会过时,你会以为自己还在旧地图。

建筑出口陷阱

当你走出建筑时,你直接出现在门前面。 如果你向北走,你会直接走回去。始终先向左或向右移动2格, 然后朝你预定的方向前进。

对话处理

第1代文本逐字母缓慢滚动。要加速对话, 按住B键120帧然后按A键。根据需要重复。按住B键使文本 以最快速度显示。然后按A键推进到下一行。 a_until_dialog_end 动作检查RAM对话标志,但此标志 不能捕获所有文本状态。如果对话似乎卡住,请使用手动 hold_b + press_a 模式并通过截图验证。

崖边是单向的

崖边 (小悬崖边缘) 只能向下 (南) 跳,永远不能向上 (北) 爬。 如果被向北的崖边挡住,你必须向左或向右走找到绕过它的缺口。 使用视觉识别缺口在哪个方向。明确询问视觉模型。

导航策略

  • 每次移动2-4步,然后截图检查位置
  • 进入新区域时,立即截图以确定方向
  • 询问视觉模型“去[目的地]该走哪个方向?”
  • 如果尝试3次以上仍卡住,截图并完全重新评估
  • 不要连续发送10-15个移动动作——你会过冲或卡住

逃离野生战斗

在战斗菜单上,逃跑 (RUN) 在右下角。从默认光标位置 (左上角的战斗 FIGHT) 到达它:按向下再向右将光标移到 逃跑,然后按A。用 hold_b 包装以加速文本/动画。

战斗 (FIGHT)

在战斗菜单上,战斗 (FIGHT) 在左上角 (默认光标位置)。 按A进入招式选择,再按A使用第一个招式。 然后按住B加速攻击动画和文本。

战斗策略

决策树

  1. 想要捕捉? → 削弱然后投掷精灵球
  2. 不需要的野生宝可梦? → 逃跑
  3. 有属性克制? → 使用效果绝佳的招式
  4. 无优势? → 使用最强的STAB招式
  5. 生命值低? → 切换或使用药水

第1代属性相克表 (关键对战)

  • 水克火、地面、岩石
  • 火克草、虫、冰
  • 草克水、地面、岩石
  • 电克水、飞行
  • 地面克火、电、岩石、毒
  • 超能力克格斗、毒 (第1代中过于强大!)

第1代特性

  • 特殊种族值 = 特殊招式的攻
  • 超能力属性过于强大 (幽灵招式有bug)
  • 暴击基于速度种族值
  • 缠绕/绑缚阻止对手行动
  • 聚气bug:降低暴击率而非提高

记忆约定

前缀目的示例
PKM:OBJECTIVE当前目标从常青市商店获取包裹
PKM:MAP导航知识常青市:商店在东北方
PKM:STRATEGY战斗/队伍计划在挑战小霞前需要草属性
PKM:PROGRESS里程碑追踪击败对手,前往常青市
PKM:STUCK卡住情况崖边在y=28,向右绕行
PKM:TEAM队伍笔记杰尼龟Lv6,撞击 + 摇尾巴

进度里程碑

  • 选择初始宝可梦
  • 从常青市商店送达包裹,获得图鉴
  • 灰色徽章 — 小刚 (岩石) → 使用水/草
  • 蓝色徽章 — 小霞 (水) → 使用草/电
  • 橙色徽章 — 马志士 (电) → 使用地面
  • 彩虹徽章 — 艾莉嘉 (草) → 使用火/冰/飞行
  • 粉红徽章 — 阿桔 (毒) → 使用地面/超能力
  • 金黄徽章 — 娜姿 (超能力) → 最难的道馆
  • 深红徽章 — 夏伯 (火) → 使用水/地面
  • 绿色徽章 — 坂木 (地面) → 使用水/草/冰
  • 四天王 → 冠军!

停止游玩

  1. 通过 POST /save 使用描述性名称保存游戏
  2. 使用 PKM:PROGRESS 更新记忆
  3. 告诉用户:“游戏已保存为 [名称]!说‘play pokemon’可继续。”
  4. 终止服务器和隧道的后台进程

陷阱

  • 绝对不要下载或提供ROM文件
  • 不要检查视觉就发送超过4-5个动作
  • 走出建筑后始终先侧移再向北走
  • 门/楼梯传送后始终添加 wait_60 x2-3
  • 通过RAM的对话检测不可靠——用截图验证
  • 危险遭遇前保存
  • 隧道URL每次重启都会变化