フェアモード
ゲームに注入したクライアントはマップ全体を読めます。フェアモードでは、Bot に見えるのは視界内のものだけになります。人間のプレイヤーと同じで、アリーナのルールとも一致します。
このプロジェクトの観測能力は「クライアントが全プレイヤーの状態を保持している」ことに由来します。スナップショットには、霧の中の敵を含め、マップ全体のすべてのユニットが入っています。デバッグには便利ですが、対戦では公平ではありません。
フェアモードでは、SDK があなたの視界に基づいてフィルタリングします。
python tools/play.py --bot my_bot.py --fair
python -m openwar3 run my_bot.py --inst 5 --fair
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、時刻)。死ぬのを見たら削除し、ゲームが変わればクリアします。
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") # 見たことのあるクリープ
フェアモードでは、これが唯一の「相手の情報源」です。人間のプレイヤーと同じです。通常モードでも視界に基づいて記録するので、同じコードをそのまま使えます。
何番プレイヤーとして指揮するか
python tools/play.py --bot my_bot.py --player 1 --attach
--player N(または Game(player=N))を指定すると、Bot は N 番プレイヤーとして指揮し、N 番プレイヤーのユニットだけを操作できます。2 つの AI を対戦させるには、同じゲームでこのチャネルを 2 本開きます。
ローカルモードでの公平性は取り決めであり、セキュリティ境界ではありません
自分のマシン上では、プログラムがマップ全体を読むのを防ぐ手段はありません。--fair はあなた自身への制約です。本当の対戦での公平性は アリーナ のレフェリープロセスが保証します。Bot は共有メモリに一切触れられず、レフェリーが視界でフィルタリングした観測だけを受け取り、アクションを提出することしかできません。各アクションは先にユニットの所有権がチェックされます。
今すぐ有効にすべき理由
- 将来アリーナに出るときのルールはこれです。今からフェアモードで書いておけば、そのときに 1 行も変更する必要はありません。
- マップ全体の情報を手放して初めて、Bot の本当の実力がわかります(リファレンスブレインは現在、コンピューターの隊長の目標地点など、マップ全体の情報に大きく依存しています。これはちょうどよい試金石になります)。
- フェアモードで書いた偵察、記憶、判断こそが、本当に価値のある AI の能力です。