//==============================================================================
//	★ 東方弾幕風 エフェクト関数
//	このファイルをinclude_functionで取り込むか、必要な部分をコピペして使用する
//==============================================================================
//	[TASK] 敵を中心に光線が収束するようなエフェクトを表示する
//	※ 使用すると描画色設定がデフォルトに戻る
//	　 （SetColor 及び SetShotColor に 255, 255, 255 が設定される）
//	※ ランダム値を使用しているので@DrawLoop等の描画処理内で使用しないこと
//------------------------------------------------------------------------------
task Spark(
	let frame,		// エフェクト表示フレーム数（30以上）
	let colorR,		// 色：赤成分（0〜255）
	let colorG,		// 色：緑成分（0〜255）
	let colorB,		// 色：青成分（0〜255）
	let con01		// Concentration01を同時発動 true/false
){
	if( con01 ){
		SetColor( colorR, colorG, colorB );
		Concentration01( frame );
		SetColor( 255, 255, 255 );
	}
	let x = 0;
	let y = 0;
	SetLocation();
	loop( frame - 20 ){
		SetShotColor( colorR, colorG, colorB );
		SparkLine();
		SetShotColor( 255, 255, 255 );
		yield;
	}
	task SetLocation{
		loop( frame ){
			x = GetX();
			y = GetY();
			yield;
		}
	}
	task SparkLine{
		let obj = Obj_Create( OBJ_LASER );
		Obj_SetAngle( obj, rand( 0, 360 ) );
		ObjShot_SetDelay( obj, 20 );
		ObjShot_SetGraphic( obj, WHITE01 );
		ObjLaser_SetWidth( obj, rand( 5, 80 ) );
		ObjLaser_SetSource( obj, false );
		Obj_SetAutoDelete( obj, false );
		Obj_SetCollisionToPlayer( obj, false );
		ObjShot_ToItem( obj, false );
		let Length = 400;
		let accLength = - Length / 20;
		loop( 20 ){
			Length += accLength;
			ObjLaser_SetLength( obj, Length );
			Obj_SetPosition( obj, x, y );
			yield;
		}
		Obj_Delete( obj );
	}
}

//------------------------------------------------------------------------------
//	[TASK] ボム発動したとき、バリアを張ってダメージを受け付けなくする
//	※ ボム発動中に残り時間（frame）が切れた場合、その時点でバリアが消滅する
//------------------------------------------------------------------------------
task BombBarrier(
	let frame,		// バリア発動待ちフレーム数（0で無期限）
	let pattern,	// バリアの形（3:三角/4:四角/5:星/6:ダビデ/その他:描画しない）
	let radius,		// バリアの半径
	let accAngle,	// バリアの回転角速度
	let blur,		// バリアの残像時間（1以上）
	let graphic		// バリアの色（弾画像で指定、****01の弾画像推奨）
){
	let x = 0;
	let y = 0;
	let gapAngle = [];
	let angle = [];
	let Length = 0;
	alternative( pattern )
	case( 3 ){
		gapAngle = [ - 90, 30, 150 ];
		angle = [ 60, 180, - 60 ];
		Length = radius * cos( 30 ) * 2;
	}
	case( 4 ){
		gapAngle = [ - 90, 0, 90, 180 ];
		angle = [ 45, 135, - 135, - 45 ];
		Length = radius * cos( 45 ) * 2;
	}
	case( 5 ){
		gapAngle = [ - 90, - 18, 54, 126, - 162 ];
		angle = [ 72, 144, - 144, - 72, 0 ];
		Length = radius * cos( 18 ) * 2;
	}
	case( 6 ){
		gapAngle = [ - 90, - 30, 30, 90, 150, - 150 ];
		angle = [ 60, 120, 180, - 120, - 60, 0 ];
		Length = radius * cos( 30 ) * 2;
	}
	others{ pattern = 0; }
	let onBarrier = true;
	while( frame > 0 ){
		x = GetX();
		y = GetY();
		if( OnBomb() ){
			SetInvincibility( 2 );
			ascent( let i in 0 .. pattern ){
				Barrier( gapAngle[ i ], angle[ i ] );
				gapAngle[ i ] = gapAngle[ i ] + accAngle;
				angle[ i ] = angle[ i ] + accAngle;
			}
		}
		frame --;
		yield;
	}
	onBarrier = false;
	task Barrier( let _gapAngle, let _angle ){
		let obj = Obj_Create( OBJ_LASER );
		let _x = x + radius * cos( _gapAngle );
		let _y = y + radius * sin( _gapAngle );
		Obj_SetPosition( obj, _x, _y );
		Obj_SetAngle( obj, _angle );
		ObjShot_SetGraphic( obj, graphic );
		ObjLaser_SetLength( obj, Length );
		ObjLaser_SetWidth( obj, 10 );
		ObjLaser_SetSource( obj, false );
		Obj_SetAutoDelete( obj, false );
		Obj_SetCollisionToPlayer( obj, false );
		ObjShot_ToItem( obj, false );
		loop( blur ){
			if( !onBarrier ){ break; }
			yield;
		}
		Obj_Delete( obj );
	}
}
