前回の呼び出し以降に起きたこと: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>(発行の比較 + ランタイムが捕捉したダメージイベント)