#TouhouDanmakufu[Player]
#ScriptVersion[3]	
#ID["reimu but only homing"]
#Title["reimu but only homing"]
#Text["reimu but only homing [r] By SKN SMR"]
#Image["./Cutin.png"]
#ReplayName["reimu but only homing"]

let objPlayer = GetPlayerObjectID();
let objSlowShot = ID_INVALID;
let current = GetCurrentScriptDirectory();
let enemy;
let focus = false;
let type = 0;
let vx = 5;
let vy = 2.25;
let spelltime = false;
let arr1 = [];
let arr2 = [];
let arr3 = [];
let lwidth = 0;
let lwidthC = 0;
let enemyCount;
let damage_rate_bomb = 1;
let fb_count = 0; // test flashbomb
let EV_FLASHBOMB = EV_USER + 1234;

task EnemyCount{
	loop{
		enemyCount = length(GetIntersectionRegistedEnemyID());
		yield;
	}
}
let s = ObjSound_Create;
@Initialize
{
	SetPlayerSpeed(vx, vy);
	SetPlayerClip(12,12,GetStgFrameWidth-12,GetStgFrameHeight-12);
	SetPlayerDownStateFrame(60);
	SetPlayerRebirthFrame(20);
	let path = current ~ "MarisaShotData.txt";
	LoadPlayerShotData(path); //???????
	ObjPlayer_AddIntersectionCircleA1(objPlayer, 0, 0, 2, 25);
	LoadSound(GetCurrentScriptDirectory~"graze.wav");
	LoadSound(GetCurrentScriptDirectory~"se_shot.wav");
	LoadSound(GetCurrentScriptDirectory~"Eff2.wav");
	LoadSound(GetCurrentScriptDirectory~"Shot6.wav");
	LoadSound(GetCurrentScriptDirectory~"Shot7.wav");
	LoadSound(GetCurrentScriptDirectory~"Shot8.wav");
	LoadSound(GetCurrentScriptDirectory~"Shot9.wav");
	LoadSound(GetCurrentScriptDirectory~"Laser7.wav");
	LoadSound(GetCurrentScriptDirectory~"Charge1.wav");
	LoadSound(GetCurrentScriptDirectory~"Charge2.wav");
	LoadSound(GetCurrentScriptDirectory~"1up.wav");
	LoadSound(GetCurrentScriptDirectory~"item_00.wav");
	LoadSound(GetCurrentScriptDirectory~"SpellCard.wav");
	LoadSound(current~"se_pldead.wav");
	//SetPlayerInvincibilityFrame(99999999999);
	TImage();
	TShot();
	TMagicCircle();
	TMagicCircle2();
	HitBox(1);
	HitBox(-1);
	Orb;
}

@MainLoop
{
	enemy = GetAllEnemyID;
	yield;
}

@FinalizeShot
{
}

@Event
{
	alternative(GetEventType())
	case(EV_REQUEST_SPELL)
	{
		//????????
		let spell = GetPlayerSpell();
		if(spell >= 1)
		{
			SetScriptResult(true);
			SetPlayerSpell(spell-1);
			alternative(type)
			case(0){TSpellRH;}
			case(1){TSpellWE;}
			case(2){TSpellWE;}
			
		}
		else
		{
			SetScriptResult(false);
		}
	}
	case(EV_HIT)
	{
		PlaySE(GetCurrentScriptDirectory~"se_pldead.wav");
		TExplosion();
		TExplosion2();
		ascent(i in 0..30)
		{
		LeafEffect(GetPlayerX,GetPlayerY, rand(2,10), rand(0,360), rand(10,45), 50, 255,64,64);
		}
	}
	case(EV_PLAYER_REBIRTH)
	{
		//??
		SetPlayerSpell(3);
		SetPlayerInvincibilityFrame(180);
		BlinkEffect(180);
		SetCommonData("Life",2);
	}
	case(EV_GET_ITEM)
		{
			let itemType = GetEventArgument(0);
			alternative(itemType)
				case(ITEM_1UP){
					PlaySE(current~"./1up.wav");
					SetPlayerLife(GetPlayerLife);
					WriteLog("ITEM_1UP");
				}
				case(ITEM_1UP_S){
					PlaySE(current~"./1up.wav");
					SetPlayerLife(GetPlayerLife);
					WriteLog("ITEM_1UP_S");
				}
				case(ITEM_SPELL){
					PlaySE(current~"./item_00.wav");
					SetPlayerSpell(GetPlayerSpell);
					WriteLog("ITEM_SPELL");
				}
				case(ITEM_SPELL_S){
					PlaySE(current~"./item_00.wav");
					SetPlayerSpell(GetPlayerSpell);
					WriteLog("ITEM_SPELL_S");
				}
				case(ITEM_POWER){
					PlaySE(current~"./item_00.wav");
					WriteLog("ITEM_POWER");
				}
				case(ITEM_POWER_S){
					PlaySE(current~"./item_00.wav");
					WriteLog("ITEM_POWER_S");
				}
				case(ITEM_POINT){
					PlaySE(current~"./item_00.wav");
					WriteLog("ITEM_POWER");
				}
				case(ITEM_POINT_S){
					PlaySE(current~"./item_00.wav");
					WriteLog("ITEM_POWER_S");
				}
		}
	case(EV_GRAZE)
	{
		if(fb_count<=260){fb_count+=7;}
		PlaySE(GetCurrentScriptDirectory~"graze.wav");
		GrazeEff(objPlayer);
	}
	case(EV_GET_ITEM)
	{
		let itemType = GetEventArgument(0);
	}
	case(EV_FLASHBOMB)
	{
		//if(type==1)
		//{
			//FlashBomb;
		//}
		fb_count = 0;
	}
	
}

task InitFlashBomb
{
	CreateFillingBar;
	CreateEmptyBar;
	task CreateEmptyBar
	{
		let obj=ObjPrim_Create(OBJ_SPRITE_2D); 
		let img;
		img = GetCurrentScriptDirectory~"flash_gauge_00.png";
		ObjPrim_SetTexture(obj,img);
		ObjRender_SetBlendType(obj,BLEND_ALPHA);
		Obj_SetRenderPriority(obj,2);
		ObjRender_SetAlpha(obj,255);
		ObjSprite2D_SetSourceRect(obj,0,0,260,15);
		ObjSprite2D_SetDestCenter(obj);
		ObjRender_SetColor(obj,255,255,255);
		ObjRender_SetAngleZ(obj,-90);
		ObjRender_SetPosition(obj,15,GetStgFrameHeight-115,0);
	}
	task CreateFillingBar
	{
		let obj2=ObjPrim_Create(OBJ_SPRITE_2D); 
		let img2;
		let c = 0;
		img2 = GetCurrentScriptDirectory~"flash_gauge_00.png";
		ObjPrim_SetTexture(obj2,img2);
		ObjSprite2D_SetSourceRect(obj2,0,25,260,39);
		ObjSprite2D_SetDestCenter(obj2);
		ObjRender_SetBlendType(obj2,BLEND_ALPHA);
		Obj_SetRenderPriority(obj2,2);
		ObjRender_SetAlpha(obj2,255);
		ObjRender_SetAngleZ(obj2,-90);
		while(!Obj_IsDeleted(obj2))
		{
			ObjSprite2D_SetSourceRect(obj2,0,25,fb_count,39);
		    ObjSprite2D_SetDestCenter(obj2);
			ObjRender_SetPosition(obj2,15,GetStgFrameHeight+15-fb_count/2,0);
			if(fb_count>=260)
			{
				ObjRender_SetColor(obj2,255,150+105*sin(c*3+180),155+105*sin(c*3+180));
				c++;
			}
			else{ObjRender_SetColor(obj2,255,255,255);}
			yield;
		}
	}
}

task TSpellBlank
{
//SetPlayerInvincibilityFrame(0);
let objManage = GetSpellManageObject();
yield;
Obj_Delete(objManage);
}

task FlashBomb
{
	TExpan(GetPlayerX,GetPlayerY,6,30,255,0,255);
	// do something
}

task GrazeEff(obj){
	let x = ObjMove_GetX(obj);
	let y = ObjMove_GetY(obj);
	//GrazePoint(x,y,atan2(y-GetPlayerY,x-GetPlayerX)+rand(-30,30));
	GrazePoint(x,y,rand(0,360));
}
task GrazePoint(x,y,an){
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjPrim_SetTexture(obj,GetCurrentScriptDirectory~"./graze.png");
	Obj_SetRenderPriorityI(obj,48);
	ObjSprite2D_SetDestRect(obj,0,0,GetStgFrameWidth,GetStgFrameHeight);
	ObjSprite2D_SetSourceRect(obj,0,0,32,32);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetPosition(obj,x,y,1);
	ObjRender_SetScaleXYZ(obj,1,1,1);
	let defang = rand(0,360);
	ObjRender_SetAngleZ(obj,defang);
	ObjRender_SetColor(obj,255,255,64);
	let alpha = 0;
	let alphamax = 200;
	let f = 0;
	let t = 0;
	let mult = rand(-12,12);
	let spd = 3;
	let _spd = spd;
	loop(30){
		if(f<=5){
			alpha+=alphamax/5;
		}
		spd-=_spd/30;
		ObjRender_SetPosition(obj,x,y,1);
		ObjRender_SetAlpha(obj,alpha);
		ObjRender_SetAngleZ(obj,t*mult+defang);
		x+=cos(an)*spd;
		y+=sin(an)*spd;
		f++;
		t++;
		yield;
	}
	f=0;
	loop(30){
		an = atan2(ObjRender_GetY(obj)-GetPlayerY,ObjRender_GetX(obj)-GetPlayerX);
		let dist = GetDistance(ObjRender_GetX(obj),ObjRender_GetY(obj),GetPlayerX,GetPlayerY)/5;
		if(f>10){
			alpha-=alphamax/20;
			x-=cos(an)*dist;
			y-=sin(an)*dist;
		}
		ObjRender_SetPosition(obj,x,y,1);
		ObjRender_SetAlpha(obj,alpha);
		ObjRender_SetAngleZ(obj,t*mult+defang);
		f++;
		t++;
		yield;
	}
	Obj_Delete(obj);
}

task TImage
{
	let f = 0;
	let f2 = 0;
	let px = 32;
	let py = 48;
	let path = GetCurrentScriptDirectory() ~ "pl00.png";
	ObjPrim_SetTexture(objPlayer, path);
	Obj_SetRenderPriorityI(objPlayer,45);
	ObjRender_SetScaleXYZ(objPlayer,1.1,1.1,0);
	loop
	{
		
		if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || GetVirtualKeyState(VK_LEFT) == KEY_HOLD)
		{
			if(f2<1){ObjSprite2D_SetSourceRect(objPlayer, 0, py, px, py*2);}
			if(f2>=1&& f2<=2){ObjSprite2D_SetSourceRect(objPlayer, px, py, px*2, py*2);}
			if(f2>=2 && f2<=3){ObjSprite2D_SetSourceRect(objPlayer, px*2, py, px*3, py*2);}
			if(f2>=3 && f2<=4){ObjSprite2D_SetSourceRect(objPlayer, px*3, py, px*4, py*2);}
			if(f2>=4 && f2<=10){ObjSprite2D_SetSourceRect(objPlayer, px*4, py, px*5, py*2);}
			if(f2>=10&& f2<=16){ObjSprite2D_SetSourceRect(objPlayer, px*5, py, px*6, py*2);}
			if(f2>=16 && f2<=22){ObjSprite2D_SetSourceRect(objPlayer, px*6, py, px*7, py*2);}
			if(f2>=22){ObjSprite2D_SetSourceRect(objPlayer, px*7,py, px*8, py*2);}
			if(f2>=28){f2=12;}
			f2++;
		}
		else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || GetVirtualKeyState(VK_RIGHT) == KEY_HOLD)
		{
			if(f2<1){ObjSprite2D_SetSourceRect(objPlayer, 0, py*2, px, py*3);}
			if(f2>=1&& f2<=2){ObjSprite2D_SetSourceRect(objPlayer, px, py*2, px*2, py*3);}
			if(f2>=2 && f2<=3){ObjSprite2D_SetSourceRect(objPlayer, px*2, py*2, px*3, py*3);}
			if(f2>=3 && f2<=4){ObjSprite2D_SetSourceRect(objPlayer, px*3, py*2, px*4, py*3);}
			if(f2>=4 && f2<=10){ObjSprite2D_SetSourceRect(objPlayer, px*4, py*2, px*5, py*3);}
			if(f2>=10 && f2<=16){ObjSprite2D_SetSourceRect(objPlayer, px*5, py*2, px*6, py*3);}
			if(f2>=16 && f2<=22){ObjSprite2D_SetSourceRect(objPlayer, px*6, py*2, px*7, py*3);}
			if(f2>=22){ObjSprite2D_SetSourceRect(objPlayer, px*7, py*2, px*8, py*3);}
			if(f2>=28){f2=12;}
			f2++;
		}
		else
		{
			if(f<6){ObjSprite2D_SetSourceRect(objPlayer, 0, 1, px, 48);}
			if(f>=6&& f<=12){ObjSprite2D_SetSourceRect(objPlayer, px, 1, px*2, 48);}
			if(f>=12 && f<=18){ObjSprite2D_SetSourceRect(objPlayer, px*2, 1, px*3, 48);}
			if(f>=18 && f<=24){ObjSprite2D_SetSourceRect(objPlayer, px*3, 1, px*4, 48);}
			if(f>=24 && f<=30){ObjSprite2D_SetSourceRect(objPlayer, px*4, 1, px*5, 48);}
			if(f>=30 && f<=36){ObjSprite2D_SetSourceRect(objPlayer, px*5, 1, px*6, 48);}
			if(f>=36 && f<=42){ObjSprite2D_SetSourceRect(objPlayer, px*6, 1, px*7, 48);}
			if(f>=42){ObjSprite2D_SetSourceRect(objPlayer, px*7, 1, px*8, 48);}
			if(f>=48){f=0;}
			f++;
			f2 = 0;
		}
		ObjSprite2D_SetDestCenter(objPlayer);
		yield;
	}

}

task BlinkEffect(time){
	
	ascent(i in 0..time){
		
		if(i % 2 == 0){
			ObjRender_SetColor(objPlayer, 0, 0, 255);
			
			if(i % 4 == 0){
				ObjRender_SetColor(objPlayer, 255, 255, 255);
			}
		}
		
		yield;
	}
	
	ObjRender_SetColor(objPlayer, 255, 255, 255);
}

task Orb
{
	ascent(i in 0..4)
	{
		arr1 = arr1 ~ [CreateTool];
		Orb1(arr1[i],i);
	}
	ascent(i in 0..2)
	{
		arr2 = arr2 ~ [CreateTool];
		Orb2(arr2[i],i);
	}

	
	task Orb1(obj,num)
	{
		let ufco = [[-15,35],[-45,25],[45,25],[15,35],[65,0],[-65,0]];
		let fco = [[-8,-30],[-8,-20],[8,-20],[8,-30],[30,-35],[-30,-35]];
		let way = [1,1,1,1];
		let time = 3;
		let x;
		let y;
		let count = 0;
		let f = 0;
		let px = 16;
	    let py = 186;
	    let py2 = 198;
		ObjRender_SetAlpha(obj,192);
		ObjSprite2D_SetSourceRect(obj,0,142,16,158);
		ObjSprite2D_SetDestCenter(obj);
		ObjRender_SetPosition(obj,GetPlayerX,GetPlayerY,0);
		AfterOrb(obj,31,142,48,158,0);
		while(!Obj_IsDeleted(obj))
		{
		if(GetPlayerState==STATE_DOWN || type!=0){Obj_SetVisible(obj,false);}
		else{Obj_SetVisible(obj,true);}
		
		
			let ox = ObjRender_GetX(obj);
			let oy = ObjRender_GetY(obj);
			if(focus==false)
			{
				x = ufco[num][0];
				y = ufco[num][1];
				ObjSprite2D_SetSourceRect(obj,0,142,16,158);
				
			}
			else 
			{
				x = fco[num][0];
				y = fco[num][1];
				ObjSprite2D_SetSourceRect(obj,16,142,32,158);
				
			}
			let xc = (GetPlayerX+x-ox)/time;
			let yc = (GetPlayerY+y-oy)/time;
			if(GetPlayerState==STATE_DOWN)
			{
				xc = (192+x-ox)/time;
				yc = (478+y-oy)/time;
			}
			ox += xc;
			oy += yc;
			ObjRender_SetPosition(obj,ox,oy,0);
			ObjRender_SetAngleXYZ(obj,0,0,count*10);
			ObjRender_SetScaleXYZ(obj,1,1,0);
			count++;
			yield;
		}
	}
	
	task Orb2(obj,num)
	{
		let ufco = [[35,0],[-35,0],[45,25],[15,35],[65,0],[-65,0]];
		let fco = [[25,0],[-25,0],[45,-45],[45,45],[20,0],[-20,0]];
		let way = [1,1,1,1];
		let time = 5;
		let x;
		let y;
		let count = 0;
		let f = 0;
		let px = 16;
	    let py = 186;
	    let py2 = 198;
		ObjRender_SetAlpha(obj,192);
		ObjSprite2D_SetSourceRect(obj,32,142,48,158);
		ObjSprite2D_SetDestCenter(obj);
		ObjRender_SetPosition(obj,GetPlayerX,GetPlayerY,0);
		AfterOrb(obj,32,142,48,158,1);
		while(!Obj_IsDeleted(obj))
		{
		if(GetPlayerState==STATE_DOWN || type!=0){Obj_SetVisible(obj,false);}
		else{Obj_SetVisible(obj,true);}
		
		
			let ox = ObjRender_GetX(obj);
			let oy = ObjRender_GetY(obj);
			if(focus==false)
			{
				x = ufco[num][0];
				y = ufco[num][1];
				
			}
			else 
			{
				x = fco[num][0];
				y = fco[num][1];
				
			}
			let xc = (GetPlayerX+x-ox)/time;
			let yc = (GetPlayerY+y-oy)/time;
			if(GetPlayerState==STATE_DOWN)
			{
				xc = (GetStgFrameWidth/2+x-ox)/time;
				yc = (478+y-oy)/time;
			}
			ox += xc;
			oy += yc;
			ObjRender_SetPosition(obj,ox,oy,0);
			ObjRender_SetAngleXYZ(obj,0,0,count*10);
			ObjRender_SetScaleXYZ(obj,1,1,0);
			count++;
			yield;
		}
	}
	
	task AfterOrb(mobj,r1,r2,r3,r4,ftype)
		{
			let obj= ObjPrim_Create(OBJ_SPRITE_2D); // graphic
			let img = GetCurrentScriptDirectory~"pl00.png";
			let scale = 1.5;
                        let count = 0;
			let fcolor = [0,0,0];
			ObjPrim_SetTexture(obj,img);
			
			ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
			ObjSprite2D_SetSourceRect(obj,r1,r2,r3,r4);
			ObjSprite2D_SetDestCenter(obj);
			Obj_SetRenderPriorityI(obj,42);
			let f = 0;
			let px = 16;
			let py = 186;
			let py2 = 198;
			
			while(!Obj_IsDeleted(mobj))
			{
				if(ftype==0 && focus==false){fcolor = [64,64,228];}
				if(ftype==0 && focus==true){fcolor = [255,64,64];}
				if(ftype==1){fcolor = [255,64,255];}
				
				

			f+=1;
				
				ObjRender_SetPosition(obj,ObjRender_GetX(mobj),ObjRender_GetY(mobj),0);
                                ObjRender_SetScaleXYZ(obj,1.4,1.4,0);
                               ObjRender_SetAngleXYZ(obj,0,0,count*-10);
	                	       ObjRender_SetAlpha(obj,192);
                                count++;
				if(GetPlayerState!=STATE_DOWN)
				{
				Obj_SetVisible(obj,true);
				}
				else {Obj_SetVisible(obj,false);}
				ObjRender_SetColor(obj,fcolor[0],fcolor[1],fcolor[2]);
				yield;
			}
		}
	
}

function CreateTool
{
		let obj=ObjPrim_Create(OBJ_SPRITE_2D); 
		let img = GetCurrentScriptDirectory~"pl00.png";
		ObjPrim_SetTexture(obj,img);
		ObjRender_SetBlendType(obj,BLEND_ALPHA);
		Obj_SetRenderPriorityI(obj,43);
		return obj;
}

task TShot
{
	let shotCount = -1;
	let bNextShot = false;
	let objShot = ID_INVALID;
	let shotnum = 0;
	AddVirtualKey(VK_USER1,KEY_C,KEY_INVALID);
	LoadSound(GetCurrentScriptDirectory~"Shot9.wav");
	loop
	{
		if(GetVirtualKeyState(VK_USER1)==KEY_PUSH && spelltime == false)
		{
			
			type = (type+1)%1;
			/*PlaySound("Shot9",100,0);
			ExCircle(GetPlayerX,GetPlayerY,0.07,60);
			loop(2){yield;}
            ExCircle(GetPlayerX,GetPlayerY,0.07,60-2);
			if(type==0){TCharge01(GetPlayerX,GetPlayerY,2,30,256,0,256);}
			if(type==1){TCharge01(GetPlayerX,GetPlayerY,2,30,0,0,256);}
			if(type==2){TCharge01(GetPlayerX,GetPlayerY,2,30,256,256,0);}*/
			
		}
		if((GetVirtualKeyState(VK_SHOT)==KEY_PUSH || GetVirtualKeyState(VK_SHOT)==KEY_HOLD || bNextShot==true) && shotCount==-1)
		{
			shotCount = 0;
			bNextShot = false;
		}
		if(GetVirtualKeyState(VK_SHOT)==KEY_FREE)
		{
			if(lwidth>0){lwidth--;}
			if(lwidthC>0){lwidthC--;}
		}
		/*if(GetKeyState(KEY_X)==KEY_PUSH && GetVirtualKeyState(VK_SLOWMOVE)==KEY_FREE && GetPlayerState == STATE_NORMAL)
		{
			if(fb_count>=260)
			{
				NotifyEventAll(EV_FLASHBOMB,0);
			}
		}*/
		if(GetVirtualKeyState(VK_SHOT)==KEY_HOLD && shotCount>0)
		{
			bNextShot = true;
		}
		if(GetVirtualKeyState(VK_SLOWMOVE)==KEY_PUSH || GetVirtualKeyState(VK_SLOWMOVE)==KEY_HOLD && GetPlayerState == STATE_NORMAL && IsPermitPlayerShot && !IsPlayerSpellActive)
		{
			focus = true;
			
		}
		else if(GetPlayerState == STATE_NORMAL && IsPermitPlayerShot && !IsPlayerSpellActive)
		{
			focus = false;
			Obj_Delete(objSlowShot);
		}
		
		if(shotCount%3==0 && GetPlayerState==STATE_NORMAL && IsPermitPlayerShot && !IsPlayerSpellActive)
		{
				if(type==0)
				{
					PlaySound("se_shot",68,0);
					let dir = [270,270,270,270];;
					let t = 0;
					ReimuVanillaBullet(GetPlayerX-12,GetPlayerY+10,25,270,5,1);
					ReimuVanillaBullet(GetPlayerX+12,GetPlayerY+10,25,270,5,1);
					if(focus == true) {dir = [270,270,270,270];}
					if(shotnum%4==0)
					{
					SAKURAAAS(ObjRender_GetX(arr2[0]),ObjRender_GetY(arr2[0]),35,275,3,1);
					SAKURAAAS(ObjRender_GetX(arr2[1]),ObjRender_GetY(arr2[1]),35,265,3,1);
					}
					if(focus == false)
					{
					if(shotnum%2==0)
					{
					smolH(ObjRender_GetX(arr1[0]),ObjRender_GetY(arr1[0]),35,265,1.5,1);
					smolH(ObjRender_GetX(arr1[1]),ObjRender_GetY(arr1[1]),35,255,1.5,1);
					smolH(ObjRender_GetX(arr1[2]),ObjRender_GetY(arr1[2]),35,285,1.5,1);
					smolH(ObjRender_GetX(arr1[3]),ObjRender_GetY(arr1[3]),35,275,1.5,1);
					}
					}
					if(focus == true)
					{
					if(shotnum%6==0)
					{
					BigH(GetPlayerX,GetPlayerY-20,35,250,4,1);
					BigH(GetPlayerX,GetPlayerY-20,35,290,4,1);
					}
					if(shotnum%6==3)
					{
					BigH(GetPlayerX,GetPlayerY-20,35,280,4,1);
					BigH(GetPlayerX,GetPlayerY-20,35,260,4,1);
					}
					}
					t++;
					shotnum++;
				}
				
		}

		if(shotCount >= 0)
		{
			shotCount++;
		}
		if(shotCount == 15)
		{
			shotCount=-1;
		}
		yield;
	}
}

task HitBox(type){
		let obj=ObjPrim_Create(OBJ_SPRITE_2D); 
		let img = GetCurrentScriptDirectory~"eff2.png";
		let c = 0;
		let alpha = 0;
		let scale = 1.5;
		let scalepl = 1.1;
		ObjPrim_SetTexture(obj,img);
		ObjSprite2D_SetSourceRect(obj,0,15,63,80);
		ObjSprite2D_SetDestCenter(obj);
		ObjRender_SetBlendType(obj,BLEND_ALPHA);
		while(!Obj_IsDeleted(obj))
		{
			ObjRender_SetPosition(obj,GetPlayerX,GetPlayerY,0);
			ObjRender_SetAlpha(obj,alpha);
			ObjRender_SetAngleZ(obj,c);
			ObjRender_SetScaleXYZ(obj,scale,scale,0);
			c+=3*type;
			if(GetVirtualKeyState(VK_SLOWMOVE)==KEY_HOLD)
			{
				if(scale>1){scale-=0.1;c+=3*type}
				if(alpha<250){alpha+=30;}
			}
			if(GetVirtualKeyState(VK_SLOWMOVE)==KEY_FREE)
			{
				if(scale<2){scale+=0.1;c+=3*type}
				if(alpha>0){alpha-=30;}
			}
			if(GetPlayerState != STATE_NORMAL){alpha=0;}
			yield;
		}
	}
	
task ReimuVanillaBullet(x,y,spd,dir,dmg,pdmg)
{
	let shotcolor = 1;
	let mx;
	let my;
	let mangle;
	let t = 0;
	let t2 = 1;
	let finalpos = 0;
	let mainobj = CreatePlayerShotA1(x,y,spd,dir,dmg,pdmg,shotcolor);
	ObjRender_SetAngleZ(mainobj, -90);
    Obj_SetRenderPriorityI(mainobj,42);
	let count = 0;
	while(!Obj_IsDeleted(mainobj))
	{
		mx = ObjMove_GetX(mainobj);
		my = ObjMove_GetY(mainobj);
		mangle = ObjMove_GetAngle(mainobj);
		t++;
		yield;
	}
	let obj2 = CreatePlayerShotA1(mx,my-8,10,mangle,0,10^10,2);
		
		ObjMove_SetAcceleration(obj2,-10/15);
		let alpha = 192;
		ObjMove_SetMaxSpeed(obj2,0);
		ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
		let alphaM = 192;
		alpha = alphaM;	
		let angleZ = 0;
		let oa = rand(-(t%8-3.5)*5,(t%8-3.5)*5);
		let dirs = mangle;
		ascent(i in 0..2)
		{
		opef(mx,my,mangle+rand(-1,1)*20,255,255,255);
		}
		loop(15)
			{
			alpha-=alphaM/15;
			angleZ+=20;
			ObjRender_SetAngleZ(obj2,-90);
			ObjRender_SetAlpha(obj2,alpha);
			ObjRender_SetScaleXYZ(obj2,1.2,1.2,0);
			t2+=0.1;
			yield;
			}
		Obj_Delete(obj2);
	Obj_Delete(mainobj);
}

task SAKURAAAS(x,y,spd,dir,dmg,pdmg)
{
	let shotcolor = 3;
	let mx;
	let my;
	let mangle;
	let t = 0;
	let t2 = 1;
	let finalpos = 0;
	let mainobj = CreatePlayerShotA1(x,y,spd,dir,dmg,pdmg,shotcolor);
	ObjRender_SetAngleZ(mainobj, -90);
    Obj_SetRenderPriorityI(mainobj,42);
	let count = 0;
	let spdd = 0;
	Homing(mainobj,FindTarget,2,2.75,2000,20);
	while(!Obj_IsDeleted(mainobj))
	{
		mx = ObjMove_GetX(mainobj);
		my = ObjMove_GetY(mainobj);
		mangle = ObjMove_GetAngle(mainobj);
		ObjMove_SetSpeed(mainobj,spdd);
		spdd+=0.3;

		if(t<20)
		{
		ObjMove_SetAngle(mainobj,dir);
		}
		if(t>20)
		{
		ObjMove_SetAngle(mainobj,mangle);
		}
		t++;
		yield;
	}
	let obj2 = CreatePlayerShotA1(mx,my,3,mangle,0,10^10,4);
		
		ObjMove_SetAcceleration(obj2,-3/15);
		let alpha = 192;
		ObjMove_SetMaxSpeed(obj2,0);
		ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
		let alphaM = 192;
		alpha = alphaM;	
		let angleZ = 0;
		let oa = rand(-(t%8-3.5)*5,(t%8-3.5)*5);
		let dirs = mangle;
		loop(32)
			{
			alpha-=alphaM/32;
			angleZ+=20;
			ObjRender_SetAngleZ(obj2,-90);
			ObjRender_SetAlpha(obj2,alpha);
			ObjRender_SetScaleXYZ(obj2,t2,t2,0);
			t2+=0.02;
			yield;
			}
		Obj_Delete(obj2);
	Obj_Delete(mainobj);
}

task smolH(x,y,spd,dir,dmg,pdmg)
{
	let shotcolor = 5;
	let mx;
	let my;
	let mangle;
	let t = 0;
	let t2 = 1;
	let finalpos = 0;
	let mainobj = CreatePlayerShotA1(x,y,spd,dir,dmg,pdmg,shotcolor);
	ObjRender_SetAngleZ(mainobj, -90);
    Obj_SetRenderPriorityI(mainobj,42);
	let count = 0;
	let spdd = 0;
	Homing(mainobj,FindTarget,2,0.75,50,2);
	while(!Obj_IsDeleted(mainobj))
	{
		mx = ObjMove_GetX(mainobj);
		my = ObjMove_GetY(mainobj);
		mangle = ObjMove_GetAngle(mainobj);
		ObjMove_SetSpeed(mainobj,2+spdd);
		spdd+=0.2;
		t++;
		yield;
	}
	let obj2 = CreatePlayerShotA1(mx,my,5,mangle,0,10^10,6);
		
		ObjMove_SetAcceleration(obj2,-5/15);
		let alpha = 192;
		ObjMove_SetMaxSpeed(obj2,0);
		ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
		let alphaM = 192;
		alpha = alphaM;	
		let angleZ = 0;
		let oa = rand(-(t%8-3.5)*5,(t%8-3.5)*5);
		let dirs = mangle;
		loop(16)
			{
			alpha-=alphaM/16;
			angleZ+=15;
			ObjRender_SetAngleZ(obj2,-90+angleZ);
			ObjRender_SetAlpha(obj2,alpha);
			ObjRender_SetScaleXYZ(obj2,t2,t2,0);
			t2+=0.1;
			yield;
			}
		Obj_Delete(obj2);
	Obj_Delete(mainobj);
}
	
task BigH(x,y,spd,dir,dmg,pdmg)
{
	let shotcolor = 7;
	let mx;
	let my;
	let mangle;
	let t = 0;
	let t2 = 1;
	let finalpos = 0;
	let mainobj = CreatePlayerShotA1(x,y,spd,dir,dmg,pdmg,shotcolor);
	ObjRender_SetAngleZ(mainobj, -90);
    Obj_SetRenderPriorityI(mainobj,42);
	let count = 0;
	let spdd = 0;
	Homing(mainobj,FindTarget,2,0.75,50,20);
	while(!Obj_IsDeleted(mainobj))
	{
		mx = ObjMove_GetX(mainobj);
		my = ObjMove_GetY(mainobj);
		mangle = ObjMove_GetAngle(mainobj);
		ObjMove_SetSpeed(mainobj,spdd);
		ObjRender_SetAngleZ(mainobj,-90+t*10);
		if(spdd<15)
		{
		spdd+=0.3;
		}
		t++;
		yield;
	}
	let obj2 = CreatePlayerShotA1(mx,my,5,mangle,0,10^10,8);
		
		ObjMove_SetAcceleration(obj2,-5/15);
		let alpha = 192;
		ObjMove_SetMaxSpeed(obj2,0);
		ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
		let alphaM = 192;
		alpha = alphaM;	
		let angleZ = 0;
		let oa = rand(-(t%8-3.5)*5,(t%8-3.5)*5);
		let dirs = mangle;
		loop(16)
			{
			alpha-=alphaM/16;
			angleZ+=15;
			ObjRender_SetAngleZ(obj2,-90+angleZ);
			ObjRender_SetAlpha(obj2,alpha);
			ObjRender_SetScaleXYZ(obj2,t2,t2,0);
			t2+=0.05;
			yield;
			}
		Obj_Delete(obj2);
	Obj_Delete(mainobj);
}
	
task opef(x,y,angle,r,g,b)
{
let obj2 = CreatePlayerShotA1(x,y,10,angle,0,10^10,5);
		
		ObjMove_SetAcceleration(obj2,-10/15);
		let alpha = 192;
		ObjMove_SetMaxSpeed(obj2,4.5);
		ObjRender_SetBlendType(obj2,BLEND_ADD_ARGB);
		let alphaM = 192;
		alpha = alphaM;	
		let angleZ = 0;
		let t = 0.22;
		let oa = rand(-(t%8-3.5)*5,(t%8-3.5)*5);
		let dirs = rand(0,360);
		
		loop(25)
			{
			alpha-=alphaM/25;
			angleZ+=14;
			ObjRender_SetAngleZ(obj2,dirs+angleZ);
			ObjRender_SetAlpha(obj2,alpha);
			ObjRender_SetScaleXYZ(obj2,t,t,0);
			ObjRender_SetColor(obj2,r,g,b);
			//t-=0.05;
			yield;
			}
		Obj_Delete(obj2);
		}

let pfPlayerCutInDpellNameDeleted = true;
let pfPlayerCutInSpellNameGhostDeleted = true;
let pfPlayerCuIinameEffectDeleted = true;
let pfPlayerCutInSpellName;
let pfPlayerCutInSpellNameGhost;
let pfPlayerCutInNameEffect;
	
task Seal(px,py,dir)
	{
		let shot = CreatePlayerShotA1(px,py,0,dir,0,1,2);
		let spell = ObjSpell_Create;
		ObjSpell_Regist(spell);
		ObjSpell_SetDamage(spell,10);
		ObjMove_SetAcceleration(shot,0.25);
		ObjMove_SetMaxSpeed(shot,20);
		Obj_SetVisible(shot,false);
		
		FantasyBall(0,BLEND_ADD_ARGB,128,128,128,1,true);
		FantasyBall(90,BLEND_ADD_ARGB,255,0,0,-1,true);
		//FantasyBall(180,BLEND_ADD_ARGB,0,255,0,1,true);
		FantasyBall(270,BLEND_ADD_ARGB,0,0,255,-1,true);
		
		FantasyBall(rand(1,360),BLEND_ADD_ARGB,128,128,128,1,false);
		FantasyBall(rand(1,360),BLEND_ADD_ARGB,255,0,0,-1,false);
		//FantasyBall(rand(1,360),BLEND_ADD_ARGB,0,255,0,1,false);
		FantasyBall(rand(1,360),BLEND_ADD_ARGB,0,0,255,-1,false);
		wait(30);
		Homing(shot,FindTarget,2,1.5,20,0);

task FantasyBall(angle,bType,r,g,b,type,show)
		{
			
			let ball = ObjPrim_Create(OBJ_SPRITE_2D);
			let scale = 0.2;
			let count = 0;
			let t = 0;
			let sx;
			let sy;
			let img = GetCurrentScriptDirectory~"seal.png";
			ObjPrim_SetTexture(ball,img);
			ObjRender_SetPosition(ball,GetPlayerX,GetPlayerY,0);
			ObjSprite2D_SetSourceRect(ball,0,0,128,128);
			ObjSprite2D_SetDestCenter(ball);
			if(bType==BLEND_ADD_ARGB){Obj_SetRenderPriorityI(ball,24);}
			else{Obj_SetRenderPriorityI(ball,23);}
			ObjRender_SetBlendType(ball,bType);
			ObjRender_SetAlpha(ball,255);
			ObjRender_SetColor(ball,r,g,b);
			if(show==false)
			{
				Obj_SetVisible(ball,false);
			}
			while(!Obj_IsDeleted(ball) && !Obj_IsDeleted(shot) && count/11 < 220)
			{
				sx = ObjMove_GetX(shot);
				sy = ObjMove_GetY(shot);
				//ObjMove_SetAngularVelocity(shot,5);
				if(angle==0)
				{
					//DeleteShotInCircle(TYPE_SHOT,TYPE_ITEM,sx,sy,70);
					ObjSpell_SetIntersectionCircle(spell,sx,sy,70);
				}
				if(t%2==0)
				{
				PlantEffect( sx+rand(-1,1)*scale*10,sy+rand(-1,1)*scale*10, rand(0,360), scale, 192, [rand(0,255),0,rand(0,255)] );
				}
				ObjRender_SetPosition(ball,sx+4*cos(angle+count*type),sy+4*sin(angle+count*type),0);
				ObjRender_SetScaleXYZ(ball,scale,scale,0);
				ObjRender_SetAngleZ(ball,t*10);
				if(scale<1.2){scale+=0.02;}
				count+= 1;
				t+= 1;
				yield;
			}
			if(sx>0 && sy>0 && sx<GetStgFrameWidth && sy<GetStgFrameHeight || count/50 >=1000)
			{
				Obj_SetVisible(ball,true);
				if(angle==0)
				{
					ExplosionDamage;
					PlaySound("Shot4",80,0);
					let co = returnColor(trunc(rand(1,6)));
					TExpanS(sx,sy,20,30,co[0],0,co[2]);
					PlantEffect( sx+rand(-1,1)*scale*10,sy+rand(-1,1)*scale*10, rand(0,360), scale, 192, [rand(0,255),rand(0,255),rand(0,255)] );
					ScreenShake(10);
				}
				let l_angle = angle+count;
				let s_ratio = scale/45;
				let maxD = rand(60,150);
				ascent(i in 0..45)
				{
					ObjRender_SetPosition(ball,sx+maxD*sin(i*2)*cos(l_angle),sy+maxD*sin(i*2)*sin(l_angle),0);
					ObjRender_SetScaleXYZ(ball,scale,scale,0);
					ObjRender_SetAngleZ(ball,rand(0,360));
					PlantEffect( sx+rand(-1,1)*scale*70,sy+rand(-1,1)*scale*70, rand(0,360), scale, 192, [rand(0,255),rand(0,255),rand(0,255)] );
					scale -= s_ratio;
					yield;
				}
				task ExplosionDamage
				{
					let s_spell = ObjSpell_Create;
					ObjSpell_Regist(s_spell);
					loop(30)
					{
						//DeleteShotInCircle(TYPE_SHOT,TYPE_ITEM,sx,sy,100);
						ObjSpell_SetDamage(s_spell,5);
						ObjSpell_SetIntersectionCircle(s_spell,sx,sy,100);
						yield;
					}
					Obj_Delete(s_spell);
				}
			}
			Obj_Delete(ball);
			Obj_Delete(spell);
		}
		}
	
task TSpellRH
{
	PlaySound("Slash",85,0);
	PlaySound("Laser7",85,0);
	spelltime = true;
	SetPlayerInvincibilityFrame(300);
	BlinkEffect(300);
	let objManage = GetSpellManageObject();
	let s_angle = 70;
	GraphicW;
	ascent(i in 0..15)
	{
		Seal(GetPlayerX,GetPlayerY,270+s_angle);
		wait(7);
		Seal(GetPlayerX,GetPlayerY,270-s_angle);
		wait(7);
		s_angle += 50;
	}
	wait(120);
	spelltime = false;
	Obj_Delete(objManage);
	task GraphicW
	{
		let spellgraphic= ObjPrim_Create(OBJ_SPRITE_2D);
		let scale = 0;
		let speed = 0.3;
		let acc = 0.01;
		let cl = 0;
		let r = 55;
        let g = 55;
        let b = 55;
		let img = GetCurrentScriptDirectory~"bright.png";
		ObjPrim_SetTexture(spellgraphic,img);
		ObjRender_SetPosition(spellgraphic,GetPlayerX,GetPlayerY,0);
		ObjSprite2D_SetSourceRect(spellgraphic,0,0,64,64);
		ObjSprite2D_SetDestCenter(spellgraphic);
		ObjRender_SetBlendType(spellgraphic,BLEND_SUBTRACT);
		Obj_SetRenderPriorityI(spellgraphic,23);
		ascent(i in 0..205)
		{
		    r = 40+25*cos(cl);
		    g = 40+25*cos(cl-360/3);
		    b = 40+25*cos(cl+360/3);
			ObjRender_SetPosition(spellgraphic,GetPlayerX,GetPlayerY,0);
			ObjRender_SetColor(spellgraphic,cl,cl,cl);
			ObjRender_SetScaleXYZ(spellgraphic,scale,scale,0);
			ObjRender_SetAlpha(spellgraphic,cl);
			if(scale<80){scale+=5;}
			speed += acc;
			acc+=0.005;
			if(cl<100){
			cl+=5;
			}
			yield;
		}
		let scaleratio = scale/20;
		while(scale>0)
		{
			scale-=scaleratio;
			//ObjRender_SetScaleXYZ(spellgraphic,scale,scale,0);
			ObjRender_SetAlpha(spellgraphic,scale);
			yield;
		}
		Obj_Delete(spellgraphic);
	}
	
}

function returnColor(type)
	{
		if(type==0) {return [255,255,255];}
		if(type==1) {return [255,0,0];}
		if(type==2) {return [0,255,0];}
		if(type==3) {return [0,0,255];}
		if(type==4) {return [255,128,0];}
		if(type==5) {return [255,0,255];}
	}
	
	function getTargetAngle(sig)
	{
		let h_obj;
		if(FindTarget!=-1)
		{
			h_obj = FindTarget;
			return GetAtanAngle(GetPlayerObjectID,h_obj)+sig;
		}
		else
		{
			return rand(260,280);
		}
		
	}

task TSpellWE
{
		let img = GetCurrentScriptDirectory() ~ "Sht.png";
		LoadTexture(img);
		spelltime = true;
		let objManage = GetSpellManageObject();
		SetPlayerInvincibilityFrame(400);
		PlaySE(GetCurrentScriptDirectory~"Laser7.wav");
		/*CircleEff(GetPlayerX,GetPlayerY,1.5);
		CircleEff(GetPlayerX,GetPlayerY,1);
		CircleEff(GetPlayerX,GetPlayerY,0.5);
		TCharge01(GetPlayerX,GetPlayerY,3,30,255,128,0);*/
		//wait(40);
		GraphicW;
		GraphicWSpecl;
		ScreenShake(340);
		ascent(n in 0..55){
		SetPlayerSpeed(vx/5,vy/5);
		PlaySE(GetCurrentScriptDirectory~"Shot6.wav");
		ascent(i in 0..3){
		RealSpell(GetPlayerX+(0+i*30)*sin(n*30),3);
		RealSpell(GetPlayerX+(0+i*30)*sin(-n*30),3);
		}
		wait(5);
		}
		SetPlayerSpeed(vx,vy);
		wait(30);
		spelltime = false;
		Obj_Delete(objManage);
		
		task GraphicW
	{
		let spellgraphic= ObjPrim_Create(OBJ_SPRITE_2D);
		let scale = 0;
		let speed = 0.3;
		let acc = 0.01;
		let cl = 0;
		let r = 55;
        let g = 55;
        let b = 55;
		let img = GetCurrentScriptDirectory~"bright.png";
		ObjPrim_SetTexture(spellgraphic,img);
		ObjRender_SetPosition(spellgraphic,GetPlayerX,GetPlayerY,0);
		ObjSprite2D_SetSourceRect(spellgraphic,0,0,64,64);
		ObjSprite2D_SetDestCenter(spellgraphic);
		ObjRender_SetBlendType(spellgraphic,BLEND_SUBTRACT);
		Obj_SetRenderPriorityI(spellgraphic,23);
		ascent(i in 0..330)
		{
		    r = 40+25*cos(cl);
		    g = 40+25*cos(cl-360/3);
		    b = 40+25*cos(cl+360/3);
			ObjRender_SetPosition(spellgraphic,GetPlayerX,GetPlayerY,0);
			ObjRender_SetColor(spellgraphic,cl,cl,cl);
			ObjRender_SetScaleXYZ(spellgraphic,scale,scale,0);
			ObjRender_SetAlpha(spellgraphic,cl);
			if(scale<80){scale+=5;}
			speed += acc;
			acc+=0.005;
			if(cl<100){
			cl+=5;
			}
			yield;
		}
		let scaleratio = scale/20;
		while(scale>0)
		{
			scale-=scaleratio;
			//ObjRender_SetScaleXYZ(spellgraphic,scale,scale,0);
			ObjRender_SetAlpha(spellgraphic,scale);
			yield;
		}
		Obj_Delete(spellgraphic);
	}
		
	task GraphicWSpecl
	{
		let spellgraphic= ObjPrim_Create(OBJ_SPRITE_2D);
		let scale = 0;
		let speed = 0.3;
		let acc = 0.01;
		let cl = 0;
		let r = 55;
        let g = 55;
        let b = 55;
		let img = GetCurrentScriptDirectory~"WD_Eff.png";
		ObjPrim_SetTexture(spellgraphic,img);
		ObjRender_SetPosition(spellgraphic,GetPlayerX,GetPlayerY,0);
		ObjSprite2D_SetSourceRect(spellgraphic,0,0,256,256);
		ObjSprite2D_SetDestCenter(spellgraphic);
		ObjRender_SetBlendType(spellgraphic,BLEND_SUBTRACT);
		Obj_SetRenderPriorityI(spellgraphic,23);
		ascent(i in 0..290)
		{
		    r = 40+25*cos(cl);
		    g = 40+25*cos(cl-360/3);
		    b = 40+25*cos(cl+360/3);
			ObjRender_SetPosition(spellgraphic,GetPlayerX,GetPlayerY,0);
			ObjRender_SetColor(spellgraphic,cl,cl,cl);
			ObjRender_SetScaleXYZ(spellgraphic,scale,5,0);
			ObjRender_SetAlpha(spellgraphic,cl);
			if(scale<2){scale+=0.1;}
			speed += acc;
			acc+=0.005;
			if(cl<200){
			cl+=5;
			}
			yield;
		}
		let scaleratio = scale/50;
		while(scale>0)
		{
			scale-=scaleratio;
			cl-=10;
			//ObjRender_SetScaleXYZ(spellgraphic,cl,5,0);
			ObjRender_SetAlpha(spellgraphic,cl);
			yield;
		}
		Obj_Delete(spellgraphic);
	}
		
					task RealSpell(px,i){
				let obj = ObjPrim_Create(OBJ_SPRITE_2D);
				let c = 0;
				ObjPrim_SetTexture(obj, img);
				Obj_SetRenderPriority(obj, 0.30);
				ObjSprite2D_SetSourceRect(obj,0,238,128,256);
				ObjSprite2D_SetDestCenter(obj);
				ObjRender_SetAngleXYZ(obj,0,0,-90);
				ObjRender_SetPosition(obj,px,464,0);
				ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
				ObjRender_SetColor(obj,255,i*100,i*100);
				let spell = ObjSpell_Create;
				ObjSpell_Regist(spell);
				ObjSpell_SetDamage(spell,1.50);
					while(ObjRender_GetY(obj)>0){
					ObjRender_SetPosition(obj,ObjRender_GetX(obj),ObjRender_GetY(obj)-40,0);
					ObjRender_SetScaleXYZ(obj,2.5,2.5,0);
					ObjSpell_SetIntersectionCircle(spell,ObjRender_GetX(obj),ObjRender_GetY(obj),50);
					glowStar(ObjRender_GetX(obj),ObjRender_GetY(obj), -90);
					yield;
					}
					Obj_Delete(obj);
					Obj_Delete(spell);
				}
		task glowStar(x, y, z){
		let obj = ObjPrim_Create(OBJ_SPRITE_2D);
		ObjPrim_SetTexture(obj, GetCurrentScriptDirectory~"Sht.png");
		ObjSprite2D_SetSourceRect(obj,0,238,128,256);
		Obj_SetRenderPriorityI(obj, 29);
		ObjRender_SetBlendType(obj, BLEND_ADD_ARGB);
		ascent(i in 0..20){
			ObjRender_SetScaleXYZ(obj, 2.5, 2.5, 1);
			ObjRender_SetColor(obj,155,155,155);
			ObjRender_SetAngleZ(obj, z);
			ObjRender_SetAlpha(obj, 132/i);
			ObjRender_SetPosition(obj, x, y, 0);
			ObjSprite2D_SetDestCenter(obj);
			yield;
		}
		Obj_Delete(obj);
	}
}

function TExpan(px,py,maxv,t,r,g,b)
{
	let obj=ObjPrim_Create(OBJ_SPRITE_2D);
	let img=GetCurrentScriptDirectory~"./grav_00.png";
	let scale = 0;
	let v = 0;
	let z = 0;
	let malpha = 255/t;
	ObjPrim_SetTexture(obj,img);
	ObjSprite2D_SetSourceRect(obj,0,0,55,55);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjRender_SetPosition(obj,px,py,0);
	ObjRender_SetColor(obj,r,g,b);
	Obj_SetRenderPriorityI(obj,25);
	Expan;
		task Expan{
			descent(i in 0..t)
			{
			ObjRender_SetAlpha(obj,malpha*i);
			v = (i*maxv/2)/(t*t);
			scale += v;
			ObjRender_SetScaleXYZ(obj,scale,scale,0);
			ObjRender_SetAngleZ(obj,z*20);
			z++;
			yield;
			}
			Obj_Delete(obj);
		}
}

function TExpan2(px,py,maxv,t,r,g,b) // Missile Explode
{
	let obj=ObjPrim_Create(OBJ_SPRITE_2D);
	let img=GetCurrentScriptDirectory~"./del_en_00.png";
	let scale = 0;
	let v = 0;
	let malpha = 255/t;
	ObjPrim_SetTexture(obj,img);
	ObjSprite2D_SetSourceRect(obj,0,0,399,399);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	ObjRender_SetPosition(obj,px,py,0);
	ObjRender_SetColor(obj,r,g,b);
	Obj_SetRenderPriorityI(obj,25);
	Expan;
		task Expan{
			descent(i in 0..t)
			{
			ObjRender_SetAlpha(obj,malpha*i);
			v = (i*maxv/2)/(t*t);
			scale += v;
			ObjRender_SetScaleXYZ(obj,scale,scale,0);
			yield;
			}
			Obj_Delete(obj);
		}
}


		
task etama(r,a,type){
	let obj=ObjPrim_Create(OBJ_SPRITE_2D);
	let img=GetCurrentScriptDirectory~"eff2.png";
	let dir = rand(0,359);
	let angle = rand(0,359);
	let size = 0.5+r/150;
	let s = size;
	let ra = r;
	let c = 0;
	let m = -10;
	let cp = rand(-7,7);
	let alpha = 0;
	let count = 0;
	let alphaplus = 255/ra;
	ObjPrim_SetTexture(obj,img);
	if(type==1){ObjSprite2D_SetSourceRect(obj,32,226,64,254);}
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetScaleXYZ(obj,size,size,size);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	ObjRender_SetAlpha(obj,0);
	while(r>0){
	ObjRender_SetPosition(obj,GetPlayerX+r*cos(dir),GetPlayerY+r*sin(dir),0);
	ObjRender_SetAngleXYZ(obj,0,0,angle+c*20);
	ObjRender_SetScaleXYZ(obj,size,size,size);
	ObjRender_SetAlpha(obj,alpha*5);
	if(r>ra/2){alpha += alphaplus+1;}
	else{
	alpha -= alphaplus;
	if(alpha<=0){Obj_Delete(obj);}
	}
	r -= 10+c;
	c -= 0.1;
	yield;
	}
	Obj_Delete(obj);
}

function TExpanS(px,py,maxv,t,r,g,b)
{
	let obj=ObjPrim_Create(OBJ_SPRITE_2D);
	let img=GetCurrentScriptDirectory~"./seal.png";
	let scale = 0;
	let v = 0;
	let malpha = 255/t;
	ObjPrim_SetTexture(obj,img);
	ObjSprite2D_SetSourceRect(obj,0,0,128,128);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjRender_SetPosition(obj,px,py,0);
	ObjRender_SetColor(obj,r,g,b);
	Obj_SetRenderPriorityI(obj,25);
	let ra = rand(-1,1)*20;
	Expan;
	task Expan
	{
		descent(i in 0..t)
		{
			ObjRender_SetAlpha(obj,malpha*i);
			v = (i*maxv/2)/(t*t);
			ObjRender_SetAngleZ(obj,scale*ra);
			scale += v;
			ObjRender_SetScaleXYZ(obj,scale,scale,0);
			yield;
		}
		Obj_Delete(obj);
	}
}

function GetAtanAngle(obj,obj2){
	let angle=atan2(ObjMove_GetY(obj2)-ObjMove_GetY(obj),ObjMove_GetX(obj2)-ObjMove_GetX(obj));
	return angle;
}

function TCharge01(x,y,size,frame,r,g,b){
    let t = 0;
	let obj=ObjPrim_Create(OBJ_SPRITE_2D);
	let img=GetCurrentScriptDirectory~"ring.png";
	ObjPrim_SetTexture(obj,img);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjSprite2D_SetSourceRect(obj,0,0,128,128);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetPosition(obj,x,y,0);
	ObjRender_SetAlpha(obj,0);
	ObjRender_SetScaleXYZ(obj,size,size,0);
	ObjRender_SetColor(obj,r,g,b);
	TZ;
	TAlpha;
	TShrink;
	return obj;
	task TAlpha{
		let l=10;
		let alpha=255/l;
		loop(l){
			ObjRender_SetAlpha(obj,alpha);
			alpha+=255/(l*2);
			yield;
			}
		}
		task TZ{
		loop(100){
			ObjRender_SetAngleZ(obj,t*10);
			t--;
			yield;
			}
		}
	task TShrink{
		let l=frame;
		let a = size*2/l/l;
		ascent(i in 0..l){
			ObjRender_SetScaleXYZ(obj,size,size,0);
			ObjRender_SetPosition(obj,GetPlayerX,GetPlayerY,0);
			size = size-i*a;
			if(Obj_IsDeleted(GetPlayerID)){Obj_Delete(obj);}
			yield;
			}
		Obj_Delete(obj);
		
	}
}

task fragment(shot,size,num){
		if(!Obj_IsDeleted(shot)){
		loop(num){
		realTask;
		}
		}
			task realTask{
			let obj=ObjPrim_Create(OBJ_SPRITE_2D);
			let img=GetCurrentScriptDirectory~"effbreak.png";
			let s = rand(0.8,1.2)+size;
			let pic = ObjShot_GetImageID(shot);
			let color = GetShotDataInfoA1(pic,TARGET_ENEMY,INFO_DELAY_COLOR);
			let rect = [0,0,32,32];
			ObjPrim_SetTexture(obj,img);
			ObjSprite2D_SetSourceRect(obj,rect[0],rect[1],rect[2],rect[3]);
			ObjSprite2D_SetDestCenter(obj);
			ObjRender_SetScaleXYZ(obj,s,s,0);
			ObjRender_SetAngleXYZ(obj,0,0,rand(0,359));
			ObjRender_SetBlendType(obj,BLEND_ALPHA);
			ObjRender_SetColor(obj,color[0],color[1],color[2]);
			Obj_SetRenderPriority(obj,0.21);
			ObjShot_SetIntersectionEnable(shot,false);
			let x = ObjMove_GetX(shot);
			let y = ObjMove_GetY(shot);
			if(x!=0 && y!=0){
			ascent(i in 0..7){
			ObjRender_SetPosition(obj,x,y,0);
			ObjSprite2D_SetSourceRect(obj,rect[0],rect[1],rect[2],rect[3]);
			rect[0] = rect[0]+32;
			rect[2] = rect[2]+32;
			wait(3);
			}
			}
			Obj_Delete(obj);
			}
		}
		
task spongy(shot,t){
		let cloud = ObjShot_GetImageID(shot);
		let obj=ObjPrim_Create(OBJ_SPRITE_2D);
		if(!Obj_IsDeleted(shot)){
		let img=GetCurrentScriptDirectory()~"AllStarShot.png";
		let s = 1;
		let adc = false;
		let rect = GetShotDataInfoA1(cloud,TARGET_ENEMY,INFO_RECT);
		let dir = ObjMove_GetAngle(shot)+90;
		ObjPrim_SetTexture(obj,img);
		ObjSprite2D_SetSourceRect(obj,rect[0],rect[1],rect[2],rect[3]);
		ObjSprite2D_SetDestCenter(obj);
		ObjRender_SetPosition(obj,ObjMove_GetX(shot),ObjMove_GetY(shot),0);
		ObjRender_SetAngleXYZ(obj,0,0,dir);
		ObjRender_SetBlendType(obj,BLEND_ALPHA);
	 if( (cloud>=1 && cloud<=41) || (cloud>=58 && cloud<=73) || (cloud>=106 && cloud <=121)
	 || (cloud>=170 && cloud<=185) || (cloud>=233 && cloud<=239)
	 || (cloud>=248 && cloud <=252) || (cloud>=269 && cloud<=283)
	 || (cloud>=300 && cloud<=307) || (cloud>=340 && cloud<=346)
	 || (cloud>=355 && cloud<=362) || (cloud>=371 && cloud<=382)
	 || (cloud>=399 && cloud<=408)){
	 adc = true;
	 ObjRender_SetBlendType(obj,BLEND_ADD_RGB);
	 }
		if(cloud>=41){
		ascent(i in 0..t){
		ObjRender_SetScaleXYZ(obj,s,s,0);
		if(adc==false){ObjRender_SetAlpha(obj,255-i*255/t);}
		if(adc==true){ObjRender_SetColor(obj,255-i*255/t,255-i*255/t,255-i*255/t);}
		s += 0.1;
		yield;
		}
		}
		Obj_Delete(obj);
		}
		}

function GetDistance(x1,y1,x2,y2){
return((|((x2-x1)^2+(y2-y1)^2)^(1/2)|));
}

task TMagicCircle
{


	let countVertex = 104;
	let listRadius = [];
	loop(countVertex)
	{
		listRadius = listRadius ~ [0];
	}

	let path = current ~ "spell_card_00.png";
	let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D);
	ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLESTRIP);
	ObjPrim_SetVertexCount(obj, countVertex);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj, 0.60);
	ObjPrim_SetTexture(obj, path);
	ascent(iVert in 0..countVertex / 2)
	{
		let left = iVert * 128;
		let indexVert = iVert * 2;
		ObjPrim_SetVertexUVT(obj, indexVert + 0, left, 0);
		ObjPrim_SetVertexUVT(obj, indexVert + 1, left, 64);		
	}

	let cx = 0;
	let cy = 0;
	let maxRadius = 148;
	let alpha = 0;
	let frame = 0;
	let angleRender = 0;
	let frameInvOld = 0;

	while(true)
	{
		let frameInv = GetPlayerInvincibilityFrame();

		if(frameInv <= 0)
		{
			Obj_SetVisible(obj, false);
			frameInvOld = 0;
		}
		else
		{
			if(frameInvOld == 0)
			{
				//???
				ascent(iVert in 0..countVertex)
				{
					listRadius[iVert] = 0;
				}
				alpha = 0;
				frame = 0;
			}
			frameInvOld = frameInv;

			let px = GetPlayerX();
			let py = GetPlayerY();

			alpha += 1 / 120;
			alpha = min(alpha, 1);
			angleRender += 360 / countVertex / 2;
			Obj_SetVisible(obj, true);

			frameInv = min(100, frameInv);
			let rRate = frameInv / 100;

			ascent(iVert in 0..countVertex / 2)
			{
				let indexVert = iVert * 2;
				let angle = 360 / (countVertex / 2 - 1) * iVert;

				let vx1 = listRadius[indexVert] * cos(angle);
				let vy1 = listRadius[indexVert] * sin(angle);
				ObjPrim_SetVertexPosition(obj, indexVert + 0, vx1, vy1, 0);

				let vx2 = listRadius[indexVert+1] * cos(angle);
				let vy2 = listRadius[indexVert+1] * sin(angle);
				ObjPrim_SetVertexPosition(obj, indexVert + 1, vx2, vy2, 0);

				//?????
				if(frame >= 0)
				{//??
					let dr = (maxRadius * rRate - listRadius[indexVert]) / 8;
					listRadius[indexVert] = listRadius[indexVert] + dr;
				}
				if(frame > 10)
				{//??
					let rRateIn = rRate - 0.12;
					if(rRateIn < 0){rRateIn=0;}
					let dr= (maxRadius * rRateIn - listRadius[indexVert + 1]) / 16;
					listRadius[indexVert + 1] = listRadius[indexVert + 1] + dr;
				}

			}

			ObjRender_SetColor(obj, 192 * alpha, 192 * alpha, 255 * alpha);
			ObjRender_SetPosition(obj, px, py, 0);
			ObjRender_SetAngleZ(obj, angleRender);

			frame++;
		}

		yield;
	}
}

task TMagicCircle2
{


	let countVertex = 84;
	let listRadius = [];
	loop(countVertex)
	{
		listRadius = listRadius ~ [0];
	}

	let path = current ~ "spell_eff_00.png";
	let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D);
	ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLESTRIP);
	ObjPrim_SetVertexCount(obj, countVertex);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj, 0.60);
	ObjPrim_SetTexture(obj, path);
	ascent(iVert in 0..countVertex / 2)
	{
		let left = iVert * 128;
		let indexVert = iVert * 2;
		ObjPrim_SetVertexUVT(obj, indexVert + 0, left, 0);
		ObjPrim_SetVertexUVT(obj, indexVert + 1, left, 64);		
	}

	let cx = 0;
	let cy = 0;
	let maxRadius = 128;
	let alpha = 0;
	let frame = 0;
	let angleRender = 0;
	let frameInvOld = 0;

	while(true)
	{
		let frameInv = GetPlayerInvincibilityFrame();

		if(frameInv <= 0)
		{
			Obj_SetVisible(obj, false);
			frameInvOld = 0;
		}
		else
		{
			if(frameInvOld == 0)
			{
				//???
				ascent(iVert in 0..countVertex)
				{
					listRadius[iVert] = 0;
				}
				alpha = 0;
				frame = 0;
			}
			frameInvOld = frameInv;

			let px = GetPlayerX();
			let py = GetPlayerY();

			alpha += 1 / 120;
			alpha = min(alpha, 1);
			angleRender += 360 / countVertex / 2;
			Obj_SetVisible(obj, true);

			frameInv = min(100, frameInv);
			let rRate = frameInv / 100;

			ascent(iVert in 0..countVertex / 2)
			{
				let indexVert = iVert * 2;
				let angle = 360 / (countVertex / 2 - 1) * iVert;

				let vx1 = listRadius[indexVert] * cos(angle);
				let vy1 = listRadius[indexVert] * sin(angle);
				ObjPrim_SetVertexPosition(obj, indexVert + 0, vx1, vy1, 0);

				let vx2 = listRadius[indexVert+1] * cos(angle);
				let vy2 = listRadius[indexVert+1] * sin(angle);
				ObjPrim_SetVertexPosition(obj, indexVert + 1, vx2, vy2, 0);

				//?????
				if(frame >= 0)
				{//??
					let dr = (maxRadius * rRate - listRadius[indexVert]) / 8;
					listRadius[indexVert] = listRadius[indexVert] + dr;
				}
				if(frame > 10)
				{//??
					let rRateIn = rRate - 0.12;
					if(rRateIn < 0){rRateIn=0;}
					let dr= (maxRadius * rRateIn - listRadius[indexVert + 1]) / 16;
					listRadius[indexVert + 1] = listRadius[indexVert + 1] + dr;
				}

			}

			ObjRender_SetColor(obj, 192 * alpha, 192 * alpha, 255 * alpha);
			ObjRender_SetPosition(obj, px, py, 0);
			ObjRender_SetAngleZ(obj, -angleRender);

			frame++;
		}

		yield;
	}
}

task TExplosion
{
	let path = GetCurrentScriptDirectory() ~ "eff2.png";
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj, 0.60);
	ObjPrim_SetTexture(obj, path);
	ObjSprite2D_SetSourceRect(obj, 129, 16, 192, 79);
	ObjSprite2D_SetDestRect(obj, -32, -32, 32, 32);
	ObjRender_SetPosition(obj, GetPlayerX, GetPlayerY, 0);
	let alpha = 255;
	let scale = 0;
	let dis = 0;
	let px = GetPlayerX;
	let py = GetPlayerY;
	ExplosionCircle;
	DeleteCircle;
	task ExplosionCircle
	{
		loop(30)
		{
			scale += 0.1;
			alpha -= 9;
			ObjRender_SetColor(obj, alpha, alpha, alpha);
			ObjRender_SetPosition(obj, px, py, 0);
			ObjRender_SetScaleXYZ(obj, scale, scale, 1);
			yield;
		}
		Obj_Delete(obj);
	}
	task DeleteCircle
	{
		wait(GetPlayerRebirthFrame);
		if(spelltime==false)
		{
			loop(40)
			{
			let arr = GetShotIdInCircleA2(GetStgFrameWidth/2,GetStgFrameHeight/2,600,TARGET_ENEMY);
			DeleteShotInCircle(TYPE_SHOT, TYPE_ITEM, px, py, dis);
			dis += 25;
			yield;
			}
		}
	}
}

task TExplosion2
{
let dtime = 60;
let dis = 0;
ExCircle(GetPlayerX,GetPlayerY,0.05,dtime);
ExCircle(GetPlayerX-30,GetPlayerY,0.05,dtime);
ExCircle(GetPlayerX+30,GetPlayerY,0.05,dtime);
ExCircle(GetPlayerX,GetPlayerY-30,0.05,dtime);
ExCircle(GetPlayerX,GetPlayerY+30,0.05,dtime);
PlaySE(GetCurrentScriptDirectory~"se_pldead.wav");
loop(10){yield;}
ExCircle(GetPlayerX,GetPlayerY,0.05,dtime-10);
DeleteShotInCircle(TYPE_SHOT, TYPE_ITEM, GetPlayerX,GetPlayerY, dis);
dis += 65;
}

task ExCircle(x,y,sc,dtime){
let obj = ObjPrim_Create(OBJ_SPRITE_2D);
let timer = 0;
let s = 0;


let Target = current~"./Effect03.png";
let mx = ObjRender_GetX(obj);
let my = ObjRender_GetY(obj);


	Obj_SetRenderPriorityI(obj, 79);
	ObjPrim_SetTexture(obj, Target);

	ObjRender_SetBlendType(obj, BLEND_INV_DESTRGB);

	ObjSprite2D_SetSourceRect(obj, 0, 0, 512, 512);

        ObjSprite2D_SetDestCenter(obj);
        ObjRender_SetScaleXYZ(obj, s, s, s);
ObjRender_SetPosition(obj,x,y,0);
loop{
timer++;
        s+=sc;
        ObjRender_SetScaleXYZ(obj, s, s, s);

        if(timer == dtime){
        Obj_Delete(obj);
        break;
        }
        yield;
        }

        }

task LeafEffect(x, y, speed, angle, size, timer, cr, cg, cb)
{
	let gType = trunc(rand(0,4));
	let gx = (gType%4)*32 + 1;
	let gy = 97;
	let vx = cos(angle)*speed;
	let t = 0;
	let vy = sin(angle)*speed;
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	ObjPrim_SetTexture(obj, GetCurrentScriptDirectory() ~ "eff2.png");
	ObjSprite2D_SetSourceRect(obj, 0, 224, 32, 256);
	ObjSprite2D_SetDestRect(obj, -size, -size, size, size);
	ObjRender_SetBlendType(obj, BLEND_ADD_ARGB);
	let nico = rand(0,360);
	ObjRender_SetAlpha(obj,255);
	descent(t in 0 .. timer)
	{
		let tmp = (t+1)/timer;
		ObjRender_SetColor(obj, cr*tmp, cg*tmp, cb*tmp);
		ObjRender_SetPosition(obj, x, y, 0);
		ObjRender_SetAngleZ(obj, nico+t*10);
		t++;
		x += vx; y += vy;
		yield;
	}
	Obj_Delete(obj);
}

task Homing(obj,h_obj,maxTraverse,mspeed,time,wet){  // max. angle of traverse
wait(wet);
	let angle = ObjMove_GetAngle(obj);
	let dir = 0;
	let count = 0;
	let boss = GetIntersectionRegistedEnemyID;
    while(! Obj_IsDeleted(obj) && Obj_GetValueD(h_obj,"HomingOrNot",1)==1 && FindTarget!=-1 && count<time) {
        ObjMove_SetAngle(obj, angle);
		maxTraverse += mspeed;
		if(length(boss)>=1){
		dir = atan2(ObjMove_GetY(h_obj) - ObjMove_GetY(obj),
                        ObjMove_GetX(h_obj) - ObjMove_GetX(obj));
						if(ObjRender_GetX(h_obj)==0 && ObjRender_GetY(h_obj) ==0){
							if(FindTarget!=-1)
							{
								h_obj = FindTarget;
							}
							else
							{
								break;
							}
						}
						}
        let diff = dir - angle;
        while(diff >= 180) { diff -= 360; }    // adjust the range
        while(diff < -180) { diff += 360; }

        let diffAbs = (|diff|);
        if(diffAbs < maxTraverse) {
            angle = dir;
        } else {
            angle += maxTraverse * diff / diffAbs;
        }
		count++;
		yield;
    }
}		
	
function FindTarget{
	let enemy_id = GetIntersectionRegistedEnemyID;
	let mindis = 999;
	let h_obj;
	if(length(enemy_id)>0)
	{
	h_obj = enemy_id[0];
	ascent(i in 0..length(enemy_id)){
	let dis = GetDistance(GetPlayerX,GetPlayerY,ObjMove_GetX(enemy_id[i]),ObjMove_GetY(enemy_id[i]));
		if(mindis>dis){
		mindis = dis;
		h_obj = enemy_id[i];
		}
	}
	if(length(GetEnemyBossObjectID)>=1){return GetEnemyBossObjectID[0];}
	else{return h_obj;}
	}
	else
	{
	return -1;
	}
}

task PlaySound(str,v,w){
	if(str == "Laser7"){ObjSound_Load(s,GetCurrentScriptDirectory~"Laser7.wav");}
	if(str == "Shot4"){ObjSound_Load(s,GetCurrentScriptDirectory~"Shot4.wav");}
	if(str == "Shot7"){ObjSound_Load(s,GetCurrentScriptDirectory~"Shot7.wav");}
	if(str == "Shot8"){ObjSound_Load(s,GetCurrentScriptDirectory~"Shot8.wav");}
	if(str == "Shot9"){ObjSound_Load(s,GetCurrentScriptDirectory~"Shot9.wav");}
	if(str == "Charge1"){ObjSound_Load(s,GetCurrentScriptDirectory~"Charge1.wav");}
	if(str == "Charge2"){ObjSound_Load(s,GetCurrentScriptDirectory~"Charge2.wav");}
	if(str == "Charge3"){ObjSound_Load(s,GetCurrentScriptDirectory~"Charge3.wav");}
	if(str == "Charge4"){ObjSound_Load(s,GetCurrentScriptDirectory~"Charge4.wav");}
	if(str == "Eff2"){ObjSound_Load(s,GetCurrentScriptDirectory~"Eff2.wav");}
	if(str == "se_shot"){ObjSound_Load(s,GetCurrentScriptDirectory~"se_shot.wav");}
	if(str == "Slash"){ObjSound_Load(s,GetCurrentScriptDirectory~"Slash.wav");}
	if(str == "cardcall"){ObjSound_Load(s,GetCurrentScriptDirectory~"cardcall.wav");}
	if(str == "ShotM"){ObjSound_Load(s,GetCurrentScriptDirectory~"ShotM.wav");}
	if(str == "ShotM2"){ObjSound_Load(s,GetCurrentScriptDirectory~"ShotM2.wav");}
	loop(w){yield;}
	ObjSound_SetSoundDivision(s,SOUND_SE);
	ObjSound_SetVolumeRate(s,v);
	ObjSound_Play(s);
	/*loop(120){yield;}
	Obj_Delete(s);*/
	}

				task ScreenShake(time){
				loop(time/2){
				Set2DCameraFocusX(Get2DCameraX + rand(-8, 8));
				Set2DCameraFocusY(Get2DCameraY + rand(-8, 8));
				yield;
				Reset2DCamera;
				yield;
				}
				Reset2DCamera;
			}	

function wait(t){
	loop(t){yield;}
	}

task PlantEffect( x,y, angle, sca, alpha, rgb_array ){
	let ID		= ObjPrim_Create(OBJ_SPRITE_2D);
	let anim	= 0;
	let animX	= 0;
	let animY	= 0;
	
	ObjRender_SetPosition( ID, x, y, 0 );
	ObjPrim_SetTexture( ID, GetCurrentScriptDirectory~"oonusa_01b.png" );
	ObjRender_SetBlendType( ID, BLEND_ADD_ARGB );
	//Obj_SetRenderPriorityI( ID, shot_layer - 1 );
	ObjRender_SetAngleZ( ID, angle );
	ObjRender_SetScaleXYZ( ID, sca, sca, 0 );
	ObjRender_SetAlpha( ID, alpha );
	ObjRender_SetColor( ID, rgb_array[0], rgb_array[1], rgb_array[2] );
	ObjSprite2D_SetSourceRect( ID, 0, 0, 80, 40 );
	ObjSprite2D_SetDestCenter( ID );
	
	while( animY < 4 ){
		ObjSprite2D_SetSourceRect( ID, 0 + animX*80, 0 + animY*40, 80 + animX*80, 40 + animY*40 );
		
		if( anim > 0 && anim%2 == 0 ){
			animX++;
			if( animX%3 == 0 ){
				animX = 0;
				animY++;
			}
		}
		
		anim++;
		
		yield;
	}
	Obj_Delete(ID)
}