script_spell CherryBomb
{
	let dir_tex=GetCurrentScriptDirectory~"./ImageData/";
	let tex=[dir_tex~"Tex_Lily.png",
			 dir_tex~"Tex_Shot.png",
			 dir_tex~"Tex_BombEffect.png",
			 dir_tex~"Tex_ChargeEffect.png"];
	let TEX_PLAYER=0;
	let TEX_SHOT=1;
	let TEX_EFFECT=2;
	let TEX_CHARGE=3;
	
	let argument=GetArgument;
	let lockon_pos=[argument[0],argument[1]];
	let bombcount=argument[2]+1;
	let lightmode=argument[3];
	
	@Initialize{MainThread;}
	@Finalize{}
	@MainLoop{yield;}
	
	task MainThread
	{
		SetPlayerInvincibility(240);
		let wt=60;
		SparkEffect(lockon_pos[0],lockon_pos[1],wt+40);
		let l=10;
		loop(l)
		{
			ChargeEffect(40,255,0,255,3);
			loop(wt/l){yield;}
		}
		Bomb;
		task Bomb
		{
			let sx=lockon_pos[0];
			let sy=lockon_pos[1];
			BombEffect(sx,sy,3,9);
			loop(10){yield;}
			loop(6)
			{
				BombEffect(sx+rand(-100,100),sy+rand(-100,100),1.5,3);
				loop(10){yield;}
			}
		}
		let i=0;
		let sp=0;
		loop(120)
		{
			let sx=lockon_pos[0];
			let sy=lockon_pos[1];
			let speed=rand(7,8)-sp;
			let angle=i;
			let way=bombcount*2;
			if(lightmode){way=2;}
			while(angle<i+360)
			{
				CherryObject(sx,sy,speed,angle);
				angle+=360/way;
			}
			let at_base=2000;
			alternative(bombcount)
			case(2){at_base=2400;}
			case(3){at_base=3000;}
			case(4){at_base=4000;}
			case(5){at_base=6000;}
			case(6){at_base=8000;}
			case(7){at_base=10000;}
			case(8){at_base=15000;}
			let atk=(at_base/120)*bombcount;
			SetIntersectionCircle(sx,sy,96,atk,false);
			SetIntersectionCircle(sx,sy,192,0,true);
			i+=rand(0,360);
			sp+=0.05;
			yield;
		}
		local
		{
			let time=216000;
			alternative(bombcount)
			case(1){time=60*10;}
			case(2){time=60*25;}
			case(3){time=60*50;}
			case(4){time=60*120;}
			
			SuperNaturalBorder(time);
		}
		
		loop(120){yield;}
		End;
	}
	
	
	task CherryObject(let sx,let sy,let speed,let angle)
	{
		let wt=120;
		
		let obj=SetObject;
		let alpha=255;
		let scale=3;
		let rotx=0;let roty=0;let rotz=0;
		let vx=rand(-10,10);let vy=rand(-10,10);let vz=rand(-10,10);
		while(!Obj_BeDeleted(obj))
		{
			Obj_SetPosition(obj,sx,sy);
			ObjEffect_SetAngle(obj,rotx,roty,rotz);
			ObjEffect_SetScale(obj,scale,scale);
			ascent(a in 0..4){ObjEffect_SetVertexColor(obj,a,alpha,255,255,255);}
			
			sx+=speed*cos(angle);
			sy+=speed*sin(angle);
			alpha-=255/wt;
			scale-=3/wt;
			rotx+=vx;
			roty+=vy;
			rotz+=vz;
			
			if(alpha<0){Obj_Delete(obj);}
			yield;
		}
		
		function SetObject
		{
			let obj=Obj_Create(OBJ_EFFECT);
			ObjEffect_SetTexture(obj,tex[TEX_SHOT]);
			ObjEffect_SetRenderState(obj,ADD);
			ObjEffect_SetLayer(obj,2);
			Obj_SetPosition(obj,sx,sy);
			ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
			ObjEffect_CreateVertex(obj,4);
			SetRect(obj,32,0,40,16);
			return obj;
		}
	}
	
	task BombEffect(let sx,let sy,let scale,let ave)
	{
		let obj=SetObject;
		let count=0;
		let anime=0;
		let alpha=192;
		while(!Obj_BeDeleted(obj))
		{
			SetRect(obj,0+anime*96,0,96+anime*96,96);
			ObjEffect_SetScale(obj,scale,scale);
			ascent(a in 0..4){ObjEffect_SetVertexColor(obj,a,alpha,255,255,255);}
			count++;
			if(!(count%ave)){anime++;}
			if(anime>15){Obj_Delete(obj);}
			yield;
		}
		
		function SetObject
		{
			let obj=Obj_Create(OBJ_EFFECT);
			ObjEffect_SetTexture(obj,tex[TEX_EFFECT]);
			ObjEffect_SetRenderState(obj,ALPHA);
			ObjEffect_SetLayer(obj,3);
			Obj_SetPosition(obj,sx,sy);
			ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
			ObjEffect_CreateVertex(obj,4);
			return obj;
		}
	}
	
	task SparkEffect(
		let x,
		let y,
		let frame
	){
		loop(frame-20)
		{
			loop(2){SparkLine;}
			yield;
		}
		task SparkLine{
			let obj=Obj_Create(OBJ_LASER);
			let Length=400;
			Obj_SetAngle(obj,rand(0,360));
			ObjShot_SetDelay(obj,20);
			ObjShot_SetGraphic(obj,PURPLE01);
			ObjLaser_SetWidth(obj,rand(5,80));
			ObjLaser_SetSource(obj,false);
			Obj_SetCollisionToPlayer(obj,false);
			let addLength=-Length/20;
			loop(20){
				Length+=addLength;
				ObjLaser_SetLength(obj,Length);
				Obj_SetX(obj,x);
				Obj_SetY(obj,y);
				yield;
			}
			Obj_Delete(obj);
		}
	}
	

	task ChargeEffect(let w,let r,let g,let b,let scale)
	{
		let rot=[rand(0,360),rand(0,360),rand(0,360)];
		
		let smax=scale;
		let alpha=0;
		let obj=SetObject;
		let count=0;
		ObjEffect_SetAngle(obj,rot[0],rot[1],rot[2]);
		ObjEffect_SetRenderState(obj,ALPHA);
		Obj_SetPosition(obj,lockon_pos[0],lockon_pos[1]);
		SetRect(obj,0,0,128,128);
		
		while(scale>0)
		{
			ObjEffect_SetScale(obj,scale,scale);
			ascent(a in 0..4)
			{
				ObjEffect_SetVertexColor(obj,a,alpha,r,g,b);
			}
			if(!(count%2)&&!lightmode){Aura(scale);}
			scale-=smax/w;
			alpha+=255/w;
			count++;
			yield;
		}
		Obj_Delete(obj);
		
		task Aura(let scale)
		{
			let obj=SetObject;
			ObjEffect_SetAngle(obj,rot[0],rot[1],rot[2]);
			ObjEffect_SetRenderState(obj,ADD);
			Obj_SetPosition(obj,lockon_pos[0],lockon_pos[1]);
			SetRect(obj,0,0,128,128);
			let alpha=16;
			while(alpha>0)
			{
				ObjEffect_SetScale(obj,scale,scale);
				ascent(a in 0..4)
				{
					ObjEffect_SetVertexColor(obj,a,alpha,r,g,b);
				}
				alpha-=16/20;
				yield;
			}
			Obj_Delete(obj);
		}
		
		
		function SetObject
		{
			let obj=Obj_Create(OBJ_EFFECT);
			ObjEffect_SetTexture(obj,tex[TEX_CHARGE]);
			ObjEffect_SetLayer(obj,3);
			Obj_SetPosition(obj,lockon_pos[0],lockon_pos[1]);
			ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
			ObjEffect_CreateVertex(obj,4);
			return obj;
		}
	}
	
	
	function SetRect(let obj,let reft,let up,let right,let down)
	{
		let texture_rect=[reft+1,up+1,right-1,down-1];
		let leng_h=texture_rect[2]-texture_rect[0];
		let leng_v=texture_rect[3]-texture_rect[1];
		
		ObjEffect_SetVertexXY(obj,0,-leng_h/2,-leng_v/2);
		ObjEffect_SetVertexXY(obj,1,-leng_h/2, leng_v/2);
		ObjEffect_SetVertexXY(obj,2, leng_h/2,-leng_v/2);
		ObjEffect_SetVertexXY(obj,3, leng_h/2, leng_v/2);
		
		ObjEffect_SetVertexUV(obj,0,texture_rect[0],texture_rect[1]);
		ObjEffect_SetVertexUV(obj,1,texture_rect[0],texture_rect[3]);
		ObjEffect_SetVertexUV(obj,2,texture_rect[2],texture_rect[1]);
		ObjEffect_SetVertexUV(obj,3,texture_rect[2],texture_rect[3]);
	}
}