# Честный режим

> Клиент с внедрённым рантаймом видит всю карту. Честный режим оставляет боту только то, что в пределах обзора, — как у живого игрока и как по правилам Арены.

Источник: https://war3ai.com/ru/docs/fair-mode/

Возможности наблюдения в этом проекте держатся на том, что «клиент хранит состояние всех игроков»: в снимке есть все юниты карты, включая врагов в тумане войны. Для отладки это удобно, но для соревнований нечестно.

**Честный режим** заставляет SDK фильтровать данные по вашему обзору:

```bash
python tools/play.py --bot my_bot.py --fair
python -m openwar3 run my_bot.py --inst 5 --fair
```

```python
from openwar3 import Game, run
g = Game(inst=5, fair=True)            # напрямую через Game
run(MyBot, inst=5, fair=True)          # или через раннер
```

## Что фильтруется

| Данные | В честном режиме |
|---|---|
| Юниты | Все свои + вражеские и нейтральные, которые мы видим прямо сейчас |
| Предметы на земле | Только в пределах обзора наших юнитов (дневной и ночной обзор считаются отдельно по таблицам данных) |
| Таблица производства | Только видимые здания (что тренирует соперник, не видно) |
| События | Свои; видимые (или бывшие видимыми в течение последней секунды); урон, нанесённый нами |

## Откуда берётся обзор

- В снимке у каждого юнита есть **маска видимости**: бит p = игрок p видит его прямо сейчас (учитываются только игроки 0 ~ 11 с юнитами на карте; свои юниты для себя видимы всегда). `u.visible_to(g.me())` читает её напрямую, без ожидания.
- Произвольная точка: `g.visible(x, y)` спрашивает движок (видно / туман войны / чёрная маска) через быструю полосу, около кадра на вызов. Когда за тик нужно проверить много юнитов, используйте `u.visible_to()` из снимка, а не вызывайте `g.visible()` для каждого.

## Память о врагах: `last_seen`

Живой игрок помнит: «только что вон там была пачка налётчиков». SDK помнит за вас: при каждом обновлении снимка он записывает вражеских юнитов и крипов, которых мы видим в этот момент (последнюю позицию, здоровье, время); если видел их гибель — удаляет, при смене матча — очищает.

```python
for u, t, age in g.last_seen(max_age=60):         # враги, замеченные за последние 60 игровых секунд
    print(u.type, u.x, u.y, f"{age:.0f} с назад")

heroes = [r for r in g.last_seen() if r[0].is_hero]   # где последний раз видели вражеских героев
camps  = g.last_seen(owner="creep")                   # замеченные крипы
```

В честном режиме это ваш единственный «источник сведений о сопернике» — как у живого игрока. Обычный режим тоже запоминает по обзору, так что код можно использовать один и тот же.

## От имени какого игрока командовать

```bash
python tools/play.py --bot my_bot.py --player 1 --attach
```

`--player N` (или `Game(player=N)`) позволяет боту командовать от имени игрока N — и только юнитами игрока N. Бой двух ИИ — это два таких канала в одном матче.

> **В локальном режиме честность — договорённость, а не граница безопасности**
>
> На вашем компьютере ничем нельзя помешать программе читать всю карту. `--fair` — ограничение, которое вы накладываете на себя сами; настоящие соревнования обеспечивает процесс-судья [Арены](https://war3ai.com/ru/arena/): бот никогда не касается общей памяти, получает только наблюдения, отфильтрованные судьёй по обзору, может лишь отправлять действия, и у каждого действия сначала проверяется, кому принадлежит юнит.

## Почему стоит включить его уже сейчас

- На Арене правила будут именно такими: пишите под честный режим сейчас — и потом не придётся менять ни строчки;
- Только без информации обо всей карте становится ясно, насколько хорош ваш бот на самом деле (эталонный мозг сейчас сильно опирается на информацию обо всей карте, например на целевую точку компьютерного капитана, — это как раз хорошая проверка);
- Разведка, память и оценка обстановки, написанные под честный режим, — вот по-настоящему ценные способности ИИ.
