Files
DirtyLeague_Bot/concept.md

7.7 KiB
Raw Permalink Blame History

ТЕХНИЧЕСКОЕ ЗАДАНИЕ ДЛЯ АВТОНОМНОГО АГЕНТА: UI State Machine Bot для Unity

1. Цель проекта

Разработать легковесного локального Python-бота на базе конечного автомата (FSM), который управляет поведением в игре на Unity (ОС Windows 10). Бот не должен вычислять игровые ходы. Его задача — контролировать экраны игры, отслеживать статистику матчей, принудительно сдаваться при достижении лимита побед (для контроля MMR/рейтинга) и перезапускать матчи.


2. Стек технологий

  • Python: 3.10+
  • Захват окна / Ввод: pyautogui, pydirectinput (для надежного клика в Unity), win32gui, ctypes
  • Компьютерное зрение: opencv-python, pillow
  • Распознавание текста (опционально при динамическом счетчике): pytesseract или easyocr
  • Безопасность: keyboard (глобальный аварийный выключатель / Kill Switch)

3. Архитектура состояний (FSM)

Бот должен опрашивать состояние игры раз в 0.51.0 сек и находиться в одном из состояний:

  1. TOWER_LOBBY:

    • Считывание трофеев через Windows Native OCR (сравнение с верхним/нижним порогом лиги).
    • Проверка прогресса большого сундука с коронами (read_crown_chest, счетчик #/# 👑). При достижении 5/5 выполняется клик по сундуку для перехода на экран открытия.
    • Сканирование 4 слотов нижних сундуков (BOTTOM_CHESTS). Если есть слот OPEN -> клик по слоту для открытия и забора наград.
    • Если готовых сундуков нет -> клик по кнопке FIGHT. Переход в IN_GAME.
  2. IN_GAME (Экран боя):

    • FORCED DERANK (Сверхбыстрая капитуляция):
      • Сразу после клика FIGHT в лобби запускается высокочастотный конвейер fast_surrender_pipeline (опрос ROI каждые 20 мс).
      • В первую же миллисекунду после завершения загрузки боя нажимается Exit (btn_exit.png) через click_client_pos_fast (без задержек).
      • Мгновенно опрашивается диалог подтверждения Leave (btn_leave.png) и нажимается подтверждение.
      • Полный цикл сдачи занимает < 0.150.2 сек от появления экрана боя, исключая случайную победу автобоя.
    • NORMAL PLAY:
      • Ожидание естественного исхода боя (автобой побеждает или терпит поражение).
      • Бот не вмешивается и ожидает VICTORY_SCREEN или DEFEAT_SCREEN.
  3. VICTORY_SCREEN:

    • Зафиксировать: current_wins += 1, total_games += 1.
    • Записать лог: [WIN] Серия побед: {current_wins}/{max_wins_limit}.
    • Нажать кнопку Collect (btn_collect_victory.png).
    • Если были свободные ячейки (VACANT) -> переход в TOWER_LOBBY.
    • Если свободных ячеек не было -> переход в NO_FREE_SLOTS_SCREEN.
  4. DEFEAT_SCREEN:

    • Зафиксировать: current_wins = 0 (сброс серии), total_games += 1.
    • Записать лог: [LOSS] Серия сброшена. Всего игр: {total_games}.
    • Нажать кнопку Ok (btn_ok.png). Переход в TOWER_LOBBY.
  5. CHEST_OPEN_SCREEN (Экран открытия сундуков - нижних и сундука побед с коронами):

    • Срабатывает при клике по готовому сундуку (OPEN) или сундуку с коронами (5/5 👑).
    • Шаг 1: Нажать «Turn all cards over» (btn_turn_all_cards.png). Ожидание анимации переворота карт.
    • Шаг 2: Нажать «Collect» (btn_collect.png). Забор наград и возврат в TOWER_LOBBY.
  6. NO_FREE_SLOTS_SCREEN:

    • Появляется после нажатия Collect при отсутствии свободных ячеек сундуков ("You have no slot available for this chest").
    • Опция Open chest (btn_open_chest.png) обнаруживается ботом (задел на будущее).
    • Нажимается кнопка Remove chest (btn_remove_chest.png) для сброса лишнего сундука и возврата в TOWER_LOBBY.
  7. GLOBAL MODAL / SPECIAL OFFER (Заглушка):

    • Всплывающее рекламное предложение покупки, появляющееся рандомно или после наград.
    • Проверяется глобально на каждом шаге цикла FSM (check_and_dismiss_offer_popup).
    • При обнаружении нажимается кнопка закрытия X (btn_close.png).

4. Структура проекта

game_bot/
├── assets/
│   ├── btn_fight.png         # Кнопка старта боя в лобби
│   ├── btn_exit.png          # Кнопка выхода во время боя
│   ├── btn_leave.png         # Кнопка подтверждения выхода (Leave)
│   ├── btn_ok.png            # Кнопка OK на экране поражения
│   ├── btn_close.png         # Кнопка X закрытия рекламных предложений
│   ├── text_defeat.png       # Маркер экрана поражения
│   ├── banner_victory.png    # Маркер экрана победы (баннер)
│   ├── text_victory.png      # Маркер экрана победы (текст)
│   ├── btn_collect_victory.png # Кнопка Collect на экране победы
│   ├── btn_remove_chest.png  # Кнопка Remove chest при отсутствии слотов
│   ├── btn_open_chest.png    # Кнопка Open chest при отсутствии слотов
│   ├── status_open.png       # Маркер готового к открытию сундука
│   ├── status_vacant.png     # Маркер пустого слота сундука
│   ├── btn_turn_all_cards.png# Кнопка открытия всех карт в сундуке
│   └── btn_collect.png       # Кнопка сбора наград сундука
├── config.json               # Конфигурация лимитов и задержек
├── window_utils.py           # Фокусировка и нормализация окна Unity
├── ocr_utils.py              # OCR чтение трофеев (рейтинга)
├── bot_core.py               # Реализация FSM, логики кликов и проверки заглушек
├── calibrate_tool.py         # Утилита для нарезки шаблонов и проверки ROI
└── run.py                    # Точка входа с Kill Switch