ドキュメント ツール

AI スキーム

1 つのスキームは 1 つの完全な AI です。Farsight でワンクリックで切り替えられ、対戦中のゲームでもすぐに別の AI が引き継げます。zip でエクスポートして共有し、他の人のスキームをインポートしてテストでき、スキームごとの戦績は自動で集計されます。

1 つのスキーム = 1 つの完全な AI:フォルダ 1 つ + マニフェスト scheme.json + コード。ゲームインスタンスごとにスキームを 1 つ選びます。Farsight でワンクリックで切り替えられ、対戦中のゲームでもすぐに別の AI が引き継げます。

他の人が共有したスキームをインポートすると別枠に入り、あなた自身のスキームとは互いに影響しません。変更したいときは「マイにコピー」します。

schemes/
  mine/<id>/          マイスキーム:自分で書いたもの、または他のスキームからコピーして改造したもの(自由に変更でき、次のゲームから反映)
  installed/<id>/     インストール済み:他の人が共有した zip をここに展開(初回実行前に信頼の確認が必要)
brains/xwar3/         組み込み:リファレンスブレイン(完全な AI)
brains/examples/      組み込み:4 つの学習用サンプル hello / rush / macro / micro、コンパニオンのサンプル buddy、2 つのゲームプレイ MOD(ヒーローローグライク、エンドレスディフェンス)

スキームは、あなたの代わりに戦う AI とは限りません。kind: mod のスキームはゲームのルール一式で、あなた自身がプレイし、スキームがお題を出します。ゲームプレイ MOD を参照してください。

Farsight で使う

「AI スキーム」ページ(左サイドバーの「システム → AI スキーム」):

操作内容
スキームをインポート(zip)installed/ にインストールします。同じ id がすでにインストール済みなら、置き換えるかどうかを確認します(置き換えたら信頼の確認をやり直す必要があります)
インスタンスに適用…インスタンスを選び、「すぐに反映」(現在の AI を停止し、新しいスキームがこのゲームを引き継ぐ)または「次のテスト開始から反映」を選びます
マイにコピーmine/ にコピーします。作者は「自分」、バージョンは 0.1.0 として記録し、どのスキームのどのバージョンからコピーしたかも記録します
zip をエクスポート<id>-<バージョン>.zip にまとめます。これを人に送れば共有になります
フォルダを開くエクスプローラーでスキームのディレクトリを開き、コードを直接編集します
信頼他の人のスキームは、初回実行前に必ずクリックする必要があります(後述の「信頼とセキュリティ」を参照)
最近の戦績このスキームの各ゲームの勝敗、時間、終了理由
削除削除できるのは「マイ」と「インストール済み」だけです。インスタンスが使用中のものは削除できません

インスタンスカードにも「AI スキーム」の行が加わりました:ドロップダウンでスキームを選ぶ →「切り替え(すぐに反映)」。インスタンスが実行されていないときはボタンが「選択」になり、次に「テスト開始」したときにそのスキームで AI を起動します。

マニフェスト scheme.json

{
  "format": 1,
  "id": "fast-rush",
  "name": "3 分ラッシュ",
  "version": "1.2.0",
  "author": "山田",
  "description": "この AI がどんな戦い方をするかを一言で",
  "entry": "rush_bot.py",
  "class": "RushBot",
  "fair": true,
  "hz": 5,
  "races": ["human", "orc"],
  "license": "MIT"
}
フィールド必須説明
id✔小文字の英字、数字、-、_、2 〜 41 文字
entry✔スキームディレクトリ内の .py ファイル 1 つ(絶対パスと .. は不可)
kindデフォルトは bot(openwar3.Bot のサブクラスで、あなたの代わりに戦う)。mod = ゲームプレイ MOD(openwar3.Mod のサブクラス。常にフェアモードを使わず、対戦ルールでの勝敗判定もしない)
classエントリファイル内の Bot(または Mod)サブクラス名。省略すると、エントリファイル内の最後の openwar3.Bot サブクラスを使います
fairデフォルトは true:視界内のものしか見えず、アリーナと同じルールです。false = マップ全体が見え、JASS チャネル も使えるようになります(コンパニオンに必要)
judgeデフォルトは true:対戦ルールで勝敗を判定します。RPG / コンパニオンのスキームでは false にします
hzon_tick を 1 秒に何回呼ぶか。デフォルトは 5
formatマニフェストの形式バージョン。現在は 1。ローカルの OpenWar3 より新しいものは拒否され、更新を促されます
その他name、version、author、description、races、license、homepage、forked_from は表示専用

スキームのディレクトリは Python のモジュール検索パスに追加されるので、エントリファイルから同じディレクトリにある他のファイルを import できます。サードパーティのパッケージ(numpy、torch……)は自動ではインストールされません —— 必要なものは description に明記してください。

最小のスキームは、ファイル 2 つで十分です:

# my_bot.py
from openwar3 import Bot

class MyBot(Bot):
    def on_tick(self, g):
        for w in g.idle_workers():
            mine = g.nearest(g.gold_mines(), w)
            if mine:
                g.gather(w, mine)
{"id": "my-first", "name": "はじめての AI", "entry": "my_bot.py"}

schemes/mine/my-first/ に置き、Farsight を再読み込みすれば表示されます。もっと手軽な出発点:「組み込み」からサンプルを 1 つ選び、「マイにコピー」をクリックします。

実行方法と戦績

スキームはスキームランナーが実行します(Farsight の「テスト開始 / 切り替え」で起動されるのがこれです)。

python tools/run_scheme.py --inst 20 --scheme builtin/micro --hours 6
  • インスタンスごとに常駐の監視プロセスが 1 つあり、ゲームごとに子プロセスを 1 つ起動してスキームを実行します。スキームのコードがクラッシュしても、監視プロセスは巻き込まれません。「マイスキーム」のコードを変更すると、次のゲームから自動で新しいコードが使われます。
  • ゲームが終わるたびに戦績を 1 行記録します:スキーム、バージョン、作者、勝敗、理由、ゲーム時間、エラー回数。Farsight の勝率はここから集計されます。

勝敗の判定方法:

状況記録
相手の建物が全滅勝ち
自軍の建物が全滅(兵が生き残っていても同じ —— 対戦ではこれで負けと判定されます)負け
自軍のユニットが全滅負け
Farsight で手動で終了 / 停止未定
切り替えた時点で、そのゲームがすでに 60 ゲーム秒以上経過していた(途中からの引き継ぎ)別途カウントし、勝率には含めない
ゲーム時計が長時間進まない未定

勝敗がつくと、ランナーはリザルト画面を閉じ、「次のゲームの設定」に従って次のゲームを開始し、スキームが引き続き引き継ぎます —— 一晩中放置して戦績を貯めることができます。一時停止は終了とはみなしません。一時停止中も Bot は通常どおり動き、止まるのはゲーム時計だけです。

信頼とセキュリティ

スキームはコードであり、実行時にはあなた本人と同じ権限を持ちます(ファイルの読み書きもネットワーク接続もできます)。そのため:

  • installed/ のスキームはデフォルトで信頼されておらず、あなたが「信頼」をクリックするまで、Farsight もランナーも実行を拒否します。
  • 同じ id のスキームを置き換えてインストールすると、信頼がリセットされます(新しいバージョン = 新しいコード)。
  • インポート時のチェック:zip は 50 MB 以下、ファイル数は 2000 以下。絶対パスと .. は不可(スキームのディレクトリの外に書き込まれるのを防ぐため)。マニフェストが不正、またはエントリファイルが存在しない場合はその場で拒否します。

信頼する前に、「フォルダを開く」でコードに一通り目を通してください。スキームは信頼できる人からだけ受け取ってください。

API(スクリプト向け)

API説明
GET /api/schemesスキーム一覧 + 戦績 + 各インスタンスで選択中・実行中のスキーム
GET /api/schemes/results?ref=1 つのスキームの直近 30 ゲーム
POST /api/schemes/importzip をインポート
GET /api/schemes/export?ref=zip をダウンロード
POST /api/schemes/forkマイにコピー
POST /api/schemes/trust信頼
DELETE /api/schemes?ref=削除(インスタンスが使用中なら拒否)
POST /api/instances/{n}/schemeインスタンスのスキームを変更:このゲームをすぐに引き継ぐか、次のテスト開始から反映

Python ではライブラリを直接使えます:from openwar3 import schemes(list_schemes、install_zip、export_zip、fork、trust、stats……)。

今後:スキームサイト

エクスポートした zip がそのまま共有の単位なので、サイトは外側に 1 層加えるだけで済みます。Farsight からワンクリックでアップロードし、サイトからダウンロードしたものは「スキームをインポート」とまったく同じチェックを通り、同じく信頼の確認が必要です。戦績の報告を選ぶこともでき、サイトはバージョンごとに勝率を集計します。Farsight には「スキームサイトで共有」ボタンの場所がすでに用意されています。進捗は ロードマップ を参照してください。