Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help


title: “Pokemon Player — Play Pokemon via headless emulator + RAM reads” sidebar_label: “Pokemon Player” description: “Play Pokemon via headless emulator + RAM reads”

宝可梦游戏玩家技能

通过无头模拟器结合内存读取功能来运行宝可梦游戏。

技能元数据

项目详情
来源可选 — 使用 hermes skills install official/gaming/pokemon-player 安装
路径optional-skills/gaming/pokemon-player
支持平台linux、macos、windows

参考:完整的 SKILL.md 文件

:::info 以下是当触发该技能时 Hermes 会加载的完整技能定义。当技能处于激活状态时,智能体将依据此内容执行操作。
::

宝可梦游戏玩家技能

利用 pokemon-agent 包通过无头模拟器运行宝可梦游戏。

适用场景

  • 用户说出“玩宝可梦”、“开始宝可梦游戏”等指令
  • 用户询问关于《宝可梦红》、《蓝》、《黄》、《火红》等版本的问题
  • 用户希望观看 AI 玩宝可梦游戏
  • 用户提供 ROM 文件(.gb、.gbc、.gba 格式)

启动流程

1. 首次设置(克隆仓库、创建虚拟环境、安装依赖)

该项目的 GitHub 地址为 NousResearch/pokemon-agent。首先克隆该仓库,然后创建一个 Python 3.10+ 版本的虚拟环境。推荐使用 uv 工具来快速创建虚拟环境,并以可编辑模式安装包含 pyboy extra 组件的包。如果无法使用 uv,则可使用 python3 -m venv + pip 的方式创建环境。

在本机上,相关环境已设置在 /home/teknium/pokemon-agent 目录下,可直接进入该目录并执行 .venv/bin/activate 命令激活虚拟环境。此外还需要一个 ROM 文件,需向用户索取。本机上的 ROM 文件位于 roms/pokemon_red.gb 目录中。绝不要自行下载或提供 ROM 文件,务必始终让用户提供

2. 启动游戏服务器

在已激活虚拟环境的 pokemon-agent 目录下,运行 pokemon-agent serve 命令,同时指定 –rom 参数指向 ROM 文件路径,并设置端口为 9876。可使用 & 符号将命令在后台运行。若要从保存的游戏状态继续游戏,可添加 –load-state 参数并指定保存文件名。等待约 4 秒让服务器启动完成,随后可通过 GET /health 接口验证服务器状态。

3. 设置实时控制面板供用户查看

通过 localhost.run 提供的 SSH 反向隧道,让用户能够在浏览器中查看游戏控制面板。使用 ssh 连接到 nokey@localhost.run,将本地的端口 9876 转发到远程主机的端口 80。将输出内容重定向到日志文件中,等待 10 秒后,通过 grep 命令查找包含 .lhr.life 后缀的 URL。最终将带有 /dashboard/ 后缀的 URL 提供给用户。由于隧道 URL 每次重启都会变化,因此需要在新版本启动后及时告知用户最新地址。

保存与加载

何时保存游戏

  • 每进行 15-20 轮游戏后
  • 在参加道馆对战、遭遇对手或进行高风险战斗之前务必保存
  • 进入新城镇或地下城之前
  • 在执行任何不确定的操作之前

如何保存游戏

发送 POST /save 请求,并附上描述性的文件名。示例名称包括:before_brock、route1_start、mt_moon_entrance、got_cut 等。

如何加载游戏

发送 POST /load 请求,并提供对应的保存文件名。

查看所有可用保存状态

发送 GET /saves 请求即可获取所有已保存的游戏状态。

在服务器启动时自动加载保存状态

在启动服务器时使用 –load-state 参数,即可自动加载某个保存状态。这种方式比启动后再通过 API 加载要快得多。

游戏流程循环

第一步:观察 —— 检查当前状态并截图

发送 GET /state 请求,获取角色位置、生命值、战斗状态及对话内容等信息。随后发送 GET /screenshot 请求,将截图保存到 /tmp/pokemon.png 文件中,再使用 vision_analyze 工具进行分析。这两步必须同时进行——内存状态只能提供数值信息,而视觉分析则有助于了解空间环境。

第二步:确定方向

  • 根据屏幕上的对话或文字内容决定下一步行动
  • 处于战斗状态时,选择战斗或逃跑
  • 队友受伤时,前往宝可梦中心治疗
  • 接近目标地点时,谨慎规划路线

第三步:做出决策

决策优先级为:对话处理 > 战斗行动 > 治疗 > 完成剧情目标 > 训练 > 探索

第四步:执行动作 —— 最多移动 2-4 步,然后再次检查

发送 POST /action 请求,提供简短的行动列表(2-4 个动作,而非 10-15 个)。

第五步:验证 —— 每次完成一组动作后都需截图

拍摄截图后,使用 vision_analyze 工具确认角色确实移动到了预期位置。这是最重要的一步,如果没有视觉反馈,智能体极容易迷路。

第六步:使用 PKM:前缀将进度记录到内存中

第七步:定期保存游戏

动作指令参考

  • 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 步后都需拍摄截图
  • 内存状态只能提供位置和生命值信息,无法显示周围环境
  • 涉及边缘、围栏、标识牌、建筑物门、NPC 等元素,仅能通过截图查看
  • 可以向视觉分析模型提出具体问题,例如:“我正北方向一格处有什么?”
  • 当遇到困境时,务必先截图,再尝试随机方向移动

穿过门或楼梯时需要额外等待时间

在穿过门或楼梯时,地图切换过程中屏幕会变黑。必须等待切换完成,在每次通过门或楼梯后,需添加 2-3 次 wait_60 指令。如果不等待,角色位置信息可能会失效,导致智能体误以为自己仍在旧地图中。

离开建筑物时的路径陷阱

离开建筑物后,角色会直接出现在建筑物正前方。如果向北移动,实际上会回到建筑物内部。务必先向左或向右移动两格绕行,然后再按原计划方向前进

对话处理技巧

第一代游戏中的对话是逐字缓慢滚动的。若想快速浏览对话,可按住 B 键 120 帧,然后按 A 键。根据需要重复此操作。按住 B 键可使对话以最快速度显示,之后再按 A 键切换到下一行。虽然 a_until_dialog_end 动作会检测内存中的对话状态,但该机制无法覆盖所有对话场景。如果发现对话进度异常,建议采用手动按住 B 键再按 A 键的方式,并通过截图进行确认。

悬崖边缘仅能向下跳跃

悬崖边缘(小型陡坡)只能向下跳跃,无法向上攀爬。如果前方有悬崖阻挡,必须向左或向右移动以寻找绕行路径。可利用视觉分析功能确定缺口所在方向,也可直接向视觉分析模型询问。

导航策略

  • 每次移动 2-4 步后,拍摄截图确认位置
  • 进入新区域后立即截图,以便判断方向
  • 可向视觉分析模型询问“去[目标地点]应该往哪个方向走?”
  • 如果尝试多次仍无法找到路径,需截图并重新全面评估情况
  • 避免连续执行 10-15 次移动指令,否则很容易超出目标范围或陷入困境

从战斗菜单中快速选择“逃跑”动作

在战斗菜单中,“逃跑”按钮位于右下角。从默认的光标位置(左上角的“战斗”按钮)到达该按钮,需先向下再向右移动光标,然后按 A 键。若想快速浏览文字和动画,可配合按住 B 键使用。

战斗操作

在战斗菜单中,“战斗”按钮位于左上角(即默认光标位置)。按 A 键进入动作选择界面,再次按 A 键即可使用第一个动作。之后按住 B 键,可以加快攻击动画和文字的显示速度。

战斗策略

决策树

  1. 如果想捕捉对手的宝可梦?→ 先削弱对手,再使用精灵球捕捉
  2. 如果遇到的野兽并非必需?→ 立即逃跑
  3. 如果自身属性对对手有优势?→ 使用超有效攻击招式
  4. 如果没有属性优势?→ 使用最强且属性相克的攻击招式
  5. 如果自身生命值较低?→ 更换宝可梦或使用药水

第一代宝可梦属性相克表(关键对战关系)

  • 水属性可击败火属性、地面属性、岩石属性宝可梦
  • 火属性可击败草属性、虫属性、冰属性宝可梦
  • 草属性可击败水属性、地面属性、岩石属性宝可梦
  • 电属性可击败水属性、飞行属性宝可梦
  • 地面属性可击败火属性、电属性、岩石属性、毒属性宝可梦
  • 心灵属性在第一代游戏中具有压倒性优势,可击败格斗属性和毒属性宝可梦!

第一代游戏的特殊规则

  • 特殊属性值同时决定特殊招式的攻击力和防御力
  • 心灵属性过于强势(幽灵属性的招式存在漏洞)
  • 临界命中率取决于速度属性值
  • “缠绕”和“束缚”技能可让对手无法行动
  • “能量集中”技能存在缺陷:实际上会降低临界命中率,而非提升它

内存标记约定

前缀用途示例
PKM:OBJECTIVE当前目标从维利丹商店取包裹
PKM:MAP导航相关信息维利丹:商店位于东北方向
PKM:STRATEGY战斗或团队策略在遇到米斯蒂之前需要准备草属性宝可梦
PKM:PROGRESS进度跟踪已击败对手,正前往维利丹
PKM:STUCK遇到困境的情况在 y=28 处的悬崖,需向右绕行
PKM:TEAM队伍相关记录水箭龟,等级6,技能为“冲撞”和“尾巴抽打”

游戏进度里程碑

  • 选择初始宝可梦
  • 从维利丹商店取回包裹,并获得图鉴
  • 获得“巨石徽章”——对应宝可梦: Brock(岩石属性),此时应使用水属性或草属性招式
  • 获得“瀑布徽章”——对应宝可梦: Misty(水属性),此时应使用草属性或电属性招式
  • 获得“雷电徽章”——对应宝可梦: Lt. Surge(电属性),此时应使用地面属性招式
  • 获得“彩虹徽章”——对应宝可梦: Erika(草属性),此时可使用火属性、冰属性或飞行属性招式
  • 获得“灵魂徽章”——对应宝可梦: Koga(毒属性),此时应使用地面属性或心灵属性招式
  • 获得“沼泽徽章”——对应宝可梦: Sabrina(心灵属性),这是难度最高的道馆
  • 获得“火山徽章”——对应宝可梦: Blaine(火属性),此时应使用水属性或地面属性招式
  • 获得“大地徽章”——对应宝可梦: Giovanni(地面属性),此时可使用水属性、草属性或冰属性招式
  • 击败四强选手,最终争夺冠军!

停止游戏流程

  1. 通过发送 POST /save 请求,并为保存的文件起一个描述性的名称,从而保存游戏状态
  2. 使用 PKM:PROGRESS 更新内存中的进度记录
  3. 告诉用户:“游戏已保存为 [名称]!请输入‘play pokemon’即可继续游戏。”
  4. 停止服务器运行以及相关的隧道后台进程

常见问题与注意事项

  • 绝不要自行下载或提供 ROM 文件
  • 在未通过视觉分析确认之前,不要连续发送超过 4-5 个动作指令
  • 离开建筑物后,无论向哪个方向移动,都务必先绕行
  • 每次通过门或楼梯后,必须添加 2-3 次 wait_60 指令
  • 仅依靠内存中的对话检测信息并不可靠,必须通过截图进行确认
  • 在面临高风险战斗之前务必先保存游戏
  • 每次重启隧道服务后,其 URL 都会发生变化