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 がつくときとつかないときがあって謎。…あ。もしかして。 _パディング なのか。
[ ツッコむ ]
以上です。