●PerlでONS -かにしの編 その2 ~Nスクへ置換~
基本編~シナリオ読込~を流用して、かにしののシナリオを読み込みました。
うん、”ました。”で済ませよう
手順としては整形後にデコードせず、一度疑似バイナリダンプしたものを読み込んでいますが、
最終的には直接変換するつもり
あとは一行ずつNスクのコマンドに変換していきます。
ぐちゃぐちゃですが、前回の推測メモと合わせると何をやっているのかおぼろげに?
foreach $file (@file){
$fn = $file;
$fn =~ s/.txt//;
open (IN, "./rio_out/$file");
binmode IN;
binmode OUT;
$/ = "\x0D\x0A";
while ( $line = <IN> ){
&convert($line);
}
close IN;
}
close OUT;
sub convert{
$line = $_[0];
$line =~ s/%00%86%e6//gi ;#ゴミ?何か意味があるかも
$line =~ s/\x0D\x0A//i;
if ( $line =~ /^%21(?:%[0-9A-Fa-f][0-9A-Fa-f]){3}%0a(.*)%00/ ){ ;#フェードインにも対応しないと…
$dec = $1;
$dec =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
print OUT "bgm \"bgm/$dec.ogg\"\n";
}elsif ( $line =~ /^%22(?:%[0-9A-Fa-f][0-9A-Fa-f]){3}%00/ ){ ;#フェードアウトry
print OUT "stop\n";
}elsif ( $line =~ /^%23(?:%[0-9A-Fa-f][0-9A-Fa-f]){6}%00(.*)%00/ ){
$dec = $1;
$dec =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
print OUT "dwavestop 0:dwave 0,\"voice/$dec.ogg\"\n";
}elsif ( $line =~ /^%25%([0-9A-Fa-f][0-9A-Fa-f])(?:%[0-9A-Fa-f][0-9A-Fa-f]){7}%00(.*)%00/ ){ ;#ループと非ループを判別したい
$chn = hex($1);
$dec = $2;
$dec =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
print OUT "dwave $chn,\"se/$dec\"\n";
}elsif ( $line =~ /^%26%([0-9A-Fa-f][0-9A-Fa-f])%00/ ){
$chn = hex($1);
if ( $chn == 255 ){
print OUT "dwavestop 0:dwavestop 1:dwavestop 2:dwavestop 3:dwavestop 4\n";
}else{
print OUT "dwavestop $chn\n";
}
}elsif ( $line=~ /^%29%[0-9A-Fa-f][0-9A-Fa-f]%([0-9A-Fa-f][0-9A-Fa-f])%([0-9A-Fa-f][0-9A-Fa-f])%00/ ){
$wt = hex("$2$1");
print OUT "wait $wt\n";
}elsif ( $line=~ /^%30%[0-9A-Fa-f][0-9A-Fa-f]%([0-9A-Fa-f][0-9A-Fa-f])%([0-9A-Fa-f][0-9A-Fa-f])%00/ ){ ;#この二つ、適当にウェイトにしてます。後で原物と比べないと
$wt = hex("$2$1");
print OUT "wait $wt\n";
}elsif ( $line =~ /^%41(?:%[0-9A-Fa-f][0-9A-Fa-f]){2}%00(.*)%00/ ){
$dec = $1;
$dec =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
$dec =~ s/\\n/\n/gi;
$dec =~ s/\{(.*?):(.*?)\}/\($1\/$2\)/gi;
print OUT "$dec\\\n";
}elsif ( $line =~ /^%42(?:%[0-9A-Fa-f][0-9A-Fa-f]){2}%00%00(.*?)%00(.*)%00/ ){ ;#名前は文字スプライトで対応予定
$name = $1;
$dec = $2;
$name =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
$dec =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
$dec =~ s/\{(.*?):(.*?)\}/\($1\/$2\)/gi;
$dec =~ s/\\n/\n/gi;
print OUT "$name\n$dec\\\n";
}elsif ( $line =~ /^%46(?:%00){9}(.*?)%00/ ){
$dec = $1;
$dec =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
print OUT "bg \"image/$dec.jpg\",0\n";
}elsif ( $line =~ /^%48%([0-9A-Fa-f][0-9A-Fa-f])%([0-9A-Fa-f][0-9A-Fa-f])%([0-9A-Fa-f][0-9A-Fa-f])%([0-9A-Fa-f][0-9A-Fa-f])%([0-9A-Fa-f][0-9A-Fa-f])(?:%00){5}%[0-9A-Fa-f][0-9A-Fa-f](.*?)%00/ ){
$num = 6 - hex($1);
$left = hex("$3$2");
$top = hex($4) - hex($5);
$dec = $6;
$dec =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
print OUT "lsp $num,\"image/$dec.jpg\",$left,$top\n";
}elsif ( $line =~ /^%49%([0-9A-Fa-f][0-9A-Fa-f])%00/ ){
$num = 6 - hex($1);
print OUT "csp $num\n";
}elsif ( $line =~ /^%4a%([0-9A-Fa-f][0-9A-Fa-f])%([0-9A-Fa-f][0-9A-Fa-f])%([0-9A-Fa-f][0-9A-Fa-f])/ ){ ;#今のところ各エフェクトを全て無視しています
$time = hex("$3$2");
if ( $time == 0 ){
print OUT "print 1\n;"
}else{
print OUT "print 10,$time\n";
}
}
}

という感じで、とりあえず絵と音と文章が出るようにはなりました。
が、※にもあるように懸案事項が山積みです。
ちなみに画像の変換がかなりめんどい…orz
コメント
早速ここのお世話になりそうです。
Perlで
日本語(本文)を抜き出す
処理がわからないのですが。どうやっているのでしょうか?
}elsif($line =~ /({Han}|\p{Hiragana}|\p{Katakana}|\p{InCJKSymbolsAndPunctuation})/){
print OUT $1;
}
を華麗にスルーしてくれるのですが・・・
Posted by: おれおれ | 2008年01月27日 17:01
その記述だと一文字だけしか抜き出せず、それも文中どこであっても(コメントや、命令文中に日本語が混じっていても)マッチしてしまいますね。
元の書式にもよるのですが、私は /^(\p{Han}|略)/ として文頭に日本語が使われているかどうか判別し、
マッチした場合は print $line; と行を丸ごと出力することが多いです。
$1を出力する場合は、量指定子"*"等を用いて複数の文字にマッチさせてやりましょう。
Posted by: ひとつもり | 2008年01月27日 20:25
そういえば ・・・ なるほどそういう方法があるのですか。
よくよく考えるとscenarioファイルをぬきだして、それをそのまま変換しているのですね。
そして 日本語は残ると。
またひとつ気になったのですが、立ち絵の位置や分岐の数値って元のしなりおをいじっていれてますよね?すごいです。私には思いつかず、逐一 Aだったらb gだったらrのように変換式を書いてしまいますよ。
Posted by: おれおれ | 2008年01月27日 21:29
と思ったら 日本語のこらない・・・
アドバイスどおりやってみます
Posted by: おれおれ | 2008年01月27日 21:42
正規表現を覚えればそういうこともああいうことも出来ますので、是非とも頑張ってください。
Posted by: ひとつもり | 2008年01月30日 22:08