/****************************************************************
*月面着陸本編 -- 数値流体力学と月面着陸のゲームを融合させたもの	*
**
*作成者	：toropippi						*
*使用法	：							*
*	数値流体力学の部分は本格シミュレーションにも適応できる		*
*HP	：http://toropippi.web.fc2.com/
*制限	：WX WY は変えてはならない。あとは変えても良い			*
*改訂履歴：				*
*エラー処理
	：最悪ブルースクリーンエラーとなる
*著作権	：HSPソースコード、OpenCLカーネルコードのみ MITライセンス
*備考	：
****************************************************************/
//スコア仕様
//クリアタイムボーナス
//S 10万+ステージ*6000
//A 5 万+ステージ*2500
//B 2 万+ステージ*2000
//C 1 万+ステージ*1600


//setdevno;計算に使うデバイス
//デバッグモードで起動すればステージが早くクリアできる
debugMode=0
#define global WX 128//変えるときはカーネルソースもかえること
#define global WY 128//変えるときはカーネルソースもかえること
#define global IM (WX-1)
#define global JM (WY-1)
#define global ijm (WX*WY)
#define global ijm4 (WX*WY*4)
#define global ijm2 (int(0.5*ijm))
#define global IPN 4//変えるときはカーネルソースもかえること
//define global UFO噴射konagire 128//UFOが噴射する粉数
#define global 爆発時粒子数 32768//UFOが爆発した時に噴射する粉数
#define global DT float(0.89)
#define global にゅ〜 float(0.0000001)//粘性項
//#define global speeed float(0.32)//ステージの流れの早さ0.32
//#define global 噴射力 0.00039//ハード0.00037 ノーマル  0.00039
//#define global 粒子数 (65536*4)//頂点数はこの2倍//65536*8
//#define global 重力係数 0.00009698//ハード0.00008698G
//#define global 流れの影響 0.00014//ハード0.00020　ノーマル0.00014
#define global 回転速度 0.018
//#define global FBAI 4//1フレーム当たり何タイムステップの流体計算をするか
#define global π  3.14159265358979323846264338328
#define global π2 6.28318530717958647692528676656
#define global PRESS_HYOJI_XY 20//圧力表示グリッド数
#define global REAASU_KZ 4//１つのステージのレアアースの最大数
#define global EDロール開始タイミング 2964700
#define global GMKSPOSX 592//右画面の「角度、速度」文字画像の表示位置
#define global GMKSPOSY 217
#define global MGSCOREPOSX 524//右画面の「HiScore」文字画像の表示位置
#define global MGSCOREPOSY 246
#define global PRNMRGBA0X 168//プロ生画像のRGBAデータのx,yサイズ
#define global PRNMRGBA0Y 440



#include "data\\dsound.as"
#include "hspcl32.as"
#include "OpenCL初期設定.hsp"
#include "サブルーチン.hsp"
title "流体de月面着陸"
	rDT=float(1.0/DT)
	arufa=にゅ〜*DT
	ar1fa=float(1.0/(1.0+4.0*arufa))
	randomize
	//メインスクリーン
	screen 0,WX*IPN+256,WY*IPN
	HCLini 1
	if HCLDevCount=0:dialog "お使いの環境はサポートしておりません。\nOpneCL対応デバイスがありません。終了します",1:end;openCL対応デバイス数

	//計算するデバイスを自動選択
	flgtmp=0
	repeat HCLDevCount
		HCLSetDev cnt
		if HCLGetDevGLflg():if HCLGetDeviceInfo_i(CL_DEVICE_TYPE,0)==4:flgtmp++:setdevno=cnt:break
	loop

	if flgtmp==0{
		repeat HCLDevCount
			HCLSetDev cnt
			if HCLGetDevGLflg():flgtmp++:setdevno=cnt:break
		loop
	}
	if flgtmp==0:dialog "お使いの環境はサポートしておりません。\nOpenCL機能有効\nOpenGL連携不可能\n終了します",1:end;openCL対応デバイス数

	gosub*コンフィグロード
	//OpenGLもろもろ初期設定
	gosub*opengl初期設定
	gosub*サウンド初期設定
	gosub*ステージ初期設定//右の画面のことだけど
	gosub*会話初期設定//全ての会話をここでロード
	if sLg_UserSet:gosub*オープニング
	//流体のもろもろ初期設定
	gosub*opencl初期設定//1度しか実行してはいけない
	//UFOのもろもろ初期設定
	gosub*UFO初期設定//1度しか実行してはいけない


//ゲームフローチャートの一番大きな流れのところ∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨//
	repeat -1
		//この中で難易度が決定される
		gosub*タイトル画面//0がイージー、1がノーマル、2がハード
		//最初の会話
		//会話ははじめから
		kwflg0=0:kwflg1=0
		if opS_UserSet:gosub*OPEDプロローグ
		hiスコア=ハイスコア記録.難易度
		スコア=0
		//ステージ0〜28まで全部
		gosub*メインフロート//ステージ0〜28まで全部
		if スコア>hiスコア:ハイスコア記録.難易度=スコア
		bsave "data\\savedata",ハイスコア記録
		//フェードアウトとどめ
		glColor4d 1.0,1.0,1.0,1.0
		pos WX*ipn*3/4,WY*ipn/2
		HGLgrotate fadeout,0,0,64,64,0.0,WX*ipn*3/2,WY*ipn
		glFinish
		SwapBuffers wglGetCurrentDC()
		await 4*FBAI
		//ここまで
		wait 400
		//最後の会話
		//会話は100から
		kwflg0=100:kwflg1=0
		gosub*OPEDプロローグ
		//タイトルへ
	loop
	stop
//ゲームフローチャートの一番大きな流れのところ∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧//


*メインフロート
	//フラグ一覧
	//clrflg		0ならクリアしてない。1ならクリアしてる
	//hunsyaflg		噴射している時だけ1になるフラグ。クリアしていればボタン押してても0
	//saisyonokeyflg １回噴射押した瞬間から1になるフラグ。クリアしても同じ
	//saisyonokeyoffflg １回噴射キーを離した押した瞬間から1になるフラグ。クリアしても同じ
	//死亡フラグ
	//gekiryuflg 激流ステージで、会話のとき、最初は粒子が見えない状況のフラグ  0のとき粒子みえない会話みえる、1のとき粒子みえない会話みえない、2のとき会話みえない粒子みえる、3のとき会話みえる粒子みえる
	//stagetimeflg 0のときゲーム開始前、1のときゲーム中で時間が進んでいる、2のとき着陸して時間が再度止まった状態
	//ゲーム終了判定flg ステージ28の曲の最後に1〜800になるフラグ。400で完全フェードアウト

	clrflg=0
	hunsyaflg=0
	saisyonokeyflg=0
	saisyonokeyoffflg=0
	死亡フラグ=0
	死亡復帰count=0
	gekiryuflg=0
	stagetimeflg=0
	ゲーム終了判定flg=0
	awaitTime=0.0

	ufoidno=10:gosub*UFO設定//何度も実行していい
	ステージ=0:gosub*ステージ設定//何度も実行していい
	kwstage=ステージ*2//デバッグ用
	flm=0
	flmps=0
	//安全のため一応
	HCLWriteIndex_f 受ける外力,0,float(0)
	HCLWriteIndex_f 受ける外力,1,float(0)
	HCLWriteIndex_f 受ける外力,2,float(0)
	HCLWriteIndex_f 受ける外力,3,float(0)
	HCLWriteIndex_f 受ける外力,4,float(0)
	HCLWriteIndex_f 受ける外力,5,float(0)
	dufo_F_x=0.0
	dufo_F_y=0.0

////////////メインルーチン////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////メインルーチン////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////メインルーチン////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////メインルーチン////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	repeat -1
		gosub*voiddcip0//ブロッキングモードoff
		gosub*粘性//ブロッキングモードoff
			//外力1
			gosub*UFO壁アンマップ//ブロッキングモードoff
			//外力2
			gosub*UFO移動加算切り替え//ブロッキングモードoff
			//外力3
			gosub*外力（流体に働く）と壁マップ//ブロッキングモードoff
		gosub*voidDIV//ブロッキングモードoff     //死亡フラグが0以外の時はここでUFOマスクがアンマップされる
		gosub*voidpressure//ブロッキングモードoff
		gosub*受ける外力（UFOが）計算1//ブロッキングモードoff
		if flm\FBAI=0:gosub*圧力表示準備//ブロッキングモードoff。opencl計算のみ
		gosub*voidrhs//ブロッキングモードoff
		gosub*voidnewgrad//ブロッキングモードoff
		gosub*voidveloc//ブロッキングモードoff
			/////////////////////CPU負荷をここへ入れて、負荷隠蔽
			if flm\FBAI==0{
				gosub*キーチェック//CPU負荷
				gosub*当たり判定//CPU負荷
				gosub*会話準備//CPU負荷
			}
			gosub*音楽粒子//CPU負荷
			if flm\8==0:if stageflg0==2:if clrflg==0:if saisyonokeyflg:if hunsyaflg:ds_play 21//音鳴らす
			if flm\FBAI==0{
				gosub*タイトルFPS//CPU負荷
				awaitTime+=4.166666666*FBAI
				if FBAI==8{
					await awaitTime//ある意味CPU負荷
				}else{
					await 16//ある意味CPU負荷
				}
				awaitTime-=int(awaitTime)
				gosub*音楽フレーム管理//CPU負荷
			}
			gosub*粒子準備//CPU負荷のみ
			if 死亡フラグ==(100-FBAI):await 295:ds_play 22//CPU負荷
			/////////////////////CPU負荷ここまで
		gosub*粒子//ブロッキングモードon    VramへWrite
		gosub*受ける外力（UFOが）計算2//ブロッキングモードon
		if flm\FBAI==0{
			gosub*表示//ブロッキングモードon//GPU負荷
			if ゲーム終了判定flg:ゲーム終了判定flg+=FBAI
			if ゲーム終了判定flg>800:break//一番最後のゲーム終了判定。このつぎにED会話へとうつる
		}
		flm++
		flmps++
	loop
////////////メインルーチン////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////メインルーチン////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////メインルーチン////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////メインルーチン////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	//エンディングロールの後片付け
	fdim ryuusihspgawa3,1
	edFlm=0:edflg0=0:edflg1=0
	buffer 148,4,4:buffer 149,4,4
	gsel 0
	return




*粘性
	copyy YU,YUN
	copyy YV,YVN
	/*
	copyy GXd0,YUN
	copyy GYd0,YVN
		repeat limit(10000.0*にゅ〜,0,(WX+WY)/2)
		HCLDoKrn2 nensei0,WX,WY,128,1;
		HCLDoKrn2 nensei1,WX,WY,128,1;
		loop
*/
	return


*voidDIV
	HCLDoKrn2 div0,WX,WY,128,1;div計算
	if 死亡フラグ!=0{
		//kabePにはUFOのマスクが1として標識されている。1で湧出させれば爆発になる
		exploF=float((0.027*衝突spd+0.0016)*死亡フラグ)
		HCLSetKernel divexp,3,mapmx
		HCLSetKernel divexp,4,mapmy
		HCLSetKernel divexp,6,exploF
		HCLDoKrn1 divexp,144,0;divに爆発適応計算
	}
	return

*voidpressure
//ガス抜き
/*
	if flm\128=7{
	HCLReadBuffer YPN,yp00,4,(WX*3+WX/2)*4
	dbgyp00=double(yp00)
	if (dbgyp00<-99999999999.9)|(dbgyp00>9999999999.9):HCLbye:dialog "計算が発散しました。終了します":end
	HCLSetKernel narasi,1,yp00
	HCLDoKrn2 narasi,WX,WY,128,1;
}
*/
//	copyy YP,YPN
	//圧力計算はコストが高いのでとにかく最適化
		repeat 反復回数+(死亡フラグ>=(100-FBAI))*WX*2
		HCLDoKrn1 pressure0,ijm2,0
		HCLDoKrn1 pressure1,ijm2,0//ローカルワークサイズはOpenCL実装に任せることに
		loop
	//HCLWaitTask//意外と安定性が増すみたい・・
	return

*voidrhs
	HCLDoKrn2 rhs,WX,WY,128,1;
	return

*voidnewgrad
	HCLDoKrn2 newgrad00,WX,WY,128,1;
	HCLDoKrn2 newgrad02,WX,WY,128,1;
	return

*voidveloc
	copyy YU,YUN
	copyy YV,YVN
	HCLDoKrn2 veloc,WX,WY,128,1;
	copyy GXd0,GXU
	copyy GYd0,GYU
	copyy Yd0,YUN

	copyy GXd1,GXV
	copyy GYd1,GYV
	copyy Yd1,YVN
	return



*タイトルFPS
	if mtim!gettime(6):mflmps=flmps:flmps=0//CPU負荷?
	mtim=gettime(6)
	return


//下のレイヤーから描画したい。初期化→背景→粒子→ステージ→レアアース→宇宙船→画面右→会話コマンド
*表示
	//背景初期化
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	//背景描画
	gosub*背景描画
	
	//粒子描画
	gosub*粒子描画

	//ステージ描画
	glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA//普通の透明抜きコピー
	pos 0,0
	HGLgcopy stage_GLtx,0,0,WX*IPN,WX*IPN//ステージ描画

	//レアアース描画
	gosub*レアアース描画

	//UFO描画
	if (死亡フラグ==0)|(死亡フラグ==100){
		if (saisyonokeyflg==0)&(死亡復帰フラグ\44>=22):glColor4d 0.1,0.1,0.1,1.0:else:glColor4d 1.0,1.0,1.0,1.0
		if 死亡復帰フラグ:死亡復帰フラグ-=FBAI:if 死亡復帰フラグ<0:死亡復帰フラグ=0
		pos int(ufo_posx*4.0),int(ufo_posy*4.0)//:grotate 131,0,0,ufoquo,40,40
		HGLgrotate ufo_GLtx,40*ufoidno,0,40,40,ufoquo,40,40
	}

	//もしぶつかった瞬間なら。光エフェクト出す
	if 死亡フラグ==100{
		glColor4d 1.0,1.0,1.0,1.0
		pos 衝突x,衝突y
		glBlendFunc GL_SRC_ALPHA, GL_ONE//アルファチャンネル設定、加算合成
		HGLgrotate expefx1,0,0,320,240,0.0,int(320.0*(0.3+8.0*衝突spd)),int(240.0*(0.3+8.0*衝突spd))
	}

	//画面右の描画
	gosub*画面右の描画
	glColor3d 1.0,1.0,1.0;色初期化

	//会話コマンド
	gosub*会話描画

	//ステージ文字エフェクト
	if (stageflg0==0):gosub*ステージ文字エフェクト

	//画面全体のフェードアウト
	if ゲーム終了判定flg{
		glColor4d 1.0,1.0,1.0,limitf(0.00125*ゲーム終了判定flg+0.005,0.0,1.0)
		pos WX*ipn*3/4,WY*ipn/2
		HGLgrotate fadeout,0,0,64,64,0.0,WX*ipn*3/2,WY*ipn
		glColor4d 1.0,1.0,1.0,1.0
	}

	glFinish
	SwapBuffers wglGetCurrentDC()
	return



*背景描画
	pos 0,0
	glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA//普通の透明抜きコピー

	repeat 1
	if ((kwflg0>=7)&(kwstage==1))|((kwflg0==0)&(kwstage==2)&(ステージ==0)){//もし背景スクロールが必要なら
		//スクロールのyオフセット
		doffsetBgPosY=((64.0-0.01*offsetBgPosY)/576.0)
		glBindTexture GL_TEXTURE_2D,bgscr_GLtx
		glBegin GL_QUADS//OpenGLでは中心が0,0としたら1.0,1.0は右上
			glTexCoord2d 0.0,doffsetBgPosY
			glVertex2i 0,512
			glTexCoord2d 1.0,doffsetBgPosY
			glVertex2i 512,512
			glTexCoord2d 1.0,512.0/576.0+doffsetBgPosY
			glVertex2i 512,0
			glTexCoord2d 0.0,512.0/576.0+doffsetBgPosY
			glVertex2i 0,0
		glEnd
	    glBindTexture GL_TEXTURE_2D,0
	    break
	}

	//帰り道、月の上空
	if (ステージ==27){
		//スクロールのyオフセット
		doffsetBgPosY=0.04*offsetBgPosY/576.0
		glBindTexture GL_TEXTURE_2D,bgscr_GLtx
		glBegin GL_QUADS//OpenGLでは中心が0,0としたら1.0,1.0は右上
			glTexCoord2d 0.0,doffsetBgPosY
			glVertex2i 0,512
			glTexCoord2d 1.0,doffsetBgPosY
			glVertex2i 512,512
			glTexCoord2d 1.0,512.0/576.0+doffsetBgPosY
			glVertex2i 512,0
			glTexCoord2d 0.0,512.0/576.0+doffsetBgPosY
			glVertex2i 0,0
		glEnd
	    glBindTexture GL_TEXTURE_2D,0
		break
	}

	HGLgcopy bgscr_GLtx,0,0,WX*IPN,WY*IPN
	loop

	return


*粒子描画
	//粒子描画////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	glBlendFunc GL_SRC_ALPHA, GL_ONE//アルファチャンネル設定、加算合成

	glColor3d 1.0,1.0,1.0;粒子色はVBOに設定済み
		/* 頂点データの配列を有効にする */
		glEnableClientState GL_VERTEX_ARRAY
		glEnableClientState GL_COLOR_ARRAY

		/* 頂点データ場所を指定する */
		glBindBuffer GL_ARRAY_BUFFER,GLmemid_RYS
		glVertexPointer 2,GL_FLOAT,0,0//頂点データの場所を指定する。
		/* 色データ場所を指定する */
		glBindBuffer GL_ARRAY_BUFFER,GLmemid_RYc
		glColorPointer 4,GL_UNSIGNED_BYTE,0,0

		/* 頂点のインデックスを順番通りに使って図形を描く */
		glDrawArrays GL_POINTS,0,粒子数*2//頂点を粒子数*2こ使います＝粒子数こ表示します

		/* 頂点データの配列を無効にする */
		glDisableClientState GL_VERTEX_ARRAY//後片付け
		glDisableClientState GL_COLOR_ARRAY//後片付け
		glBindBuffer GL_ARRAY_BUFFER,0//後片付け。バインド解除
	//粒子描画ここまで////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	return
//レアアース描画
*レアアース描画
	repeat REAASU_KZ
		if (reaasu_i.cnt!=0)&(reaasu_i.cnt<8){
			//まず銀か金か
			reaasu_color=(reaasu_i.cnt&4)/4//0で銀、1で金
			pos reaasu_posx.cnt*4,reaasu_posy.cnt*4
			glColor4d 0.8+0.2*reaasu_color,0.8+0.2*reaasu_color,0.8-0.2*reaasu_color,0.11+0.13*reaasu_color+0.002*absf(flm\320-160);加算合成の度合い
			glBlendFunc GL_SRC_ALPHA, GL_ONE//アルファチャンネル設定、加算合成
			HGLgrotate expefx2,0,0,160,160,0.0,160,160

			pos reaasu_posx.cnt*4,reaasu_posy.cnt*4+5
			glColor4d 1.0,1.0,1.0,1.0;
			glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA//普通の透明抜きコピー
			HGLgrotate reaasu_tex,reaasu_color*200,0,200,128,0.0,50,32
		}
	loop
	return

//Stage1-1 どこどこ、BGMなんとか。という文字表示
*ステージ文字エフェクト
	//下地の青っぽいの
	glColor4d 0.3,0.3,0.4,limitf(0.0029*(460.0-absf(1.0*stageflg1-460.0)),0.0,1.0)
	pos 0,170
	HGLgcopy stagemoji_efx,0,0,512,92

	//文字
	//Stage n-m
	//影
	glColor4d 0.1,0.1,0.1,limitf(0.0032*(460.0-absf(1.0*stageflg1-460.0)),0.0,0.73)
	pos 180+3,191+3
	HGLgrotate stagefont_tex,0,ステージ*32,164,32,0.0,int(0.7*164),int(0.7*32)
	//本体
	glColor4d 1.0,1.0,1.0,limitf(0.0032*(460.0-absf(1.0*stageflg1-460.0)),0.0,1.0)
	pos 180,191
	HGLgrotate stagefont_tex,0,ステージ*32,164,32,0.0,int(0.7*164),int(0.7*32)

	//嵐の交差点
	//影
	glColor4d 0.1,0.1,0.1,limitf(0.0032*(460.0-absf(1.0*stageflg1-460.0)),0.0,0.73)
	pos 326+3,221+3
	HGLgrotate stagefont_tex,164,ステージ*32,512-164,32,0.0,512-164,32
	//本体
	pos 326,221
	glColor4d 1.0,1.0,1.0,limitf(0.0032*(460.0-absf(1.0*stageflg1-460.0)),0.0,1.0)
	HGLgrotate stagefont_tex,164,ステージ*32,512-164,32,0.0,512-164,32


	//BGM紹介をする場合
	if (大ステージ更新flg==1){
		stageFontSize=0.77
		if 大ステージ==3:stageFontSize=0.55
		//下地の青っぽいの
		glColor4d 0.9,0.2,0.1,limitf(0.0029*(460.0-absf(1.0*stageflg1-460.0)),0.0,1.0)
		pos 316,261
		HGLgrotate stagemoji_efx,0,0,512,92,0.0,int(0.7*512),int(0.7*92)
		//影
		glColor4d 0.1,0.1,0.1,limitf(0.0032*(460.0-absf(1.0*stageflg1-460.0)),0.0,0.73)
		pos 316+3,261+3
		HGLgrotate stagefont_tex,0,大ステージ*32+25*32,512,32,0.0,int(stageFontSize*512),int(stageFontSize*32)
		//本体
		pos 316,261
		glColor4d 1.0,1.0,1.0,limitf(0.0032*(460.0-absf(1.0*stageflg1-460.0)),0.0,1.0)
		HGLgrotate stagefont_tex,0,大ステージ*32+25*32,512,32,0.0,int(stageFontSize*512),int(stageFontSize*32)
	}

	//後片付け
	glColor4d 1.0,1.0,1.0,1.0
	return





*voiddcip0
	HCLDoKrn2 dcip0,WX,WY,128,1;
	HCLDoKrn2 dcip1,WX,WY,128,1;
	return





////////////////外力///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////外力///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//外力1		アンマップ関連
*UFO壁アンマップ
	//アンマップ
	mapmx=int(ufo_posx)-6//マップの本当の左上座標移動前
	mapmy=int(ufo_posy)-6
	//移動すると個体→流体になるところがあるのでまず流体格子のUFOマップをアンマップ
	HCLSetKernel krnUfoUnMap,3,mapmx
	HCLSetKernel krnUfoUnMap,4,mapmy
	HCLDokrn1 krnUfoUnMap,144,0//ufoを12*12格子からアンマッピング
	//噴射口あんマップ
	HGLRotate3dbyQuaternion yuusyututen,tmpten0,ufoquo//これでtmpten0に回転後の噴射口の位置が代入される
	tmpten0  +=ufo_posx
	tmpten0.2+=ufo_posy
	tmptenixy=int(tmpten0  )+int(tmpten0.2)*WX
	//tmptenixy//噴射口の格子の位置
	HCLSetKernel KrnUfoUnHun,0,tmptenixy
	HCLDokrn1 KrnUfoUnHun,1,1//噴射口周りの水流決定解除
	return

//外力2
*UFO移動加算切り替え
	//アンマッピングには古い情報が必要だった。ここで速度加算で新しい情報に
	//の前に速度更新

	//エンディングの特殊処理
	if ステージ==28{//中心から離れるほど中心に向かって戻される
		saisyonokeyflg=1
		dufo_F_x+=0.0003*(74.0-ufo_posx)
		dufo_F_y+=0.0003*(64.0-ufo_posy)
	}
	//F=maで速度に加速度を加算
	//加速度１//圧力による外力
	if saisyonokeyflg:if clrflg=0{
		ufo_spdx+=dufo_F_x//速度+=加速度１
		ufo_spdy+=dufo_F_y//速度+=加速度１
		ufoquo+=ufoQuoSpd//角度+=回転加速度
		ufoquo=(ufoquo+π2)\π2
	}
	//加速度２//噴射
	if hunsyaflg{//速度更新２
		ufo_spdx-=噴射力*sin(-ufoquo)//速度+=加速度２(噴射)
		ufo_spdy-=噴射力*cos(-ufoquo)
	}
	//加速度３//重力
	if clrflg=0:if saisyonokeyflg:ufo_spdy+=重力係数
	//位置+=速度
	if clrflg=0{
		ufo_posx+=ufo_spdx*DT
		ufo_posy+=ufo_spdy*DT
	}
	//位置=定数
	if ufo_pos_event{//イベント時、強制的にufoの位置を変えたいとき、簡単に位置を変えられないので、eventフラグに1をいれておけば、ここで更新される
		ufo_pos_event--
		ufo_posx=ufo_posx_event
		ufo_posy=ufo_posy_event
	}

	//もし切り替えるなら
	//gosub*UFO切り替える
	if ステージ切り替えフラグ=1:gosub*ステージ切り替える
	if henkeievent:if flm\8==0{
		if henkeievent==1:ufoidno--:if ufoidno==-1:ufoidno=29
		if henkeievent==2:ufoidno++:if ufoidno==30:ufoidno=0
		if ufoidno\10==0:henkeievent=0
		gosub*UFO設定
	}
	if 死亡フラグ{
		if 死亡フラグ=1:ufo_posx=ufo_posx_syoki:ufo_posy=ufo_posy_syoki:ufo_spdx=0.0:ufo_spdy=0.0:ufoquo=0.0:hunsyaflg=0:saisyonokeyflg=0:clrflg=0:saisyonokeyoffflg=0:死亡復帰フラグ=560
		死亡フラグ--
	}
	return

//外力3		マッピング関連
*外力（流体に働く）と壁マップ
	///////////////ここからUFOの胴体の設定
	//マップの本当の左上座標移動前
	mapmx=int(ufo_posx)-6
	mapmy=int(ufo_posy)-6
	//UFOマスク初期化。255＝流体を適応
	HCLFillBuffer_4 UFOマスク,0,36,4294967295
	//新しいUFO座標で格子に適応したいのでまずUFO回転、回転後の座標からUFOマスクデータを作成、マスクでは壁=0に代入する
	HCLSetKrns KrnUfoRote,	UFOcl座標元,UFOマスク,float(ufo_posx),float(ufo_posy),float(0.5*ufoquo)//rad2
	HCLDokrn1 KrnUfoRote,ufodot数*4,0//ufoを12*12格子にマッピング。グローバルサイズはUFO自体のドット数が多いこともあるので144ではダメ

	//kabeP,kabeX,kabeY,YUN,YVNほかもろもろにufoマップを全部適応、速度も適応、速度微分も適応
	HCLSetKrns KrnUfoMap,	UFOマスク,kabeP,kabeX,kabeY,mapmx,mapmy,YUN,YVN,GXU,GYU,GXV,GYV,float(ufo_spdx),float(ufo_spdy),float(ufoQuoSpd)
	HCLDokrn1 KrnUfoMap,144,0//ufoマップを流体格子に適応、速度を適応
	///////////////ここまではUFOの胴体の設定

	//////////ここからは噴射口の設定
	if hunsyaflg{
		HGLRotate3dbyQuaternion yuusyututen,tmpten0,ufoquo//これでtmpten0に回転後の噴射口の位置が代入される
		tmpten0  +=ufo_posx
		tmpten0.2+=ufo_posy
		tmptenixy=int(tmpten0  )+int(tmpten0.2)*WX
		//tmptenixy//噴射口の格子の位置
		//float(-ufoquo)//噴射向き角度
		HCLSetKernel KrnUfoHun,0,tmptenixy
		HCLSetKernel KrnUfoHun,1,float(-ufoquo)
		HCLDokrn1 KrnUfoHun,1,1//噴射口周りの水流決定
	}
	/////////////////噴射口の設定ここまで

	//UFOに働く外力	//この計算は圧力計さんの後にやりたい
	return









*受ける外力（UFOが）計算1
	if 死亡フラグ==0{
		////////////ここからはUFOが流れから外力を受けるところ
		HCLSetKernel KrnUfo外力,0,mapmx+mapmy*WX
		HCLSetKernel KrnUfo外力,3,受ける外力
		HCLDokrn1 KrnUfo外力,144,0//UFO周りの圧力から外力計算、まだまとめ外力はわからない
		//ここで外力をまとめてufoの速度に加算したいところだが、計算が終わるのは後のほうなので、「*表示」あたりで値を取り出し計算。ufoの外力に加える
		/////////////
	
		HCLSetKernel KrnUfo外力2,0,受ける外力
		HCLDokrn1 KrnUfo外力2,6,0//144*6の情報を144回ループで6個にまとめる
		//ここで外力をまとめてufoの速度に加算したいところだが、計算が終わるのは後のほうなので、「*CPU負荷」の最後あたりで値を取り出し計算。さらに次のフレームでUFOのアンマップが済んでからufoの速度に加える
	}
	return
*受ける外力（UFOが）計算2
	HCLReadBuffer 受ける外力,hsp_受ける外力,24//6要素
	//ここで壁に接していると外力がおかしくなるので精密計算
	左外力受ける線数=int(hsp_受ける外力.4+0.1)/256
	右外力受ける線数=int(hsp_受ける外力.4+0.1)\256
	上外力受ける線数=int(hsp_受ける外力.5+0.1)/256
	下外力受ける線数=int(hsp_受ける外力.5+0.1)\256
	if 左外力受ける線数!0:hsp_受ける外力.0/=左外力受ける線数
	if 上外力受ける線数!0:hsp_受ける外力.1/=上外力受ける線数
	if 右外力受ける線数!0:hsp_受ける外力.2/=右外力受ける線数
	if 下外力受ける線数!0:hsp_受ける外力.3/=下外力受ける線数
	rltmp=0:udtmp=0
	if 左外力受ける線数!=右外力受ける線数:rltmp++
	if 上外力受ける線数!=下外力受ける線数:udtmp++

	if rltmp==0:dufo_F_x=limitf(流れの影響*double(hsp_受ける外力.0+hsp_受ける外力.2)*左外力受ける線数,-0.26,0.26):else:dufo_F_x=0.0
	if udtmp==0:dufo_F_y=limitf(流れの影響*double(hsp_受ける外力.1+hsp_受ける外力.3)*上外力受ける線数,-0.26,0.26):else:dufo_F_y=0.0
	dmydufo_F_x+=dufo_F_x//FBAIフレームの平均値
	dmydufo_F_y+=dufo_F_y//FBAIフレームの平均値
	return

////////////////外力ここまで///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////外力ここまで///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




////////////////CPU負荷///////////////////////////////////////////////////////////////////////////////////////////////
////////////////CPU負荷///////////////////////////////////////////////////////////////////////////////////////////////
*当たり判定
	ddim tmpafge3,3
	ddim tmpafge2,3

	//クリア判定
	角度okflg=0
	ufo_spdyokflg=0
	if (	(ufoquo<(0.16-0.09 *(難易度==2)))|(ufoquo>(π2-0.16+0.09 *(難易度==2)))	):角度okflg=1
	if (	(ufoquo<(0.10-0.055*(難易度==2)))|(ufoquo>(π2-0.10+0.055*(難易度==2)))	):角度okflg=2
	if absf(ufo_spdy)<(0.06-0.03*(難易度==2)):ufo_spdyokflg=1
	if absf(ufo_spdy)<(0.03-0.015*(難易度==2)):ufo_spdyokflg=2
	if ufo_spdyokflg:if 角度okflg{
		if (ufo_posx*4.0)>(ufo_crax1+ufoGOfst.ufoidno):if (ufo_posx*4.0)<(ufo_crax2-ufoGOfst.ufoidno):if (ufo_posy*4.0)>(ufo_cray1+1*(難易度==2)):if (ufo_posy*4.0)<(ufo_cray2+1*(難易度==2)){
			if clrflg==0{//クリアした瞬間なら
				ds_play 24
				stagetimeflg=2
			}
			clrflg+=FBAI
			if clrflg==200{//クリアタイムボーナスのタイミングは微妙にずらす
				//クリアタイムボーナス
				//S 10万+ステージ*6000
				//A 5 万+ステージ*2500
				//B 2 万+ステージ*2000
				//C 1 万+ステージ*1600
				repeat 1
				if stagetime2< Sランクタイム:スコア加算+=100000+ステージ*6000:break
				if stagetime2< Aランクタイム:スコア加算+=50000 +ステージ*2500:break
				if stagetime2< Bランクタイム:スコア加算+=20000 +ステージ*2000:break
				if stagetime2>=Bランクタイム:スコア加算+=10000 +ステージ*1600:break
				loop
			}
		}
	}
	if stageflg0==2:if clrflg>400:stageflg0=3:stageflg1=0//着陸後硬直の後の会話へつなげる

	//障害物との当たり判定////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	if clrflg=0:if 死亡フラグ=0{
		//まず障害物と
		gsel 101
		safe=1
		repeat atrufokz/3
			//エラー回避
			//if atariufo.(cnt*3)=0.0:if atariufo.(cnt*3+1)=0.0:if atariufo.(cnt*3+2)=0.0:break
			memcpy tmpafge3,atariufo,24,0,cnt*24
			HGLRotate3dbyQuaternion tmpafge3,tmpafge2,ufoquo
			tmpafge2  +=ufo_posx*4.0
			tmpafge2.2+=ufo_posy*4.0
			pget int(tmpafge2),int(tmpafge2.2)//当たり判定用背景マスクから色取得
			if (ginfo_r!255)|(ginfo_g!255)|(ginfo_b!255):safe=0:衝突x=tmpafge2:衝突y=tmpafge2.2:gosub*ステージ削れる:break//当たってればsafe=0
		loop
		gsel 0
		//if safe=0:dialog "衝突しました！残念":HCLbye:end
		//次に画面の端と判定
		//safe=1
		if ufo_posx<4.0:safe=0	:衝突x=0				:衝突y=int(ufo_posy*4)
		if ufo_posx>124.0:safe=0:衝突x=512				:衝突y=int(ufo_posy*4)
		if ufo_posy<4.0:safe=0	:衝突x=int(ufo_posx*4)	:衝突y=0
		if ufo_posy>124.0:safe=0:衝突x=int(ufo_posx*4)	:衝突y=512

		if safe=0{//死んだだけでUFO切り替えない、ステージ切り替えない
			死亡フラグ=100
			衝突spd=sqrt(ufo_spdx*ufo_spdx+ufo_spdy*ufo_spdy)
			ufo_spdx=0.0:ufo_spdy=0.0:hunsyaflg=0:saisyonokeyflg=0:clrflg=-1:saisyonokeyoffflg=0
		}
	}
	//障害物との当たり判定ここまで////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	//レアアースとの当たり判定///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	repeat REAASU_KZ
		if (reaasu_i.cnt!=0)&(reaasu_i.cnt<8){//存在するかつ、まだ取り終わってなければ
			tmp0=ufo_posx-reaasu_posx.cnt
			tmp1=ufo_posy-reaasu_posy.cnt
			if (tmp0*tmp0+tmp1*tmp1)<64.0{//一定範囲内にあれば
				スコア加算+=((reaasu_i.cnt&4)/4)*1000000+200000
				ds_play 25
				if reaasu_i.cnt&4:ds_play 26
				if (reaasu_i.cnt&2){//セーブポイントなら
					if cnt<REAASU_KZ-1{//先にあるセーブポイントを一つでも取っていればufo初期位置更新しない
						tmp0=0
						repeat REAASU_KZ-cnt-1,cnt+1
							if reaasu_i.cnt>8:tmp0++
						loop
						if tmp0==0{
							ufo_posx_syoki=double(reaasu_posx.cnt)//初期位置更新
							ufo_posy_syoki=double(reaasu_posy.cnt)//初期位置更新
						}
					}else{
						ufo_posx_syoki=double(reaasu_posx.cnt)//初期位置更新
						ufo_posy_syoki=double(reaasu_posy.cnt)//初期位置更新
					}
				}
				reaasu_i.cnt+=8//取った証拠
			}
		}
	loop
	//レアアースとの当たり判定ここまで///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	return

*キーチェック
	//Esc
	getkey key,27:if key:goto*sthsr
	hunsyaflg=0//毎フレーム変わるので0に初期化
	ufoQuoSpd=0.0//毎フレーム変わるので0に初期化

	if stageflg0==2{//ステージフラグ2のとき
		if clrflg=0{//クリア前かつ死亡していなければ
			getkey key,32
			if key==0:saisyonokeyoffflg=1
			if saisyonokeyoffflg:if key{//スペース押している時
				if stagetimeflg==0:stagetime1=0.00416666666666666666666666666667*flm:stagetimeflg=1
				hunsyaflg=1:saisyonokeyflg=1
				if flm\8==0:ds_play 21
			}
			if saisyonokeyflg{//→←
				getkey key,37:if key : ufoQuoSpd=-(回転速度+0.0001*rnd(90))*0.25
				getkey key,39:if key : ufoQuoSpd= (回転速度+0.0001*rnd(90))*0.25
			}
			if ステージ>=12:if henkeievent==0{//Cキー
				//ufoidnoが0以外なら変形あり。1で上がり、2で下がり
				if ufoidno\10==0:getkey key,67:if key:henkeievent=1
			}
		}
		if ステージ==0{
			getkey key,88:if key:clrflg=401:ufo_spdx=0.0:ufo_spdy=0.0:stagetimeflg=2
		}

													//debug用aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
													if debugMode{
														if (ステージ!=28){
															getkey key,1:if key:ufo_posx=0.25*(ufo_crax1+ufoGOfst.ufoidno):ufo_posy=0.25*(ufo_cray1)
															getkey key,2:if key:ufo_posx=0.25*(ufo_crax2-ufoGOfst.ufoidno):ufo_posy=0.25*(ufo_cray1)
															getkey key,89:if key:ufo_posx=0.125*(ufo_crax1+ufo_crax2):ufo_posy=0.25*(ufo_cray1)
														}else{
															getkey key,2:if key:ds_setp 0,44100*4*(60*4+24)
														}
													}
	}

	if ((stageflg0\2)==1){//ステージフラグ1または3のとき会話フェーズ
		if yesnokommand_flg==1{//YES NOコマンドでているとき
			if kwonkey==1:wait 50//すぐ決定してしまわないようにwaitを入れたい
			kwonkey=0
			getkey key,38:if key:if sentakuy==1:sentakuy=0:ds_play 23//↑
			getkey key,40:if key:if sentakuy==0:sentakuy=1:ds_play 23//↓
			getkey key,90:if key:ds_play 27:yesnokommand_flg=2:kwonkey=1//ｚ
			getkey key,32:if key:ds_play 27:yesnokommand_flg=2:kwonkey=1//スペース
		}else{//YES NOコマンドでていないとき
			kwonkey=0
			getkey key,90:if key:kwonkey=1
			getkey key,88:if key:kwonkey=1:if ステージ<25:if kwflg1>2:kwflg1+=90
	//		getkey key,32:if key:kwonkey=1
		}
	}


	//ステージフラグを1にしたら次のループで読むようにしたい。だからあえてこの位置
	if stageflg0==0{//ステージフラグ0のとき
		if stageflg1>=920:stageflg0=1:stageflg1=0:kwflg1=0:kwflg0=0:kwonkey=0
	}

	stageflg1+=FBAI//ステージフラグ1。フレームみたいなもん
	return

*ステージ切り替える
	ステージ++
	ステージ切り替えフラグ=0
	gosub*ステージ設定
	return

*ステージ削れる
	tmpx=int(衝突x)/4
	tmpy=int(衝突y)/4
	tmp=HCLReadIndex_s(kabeP,tmpy*WX+tmpx)
	if (tmp!=72)&(tmp!=3){	
		gsel 101
		color 255,255,255
		repeat 4
		tmp=cnt
			repeat 4
				pset tmpx*4+tmp,tmpy*4+cnt
			loop
		loop
		mref tmpi,66;gsel 1のHSPのウィンドウ内画像データ(VRAM)を使いたいので
		//ここからはデータ変換
		sdim dataarray4,WX*IPN*WY*IPN*4;データを変換するために必要な配列変数
		sdim dataarray3,WX*IPN*WY*IPN*3;データを変換するために必要な配列変数
		convRGBtoBGR tmpi,dataarray3;意味上はBGR→RGBにしたいが、やってることは同じ
		color 255,255,255
		convRGBtoRGBA dataarray3,dataarray4,1;これしないとHGLWriteTextureで扱える形式にならないので
		//ここまで
		//ここから描画用glテクスチャにデータ転送
	//	HGLCreateTexture1 texid,WX*4,WY*4,GL_RGBA,GL_UNSIGNED_BYTE;texid作成
		HGLWriteTexture stage_GLtx,dataarray4,0,0,WX*IPN,WY*IPN,GL_RGBA,GL_UNSIGNED_BYTE;texidにデータを転送、このときdataarray4のサイズがしっかり合ってないと思わぬエラーになる
		//これでテクスチャにデータが転送された。あとは描画するだけ

		HCLWriteIndex_s kabeP,tmpy*WX+tmpx,255
		if (tmpx)!(WX-1):tmp=HCLReadIndex_s(kabeP, tmpy*WX+tmpx+1 ) :if tmp!=0:if tmp!=72:HCLWriteIndex_s kabeX,tmpy*WX+tmpx+1  ,255
		if (tmpx)!0     :tmp=HCLReadIndex_s(kabeP, tmpy*WX+tmpx-1 ) :if tmp!=0:if tmp!=72:HCLWriteIndex_s kabeX,tmpy*WX+tmpx    ,255
		if (tmpy)!(WY-1):tmp=HCLReadIndex_s(kabeP, (tmpy+1)*WX+tmpx):if tmp!=0:if tmp!=72:HCLWriteIndex_s kabeY,(tmpy+1)*WX+tmpx,255
		if (tmpy)!0     :tmp=HCLReadIndex_s(kabeP, (tmpy-1)*WX+tmpx):if tmp!=0:if tmp!=72:HCLWriteIndex_s kabeY,tmpy*WX+tmpx    ,255
		gsel 0
	}
	return


////////////////CPU負荷ここまで///////////////////////////////////////////////////////////////////////////////////////////////
////////////////CPU負荷ここまで///////////////////////////////////////////////////////////////////////////////////////////////











////////////粒子関連///////////////////////////////////////////////////////////////////////////////////////////////////
////////////粒子関連///////////////////////////////////////////////////////////////////////////////////////////////////



*音楽粒子
	/*
			//getpもawaitに連動しているようでどうも使いづらい。よってここではgetpしない
			ds_getp 0
			iti=1.0*stat
			diti=(int(iti/44100.0/4.0*60.0)+1)//現在のフレームみたいな
*/
	iiti=int(diti)
	tmpr=ginfo_r
	tmpg=ginfo_g
	tmpb=ginfo_b
	tmpppppppppp=0
	if drgbsz>iiti{
		tmpppppppppp=(drgb.iiti)
	}
	ih=tmpppppppppp\256
	is=(tmpppppppppp/256)\256
	iv=(tmpppppppppp/65536)\256
	iw=(tmpppppppppp/65536/256)

	if iw{//w要素は1ならば、次フレームの色とリニア補完しろという意味。これで1フレーム単位の色の制御が可能になる
		efih=ih
		efis=is
		efiv=iv
		tmpppppppppp=(drgb.(iiti+1))
		ih=tmpppppppppp\256
		is=(tmpppppppppp/256)\256
		iv=(tmpppppppppp/65536)\256
		ih=int(1.0*(ih*miiti+efih*(FBAI-miiti))/FBAI)
		is=int(1.0*(is*miiti+efis*(FBAI-miiti))/FBAI)
		iv=int(1.0*(iv*miiti+efiv*(FBAI-miiti))/FBAI)
	}
	//ステージ28ではランダム色生成する
	if (ステージ==28){
		if flm\(240*9)==0:rndih=rnd(191):rndis=(rnd(101)-55+rndis+256)\256
		hsvcolor rndih,rndis,iv
	}else{
		hsvcolor ih,is,iv
	}
	//ここで粒子の色の加算合成について、粒子数が多い時と少ない時で考える
	//画面全体の色はだいたい同じになるようにしたい
	//ここで粒子数が2倍になれば色は2分の1にしないといけない
	//rgb要素を2分の1にする手もあるがα要素を使って粒子数が多くなった時にもうまく綺麗に見えるようにする
	//と思ったけど難しいので適当に
	r値=int(α値*ginfo_r+0.5)
	if r値==0:if ginfo_r>=1:r値=1
	g値=int(α値*ginfo_g+0.5)
	if g値==0:if ginfo_g>=1:g値=1
	b値=int(α値*ginfo_b+0.5)
	if b値==0:if ginfo_b>=1:b値=1
	ryusiiro=r値+256*g値+65536*b値+4278190080//255*65536

	//後片付け
	color tmpr,tmpg,tmpb

	//現在の音楽フレームみたいな
	diti+=1.0/FBAI:miiti++
	return



*音楽フレーム管理
	ds_getp 0
	iti=1.0*stat
	diti=((iti/44100.0/4.0*60.0)+1.0)//現在のBGMフレームみたいな
	iiti=int(diti)
	miiti=0//iitiの値が変わらない間に4フレーム動くので、その1〜4の変動を記録する変数
	return



*粒子準備
	if hunsyaflg{//キー押した時の噴射する粉
		///粒子の発生位置セット。あとで粒子発生で使う
		HGLRotate3dbyQuaternion yuusyututenRYS,tmpten0,ufoquo//これでtmpten0に書いてのごの噴射口の位置が代入される
		hsp_RYShsitx=4.0*(tmpten0  +ufo_posx)-7.0//2+ 5は0.001*rnd(10000)調節用
		hsp_RYShsity=4.0*(tmpten0.2+ufo_posy)-7.0
		w=0
			repeat UFO噴射konagire
			ryuusihspgawa.w=float(hsp_RYShsitx+rnd(5)+0.001*rnd(10000))
			w++
			ryuusihspgawa.w=float(hsp_RYShsity+rnd(5)+0.001*rnd(10000))
			w++
			loop
		w=0
	}

	if 死亡フラグ==99{
		w=0
		repeat 爆発時粒子数
			tmprad=0.001*rnd(32000)
			tmplen=0.00063*rnd(30000)
			if rnd(5):tmplen+=24.0
			exploRYS.w=float(ufo_posx*4.0+cos(tmprad)*tmplen)
			w++
			exploRYS.w=float(ufo_posy*4.0+sin(tmprad)*tmplen)
			w++
		loop
		}
	return




//hktkaisは現在の粒子発生位置のオフセット
*粒子
						HCLEnqueueAcquireGLObjects RYS//RYSアンバインド
						HCLEnqueueAcquireGLObjects RYc//RYSアンバインド
	//噴射粉//////////////////////////////////////////////
	if hunsyaflg{//キー押した時の噴射する粉
		//もしこれでオーバーフローしたら大変
		if (hktkais+UFO噴射konagire)>粒子数:hktkais=0
		HCLWriteBuffer RYS,ryuusihspgawa,UFO噴射konagire*8,hktkais*8,0
		HCLFillBuffer_4 RYc,hktkais,UFO噴射konagire-14,255+15*256+9*65536+85*16777216//赤い粉
		HCLFillBuffer_4 RYc,hktkais+UFO噴射konagire-14,14,255+255*256+255*65536+115*16777216//白い粉
		hktkais+=UFO噴射konagire
	}
	//噴射粉ここまで//////////////////////////////////////////////

	//爆発粉////////////////////////////////////////////////
	if 死亡フラグ==99{
		StageRys2 RYS,RYc,exploRYS,225+110*256+45*65536+120*65536*256,爆発時粒子数,hktkais,0,粒子数,爆発時粒子数
		hktkais+=爆発時粒子数
		hktkais\=粒子数
	}
	//爆発粉ここまで////////////////////////////////////////////////


	//もし激流ステージの会話の最初の方なら粒子は見せない
	if ステージ==12:if gekiryuflg<=1:ryusiiro=0
	//もし月面降下中なら白くする
	if (kwflg0>=7)&(kwstage==1)&(ステージ==0):ryusiiro=255+256*255+255*65536+100*65536*256


	//ステージ粒子////////////////////////////////////////////////
	//最初からあるエーテル
	//ryuusihspgawa2では要素数は粒子発生壁kz*2まで→RysReadVramへコピーしてそっちを使うことにする
	//hktkaisは書き込むオフセット
	//rktkaisは読み込むオフセット
	//もしこれでオーバーフローしたら大変
	//StageRys=ステージ粒子適応
	if ステージ!=28{//通常のステージ粒子
		//iwは音楽粒子で強調したいときにnフレーム分を一気にだしたいとき2以上になっているやつ
		//konagireはステージごとの1フレーム当たりの粒子発生数
		drawPointsKz=int( (1.0+0.3*(iw>1)*(1.0*iw-1.0)) * konagire  * konagire係数)//iwが2以上のとき、wの値に応じて粒子数が増える
		if drawPointsKz>=(粒子発生壁kz/2):drawPointsKz=粒子発生壁kz/2
		StageRys RYS,RYc,RysReadVram,ryusiiro,drawPointsKz,hktkais,rktkais,粒子数,粒子発生壁kz
		hktkais+=drawPointsKz
		rktkais+=drawPointsKz
		hktkais\=粒子数
		rktkais\=粒子発生壁kz
	}else{
		gosub*スタッフロール2//スタッフロール文字
	}
	//ステージ粒子ここまで////////////////////////////////////////////////

	//BGMエフェクト粒子////////////////////////////////////////////////
	//封印
	//if (ステージ!=12)|(gekiryuflg>1):if sEfxIw:gosub*BGMエフェクト粒子
	//BGMエフェクト粒子ここまで////////////////////////////////////////////////


	HCLDoKrn1 ryuusi,粒子数,0//全粒子を移動処理
	HCLWaitTask
					HCLEnqueueReleaseGLObjects RYS//RYSバインド
					HCLEnqueueReleaseGLObjects RYc//RYSアンバインド
	HCLWaitTask
	return

	/*
*BGMエフェクト粒子
	hsvcolor efih,efis,efiv
	ryusiirodmy=limit(ginfo_r+色下駄加算,0,255)+limit(ginfo_g+色下駄加算,0,255)*256+limit(ginfo_b+色下駄加算,0,255)*65536+limit(40,0,255)*16777216
	sEfxIw--
	if sEfxIw<4{
		StageRys RYS,RYc,RysReadVramEfx.sEfxIw,ryusiirodmy,RysReadVramEfx_kz.sEfxIw,hktkais,0,粒子数,RysReadVramEfx_kz.sEfxIw
		hktkais+=RysReadVramEfx_kz.sEfxIw
		hktkais\=粒子数
	}else{
		hyojiRysKz=3000+600*(sEfxIw-4)+rnd(600)
		StageRys RYS,RYc,RysReadVramEfx.4,ryusiirodmy,hyojiRysKz,hktkais,0,粒子数,RysReadVramEfx_kz.4
		hktkais+=hyojiRysKz
		rexkais+=hyojiRysKz
		hktkais\=粒子数
		rexkais\=RysReadVramEfx_kz.4
	}
	return
*/

////////////粒子関連ここまで///////////////////////////////////////////////////////////////////////////////////////////////////
////////////粒子関連ここまで///////////////////////////////////////////////////////////////////////////////////////////////////






/////////会話関連///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////会話関連///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*圧力表示準備
	//YPN→presshyouji　にデータ転送し、表示に備える
	HCLEnqueueAcquireGLObjects clmem_presshyouji_color//clmem_presshyouji_vertxアンバインド
	//圧力合計値を計算
	HCLSetKernel presshyoji2,3,int(ufo_posx)
	HCLSetKernel presshyoji2,4,int(ufo_posy)
	HCLDoKrn1    presshyoji2,64,64
	//平均値を引いてならす。色に変換
	HCLSetKernel presshyoji,3,int(ufo_posx)
	HCLSetKernel presshyoji,4,int(ufo_posy)
	HCLDoKrn1_sub presshyoji,PRESS_HYOJI_XY*PRESS_HYOJI_XY,64
	//必要か?
	HCLWaitTask
	HCLEnqueueReleaseGLObjects clmem_presshyouji_color//clmem_presshyouji_vertxバインド
	return

*画面右の描画//圧力表示、スコア表示など
	//背景描画//////////////
	glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA//普通の透明抜きコピー
	glColor4d 1.0,1.0,1.0,1.0
	pos 512,0
	HGLgcopy migigmn_tex,0,0,256,512

	//安全灯ここから////////////////////////////////////////////////////////////////////
	if (ステージ>=7){
		tentouflg=0//点灯フラグ
		if (ufo_posx*4.0)>(ufo_crax1-77):if (ufo_posx*4.0)<(ufo_crax2+77):if (ufo_posy*4.0)<(ufo_cray2+20):if (ufo_posy*4.0)>(ufo_cray2-150):tentouflg=1
	
		glBlendFunc GL_SRC_ALPHA, GL_ONE//アルファチャンネル設定、加算合成
		glColor4d 1.0,1.0,1.0,0.5*ufo_spdyokflg*tentouflg
		pos GMKSPOSX,GMKSPOSY
		HGLgrotate efxkaso_tex,0,0,256,256,0,112,112//速度のほう、ただの明かり
		glColor4d 1.0,1.0,1.0,0.5*角度okflg*tentouflg
		pos GMKSPOSX+82,GMKSPOSY
		HGLgrotate efxkaso_tex,0,0,256,256,0,112,112//角度のほう、ただの明かり
	
		glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA//普通の透明抜きコピー
		glColor4d 1.0,0.5*ufo_spdyokflg*tentouflg,1.0,1.0
		pos GMKSPOSX,GMKSPOSY
		HGLgrotate sokudoRGBA_tex,0,0,56,96,0,int(0.60*56),int(0.60*96)//速度
		glColor4d 1.0,0.5*角度okflg*tentouflg,1.0,1.0
		pos GMKSPOSX+82,GMKSPOSY
		HGLgrotate kakudoRGBA_tex,0,0,56,96,0,int(0.60*56),int(0.60*96)//角度
	}
	//ここまで//////////////////////////////////////////////////////////////////////////


	//圧力計/////////////////////////////////////////////////////////////////
	/////VBO開始/////
	glColor4d 1.0,1.0,1.0,1.0
	;粒子色はVBOに設定済み
	/* 頂点データの配列を有効にする */
	glEnableClientState GL_VERTEX_ARRAY
	glEnableClientState GL_COLOR_ARRAY

	/* 頂点データ場所を指定する */
	glBindBuffer GL_ARRAY_BUFFER,glmem_presshyouji_vertx
	glVertexPointer 2,GL_FLOAT,0,0//頂点データの場所を指定する。
	/* 色データ場所を指定する */
	glBindBuffer GL_ARRAY_BUFFER,glmem_presshyouji_color
	glColorPointer 4,GL_UNSIGNED_BYTE,0,0

	/* 頂点のインデックスを順番通りに使って図形を描く */
	glDrawArrays GL_QUADS,0,PRESS_HYOJI_XY*PRESS_HYOJI_XY*4//頂点を粒子数*4こ使います＝粒子数こ表示します

	/* 頂点データの配列を無効にする */
	glDisableClientState GL_VERTEX_ARRAY//後片付け
	glDisableClientState GL_COLOR_ARRAY//後片付け
	glBindBuffer GL_ARRAY_BUFFER,0//後片付け。バインド解除
	/////VBOここまで/////

	//speedの矢印表示
	tmp=53.0*sqrt(ufo_spdx*ufo_spdx+ufo_spdy*ufo_spdy)
	if tmp>=1.0{
		tmpx=400.0*ufo_spdx/tmp//atanしなくても速度の単位ベクトルのx方向成分はわかる
		tmpy=400.0*ufo_spdy/tmp//atanしなくても速度の単位ベクトルのy方向成分はわかる
		repeat int(tmp)
			pos 637+tmpx*(cnt+2),90+tmpy*(cnt+2)
			HGLgrotate speedya_tex,0,0,64,64,atan(ufo_spdy,ufo_spdx),32,32
		loop
	}
	//yajiの風圧力表示
	if (flm\16==0){
		表示用dufo_F_x=dmydufo_F_x//16フレームの平均値
		表示用dufo_F_y=dmydufo_F_y//16フレームの平均値
		dmydufo_F_x=0.0
		dmydufo_F_y=0.0
	}
	if (ステージ>=10)&(stageflg0>=1){
		表示用dufo_F_rad=atan(表示用dufo_F_y,表示用dufo_F_x)
		表示用dufo_tmp=sqrt(表示用dufo_F_y*表示用dufo_F_y+表示用dufo_F_x*表示用dufo_F_x)
		表示用dufo_F=57.0*sqrt(表示用dufo_tmp)+1600.0*表示用dufo_tmp
		if (ステージ==28){表示用dufo_F*=0.22}else{//ステージ28は流れの影響の係数が高いので補正
			if 難易度==0:表示用dufo_F*=3.5//ステージ28以外のイージーだと流れの影響の係数が低いので補正
		}
		if 表示用dufo_F>1.0{
			表示用dufo_F=limitf(表示用dufo_F,1.0,40.0)
			tmpx=(8.0+2.0*表示用dufo_F)*cos(表示用dufo_F_rad)
			tmpy=(8.0+2.0*表示用dufo_F)*sin(表示用dufo_F_rad)
			glColor4d 1.0,1.0,1.0,limitf(0.08*表示用dufo_F+0.1,0.15,0.7)
			pos 637+tmpx,90+tmpy
			HGLgrotate yaji_tex,0,0,168,100,表示用dufo_F_rad,16.80*表示用dufo_F,10.00*表示用dufo_F
		}
	}

	/////方向矢印ここから/////
	glBegin GL_LINES;ライン６つ表示
	tmpcos0=cos(ufoquo)//関数計算はまとめて高速化
	tmpcos1=cos(ufoquo+0.1)
	tmpcos9=cos(ufoquo-0.1)
	tmpsin0=sin(ufoquo)
	tmpsin1=sin(ufoquo+0.1)
	tmpsin9=sin(ufoquo-0.1)

    glColor4d 0.89,0.0,0.0,1.0;赤、ｘ軸
	glVertex2d 637.0-60.0*tmpcos0,90.0-60.0*tmpsin0//矢の本体
	glVertex2d 637.0+70.0*tmpcos0,90.0+70.0*tmpsin0//矢の本体

	glVertex2d 637.0+70.0*tmpcos0,90.0+70.0*tmpsin0//矢の先端１
	glVertex2d 637.0+60.0*tmpcos1,90.0+60.0*tmpsin1//矢の先端１

	glVertex2d 637.0+70.0*tmpcos0,90.0+70.0*tmpsin0//矢の先端２
	glVertex2d 637.0+60.0*tmpcos9,90.0+60.0*tmpsin9//矢の先端２

    glColor4d 0.1,0.3,1.0,1.0;青、ｙ軸
	glVertex2d 637.0-60.0*tmpsin0,90.0+60.0*tmpcos0//矢の本体
	glVertex2d 637.0+70.0*tmpsin0,90.0-70.0*tmpcos0//矢の本体

	glVertex2d 637.0+70.0*tmpsin0,90.0-70.0*tmpcos0//矢の先端１
	glVertex2d 637.0+60.0*tmpsin9,90.0-60.0*tmpcos9//矢の先端１

	glVertex2d 637.0+70.0*tmpsin0,90.0-70.0*tmpcos0//矢の先端２
	glVertex2d 637.0+60.0*tmpsin1,90.0-60.0*tmpcos1//矢の先端２
	glEnd

	pos 627.0+79.0*tmpsin0,80.0-79.0*tmpcos0
	HGLmes "y",22
    glColor4d 0.89,0.0,0.0,1.0;赤、ｘ軸
	pos 627.0+79.0*tmpcos0,80.0+79.0*tmpsin0//矢の本体
	HGLmes "x",22
	/////方向矢印ここまで/////
	//圧力計ここまで/////////////////////////////////////////////////////////////////
	//圧力計のグラフ軸説明ここから
	glColor4d 1.0,1.0,1.0,1.0
	pos 512+128,170
	HGLgrotate jikumesRGBA_tex,0,0,142+130*(ステージ>=10),32,0.0,int(0.5*(142+130*(ステージ>=10))),int(0.5*32)
	//圧力計のグラフ軸説明ここまで



	//TIMEスコア等、文字列系統ここから/////////////////////////////////////////////////////////////////
	//計算
	if stagetimeflg{
		if (stagetimeflg==1):stagetime0=0.00416666666666666666666666666667*flm:stagetime2=stagetime0-stagetime1
		stagetimemin=int(stagetime2/60.0)
		stagetimesec=int(stagetime2\60.0)
		stagetimemsc=int(100.0*stagetime2)\100
	}else{
		stagetimemin=0
		stagetimesec=0
		stagetimemsc=0
	}

	//描画系等
	//おまじない
	glBindTexture GL_TEXTURE_2D,score_tex
	glBegin GL_QUADS//OpenGLでは中心が0,0としたら1.0,1.0は右上
	glColor4d 1.0,1.0,1.0,1.0
	//HiScore
	pos MGSCOREPOSX,MGSCOREPOSY
	HGLgcopy2 0,88,200,44,100,22,512,512
	//normal easy
	pos MGSCOREPOSX+132,MGSCOREPOSY
	HGLgcopy2 256,220+難易度*44,200,44,100,22,512,512
	//000000
	pos MGSCOREPOSX+44,MGSCOREPOSY+22
	HGLmes3 strf("%08d",hiスコア),22
	//Score
	pos MGSCOREPOSX,MGSCOREPOSY+44
	HGLgcopy2 0,132,200,44,100,22,512,512
	//「+20000pt」みたいなやつ
	if (スコア加算!=0){
		idouスコア=1011+rnd(800)+rnd(limit(スコア加算/16,1,32767))
		if スコア加算<idouスコア:idouスコア=スコア加算
		スコア+=idouスコア
		スコア加算-=idouスコア
		pos MGSCOREPOSX+140,MGSCOREPOSY+48
		HGLmes3 "+"+スコア加算+"",14
		if flm\16==0:ds_play 28
	}
	//0000000
	pos MGSCOREPOSX+44,MGSCOREPOSY+66
	HGLmes3 strf("%08d",スコア),22
	//Play Time
	pos MGSCOREPOSX,MGSCOREPOSY+88
	HGLgcopy2 0,176,200,44,100,22,512,512
	//00:00:00
	pos MGSCOREPOSX+44,MGSCOREPOSY+110
	HGLmes3 ""+strf("%02d",stagetimemin)+":"+strf("%02d",stagetimesec)+":"+strf("%02d",stagetimemsc)+""	,22

	//S〜Aランクのあれ
	if (ステージ<=24)&(ステージ>=1){
		//Sランク　〜01:00:00 50000pt
		pos MGSCOREPOSX-9,MGSCOREPOSY+152
		HGLgcopy2 0,220,132,44,66,22,512,512
		pos MGSCOREPOSX+57,MGSCOREPOSY+154
		HGLmes3 ""+SランクタイムMin+":"+SランクタイムSec+":"+SランクタイムMsc+"   "+(100000+ステージ*6000)+" p",18
		//Aランク　〜01:00:00
		pos MGSCOREPOSX-9,MGSCOREPOSY+174
		HGLgcopy2 0,266,132,44,66,22,512,512
		pos MGSCOREPOSX+57,MGSCOREPOSY+176
		HGLmes3 ""+AランクタイムMin+":"+AランクタイムSec+":"+AランクタイムMsc+"   "+(50000 +ステージ*2500)+" p",18
		//Bランク　〜01:00:00
		pos MGSCOREPOSX-9,MGSCOREPOSY+196
		HGLgcopy2 0,310,132,44,66,22,512,512
		pos MGSCOREPOSX+57,MGSCOREPOSY+198
		HGLmes3 ""+BランクタイムMin+":"+BランクタイムSec+":"+BランクタイムMsc+"   "+(20000 +ステージ*2000)+" p",18
		//Cランク　01:00:00〜
		pos MGSCOREPOSX-9,MGSCOREPOSY+218
		HGLgcopy2 0,354,132,44,66,22,512,512
		pos MGSCOREPOSX+57,MGSCOREPOSY+220
		HGLmes3 "59:59:99   "+(10000 +ステージ*1600)+" p",18
	}

	//63fps
	pos MGSCOREPOSX+168,MGSCOREPOSY+246
	HGLmes3 ""+strf("%02d",(mflmps/FBAI))+"",18
	pos MGSCOREPOSX+193,MGSCOREPOSY+246
	HGLgcopy2 0,432,132,52,50,20,512,512

	glEnd
	glBindTexture GL_TEXTURE_2D,0
	//TIMEスコア等、文字列系統ここまで/////////////////////////////////////////////////////////////////

	return

*会話準備
	if ((stageflg0\2)==1){//もし会話ふぇーずなら
		kwflg1+=FBAI//メッセージの流れるフレーム
		if kwonkey{//もしキー押してたら
			kwonkey=0//一応
			//最後まで喋ってたら
			if kwsyuryou:gosub*会話準備例外処理onキー//内部に gosub*次へメッセージ処理、あり。普通の会話なら gosub*次へメッセージ処理
		}
		gosub*会話準備例外処理offキー
	}
	return

//主に激流ステージの会話イベントやエンディングなど
*会話準備例外処理offキー
	//7,1はチュートリアル後の月面背景スクロール
	if (kwflg0>=7)&(kwstage==1){
		offsetBgPosY+=FBAI
		if offsetBgPosY>6400:offsetBgPosY=6400
	}
	//激流ステージのあれ
	if (kwflg0==1)&(kwstage==24){
		ds_getp 0
		kwonkey=0
		kwflg1=limit((1.0*stat-gekiryukaiwaitiofset)/(0.003*gekiryukaiwaitiofset2),0,256)
	}

	//激流ステージのあれ、kwflg0==2  kwflg0==3 は空白の会話
	if ((kwflg0==2)|(kwflg0==3))&(kwstage==24){
		kwflg0=2
		kwflg1=0
		ds_getp 0
		iti=1.0*stat
		if iti<41000.0*50{
			gekiryuflg=1//会話見えない、粒子見えない
		}else{
			if iti<41000.0*53{
				gekiryuflg=2//会話見えない、粒子見える
			}else{
				gekiryuflg=3//会話見える、粒子見える
				kwflg0=4
			}
		}
	}

	//流しそうめんの最後の会話
	if (kwflg0==5)&(kwstage==49){
		//kwflg1が2000〜3900でのフェード
		ds_vol 0,limit(BGM音量倍率*29*2*(3900-kwflg1)/1900,0,100)
		if 3900<kwflg1{//次へメッセージ処理みたいなもん
			ステージ切り替えフラグ=1
			kwstage++:kwflg0=0:kwflg1=0
			stageflg0=1:stageflg1=0
		}
	}

	//帰り道、上昇部分、鬼の体内
	if (ステージ==25){
		ds_getp 0
		if stat>EDロール開始タイミング:ufo_spdy=-0.09
		if ufo_posy<8.0:ufo_spdy=0.0
		hunsyaflg=1
	}
	//鬼の口から出るところ
	if (ステージ==26){
		ufoquo=0.5
		if ufo_posy>=40.0{//第一段階
			ufo_spdx= 0.134
			ufo_spdy=-0.0804
			ufoquo=atan(ufo_spdy,ufo_spdx)+0.5*π
		}
		if ufo_posy<40.0:if ufo_posx<74.0{//第２段階
			ufo_spdx= 0.1660
			ufo_spdy= 0.0
			ufoquo=atan(ufo_spdy,ufo_spdx)+0.5*π
		}
		if ufo_posx>=74.0{//第３段階
			ufo_spdx= 0.0980
			ufo_spdy=-0.0980
			ufoquo=atan(ufo_spdy,ufo_spdx)+0.5*π
		}
		if ufo_posy<8.0:ufo_spdy=0.0:ufo_spdx=0.0
		hunsyaflg=1
		offsetBgPosY=0
	}

	//帰り道、月の上空
	if (ステージ==27){
		ufo_spdx= 0.0
		ufo_spdy=-0.0152
		ufoquo=0.0
		offsetBgPosY+=FBAI
		if offsetBgPosY>1600:offsetBgPosY=1600
	}
	return


//例外処理とは。主に、はい いいえコマンドのこと
*会話準備例外処理onキー
	repeat 1

	//2,0はチュートリアルやるかやらないかこと。
	if (kwflg0==2)&(kwstage==0){
		//コマンド出る前にzおした時の処理
		if yesnokommand_flg==0{
			yesnokommand_flg=1
			kwonkey=1//すぐ決定してしまわないようにwaitを入れたい、そのためのフラグ
			break
		}
		//コマンド出た後にzおした時の処理
		if yesnokommand_flg==2{
			if sentakuy==1:stageflg0=3:kwstage++:kwflg0=1:kwflg1=0//いいえ
			if sentakuy==0:gosub*次へメッセージ処理//はい
			yesnokommand_flg=0
			sentakuy=0
			break
		}
	}

	//0,1はチュートリアル終わるか終わらないかのこと。
	if (kwflg0==0)&(kwstage==1){
		//コマンド出る前にzおした時の処理
		if yesnokommand_flg==0{
			yesnokommand_flg=1
			kwonkey=1//すぐ決定してしまわないようにwaitを入れたい、そのためのフラグ
			ufo_spdx=0.0
			ufo_spdy=0.0
			break
		}
		//コマンド出た後にzおした時の処理
		if yesnokommand_flg==2{
			if sentakuy==1:stageflg0=2:kwflg0=0:kwflg1=0:clrflg=0//いいえ
			if sentakuy==0:gosub*次へメッセージ処理//はい
			yesnokommand_flg=0
			sentakuy=0
			break
		}
	}

	//3,49は流しそうめんコースの終わったあとの会話
	if (kwflg0==4)&(kwstage==49){
		kwflg0=5//次も全く同じ会話文
		kwflg1=2000	//フレームを最初からmaxにすることで会話文を最初から全部表示させる
					//2000以降の数字で音量フェードアウトと画面フェードアウトのフレーム数を測る仕組み
		break
	}
	if (kwflg0==5)&(kwstage==49){
		break
	}

	gosub*次へメッセージ処理
	loop

	return

*次へメッセージ処理
	kwflg0++//次のメッセージへ
	kwflg1=0//次のメッセージに言ったら文字フレームは0から
	gosub*会話イベント//主に会話に連動して起きる特殊イベント
	if 会話文.kwflg0.kwstage==""{//次の会話文がなければゲーム開始。または終了
		if stageflg0==1:stageflg0=2:stageflg1=0:kwstage++:kwflg0=0:kwflg1=0//ゲーム開始
		if stageflg0==3{//ゲーム終了判定
			//dialog "クリアーー！"
			ステージ切り替えフラグ=1
			kwstage++:kwflg0=0:kwflg1=0
			stageflg0=0:stageflg1=0
		}
	}
	return

//主に会話に連動して起きる特殊イベント
//onキー時限定
*会話イベント
	//会話途中にステージの背景が変わる。チュートリアルのところのあれ
	if (kwflg0==7)&(kwstage==1){
		//背景ロード
		if bgscr_GLtx:HGLReleaseTexture bgscr_GLtx	:bgscr_GLtx=0//すでに使っていたら破棄
		HGLCreateTexture1_texload bgscr_GLtx,"data\\stage\\"+ステージ+"\\haikei2.png"//読み込み専用テクスチャにロード
		//粒子リセット
		HCLEnqueueAcquireGLObjects RYS
		HCLFillBuffer_4 RYS,0,粒子数*2,0
		HCLEnqueueReleaseGLObjects RYS
		HCLEnqueueAcquireGLObjects RYc
		HCLFillBuffer_4 RYc,0,粒子数,0
		HCLEnqueueReleaseGLObjects RYc
		repeat WX-2
			HCLWriteIndex_f YVN,WX*WY-WX+1+cnt,float(-0.22)
		loop
//		ufo_posx=64.0
//		ufo_posy=79.0
		ufo_pos_event=1//イベントフラグを1に
		ufo_posx_event=64.0
		ufo_posy_event=79.0

		ufo_spdx=0.0
		ufo_spdy=0.0
		ufoquo=π
		wait 50
	}

	//激流ステージの博士の「何かおかしい」がゆっくりになるように、音楽フレーム取得
	if (kwflg0==1)&(kwstage==24){
		ds_getp 0
		gekiryukaiwaitiofset=1.0*stat
		if gekiryukaiwaitiofset>41000.0*43{//もし激流の粒子がバーってなるタイミングより、会話の進みが遅ければ
			gekiryukaiwaitiofset2=41000.0*2
		}else{//もし激流の粒子がバーってなるタイミングより、会話の進みが早ければ
			gekiryukaiwaitiofset2=41000.0*45-gekiryukaiwaitiofset//会話の文字表示スピードを音楽に同期させるときの表示スピードの逆数
		}
	}

	return

*会話描画
	repeat 1
	if gekiryuflg==1:break//例外処理
	if gekiryuflg==2:break//例外処理
	if ((stageflg0\2)==0):break//例外処理
	if (ステージ>=25)&(ステージ<=28):break//例外処理

		//会話メッセージボックス
		glColor4d 1.0,1.0,1.0,0.85
		pos 0,512-132
		HGLgcopy mes_tex,0,0,512,132

		//会話顔グラ
		glColor4d 1.0,1.0,1.0,1.0
		pos 10,512-132+16
		tmp=会話状況.kwflg0.kwstage\256
		tmpx=tmp\100
		tmpy=tmp/100
		HGLgcopy mesgr_tex,tmpx*100,tmpy*100,100,100

		//普通の会話
		tmp=会話状況.kwflg0.kwstage/256//色情報
		glColor4d 0.0,0.0,0.0,1.0
		pos 128,512-132+12
		HGLmes2 会話文.kwflg0.kwstage,(kwflg1/8),22,kwsyuryou,tmp
		//もし会話が終了していれば▼を点滅表示。特定の状況ではやらない
		repeat 1
		if (kwflg0==5)&(kwstage==49):break
		if (kwsyuryou)&((flm\280)<140){
			pos 470,480
			HGLmes "▼",22
		}
		loop

		//YES NOコマンド
		if yesnokommand_flg==1{
			//はい いいえ描画
			glColor4d 1.0,1.0,1.0,0.85
			pos 400,289
			HGLgcopy messageyn,0,0,128,92
			glColor4d 0.0,0.0,0.0,1.0//▼カーソル描画
			pos 406,303+sentakuy*37
			HGLmes "▼",22
		}

		//流しそうめんの最後の会話のフェードアウト
		if (kwflg0==5)&(kwstage==49){
			glColor4d 1.0,1.0,1.0,0.01/19.0*(kwflg1-2000)
			pos WX*ipn/2,WY*ipn/2
			HGLgrotate fadeout,0,0,64,64,0.0,WX*ipn,WY*ipn
		}
		//流しそうめんの最後の会話のフェードアウト、特殊
		if (kwflg0==0)&(kwstage==50)&(ステージ==24){
			glColor4d 1.0,1.0,1.0,1.0
			pos WX*ipn/2,WY*ipn/2
			HGLgrotate fadeout,0,0,64,64,0.0,WX*ipn,WY*ipn
		}

	loop




	//ここからは例外処理。フェードアウトなど////////////////////////////////////////
	//鬼の体内上昇中
	if (ステージ==25){
		glColor4d 1.0,1.0,1.0,limitf((40.0-ufo_posy)/26.5-0.2,0.0,1.0)//最後のシーンだけフェードアウト。最初はぱってでる仕様
		if ufo_posy==118:glColor4d 1.0,1.0,1.0,1.0//スタッフロールを流す時だけ完全フェードアウトさせたい
		pos WX*ipn/2,WY*ipn/2
		HGLgrotate fadeout,0,0,64,64,0.0,WX*ipn,WY*ipn
		//フェードの黒の上からスタッフロール描画
		ds_getp 0
		iti=stat
		if iti<EDロール開始タイミング:gosub*スタッフロール
		//最後のフレームでは
		if ufo_posy<8.0:kwstage++:kwflg0=0:kwflg1=0:ステージ切り替えフラグ=1:kwstage++:stageflg0=1:stageflg1=0
	}
	//鬼から脱出
	if (ステージ==26){
		glColor4d 1.0,1.0,1.0,1.0
		if kwflg1<180:glColor4d 1.0,1.0,1.0,limitf(1.0*(180-kwflg1)/180.0,0.0,1.0)
		if kwflg1>640:glColor4d 1.0,1.0,1.0,limitf(1.0*(kwflg1-640)/180.0,0.0,1.0)
		if ((kwflg1<180)|(kwflg1>640)){
			pos WX*ipn/2,WY*ipn/2
			HGLgrotate fadeout,0,0,64,64,0.0,WX*ipn,WY*ipn
			if ufo_posy<8.0:kwstage++:kwflg0=0:kwflg1=0:ステージ切り替えフラグ=1:kwstage++:stageflg0=1:stageflg1=0
		}
	}
	//帰り道、月の上空
	if (ステージ==27){
		if offsetBgPosY>1400{
			glColor4d 1.0,1.0,1.0,limitf(1.0-0.005*(1600-offsetBgPosY),0.0,1.0)
			pos WX*ipn/2,WY*ipn/2
			HGLgrotate fadeout,0,0,64,64,0.0,WX*ipn,WY*ipn
		}
		if offsetBgPosY>=1600:kwstage++:kwflg0=0:kwflg1=0:ステージ切り替えフラグ=1:kwstage++:stageflg0=1:stageflg1=0:α値=255.0/255.0
	}
	//帰りの宇宙、粒子のところ。最初フェードアウト、240flmから操作できる
	if (ステージ==28){
		if kwflg1<240{
			ufoquo=0.5*π
			glColor4d 1.0,1.0,1.0,limitf(1.0*(240-kwflg1)/240.0,0.0,1.0)
			pos WX*ipn/2,WY*ipn/2
			HGLgrotate fadeout,0,0,64,64,0.0,WX*ipn,WY*ipn
		}else{
			stageflg0=2
			ds_getp 0
			//ゲーム終了判定
			if stat>268*44100*4:if ゲーム終了判定flg==0:ゲーム終了判定flg=FBAI:ds_stop 0
		}
	}
	//////////////////ここまで/////////////////////////////////////////////////////////

	glColor4d 1.0,1.0,1.0,1.0
	return
/////////会話関連ここまで///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////会話関連ここまで///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////