script_enemy_main {
	#include_function ".\..\ShotSheet\shot_replace.dnh"
	#include_function ".\..\functions.txt"
	#include_function ".\e_functions.txt"

	SpellID=18;

	let frame = 0;
	let shottimer=1;
	let x=0;
	let y=0;
	let i=0;
	let i2=0;
	let i3=0;
	let i4=0;
	let angle=0;
	let attacks=1;
	let xshift=0;
	let yshift=0;
	let side=130;
	let vside=90;

	let BGscrollx=0;
	let BGscrolly=0;
	let BGscrollx2=0;
	let BGscrolly2=0;
	let BGscrollx3=0;
	let BGscrolly3=0;
	let bgrot=0;

    @Initialize {
	SetCommonData("BGInit",0);
	StartFunctions(1,0,0);
	Randomize;
        SetLife(1750);
        SetTimer2(30);
	SetBG(1);
	SetDamageRate(80,70);
	MagicCircle(false);
	SetEnemyMarker(true);

	EnderInit;
	shotinit;

	CutIn2(0,"Blade [Hyperion Lance]");
	SpellCircle2(0,1,4,170);

	MainTask;
    }

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

task MainTask{
	SetMovePosition03(GetCenterX,100,10,5);
	DelayBombTask;
	Wait(100);
	MainTask2;
	CreateLaser(GetX,GetY,20,90+45*RandDir,80,3);
	Wait(250);
	loop{
		CreateLaser(GetX,GetY,20,GetAngleToPlayer,80,3);
		Wait(250);
	}
}
task MainTask2{
	Wait(90);
	let k=0;
	loop{
		k=prand(0,360);
		loop(30){
			CreateLaser01(GetX,GetY,3.5,k,80,20,ORANGE21,0);
			CreateLaser01(GetX,GetY,2  ,k,80,20,WHITE21,0);
			k+=36/3;
		}
		k=0;
		loop(6){
			CreateExplosionEX(3,GetX,GetY,1,[150,100+k*10,50+k*20],rand(0.05,0.15),rand(40,90));
			k++;
		}

		Wait(250);
	}
}
    @MainLoop {
	EnderDrawLogic;
        SetCollisionA(GetX, GetY, 35);
	SetCollisionB(GetX, GetY, 25);

	yield;
}


	let EnderFrame=0;

	let aurarot=0;
	let aurascale=0;
	let scaler=prand(1.7,1.9);

    @DrawLoop {
	EnderDrawLoop;
}

    @Finalize {
	EndingFunc(1);
	EnderFinalize;
	PointItems(GetX,GetY,1,1);
    }

task CreateLaser(x,y,v,angle,delay,bounces){
    let endx=x;
    let endy=y;

    let obj2=Obj_Create(OBJ_LASER);
    Obj_SetPosition   (obj2, x,y);
    Obj_SetSpeed      (obj2, 0);
    ObjShot_SetGraphic(obj2, WHITE60);
    ObjShot_SetDelay  (obj2, 0);
    Obj_SetAngle(obj2, angle);
    ObjShot_SetBombResist(obj2,true);
    ObjLaser_SetLength(obj2,800);
    ObjLaser_SetWidth(obj2,3);
    ObjLaser_SetSource(obj2,false);
    Obj_SetAutoDelete(obj2,false);
    Obj_SetCollisionToPlayer(obj2,false);

    loop(delay){yield;}

    SE("slash");

//    CreateLaserBasic(x,y,v,angle,140,130,BLUE21,0,false);
//    CreateLaserBasic(x,y,v,angle,180,60,RED56,0,true);
    CreateLaserBasic(x,y,v,angle,180,80,BLUE21,0,true);


    let obj = Obj_Create(OBJ_LASER);

    // initial settings
    Obj_SetPosition   (obj, x,y);
    Obj_SetSpeed      (obj, 0);
    ObjShot_SetGraphic(obj, BLUE60);
    ObjShot_SetDelay  (obj, 0);
    Obj_SetAngle(obj, angle);
    ObjShot_SetBombResist(obj,true);
    ObjLaser_SetLength(obj,0);
    ObjLaser_SetSource(obj,false);
    Obj_SetAutoDelete(obj,false);

    let length=0;
    let frame=0;

    let flag=0;
    while(!OffScreen(endx,endy,0)||flag==0){
	if(!OffScreen(endx,endy,0)){flag=1;}
	RandomWidth(obj,30);
	length+=v;
	endx=x+cos(angle)*length;
	endy=y+sin(angle)*length;
	ObjLaser_SetLength(obj,length+100);
//	FadeShot(endx,endy,1,prand(0,360),0);
	if(frame%2>0){
		MainShot(endx,endy,2,angle-180*((frame/2)%2),180,BLUE21,0,1);
		CreateExplosionFlatEX(3,endx,endy,1,[100,100,200],0.08,30);
	}
	frame++;
	yield;
    }


    if(bounces>0){
	x+=cos(angle)*length;
	y+=sin(angle)*length;
	CreateLaser(x,y,v,atan2(GetPlayerY-y,GetPlayerX-x),delay,bounces-1);
//	CreateLaser(x,y,v,0,delay,bounces-1);

    }

    Obj_Delete(obj2);
    Obj_SetCollisionToPlayer(obj,false);

    let width=40;
    loop(40){
	width--;
	RandomWidth(obj,width);
	yield;
    }
    Obj_Delete(obj);

}
function RandomWidth(obj,max){
	ObjLaser_SetWidth(obj,prand(max/4,max));

}

task CreateLaserBasic(x,y,v,a,l,w,g,d,coll){
    let obj = Obj_Create(OBJ_LASER);
    Obj_SetPosition   (obj, x,y);
    Obj_SetSpeed      (obj, v);
    ObjShot_SetGraphic(obj, g);
    ObjShot_SetDelay  (obj, d);
    Obj_SetAngle(obj, a);
    ObjShot_SetBombResist(obj,true);
    ObjLaser_SetLength(obj,l);
    ObjLaser_SetWidth(obj,w);
    ObjLaser_SetSource(obj,false);
    Obj_SetAutoDelete(obj,false);
    Obj_SetCollisionToPlayer(obj,coll);
    while(!OffScreen(x,y,50)||frame<10){
	x+=cos(a)*v;
	y+=sin(a)*v;
	Obj_SetPosition(obj,x,y);
	frame++;
	yield;
    }
    Obj_Delete(obj);
}

let cshot2=[WHITE50,RED50,ORANGE50,YELLOW50];

task FadeShot(x,y,v,a,d){
    let obj = Obj_Create(OBJ_SHOT);

    v=v*(absolute(cos(a)));

    // initial settings
    Obj_SetPosition   (obj, x,y);
    Obj_SetSpeed      (obj, v);
    ObjShot_SetGraphic(obj, cshot2[prand_int(0,3)]);
    ObjShot_SetDelay  (obj, d);
    Obj_SetAngle(obj, a);
    ObjShot_SetBombResist(obj,true);
    Obj_SetAutoDelete(obj,false);
    ObjShot_FadeDelete(obj);
}
task MainShot(x,y,v,a,accel,g,d,dir){
    let obj=[0,0,0,0,0];
    let i=0;
    let stimer=0;
    let reflect=0;
    let rotangle=0;
    let rotdir=RandDir;
    let radius=8;

    loop(5){
	obj[i] = Obj_Create(OBJ_SHOT);
	Obj_SetPosition   (obj[i], x,y);
	Obj_SetSpeed      (obj[i], 0);
	ObjShot_SetDelay  (obj[i], d);
	ObjShot_SetBombResist(obj[i], true);
	if(i<4){ObjShot_SetGraphic(obj[i], g);}
	i++;
    }
//    ObjShot_SetGraphic(obj[4], g2);
    Obj_SetCollisionToPlayer(obj[4],false);
    Obj_SetAngle(obj[4], a);
    ObjShot_SetBombResist(obj[4], false);

    let curvel=0;
    let vadd=v/accel;
    while(! Obj_BeDeleted(obj[4])) {
	d--;
	if(d<0){Obj_SetPosition(obj[4],Obj_GetX(obj[4])+cos(a)*curvel,Obj_GetY(obj[4])+sin(a)*curvel)}
	i=0;
	loop(4){
		let a2=i*90+rotangle;
		Obj_SetPosition(obj[i],Obj_GetX(obj[4])+cos(a2)*radius,Obj_GetY(obj[4])+sin(a2)*radius);
		Obj_SetAngle(obj[i], a2);
		i++;
	}
	rotangle+=rotdir*7;
	stimer++;
	x=Obj_GetX(obj[4]);
	y=Obj_GetY(obj[4]);
	curvel=lower(curvel+vadd,v);
        yield;
    }
    i=0;
    loop(4){
	ObjShot_FadeDelete(obj[i]);
	i++;
    }
    loop(60){
	x+=cos(a)*curvel;
	y+=sin(a)*curvel;
	i=0;
	loop(4){
		let a2=i*90+rotangle;
		Obj_SetPosition(obj[i],x+cos(a2)*radius,y+sin(a2)*radius);
		Obj_SetAngle(obj[i], a2);
		i++;
	}

	rotangle+=rotdir*7;
	yield;
    }
}


task Charge(cdelay, cframes, csize, cr,cg,cb, crot) {

    loop(cdelay){yield;}

    let obj = Obj_Create(OBJ_EFFECT);
    let timer=0;
    let spin=prand(0,360);
    let maxcframes=cframes;
    let maxcsize=csize;
    let calpha=0;

    // initial settings    

    Obj_SetPosition   (obj, GetX,GetY);
    Obj_SetSpeed      (obj, 500);
    Obj_SetAngle(obj, 0);
    ObjEffect_SetTexture(obj,imgEnemy);
    ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
    ObjEffect_SetScale(obj,csize,csize);
    ObjEffect_SetAngle(obj,0,0,spin);
    ObjEffect_SetLayer(obj,1);
    ObjEffect_CreateVertex(obj,4);
    ObjEffect_SetVertexXY(obj,0,0-16,0-16);
    ObjEffect_SetVertexXY(obj,1,0-16,0+16);
    ObjEffect_SetVertexXY(obj,2,0+16,0+16);
    ObjEffect_SetVertexXY(obj,3,0+16,0-16);
    ObjEffect_SetVertexUV(obj, 0, 65, 1);
    ObjEffect_SetVertexUV(obj, 1, 65, 63);
    ObjEffect_SetVertexUV(obj, 2, 127, 63);
    ObjEffect_SetVertexUV(obj, 3, 127, 1);
//    Obj_SetAutoDelete(obj,false);


    while(! Obj_BeDeleted(obj)&&cframes>0) {

	Obj_SetX(obj,GetX-500);
	Obj_SetY(obj,GetY);
	ObjEffect_SetAngle(obj,0,0,spin);
	csize=(cframes/maxcframes)*maxcsize;
	ObjEffect_SetScale(obj,csize,csize);
	spin+=crot;
	cframes--;
	if(calpha<200){calpha+=5;}
	ObjEffect_SetVertexColor(obj, 0, calpha, cr,cg,cb);
	ObjEffect_SetVertexColor(obj, 1, calpha, cr,cg,cb);
	ObjEffect_SetVertexColor(obj, 2, calpha, cr,cg,cb);
	ObjEffect_SetVertexColor(obj, 3, calpha, cr,cg,cb);

        yield;

    }
    Obj_Delete(obj);
}

}