script_enemy_main {

	#include_function ".\..\ShotSheet\shot_replace.dnh"
	#include_function ".\..\functions.txt"
	#include_function ".\..\other\enemy_functions_fairy.txt"

	let GCSD=GetCurrentScriptDirectory;
	let imgEnemy=GPSD~"img\minion.png";

	let type=GetCommonData("E");
	let arg1=GetArgument;
	let arg2=GetCommonData("A2");
	let arg3=GetCommonData("A3");
	let arg4=GetCommonData("A4");
	let arg5=GetCommonData("A5");
	let diff=GetCommonDataDefault("Diff",1);

	let Life=[200,230,300,350];
	let expsize=[2,2,2,2];
	let expexpand=[0.2,0.2,0.5,0.5];
	let bomb=[100,100,100,70];

	let size=          [0,0,0,3];
	let ScoreItem=     [1,1,0,1];
	let MultiplierItem=[0,0,1,1];

	let ScoreKill=[3,3,3,5]; //divided by 100
	let ScoreDamage=[1.5,1.5,1.5,3]; //divided by 100 (Score per kill, but calculated per hit)

	let BeDeleted=1;
	let MaxGraze=0;
	let prevlife=0;
	let totallife=0;
	let ii=0;

	let xs=0;
	let ys=0;

    @Initialize {
	Randomize;
	shotinit;
        SetLife(Life[type]+10000);
	prevlife=Life[type];
	totallife=Life[type];
	DamageRate;

	FairyInit;

	if(type==0){Move0;}
	if(type==1){Move1;}
	if(type==2){Move2;}
	if(type==3){Move3;}
    }

    @MainLoop {
	FairyDrawLogic;
	AddScore(((prevlife - (upper(GetLife-10000,0)) )/totallife)*(ScoreDamage[type]*100));
	prevlife=upper(GetLife-10000,0);

	SetCollisionA(GetX,GetY, 20);
	SetCollisionB(GetX,GetY, 12);

	if((GetX<GetClipMinX-64||GetX>GetClipMaxX+64||GetY<GetClipMinY-64||GetY>GetClipMaxY+64)&&BeDeleted==1){
		VanishEnemy;
	}

	if(GetLife<10000){VanishEnemy;}	

	yield;
    }

task DamageRate{
	let time=GetCommonDataDefault("EnemyInvincibilityA",0);
	SetDamageRate(0,0);
	Wait(time);
	SetDamageRate(215,bomb[type]*2);
}
// Type, X, Y, V, Angle, a1, a2, a3, a4

function Wait(frames){loop(frames){yield;}}


//0=bullet tail | [angvel,size1,size2,delay] [graphic,v1,decel,angle],[graphic2,v2,decel,angle],[graphic3,v3,accel,angle, shotdelay] //-------------------------------------------------------------------------------------------------

task Move0{
	Shoot0;
	let angle=GetAngle;
	loop{
		SetAngle(angle);
		angle+=arg1[0];
		yield;
	}
}
task Shoot0{
	if(diff==0){
		arg4[4]=arg4[4]*2;
		arg4[1]=arg4[1]*0.8;
	}
	if(diff==1){
		arg4[4]=arg4[4]*1.5;
		arg4[1]=arg4[1]*0.8;
	}
	let i=1;
	let i2=1;
	loop{
		Wait(upper(arg4[4],1));
		Shoot0B(i,i2,arg1[3]);
		i=-i;
		if(i==1){
			i2=-i2;
		}
	}
}
task Shoot0B(i,i2,delay){
	SE("shot1");
	let x=GetX;
	let y=GetY;
	delay=EnemyShotDelay(x,y,arg1[3],arg1[1],arg1[2],arg2[0],delay,20);
	CreateShotA(0,x,y,delay);

	SetShotDataA(0,0,arg2[1],GetAngle+arg2[3],0,-arg2[1]/arg2[2],-arg2[1],arg2[0]);
	SetShotDataA(0,arg2[2],arg3[1],GetAngle+arg3[3]*i,0,-arg3[1]/arg3[2],0,arg3[0]);
	SetShotDataA(0,arg3[2],0,GetAngle+arg4[3]*i2,0,arg4[1]/arg4[2],arg4[1],arg4[0]);

	let vmod=1;
	if(diff==0){
		vmod=rand(0.7,1);
	}
	CreateShotA(1,0,0,0);
	SetShotDataA(1,0,0,GetAngle+arg4[3]*i2,0,arg4[1]/arg4[2],(arg4[1]/2)*vmod,arg4[0]);
	AddShot(arg3[2],0,1,0);

	AddShotDelay(0,arg2[2],arg2[0],10);
	AddShotDelay(0,arg3[2],arg3[0],10);

	FireShot(0);
}

//1=doom spiral tube | angvel, [type,v,anglemod,shot-angvel],[delay,delay2,stoptime,delaysize1,delaysize2],[frequency,numshots] //-------------------------------------------------------------------------------------------------  
task Move1{
	Shoot1;
	let angle=GetAngle;
	loop{
		SetAngle(angle);
		angle+=arg1;
		yield;
	}
}
task Shoot1{
	let angle=rand(0,360);
	loop(arg4[1]){
		Wait(arg4[0]);
		Shoot1B(GetX,GetY,arg3[0],angle);
		SE("shot1");
		angle+=arg2[2];
	}


	task Shoot1B(x,y,delay,angle){
		let delayremaining=EnemyShotDelay(x,y,angle,arg3[3],arg3[4],arg2[0],delay+1,20);

		CreateShotA(0,x,y,delayremaining);

		SetShotDataA(0,0,0,angle,0,0,0,arg2[0]);
		SetShotDataA(0,arg3[1],0,angle,arg2[3],arg2[1]/arg3[2],100,NULL);
		SetShotDataA(0,arg3[1]+arg3[2],arg2[1],NULL,0,0,0,NULL);
		FireShot(0);
	}

}

//2=spiral | time,[graphic,v1,v2],[numangles,angleadd],[frequency,numshots] //-------------------------------------------------------------------------------------------------
task Move2{
	let time=arg1;

	let time2=arg4[1];
	let angleadd=arg3[1];
	let v1=arg2[1];
	let v2=arg2[2];
	let numangles=arg3[0];
	let waittime=arg4[0];
	let boolet=arg2[0];

	let angle=GetAngle;
	let vadd=GetSpeed/time;
	loop(time){
		SetSpeed(GetSpeed-vadd);
		yield;
	}

	if(diff==0){
		waittime*=2;
		time2/=2;
		v1*=0.8;
		v2*=0.8;
		angleadd*=1.5;
	}
	if(diff==1){
		waittime*=1.5;
		time2/=1.5;
	}

	let i=0;
	let angle=rand(0,360);
	SE("shot2");
	let soundfreq=0;
	loop(time2){
		i=0;
		loop(numangles){
			CreateShot01(GetX,GetY,rand(v1,v2),angle+i+rand(0,angleadd),boolet,0);
			i+=360/numangles;
		}
		angle+=angleadd;
		Wait(waittime);
		if(soundfreq==0){
			SE("shot1");
			soundfreq=3;
		}else{
			soundfreq--;
		}
	}
	Wait(time);
	loop(time){
		SetSpeed(GetSpeed+vadd);
		yield;
	}
}

//3=split line | [movedecel,leavetime],[boolet,spacing,angle,decel],[boolet2,v,vmod,accel,wavelength],numshots //-------------------------------------------------------------------------------------------------

task Move3{
	let time=arg1[0];	//move decel
	let leavetime=arg1[1];

	let boolet=arg2[0];
	let spacing=arg2[1];
	let angle=arg2[2];	
	let decel=arg2[3];	

	let randomadd=2;

	let boolet2=arg3[0];
	let v=arg3[1];
	let vmod=arg3[2];		
	let accel=arg3[3];
	let wavelength=arg3[4];

	let numshots=arg4;

	if(wavelength<0){	//special case for the vertical lines
		randomadd=0.7;
		wavelength=(|wavelength|);
	}


	let vadd=GetSpeed/time;
	loop(time){
		SetSpeed(GetSpeed-vadd);
		yield;
	}


	let k=0;
	let xdist;
	let ydist;
	let shotv;
	let randx;
	let randy;
	let xaccel;
	let yaccel;
	SplitLineWarning(GetX,GetY,angle);
	SplitLineWarning(GetX,GetY,angle+180);
	SE("shot3");
	SE("laser1");

	if(diff==0){
		randomadd*=0.8;
		wavelength/=2.5;
		spacing*=2.5;
		accel*=2;
		numshots=round(numshots/2.5);
	}
	if(diff==1){
		wavelength/=1.5;
		spacing*=1.5;
		accel*=1.6;
		numshots=round(numshots/1.5);
	}

	let dir=1;	//forward/backward
	loop(numshots){
		xdist=cos(angle)*spacing*k;
		ydist=sin(angle)*spacing*k;

		randx=rand(-randomadd,randomadd);
		xaccel=2*(xdist-randx*decel)/(decel*decel);	//yay physics
		randy=rand(-randomadd,randomadd);
		yaccel=2*(ydist-randy*decel)/(decel*decel);	//yay physics again
		

		dir=1;
		loop(2){
			CreateShotA(0,GetX,GetY,0);

			SetShotDataA_XY(0,0, randx*dir,randy*dir, xaccel*dir,yaccel*dir, GetSign(xaccel*dir)*1000,GetSign(yaccel*dir)*10000, boolet);

			SetShotDataA(0,decel-1,0,NULL,0,0,0,boolet);
//			AddShotDelay(0,decel,boolet,5);

			shotv=v+vmod*cos(k*(360/wavelength));
			SetShotDataA(0,-k+numshots+decel+30,0,angle+90,0,shotv/accel,shotv,boolet2);

			CreateShotA(1,0,0,0);
			SetShotDataA(1,0,0,angle-90,0,shotv/accel,shotv,boolet2);
			AddShot(-k+numshots+decel+30,0,1,0);

			AddShotDelay(0,-k+numshots+decel+30,boolet2,10+(k%2)*10);
			FireShot(0);
			dir=-1;
		}
		SE("shot0");

		k++;
		yield;
	}
	Wait(leavetime);
	loop(time){
		SetSpeed(GetSpeed+vadd);
		yield;
	}
}


task SplitLineWarning(x,y,a){
	let alpha=120;
	let obj=Obj_Create(OBJ_LASER);
	Obj_SetPosition(obj,x,y);
	Obj_SetAngle(obj,a);
	Obj_SetAlpha(obj,alpha);
	ObjShot_SetGraphic(obj,WHITE60);
	ObjLaser_SetWidth(obj,7);
	ObjLaser_SetLength(obj,500);
	ObjLaser_SetSource(obj,false);
	Obj_SetCollisionToPlayer(obj,false);
	let fade=60;
	let alphaadd=alpha/fade;
	loop(fade){
		alpha-=alphaadd;
		Obj_SetAlpha(obj,alpha);
		if(deleteobjects==false){
			yield;
		}
	}
	Obj_Delete(obj);
}

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------


@DrawLoop{
	FairyDrawLoop;
}

    @Finalize {
	deleteobjects=true;
	yield;
	deleteobjects=false;
	if(GetLife<10000){
		AddScore(ScoreKill[type]*100);

		CreateItems(GetX,GetY,size[type],ScoreItem[type],MultiplierItem[type],arg5[2],arg5[3]);

		SE("enemyexplode");

		CreateExplosion(0,GetX,GetY,expsize[type],[color[0]-prand(0,100),color[1]-prand(0,100),color[2]-prand(0,100)],expexpand[type]);
		CreateExplosion(0,GetX,GetY,expsize[type],[color[0]-prand(0,100),color[1]-prand(0,100),color[2]-prand(0,100)],expexpand[type]/2);

	}
    }


}
