---
title: "Pokemon Player — ヘッドレスのエミュレーターと RAM 読み取りでポケモンを遊ぶ"
description: "ヘッドレスのエミュレーターと RAM 読み取りでポケモンを遊ぶ"
upstream_path: user-guide/skills/optional/gaming/gaming-pokemon-player.md
upstream_blob: 3a98d97a751da22200b75499416753a3e505d587
sources:
  - https://hermes-agent.nousresearch.com/docs/user-guide/skills/optional/gaming/gaming-pokemon-player
---

# Pokemon Player {#pokemon-player}

ヘッドレスのエミュレーターと RAM 読み取りでポケモンを遊びます。

## skill の情報 {#skill-metadata}

| | |
|---|---|
| 提供元 | 追加 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 全文 {#reference-full-skillmd}

:::info
以下は、この skill が呼び出されたときに Hermes が読み込む skill 定義の全文です。skill が有効なあいだ、エージェントはこれを指示として受け取ります。
:::

# Pokemon Player {#pokemon-player}

`pokemon-agent` パッケージを使い、ヘッドレスのエミュレーションでポケモンを遊びます。

## こんなときに使います {#when-to-use}
- 「ポケモンをやって」「ポケモンを始めて」「ポケモンのゲーム」と言われたとき
- ポケモン赤・緑・青・ピカチュウ・ファイアレッドなどについて聞かれたとき
- AI がポケモンを遊ぶところを見たいと言われたとき
- ROM ファイル（.gb、.gbc、.gba）に言及があったとき

## 起動の手順 {#startup-procedure}

### 1. 初回の準備（クローン、venv、インストール） {#1-first-time-setup-clone-venv-install}
リポジトリは 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. ゲームサーバーを起動する {#2-start-the-game-server}
venv を有効にした状態で pokemon-agent ディレクトリに入り、
pokemon-agent serve を実行します。--rom に ROM のパスを、--port に 9876 を指定します。
& を付けてバックグラウンドで動かします。
セーブデータから再開するときは --load-state にセーブ名を付けます。
起動を 4 秒待ってから、GET /health で立ち上がりを確かめます。

### 3. ユーザーが観戦できるダッシュボードを用意する {#3-set-up-live-dashboard-for-user-to-watch}
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 を伝えてください。

## セーブとロード {#save-and-load}

### セーブする場面 {#when-to-save}
- 15〜20 ターン遊ぶごとに
- ジムリーダー戦、ライバル戦、危なそうな戦闘の前には必ず
- 新しい町やダンジョンに入る前に
- 結果に自信がない行動を取る前に

### セーブのしかた {#how-to-save}
POST /save に、内容がわかる名前を付けて送ります。よい例はこうです。
before_brock、route1_start、mt_moon_entrance、got_cut

### ロードのしかた {#how-to-load}
POST /load にセーブ名を付けて送ります。

### セーブの一覧を見る {#list-available-saves}
GET /saves で保存済みの状態がすべて返ります。

### サーバー起動時に読み込む {#loading-on-server-startup}
サーバーの起動時に --load-state フラグを付けると、セーブを自動で読み込めます。
起動後に API でロードするより速く済みます。

## プレイのループ {#the-gameplay-loop}

### ステップ 1: 見る — 状態の確認とスクリーンショットの両方 {#step-1-observe-check-state-and-take-a-screenshot}
GET /state で位置、HP、戦闘中かどうか、会話中かどうかを取ります。
GET /screenshot で画像を取り、/tmp/pokemon.png に保存してから vision_analyze にかけます。
必ず両方やってください。RAM の状態は数値を、画像は周囲の様子を教えてくれます。

### ステップ 2: 状況をつかむ {#step-2-orient}
- 画面に会話やテキストが出ている → 先へ送る
- 戦闘中 → 戦うか逃げる
- 手持ちが傷ついている → ポケモンセンターへ向かう
- 目的地が近い → 慎重に進む

### ステップ 3: 決める {#step-3-decide}
優先順位: 会話 > 戦闘 > 回復 > ストーリー上の目標 > 育成 > 探索

### ステップ 4: 動かす — 一度に 2〜4 歩まで、そのつど確認 {#step-4-act-move-2-4-steps-max-then-re-check}
POST /action には短い行動リストを渡します（10〜15 個ではなく 2〜4 個）。

### ステップ 5: 確かめる — 移動のたびにスクリーンショット {#step-5-verify-screenshot-after-every-move-sequence}
スクリーンショットを撮り、vision_analyze で狙いどおりの場所に動けたか確かめます。
ここがいちばん大事な手順です。画像を見ないと必ず迷子になります。

### ステップ 6: 進み具合を PKM: 接頭辞でメモリに記録する {#step-6-record-progress-to-memory-with-pkm-prefix}

### ステップ 7: ときどきセーブする {#step-7-save-periodically}

## 操作の一覧 {#action-reference}
- 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 を押し続ける

## 実際に遊んでわかったコツ {#critical-tips-from-experience}

### 画像は常に確認する {#use-vision-constantly}
- 2〜4 歩動くごとにスクリーンショットを撮ります
- RAM の状態からは位置と HP はわかりますが、周りに何があるかはわかりません
- 段差、柵、看板、建物の入口、NPC は、スクリーンショットでしか見えません
- 画像を見るモデルには具体的に尋ねます。「自分の 1 マス北には何がありますか」のように
- 行き詰まったら、適当な方向に動く前に必ずスクリーンショットを撮ります

### ワープの前後は余分に待つ {#warp-transitions-need-extra-wait-time}
扉や階段を通るとき、マップの切り替え中は画面が暗転します。
これが終わるまで必ず待ってください。扉や階段のワープのあとには
wait_60 を 2〜3 回入れます。待たないと位置の値が古いままになり、
まだ前のマップにいると勘違いします。

### 建物から出たときの落とし穴 {#building-exit-trap}
建物から出ると、扉の真ん前に立った状態になります。
そのまま北へ歩くと、また中へ戻ってしまいます。まず左右どちらかへ
2 マス横に動いてから、行きたい方向へ進んでください。

### 会話の進め方 {#dialog-handling}
第 1 世代のテキストは 1 文字ずつゆっくり流れます。会話を早送りするには、
B を 120 フレーム押し続けてから A を押します。必要なだけ繰り返します。B を
押し続けるとテキストが最速で表示され、そのあと A で次の行へ進みます。
a_until_dialog_end は RAM の会話フラグを見ますが、このフラグは
すべてのテキスト状態を拾えるわけではありません。会話が進まないように見えたら、
手動の hold_b + press_a のやり方に切り替え、スクリーンショットで確かめてください。

### 段差は一方通行 {#ledges-are-one-way}
段差（小さな崖のふち）は下（南）へ飛び降りることしかできず、上（北）へは
登れません。北へ進みたいのに段差でふさがれているときは、左右へ動いて
迂回できる隙間を探します。どちらに隙間があるかは画像で確かめます。
画像を見るモデルにはっきり尋ねてください。

### 移動のしかた {#navigation-strategy}
- 一度に 2〜4 歩動かし、そのつどスクリーンショットで位置を確かめます
- 新しいエリアに入ったら、すぐにスクリーンショットを撮って状況をつかみます
- 画像を見るモデルに「[目的地] はどちらの方向ですか」と尋ねます
- 3 回以上行き詰まったら、スクリーンショットを撮って一から考え直します
- 10〜15 回分の移動をまとめて送ってはいけません。行き過ぎたり、はまったりします

### 野生ポケモンから逃げる {#running-from-wild-battles}
戦闘メニューの「にげる」は右下にあります。既定のカーソル位置（左上の「たたかう」）
から移動するには、下、右の順に押してカーソルを「にげる」へ合わせ、A を押します。
テキストや演出を飛ばすため、hold_b で挟んでください。

### 戦う（たたかう） {#battling-fight}
戦闘メニューの「たたかう」は左上（既定のカーソル位置）にあります。
A で技の選択に入り、もう一度 A で 1 つ目の技を使います。
そのあと B を押し続けて、攻撃の演出とテキストを飛ばします。

## 戦い方 {#battle-strategy}

### 判断の流れ {#decision-tree}
1. 捕まえたい → 弱らせてからモンスターボールを投げる
2. いらない野生ポケモン → にげる
3. タイプ相性で有利 → 効果抜群の技を使う
4. 相性で有利でない → いちばん強い、タイプ一致の技を使う
5. HP が少ない → 交代するか、きずぐすりを使う

### 第 1 世代のタイプ相性（主なところ） {#gen-1-type-chart-key-matchups}
- みずは ほのお、じめん、いわ に強い
- ほのおは くさ、むし、こおり に強い
- くさは みず、じめん、いわ に強い
- でんきは みず、ひこう に強い
- じめんは ほのお、でんき、いわ、どく に強い
- エスパーは かくとう、どく に強い（第 1 世代では圧倒的です）

### 第 1 世代ならではの癖 {#gen-1-quirks}
- とくしゅの値が、特殊技の攻撃側と防御側の両方を兼ねます
- エスパータイプが強すぎます（ゴーストの技に不具合があります）
- 急所に当たるかどうかは、すばやさの値で決まります
- まきつく・しめつけるを受けると、相手は行動できません
- きあいだめの不具合: 急所率が上がるどころか下がります

## メモリの書き方 {#memory-conventions}
| 接頭辞 | 用途 | 例 |
|--------|---------|---------|
| PKM:OBJECTIVE | 今の目標 | トキワのフレンドリィショップで小包を受け取る |
| PKM:MAP | 道順の知識 | トキワシティ: ショップは北東 |
| PKM:STRATEGY | 戦闘・手持ちの方針 | カスミの前にくさタイプがほしい |
| PKM:PROGRESS | 進み具合 | ライバルに勝ち、トキワへ向かっている |
| PKM:STUCK | 行き詰まった状況 | y=28 の段差は右へ回り込む |
| PKM:TEAM | 手持ちのメモ | ゼニガメ Lv6、たいあたり + しっぽをふる |

## ストーリーの節目 {#progression-milestones}
- 最初のポケモンを選ぶ
- トキワのフレンドリィショップから小包を届け、ポケモン図鑑を受け取る
- グレーバッジ — タケシ（いわ）→ みず / くさ を使う
- ブルーバッジ — カスミ（みず）→ くさ / でんき を使う
- オレンジバッジ — マチス（でんき）→ じめん を使う
- レインボーバッジ — エリカ（くさ）→ ほのお / こおり / ひこう を使う
- ピンクバッジ — キョウ（どく）→ じめん / エスパー を使う
- ゴールドバッジ — ナツメ（エスパー）→ いちばん手強いジムです
- マリンバッジ — カツラ（ほのお）→ みず / じめん を使う
- アースバッジ — サカキ（じめん）→ みず / くさ / こおり を使う
- 四天王 → チャンピオンへ

## 遊び終えるとき {#stopping-play}
1. POST /save で、内容がわかる名前を付けてセーブします
2. PKM:PROGRESS でメモリを更新します
3. ユーザーにこう伝えます。「[名前] でセーブしました。続きは『ポケモンをやって』と言ってください」
4. バックグラウンドで動いているサーバーとトンネルのプロセスを止めます

## つまずきやすいところ {#pitfalls}
- ROM ファイルをダウンロードしたり提供したりしてはいけません
- 画像で確かめずに 4〜5 個を超える行動を送ってはいけません
- 建物から出たら、北へ進む前に必ず横へずれます
- 扉や階段のワープのあとには必ず wait_60 を 2〜3 回入れます
- RAM から会話を判定するのはあてになりません。スクリーンショットで確かめてください
- 危なそうな戦闘の前にはセーブします
- トンネルの URL は、立て直すたびに変わります
