#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=[1200,2000,210,500,55,2.2, 400,30000];
	let expsize=[2,3,1,2,1,4,1.2,1];
	let expexpand=[0.2,0.6,0.2,0.4,0.4,2,0.4,0.4];
	let bomb=[100,100,100,100,100,100,100,100];

	let size=          [1,20,10,10];
	let ScoreItem=     [1,7, 0,3];
	let MultiplierItem=[0,7, 2,1];

	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];

    @Initialize {
	Randomize;
	shotinit;
        SetLife(Life[type]+10000);
	prevlife=Life[type];
	totallife=Life[type];
	SetDamageRate(215,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])];

	if(type==1){DeathFairyInit(4,7,4);}

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

	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==2){
		Glow(GetX,GetY-4,10,GetAngle+180);
		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=spray	| decel time, numtype, [[type],[vel],[acceltime],[delay]],[interval,totaltime]
task Move0{
	let speedadd=GetSpeed/arg1;
	loop(arg1){
		SetSpeed(GetSpeed-speedadd);
		yield;
	}
	let delay=0;
	let k=0;
	loop(arg4[1]/arg4[0]){
		SE("shot1");
		CreateShotA(0,GetX,GetY,0);
		SetShotDirectionType(PLAYER);

		delay=0;
		k=0;
		loop(arg2){
			delay+=arg3[3][k];
			SetShotDataA(0,delay,0,0,0,arg3[1][k]/arg3[2][k],arg3[1][k],arg3[0][k]);
//			if(k>0){DelaySound(delay);}
			k++;
		}
		FireShot(0);
		SetShotDirectionType(ABSOLUTE);
		Wait(arg4[0]);
	}
	loop(arg1){
		SetSpeed(GetSpeed-speedadd);
		yield;
	}

}

//-------------------------------------------------------------------------------------------------  //1=deathfairy	| no params

task Move1{
	SetInvincibility(200);
	SetMovePositionNew(GetCenterX,GetCenterY,120);
	Wait(30);
	NewChargeShrink(80,5,1,255,160,160);
	NewChargeShrink(80,5,1,160,160,255);
	Wait(90);
	loop(5){
		CreateExplosionEX(3,GetX,GetY,0.1,RainbowArray(0+rand(-20,20),rand(100,150),100),rand(0.3,0.5),rand(50,80));
		CreateExplosionEX(3,GetX,GetY,0.1,RainbowArray(240+rand(-20,20),rand(100,150),100),rand(0.3,0.5),rand(50,80));
	}
	ShakeScreen(6,50);
	SE("crash");
	let angle=0;
	let dir=1;
	let v=0;
	let len=0;
	let timer=0;
	let frame=0;
	loop(20){
		angle=90-90*dir;
		len=100;
		v=3;
		timer=0;
		loop(60){
			loop(3){
				CreateLaser01(GetX,GetY,v,angle,len,10,SP06,0);
				if(timer%11==0){
					if(diff>0){
						CreateShot01(GetX,GetY,v/2,angle,SP08,0);
						CreateShot01(GetX,GetY,v/2,angle+90,SP08,0);
					}else{
						CreateShot01(GetX,GetY,v/2,angle+90,SP08,0);
					}
				}
				angle+=120;
			}
			if(timer%3==0&&timer<50){
				SE("shot1");
			}
			v-=1/60;
			angle+=(100)*dir/60;
			len-=60/60;
			timer++;
			while(frame<1){
				frame+=[0.8,0.8,1][diff];
				yield;
			}
			frame--;
		}
		CreateExplosionEX(3,GetX,GetY,0.1,RainbowArray(0+rand(-20,20),rand(100,150),100),rand(0.2,0.3),rand(50,80));
		CreateExplosionEX(3,GetX,GetY,0.1,RainbowArray(240+rand(-20,20),rand(100,150),100),rand(0.2,0.3),rand(50,80));
		ShakeScreen(2,50);
		SE("shot3");
		SE("shot2");
		dir=-dir;
	}
	let speed=0;
	loop{
		speed+=0.1;
		SetY(GetY-speed);
		yield;
	}
}


//-------------------------------------------------------------------------------------------------  //2=wedge	| decel time,[type,v,layers,spacing],[range,numdir],aimed yes/no

task Move2{
	arg2[2]=ceil(arg2[2]*((diff/4)+0.5));//layers
	arg3[1]=ceil(arg3[1]*((diff/4)+0.5));//numdir

	if(arg3[1]%2==0&&arg4==1){arg3[1]=arg3[1]+1;}//if aimed and number of directions is even, add 1 so it's not useless

	let ChangeSpeed=GetSpeed/arg1;
	loop(arg1){
		SetSpeed(GetSpeed-ChangeSpeed);
		yield;
	}
	let angle;
	let currentlayer=1;
	let currentshot=0;
	let baseangle;
	if(arg4==1){
		baseangle=GetAngleToPlayer;
	}else{
		baseangle=GetAngle;
	}

	loop(arg2[2]){
		currentshot=-currentlayer/2;
		loop(currentlayer){
			angle=-(arg3[1]-1)/2;
			loop(arg3[1]){
				CreateShot01(GetX,GetY,arg2[1],baseangle+angle*(arg3[0]/(arg3[1]-1))+currentshot*arg2[3],arg2[0],0);
				angle++;
			}
			currentshot++;
		}
		SE("shot1");
		Wait(arg2[3]);
		currentlayer++;
	}

	loop(arg1){
		SetSpeed(GetSpeed-ChangeSpeed);
		yield;
	}
}

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


  let glowxf=[];
  let glowyf=[];
  let glowtf=[];
  let glowdf=[];

  let glowx=[0];
  let glowy=[0];
  let glowt=[0];
  let glowd=[0];


    sub DrawLogic{
	if(type!=1){
		glowx=glowx~glowxf;
		glowy=glowy~glowyf;
		glowt=glowt~glowtf;
		glowd=glowd~glowdf;
		glowxf=[];
		glowyf=[];
		glowtf=[];
		glowdf=[];
		let k=0;
		while(k<length(glowt)-1){
			glowt[k+1]=glowt[k+1]-1;
			if(glowt[k+1]==0){
				glowx=erase(glowx,k+1);
				glowy=erase(glowy,k+1);
				glowt=erase(glowt,k+1);
				glowd=erase(glowd,k+1);
				k--;
			}
			k++;
		}
	}else{
		DeathFairyLogic(0+rand(-20,20),rand(0,0.8),240+rand(-20,20),rand(0,0.8));
		CyberDrawLogic(30,30);
	}
    }






  function Glow(x,y,t,d){
	glowxf=glowxf~[x];
	glowyf=glowyf~[y];
	glowtf=glowtf~[t];
	glowdf=glowdf~[d];
  }



	let gi=0;

	let dir=0;
	let th=30;
    @DrawLoop {
	let dir=GetAngle%360;
	if((dir>90+th&&dir<270-th)){
		dir=1;
	}else if(dir<90-th||dir>270+th){
		dir=2;
	}else{dir=0;}
	if(GetSpeed<=1.5){dir=0;}

        SetTexture(imgEnemy);
	SetColor(color[0],color[1],color[2]);

	SetGraphicRect(128, 96, 160, 128);


	if(type!=1){
		let k=0;
		loop(length(glowx)-1){
			SetAlpha(glowt[k+1]*15);
			SetGraphicAngle(0,0,0);
			SetGraphicScale(1,1);
			DrawGraphic(glowx[k+1],glowy[k+1]);
//			glowx[k+1]=glowx[k+1]+cos(glowd[k+1])*GetSpeed;
//			glowy[k+1]=glowy[k+1]+sin(glowd[k+1])*GetSpeed;
			glowx[k+1]=glowx[k+1]+cos(glowd[k+1])*GetSpeed;
			glowy[k+1]=glowy[k+1]+sin(glowd[k+1])*GetSpeed;
			k++;
		}
	}else{
		DeathFairyEffect(5,50);
		CyberDraw;
	}
	SetRenderState(ALPHA);
	if(type==1){
		SetGraphicRect(224, 0, 256, 32);
	}else{
		SetGraphicRect(128, 32*dir, 160, 32+32*dir);
	}
	SetGraphicAngle(0,0,0);
	SetGraphicScale(1,1);
	SetAlpha(255);
	DrawGraphic(GetX,GetY);

}

    @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);
		if(type==1){
			loop(5){
				CreateExplosionEX(3,GetX,GetY,0.1,RainbowArray(0+rand(-20,20),rand(50,80),50),rand(0.3,0.5),rand(50,80));
				CreateExplosionEX(3,GetX,GetY,0.1,RainbowArray(240+rand(-20,20),rand(50,80),50),rand(0.3,0.5),rand(50,80));
			}
		}
	}
    }

}
