//****************************************************************************************************
// 	Player selection menu
//	Author: Helepolis
//	Version: 1.0
// 	Library:
// 		menuPlayerSelectHandler			- Main task flow
//		makeMenuChoice(c)				- Task to listen to the selected choice and process it. The main task is naturally ending when a selection is made.
//
//****************************************************************************************************

let isAnimating = true;

#include "script/thdcs/functions/function_loaddata.txt"
#include "script/thdcs/functions/const_sound.txt"

@Initialize {
	SetAutoDeleteObject(true);
	menuPlayerSelectHandler;
	SetScriptResult("dummy");
}

@MainLoop { yield; }
@Finalize { } 

// Difficulty handler menu
task menuPlayerSelectHandler { 
	// Draw
	let pSelScreen = drawPlayerScreen(imgPSelBg,BLEND_ALPHA); 
	let pSelScreen2 = drawPlayerScreen(imgPSelBg,BLEND_ADD_ARGB); 
	let pSelLay = drawPlayerScreen2(GetScreenWidth/2+160,GetScreenHeight/2,imgPSelLay); 
	
	let pSelParts = drawTexture(GetScreenWidth-144,220,imgPYukaris,BLEND_ALPHA,155,0,0,512,512);
	let pSelMains = drawTexture(GetScreenWidth-234,290,imgPReimus,BLEND_ALPHA,155,0,0,512,512);
	let pSelPart = drawTexture(GetScreenWidth-144,220,imgPYukari,BLEND_ALPHA,255,0,0,512,512);
	let pSelMain = drawTexture(GetScreenWidth-234,290,imgPReimu,BLEND_ALPHA,255,0,0,512,512);
	let pSelArray = [pSelParts,pSelMains,pSelPart,pSelMain];
	let pLogoBg = drawTexture(128,GetScreenHeight/2,minitex,BLEND_ADD_ARGB,45,0,0,160,640);
	
	let topLogoBg = drawTexture(128,32,menulogos,BLEND_ALPHA,155,0,0,512,128);
	let topLogo = drawTexture(128,64,menulogos,BLEND_ALPHA,255,0,256,512,384);	
	
	let pLogo = drawTexture(128,128,imgBorderLogo,BLEND_ADD_ARGB,255,0,0,128,128);
	let pInfo1 = drawTexture(-128,340,imgPInfo,BLEND_ALPHA,255,0,256,512,384);
	let pInfo2 = drawTexture(-128,420,imgPInfo,BLEND_ALPHA,255,0,384,512,512);
	 
	let itemNorm = drawTexture(GetScreenWidth/2,80,imgSelDiff,BLEND_ALPHA,85,256,0,512,256);
	let itemHard = drawTexture(GetScreenWidth/2,240,imgSelDiff,BLEND_ALPHA,85,0,256,256,512);
	let itemLuna = drawTexture(GetScreenWidth/2,400,imgSelDiff,BLEND_ALPHA,85,256,256,512,512);	 
	let menItemsArr = [itemNorm,itemHard,itemLuna];
	
	// Anim vars
	let infoFlip = 90; let infoFlip2 = 90;
	let infoX = -128; let infoX2 = -128;
	let layspin = 0;
	let rgb = 254;	let rgbf = 0;
	let alphaValue = 0;
	let r = 255; let g = 64; let b = 64; 
	ObjRender_SetColor(pLogoBg,r,g,b); 
	ascent(i in 0..length(pSelArray)) { ObjRender_SetAlpha(pSelArray[i],0); } 
	
	// Pre-anim to dim all difficulty, then make the one selected appear and hover bottom right corner.
	let getRank = GetAreaCommonData("game","difficulty",0);
	let rankScale = 1;
	ascent(i in 0..length(menItemsArr)) { ObjRender_SetAlpha(menItemsArr[i],0); } 
	ObjRender_SetAlpha(menItemsArr[getRank],255); 

	// menu enum
	let TEAM_BORDER = 0;
	let TEAM_MAGIC = 1;
	let menuSelect = GetAreaCommonData("game","team",0);				// choice change tracker
	
	animDelay;

	while(GetVirtualKeyState(VK_OK) != KEY_FREE) { yield; }
	if(!ObjSound_IsPlaying(BGM_TITLE)) { PlayMusic(BGM_TITLE); }

	loop {
		// Animation general
		ObjRender_SetAngleZ(pSelLay,layspin);
		ObjRender_SetColor(pSelScreen2,rgb,rgb,rgb);
		rgb -= sin(rgbf)*8;
		rgbf+=5;
		layspin+=0.05;
		ObjRender_SetColor(pLogoBg,r,g,b); 
		
		// Animation of player shadows.
		if(ObjRender_GetX(pSelParts) < GetScreenWidth-132) { 
			ObjRender_SetX(pSelParts,ObjRender_GetX(pSelParts)+0.5);  
			ObjRender_SetX(pSelMains,ObjRender_GetX(pSelMains)+0.5);  
		}
		
		// Animation of the difficulty ball
		if(getRank == 0) { 
			if(ObjRender_GetX(menItemsArr[getRank]) < 560) { 
				ObjRender_SetX(menItemsArr[getRank],ObjRender_GetX(menItemsArr[getRank])+10);  
				ObjRender_SetY(menItemsArr[getRank],ObjRender_GetY(menItemsArr[getRank])+15);  			
				ObjRender_SetScaleXYZ(menItemsArr[getRank],rankScale,rankScale,0);
				rankScale-=0.010;			
			}
		}
		if(getRank == 1) { 
			if(ObjRender_GetX(menItemsArr[getRank]) < 560) { 
				ObjRender_SetX(menItemsArr[getRank],ObjRender_GetX(menItemsArr[getRank])+10);  
				ObjRender_SetY(menItemsArr[getRank],ObjRender_GetY(menItemsArr[getRank])+8.2);  			
				ObjRender_SetScaleXYZ(menItemsArr[getRank],rankScale,rankScale,0);
				rankScale-=0.013;	
			}
		}
		if(getRank == 2) { 
			if(ObjRender_GetX(menItemsArr[getRank]) < 560) { 
				ObjRender_SetX(menItemsArr[getRank],ObjRender_GetX(menItemsArr[getRank])+10);  
				ObjRender_SetY(menItemsArr[getRank],ObjRender_GetY(menItemsArr[getRank])+1.5);  			
				ObjRender_SetScaleXYZ(menItemsArr[getRank],rankScale,rankScale,0);
				rankScale-=0.014;
			}
		}

		// change options
		if(GetVirtualKeyState(VK_UP) == KEY_PUSH) { 
			if(menuSelect > -1) { 
				menuSelect--;

				PlaySFX(SFX_MENPICK);

				// anim reset
				ObjRender_SetX(pSelMain,GetScreenWidth-224); ObjRender_SetX(pSelMains,GetScreenWidth-224); 
				ObjRender_SetX(pSelPart,GetScreenWidth-144); ObjRender_SetX(pSelParts,GetScreenWidth-144); 
				
				infoX = -128; 
				infoX2 = -128;
				infoFlip = 90;	
				alphaValue = 0;
			} 
			if(menuSelect == -1) { menuSelect = 1; }
		}
		if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH) { 
			if(menuSelect < 2) { 
				menuSelect++;

				PlaySFX(SFX_MENPICK);

				// anim reset
				ObjRender_SetX(pSelMain,GetScreenWidth-224); ObjRender_SetX(pSelMains,GetScreenWidth-224); 
				ObjRender_SetX(pSelPart,GetScreenWidth-144); ObjRender_SetX(pSelParts,GetScreenWidth-144); 

				infoX = -128; 
				infoX2 = -128;	
				infoFlip = 90;	
				alphaValue = 0;				
			} 
			if(menuSelect == 2) { menuSelect = 0; } 
		}

		alternative(menuSelect)
		case(TEAM_BORDER) {
			// set faces of team
			ObjPrim_SetTexture(pSelMain,imgPReimu); ObjPrim_SetTexture(pSelMains,imgPReimus); 	
			ObjPrim_SetTexture(pSelPart,imgPYukari); ObjPrim_SetTexture(pSelParts,imgPYukaris); 
			ObjPrim_SetTexture(pLogo,imgBorderLogo);
			ObjSprite2D_SetSourceRect(pInfo1,0,256,512,384);
			ObjSprite2D_SetSourceRect(pInfo2,0,384,512,512);
			r = 255; g = 64; b = 64;		

			if(infoFlip > 0) { infoFlip-=5; } 
			ObjRender_SetAngleY(pLogo,infoFlip);
			ObjRender_SetX(pInfo1,infoX);
			ObjRender_SetX(pInfo2,infoX);
			if(infoX < 256) { infoX += 32; }
			
			ascent(i in 0..length(pSelArray)) { ObjRender_SetAlpha(pSelArray[i],alphaValue); } 
			if(alphaValue < 250) { alphaValue+=20; } 
		}
		case(TEAM_MAGIC) {
			// set faces of team
			ObjPrim_SetTexture(pSelMain,imgPMarisa); ObjPrim_SetTexture(pSelMains,imgPMarisas);		
			ObjPrim_SetTexture(pSelPart,imgPArisu); ObjPrim_SetTexture(pSelParts,imgPArisus);	
			ObjPrim_SetTexture(pLogo,imgMagicLogo);
			ObjSprite2D_SetSourceRect(pInfo1,0,0,512,128);
			ObjSprite2D_SetSourceRect(pInfo2,0,128,512,256);			
			r = 64; g = 128; b = 255;	

			if(infoFlip > 0) { infoFlip-=5; } 
			ObjRender_SetAngleY(pLogo,infoFlip);
			ObjRender_SetX(pInfo1,infoX);
			ObjRender_SetX(pInfo2,infoX);
			if(infoX < 256) { infoX += 32; }	

			ascent(i in 0..length(pSelArray)) { ObjRender_SetAlpha(pSelArray[i],alphaValue); } 
			if(alphaValue < 250) { alphaValue+=20; } 
		}

		// confirming choice
		if(GetVirtualKeyState(VK_OK) == KEY_PULL) {
			if(!isAnimating) { 
				PlaySFX(SFX_OK00);

				ascent(i in 0..length(pSelArray)) { menSelectAnim2(pSelArray[i]); }

				menSelectAnim(pLogoBg,menuSelect);
				makeMenuChoice(menuSelect);

				break;
			}
		}
		if(GetVirtualKeyState(VK_CANCEL) == KEY_PULL) { 
			PlaySFX(SFX_MENCANCEL);

			SetScriptResult("CANCEL");

			CloseScript(GetOwnScriptID); 
		} 
		yield;
	}
	Obj_Delete(pSelScreen); Obj_Delete(pSelScreen2); Obj_Delete(pSelLay); Obj_Delete(topLogoBg); Obj_Delete(topLogo);
	Obj_Delete(pSelPart); Obj_Delete(pSelParts); Obj_Delete(pSelMain); Obj_Delete(pSelMains);
	Obj_Delete(pLogoBg); Obj_Delete(pLogo);
	Obj_Delete(pInfo1); Obj_Delete(pInfo2); 
	ascent(i in 0..length(menItemsArr)) { Obj_Delete(menItemsArr[i]); } 
}

task makeMenuChoice(c) {
	if(GetAreaCommonData("game","menuFlow",0) != 3) {
		fadeTransitionScreen; fadeTransitionScreen;
		loop(60) { yield; } 
	}
	
	// menu enum
	let TEAM_BORDER = 0;
	let TEAM_MAGIC = 1;

	alternative(c)
	case(TEAM_BORDER) {
		SetAreaCommonData("game","team",0);	
		SaveCommonDataAreaA1("game");		
	}
	case(TEAM_MAGIC) {
		SetAreaCommonData("game","team",1);	
		SaveCommonDataAreaA1("game");		
	}	
	
	// Retrieve which menu flow is being used 0 = Story, 3 = Stage practise.
	// Story mode, >> pack_stage.txt
	if(GetAreaCommonData("game","menuFlow",0) == 0) { 	
		// get the path var and load and launch the script
		let path = "script/thdcs/menu/pack_stage.txt";	
		let id = LoadScript(path);
		StartScript(id);	
		
		// Halt this script while busy
		while(!IsCloseScript(id)) {
			yield;
		}		
		
		let result = GetScriptResult(id);	
		if(result == "CANCEL") { menuPlayerSelectHandler; } 			
		if(result == "ENDSTORY") { menuPlayerSelectHandler; } 	
	}
	// Practise Stage mode, >> menu_practise.txt first, then >> pack_stage.txt
	if(GetAreaCommonData("game","menuFlow",0) == 3) { 
		// get the path var and load and launch the script
		let path = "script/thdcs/menu/menu_practisestage.txt";	
		let id = LoadScript(path);
		StartScript(id);	
		
		// Halt this script while busy
		while(!IsCloseScript(id)) {
			yield;
		}	
		let result = GetScriptResult(id);	
		if(result == "CANCEL") { menuPlayerSelectHandler; } 	
		if(result == "ENDSTORY") { SetScriptResult("ENDSTORY"); CloseScript(GetOwnScriptID); } 
	}	
}

// Weird but effective small delay to avoid rushing through menu which might make the animation look awkward.
task animDelay {
	loop(15) { yield; }
	isAnimating = false;
}

// Confirm animation
function menSelectAnim(obj,end) { 
	loop(6) {	
		ObjRender_SetColor(obj,64,64,64);
		loop(2) { yield; }	
		if(end == 0) { ObjRender_SetColor(obj,255,64,64); }
		if(end == 1) { ObjRender_SetColor(obj,64,64,255); }
		loop(2) { yield; }
	}
	if(end == 0) { ObjRender_SetColor(obj,255,64,64); }
	if(end == 1) { ObjRender_SetColor(obj,64,64,255); }	
}

// Confirm animation 2
task menSelectAnim2(obj) { 
	loop(6) {	
		ObjRender_SetColor(obj,128,128,128); 
		loop(2) { yield; }	
		ObjRender_SetColor(obj,255,255,255);
		loop(2) { yield; }
	}
}


// Draws the title screen
function drawPlayerScreen(tex,btype) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);

	ObjPrim_SetTexture(obj,tex);
	ObjRender_SetBlendType(obj,btype);
	ObjRender_SetAlpha(obj,255);
	Obj_SetRenderPriorityI(obj,20);
	ObjSprite2D_SetSourceRect(obj,0,0,640,480);
	ObjSprite2D_SetDestRect(obj,0,0,640,480);
	
	return obj;	
}

// Draws the title screen
function drawPlayerScreen2(x,y,tex) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);

	ObjPrim_SetTexture(obj,tex);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj,155);
	Obj_SetRenderPriorityI(obj,20);
	ObjSprite2D_SetSourceRect(obj,0,0,1080,1080);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetPosition(obj,x,y,0);
	return obj;	
}

// Draws a texture (flexible)
function drawTexture(x,y,tex,btype,alphaValue,left,top,right,bottom) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);

	ObjPrim_SetTexture(obj,tex);
	ObjRender_SetBlendType(obj,btype);
	ObjRender_SetAlpha(obj,alphaValue);
	Obj_SetRenderPriorityI(obj,20);
	ObjSprite2D_SetSourceRect(obj,left,top,right,bottom);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetPosition(obj,x,y,0);
	
	return obj;	
}

// Draws the fade in/out wait screen between transitions. 
task fadeTransitionScreen {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let scrAlpha = 0;
	let scrScroll = 0;
	ObjPrim_SetTexture(obj,imgWaitScr);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	ObjRender_SetAlpha(obj,scrAlpha);
	Obj_SetRenderPriorityI(obj,100);
	ObjSprite2D_SetSourceRect(obj,0,0,1024,1024);
	ObjSprite2D_SetDestRect(obj,0,0,1024,1024);
	
	loop(15) { ObjSprite2D_SetSourceRect(obj,0+scrScroll,0+scrScroll,1024+scrScroll,1024+scrScroll); scrScroll--; ObjRender_SetAlpha(obj,scrAlpha); scrAlpha+=255/15; yield; }
	loop(90) { ObjSprite2D_SetSourceRect(obj,0+scrScroll,0+scrScroll,1024+scrScroll,1024+scrScroll); scrScroll--; yield; } 
	loop(15) { ObjSprite2D_SetSourceRect(obj,0+scrScroll,0+scrScroll,1024+scrScroll,1024+scrScroll); scrScroll--; ObjRender_SetAlpha(obj,scrAlpha); scrAlpha-=255/15; yield; }

	Obj_Delete(obj);
}