#ScriptVersion [2]
#Player[FREE]

script_enemy_main {

	#include_function ".\..\ShotSheet\shot_replace.dnh"
	#include_function ".\..\functions.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=[100,100,120,200,3000,1000, 400,30000];
	let expsize=[1,1,1,1,2,4,1.2,1];
	let expexpand=[0.4,0.4,0.4,0.4,0.8,1,0.4,0.4];
	let bomb=[100,100,100,100,100,100,100,100];
	let ScoreItem=     [1,0,1, 2,1, 8 ];
	let MultiplierItem=[0,1,1, 1,3, 8 ];
	let size=          [0,0,7,10,10,20];


	let ScoreKill=[3,10,5,8,2,20,10,0]; //divided by 100
	let ScoreDamage=[1.5,5,4,6,1,10,5,0]; //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;

	let color=[0,0,0];
	let color2=[0,0,0];

    @Initialize {
	Randomize;
	shotinit;
        SetLife(Life[type]+10000);
	prevlife=Life[type];
	totallife=Life[type];
	SetDamageRate(200,bomb[type]*2);

	color=[Rainbow(0,arg5[0])*arg5[1]+(255-arg5[1]),Rainbow(1,arg5[0])*arg5[1]+(255-arg5[1]),Rainbow(2,arg5[0])*arg5[1]+(255-arg5[1])];
	color2=[Rainbow(0,arg5[0]+180)*arg5[1]+(255-arg5[1]),Rainbow(1,arg5[0]+180)*arg5[1]+(255-arg5[1]),Rainbow(2,arg5[0]+180)*arg5[1]+(255-arg5[1])];

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

	let timer=0;
	let i=0;
	let i2=0;
	let i3=0;
	let framee=0;

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

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

	if(framee==10){
		Trail;
		framee=0;
	}

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

	if(GetLife<10000){VanishEnemy;}	

	framee++;

	yield;
    }
// Type, X, Y, V, Angle, a1, a2, a3, a4

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

//-------------------------------------------------------------------------------------------------  //0=main	| [xv,yv],time,[type,xvel,yvel1,yvel2,dropspeed],interval
task Move0{
	Shoot0;
	let speedadd=absolute((arg1[1]*2))/arg2;
	let speed=arg1[1];
	loop{
		SetX(GetX+arg1[0]);
		SetY(GetY+speed);
		speed+=speedadd;
		yield;
	}
}
task Shoot0{
	if(arg4>0){
		arg4=arg4*((-diff+2)/2+1);
		// 0 = 2
		// 1 = 1.5
		// 2 = 1
		let speedadd=(arg3[3]-arg3[2])/arg3[4];
		loop{
			Wait(arg4);
			if(OffScreen(GetX,GetY,0)==0){
				Shoot0B(GetX,GetY,speedadd);
			}
		}
	}
}
task Shoot0B(x,y,speedadd){
	SE("shot1");
	let delay=15;
	delay=EnemyShotDelay(x,y,atan2(arg3[2],arg3[1]),80,20,arg3[0],delay,30);
	CreateShotA(0,x,y,delay);
	SetShotDataA_XY(0,0,arg3[1],arg3[2],0,speedadd,0,arg3[3],arg3[0]);
	FireShot(0);
}

//-------------------------------------------------------------------------------------------------  //1=main aimed | [xv,yv],time,[type,yvel1,yvel2,dropspeed],interval
task Move1{
	Shoot1;
	let speedadd=absolute((arg1[1]*2))/arg2;
	let speed=arg1[1];
	loop{
		SetX(GetX+arg1[0]);
		SetY(GetY+speed);
		speed+=speedadd;
		yield;
	}
}
task Shoot1{
	if(arg4>0){
		arg4=arg4*((-diff+2)/2+1);
		let speedadd=(arg3[2]-arg3[1])/arg3[3];
		let distance=0;
		let xspeed=0;
		let time=0;
		loop{
			Wait(arg4);
			if(OffScreen(GetX,GetY,0)==0){
				SE("shot1");
				distance=absolute(GetPlayerY-GetEnemyY);		//y distance
				time=((2*distance)/(arg3[2]-arg3[1]));			//time for it to hit
				distance=center(-distance,GetPlayerX-GetX,distance);	//x distance, capped at y distance
				xspeed=distance/time;					//v=d/t (physics!)
	
				CreateShotA(0,GetX,GetY,0);
				SetShotDataA_XY(0,0,xspeed,arg3[1],0,speedadd,0,30,arg3[0]);
	
				FireShot(0);
			}
		}
	}
}

//-------------------------------------------------------------------------------------------------  //2=streaming	| [xv,yv],time,[type,vel,numdir,numshot],interval
task Move2{
	Shoot2;
	let speedadd=absolute(arg1[1]*2)/arg2;
	let speed=arg1[1];
	loop{
		SetX(GetX+arg1[0]);
		SetY(GetY+speed);
		speed+=speedadd;
		yield;
	}
}
task Shoot2{
	let k1=0;
	let k2=0;
	arg4=arg4*((-diff+2)/2+1);
	let randomfactor=0;
	if(diff==2){
		randomfactor=3;
	}
	loop{
		Wait(arg4);
		if(OffScreen(GetX,GetY,0)==0){
			SE("shot1");
			k1=0;
			loop(arg3[2]){
				k2=1;
				loop(arg3[3]){
					CreateShot01(GetX,GetY,arg3[1]*((k2/arg3[3])*0.7+0.3),k1*(360/arg3[2])+GetAngleToPlayer+rand(-randomfactor,randomfactor),arg3[0],0);
					k2++;
				}
				k1++;
			}
		}
	}
}

//-------------------------------------------------------------------------------------------------  //3=split	| [xv,yv],time,[type1,type2,v1,v2,accel,angle,num,delay],interval
task Move3{
	arg3[3]=arg3[3]*((diff/4)+0.5);//vel
	arg3[4]=arg3[4]*((diff/4)+0.5);//accel
	arg3[6]=arg3[6]*((diff/4)+0.5);//num

	Shoot3;
	Shoot3B;
	let speedadd=absolute(arg1[1]*2)/arg2;
	let speed=arg1[1];
	loop{
		SetX(GetX+arg1[0]);
		SetY(GetY+speed);
		speed+=speedadd;
		yield;
	}
}
task Shoot3{
	let k=0;
	let k2=0;
	let angle=0;
	loop{
		Wait(arg4);
		if(OffScreen(GetX,GetY,0)==0){
			SE("shot2");
			CreateShotA(0,GetX,GetY,0);
			SetShotDataA(0,0,arg3[2],arg3[5],0,0,0,arg3[0]);

			k=0;
			loop(arg3[6]){
				angle=arg3[5]+90+(k/(arg3[6]-1)*180);
				CreateShotA(k+1,0,0,0);
				SetShotDataA_XY(k+1,0,cos(angle)*arg3[3],sin(angle)*arg3[3],0,arg3[4],0,10,arg3[1]);
				AddShot(arg3[7],0,k+1,0);
				k++;
			}

			SetShotKillTime(0,arg3[7]+1);
			FireShot(0);
		}
	}
}
task Shoot3B{
	loop{
		Shoot3C(GetX,GetY);
		yield;
		yield;
		yield;
	}
}
task Shoot3C(x,y){
	let delay=30;
	delay=EnemyShotDelay(x,y,0,40,20,arg3[1],delay,30);

	CreateShotA(0,x,y,delay);
	SetShotDataA(0,0,0,prand(arg3[5]+90,arg3[5]+270),0,0,0,arg3[1]);
	SetShotDataA(0,1,0,NULL,0,0.05,4,arg3[1]);
	FireShot(0);
}


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

    let currenttrail=0;

    sub Trail{
	trailx[currenttrail]=GetX;
	traily[currenttrail]=GetY;
	traila[currenttrail]=rotation;
	trailt[currenttrail]=5*8;
	currenttrail=(currenttrail+1)%4
    }

    let trailx=[0,0,0,0];
    let traily=[0,0,0,0];
    let traila=[0,0,0,0];
    let trailt=[0,0,0,0];

    sub DrawLogic{
	let speed=distance(GetX,GetY,prevx,prevy)^0.5;
	prevx=GetX;
	prevy=GetY;
	rotation+=speed*direction(arg1[0])*4;
	let gindex=0;
	loop(4){
		trailt[gindex]=trailt[gindex]-1;
		gindex++;
	}

    }
	let rotation=0;
	let prevx=0;
	let prevy=0;

	let gi=0;

	let dir=0;
	let th=30;
    @DrawLoop {
	SetTexture(imgWhite);
	SetGraphicRect(0,0,5,5);
	SetAlpha(255);
	SetColor(color2[0],color2[1],color2[2]);
	SetGraphicAngle(0,0,rotation);
	DrawGraphic(GetX+cos(rotation-35)*2,GetY+sin(rotation-35)*2);

        SetTexture(imgEnemy);
	SetColor(color[0],color[1],color[2]);
	SetGraphicRect(0, 128, 32, 160);

	//trails
	SetGraphicScale(direction(arg1[0]),1);
	let gindex=currenttrail;
	loop(4){
		SetAlpha(trailt[gindex]*2);
		SetGraphicAngle(0,0,traila[gindex]);
		DrawGraphic(trailx[gindex],traily[gindex]);
		gindex=(gindex+1)%4
	}

	//main
	SetGraphicAngle(0,0,rotation);
	SetAlpha(255);
	DrawGraphic(GetX,GetY);

	SetGraphicRect(64,0,128,64);
	SetGraphicScale(1.5,1.5);
	SetGraphicAngle(0,0,-rotation);
	SetAlpha(50);
	DrawGraphic(GetX,GetY);

}

function direction(number){
	let ret=1;
	if(number<0){ret=-1;}
	return ret;
}
    @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);
		CreateExplosion(0,GetX,GetY,expsize[type],[color[0]-prand(0,100),color[1]-prand(0,100),color[2]-prand(0,100)],expexpand[type]/4);

	}
    }

}
