# 15 sample_RPG.hsp

sample\ 15 sample_RPG.hsp

    #include "hsp3dish.as"

    ; #include "ezlocal-dish-js.hsp"
    ; ezLocalJS

    title "RPGサンプル"
    //--------------------------------------
    // 必要モジュール読み込み
    //--------------------------------------
    #include "mod_layerbutton.hsp"
    #include "mod_layerbutton-vpad.hsp"
    #include "mod_layerbutton-emes.hsp"
    // dotfw.asのjstick/stickにキーを送り込む(df_addKey@)ため一時的に上書き
    #ifdef _hspwin
    	#undef stick
    	#define global stick(%1,%2=0,%3=1) if _dotfw_joystick@ { jstick %1,%2 : %1|=df_addKey@ }else{ stick@hsp %1,%2,%3 : %1|=df_addKey@ }
    	#define ___hspwin
    #else
    	#undef stick
    	#define global stick(%1,%2=0,%3=1) stick@hsp %1,%2,%3 : %1|=df_addKey@
    #endif
    #undef _hspwin
    // dotfwモジュール読み込み
    #include "dotfw.as"
    // 一時的な上書きを元に戻す
    #ifdef ___hspwin
    	#define global _hspwin
    #endif
    #undef stick
    #define global stick(%1,%2=0,%3=1) stick@hsp %1,%2,%3

    //--------------------------------------
    // フォント変更
    //--------------------------------------
    #dishjs_font "MPLUS1p-Regular.ttf", 2,,-5  ; フォントファイル名を指定 (ブラウザ) // ezlocal-dish-jsというモジュールを利用した場合の拡張命令
    font_file "MPLUS1p-Regular.ttf"  ; フォントファイル一時読み込み (Windows) // 沢渡氏のモジュール(スクリプト末尾に記述)

    //--------------------------------------
    // HSP3Dish.js用 設定
    //--------------------------------------
    info_os = sysinfo(0)
    if instr(info_os,0,"Emscripten")>=0 {
    	mm_dir=""
    	fontName = "M PLUS 1p"
    	fontSize = 19
    	fontSize_money = 14
    	fontSize_item = 16
    } else {
    	mm_dir="data/"
    	fontName = "M PLUS 1p"
    	fontSize = 26
    	fontSize_money = 20
    	fontSize_item = 22
    }

    //------------------------------------------------------------------------------
    // ゲーム : 初期化
    //------------------------------------------------------------------------------
    //--------------------------------------
    // 画面設定
    //--------------------------------------
    	df_config "X480 Y800 Z100"
    	df_reset

    //--------------------------------------
    // プレイヤーキャラクターを登録
    //--------------------------------------
    	celload "tamadot.png",-1		; 画像ファイル読み込み
    	bufId = stat
    	es_size 64,64				; キャラクターのサイズ指定
    	es_patanim 0, 4, 64*4, 64*0, 12, bufId	; キャラクターの登録(0〜3)
    	es_patanim 4, 4, 64*4, 64*1, 12, bufId	; キャラクターの登録(4〜7)
    	es_patanim 8, 4, 64*4, 64*2, 12, bufId	; キャラクターの登録(8〜11)
    	es_patanim 12,4, 64*4, 64*3, 12, bufId	; キャラクターの登録(12〜15)

    //--------------------------------------
    // バーチャルパッドの設置
    //--------------------------------------
    	celload mm_dir+"jujikey.png", -1
    	cel_juji = stat : celdiv cel_juji,64,64
    	celload mm_dir+"btn2x.png", -1
    	cel_btn2x = stat : celdiv cel_btn2x,128,128, 64,64
    	celload mm_dir+"btn.png", -1
    	cel_btn = stat : celdiv cel_btn,64,64, 32,32
    	celload mm_dir+"bean.png", -1
    	cel_bean = stat : celdiv cel_bean,64,42, 32,21
    #enum GROUPID_pad_jujikey = 10
    #enum GROUPID_pad_mainkey
    #enum GROUPID_pad_subbkey
    #enum GROUPID_pad_menukey
    	pos 100,ginfo_sy-85
    	JujikeyCon cel_juji, 5, 1.1, GROUPID_pad_jujikey, jujikey, 15
    	pos ginfo_sx-100,ginfo_sy-70
    	BeanCon cel_btn2x, M_PI*2, 1.0, GROUPID_pad_mainkey, mainkey, 0
    	pos ginfo_sx-200,ginfo_sy-40
    	BeanCon cel_btn, M_PI*2, 1.0, GROUPID_pad_subbkey, subbkey, 0
    	pos ginfo_sx-35,ginfo_sy-130
    	BeanCon cel_bean, 45.0/180.0*M_PI, 0.9, GROUPID_pad_menukey, menukey, 0

    //--------------------------------------
    // マップ読み込み
    //--------------------------------------
    #define MYMAP_ID (1)
    	df_loadbgmap MYMAP_ID, mm_dir+"test2.tmap"
    	mapsx = _dotfw_curmapx			; マップサイズXを取得
    	mapsy = _dotfw_curmapy			; マップサイズYを取得
    	maptipWidth = 64
    	maptipHeight = 64
    	df_getbgmap map, MYMAP_ID		; マップ配列変数を取得
    	df_mapaction MYMAP_ID, 0, 0		; マップアクション設定
    	df_bgview MYMAP_ID, 80,80, 20,20	; スクロール設定

    //--------------------------------------
    // 音声読み込み
    //--------------------------------------
    #enum MM_BGM = 0
    #enum MM_KEY
    #enum MM_PIP
    mmload mm_dir+"maou_game_field03.mp3", MM_BGM, 1 : mmvol MM_BGM,-500  ; HSP3.7beta10〜HSP3.7のHSP3Dish.jsではmp3がループしないかもしれません
    mmload mm_dir+"kaiwa1_tan.wav", MM_KEY, 0 : mmvol MM_KEY,-500
    mmload mm_dir+"selected6.wav", MM_PIP, 0 : mmvol MM_PIP,-500

    //--------------------------------------
    // プレイヤーを追加
    //--------------------------------------
    	df_addplayer 300,200,0
    	df_paction *MAPNOTICE, PACTION_MAPITEM  ; マップイベント処理
    	player_gold = 0
    	df_pmode -1  ; 初期状態はプレイヤー操作禁止

    //------------------------------------------------------------------------------
    // ゲーム : メインルーチン
    //------------------------------------------------------------------------------
    // 音声許可
    	objlayer_myDialog "音声を再生しても良いですか？", "はい", "いいえ"
    *audio_allow_request
    	layerbtn_stickVar = jujikey | mainkey*$20  ; layerbuttonモジュール用にキーを送り込む
    	df_update
    	if myDialog_stat == 0 : goto *audio_allow_request
    	if myDialog_stat == 1 : audio_allowed = 1 : mmplay MM_BGM  ; BGMループ再生
    	df_pmode 0  ; プレイヤー操作許可

    // 旅立ち
    *main
    	// バーチャルパッド入力をドットフレームワークやlayerbuttonに反映
    	df_addKey@ = jujikey  ; dotfw.asのjstick/stickにキーを送り込む
    	layerbtn_stickVar = jujikey | mainkey*$20  ; layerbuttonモジュール用にキーを送り込む
    	// プレイヤーキャラの向きを補正
    	gosub *update_PlayerFacing

    	// マップイベント監視サブルーチン
    	gosub *SUB_MAPNOTICE
    	// メニュー処理
    	openMenu = ((key@&128)!=0) | menukey  ; key@ : dotfw.as内でstick結果が代入されている
    	gosub *MENU_PROCESS
    	// ドットフレームワークの画面更新 (redraw/awaitもこの中に含まれている)
    	df_update
    	goto *main

    //------------------------------------------------------------------------------
    // ゲーム : サブルーチン
    //------------------------------------------------------------------------------
    //--------------------------------------
    // プレイヤーキャラの向きを補正
    //--------------------------------------
    *update_PlayerFacing
    	if sp_player_mode@HSP3MOD_DOTFW == -1 : return  ; プレイヤーの動作モードが無効であれば処理しない
    	df_getplayer
    	_dotfw_my_dx = _dotfw_myx - mae_dotfw_myx : mae_dotfw_myx = _dotfw_myx
    	_dotfw_my_dy = _dotfw_myy - mae_dotfw_myy : mae_dotfw_myy = _dotfw_myy
    	newchr = -1
    	if newchr!=mychr : if key@&8 : if _dotfw_my_dy>0||_dotfw_my_dx==0 : newchr=0 	; 下移動(上移動より優先)
    	if newchr!=mychr : if key@&4 : if _dotfw_my_dx>0||_dotfw_my_dy==0 : newchr=12	; 右移動(左移動より優先)
    	if newchr!=mychr && newchr!=12: if key@&1 : if _dotfw_my_dx<0||_dotfw_my_dy==0 : newchr=4		; 左移動
    	if newchr!=mychr && newchr!=0 : if key@&2 : if _dotfw_my_dy<0||_dotfw_my_dx==0 : newchr=8		; 上移動
    	if newchr == -1 || mychr == newchr : return  ; 向き変更なしならreturn
    	// キャラクターの向きを置き換える
    	mychr = newchr
    	es_chr 0, mychr
    	return

    //--------------------------------------
    // マップイベント
    //--------------------------------------
    // マップイベント開始検知ルーチン
    *MAPNOTICE
    	if noticeMapX != 0 || noticeMapY != 0 : return
    	noticeMapX = _dotfw_curmapx
    	noticeMapY = _dotfw_curmapy
    	noticeState = 1  ; スタートは良いがマス内でダンスしたりすると途切れるので、別(SUB_MAPNOTICE)で毎フレーム監視をする
    	; logmes "監視開始 ("+_dotfw_curmapx+","+_dotfw_curmapy+")"
    	return

    // マップイベント処理監視サブルーチン
    *SUB_MAPNOTICE
    	if noticeMapX == 0 || noticeMapY == 0 : return
    	pw=(_dotfw_myx - noticeMapX * maptipWidth)*100/maptipWidth
    	ph=(_dotfw_myy - noticeMapY * maptipHeight)*100/maptipHeight
    	if pw<-85 || pw>85 || ph<-85 || ph>85 {
    		; logmes "監視終了"
    		noticeMapX=0 :noticeMapY=0 :noticeState=0 : return
    	}
    	if noticeState != 1 : return
    	if pw>=-50 && pw<=50 && ph>=-50 && ph<=50 {
    		noticeState = 2
    		; logmes "イベント発生！ at ("+noticeMapX+","+noticeMapY+")"
    		if noticeMapX== 6 && noticeMapY== 4 : gosub *event_town_1
    		if noticeMapX== 6 && noticeMapY==16 : gosub *event_town_2
    		if noticeMapX==12 && noticeMapY==18 : gosub *event_town_3
    		if noticeMapX==22 && noticeMapY== 8 : gosub *event_town_4
    		if noticeMapX==21 && noticeMapY==14 : gosub *event_town_5
    		if noticeMapX==17 && noticeMapY==15 : gosub *event_coin_1
    		if noticeMapX==21 && noticeMapY==16 : gosub *event_coin_2
    		if noticeMapX==23 && noticeMapY==19 : gosub *event_siro_1
    	}
    	return

    // マップイベント処理
    *event_town_1
    	CREATE_MSGBOX {"
    	ここは始まりの街^
    	入れませんけど
    	"}
    	return
    *event_town_2
    	CREATE_MSGBOX {"
    	ここは山奥の里^
    	入れませんけど
    	"}
    	return
    *event_town_3
    	CREATE_MSGBOX {"
    	ここは果ての岬^
    	入れませんけど
    	"}
    	return
    *event_town_4
    	CREATE_MSGBOX {"
    	ここは海沿いの町^
    	入れませんけど
    	"}
    	return
    *event_town_5
    	CREATE_MSGBOX {"
    	ここは荒地の村^
    	入れませんけど
    	"}
    	return
    *event_coin_1
    	player_gold += 100
    	CREATE_MSGBOX {"
    	100G 手に入れた！
    	"}
    	map(mapsx*_dotfw_curmapy+_dotfw_curmapx)=2	; アイテムを消す (マップチップ上書き)
    	return
    *event_coin_2
    	player_gold += 150
    	CREATE_MSGBOX {"
    	150G 手に入れた！
    	"}
    	map(mapsx*_dotfw_curmapy+_dotfw_curmapx)=2	; アイテムを消す (マップチップ上書き)
    	return
    *event_siro_1
    	CREATE_MSGBOX {"
    	ここは魔王の城^
    	-------------入れませんけど
    	"}
    	return

    //--------------------------------------
    // メッセージボックス処理
    //--------------------------------------
    // 定数
    #enum GROUPID_MSGBOX = 20
    #const MSGBOX_PX 80
    #const MSGBOX_PY 50
    #const MSGBOX_W 320
    #const MSGBOX_H 100
    #const MSGBOX_TEXTCOLOR $FFFFFF
    #const MSGBOX_TEXTSPEED 2
    // 作成関数
    #deffunc CREATE_MSGBOX str MSGBOX_message
    	if laybtn_length(GROUPID_MSGBOX) : return  ; 連続して複数回呼ばれることはないが念のため
    	pos MSGBOX_PX,MSGBOX_PY : rgbcolor MSGBOX_TEXTCOLOR
    	layeremes MSGBOX_W,MSGBOX_H, 0,GROUPID_MSGBOX, MSGBOX_message,0, MSGBOX_TEXTSPEED {
    		layemes_font fontName, fontSize, 17
    		layemes_settings 2, 0,0, -1+(MM_KEY+1)*audio_allowed  ; [設定] 終了後非表示にしない、文字表示時に音を鳴らす
    		if lparam == objlayer_cmdinit : df_pmode -1  ; メッセージ中はプレイヤー操作禁止
    		if lparam == objlayer_cmdterm : df_pmode 0 : noticeState=0  ; メッセージ終了でプレイヤー操作再開
    		if lparam == objlayer_cmddraw {
    			laybtn_ezbox $DD313021,,, "",, ,,,, 10, ,,40,20  ; オブジェクトの範囲をはみ出してボックスを描画
    			laybtn_ezfrm $EEFFFFFF,,,4, "",, ,,,, 10, ,,38,18  ; 枠を描画
    			if layemes_stat>=2 {
    				if (layemes_cnt/10\5) < 3 {
    					rgbcolor MSGBOX_TEXTCOLOR : pos objlayer_axis_x2,objlayer_axis_y2-18
    					mes "▼"  ; ボックス右下にページ送り表示
    				}
    			}
    		}
    		return
    	}
    	return

    //--------------------------------------
    // メニューイベント
    //--------------------------------------
    // 定数
    #enum GROUPID_MENUBOX = 21
    #enum GROUPID_MENUGOLD
    #enum GROUPID_MENUITEM
    #const MENUBOX_PX 80
    #const MENUBOX_PY 50
    #const MENUBOX_W 120
    #const MENUBOX_H 30
    #const MENUBOX_TEXTCOLOR $FFFFFF
    #const MENUBOX_TEXTSPEED 2

    // コマンドメニュー作成ルーチン
    *MENU_PROCESS
    	if openMenu == 0 : return
    	if noticeState == 2 : return  ; マップイベントに入った場合はメニューを開かない
    	if sp_player_mode@HSP3MOD_DOTFW == -1 : return  ; プレイヤーの動作モードが無効のときはメニューを開かない
    	if laybtn_length(GROUPID_MENUBOX) : return  ; 連続して複数回呼ばれることはないが念のため
    	df_pmode -1  ; メニュー中はプレイヤー操作禁止
    	// コマンドメニュー作成
    	cmdText = "はなす","じゅもん","どうぐ","しらべる","つよさ","さくせん"
    	if audio_allowed : mmplay MM_PIP
    	repeat 6
    		pos MENUBOX_PX+(MENUBOX_W+20)*(cnt\2), MENUBOX_PY+(MENUBOX_H+5)*(cnt/2)
    		// コマンドメニューのボタン作成
    		layerbutton MENUBOX_W,MENUBOX_H, cnt, GROUPID_MENUBOX, 0,0,0, 10 {
    			laybtn_settings 0,32,3  ; 設定: 範囲外でもフォーカス維持、非表示しない
    			if lparam == objlayer_cmddraw {
    				// コマンドボタンをまとめる背景の描画 (1つ目のボタン描画の前に描画する)
    				if objlayer_option == 0 && layerbtn_stat < LAYBTN_COMPLETE {
    					fade = $DD : if layerbtn_stat == LAYBTN_SHOW_OUT : fade = $DD*(10 - layerbtn_cnt)/10  ; メニューが消えるときフェードさせる
    					gmode 3,,,fade : rgbcolor $313021
    					laybtn_boxfb objgroup_axis_x-32, objgroup_axis_y-12, objgroup_axis_x2+32, objgroup_axis_y2+12, 10
    					gmode 3,,,fade : rgbcolor $FFFFFF
    					laybtn_boxfb objgroup_axis_x-30, objgroup_axis_y-10, objgroup_axis_x2+30, objgroup_axis_y2+10, 10, 4
    				}
    				// コマンドボタンの描画
    				rgbcolor MENUBOX_TEXTCOLOR : font fontName, fontSize, 17  ; laybtn_ezboxのテキスト設定
    				laybtn_ezbox $01000000,$669999FF,$669999FF, cmdText(objlayer_option),, ,,,, 0  ; R(丸み)=0
    				// 「どうぐ」を選んで使用不可状態のときはグレーアウト表示 (黒を被せる)
    				laybtn_enable GROUPID_MENUBOX, -1
    				if stat == 0 {
    					if objlayer_option == 5 {
    						gmode 3,,,$99 : rgbcolor $313021
    						laybtn_boxfb objgroup_axis_x-32, objgroup_axis_y-12, objgroup_axis_x2+32, objgroup_axis_y2+12, 10
    					}
    					return  ; 使用不可状態のときは以降の処理を行わない
    				}
    				// 操作: メニュー閉じ
    				if layerbtn_cnt > 0 {  ; メニューを作成した瞬間のキー押下を無視
    					if ((key@&128)!=0) | subbkey {
    						laybtn_hide GROUPID_MENUBOX
    						laybtn_hide GROUPID_MENUGOLD
    						df_pmode 0  ; メニュー終了でプレイヤー操作再開
    						return
    					}
    				}
    				// 操作: ボタンのクリック判定
    				if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    					switch objlayer_option
    					case 0 : gosub *MENU_HANASU : swbreak
    					case 1 : gosub *MENU_JUMON : swbreak
    					case 2 : gosub *MENU_DOUGU : swbreak
    					case 3 : gosub *MENU_SHIRABERU : swbreak
    					case 4 : gosub *MENU_TSUYOSA : swbreak
    					case 5 : gosub *MENU_SAKUSEN : swbreak
    					swend
    				}
    			}
    			return
    		}
    	loop
    	// GOLD表示 (表示のみ操作なし)
    	pos 290,550
    	layerbutton 150,30, 0, GROUPID_MENUGOLD, 0,0,0, 10 {
    		laybtn_settings 1,1,0  ; 設定変更 : キー/マウス操作不可
    		if lparam == objlayer_cmddraw {
    			laybtn_ezbox $DD313021,,, "",, ,,,, 10, ,,30,15  ; オブジェクトの範囲をはみ出してボックスを描画
    			laybtn_ezfrm $DDFFFFFF,,,4, "",, ,,,, 10, ,,28,13  ; 枠描画
    			rgbcolor MENUBOX_TEXTCOLOR : font fontName, fontSize, 17  ; テキスト設定
    			laybtn_mes ""+player_gold+" G",0, 2,1
    			font fontName, fontSize_money, 17
    			laybtn_mes "所持金",0, 0,1
    		}
    		return
    	}
    	laybtn_focus GROUPID_MENUBOX, 0  ; メニューの最初のボタンにフォーカスを当てる
    	return

    *MENU_HANASU
    	laybtn_hide GROUPID_MENUBOX, 1
    	laybtn_hide GROUPID_MENUGOLD, 1
    	CREATE_MSGBOX {"目の前に話せる人は誰もいない"}
    	return
    *MENU_JUMON
    	laybtn_hide GROUPID_MENUBOX, 1
    	laybtn_hide GROUPID_MENUGOLD, 1
    	CREATE_MSGBOX {"何も呪文を覚えていない！"}
    	return
    *MENU_SHIRABERU
    	laybtn_hide GROUPID_MENUBOX, 1
    	laybtn_hide GROUPID_MENUGOLD, 1
    	CREATE_MSGBOX {"
    	足元を調べてみた^
    	しかし自分の足しか見えない！
    	"}
    	return
    *MENU_TSUYOSA
    	laybtn_hide GROUPID_MENUBOX, 1
    	laybtn_hide GROUPID_MENUGOLD, 1
    	CREATE_MSGBOX {"たいして強くない！"}
    	return
    *MENU_SAKUSEN
    	laybtn_hide GROUPID_MENUBOX, 1
    	laybtn_hide GROUPID_MENUGOLD, 1
    	CREATE_MSGBOX {"作戦なんて何もない！"}
    	return
    *MENU_DOUGU
    	// 道具メニューはフェードアウト中に再度開かれるのを防止(または再表示前に古いのを削除)する処置を施す必要がある。(これがないと、消えようとしているのにもう1つ作ってしまい、フェードアウト→1つ目が消える→2つ目も同じIDなので一緒に消える となってしまう)
    	if laybtn_length(GROUPID_MENUITEM) : laybtn_hide GROUPID_MENUITEM, -1  ; 既に道具メニューが開かれている場合は閉じる
    	laybtn_enable GROUPID_MENUBOX, 0  ; メインメニューを無効化して道具メニューが閉じられるまで操作できないようにする
    	sdim itemText,64,18
    	itemText.0 = "何も持ってない"  ; アイテム
    	if audio_allowed : mmplay MM_PIP
    	repeat 18
    		pos MENUBOX_PX+(MENUBOX_W+20)*(cnt\2), MENUBOX_PY+(MENUBOX_H+5)*(cnt/2)+140
    		// メニューのボタン作成
    		layerbutton MENUBOX_W,MENUBOX_H, cnt, GROUPID_MENUITEM, 0,0,0, 10 {
    			laybtn_settings 64,32,3  ; 設定: キーリピート有効、範囲外でもフォーカス維持、非表示しない
    			if lparam == objlayer_cmddraw {
    				// ボタンの描画
    				// コマンド背景(1つ目のボタン描画の前に描画する)
    				if objlayer_option == 0 && layerbtn_stat < LAYBTN_COMPLETE {
    					fade = $DD : if layerbtn_stat == LAYBTN_SHOW_OUT : fade = $DD*(10 - layerbtn_cnt)/10
    					gmode 3,,,fade : rgbcolor $313021
    					laybtn_boxfb objgroup_axis_x-32, objgroup_axis_y-12, objgroup_axis_x2+32, objgroup_axis_y2+12, 10
    					gmode 3,,,fade : rgbcolor $FFFFFF
    					rboxba_auto@modlaybtn objgroup_axis_x-30, objgroup_axis_y-10, objgroup_axis_x2+30, objgroup_axis_y2+10, 10, 4
    				}
    				rgbcolor $AAAAAA : font fontName, fontSize_item, 17  ; テキスト設定
    				laybtn_ezbox $01000000,$669999FF,$669999FF, itemText(objlayer_option),, ,,,, 0
    				// 操作: メニュー閉じ
    				if layerbtn_cnt > 0 {  ; メニューを作成した瞬間(cnt=0)のキー押下を無視
    					if ((key@&128)!=0) | subbkey {
    						laybtn_hide GROUPID_MENUITEM  ; アイテムボックスを閉じる
    						laybtn_enable GROUPID_MENUBOX, 1
    						laybtn_focus GROUPID_MENUBOX, 2  ; メニューの「どうぐ」ボタンにフォーカスを当てる
    						return
    					}
    				}
    				// 操作: ボタンのクリック判定 は今回なし
    			}
    			return
    		}
    	loop
    	laybtn_focus GROUPID_MENUITEM, 0  ; 「どうぐ」メニューの最初のボタンにフォーカスを当てる
    	return

    //--------------------------------------
    // ダイアログボックス処理
    //--------------------------------------
    // 定数
    #enum GROUPID_DIALOGBOX = 30
    #deffunc objlayer_myDialog str DIALOG_message, str bt1_text, str bt2_text
    	if laybtn_length(GROUPID_DIALOGBOX) : return
    	myDialog_stat = 0
    	myDialog_text = DIALOG_message, bt1_text, bt2_text
    	pos 50, 300
    	layerbutton 360,180, 0,GROUPID_DIALOGBOX, 30,,, 15 {
    		laybtn_settings 1,1,0  ; 設定: 表示だけ、キー/マウス操作不可
    		if lparam != objlayer_cmddraw : return  ; _cmddraw以外無視
    		font fontName, fontSize, 17 : rgbcolor $FFFFFF
    		laybtn_ezbox $DD313021,,, myDialog_text(objlayer_option),0, ,-40
    		laybtn_ezfrm $EEFFFFFF,,,2, ,, ,,,,,,,-2,-2
    		return
    	}
    	pos 90+150*0, 390
    	layerbutton 130,50, 1,GROUPID_DIALOGBOX, 30,,, 15 {
    		if lparam != objlayer_cmddraw : return  ; _cmddraw以外無視
    		font fontName, fontSize, 17
    		color 240,240,255 : objcolor 10,10,10  ; 文字色 / 縁取り色
    		laybtn_ezbox $AA9999FF, $AA0000FF, $EEAAAAFF, myDialog_text(objlayer_option),4
    		laybtn_ezfrm $99FFFFFF, $99FFFFFF, $99FFFFFF, 1
    		if layerbtn_stat != LAYBTN_COMPLETE_SELECTED : return  ; 押したボタン以外無視
    		myDialog_stat = objlayer_option
    		return
    	}
    	pos 90+150*1, 390
    	layerbutton 130,50, 2,GROUPID_DIALOGBOX, 30,,, 15 {
    		if lparam != objlayer_cmddraw : return  ; _cmddraw以外無視
    		font fontName, fontSize, 17
    		color 255,240,240 : objcolor 10,10,10  ; 文字色 / 縁取り色
    		laybtn_ezbox $AAFF9999, $AAFF0000, $EEFFAAAA, myDialog_text(objlayer_option),4
    		laybtn_ezfrm $99FFFFFF, $99FFFFFF, $99FFFFFF, 1
    		if layerbtn_stat != LAYBTN_COMPLETE_SELECTED : return  ; 押したボタン以外無視
    		myDialog_stat = objlayer_option
    		return
    	}
    	return

    ;  HSPTV!掲示板「フォントファイルをexeファイルにパック」内
    ;  - 沢渡 氏 モジュール // thanks!
    ;  https://hsp.tv/play/pforum.php?mode=pastwch&num=95145
    ;
    ;  -- スクリプト末尾に配置しても使えるように多少変えさせて頂いてます。
    ;
    //フォントをインストールせずに使用するモジュール
    //(パックファイル対応版)
    #include "gdi32.as"
    #module
    #const use_fonts 10	//登録できるフォントの最大数(変更可能)

    #deffunc font_file_init
    	l_flag=0
    	dim h_font,use_fonts
    	return

    //font_file p1,p2,p3
    //指定したメモリ内のファイル名のフォントを一時的に使えるように登録する。
    //p1はフォントのファイル名。
    //p2を1にした場合はこれまでの登録を解除。(省略時は0)
    //p3は旧バージョンとの互換のために残しています。省略可能で、指定しても意味はありません。
    ;#define global font_file(%1,%2=0,%3=0x30) _font_file %1,%2
    #deffunc font_file str file,int cl_flag,local size,local tmp,local dum
    	if cl_flag : font_clean
    	if l_flag>=use_fonts : return 0
    	exist file : size=strsize
    	if size=-1 : return 0
    	sdim tmp,size : bload file,tmp,size : dum=0
    	AddFontMemResourceEx varptr(tmp),size,0,varptr(dum)
    	if stat : h_font(l_flag)=stat : l_flag++
    	return dum

    #deffunc font_clean onexit
    	repeat
    		if l_flag<=0 : break
    		l_flag--
    		RemoveFontMemResourceEx h_font(l_flag)
    	loop
    	return
    #global