2006/05/23(火) [n年前の日記]
#1 [prog] マップエディタの保存ファイルからレイヤー名と使用画像ファイル名を取得
BGチップを並べるのに
_Platinum
を使わせてもらってるのだけど。 .csv ファイルを書き出せて助かるものの、各レイヤーに利用してる画像ファイル名は取得できず。かといって手作業で画像ファイル名を並べてたらミスをする。俺はミスをしない! とはいえない。たぶんしないと思う。しないんじゃないかな。しそうな気もするんだ。たぶんしちゃうと思う。絶対しちゃうのかもしれない。
ということで、.ppj (Platinum の保存ファイル。バイナリ)を読んで、そのへん出力する Perlスクリプトを作成。
下のような感じで出力される。
バイナリファイルを読み出す方法がわからなくてハマった。あちこち検索して判ってきたような。$str = <STDIN>; を使っちゃダメで、read()、sysread() あたりを使うのだとか。$str = <STDIN>; は、行を意識した読み込みをしてしまうらしい。
.ppj 内のレイヤー名・ファイル名の後ろに 0x00 がつくときとつかないときがあって謎。…あ。もしかして。 _パディング なのか。
ということで、.ppj (Platinum の保存ファイル。バイナリ)を読んで、そのへん出力する Perlスクリプトを作成。
#!/usr/bin/perl # # Platinum の保存ファイル、 .ppj の中から、 # レイヤーに使われている画像ファイル名を取得・出力する。 # # usage: perl getlayerimg.pl PPJ_FILE use strict; my $line = ""; open( IN,$ARGV[0]) || die "Can't open $ARGV[0] : $!"; binmode IN; while( read(IN,$_,1)) { if ( unpack("C",$_) < 32 ) { $line .= '_'; } else { $line .= chr unpack("C", $_); } } close IN ; my @layername = (); my @imgname = (); while (1) { my $f = index($line, 'LAY_LSTR'); last if $f < 0; substr($line, 0, $f+12) = ""; my $nl = index($line,'PSTR'); die "Can't search PSTR : $!" if $nl < 0 ; my $layer = substr($line, 0, $nl); $layer =~ s/_+$//; push(@layername, $layer); substr($line, 0, $nl+8) = ""; my $ni = index($line,'LINV'); die "Can't search LINV : $!" if $ni < 0 ; my $img = substr($line, 0, $ni); $img =~ s/_+$//; $img =~ s/\.(|bmp|png|jpg|gif)$//; $img = uc $img; push(@imgname, $img); substr($line, 0, $ni+4) = ""; } print "\tstatic final byte[] IMGLAYER_TBL = {\n"; my $i = 0; foreach my $img (@imgname) { print "\t\tIMG_" , $img , ",\t// " , $layername[$i] . "\n"; $i++; } print "\t};\n"; exit 0;
下のような感じで出力される。
static final byte[] IMGLAYER_TBL = { IMG_TESTIMG01, // レイヤー0 IMG_TESTIMG02, // レイヤー1 };レイヤー名や使用画像ファイル名は、1バイト文字であることが前提。2バイト文字を使っても動くかどうかは検証してない。上の例では偶然出力できてるけど。
バイナリファイルを読み出す方法がわからなくてハマった。あちこち検索して判ってきたような。$str = <STDIN>; を使っちゃダメで、read()、sysread() あたりを使うのだとか。$str = <STDIN>; は、行を意識した読み込みをしてしまうらしい。
.ppj 内のレイヤー名・ファイル名の後ろに 0x00 がつくときとつかないときがあって謎。…あ。もしかして。 _パディング なのか。
[ ツッコむ ]
以上です。