#東方弾幕風[Player]	//自機スクリプトであることを示します
#ScriptVersion[2]	//スクリプトバージョン2が必須です
#Menu[ルーミア]		//自機選択画面で表示されるメニューです
#Text[プレイヤーサンプルです。闇符]	//自機選択画面で表示されるテキストです
#Image[.\RumiaSelect.png]	//自機選択画面で表示される画像ファイルへのパスです
#ReplayName[Rumia]	//リプレイ選択時に表示される文字です。8文字以内です。

script_player_main
{
	let current = GetCurrentScriptDirectory();//カレントディレクトリを取得
	let imgRumia = current~"Rumia.png";
	let imgRumiaCutIn = current~"RumiaCutIn.png";
	let shotCount = -1;//弾を連続で発射するための変数
	let bNextShot = false;//ちょん押しでも自弾を連続発射するための変数(説明しづらい)
	let objShot = NULL;//誘導弾
	task slowShot()
	{	//低速移動時の誘導弾
		//敵を追尾してダメージを与える
		if(!Obj_BeDeleted(objShot)){return;}//1個しか存在しない
		objShot = Obj_Create(OBJ_SHOT);
		Obj_SetX(objShot, GetPlayerX);//x座標設定
		Obj_SetY(objShot, GetPlayerY);//y座標設定;
		Obj_SetSpeed(objShot, 5);//速度設定
		ObjShot_SetGraphic(objShot, 2);//画像設定
		ObjShot_SetDamage(objShot, 2);//ダメージを設定
		ObjShot_SetPenetration(objShot, 1000000);//貫通力は適当に大きく
		while( !Obj_BeDeleted(objShot) )
		{//削除されるまでループを実行		
			//ホーミング
			let toAngle=atan2(GetEnemyY()-Obj_GetY(objShot), GetEnemyX()-Obj_GetX(objShot));		
			Obj_SetAngle(objShot, toAngle);
			yield;
		}

	}
	@Initialize
	{	
		//自機の初期化時に一回だけ呼び出される部分です
		SetPlayerLifeImage(imgRumia, 1, 5, 49, 60);//残機数の画像
		LoadGraphic(imgRumia);
		SetSpeed(4, 1.6);//移動速度を設定
		LoadPlayerShotData(current~"RumiaShotData.txt");
		SetItemCollectLine(128);//アイテム回収ラインを設定
	}
	
	@MainLoop
	{	
		//毎フレーム実行される部分です
		//
		if((GetKeyState(VK_SHOT)==KEY_PUSH || GetKeyState(VK_SHOT)==KEY_HOLD || bNextShot==true) && shotCount==-1)
		{
			shotCount = 0;
			bNextShot = false;
		}
		if(GetKeyState(VK_SHOT)==KEY_HOLD && shotCount>0)
		{
			bNextShot = true;
		}
		if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH || GetKeyState(VK_SLOWMOVE)==KEY_HOLD)
		{	//低速移動時の自弾
			if(shotCount != -1)
			{
				slowShot();
			}
			if(shotCount%5 == 0)
			{
				CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 265, 1.3, 2, 1);
				CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 270, 1.5, 3, 1);
				CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 275, 1.3, 2, 1);
			}
		}
		else
		{	//高速移動自の自弾発射
			Obj_Delete(objShot);//高速移動時は低速移動時の特殊弾を削除
			if(shotCount%5 == 0)
			{
				CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 255, 1.3, 1, 1);
				CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 265, 1.5, 2, 1);
				CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 270, 1.7, 3, 1);
				CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 275, 1.5, 2, 1);
				CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 285, 1.3, 1, 1);
			}		
		}

		if(shotCount >= 0)
		{
			shotCount++;
		}
		if(shotCount == 30)
		{
			shotCount=-1;
		}
		
		SetIntersectionCircle(GetPlayerX, GetPlayerY, 1);//当たり判定登録	
		yield;
	}
	@Missed{}
	@SpellCard
	{
		//スペルカードを発動した瞬間に呼ばれる部分です
		//ここでGetKeyStateで移動状態を判断したりして
		//呼び出すスペルを選びます	
		if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH || GetKeyState(VK_SLOWMOVE)==KEY_HOLD)
		{	
			//低速移動時
			UseSpellCard("Demarcation", true);
		}
		else
		{
			//高速移動時
			UseSpellCard("Demarcation", false);
		}
		
		//カットイン
		CutIn(KOUMA,"闇符「ディマーケイション」", imgRumiaCutIn);
	}
	
	@DrawLoop
	{
		//描画ループ。スキップされない限り1フレームに1回実行されます
		SetColor(255, 255, 255);
		SetRenderState(ALPHA);
		SetTexture(imgRumia);
		if(GetKeyState(VK_LEFT)==KEY_PUSH || GetKeyState(VK_LEFT)==KEY_HOLD)
		{
			SetGraphicRect(1, 133, 49, 188);
		}
		else if(GetKeyState(VK_RIGHT)==KEY_PUSH || GetKeyState(VK_RIGHT)==KEY_HOLD)
		{
			SetGraphicRect(1, 69, 49, 124);
		}
		else 
		{
			SetGraphicRect(1, 5, 49, 60);
		}
		DrawGraphic(GetPlayerX(), GetPlayerY());	
	}
	
	@Finalize
	{
		//スクリプト終了時に一回だけ呼び出される部分です
		DeleteGraphic(imgRumia);
	}
}

script_spell Demarcation
{
	//低速移動時は、敵の座標に直に出現
	//高速移動時は、自機の周囲に出現
	let bSlowMove = GetArgument();//低速移動フラグ
	let current = GetCurrentScriptDirectory();
	let imgEffect = current~"RumiaSpell.png";

	@Initialize
	{
		LoadGraphic(imgEffect);
		SetPlayerInvincibility(300);//無敵時間を設定
		run();
	}
	@MainLoop
	{
		yield;
	}
	@Finalize
	{
		DeleteGraphic(imgEffect);
	}
	task run()
	{
		loop(48){yield;}//組み込みのカットインが終わるまで待機
		effect(0);
		effect(1);
		loop(220){;yield;}
		End();
	}

	task effect(num)
	{	//エフェクト用タスク
		let tv=0;
		let angle=0;
		let alpha=0;	
		task alphaState
		{	//α値を変更するためのタスク
			alpha=0;
			loop(256/3){alpha+=3; yield;}
			loop(90){yield;}
			loop{alpha-=8; yield;}
		}
		task lineEffect
		{
			loop(120){concentrationLine();loop(1){yield;}}
		}
		alphaState;
		if(bSlowMove==true){lineEffect;}
		
		let obj = Obj_Create(OBJ_SPELL);//スペルオブジェクトを作成
		ObjEffect_SetTexture(obj, imgEffect);//テクスチャを設定
		ObjEffect_SetRenderState(obj, ADD);//描画方法を設定
		ObjEffect_SetPrimitiveType(obj, PRIMITIVE_TRIANGLESTRIP);//プリミティブタイプを設定
		ObjEffect_CreateVertex(obj, 10);//頂点を10個つくる
		
		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
			{
				//高速移動時は広範囲
				x = 512*cos(angle);
				y = 512*sin(angle);
			}
			ObjEffect_SetVertexXY(obj, i*2, x, y);//頂点の座標を設定
			ObjEffect_SetVertexXY(obj, i*2+1, 0, 0);
			ObjEffect_SetVertexColor(obj, i*2, 0, 255, 255, 255);//頂点カラーを設定
		}
		
		while(!Obj_BeDeleted(obj))
		{
			tv-=1;
			if(num == 0){angle+=1;}
			else if(num == 1){angle-=1;}
			ObjEffect_SetAngle(obj, 0, 0, angle);//描画角度を設定
			if(bSlowMove)
			{	//低速移動時
				Obj_SetPosition(obj, GetEnemyX, GetEnemyY);
				SetIntersectionCircle(GetEnemyX, GetEnemyY, 81, 5, true);//当たり判定を登録				
			}
			else 
			{	//高速移動時
				Obj_SetPosition(obj, GetPlayerX, GetPlayerY);//座標を設定
				SetIntersectionCircle(GetPlayerX, GetPlayerY, 256, 2, true);//当たり判定を登録
			}
			ascent(i in 0..5)
			{
				ObjEffect_SetVertexUV(obj, i*2,   16*i,tv);//テクスチャの座標を設定
				ObjEffect_SetVertexUV(obj, i*2+1 ,32,  64+tv);
				
				ObjEffect_SetVertexUV(obj, i*2,   16*i, tv);	
				ObjEffect_SetVertexUV(obj, i*2+1, 32,   64+tv);
				
				ObjEffect_SetVertexColor(obj, i*2+1, alpha, 255, 255, 255);		
			}
			yield;
		}
		
	}
	
	task concentrationLine()
	{	//線が集まる感じのエフェクト
		let angle=rand(0, 360);
		let alpha=0;	
		let scale=3;
		
		let obj = Obj_Create(OBJ_SPELL);//スペルオブジェクトを作成
		ObjEffect_SetTexture(obj, imgEffect);//テクスチャを設定
		ObjEffect_SetRenderState(obj, ADD);//描画方法を設定
		ObjEffect_SetPrimitiveType(obj, PRIMITIVE_TRIANGLELIST);//プリミティブタイプを設定
		ObjEffect_CreateVertex(obj, 3);//頂点を3個つくる
		ObjEffect_SetAngle(obj, 0, 0, angle);//描画角度を設定
		
		//頂点座標を設定
		ObjEffect_SetVertexXY(obj, 0,  0,  10);
		ObjEffect_SetVertexXY(obj, 1, -10, 50);
		ObjEffect_SetVertexXY(obj, 2, 10,  50);
		
		//頂点のUV値を設定
		ObjEffect_SetVertexXY(obj, 0, 10,  10);
		ObjEffect_SetVertexXY(obj, 1,  0,  50);
		ObjEffect_SetVertexXY(obj, 2, 20,  50);
		
		//色設定
		ObjEffect_SetVertexColor(obj, 0, alpha, 255, 0, 255);
		ObjEffect_SetVertexColor(obj, 1, 0, 255, 0, 255);
		ObjEffect_SetVertexColor(obj, 2, 0, 255, 0, 255);
		
		loop(60)
		{
			scale-=3/60;
			alpha+=5;
			ObjEffect_SetVertexColor(obj, 0, alpha, 255, 0, 255);
			ObjEffect_SetScale(obj, scale, scale*3);	
			Obj_SetPosition(obj, GetEnemyX, GetEnemyY);	
			yield;	
		}
		Obj_Delete(obj);
	}


}
