来週から忙しくなること確定なので、備忘録とバックアップを兼ねてまとめておくことにする。
ZIPファイルであるVASSALモジュールを解凍すると、次のように二つのファイルと一つのディレクトリで構成している。
buildFile
moduleData
images
imagesはディレクトリ(フォルダ)であり、マップとユニットの画像ファイルを格納する。moduleDataはモジュールのバージョンと作成日を記述するXMLファイルで、数行ほど。XML形式のbuildFileがメインである。ここに全ての情報が入る。
ユニット一個は次のように記述する。
<VASSAL.build.widget.PieceSlot entryName="第111装甲旅団" gpid="66" height="0" width="0">+/null/emb2;;2;;Flip;2;F;;0;;;;1;false;0;0;dtp-units200dpi-1-8.png,dtp-units-r200dpi-1-8.png;,;true;;;;false;;1 piece;;;dtp-units200dpi-1-8.png;第111装甲旅団/1; null;0;0;66</VASSAL.build.widget.PieceSlot>
ユニット名(entryName)、ユニットのid (gpid)、表と裏のファイル名をユニットごとに変更すればよい。この1行の意味を確認したことはないのだが、これだけを変更して動いている。この例では、ユニット名: 第111装甲旅団(二カ所ある)、ユニットのid: 66 (二カ所ある)、表のファイル名: dtp-units200dpi-1-8.png (二カ所)、裏のファイル名: dtp-units-r200dpi-1-8.png (一カ所) である。
初期スタックは次のように記述する。
<VASSAL.build.module.map.SetupStack name="3-G" owningBoard="Dagger Thrust Patton" useGridLocation="false" x="136" y="4526"> 上記ユニットの定義を何個でも記述</VASSAL.build.module.map.SetupStack>
nameがスタック名、owingBoardが所属マップ名である。マップ画像上のx,y座標(恐らくマップのドット数で数える)は適当に設定しておいて、VASSALで編集する際に調整する。
これをプログラムで自動生成するには、ユニット情報を下記のように揃えておけばよい。
第3機甲偵察連隊 0-0 1-A
第6機甲偵察連隊 1-0 1-A
(以下同様)
とユニットに応じて全て記述。ユニット名に続き、通し番号(画像ファイル名を特定する)と所属スタック名を1行で書いておく。スキャン画像から部隊名を生成するというのは画像処理でできないこともないだろうが。。。下記のperlスクリプトに通して終わり。出力結果をファイルに保存しておいて、buildFileへ挿入した後、ZIPし直すことでモジュールが完成する。
my %stack=();
my $gpid=0;
while(<>){
++$gpid;
my $unitname;
my $seq;
( $unitname, $seq, $stackid )=split " ";
my $unitfilename="dtp-units200dpi-$seq.png";
my $unitfilename2="dtp-units-r200dpi-$seq.png";
if ( $unitfilename2 ){
$stack{$stackid}.= qq#<VASSAL.build.widget.PieceSlot entryName="$unitname" gpid="$gpid" height="0" width="0">+/null/emb2;;2;;Flip;2;F;;0;;;;1;false;0;0;$unitfilename,$unitfilename2;,;true;;;;false;;1 piece;;;$unitfilename;$unitname/1; null;0;0;$gpid</VASSAL.build.widget.PieceSlot>
#;
}else{
$stack{$stackid}.= qq#<VASSAL.build.widget.PieceSlot entryName="$unitname" gpid="$gpid" height="0" width="0">+/null/piece;;;$unitfilename;$unitname/null;0;0;$gpid</VASSAL.build.widget.PieceSlot>
#;
}
}
my $offset=116;
foreach( keys %stack ){
$offset += 20;
print qq#<VASSAL.build.module.map.SetupStack name="$_" owningBoard="Dagger Thrust Patton" useGridLocation="false" x="$offset" y="4526">
#;
print $stack{$_};
print qq#</VASSAL.build.module.map.SetupStack>
#;
}
これで作ったモジュールがDagger Thrust: Patton (CMJ98)。ターンマーカーだけ小さくなってしまった。マップ二つでMontgomeryと二個一緒にできるだろうか。
2011/6/2
二個一緒にできたのでMAに書いた。