//****************************************************************************************************
// 	Difficulty selection menu
//	Author: Helepolis
//	Version: 1.0
// 	Library:
//		menuDifficultyHandler			- 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.
// 		drawPlayerScreen				- Draws the background for the scene.
// 		drawTexture						- Function to summon a sprite. Returns obj.
//
//****************************************************************************************************

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

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

@MainLoop { yield; }
@Finalize { } 

// Difficulty handler menu
task menuDifficultyHandler { 
	// Draw
	let pSelScreen = drawPlayerScreen(imgPSelBg,BLEND_ALPHA); 
	let pSelScreen2 = drawPlayerScreen(imgPSelBg,BLEND_ADD_ARGB); 
	
	let selectBar = drawTexture(GetScreenWidth/2,80,minitex,BLEND_ADD_ARGB,40,0,0,640,64);
	
	let topLogoBg = drawTexture(128,32,menulogos,BLEND_ALPHA,155,0,0,512,128);
	let topLogo = drawTexture(128,64,menulogos,BLEND_ALPHA,255,0,128,512,256);
	
	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
	let rgb = 254; let colf = 0; 
	let rgb2 = 254;	let rgbf = 0;
	ObjRender_SetColor(selectBar,64,64,255); 

	// menu enum
	let RANK_NORMAL = 0;
	let RANK_HARD = 1;
	let RANK_LUNATIC = 2;
	let menuSelect = GetAreaCommonData("game","difficulty",0);				// choice change tracker
	ObjRender_SetY(selectBar,ObjRender_GetY(menItemsArr[menuSelect])); 

	loop(5) { yield; }

	loop {
		// anim
		ObjRender_SetColor(pSelScreen2,rgb2,rgb2,rgb2);
		rgb2 -= sin(rgbf)*8;
		rgbf+=5;

		// change options
		if(GetVirtualKeyState(VK_UP) == KEY_PUSH) { 
			if(menuSelect > 0) { menuSelect--; PlaySFX(SFX_MENPICK); } 
		}
		if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH) {
			if(menuSelect < 2) { menuSelect++; PlaySFX(SFX_MENPICK); } 
		}		

		// Animating the menu items
		ascent(i in 0..length(menItemsArr)) { 
			if(i == menuSelect) { 
				ObjRender_SetAlpha(menItemsArr[menuSelect],250);
				if(ObjRender_GetY(selectBar) < ObjRender_GetY(menItemsArr[menuSelect])) { ObjRender_SetY(selectBar,ObjRender_GetY(selectBar)+20); }
				if(ObjRender_GetY(selectBar) > ObjRender_GetY(menItemsArr[menuSelect])) { ObjRender_SetY(selectBar,ObjRender_GetY(selectBar)-20); }
				
				ObjRender_SetColor(menItemsArr[menuSelect],rgb,255,255);
				rgb -= sin(colf)*6;
				colf+=5;			
			}
			else { 
				ObjRender_SetAlpha(menItemsArr[i],85);
			}
		}
		
		// confirming choice
		if(GetVirtualKeyState(VK_OK) == KEY_PULL) {
			PlaySFX(SFX_OK00);
			menSelectAnim(menItemsArr[menuSelect]);
			makeMenuChoice(menuSelect);
			break;
		}
		if(GetVirtualKeyState(VK_CANCEL) == KEY_PULL) { 
			PlaySFX(SFX_MENCANCEL);	
			SetScriptResult("CANCEL"); 
			CloseScript(GetOwnScriptID);
		} 
		yield;
	}
	ascent(i in 0..length(menItemsArr)) { Obj_Delete(menItemsArr[i]); } 
	Obj_Delete(pSelScreen); Obj_Delete(pSelScreen2);
	Obj_Delete(selectBar); Obj_Delete(topLogoBg); Obj_Delete(topLogo);
}

task makeMenuChoice(c) {
	// menu enum
	let RANK_NORMAL = 0;
	let RANK_HARD = 1;
	let RANK_LUNATIC = 2;

	alternative(c)
	case(RANK_NORMAL) { SetAreaCommonData("game","difficulty",0); }
	case(RANK_HARD) { SetAreaCommonData("game","difficulty",1); }
	case(RANK_LUNATIC) { SetAreaCommonData("game","difficulty",2); }
	
	// get the path var and load and launch the script
	let path = "script/thdcs/menu/menu_playerselect.txt";
	let id = LoadScript(path);
	StartScript(id);	
	
	// Halt this script while busy
	while(!IsCloseScript(id)) {
		yield;
	}	

	let result = GetScriptResult(id);	
	if(result == "CANCEL") { menuDifficultyHandler; } 
	if(result == "ENDSTORY") { SetScriptResult("ENDSTORY"); CloseScript(GetOwnScriptID); } 	
}

// Confirm animation
function menSelectAnim(obj) { 
	loop(6) {	
		ObjRender_SetColor(obj,64,64,64);
		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,205);
	Obj_SetRenderPriorityI(obj,20);
	ObjSprite2D_SetSourceRect(obj,0,0,640,480);
	ObjSprite2D_SetDestRect(obj,0,0,640,480);
	
	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;	
}