API カタログ

103 個の API、そのすべてに
「検証済みか、どれだけ速いか、内部でどう動くか」を明記

python -m openwar3 catalog --write でコードから生成され、SDK と一緒に更新されます。どのメソッドが存在し、どれが本当に使えるかをモデルが推測する必要はありません。同じデータは JSON でも提供しており、そのまま Agent に渡せます。

58 観測
28 コマンド
9 ゲーム制御
6 サンドボックス
2 接続とユーティリティ
98 実機検証済み
0 実験的
5 推定 / 未完全検証
103 個

観測 58

状態を読むだけで、ゲームは変更しません。ほとんどはプッシュ型スナップショットを直接読むため、待ち時間ゼロです。

マップ全体の完全な状態(WorldState):.units .players .items .clock .me。max_age 秒以内の再呼び出しは同じものを返します。 ⚠ 金鉱に入っているワーカーは一覧に含まれません。デフォルトではマップ全体が見えます(ロックステップモデルではローカルにすべてのデータがあるため)。Game(fair=True) のときだけ視界でフィルタリングされます。

内部 W3P ワールドブロック Local\War3World_<pid>(ランタイムが 50 ms ごとにプッシュ、seqlock)

実機検証済み プッシュ型スナップショット

最後に見た敵(または 'creep' クリープ、あるいは特定のプレイヤー番号)のユニット:[(そのときのユニットの状態, そのときのゲームクロック, 経過秒数)]。新しいものが先頭です。 死んだのを見たら一覧から削除されます。フェアモードでも通常モードでも「自軍が今見えているもの」を基準に記録します —— これがプレイヤーの頭の中にある地図です: 偵察した兵力、相手のヒーローを最後に見た場所、相手がいつ拡張したか。max_age を指定すると、その秒数(ゲーム秒)以内のものだけを返します。

内部 プッシュスナップショットの visibleTo(スナップショットを更新するたびに、見えている敵 / クリープのユニットを記録)

実機検証済み プッシュ型スナップショット

この試合の地形表 MapInfo:.walkable(x,y) .buildable(x,y) .at(x,y) .bounds(プレイ可能領域).starts(スタート地点).cells(bit0 通行不可、bit1 建設不可)。 試合開始後、計算完了まで数秒かかり、完了前は None を返します。木は含まれません(trees() を使います)。

内部 W3P マップブロック Local\War3Map_<pid>(試合開始後にランタイムが分割して計算、IsTerrainPathable で通行 / 建設を判定)

実機検証済み プッシュ型スナップショット

自分のプレイヤー番号(0~11)。

内部 ワールドブロックのヘッダー

実機検証済み プッシュ型スナップショット

{'gold','lumber','food_used','food_cap','gold_gathered','lumber_gathered'}。player のデフォルトは自軍で、どのプレイヤーのものも読めます。 読み取れない場合は None を返します。0 とみなさないでください。

内部 ワールドブロック players[16]

実機検証済み プッシュ型スナップショット

全 16 プレイヤースロット:Player(id, gold, lumber, food_used, food_cap, gold_gathered, lumber_gathered, race, known)。

内部 ワールドブロック players[16]

実機検証済み プッシュ型スナップショット

ハンドルペア (lo, hi) でユニットを探します(オーダーのターゲット、タスクターゲット、イベントが返すのはいずれもハンドルペアです)。

内部 ワールドブロック by_handle

実機検証済み プッシュ型スナップショット

建物かどうか(タワーを含む)。ユニット表の移動速度 0 で判定します。アンデッドの本拠地は占有面積が 0 なので、占有面積では判定しないでください。

内部 スナップショット + units.json(spd==0 = 建物)

実機検証済み プッシュ型スナップショット

自軍のワーカー(Peasant / Peon / Acolyte / Wisp)。

内部 プッシュスナップショット

実機検証済み プッシュ型スナップショット

仕事のないワーカー:オーダーもタスクもないもの(このティックで仕事を割り当てたばかりのものは除く)。 ⚠ タスクのあるワーカーに採集命令を出し直すと採集サイクルが中断されます(収入がゼロになります)。

内部 プッシュスナップショット(オーダースロット + タスクスロット)

実機検証済み プッシュ型スナップショット

自軍の生きているヒーロー(死んだヒーローは祭壇の復活リストにあります。revive を参照)。

内部 プッシュスナップショット

実機検証済み プッシュ型スナップショット

自軍の戦闘ユニット:ワーカーでも建物でもないもの。

内部 プッシュスナップショット + units.json

実機検証済み プッシュ型スナップショット

自軍の建物(タワー、建設中の基礎を含む)。types で特定の種類だけに絞れます(例:{'hbar'})。

内部 プッシュスナップショット

実機検証済み プッシュ型スナップショット

このワーカーが建設中かどうか(建設に向かっている途中 / 修理を手伝っている場合、このティックで割り当てたばかりの場合も含む)。建設担当を選ぶときはこのワーカーを除外してください。そうしないと前の基礎の工事が止まります。

内部 プッシュスナップショット(オーダー = 建物の 4 文字コード、または建設命令 / 修理命令)

実機検証済み プッシュ型スナップショット

この建物がまだ完成していない(HP が満タンでない)。⚠ ダメージを受けた建物も満タンではありません —— 序盤の判定には十分ですが、戦闘が始まった後は時間と合わせて判断してください。

内部 プッシュスナップショット(基礎の HP はごく低い値から満タンまで増えていく)

実機検証済み プッシュ型スナップショット

マップ上の金鉱。⚠ ナイトエルフの Entangled Gold Mine と中立の金鉱は同じ座標にそれぞれ 1 ユニットずつあるので、採集には自分の方を割り当ててください。

内部 プッシュスナップショット(ngol/egol/ugol)

実機検証済み プッシュ型スナップショット

敵プレイヤーのユニット(クリープを除く)。fighters_only:ワーカーと建物を除外します。

内部 プッシュスナップショット

実機検証済み プッシュ型スナップショット

クリープ(中立敵対)。⚠ 夜は視界が短くなり、遠くのキャンプが戦場の霧に入ると、それへのターゲットコマンドは拒否されます(理由コード 1001)。

内部 プッシュスナップショット(owner 12 = 中立敵対)

実機検証済み プッシュ型スナップショット

{'hp','hp_max','mana','mana_max'}(浮動小数点、エンジンの生の値)。u にはスナップショットで取得したユニットをそのまま渡せます(最新のものに置き換えられます)。

内部 ワールドブロックのユニット hp/hpMax/mana/manaMax

実機検証済み プッシュ型スナップショット

{'level','xp','skill_points'}。

内部 ワールドブロックのユニット level/xp/skillPoints

実機検証済み プッシュ型スナップショット

[{code, level, cooldown, flags}]。buff は buffs(u) にあります。「詳細」を持つユニットだけが対象です(ヒーロー > プレイヤーのユニット > クリープの順、最大 256 体)。

内部 ワールドブロックの詳細:アビリティ(コード / レベル / フラグ / 残りクールダウン)

実機検証済み プッシュ型スナップショット

ユニットにかかっている buff コード(例:'BHds' Divine Shield、'Bslo' Slow)。各コードの効果は data/game/buffs.json を参照してください。

内部 ワールドブロックの詳細:B で始まるアビリティオブジェクト

実機検証済み プッシュ型スナップショット

このアビリティのクールダウンが残り何秒か(ゲーム秒)。0 = 使用可能。そのアビリティがない(またはこのユニットに詳細がない)場合は None を返します。

内部 ワールドブロックの詳細:アビリティの残りクールダウン(アビリティのタイマー)

実機検証済み プッシュ型スナップショット

6 スロットのアイテムの 4 文字コード(空きスロットは None)。インベントリがなければ None を返します。

内部 ワールドブロックの詳細:インベントリ 6 スロット

実機検証済み プッシュ型スナップショット

{'order','target','x','y'}:ユニットが今持っているオーダー(order は 0x000D00xx または建物の 4 文字コード、0 = アイドル)。 target はハンドルペアで、g.unit(target) でユニットに変換します。

内部 ワールドブロックのユニット order / オーダーのターゲット / オーダーのターゲット地点

実機検証済み プッシュ型スナップショット

ユニットが**実際に攻撃 / 追跡している**ユニット(なければ None)。 ⚠ 攻撃命令を出すとオーダースロットはすぐに空になり、攻撃はタスク側に残ります —— 「誰を攻撃しているか」の判定には current_order ではなくこちらを使ってください。

内部 ワールドブロックのユニットのタスクターゲット

実機検証済み プッシュ型スナップショット

エンジンのゲームクロック(ゲーム秒、ロード中は 0)。ゲーム速度を上げると実時間より速く進みます。

内部 ワールドブロックのヘッダー clockMs(エンジンのゲームクロック)

実機検証済み プッシュ型スナップショット

この建物が今何をしているか:Production(kind, queue, duration, elapsed, blocked, progress, remaining…)。何もしていなければ None を返します。 kind は 'queue'(訓練 / 研究 / ヒーロー。queue は最大 7 スロットで、[0] が実行中のもの)/ 'construction'(建設中)/ 'upgrade'(本拠地 / タワーのアップグレード)。 blocked = キューにあるのに始まっていない(たいていは人口不足 —— Farm を建てる時です)。progress は 0..1。 相手の建物も見られます(フェアモードでは見えている建物のみ)。

内部 ワールドブロックの生産テーブル(Aque/ABnP/AUnP アビリティオブジェクト + ランタイムが追跡する経過時間。実測誤差 < 0.2 ゲーム秒)

実機検証済み プッシュ型スナップショット

訓練 / 研究キュー内の 4 文字コード([0] が実行中)。アイドルまたは生産建物でない場合 = []。

内部 ワールドブロックの生産テーブル

実機検証済み プッシュ型スナップショット

進行中のすべての生産 [(建物, Production)]。owner は units() と同じです:'me' / 'enemy' / プレイヤー番号 / 'all'。 プロの使い方:相手が何の兵を訓練しているか、何の技術を研究しているか、いつティアアップするかを見る(建物を偵察できたとき)。

内部 ワールドブロックの生産テーブル

実機検証済み プッシュ型スナップショット

地上ユニットが a から b まで歩く距離(a、b はユニットまたは (x,y))。到達できなければ None。島マップで「このクリープキャンプ / 拡張地点に地上から行けるか」を判定するのに使います。 直線距離より信頼できます(木立、崖、建物を迂回)。精度は 1 マス 128 で、1 マスより狭い隙間は通れないと判定します。

内部 マップブロック(エンジンの IsTerrainPathable)+ 木ブロック + 建物の占有範囲、SDK 側で A*(1 マス 128)

実機検証済み プッシュ型スナップショット + ローカル計算

地上から到達できるか(マップブロックの計算が終わっていない = None)。

内部 同上

実機検証済み プッシュ型スナップショット + ローカル計算

経路の折れ点 [(x,y)...](最後の点が b)。path(units, 地点リスト) と組み合わせて、部隊をこの経路に沿って移動させます(タワーを避ける、裏道を通る)。

内部 同上

実機検証済み プッシュ型スナップショット + ローカル計算

維持費の段階:{'level': 'none'/'low'/'high', 'income': 1.0/0.7/0.4, 'next_at': 次の段階になる人口(なければ None)}。 プロの常識:Tier 3 へのアップグレードや攻防アップグレードの間は人口 50 で止め、決戦の直前にだけ 80 まで上げます。

内部 1.27 の固定ルール:人口 0~50 は徴収なし、51~80 は収入 ×0.7、81~100 は ×0.4

推定 プッシュ型スナップショット

ヒーローが次のレベルまでに必要な経験値(レベル 10 = 0)。

内部 ワールドブロック level/xp + MiscGame の NeedHeroXP 式

実機検証済み プッシュ型スナップショット

フィールド上の(見えている)クリープをキャンプにまとめます:[{'x','y','units','level','hp','max_level'}]。自軍の本拠地から近い順です。 level = キャンプの合計レベル(クリープ狩りの難易度によく使われる指標)、hp = 合計 HP。time_to_kill / path_distance と組み合わせて狙うキャンプを選びます。

内部 プッシュスナップショット(距離 600 以内のクリープを 1 グループにまとめる)+ units.json のレベル

実機検証済み プッシュ型スナップショット

buff コードが何か:{'ability','effect','dur','hero_dur','targets'}(例:'Bslo' -> Slow)。1 つのコードに複数行ある場合は最初の行を返します。

内部 data/game/buffs.json(AbilityData.slk の BuffID -> アビリティ / 効果 / 持続時間)

実機検証済み ローカルデータ

ユニットの戦闘属性 combat.UnitStats:HP / マナ上限、アーマー(攻防アップグレード、ヒーローの敏捷性を含む)、アーマータイプ、移動速度、昼 / 夜の視界、 武器(攻撃できる対象、射程、攻撃間隔、ダメージ範囲、攻撃タイプ、スプラッシュ)。u にはユニット(所有者の技術とヒーローレベルを自動で使用)または 4 文字コード(player のデフォルトは自軍)を渡します。 さらに .dps_vs(相手) / .hits_to_kill(相手) / combat.time_to_kill(集団, 相手) と組み合わせます。⚠ アイテム、オーラ、buff は含みません。

内部 データテーブル(UnitBalance/UnitWeapons/UpgradeData/MiscGame)+ リアルタイムの技術レベル + ヒーローレベル

実機検証済み プッシュ型スナップショット + ファストレーン(5 秒ごとに 1 バッチ)

このユニット群が一緒に target を攻撃して倒すまでのゲーム秒数(target の現在の HP を使用。相性、アーマー、攻防アップグレードを考慮し、移動、スプラッシュ、回復は考慮しない)。 プロの使い方:集中攻撃は一番近い敵ではなく、「最も早く倒せる」敵(time_to_kill が最小のもの)から狙います。攻撃できない = None。

内部 stats() + リアルタイムの HP

実機検証済み プッシュ型スナップショット

ゲーム内時刻(時、0~24)。試合開始時は朝 8 時です。1 日 = 480 ゲーム秒(昼と夜がそれぞれ 240 秒で、昼夜の進行速度に応じて伸縮)。 読み取れない(古いランタイム / 試合中でない)場合は None を返します。

内部 ワールドブロックの拡張領域:GetFloatGameState(GAME_STATE_TIME_OF_DAY)

実機検証済み プッシュ型スナップショット

今が夜かどうか(18:00~6:00)。プロの戦術:夜はクリープが眠っている(先手でクリープ狩りをしても囲まれない)、全ユニットの視界が短くなる(奇襲の好機)、 ナイトエルフの Sentinel / ユニットは夜に木のそばで姿を隠す。読み取れない場合は None を返します。

内部 ワールドブロックの拡張領域(6~18 時が昼)

実機検証済み プッシュ型スナップショット

ゲーム内時刻が hour 時になるまであと何ゲーム秒か(例:seconds_until(18) = 日没までの時間。夜のクリープ狩りの計画に使います)。

内部 ワールドブロックの拡張領域 + 1 日 480 秒(実測 20 ゲーム秒 / 時)

実機検証済み プッシュ型スナップショット

地面のアイテム [Item(addr, handle_lo, handle_hi, type, x, y, life)]。拾われる / 使われると item.removed イベントが発行されます。

内部 ワールドブロック items[](地面のもののみ:所有者のハンドルがすべて FF)

実機検証済み プッシュ型スナップショット

生きている木(DestructableData で targType に tree を含むもの)。(x,y) を渡すと近い順に並べ、最大 limit 本を返します。 各要素は Tree(addr, handle_lo, handle_hi, type, x, y, life) で、そのまま gather に渡して伐採させられます。

内部 木ブロック Local\War3Trees_<pid>(2 秒ごとに更新)

実機検証済み プッシュ型スナップショット

前回の呼び出し以降に起きたこと:unit.appeared / unit.died / unit.removed / unit.damaged / order.changed / hero.levelup / owner.changed / item.appeared / item.removed / game.started(これらは発行の比較から得られ、精度 = 発行周期 50 ms)、 さらにエンジンレベルの damage / killed(ランタイムがゲームスレッド上でその場で記録するため、**1 発ごと**に発生): damage:handle = 攻撃を受けた側、.source_addr = 攻撃した側(snapshot().unit_by_addr でユニットに変換)、.value = 実際に減った HP、 .raw_damage = アーマー適用前のダメージ、.attack_type(normal/pierce/siege/magic/chaos/hero/spell)、.damage_type killed:この 1 発でとどめを刺した、.source_addr = 倒した側 さらにランタイムが生産テーブルを追跡して得る production.done(精度 = 発行周期):ユニット = 建物、.done_code = 完了した 4 文字コード、 .done_kind = 'training'(兵 / ヒーロー / 復活)/ 'research' / 'construction'(建物の完成)/ 'upgrade'(ティアアップ / タワーのアップグレード)、.value = かかったゲーム秒数 09-25 の補完: spell.cast:ユニット = 詠唱者、.spell スキルの 4 文字コード、b レベル、value クールダウン秒数、x,y 詠唱地点(スキルのクールダウン開始時に検出、精度 = 発行周期) player.left:.player 退出した / 敗北判定で除外されたプレイヤー番号。game.ended:試合から退出 selection.changed:ローカルプレイヤーの選択が変わった(ユニットは g.selection() で取得) message:画面のメッセージ枠に出た 1 件(ゲームのヒント、チャット、システム):.text 全文、.frame メッセージ枠の番号、 .chat = {'channel', 'sender', 'text'}(チャットの場合。プレイヤーがチャット欄に打った文字はここから読む) ui.click / ui.hover / hotkey / mouse.world:UI と入力(g.ui)。.key はキャンバスの key / ホットキーの書き方 各要素は Event(seq, kind, clock, addr, handle, type, owner, a, b, x, y, value, extra)。 フェアモード(fair=True)で渡されるのは、自分のユニットのイベント、今見えている(または 1 秒以内まで見えていた)ユニットのイベント、自軍が受けた / 自軍が与えたダメージ、 そしてローカルの UI / メッセージ / 試合関連のイベントだけです。

内部 イベントリング Local\War3Events_<pid>(発行の比較 + ランタイムが捕捉したダメージイベント)

実機検証済み プッシュ型スナップショット

ローカルプレイヤーが今選択しているユニット(メインのユニットが先頭。最大 12 体)。選択が変わると selection.changed イベントが発行されます。

内部 W3P ワールドブロックの拡張領域 selAddrs(ランタイムが発行のたびにローカルプレイヤーの選択を含める)

実機検証済み プッシュ型スナップショット

前回の呼び出し以降に画面のメッセージ枠へ新しく出たメッセージ:[{'text', 'frame', 'repeat', 'seq', 'game_ms'}]。 ゲームのヒント(「Farm がもっと必要です」「そこには建設できません」)、チャット、システムメッセージがすべてここに入ります。frame でどのメッセージ枠かを区別します。 イベントストリームの message イベントと同じものです(カーソルはそれぞれ別)。

内部 共有メモリ Local\War3Msgs_<pid>(ランタイムが捕捉した画面メッセージ)

実機検証済み プッシュ型スナップショット

研究レベル / 完成した建物の数(アップグレード系列も含む:Castle も htow として数える)。player のデフォルトは自軍で、どのプレイヤーでも問い合わせられます。

内部 W3P クエリ q_tech(エンジンのプレイヤー技術カウント)

実機検証済み ファストレーン

エンジンの実行可否判定:0/220 なら実行可能。3 人口不足、8 ゴールド不足、9 木材不足、32 キューがいっぱい、183 前提条件不足、185 祭壇で復活中、221 その項目がない / 建設中。 ⚠ ワーカーの建物建設に対しては常に 221 になるため、設置場所の判定には使えません(build_near を使います)。

内部 W3P クエリ q_feasible(エンジンの実行可否チェック)

実機検証済み ファストレーン

can_do をまとめて問い合わせます:pairs = [(ユニット, 4 文字コード), ...]。同じ順序の判定コードのリストを返します(問い合わせできなかったものは None)。 1 ティックで何を建てる / 訓練するかを計画するときは、先にまとめて問い合わせると、can_do を 1 つずつ呼ぶより N 倍速くなります(リファレンスブレイン 09-23:建設計画 76 -> 25 ms)。

内部 W3P クエリ q_feasible × N、1 バッチで送信

実機検証済み ファストレーン × 1

多数の技術 / 建物のカウントを一度に問い合わせます:{4 文字コード: 数または None}。

内部 W3P クエリ q_tech × N、1 バッチで送信

実機検証済み ファストレーン × 1

この地点が今自軍から見えているか(戦場の霧 / ブラックマスクの中でないか)。フェアモードの bot は見えている敵だけを使うべきです。

内部 W3P クエリ q_visible(見えている / 戦場の霧 / ブラックマスク)

実機検証済み ファストレーン

金鉱の残りゴールド。

内部 W3P クエリ q_mine_gold(エンジンの金鉱残量)

推定 ファストレーン

コンピューター AI のキャプテン:兵を連れてどこへ向かうか(出撃前に、あなたの基地のどこを攻めるかが分かります)。コンピューターの相手にのみ有効です。キャプテンについていないユニットなら None を返します。

内部 W3P クエリ q_captain(敵兵が従っているコンピューターのキャプテン)

実機検証済み ファストレーン

ユニットの現在のオーダー。**このティックで出したばかりのものを含みます**(スナップショットがまだ追いついていないときはレシートの新しいオーダーを使います)。 ⚠ 09-23 の実戦:hello_bot が農民を Farm の建設に送った直後、同じティックで rush_bot がスナップショット上でその農民を「アイドル」と判断して Barracks の建設に送り、Farm が何度も途中で放棄されました。 「手が空いている / 建設中でない」ユニットを選ぶときは、u.order ではなくこれを使ってください。

内部 スナップショットのオーダー + このプロセスで受理されたばかりのコマンド(レシート)

実機検証済み プッシュ型スナップショット

今のゴールド / 木材で code(ユニット、建物)を買えるか(units.json の価格で判定)。価格表にないものはすべて買えるとみなします。 ⚠ ティアアップの 4 文字コードは表では累計価格なので、ここでの判定はやや保守的になります。最終的にはエンジンのレシートが正です。

内部 プッシュスナップショットの自軍資源 + units.json の価格

実機検証済み プッシュ型スナップショット

プレイ中のマップのデータ(openwar3.mapdata.MapData):name_of('HC07') でカスタムユニット / アイテム / アビリティの名前、hero_names、tooltip。 RPG マップのユニットはほとんどがマップ独自のもので、組み込みの名前表にはありません。ランチャーから起動したゲームでない場合(マップファイルが見つからない)は None を返します。

内部 マップファイル(ランチャーの --map のパス):w3u/w3t/w3a + wts。保護されたマップはマップ内の TXT を読む

実機検証済み ファイル読み取り(初回は約 0.1 秒)

コマンド 28

ユニットに何かをさせます。約 1 フレームで反映し、すべてにレシートがあります。

1 ティック分のコマンドを 1 つのバッチにまとめます: with g.batch() as b: g.attack(archers, target) # Pending を返し、ブロック終了後にレシートになる g.move(wounded, *home) g.cast(hero, "thunderclap") print(b.sent, b.wait_ms, [r.reason for r in b.receipts]) コマンドを 1 件ずつ送るとそのたびにゲームスレッドの処理を 1 回待ちます(約 10 ms)。バッチなら待つのは 1 回だけです —— リファレンスブレインは 09-23 にこれで 1 ラウンドを 48 -> 26 ms に短縮しました。 * クレームテーブルによる調停はこれまでどおり 1 件ずつ行われます(押さえられているユニットはその場で held のレシートを受け取り、バッチには入りません)。 * ブロック内のコマンドは Pending を返します:ブロック終了前に .ok を読むと例外が発生し(レシートがまだ存在しないため)、ブロック終了後は Receipt と同じように使えます。 * ブロック内で例外が発生した = バッチ全体を破棄(status 97 cancelled)し、押さえていたユニットは解放されます。 * クエリ(can_do / tech / visible …)と build_near、buy はバッチに入らず、これまでどおりその場で問い合わせます —— 結果をすぐに使うためです。 一度に多数を問い合わせるなら can_do_many / tech_many を使います。 * ネストした with g.batch() は一番外側のバッチに統合されます。16 件を超えるとランタイムが自動で複数の区間に分けます(区間ごとに 1 回待機)。

内部 ブロック内のコマンドを 1 バッチにため、ブロック終了時に一括送信(同じフレームで実行し、ゲームスレッドを待つのは 1 回だけ)

実機検証済み ファストレーン × 1

(x,y) まで移動し、途中で攻撃しません(撤退にはこれを使います)。ユニット 1 体またはリストを渡せます(同じフレームでまとめて命令)。 queue='after':今の作業を終えてから向かいます(現在のオーダーの後ろに差し込む)。レシートの values[0] = 命令後にこのユニットがキューに持っているオーダー数(実行中のものを含む)。

内部 W3P point:move(extra ビット = キュー方式)

実機検証済み ファストレーン

target を攻撃します。デフォルトでは右クリックを使います(敵に対して = その 1 体を攻撃。09-23 の実測でオーダーのターゲットもタスクターゲットもそのユニット)。 ⚠ ターゲットは視界内にいる必要があり、見えないものは拒否されます(理由コード 1001)。 force=True で攻撃オーダー 0x0F を使います(味方や中立の小動物を攻撃するときに必要)—— 実測では、攻撃オーダーに切り替わるだけでターゲットを記憶せず、 近くの別の敵を攻撃しに行きます。特定のターゲットを攻撃する用途には使わないでください。

内部 W3P target:ターゲットコマンド(右クリック smart)

実機検証済み ファストレーン

手元のすべての作業を止めます(オーダー ID 0x000D0004)。キューにあるオーダーも消去されます。

内部 W3P immediate:stop

実機検証済み ファストレーン

その場で待機します(追いかけず、射程内の敵だけを攻撃)。

内部 W3P immediate:holdposition

実機検証済み ファストレーン

地面攻撃:砲で一帯を砲撃します(透明ユニットや木立の裏の敵を撃つ、通路を封鎖する)。地面攻撃ができるユニットだけが受け付けます。

内部 W3P point:attackground(攻城ユニット / Mortar Team / Demolisher)

実機検証済み ファストレーン

キャンセル:訓練 / 研究キューの最後のスロット(返金)、建設中の建物(75% 返金)、アップグレード中の本拠地。

内部 W3P immediate:cancel

実機検証済み ファストレーン

一連の地点を順番に通過します(Shift で連続指定:ウェイポイント、タワーの迂回、偵察ルート)。attack=True なら各区間がアタックムーブになります。 一括で送信し、レシートは地点ごとに 1 つ(points の順)返ります。

内部 1 バッチ:最初の区間は即時実行、残りは逆順に queue='after' で差し込む(エンジンには「現在のオーダーの後ろに差し込む」しかないため)

実機検証済み ファストレーン × 1

ゴールドの採掘 / 伐採(target は金鉱または trees() の木)。⚠ 手の空いたワーカー(idle_workers)にだけ割り当ててください:タスクのあるワーカーに出し直すと採集サイクルが中断されます。 プロの使い方:建て終わったら採掘に戻る = build(...) の後に gather(worker, mine, queue='after')。

内部 W3P target:harvest(金鉱または木)

実機検証済み ファストレーン

修理 / 建設の手伝い(ヒューマンとオークの建設現場は、建てる人がいないと工事が止まります)。

内部 W3P target:repair

実機検証済み ファストレーン

ワーカーに (x,y) で code を建てさせます(座標は 32 単位にスナップ)。レシートが受理 = ワーカーのオーダーがすでにこの建物(または着工命令)になっている。 queue='after' のとき = ワーカーのオーダーキューに入った(レシートの values[0] がキュー数)。 ⚠ 受理 ≠ 建てられる:木立の中の地点もエンジンはその場で受理し、ワーカーが到着してから失敗します(09-23 実測)。ゴールドが別のところで使われても基礎は現れません。 どこに置けるか分からないなら build_near を使います(結果を追跡し、失敗した地点をブラックリストに入れます)。続けて何棟も建てるなら build_queue を使います。

内部 W3P build:建設オーダー。同じフレームでワーカーのオーダーを読み戻して確認

実機検証済み ファストレーン

1 人のワーカーに順番に何棟も建てさせます(Shift で連続建設):plan = [(4 文字コード, x, y), ...]。一括で送信し、レシートは plan の順です。 ⚠ ゴールドは着工時に引かれます(キューに入れた時点では引かれません)—— 3 棟入れてもゴールドが 1 棟分しかなければ、残りの 2 棟はワーカーが到着した時点で失敗します。

内部 1 バッチ:最初の 1 棟は即時、残りは逆順に queue='after'

実機検証済み ファストレーン × 1

(x,y) の周囲で近いところから順に置ける場所を探して code を建てます。**ブロックしない**ので、毎ティック呼んでも構いません: * この種類の建物の建設が進行中(ワーカーが移動中)-> その地点を返し、命令を出し直さない。 * 前回成功した(基礎が現れた)-> 今回は必要に応じて新しい地点を探す。 * 前回失敗した(ワーカーが到着してから置けないと分かり、エンジンがオーダーを取り消し、基礎もない)-> その地点を 45 秒間ブラックリストに入れ、次の地点を試す。 * ゴールドが足りない -> そのまま None を返す(試さない、ブラックリストにも入れない)。すべて試し終えたら None を返す。 ⚠ なぜ追跡が必要か:09-23 の実戦で、木立の中の地点をエンジンは**その場で受理**し、ワーカーが到着してから失敗しました(同じフレームのレシートでは判定できない)。 また、エンジンの設置可否チェックはワーカーの建物建設に対して常に 221 を返すため、先に「確認」してから建てることもできません。明らかに埋まっている地点(本拠地のど真ん中)だけはその場で拒否されます。

内部 地点ごとに build + 追跡(基礎が現れた = 成功。ワーカーがオーダーを放棄し、基礎もない = その地点をブラックリストに入れる)

実機検証済み ファストレーン × 試行した地点数

ユニットの訓練 / 技術の研究 / 本拠地のアップグレード(ティアアップ = 本拠地自体にアップグレード先の本拠地の 4 文字コードを指定。例:'hkee')。 拒否されると、レシートの reason に理由が入ります(人口不足、ゴールド不足、木材不足、キューがいっぱい、前提条件不足……)。

内部 W3P immediate:4 文字コード。拒否時は実行可否の理由コード付き

実機検証済み ファストレーン

ヒーローがアビリティを習得します(4 文字コード。例:'AHbz' Blizzard)。

内部 W3P learn:スキルポイントが減った場合にのみ習得とみなす

実機検証済み ファストレーン

スキルを使います。spell はオーダー文字列('thunderbolt' Storm Bolt、'blizzard'、'holybolt' Holy Light…、data/order-ids.txt を参照)またはオーダー ID。 target を渡す = ユニット対象、x,y を渡す = 地面対象、どちらも渡さない = ターゲットなし(Thunder Clap、Divine Shield、Summon Water Elemental)。 レシートの受理はエンジンが受け付けたことを示すだけです。実際に発動したかは、cooldown() がクールダウンに入ったか、buffs() に現れたかで確認します。

内部 W3P target / point / immediate(引数に応じて選択)

実機検証済み ファストレーン

祭壇で死んだヒーローを復活させます(hero を渡さなければリストの最初のヒーロー)。 拒否されるよくある理由(レシートの reason に書かれます):人口不足(ヒーローも人口を使う)、ゴールド不足、死んでから間もない(死後約 3 ゲーム秒経たないと復活できない)、 すでに復活が進行中(受理された時点でエンジンがそのスロットをその場で消去する)。

内部 W3P revive:死亡ヒーロー一覧 -> 祭壇が死んだヒーローに復活を実行

実機検証済み ファストレーン

ヒーローが地面のアイテムを拾いに行きます(item は items_on_ground から取得)。拾うとインベントリに現れ、地面側では item.removed イベントが発行されます。

内部 W3P target:アイテムを右クリック

実機検証済み ファストレーン

インベントリの slot 番目(0~5)のアイテムを使います。ターゲットユニットまたはターゲット地点を指定できます。 ⚠ 地点指定でアイテムを使う場合(例:Ivory Tower)、エンジンは成功しても 0 を返すため、レシートは常に受理扱いになります —— インベントリのそのスロットが空いたかで確認してください。

内部 W3P use_item(スロット番号で指定)

実機検証済み ファストレーン

インベントリの slot 番目のアイテムを (x,y) に落とします(ヒーローが歩いて行って置きます)。

内部 W3P item_drop(JASS の UnitDropItemPoint を踏襲:dropitem 0xD0021 を地点指定 + アイテムを即時ターゲット)

実機検証済み ファストレーン

インベントリの slot 番目のアイテムを to(別のヒーロー / ユニット。歩いて行って手渡す)に渡します。ショップに渡す = 売却(sell_item を参照)。

内部 W3P item_drop(JASS の UnitDropItemTarget を踏襲:dropitem をユニット指定)

実機検証済み ファストレーン

インベントリの slot 番目のアイテムをショップに売ります(ヒーローがショップの隣まで行く必要があります。売却可能なアイテムのみ受け付け、価格の半分が返ります)。

内部 give_item と同じで、ターゲットがショップ(実測:Staff of Sanctuary が 125 ゴールドで売れた)

実機検証済み ファストレーン

インベントリ内でスロットを移動します(slot 番目を to_slot 番目へ。両方にアイテムがあれば入れ替え)。ショートカットキーの配置を整えるのに使います。

内部 W3P target:オーダー 0xD0022+スロット番号、ターゲット = アイテム(JASS の UnitDropItemSlot を踏襲)

実機検証済み ファストレーン

ショップでアイテムを買います(ショップの隣に立っているヒーローに渡されます)。技術の前提条件が足りないとエンジンは 0 を返し、ゴールドは引かれません。

内部 W3P buy:ショップが隣にいるヒーローに売る

推定 ファストレーン

ヒューマンの Call to Arms:農民が Militia になります(Tier 1 の Town Hall にはこのアビリティがなく、Keep / Castle でのみ有効)。

内部 W3P immediate:townbellon/off

実機検証済み ファストレーン

ゲーム制御 9

ゲーム速度、一時停止、発行周期、頭上の吹き出し、キャンバス、UI と入力、メッセージ。

UI と入力(openwar3.ui.UI):クリックできるボタンと選択カード、ホットキー、地面のクリックによる位置指定、マウスが指している場所。 ボタン上のクリックはゲームに届きません。ローカルの入力 + ローカルの描画だけなので、マルチプレイでも安全です。

内部 W3P 74 input_enable + 共有メモリ Local\War3Input_<pid>(ランタイムがウィンドウ入力を受け取る)

実機検証済み 共有メモリ

ゲーム速度(100 = 通常速度)。

内部 アクション 47(25~800%)

実機検証済み コントロールチャネル

ゲームの一時停止 / 再開。一時停止中はエンジンクロックが止まりますが、ファストレーンからは通常どおり命令できます(イベントディスパッチは動き続けています)。

内部 W3P pause

実機検証済み ファストレーン

ワールド状態の発行周期(16~1000 ミリ秒、デフォルト 50)。1 回の収集は約 0.5 ms なので、33 ms でも問題ありません。値はマシン全体で共有され、最後に書き込んだものが有効になります。

内部 ワールドブロック requestedPeriodMs

実機検証済み プッシュ型スナップショット

ユニットの頭上にチャットの吹き出しを出します(配信 / デバッグ用。ゲームには影響しません)。出せなかったときは False を返し、理由は g.last_say_error に入ります。

内部 アクション 56

実機検証済み コントロールチャネル

ゲーム画面左下のメッセージ欄に 1 行表示します(このマシンでのみ表示)。ゲーム自身が先に一度メッセージを表示している必要があります(DLL はそのときにメッセージ枠を捕捉します)。

内部 アクション 45

推定 コントロールチャネル

このゲームプロセスを終了します(farm.py --keep を使っていれば、next_game.json に従って次の試合が自動で始まります)。

内部 アクション 22

実機検証済み コントロールチャネル

キャンバス:ゲーム画面にテキストボックス、パネル、プログレスバー、画像、地面の円やルートを描きます(openwar3.canvas.Canvas)。 ランタイムが自前で描画し、ゲームのハンドルを作らず、ゲームの状態も変えません —— マルチプレイでも安全です。スタイルは自由(CJK 文字、角丸、半透明)。

内部 W3P 73 canvas_enable + 共有メモリ Local\War3Canvas_<pid>(ランタイムが毎フレーム、ゲームがカーソルを描く直前に描画。カーソルがその上に重なる)

実機検証済み 共有メモリ

「任意のキーを押して続行」のロード画面でスペースキーを 1 回押します。多くの RPG / ストーリーマップはロード後にキーを押さないと始まりません(09-24 WarChasers で実測: 押さないとロード画面のまま止まり、ゲームクロックは 0、ファストレーンのキューも処理されない)。openwar3.run などはゲームに入る際に自動で押すので、通常は手動で呼ぶ必要はありません。

内部 PostMessage WM_KEYDOWN/UP でスペースをゲームウィンドウに送信(フォーカスは奪わない)

実機検証済み ウィンドウメッセージ

サンドボックス 6

JASS チャネル:ユニット生成、同盟設定、名前変更、テキスト表示……RPG の補助ツールやコンパニオン向け。ワールドを変更できるのはシングルプレイかつローカルツールの中だけです。

任意の JASS native を名前で呼び出します:g.jass.CreateUnit(g.jass.Player(1), "Hpal", x, y, 270.0)。 引数 I/R/B/S/H は自動で変換されます(ユニット / アイテムのオブジェクトはそのまま渡せます)。マルチプレイでは読み取り専用のものしか呼べません。詳しくは openwar3/jass.py と docs/COMPANION_ZH.md を参照してください。

内部 W3P 70 jass(ランタイムが名前で native テーブルを引く。1291 個)

実機検証済み ファストレーン

16 個のプレイヤースロット:controller(user 人間 / computer / neutral…)、state(empty / playing / left)、human、me、ally(自分と同盟かどうか)。 RPG マップでコンパニオンを置く空きスロットを探したり、シングルプレイかどうかを判定したりするのに使います。

内部 JASS GetPlayerController / GetPlayerSlotState / IsPlayerAlly

実機検証済み ファストレーン

(x,y) にユニットを 1 体生成し(player のデフォルトはローカルプレイヤー)、スナップショット内のユニットを返します(次のワールド発行を待つので約 50 ms)。生成できなければ None を返します。 返されるユニットには jass_handle 属性が追加されます。⚠ シングルプレイでのみ使用できます(マルチプレイでは同期ずれを起こします)。

内部 JASS CreateUnit + W3P 72 ハンドル -> ユニット

実機検証済み ファストレーン

プレイヤー a から b への同盟関係を設定します:allied = 互いに攻撃しない + 互いに救援要請、vision = 視界の共有、control = ユニット制御の共有(b が a のユニットを指揮できる)、 xp = 経験値の共有。both=True なら両方向を同時に設定します(control は a -> b のみ)。

内部 JASS SetPlayerAlliance

実機検証済み ファストレーン

プレイヤー名を変更します(スコアボード、チャット、同盟パネルに表示される名前)。コンパニオンに名前を付けるのに使います。

内部 JASS SetPlayerName

実機検証済み ファストレーン

ゲーム画面の左下に 1 行のテキストを表示します(マップのトリガーが使うあのテキスト)。デフォルトではローカルプレイヤーに表示します。|cffRRGGBB カラーコードに対応。

内部 JASS DisplayTimedTextToPlayer

実機検証済み ファストレーン

接続とユーティリティ 2

接続状態と純粋な計算ユーティリティ。

接続状態:pid、ワールドの発行(周期、収集にかかった時間)、ファストレーンのカウンタ。

内部 ワールドブロック + ファストレーン + クレームテーブル

実機検証済み ローカル計算

to(ユニットまたは (x,y))に最も近いもの 1 つ。候補がなければ None を返します。

内部 純粋な計算

実機検証済み ローカル計算