ランダム マップ スクリプトはAOKがマップを生成するために必要な情報を記述したテキスト ファイルです。 作成するには何らかのテキスト エディタが必要ですが、Windowsに付属している「メモ帳」でも十分です。 スクリプト ファイルを、AOKがインストールされたフォルダ内の random フォルダにコピーしておけばマップとして選択できるようになります。 スクリプトのファイル名が、そのままマップの名称として扱われます。 あまり長い名前にすると、そのマップを選択した時にAOKが強制終了してしまう場合があるので注意してください。 拡張子は rms にする必要があります。
スクリプトの構文の解説に入る前に、スクリプトがどのような感じで構成されているのかを説明します。 スクリプトの主な内容を大雑把に表現すると「地形を作る」「ユニットを作る」「崖を作る」などといったような意味をもつ英単語の組み合わせが何行も並んでいます。 これらについて、さらに詳細な指示が記述されています。 例えば「地形を作る」の場合には「地形の種類は草地」「広さはマップ全体の20%」「10個所に分割して配置する」など、「ユニットを作る」の場合は「作るユニットは羊」「数は4」「プレイヤーのスタート地点の近くに配置する」などのような指示です。
次の記述は実際のスクリプトの例です。
create_object SHEEP
{
number_of_groups 2
number_of_objects 4
terrain_to_place_on GRASS
set_loose_grouping
}
草地の上だけに4匹の羊を2グループ(合計8匹)配置するように指示しています。
スクリプトは基本的に、このような指示の連続で構成されています。
"create_object"という語句は、たくさんある指示文の一つです。 AOKのマップ生成機能に対しての「〜をしなさい」という命令なのです。 この語句は「オブジェクトを作りなさい」という意味を持ちます(オブジェクトとはユニットや建物、金鉱や森など、マップに配置できる物体のことです)。 この解説では、このような語句を「インストラクション(instructions)」と表現しています。
何を作ればよいのかは"SHEEP"という語句があらわしています。 ランダム マップ スクリプトにおいて"SHEEP"とは「羊」のことを指していますので、この例では「羊を作りなさい」という指示文になります。 ランダム マップ スクリプトには"SHEEP"のようにオブジェクトや地形などを意味する語句がたくさん用意されています。 "VILLAGER"(町の人)、"GOLD"(金鉱)、"FORAGE"(果実の木)、"CASTLE"(城)など、ほとんどすべてのオブジェクトに対して用意されています。 この解説では、このような語句を「定数(constants)」と表現しています。 また、定数があらわす内容により「オブジェクト定数」「地形定数」のように区別して表現する場合もあります。 定数は基本的に大文字で記述されます。
ほとんどのインストラクションは、"SHEEP"などのように定数や数値などを続けて記述する必要があります。 この時、インストラクションの語句と定数・数値の間には空白もしくはタブを1文字以上挿んでください。 間で改行したり余計な文字を挿むと、スクリプトは正しく解釈されません。
"create_object SHEEP"は「羊を作りなさい」という意味になりますが、これだけでは何匹の羊を作ればよいのか分かりません。 このようなインストラクションには、さらに細かい指示が必要になります。 次の行に"{"、最後の行に"}"が記述されていますが、この間の行には"create_object SHEEP"を補助する役割を持つ一連のインストラクションが記述されています。
"number_of_groups 2"と"number_of_objects 4"は羊の数を指示しており、この場合は「4匹の羊のグループが2つ」ということになります。
"terrain_to_place_on"は、どの地形に配置するのかを指示しており、この場合は草地(GRASS)になります。
"set_loose_grouping"は羊たちの間に若干の隙間を空けて配置することを指示しています。 インストラクションの中には、このように定数や数値を必要としないものもあります。
この解説では"create_object"のように「〜を作りなさい」というインストラクションを「生成インストラクション」、それを補助するインストラクションを「詳細インストラクション」と表現しています。 生成インストラクションは、それだけではまともに機能しません。 必ず、それに続けて詳細インストラクションを記述することになるでしょう。 詳細インストラクションは単独で使用されることはありません。 詳細インストラクションはブレース("{"、"}")で挟まれた行に記述されます。 ブレースは、それぞれ1行使用します。
次の表は、それぞれのマップ サイズの辺の長さや面積を示しています。
マップ サイズ マップ ラベル 1辺の長さ 総タイル数 拡大率 極小 (2 プレイヤー) TINY_MAP 72x 72 5,184 0.5 小 (3 プレイヤー) SMALL_MAP 96x 96 9,216 0.9 普通 (4 プレイヤー) MEDIUM_MAP 120x120 14,400 1.4 大 (6 プレイヤー) LARGE_MAP 144x144 20,736 2.1 広大 (8 プレイヤー) HUGE_MAP 200x200 40,000 4.0 特大 GIGANTIC_MAP 255x255 62,025 6.2
「マップ ラベル(map lavel)」とは、スクリプト中で使用されるマップ サイズの定数で、後で説明する条件文で使用します。 「拡大率(scaling factor)」とは、例えばマップの広さによってオブジェクトの数などを比例させたい場合に使用する掛率です。 辺の長さや面積は「タイル(tiles)」という単位で表現されています。
次は実際にマップがどのような過程で生成されるのかを説明します。 まず、「ランド(lands)」が配置されます。 ランドとはマップ中の指定した面積に特別な意味を持たせたものだと思ってください。 それ以外の部分は指定したデフォルトの地形で埋められます。 通常のランドのほかに、各プレイヤーに割り当てられる「プレイヤー ランド(player lands)」と呼ばれる特別なランドがあります。 一般的なマップを作成する場合はプレイヤー ランドのみを指定することになるでしょう。 プレイヤー ランドは指定した面積が各プレイヤーに分割して与えられます。 ランドは「ゾーン(zones)」という単位で区分されます。 通常は1つのランドは1つのゾーンとして区分されるようです。 プレイヤー ランドは各プレイヤーごとにゾーンが異なりますが、インストラクションによってチーム単位やランダムにゾーンを分けることもできます。 また、複数のランドをインストラクションによって同一のゾーンとして扱うこともできます。 ランドとゾーンがどのように利用されるのかは、インストラクションとあわせて解説します。
次はマップに「段差(elevations)」が作られます。
その次は「地形(terrains)」が配置されます。 ここで言う地形とは、草地、砂漠、浅瀬、水域、雪などの床に相当するものや、森、ヤシの砂漠などの特定のオブジェクトで埋められるものを指します。
続いて「崖(cliffs)」が作られます。
この後、「コネクション(connections)」が作られます。 コネクションとは、ランドとランドの間の特定の地形を別の地形に置き換えることで作られる通路のようなものと考えてください。 コネクションを利用すれば、大陸マップのように川で隔てられたプレイヤーのランドを浅瀬で結んだり、深い森マップのように道を通したりすることができるのです。
そして、最後にオブジェクト(objects)が配置されて、マップができあがります。
もし、タイプミスが無いのに作成したスクリプトが思うような結果を出さない場合、例えば森や段差が作られる予定なのに見当たらないという時などには、この順序を見直してみてください。
インストラクションは、その使い道によってパートごとに分けて記述してゆきます。 同一のインストラクションが複数のパートで使用されることもありますが、その場合は性質や用途が異なりますので注意してください。
スクリプトは PLAYER_SETUP、LAND_GENERATION、TERRAIN_GENERATION、OBJECTS_GENERATION、ELEVATION_GENERATION、CLIFF_GENERATION、CONNECTION_GENERATION の7つのパートから構成されています。
インストラクションには大きく分けてローカル インストラクションとグローバル インストラクションの2種類があります。
前者は決められたパートに記述する必要があります。 生成インストラクションや詳細インストラクションが、これに当たります。
後者は、どのパートにも記述することができます(パート外に記述することもできます)。 スクリプトの実行を制御する if や random などのインストラクションが用意されています。 これらを用いると、マップやゲームのタイプに応じて実行結果を変化させたりすることができます。