ONS等への移植をする際に、元のゲームで日本語のファイル名が使われていることがあります。
ONScripterでは基本的に日本語ファイル名は使えるのですが、
雪希4であったり、稀にONSでも使用出来ない文字列(0823でFIXされてますが)もあるので
一気に英数ファイル名へ置換するスクリプトを組んでみました。
題材は吉里吉里、Fate/stay night
日本語が画像ファイルだけだとつまらないので、勝手に音楽も日本語ファイル名に代えていたり。
@fadein file=oアインツ洋館-(夜) time=800 rule=シャッター左から vague=64
@play file=洋館 time=200
こんな感じで元スクリプトがあるとします。
if ( $line =~ /^@fadein file=(.*) time=(\d*) rule=(.*) / ){
my $file = $1;
my $time = $2;
my $rule = $3;
print OUT "bg \"$file.png\",18,$time,\"$rule\"\n";
}
elsif ( $line =~ /^@play file=(.*) / ){
my $file = $1;
print OUT "bgm \"$file.ogg\"\n";
}
と今まで通りにマッチさせると
bg "oアインツ洋館-(夜).png",18,800,"シャッター左から.png"
bgm "洋館.ogg"
と出力。ここで、ファイル名を常に変更していくサブルーチンを加えてみます。
(略)
open (REN,">rename.bat");#リネーム用のBATファイルも同時に作成
%file;
%count;
(略)
if ( $line =~ /^@fadein file=(.*) time=(\d*) rule=(.*) / ){
my $storage = &filename($1,"png");#サブルーチンにファイル名と拡張子を渡し、その返値を受け取る
my $time = $2;
my $rule = &filename($3,"png");
print OUT "bg \"$storage.png\",18,$time,\"$rule\"\n";
}
elsif ( $line =~ /^@play file=(.*) / ){
my $storage = &filename($1,"ogg");
print OUT "bgm \"$storage.ogg\"\n";
}
(略)
;#サブルーチン
sub filename{
if ( defined($file{$_[0]}) ){ #このファイル名が既出がどうかチェック
$result = $file{$_[0]}; #既に代入した置換後のファイル名へ
}else{ #初出ならば
$file{$_[0]} = "$_[1]\_$count{$_[1]}"; #今後、このファイルは (拡張子)_(番号)とする (ex. png_105)
print REN "ren \"$_[0].$_[1]\" \"$file{$_[0]}.$_[1]\"\n"; #BATファイルへ出力
$result = $file{$_[0]};
$count{$_[1]}++; #拡張子ごとに番号プラス1
}
return $result; #サブルーチンの返値
}
これで、
bg "png_105.png",18,800,"png_36.png"
bgm "ogg_9.ogg"
#rename.bat
ren "oアインツ洋館-(夜).png" "png_105.png"
ren "洋館.ogg" "ogg_9.ogg"
以下略
となりました。ハッシュ(連想配列)に入れていくのが肝ですね。
今後使う機会があるかどうかは微妙ですが、何かしら応用できるといいかも。
9/12)
改めて考えると、この方法だとスクリプトに変動があるとファイル名が変わってしまいますね…。
完成してからならともかく、作成中だと結構難がありそうです。
基本的な考え方は同じですが、やっぱり別にリスト化したものを読み込んで
それをハッシュのキーとして扱った方が良いかも知れません、ですよ?