//****************************************************************************************************
// 	Stage practise 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.
//
//****************************************************************************************************

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

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

@MainLoop { yield; }
@Finalize { } 

task menuStgSelectHandler {
	// Draw
	let playerSelectScreen = drawPlayerScreen(imgPSelBg, BLEND_ALPHA);
	let topLogoBg = drawTexture2(128, 32, menulogos, BLEND_ALPHA, 155, 0, 0, 512, 128);
	let topLogo = drawTexture2(128, 64, menulogos, BLEND_ALPHA, 255, 0, 384, 512, 512);
	let selectBar = drawTexture(GetScreenWidth/2, 80, minitex, BLEND_ADD_ARGB, 40, 0, 0, 1280, 128);
	let itemStg1;
	let itemStg2;
	let itemStg3;

	// Check whether the player is allowed to practise any of the given stages and set texture based on that.
	if(GetAreaCommonData("core", "practiseStg1", false)) {
	    itemStg1 = drawTexture(GetScreenWidth/2,80,stglogo1,BLEND_ALPHA,85,0,0,512,256);
    } else {
        itemStg1 = drawTexture(GetScreenWidth/2,80,stglogo0,BLEND_ALPHA,85,0,0,512,256);
    }

	if(GetAreaCommonData("core", "practiseStg2", false)) {
	    itemStg2 = drawTexture(GetScreenWidth/2,240,stglogo2,BLEND_ALPHA,85,0,0,512,256);
    } else {
        itemStg2 = drawTexture(GetScreenWidth/2,240,stglogo0,BLEND_ALPHA,85,0,0,512,256);
    }

	if(GetAreaCommonData("core", "practiseStg3", false)) {
	    itemStg3 = drawTexture(GetScreenWidth/2,400,stglogo3,BLEND_ALPHA,85,0,0,512,256);
    } else {
        itemStg3 = drawTexture(GetScreenWidth/2,400,stglogo0,BLEND_ALPHA,85,0,0,512,256);
    }

	let menItemsArr = [itemStg1,itemStg2,itemStg3];

	// menu enum
	let STG_BAL	= 0;
	let STG_AFRO = 1;
	let STG_DJ = 2;
	let menuSelect = 0;				// choice change tracker

	// Anim vars
	let rgb = 254;
	let colourFrame = 0;
	ObjRender_SetColor(selectBar, 255, 128, 64);

	while(GetVirtualKeyState(VK_OK) != KEY_FREE) { yield; }
	if(!ObjSound_IsPlaying(BGM_TITLE)) { PlayMusic(BGM_TITLE); }
	loop {
		// change options
		if(GetVirtualKeyState(VK_UP) == KEY_PUSH) {
			PlaySFX(SFX_MENPICK);
			if(menuSelect > -1) { menuSelect--; }
			if(menuSelect == -1) { menuSelect = 2; }

		}
		if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH) {
			PlaySFX(SFX_MENPICK);
			if(menuSelect < 3) { menuSelect++; }
			if(menuSelect == 3) { menuSelect = 0; }
		}

		// 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, rgb, rgb);
				rgb -= sin(colourFrame) * 6;
				colourFrame += 5;
			}
			else { 
				ObjRender_SetAlpha(menItemsArr[i],85);
			}
		}
		
		// confirming choice
		if(GetVirtualKeyState(VK_OK) == KEY_PUSH) {
			if(menuSelect == 0 && GetAreaCommonData("core", "practiseStg1", false)) {
				PlaySFX(SFX_OK00);
				menSelectAnim(menItemsArr[menuSelect]);
				makeMenuChoice(menuSelect);
				break;
			}
			else if(menuSelect == 1 && GetAreaCommonData("core", "practiseStg2", false)) {
				PlaySFX(SFX_OK00);
				menSelectAnim(menItemsArr[menuSelect]);
				makeMenuChoice(menuSelect);
				break;
			}
			else if(menuSelect == 2 && GetAreaCommonData("core", "practiseStg3", false)) {
				PlaySFX(SFX_OK00);
				menSelectAnim(menItemsArr[menuSelect]);
				makeMenuChoice(menuSelect);
				break;
			}
			else { 
				PlaySFX(SFX_DAME);
				menSelectAnim(menItemsArr[menuSelect]);
			}	
		}
		if(GetVirtualKeyState(VK_CANCEL) == KEY_PULL) { 
			PlaySFX(SFX_MENCANCEL);	
			SetAreaCommonData("game", "stageNum", 1);
			SaveCommonDataAreaA1("game");
			SetScriptResult("CANCEL"); 
			CloseScript(GetOwnScriptID); 
		} 
		yield;
	}
	Obj_Delete(playerSelectScreen);
	Obj_Delete(selectBar);
	Obj_Delete(topLogoBg);
	Obj_Delete(topLogo);
	ascent(i in 0..length(menItemsArr)) { Obj_Delete(menItemsArr[i]); } 
}

task makeMenuChoice(c) {
	fadeTransitionScreen; fadeTransitionScreen;
	loop(60) { yield; } 
	
	// menu enum
	let STG_BAL	= 0;
	let STG_AFRO = 1;
	let STG_DJ = 2;

	alternative(c)
	case(STG_BAL) { SetAreaCommonData("game", "stageNum", 1);	 }
	case(STG_AFRO) { SetAreaCommonData("game", "stageNum", 2); }
	case(STG_DJ) { SetAreaCommonData("game", "stageNum", 3); }
	SaveCommonDataAreaA1("game");	

	// 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 == "ENDSTGPRACTISE") { menuStgSelectHandler; } 
}

// 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 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);
	ObjRender_SetScaleXYZ(obj, 0.640, 0.640, 0);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetPosition(obj, x, y, 0);
	
	return obj;	
}

// Draws a texture (flexible)
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, 20);
	ObjSprite2D_SetSourceRect(obj, left, top, right, bottom);
	ObjRender_SetScaleXYZ(obj, 1, 1, 0);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetPosition(obj, x, y, 0);
	
	return obj;	
}

// 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;	
}

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);
}