« PDA | メイン | PSP »

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 if %2>=%1 break ;←20090323修正 参考.コメント欄 btndef $2+$0+".jpg":blt 0,0,800,600,0,0,800,600 ;※mode800 の場合。デフォルトの解像度 640 なら 640,480 ONS設定とは違いますよん waittimer 2 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年04月23日

●欧風喫茶店もの2

残った問題は Re-order で追加された Reorder.pac に入った立ち絵等です。
さきほどの記事をアップした後から悶々していました。

インデックス作成ツールは Stand.pac Visual.pac Table.pac しか読みにいかないので自力で合成せねばいけません。
ちなみにテーブルファイルも Reorder.pac に。こんにゃくの Update.pac と同様ですね。

さて立ち絵はベース画像(αなし)と顔画像とアルファチャンネルのフィルタファイルから出来ている様子。
合成位置は割と楽に求められました。
ただ、フィルタがBMPから見て上下左右(かな?)を反転した記録方法になっているのが結構厄介です。
RGBの後にそのままファイルデータをくっつけても上手くいかない。単純にデータを逆さまにしても駄目。
真面目に縦横のピクセル数を取得して弄るしかないかなぁ。

……と考えていたのですが、ここで閃いた!

Reorder.pac → 別フォルダにコピー → 名前変更 "Stand.pac"
Reorder.pac → 別フォルダにコピー → 名前変更 "Visual.pac"
Reorder.pac → 別フォルダにコピー → 名前変更 "Table.pac"

……完璧だ!

●欧風喫茶店もの

そんなわけで(小声)シナリオスクリプトの変換はソースと見比べながら出来て非常に楽ちんです。
MAP選択の制御部分が見つからないけど、イベントシート用のテーブルを逆用することで何とかなりそう。

と、順調だったところに思わぬトラブルが。
画像抽出に前と同様masaemon様のプラグイン+合成ツールを大変ありがたく使わせて貰っているのですが
このゲームの立ち絵ってアルファチャンネルが輪郭線しかないんですね。
これではNスクに載せてみると

素材  これが 線画 こんな感じに orz

Nスクの透過方法を":l;"(左上の色を透過色に)にするのは輪郭がジャギジャギになるんでちょっと避けたい。

暫く解決方法を模索していましたが、幸い輪郭線より外に実際の色がはみ出ている部分がなかったので
RGB値があってα値がない箇所を α値=0xff に置き換えることで無事解決しそうです。

ちなみに当初は例の如くPerlで処理していました。が、やっぱり遅いのでCのコンソールアプリへと変更。
par_alpha.rar

立ち絵をインデックス作成後、Linar等でBMPに解凍(展開)したものにのみ使えると思います。
まともな例外処理とかワイルドカード実装とかしてないので注意です。

展開したSTANDフォルダの上あたりから

mkdir stand_out
for %a in (./stand/*.bmp) do par_alpha.exe ./stand/%a ./stand_out/%a

こんな感じで実行するといいかもしれません? …ええと、自己責任って素敵な言葉ですよね。

α補填

2008年04月13日

●大きな声では言えません

こんにゃくの次に、パルフェの購入等への腰が微妙に重かったのは
ひとえに重大な感じのネタバレを喰らっていたからです orz
前判断での題材とかキャラクターとかは、こんにゃくよりもどっちかというと好みなのですが。

それはともかく気を取り直してインストールしてみたところ
ぐふ。シナリオのバイナリデータと一緒にコンパイル前のシナリオソースが置いてある……!?
というかコンパイラまで置いてある。な、なにゆえに

ううううむ、これではつまらないやる気が減退してしまいます。見なかったことにしようか。
という目的と手段がすっかり入れ違った感想を抱いてしまいました。

Re-order 追加シナリオはバイナリだけなので、どっちしろ解析しないと出来ないんですけどね。
でもファイルの構造とか推測出来るため、参考にすれば大分楽そうな感じ。
知ってればこんにゃくの時も流用して色々手抜きが出来たのですがー。
見れば各命令の引数のコメントまで付いてるし。うーむ。

2008年04月06日

●かにしの拡張スプライト

脈絡がありませんがかにしのforONSで拡張スプライトに対応しました。
背景の表示倍率が変わります。200801xx以降のONScripterで動作させてください。
スクリプトサイズの削減等も行っているため、以前のセーブデータは使用出来ません(クリアフラグは持ち越し)。

PDAとはあまり関係ないのです。だって『栖香ちゃん』がが


4/8)
ということで保守期間な今日この頃。プレイ中のものを姑息に修正していきます。
今更すぎますが本校系を終えました。リーダさんルート(きっと)やとても良し。健速乙

2008年03月11日

●PerlでONS BB編 拡張スプライト

一応?縮小中なのですが、前述の通り追加修正は随時行っていきますのでよろしくです。
特に折角実装して頂いた拡張スプライト、サボる前にありがたく使わせて貰わないと!

とはいえ、それにしたってちょっと修正にのめり込み過ぎたかも知れません…orz
色々と嵌ってしまいました。

※底バイナリにはすとーむさんの ONS20080110 for Win を使用

draw系命令での拡大・回転はその後の通常進行に無理が生じたのですが、
拡張スプライトだとすきほーだい伸ばして回せるようになります。

ただ多少癖があるのが、座標を左上ではなく中心で指定しているところ。
Bullet Butlers では下の様な感じで座標を出してみました。

defsub lsps
~~
*lsps
getparam %19,$3,%20,%21,%22,%23,%24,%25
lsph %19,$3,0,0,0
getspsize %19,%7,%8
csp %19
mov %20,%20+%7/2+1
mov %21,%21+%8/2+1
lsp2 %19,$3,%20,%21,%22,%23,%24,%25
return

~本文~ lsps 10,"sprite.png",20,50,150,150,0,255

amspなども同様に。
またテキストウィンドウや通常のスプライトとの兼ね合いも悩みどころでした。
拡張スプライトはボタン化出来ないので、システムカスタマイズをどうしようかと…。
結論から言うと

windowback下では
通常スプライト 0 to x > "humanz x"  テキストウィンドウ > 拡張スプライト 0 to 255 > 通常スプライト x+1 to 999
(xは任意の自然数)

こういった重ね合わせで表示されるようです。
キャラ・背景部分は拡張スプライトで、システムカスタマイズのボタン類は通常スプライトで、と問題なく使い分けできるんですね。
当初は全画像を拡張スプライトにしたりとか、ボタン化で前に持ってこようとか無駄に足掻いてました。

そして連続でのエフェクトはいつものようにタイマーでぶん回してひとまず完了と。
昔アップしたシーンがこんな感じになりました。やっほい

検証が済んでいないテストスクリプトはこちら BulletButlers(heavy_test)
 → テストであまり問題がなさそうなので以後個別エントリで。多少修正しています。 → 軽量化修正

ううむ、拡張スプライトは思った以上に見栄えが良くてステキデス。ひたすら感謝を
ただ通常進行の全画像を拡張スプライトで描画しているため、PSP的な意味でちょっと不安が…。
あとロ、ロードは見ちゃ駄目なんだからね(棒)

まあさておき、以前のバージョンと挙動が違っていたものの原因(textonの描画判定)も分かりましたし、
おいおい新バイナリ対応へと移行させたいと思います。縮小しながらー

2008年02月12日

●PerlでONS 半角2全角

Encode.pm(標準モジュール)でNスクにおけるメッセージ中の半角英字、カナを全角に変換してみる。
あまり意味もなくモジュール仕立て。瀬里奈の時、ここでだけ "use utf8" したかったんだっけ?

※hontai.pl コンバータ本体です。
use nsc_h2z;
~
略
~
nsc_h2z::nh2z("1.txt");
exit;
※nsc_h2z.pm 同梱するとかで
package nsc_h2z;

use utf8; use Encode; use Encode::JP::H2Z;
use open IO => ":encoding(cp932)";
sub nh2z{ my $file = $_[0]; open (local *IN,"$file"); open (local *OUT,">temp.txt"); while ( my $line = <IN> ){
if ( $line !~ /^[0-9a-zA-Z;\*\t]/ ){   # 命令文チェック chomp $line; my $text = $line; my $tag; if ( $line =~ /^(\[.*?\])(.*)/ ){   # タグ $tag = $1; $text = $2; } $text = Encode::encode("euc-jp",$text); Encode::JP::H2Z::h2z(\$text); $text = Encode::decode("euc-jp",$text); $text =~ tr/?!a-zA-Z0-9/?!a-zA-Z0-9/; $line = "$tag$text\n"; } print OUT $line;
} close IN; close OUT; rename "temp.txt","$file" if unlink "$file"; } 1;

use utf8 下で、なおかつ一度 euc-jp にエンコードした文字列を渡してやらないと上手くいかないようです。
shift-jis(原文) → utf8 (Perl内部) → euc (半角全角処理)→ utf8 (に戻して)→ shift-jis (出力)
記号は $text =~ tr/?!a-zA-Z0-9/?!a-zA-Z0-9/;  に追記で適当に対応しましょうか。
…なんだかよくわからない文字はなんだかよくわからないままで。沙耶の唄は微妙かも

2008年02月01日

●差分顔画像の座標

PerlでもONSでもなかったりしますけれど。

ときに顔画像を立ち絵と合成する座標が判らず、しょうがなく目で見て合わせてみることに。
しかしこれまた丁度いい機能のあるツールが見つからないので、自作で賄ってみようと思い立ち。

欲しい機能
・αPNGを読み込める
・カーソルキーで差分画像を動かせる
・終了時の座標をファイルに出力できる
・予め画像をリスト化しておいて、連続で位置調整ができる

これらの機能とかかる労力と有する技術を色々総合的に判断した結果、Nスクでやることに決定。
…いやまあ、楽なのが一番ですよね。

;mode800
*define

transmode alpha spi "nscrpng.spi|png" usewheel
numalias face,10 numalias base,11 numalias left,12 numalias top,13 numalias step,14
defsub chklocate
game
*start textoff:saveoff erasetextwindow 0 csvopen "stand.csv","w"
;chklocate "ベース画像","差分画像" chklocate "sp/anj_00.png","sp/anj0001.png" chklocate "sp/cho_00.png","sp/cho0001.png" chklocate "sp/kan_00.png","sp/kan0001.png" chklocate "sp/kaz_00.png","sp/kaz0001.png" chklocate "sp/koh_00.png","sp/koh0001.png" chklocate "sp/kou_00.png","sp/kou0001.png" chklocate "sp/nan_00.png","sp/nan0001.png" chklocate "sp/sae_00.png","sp/sae0001.png" chklocate "sp/say_00.png","sp/say0001.png" chklocate "sp/tat_00.png","sp/tat0001.png" chklocate "sp/tou_00.png","sp/tou0001.png" chklocate "sp/tug_00.png","sp/tug0001.png" chklocate "sp/kaz_00_z.png","sp/kaz0003_z.png" chklocate "sp/nan_00_z.png","sp/nan0001_z.png" chklocate "sp/sae_00_z_s.png","sp/sae0001_z_s.png" chklocate "sp/tug_01_z.png","sp/tug0008_z.png"
csp -1 print 1 click end
*chklocate
getparam $base,$face fileexist %0,$base if %0 == 0 goto *error1 fileexist %0,$face if %0 == 0 goto *error2 mov %left,300 mov %top,50 lsp 10,$base,0,0 mov %step,1
*locate_loop
lsp 9,$face,%left,%top itoa $1,%left itoa $2,%top itoa $3,%step add $1,","+$2+"@"+$3 len %0,$1 if %0 mod 2 != 0 add $1," " csp 5:lsp 5,":s/20,20,2;#FFFFFF$1",10,10 print 1
btndef clear btndown 1 getcursor getenter
btnwait %0
if %0 = -19 goto *result if %0 = -1 mov %step,1 if %0 = -2 inc %step:if %step>20 mov %step,20 if %0 = -3 dec %step:if %step<1 mov %step,1 if %0 = -40 sub %top,%step if %0 = -41 add %left,%step if %0 = -42 add %top,%step if %0 = -43 sub %left,%step
goto *locate_loop
*result csvwrite $base,%left,%top return
*error1 csvwrite $base,"not found" return
*error2 csvwrite $face,"not found" return

こんな感じでさっくりと福笑いが完成。
顔画像をカーソルで動かして決定した座標をCSVに出力します。Nスクって便利。
あとは変換する時のテーブルにするなり ImageMagick で総当たり合成するなり。
自作命令に渡すファイル名はPerlで取得したような手入力したような…。

もっとも当然ながら微妙にずれるので、本来の座標が取得出来れば最善なのですが。
何か見落としてないかな。

2008年01月28日

●こんにゃく さんさん

プレイした方はお気づきと思いますが、起動時のタイトル画面、割と適当に作っていました。
しかしオリジナルでは、季節から特別な日や時間等、細部に至るまで変化に意図が込められているんですね。

エゴさんがその辺りを詳解にまとめてくださっています。
ううむ、これを見ると改めて上から下まで隙のない作品だと思わされますねー。
ちなみに現在りんな・さえちゃん終了。航が出張りすぎないさえちゃん√がかなり良かったです。
しかしスタッフロールがないと余韻が損なわれるなぁ…orz
あとbgmのフェードも情緒の上で割と切望かも。

休題。
そしてエゴさんのまとめをもとに、Herbasさんがタイトル画面変化をスクリプトに落としてくださいました。
かなり再現性が高いので、この機会に是非とも 0.txt を改修させて頂くことをお勧めします。
これ以上私に出来ることはないため、ただただありがたく享受してしまいます。

お二方、いい仕事をお疲れ様でした。

いきなり追記
Herbasさんから許可を頂きましたので、うちでの 0.txt に組み込ませていただきました。→0121c
手順はそのままで堪能しちゃいましょう。ありがとうございます。

2008年01月25日

●こんにゃく しんしん

プレイしていて気付いたのですが、通常版でも visual.pac 自体はおそらく初回版と変わりなく
修正として公式WEBと同じアップデートファイル update.pac が予めインストールされているみたいですね。
だって ヒラメだもの

合成に使わせて頂いた『Create GIGA Index』はupdate.pac には対応していないようなので
やっぱりImageMagickで合成して差し替えようと思います。upvisual.pl(として保存
Update.pac から VISUAL_(ry).bmp を /Update フォルダに解凍し、その上の階層で実行。
別フォルダに合成されたイベント画像ファイルが出来るのでお好みで差し替えてください。

立ち絵は…解析すれば出来るのですが、あまり影響ないと思うしまあいいや。
その他のファイルもお好みで差し替え願います。
なお ImageMagick、パッチ関連での質問は受け付けておりません。あしかります
※よそ様での質問も自重してくれると嬉しいな、と。調べる・試す・諦める、この3つが肝要です。

≪ prev | 1 / 4 |