script_enemy_main {
	#include_function ".\..\ShotSheet\shot_replace.dnh"
	#include_function ".\..\functions.txt"
	#include_function ".\m_functions.txt"

	SpellID=-1;

	let frame = 1;

    @Initialize {
//	StartFunctions(1,1,0);
	Randomize;
        SetLife(2000);
//        SetScore(50000);
	SetDamageRate(100,100);
	MagicCircle(false);

	MeteoInit(GetArgument);
	shotinit;

	BeginTask;
    }

let bombable=false;

let DrawArea=[NULL,NULL];

	let cshot=[WHITE32,ORANGE32,RED32,PURPLE32];
function Wait(frames){loop(frames){yield;}}

task BeginTask{
	let frame=0;
	let drawarrows=false;
	while(EventActive||frame<GetArgument){
		if(EventStep==1){
			SetCommonData("FakeSouls",true);
			CreateItems(GetX+10,GetY-110,0,0,0, 0,8);
			CreateItems(GetX-30,GetY-160,0,0,0, 1,8);
			CreateItems(GetX+30,GetY-160,0,0,0, 2,8);
			CreateItems(GetX-50,GetY-110,0,0,0, 3,8);
		}
		if(EventStep==2){
			DeleteCommonData("FakeSouls");
		}
		if(EventStep==3){
			drawarrows=true;
		}
		if(EventStep==4){
			drawarrows=false;
		}
		if(drawarrows&&frame%20==0){
			Arrow(GetClipMaxX-60,GetY-80,0,50,20,0);
		}
		frame++;
		yield;
	}
	if(GetCommonData("MeteoAttack")==5){MainTask0;}
	if(GetCommonData("MeteoAttack")==6){MainTask1;}
	if(GetCommonData("MeteoAttack")==7){MainTask2;}
//	if(GetCommonData("MeteoAttack")==8){MainTask3;}
	Wait(60);
	bombable=true;
}

task MainTask0{	//use two dimensions
	SetDamageRate(60,60);
	let frame=0;
	let angle=0;
	let time=0;
	let k=0;
	SetMovePositionNew(GetCenterX,150,60);
	Wait(60);
	loop{
		angle=90+30+rand(-300/100,300/100);
		SE("shot1");
		loop(70){
			CreateShotA(0,GetX,GetY,0);
			SetShotDataA(0,0,2,angle,0,0,0,PURPLE11);
			time=absolute((GetX-GetClipMaxX)/(cos(angle)*2));
			SetShotDataA(0,time,GetSign(cos(angle))*-1.5,rand(-4,4),0,0,0,RED11);

			if(k%2==0){
				CreateShotA(1,0,0,0);
				SetShotDataA(1,0,1,180-angle,0,0,0,BLUE11);
				AddShot(time,0,1,0);
			}
			AddShotDelay(0,time,PURPLE11,10);

			FireShot(0);

			angle+=300/70;
			k++;
		}
		Wait(200);
	}
}

task MainTask1{	//criss-cross bullets
	SetDamageRate(60,60);
	let k;
	let angle;
	SetMovePositionNew(GetCenterX,150,60);
	Wait(60);

	let shapes=[RED11,RED12,RED11];
	loop{
		SE("shot2");
		angle=rand(0,360);
		loop(35){
			k=0;
			loop(3){
				CreateShotA(0,GetX,GetY,k*7);
				SetShotDataA(0,0,6,angle,2,-5/60,0,shapes[k]+2);
				SetShotDataA(0,60,1,NULL,0,0,0,NULL);
				FireShot(0);

				CreateShotA(0,GetX,GetY,k*7);
				SetShotDataA(0,0,6,angle,-2,-5/60,0,shapes[k]+6);
				SetShotDataA(0,60,1,NULL,0,0,0,NULL);
				FireShot(0);

				k++;
			}
			angle+=360/35;
		}
		Wait(90);
	}
}
let streamphase=0;
task MainTask2{	// streaming

	while(meteoalpha!=1){yield;}
	MeteoAlpha(1,0.15,60);

	ManualEnemyMarker(true);
	let alpha=1;
	loop(10){
		SetEnemyMarkerManual(0,GetCenterX,alpha);
		SetEnemyMarkerManual(1,GetCenterX,0);
		alpha-=0.1;
		yield;
	}
	SetEnemyMarkerManual(0,GetCenterX,0);

	DrawArea=[GetCenterX,GetY];
	SetX(-1000);
	EnemyDamageMeteo(30);
	streamphase=1;
	SetMovePositionNewM(GetCenterX,100,60);
	Wait(60);
	SpawnMeteoEnemy(4, DrawArea[0]+50,DrawArea[1],220,250);
	SpawnMeteoEnemy(4, DrawArea[0]-50,DrawArea[1],220,250);
	SpawnMeteoEnemy(4, DrawArea[0],DrawArea[1]+50,220,250);
	MainTask2B;
	while(GetEnemyNum>1){yield;}
	SetMovePositionNewM(GetCenterX,150,60);
	Wait(60);
	SpawnMeteoEnemy(4, DrawArea[0]+120,DrawArea[1],220,250);
	SpawnMeteoEnemy(4, DrawArea[0]-120,DrawArea[1],220,250);
	Wait(120);
	SpawnMeteoEnemy(4, DrawArea[0]+90,DrawArea[1]-40,220,250);
	SpawnMeteoEnemy(4, DrawArea[0]-90,DrawArea[1]-40,220,250);
	Wait(120);
	SpawnMeteoEnemy(4, DrawArea[0]+30,DrawArea[1]-80,220,250);
	SpawnMeteoEnemy(4, DrawArea[0]-30,DrawArea[1]-80,220,250);
	while(GetEnemyNum>1){yield;}
	SetMovePositionNewM(GetCenterX,GetCenterY,60);
	streamphase=2;
	Wait(60);
	let k=-90;
	loop(8){
		SpawnMeteoEnemy(5, DrawArea[0]+cos(k)*60,DrawArea[1]+sin(k)*60,220,250);	
		k+=360/8;
		Wait(10);
	}
	while(GetEnemyNum>1){yield;}
	streamphase=1;
	SetMovePositionNewM(GetCenterX,GetCenterY-150,60);
	Wait(60);
	k=-2.5;
	loop(6){
		SpawnMeteoEnemy(5, DrawArea[0]+k*45,DrawArea[1]-20,220,250);
		k++;
		Wait(20);
	}
	while(GetEnemyNum>2){yield;}
	k=2;
	loop(5){
		SpawnMeteoEnemy(5, DrawArea[0]+k*45,DrawArea[1]+30,220,250);
		k--;
		Wait(20);
	}
	while(GetEnemyNum>1){yield;}
	SetLife(0);

	function EnemyWait(max,min){
		loop(max){
			if(GetEnemyNum>1){
				yield;
			}
		}
		if(min>0){
			while(GetEnemyNum>min){yield;}
		}
	}
}
task MainTask2B{
	let subphase=0;
	let direction=1;
	let dir=1;
	let k=0;
	if(GetPlayerX<GetCenterX){dir=-1;}
	while(streamphase==1){
		subphase=0;
		while(subphase==0&&streamphase==1){
			Arrow(GetPlayerX,GetPlayerY-50,90+dir*90,30,20,1);
			if((GetPlayerX<GetClipMinX+130&&dir==1)||(GetPlayerX>GetClipMaxX-130&&dir==-1)){
				subphase=1;
			}
			Wait(20);
		}
		k=0;
		while(subphase==1&&streamphase==1){
			Arrow(GetPlayerX,GetPlayerY-50,90+dir*160,30,7,1);
			if(GetPlayerY<350||k>120){
				subphase=2;
			}
			k+=7;
			Wait(7);
		}
		while(subphase==2&&streamphase==1){
			Arrow(GetCenterX-150*dir,GetClipMaxY-70,90-dir*120,30,7,1);
			if((GetPlayerX>GetClipMinX+130&&dir==1)||(GetPlayerX<GetClipMaxX-130&&dir==-1)){
				subphase=0;
			}
			Wait(7);
		}
		dir=-dir;
	}
	Wait(200);
	let angle=atan2(GetPlayerY-GetCenterY,GetPlayerX-GetCenterX);
	Wait(120);
	if(AngularDistance(angle,atan2(GetPlayerY-GetCenterY,GetPlayerX-GetCenterX))<0){
		dir=-1;
	}else{dir=1;}
	while(streamphase==2){
		if(distance(GetCenterX,GetCenterY,GetPlayerX,GetPlayerY)>90*90){
			Arrow(GetPlayerX,GetPlayerY-50,atan2(GetPlayerY-GetCenterY,GetPlayerX-GetCenterX)+90*dir,30,20,1);
		}
		Wait(20);
	}
	while(GetPlayerY<380){
		Arrow(GetPlayerX,GetPlayerY+50,90,30,15,1);
		Wait(15);
	}
	MainTask2B;
}

task MainTask3{	//big shots
	SetDamageRate(60,60);
	let k;
	let angle;
	let dir=1;
	loop{
		SetMovePositionNew(GetCenterX+100*dir,150,60);
		Wait(60);
		angle=GetAngleToPlayer;
		SE("shot2");
		SE("shot3");
		loop(4){
			BigShot(GetX,GetY,angle);
			angle+=90;
		}
		yield;
		loop(60){SmallShot(GetX,GetY,rand(0,360));}
		angle+=45;
		Wait(100);
		SE("shot2");
		SE("shot3");
		loop(4){
			BigShot(GetX,GetY,angle);
			angle+=90;
		}
		yield;
		loop(90){SmallShot(GetX,GetY,rand(0,360));}
		Wait(90);
		dir=-dir;
	}
}
task BigShot(x,y,angle){
	loop(2){
		CreateExplosionEX(0,x,y,1,[rand(200,255),100,rand(200,255)],rand(0.1,0.2),rand(30,60));
	}
	let k=0;
	loop(30){
		BigShot2(x,y,angle,k);
		k+=360/30;
	}
}
task BigShot2(x,y,a,a2){
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	ObjShot_SetGraphic(obj,SP03);
	Obj_SetAngle(obj,rand(0,360));
	let xv=cos(a);
	let yv=sin(a);
	let xv2=cos(a2);
	let yv2=sin(a2);
	let phaseadd=rand(0,360);
	let mult=rand(3,5);
	let phase;
	let radius=0;
	let frame=0;
	while(!Obj_BeDeleted(obj)){
		if(frame<=150){
			radius+=0.6;
		}
		frame++;
		phase=sin(frame*mult+phaseadd)*0.2+0.8;
		Obj_SetPosition(obj,x+xv2*radius*phase,y+yv2*radius*phase);
		x+=xv*1.5;
		y+=yv*1.5;
		yield;
	}
}
task SmallShot(x,y,a){
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	ObjShot_SetGraphic(obj,RED01+[0,5,6,7][rand_int(0,3)]);
	Obj_SetAngle(obj,rand(0,360));
	let v=rand(1,3);
	let vadd=v;
	let time=rand_int(60,120);
	loop(time){
		Obj_SetAngle(obj,a);
		Obj_SetSpeed(obj,v);
		a+=90/time;
		v-=vadd/(time/2);
		yield;
	}
}

    @MainLoop {
	if(DrawArea[0]==NULL){
		MeteoDrawLogic(GetX,GetY);
	}else{
		MeteoDrawLogic(DrawArea[0],DrawArea[1]);
	}
	if(meteoalpha==1){
        	SetCollisionA(GetX, GetY, 35);
		SetCollisionB(GetX, GetY, 25);
	}

	if(bombable&&GetKeyState(VK_SKIP)==KEY_PUSH){
		SetLife(-100);
	}
	yield;
}

    @DrawLoop {
	if(DrawArea[0]==NULL){
		MeteoDrawLoop(GetX,GetY);
	}else{
		MeteoDrawLoop(DrawArea[0],DrawArea[1]);
	}
}


    @Finalize {
	deleteobjects=true;
	yield;
	deleteobjects=false;
//	EndingFunc(1);
	if(DrawArea[0]==NULL){
		MeteoFinalize(GetX,GetY,1);
	}else{
		MeteoFinalize(DrawArea[0],DrawArea[1],1);
	}
//	PointItems(GetX,GetY,1,0);
    }

}