ドキュメント コアコンセプト

フェアモード

ゲームに注入したクライアントはマップ全体を読めます。フェアモードでは、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 の能力です。