自作バックログの基礎
システムカスタマイズ前提で、バックログを自作したらこうなる、と言うサンプル。
解説
バックログを、変数領域に保存し、また呼び出す仕組み。呼び出したバックログは、strspに渡して好きなように表示してください。
また、start直後、あるいはゲーム開始直後に、念の為にlookbackflushを実行しておくとよいでしょう。
システムカスタマイズに加える場合の注意点
textclearの直前にgosub *backlog_addを実行するか、
textclearをdefsubで上書きして
*textclear gosub *backlog_add _textclear return
などとBパートに追加するかしてください。
以下の命令を上書きして内部的に違う動作します。※見かけの引数や効果は変わらない。
- getlogtext
- checkpage
- lookbackflush
以下の命令を新規に作成します。
- getloglen
現在のログの長さを返す命令
getloglen %0 ; %0に、ログの長さ、0以上の数値が入る。
さらなる改良点
バックログに、テキスト以外のその時の発言者名や音声ファイル名などを記録する場合は、*backlog_addの変更が必要でしょう。
Aパート
define節、game以上に記述。
numaliasで%0になっているのは、バッティングしないように自由に変更してください。
numaliasで固定の数値になっているのは、説明をつけていますので環境に合わせて変更してください。
; バックログを100行までたどれるとする。 numalias backlog_span,100 ; バックログを格納する文字列変数を、500番からとする。 numalias backlog_start,500 numalias backlog_end,backlog_start+backlog_span-1 numalias backlog_cursor,%0:inc %0 ; 次に登録するバックログは何番かを記録。0〜backlog_span-1まで numalias backlog_cursor_real,%0:inc %0 ; 次に登録するバックログは文字列変数の何番かを記録。 numalias backlog_loop,%0:inc %0 ; ループ用変数 numalias backlog_accumulation,%0:inc %0 ; 現在、ログが何行溜まっているかを記録する変数 intlimit backlog_accumulation,0,backlog_span numalias backlog_textlen,%0:inc %0 ; バックログの文字列の長さを取得する。 numalias backlog_res,%0:inc %0 numalias backlog_arg,%0:inc %0 ; 以下の命令を上書きする defsub getlogtext defsub checkpage defsub lookbackflush ; 以下の命令を新規に作成する。 defsub getloglen
Bパート
start節、普通は実行されないところに置く。
*lookbackflush for %backlog_loop=backlog_start to backlog_end mov $%backlog_loop,"" next mov %backlog_cursor,backlog_start mov %backlog_accumulation,0 return ; 現在表示されている内容をバックログに追加するルーチン ; このルーチンは、textclear直前に実行することを想定している。 ; 既読ストップ対策は一応してある。 *backlog_add mov $backlog_cursor,"" ; 念のために初期化 _getlogtext $backlog_cursor,0 ; 現在テキストウィンドウに表示してある内容を取得する。これはこのままstrspに渡せる。 len %backlog_textlen,$backlog_cursor ; 長さを取得 mov %backlog_textlen,1-1/(1+%backlog_textlen) ; 長さを0なら0、1以上なら1に変換 tablegoto %backlog_textlen,*backlog_add_main,*backlog_add_end *backlog_add_main ; バックログの登録処理 mov %backlog_cursor_real,%backlog_cursor+backlog_start mov $%backlog_cursor_real,$backlog_cursor ; ログを加える。 inc %backlog_cursor mod %backlog_cursor,backlog_span ; 幅がオーバーしていればこれで処理される。 inc %backlog_accumulation ; 記録した行数を増やす。※intlimitで限界を越えられない。 *backlog_add_end return ; バックログを取得する命令(上書き) *getlogtext getparam s%backlog_res,%backlog_arg mov $%backlog_res,"" ; 初期化 if %backlog_arg<0 return ; マイナスの数値は無視。""を返す。 if %backlog_arg=0 _getlogtext $%backlog_res,0:return ; 0ならデフォルトの動作 if %backlog_arg>%backlog_accumulation return ; 範囲外なら""を返す。 ; それ以外ならば、通常の処理 mov %backlog_cursor_real,%backlog_cursor+backlog_span-%backlog_arg mod %backlog_cursor_real,backlog_span add %backlog_cursor_real,backlog_start mov $%backlog_res,$%backlog_cursor_real return ; バックログを取得できるかどうかを確認する命令(上書き) *checkpage getparam i%backlog_res,%backlog_arg mov %%backlog_res,"" ; 初期化 if %backlog_arg<1 return ; 0以下の数値は無視。0を返す。 if %backlog_arg>%backlog_accumulation return ; 範囲外なら0を返す。 ; それ以外ならば、通常の処理 mov %%backlog_res,1 return ; バックログの長さを返す。 *getloglen getparam i%backlog_res mov %%backlog_res,%backlog_accumulation return