自作バックログの基礎

システムカスタマイズ前提で、バックログを自作したらこうなる、と言うサンプル。

解説

バックログを、変数領域に保存し、また呼び出す仕組み。呼び出したバックログは、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