script_enemy_main {

	#include_function ".\..\ShotSheet\shot_replace.dnh"
	#include_function ".\..\functions.txt"
	#include_function ".\..\other\enemy_functions_exchikke.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,1.5,200,500,2200,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=          [0,10,0,10,10];
	let ScoreItem=     [1,2, 0,3,5];
	let MultiplierItem=[0,2, 0,1,5];

	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;

    @Initialize {
	Randomize;
	shotinit;
	if(type==1){Life[type]=Life[type]*arg4;}
        SetLife(Life[type]+10000);
	prevlife=Life[type];
	totallife=Life[type];
	SetDamageRate(255,bomb[type]*2);

	ExchikkeInit;

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

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

	let i=0;
	let i2=0;
	let i3=0;

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

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

	ExchikkeMainLoop;

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

	if(GetLife<10000){VanishEnemy;}	

	if(type==4){
		DeathFairyLogic(300+rand(-20,20),rand(0.3,0.8),0+rand(-20,20),rand(0,0.8));
		CyberDrawLogic(30,30);
	}

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

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

//-------------------------------------------------------------------------------------------------  //0=main	| [angvel,time],[type,vel,delay,number,offset],interval,delay
task Move0{
	let angle=GetAngle;
	loop{
		loop(arg1[1]){
			angle+=arg1[0];
			SetAngle(angle);
			yield;
		}
		loop(arg1[1]){
			angle-=arg1[0];
			SetAngle(angle);
			yield;
		}
	}
}
task Shoot0{
	if(diff==0){arg3=arg3*1.5;}
//	if(diff==2){arg3=arg3*0.7;}
	if(arg3>0){
		Wait(arg4);
		loop{
			i=0;
			loop(arg2[3]){
				if(i%2==0){
					CreateShot01Delay(GetX,GetY,arg2[1],GetAngle+90,arg2[0],arg2[2]*i+20,  30,16,20);
					CreateShot01Delay(GetX,GetY,arg2[1],GetAngle-90,arg2[0],-arg2[2]*i-20, 30,16,20);
					if(diff==2){
						CreateShot01Delay(GetX,GetY,arg2[1],GetAngle+180+45,arg2[0],-arg2[2]*i-20,  30,16,20);
						CreateShot01Delay(GetX,GetY,arg2[1],GetAngle-180-45,arg2[0],-arg2[2]*i-20, 30,16,20);
					}
				}else{
					CreateShot01Delay(GetX+cos(GetAngle)*arg2[4],GetY+sin(GetAngle)*arg2[4],arg2[1],GetAngle+90,arg2[0],arg2[2]+20,  30,16,20);
					CreateShot01Delay(GetX-cos(GetAngle)*arg2[4],GetY-sin(GetAngle)*arg2[4],arg2[1],GetAngle+90,arg2[0],-arg2[2]-20, 30,16,20);
	
					CreateShot01Delay(GetX+cos(GetAngle)*arg2[4],GetY+sin(GetAngle)*arg2[4],arg2[1],GetAngle-90,arg2[0],arg2[2]+20,  30,16,20);
					CreateShot01Delay(GetX-cos(GetAngle)*arg2[4],GetY-sin(GetAngle)*arg2[4],arg2[1],GetAngle-90,arg2[0],-arg2[2]-20, 30,16,20);

					if(diff==2){
						CreateShot01Delay(GetX+cos(GetAngle+90+45)*arg2[4], GetY+sin(GetAngle+90+45)*arg2[4],arg2[1],GetAngle+180+45,arg2[0],-arg2[2]*i-20,  30,16,20);
						CreateShot01Delay(GetX-cos(GetAngle+90+45)*arg2[4], GetY-sin(GetAngle+90+45)*arg2[4],arg2[1],GetAngle+180+45,arg2[0],-arg2[2]*i-20,  30,16,20);
						CreateShot01Delay(GetX+cos(GetAngle+90-45)*arg2[4],GetY+sin(GetAngle+90-45)*arg2[4],arg2[1],GetAngle+180-45, arg2[0],-arg2[2]*i-20,  30,16,20);
						CreateShot01Delay(GetX-cos(GetAngle+90-45)*arg2[4],GetY-sin(GetAngle+90-45)*arg2[4],arg2[1],GetAngle+180-45, arg2[0],-arg2[2]*i-20,  30,16,20);
					}
				
				}
				i++;
			}
			SE("shot1");
			Wait(arg3);
		}
	}
}
//-------------------------------------------------------------------------------------------------  //1=spread	|decel time, wait, [type,vel,spread,delay,number, type,vel,number], life
task Move1{
	arg3[4]=trunc(arg3[4]*((diff/2)+0.5));
	arg3[7]=trunc(arg3[7]*((diff/2)+0.5));
	let decel=GetSpeed/arg1;
	loop(arg1){
		SetSpeed(GetSpeed-decel);
		yield;
	}
	Wait(arg2);
	if(arg3[4]%2==0){i=0;}else{i=0.5;}
	let angle=GetAngleToPlayer;
	let angle2=angle;

	let numloops=1;
	if(diff==2){numloops=2;}

	let GATP=GetAngleToPlayer;
	loop(numloops){
		SE("shot2");
		loop(arg3[7]){
			CreateShot01Delay(GetX,GetY,arg3[6]*numloops,angle+ii*(360/(arg3[7])),arg3[5],arg3[3],  30,-15,rand(50,150));
			ii++;
		}
		ii=0;
		angle=GATP-(arg3[2]*(arg3[4]-1))/2;
		loop(arg3[4]){
			CreateShot01Delay(GetX,GetY,arg3[1]*numloops,angle+(ii*((arg3[2]))),arg3[0],arg3[3],  30,-15,rand(50,150));
			ii++;
		}
		Wait(arg3[3]);
		SE("shot2");
		arg3[4]=arg3[4]-1;
		ii=0.5;
		loop(arg3[4]){
			CreateShot01Delay(GetX,GetY,arg3[1]*numloops,angle+(ii*((arg3[2]))),arg3[0],arg3[3],  30,15,rand(50,150));
			ii++;
		}

		if(arg3[4]%2==0){i=0;}else{i=0.5;}
		loop(arg3[7]){
			CreateShot01Delay(GetX,GetY,arg3[6]*numloops,angle2+ii*(360/(arg3[7])),arg3[5],arg3[3],  30,15,rand(50,150));
			ii++;
		}
		Wait(arg3[3]);
	}


	Wait(arg3[3]*3);
	loop(arg1){
		SetSpeed(GetSpeed-decel);
		yield;
	}
}
//-------------------------------------------------------------------------------------------------  //2=tube	|[angle1,angleadd],decel,accel,[type,vel,vel2,delay]
task Move2{
	let k=0;
	ii=0;
	loop{
		k+=upper(arg4[3],0.00001);
		while(k>0){k--;yield;}
		CreateShotA(1,GetX,GetY,arg4[3]);
		SetShotDirectionType(ABSOLUTE);
		SetShotDataA(1,0,arg4[1],arg1[0]+(arg1[1]*ii),0,-arg4[1]/arg2,0,arg4[0]);
		SetShotDataA(1,arg2,0,GetAngleToPlayer,0,arg4[2]/arg3,arg4[2],arg4[0]);
		FireShot(1);
		ii++;
	}
}

//-------------------------------------------------------------------------------------------------  //3=shotgun|decel,[angle1,angle2],[numtype,vel,delay,number],[shot types]
task Move3{
	arg3[2]=arg3[2]/((diff+1)/3);
	arg3[3]=arg3[3]*((diff+1)/3);

	let initspeed=GetSpeed;
	let decel=GetSpeed/arg1;
	let k=0;
	let totalk=0;
	loop{
		loop(arg1){
			SetSpeed(GetSpeed-decel);
			yield;
		}
		k=0;
		totalk=0;
		loop(arg3[3]){
			//CreateShot01(GetX,GetY,arg3[1]*prand(0.3,1),prand(arg2[0],arg2[1]),arg4[prand_int(1,arg3[0])-1],0);

			if(GetY<GetClipMaxY-10&&GetX>GetClipMinX&&GetX<GetClipMaxX){
				CreateShotA(1,GetX,GetY,0);
				SetShotDataA(1,0,arg3[1]*prand(0.3,1),(arg2[0]+arg2[1])/2,0,0,0,arg4[prand_int(1,arg3[0])-1]);
				SetShotDataA(1,(arg3[2]*arg3[3])-totalk+1,NULL,NULL,((prand(arg2[0],arg2[1]))-((arg2[0]+arg2[1])/2))/((arg3[2]*arg3[3])-totalk+1),0,0,NULL);
				SetShotDataA(1,((arg3[2]*arg3[3])-totalk)*2+2,NULL,NULL,0,0,0,NULL);
				FireShot(1);
				SE("shot1");
			}

			k+=arg3[2];
			totalk+=arg3[2];
			while(k>=1){yield;k--;}
		}
		SetSpeed(initspeed);
	}
}

//-------------------------------------------------------------------------------------------------  //3=deathfairy
task Move4{
	SetMovePositionNew(GetCenterX,GetCenterY-100,60);
	SetInvincibility(120);
	Wait(60);
	let angle=0;
	let waittime;
	let timestop=30;
	let dir=1;
	let x;
	let y;
	let color=0;
	let colors=[6,0,5];
	let num=[40,48,80][diff];
	let delay=[60,40,40][diff];
	let offset=[30,20,15][diff];
	loop(600/delay){
		angle=rand(0,360);
		x=GetX+cos(angle)*offset;
		y=GetY+sin(angle)*offset;
		loop(7){
			CreateExplosionEX(3,x,y,1,RainbowArray(320+[0,1,-1][color%3]*50,rand(100,150),100),rand(0.2,0.4),rand(10,40));
		}
		angle=rand(0,360);
		waittime=0;
		SE("shot2");
		SE("shot1");
		loop(num){
			CreateShotA(0,x,y,0);
			SetShotDataA(0,0,2,angle,0,0,0,RED01+colors[color%3]);
			SetShotDataA(0,timestop,0,angle,0,2/(timestop+sin(waittime)*timestop),2,NULL);

			SetShotDataA(0,timestop*3,0,angle+90*dir,0,2/60,2,NULL);

			FireShot(0);
			angle+=360/num;
			waittime+=90;
		}
		color++;
		dir=-dir;

		Wait(delay);
	}
	Wait(60);
	let speed=0;
	loop{
		speed+=0.1;
		SetX(GetX+speed/2);
		SetY(GetY-speed);
		yield;
	}
}

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



    @DrawLoop{
	if(type==4){
		DeathFairyEffect(5,50);
		CyberDraw;
	}
	ExchikkeDrawLoop;
}

    @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);

	}
    }

}
