オートモードの待ち時間を文字数によって変化
 自分はあまり使わないのですが、使う人もけっこういるみたいなので、オートモードの待ち時間を字数によって可変にしてみました。
 参考にしたのはエロゲのシステムまわりを考える(A・H・OP)スレ まとめ(貴史たま+ME)HPのシステムカスタマイズサンプル+オプション。
 以下、スクリプト(サブルーチン)。

*text_setAutoTime
gettext $TextTemp1
len %TextTemp1,$TextTemp1
mov %TextTemp2,(%gTextAutoTimeByChar - %gTextSpeed) * (%TextTemp1 - %TextAutoLastCharNum) / 2
if %TextTemp2 < 0 mov %TextTemp2,0
mov %TextAutoLastCharNum,%TextTemp1
ispage %TextTemp1
if %TextTemp1 == 0 add %TextTemp2,%gTextAutoTimeByLine
if %TextTemp1 == 1 mov %TextAutoLastCharNum,0:add %TextTemp2,%gTextAutoTimeByPage
if %TextTemp1 == 1 && %TextTemp2 < %gTextAutoTimeMin mov %TextTemp2,%gTextAutoTimeMin
automode_time %TextTemp2
return

 まず使用している変数についてですが、
 %gTextAutoTimeByCharは1文字ごとの待ち時間
 %gTextAutoTimeByLineはクリック待ち時に追加される待ち時間
 %gTextAutoTimeByPageは改ページ待ち時に追加される待ち時間
 %gTextSpeedはテキスト表示速度
 %TextAutoLastCharNumは前回表示した文字数(改ページごとにクリア)
 %gTextAutoTimeMinは改ページ待ち時の最小待ち時間
 %TextTemp1と%TextTemp2は汎用変数
 となっています。ちなみに接頭辞gはグローバル変数を示しています。
 処理としては
1.表示中の文字数を取得
2.(1文字ごとの待ち時間-テキスト表示速度)×(表示中文字数-前回表示した文字数)を計算
3.表示した文字数を前回表示した文字数として保存
4.通常のクリック待ちなら、それ用の待ち時間追加
5.改ページ待ちなら、それ用の待ち時間追加&前回表示した文字数をクリア
6.改ページ待ちで、かつ計算した待ち時間<最小待ち時間なら最小待ち時間を採用
7.待ち時間を設定
 という流れになってます。
 計算式にテキスト表示速度を加味しているのは、テキスト表示速度が速いときは待ち時間が短くなって、遅いときは長くなってしまうから。あとテキスト表示速度と1文字あたりの待ち時間の大小によっては計算した待ち時間が0以下になってしまうことがあるので、その時は0にするようにしています。
 表示した文字数周りの処理を最後にまとめて、流れをすっきりさせても良かったんですが、使用する変数が多くなるのと行数が長くなるのが何となく嫌でこんな感じなりました。改ページ待ちに関する処理も1行にまとめようと思えばまとめられるのですが、それはそれで一行が長くなりすぎますので……。

 基本的な処理は出来たので、あとは待ち時間を変更できるオプション項目を作らなくては。

【追記】
 WithoutLimitさんに捕捉されてるー。
 メニュー下部にある「▼オートモードの待ち時間の話」のリンクから飛べるのですが、捕捉というか補足といった内容で、自分の書いた内容に足りない部分をいい感じに補ってくださっているので直リンクしたいのだけれども、txtってあたりがなんかそのうち消されてしまいそうな雰囲気なのでやめときます。どこかに落ち着いたら改めてリンク貼ろうかしら。
 あと、WithoutLimitさんのスクリプトのお陰で気付いたことを一つ。書き忘れていたのですが、自分の書いたスクリプトでは%gTextAutoTimeByChar(1文字ごとの待ち時間)は、実際に設定したい時間/2の値を格納してました。なぜならlenで得られるのは文字数じゃなくてバイト数で、全角文字は1文字2バイトだからです。どうせ計算する時に2で割るんだからあらかじめ割っとけーと思ってそうしていたのですが、%gTextSpeedの値は1文字換算なので、これだとおかしくなるんですよね。なので計算式を
(%gTextAutoTimeByChar - %gTextSpeed) * (%TextTemp1 - %TextAutoLastCharNum) / 2
 に書き換え、%gTextAutoTimeByCharは実際に設定したい時間のままにしました。
 ああ、あともう一つ書き忘れ。gettextで得られるテキストにはルビ情報も含まれます。なのでこの計算式だとルビがある場合に数文字分のズレが生じるはずですが、ルビを振ってある文章は振ってないものより多少読むのが遅くなるんじゃないかなーと思ったのでそのままにしてあります。
[PR]
by lyricist_m | 2009-02-15 06:14 | NScripter
<< KAGでオートモード待ち時間可変 背景素材の2Dと3Dによる違い >>