Hatena::ブログ(Diary)

永字八法 RSSフィード Twitter

 | 

2013-10-17 Thursday

システムカスタマイズについてダラダラやるよーその7

システムカスタマイズについてダラダラやるよーその6.5 - 永字八法の続き。
NScripterシステムカスタマイズについて、1から話をしてみようと思う。その第7回目。
今回は、発言者欄について。

発言者欄とはなにか

適当にググった画像説明しますと、
http://9-ly1026.toypark.in/wedding/kanon.jpg
http://9-ly1026.toypark.in/wedding/kanon.jpg
この画像で「アンパン男」と書いてる部分、これですね。これにつきます

シナリオライターはどうすればよいか

一番簡単な実装方法は、シナリオにいちいち「lsp ":s/22,22,0;#FF0000キャラクター名",20,480」とか書くことですが、それではシナリオライター音信不通になったとしても文句は言えませんので、簡易な記述方法必要になります
そこで、NScripterに用意されているタグを使用することにします。

タグ

タグを使うようにするには、*define節でpretextgosubを実行します。

pretextgosub *pretext_lb

このようにすると、表示文の先頭でpretextgosubで指定したラベルにgosubするようになります
先のtextgosubと組み合わせると、

  1. *pretext_lb
  2. テキストの表示
  3. *text_lb

の順で実行されるようになります
一応参考までにこちらも見てください。pretextgosubとgettag - 永字八法手前味噌ですが。
とりあえず、このような書式を採用します。

[キャラクター名] ; 発言者欄をキャラクター名にする。
「セリフ」\ ; テキストウィンドウの中身を消した時、発言者欄も消す。

現在スクリプト

とりあえず、できた。
f:id:eiji8pou:20131017000623p:image

00.txt
;$V2000G1000S800,600L10000
*start
	saveoff ; 完全手動セーブ宣言!
	kidokumode 1 ; 既読スキップモードを使用可能にする。
	gosub *if_in_advance ; 一度は実行しておく。
	skipoff ; スキップを殺す。
	gosub *text_lb_skip_start ; 一度は実行しておく。
	gosub *initialize_global ; グローバル変数の初期設定

	; 画面サイズを取得しておく、
	getwindowsize %window_width,%window_height

	gosub *initialize_textwindow ; テキストウィンドウの初期設定
	set_window ; テキストウィンドウ表示
	gosub *initialize_nameplate ; 発言者欄の初期設定
10.txt
[あゆ]
うぐう。\

50.txt
end
*define

	; メニューバーを全消し
	deletemenu

	mov %0,100 ; numalias定義用一時変数
	mov %1,900 ; スプライト番号定義用の一時変数
	mov %2,1000 ; グローバル変数用

	; グローバル変数を使用
	globalon

	numalias global_first,%2:inc %2 ; グローバル変数の初期設定をしたかしていないかのフラグ。

	; bexecの結果を受け取る専用変数を宣言
	numalias bexec,%0:inc %0

	; システムカスタマイズの宣言
	textgosub *text_lb
	pretextgosub *pretext_lb

	; 既読スキップ有りで。
	kidokuskip
	
	; isskipの結果を受け取る専用変数を宣言
	numalias isskip,%0:inc %0

	; ifの代替命令群の定義
	defsub if_str_goto
	defsub if_str_gosub
	defsub if_int_goto
	defsub if_int_gosub
	defsub notif_str_goto
	defsub notif_str_gosub
	defsub notif_int_goto
	defsub notif_int_gosub
	
	numalias if_a,%0:inc %0
	numalias if_b,%0:inc %0
	numalias if_label,%0:inc %0
	
	; 自動記録なし
	autosaveoff

	; 画面サイズ回り
	numalias window_width,%0:inc %0
	numalias window_height,%0:inc %0

	; setwindow回り
	numalias sp_textwindow,%1:dec %1 ; テキストウィンドウ用のスプライト番号
	humanz sp_textwindow ; 立ち絵の位置を設定
	windowback ; テキストウィンドウをスプライトの位置まで引っ込ませる。
	numalias textwindow_width,%0:inc %0
	numalias textwindow_height,%0:inc %0
	numalias textwindow_x,%0:inc %0
	numalias textwindow_y,%0:inc %0
	numalias font_width,%0:inc %0
	numalias font_height,%0:inc %0
	numalias font_space,%0:inc %0
	numalias line_space,%0:inc %0
	numalias font_bold,%0:inc %0
	numalias font_shadow,%0:inc %0
	numalias font_ruby_width,%0:inc %0
	numalias font_ruby_height,%0:inc %0
	numalias font_sprite,%0:inc %0
	numalias textwindow_padding_top,%0:inc %0
	numalias textwindow_padding_bottom,%0:inc %0
	numalias textwindow_padding_left,%0:inc %0
	numalias textwindow_padding_right,%0:inc %0
	
	numalias textwindow_area_width,%0:inc %0
	numalias textwindow_area_height,%0:inc %0
	numalias textwindow_col,%0:inc %0
	numalias textwindow_row,%0:inc %0
	
	numalias textwindow_visible,%0:inc %0
	numalias textwindow_alpha,%2:inc %2

	numalias text_before,%0:inc %0
	numalias text_after,%0:inc %0

	; 初期化命令を作成
	defsub set_window
	
	; 上書き
	defsub texton
	defsub textoff
	
	; テキストの表示速度
	numalias textspeed,%2:inc %2
	
	; タグ処理回り
	numalias pretext_arg1,%0:inc %0 ; タグを取得するための変数その1
	numalias pretext_arg2,%0:inc %0
	numalias pretext_arg3,%0:inc %0
	
	; 発言者欄回り
	numalias sp_nameplate_box,%1:dec %1 ; 発言者欄の背景
	; 発言者欄の背景の各値
	numalias nameplate_box_x,%0:inc %0
	numalias nameplate_box_y,%0:inc %0
	numalias nameplate_box_width,%0:inc %0
	numalias nameplate_box_height,%0:inc %0

	; 発言者名の各値
	numalias sp_nameplate,%1:dec %1 ; 発言者欄
	; 発言者欄の各値
	numalias nameplate_x,%0:inc %0
	numalias nameplate_y,%0:inc %0
	numalias nameplate_width,%0:inc %0
	numalias nameplate_height,%0:inc %0
	numalias nameplate,%0:inc %0 ; 実際に表示される文字
	numalias talker,%0:inc %0 ; 現在の発言者番号
	numalias nameplate_visible,%0:inc %0 ; 発言者名を表示するか否か。
	

	; 画面内の位置のNEWS指定
	defsub news_position
	numalias news_ax,%0:inc %0
	numalias news_ay,%0:inc %0
	numalias news_x,%0:inc %0
	numalias news_y,%0:inc %0
	numalias parent_width,%0:inc %0
	numalias parent_height,%0:inc %0
	numalias child_width,%0:inc %0
	numalias child_height,%0:inc %0

	; スプライト回りの半汎用変数
	numalias sp_sp,%0:inc %0
	; getspmode専用
	numalias sp_mode,%0:inc %0
	; getspsize専用
	numalias sp_width,%0:inc %0
	numalias sp_height,%0:inc %0
	numalias sp_cellcount,%0:inc %0
	
	; スプライトの位置を調整する。
	defsub adjust_sprite
	numalias ads_sp,%0:inc %0
	numalias ads_x,%0:inc %0
	numalias ads_y,%0:inc %0
	numalias ads_xmode,%0:inc %0
	numalias ads_ymode,%0:inc %0
	
60.txt
game
70.txt
*text_lb
	texton

	; 今がスキップモードなら、さっさと次に回す。
	isskip %isskip
	itoa $isskip,%isskip:caption $isskip
	if_int_goto %isskip,1,*text_lb_end

	; 進む機能を持つキーが押されていないことをチェックする。
	checkkey %bexec,"LCLICK"   :skip (0-%bexec) * 1
	checkkey %bexec,"WHEELDOWN":skip (0-%bexec) * 2
	checkkey %bexec,"SPACE"    :skip (0-%bexec) * 3
	checkkey %bexec,"RETURN"   :skip (0-%bexec) * 4
	checkkey %bexec,"K"        :skip (0-%bexec) * 5
	isdown %bexec              :skip (0-%bexec) * 6
	; CTRLは除く。CTRL押しっぱなしで進むのは、最近のエンジンではよくある仕様だから。

	*text_lb_init_loop

	bclear

	*text_lb_loop

	bexec $bexec,%bexec

	; Sにセーブを、Lにロードを割り当てる。
	if_str_goto $bexec,"S",*save_routine
	if_str_goto $bexec,"L",*load_routine

	; Kに既読スキップモードを割り当てる。
	if_str_goto $bexec,"K",*text_lb_skip_start

	; マウスの左クリックかホイールダウン、キーボードのスペースキーかエンターキーかコントロールキーで次へ。
	if_str_goto $bexec,"LCLICK",*text_lb_end
	if_str_goto $bexec,"WHEELDOWN",*text_lb_end
	if_str_goto $bexec,"SPACE",*text_lb_end
	if_str_goto $bexec,"RETURN",*text_lb_end
	if_str_goto $bexec,"CTRL",*text_lb_end

	; F12キーでスクリーンショットを作成する。
	if_str_gosub $bexec,"F12",*get_and_save_screenshot

	; それ以外の入力であれば、ループする
	goto *text_lb_loop

	; スキップモード開始用
	*text_lb_skip_start
	systemcall skip

	; クリック待ちの終了処理。
	*text_lb_end

	; 現在表示している内容を取得する。
	getlogtext $text_before,0
	len %text_before,$text_before ; 長さを取得。

	texec

	; 現在表示している内容を取得する。
	getlogtext $text_after,0
	len %text_after,$text_after ; 長さを取得。
	; テキストウィンドウの中身を消したなら。発言者欄も消す。
	if %text_before>0 if %text_after=0 if %nameplate_visible=1 gosub *delete_nameplate

return

*texton
	skip 2-%textwindow_visible
	jumpf
	vsp sp_textwindow,1
	vsp sp_nameplate_box,1
	vsp sp_nameplate,1
	print 1
	_texton
	mov %textwindow_visible,1
	~
return

*textoff
	skip %textwindow_visible+1
	jumpf
	vsp sp_textwindow,0
	vsp sp_nameplate_box,0
	vsp sp_nameplate,0
	print 1
	_textoff
	mov %textwindow_visible,0
	~
return
71.txt
*pretext_lb
	; タグを取得する。
	gettag $pretext_arg1,$pretext_arg2,$pretext_arg3
	
	if $pretext_arg1="" return ; 第一引数が空なら、何もしない。

	mov $talker,$pretext_arg1 ; 発言者を設定
	mov $nameplate,$talker ; 表示内容を決定

	len %pretext_arg3,$pretext_arg3 ; 長さを取得
	skip 3-1/(%pretext_arg3+1) ; 振り分け
	mov $nameplate,$pretext_arg3 ; 実際に表示される内容を変更
	
	mov %nameplate_visible,1 ; 表示に設定

	; 実際に表示する。色は後で考える。念のため、最初は非表示にしておく。
	lsph sp_nameplate,$font_sprite+"#FFFFFF"+$nameplate,0,0
	; 作った後、動かす。
	adjust_sprite sp_nameplate,%nameplate_box_x+%nameplate_box_width/2,%nameplate_box_y+%nameplate_box_height/2,0,0
	; 表示する。
	mov %nameplate_visible,1
	vsp sp_nameplate,1
	texton
	print 1
return

; 発言者欄の設定
*initialize_nameplate
	; 発言者欄を読み込み
	lsph sp_nameplate_box,":c;>100,30,#888888",0,0
	; 発言者欄の大きさの取得
	getspsize sp_nameplate_box,%nameplate_box_width,%nameplate_box_height
	; 発言者欄の位置を決定。テキストウィンドウの左上にくっつく形でどうか。
	mov %nameplate_box_x,%textwindow_x
	mov %nameplate_box_y,%textwindow_y-%nameplate_box_height
	amsp sp_nameplate_box,%nameplate_box_x,%nameplate_box_y,%textwindow_alpha ; 不透明度はテキストウィンドウと共通
return

*delete_nameplate
	csp sp_nameplate
	mov %nameplate_visible,0
	print 1
return
75.txt
*initialize_global
	if %global_first=1 return

	; グローバル変数の初期設定
	
	; テキストウィンドウの不透明度
	mov %textwindow_alpha,255
	; テキストの表示速度(一文字表示にかけるミリ秒数)を格納する変数
	mov %textspeed,40

	; フラグを立てる。
	mov %global_first,1
return

*initialize_textwindow
	; テキストウィンドウの画像読み込み
	lsph sp_textwindow,":c;>600,200,#888888",0,0
	; テキストウィンドウのサイズを取得
	getspsize sp_textwindow,%textwindow_width,%textwindow_height
	; テキストウィンドウの配置場所の決定(左下にしている)
	news_position %textwindow_x,%textwindow_y,%window_width,%window_height,%textwindow_width,%textwindow_height,-1,1
	; フォントの設定
	mov %font_width,22
	mov %font_height,22
	mov %font_space,2
	mov %line_space,2
	mov %font_bold,0
	mov %font_shadow,1
	mov %font_ruby_width,11
	mov %font_ruby_height,11
	
	; フォントの各値を、文字列スプライトで使えるように文字列化しておく。
	itoa $font_width,%font_width
	itoa $font_height,%font_height
	itoa $font_space,%font_space
	mov $font_sprite,":s/"+$font_width+","+$font_height+","+$font_space+";"
	
	; パディングの設定
	mov %textwindow_padding_top,8
	mov %textwindow_padding_bottom,8
	mov %textwindow_padding_left,12
	mov %textwindow_padding_right,12
	
	; エフェクト中もテキストウィンドウが消えないようにする。
	erasetextwindow 0
	; 念のため、右クリックを殺しておく。
	rmode 0
return

; 実際にテキストウィンドウを設定する。
*set_window
	; 実際の表示領域の広さを計算する。
	mov %textwindow_area_width,%textwindow_width-%textwindow_padding_left-%textwindow_padding_right
	mov %textwindow_area_height,%textwindow_height-%textwindow_padding_top-%textwindow_padding_bottom
	; 表示領域の広さから、行数や文字数を計算する。
	mov %textwindow_col,%textwindow_area_width/(%font_width+%font_space)
	mov %textwindow_row,%textwindow_area_height/(%font_height+%line_space+%font_ruby_height)
	; 数値を反映した値にする。
	setwindow %textwindow_x+%textwindow_padding_top,%textwindow_y+%textwindow_padding_left,%textwindow_col,1+%textwindow_row,%font_width,%font_height,%font_space,%line_space+%font_ruby_height,0,%font_bold,%font_shadow,#000000,%textwindow_x,%textwindow_y,%window_width,%window_height
	rubyon %font_ruby_width,%font_ruby_height
	textspeed %textspeed
	amsp sp_textwindow,%textwindow_x,%textwindow_y,%textwindow_alpha
	vsp sp_textwindow,1
return

; ある領域の中で、小さな領域を配置する時のための座標を計算する。
*news_position
	getparam i%news_x,i%news_y,%parent_width,%parent_height,%child_width,%child_height,%news_ax,%news_ay
	mov %%news_x,%parent_width-%child_width
	if %news_ax=-1 mov %%news_x,0
	if %news_ax=0 div %%news_x,2
	mov %%news_y,%parent_height-%child_height
	if %news_ay=-1 mov %%news_y,0
	if %news_ay=0 div %%news_y,2
return

; セーブルーチン
*save_routine
	savegame 0
	mesbox "セーブしました。","save game"
goto *text_lb
; ロードルーチン
*load_routine
	loadgame 0

; スプライトの特殊操作命令群
; amspのラッパー
*adjust_sprite
	getparam %ads_sp,%ads_x,%ads_y,%ads_xmode,%ads_ymode
	getspsize %ads_sp,%sp_width,%sp_height ; スプライトの大きさを取得する。
		skip %ads_xmode+2
		                      :skip 3
		sub %ads_x,%sp_width/2:skip 2
		sub %ads_x,%sp_width
		skip %ads_ymode+2
		                       :skip 3
		sub %ads_y,%sp_height/2:skip 2
		sub %ads_y,%sp_height
	amsp %ads_sp,%ads_x,%ads_y
return

; if 代替命令群本体ルーチン

*if_str_goto
	getparam $if_a,$if_b,$if_label
	if $if_a=$if_b return $if_label
return

*if_str_gosub
	getparam $if_a,$if_b,$if_label
	if $if_a=$if_b goto $if_label
return

*if_int_goto
	getparam %if_a,%if_b,$if_label
	if %if_a=%if_b return $if_label
return

*if_int_gosub
	getparam %if_a,%if_b,$if_label
	if %if_a=%if_b goto $if_label
return

*notif_str_goto
	getparam $if_a,$if_b,$if_label
	notif $if_a=$if_b return $if_label
return

*notif_str_gosub
	getparam $if_a,$if_b,$if_label
	notif $if_a=$if_b goto $if_label
return

*notif_int_goto
	getparam %if_a,%if_b,$if_label
	notif %if_a=%if_b return $if_label
return

*notif_int_gosub
	getparam %if_a,%if_b,$if_label
	notif %if_a=%if_b goto $if_label
return

*if_in_advance
	; 定義した命令を、一度は実行しておくためのルーチン。
	; 起動時に一回だけやっておけばよい。
	if_str_goto ""," ",*dummy
	if_str_gosub ""," ",*dummy
	if_int_goto 0,1,*dummy
	if_int_gosub 0,1,*dummy
	notif_str_goto "","",*dummy
	notif_str_gosub "","",*dummy
	notif_int_goto 0,0,*dummy
	notif_int_gosub 0,0,*dummy

	if_str_gosub "","",*if_in_advance_dummy
	if_str_goto "","",*if_in_advance1

	*if_in_advance1
	if_int_gosub 0,0,*if_in_advance_dummy
	if_int_goto 0,0,*if_in_advance2

	*if_in_advance2
	notif_str_gosub ""," ",*if_in_advance_dummy
	notif_str_goto ""," ",*if_in_advance3

	*if_in_advance3
	notif_int_gosub 0,1,*if_in_advance_dummy
	notif_int_goto 0,1,*if_in_advance4

	*if_in_advance4
return

*if_in_advance_dummy
	; 何もしないよ。
return
95.txt
*get_and_save_screenshot
	getscreenshot %window_width,%window_height
	savescreenshot "ss.bmp"
	mesbox "スクリーンショットを作成しました。","screenshot"
return
99.txt
return
end

2013年10月16日のツイート

システムカスタマイズについてダラダラやるよーその7

システムカスタマイズについてダラダラやるよーその6.5 - 永字八法の続き。
NScripterシステムカスタマイズについて、1から話をしてみようと思う。その第7回目。
今回は、発言者欄について。

発言者欄とはなにか

適当にググった画像説明しますと、
http://9-ly1026.toypark.in/wedding/kanon.jpg
http://9-ly1026.toypark.in/wedding/kanon.jpg
この画像で「アンパン男」と書いてる部分、これですね。これにつきます

シナリオライターはどうすればよいか

一番簡単な実装方法は、シナリオにいちいち「lsp ":s/22,22,0;#FF0000キャラクター名",20,480」とか書くことですが、それではシナリオライター音信不通になったとしても文句は言えませんので、簡易な記述方法必要になります
そこで、NScripterに用意されているタグを使用することにします。

タグ

タグを使うようにするには、*define節でpretextgosubを実行します。

pretextgosub *pretext_lb

このようにすると、表示文の先頭でpretextgosubで指定したラベルにgosubするようになります
先のtextgosubと組み合わせると、

  1. *pretext_lb
  2. テキストの表示
  3. *text_lb

の順で実行されるようになります
一応参考までにこちらも見てください。pretextgosubとgettag - 永字八法手前味噌ですが。
とりあえず、このような書式を採用します。

[キャラクター名] ; 発言者欄をキャラクター名にする。
「セリフ」\ ; テキストウィンドウの中身を消した時、発言者欄も消す。

現在スクリプト

とりあえず、できた。
f:id:eiji8pou:20131017000623p:image

00.txt
;$V2000G1000S800,600L10000
*start
	saveoff ; 完全手動セーブ宣言!
	kidokumode 1 ; 既読スキップモードを使用可能にする。
	gosub *if_in_advance ; 一度は実行しておく。
	skipoff ; スキップを殺す。
	gosub *text_lb_skip_start ; 一度は実行しておく。
	gosub *initialize_global ; グローバル変数の初期設定

	; 画面サイズを取得しておく、
	getwindowsize %window_width,%window_height

	gosub *initialize_textwindow ; テキストウィンドウの初期設定
	set_window ; テキストウィンドウ表示
	gosub *initialize_nameplate ; 発言者欄の初期設定
10.txt
[あゆ]
うぐう。\

50.txt
end
*define

	; メニューバーを全消し
	deletemenu

	mov %0,100 ; numalias定義用一時変数
	mov %1,900 ; スプライト番号定義用の一時変数
	mov %2,1000 ; グローバル変数用

	; グローバル変数を使用
	globalon

	numalias global_first,%2:inc %2 ; グローバル変数の初期設定をしたかしていないかのフラグ。

	; bexecの結果を受け取る専用変数を宣言
	numalias bexec,%0:inc %0

	; システムカスタマイズの宣言
	textgosub *text_lb
	pretextgosub *pretext_lb

	; 既読スキップ有りで。
	kidokuskip
	
	; isskipの結果を受け取る専用変数を宣言
	numalias isskip,%0:inc %0

	; ifの代替命令群の定義
	defsub if_str_goto
	defsub if_str_gosub
	defsub if_int_goto
	defsub if_int_gosub
	defsub notif_str_goto
	defsub notif_str_gosub
	defsub notif_int_goto
	defsub notif_int_gosub
	
	numalias if_a,%0:inc %0
	numalias if_b,%0:inc %0
	numalias if_label,%0:inc %0
	
	; 自動記録なし
	autosaveoff

	; 画面サイズ回り
	numalias window_width,%0:inc %0
	numalias window_height,%0:inc %0

	; setwindow回り
	numalias sp_textwindow,%1:dec %1 ; テキストウィンドウ用のスプライト番号
	humanz sp_textwindow ; 立ち絵の位置を設定
	windowback ; テキストウィンドウをスプライトの位置まで引っ込ませる。
	numalias textwindow_width,%0:inc %0
	numalias textwindow_height,%0:inc %0
	numalias textwindow_x,%0:inc %0
	numalias textwindow_y,%0:inc %0
	numalias font_width,%0:inc %0
	numalias font_height,%0:inc %0
	numalias font_space,%0:inc %0
	numalias line_space,%0:inc %0
	numalias font_bold,%0:inc %0
	numalias font_shadow,%0:inc %0
	numalias font_ruby_width,%0:inc %0
	numalias font_ruby_height,%0:inc %0
	numalias font_sprite,%0:inc %0
	numalias textwindow_padding_top,%0:inc %0
	numalias textwindow_padding_bottom,%0:inc %0
	numalias textwindow_padding_left,%0:inc %0
	numalias textwindow_padding_right,%0:inc %0
	
	numalias textwindow_area_width,%0:inc %0
	numalias textwindow_area_height,%0:inc %0
	numalias textwindow_col,%0:inc %0
	numalias textwindow_row,%0:inc %0
	
	numalias textwindow_visible,%0:inc %0
	numalias textwindow_alpha,%2:inc %2

	numalias text_before,%0:inc %0
	numalias text_after,%0:inc %0

	; 初期化命令を作成
	defsub set_window
	
	; 上書き
	defsub texton
	defsub textoff
	
	; テキストの表示速度
	numalias textspeed,%2:inc %2
	
	; タグ処理回り
	numalias pretext_arg1,%0:inc %0 ; タグを取得するための変数その1
	numalias pretext_arg2,%0:inc %0
	numalias pretext_arg3,%0:inc %0
	
	; 発言者欄回り
	numalias sp_nameplate_box,%1:dec %1 ; 発言者欄の背景
	; 発言者欄の背景の各値
	numalias nameplate_box_x,%0:inc %0
	numalias nameplate_box_y,%0:inc %0
	numalias nameplate_box_width,%0:inc %0
	numalias nameplate_box_height,%0:inc %0

	; 発言者名の各値
	numalias sp_nameplate,%1:dec %1 ; 発言者欄
	; 発言者欄の各値
	numalias nameplate_x,%0:inc %0
	numalias nameplate_y,%0:inc %0
	numalias nameplate_width,%0:inc %0
	numalias nameplate_height,%0:inc %0
	numalias nameplate,%0:inc %0 ; 実際に表示される文字
	numalias talker,%0:inc %0 ; 現在の発言者番号
	numalias nameplate_visible,%0:inc %0 ; 発言者名を表示するか否か。
	

	; 画面内の位置のNEWS指定
	defsub news_position
	numalias news_ax,%0:inc %0
	numalias news_ay,%0:inc %0
	numalias news_x,%0:inc %0
	numalias news_y,%0:inc %0
	numalias parent_width,%0:inc %0
	numalias parent_height,%0:inc %0
	numalias child_width,%0:inc %0
	numalias child_height,%0:inc %0

	; スプライト回りの半汎用変数
	numalias sp_sp,%0:inc %0
	; getspmode専用
	numalias sp_mode,%0:inc %0
	; getspsize専用
	numalias sp_width,%0:inc %0
	numalias sp_height,%0:inc %0
	numalias sp_cellcount,%0:inc %0
	
	; スプライトの位置を調整する。
	defsub adjust_sprite
	numalias ads_sp,%0:inc %0
	numalias ads_x,%0:inc %0
	numalias ads_y,%0:inc %0
	numalias ads_xmode,%0:inc %0
	numalias ads_ymode,%0:inc %0
	
60.txt
game
70.txt
*text_lb
	texton

	; 今がスキップモードなら、さっさと次に回す。
	isskip %isskip
	itoa $isskip,%isskip:caption $isskip
	if_int_goto %isskip,1,*text_lb_end

	; 進む機能を持つキーが押されていないことをチェックする。
	checkkey %bexec,"LCLICK"   :skip (0-%bexec) * 1
	checkkey %bexec,"WHEELDOWN":skip (0-%bexec) * 2
	checkkey %bexec,"SPACE"    :skip (0-%bexec) * 3
	checkkey %bexec,"RETURN"   :skip (0-%bexec) * 4
	checkkey %bexec,"K"        :skip (0-%bexec) * 5
	isdown %bexec              :skip (0-%bexec) * 6
	; CTRLは除く。CTRL押しっぱなしで進むのは、最近のエンジンではよくある仕様だから。

	*text_lb_init_loop

	bclear

	*text_lb_loop

	bexec $bexec,%bexec

	; Sにセーブを、Lにロードを割り当てる。
	if_str_goto $bexec,"S",*save_routine
	if_str_goto $bexec,"L",*load_routine

	; Kに既読スキップモードを割り当てる。
	if_str_goto $bexec,"K",*text_lb_skip_start

	; マウスの左クリックかホイールダウン、キーボードのスペースキーかエンターキーかコントロールキーで次へ。
	if_str_goto $bexec,"LCLICK",*text_lb_end
	if_str_goto $bexec,"WHEELDOWN",*text_lb_end
	if_str_goto $bexec,"SPACE",*text_lb_end
	if_str_goto $bexec,"RETURN",*text_lb_end
	if_str_goto $bexec,"CTRL",*text_lb_end

	; F12キーでスクリーンショットを作成する。
	if_str_gosub $bexec,"F12",*get_and_save_screenshot

	; それ以外の入力であれば、ループする
	goto *text_lb_loop

	; スキップモード開始用
	*text_lb_skip_start
	systemcall skip

	; クリック待ちの終了処理。
	*text_lb_end

	; 現在表示している内容を取得する。
	getlogtext $text_before,0
	len %text_before,$text_before ; 長さを取得。

	texec

	; 現在表示している内容を取得する。
	getlogtext $text_after,0
	len %text_after,$text_after ; 長さを取得。
	; テキストウィンドウの中身を消したなら。発言者欄も消す。
	if %text_before>0 if %text_after=0 if %nameplate_visible=1 gosub *delete_nameplate

return

*texton
	skip 2-%textwindow_visible
	jumpf
	vsp sp_textwindow,1
	vsp sp_nameplate_box,1
	vsp sp_nameplate,1
	print 1
	_texton
	mov %textwindow_visible,1
	~
return

*textoff
	skip %textwindow_visible+1
	jumpf
	vsp sp_textwindow,0
	vsp sp_nameplate_box,0
	vsp sp_nameplate,0
	print 1
	_textoff
	mov %textwindow_visible,0
	~
return
71.txt
*pretext_lb
	; タグを取得する。
	gettag $pretext_arg1,$pretext_arg2,$pretext_arg3
	
	if $pretext_arg1="" return ; 第一引数が空なら、何もしない。

	mov $talker,$pretext_arg1 ; 発言者を設定
	mov $nameplate,$talker ; 表示内容を決定

	len %pretext_arg3,$pretext_arg3 ; 長さを取得
	skip 3-1/(%pretext_arg3+1) ; 振り分け
	mov $nameplate,$pretext_arg3 ; 実際に表示される内容を変更
	
	mov %nameplate_visible,1 ; 表示に設定

	; 実際に表示する。色は後で考える。念のため、最初は非表示にしておく。
	lsph sp_nameplate,$font_sprite+"#FFFFFF"+$nameplate,0,0
	; 作った後、動かす。
	adjust_sprite sp_nameplate,%nameplate_box_x+%nameplate_box_width/2,%nameplate_box_y+%nameplate_box_height/2,0,0
	; 表示する。
	mov %nameplate_visible,1
	vsp sp_nameplate,1
	texton
	print 1
return

; 発言者欄の設定
*initialize_nameplate
	; 発言者欄を読み込み
	lsph sp_nameplate_box,":c;>100,30,#888888",0,0
	; 発言者欄の大きさの取得
	getspsize sp_nameplate_box,%nameplate_box_width,%nameplate_box_height
	; 発言者欄の位置を決定。テキストウィンドウの左上にくっつく形でどうか。
	mov %nameplate_box_x,%textwindow_x
	mov %nameplate_box_y,%textwindow_y-%nameplate_box_height
	amsp sp_nameplate_box,%nameplate_box_x,%nameplate_box_y,%textwindow_alpha ; 不透明度はテキストウィンドウと共通
return

*delete_nameplate
	csp sp_nameplate
	mov %nameplate_visible,0
	print 1
return
75.txt
*initialize_global
	if %global_first=1 return

	; グローバル変数の初期設定
	
	; テキストウィンドウの不透明度
	mov %textwindow_alpha,255
	; テキストの表示速度(一文字表示にかけるミリ秒数)を格納する変数
	mov %textspeed,40

	; フラグを立てる。
	mov %global_first,1
return

*initialize_textwindow
	; テキストウィンドウの画像読み込み
	lsph sp_textwindow,":c;>600,200,#888888",0,0
	; テキストウィンドウのサイズを取得
	getspsize sp_textwindow,%textwindow_width,%textwindow_height
	; テキストウィンドウの配置場所の決定(左下にしている)
	news_position %textwindow_x,%textwindow_y,%window_width,%window_height,%textwindow_width,%textwindow_height,-1,1
	; フォントの設定
	mov %font_width,22
	mov %font_height,22
	mov %font_space,2
	mov %line_space,2
	mov %font_bold,0
	mov %font_shadow,1
	mov %font_ruby_width,11
	mov %font_ruby_height,11
	
	; フォントの各値を、文字列スプライトで使えるように文字列化しておく。
	itoa $font_width,%font_width
	itoa $font_height,%font_height
	itoa $font_space,%font_space
	mov $font_sprite,":s/"+$font_width+","+$font_height+","+$font_space+";"
	
	; パディングの設定
	mov %textwindow_padding_top,8
	mov %textwindow_padding_bottom,8
	mov %textwindow_padding_left,12
	mov %textwindow_padding_right,12
	
	; エフェクト中もテキストウィンドウが消えないようにする。
	erasetextwindow 0
	; 念のため、右クリックを殺しておく。
	rmode 0
return

; 実際にテキストウィンドウを設定する。
*set_window
	; 実際の表示領域の広さを計算する。
	mov %textwindow_area_width,%textwindow_width-%textwindow_padding_left-%textwindow_padding_right
	mov %textwindow_area_height,%textwindow_height-%textwindow_padding_top-%textwindow_padding_bottom
	; 表示領域の広さから、行数や文字数を計算する。
	mov %textwindow_col,%textwindow_area_width/(%font_width+%font_space)
	mov %textwindow_row,%textwindow_area_height/(%font_height+%line_space+%font_ruby_height)
	; 数値を反映した値にする。
	setwindow %textwindow_x+%textwindow_padding_top,%textwindow_y+%textwindow_padding_left,%textwindow_col,1+%textwindow_row,%font_width,%font_height,%font_space,%line_space+%font_ruby_height,0,%font_bold,%font_shadow,#000000,%textwindow_x,%textwindow_y,%window_width,%window_height
	rubyon %font_ruby_width,%font_ruby_height
	textspeed %textspeed
	amsp sp_textwindow,%textwindow_x,%textwindow_y,%textwindow_alpha
	vsp sp_textwindow,1
return

; ある領域の中で、小さな領域を配置する時のための座標を計算する。
*news_position
	getparam i%news_x,i%news_y,%parent_width,%parent_height,%child_width,%child_height,%news_ax,%news_ay
	mov %%news_x,%parent_width-%child_width
	if %news_ax=-1 mov %%news_x,0
	if %news_ax=0 div %%news_x,2
	mov %%news_y,%parent_height-%child_height
	if %news_ay=-1 mov %%news_y,0
	if %news_ay=0 div %%news_y,2
return

; セーブルーチン
*save_routine
	savegame 0
	mesbox "セーブしました。","save game"
goto *text_lb
; ロードルーチン
*load_routine
	loadgame 0

; スプライトの特殊操作命令群
; amspのラッパー
*adjust_sprite
	getparam %ads_sp,%ads_x,%ads_y,%ads_xmode,%ads_ymode
	getspsize %ads_sp,%sp_width,%sp_height ; スプライトの大きさを取得する。
		skip %ads_xmode+2
		                      :skip 3
		sub %ads_x,%sp_width/2:skip 2
		sub %ads_x,%sp_width
		skip %ads_ymode+2
		                       :skip 3
		sub %ads_y,%sp_height/2:skip 2
		sub %ads_y,%sp_height
	amsp %ads_sp,%ads_x,%ads_y
return

; if 代替命令群本体ルーチン

*if_str_goto
	getparam $if_a,$if_b,$if_label
	if $if_a=$if_b return $if_label
return

*if_str_gosub
	getparam $if_a,$if_b,$if_label
	if $if_a=$if_b goto $if_label
return

*if_int_goto
	getparam %if_a,%if_b,$if_label
	if %if_a=%if_b return $if_label
return

*if_int_gosub
	getparam %if_a,%if_b,$if_label
	if %if_a=%if_b goto $if_label
return

*notif_str_goto
	getparam $if_a,$if_b,$if_label
	notif $if_a=$if_b return $if_label
return

*notif_str_gosub
	getparam $if_a,$if_b,$if_label
	notif $if_a=$if_b goto $if_label
return

*notif_int_goto
	getparam %if_a,%if_b,$if_label
	notif %if_a=%if_b return $if_label
return

*notif_int_gosub
	getparam %if_a,%if_b,$if_label
	notif %if_a=%if_b goto $if_label
return

*if_in_advance
	; 定義した命令を、一度は実行しておくためのルーチン。
	; 起動時に一回だけやっておけばよい。
	if_str_goto ""," ",*dummy
	if_str_gosub ""," ",*dummy
	if_int_goto 0,1,*dummy
	if_int_gosub 0,1,*dummy
	notif_str_goto "","",*dummy
	notif_str_gosub "","",*dummy
	notif_int_goto 0,0,*dummy
	notif_int_gosub 0,0,*dummy

	if_str_gosub "","",*if_in_advance_dummy
	if_str_goto "","",*if_in_advance1

	*if_in_advance1
	if_int_gosub 0,0,*if_in_advance_dummy
	if_int_goto 0,0,*if_in_advance2

	*if_in_advance2
	notif_str_gosub ""," ",*if_in_advance_dummy
	notif_str_goto ""," ",*if_in_advance3

	*if_in_advance3
	notif_int_gosub 0,1,*if_in_advance_dummy
	notif_int_goto 0,1,*if_in_advance4

	*if_in_advance4
return

*if_in_advance_dummy
	; 何もしないよ。
return
95.txt
*get_and_save_screenshot
	getscreenshot %window_width,%window_height
	savescreenshot "ss.bmp"
	mesbox "スクリーンショットを作成しました。","screenshot"
return
99.txt
return
end

2013年10月16日のツイート

システムカスタマイズについてダラダラやるよーその7

システムカスタマイズについてダラダラやるよーその6.5 - 永字八法の続き。
NScripterシステムカスタマイズについて、1から話をしてみようと思う。その第7回目。
今回は、発言者欄について。

発言者欄とはなにか

適当にググった画像説明しますと、
http://9-ly1026.toypark.in/wedding/kanon.jpg
http://9-ly1026.toypark.in/wedding/kanon.jpg
この画像で「アンパン男」と書いてる部分、これですね。これにつきます

シナリオライターはどうすればよいか

一番簡単な実装方法は、シナリオにいちいち「lsp ":s/22,22,0;#FF0000キャラクター名",20,480」とか書くことですが、それではシナリオライター音信不通になったとしても文句は言えませんので、簡易な記述方法必要になります
そこで、NScripterに用意されているタグを使用することにします。

タグ

タグを使うようにするには、*define節でpretextgosubを実行します。

pretextgosub *pretext_lb

このようにすると、表示文の先頭でpretextgosubで指定したラベルにgosubするようになります
先のtextgosubと組み合わせると、

  1. *pretext_lb
  2. テキストの表示
  3. *text_lb

の順で実行されるようになります
一応参考までにこちらも見てください。pretextgosubとgettag - 永字八法手前味噌ですが。
とりあえず、このような書式を採用します。

[キャラクター名] ; 発言者欄をキャラクター名にする。
「セリフ」\ ; テキストウィンドウの中身を消した時、発言者欄も消す。

現在スクリプト

とりあえず、できた。
f:id:eiji8pou:20131017000623p:image

00.txt
;$V2000G1000S800,600L10000
*start
	saveoff ; 完全手動セーブ宣言!
	kidokumode 1 ; 既読スキップモードを使用可能にする。
	gosub *if_in_advance ; 一度は実行しておく。
	skipoff ; スキップを殺す。
	gosub *text_lb_skip_start ; 一度は実行しておく。
	gosub *initialize_global ; グローバル変数の初期設定

	; 画面サイズを取得しておく、
	getwindowsize %window_width,%window_height

	gosub *initialize_textwindow ; テキストウィンドウの初期設定
	set_window ; テキストウィンドウ表示
	gosub *initialize_nameplate ; 発言者欄の初期設定
10.txt
[あゆ]
うぐう。\

50.txt
end
*define

	; メニューバーを全消し
	deletemenu

	mov %0,100 ; numalias定義用一時変数
	mov %1,900 ; スプライト番号定義用の一時変数
	mov %2,1000 ; グローバル変数用

	; グローバル変数を使用
	globalon

	numalias global_first,%2:inc %2 ; グローバル変数の初期設定をしたかしていないかのフラグ。

	; bexecの結果を受け取る専用変数を宣言
	numalias bexec,%0:inc %0

	; システムカスタマイズの宣言
	textgosub *text_lb
	pretextgosub *pretext_lb

	; 既読スキップ有りで。
	kidokuskip
	
	; isskipの結果を受け取る専用変数を宣言
	numalias isskip,%0:inc %0

	; ifの代替命令群の定義
	defsub if_str_goto
	defsub if_str_gosub
	defsub if_int_goto
	defsub if_int_gosub
	defsub notif_str_goto
	defsub notif_str_gosub
	defsub notif_int_goto
	defsub notif_int_gosub
	
	numalias if_a,%0:inc %0
	numalias if_b,%0:inc %0
	numalias if_label,%0:inc %0
	
	; 自動記録なし
	autosaveoff

	; 画面サイズ回り
	numalias window_width,%0:inc %0
	numalias window_height,%0:inc %0

	; setwindow回り
	numalias sp_textwindow,%1:dec %1 ; テキストウィンドウ用のスプライト番号
	humanz sp_textwindow ; 立ち絵の位置を設定
	windowback ; テキストウィンドウをスプライトの位置まで引っ込ませる。
	numalias textwindow_width,%0:inc %0
	numalias textwindow_height,%0:inc %0
	numalias textwindow_x,%0:inc %0
	numalias textwindow_y,%0:inc %0
	numalias font_width,%0:inc %0
	numalias font_height,%0:inc %0
	numalias font_space,%0:inc %0
	numalias line_space,%0:inc %0
	numalias font_bold,%0:inc %0
	numalias font_shadow,%0:inc %0
	numalias font_ruby_width,%0:inc %0
	numalias font_ruby_height,%0:inc %0
	numalias font_sprite,%0:inc %0
	numalias textwindow_padding_top,%0:inc %0
	numalias textwindow_padding_bottom,%0:inc %0
	numalias textwindow_padding_left,%0:inc %0
	numalias textwindow_padding_right,%0:inc %0
	
	numalias textwindow_area_width,%0:inc %0
	numalias textwindow_area_height,%0:inc %0
	numalias textwindow_col,%0:inc %0
	numalias textwindow_row,%0:inc %0
	
	numalias textwindow_visible,%0:inc %0
	numalias textwindow_alpha,%2:inc %2

	numalias text_before,%0:inc %0
	numalias text_after,%0:inc %0

	; 初期化命令を作成
	defsub set_window
	
	; 上書き
	defsub texton
	defsub textoff
	
	; テキストの表示速度
	numalias textspeed,%2:inc %2
	
	; タグ処理回り
	numalias pretext_arg1,%0:inc %0 ; タグを取得するための変数その1
	numalias pretext_arg2,%0:inc %0
	numalias pretext_arg3,%0:inc %0
	
	; 発言者欄回り
	numalias sp_nameplate_box,%1:dec %1 ; 発言者欄の背景
	; 発言者欄の背景の各値
	numalias nameplate_box_x,%0:inc %0
	numalias nameplate_box_y,%0:inc %0
	numalias nameplate_box_width,%0:inc %0
	numalias nameplate_box_height,%0:inc %0

	; 発言者名の各値
	numalias sp_nameplate,%1:dec %1 ; 発言者欄
	; 発言者欄の各値
	numalias nameplate_x,%0:inc %0
	numalias nameplate_y,%0:inc %0
	numalias nameplate_width,%0:inc %0
	numalias nameplate_height,%0:inc %0
	numalias nameplate,%0:inc %0 ; 実際に表示される文字
	numalias talker,%0:inc %0 ; 現在の発言者番号
	numalias nameplate_visible,%0:inc %0 ; 発言者名を表示するか否か。
	

	; 画面内の位置のNEWS指定
	defsub news_position
	numalias news_ax,%0:inc %0
	numalias news_ay,%0:inc %0
	numalias news_x,%0:inc %0
	numalias news_y,%0:inc %0
	numalias parent_width,%0:inc %0
	numalias parent_height,%0:inc %0
	numalias child_width,%0:inc %0
	numalias child_height,%0:inc %0

	; スプライト回りの半汎用変数
	numalias sp_sp,%0:inc %0
	; getspmode専用
	numalias sp_mode,%0:inc %0
	; getspsize専用
	numalias sp_width,%0:inc %0
	numalias sp_height,%0:inc %0
	numalias sp_cellcount,%0:inc %0
	
	; スプライトの位置を調整する。
	defsub adjust_sprite
	numalias ads_sp,%0:inc %0
	numalias ads_x,%0:inc %0
	numalias ads_y,%0:inc %0
	numalias ads_xmode,%0:inc %0
	numalias ads_ymode,%0:inc %0
	
60.txt
game
70.txt
*text_lb
	texton

	; 今がスキップモードなら、さっさと次に回す。
	isskip %isskip
	itoa $isskip,%isskip:caption $isskip
	if_int_goto %isskip,1,*text_lb_end

	; 進む機能を持つキーが押されていないことをチェックする。
	checkkey %bexec,"LCLICK"   :skip (0-%bexec) * 1
	checkkey %bexec,"WHEELDOWN":skip (0-%bexec) * 2
	checkkey %bexec,"SPACE"    :skip (0-%bexec) * 3
	checkkey %bexec,"RETURN"   :skip (0-%bexec) * 4
	checkkey %bexec,"K"        :skip (0-%bexec) * 5
	isdown %bexec              :skip (0-%bexec) * 6
	; CTRLは除く。CTRL押しっぱなしで進むのは、最近のエンジンではよくある仕様だから。

	*text_lb_init_loop

	bclear

	*text_lb_loop

	bexec $bexec,%bexec

	; Sにセーブを、Lにロードを割り当てる。
	if_str_goto $bexec,"S",*save_routine
	if_str_goto $bexec,"L",*load_routine

	; Kに既読スキップモードを割り当てる。
	if_str_goto $bexec,"K",*text_lb_skip_start

	; マウスの左クリックかホイールダウン、キーボードのスペースキーかエンターキーかコントロールキーで次へ。
	if_str_goto $bexec,"LCLICK",*text_lb_end
	if_str_goto $bexec,"WHEELDOWN",*text_lb_end
	if_str_goto $bexec,"SPACE",*text_lb_end
	if_str_goto $bexec,"RETURN",*text_lb_end
	if_str_goto $bexec,"CTRL",*text_lb_end

	; F12キーでスクリーンショットを作成する。
	if_str_gosub $bexec,"F12",*get_and_save_screenshot

	; それ以外の入力であれば、ループする
	goto *text_lb_loop

	; スキップモード開始用
	*text_lb_skip_start
	systemcall skip

	; クリック待ちの終了処理。
	*text_lb_end

	; 現在表示している内容を取得する。
	getlogtext $text_before,0
	len %text_before,$text_before ; 長さを取得。

	texec

	; 現在表示している内容を取得する。
	getlogtext $text_after,0
	len %text_after,$text_after ; 長さを取得。
	; テキストウィンドウの中身を消したなら。発言者欄も消す。
	if %text_before>0 if %text_after=0 if %nameplate_visible=1 gosub *delete_nameplate

return

*texton
	skip 2-%textwindow_visible
	jumpf
	vsp sp_textwindow,1
	vsp sp_nameplate_box,1
	vsp sp_nameplate,1
	print 1
	_texton
	mov %textwindow_visible,1
	~
return

*textoff
	skip %textwindow_visible+1
	jumpf
	vsp sp_textwindow,0
	vsp sp_nameplate_box,0
	vsp sp_nameplate,0
	print 1
	_textoff
	mov %textwindow_visible,0
	~
return
71.txt
*pretext_lb
	; タグを取得する。
	gettag $pretext_arg1,$pretext_arg2,$pretext_arg3
	
	if $pretext_arg1="" return ; 第一引数が空なら、何もしない。

	mov $talker,$pretext_arg1 ; 発言者を設定
	mov $nameplate,$talker ; 表示内容を決定

	len %pretext_arg3,$pretext_arg3 ; 長さを取得
	skip 3-1/(%pretext_arg3+1) ; 振り分け
	mov $nameplate,$pretext_arg3 ; 実際に表示される内容を変更
	
	mov %nameplate_visible,1 ; 表示に設定

	; 実際に表示する。色は後で考える。念のため、最初は非表示にしておく。
	lsph sp_nameplate,$font_sprite+"#FFFFFF"+$nameplate,0,0
	; 作った後、動かす。
	adjust_sprite sp_nameplate,%nameplate_box_x+%nameplate_box_width/2,%nameplate_box_y+%nameplate_box_height/2,0,0
	; 表示する。
	mov %nameplate_visible,1
	vsp sp_nameplate,1
	texton
	print 1
return

; 発言者欄の設定
*initialize_nameplate
	; 発言者欄を読み込み
	lsph sp_nameplate_box,":c;>100,30,#888888",0,0
	; 発言者欄の大きさの取得
	getspsize sp_nameplate_box,%nameplate_box_width,%nameplate_box_height
	; 発言者欄の位置を決定。テキストウィンドウの左上にくっつく形でどうか。
	mov %nameplate_box_x,%textwindow_x
	mov %nameplate_box_y,%textwindow_y-%nameplate_box_height
	amsp sp_nameplate_box,%nameplate_box_x,%nameplate_box_y,%textwindow_alpha ; 不透明度はテキストウィンドウと共通
return

*delete_nameplate
	csp sp_nameplate
	mov %nameplate_visible,0
	print 1
return
75.txt
*initialize_global
	if %global_first=1 return

	; グローバル変数の初期設定
	
	; テキストウィンドウの不透明度
	mov %textwindow_alpha,255
	; テキストの表示速度(一文字表示にかけるミリ秒数)を格納する変数
	mov %textspeed,40

	; フラグを立てる。
	mov %global_first,1
return

*initialize_textwindow
	; テキストウィンドウの画像読み込み
	lsph sp_textwindow,":c;>600,200,#888888",0,0
	; テキストウィンドウのサイズを取得
	getspsize sp_textwindow,%textwindow_width,%textwindow_height
	; テキストウィンドウの配置場所の決定(左下にしている)
	news_position %textwindow_x,%textwindow_y,%window_width,%window_height,%textwindow_width,%textwindow_height,-1,1
	; フォントの設定
	mov %font_width,22
	mov %font_height,22
	mov %font_space,2
	mov %line_space,2
	mov %font_bold,0
	mov %font_shadow,1
	mov %font_ruby_width,11
	mov %font_ruby_height,11
	
	; フォントの各値を、文字列スプライトで使えるように文字列化しておく。
	itoa $font_width,%font_width
	itoa $font_height,%font_height
	itoa $font_space,%font_space
	mov $font_sprite,":s/"+$font_width+","+$font_height+","+$font_space+";"
	
	; パディングの設定
	mov %textwindow_padding_top,8
	mov %textwindow_padding_bottom,8
	mov %textwindow_padding_left,12
	mov %textwindow_padding_right,12
	
	; エフェクト中もテキストウィンドウが消えないようにする。
	erasetextwindow 0
	; 念のため、右クリックを殺しておく。
	rmode 0
return

; 実際にテキストウィンドウを設定する。
*set_window
	; 実際の表示領域の広さを計算する。
	mov %textwindow_area_width,%textwindow_width-%textwindow_padding_left-%textwindow_padding_right
	mov %textwindow_area_height,%textwindow_height-%textwindow_padding_top-%textwindow_padding_bottom
	; 表示領域の広さから、行数や文字数を計算する。
	mov %textwindow_col,%textwindow_area_width/(%font_width+%font_space)
	mov %textwindow_row,%textwindow_area_height/(%font_height+%line_space+%font_ruby_height)
	; 数値を反映した値にする。
	setwindow %textwindow_x+%textwindow_padding_top,%textwindow_y+%textwindow_padding_left,%textwindow_col,1+%textwindow_row,%font_width,%font_height,%font_space,%line_space+%font_ruby_height,0,%font_bold,%font_shadow,#000000,%textwindow_x,%textwindow_y,%window_width,%window_height
	rubyon %font_ruby_width,%font_ruby_height
	textspeed %textspeed
	amsp sp_textwindow,%textwindow_x,%textwindow_y,%textwindow_alpha
	vsp sp_textwindow,1
return

; ある領域の中で、小さな領域を配置する時のための座標を計算する。
*news_position
	getparam i%news_x,i%news_y,%parent_width,%parent_height,%child_width,%child_height,%news_ax,%news_ay
	mov %%news_x,%parent_width-%child_width
	if %news_ax=-1 mov %%news_x,0
	if %news_ax=0 div %%news_x,2
	mov %%news_y,%parent_height-%child_height
	if %news_ay=-1 mov %%news_y,0
	if %news_ay=0 div %%news_y,2
return

; セーブルーチン
*save_routine
	savegame 0
	mesbox "セーブしました。","save game"
goto *text_lb
; ロードルーチン
*load_routine
	loadgame 0

; スプライトの特殊操作命令群
; amspのラッパー
*adjust_sprite
	getparam %ads_sp,%ads_x,%ads_y,%ads_xmode,%ads_ymode
	getspsize %ads_sp,%sp_width,%sp_height ; スプライトの大きさを取得する。
		skip %ads_xmode+2
		                      :skip 3
		sub %ads_x,%sp_width/2:skip 2
		sub %ads_x,%sp_width
		skip %ads_ymode+2
		                       :skip 3
		sub %ads_y,%sp_height/2:skip 2
		sub %ads_y,%sp_height
	amsp %ads_sp,%ads_x,%ads_y
return

; if 代替命令群本体ルーチン

*if_str_goto
	getparam $if_a,$if_b,$if_label
	if $if_a=$if_b return $if_label
return

*if_str_gosub
	getparam $if_a,$if_b,$if_label
	if $if_a=$if_b goto $if_label
return

*if_int_goto
	getparam %if_a,%if_b,$if_label
	if %if_a=%if_b return $if_label
return

*if_int_gosub
	getparam %if_a,%if_b,$if_label
	if %if_a=%if_b goto $if_label
return

*notif_str_goto
	getparam $if_a,$if_b,$if_label
	notif $if_a=$if_b return $if_label
return

*notif_str_gosub
	getparam $if_a,$if_b,$if_label
	notif $if_a=$if_b goto $if_label
return

*notif_int_goto
	getparam %if_a,%if_b,$if_label
	notif %if_a=%if_b return $if_label
return

*notif_int_gosub
	getparam %if_a,%if_b,$if_label
	notif %if_a=%if_b goto $if_label
return

*if_in_advance
	; 定義した命令を、一度は実行しておくためのルーチン。
	; 起動時に一回だけやっておけばよい。
	if_str_goto ""," ",*dummy
	if_str_gosub ""," ",*dummy
	if_int_goto 0,1,*dummy
	if_int_gosub 0,1,*dummy
	notif_str_goto "","",*dummy
	notif_str_gosub "","",*dummy
	notif_int_goto 0,0,*dummy
	notif_int_gosub 0,0,*dummy

	if_str_gosub "","",*if_in_advance_dummy
	if_str_goto "","",*if_in_advance1

	*if_in_advance1
	if_int_gosub 0,0,*if_in_advance_dummy
	if_int_goto 0,0,*if_in_advance2

	*if_in_advance2
	notif_str_gosub ""," ",*if_in_advance_dummy
	notif_str_goto ""," ",*if_in_advance3

	*if_in_advance3
	notif_int_gosub 0,1,*if_in_advance_dummy
	notif_int_goto 0,1,*if_in_advance4

	*if_in_advance4
return

*if_in_advance_dummy
	; 何もしないよ。
return
95.txt
*get_and_save_screenshot
	getscreenshot %window_width,%window_height
	savescreenshot "ss.bmp"
	mesbox "スクリーンショットを作成しました。","screenshot"
return
99.txt
return
end

2013年10月16日のツイート

 | 

Notice

コメント等は基本的に自由ですが、通りすがりとかななしさんとかの場合、いじっても面白くないので放置する可能性があります。

最近のエントリー

カウンター:
<< 2013/10 >>
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
あわせて読みたい
過去ログ
0000 | 00 |
1800 | 10 |
1908 | 06 |
1983 | 06 | 12 |
1985 | 01 | 08 | 09 | 10 | 11 |
1986 | 10 |
1990 | 01 | 02 | 03 | 04 | 05 | 06 |
1995 | 01 |
1996 | 02 | 03 | 04 | 05 | 06 |
1997 | 03 | 05 |
1999 | 02 | 09 |
2000 | 00 |
2001 | 12 |
2002 | 01 | 02 | 03 | 04 |
2003 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2004 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |

Mail Form
お名前
メールアドレス
本文
公開の是非 公開してもよござんす/公開してはいけません
ブロ電™切符
RSS feed meter for http://d.hatena.ne.jp/eiji8pou/
著作権保護期間の70年延長に反対
NHK(日本放置協会)は放置される側の団体です
やる気の無いサイトリング
時間のないサイト運営者リング
ヒロインリコメンダー
私設コミケカタログ
「ひぐらしのなく頃に」を応援しています。
07th Expansion
「ひぐらしのなく頃に」のネタばれがあるのです。

最新コメント一覧

1. 08/21 無明長夜
2. 05/06 えぐち
3. 09/18 ABC1979
4. 10/14 eiji8pou
5. 10/14 ななし
6. 10/14 ななし
7. 06/30 うなぎ
8. 01/12 ねこ
9. 10/18 とおりすがり
10. 04/29 柊
11. 02/13 湖都
12. 02/13 eiji8pou
13. 02/13 湖都
14. 10/06 湖都
15. 10/06 リメ

最新トラックバック一覧

1. 10/17 Twitter / @Rek7z
2. 11/16 Twitter / @Lyri_m
3. 09/01 Twitter / @shinriyo
4. 04/10 Twitter / @psychedesire
5. 10/25 Twitter / @karafuto1979
6. 10/23 Twitter / @kkk_iso
7. 10/23 Twitter / @tacticsrealize
8. 10/22 Twitter / @kkk_iso
9. 10/18 Twitter / @kkk_iso
10. 04/24 Twitter / @fakestarbaby
11. 02/11 Twitter / @karafuto1979
12. 04/10 buynowforsaleの日記 - 灯で形態素解析もどき&マルコフ連鎖で文章...
13. 01/30 Twitter / @it__ssei
14. 11/24 Twitter / @nnnn330
15. 08/17 Twitter / @Arcueid_YHWH

言及URL

1. FrontPage - 朱鷺魅
2. Renee PDF Aideのダウンロード : Vector ソフトを探す!
3. NScripter−Tips:常駐ボタンの作り方
4. eiji8pouさんの採点結果[71点] まぁだいだいできたかなぁ〜|paizaオンラインハッカソンLite
5. 線形合同法 - Wikipedia
6. システムカスタマイズについてダラダラやるよーその8 - 永字八法
7. システムカスタマイズについてダラダラやるよーその7 - 永字八法
8. pretextgosubとgettag - 永字八法
9. システムカスタマイズについてダラダラやるよーその6.5 - 永字八法
10. システムカスタマイズについてダラダラやるよーその6 - 永字八法

言及ISBN/ASIN

1. 日本語〈上〉 (岩波新書)
2. ラプンツェル
3. ツバメしんどろ~む (Volume2) (角川コミックスドラゴンJr.)
4. ツバメしんどろ~む (3) (角川コミックスドラゴンJr)
5. ツバメしんどろ~む4 (カドカワコミックスドラゴンJr)
6. ツバメしんどろ~む v.6 (角川コミックス ドラゴンJr. 48-11)
7. ツバメしんどろ~む v.7 (角川コミックス ドラゴンJr. 48-13)
8. ツバメしんどろ~む v.8 (角川コミックス ドラゴンJr. 48-14)
9. だから僕は、Hができない。 4 (ドラゴンコミックスエイジ お 3-2-4)
10. キカイダー02(5) (角川コミックス・エース)
11. ストライクウィッチーズ 天空の乙女たち (1) (角川コミックス・エース 82-6)
12. J1 1 (あすかコミックスDX)
13. J1 2 (あすかコミックスDX)
14. 東方三月精 〜 Strange and Bright Nature Deity. (1) (角川コミックス)
15. のりタマ 1 (電撃コミックス)
16. ヘヴィーオブジェクト (電撃コミックス)
17. 京騒戯画鏡書院と迷子の栞 (電撃コミックス)
18. あぶない丘の家 3 (あすかコミックス)
19. ダークマーメイド―邪神伝説シリーズ 2 (ノーラコミックス 邪神伝説シリーズ)
20. まあめいど―都築和彦CGコミックス (ノーラコミックス・デラックス)
21. ワダチ 1 (マガジンKC)
22. ワダチ 2 (マガジンKC)
23. シミュレーションの発想―新しい問題解決法 (ブルーバックス (B‐523))
24. クレオパトラの謎 (講談社現代新書 (683))
25. ワーグナー (講談社現代新書)
26. 悪魔の話 (講談社現代新書)
27. 西洋占星術―科学と魔術のあいだ (講談社現代新書)
28. ChuしてBOMB! 1 (講談社コミックスフレンド)
29. ChuしてBOMB! 2 (講談社コミックスフレンド)
30. 星の島のるるちゃん 1 (講談社コミックスなかよし)

言及JAN/EAN

1. コミックメガストア 2009年12月号
2. 二次元ドリームマガジン2005年2月号
3. 二次元ドリームマガジン2006年2月号
4. 二次元ドリームマガジン2007年2月号
5. 二次元ドリームマガジン2005年4月号
6. 二次元ドリームマガジン2006年4月号
7. 二次元ドリームマガジン2007年4月号
8. 二次元ドリームマガジン2005年6月号
9. 二次元ドリームマガジン2006年6月号
10. 二次元ドリームマガジン2004年8月号
11. 二次元ドリームマガジン2005年8月号
12. 二次元ドリームマガジン2006年8月号
13. 二次元ドリームマガジン2005年10月号
14. 二次元ドリームマガジン2006年10月号
15. 二次元ドリームマガジン2005年12月号
16. 二次元ドリームマガジン2006年12月号
17. まんがタイムきららMAX 2010年01月号
18. ウルトラジャンプ 2009年11月号
19. コミックメガストアH 2009年10月号
20. 二次元ドリームマガジン 2009年12月号 Vol.49
21. コミック二次元ドリームVol.01
22. まんが学園4年生
23. まんがパレット2010年5月号
24. まんが4コマKINGSぱれっと 2009年12月号
25. まんがタイムきらら 2010年1月号
26. まんがタイムきらら 2010年4月号
27. まんがタイムきらら 2009年11月号
28. まんがタイムきららMAX 2009年12月号
29. まんがタイムきらら Carat 2009年12月号
30. HGST 3.5inch 7200rpm 2.0TB 64MB SATA 6.0Gbps

eiji8pouのアンテナ

1. 労働者の図書館 〓図書館で働く者の義務と権利〓
2. lib_blog
3. 見習司書の読書日記(たぶん)
4. 傾き加減|【続】ネコ裁判 「隣のネコも訴えられました。」
5. marginBlog
6. NScripterよう
7. 扇町Game(ぶw)log
8. RE V の日記 @Hatena::Diary
9. カレントアウェアネス・ポータル | 国立国会図書館
10. blue-black
11. マロニエの花咲く 光町立図書館blog
12. くすみんと
13. 図書館ばなし
14. ”裏”日本工業新聞!!
15. 放蕩オペラハウス
16. のらゴコロ
17. TRC データ部ログ
18. 女子高生Cの場合
19. 河本の実験室
20. 山中湖情報創造館


注目ISBN/ASIN

1. 【Amazon.co.jp限定】 Enter Enter MISSION! 最終章ver. (ビジュアルシート(ジャケットサイズ)付)
2. チャイナタウン [Blu-ray]
3. マッドマックス 怒りのデス・ロード [Blu-ray]
4. 欲望という名の電車 オリジナル・ディレクターズカット [DVD]
5. 86―エイティシックス―Ep.3 ―ラン・スルー・ザ・バトルフロント―〈下〉 (電撃文庫)
6. リトルアーモリー LA038 FA-MAS G2タイプ プラモデル
7. BRUTUS(ブルータス) 2018年 1/1・15合併号[危険な読書]
8. 新フォーチュン・クエストII(9) エルフたちの逡巡 (電撃文庫)
9. リトルアーモリー LA039 P90タイプ プラモデル
10. 海賊とよばれた男(上) (講談社文庫)

最新JAN/EAN

1. 6CD Gabriel Fauré
2. The Art of Violin 3 Alfonso Mosesti
3. Brahms: Tre Sonate pianoforte e violino op.78-100-108
4. うな次郎
5. BBC Music Magazine Vol.18.3 Sergei Prokofiev

注目JAN/EAN

1. 6CD Gabriel Fauré
.
.
.
.

書いたコメント