mieki256's diary



2006/05/23(火) [n年前の日記]

#1 [prog] マップエディタの保存ファイルからレイヤー名と使用画像ファイル名を取得

BGチップを並べるのに _Platinum を使わせてもらってるのだけど。 .csv ファイルを書き出せて助かるものの、各レイヤーに利用してる画像ファイル名は取得できず。かといって手作業で画像ファイル名を並べてたらミスをする。俺はミスをしない! とはいえない。たぶんしないと思う。しないんじゃないかな。しそうな気もするんだ。たぶんしちゃうと思う。絶対しちゃうのかもしれない。

ということで、.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 がつくときとつかないときがあって謎。…あ。もしかして。 _パディング なのか。

以上です。

過去ログ表示

Prev - 2006/05 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project