基礎編

マニュアルを読んで分かるなら
AI を作成する方法は、AOK の CD-ROM の Docs フォルダに入っている Cpsb.doc という Word 形式のマニュアルに書いてあります。ただし、全て英語で、なおかつ説明されていない部分があります。これを読んで分かる人はそれで良いと思います。あとは、インターネット上にあるサンプル、特に開発元の Ensamble Studio の人 (ただしこの人は AI とは関係のない部署の人らしい) が書いた AI を手に入れて読めば良いでしょう。

AI を作成するためのツールもあります。ただし、そのツールはメモ帳というかワードパッドの延長線上にあるもので、キーワードを色づけして表示してくれたり、文法の解析なんかもやってくれはしますが、それでもやはり AI はアイコンを配置する程度では作れません。ちなみに、そのツールの中に、Cpsb.doc の Windows ヘルプファイル版があるので、それだとキーワードの検索なんかが簡単で良いと思います。やはり英語ですが。
 

基本文法
AI ファイルの文法は、リスト記述言語と呼ばれるものに近いのですが、文法は特に気にするほどのものではありません。ここで丁寧な文法解説をしたり、マニアックに EBNF で文法を説明したりしても、さして意味はないと思いますので省略します。

はっきり言えば、ちゃちな言語です。Lisp や Scheme を知っている人ならきっと失笑するでしょう。プログラミング言語を見たこともないという人でも、そんなに気にする必要はありません。

これだけは確認しておきましょう。一番重要な defrule 文の構文は以下の通りです。

(defrule
  (条件1)
  (条件2)
  .
  .
  (条件N)
  =>
  (命令1)
  (命令2)
  .
  .
)
命令が、たとえば建物を建てたり、ユニットを生産したり、戦略を変更したりする部分です。条件は、その命令を実行するための条件を書くところです。たとえば、いま木をどのくらい持っているか、どの時代か、ゲーム開始からどのくらい時間がたったか、現在の戦略はどうなっているか、などです。

改行は入れても入れなくてもかまいません。ただし、括弧だけは忘れないでください。括弧の対応も重要です。

ここで簡単な例を挙げましょう。

; 家を二つ建てる
(defrule
  (building-type-count-total house < 2)
  (can-build house)
  =>
  (chat-local-to-self "家を最低二つ建てます")
  (build house)
)

上の文は、建物の中で家が二つ以下で、家をすぐに建てられるときは、チャットで自分だけに "家を最低二つ建てます" と言って、実際に家を建てようとします。

defrule 文はいくつもいくつも書きます。全ての defrule 文が毎回数秒おきに調べられます。

; (セミコロン) 以下の文字はコメント文として、好きなことを書いておけます。
 

当たり前のことをするには?
普通私たちがプレイするとき、ゲーム開始時にやることと言えば、村人を作ることと、家を建てることと、斥候に探索させることです。こうした当たり前のことをするにも、一つ一つ AI に記述する必要があります。

1. 村人を作る

村人を作ること自体は簡単です。

(defrule
  (true)
  =>
  (train villager)
)

このような文を AI ファイル (.per) に入れてやるだけで、可能な限りひたすら村人を作りつづけます。(true) とは、どんなときにも当てはまる条件です。しかし、これからのことを考えて、念のために以下のようにしてください。

(defrule
  (can-train villager)
  =>
  (train villager)
)

なぜこうするかというと、train 文で確実にユニットを生産できるようにしたいからです。ですから、たとえば村人を作ると同時に確実に何かしたいとき、技術を研究したり建物を建てたりフラグを立てたりしたいときのことを考えて、命令部分が確実に実行されるようにしておいたほうがあとで混乱しなくて良いと思います。

他には (can-train-with-escrow villager) などという条件があります。この条件は、非常用として通常は使いたくない資源量を使わなくても村人を作れるかどうか、という条件文です。この非常用という仕組みについてはあとで解説します。(修正 2000-1-5)
上のままでは、人口に余裕があれば際限無く村人が作られてしまいます。人数を制限したいときには、以下のようにします。

(defrule
  (unit-type-count-total villager < 7)
  (can-train villager)
  =>
  (train villager)
)

上の (unit-type-count-total villager < 7) は、村人の数が七人未満の時に満たされる条件です。ちなみに、村人数ではなく総人口で判断するには (population < 7) という条件を使うことが出来ます。もちろん、豊富に用意されているあらゆる条件をここに書くことが出来ます。条件の解説は、AOK の CD-ROM の Docs フォルダに入っている Cpsb.doc という Word 形式のマニュアルの中の Facts という項目に全て説明されています。

ちなみに、機織りの研究が終わったあとでは村人を 15人まで作りたい、というときは以下のようにすれば可能です。

;  村人を 15人まで作る (機織りの研究が終わったあと)
(defrule
  (unit-type-count-total villager < 15)
  (research-completed ri-loom)
  (can-train villager)
  =>
  (train villager)
)

villagerri-loomhouse といったものは、マニュアルでは parameters と呼ばれ、それらもまとめて説明されています。villager<unit> の中の一つとして、ri-loom<research-item> の中の一つとして、house<building> の中の一つとして分類されており、それぞれ適切な条件文のパラメータとして使用されます。

2. 家を建てる

家を建てるのは、さきほどの村人の例が分かれば簡単です。先の項でも例として出しましたが、ここでもう一度出すことにします。

; 家を建てる
(defrule
  (true)
  =>
  (build house)
)

こう書いてしまうと、恐らくマップが埋まるまで家を建てつづけてしまうので、実際にはこのように書きます。

; 家を二軒建てる
(defrule
  (building-type-count-total house < 2)
  (can-build house)
  =>
  (build house)
)

なお、AI を書きやすくするため、家を建てるのに都合のいい条件がいくつかあります。たとえば、家を建てる必要が出てきたときになって初めて家を建て始めるようにしたいときは、以下のように書けばよいのです。

; 家を必要なときに建てる
(defrule
  (housing-headroom == 0)
  (can-build house)
  =>
  (build house)
)

まあそれでは普通遅いので、実際には (housing-headroom < 2) などとしておくと、残りあと二つユニットを作ってしまうと家が足りなくなる、というときに家を作るようにすることが出来ます。

3. 斥候に探検させる

これにはそれなりの手順があります。とにかく以下のようにすれば、斥候だけが探索に行くようになります。

; 探索の設定
(defrule
  (true)
  =>
  ; 村人には探索させない
  (set-strategic-number sn-percent-civilian-explorers 0)
  (set-strategic-number sn-cap-civilian-explorers 0)
  ; 斥候一人に探索させる
  (set-strategic-number sn-number-explore-groups 1)
  (set-strategic-number sn-minimum-explore-group-size 1)
  (set-strategic-number sn-maximum-explore-group-size 1)
  (set-strategic-number sn-number-defend-groups 0)
  (set-strategic-number sn-number-attack-groups 0)
  (disable-self)
)

前半部分で、村人 (civilian) に探索 (explore) させないように設定しています。percent は文字通り村人全体に対する割合を表し、cap は capacity の略で、何人までをこの任務につかせることが出来るかを設定します。詳しくは後述しますが、両方とも 0 にしておけば、村人が探索することはなくなります。

後半部分では、斥候に探検させるように設定していますが、実際には多少複雑です。

AOK の AI では、ユニットはグループに分けられます。いったんグループに分けられると、次にグループに関する変更がないうちは同じグループに属する事になります。そこで、後半部分では、ゲーム開始時に探検グループを一つだけ作り、攻撃グループと防御グループを作らないようにしています。そうすることで、唯一の軍事ユニットである斥候は、うまく探検グループに所属されることになるわけです。斥候がいったん探検グループに入ると、探検グループに入っているうちはコンピュータが自動的に探検してくれます。

最後の (disable-self) は、この defrule 文自体を二度と適用されないようにする命令です。これを入れておかないと、たとえば村人を探索に出したくなったときや、攻撃グループ・防御グループを作りたくなったときに、それぞれの値を変更しても値が元に戻ってしまいます。構文の順序を揃えることにより、値が常に望む値を取るようには出来ますが、そうすると構文が毎回毎回読まれて毎回毎回値が書き換わることにより、処理速度が低下して望ましくありません。ですから、出来るだけ不要な構文は (disable-self) することにしましょう。
 

[download]
Nestoris AI
(領主の時代までなら進化できる AI ファイル)

(gomi@din.or.jp)