soukouki’s diary

誰かの役に立つ記事をかけたらいいなあ

datファイルとtabファイルの記述について

simutransのソースコードを読んで、tabファイルまたはdatファイルの記述方法と、pakを作成する際のdatファイルの項目について纏めたものになります。

この記事についてはstanderdとextendedでほぼ同じ内容になります。

誤りについてはsou7/soukoukiへ連絡いただければ幸いです。

datファイルとtabファイルの記法

pakを作成する際に書くdatファイルは、設定などを書くtabファイルと同じように処理をされます。この節では、それらの記述方法について解説します。

obj           =vehicle
intro_year    = 2002
icon          => file.0.1
EmptyImage[N] = file.1.0
EmptyImage[N,S,E,W]=file.1.1
Backimage[0][0-3][0-3][0][0][0-4]=image/thisbuilding.<$0*4>.<($1+$2*4)%5>
------

ライン(line)

datファイルに記述されている、1行分の文字列です。 行の先頭の文字がシャープ(#)、半角空白または空(空行)の場合、無視されます。(コメント) 行の先頭の文字がハイフン(-)の場合、オブジェクトの記述の境目として扱われます。

キー(key)

objintro_yearEmptyImage[S]など、=の左側の部分をキーと呼びます。 項目、特性など様々な呼び方はあると思うのですが、この記事内ではソースコード内での名前であるキーに統一します。 dat内では、キーは大文字と小文字のどちらを使っても構いません。makeobjで処理される際に小文字に変換されます。 キーの右側の空白は除去されます。

同じオブジェクトのキーに複数回設定された場合、一番最初に設定したものが適用されます。例えば

name=hoge
name=huga

と2回設定した場合、nameの値は先に設定したhogeになります。

パラメーター(parameter)

EmptyImage[S]Backimage[0][0-3][0-3][0][0][0-4]S0-3など、キーの中の[]で囲まれた部分を、パラメーターと呼びます。 パラメーターは[0-26][n,s,e,w]のように複数個を一括で指定できます。 [0-26][1,3,5]のように数字を複数指定した場合、この後解説する展開の際に計算式に利用できます。

値(value)

vehicle2022> file.0.1image/thisbuilding.<$0*4>.<($1+$2*4)%5>のような、=の右側の部分が値です。 <>で囲まれた部分については、後述する展開の処理が行われます。 数字や画像の指定など、一部の値は=との間の空白が読み飛ばされます。ただし、obj=vehicleのように読み飛ばされないものもあるので注意が必要です。

展開(expansion)

値の中の<>で囲まれた部分には、計算式を展開できます。 計算は加減乗除に加えて、割ったあまり(%)を使用できます。 $1$3のように$を使うと、先頭から1または3番目に変動するパラメータを取得できます。

            <$0 ><$1 >      <$2 >
Backimage[0][0-3][0-3][0][0][0-4]=...

例えば、hoge[0][1-10][2][3-30][4-4]=file<$0>.<$0+$1>.<($1+$2)*2>とすると、以下のように展開されます。

hoge[0][1][2][3][4]=file1.4.14
hoge[0][1][2][4][4]=file1.5.16
# 中略
hoge[0][1][2][30][4]=file1.31.68
hoge[0][2][2][3][4]=file2.5.14
# 中略
hoge[0][10][2][30][4]=file2.40.68

また、<>内の空白は読み飛ばされます。

(2022/12/15追記) 展開の仕様について一部誤りがあり、修正しました。

一括指定や展開も含め、グラフィックの指定についてのチュートリアル(英語): https://forum.simutrans.com/index.php/topic,20778.0.html

一括指定と展開について議論しているフォーラム(英語): https://forum.simutrans.com/index.php/topic,15133.msg150773.html