let CircleImg=GPSD~"img\spellcircle.png";
let CircleL=[0,0,0,0,0,0,0,0, 0,0];
let CircleR=[1024,1024,1024,1024,1024,1024,1024,1024, 1024,1024];
let CircleT=[0,32,64,96,128,160,192,224, 256,352];
let CircleB=[32,64,96,128,160,192,224,256, 288,384];
let CircleS=[1.5,1.5,1.5,1.5,1.2,1.2,1.2,1.2, 1.2,1.5];

task SpellCircle2(graphic,rotspeed2,maxs,opacity){

    yield;

    let rotspeed1=rotspeed2;

    let obj = Obj_Create(OBJ_EFFECT);
    let n=0;
    let rotation=0;
    let segments=Detail(38,30,20);
    let radius=300/CircleS[graphic];
    let width=CircleB[graphic]-CircleT[graphic];
    let expand=0;
    let x=GetX;let y=GetY;

    Obj_SetPosition   (obj, GetX,GetY);
    Obj_SetSpeed      (obj, 500);
    Obj_SetAngle(obj, 0);
    ObjEffect_SetTexture(obj,CircleImg);
    ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
    ObjEffect_SetScale(obj,CircleS[graphic],CircleS[graphic]);
    ObjEffect_SetAngle(obj,0,0,rotation);
    ObjEffect_SetLayer(obj,1);
    ObjEffect_CreateVertex(obj,(segments*2)+2);
    ObjEffect_SetRenderState(obj,ALPHA);
    Obj_SetAutoDelete(obj,false);

    SetBottomVertices(obj,graphic,0,segments,opacity);
    ExpandTop(obj,graphic,radius,segments,opacity);
    loop(25){
	rotation+=rotspeed2+rotspeed1;
	ObjEffect_SetAngle(obj,0,0,rotation);
	UpdateCirclePos(obj,x,y,maxs);
	x=Obj_GetX(obj)+500;y=Obj_GetY(obj);
	yield;
    }
    ExpandBottom(obj,graphic,radius-width,segments,opacity);
    n=1;
    loop(94){
	rotation+=((cos(lower(n,85)*(180/85))+1)/2)*rotspeed1+rotspeed2;
	ObjEffect_SetAngle(obj,0,0,rotation);
	UpdateCirclePos(obj,x,y,maxs);
	x=Obj_GetX(obj)+500;y=Obj_GetY(obj);
	n++;
	yield;
    }
    let maxtimer=GetTimer2;
    while(!Obj_BeDeleted(obj)){
	rotation+=rotspeed2;
	ObjEffect_SetAngle(obj,0,0,rotation);
	UpdateCirclePos(obj,x,y,maxs);
	x=Obj_GetX(obj)+500;y=Obj_GetY(obj);
	SetTopVertices(obj,graphic,radius*(GetTimer2/maxtimer),segments,opacity);
	SetBottomVertices(obj,graphic,radius*(GetTimer2/maxtimer)-width,segments,opacity);

	yield;
    }
    Obj_Delete(obj);
}

function UpdateCirclePos(obj,x,y,maxs){
	let xa=-((center(-70,x-GetX,70))/20)*maxs;
	let ya=-((center(-70,y-GetY,70))/20)*maxs;
	Obj_SetPosition(obj,x+xa-500,y+ya);
}

function SetTopVertices(obj,graphic,radius,segments,opacity){
    let n=0;
    loop(segments+1){
	ObjEffect_SetVertexColor(obj,n,opacity,255,255,255);
	ObjEffect_SetVertexUV(obj,n,CircleL[graphic]+(CircleR[graphic]/segments)*floor(n/2),CircleT[graphic]);
	ObjEffect_SetVertexXY(obj,n, cos((360/segments)*floor(n/2))*radius, sin((360/segments)*floor(n/2))*radius );
	n+=2;
    }
}
function SetBottomVertices(obj,graphic,radius,segments,opacity){
    let difference=0;
    if(radius<0){
	difference=(0-radius);
	radius=0;
    }
    let n=1;
    loop(segments+1){
	ObjEffect_SetVertexColor(obj,n,opacity*0.7,255,255,255);
	ObjEffect_SetVertexUV(obj,n,CircleL[graphic]+(CircleR[graphic]/segments)*floor(n/2),CircleB[graphic]-difference);
	ObjEffect_SetVertexXY(obj,n, cos((360/segments)*floor(n/2))*radius, sin((360/segments)*floor(n/2))*radius);
	n+=2;
    }
}
task ExpandTop(obj,graphic,radius,segments,opacity){
    let expand=0;
    loop(45){
	SetTopVertices(obj,graphic,sin(expand*2)*radius*1.2,segments,opacity);
	expand++;
	yield;
    }
    expand=0;
    loop(45){
	SetTopVertices(obj,graphic,(radius*1.2)-((cos(expand*4+180)+1)*radius/2)*0.2,segments,opacity);
	expand++;
	yield;
    }
}
task ExpandBottom(obj,graphic,radius,segments,opacity){
    let expand=0;
    loop(90){
	SetBottomVertices(obj,graphic,(cos(expand*2+180)+1)*radius/2,segments,opacity);
	expand++;
	yield;
    }
}


task ResurrectionCircle(graphic,x,y,size,width1,rotspeed2,opacity,frames){
    size/=width1;

    yield;

    let rotspeed1=rotspeed2;

    let obj = Obj_Create(OBJ_EFFECT);
    let n=0;
    let rotation=0;
    let segments=24;
    let width=(CircleB[graphic]-CircleT[graphic])/2;
    let expand=0;

    Obj_SetPosition   (obj, x,y);
    Obj_SetSpeed      (obj, 0);
    Obj_SetAngle(obj, 0);
    ObjEffect_SetTexture(obj,CircleImg);
    ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
    ObjEffect_SetScale(obj,CircleS[graphic]*width1,CircleS[graphic]*width1);
    ObjEffect_SetAngle(obj,0,0,rotation);
    ObjEffect_SetLayer(obj,1);
    ObjEffect_CreateVertex(obj,(segments*2)+2);
    ObjEffect_SetRenderState(obj,ALPHA);
    Obj_SetAutoDelete(obj,false);

    let sizeadd=(size/frames);
    let origsize=size;
    SetTopVertices(obj,graphic,size,segments,opacity);
    SetBottomVertices(obj,graphic,size,segments,opacity);
    ExpandTopRes(obj,graphic,size,segments,opacity,frames);
    ExpandBottomRes(obj,graphic,size,width,segments,opacity,frames);
    loop(frames){
	rotation+=rotspeed2;
	ObjEffect_SetAngle(obj,0,0,rotation);	
	yield;
    }
    Obj_Delete(obj);
}

task ExpandTopRes(obj,graphic,radius,segments,opacity,frames){
    let opadd=opacity/(frames/2);
    let maxopacity=opacity;
    opacity=0;
    let expand=0;
    loop(frames){
	if(opacity<maxopacity){
		opacity+=opadd;
	}
	if(opacity>255){opacity=255;}
	
	SetTopVertices(obj,graphic,radius*cos((expand/frames)*90),segments,opacity);
	expand++;
	yield;
    }
}
task ExpandBottomRes(obj,graphic,radius,radius2,segments,opacity,frames){
    let op=0;
    let maxopacity=opacity;
    let opadd=opacity/(frames/2);
    let expand=0;
    loop(frames){
	if(opacity<maxopacity){
		opacity+=opadd;
	}
	if(opacity>255){opacity=255;}

	SetBottomVertices(obj,graphic,radius*(cos((expand/frames)*90+90)+1)-radius2,segments,opacity);
	expand++;
	yield;
    }
}