93 lines
7.7 KiB
Markdown
93 lines
7.7 KiB
Markdown
# ТЕХНИЧЕСКОЕ ЗАДАНИЕ ДЛЯ АВТОНОМНОГО АГЕНТА: 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.5–1.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.15–0.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. Структура проекта
|
||
|
||
```text
|
||
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
|
||
``` |