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);
	SetEnemyMarker(true);

	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){
		frame++;
		yield;
	}
	DeleteCommonData("MeteoSkip");
	if(GetCommonData("MeteoAttack")==10){MainTask0;}
	if(GetCommonData("MeteoAttack")==11){MainTask1;}
	if(GetCommonData("MeteoAttack")==12){MainTask2;}
	Wait(60);
	bombable=true;
}

task MainTask0{	//big shots
	SetDamageRate(90,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(100){
			SmallShot(GetX,GetY,rand(0,360));
			yield;
		}
		angle+=45;
		SE("shot2");
		SE("shot3");
		loop(4){
			BigShot(GetX,GetY,angle);
			angle+=90;
		}
		yield;
		loop(90){
			SmallShot(GetX,GetY,rand(0,360));
			yield;
		}
		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;
	}
}

task MainTask1{	//keep moving
	SetDamageRate(60,60);
	let frame=0;
	let angle=0;
	let time=0;
	let k=0;
	MoveTask;
	Wait(60);
	let x=GetX;
	let y=GetY;
	let angle;
	loop{
		x=GetPlayerX;
		y=GetPlayerY;
		NewChargeShrink_XY(x,y,120,30,1,255,100,255);
		NewChargeShrink_XY(x,y,120,30,1,150,150,150);
		Wait(120);
		angle=rand(0,360);
		SE("shot2");
		CreateExplosionEX(3,x,y,1,[150,150,150],0.35,60);
		CreateExplosionEX(3,x,y,1,[150,100,150],0.25,60);
		CreateExplosionEX(3,x,y,1,[150,50,150],0.15,60);
		loop(20){
			CreateShot01(x,y,1.9,angle,SP05,0);
			CreateShot01Ghost(x,y,1.9,angle,BLUE01,0);
			angle+=6;
			CreateShot01(x,y,1.2,angle,SP05,0);
			CreateShot01Ghost(x,y,1.2,angle,PURPLE01,0);
			angle+=6;
			CreateShot01(x,y,0.5,angle,SP05,0);
			CreateShot01Ghost(x,y,0.5,angle,RED01,0);
			angle+=6;
		}
	}
	task MoveTask{
		SetMovePositionNew(GetCenterX,150,60);
		Wait(60);
		
		loop{
			MoveRandom(60,60,GetClipMinX+80,90,GetClipMaxX-80,200,1000,180);
			Wait(200);
		}
	}
}

task MainTask2{	// death
	SetShotAutoDeleteClip(10,10,10,10);
	SetDamageRate(40,40);
	let k=0;
	let dir=1;
	let x;
	let y;
	SetMovePositionNew(GetCenterX,150,60);
	Wait(60);
	loop{
		x=GetCenterX+rand(50,160)*dir;
		y=rand(30,220);
		k=0;
		loop(60){
			DeathShot(GetX,GetY,x,y,k*92,100-k,k==0);
			k++;
			yield;
		}
		dir=-dir;
		SetMovePositionNew(GetCenterX+rand(50,100)*dir,rand(90,200),300);
		Wait(120);
	}

	task DeathShot(x,y,x2,y2,a,delay, extrastuff){
		SE("shot1");
		let obj=Obj_Create(OBJ_SHOT);
		ObjShot_SetGraphic(obj,SP03);
		ObjShot_SetBombResist(obj,true);
		Obj_SetAutoDelete(obj,false);
		let frame=0;
		let v=rand(3,6);
		let xv=cos(a)*v;
		let yv=sin(a)*v;

		let xaccel=2*((x2-x)-xv*delay)/(delay*delay);	//get the acceleration needed to move to the new position
		let yaccel=2*((y2-y)-yv*delay)/(delay*delay);

		loop(delay){
			x+=xv;
			y+=yv;
			xv+=xaccel;
			yv+=yaccel;
			Obj_SetPosition(obj,x,y);
			yield;
		}
		Obj_Delete(obj);
		if(extrastuff){
			SE("smallnuke");
			loop(5){
				CreateExplosionEX(3,x,y,1,[200,100,200],rand(0.1,0.5),rand(30,80));
				CreateExplosionEX(3,x,y,1,[200,200,200],rand(0.1,0.3),rand(30,80));
			}
			ShakeScreen(7,60);
			let angle=rand(0,360);
			loop(80){
				DeathShot2(x,y,1,angle,RED11);
				DeathShot2(x,y,0.75,angle,PURPLE11);
				DeathShot2(x,y,0.5,angle,BLUE11);
				angle+=360/80;
			}
		}
	}
	task DeathShot2(x,y,v,angle,g){
		let v1=rand(2,4)*v;
		let v2=rand(1,1.5)*v;
		let obj=Obj_Create(OBJ_SHOT);
		ObjShot_SetGraphic(obj,g);
		Obj_SetPosition(obj,x,y);
		Obj_SetAngle(obj,angle);
		let obj2=Obj_Create(OBJ_LASER);
		ObjShot_SetGraphic(obj2,SP03);
		Obj_SetPosition(obj2,x,y);
		ObjLaser_SetSource(obj2,false);

		let xv=cos(angle);
		let yv=cos(angle);

		LinkShot(obj,obj2);
		let time=rand_int(60,120);
		let vadd=(v2-v1)/time;

		let size=rand_int(20,39);
		let sizeadd=0.5;

		while(!Obj_BeDeleted(obj)){
			size+=sizeadd;
			if(size>40){sizeadd=-0.5;}
			if(size<20){sizeadd=0.5;}
			if(v1>v2){
				v1+=vadd;
				Obj_SetSpeed(obj,v1);
				Obj_SetSpeed(obj2,v1);
			}
			Obj_SetPosition(obj2,Obj_GetX(obj)+xv*v1-size/2,Obj_GetY(obj)+yv*v1);
			ObjLaser_SetWidth(obj2,size);
			ObjLaser_SetLength(obj2,size);

			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){
		SetCommonData("MeteoSkip",true);
		SetLife(-100);
	}
	yield;
}

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


    @Finalize {
	SetShotAutoDeleteClip(64,64,64,64);
	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);
    }

}