// IMW版 スクリーンセーバー
// 紅白まんじゅうが踊ります

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



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

// マウスが動いたら終了させる
MOUSEMOVE
{
	// ms_move の値が 10 までは終了させない
	// こうしないといきなり終了してしまう
	ms_move = ms_move + 1 ;
	if(ms_move > 10){ end ; }
}
TIMER
{
	// 描画位置(描画の中心位置)を変更
	Set3DCenter(px,py,2000) ;

	// 回転角を変更
	n = 0 ;
	loop(2){
		Set3DLocalRotateX(n,rx+n) ;
		Set3DLocalRotateY(n,ry+n) ;
		Set3DLocalRotateZ(n,rz+n) ;
		n = n + 1 ;
	}

	// 黒で消去
	FullPaint(0) ;

	// 描画し、表画面にコピー
	Draw3DPack(0) ; Draw3DPack(1) ;
	CopyBMP(0,0,0,SCR_X,SCR_Y,1,0,0,SCR_X,SCR_Y,0) ;

	// 次の描画位置を設定
	px = px + mvx ; py = py + mvy ;

	// スクリーンの縁(100 手前)にきたら進行方向を反転
	if(px > SCR_X-100){ mvx = mvx * (-1) ; }
	if(py > SCR_Y-100){ mvy = mvy * (-1) ; }
	if(px < 100      ){ mvx = mvx * (-1) ; }
	if(py < 100      ){ mvy = mvy * (-1) ; }

	count = count + 1 ;
	// 回転角を再設定
	if(count > 10){
		count = 0 ;
		rx = 5-rand(SEC)%10 ;
		ry = 5-rand(rx)%10 ;
		rz = 5-rand(ry)%10 ;
	}
}
INIT
{
	pn = 0 ; // パック番号
	sx = 0 ; // 軸のズレ幅(X)
	r = 255 ; g = 255 ; b = 255 ; // 色設定
	call("SetData") ; // パック番号0のデータをセット

	pn = 1 ;
	sx = 150 ;
	r = 255 ; g = 200 ; b = 255 ;
	call("SetData") ; // パック番号1のデータをセット

	SelectScreen(0) ; // 描画は常に裏画面なのでここで指定してしまう
}
CREATE
{
	SetWinStyle(4) ;
	SetWinSize(SCR_X,SCR_Y) ;
	SetWinPos(0,0,0) ;
	SetWinColor(0) ;

	SetTimer(20) ;
	SubScreen(SCR_X,SCR_Y) ;
	Data("pos",16,2) ;

	Create3DPack(0,18*16*2) ;
	Create3DPack(1,18*16*2) ;

	px = SCR_X/2 ; py = SCR_Y/2 ; // 描画位置
	rx = 2 ; ry = 3 ; rz = 4 ;    // 回転角
	mvx = 2 ; mvy = 1 ; // 進行方向(+ か -)
	count = 0 ;   // 移動のカウンタ
	ms_move = 0 ; // マウスの移動カウンタ
}

// 3Dパックにデータをセット
SetData
{
	pos(0,0) = 0 ; pos(0,1) = -100 ;
	pos(1,0) = 16 ; pos(1,1) = -98 ;
	pos(2,0) = 32 ; pos(2,1) = -93 ;
	pos(3,0) = 47 ; pos(3,1) = -85 ;
	pos(4,0) = 59 ; pos(4,1) = -74 ;
	pos(5,0) = 69 ; pos(5,1) = -61 ;
	pos(6,0) = 76 ; pos(6,1) = -46 ;
	pos(7,0) = 79 ; pos(7,1) = -30 ;
	pos(8,0) = 79 ; pos(8,1) = -14 ;
	pos(9,0) = 76 ; pos(9,1) = 1 ;
	pos(10,0) = 69 ; pos(10,1) = 7 ;
	pos(11,0) = 59 ; pos(11,1) = 7 ;
	pos(12,0) = 47 ; pos(12,1) = 7 ;
	pos(13,0) = 32 ; pos(13,1) = 7 ;
	pos(14,0) = 16 ; pos(14,1) = 7 ;
	pos(15,0) = 0 ; pos(15,1) = 7 ;

	kaku = 18 ;
	p = 360 / kaku ; x = p / 2 ; s = 0 ;
	loop(16){
		loop(kaku){
			fx1 = -cos(x) * pos(s,0) + sx ;
			fz1 = sin(x) * pos(s,0) ;
			fx2 = -cos(x+p) * pos(s,0) + sx ;
			fz2 = sin(x+p) * pos(s,0) ;
			fy = pos(s,1) ;

			sx1 = -cos(x) * pos((s+1)%16,0) + sx ;
			sz1 = sin(x) * pos((s+1)%16,0) ;
			sx2 = -cos(x+p) * pos((s+1)%16,0) + sx ;
			sz2 = sin(x+p) * pos((s+1)%16,0) ;
			sy = pos((s+1)%16,1) ;

			Add3DPack(pn,fx2,fy,fz2,fx1,fy,fz1,sx1,sy,sz1,r,g,b) ;
			Add3DPack(pn,fx2,fy,fz2,sx1,sy,sz1,sx2,sy,sz2,r,g,b) ;
			x = x + p ;
		}
		s = s + 1 ;
	}
}