//-----------------------
//̉̃IuWFNgǗ
//-----------------------
let m_BeamData_Status;
let m_BeamData_Life;
let m_BeamData_Energy;
let m_BeamData_PositionX;
let m_BeamData_PositionY;

let m_BeamData_BaseShotlist = [RED05,GREEN05,BLUE05,YELLOW05,PURPLE05,AQUA05,ORANGE05,WHITE05, RED11,GREEN11];

function func_ObjBeam_Reset()
{

	let init = [];
	ascent(i in 0..const_BeamSlotMax)
	{
		init = init ~ [0];
	}
	m_BeamData_Status = init;
	m_BeamData_Life = init;
	m_BeamData_Energy = init;
	m_BeamData_PositionX = init;
	m_BeamData_PositionY = init;

}

function func_ObjBeam_GetStatus(let id){return m_BeamData_Status[id]; }
function func_ObjBeam_SetStatus(let id, let val){m_BeamData_Status[id] = val; }

function func_ObjBeam_GetX(let id){return m_BeamData_PositionX[id]; }
function func_ObjBeam_GetY(let id){return m_BeamData_PositionY[id]; }

function func_ObjBeam_GetEnergy(let id){return m_BeamData_Energy[id]; }
function func_ObjBeam_SetEnergy(let id, let val){m_BeamData_Energy[id] = val; }

//CtP炷
function func_ObjBeam_Hit(let id){ m_BeamData_Life[id] = m_BeamData_Life[id] -1; }

task main_ObjBeam_Normal(let beamID, let x, let y, let beam_type)
{
	let alive = true;
	let color;

	SetBeamParam();

	let obj_beam =  REMY_Effect_CreateObject(img_System, 4, 5);
	REMY_Effect_SetVertexSquare(obj_beam, func_GetGraphicRect("BEAM"), [0, 0], color);
	Obj_SetPosition(obj_beam, x, y);
	Obj_SetSpeed(obj_beam, 9);
	Obj_SetAngle(obj_beam, -90);
	ObjEffect_SetScale(obj_beam, 1, 1);

	//tOZbg
	m_BeamData_Status[beamID] =_BEAM_SHOOT;
	m_BeamData_Life[beamID] = 1;

	local
	{
		Move();
		SetObjShot(true);
		loop(2){ SetObjShot(false); }
		loop{
			if(!alive){ break; }
			yield;
		}
		Finalize();
	}

	task Move()
	{

		loop{
			if(!alive){ break; }

			//ŊmF
			local{
				let state = m_BeamData_Status[beamID];
				if(state == _BEAM_USED || state == _BEAM_DISABLE){ alive = false; break; }
			}
			local
			{
				if(Obj_GetY(obj_beam) < -10)
				{
					SetCommonDataEx("INVADER","ScoreBonus.HitComboCount", 0);	//R{Oɂ
					alive = false;
					break;
				}
			}
			local{
				let life = m_BeamData_Life[beamID];
				if(life <= 0){ alive = false; break; }
			}

			//Wo^
			local{
				m_BeamData_PositionX[beamID] = Obj_GetX(obj_beam);
				m_BeamData_PositionY[beamID] = Obj_GetY(obj_beam);
			}	
			
			yield;
		}


	}

	function SetBeamParam()
	{
		alternative(beam_type)
		case(_BEAMTYPE_NORMAL){ color = [255, 240, 240, 240]; }
		case(_BEAMTYPE_EXTRA){ color = [255, 50, 250, 100]; }
		case(_BEAMTYPE_SPECIAL){ color = [255, 50, 250, 250]; }

	}

	task SetObjShot(let type)
	{
		let obj = Obj_Create(OBJ_SHOT);
		ObjShot_SetGraphic(obj, [WHITE05,m_BeamData_BaseShotlist[beamID] ][type]);
		Obj_SetCollisionToPlayer(obj, false);
		Obj_SetAlpha(obj, 00);
		loop
		{
			if(!alive){ break; }
			Obj_SetPosition(obj, Obj_GetX(obj_beam), Obj_GetY(obj_beam));
			if(Obj_BeDeleted(obj)){ alive = false; }
			yield;
		}
		Obj_Delete(obj);

	}

	function Finalize()
	{
		Obj_Delete(obj_beam);

		if(	m_BeamData_Status[beamID] == _BEAM_DISABLE){ return; }
		m_BeamData_Status[beamID] = _BEAM_USED;
	}

}//end task



task main_ObjBeam_Rapier(let beamID, let x, let y, let beam_level)
{
	let alive = true;
	let default_life;
	let hit = false;

	let obj_beam =  REMY_Effect_CreateObject(img_System, 4, 5);
	REMY_Effect_SetVertexSquare(obj_beam, func_GetGraphicRect("BEAM"), [0, 0], [255, 250, 50, 100]);
	Obj_SetPosition(obj_beam, x, y);
	Obj_SetSpeed(obj_beam, 12);
	Obj_SetAngle(obj_beam, -90);
	ObjEffect_SetScale(obj_beam, 0.8, 1.4);

	default_life = [3, 3, 4, 5][beam_level];

	//tOZbg
	m_BeamData_Status[beamID] =_BEAM_SHOOT;
	m_BeamData_Life[beamID] = default_life;

	local
	{
		Move();
		SetObjShot(true);
		loop(2){ SetObjShot(false); }
		loop{
			if(!alive){ break; }
			yield;
		}
		Finalize();
	}

	task Move()
	{

		loop{
			if(!alive){ break; }

			//ŊmF
			local{
				let state = m_BeamData_Status[beamID];
				if(state == _BEAM_USED || state == _BEAM_DISABLE){ alive = false; break; }
			}
			local
			{
				if(Obj_GetY(obj_beam) < -10)
				{
					if(!hit){ SetCommonDataEx("INVADER","ScoreBonus.HitComboCount", 0); }	//R{Oɂ
					alive = false;
					break;
				}
			}
			local{
				let life = m_BeamData_Life[beamID];
				if(!hit){ hit = (life != default_life); }

				if(life <= 0){ alive = false; break; }
			}

			//Wo^
			local{
				m_BeamData_PositionX[beamID] = Obj_GetX(obj_beam);
				m_BeamData_PositionY[beamID] = Obj_GetY(obj_beam);
			}	
			
			yield;
		}


	}

	task SetObjShot(let type)
	{
		let obj = Obj_Create(OBJ_SHOT);
		ObjShot_SetGraphic(obj, [WHITE05,m_BeamData_BaseShotlist[beamID] ][type]);
		Obj_SetCollisionToPlayer(obj, false);
		Obj_SetAlpha(obj, 00);
		ObjShot_SetBombResist(obj, true);
		loop
		{
			if(!alive){ break; }
			Obj_SetPosition(obj, Obj_GetX(obj_beam), Obj_GetY(obj_beam));
			if(Obj_BeDeleted(obj)){ alive = false; }
			yield;
		}
		Obj_Delete(obj);

	}

	function Finalize()
	{
		Obj_Delete(obj_beam);

		if(	m_BeamData_Status[beamID] == _BEAM_DISABLE){ return; }
		m_BeamData_Status[beamID] = _BEAM_USED;
	}

}//end task

//CCT
task main_ObjBeam_Eraser(let beamID, let x, let y)
{
	let alive = true;
	let lifetime = 20;

	let obj_beam =  REMY_Effect_CreateObject(img_System, 4, 5);
	REMY_Effect_SetVertexSquare(obj_beam, func_GetGraphicRect("BEAM"), [0, 0], [255, 250, 50, 200]);
	Obj_SetPosition(obj_beam, x, y);
	Obj_SetSpeed(obj_beam, 4);
	Obj_SetAngle(obj_beam, -90);
	ObjEffect_SetScale(obj_beam, 1.2, 1);

	//tOZbg
	m_BeamData_Status[beamID] =_BEAM_SHOOT;
	m_BeamData_Life[beamID] = 10;

	local
	{
		Move();
		SetObjShot(true);
		loop(2){ SetObjShot(false); }
		loop{
			if(!alive){ break; }
			yield;
		}
		Finalize();
	}

	task Move()
	{
		let speed = 2;
		loop{
			if(!alive){ break; }
			speed = (speed - 0.1);
			if(speed < 0){ speed = 0; }
			Obj_SetSpeed(obj_beam, speed);

			local
			{
				lifetime--;
				if(lifetime <= 0){alive = false; break;}
			}
			//ŊmF
			local{
				let state = m_BeamData_Status[beamID];
				if(state == _BEAM_USED || state == _BEAM_DISABLE){ alive = false; break; }
			}
			local
			{
				if(Obj_GetY(obj_beam) < -10)
				{
					alive = false;
					break;
				}
			}
			local{
				let life = m_BeamData_Life[beamID];
				if(life <= 0){ alive = false; break; }
			}

			//Wo^
			local{
				m_BeamData_PositionX[beamID] = Obj_GetX(obj_beam);
				m_BeamData_PositionY[beamID] = Obj_GetY(obj_beam);
			}	
			
			yield;
		}


	}

	task SetObjShot(let type)
	{
		let obj = Obj_Create(OBJ_SHOT);
		ObjShot_SetGraphic(obj, [WHITE05,m_BeamData_BaseShotlist[beamID] ][type]);
		Obj_SetCollisionToPlayer(obj, false);
		Obj_SetAlpha(obj, 00);
		ObjShot_SetBombResist(obj, true);
		loop
		{
			if(!alive){ break; }
			Obj_SetPosition(obj, Obj_GetX(obj_beam), Obj_GetY(obj_beam));
			if(Obj_BeDeleted(obj)){ alive = false; }
			yield;
		}
		Obj_Delete(obj);

	}

	function Finalize()
	{
		Obj_Delete(obj_beam);

		if(	m_BeamData_Status[beamID] == _BEAM_DISABLE){ return; }
		m_BeamData_Status[beamID] = _BEAM_USED;
	}

}//end task
