2008年09月07日

●バイナリサーチによる連番ムービー準備時間の短縮

伊代かわいいよ伊代移植パッチとは別口で(また一部の人しか判らないことを)
先日 ONScripter での連番画像を使ったムービー再生について考える機会がありました。

ちなみに最近の作業物では、めんどくさいので実は盛り込んでなかったんですよね。
しかしあるとないとじゃ没入感がやはり違ってくるので真面目にやってみようかと。

大本は変わらずすとーむさん製の連番ムービー再生スクリプトです。改めてありがとうございます。

1から順次画像をチェック(fileexist)して画像枚数を測定し、経過時間でフレーム制御するというこの方式。
PSPで使用する際のネックは、測定に要する時間が非常に長くなってしまうという点でした。
以前カタハネ等で組み込んだ時は、測定を終盤まで100枚単位で行って多少測定時間を短くしてはいたのですが、まだまだ長すぎです。

そこで今回はバイナリサーチ(二分探索)による測定時間短縮を目論んでみました。

*movie
getparam $1,%1	;movie "ムービーのBGMファイル",再生時間
saveoff
fileexist %2,$1:if %2=0 return
csp -1
csp2 -1
split $1,".",$2:add $2,"-"
mov %2,0:mov %3,7	;画像ファイルは movie-0000001.jpg のような7桁連番で
mov %4,5000	;上限値設定
for %0=0 to 100
	itoa $0,%4:len %5,$0:mov %5,%3-%5
	for %6=1 to %5:mov $0,"0"+$0:next
	fileexist %2,$2+$0+".jpg"
	if %2=1 add %4,5000
	if %2=0 break
next
mov %7,0	;下限値設定

for %0=0 to 999999
mov %8,(%7+%4)/2 ;中央値 itoa $0,%8:len %5,$0:mov %5,%3-%5 for %6=1 to %5:mov $0,"0"+$0:next fileexist %2,$2+$0+".jpg" if %2=0 jumpf itoa $0,%8+1:len %5,$0:mov %5,%3-%5 for %6=1 to %5:mov $0,"0"+$0:next fileexist %2,$2+$0+".jpg" if %2 = 1 mov %7,%8+1:next if %2 = 0 break ~ mov %4,%8-1 ;(修正)±が逆でした if %8==0 break ;(追加)画像が一枚もない場合の永久ループ避け next
mov %0,0 lr_trap *movie_end bgmonce $1 resettimer for %0=1 to 999999 gettimer %2 itoa $0,%8*%2/%1:len %5,$0:mov %6,%3-%5 for %7=1 to %6:mov $0,"0"+$0:next btndef $2+$0+".jpg":blt 0,0,800,600,0,0,800,600 ;※mode800 の場合。デフォルトの解像度 640 なら 640,480 ONS設定とは違いますよん waittimer 2 if %2>=%1 break next
goto *movie_end2 *movie_end if %0>0 break:next *movie_end2 lr_trap off ofscpy:bg black,1:stop saveon return

これで平均測定回数が log2(n)*2 以下に減少するかと思います。n= int(画像枚数/5000 + 1) * 5000試しにと『車輪の国、向日葵の少女』のOPムービー4257枚が26回の fileexist 命令で済みました。

あとTMPGEnc 等では連番画像の出力フレームレートも設定出来るので、PSPではFPSが期待出来ないと割り切って最初から少ない枚数で出力してもいいかもしれませんね。

2008年09月06日

●FAQ -ONS編-

実際にONScripterを実行するにあたって躓きそうな部分やよく見る質問について

01.ONScripterが起動しない

default.ttf がないと起動しません。

02.画面・シーンの切り替わりで落ちるよ

ONScripterはちょっとしたスクリプトミスではなかなか落ちませんが、
問答無用で落ちるケースもいくつかあります。
割と多いのがマスクフェード時に指定ファイルが読み込めない場合です。

print 18,1000,"mask.jpg"
SS 
といった記述をすると左側SSのようにマスクパターン(右画像)を使った画面切り替えを行います。
この時に"mask.jpg"が見つからないと強制終了しますのでご注意ください。

吉里吉里など、元データでマスク画像が通常の画像フォルダと別にあることが多いためか
この現象のご質問を見ることが結構あります。かにしのとかも。

03.効果音が再生されなかったり落ちたり

画像が小さく表示されたり

日本語のファイルがあったり

ログがおかしかったり拡大表示がおかしかったり

推奨ボタン設定とか

途中なのです

●FAQ -Perl編

01.Perlって?

このページで公開しているシナリオコンバータはPerlで動作するスクリプトです。
はっきり言ってフリーソフトとしての体を保っておりません。
Windows環境の方はActivePerlをインストールして、実行可能な環境を作ってください。

02.実行したけどDOS窓が一瞬出てくるだけ

Perlスクリプトの拡張子 .pl をActivePerl に関連づけるとダブルクリックでの実行も可能です。
がしかし、その場合は「ファイルが見つからない」などエラーによる終了時のメッセージが残りません。
というか正常終了の際も特にメッセージを出さないものが主という腐れ仕様です。
必ずコマンドプロンプトから実行してください。

例.hogeフォルダのhoge.plを実行する場合
c:\>cd \hoge     ※hogeフォルダへ移動します
c:\hoge>perl hoge.pl
c:\hoge> ※正常終了時はそのまま入力待ちに戻ります。戯画系は長いので経過報告してます

c:\hoge>perl hoge.pl
died at hoge.pl in line 100 untarakantara
※エラー時は終了した行数や原因が表示されます。
スクリプトをエディタで開いてみて、該当行を見ると問題が解決出来るかもしれません。
解決出来ない場合は、エラー文を当blogまで報告していただければ何らかの助言を出来ると思います。

03.実行すると「Can't locate Image/Magick.pm ... 」という表示が出て終了する

もし標記のエラー文章が表示された場合は ImageMagick(PerlMagick) のインストールが正常にされておりません。
基本的にPerlの標準モジュールだけで処理を行っているのですが、ImageMagick モジュールだけ別途インストールをお願いしています。
これについては FAQ -画像編- を (そしてエゴさんの解説記事を)ご覧下さい。
無事にモジュールが導入されている場合は、実行後知らぬ間にフォルダ内に画像が作成されています。ってのもいい加減どうかと

2008年08月30日

●SWAN SONG コンバータ for ONScripter

ONScripter用に『SWAN SONG』(c)Le.Chocolat meets FlyingShine様 のシナリオを劣化移植するスクリプト

安くなった瀬戸なんとかさん。ひょっとしたら展開の関係で廉価版限定かもしれません
力尽きたので言うべきこと言いたいこと言わずもがななことは週末にでも……。
swansong_20080828.rar 音声の音量が効いていなかったので修正。あとreadmeでse.xp3はsoundじゃなくてseフォルダの間違いです。100で割ってなかったので再生中に音量弄ったら死ねました。ごめんなさい。そういえばci_廊下とテレビは必要ないのでアーカイブ化する時よけちゃっても良さそうです。

8/30)
ということで改めて。
以前からプレイしたくともプレミアショーケースを眺めるだけでした。今回廉価版が出てたことを知って(既に遅い)飛びついてしまった次第です。暴走。あ、もう伏線回収=暴走終了したのでご安心下さい。

派手なエフェクトはありませんが、各所の評価を見る限り雰囲気が非常に大事なこの作品。メッセージ周りとサウンド周りは結構気を遣って再現出来たと思います。
独特の文章をじっくり読ませる句読点ウェイト(調整可能)やら複数音源のタイマー同期フェードイン・アウトとかちょっと自信ありですので、物語を堪能した後にでもONSで試して頂けると嬉しいです。
再現出来ていないのは揺れ続ける地震エフェクトや、レイヤ解放したのに画面更新かけないから表示されつづける冒頭の三人登場シーン画像みたいな行儀の悪い?スクリプトくらいかもしれません。いやそれは言い過ぎ。

ただ今までやってなかったことが多いため、初期リリースから細かな修正が入ってます。バージョンを変えるほどではないのですが、奇特な方は改めて落とし直してください。
swansong_20080828.rar

PSPでプレイする際は文字サイズが小さいためビットマップフォント推奨です。SEの容量が大きいのでFONTMEMORYはオフがいいかも。 
私自身はこの土日で終えるつもりです。そこで気付いたことを修正して完動報告とさせて頂こうかと。
昨日買った『文学少女』最終章下巻を用意して、想定される鬱ダメージ対策もばっちりだ!

●FAQ -画像変換編-

今更過ぎるのですが、うちのサイトのスクリプトを使ってONScripterで動かす際のFAQでも。
同じようなところで躓く事が多いですし、あんまりにもな不親切仕様で質問するなと言うのも申し訳ない話でした。

01.立ち絵画像の周りが白や緑一色になっている or 透けた半分しか表示されない

白や緑 透け半分 

一般に立ち絵画像は透過度を表すα値を持っています。
データ抽出時、「αブレンドを行う」等の設定だと透明部分が白や緑で置き換えられてしまい正常に透過されません。
後述するリサイズ方法にもよりますが、この場合は立ち絵が画像のように表示されます。
αブレンドを行わず、α値を保ったまま抽出する必要があります。
最終的に使用する画像ファイル形式はα値を保持出来るPNG、もしくはNScripter用のマスク付きJPG等に変換してください。
最近のうちのスクリプトではPNG推奨ですね。

マスク付きマスク付きjpg

02.αブレンドを行っていないのに、背景画像等が半分しか表示されない

背景が半透け

さて、正しく抽出したはずなのに背景等が上の画像のようになってしまうことがあります。
これが厄介なところなのですが、ONS及びnscrpng.spi(NスクのPNG読み込みプラグイン)で
α値を持たない画像を透過指定"a(lpha)"で読み込んだ場合、上述マスク付きJPGのように
右半分をマスク部分として扱います。その結果、標記の現象が起きてしまいます。

もっとも透過指定"c"で読み込めばいいのですが、変換元ゲームではα値を持たない画像をエンジン側で透過させずに表示することが多いため、変換スクリプト中で判別が出来ません。
(nscrpng.spi ではα値の有無を取得する命令があるのですが、それでもマスク付きJPGとの混在を考えるとNスクのスクリプトで実装するのが難しい)

で、当方としては乱暴に「α値を持たないなら全面不透過のα値を付けてあげればいいじゃない」作戦でやらせて頂いています。
具体的には、FastStoneImageViewerでα値を持たないPNG画像をPNG画像に変換すると何故か(?)全面不透過のα情報が付加されるため、リサイズ時にあわせて行っています。上記ソフトを使うのは、お勧めではなくほぼ必須条件だったのですね。なお、BMP→PNG だと付加されないので要注意。
もちろん同様の工程を別に行って頂いてもかまいません。某NJPG作成ツールも同様の挙動でした。

この2項目に気をつけて画像を用意していただくと、想定通りに表示されるかと思います。
正常

03.画像加工をしないといけない。ImageMagickってなにさ

もっと厄介なのは、最近多い ImageMagick 関連の問題です。
クリッピングや彩度調整など、Nスクで実現出来ない画像表示は事前に画像の適宜加工が必要となっています。
Perlで(私が)楽に画像加工をするには?ってことで ImageMagick (のPerl用モジュール PerlMagick)を選んだのですが、これのインストールがなかなかに難儀のようです。
こちらはエゴさんが詳解な解説を作ってくださっているので、今回ありがたく参考にさせていただいちゃいます。その他PSPで動作させる際の注意事項としても一読しておいて貰えると大変助かります。
おこのみ!R-18 : PSP変換の前に

正直、ImageMagickについてこちらをご覧になっても上手くいかない場合は、誰も適切に答えられないので質問しても無駄だと思うのです……。中途半端なものを作った私を恨んでください。

ImageMagick含めたPerlスクリプト全般についての注意事項は長くなるので別ページへと。

0?.画像が小さく表示されるよ

ONScripter 20070206

→FAQ -ONS編- へ