# フェアモード

> ゲームに注入したクライアントはマップ全体を読めます。フェアモードでは、Bot に見えるのは視界内のものだけになります。人間のプレイヤーと同じで、アリーナのルールとも一致します。

出典: https://war3ai.com/ja/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)          # またはランナーに任せる
```

## フィルタリングされるもの

| 内容 | フェアモードでは |
|---|---|
| ユニット | 自軍のすべて + 現在自軍から見えている敵と中立ユニット |
| 地面のアイテム | 自軍ユニットの視界内のものだけ（昼 / 夜の視界はデータ表に従ってそれぞれ計算） |
| 生産表 | 見えている建物のものだけ（相手が何を訓練しているかは見えない） |
| イベント | 自分のもの。見えている（または 1 秒以内に見えていた）もの。自軍が与えたダメージ |

## 視界の出どころ

- スナップショットの各ユニットには**可視性マスク**があります。第 p ビット = プレイヤー p が今そのユニットを見ている（フィールドにユニットがいる 0 〜 11 番のみ対象。自分のユニットは自分から常に見える）。`u.visible_to(g.me())` はこれを直接読むので、待ち時間はゼロです。
- 任意の地点：`g.visible(x, y)` でエンジンに問い合わせます（見える / 霧 / ブラックマスク）。ファストレーン経由で、1 回あたり約 1 フレームです。1 ティックで多くのユニットを判定するときは、`g.visible()` を 1 件ずつ呼ばずに、スナップショットの `u.visible_to()` を使ってください。

## 敵の記憶：`last_seen`

人間のプレイヤーは「さっきあそこでレイダーの一団を見た」と覚えています。SDK も代わりに記憶します。スナップショットを更新するたびに、その時点で自軍から見えている敵とクリープのユニットを記録します（最後の位置、HP、時刻）。死ぬのを見たら削除し、ゲームが変わればクリアします。

```python
for u, t, age in g.last_seen(max_age=60):         # 60 ゲーム秒以内に見た敵
    print(u.type, u.x, u.y, f"{age:.0f}s 前")

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)`）を指定すると、Bot は N 番プレイヤーとして指揮し、N 番プレイヤーのユニットだけを操作できます。2 つの AI を対戦させるには、同じゲームでこのチャネルを 2 本開きます。

> **ローカルモードでの公平性は取り決めであり、セキュリティ境界ではありません**
>
> 自分のマシン上では、プログラムがマップ全体を読むのを防ぐ手段はありません。`--fair` はあなた自身への制約です。本当の対戦での公平性は [アリーナ](https://war3ai.com/ja/arena/) のレフェリープロセスが保証します。Bot は共有メモリに一切触れられず、レフェリーが視界でフィルタリングした観測だけを受け取り、アクションを提出することしかできません。各アクションは先にユニットの所有権がチェックされます。

## 今すぐ有効にすべき理由

- 将来アリーナに出るときのルールはこれです。今からフェアモードで書いておけば、そのときに 1 行も変更する必要はありません。
- マップ全体の情報を手放して初めて、Bot の本当の実力がわかります（リファレンスブレインは現在、コンピューターの隊長の目標地点など、マップ全体の情報に大きく依存しています。これはちょうどよい試金石になります）。
- フェアモードで書いた偵察、記憶、判断こそが、本当に価値のある AI の能力です。
