AIスクリプトリファレンス

条件(プレイヤー・状況)

town-under-attack

■説明
この条件はコンピュータプレイヤーの町が攻撃されているとき真が設定される。

■注釈
自分の町、つまり「sn-minimum-town-size」で設定した範囲内の自軍の建物やユニットが攻撃されているか判定するために使用する。狼に攻撃されてもこの条件は真になってしまうので注意。下記の例は自分の町が攻撃されたら塔を建設するルールである。

(defrule
  (town-under-attack)
(can-build watch-tower-line) => (build watch-tower-line) )

enemy-buildings-in-town

■説明
この条件はコンピュータプレイヤーの町の範囲内に敵の建物があるかチェックする。

■注釈
この(自陣内に敵建物がある)状態になると、守備軍は自動的に自陣内の敵建物を攻撃しにいく。これを応用した通称タウンサイズアタック(TSA)という攻撃方法がある。TSAとは 「enemy-buildings-in-town」の状態になるまで 「sn-minimum-town-size」の値を徐々に大きくすることで、守備軍に自陣から最も近い敵建物を攻撃させる攻撃方法である。

(defrule
  (enemy-buildings-in-town)
=>
  (chat-local-to-self "自陣内に敵建物がある")
  (disable-self)
)

hold-koh-ruin

■説明
ドキュメントに記載なし。

■注釈
ゲームの種類がキングオブザヒルのときにのみ使用される条件。マップ中央のモニュメントを自軍が支配している状態かどうかチェックする。

(defrule
  (hold-koh-ruin)
=>
  (chat-local-to-self "モニュメントを支配しています。")
)

hold-relics

■説明
ドキュメントに記載なし。

■注釈
自軍または味方が聖なる箱をすべて集めたかチェックする。

(defrule
  (hold-relics)
=>
(chat-local-to-self "聖なる箱をすべて確保しました") (disable-self) )

enemy-captured-relics

■説明
この条件は敵がすべての聖なる箱を集めたかチェックする。
この状態が起きたとき、戦略AIは自動的に神殿と聖職者をねらい始める。攻撃を強め、攻撃させるための「attack-now」命令と連動させるのにこの条件を使用する。

■注釈
実際には、敵がすべての聖なる箱を集めたかではなく、「誰か」が聖なる箱をすべて集めた場合にこの条件が真になる。敵が聖なる箱を集めたかチェックするには、下記の例のような条件にする必要がある。

(defrule
  (enemy-captured-relics)
  (not(hold-relics))
=>
  (chat-local-to-self "敵が聖なる箱をすべて集めました。")
  (disable-self)
)

current-age <rel-op> <age>

■説明
この条件はコンピュータプレイヤーの現在の時代をチェックする。

■注釈
非常によく使われる条件。現在の時代を条件にして動作を分けたいときに使用する。下記の例は暗黒の時代に町の人を24人まで生産する例。

(defrule
  (current-age == dark-age)
  (unit-type-count-total villager < 24)
(can-train villager)
=>
(train villager) )

players-current-age <player-number> <rel-op> <age>

■説明
この条件は指定されたプレイヤーの現在の時代をチェックする。
これは人間のプレイヤーがタイムラインをチェックするのと同等である。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
他のプレイヤーの時代を判定して戦略を決めるときなどに使用する。下記の例は、自軍が領主の時代で敵のうち1人でも城主の時代だった場合に槍兵を生産するルールである。

(defrule
  (current-age == feudal-age)
(players-current-age any-enemy == castle-age) (can-train spearman-line)
=> (train spearman-line) )

game-time <rel-op> <value>

■説明
この条件はゲーム時間をチェックする。ゲーム時間は秒で与えられる。時間特有のルールを作るのに使うことができる。例えば、コンピュータはゲーム時間の15分以降により攻撃的になることができる。

■注釈
ゲーム時間による条件を使ってルールを制御したときに使用する。下記の例はゲーム開始後10分以降に町の人が10人未満になったら、ゲームを放棄するルールである。10分以降の制限をつけることでゲーム開始後すぐに放棄しないようにしている。

(defrule
(game-time >= 600)
(unit-type-count villager < 10)
=> (resign) )

current-age-time <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの現在の時代の時間(現在の時代で過ぎた時間)をチェックする。

■注釈
下記の例は領主INの60秒後に引き具を研究する例である。

(defrule
  (current-age == feudal-age)
(current-age-time >= 60) (can-research ri-crop-rotation)
=>
(research ri-crop-rotation) )

players-current-age-time <player-number> <rel-op> <value>

■説明
この条件は指定されたプレイヤーの現在の時代の時間(現在の時代で過ぎた時間)をチェックする。
これは人間のプレイヤーがタイムラインをチェックするのと同等である。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
下記の例はすべての敵が城主IN後30秒未満の場合に攻撃を仕掛ける例である。

(defrule
  (players-current-age every-enemy <= castle-age)
(players-current-age-time every-enemy < 30)
=>
(attack-now) )

current-score <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの現在の得点をチェックする。

■注釈
勝利条件が得点の時など、得点によってルールを制御したい場合に使用する。

(defrule
(current-score > 1000) => (chat-local-to-self "1000点を超えました") (disable-self) )

players-score <player-number> <rel-op> <score>

■説明
この条件は指定されたプレイヤーの現在の得点をチェックする。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
下記の例は敵が1200点以上で自分が1000点未満の場合、「劣勢です。」とチャットするルールである。

(defrule
(current-score < 1000) (players-score every-enemy >= 1200)
=> (chat-local-to-self "劣勢です。") (disable-self) )

stance-toward <player-number> <diplomatic-stance>

■説明
この条件は指定されたプレイヤーに対するコンピュータプレイヤーの外交姿勢をチェックする。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
外交姿勢を変更可能なゲームの場合に使用する。下記の例はプレイヤー1への外交姿勢が敵の場合にプレイヤー1から金を500を貢がれたら外交姿勢を同盟にするルールである。

(defrule
  (stance-toward 1 enemy)
  (players-tribute-memory 1 gold >= 500)
=> (set-stance 1 ally) )

players-stance <player-number> <diplomatic-stance>

■説明
この条件は指定されたプレイヤーの外交姿勢をチェックする。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
外交姿勢を変更可能なゲームの場合に使用する。下記の例は人間のプレイヤーが外交姿勢を敵にしてきた場合、その人間プレイヤーへの外交姿勢を敵にするルールである。

(defrule
(players-stance any-human enemy)
=> (set-stance this-any-human enemy) )

civ-selected <civ>

■説明
この条件はコンピュータプレイヤーの文明をチェックする。

■注釈
文明によって動作を変えたい場合に使用する条件。下記の例は文明がゴートの場合、民兵を生産するルールである。

(defrule
(civ-selected goth) (can-train militiaman-line)
=> (train militiaman-line) )

players-civ <player-number> <civ>

■説明
この条件は指定されたプレイヤーの文明をチェックする。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
敵の文明によって動作を変えたい場合に使用する。下記の例は敵の文明がアステカ以外かつマヤ以外の場合、槍兵を生産するルールである。

(defrule
(not(players-civ any-enemy aztec)) (not(players-civ any-enemy mayan)) (can-train spearman-line)
=> (train spearman-line) )

player-number <player-number>

■説明
この条件はコンピュータプレイヤーのプレイヤー番号をチェックする。

■注釈
AIのプレイヤー番号判定に使う。同じAIでもチーム戦用にプレイヤー1とプレイヤー2で動作を変えたい場合などに使用できる。

(defrule
(player-number 1)
=> (chat-local-to-self "プレイヤー1") (disable-self) )

player-computer <player-number>

■説明
この条件は指定されプレイヤーがコンピュータプレイヤーかどうかチェックする。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
下記の例はプレイヤー2がコンピュータ(AI)の場合、外交姿勢を同盟にする例である。

(defrule
(player-computer 2)
=> (set-stance 2 ally) )

player-human <player-number>

■説明
この条件は指定されプレイヤーが人間のプレイヤーかどうかチェックする。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
下記の例はすべての敵プレイヤーが人間の場合、食料500をチートする例である。

(defrule
(player-human every-enemy)
=> (cc-add-resource food 300) (disable-self) )

player-in-game <player-number>

■説明
この条件は指定されたプレイヤーが有効なプレイヤーでまだゲーム中であるかチェックする。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
有効なプレイヤーでまだゲーム中であるというは、そのプレイヤーがゲームを放棄していない、且つ全滅していない状態のことを表す。

(defrule
(not(player-in-game 2))
=> (chat-local-to-self "プレイヤー2は滅びました") (disable-self) )

player-resigned <player-number>

■説明
この条件は指定されたプレイヤーが放棄して負けたかチェックする。プレイヤーは放棄しないで負けることもありえることに注意、だからこの条件はプレイヤーが負けたかチェックするのに使用すべきではない。プレイヤーが負けたかチェックするには (not (player-in-game <player-number)) を使用する。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
ゲームの放棄をしないで負ける状態とは、全滅によって負けることである。

(defrule
(player-resigned 1)
=> (chat-local-to-self "プレイヤー1はゲームを放棄しました") (disable-self) )

player-valid <player-number>

■説明
この条件は指定されたプレイヤーが有効なプレイヤーかチェックする。ゲーム中に2より多いプレイヤーがいる場合、ゲームが終わる前に負けたプレイヤーは有効なプレイヤーとみなされる。これはプレイヤーはゲーム内にはいないが、彼らのユニット・建物はまだゲーム内に存在できるからである。指定されたプレイヤーがまだゲーム内にいるかチェックするにはplayer-in-game 条件を使用する。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
ゲームに参加しているプレイヤー数の判定に使用できる。下記の例はプレイヤー3が有効ではない場合に「h2hです。」とチャットするルールである。

(defrule
(not(player-valid 3))
=> (chat-local-to-self "h2hです。") (disable-self) )