#e[Player]
#ScriptVersion[3]	//XNvgo[W3K{ł
#ID["Default_Rumia"]
#Title["[~A"]
#Text["vC[TvłBŕ"]
#Image["./Default_Player_Rumia_Select.png"]
#ReplayName["Rumia"]

let objPlayer = GetPlayerObjectID();
let objSlowShot = ID_INVALID;
let current = GetCurrentScriptDirectory();
let hitbox = current ~ "hitbox.png";
let hitboxObj = ObjPrim_Create(OBJ_SPRITE_2D);
@Initialize
{
	let path = current ~ "Default_Player_RumiaShotData.txt";
	LoadPlayerShotData(path); //e摜[h

	ObjPlayer_AddIntersectionCircleA1(objPlayer, 0, 0, 1, 20); //蔻o^

	TImage();//@`p^XNN
	TShot();//e˗p^XNN
	TMagicCircle();//GԖ@w^XNN
	SetDebugKey(objPlayer);
	Thitbox(GetPlayerX,GetPlayerY);
}

@MainLoop
{
	yield;
}

@Finalize
{
}

@Event
{
	alternative(GetEventType())
	case(EV_REQUEST_SPELL)
	{
		//XyJ[hv
		let spell = GetPlayerSpell();//cXy
		if(spell >= 1)
		{
			SetScriptResult(true);//Xy\
			SetPlayerSpell(spell-1);//Xy1炷
			TSpell();//Xy^XNN
		}
		else
		{
			SetScriptResult(false);//Xys
		}
	}
	case(EV_HIT)
	{
		//e
		TExplosion();
	}
	case(EV_PLAYER_REBIRTH)
	{
		//A
		SetPlayerSpell(3);
		SetPlayerInvincibilityFrame(180);
	}
	case(EV_GET_ITEM)
	{
		//ACe擾ʒm
		let itemType = GetEventArgument(0);
		alternative(itemType)
		case(ITEM_SPELL)
		{
			//WriteLog("ITEM_SPELL");
		}
		case(ITEM_SPELL_S)
		{
			//WriteLog("ITEM_SPELL_S");
		}
		case(ITEM_POWER)
		{
			//WriteLog("ITEM_POWER");
		}
		case(ITEM_POWER_S)
		{
			//WriteLog("ITEM_POWER_S");
		}
	}

}

task SetDebugKey(Obj) {
	let x = 5; 
	let y = 420;
	let textobj = ObjText_Create;
	ObjRender_SetPosition(textobj,x,y,0);
	ObjText_SetText(textobj,"");
	let LifeMax = ObjEnemy_GetInfo(Obj, INFO_LIFE);
	
	while(!Obj_IsDeleted(Obj)){
		if(GetKeyState(KEY_I) == KEY_PUSH){ SetCommonData("Debug_Unrivaled", true); ObjText_SetText(textobj,"Godmode"); }
		if(GetKeyState(KEY_U) == KEY_PUSH){ SetCommonData("Debug_Unrivaled", false); ObjText_SetText(textobj,"Normal"); }
		if(GetKeyState(KEY_F) == KEY_PUSH){ SetPlayerLife(8); SetPlayerSpell(8); }
		if(GetKeyState(KEY_H) == KEY_PUSH){ ObjEnemy_SetLife(Obj, 0); }
		if(GetCommonData("Debug_Unrivaled", false)){ SetPlayerInvincibilityFrame(max(1,GetPlayerInvincibilityFrame)); }
		yield;
	}
}

task Thitbox(x,y) {
	let alphret = 0;
	let spinny = 0;
	
	ObjPrim_SetTexture(hitboxObj,hitbox);
	ObjRender_SetBlendType(hitboxObj,BLEND_ALPHA);
	Obj_SetRenderPriorityI(hitboxObj,40);
	ObjRender_SetAlpha(hitboxObj,0);
	ObjMove_SetSpeed(hitboxObj,0);
	ObjMove_SetAngle(hitboxObj,0);
	ObjRender_SetScaleXYZ(hitboxObj,1,1,0);
	ObjSprite2D_SetSourceRect(hitboxObj,0,0,64,64);
	ObjSprite2D_SetDestCenter(hitboxObj);	
	
	while(!Obj_IsDeleted(hitboxObj)) {
		ObjRender_SetPosition(hitboxObj,GetPlayerX,GetPlayerY,0);
		ObjRender_SetAngleZ(hitboxObj,spinny);
		spinny++; 
		yield;
	}
}

task TImage
{
	let path = GetCurrentScriptDirectory() ~ "Default_Player_Rumia.png";
	ObjPrim_SetTexture(objPlayer, path);
	loop
	{
		if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || GetVirtualKeyState(VK_LEFT) == KEY_HOLD)
		{
			ObjSprite2D_SetSourceRect(objPlayer, 1, 133, 49, 188);
		}
		else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || GetVirtualKeyState(VK_RIGHT) == KEY_HOLD)
		{
			ObjSprite2D_SetSourceRect(objPlayer, 1, 69, 49, 124);
		}
		else
		{
			ObjSprite2D_SetSourceRect(objPlayer, 1, 5, 49, 60);
		}
		ObjSprite2D_SetDestCenter(objPlayer);
		yield;
	}

}



task TShot
{
	let shotCount = -1;//eAŔ˂邽߂̕ϐ
	let bNextShot = false;//񉟂łeA˂邽߂̕ϐ(Â炢)
	let objShot = ID_INVALID;//Ue

	loop
	{
		if((GetVirtualKeyState(VK_SHOT)==KEY_PUSH || GetVirtualKeyState(VK_SHOT)==KEY_HOLD || bNextShot==true) && shotCount==-1)
		{
			shotCount = 0;
			bNextShot = false;
		}
		if(GetVirtualKeyState(VK_SHOT)==KEY_HOLD && shotCount>0)
		{
			bNextShot = true;
		}
		if(GetVirtualKeyState(VK_SLOWMOVE)==KEY_PUSH || GetVirtualKeyState(VK_SLOWMOVE)==KEY_HOLD)
		{	//ᑬړ̎e
			if(shotCount != -1)
			{
				TSlowShot();
			}
			if(shotCount%5 == 0)
			{
				CreatePlayerShotA1(GetPlayerX(), GetPlayerY()-16, 15, 265, 1.3, 2, 1);
				CreatePlayerShotA1(GetPlayerX(), GetPlayerY()-16, 15, 270, 1.5, 3, 1);
				CreatePlayerShotA1(GetPlayerX(), GetPlayerY()-16, 15, 275, 1.3, 2, 1);
			}
			ObjRender_SetAlpha(hitboxObj,255);
		}
		else
		{	//ړ̎e
			Obj_Delete(objSlowShot);//ړ͒ᑬړ̓e폜
			if(shotCount%5 == 0)
			{
				CreatePlayerShotA1(GetPlayerX(), GetPlayerY()-16, 15, 255, 1.3, 1, 1);
				CreatePlayerShotA1(GetPlayerX(), GetPlayerY()-16, 15, 265, 1.5, 2, 1);
				CreatePlayerShotA1(GetPlayerX(), GetPlayerY()-16, 15, 270, 1.7, 3, 1);
				CreatePlayerShotA1(GetPlayerX(), GetPlayerY()-16, 15, 275, 1.5, 2, 1);
				CreatePlayerShotA1(GetPlayerX(), GetPlayerY()-16, 15, 285, 1.3, 1, 1);
			}		
			ObjRender_SetAlpha(hitboxObj,0);
		}

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


}

task TSlowShot()
{	//ᑬړ̗Ue
	//Gǔă_[W^
	if(!Obj_IsDeleted(objSlowShot)){return;}//1݂Ȃ

	objSlowShot = ObjShot_Create(OBJ_SHOT);
	ObjMove_SetX(objSlowShot, GetPlayerX);//xWݒ
	ObjMove_SetY(objSlowShot, GetPlayerY);//yWݒ;
	ObjMove_SetSpeed(objSlowShot, 5);//xݒ
	ObjShot_SetGraphic(objSlowShot, 2);//摜ݒ
	ObjShot_SetDamage(objSlowShot, 2);//_[Wݒ
	ObjShot_SetPenetration(objSlowShot, 1000000);//ђʗ͓͂Kɑ傫
	ObjShot_Regist(objSlowShot);

	while( !Obj_IsDeleted(objSlowShot) )
	{//폜܂Ń[vs		
		//z[~O
		let sx = ObjMove_GetX(objSlowShot);
		let sy = ObjMove_GetY(objSlowShot);
		let tx = GetPlayerX();
		let ty = GetPlayerY();
		let pos = GetEnemyIntersectionPosition(sx, sy, 1);
		if(length(pos) > 0)
		{
			tx = pos[0][0];
			ty = pos[0][1];
		}
		let toAngle=atan2(ty - sy, tx - sx);
		ObjMove_SetAngle(objSlowShot, toAngle);
		yield;
	}

}

task TMagicCircle
{
	//GԂ̖@w
	//_FF~̊OA~̓
	let countVertex = 64;
	let listRadius = [];
	loop(countVertex)
	{
		listRadius = listRadius ~ [0];
	}

	let path = current ~ "Default_Player_MagicCircle.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);

				//wg
				if(frame >= 0)
				{//O
					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() ~ "Default_Player_Rumia.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, 192, 0, 255, 63);
	ObjSprite2D_SetDestRect(obj, -32, -32, 32, 32);

	let alpha = 255;
	let scale = 0;
	loop(30)
	{
		scale += 0.2;
		alpha -= 8;
		ObjRender_SetColor(obj, alpha, alpha, alpha);
		ObjRender_SetPosition(obj, GetPlayerX, GetPlayerY, 0);
		ObjRender_SetScaleXYZ(obj, scale, scale, 1);
		yield;
	}
	Obj_Delete(obj);
}

task TSpell
{
	let current = GetCurrentScriptDirectory();
	let imgEffect = current ~ "Default_Player_RumiaSpell.png";

	SetPlayerInvincibilityFrame(300);//GԂݒ
	let bSlowMove = GetVirtualKeyState(VK_SLOWMOVE)==KEY_PUSH || GetVirtualKeyState(VK_SLOWMOVE)==KEY_HOLD;
	let objManage = GetSpellManageObject();
	
	let enemyX = 0;
	let enemyY = 0;

	TShake();
	effect(0);
	effect(1);
	loop(220)
	{
		enemyX = GetPlayerX();
		enemyY = GetPlayerY();
		let pos = GetEnemyIntersectionPosition(enemyX, enemyY, 1);
		if(length(pos) > 0)
		{
			enemyX = pos[0][0];
			enemyY = pos[0][1];
		}
		yield;
	}
	Obj_Delete(objManage);


	task effect(num)
	{	
		//GtFNgp^XN
		let tv=0;
		let angle=0;
		let alpha=0;	
		task alphaState
		{	//lύX邽߂̃^XN
			alpha=0;
			loop(256/3){alpha+=3; yield;}
			loop(90){yield;}
			while(!Obj_IsDeleted(objManage)){alpha-=8; yield;}
		}
		task lineEffect
		{
			loop(120){concentrationLine();loop(1){yield;}}
		}
		alphaState;
		if(bSlowMove){lineEffect;}
		
		let obj = ObjSpell_Create();//XyIuWFNg쐬
		ObjPrim_SetVertexCount(obj, 10);
		ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLESTRIP);
		ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
		Obj_SetRenderPriority(obj, 0.60);
		ObjPrim_SetTexture(obj, imgEffect);
		ObjSpell_Regist(obj);

		ascent(i in 0..5)
		{
			let angle = -45+i*90;
			let x;
			let y;
			if(bSlowMove)
			{
				//ᑬړ͔͈͂
				x = 192*cos(angle);
				y = 192*sin(angle);
			}
			else
			{
				//ړ͍L͈
				x = 512*cos(angle);
				y = 512*sin(angle);
			}
			ObjPrim_SetVertexPosition(obj, i*2, x, y, 0);
			ObjPrim_SetVertexPosition(obj, i*2+1, 0, 0, 0);
			ObjPrim_SetVertexColor(obj, i*2, 0, 0, 0);
		}
		
		while(!Obj_IsDeleted(objManage))
		{
			tv-=1;
			if(num == 0){angle+=1;}
			else if(num == 1){angle-=1;}
			ObjRender_SetAngleZ(obj, angle);//`pxݒ

			if(bSlowMove)
			{	//ᑬړ
				ObjRender_SetPosition(obj, enemyX, enemyY, 0);
				ObjSpell_SetIntersectionCircle(obj, enemyX, enemyY, 81);//蔻o^
				ObjSpell_SetDamage(obj, 5);
			}
			else 
			{	//ړ
				ObjRender_SetPosition(obj, GetPlayerX, GetPlayerY, 0);//Wݒ
				ObjSpell_SetIntersectionCircle(obj, GetPlayerX, GetPlayerY, 256);//蔻o^
				ObjSpell_SetDamage(obj, 2);
			}
			ascent(i in 0..5)
			{
				ObjPrim_SetVertexUVT(obj, i*2,   16*i, tv);//eNX`̍Wݒ
				ObjPrim_SetVertexUVT(obj, i*2+1 ,32,  64+tv);
				
				ObjPrim_SetVertexColor(obj, i*2+1, alpha, alpha, alpha);
			}
			yield;
		}
		Obj_Delete(obj);
	}

	task concentrationLine()
	{	//W܂銴̃GtFNg
		let angle = rand(0, 360);
		let alpha=0;	
		let scale=3;
		
		let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D);//IuWFNg쐬
		ObjPrim_SetVertexCount(obj, 3);//_3
		ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLELIST);//v~eBu^Cvݒ
		ObjRender_SetBlendType(obj, BLEND_ADD_RGB);//`@ݒ
		Obj_SetRenderPriority(obj, 0.60);
		ObjPrim_SetTexture(obj, imgEffect);//eNX`ݒ
		ObjRender_SetAngleZ(obj, angle);//`pxݒ
		
		//_Wݒ
		ObjPrim_SetVertexPosition(obj, 0,  0,  10, 0);
		ObjPrim_SetVertexPosition(obj, 1, -10, 50, 0);
		ObjPrim_SetVertexPosition(obj, 2, 10,  50, 0);
		
		//_UVlݒ
		ObjPrim_SetVertexUVT(obj, 0, 10,  10);
		ObjPrim_SetVertexUVT(obj, 1,  0,  50);
		ObjPrim_SetVertexUVT(obj, 2, 20,  50);
		
		//Fݒ
		ObjPrim_SetVertexColor(obj, 0,  alpha, 0, alpha);
		ObjPrim_SetVertexColor(obj, 1,  0, 0, 0);
		ObjPrim_SetVertexColor(obj, 2,  0, 0, 0);
		
		loop(60)
		{
			scale-=3/60;
			alpha+=5;
			ObjPrim_SetVertexColor(obj, 0,  alpha, 0, alpha);
			ObjRender_SetScaleXYZ(obj, scale, scale*3, 1);	
			ObjRender_SetPosition(obj, enemyX, enemyY, 0);	
			yield;	
		}
		Obj_Delete(obj);
	}

	task TShake()
	{
		while(!Obj_IsDeleted(objManage))
		{
			Set2DCameraFocusX(GetStgFrameWidth / 2 + rand(-8, 8));
			Set2DCameraFocusY(GetStgFrameHeight / 2 + rand(-8, 8));
			yield;
		}

		Reset2DCamera();
	}
}
