let tutc1=[70,70,70,250,250,250];
let tutc2=[70,250,250,250,70,70];
let tutc3=[250,250,70,70,70,250];
let tuttext=["Basic","Intermediate","Advanced","Practice"];
let tutdescription=["Want to make sure you know what's going on? Check here.","Useful survival tips once you have the basics down.","Scoring tips and other small details.","Choose any character and practice with their shot type."];

function Tutorial{
	let uniquechoices=3;

	let numchoices=6;

	let wheelradius=100;
	CreateMenu(numchoices,1,1);
	InMenu=2;
	let ddu=0;
	let ctext=0;
	SetFontStyle(1,3,0,0,1,10);
	SetFontColorNew(100,100,100,170,170,170);
	let obj=[];
	let objlen=[];
	let obj2=[];
	let objlen2=[];
	let rotation=menuitem;
	loop(numchoices){
		obj=obj~[DrawTextNewObj(2,tuttext[ddu%uniquechoices],imgText,480,sin(WheelPos(ddu,rotation,numchoices))*wheelradius+300,0,5,5,8,0,205,1)];
		objlen=objlen~[length(tuttext[ddu%uniquechoices])];
		ddu++;
	}
	ddu=0;
	let inmenusave=0;
	ctext=1;
	let selectobj;
	let selectobj2;
	while(InMenu==2){
		if(ctext!=menuitem){
			ClearTextImmediately(3);
			yield;
			yield;
			yield;
			ClearTextImmediately(3);
			ctext=menuitem;
			SetFontColorNew(255,255,255,tutc1[ctext%uniquechoices],tutc2[ctext%uniquechoices],tutc3[ctext%uniquechoices]);
			SetFontStyle(0,0,0,0,0,0);
			selectobj=DrawTextNewObj(3,tuttext[ctext%uniquechoices],imgText,480,sin(WheelPos(menuitem,rotation,numchoices))*wheelradius+300,0,5,5,8,0,255,0);
			menumove=1;
			DrawDescription(tutdescription[ctext%uniquechoices]);
		}


		ddu=0;
		loop(numchoices){
			Obj_SetPosition(obj[ddu],480,sin(WheelPos(ddu,rotation,numchoices))*wheelradius+300 );
			Obj_SetColor(obj[ddu],objlen[ddu%uniquechoices]*6,upper(0,cos(WheelPos(ddu,rotation,numchoices))*200),255,255,255);

			ddu++;
		}

		Obj_SetPosition(selectobj,480,sin(WheelPos(menuitem,rotation,numchoices))*wheelradius+300 );

		if(rand_int(0,2)==0){
			Sparkle(480+rand(-objlen[menuitem]*8,objlen[menuitem]*8),sin(WheelPos(menuitem,rotation,numchoices))*wheelradius+300+rand(-12,12),  0.2,rand(0,360),0.5,60,80);
		}
		if(absolute((menuitem+numchoices)-rotation)<absolute(menuitem-rotation)){
			rotation+=((menuitem+numchoices)-rotation)/numchoices;
		}else if(absolute((menuitem-numchoices)-rotation)<absolute(menuitem-rotation)){
			rotation+=((menuitem-numchoices)-rotation)/numchoices;
		}else{
			rotation+=((menuitem)-rotation)/numchoices;
		}
		while(rotation>numchoices){rotation-=numchoices;}
		while(rotation<0){rotation+=numchoices;}
		yield;
	}
	if(menucancel==0){
		SSE("ok");
		SE("ok2");
	}
	yield;
	yield;
	ClearText(2);
	ClearText(3);
	menuitem%=uniquechoices;
	while(menuitem<0){
		menuitem+=uniquechoices;
	}
	SetPlayer(menuitem%3);
}

let imgMeteo=GPSD~"img\meteo.png";

task PlayTutorial(num){
	SetCommonData("FirstTimePlaying",false);
	SaveCommonData;
	CompileEnemyFromFile(GPSD~"enemy\00.txt");
	if(num<3){
		CompileEnemyFromFile(GPSD~"s0\meteo"~IntString(num)~".txt");
	}
	InfiniteLives;
	stage=0;
	FadeWhite(255,0,120);
	ClearByteCodeCash;
	TutorialInit;

//	SetCommonData("Loading",1);
//	loop(60){yield;}
//	DeleteCommonData("Loading");
	ForbidShot2(false);
	ForbidBomb(true);
	Music(7);
	if(num==0){	//basic
		SetCommonData("AWCPlayerNum",0);
		let sel=1;
		Wait(120);
		let trynum=0;
		TutDialogue(0,0,false);
		while(EventActive){yield;}
		Wait(20);
		SetMeteoAttack(0);
		CreateTutorialBoss(GetCenterX,GetCenterY,0);

		let attackno=1;

		Wait(220);
		TutDialogue(1,0,true);

		while(attackno<4){
			while(sel==1){
				WaitForZeroEnemyTut;
				Wait(50);
				TutDialogue(attackno+0.5,trynum,true);
				while(EventActive){yield;}
				sel=GetDialogueSelection;
				trynum=1;
			}
			sel=1;
			trynum=0;
			SetMeteoAttack(attackno);
			attackno++;
			Wait(80);
		}
	}
	else if(num==1){	//intermediate
		SetCommonData("AWCPlayerNum",1);
		let sel=1;
		Wait(120);
		let trynum=0;
		TutDialogue(5,0,false);
		while(EventActive){yield;}
		Wait(20);
		SetMeteoAttack(5);
		CreateTutorialBoss(GetCenterX,GetCenterY,1);

		let attackno=6;

		Wait(180);
		TutDialogue(6,0,true);

		while(attackno<9){
			while(sel==1){
				WaitForZeroEnemyTut;
				Wait(50);
				TutDialogue(attackno+0.5,trynum,true);
				while(EventActive){yield;}
				sel=GetDialogueSelection;
				trynum=1;
			}
			sel=1;
			trynum=0;
			SetMeteoAttack(attackno);
			attackno++;
			Wait(80);
		}
	}
	else if(num==2){	//advanced
		SetCommonData("AWCPlayerNum",2);
		let sel=1;
		Wait(120);
		let trynum=0;
		TutDialogue(10,0,false);
		while(EventActive){yield;}
		Wait(20);
		SetMeteoAttack(10);
		CreateTutorialBoss(GetCenterX,GetCenterY,2);

		let attackno=11;

		Wait(160);
		TutDialogue(11,0,true);

		while(attackno<14){
			while(sel==1){
				WaitForZeroEnemyTut;
				Wait(50);
				TutDialogue(attackno+0.5,trynum,true);
				while(EventActive){yield;}
				sel=GetDialogueSelection;
				trynum=1;
			}
			sel=1;
			trynum=0;
			SetMeteoAttack(attackno);
			attackno++;
			Wait(80);
		}
	}
	else if(num==3){	//practice
		SetFontStyle(0,0,0,0,0,0);
		SetFontColorNew(255,255,255,255,0,0);
		DrawTextNew(1050,"PRACTICE MODE",imgText,GetCenterX,10,0,3,3,8,0,255,0);
		DrawTextNew(1050,"Bomb key (X): switch characters",imgText,GetCenterX,35,0,3,3,8,0,255,0);
		DrawTextNew(1050,"Skip key (Ctrl): Exit",imgText,GetCenterX,50,0,3,3,8,0,255,0);
		let playernum=0;
		SetPlayer(0);
		while(GetKeyState(VK_SKIP)!=KEY_PUSH){
			if(GetKeyState(VK_BOMB)==KEY_PUSH){
				Overlay(2,60,60,255,8,ADD,255,255,255);
				yield;
				playernum++;
				SetPlayer(playernum%3);
				loop(60){yield;}
			}
			yield;
		}
	}
	EndTutorial;
}
function EndTutorial{
	DeleteCommonData("EndTutorial");
	SaveCommonData;
	if(GetDialogueSelection==0){
		SetCommonData("Stagenum",-1);
		SetCommonData("Tutorialnum",GetCommonData("Tutorialnum")+1);
		SetPlayer(GetPlayer+1);
		SaveCommonData;Retry;
	}else{Retry;}
}
task InfiniteLives{
	loop{
		ExtendPlayer(110-GetPlayerLife);
		yield;
	}
}
task CreateTutorialBoss(x,y,num){
	let appeartime=[240,200,180][num];
	SetLifeBar(-1,-1,0);
	DrawName("Meteo",255,255,255,170,0,170);
	loop{
		CreateEnemyFromFile(GPSD~"s0\meteo"~IntString(num)~".txt", x,y,0,0,appeartime);
		appeartime=60;
		while(GetEnemyNum!=0){
			yield;
		}
		CollectAllItems(10);
		Wait(70);
		SetCommonData("NextLifeBar",true);
	}
}
function SetMeteoAttack(num){
	SetCommonData("MeteoAttack",num);
}
function WaitForZeroEnemyTut{
	let x=0;
	let y=0;
	while(GetEnemyNum!=0){
		if(GetCommonDataDefault("EndTutorial",false)){
			EndTutorial;
		}
		yield;
	}
	x=GetCommonDataDefault("EnemyX2",-1000);
	y=GetCommonDataDefault("EnemyY2",-1000);
	PlaySE(".\seGetSpellCardBonus.wav");
	NewCharge_XY(x,y,80,20,2,200,100,200);
	NewCharge_XY(x,y,80,15,3,200,200,200);
	ClearBullets(70,120);
}

let imgTutBG1=GPSD~"img\phantom1.png";
let imgTutBG2=GPSD~"img\phantom3.png";
let imgTutBG3=GPSD~"img\phantom2.png";
let imgTutBG4=GPSD~"img\gradient.png";
let imgTutBG5=GPSD~"img\default2.png";

sub TutorialInit{
	LoadGraphic(imgTutBG1);
	LoadGraphic(imgTutBG2);
	LoadGraphic(imgTutBG3);
	LoadGraphic(imgTutBG4);
	LoadGraphic(imgTutBG5);
	LoadGraphic(imgMeteo);
	CreateRenderTarget("phantomground",512,512);
	CreateRenderTarget("spirits1",512,512);
	CreateRenderTarget("spirits2",512,512);
	ClearRenderTarget("spirits1");
	ClearRenderTarget("spirits2");
	SetStagePanSpeed(0.02);
	si=0;
	spirits1=[];
	spirits2=[];
	spirits3=[];
	spirits4=[];
	loop(13){
		spirits1=spirits1~[rand(0.5,2)*RandDir];
		spirits2=spirits2~[rand(0.5,2)*RandDir];
		spirits3=spirits3~[rand(0.5,2)*RandDir];
		spirits4=spirits4~[rand(0.2,0.5)];
	}
	fixedscroll=1000;
}

let flickerx=[0,0,0];
let flickera=[0,0,0];

let spirits1=[];
let spirits2=[];
let spirits3=[];
let spirits4=[];

sub TutorialBGLogic{
//	if(GetKeyState(VK_LEFT)!=KEY_FREE){
//		adjpar--;
//	}
//	if(GetKeyState(VK_RIGHT)!=KEY_FREE){
//		adjpar++;
//	}
//	if(GetKeyState(VK_UP)!=KEY_FREE){
//		adjpar2--;
//	}
//	if(GetKeyState(VK_DOWN)!=KEY_FREE){
//		adjpar2++;
//	}

	SetRenderTarget("phantomground");
	SetTexture(imgTutBG1);
	SetRenderState(ALPHA);
	SetGraphicScale(1,1);
	SetGraphicAngle(0,0,0);
	SetAlpha(255);
	SetColor(255,255,255);
	SetGraphicRect(0,0-fixedscroll,512,512-fixedscroll);
	DrawGraphic(256,256);

	SetAlpha(100);
	SetGraphicRect(0+fixedscroll,0-fixedscroll*2,512+fixedscroll,512-fixedscroll*2);
	DrawGraphic(256,256);

	SetAlpha(100);
	SetGraphicAngle(0,0,90);
	SetGraphicRect(0-fixedscroll*0.5,0,512-fixedscroll*0.5,512);
	DrawGraphic(256,256);

	SetTexture(stgwhite);
	SetAlpha(255);
	SetRenderState(ADD);
	SetColor(0,0,0);
	SetGraphicAngle(0,0,0);
	DrawGraphic(256,256);
	SetRenderState(ALPHA);
	if(fixedscroll%2==0){
		flickerx[(fixedscroll/2)%3]=rand_int(GetClipMinX,GetClipMaxX);
		flickera[(fixedscroll/2)%3]=rand(0,250);
	}

	SetRenderTarget("spirits2");
	ClearRenderTarget("spirits2");
	SetTexture("spirits1");
	SetGraphicRect(0,0,512,512);
	SetGraphicAngle(0,0,0);
//	si=sin(fixedscroll*4.5)*15;
//	SetColor(240+si,240+si,240+si);
	SetColor(255,255,255);
	if(fixedscroll%6==0){
		SetColor(215,215,215);
	}

	SetGraphicScale(1,1);
	DrawGraphic(256,256);
//	SetGraphicScale(1.01,1.01);
	SetGraphicScale(1.01,1.01);
	DrawGraphic(256,256-fixedscroll%2);

	SetRenderTarget("spirits1");
	SetRenderState(ADD);
	ClearRenderTarget("spirits1");
	SetTexture("spirits2");
	SetGraphicRect(0,0,512,512);
	SetGraphicScale(1,1);
	SetGraphicAngle(0,0,0);
	SetColor(255,255,255);
	DrawGraphic(256,256);


	SetTexture(imgEffects);
	SetGraphicRect(129,65,191,127);
	SetColor(150,150,200);

	si=0;
	loop(length(spirits1)){
		SetGraphicScale(spirits4[si],spirits4[si]);
		DrawGraphic3D(cos(fixedscroll*spirits1[si])*200,150+sin(fixedscroll*spirits2[si])*120,sin(fixedscroll*spirits3[si])*200-200);
		si++;
	}

	SetRenderTarget("DEFAULT");
	SetRenderState(ALPHA);

}

sub TutorialBG{
	SetViewTo(0+ScreenShakeX,150+ScreenShakeY,400);
	SetViewFrom(1,90-GetPan*0.05,0);

	SetTexture(imgTutBG4);
	SetGraphicRect(0,1,1500,170);
	SetGraphicScale(1,6);
	SetGraphicAngle(0,0,0);
	SetColor(50,30,20);
	SetAlpha(255);
	DrawGraphic3D(0,300,-900);

	SetTexture(imgTutBG2);
	SetGraphicAngle(0,0,0);
	SetAlpha(255);

	SetColor(60,60,60);
	SetGraphicScale(0.5,0.5);
	SetGraphicRect(0+fixedscroll*4,0,3000+fixedscroll*4,2048);
	DrawGraphic3D(0,400,-900);
	SetColor(120,120,120);
	SetGraphicScale(1,1);
	SetGraphicRect(0+fixedscroll,sin(fixedscroll/4)*80,1500+fixedscroll,1024+sin(fixedscroll/4)*80);
	DrawGraphic3D(0,400,-900);

	SetTexture(imgTutBG3);
	SetGraphicScale(1,1);

	let radius=400;
	let radius2=430;
	let k=0;

	SetColor(255,255,255);
	SetAlpha(255);
	WriteZBuffer(true);
	UseZBuffer(true);
	si=0;

	cam3=cos(fixedscroll/2.5);
	cam4=sin(fixedscroll/2.5);

	loop(21){
		cam2=cos(si*9);
		if(-cam3*cam2<0.05){
			cam1=sin(si*9);
//			SetAlpha(center(0,355-cam3*320*cam2,255));
			SetGraphicRect(0,si*128+fixedscroll*2,256,128+si*128+fixedscroll*2);
			SetGraphicAngle(si*9,fixedscroll/2.5,0);

			SetGraphicScale(0.25,0.5);
			DrawGraphic3D(-cam4*radius*cam2,cam1*radius,-cam3*radius*cam2);

			SetGraphicRect(0,si*128+fixedscroll*2,256,128+si*128+fixedscroll*2);
			SetGraphicScale(0.25,-0.528);
			DrawGraphic3D(-cam4*radius2*cam2,cam1*radius2,-cam3*radius2*cam2);
		}
		si++;
	}

	WriteZBuffer(false);
	UseZBuffer(false);

	SetGraphicAngle(90,0,0);
	SetTexture("phantomground");
	SetGraphicScale(850/512,1);
	SetAlpha(255);

	si=0;
	SetColor(255,255,255);
	loop(5){
//		SetColor((si+1)*42,(si+1)*42,(si+1)*42);
		SetAlpha((si+1)*42);

		SetGraphicRect(-10,-264+si*50,522,-212+si*50);
		DrawGraphic3D(0,0,-450+si*50);
		si++;
	}
	SetAlpha(255);
	SetGraphicRect(0,-14,512,514);
	DrawGraphic3D(0,0,40);


	SetTexture("spirits1");
	SetGraphicRect(0,0,512,512);
	SetColor(100,100,100);
	SetRenderState(ADD);
	SetGraphicAngle(0,0,0);
	SetGraphicScale(1,1);
	DrawGraphic(GetCenterX,GetCenterY);
	SetGraphicScale(-3,-3);
	SetColor(80,80,80);
	DrawGraphic(GetCenterX+cos(fixedscroll*1.2)*100,GetCenterY+sin(fixedscroll*1.2)*100);


	SetTexture("phantomground");
	SetGraphicScale(1,1);
	SetGraphicAngle(0,0,0);
	SetRenderState(SUBTRACT);
	SetGraphicRect(0,0,2,450);
	si=0;
	loop(3){
		SetColor(flickera[si],flickera[si],flickera[si]);
		DrawGraphic(flickerx[si],GetCenterY);
		si++;
	}
	SetRenderState(ALPHA);
}