/*
	画面スクリプトサンプル
	CGモード
*/

#INCLUDE
	motion.h


///////////////////////////////////////
// 先読みファイル定義 (イメージのみ)
#PRELOAD
	sys_cgmode	// メイン画像
	sys_cg_ch	// キャラ選択ボタン
	sys_cg_t0	// サムネイル
	sys_cg_t1
	sys_cg_t2


///////////////////////////////////////
// オブジェクト作成
#DEFINE
	CPLANE		topmask			// ホワイトIN/OUT用の真っ白プレーン
	CIMAGE		bg_white		// 他画面との切り替えの際に白画面で繋ぐための白画像

	PLANE		pl				// 表示用プレーン

	IMAGE		img_bg			// 背景画像
	BUTTON		btn_ch[3]		// キャラ切り替えボタン
	BUTTON		btn_thumb[9]	// サムネイルボタン

	SCROLL2		scrl			// スクロールバー
	IMAGE		img_scrl_base	// スクロールバー下の可動範囲ライン画像

	IMAGE		img_cursor		// カーソル画像
	BUTTON		btn_sys[5]		// システム系ボタン
	IMAGE		img_help		// ヘルプ文章画像

	IMAGE		img_now[3]		// 達成率 - 現在値
	IMAGE		img_max[3]		// 達成率 - 最大値


///////////////////////////////////////
// オブジェクト初期化

// 真っ白プレーン
#OBJECT		COLOR		PRI		SIZE		DISP
topmask		0xffffffff	20000	1280,720	1

// 真っ白画像
#OBJECT		COLOR		PRI		SIZE		DISP	PL
bg_white	0xffffffff	1000	1280,720	0		pl

// 表示用プレーン
#OBJECT	SIZE		VRAM	PRI		DISP
pl		1280,720	0,0		5000	0

// 背景
#OBJECT		FILE		ID.0	PRI	DISP
img_bg		sys_cgmode	0		10	1

// キャラ選択ボタン
#OBJECT	FILE		PRI	ENABLE	DISP
btn_ch	sys_cg_ch	60	0		1

#OBJECT		ID.0	ID.1	ID.2	ID.3	POS2
btn_ch[0]	100		200		300		400		sys_cgmode:1000
btn_ch[1]	101		201		301		401		sys_cgmode:1001
btn_ch[2]	102		202		302		402		sys_cgmode:1002

// サムネイルボタン
// ID.0は未開放 ID.1は開放状態とする（ID.1は後で設定）
#OBJECT		ID.0	PL	PRI	ENABLE	DISP
btn_thumb	100		pl	200	0		0

#OBJECT			POS2
btn_thumb[0]	sys_cgmode:2000
btn_thumb[1]	sys_cgmode:2001
btn_thumb[2]	sys_cgmode:2002
btn_thumb[3]	sys_cgmode:2003
btn_thumb[4]	sys_cgmode:2004
btn_thumb[5]	sys_cgmode:2005
btn_thumb[6]	sys_cgmode:2006
btn_thumb[7]	sys_cgmode:2007
btn_thumb[8]	sys_cgmode:2008

// システム系ボタン
#OBJECT	FILE		PRI	PL	ENABLE	DISP
btn_sys	sys_cgmode	50	pl	0		1

#OBJECT		ID.0	ID.1	ID.2	ID.3
btn_sys[0]	100		200		300		400
btn_sys[1]	101		201		301		401
btn_sys[2]	102		202		302		402
btn_sys[3]	103		203		303		403
btn_sys[4]	104		204		304		404

// ヘルプ文章画像
#OBJECT		FILE		ID.0	PRI	PL	DISP
img_help	sys_cgmode	510		100	pl	0

// スクロールバー下の可動範囲ライン画像
#OBJECT			FILE		ID.0	DISP	PL	PRI
img_scrl_base	sys_cgmode	11		0		pl	500

// スクロールバー
#OBJECT		FILE				PRI		DISP	POS2			PL	ENABLE
scrl		sys_exmode_scroll	600		0		sys_cgmode:10	pl	0

// サムネイルカーソル
#OBJECT		FILE		ID.0	PRI	PL	DISP
img_cursor	sys_cg_t0	10000	300	pl	0

// 達成率数値
#OBJECT		FILE						PRI	PL	DISP
img_now		sys_saveload_font_page_max	80	pl	0
img_max		sys_saveload_font_page_max	85	pl	0

#OBJECT		POS2
img_now[0]	sys_cgmode:1510
img_now[1]	sys_cgmode:1511
img_now[2]	sys_cgmode:1512
img_max[0]	sys_cgmode:1500
img_max[1]	sys_cgmode:1501
img_max[2]	sys_cgmode:1502




// キーボード・ジョイパッド入力設定
#KEYBLOCK	3	//(w,h)	上,下,左,右
0				1,3		-1,2,-1,1
1				3,3		-1,2,0,-1
2				3,1		1,-1,0,-1

#OBJECT			KEYBLOCK	// (block,x,y)
btn_ch[0]		0,0,0
btn_ch[1]		0,0,1
btn_ch[2]		0,0,2
btn_thumb[0]	1,0,0
btn_thumb[1]	1,1,0
btn_thumb[2]	1,2,0
btn_thumb[3]	1,0,1
btn_thumb[4]	1,1,1
btn_thumb[5]	1,2,1
btn_thumb[6]	1,0,2
btn_thumb[7]	1,1,2
btn_thumb[8]	1,2,2
btn_sys[0]		2,0,0
btn_sys[1]		2,1,0
btn_sys[2]		2,2,0
btn_sys[3]		2,3,0
btn_sys[4]		2,4,0



////////////////////////////////
// スクリプトスタート
#START
	////////////////////////////////
	// 各種設定
	\100 = 3	// キャラ数（キャラボタン数）
	\101 = 3	// サムネイル１行あたりの数
	\102 = 3	// サムネイルの行数

	\110 = 15	// キャラ１のＣＧ枠数
	\111 = 11	// キャラ２のＣＧ枠数
	\112 = 7	// キャラ３のＣＧ枠数
	////////////////////////////////


	// キー入力による演出スキップをOFF
	keyskip off
	wait

	// CG観賞フラグのロードとCGリストテーブルのロードを行う
	cgreg_init savegen.dat 0x50 config.int/cglist.dat

	// カーソルがボタン以外の場所にあった時に矢印キーが押された場合の
	// 移動先ボタンの設定
	btn_ch[0] noact

	// 全キャラ合わせてのＣＧ枠数
	\120 = \110 + \111 + \112

	// 選択されているキャラ番号
	\130 = 0

	// サムネイルボタンとスクロールバーを関連付ける
	btn_thumb attach scrl

	// CG登録数を数える
	\0 = 0	// ループカウンタ
	next REGCOUNT


////////////////////////////////
// ＣＧ登録数を数える
#REGCOUNT
	if( \0 >= \120 )	next DISP_REGCOUNT	// 数え終わったら登録数表示処理へ

	// 登録数を取得
	cgreg_t 850 \0
	if( $850 )	\121++	// １つでも登録されていたら登録数+1

	\0++
	next REGCOUNT


////////////////////////////////
// ＣＧ登録数を表示
#DISP_REGCOUNT
	////////////////////////////////
	// 現在のＣＧ枠数
	\10 = \121 / 100		// 100の位
	\11 = (\121%100) / 10	// 10の位
	\12 = \121 % 10			// 1の位
	
	// 100の位の表示
	if( \10 > 0 )
		// 100の位が1以上なら表示
		img_now[2] settbl 0 \10	// テーブル0番(ID.0)を書き換え
		img_now[2] disp 1
	endif

	// 10の位を表示
	if( (\10 > 0) || (\11 > 0) )
		// 100の位が表示されているか、10の位が1以上なら表示
		img_now[1] settbl 0 \11
		img_now[1] disp 1
	endif

	// 1の位を表示
	img_now[0] settbl 0 \12
	img_now[0] disp 1

	// settbl だけでは表示画像の更新が行われない
	// setid 0 を行うことで更新される
	img_now setid 0

	////////////////////////////////
	// 最大枠数も同様に表示する
	\20 = \120 / 100
	\21 = (\120%100) / 10
	\22 = \120 % 10
	
	if( \20 > 0 )
		img_max[2] settbl 0 \20
		img_max[2] disp 1
	endif

	if( (\20 > 0) || (\21 > 0) )
		img_max[1] settbl 0 \21
		img_max[1] disp 1
	endif

	img_max[0] settbl 0 \22
	img_max[0] disp 1

	img_max setid 0

	// サムネイル設定処理へ
	next SET_THUMBNAIL


////////////////////////////////
//サムネイルをセット
#SET_THUMBNAIL
	// CGテーブルの参照開始位置を設定
	if( \130 == 0 )	\122 = 0			// キャラ１の時は先頭
	if( \130 == 1 )	\122 = \110			// キャラ２の時はキャラ１の後
	if( \130 == 2 )	\122 = \110 + \111	// キャラ３の時はキャラ２の後

	// サムネイルをロード
	if( \130 == 0 )	btn_thumb load sys_cg_t0		// キャラ１のとき
	if( \130 == 1 )	btn_thumb load sys_cg_t1		// キャラ２のとき
	if( \130 == 2 )	btn_thumb load sys_cg_t2		// キャラ３のとき

	// 選択されているキャラのサムネイル数をセット
	\123 = \(110+\130)

	// サムネイル表示前に全てのサムネイルを非表示にリセット
	btn_thumb disp 0

	// サムネイル表示処理へ
	next DISP_THUMBNAIL


////////////////////////////////
//サムネイルを表示
#DISP_THUMBNAIL
	// サムネイル表示ループへ
	\0 = 0	// ループカウンタ
	next THUMBNAIL_LOOP


////////////////////////////////
//サムネイル表示ループ
#THUMBNAIL_LOOP
	// １画面分処理したらループ終了
	if( \0 >= \101 * \102 )	next DISP	// 表示処理へ
	
	if( \150+\0 < \123 )	// キャラの枠数内なら情報更新
		// CG登録枚数を取得
		cgreg_t 850 \122+\150+\0	// \122+\150+\0 = 
									//    (テーブル先頭No)+(表示先頭位置)+(ループカウンタ)

		// 登録枚数を\200〜の変数へ
		\(200+\0) = $850

		// 登録されている時(ID.1)のサムネイル画像を変更
		btn_thumb[\0] settbl 1 \150+\0

		// 表示するIDをセット
		btn_thumb[\0] setid ($850!=0)	// $850!=0 は、$850が0なら0、それ以外なら1になる

		// サムネイルを表示
		btn_thumb[\0] disp 1
	else
		// 登録枚数を超えていたら登録枚数を-1に設定(無効枠)
		\(200+\0) = -1

		// サムネイルを非表示
		btn_thumb[\0] disp 0
	endif

	\0++

	next THUMBNAIL_LOOP


////////////////////////////////
// その他の表示処理
#DISP
	// キャラの全枠数が１画面に表示出来る分を超えている場合はスクロールバーを使用する
	if( \123 > \101 * \102 )
		\160 = 1	// スクロールバーを使用するフラグをON
	else
		\160 = 0	// スクロールバーを使用するフラグをOFF
	endif
	scrl disp \160				// スクロールバーを表示又は非表示
	img_scrl_base disp \160		// スクロールバーの表示状態に合わせて、下の可動範囲画像も設定

	// スクロールバーの設定
	\140 = (\123+(\101-1)) / \101	// 行数の計算
	scrl page 0 \140 \102			// スクロールバーの可動範囲を設定

	// 選択されているキャラをハイライト表示
	btn_ch setid 0	// とりあえず全てのキャラボタンをリセットして・・・
	btn_ch[\130] setid 2	// 選択されているキャラボタンをハイライト表示

	// [GRAPHIC]ボタンを押下状態にする
	btn_sys[0] setid 3

	// 初回起動時のみ実行
	// スクロールバーが動いた時などでサムネイルを変更した時は処理しない
	if( \500 == 0 )
		pl disp 1				// 表示用プレーンを表示して
		topmask fade 30 255 0	// 上に被せていた白プレーンをフェードアウト
		wait

		// 他画面からの切り替え時に黒画面にならないように敷いていたベースイメージを
		// リセット（消す）
		baseimg
	endif
	\500 = 1	// 次から↑の処理を行わないようにする

	/*
		ここでwait
		waitを入れる理由は、マウスホイール等でスクロールさせた時に
		#SEL_WAIT → #DISP_THUMBNAIL → #THUMBNAIL_LOOP → #DISP → #ENABLE_THUMBNAIL → #SEL_WAIT
		と処理が遷移するが、waitを入れないとマウスホイールなどの入力判定に用いる_SCRL_D_などの
		変数がリセットされないから。
		リセットされないと#SEL_WAITに戻った時に、また入力されたと誤判断されて、再度入力処理を
		行ってしまいます。
		waitを入れる（正確には1フレーム以上経過させる）ことで入力情報がリセットされるので、
		正常に動作するようになります。
	*/
	wait


	// 各種ボタンを有効化
	btn_ch enable 1		// キャラ切り替えボタン
	btn_sys enable 1	// システム系ボタン
	scrl enable 1		// スクロールバー

	btn_sys[0] enable 0	// [GRAPHIC]ボタンだけ無効

	// サムネイル有効化ループ
	\0 = 0
	next ENABLE_THUMBNAIL


////////////////////////////////
// サムネイル有効化ループ
#ENABLE_THUMBNAIL
	// １画面表示枠数を超えたらループ終了
	if( \0 >= \101 * \102 )
		react
		next SEL_WAIT	// 入力待ちへ
	endif

	if( \(200+\0) >= 0 )
		// 枠があるなら有効化
		btn_thumb[\0] enable 1
	else
		// 枠がないなら無効化
		btn_thumb[\0] enable 0
	endif

	\0++

	next ENABLE_THUMBNAIL


////////////////////////////////
// 入力待ちループ
#SEL_WAIT
	// 右クリックされたら終了
	if( _CLICK_R_!=0 )		next EXIT

	// マウスホイール↑ 又は PageUp が押された時の処理
	if( _SCRL_U_!=0 || _PAGE_U_!=0 )
		if( \151 > 0 )	// 表示開始位置が一番上(0)で無ければ
			// １行戻す
			\151--
			scrl pos \151	// スクロールバーの位置を設定
			\150 = \151	* \101	// サムネイル表示開始No
			next DISP_THUMBNAIL	// サムネイル表示更新
		endif
	endif

	// マウスホイール↓ 又は PageDown が押された時の処理
	if( _SCRL_D_!=0 || _PAGE_D_!=0 )
		if( \151 < \140-\102 )	// 表示開始位置が一番下(行数-1ページの行数)で無ければ
			// １行進む
			\151++
			scrl pos \151	// スクロールバーの位置を設定
			\150 = \151	* \101	// サムネイル表示開始No
			next DISP_THUMBNAIL	// サムネイル表示更新
		endif
	endif


///////////////////////////
// 全てのボタンを無効化
#DISABLE_BUTTON
	btn_ch enable 0		// キャラ切り替えボタン
	btn_thumb enable 0	// サムネイルボタン
	scrl enable 0		// スクロールバー
	btn_sys enable 0	// システム系ボタン


///////////////////////////
// CGモード終了
#EXIT
	// 全てのボタンを無効化
	call DISABLE_BUTTON

	// ホワイトアウト
	topmask disp 1
	topmask fade 30 0 255
	wait
	
	// 画面切り替え時に画面が黒くなるのを防ぐため、ベースイメージを設定
	baseimg bg_white

	// 終了（タイトルに戻る）
	exit -2
	next SLEEP


///////////////////////////
// ゲーム終了（終了ボタン）
#QUIT
	// 終了確認ダイアログを実行
	$860 = 0
	execfes conf
	next QUIT_WAIT


///////////////////////////
// ゲーム終了確認待ち
#QUIT_WAIT
	if( _EXITCODE_ == 1 )
		call DISABLE_BUTTON		// すべてのボタンを無効化
		endfes		// ダイアログスクリプト終了
		next QUIT2	// ゲーム終了処理へ
	endif
	if( _EXITCODE_ == 0 )
		endfes			// ダイアログスクリプト終了
		resetactive		// ボタン再アクティブ化
		next SEL_WAIT	// 入力待ちへ戻る
	endif


///////////////////////////
// ゲーム終了2
#QUIT2
	// フェードアウトしてゲーム終了
	pl fade 30 255 0
	wait
	exit -3
	next SLEEP


///////////////////////////
// スクリプト終了後の空ループ
#SLEEP



////////////////////////////////////////////////////////////
// モード変更各種

///////////////////////////
// ＣＧビューアを起動
#GO_CGVIEW
	// ボタンを全て無効化
	call DISABLE_BUTTON
	wait 1

	// ホワイトアウト
	topmask fade 30 0 255
	wait

	// CGモード画面を白画像で覆う
	bg_white disp 1

	// ホワイトアウト用プレーンを非表示
	topmask disp 0

	wait

	// ビューアを起動
	execfes cgview
	next WAIT_CGVIEW	// ビューア終了待ち


#WAIT_CGVIEW
	if( _EXITCODE_ != -1 )
		// ビューアタスクを終了
		endfes

		// 白プレーンで覆って・・・
		topmask disp 1
		topmask blend 255
		
		// CGモード画面を覆っていた画像を非表示
		bg_white disp 0

		// カーソルも非表示
		img_cursor disp 0

		// 白プレーンのフェードアウトを有効にする為、初回起動時と同様の処理を行う
		\500 = 0

		// 表示処理へ移行
		next DISP
	endif


///////////////////////////
// 回想モードへ
#GO_SCENE
	// 全てのボタンを無効化
	call DISABLE_BUTTON
	wait

	// ホワイトアウト
	topmask fade 30 0 255
	wait

	// 画面切り替え時に画面が黒くなるのを防ぐため、ベースイメージを設定
	baseimg bg_white
	wait

	// 終了コードを『回想モードへ移行』に設定して終了
	exit 11
	next SLEEP


///////////////////////////
// 音楽モードへ
#GO_MUSIC
	// 処理内容は『回想へ』(#GO_SCENE)と同じです。

	call DISABLE_BUTTON
	wait 1
	topmask fade 30 0 255
	wait
	baseimg bg_white
	wait
	exit 12		// 『音楽モードへ移行』コード
	next SLEEP


////////////////////////////////////////////////////////////
// ボタンまわりの処理

///////////////////////////
// システム系ボタン
#btn_sys.FOCUS
	// フォーカス用画像に切り替え
	@ setid 2
	
	// ヘルプ表示
	img_help settbl 0 500+@		// ID.0 を書き換えて・・・
	img_help setid 0			// ID.0 に変更
	img_help disp 1				// ヘルプを表示

#btn_sys.UNFOCUS
	// フォーカス用画像から元に戻す
	@ setid 0
	
	// ヘルプを消す
	img_help disp 0

#btn_sys.PUSH_L
	// 押された時の画像に変更
	@ setid 3
	if( @ == 1 )	next GO_SCENE	// [SCENE]ボタン
	if( @ == 2 )	next GO_MUSIC	// [MUSIC]ボタン
	if( @ == 3 )	next EXIT	// 戻るボタン
	if( @ == 4 )	next QUIT	// 終了ボタン


///////////////////////////
// キャラ変更ボタン
#btn_ch.FOCUS
	// 現在選択中のキャラでなければフォーカス用画像に変更
	if( \130 != @ )	@ setid 2

	// ヘルプ表示
	img_help settbl 0 510		// ID.0 を書き換えて・・・
	img_help setid 0			// ID.0 に変更
	img_help disp 1				// ヘルプを表示

#btn_ch.UNFOCUS
	// 現在選択中のキャラでなければフォーカス用画像から元に戻す
	if( \130 != @ )	@ setid 0

	// ヘルプを消す
	img_help disp 0

#btn_ch.PUSH_L
	// 現在選択中のキャラでなければ処理する（選択中がクリックされてもそれは無視）
	if( \130 != @ )
		\130 = @	// 新しいキャラNoをセット

		// スクロールバーの位置を初期化
		\150 = 0	// 表示されるサムネイルの先頭No
		\151 = 0	// スクロールバーの位置（行）
		scrl pos 0	// スクロールバー位置をリセット

		// サムネイルを変更
		next SET_THUMBNAIL
	endif


///////////////////////////
// サムネイルボタン
#btn_thumb.FOCUS
	if( \(200+@) != -1 )	// 枠がある場合
		// カーソルを表示
		img_cursor disp 1			// 表示
		@ getpos 850 851		// サムネイルの位置を取得
		img_cursor pos $850 $851	// カーソルの位置をサムネイルに合わせる
	else					// 枠がない場合
		// カーソルを消す
		img_cursor disp 0
	endif

	// ヘルプ表示
	img_help settbl 0 511		// ID.0 を書き換えて・・・
	img_help setid 0			// ID.0 に変更
	img_help disp 1				// ヘルプを表示

#btn_thumb.UNFOCUS
	// カーソルを消す
	img_cursor disp 0

	// ヘルプを消す
	img_help disp 0

#btn_thumb.PUSH_L
	if( \(200+@) > 0 )	// CGが登録されている場合
		// ビューアで表示するテーブル番号を設定
		$860 = \122 + \150 + @
		// ビューア起動
		next GO_CGVIEW
	endif


///////////////////////////
// スクロールバーが動いた
#scrl.SCRL_P
	scrl getpos 850		// スクロールバーの現在値を取得
	\150 = $850	* \101	// サムネイル表示開始No
	\151 = $850			// 現在の行
	next DISP_THUMBNAIL	// サムネイル更新



