状況に応じてAIに臨機応変な動作をさせたい場合、より細かい条件を設定して命令する必要があります。ここでは複雑な条件設定についての説明をします。
現在の資源量に応じて軍の生産量を変える条件設定をする。資源を余らせ過ぎたり、資源が少ないのに軍事ユニットを作り過ぎることが少なくなる。
(1)領主の時代に射手を20体、金が300以上ある場合は30体まで作成する
;●射手生産 (defrule (current-age == feudal-age) ;領主の時代 (or (unit-type-count-total archer-line < 20) ;射手20未満 (and (unit-type-count-total archer-line < 30) ;射手30未満 (gold-amount >= 300) ;金が300以上 ) ) (can-train archer-line) ;作成できる => (train archer-line) ;射手の作成 )
;●射手生産 (defrule (current-age == feudal-age) ;領主の時代 (unit-type-count-total archer-line < 30) ;射手30未満 (or (unit-type-count-total archer-line < 20) ;射手20未満 (gold-amount >= 300) ;金が300以上 ) (can-train archer-line) ;作成できる => (train archer-line) ;射手の作成 )
上記の2つルールの例はどちらも同じ動作をする。下のルールは、直感的にわかりにくいがルールの条件数が1つ少なくなるので、ルールに条件を1つ多く追加することが可能である。
(1つのルールにつき「条件(and,orも1つとカウント)」と「命令」の合計が16個までの制限があるため)
(2)領主の時代に金が100以上ある場合は射手を20体、金が300以上ある場合は30体まで作成する
;●町の人の設定 (defrule (current-age == feudal-age) ;領主の時代 (or (and (unit-type-count-total archer-line < 20) ;射手20未満 (gold-amount >= 100) ;金が100以上 ) (and (unit-type-count-total archer-line < 30) ;射手30未満 (gold-amount >= 300) ;金が300以上 ) ) (can-train archer-line) ;作成できる => (train archer-line) ;射手の作成 )
;●町の人の設定 (defrule (current-age == feudal-age) ;領主の時代 (unit-type-count-total archer-line < 30) ;射手30未満 (gold-amount >= 100) ;金が100以上 (or (unit-type-count-total archer-line < 20) ;射手20未満 (gold-amount >= 300) ;金が300以上 ) (can-train archer-line) ;作成できる => (train archer-line) ;射手の作成 )
上記の2つルールの例はどちらも同じ動作をする。下のルールは、直感的にわかりにくいがルールの条件数が2つ少なくなるので、ルールに条件を2つ多く追加することが可能である。
城主の時代になったらすぐに「石弓射手」の研究と「錐状矢じり」の研究をしたい。ただし「石弓射手」の研究を優先する。
(1)石弓射手の研究が完了したら錐状矢じりを研究する
;●射手生産 (defrule (current-age == castle-age) ;城主の時代 (research-completed ri-crossbow) ;石弓射手研究済み (can-research ri-bodkin-arrow) ;錐状矢じりが研究可能 => (research ri-bodkin-arrow) ;錐状矢じりを研究する )
上の条件では「石弓射手」の研究を優先ることはできるが、資源が余っても、「石弓射手」の研究が完了するまで「錐状矢じり」の研究が開始できない。
(2)石弓射手の研究中か研究が完了したら錐状矢じりを研究する
;●射手生産 (defrule (current-age == castle-age) ;城主の時代 (not(research-available ri-crossbow)) ;石弓射手の研究が無効 (can-research ri-bodkin-arrow) ;錐状矢じりが研究可能 => (research ri-bodkin-arrow) ;錐状矢じりを研究する )
「(research-available xxxxx)」というのは、「研究の前提条件を満たし、且つ研究中や研究完了でないとき」という条件である。逆に「not(research-available xxxxx)」は、「研究の前提条件を満たしていない、または研究中または研究完了のとき」という条件になる。
上記のルールでは「城主の時代」という条件があり、錐状矢じりの「研究の前提条件を満たさない」ことはないので、「not(research-available xxxxx)」は「研究中または研究完了のとき」という条件と同じ意味になる。このように「not(research-available xxxxx)」を使えば研究中かどうかを判定できる。