« "レコンキスタ" MajirONScripter 製作開始、そして終了 | メイン | 遥かに仰ぎ、麗しの コンバータ for ONScripter »

2007年07月15日

●応用編 で かにしの編  その6 スクリプトサイズ削減

すっかりさぼってしまっていた今日この頃
ONSforPSPでのメモリ不足に泣くのは何処様も同じのようです
特にかにしのは、某エロゲ研究室様(デコードでお世話になりました)調べでは
純粋な表示テキストだけで3.85MB。
1 『僕と僕らの夏完全版』 2 『Fate/stay night』 3 『CLANNAD』
に次ぐ4番目のシナリオサイズを誇っているようです。
(もちろん調査されていないゲームの中に更に大きなものもあるでしょう)
Perlでだらだらっと出力するのが好きだったのですが、さすがに10MBを越えてしまってはどうにも…

というわけで、無駄な部分を"defsub"命令を使ってサイズ節約してみます。
極力変数を使わずに、長いスクリプトをそのまま吐いているあたりがターゲットです。
以前記事にした名前表示のところが一番削減できそうですね。

	}elsif ( $line =~ /^%00%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;
		$nalocate = 220 - (length($name))*6;
		print OUT "erasetextwindow 0\n";
		print OUT "lsp 0,\":s/24,24,2;#FFFFFF$name\",$nalocate,431\n";
		print OUT "lsp 1,\"image/nmbase.jpg\",50,424\n";
		print OUT "print 1\n";
		print OUT "$dec\\\n";
		print OUT "csp 0:csp 1:print 1:erasetextwindow 1:dwavestop 0\n";

というPerlスクリプトで

erasetextwindow 0
lsp 0,":s/24,24,2;#FFFFFF少女",196,431
lsp 1,"image/nmbase.jpg",50,424
print 1
「台詞」\
csp 0:csp 1:print 1:erasetextwindow 1:dwavestop 0

こんなNスクのスクリプトを吐いています。
ここで場面によって変化するのは「名前」「名前の表示座標」「台詞」だけで、他は毎回同じです。
ノベルゲームの常として、会話が非常に多いので総計でかなりの容量を使ってしまっています。
そのため必要最低限の引数だけとって、あとは"defsub"でユーザー定義命令にしてしまいましょう。
0.txtに

*define
(略)
defsub name
defsub nend

game
*name getparam $1,%1 ;名前と座標を受け取ります erasetextwindow 0 ;ここからは今まで1.txtに吐いていた部分 lsp 0,":s/24,24,2;#FFFFFF$1",%1,431 lsp 1,"image/nmbase.jpg",50,424 print 1 return ;ユーザー定義命令終了
*nend csp 0:csp 1:print 1:erasetextwindow 1:dwavestop 0 ;ここも長いので4文字にまとめてみた return

これでシナリオ中、名前と座標の引数を自作した"name"命令に渡してやることで
最初の長ったらしいスクリプトと同様の動作をするようになりました。
Perlの方はこんな感じ

	}elsif ( $line =~ /^%00%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;
		$nalocate = 220 - (length($name))*6;
		;#print OUT "erasetextwindow 0\n";
		;#print OUT "lsp 0,\":s/24,24,2;#FFFFFF$name\",$nalocate,431\n";
		;#print OUT "lsp 1,\"image/nmbase.jpg\",50,424\n";
		;#print OUT "print 1\n";
		print OUT "name \"$name\",$nalocate\n";
		print OUT "$dec\\\n";
		;#print OUT "csp 0:csp 1:print 1:erasetextwindow 1:dwavestop 0\n";
		print OUT "nend\n";

name "少女",196
「台詞」\
nend

となります。うん、すっきり
変更した結果、全体のスクリプトサイズが7.5MB、分割したものは3MB・4MB程度になりました。
まだまだサイズは大きいですが、多少なりとも余裕ができたんじゃないでしょーか
今後も過去のものを含めてちまちま削っていければと思います。

トラックバックURL

このエントリーのトラックバックURL:
http://hitotsumori.com/x/cgi-bin/mt/mt-tb.cgi/38

コメントする