//****************************************************************************************************
// 	Main menu title
//	Author: Helepolis
//	Version: 2.0
// 	Library:
// 		titleScreenHandler				- 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.
//		menuItem						- Makes a menu item to spawn using the sprite sheet mainly
//
//****************************************************************************************************

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

task titleScreenHandler { 
	// Reset values
	SetAreaCommonData("game", "menuFlow", 0);
	SetAreaCommonData("game", "stageNum", 1);
		
	// menu enum
	let ITEM_START = 0;				// Start story mode
	let ITEM_EXTRA = 1;				// Extra mode
	let ITEM_SANPO = 2;				// Leisure mode
	let ITEM_PRACTISESTG = 3;		// Stage Practise
	let ITEM_PRACTISESPL = 4;		// Spell Practise
	let ITEM_REPLAY = 5;			// Replay	
	let ITEM_OPTIONS = 6;			// Options
	let ITEM_EXIT = 7;				// Exit game

	let menuSelect = 0;				// choice change tracker

	let flashScreen = drawTexture2(GetScreenWidth/2,GetScreenHeight/2,minitex,BLEND_ALPHA,255,0,0,640,480);
	
	// Draw
	let titScreen = drawTitleScreen;
	let pSelLay = drawPlayerScreen2(GetScreenWidth/2,32,imgPSelLay); 
	let dimposX = 256;
	let pLogoBg = drawTexture(GetScreenWidth/2,400,minitex,BLEND_SUBTRACT,96,0,0,640,64,1);
	let titLogo = drawTexture(GetScreenWidth/2,64,imgTitLogo,BLEND_ALPHA,255,0,0,1024,128,0.768);
	
	let menStart = menuItem(GetScreenWidth/2,400,1,255,dimposX,0,dimposX+256,32);	// 180,160
	let menStartGlow = menuItemGlow(GetScreenWidth/2,400,1,255,dimposX,0,dimposX+256,32);
	
	let menExtra = menuItem(GetScreenWidth/2,400,1,0,dimposX,32,dimposX+256,64);
	let menExtraGlow = menuItemGlow(GetScreenWidth/2,400,1,255,dimposX,32,dimposX+256,64);
	
	let menSanpo = menuItem(GetScreenWidth/2,400,1,0,dimposX,64,dimposX+256,96);
	let menSanpoGlow = menuItemGlow(GetScreenWidth/2,400,1,255,dimposX,64,dimposX+256,96);
	
	let menPStage = menuItem(GetScreenWidth/2,400,1,0,dimposX,96,dimposX+256,128);
	let menPStageGlow = menuItemGlow(GetScreenWidth/2,400,1,255,dimposX,96,dimposX+256,128);
	
	let menPSpell = menuItem(GetScreenWidth/2,400,1,0,dimposX,128,dimposX+256,160);
	let menPSpellGlow = menuItemGlow(GetScreenWidth/2,400,1,255,dimposX,128,dimposX+256,160);
	
	let menReplay = menuItem(GetScreenWidth/2,400,1,0,dimposX,160,dimposX+256,192);
	let menReplayGlow = menuItemGlow(GetScreenWidth/2,400,1,255,dimposX,160,dimposX+256,192);
	
	let menOptions = menuItem(GetScreenWidth/2,400,1,0,dimposX,192,dimposX+256,224);
	let menOptionsGlow = menuItemGlow(GetScreenWidth/2,400,1,255,dimposX,192,dimposX+256,224);
	
	let menExit = menuItem(GetScreenWidth/2,400,1,0,dimposX,224,dimposX+256,256);
	let menExitGlow = menuItemGlow(GetScreenWidth/2,400,1,0,dimposX,224,dimposX+256,256);
	
	let menItemsArr = [menStart,menExtra,menSanpo,menPStage,menPSpell,menReplay,menOptions,menExit];
	let menItemsGlow = [menStartGlow,menExtraGlow,menSanpoGlow,menPStageGlow,menPSpellGlow,menReplayGlow,menOptionsGlow,menExitGlow];
	
	// Version number display text. 
	let verNum = ObjText_Create;
	ObjText_SetText(verNum,menuSelect);
	ObjRender_SetPosition(verNum,572,462,0);	
	ObjText_SetFontType(verNum,"MeiryoKe_PGothic");
	ObjText_SetFontBorderType(verNum,BORDER_SHADOW);
	ObjText_SetFontBorderWidth(verNum,1);
	ObjText_SetFontBorderColor(verNum,0,0,0);	
	ObjText_SetFontSize(verNum,12);
	ObjText_SetText(verNum,"ver. 1.50");
	
	// Anim vars
	let layspin = 0;
	let flashdim = 254;
	
	loop(15) {
		ObjRender_SetAlpha(flashScreen,flashdim);
		flashdim -= 254 / 15;
		yield;
	}
	Obj_Delete(flashScreen);
	
	loop(5) { yield; }

	if(!ObjSound_IsPlaying(BGM_TITLE)) { PlayMusic(BGM_TITLE); }
	loop {
		// Anim
		ObjRender_SetAngleZ(pSelLay,layspin);
		layspin+=0.5;
		
		// change options
		if(GetVirtualKeyState(VK_UP) == KEY_PUSH) { 
			PlaySFX(SFX_MENPICK); 
			if(menuSelect > -1) { menuSelect--; }
			if(menuSelect == 1) { menuSelect = 0; }	    // temp disable
			if(menuSelect == 2) { menuSelect = 0; }	    // temp disable
			if(menuSelect == -1) { menuSelect = 7; } 	
		}
		if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH) { 
			PlaySFX(SFX_MENPICK);
			if(menuSelect < 8) { menuSelect++; }
			if(menuSelect == 1) { menuSelect = 3; } 	// temp disable
			if(menuSelect == 2) { menuSelect = 3; } 	// temp disable
			if(menuSelect == 8) { menuSelect = 0; } 
		}		

		// Animating the menu items
		ascent(i in 0..length(menItemsArr)) { 
			if(i == menuSelect) { 
				ObjSprite2D_SetSourceRect(menItemsArr[menuSelect],0,0+i*32,256,32+i*32); 
				ObjRender_SetAlpha(menItemsArr[menuSelect],255);	
						
			}
			else { 
				ObjSprite2D_SetSourceRect(menItemsArr[i],256,0+i*32,512,32+i*32);
				ObjRender_SetScaleXYZ(menItemsGlow[i],1,1,0);
				ObjRender_SetAlpha(menItemsGlow[i],0);			
				ObjRender_SetAlpha(menItemsArr[i],0);					
			}
		}
			
		if(GetVirtualKeyState(VK_OK) == KEY_PULL) {
			if(menuSelect == ITEM_EXTRA || menuSelect == ITEM_SANPO) { 
				// 
			}
			else {
				PlaySFX(SFX_OK00);
				makeMenuChoice(menuSelect);
				break;
			}
		}
		if(GetVirtualKeyState(VK_CANCEL) == KEY_PUSH) { PlaySFX(SFX_MENPICK); menuSelect = 7; } 
		yield;
	}
	Obj_Delete(verNum);
	Obj_Delete(titScreen); Obj_Delete(pLogoBg); Obj_Delete(pSelLay); Obj_Delete(titLogo);
	ascent(i in 0..length(menItemsArr)) { Obj_Delete(menItemsArr[i]); } 
	ascent(i in 0..length(menItemsGlow)) { Obj_Delete(menItemsGlow[i]); } 
}

task makeMenuChoice(c) {
	
	// menu enum
	let ITEM_START = 0;				// Start story mode
	let ITEM_EXTRA = 1;				// Extra mode
	let ITEM_SANPO = 2;				// Leisure mode
	let ITEM_PRACTISESTG = 3;		// Stage Practise
	let ITEM_PRACTISESPL = 4;		// Spell Practise
	let ITEM_REPLAY = 5;			// Replay	
	let ITEM_OPTIONS = 6;			// Options
	let ITEM_EXIT = 7;				// Exit game
	
	let path = "";
	
	alternative(c)
	case(ITEM_START) {
		SetAreaCommonData("game","menuFlow",0);
		path = "script/thdcs/menu/menu_difficulty.txt";	
	}
	case(ITEM_EXTRA) {
		titleScreenHandler;
		return;
	}
	case(ITEM_SANPO) {
		titleScreenHandler;
		return;
	}
	case(ITEM_PRACTISESTG) {
		SetAreaCommonData("game","menuFlow",3);
		path = "script/thdcs/menu/menu_difficulty.txt";		
	}
	case(ITEM_PRACTISESPL) {
		SetAreaCommonData("game","menuFlow",4);
		path = "script/thdcs/menu/menu_practisespell.txt";		
	}
	case(ITEM_REPLAY) {
		SetAreaCommonData("game","menuFlow",5);
		path = "script/thdcs/menu/menu_replayplay.txt";		
	}
	case(ITEM_OPTIONS) {
		path = "script/thdcs/menu/menu_options.txt";
	}
	case(ITEM_EXIT) {
		ClosePackage;
		break;
	}
	SaveCommonDataAreaA1("game");
	
	// get the path var and load and launch the script
	let id = LoadScript(path);
	StartScript(id);	

	// Halt this script while busy
	while(!IsCloseScript(id)){
		yield;
	}	
	
	let result = GetScriptResult(id);	
	if(result == "CANCEL") { titleScreenHandler; } 
}

function menuItemGlow(x,y,scale,alpha,left,top,right,bottom) { 
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	ObjPrim_SetTexture(obj,menuitems);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj,0);
	Obj_SetRenderPriorityI(obj,90);
	ObjRender_SetScaleXYZ(obj,scale,scale,0);
	ObjSprite2D_SetSourceRect(obj,left,top,right,bottom);
	ObjSprite2D_SetDestCenter(obj);	
	ObjRender_SetPosition(obj,x,y,0);
	makeGlowy(obj);
	return obj;
}

task makeGlowy(gObj) { 
	let scaler = 1;
	let gAlpha = 250;
	
	while(!Obj_IsDeleted(gObj)) { 
		ObjRender_SetScaleXYZ(gObj,1,scaler,0);
		ObjRender_SetAlpha(gObj,gAlpha);
		scaler+=0.06;
		gAlpha-=10;
		if(gAlpha == 0) { loop(30) { yield; } scaler = 1; gAlpha = 250; } 
		yield;
	}
}	
				

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

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

// Draws the title screen
function drawTitleScreen {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);

	ObjPrim_SetTexture(obj,imgTitleBg);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	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,125);
	Obj_SetRenderPriorityI(obj,20);
	ObjSprite2D_SetSourceRect(obj,0,0,1080,1080);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetPosition(obj,x,y,0);
	return obj;	
}

function drawTexture2(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,99);
	ObjSprite2D_SetSourceRect(obj,left,top,right,bottom);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetPosition(obj,x,y,0);
	
	return obj;	
}