 let s2bg1=GPSD~"img\rock.png";
 let s2bg2=GPSD~"img\firefly.png";
 let s2bg3=GPSD~"img\rock2.png";
 let s2bg4=GPSD~"img\lightray.png";
 let s2bg5=GPSD~"img\stars2.png";
 let s2bg6=GPSD~"img\radialgradient.png";
 let s2title=GPSD~"img\stage2.png";

 let si=0;

// Type, X, Y, V, Angle, a1, a2, a3, a4
//

	let spawnx1=[GetClipMinX-20,GetClipMaxX+20,GetClipMinX-20,GetClipMaxX+20];
	let spawny1=[GetCenterY-40,GetCenterY-40,GetCenterY-80,GetCenterY-80];
	let angle1=[20,160,50,120];
	let spin1=[-2,2,-3,3];

 function CompileEnemiesS2(delay){
	CreateBoss2(GetCenterX,GetCenterY,2,"s2",["_last","~_explode"],[[0,1],[1,1],[1,1]],diff,1, 2,delay>0);	//overload last
	Wait(delay);
	CreateBoss2(GetCenterX,GetCenterY,2,"s2",["n_1","s_1","n_2","s_2","n_3","s_3","~_explode"],[[1,1,1,1,1,1,1],[1,1,1,1,1,1,1],[1,1,1,1,1,1,1]],diff,6, 2,delay>0);	//overload
	Wait(delay);
	CreateBoss2(GetCenterX,-100,9,"s2",["_1","~_exit"],[[1,1],[1,1],[1,1]],diff,1, -1,delay>0);	//kisume
	Wait(delay);
	CreateBoss2(GetCenterX,-100,1,"s2",["n_1","s_1","s_2"],[[1,1,1],[1,1,1],[1,1,1]],diff,3, 1,delay>0);	//empegh
	Wait(delay);
 }

 task stage2(fullgame){
	SetSeenStage(GetPlayer,1,diff);

	if(IsAWCPlayer&&fullgame==0&&!IsReplay){
		IncTimesPlayed(GetPlayer,2,diff);
	}

	s2vertangle=40;
	s2bgspinspeed=0;
	s2bgcameraspeed=0;
	Music(3);

	S2Title(180,100,100,100);

	if(fullgame==0){
		s2speed=0.1;
		BGS2Angle(40,0,430);
		Wait(180);
	}else{
		s2speed=4;
		BGS2Speed(2.5,-1.5,80);
		let obj=InitEffect(GetClipMinX,GetClipMinY,stgwhite,4,SUBTRACT,1);
		ObjEffect_SetXYRect(obj,0,0,GetClipMaxX-GetClipMinX,GetClipMaxY-GetClipMinY);
		let alpha=255;
		let alphaadd=255/80;
		loop(80){
			alpha-=alphaadd;
			ObjEffect_SetColor(obj,4,255,alpha,alpha,alpha);
			yield;
		}
		Obj_Delete(obj);
		BGS2Angle(40,0,350);
		si=0;
		loop(100){
			s2speed=((cos(si*(180/100))+1)/2)*0.9+0.1;
			si++;
			yield;
		}
	}

	SetEnemyInvincibility(0);

//	Dialogue(2,1);
//	loop{yield;}
	Wait(120);

	si=0;
	loop(2){
		E21(0,GCX-200,GetCenterY+si*35,0,0, [2,-4],200,[YELLOW01,0,-2,4,119],22-si ,[80,96,3,1]);
		Wait(24);
		si++;
		E21(0,GCX+200,GetCenterY+si*35,0,0, [-2,-4],200,[YELLOW01,0,-2,4,119],22-si ,[80,96,3,1]);
		Wait(24);
		si++;
		E21(0,GCX-200,GetCenterY+si*35,0,0, [2,-4],200,[BLUE01,0,-2,4,119],22-si ,[230,64,2,1]);
		Wait(24);
		si++;
		E21(0,GCX+200,GetCenterY+si*35,0,0, [-2,-4],200,[BLUE01,0,-2,4,119],22-si ,[230,64,2,1]);
		Wait(24);
		si++;
	}
	Wait(50);
	si=0;
	loop(5){
		E21(0,GCX+200,GetClipMaxY,0,0, [-1-si*0.2,-7],200,[GREEN11,0,-2,4,120],0 ,[120,96,1,1]);	//jump up from right side
		Wait(20);
		si++;
	}

	si=0;
	loop(4){
		E21(0,GCX-200,20+si*5,0,0, [0.3,-0.2],15,[YELLOW21,-2,-2,4,120],21-si ,[80,96,3,1]);	//fall down
		E21(0,GCX+200,20+si*5,0,0, [-0.3,0.2],15,[YELLOW21,2,-2,4,120],21-si ,[80,96,3,1]);
		Wait(20);
		E21(0,GCX-200,20+si*5,0,0, [0.3,-0.2],15,[BLUE21,2,-2,4,120],21-si ,[230,64,2,1]);
		E21(0,GCX+200,20+si*5,0,0, [-0.3,0.2],15,[BLUE21,-2,-2,4,120],21-si ,[230,64,2,1]);
		si++;
		Wait(20);
	}

	si=0;
	loop(5){
		E21(0,GCX-200,GetClipMaxY,0,0, [1+si*0.2,-7],200,[GREEN11,0,-2,4,120],0 ,[120,96,1,1]);	//jump up from left side
		Wait(20);
		si++;
	}

	BGS2Speed(0.1,1,300);

	Wait(150);
	si=0;
	loop(5){
		E21(2,GCX-200,GetCenterY-100,0,0, [2,-2], 200,[YELLOW11,3,5,5],40-si*3 ,[80,64,1,1]);	//streaming
		Wait(30);
		E21(2,GCX+200,GetCenterY-100,0,0, [-2,-2],200,[BLUE11,3,5,5],40-si*3,[230,64,1,1]);
		Wait(30);
		si++;
	}
	Wait(60);

	si=-4;
	loop(7){
		E21(0,GCX+200,GetCenterY-100,0,0, [-1-si*0.1,-1+si*0.3],200,[YELLOW21,0,-2,4,119],30-si ,[80,96,3,1]);	//rows of blue and yellow
		si++;
	}
	si=-4;
	loop(7){
		E21(0,GCX-200,GetCenterY-100,0,0, [1+si*0.1,-1+si*0.3],200,[BLUE21,0,-2,4,119],30-si ,[230,64,2,1]);
		si++;
	}

	Wait(120);

	si=0;
	loop(10){
		E21(0,GCX+200,150+cos(si*96)*60,0,0, [-1+cos(si*29)*0.5,-1],200,[YELLOW21,0,-2,4,119],0 ,[80,64,3,1]);  //random fodder spam from the sides
		si++;
		Wait(10);
		E21(0,GCX-200,150+cos(si*56)*60,0,0, [1-cos(si*39)*0.5,-1],200,[GREEN21,0,-2,4,119],0 ,[120,64,1,1]);
		si++;
		Wait(10);
	}

	si=0;
	loop(5){
		E21(0,GCX+200,20+si*20,0,0, [-5,-1],200,[GREEN02,0,0,4,220],10-si,[120,64,1,1]);
		E21(0,GCX-200,20+si*20,0,0, [5,-1],200,[GREEN02,0,0,4,220],10-si,[120,64,1,1]);
		si++;
		Wait(20);
	}


	E21(2,GCX-200,GetCenterY-100,0,0, [4,-1], 200,[PURPLE11,2,7,3],10 ,[250,64,2,1]);
	E21(2,GCX+200,GetCenterY-100,0,0, [-4,-1],200,[PURPLE11,2,7,3],10,[250,64,2,1]);


	Wait(190);
	E22(1,GetCenterX,0,6,90, 0,0,0,0 ,[0,0,0,6]);	//death fairy
	WaitForZeroEnemy;

	Wait(60);

	si=0;
	loop(5){
		E21(2,GCX-200,GetCenterY-100,0,0, [2,-2], 200,[GREEN11,2,5,5],60-si*3 ,[120,64,1,1]);	//streaming
		E21(3,GCX-prand(190,220),GetCenterY-100,0,0, [2,-2+si/2],200,[WHITE54,WHITE04,4,1,0.02,80,8,40],50 ,[300,0,3,1]);
		Wait(40);
		E21(2,GCX+200,GetCenterY-100,0,0, [-2,-2],200,[PURPLE11,2,5,5],60-si*3,[250,64,1,1]);
		E21(3,GCX+prand(190,220),GetCenterY-100,0,0, [-2,-2+si/2],200,[WHITE54,WHITE04,4,1,0.02,80,8,40],50 ,[300,0,3,1]);
		Wait(40);
		si++;
	}

	BGS2Speed(1,0.5,300);

	Wait(240);

	BGS2Speed(1.5,-1,1800);
	BGS2Angle(0,60,600);

	si=-1;
	if(GetPlayerX>GetCenterX){si=1;}
	E23(0,GCX+100*si,0,5,90, 0.5*si,SP01,10,4 ,[30,255,3,1,0]);	//flamethrower fairy
	Wait(40);
	E23(0,GCX-100*si,0,5,90, -0.5*si,SP01,10,4 ,[30,255,3,1,0]);	//flamethrower fairy
	Wait(80);
	E23(0,GCX,0,5,90, 0,SP01,10,3 ,[30,255,3,1,0]);	//flamethrower fairy
	Wait(60);
	E23(0,GCX+30,0,5,90-20, 0,SP01,10,4 ,[30,255,3,1,0]);	//flamethrower fairy
	E23(0,GCX-30,0,5,90+20, 0,SP01,10,4 ,[30,255,3,1,0]);	//flamethrower fairy
	Wait(80);
	E23(0,GCX-200,40,5,90-70, 0,SP01,10,5 ,[30,255,3,1,0]);	//flamethrower fairy
	E23(0,GCX+200,40,5,90+70, 0,SP01,10,5 ,[30,255,3,1,0]);	//flamethrower fairy
	Wait(80);
	E23(0,GCX-200,80,5,90-120, 0,SP01,10,5 ,[30,255,3,1,0]);	//flamethrower fairy
	E23(0,GCX+200,80,5,90+120, 0,SP01,10,5 ,[30,255,3,1,0]);	//flamethrower fairy
	E23(0,GCX-200,140,4,90-120, 0,SP01,10,5 ,[30,255,3,1,0]);	//flamethrower fairy
	E23(0,GCX+200,140,4,90+120, 0,SP01,10,5 ,[30,255,3,1,0]);	//flamethrower fairy
	Wait(150);
	si=-2;
	loop(5){
		E23(0,GCX-si*80,0,3,90+si*10, -si*0.2,SP01,16,14+absolute(si)*5 ,[30,255,3,1,0]);	//flamethrower fairy		
		si++;
	}
	Wait(120);



	Wait(300);
	Dialogue(2,0);
	while(EventStep!=1&&EventActive){yield;}
	SpawnBoss;
	BeatCircle;
	WaitForBossDead;
	Wait(60);
	DeleteDialoguePics(["empegh"]);
	SetCommonData("SpellTextOpacity",0);
	SetShotAutoDeleteClip(64,64,64,64);

	Wait(100);

	loop(3){
		si=0;
		loop(5){
			E21(0,GCX-250,150,0,0, [0.5+si/2,-1-si],120,[BLUE01,0,0,0,0],0,[230,64,2,1]);
			si++;
		}
		Wait(30);
		si=0;
		loop(5){
			E21(0,GCX+250,150,0,0, [-0.5-si/2,-1-si],120,[BLUE01,0,0,0,0],0,[230,64,2,1]);
			si++;
		}
		Wait(30);
	}
	Wait(60);
	BGS2Rotation(0,0.3,500);
	BGS2Angle(60,30,400);

	si=0;
	loop(20){
		E21(0,GCX,-10,0,0, [cos(si)*2,0.5],12,[GREEN01,0,0,0,0],0,[120,64,1,1]);
		si+=540/20;
		Wait(5);
	}

	loop(2){
		si=0;
		loop(5){
			E21(0,GCX+250,50,0,0, [-3+si/2,-0.2],20,[YELLOW01,0,-2,3,120],20,[80,96,3,1]);
			Wait(5);
			si++;
		}
		Wait(30);
		si=0;
		loop(5){
			E21(0,GCX-250,50,0,0, [3-si/2,-0.2],20,[YELLOW01,0,-2,3,120],20,[80,96,3,1]);
			Wait(5);
			si++;
		}
		Wait(30);
	}
	Wait(60);
	si=0;
	loop(5){
		E21(2,GCX+250,50,0,0, [-2-si/2,-0.2-si/10],60,[YELLOW21,3,3,5],20,[80,96,3,1]);
		E21(2,GCX-250,50,0,0, [2+si/2,-0.2-si/10],60,[YELLOW21,3,3,5],20,[80,96,3,1]);
		Wait(20);
		si++;
	}
	Wait(120);
	BGS2Angle(30,15,180);
	si=0;
	loop(20){
		E21(0,GCX-250,50,0,0, [5,sin(si)],120,[GREEN21,sin(si*4),-1,3,120],10,[120,96,1,0.5]);
		si+=360/20;
		Wait(10);
		E21(0,GCX+250,50,0,0, [-5,sin(si+180)],120,[GREEN21,sin(si*4),-1,3,120],10,[120,96,1,0.5]);
		si+=360/20;
		Wait(10);
	}
	Wait(200);
	E23(1,GetCenterX,0,6,90, 0,0,0,0 ,[180,255,0,6,1]);	//death fairy
	WaitForZeroEnemy;
	Wait(60);


	E22(2,GCX+200,100,4,180, 60,[BLUE11,2,5,5],[360,13],0,[230,96,2,1]);//pop in from the sides, not aimed
	E22(2,GCX-200,100,4,0,   60,[BLUE11,2,5,5],[360,13],0,[230,96,2,1]);
	Wait(160);
	si=0;
	loop(10){
		E22(2,GCX-200,30+si*20,3,0+si*7, 60,[PURPLE11,2,3,2],[90,3],0,[300,96,3,1]);//pop in from the left, not aimed
		Wait(7);
		si++;
	}
	si=0;
	loop(10){
		E22(2,GCX+200,30+si*20,3,180-si*7, 60,[PURPLE11,2,3,2],[90,3],0,[300,96,3,1]);//pop in from the right, not aimed
		Wait(7);
		si++;
	}
	Wait(120);

	si=-3;
	loop(7){
		E22(2,GCX+si*40,0,4+absolute(si),90-si*5, 60,[GREEN11,2,7,5],[90,3],1,[120,96,1,1]);//pop in from the top, aimed
		si++;
	}
	Wait(60);
	si=-3;
	loop(7){
		E22(2,GCX+si*40,0,5-absolute(si),90-si*5, 60,[YELLOW11,3,4,5],[90,3],1,[80,96,1,1]);//pop in from the top, aimed
		si++;
	}
	Wait(60);
	si=0;
	loop(5){
		E21(0,GCX-250,50,0,0, [3-si/10,-0.2-si/3],40,[GREEN01,0,-2,3,120],0,[120,96,1,1]);
		si++;
		Wait(1);
	}
	Wait(40);
	si=0;
	loop(5){
		E21(0,GCX+250,50,0,0, [-3+si/10,-0.2-si/3],40,[GREEN01,0,-2,3,120],0,[120,96,1,1]);
		si++;
		Wait(1);
	}
	si=0;
	loop(6){
		E21(2,GCX-250,100,0,0, [2,-2],150,[RED21+si,4,7,4],40,[si*51,96,si%3+1,1]);
		si++;
		Wait(15);
	}
	Wait(120);
	si=0;
	loop(10){
		E22(2,GCX+sin(si*40)*200,0,4+cos(si*90)*2,90+sin(si*200)*10, 60,[WHITE11,2,7,10],[180,3],0,[230,96,2,1]);//pop in from the top
		si++;
		Wait(12);
	}

	BGS2Speed(0.5,1.5,600);
	BGS2Rotation(0.3,0.4,300);
	BGS2Angle(15,0,300);

	Wait(140);

	SpawnBoss;
	BeatCircle;
	WaitForBossDead;
	Wait(60);

	Dialogue(2,1);
	s2fogswitch=1;
	while(EventStep<1&&EventActive){yield;}
	if(!EventActive){Wait(100);}

	S2BlowUpBG;
	SetPlayerY(400);
	SpawnBoss;
	while(EventStep<2&&EventActive){yield;}
	Music(4);
	BeatCircle;
	WaitForBossDead;
	CollectAllItems(5);
	CollectAllSouls(60);
	if(IsFullSoul&&GetCommonDataDefault("Diff",-1)>0){
		CancelExplosion;
		SpawnBoss;
		WaitForBossDead;
		CollectAllItems(5);
		CollectAllSouls(60);
	}
	ForbidShot2(true);

	Wait(450);
	DeleteDialoguePics(["overload"]);
	Dialogue(2,2);
	while(EventActive){yield;}
	DisplayResults(2);
	if(fullgame==1){
		InitStage(3,2,-1);
	}
	StageClear=1;
 }



//=======================================================================================================
//=======================================================================================================
//=======================================================================================================
//=======================================================================================================
//=======================================================================================================
 task FadeS2(delay, time){
	overlays2a=255;
	let overdec=255/time;
	loop(time){
		overlays2a-=overdec;
		yield;
	}
 }

 task BGS2Speed(original,change,t){change=change/t;let frame=1;loop(t){s2speed=original+change*frame;frame++;yield;}}
 task BGS2Rotation(original,change,t){change=change/t;let frame=1;loop(t){s2bgspinspeed=original+change*frame;frame++;yield;}}
 task BGS2Camera(original,change,t){change=change/t;let frame=1;loop(t){s2bgcameraspeed=original+change*frame;frame++;yield;}}
 task BGS2Angle(original,new,t){
	let frame=0;
	loop(t){
		s2vertangle=original+(-cos(frame*(180/t))+1)*((new-original)/2);
		frame++;
		yield;
	}
}

 function E21(let et, let xs, let ys, let vs, let as, let arg1, let arg2, let arg3, let arg4, let arg5){
  SetCommonData("E",et);
  SetCommonData("A2",arg2);
  SetCommonData("A3",arg3);
  SetCommonData("A4",arg4);
  SetCommonData("A5",arg5);
  CreateEnemyFromFile(GPSD~"enemy\21.txt", xs,ys,vs,as,arg1);
 }
 function E22(let et, let xs, let ys, let vs, let as, let arg1, let arg2, let arg3, let arg4, let arg5){
  SetCommonData("E",et);
  SetCommonData("A2",arg2);
  SetCommonData("A3",arg3);
  SetCommonData("A4",arg4);
  SetCommonData("A5",arg5);
  CreateEnemyFromFile(GPSD~"enemy\22.txt", xs,ys,vs,as,arg1);
 }
 function E23(let et, let xs, let ys, let vs, let as, let arg1, let arg2, let arg3, let arg4, let arg5){
  SetCommonData("E",et);
  SetCommonData("A2",arg2);
  SetCommonData("A3",arg3);
  SetCommonData("A4",arg4);
  SetCommonData("A5",arg5);
  CreateEnemyFromFile(GPSD~"enemy\23.txt", xs,ys,vs,as,arg1);
 }

 function S2init(delay){
	SetSoulReq(2);
	LoadGraphic(s2bg1);loop(delay){yield;}
	LoadGraphic(s2bg2);loop(delay){yield;}
	LoadGraphic(s2bg3);loop(delay){yield;}
	LoadGraphic(s2bg4);loop(delay){yield;}
	LoadGraphic(s2bg5);loop(delay){yield;}
	LoadGraphic(s2bg6);loop(delay){yield;}
	if(GetCommonDataDefault("SpellPractice",0)==0){
		LoadGraphic(s2title);loop(delay){yield;}
		LoadMusicNew(3);loop(delay){yield;}
		LoadMusicNew(4);loop(delay){yield;}
		LoadEnemies([21,22,23],delay);
		CompileEnemiesS2(delay);
		LoadDialoguePics(["empegh","overload"]);
	}
	let i=0;
	loop(12){
		s2bgtunnelsin=s2bgtunnelsin~[sin(i*(360/12))*15];
		s2bgtunnelcos=s2bgtunnelcos~[cos(i*(360/12))*15];
		i++;
	}
	s2rockangle=[24,199,248,65,118,171,99,19,163,202,240,47,99,146,12,155,163,84,46,41,15,95,11,40,14,83,228,151,157,122];
	s2rockz=[cos(24),cos(199),cos(248),cos(65),cos(118),cos(171),cos(99),cos(19),cos(163),cos(202),cos(240),cos(47),cos(99),cos(146),cos(12),cos(155),cos(163),cos(84),cos(46),cos(41),cos(15),cos(95),cos(11),cos(40),cos(14),cos(83),cos(228),cos(151),cos(157),cos(122)];
	s2rockx=[sin(24),sin(199),sin(248),sin(65),sin(118),sin(171),sin(99),sin(19),sin(163),sin(202),sin(240),sin(47),sin(99),sin(146),sin(12),sin(155),sin(163),sin(84),sin(46),sin(41),sin(15),sin(95),sin(11),sin(40),sin(14),sin(83),sin(228),sin(151),sin(157),sin(122)];
	s2rocktype=[2,4,1,3,6,9,3,15,2,1,2,6,14,6,1,3,10,0,3,13,8,12,1,13,1,5,7,15,12,8];
	s2rocksize=[5,8,4,2,7,6,7,5,6,4,8,3,2,3,5,1,8,2,8,2,5,4,3,1,8,4,8,9,1,3];
	s2rocky=[81,12,62,50,93,136,71,72,24,7,78,35,77,167,194,62,98,108,31,127,122,55,152,13,86,121,125,155,48,65];
 }
 task S2final(fullgame){
	if(fullgame==1){
		Wait(400);
	}
	DeleteGraphic(s2bg1);
	DeleteGraphic(s2bg2);
	DeleteGraphic(s2bg3);
	DeleteGraphic(s2bg4);
	DeleteGraphic(s2bg5);
	DeleteGraphic(s2bg6);
	DeleteMusicNew(3);
	DeleteMusicNew(4);
	s2rockangle=[];
	s2rockz=[];
	s2rockx=[];
	s2rocktype=[];
	s2rocksize=[];
	s2rocky=[];
 }

task S2Title(wait,fade,wait2,unfade) {
    StageTitle(wait,GetCenterX,GetCenterY-70,2,0);

    loop(wait){yield;}

    let x=0;
    let y=0;
    let obj = Obj_Create(OBJ_EFFECT);
    let timefade=fade;
    let opacity=0;
    let phase=0;
    let phasetimer=0;

    // initial settings    

    x=Obj_GetX(obj);
    y=Obj_GetY(obj);
    Obj_SetPosition   (obj, GetCenterX,GetCenterY);
    Obj_SetSpeed      (obj, 0);
    Obj_SetAngle(obj, 0);
    ObjEffect_SetTexture(obj,s2title);
    ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
    ObjEffect_SetScale(obj,1.25,1.25);
    ObjEffect_SetAngle(obj,0,0,0);
    ObjEffect_SetLayer(obj,4);
    ObjEffect_CreateVertex(obj,4);
    ObjEffect_SetVertexXY(obj,0,x-128,y-75);
    ObjEffect_SetVertexXY(obj,1,x-128,y+75);
    ObjEffect_SetVertexXY(obj,2,x+128,y+75);
    ObjEffect_SetVertexXY(obj,3,x+128,y-75);
    ObjEffect_SetVertexUV(obj, 0, 0, 0);
    ObjEffect_SetVertexUV(obj, 1, 0, 150);
    ObjEffect_SetVertexUV(obj, 2, 256, 150);
    ObjEffect_SetVertexUV(obj, 3, 256, 0);

    while(! Obj_BeDeleted(obj)) {

	if(0-timefade==unfade){
		Obj_Delete(obj);
	}
	if(phase!=1){
		timefade--;
		if(timefade>=0){
			opacity=255-(timefade/fade)*255;
		} else {
			if(phase<1){phase++;}
			opacity=255-(absolute(timefade)/unfade)*255;

		}	
	} else {
		phasetimer++;
		if(phasetimer>=wait2){phase++;}
		opacity=255;
	}

	if(opacity<0){opacity=0;}
	if(opacity>255){opacity=255;}

	ObjEffect_SetVertexColor(obj,0, opacity ,RCS2,RCS2,RCS2);
	ObjEffect_SetVertexColor(obj,1, opacity ,RCS2,RCS2,RCS2);
	ObjEffect_SetVertexColor(obj,2, opacity ,RCS2,RCS2,RCS2);
	ObjEffect_SetVertexColor(obj,3, opacity ,RCS2,RCS2,RCS2);

        yield;

    }
    Obj_Delete(obj);
    DeleteGraphic(s2title);
}

function RCS2{return rand(200,255);}

	let i=0;
	let s2speed=1;
	let s2bgscroll=0;
	let s2bgspin=0;
	let s2bgspinspeed=0;

	let s2vertangle=20;
	let s2cameraoffset=0;
	let s2bgconst=0;
	let s2bgcameraspeed=0;

function S2BGLogic{
	s2bgscroll+=s2speed;
	s2bgconst++;
	s2cameraoffset+=s2bgcameraspeed;
	s2bgspin+=s2bgspinspeed;

	i=0;
	loop(10){
		s2flyx[i]=s2flyx[i]+(((i+3)%5)/2+1)/4;
		s2flyy[i]=s2flyy[i]+(i%5)/6+0.2;
		s2flyz[i]=s2flyz[i]+(((i+6)%5)/2+1)/4;
		i++;
	}

	i=0;
	loop(8){
		if(((s2bgscroll+s2crackp[i])%500)<=2){
			s2cracka[i]=(GetPlayerX*5+GetPlayerY*5)%80-40;
			s2crackp[i]=s2crackp[i]+GetPlayerX+GetPlayerY;
		}
		i++;
	}
}

let overlays2a=0;

let s2flyx=[S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP];
let s2flyy=[S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP];
let s2flyz=[S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP,S2RFP];

function S2RFP{return rand(0,360);}

let s2bgwhite=0;

let s2rockangle=[];
let s2rockz=[];
let s2rockx=[];
let s2rocktype=[];
let s2rocksize=[];
let s2rocky=[];

let s2cracka=[S2RC,S2RC,S2RC,S2RC,S2RC,S2RC,S2RC,S2RC];
let s2crackp=[S2RP,S2RP,S2RP,S2RP,S2RP,S2RP,S2RP,S2RP];

function S2RC{return rand(-40,40);}
function S2RP{return rand(0,500);}

let s2fogswitch=0;
let s2bgtunnelsin=[];
let s2bgtunnelcos=[];

function S2BG{
	SetViewTo(sin(s2cameraoffset)*6+ScreenShakeX/2,50,sin(s2cameraoffset*1.2)*6+ScreenShakeY/2);
	SetViewFrom(1+s2vertangle/4,s2bgspin+90,-90+s2vertangle);

	SetTexture(stgwhite);
	SetGraphicScale(1,1);
	SetGraphicAngle(0,0,0);
	SetGraphicRect(0,0,400,500);
	SetAlpha(255);
	SetColor(10+245*s2bgwhite,5+250*s2bgwhite,255*s2bgwhite);
	DrawGraphic(GetCenterX,GetCenterY);	//sky

	if(s2fogswitch==1){
		SetFog(0,200, 10+245*s2bgwhite,5+250*s2bgwhite,255*s2bgwhite);
	}
	WriteZBuffer(true);
	UseZBuffer(true);

	SetRenderState(ALPHA);

	SetTexture(s2bg1);
	SetColor(100,100,100);
	SetGraphicScale(0.08,0.1);

	if(length(s2bgtunnelsin)>0){
		i=0;
		let k=0;
		loop(12){
			SetGraphicRect(0+i*105,0,105+i*105,504);
			SetGraphicAngle(0,i*(360/12),0);
			k=0;
			loop(6){
				DrawGraphic3D(s2bgtunnelsin[i],40+k*50.4-((s2bgscroll)%50.4),s2bgtunnelcos[i]);
				k++;
			}
			i++;
		}
	}

	SetTexture(s2bg3);

	if(length(s2rockx)>0){
		k=0;
		loop(30/Detail(1,2,6)){
			DrawRock(s2rockx[k],s2rockz[k],s2rockangle[k],14,s2rocky[k],s2rocksize[k]/10,s2rocktype[k]);
			k+=Detail(1,2,6);
		}
	}

	WriteZBuffer(false);
	UseZBuffer(false);
	if(s2fogswitch==1){
		SetFog(0,1500,0,0,0);
	}else{
		SetTexture(s2bg6);
		SetGraphicRect(0,0,64,64);
		SetColor(10+245*s2bgwhite,5+250*s2bgwhite,255*s2bgwhite);
		SetGraphicAngle(90,0,0);
		SetGraphicScale(1,1);
		DrawGraphic3D(0,200,0);
	}

	SetTexture(s2bg4);
	k=0;
	loop(8){
		DrawCrack(s2cracka[k],s2crackp[k]);
		k++;
	}


	SetTexture(s2bg2);
	SetGraphicRect(0,0,64,64);
	SetGraphicScale(0.03,0.03);
	SetGraphicAngle(90-s2vertangle,0,s2bgconst*2);

	SetRenderState(ADD);

	i=0;
	loop(10){
		SetColor(sin(s2bgconst*2+i*36)*50+50,   sin(s2bgconst*2+i*36)*50+50,   sin(s2bgconst*2+i*36)*50+50);
		DrawGraphic3D(sin(s2flyx[i])*8,140+sin(s2flyy[i])*50-s2vertangle,sin(s2flyz[i])*8);
		i++;
	}

	SetRenderState(ALPHA);
}
function DrawCrack(angle,y){
	let s2dist=lower( ((s2bgscroll+y)%500)*3,255 );
	if(s2dist/3<=200){
		let x=sin(angle)*15;
		let z=cos(angle)*15;

		SetRenderState(ADD);

		SetGraphicRect(0,0,32,127);
		s2dist=center(0,     ((s2bgscroll+y)%500)-300     ,255 )/2;
		if( ((s2bgscroll+y)%500) >450){
			s2dist=(500-((s2bgscroll+y)%500))*(80/50);
		}
		SetColor(s2dist,s2dist,s2dist);

		let k=-1;
		loop(3){
			SetGraphicScale(0.05,0.2-absolute(k)*0.01);
			SetGraphicAngle(90,(angle/2)+k*4,180);
			DrawGraphic3D(x,500-((s2bgscroll+y)%500),z);
			k++;
		}
	}
}

function DrawRock(x,z,angle,offset,y,size,graphic){
	x*=offset;
	z*=offset;

	let graphx=(graphic%4)*64;
	let graphy=trunc(graphic/4)*64;

	SetGraphicScale(0.1*size,0.1*size);
	SetGraphicAngle(-60,angle,0);
	SetGraphicRect(graphx,graphy,graphx+64,graphy+64);
	DrawGraphic3D(x,200-((s2bgscroll+y)%200),z);
//	DrawGraphic3D(x,y-((s2bgscroll)%200),z);
//	DrawGraphic3D(x,y-((s2bgscroll)%200)+200,z);
}

function S2BlowUpBG{
	let frame=1;
	let k=0;
	let speed;
	loop(200){
		s2bgwhite=frame/200;
		frame++;
		if(frame%10==0&&frame<=170&&frame>40){
			//S2BlowUpBGLightRay;
			k=rand(0,360);
			speed=rand(-2,2);
			loop(3){
				LightRays(GetCenterX,GetCenterY,[0,0,k],speed,4,50,50,0,[20,20,20],1, 1);
				k+=120;
			}
		}
		if(frame==50){S2BlowUpBG2;}
		yield;
	}
	Wait(10);
}
task S2BlowUpBG2{

    let obj = Obj_Create(OBJ_EFFECT);

    Obj_SetPosition   (obj, GetCenterX,GetCenterY);
    Obj_SetSpeed      (obj, 0);
    Obj_SetAngle(obj, 0);
    ObjEffect_SetTexture(obj,stgwhite);
    ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLEFAN);
    ObjEffect_SetScale(obj,1,1);
    ObjEffect_SetAngle(obj,0,0,0);
    ObjEffect_SetLayer(obj,7);
    ObjEffect_CreateVertex(obj,4);
    ObjEffect_SetRenderState(obj,ADD);

    ObjEffect_SetVertexXY(obj,0,-300,-300);
    ObjEffect_SetVertexXY(obj,1,-300,300);
    ObjEffect_SetVertexXY(obj,2,300,300);
    ObjEffect_SetVertexXY(obj,3,300,-300);
    ObjEffect_SetVertexUV(obj,0,-300,-300);
    ObjEffect_SetVertexUV(obj,1,-300,300);
    ObjEffect_SetVertexUV(obj,2,300,300);
    ObjEffect_SetVertexUV(obj,3,300,-300);

    let frame=0;
    loop(149){
	frame++;
	ObjEffect_SetColor(obj,4,frame*(255/149),255,255,255);
	yield;
    }
    ObjEffect_SetColor(obj,4,255,255,255,255);
    yield;
    ObjEffect_SetRenderState(obj,ALPHA);
    Wait(60);
    ObjEffect_SetRenderState(obj,ADD);

    s2fogswitch=0;
    s2bgwhite=0;
    s2speed=0.5;
    s2bgcameraspeed=1;
    s2bgspinspeed=0;
    s2bgspin=0;

    frame=0;
    loop(400){
	ObjEffect_SetColor(obj,4,(400-frame)*(255/400),255,255,255);
	frame++;
	yield;
    }

    Obj_Delete(obj);
}
