Pokemon Player
Игра в Pokemon через headless-эмулятор + чтение RAM.
Метаданные навыка
| Источник | Опционально — установка через vibeos skills install official/gaming/pokemon-player |
| Путь | optional-skills/gaming/pokemon-player |
| Платформы | linux, macos, windows |
Справочник: полный SKILL.md
Ниже приведено полное описание навыка, которое VibeOS загружает при его активации. Агент видит эти инструкции, когда навык активен.
Pokemon Player
Игра в Pokemon через headless-эмуляцию с использованием пакета pokemon-agent.
Когда использовать
- Пользователь говорит «play pokemon», «start pokemon», «pokemon game»
- Пользователь спрашивает о Pokemon Red, Blue, Yellow, FireRed и т.д.
- Пользователь хочет посмотреть, как ИИ играет в Pokemon
- Пользователь упоминает файл ROM (.gb, .gbc, .gba)
Процедура запуска
1. Первоначальная настройка (клонирование, venv, установка)
Репозиторий — NousResearch/pokemon-agent на GitHub. Клонируйте его, затем настройте виртуальное окружение Python 3.10+. Используйте uv (предпочтительно для скорости) для создания venv и установки пакета в редактируемом режиме с дополнением pyboy. Если uv недоступен, используйте python3 -m venv + pip.
На этой машине он уже настроен в /home/teknium/pokemon-agent с готовым venv — просто перейдите туда и выполните source .venv/bin/activate.
Вам также понадобится файл ROM. Запросите его у пользователя. На этой машине один находится в roms/pokemon_red.gb внутри этой директории. НИКОГДА не загружайте и не предоставляйте файлы ROM — всегда спрашивайте пользователя.
2. Запуск игрового сервера
Из директории pokemon-agent с активированным venv выполните pokemon-agent serve с --rom, указывающим на ROM, и --port 9876. Запустите его в фоне с помощью &. Чтобы возобновить сохранённую игру, добавьте --load-state с именем сохранения. Подождите 4 секунды для запуска, затем проверьте с помощью GET /health.
3. Настройка прямой трансляции для пользователя
Используйте обратный SSH-туннель через localhost.run, чтобы пользователь мог просматривать панель управления в своём браузере. Подключитесь через ssh, перенаправив локальный порт 9876 на удалённый порт 80 на nokey@localhost.run. Перенаправьте вывод в файл журнала, подождите 10 секунд, затем найдите в журнале URL с .lhr.life. Предоставьте пользователю URL с добавлением /dashboard/. 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: ОРИЕНТАЦИЯ
- Диалог/текст на экране → продвигайте его
- В битве → сражайтесь или убегайте
- Команда ранена → направляйтесь в Pokemon Center
- Рядом с целью → двигайтесь осторожно
Шаг 3: РЕШЕНИЕ
Приоритет: диалог > битва > лечение > сюжетная цель > тренировка > исследование
Шаг 4: ДЕЙСТВИЕ — двигайтесь максимум на 2-4 шага, затем проверьте снова
POST /action с КОРОТКИМ списком действий (2-4 действия, не 10-15).
Шаг 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 сообщает позицию и HP, но НЕ то, что вокруг вас
- Уступы, заборы, знаки, двери зданий, NPC — видны только на скриншоте
- Задавайте модели зрения конкретные вопросы: «что находится на одну клетку к северу от меня?»
- Когда застряли, всегда делайте скриншот перед попыткой случайных направлений
Переходы через варпы требуют дополнительного времени ожидания
При проходе через дверь или лестницу экран гаснет во время перехода между картами. Вы ОБЯЗАТЕЛЬНО должны дождаться его завершения. Добавьте 2-3 wait_60 действия после любого варпа через дверь/лестницу. Без ожидания позиция считывается как устаревшая, и вы будете думать, что всё ещё находитесь на старой карте.
Ловушка при выходе из здания
Когда вы выходите из здания, вы появляетесь прямо ПЕРЕД дверью. Если вы пойдёте на север, вы вернётесь обратно внутрь. ВСЕГДА сначала сделайте шаг в сторону, пройдя на 2 клетки влево или вправо, затем продолжайте движение в нужном направлении.
Обработка диалогов
В первом поколении текст прокручивается медленно, буква за буквой. Чтобы ускорить диалог, удерживайте B в течение 120 кадров, затем нажмите A. Повторяйте по необходимости. Удержание B заставляет текст отображаться с максимальной скоростью. Затем нажмите A, чтобы перейти к следующей строке. Действие a_until_dialog_end проверяет флаг диалога в RAM, но этот флаг не перехватывает ВСЕ текстовые состояния. Если диалог кажется зависшим, используйте ручной шаблон hold_b + press_a и проверяйте через скриншот.
Уступы — односторонние
Уступы (небольшие обрывы) можно только спрыгивать ВНИЗ (на юг), но никогда не забираться ВВЕРХ (на север). Если путь на север заблокирован уступом, вам нужно пойти влево или вправо, чтобы найти обход. Используйте зрение, чтобы определить, в каком направлении находится проход. Спрашивайте модель зрения явно.
Стратегия навигации
- Двигайтесь по 2-4 шага за раз, затем делайте скриншот для проверки позиции
- При входе в новую область сразу делайте скриншот для ориентации
- Спрашивайте модель зрения «в каком направлении [пункт назначения]?»
- Если застряли на 3+ попытках, сделайте скриншот и полностью переоцените ситуацию
- Не спамьте 10-15 движений — вы промахнётесь или застрянете
Побег из диких битв
В меню битвы RUN (ПОБЕГ) находится в правом нижнем углу. Чтобы добраться до него из позиции курсора по умолчанию (FIGHT (БИТЬСЯ), верхний левый угол): нажмите вниз, затем вправо, чтобы переместить курсор на RUN, затем нажмите A. Оберните удержанием B для ускорения текста/анимаций.
Битва (FIGHT)
В меню битвы FIGHT находится в верхнем левом углу (позиция курсора по умолчанию). Нажмите A для входа в выбор атаки, снова A для использования первой атаки. Затем удерживайте B для ускорения анимаций атак и текста.
Стратегия битвы
Дерево решений
- Хотите поймать? → Ослабьте, затем бросьте Poke Ball
- Дикий покемон не нужен? → RUN (ПОБЕГ)
- Есть преимущество по типу? → Используйте суперэффективную атаку
- Нет преимущества? → Используйте сильнейшую STAB-атаку
- Мало HP? → Смените покемона или используйте Potion
Таблица типов первого поколения (ключевые соответствия)
- Water (Вода) побеждает Fire (Огонь), Ground (Земля), Rock (Камень)
- Fire (Огонь) побеждает Grass (Трава), Bug (Насекомое), Ice (Лёд)
- Grass (Трава) побеждает Water (Вода), Ground (Земля), Rock (Камень)
- Electric (Электричество) побеждает Water (Вода), Flying (Птица)
- Ground (Земля) побеждает Fire (Огонь), Electric (Электричество), Rock (Камень), Poison (Яд)
- Psychic (Психика) побеждает Fighting (Бой), Poison (Яд) (доминирует в первом поколении!)
Особенности первого поколения
- Статистика Special (Спец.) = одновременно и атака, и защита для специальных атак
- Тип Psychic (Психика) слишком силён (атаки Ghost (Призрак) с багами)
- Критические удары зависят от статистики Speed (Скорость)
- Wrap (Объятие)/Bind (Связывание) не дают противнику действовать
- Баг Focus Energy (Фокус Энергии): СНИЖАЕТ шанс крита вместо повышения
Соглашения о памяти
| Префикс | Назначение | Пример |
|---|---|---|
| PKM:OBJECTIVE | Текущая цель | Получить посылку из Viridian Mart |
| PKM:MAP | Навигационные знания | Viridian: март на северо-востоке |
| PKM:STRATEGY | Планы битв/команды | Нужен Grass-тип перед Misty |
| PKM:PROGRESS | Отслеживание этапов | Победил соперника, направляюсь в Viridian |
| PKM:STUCK | Ситуации застревания | Уступ на y=28, обойти справа |
| PKM:TEAM | Заметки о команде | Squirtle Lv6, Tackle + Tail Whip |
Этапы прохождения
- Выбор стартового покемона
- Доставка посылки из Viridian Mart, получение Pokedex
- Boulder Badge — Brock (Rock) → используйте Water/Grass
- Cascade Badge — Misty (Water) → используйте Grass/Electric
- Thunder Badge — Lt. Surge (Electric) → используйте Ground
- Rainbow Badge — Erika (Grass) → используйте Fire/Ice/Flying
- Soul Badge — Koga (Poison) → используйте Ground/Psychic
- Marsh Badge — Sabrina (Psychic) → самый сложный зал
- Volcano Badge — Blaine (Fire) → используйте Water/Ground
- Earth Badge — Giovanni (Ground) → используйте Water/Grass/Ice
- Elite Four — Чемпион!
Остановка игры
- Сохраните игру с описательным именем через POST /save
- Обновите память с PKM:PROGRESS
- Сообщите пользователю: «Игра сохранена как [имя]! Скажите 'play pokemon', чтобы продолжить.»
- Завершите фоновые процессы сервера и туннеля
Подводные камни
- НИКОГДА не загружайте и не предоставляйте файлы ROM
- Не отправляйте более 4-5 действий без проверки зрения
- Всегда делайте шаг в сторону после выхода из зданий перед движением на север
- Всегда добавляйте wait_60 x2-3 после варпов через двери/лестницы
- Обнаружение диалога через RAM ненадёжно — проверяйте скриншотами
- Сохраняйтесь ПЕРЕД рискованными встречами
- URL туннеля меняется каждый раз при его перезапуске