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

条件(ユニット・人口系)

can-train <unit>

■説明
この条件は指定されたユニットの生産が開始できるかチェックする。特に以下の項目をチェックする。
・そのユニットがコンピュータプレイヤーの文明で有効であること。
・テクノロジーツリーのユニット生産の前提条件が満たされていること。
・そのユニット生産に必要な資源があること。備蓄資源は資源量としてカウントしない。
・ユニット用に十分な家のあきがあること。
・研究中・生産中ではない、ユニット生産が開始できる建物があること。

<unit>にはユニット系列のワイルドカードパラメータを使用してよい。

■注釈
ユニットを生産するルールで必ず使う条件である。備蓄資源を使わないでユニットが生産できるかどうか判定する。下記の例で、プレイヤーが木25、金45を所有してしても備蓄資源の割合を例えば20%(木5、金9が備蓄される)に設定していた場合、使用可能な資源が足りないため下例の「can-train」条件は満たされない。備蓄資源の割合が0%の場合は「can-train」と「can-train-with-escrow」は同じ意味になる。

(defrule
  (can-train archer-line)
=>
  (train archer-line)
)

can-train-with-escrow <unit>

■説明
この条件は指定されたユニットの生産が開始できるかチェックする。特に以下の項目をチェックする。
・そのユニットがコンピュータプレイヤーの文明で有効であること。
・テクノロジーツリーのユニット生産の前提条件が満たされていること。
・備蓄資源を使用した時にそのユニット生産に必要な資源があること。
・ユニット用に十分な家のあきがあること。
・研究中・生産中ではない、ユニット生産が開始できる建物があること。

<unit>にはユニット系列のワイルドカードパラメータを使用してよい。

■注釈
「can-train」条件の備蓄資源版の条件。備蓄資源も使用してユニットが生産可能か判定する。備蓄資源を使用するときは「release-escrow」命令を必ず使用する必要がある。

(defrule
  (can-train-with-escrow archer-line)
=>
  (release-escrow wood)
  (release-escrow gold)
  (train archer-line)
)

can-afford-unit <unit>

■説明
この条件はコンピュータプレイヤーが指定されたユニットを生産する十分な資源をもっているかチェックする。
この条件は備蓄資源を(保有する)資源量としてカウントしない。
<unit>にはユニット系列のワイルドカードパラメータを使用してよい。

■注釈
下記の例は、戦士育成所があり民兵系の生産用資源があるのに民兵系が生産できない場合、「戦士育成所で生産中or研究中です。」とチャットする。

(defrule
  (building-type-count barracks >= 1)
  (can-afford-unit militiaman-line)
  (not(can-train militiaman-line))
=>
  (chat-local-to-self "戦士育成所で生産中or研究中です。")
)

unit-available <unit>

■説明
この条件はそのユニットがコンピュータプレイヤーの文明で有効であること、テクノロジーツリーのユニット生産の前提条件が満たされていることをチェックする。
そのユニットの生産が開始できるか(これは資源があるか、家のあきがあるか、生産に必要な建物が現在研究や他のユニットの生産に使用されているかによる)はチェックはしない。
<unit>にはユニット系列のワイルドカードパラメータを使用してよい。

■注釈
文明ごとに使用可能なユニットが違うので、それを判定するために使用する条件。指定したユニットが使用可能な文明でもテクノロジーツリーの前提条件を満たさないとこの条件を満たさないことに注意。たとえばスペインで(unit-available hand-cannoneer)の条件は化学の研究が完了した時点でこの条件が満たされる。つまり、この条件では城主の時代から砲撃手が有効な文明であるかを判定することはできない。 下記の例は城主の時代以降で騎士が有効でない文明は戦士育成所を4つまで建設する。

(defrule
  (current-age >= castle-age)
  (not(unit-available knight-line))
  (building-type-count barracks< 4)
  (can-build barracks)
=>
  (build barracks)   
)

housing-headroom <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの家の空きをチェックする。家の空きとは、現在の家の収容能力と生産されたユニットの人数の差である。例えば、コンピュータプレイヤーに町の中心(収容数5)、家(収容数5)、6人の町の人がいる。この場合、家の空きは4である。

■注釈
主に家の建設に使用する条件である。下記の例は暗黒の時代に家の空きが2未満になったら家を建設するルールである。

(defrule
  (current-age == dark-age)
(housing-headroom < 2) (can-build house)
=> (build house) )

population-headroom <rel-op> <value>

■説明
この条件はコンピュータプレイヤーが人口の空きをチェックする。人口の空きとはゲームの人口上限と現在の家の収容能力の差である。例えば、人口上限75のゲームでコンピュータプレイヤーに町の中心(収容数5)と家(収容数5)がある。この場合、人口の空きは65である。

■注釈
下記の例は、人口の空きが0より大きい場合で家の空きが5未満になったら家を建設するルールである。

(defrule
(population-headroom > 0) (housing-headroom < 5) (can-build house)
=> (build house) )

unit-count <rel-op> <value>

■説明
この条件はコンピュータプレイヤーのユニット数をチェックする。すでに生産されたユニットのみ含まれる。

■注釈
「population」 条件は純粋に現在の人口をカウントするのに対して、「unit-count」 条件はユニットが倒されてHPが0になってから死体のグラフィックにかわるまでの瞬間もユニット数としてカウントされる。さらに、「unit-count」 条件は町の人(女)、聖なる箱をもった聖職者、王、チートユニット(コブラカー、VMDL、破壊工作人)がユニット数としてカウントされないという違いがある(人口としてはカウントされる)。下記の例は町の人の男女比をチャット表示するルールである。

(defrule
  (unit-type-count villager == 3)
  (population == 3)
  (unit-count == 1)
=> (chat-local-to-self "町の人 男:1 女:2") (disable-self) )

unit-count-total <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの総ユニット数をチェックする。総ユニット数は生産されたユニットと生産中のユニットを含む。

■注釈
生産中のユニットを数に含めること以外は「unit-count」と同じであるが、生産中の町の人は常に町の人(男)となるので生産中の町の人は常にカウントされる。ただし生産された町の人が女だった場合カウントされず、生産された瞬間に「unit-count-total」のユニット数が減ったように見える。下記の例は帝王の時代にユニット数が200以上で遠投投石器がない場合、町の人を削除するルールである。

(defrule
  (current-age == imperial-age)
  (unit-count-total >= 200)
  (unit-type-count-total trebuchet == 0)
=>
(delete-unit villager) )

players-unit-count <player-number> <rel-op> <value>

■説明
この条件は指定されたプレイヤーのユニット数をチェックする。コンピュータプレイヤーは見えたユニットのみ(つまりチートはしない)信頼する。味方と自分自身に対しては、生産されたユニットのみ含まれる。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
主に発見した敵のユニット数を数えるのに使用する。

(defrule
(players-unit-count any-enemy >= 1)
=> (chat-local-to-self "敵を発見") (disable-self) )

cc-players-unit-count <player-number> <rel-op> <value>

■説明
players-unit-countのチートバージョンである。使用目的はシナリオのみ。
この条件は指定されたプレイヤーのユニット数をチェックする。生産されたユニットのみ含まれ霧(の存在)は無視される。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
視界内にいないユニットも含めて敵ユニットの数を判定する条件。いわゆる視界チートにあたる。条件名の前に「cc-」と付いているのはチートコマンドのことである。

(defrule
(cc-players-unit-count any-enemy == 10)
=> (chat-local-to-self "敵のユニット数は10です") (disable-self) )

unit-type-count <unit> <rel-op> <value>

■説明
この条件はコンピュータプレイヤーのユニット数をチェックする。指定された種類のすでに生産されたユニットのみ含まれる。
<unit>にユニット系列ワイルドカードパラメータを使用してよい。

■注釈
下記の例は破城槌が2体以上の場合、攻撃を行う例である。同じようでも「unit-type-count-total」条件の方を使用すると生産中のユニット数も含まれてしまうので、下の例では破城槌を2つ生産中に攻撃が実行されてしまう。

(defrule
(unit-type-count battering-ram-line >= 2)
=> (attack-now) )

unit-type-count-total <unit> <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの総ユニット数をチェックする。総ユニット数は指定された種類の生産されたユニットと生産中のユニットを含む。

■注釈
ユニット生産時にユニット数の上限を指定するために使用することが多い。下記の例は騎士系を30まで生産する例である。生産ユニット上限に「unit-type-count」条件の方を使用すると、複数小屋でユニット生産した場合に上限以上のユニットが生産されてしまうのでこちらの条件を使用する。

(defrule
(unit-type-count-total knight-line < 30) (can-train knight-line)
=> (train knight-line) )

players-unit-type-count <player-number> <unit> <rel-op> <value>

■説明
この条件は指定されたプレイヤーのユニット数をチェックする。コンピュータプレイヤーは見えたユニットのみ(つまりチートはしない)信頼する。味方と自分自身に対しては、指定された種類の生産されたユニットのみ含まれる。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
敵のユニット数を数えてアンチユニットを生産する場合などに使用する。下記の例は敵の騎士系が10体以上の場合、槍兵系を10体まで生産する。注意点としては「players-unit-type-count」は一度でも見えた敵ユニットの数なので、下の例では敵の騎士が10体以上いても、いままでに1体も騎士が見えていなければ(もしくは見えた騎士すべてを倒してしまったら)、槍兵系は生産されない。

(defrule
(players-unit-type-count any-enemy knight-line >= 10) (unit-type-count-total spearman-line < 10) (can-train spearman-line)
=> (train spearman-line) )

cc-players-unit-type-count <player-number> <unit> <rel-op> <value>

■説明
players-unit-type-countのチートバージョン。使用目的はシナリオのみ。
この条件は指定されたプレイヤーのユニット数をチェックする。指定された種類の生産されたユニットのみ含まれ霧(の存在)は無視される。
<player-number>に「any」または「every」ワイルドカードパラメータを使用してよい。

■注釈
視界内に見えていないユニットの数も含めてユニットを判定する条件である。いわゆる視界チートにあたる。通常の「players-unit-type-count」で数えられない地の女神のユニット数をカウントのにも使用される。下記の例はユニットID69(小魚)が1以上いる場合、「小魚がいるので海マップです。」とチャットするルールである。

(defrule
(cc-players-unit-type-count GAIA 69 >= 1) => (chat-local-to-self "小魚がいるので海マップです。") (disable-self) )

population <rel-op> <value>

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

■注釈
全ユニット数を数えたい場合は町の人(女)がカウントされない「unit-count」条件よりも「population」条件を使用したほうがよい。

(defrule
(population >= 100)
=> (chat-local-to-self "人口100突破") (disable-self) )

players-population <player-number> <rel-op> <value>

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

■注釈
実際にはゲーム中に人間のプレイヤーが人口推移のタイムラインをみることができないので、この条件で敵の人口を判定するのはチートに近い。「players-unit-count」条件を使えば一度でも視界内に見えた敵のユニット数のみカウントできる。

(defrule
  (population < 55)
(players-population any-enemy >= 60)
=>
(chat-local-to-self "劣勢です。") (disable-self) )

civilian-population <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの非軍事人口をチェックする。非軍事人口とは、町の人、交易ユニット、漁船、などである。

■注釈
上記以外に輸送船が非軍事人口に含まれる。聖職者、宣教師、王は非軍事人口には含まれない。海マップで町の人と漁船の合計を判定したい場合に使用する。下記の例は暗黒の時代に町の人と漁船の合計が30になるまで町の人を生産する。

(defrule
  (current-age == dark-age)
(civilian-population < 30) (can-train villager)
=> (train villager) )

players-civilian-population <player-number> <rel-op> <value>

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

■注釈
実際にはゲーム中に人間のプレイヤーが人口推移のタイムラインをみることができないので、この条件で敵の人口を判定するのはチートに近い。「players-unit-type-count」条件と違い敵の町の人が見えてなくても敵の町の人の人口がわかる。下記の例はアラビアマップで暗黒の時代に敵の非軍事人口が25以上の場合、「敵は即城です。」とチャットするルールである。

(defrule
  (map-type arabia)
  (players-current-age every-enemy == dark-age)
(players-civilian-population every-enemy >= 25)
=> (chat-local-to-self "敵は即城です。") (disable-self) )

military-population <rel-op> <value>

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

■注釈
聖職者、宣教師、王は軍事ユニットに含まれない。下記の例は軍事ユニットが30以上の場合、破城槌を2つ生産するルールである。

(defrule
(military-population >= 30) (unit-type-count battering-ram-line < 2)
(can-train battering-ram-line)
=> (train battering-ram-line) )

players-military-population <player-number> <rel-op> <value>

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

■注釈
聖職者、宣教師、王は軍事ユニットに含まれない。実際にはゲーム中に人間のプレイヤーが人口推移のタイムラインをみることができないので、この条件で敵の人口を判定するのはチートに近い。下記の例は自軍が30以上で敵軍が20未満の場合に攻撃を行うルールである。ただし、聖職者は軍事人口としてカウントされないので、敵が爺ラッシュの場合は敵の軍事人口が0だと判定されて大量の聖職者の中に攻撃を仕掛けてしまうことがあるので要注意。

(defrule
(military-population >= 30)
(players-military-population any-enemy < 20)
=> (attack-now) )

soldier-count <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの陸軍数をチェックする。陸軍とは陸を基点とする軍事ユニットである。

■注釈
海マップなど陸軍と海軍がいる時に陸の軍事ユニットのみカウントしたい場合にこの条件を使用する。下記の例は陸軍が30以上で輸送船が2以上いる場合、陸軍が攻撃を行うルールである。

(defrule
(soldier-count >= 30)
(unit-type-count transport-ship >= 2)
=>
(set-strategic-number sn-percent-attack-soldiers 100)
(set-strategic-number sn-percent-attack-boats 0)
(attack-now)
)

attack-soldier-count <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの攻撃陸軍の数をチェックする。攻撃陸軍とは陸を基点とする現在攻撃グループに割り当てられている軍事ユニットである。

■注釈
攻撃グループとは、「attack-now」や「sn-minimum-attack-group-size」の設定によって生成されるグループのことである。攻撃しているユニットがすべて攻撃グループというわけではない(守備軍による攻撃・迎撃もある)。下記の例は攻撃軍が0で自分の町を攻撃されているときに攻撃(迎撃)を行うルールである。

(defrule
  (military-population >= 30)
  (town-under-attack)
(attack-soldier-count == 0)
=> (attack-now) )

defend-soldier-count <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの守備陸軍の数をチェックする。 守備陸軍とは陸を基点とする現在攻撃グループに割り当てられていない軍事ユニットである。

■注釈
攻撃グループに割り当てられていない軍事ユニットはすべて守備グループである。例えば生産されたユニットはすべて攻撃命令がでて攻撃グループに組み込まれるまで守備軍という扱いである。下記の例は陸軍ユニットが30以上で守備陸軍が0の場合、「攻撃中です。」とチャットするルールである。

(defrule
(soldier-count >= 30) (defend-soldier-count == 0)
=> (chat-local-to-self "攻撃中です。") (disable-self) )

warboat-count <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの軍船の数をチェックする。軍船とは攻撃可能な船のことである。

■注釈
海戦をするAIでガレー船や火炎船の合計数を判定するのに使用する。下記の例は帝王の時代に軍船(ガレー船や火炎船の合計)が60未満の場合にガレー船系を生産するルールである。

(defrule
  (current-age == imperial-age)
(warboat-count < 60) (can-train galley-line)
=> (train galley-line) )

attack-warboat-count <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの攻撃軍船の数をチェックする。軍船とは現在攻撃グループに割り当てられている攻撃可能な船のことである。

■注釈
下記の例は攻撃軍船が0の場合、「海軍攻撃停止。」とチャットするルールである。

(defrule
(attack-warboat-count == 0)
=> (chat-local-to-self "海軍攻撃停止。") (disable-self) )

defend-warboat-count <rel-op> <value>

■説明
この条件はコンピュータプレイヤーの守備軍船の数をチェックする。 軍船とは現在攻撃グループに割り当てられていない攻撃可能な船のことである。

■注釈
下記の例は守備軍船が1以上の場合、海軍の攻撃を実行するルールである。守備軍なしで常に攻撃していたい場合に使うルールである。

(defrule
(defend-warboat-count >= 1)
=> (set-strategic-number sn-percent-attack-soldiers 0)
(set-strategic-number sn-percent-attack-boats 100)
(attack-now) )