//-----------------------
//̉
//-----------------------

let b_DisplayShotCount = true;

let m_BeamShotCount = 0;
let m_BeamExtraShotCount = 0;	//˂GNXgVbg
let m_BeamSpecialShotCount = 0;	//˂XyVVbg

let m_BeamExtraShotStock = 0;		//GNXgVbg
let m_BeamExtraShotMaxStock = 30;	//őXgbN

let m_BeamPower = 0;			//ACe
let m_BeamPowerNorma = 3;		//ACeVbgɕς鐔

let m_BeamSlot = 5;			//r[gp\
let m_BeamMaxEnergy = 100;	//őGlM[
let m_BeamRecovery = 3;		//񕜑x

let m_SpecialBeamSlot = 5;			//XyVpXbg
let m_SpecialBeamEquip = _SPECIALBEAM_NONE;
let m_SpecialBeamCost = 0;			//XyVgp̃RXg
let m_SpecialBeamEnergy = 0;		//XyV`[W
let m_SpecialBeamMaxEnergy = 100;	//XyV`[Wő
let m_SpecialBeamCharge = 2;		//XyV`[Wx
let m_SpecialBeamLevel = 0;			//XyVx


//r[Vbg--------------------------------------------
task main_Beam_MainRoutine()
{

	func_ObjBeam_Reset();

	loop(60){yield;}

	loop{

		AddEnergy();

		if(REMY_Stick_Push(_KEY_SKIP) && !OnPlayerMissed()){
			let id = GetReadyBeamID();
			if(id != -1){
				if(id != 0)
				{
					m_BeamExtraShotCount++;
					m_BeamExtraShotStock--; 
					if(g_Debug){m_BeamExtraShotStock ++;}
				}

				//ː̒ǉ
				m_BeamShotCount++;
				SetCommonDataEx("INVADER", "Beam.Count", m_BeamShotCount);

				PlaySE(se_Shot);
				main_ObjBeam_Normal(id, GetPlayerX(), GetPlayerY()- 14, [_BEAMTYPE_NORMAL, _BEAMTYPE_EXTRA][id != 0]);
				//CreateShotFromScript("Beam", GetPlayerX(), GetPlayerY()- 14, 9, -90, 0, id);
				
				func_ObjBeam_SetEnergy(id, 0);
				func_ObjBeam_SetStatus(id, _BEAM_SHOOT);
			}
		}

		yield;
	}

	//GlM[̉
	function AddEnergy()
	{
		ascent(i in 0..m_BeamSlot)
		{
			if(func_ObjBeam_GetStatus(i) == _BEAM_USED)
			{
				let energy = func_ObjBeam_GetEnergy(i);
				if(i != 0){ energy += m_BeamMaxEnergy / 2; }	//GNXgVbg
				else if(!REMY_Stick_Hold(_KEY_SHOT)){ energy += m_BeamRecovery; }	//CVbg
				else{ energy += m_BeamRecovery/2; }		//Vbg{^Ăƒx

				if(energy >= m_BeamMaxEnergy )
				{
					energy = m_BeamMaxEnergy;
					func_ObjBeam_SetStatus(i, _BEAM_READY);
				}
				func_ObjBeam_SetEnergy(i, energy);
			}
		}
		
	}

	//ID擾
	function GetReadyBeamID()
	{
		let id = -1;
		if(func_ObjBeam_GetStatus(0) == _BEAM_READY)
		{
			return 0;
		}
		if(m_BeamExtraShotStock <= 0) { return -1; }

		ascent(i in 1..m_BeamSlot)
		{
			if(func_ObjBeam_GetStatus(i) == _BEAM_READY)
			{
				id = i;
				break;
			}
		}
		return id;
	}

}//end task

//r[̃qbg
task func_Beam_HitNormal(let id, let posX, let posY)
{
	func_ObjBeam_Hit(id);	//r[̃Ct炷
	main_Beam_HitEffect(posX, posY, 50, 25, 0);
	loop(5){yield;}
	main_Beam_HitEffect(posX, posY, 50, 30, 45);

}//end task 

//qbgGtFNg
task main_Beam_HitEffect(let posX, let posY, let size, let time, let angle_base)
{
	let obj = REMY_Effect_CreateObject(img_Explode, 10, 5);
	Obj_SetPosition(obj, posX, posY);

	ascent(j in 0..5)
	{
		VertOuter(j * 2);
		VertInner(j * 2 + 1);
	}

	loop(time){yield;}
	
	Obj_Delete(obj);
	
	//---------
	task VertOuter(let id)
	{
		let angle = angle_base - 45 + 90 * (trunc(id/2));
		let radius = 0;

		ascent(i in 0..time){
			radius = size * (1-  (1 -i / time) * (1 -i / time));
			let x = radius * sin(angle);
			let y = radius * cos(angle);		
			ObjEffect_SetVertexXY(obj, id, x, y);
			ObjEffect_SetVertexUV(obj, id, [0, 16, 0, 16, 0][trunc(id/2)],  [0, 0, 16, 16, 0][trunc(id/2)]);
			ObjEffect_SetVertexColor(obj, id, 255, 255, 255, 255);
			yield;
		}
	}
	
	task VertInner(let id)
	{
		let angle = angle_base - 45 + 90 * (trunc(id/2));
		let radius = 0;

		ascent(i in 0..time){
			radius = size * ((i / time));
			let x = radius * sin(angle);
			let y = radius * cos(angle);		
			ObjEffect_SetVertexXY(obj, id, x, y);
			ObjEffect_SetVertexUV(obj, id, [0, 16, 0, 16, 0][trunc(id/2)],  [0, 0, 16, 16, 0][trunc(id/2)]);
			ObjEffect_SetVertexColor(obj, id, 255, 255, 255, 255);
			yield;
		}
	}
	
}

//̎擾
function func_Beam_AddPower(let val)
{
	m_BeamPower += val;

	let addshot = trunc(m_BeamPower/m_BeamPowerNorma);
	if(addshot > 0)
	{
		func_Beam_AddShotStock(addshot);
		m_BeamPower = m_BeamPower % m_BeamPowerNorma;
	}

}//end function

function func_Beam_GetPower()
{
	return m_BeamPower;
}//end function

//VbgXgbN
function func_Beam_AddShotStock(let val)
{
	m_BeamExtraShotStock += val;
	m_BeamExtraShotStock = REMY_Math_Min(m_BeamExtraShotStock, m_BeamExtraShotMaxStock);

}//end function


//XgbN擾
function func_Beam_GetStockCount()
{
	return m_BeamExtraShotStock;
}//end function

//XgbNő擾
function func_Beam_GetStockMaxCount()
{
	return m_BeamExtraShotMaxStock;
}//end function

//̎擾
function func_Beam_GetShotCount()
{
	return m_BeamShotCount;
}

//GNXg̎擾
function func_Beam_GetExtraShotCount()
{
	return m_BeamExtraShotCount;
}

//XyV̎擾
function func_Beam_GetSpecialShotCount()
{
	return m_BeamSpecialShotCount;
}


//̐ݒBXe[WłVɃZbgB
function func_Beam_ResetShotCount()
{
	m_BeamShotCount = 7;
	SetCommonDataEx("INVADER", "Beam.Count", m_BeamShotCount);
	m_BeamExtraShotCount = 0;
	m_BeamSpecialShotCount = 0;

}


//`[WVbg-------------------------------------------

task main_SpecialBeam_MainRoutine()
{
	let beamIDFirst = const_BeamSlotMax - m_BeamSlot;
	let beamIDLast = beamIDFirst + m_SpecialBeamSlot -1;
	let charged = false;



	loop
	{
		yield;
		AddEnergy();

		if(!REMY_Stick_Hold(_KEY_SKIP))
		{
			if(m_SpecialBeamEnergy == m_SpecialBeamMaxEnergy && m_BeamExtraShotStock >= m_SpecialBeamCost)
			{
				m_SpecialBeamEnergy = 0;

				alternative(m_SpecialBeamEquip)
				case(_SPECIALBEAM_RAPIER){ BeamShotRapier(); }
				case(_SPECIALBEAM_SPREAD){ BeamShotSpread(); }
				case(_SPECIALBEAM_ERASE){ BeamShotErase(); }
				case(_SPECIALBEAM_FREEZE){ BeamShotFreeze(); }
			}
		}

		if(IsEquipSpecial()&& REMY_Stick_Hold(_KEY_SKIP) && !OnPlayerMissed() && m_BeamExtraShotStock >= m_SpecialBeamCost)
		{
			m_SpecialBeamEnergy += m_SpecialBeamCharge;
			m_SpecialBeamEnergy = REMY_Math_Min(m_SpecialBeamEnergy, m_SpecialBeamMaxEnergy);
			if(!charged && m_SpecialBeamEnergy==m_SpecialBeamMaxEnergy)
			{
				PlaySE(se_ChargeReady);
				charged = true;
			}
		}
		else
		{
			charged = false;
			m_SpecialBeamEnergy -= m_SpecialBeamCharge * 3;
			m_SpecialBeamEnergy = REMY_Math_Max(m_SpecialBeamEnergy, 0);
		}

	}

	function IsEquipSpecial()
	{
		return m_SpecialBeamEquip != _SPECIALBEAM_NONE;
	}//end function

	//CsA
	function BeamShotRapier()
	{
		let id = GetReadyBeamID();
		if(id != -1){
			m_BeamExtraShotStock -= m_SpecialBeamCost;
			m_BeamSpecialShotCount++;

			PlaySE(se_Shot);
			main_ObjBeam_Rapier(id, GetPlayerX(), GetPlayerY()- 14, m_SpecialBeamLevel);

			//CreateShotFromScript("BeamRapier", GetPlayerX(), GetPlayerY()- 14, 12, -90, 0, [id, m_SpecialBeamLevel]);
			
			func_ObjBeam_SetEnergy(id, 0);
			func_ObjBeam_SetStatus(id, _BEAM_SHOOT);
		}
	}

	//Xvbh
	function BeamShotSpread()
	{
		let enableID = [];
		let shotnum = [2,2,3,5][m_SpecialBeamLevel];
		loop(shotnum){
			let id = GetReadyBeamID();
			if(id != -1)
			{
				enableID = enableID ~ [id]; 
				func_ObjBeam_SetStatus(id, _BEAM_SHOOT);
			}
		}
		if(length(enableID) > 0){
			let enable_shotnum = length(enableID);
			m_BeamExtraShotStock -= REMY_Math_Max(m_SpecialBeamCost + (shotnum - enable_shotnum), 1);
			m_BeamSpecialShotCount++;
			PlaySE(se_Shot);
			
			let ax = [[0], [0], [-10,10], [-10,0,10], [-18, -8, 8, 18], [-24, -12, 0, 12, 24]][enable_shotnum];
			let ay = [[-14], [-14], [-14,-14], [-10,-14,-10], [-10, -14, -14, -10], [-6, -10, -14, -10, -6]][enable_shotnum];
			ascent(i in 0..enable_shotnum){
				main_ObjBeam_Normal(enableID[i], GetPlayerX() + ax[i], GetPlayerY() + ay[i], _BEAMTYPE_SPECIAL);

				//CreateShotFromScript("Beam", GetPlayerX() + ax[i], GetPlayerY() + ay[i], 9, -90, 0, enableID[i]);
				func_ObjBeam_SetEnergy( enableID[i], 0);
			}
		}
	}

	//CCX
	function BeamShotErase()
	{
		m_BeamExtraShotStock -= m_SpecialBeamCost;

		let id = GetReadyBeamID();
		if(id != -1){
			m_BeamSpecialShotCount++;
			main_ObjBeam_Eraser(id, GetPlayerX(), GetPlayerY() - 14);
			//CreateShotFromScript("Beam", GetPlayerX(), GetPlayerY() - 14, 5, -90, 0, id);
			func_ObjBeam_SetEnergy(id, 0);
			func_ObjBeam_SetStatus(id, _BEAM_SHOOT);
		}

		PlaySE(se_Shot);
		loop(2){ yield; }
		let r = [100, 60, 100, 400][m_SpecialBeamLevel];
		main_Effect_EraseShot(GetPlayerX(),GetPlayerY() - 25, r, 16);

		main_Effect_SquareEffect(GetPlayerX(), GetPlayerY(), r, 16, -22.5, [150, 150, 255, 150]);
		main_Effect_SquareEffect(GetPlayerX(), GetPlayerY(), r, 16, 22.5, [150, 150, 255, 150]);
	}

	//t[Y
	function BeamShotFreeze()
	{
		m_BeamExtraShotStock -= m_SpecialBeamCost;

		PlaySE(se_Shot);
		let t = [5, 10, 14, 20][m_SpecialBeamLevel];
		func_Enemy_StopAll(t);
		main_Effect_FreezeTimeCount(t);

		main_Effect_SquareEffect(GetPlayerX(), GetPlayerY(), 30, 16, 45, [150, 150, 255, 250]);
	}


	//GlM[̉
	function AddEnergy()
	{
		ascent(i in beamIDFirst..beamIDLast)
		{
			if(func_ObjBeam_GetStatus(i) == _BEAM_USED)
			{
				let energy = func_ObjBeam_GetEnergy(i);
				energy += m_BeamMaxEnergy / 2;
				if(energy >= m_BeamMaxEnergy )
				{
					energy = m_BeamMaxEnergy;
					func_ObjBeam_SetStatus(i, _BEAM_READY);
				}
				func_ObjBeam_SetEnergy(i, energy);
			}
		}
		
	}

	//ID擾
	function GetReadyBeamID()
	{
		let id = -1;

		ascent(i in beamIDFirst..beamIDLast)
		{
			if(func_ObjBeam_GetStatus(i) == _BEAM_READY)
			{
				id = i;
				break;
			}
		}
		return id;
	}

}//end task

//XyV̑
function func_SpecialBeam_Equip(let equip)
{
	//͂
	if(equip == _SPECIALBEAM_NONE)
	{
		m_SpecialBeamCost = 0;
		m_SpecialBeamLevel = 0;
		m_SpecialBeamEquip = equip;
		return;
	}

	//ɑĂꍇ̓xAbv
	if(m_SpecialBeamEquip == equip)
	{
		m_SpecialBeamLevel ++;
		m_SpecialBeamCost ++;
		m_SpecialBeamLevel = REMY_Math_Min(m_SpecialBeamLevel, 3);
	}else
	{
		m_SpecialBeamLevel = 1;
		m_SpecialBeamCost = 0;
		m_SpecialBeamEquip = equip;
	}

	alternative(equip)
	case(_SPECIALBEAM_RAPIER)
	{
		m_SpecialBeamCost = [3, 3, 4, 5][m_SpecialBeamLevel];
		m_SpecialBeamCharge = 1.5;
	}
	case(_SPECIALBEAM_SPREAD)
	{
		m_SpecialBeamCost = [2, 2, 3, 4][m_SpecialBeamLevel];
		m_SpecialBeamCharge = 2
	}
	case(_SPECIALBEAM_ERASE)
	{
		m_SpecialBeamCost = [1, 1, 2, 3][m_SpecialBeamLevel];
		m_SpecialBeamCharge = 4;
	}
	case(_SPECIALBEAM_FREEZE)
	{
		m_SpecialBeamCost = [4, 4, 5, 6][m_SpecialBeamLevel];
		m_SpecialBeamCharge = 1;
	}

}//end task

//擾
function func_SpecialBeam_GetEquip()
{
	return m_SpecialBeamEquip;
}//end function

//GlM[擾
function func_SpecialBeam_GetEnergyRate()
{
	return m_SpecialBeamEnergy/m_SpecialBeamMaxEnergy ;
}//end function

//RXg擾
function func_SpecialBeam_GetCost()
{
	return m_SpecialBeamCost;
}//end function


//x擾
function func_SpecialBeam_GetLevel()
{
	return m_SpecialBeamLevel;
}//end function

//XyV{ԂB*2,*3,*4ɂȂB
function func_SpecialBeam_GetSpecialRate()
{
	return m_SpecialBeamLevel + 1;
}//end function

//XyVVbgۂ
function func_SpecialBeam_IsSpecialShot(let id)
{
	return (id >= m_BeamSlot)||(func_Enemy_GetStopAllCounter() > 0);
}//end function

