Files
DirtyLeague_Bot/concept.md

93 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ТЕХНИЧЕСКОЕ ЗАДАНИЕ ДЛЯ АВТОНОМНОГО АГЕНТА: 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. Структура проекта
```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
```