# 13 sample_emesmod.hsp

sample\ 13 sample_emesmod.hsp

    #include "hsp3dish.as"  ; HSP3Dishでなくても使えますが、文字フェードはできなくなります。

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

    #include "mod_layerbutton-emes.hsp"
    #include "d3m.hsp"  ; FPS計測用

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

    // 画面作成
    screen 0, 640,480
    title "mod_layerbutton-emes サンプル"
    // HSP3Dish.js用データフォルダ設定
    info_os = sysinfo(0)
    if instr(info_os,0,"Emscripten")>=0 : mm_dir="" : else : mm_dir="data/"
    // 音声読み込み
    #enum MM_KEY = 0
    mmload mm_dir+"kaiwa1_tan.wav", MM_KEY, 0
    mmvol 0,-500
    // キャラクター読み込み
    tamacel=ginfo_newid
    buffer tamacel
    picload mm_dir+"tamadot.png"  ; キャラクターの画像ファイル (Dish.jsでブラウザ表示したいときは画像ファイルをdataフォルダへ)
    es_ini  ; スプライトを初期化
    es_size 64,64  ; キャラクターのサイズ指定
    es_patanim 0, 4, 256, 0, 10, tamacel  ; キャラクターの登録(0) : 正面向き
    es_patanim 4, 4, 256, 64, 10, tamacel  ; キャラクターの登録(4) : 左移動
    es_area -1000,0,ginfo_sx+1000,ginfo_sy  ; 移動できる範囲を設定(しないと勝手に消える)
    es_set 0, 700,150, 4  ; スプライト設定
    gsel 0

    // LayerEmesのグループID
    #enum GROUPID_mono = 0
    #enum GROUPID_msgbox
    #enum GROUPID_tamane
    #enum GROUPID_konndo

    // モノローグメッセージを作成
    story_text={"
    メロスは/*rgbcolor $FF0000*/激怒/*color*/した。必ず、かの/*font ,30*/邪智暴虐の王/*font ,24*/を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。
    けれども/*font ,32:color ,,255*/邪悪に対しては、人一倍に敏感で/*font ,24:color*/あった。きょう未明メロスは村を出発し、野を越え山越え、十里はなれた此のシラクスの市にやって来た。
    "}
    pos 30,40 : color 0,0,0 : objcolor 200,200,200
    layeremes 580,400, 0,GROUPID_mono, story_text,2, 2 {
    	layemes_font "美咲ゴシック第2", 24, 1
    	layemes_settings 0, 2,5,,, 50  ; [設定] 文字間行間を空ける、文字表示フェードのフレーム数指定 / (表示終了後勝手に消滅)
    	layemes_frames 50,0,0,50,0,0  ; [設定] フェードアウトするように SHOW_OUT フレームを設定
    	if lparam == objlayer_cmdterm {
    		// 文章表示終了→SHOW_OUT後 : 作成済みlayeremesのオブジェクトIDにobjprmで新しい文章を投げる
    		gosub *YOU_ARE_NEKO  ; 複数回投げるのでgosubにしておく
    		if 0 {
    			*YOU_ARE_NEKO
    			objprm id_mesbox, {"
    吾輩は猫である。名前はまだ無い。^
    どこで生れたかとんと見当がつかぬ。~何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。^
    吾輩はここで始めて人間というものを見た。~しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。^
    この書生というのは時々我々を捕えて煮て食うという話である。^
    しかしその当時は何という考もなかったから別段恐しいとも思わなかった。^
    ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。^
    掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。^
    この時妙なものだと思った感じが今でも残っている。~第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。^
    その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。~のみならず顔の真中があまりに突起している。^
    そうしてその穴の中から時々ぷうぷうと煙を吹く。~どうも咽せぽくて実に弱った。^
    これが人間の飲む煙草というものである事はようやくこの頃知った。^
    ;text 20
    . . .
    ;text 2"}
    			return
    		};  /if 0
    	}
    	return
    }

    // 下部メッセージボックス作成
    pos 70,350 : color 255,255,255
    layeremes 500,100, 0,GROUPID_msgbox, "",0, 2 {
    	layemes_font "美咲ゴシック第2", 19, 1
    	layemes_settings 1, 0,0, MM_KEY  ; [設定] 終了後非表示にしない、文字表示時に音を鳴らす
    	if lparam == objlayer_cmddraw {
    		cNum = stat  ; テキスト表示数
    		cx = ginfo_cx : cy = ginfo_cy  ; 文末位置(-1の場合は無効)
    		laybtn_ezbox $AA000000,,,,,,,,,10,,,40,20  ; オブジェクトの範囲をはみ出して枠を描画
    		if layemes_stat>=1 && (cx != -1 && cy != -1) {
    			if layemes_stat == 1 {
    				color 100,100,255
    				boxf cx+2,cy-18, cx+8,cy  ; テキスト描画を追いかけるようなboxf
    			}else {
    				color 255,255,255
    				pos objlayer_axis_x2,objlayer_axis_y2-18
    				if (layemes_cnt/10\5) < 3 : mes "▼"  ; ボックス右下にページ送り表示
    			}
    			if is2nd : color 255,255,255: font msgothic,16: pos objlayer_axis_x,objlayer_axis_y2-10: mes "n="+cNum+" ("+cx+","+cy+") stat="+layemes_stat+" cnt="+layemes_cnt
    		}
    		if layemes_stat==4 {  ; 文字表示がすべて終了
    			gosub *YOU_ARE_NEKO  ; 同じ文章をもう一度投げて繰り返し表示
    			is2nd=1  ; 2週目フラグ
    		}
    		// 文章の特定のタイミングでキャラクターを登場させるようにフラグを操作
    		if px_tamane == 1000 && cNum < 100 : px_tamane = 900
    		if px_tamane == 900 && cNum >= 100 : px_tamane = 650
    	}
    	return
    }
    id_mesbox = stat  ; オブジェクトIDを記憶

    // 珠音ちゃんが「あそんで〜」と言うメッセージボックスを作成 : 表示位置をフラグとして一連動作のオブジェクトとしてしまう (珠音ちゃん自身も表示)
    px_tamane = 1000  ; 表示位置
    pos 1000,100 : color : objcolor 200,200,200
    layeremes 110,30, 0,GROUPID_tamane, "",4, 5, 1,1 {
    	layemes_font "美咲ゴシック第2", 18, 1
    	layemes_settings 1, 0,0,, 0  ; [設定] 終了後非表示にしない、文字送りキーを0に設定して反応させないようにする
    	if lparam == objlayer_cmddraw {
    		// 表示位置をフラグとして動作を振り分け
    		if px_tamane>700 : return  ; 待機
    		if px_tamane>300 : px_tamane-- : laybtn_width wparam,,,px_tamane, : es_pos 0, px_tamane,150  ; 左移動
    		if px_tamane == 301 {
    			objprm wparam, "あそんで〜"
    			es_chr 0,0  ; キャラクターを正面向きに変更
    			// 「また今度」ボタンを作成
    			pos 420,160
    			layerbutton 150,50, 0,GROUPID_konndo, 30,10,5, 15,5,2 {
    				if lparam != objlayer_cmddraw : return
    				font msgothic,18,1 : color 240,240,255 : objcolor 0,0,100  ; 文字色 / 縁取り色
    				laybtn_ezbox $AA8888FF, $AA0000FF, $AA8800FF, "また今度",4  ; ezboxでボタン描画
    				if layerbtn_stat == LAYBTN_COMPLETE_SELECTED : px_tamane = 299  ; ボタンを押して表示が消えたとき、位置をずらして次のフラグへ
    				return
    			}
    		}
    		if px_tamane == 300 && layemes_stat==3 && layemes_cnt==100 {
    			objprm wparam, "あそんで〜"  ; 真ん中表示中、時間(フレーム数)で自身に再送を繰り返す
    		}
    		if px_tamane <= 300 {  ; 吹き出し描画
    			laybtn_ezbox $DDDDDD,,,,,,,,,-1,,,10,10
    			rgbcolor $DDDDDD
    			trianglefao 10,0, 30,0, 5,15, objlayer_axis_x2-50, objlayer_axis_y2+10
    		}
    		if px_tamane == 299 {
    			objprm wparam, "なんで〜？"
    			es_chr 0,4  ; キャラクターを左向きに変更
    		}
    		if px_tamane <= 299 : px_tamane-- : laybtn_width wparam,,,px_tamane, : es_pos 0, px_tamane,150  ; 左移動
    		if px_tamane == -200 : px_tamane=1000 : laybtn_width wparam,,,px_tamane, : es_pos 0, px_tamane,150 : objprm wparam, ""  ; 画面から消えたら、初期位置に戻して再登場待ち
    	}
    	return
    }

    // 表示ループ
    repeat
    	redraw 0 :color 255,255,255: boxf: color: pos 0,0: font msgothic,17
    	mes "fps = " + d3getfps()
    	es_draw
    	redraw 1
    	await 1000/60
    loop
    stop

    ;  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

    // 描画モジュール(抜粋)
    #module
    #deffunc trianglefao int ax, int ay, int bx, int by, int cx, int cy, int ox, int oy
    	pdx=ax+ox,bx+ox,cx+ox,ax+ox
    	pdy=ay+oy,by+oy,cy+oy,ay+oy
    	gsquare -1,pdx,pdy
    	return
    #global