シムシティ2000 調査研究室 「その6 シナリオデータの構造」
機首によるデータの差異について
PC用の都市データ・シナリオデータのフォーマットは、Mac版用のものとDOS版用(ほかWin版をはじめとする多くのPC版で使用)のものがあり、若干の差異があります。ここでは、多くの機種で使用されているDOS版のデータ構造について紹介します。
基本的なこと
データの構造
シムシティ2000の都市データとシナリオデータはIFFフォーマットになっています。シムシティ2000に変な都市データを読み込ませると、これはIFFデータではありません!と怒られたりします。
IFFフォーマットは汎用フォーマットで、「チャンク」と呼ばれるかたまりをいくつも連ねて構成されています。
チャンクの構成
チャンクはこのような形となっています。
オフセット | 要素 | バイト数 | 説明 |
00 | チャンクID | 4 | ASCIIコードでチャンクの名前を記述します。 |
04 | データサイズ | 4 | 以下にあるデータのサイズを記述します。 |
08 | データ | 可変 | 実際に格納するデータです。バイト数はデータによって変わります。 |
データサイズはチャンクIDとデータサイズの計8バイトを含まみません。
シムシティ2000の都市データを覗くと、いくつものチャンク(FORM,SCDH,MISC...)が連なっており、都市データの下にシナリオ情報の4つのチャンクがさらに連なる構造となっています。
(Mac版はシナリオの情報が別立てで、リソースフォークに格納されています。Reseditを使えば容易に中身を確認・編集することができます。)
FLINT.SCNの例
実際に通常付属のシナリオ、FLINT.SCNを見てみましょう。バイナリエディタ等でこのファイルを覗くとこのような構造になっています。
アドレス | ID | 説明 |
000000 | FORM | IFF形式であることを宣言 |
000008 | SCDH | 都市データであることを宣言 |
00000C | CNAM | 都市名 |
000034 | MISC | いろいろなデータ |
(都市の各要素が続きますが、省きます) | ||
01CCE2 | TEXT | シナリオ開始時の説明 |
01CD7F | TEXT | シナリオ選択時の説明 |
01CDF7 | SCEN | シナリオの各種条件情報 |
01CE33 | PICT | シナリオ選択時の画像 |
黄色い部分が都市に関するチャンク、青い部分がシナリオに関するチャンクです。シナリオの各チャンクについては次の項目で解説します。白色のFROMチャンクはすべてのチャンクの親玉で、この中に都市やシナリオのさまざまなチャンクが格納される形となっています。
手っ取り早く自作のシナリオを作るならば、適当なシナリオからTEXT以下の要素をコピーし、適当な都市データの末端にそれを貼り付け拡張子を変えてやれば完成します。厳密には、FORMチャンクのファイルサイズを変更してやらないといけませんが…。
各チャンクの解説
TEXT(1)
オフセット | 要素 | バイト数 | 説明 |
00 | チャンクID | 4 | ASCIIコードにすると、"TEXT"の文字が入っています。 |
07 | データサイズ | 4 | 文章の長さによって変わります。 |
08 | 識別用? | 4? | シナリオ開始時か、開始前の文章かをここで識別しています。 |
0C | 開始時文章 | 可変 | シナリオ開始時の文章が入ります。 |
TEXTチャンクは2つありますが、これらはチャンクの頭から+08(オフセット値)の違いによって区別されています。前者には"80 00 00 00"、後者には"81 00 00 00"が入ります。
この前者のTEXTチャンクのデータにはシナリオ開始時に表示される文章が格納されます。文章は+0Cから開始です。
TEXT(2)
こちらはシナリオ選択時の文章ですが、長すぎると切れるので要注意。基本的に+08以外は前者と同じです。
SCEN
こいつがシナリオデータの核と言える部分です。チャンク全体で最大64バイトとなります。
オフセット | 要素 | バイト数 | 説明 |
00 | チャンクID | 4 | "53 43 45 4E" (SCEN) |
07 | データサイズ | 4 | シナリオの要素をフルに記述すると"38"になります。 |
08 | 不明 | 4? | "80 00 00 00" (固定) |
0C | 災害 | 2 | 発生する災害を指定します。値については下表を参照。 |
0E | 災害座標X | 1 | そのままです。都市の座標はゲーム中にShift+Alt+調査ツールで確認できます。 |
0F | 災害座標Y | 1 | |
10 | 時間制限 | 2 | 月で指定。何も入れないと無制限です。 |
12 | 総人口 | 4 | ここからクリア条件です。アルコロジー抜きの人口です。 |
16 | 住宅人口 | 4 | そのままです。グラフで確認可能。 |
0A | 商業人口 | 4 | |
0E | 工業人口 | 4 | |
22 | 貯める資金 | 4 | そのままです。 |
26 | 地価 | 4 | 明確な値が不明。都市の大きさにより変動する。 表に出てこないシミュレータ上のマスクデータを使用しているものと思われます。 |
2A | 学力 | 4 | |
2E | 公害 | 4 | |
32 | 犯罪 | 4 | |
36 | 交通 | 4 | |
3A | 建物(1)ID | 1 | オブジェクト番号を指定。指定オブジェクトが都市に存在することがゴール条件となる。番号に関してはDavid Moews氏のドキュメントで明らかなっている。 |
3B | 建物(2)ID | 1 | |
3C | 建物(1)タイル数 | 2 | 先に指定したオブジェクトの必要タイル数を指定。+3A、+3Bで何らかのオブジェクトを指定した場合、最低1は数値を入れなければならない。 |
3E | 建物(2)タイル数 | 2 |
一部のクリア条件は、正式に発表されたシナリオに組み込まれることはなく、日の目を見ることはありませんでした。地価~交通のゴール条件は面白そうなのですが、具体的な数値がゲームでは確認できないので、犯罪(ラスベガス)以外で使用されることがなかったのでしょう。
災害の一覧
災害の一覧 | |||||
00 | 無し | 08 | モンスター | 10 | 台風 |
01 | 火事 | 09 | メルトダウン | 11 | ヘリ墜落 |
02 | 洪水1 | 0A | マイクロ波 | 12 | 航空機事故2 |
03 | 暴動1 | 0B | 火山噴火 | 13 | 以降なし? |
04 | 公害 | 0C | 火災流 | ||
05 | 航空機事故1 | 0D | 暴動2 | ||
06 | 地震 | 0E | 洪水2 | ||
07 | 竜巻 | 0F | 化学薬品の流出 |
災害の中には複数回登場しているものがありますが、災害の規模が異なります。
PICT
シナリオ選択時に表示される65x65の画像です。
オフセット | 要素 | バイト数 | 説明 |
00 | チャンクID | 4 | "50 49 43 54" (SCEN) |
07 | データサイズ | 4 | 65x65なら、"00 00 10 CA"になります。 |
08 | 不明 | 4? | "80 00 00 00" (固定) |
0B | 画像サイズX | 2 | 通常は41(65)が入ります。 |
0D | 画像サイズY | 2 | 同上 |
10 | 画像データ | 可変 | 画像データです。 |
頭から+0B、+0Dで画像の大きさを指定していますが、いじらないほうが良いでしょう。+10からピクセルデータが始まります。
構造はいたって単純で、データの値は00~FEが色の値、FFが列の終わりを示しています。色に関しては、ゲーム独自のパレットを使用しています。
ピクセルデータの構造がWindowsビットマップに類似しているため、ゲームと同じパレットを使用した256色ビットマップを加工することによって変換が可能。
余談
一部シナリオデータの中にはTMPLというチャンクがありますが、その中にはSCENチャンクのデータ記述方法の定義が残されています。(Mac版のTMPLリソースも同様で、このデータの存在によりMac版では容易にシナリオデータを編集することができます。)
このようなものをわざわざ残すということは、我々のような人間へのヒントのつもりだったのでしょうか?
この解析の結果、成果物として、シナリオ作成・編集ツール「Scenario Creator for SC2K)」が誕生しました。
解析にあたっては、2chレトロゲーム板シムシティ総合スレッド4の359氏の資料と、David Moews氏のシムシティ2000都市データの解析ドキュメントを大いに参考にしました。この場を借りて感謝いたします。
初版:2008年12月22日
第二版:2014年10月3日(文章の再構成)
第二版:2021年9月12日(Mac版の情報を追加)