Pokemon Player
目次
- skill の情報
- 参考: SKILL.md 全文
- こんなときに使います
- 起動の手順
- 1. 初回の準備(クローン、venv、インストール)
- 2. ゲームサーバーを起動する
- 3. ユーザーが観戦できるダッシュボードを用意する
- セーブとロード
- セーブする場面
- セーブのしかた
- ロードのしかた
- セーブの一覧を見る
- サーバー起動時に読み込む
- プレイのループ
- ステップ 1: 見る — 状態の確認とスクリーンショットの両方
- ステップ 2: 状況をつかむ
- ステップ 3: 決める
- ステップ 4: 動かす — 一度に 2〜4 歩まで、そのつど確認
- ステップ 5: 確かめる — 移動のたびにスクリーンショット
- ステップ 6: 進み具合を PKM: 接頭辞でメモリに記録する
- ステップ 7: ときどきセーブする
- 操作の一覧
- 実際に遊んでわかったコツ
- 画像は常に確認する
- ワープの前後は余分に待つ
- 建物から出たときの落とし穴
- 会話の進め方
- 段差は一方通行
- 移動のしかた
- 野生ポケモンから逃げる
- 戦う(たたかう)
- 戦い方
- 判断の流れ
- 第 1 世代のタイプ相性(主なところ)
- 第 1 世代ならではの癖
- メモリの書き方
- ストーリーの節目
- 遊び終えるとき
- つまずきやすいところ
ヘッドレスのエミュレーターと RAM 読み取りでポケモンを遊びます。
skill の情報
| 提供元 | 追加 skill — hermes skills install official/gaming/pokemon-player で入れます |
| パス | optional-skills/gaming/pokemon-player |
| バージョン | 1.0.0 |
| 作者 | Teknium (teknium1), Hermes Agent |
| ライセンス | MIT |
| 対応プラットフォーム | linux, macos, windows |
参考: SKILL.md 全文
Pokemon Player
pokemon-agent パッケージを使い、ヘッドレスのエミュレーションでポケモンを遊びます。
こんなときに使います
- 「ポケモンをやって」「ポケモンを始めて」「ポケモンのゲーム」と言われたとき
- ポケモン赤・緑・青・ピカチュウ・ファイアレッドなどについて聞かれたとき
- AI がポケモンを遊ぶところを見たいと言われたとき
- ROM ファイル(.gb、.gbc、.gba)に言及があったとき
起動の手順
1. 初回の準備(クローン、venv、インストール)
リポジトリは GitHub の NousResearch/pokemon-agent です。クローンしたあと、 Python 3.10 以上の仮想環境を用意します。venv の作成とパッケージの インストール(editable モード、pyboy の extra 付き)には uv を使うのが 速くておすすめです。uv が使えない環境なら python3 -m venv と pip で代用します。
すでにチェックアウトがある場合(venv まで整った ~/pokemon-agent など)は、 クローンし直さず、そこへ cd して .venv/bin/activate を source するだけで済みます。
ROM ファイルも必要です。ユーザーが持っているものを尋ねてください(以前の準備で チェックアウト内の roms/pokemon_red.gb に置かれていることもあります)。 ROM ファイルをダウンロードしたり提供したりしてはいけません。必ずユーザーに尋ねます。
2. ゲームサーバーを起動する
venv を有効にした状態で pokemon-agent ディレクトリに入り、 pokemon-agent serve を実行します。--rom に ROM のパスを、--port に 9876 を指定します。 & を付けてバックグラウンドで動かします。 セーブデータから再開するときは --load-state にセーブ名を付けます。 起動を 4 秒待ってから、GET /health で立ち上がりを確かめます。
3. ユーザーが観戦できるダッシュボードを用意する
localhost.run 経由の SSH リバーストンネルを使い、ユーザーがブラウザで ダッシュボードを見られるようにします。ssh で接続し、ローカルの 9876 番ポートを 鍵不要の localhost.run のエンドポイントのリモート 80 番へ転送します (ssh -R 80:localhost:9876 ssh://nokey@localhost.run)。出力はログファイルへ リダイレクトし、10 秒待ってから、ログを grep して .lhr.life の URL を取り出します。 その URL の末尾に /dashboard/ を付けたものをユーザーに伝えます。 トンネルの URL は起動のたびに変わるので、立て直したら新しい URL を伝えてください。
セーブとロード
セーブする場面
- 15〜20 ターン遊ぶごとに
- ジムリーダー戦、ライバル戦、危なそうな戦闘の前には必ず
- 新しい町やダンジョンに入る前に
- 結果に自信がない行動を取る前に
セーブのしかた
POST /save に、内容がわかる名前を付けて送ります。よい例はこうです。 before_brock、route1_start、mt_moon_entrance、got_cut
ロードのしかた
POST /load にセーブ名を付けて送ります。
セーブの一覧を見る
GET /saves で保存済みの状態がすべて返ります。
サーバー起動時に読み込む
サーバーの起動時に --load-state フラグを付けると、セーブを自動で読み込めます。 起動後に API でロードするより速く済みます。
プレイのループ
ステップ 1: 見る — 状態の確認とスクリーンショットの両方
GET /state で位置、HP、戦闘中かどうか、会話中かどうかを取ります。 GET /screenshot で画像を取り、/tmp/pokemon.png に保存してから vision_analyze にかけます。 必ず両方やってください。RAM の状態は数値を、画像は周囲の様子を教えてくれます。
ステップ 2: 状況をつかむ
- 画面に会話やテキストが出ている → 先へ送る
- 戦闘中 → 戦うか逃げる
- 手持ちが傷ついている → ポケモンセンターへ向かう
- 目的地が近い → 慎重に進む
ステップ 3: 決める
優先順位: 会話 > 戦闘 > 回復 > ストーリー上の目標 > 育成 > 探索
ステップ 4: 動かす — 一度に 2〜4 歩まで、そのつど確認
POST /action には短い行動リストを渡します(10〜15 個ではなく 2〜4 個)。
ステップ 5: 確かめる — 移動のたびにスクリーンショット
スクリーンショットを撮り、vision_analyze で狙いどおりの場所に動けたか確かめます。 ここがいちばん大事な手順です。画像を見ないと必ず迷子になります。
ステップ 6: 進み具合を PKM: 接頭辞でメモリに記録する
ステップ 7: ときどきセーブする
操作の一覧
- press_a — 決定、話しかける、選ぶ
- press_b — キャンセル、メニューを閉じる
- press_start — ゲーム内メニューを開く
- walk_up/down/left/right — 1 マス動く
- hold_b_N — B を N フレーム押し続ける(テキストを早送りするのに使います)
- wait_60 — 約 1 秒待つ(60 フレーム)
- a_until_dialog_end — 会話が終わるまで A を押し続ける
実際に遊んでわかったコツ
画像は常に確認する
- 2〜4 歩動くごとにスクリーンショットを撮ります
- RAM の状態からは位置と HP はわかりますが、周りに何があるかはわかりません
- 段差、柵、看板、建物の入口、NPC は、スクリーンショットでしか見えません
- 画像を見るモデルには具体的に尋ねます。「自分の 1 マス北には何がありますか」のように
- 行き詰まったら、適当な方向に動く前に必ずスクリーンショットを撮ります
ワープの前後は余分に待つ
扉や階段を通るとき、マップの切り替え中は画面が暗転します。 これが終わるまで必ず待ってください。扉や階段のワープのあとには wait_60 を 2〜3 回入れます。待たないと位置の値が古いままになり、 まだ前のマップにいると勘違いします。
建物から出たときの落とし穴
建物から出ると、扉の真ん前に立った状態になります。 そのまま北へ歩くと、また中へ戻ってしまいます。まず左右どちらかへ 2 マス横に動いてから、行きたい方向へ進んでください。
会話の進め方
第 1 世代のテキストは 1 文字ずつゆっくり流れます。会話を早送りするには、 B を 120 フレーム押し続けてから A を押します。必要なだけ繰り返します。B を 押し続けるとテキストが最速で表示され、そのあと A で次の行へ進みます。 a_until_dialog_end は RAM の会話フラグを見ますが、このフラグは すべてのテキスト状態を拾えるわけではありません。会話が進まないように見えたら、 手動の hold_b + press_a のやり方に切り替え、スクリーンショットで確かめてください。
段差は一方通行
段差(小さな崖のふち)は下(南)へ飛び降りることしかできず、上(北)へは 登れません。北へ進みたいのに段差でふさがれているときは、左右へ動いて 迂回できる隙間を探します。どちらに隙間があるかは画像で確かめます。 画像を見るモデルにはっきり尋ねてください。
移動のしかた
- 一度に 2〜4 歩動かし、そのつどスクリーンショットで位置を確かめます
- 新しいエリアに入ったら、すぐにスクリーンショットを撮って状況をつかみます
- 画像を見るモデルに「[目的地] はどちらの方向ですか」と尋ねます
- 3 回以上行き詰まったら、スクリーンショットを撮って一から考え直します
- 10〜15 回分の移動をまとめて送ってはいけません。行き過ぎたり、はまったりします
野生ポケモンから逃げる
戦闘メニューの「にげる」は右下にあります。既定のカーソル位置(左上の「たたかう」) から移動するには、下、右の順に押してカーソルを「にげる」へ合わせ、A を押します。 テキストや演出を飛ばすため、hold_b で挟んでください。
戦う(たたかう)
戦闘メニューの「たたかう」は左上(既定のカーソル位置)にあります。 A で技の選択に入り、もう一度 A で 1 つ目の技を使います。 そのあと B を押し続けて、攻撃の演出とテキストを飛ばします。
戦い方
判断の流れ
- 捕まえたい → 弱らせてからモンスターボールを投げる
- いらない野生ポケモン → にげる
- タイプ相性で有利 → 効果抜群の技を使う
- 相性で有利でない → いちばん強い、タイプ一致の技を使う
- HP が少ない → 交代するか、きずぐすりを使う
第 1 世代のタイプ相性(主なところ)
- みずは ほのお、じめん、いわ に強い
- ほのおは くさ、むし、こおり に強い
- くさは みず、じめん、いわ に強い
- でんきは みず、ひこう に強い
- じめんは ほのお、でんき、いわ、どく に強い
- エスパーは かくとう、どく に強い(第 1 世代では圧倒的です)
第 1 世代ならではの癖
- とくしゅの値が、特殊技の攻撃側と防御側の両方を兼ねます
- エスパータイプが強すぎます(ゴーストの技に不具合があります)
- 急所に当たるかどうかは、すばやさの値で決まります
- まきつく・しめつけるを受けると、相手は行動できません
- きあいだめの不具合: 急所率が上がるどころか下がります
メモリの書き方
| 接頭辞 | 用途 | 例 |
|---|---|---|
| PKM:OBJECTIVE | 今の目標 | トキワのフレンドリィショップで小包を受け取る |
| PKM:MAP | 道順の知識 | トキワシティ: ショップは北東 |
| PKM:STRATEGY | 戦闘・手持ちの方針 | カスミの前にくさタイプがほしい |
| PKM:PROGRESS | 進み具合 | ライバルに勝ち、トキワへ向かっている |
| PKM:STUCK | 行き詰まった状況 | y=28 の段差は右へ回り込む |
| PKM:TEAM | 手持ちのメモ | ゼニガメ Lv6、たいあたり + しっぽをふる |
ストーリーの節目
- 最初のポケモンを選ぶ
- トキワのフレンドリィショップから小包を届け、ポケモン図鑑を受け取る
- グレーバッジ — タケシ(いわ)→ みず / くさ を使う
- ブルーバッジ — カスミ(みず)→ くさ / でんき を使う
- オレンジバッジ — マチス(でんき)→ じめん を使う
- レインボーバッジ — エリカ(くさ)→ ほのお / こおり / ひこう を使う
- ピンクバッジ — キョウ(どく)→ じめん / エスパー を使う
- ゴールドバッジ — ナツメ(エスパー)→ いちばん手強いジムです
- マリンバッジ — カツラ(ほのお)→ みず / じめん を使う
- アースバッジ — サカキ(じめん)→ みず / くさ / こおり を使う
- 四天王 → チャンピオンへ
遊び終えるとき
- POST /save で、内容がわかる名前を付けてセーブします
- PKM:PROGRESS でメモリを更新します
- ユーザーにこう伝えます。「[名前] でセーブしました。続きは『ポケモンをやって』と言ってください」
- バックグラウンドで動いているサーバーとトンネルのプロセスを止めます
つまずきやすいところ
- ROM ファイルをダウンロードしたり提供したりしてはいけません
- 画像で確かめずに 4〜5 個を超える行動を送ってはいけません
- 建物から出たら、北へ進む前に必ず横へずれます
- 扉や階段のワープのあとには必ず wait_60 を 2〜3 回入れます
- RAM から会話を判定するのはあてになりません。スクリーンショットで確かめてください
- 危なそうな戦闘の前にはセーブします
- トンネルの URL は、立て直すたびに変わります