シムシティ2000 調査研究室 「その6 シナリオデータの構造」

基本的なこと

データの構造

シムシティ2000の都市データとシナリオデータはIFFフォーマットになっています。シムシティ2000に変な都市データを読み込ませると、これはIFFデータではありません!と怒られたりします。

IFFフォーマットは汎用フォーマットで、「チャンク」と呼ばれるかたまりをいくつも連ねて構成されています。

チャンクの構成

チャンクはこのような形となっています。

オフセット 要素 バイト数 説明
00 チャンクID 4 ASCIIコードでチャンクの名前を記述します。
04 データサイズ 4 以下にあるデータのサイズを記述します。
08 データ 可変 実際に格納するデータです。バイト数はデータによって変わります。

データサイズはチャンクIDとデータサイズの計8バイトを含まみません。

シムシティ2000の都市データを覗くと、いくつものチャンク(FORM,SCDH,MISC...)が連なっており、シナリオデータの場合はそれに加えてシナリオ情報の4つのチャンクが付加されています。

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が列の終わりを示しています。色に関しては、ゲーム独自のパレットを使用しています。

ピクセルデータの構造がビットマップに類似しているため、ゲームと同じパレットを使用した256色ビットマップを加工することによって変換が可能。

余談

一部シナリオデータの中にはTMPLというチャンクがあり、その中にはSCENチャンクのデータ記述方法のメモが残されています。このようなものをわざわざ残すということは、我々のような人間へのヒントのつもりだったのでしょうか?

この解析の結果、成果物として、シナリオ作成・編集ツール「Scenario Creator for SC2K)」が誕生しました。

解析にあたっては、2chレトロゲーム板シムシティ総合スレッド4の359氏の資料と、David Moews氏のシムシティ2000都市データの解析ドキュメントを大いに参考にしました。この場を借りて感謝いたします。

初版:2008年12月22日
第二版:2014年10月3日(文章の再構成)

戻る