// IMW版 スクリーンセーバー
// くらげ(?)が漂います

// コンパイルして、拡張子を .exe → .scr に変更すれば
// スクリーンセーバーとして使えます


// キーが押されたりクリックされたら終了させる
KEYDOWN     { end ; }
LBUTTONDOWN { end ; }
RBUTTONDOWN { end ; }

// マウスが動いたら終了させる
MOUSEMOVE
{
	// ms_move の値が 10 までは終了させない
	// こうしないといきなり終了してしまう
	ms_move = ms_move + 1 ;
	if(ms_move > 10){ end ; }
}

CREATE
{
	SetWinStyle(4) ;
	SetWinSize(SCR_X,SCR_Y) ;
	SetWinPos(0,0,0) ;
	SetWinColor(0) ;

	SetTimer(100) ;
	SubScreen(SCR_X,SCR_Y) ;
	Data("map",1,16) ;

	vpit =  8 ; // 高さ
	hpit = 16 ; // 幅
	kaku = 18 ; // 角の数 最大32まで
	Create3DPack(1,kaku*15*2+kaku*2) ;
	Set3DCenter(SCR_X/2,SCR_Y/2,2000) ;

	count = SEC ;
	ms_move = 0 ;
}

TIMER
{
	count = (count + 1) % 360 ;

	// 形状を更新
	n = 0 ;
	loop(16){
		map(0,n) = (sin((n+count)*30) + 2) * hpit ;
		n = n + 1 ;
	}
	// 色を更新
	cr = (sin(count*1)+1)*64 ;
	cg = (sin(count*2)+1)*127 ;
	cb = (sin(count*3)+1)*127 ;

	// 座標データ作成
	call("MakeData") ;

	// 姿勢更新
	Set3DLocalRotateX(1,count*2) ;
	Set3DLocalRotateY(1,count*8) ;
	Set3DLocalRotateZ(1,count) ;

	// 位置更新
	Set3DCenter(SCR_X/2+sin(count*1)*300,SCR_Y/2+sin(count*2)*200,2000) ;

	SelectScreen(0) ;
	FullPaint(0) ;
	Draw3DPack(1) ;
	CopyBMP(0,0,0,SCR_X,SCR_Y,1,0,0,SCR_X,SCR_Y,0) ;
}

// 座標データ作成
MakeData
{
	p = 360 / kaku ;
	x = p / 2 ;

	Clear3DPack(1) ;

	// ふたの部分
	loop(kaku){
		fx1 = -cos(x) * map(0,0) ;
		fz1 = sin(x) * map(0,0) ;
		fx2 = -cos(x+p) * map(0,0) ;
		fz2 = sin(x+p) * map(0,0) ;
		fx3 = 0 ; fz3 = 0 ; fy3 = - vpit * 8 ;

		Add3DPack(1,fx3,fy3+vpit,fz3,fx1,fy3,fz1,fx2,fy3,fz2,cr,cg,cb) ;
		x = x + p ;
	}

	// 胴の部分
	s = 0 ;
	loop(15){
		loop(kaku){
			fx1 = -cos(x) * map(0,s) ;
			fz1 = sin(x) * map(0,s) ;
			fx2 = -cos(x+p) * map(0,s) ;
			fz2 = sin(x+p) * map(0,s) ;
			fy = - vpit * (8-s) ;

			sx1 = -cos(x) * map(0,s+1) ;
			sz1 = sin(x) * map(0,s+1) ;
			sx2 = -cos(x+p) * map(0,s+1) ;
			sz2 = sin(x+p) * map(0,s+1) ;
			sy = - vpit * (7-s) ;

			Add3DPack(1,fx2,fy,fz2,fx1,fy,fz1,sx1,sy,sz1,cr,cg,cb) ;
			Add3DPack(1,fx2,fy,fz2,sx1,sy,sz1,sx2,sy,sz2,cr,cg,cb) ;
			x = x + p ;
		}
		s = s + 1 ;
	}
	// 底の部分
	loop(kaku){
		fx1 = -cos(x) * map(0,15) ;
		fz1 = sin(x) * map(0,15) ;
		fx2 = -cos(x+p) * map(0,15) ;
		fz2 = sin(x+p) * map(0,15) ;
		fx3 = 0 ; fz3 = 0 ; fy3 = vpit * 7 ;

		Add3DPack(1,fx3,fy3-vpit,fz3,fx2,fy3,fz2,fx1,fy3,fz1,cr,cg,cb) ;
		x = x + p ;
	}
}