1章 暗黒の時代基礎 〜資源の収集と探索〜

1.町の人の動きの設定

AIスクリプトでは資源の収集は町の人ひとりひとりに指示を出すのではなく、 各資源を収集する町の人の割合を設定することによって行う。AIの町の人は「探索グループ」、 「建設グループ」、「収集グループ」の3つのグループに分かれて仕事をする。 さらに「収集グループ」にはそれぞれの資源ごとに「木収集グループ」、 「食料収集グループ」、「金収集グループ」、「石収集グループ」に分かれる。この仕事の割合を一度設定しておけば、あとは自動で町の人は探索や資源の収集をする。

以下のAIスクリプトは、ゲーム開始直後に探索グループ0%、建設グループ10%、 収集グループ90%(収集グループ内の割合は食料収集グループ100%)に設定する例である。 また各グループごとの最大人数も設定している。

;●町の人の設定
(defrule
  (true)
  =>
  (set-strategic-number sn-percent-civilian-explorers  0) ;探索グループの割合
  (set-strategic-number sn-percent-civilian-builders  10) ;建設グループの割合
  (set-strategic-number sn-percent-civilian-gatherers 90) ;収集グループの割合
  (set-strategic-number sn-cap-civilian-explorers      0) ;探索グループの最大数
  (set-strategic-number sn-cap-civilian-builders     200) ;建設グループの最大数
  (set-strategic-number sn-cap-civilian-gatherers    200) ;生産グループの最大数
  (set-strategic-number sn-wood-gatherer-percentage    0) ;木を収集する人の割合
  (set-strategic-number sn-food-gatherer-percentage  100) ;食料を収集する人の割合
  (set-strategic-number sn-gold-gatherer-percentage    0) ;金を収集する人の割合
  (set-strategic-number sn-stone-gatherer-percentage   0) ;石を収集する人の割合
  (disable-self)
)

【条件】
(true) … 無条件にルールを実行。上記のルールはゲーム開始直後にすぐ実行される。

【命令】
(set-strategic-number 「戦略数値名」 「値」) … 戦略数値(AIの行動の基本となる設定値)を設定する。戦略数値は町の人の作業割合など100種類以上ある。
(disable-self) … ルールを一度だけ実行するための命令。ルールは条件を満たしている限り何度でも実行されるので、初期化に使うルール等にこの命令を入れる。

2.斥候の動きの設定

町の人の設定と同様に斥候もグループの設定によって行う。軍事ユニットのグループは「探索グループ」、「攻撃グループ」、「守備グループ」の3つがある。町の人のグループ設定と違うのは、軍事ユニットの設定はグループ毎の割合を設定するのではなく、各グループのグループ数と1グループの最大・最小人数を設定するところである。

以下のAIスクリプトは、斥候で探索するために「探索グループ」1つ、「攻撃グループ」なし、「守備グループ」なしに設定する例である。

;●軍事ユニットの設定
(defrule
  (true)
  =>
  (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-minimum-civilian-explorers  0) ;町の人の探索者数
  (set-strategic-number sn-total-number-explorers      1) ;探索者数合計
  (set-strategic-number sn-number-attack-groups        0) ;攻撃グループ数
  (set-strategic-number sn-minimum-attack-group-size   0) ;攻撃グループの最小人数
  (set-strategic-number sn-maximum-attack-group-size   0) ;攻撃グループの最大人数
  (set-strategic-number sn-number-defend-groups        0) ;防御グループ数
  (set-strategic-number sn-minimum-defend-group-size   0) ;防御グループの最小人数
  (set-strategic-number sn-maximum-defend-group-size   0) ;防御グループの最大人数
  (disable-self)
)

★ポイント
上記の例ではゲーム開始時の設定を町の人の設定と軍事ユニットの設定に分けて2つのルールを作成している。これは1つのルール内で使える条件の数と命令の数が16個以内という制限があるためである。長すぎるルールを作成するとAI実行時にエラーとなる。

3.家の建設

町の人と斥候の初期設定ができたらゲーム開始後にまずやるべきことは家の建設である。AIに建物の建設させるには建設の命令をする必要がある。資源の収集の割合を設定するのと違い、1つの建物を建てるごとに命令をする必要がある。

以下のAIスクリプトは、ゲーム開始直後に家を1件建設し、「家を建設します」と自分自身にチャットする例である。

;●最初の家の建設
(defrule
  (can-build house)                                  ;家が建設可能
=>
  (build house)                                      ;家を建設する
  (chat-local-to-self "家を建設します")
  (disable-self)
)

【条件】
(can-build 「建物」) … その建物が建設できるかどうか。建設する資源があるか、文明や建設する前提条件を満たしているか。
(chat-local-to-self "文字列") … 自分自身にチャットメッセージを送る。リプレイにはこのメッセージ
は記録されない。AIのテスト時に使用するチャット表示である。

【命令】
(build 「建物」) … 指定した種類の建物の建設する。

人口が増えるごとに家を随時建設するには下の例のようなルールを作成する。

;●家の建設
(defrule
  (housing-headroom <= 2)                            ;家の残り人口許容数が2以下
  (can-build house)                                  ;家が建設可能
=>
  (build house)                                      ;家を建設する
  (chat-local-to-self "家を建設します")
)

【条件】
(housing-headroom 「演算子」 「値」) … 家や町の中心が許容する人口までの残り人数を判定。この例では人口の許容数が残り2人以下で家が建設可能な場合に家を建設する。演算子の部分には次のいずれかが入る。「==」等しい、「<=」以下、「<」未満、「>=」以上、「>」より大きい、「!=」等しくない。

★ポイント
条件が2以上あるルールは全ての条件が満たされている場合のみルールが実行される。

4.町の人の生産

ゲーム開始時に家の建設と同時に行うのが町の人の生産である。このAIでは25人進化であるので暗黒の時代は町の人を24人まで作成する。

;●暗黒の町の人の生産
(defrule
  (current-age == dark-age)                          ;暗黒の時代
  (unit-type-count villager < 24)                    ;町の人が24人未満
  (can-train villager)                               ;町の人を作成可能
=>
  (train villager)                                   ;町の人を生産する
  (chat-local-to-self "町の人を生産します")
)

【条件】
(current-age 「演算子」 「時代」) … 自分の現在の時代を判定。時代には次のいずれかが入る。「dark-age」暗黒の時代、「feudal-age」領主の時代、「castle-age」城主の時代、「imperial-age」帝王の時代。
(unit-type-count 「ユニット」 「演算子」 「値」) … 指定した種類のユニットの数(生産中のユニットは数に含まれない)を判定。
(unit-type-count-total 「ユニット」 「演算子」 「値」) … 指定した種類のユニットの数(生産中のユニットが数に含まれる)を判定。
(can-train 「ユニット」) … そのユニットが生産できるかどうか。生産できる資源があるか、生産する前提研究条件を満たしているか。生産する建物は空いているか(すでにユニット生産中ではないか)。

【命令】
(train 「ユニット」) … 指定した種類のユニットの生産を行う。

5.まとめ

1章のAIをダウンロード(sample01.per)