#TouhouDanmakufu
#Title[Reimu Non Spellcard 1- easier version]
#Text [English:The only shitty pattern in the full script
Reimu tests you in this noncard
Spanish: el unico patron malo en todo el script
Reimu te prueba en esta noncard]
#Player[FREE]
#ScriptVersion[2]			

script_enemy_main{         
	let CSD	= GetCurrentScriptDirectory;
let angul = 180;
let angull = 180;
 	let imgBoss = CSD ~ "system\raymoosprite.png";
	let cut = CSD ~ "system\GusanoCirnoCut.png";
	let bg = CSD ~ "system\lake.png";
        let bgm = CSD ~ "bgm\bgm.mp3";
                  #include_function ".\function_cutin.txt"
#include_function ".\blossom.txt"
#include_function ".\newsfx.txt";
#include_function ".\Obj_hpb.txt"
#include_function ".\let.txt"
	@Initialize{
                LoadUserShotData(CSD ~ "kshotData.txt");
		SetLife(4000);
		SetTimer(45);
SetDamageRate(100, 30);
hpb(0,1,0);
//Timer(2,0);
                SetInvincibility(180);
		SetMovePosition01(GetCenterX,GetCenterY,5);
		LoadGraphic(imgBoss);
		LoadGraphic(cut);
		LoadGraphic(bg);
                PlayMusic(bgm);
		SetCommonData("BGM", "BGM : A Tiny, Tiny, Clever Commander");
		SetCommonData("frame",0);
		SetCommonData("length",460);
	
		mainTask;
	}

	@MainLoop{
		SetCollisionA(GetX,GetY,32);
		SetCollisionB(GetX,GetY,16);
		yield;
	}

	@DrawLoop{
DrawText("Reimu Hakurei", 40, 35, 12, 255);
		SetTexture(imgBoss);
		SetRenderState(ALPHA);
		SetAlpha(255);
		SetGraphicRect(0,0,63,73);
		SetGraphicScale(1,1);
		SetGraphicAngle(0,0,0);
		DrawGraphic(GetX,GetY);
	}

	@BackGround{
		SetTexture(bg);
		SetRenderState(ALPHA);
		SetAlpha(255);
		SetGraphicRect(0,0,63,73);
		SetGraphicScale(2,2);
		SetGraphicAngle(0,0,0);
		DrawGraphic(GetCenterX,GetCenterY);
	}

	@Finalize{
		DeleteGraphic(imgBoss);
		DeleteGraphic(cut);
		DeleteGraphic(bg);
	}

	// main task, activates stuff.
	task mainTask{
		yield;
		fire;
		movement;
	}

	task movement{
		loop{
			SetMovePositionRandom01(50,50,9,GetCenterX-80,GetCenterY-120,GetCenterX+80,GetCenterY-100);
			wait(240);
			yield;
		}
	}
	task fire{
//StartMapleConcentrate;
SetColor(255,0,0);
Concentration01(60);
SetColor(255,255,255);
PlaySE(charge);
wait(60);
		loop{
		loop(20){
PlaySE(shot2);

			ascent(i in 0..25){
CreateShotA(0,GetX,GetY,0);
SetShotDataA(0,0,1,angul+i*9,0,0.1,3,91);
angul += 10;
FireShot(0);
}
ascent(i in 0..19){
CreateShotA(1,GetX,GetY,0);
SetShotDataA(1,0,1,angull+i*10,0,0.1,3,100);
angull += 10;
FireShot(1);
}				
			wait(10);
			yield;
		}
StartMapleConcentrate;
PlaySE(charge);
wait(60);
loop(20){
PlaySE(shot2);

			ascent(i in 0..15){
CreateShotA(0,GetX+sin(30)*30,GetY+cos(30)*30,0);
SetShotDataA(0,0,1,GetAngleToPlayer+i*8,0,0.1,4,92);
angul += 10;
FireShot(0);
}
wait(10);
ascent(i in 0..15){
CreateShotA(1,GetX+sin(30)*30,GetY+cos(30)*30,0);
SetShotDataA(1,0,1,GetAngleToPlayer-i*8,0,0.1,4,99);
angull += 10;
FireShot(1);
}			
			wait(10);
			yield;
		}
wait(60);
loop(30){
PlaySE(shot5);
CreateReflectNway( GetX, GetY, 2, rand(0,360), 0, 0, 5, 1, 98, 0, rand(1,9), 6,  300);
CreateReflectNway( GetX, GetY, 2, rand(0,360), 0, 0, 5, 1, 98, 0, rand(1,9), 6, 300 );
CreateReflectNway( GetX, GetY, 2, rand(0,360), 0, 0, 5, 1, 98, 0, rand(1,9), 6, 300 );
wait(10);
yield;
}
angul ++;
angull ++;
wait(120);
yield;
}
	}

	// wait function
	function wait(w){
		loop(w){yield;}
	}
function CreateReflectShot02(PosX,PosY,Speed,Angle,Accelerate,MaxSpeed,Graphic,Delay,Wall,Count,Frame) {
  	let Obj = Obj_Create(OBJ_SHOT);
  	
  	// オブジェクト弾の基本パラメータを設定します。
  	Obj_SetPosition(Obj,PosX,PosY);
  	Obj_SetSpeed(Obj,Speed);
  	Obj_SetAngle(Obj,Angle);
  	ObjShot_SetGraphic(Obj,Graphic);
  	ObjShot_SetDelay(Obj,Delay);
  	
  	// 描画領域を超えても自動削除は行わないように設定します。
  	Obj_SetAutoDelete(Obj,false);
  	
  	// タスクを呼び出して反射制御を行います。
  	CreateReflectShot02Task(Obj,Accelerate,MaxSpeed,Wall,Count,Frame);
  	
  	// 生成したオブジェクトを示す値を返り値に返します。
  	return Obj;
  }
  
  // 反射制御を行うサブタスク
  task CreateReflectShot02Task(Obj,Accelerate,MaxSpeed,Wall,argCount,argFrame) {
  	let Count = argCount;
  	let CountFlag = (Count > 0);
  	let Frame = argFrame;
  	let FrameFlag = (Frame > 0);
  	let Top = (floor(Wall / 8) == 1);
  	let Left = (floor((Wall % 8) / 4) == 1);
  	let Right = (floor((Wall % 4) / 2) == 1);
  	let Bottom = (Wall % 2 == 1);
  	let X = Obj_GetX(Obj);
  	let Y = Obj_GetY(Obj);
  	let Speed = Obj_GetSpeed(Obj);
  	let Angle = Obj_GetAngle(Obj);
  	
  	// 弾が画面外に生成されていた場合、
  	// 　弾の速度と角度から、弾が画面内に入れるかどうかを計算します。
  	
  	// X軸方向、Y軸方向それぞれに1フレームごとに進む量を計算します。
  	let OneStepX = cos(Angle) * Speed;
  	let OneStepY = sin(Angle) * Speed;
  	
  	// X軸方向で弾が画面内に入るフレーム、画面外に出るフレームを計算します。
  	let InFrameX = (GetClipMinX - X) / OneStepX;
  	let OutFrameX = (GetClipMaxX - X) / OneStepX;
  	if (InFrameX > OutFrameX) {
  		let Work = InFrameX;
  		InFrameX = OutFrameX;
  		OutFrameX = Work;
  	}
  	
  	// Y軸方向で弾が画面内に入るフレーム、画面外に出るフレームを計算します。
  	let InFrameY = (GetClipMinY - Y) / OneStepY;
  	let OutFrameY = (GetClipMaxY - Y) / OneStepY;
  	if (InFrameY > OutFrameY) {
  		let Work = InFrameY;
  		InFrameY = OutFrameY;
  		OutFrameY = Work;
  	}
  	
  	// X軸方向に入る前にY軸方向から抜けてしまう場合、
  	// またはY軸方向に入る前にX軸方向から抜けてしまう場合、
  	// 弾は画面内に入る弾道ではないため、弾オブジェクトを削除します。
  	if ((InFrameX > OutFrameY)||(InFrameY > OutFrameX)) {
  		Obj_Delete(Obj);
  	}
  	
  	// 弾が削除されるか、画面内に入るまで待ちます。
  	while (Obj_BeDeleted(Obj) == false) {
  		X = Obj_GetX(Obj);
  		Y = Obj_GetY(Obj);
  		Speed = Obj_GetSpeed(Obj);
  		
  		// 弾が画面内に入った場合、ループを抜けます。
  		if ((X >= GetClipMinX)&&(X <= GetClipMaxX)&&(Y >= GetClipMinY)&&(Y <= GetClipMaxY)) {
  			break;
  		}
  		
  		// 弾の加速処理を行います。
  		if (Accelerate > 0) {
  			if (Speed + Accelerate < MaxSpeed) {
  				Obj_SetSpeed(Obj,Speed + Accelerate);
  			}
  		} else if (Accelerate < 0) {
  			if (Speed + Accelerate > MaxSpeed) {
  				Obj_SetSpeed(Obj,Speed + Accelerate);
  			}
  		}
  		
  		yield;
  		
  		// 生存フレーム判定フラグがオンになっている場合、
  		// 　弾の生存フレーム数を更新します。
  		// 　生存フレーム数が尽きた場合、オブジェクトを削除します。
  		if (FrameFlag == true) {
  			Frame -= 1;
  			if (Frame <= 0) {
  				Obj_Delete(Obj);
  			}
  		}
  	}
  	
  	// 弾が削除されるまで、反射判定と反射処理を繰り返します。
  	while (Obj_BeDeleted(Obj) == false) {
  		X = Obj_GetX(Obj);
  		Y = Obj_GetY(Obj);
  		Speed = Obj_GetSpeed(Obj);
  		Angle = Obj_GetAngle(Obj);
  		
  		// 反射したかどうかを判定します。
  		// 　①座標が描画範囲を超えていること（＝弾が壁を越えたこと）
  		// 　②座標が越えた壁が、反射対象になっていること
  		// 　③反射回数が残っていること、または反射回数判定フラグがオフになっていること
  		// この３つの条件をすべて満たした場合のみ、反射処理を行います。
  		if (Y < GetClipMinY) {
  			if ((Top == true)&&((Count > 0)||(CountFlag == false))) {
  				Y = (GetClipMinY * 2) - Y;
  				Angle = 0 - Angle;
  				Count -= 1;
  			} else {
  				Obj_Delete(Obj);
  			}
  		}
  		if (Y > GetClipMaxY) {
  			if ((Bottom == true)&&((Count > 0)||(CountFlag == false))) {
  				Y = (GetClipMaxY * 2) - Y;
  				Angle = 0 - Angle;
  				Count -= 1;
  			} else {
  				Obj_Delete(Obj);
  			}
  		}
  		if (X < GetClipMinX) {
  			if ((Left == true)&&((Count > 0)||(CountFlag == false))) {
  				X = (GetClipMinX * 2) - X;
  				Angle = 180 - Angle;
  				Count -= 1;
  			} else {
  				Obj_Delete(Obj);
  			}
  		}
  		if (X > GetClipMaxX) {
  			if ((Right == true)&&((Count > 0)||(CountFlag == false))) {
  				X = (GetClipMaxX * 2) - X;
  				Angle = 180 - Angle;
  				Count -= 1;
  			} else {
  				Obj_Delete(Obj);
  			}
  		}
  		
  		// 弾の加速処理を行います。
  		if (Accelerate > 0) {
  			if (Speed + Accelerate < MaxSpeed) {
  				Obj_SetSpeed(Obj,Speed + Accelerate);
  			}
  		} else if (Accelerate < 0) {
  			if (Speed + Accelerate > MaxSpeed) {
  				Obj_SetSpeed(Obj,Speed + Accelerate);
  			}
  		}
  		
  		Obj_SetPosition(Obj,X,Y);
  		Obj_SetAngle(Obj,Angle);
  		
  		yield;
  		
  		// 生存フレーム判定フラグがオンになっている場合、
  		// 　弾の生存フレーム数を更新します。
  		// 　生存フレーム数が尽きた場合、オブジェクトを削除します。
  		if (FrameFlag == true) {
  			Frame -= 1;
  			if (Frame <= 0) {
  				Obj_Delete(Obj);
  			}
  		}
  	}
  }
function CreateReflectNway( x, y, v, ang, a, maxv, way, dang, kind, late, wall, count, frame )
{
  ang = ang - ( ( ( way - 1 ) / 2 ) * dang ) ;
  loop( way )
    {
    CreateReflectShot02( x, y, v, ang, a, maxv, kind, late, wall, count, frame ) ;
    ang += dang ;
    }
}
}