//****************************************************************************************************
// Options menu
//
// Library:
// 		menuOptionsHandler				- Main options handler.
// 		saveAndClose					- Saves commondata and closes script.
// 		bgmVol							- Handles the number drawing for BGM volume.
// 		sfxVol							- Handles the number drawing for SFX volume.
// 		fxVol							- Handles the number drawing for FX level.
// 		pieceOptions					- Summons the part of option items. Stored in an array to cycle.		
// 		drawTexture						- Function to summon a sprite. Returns obj.
//
//****************************************************************************************************

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

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

@MainLoop { yield; }
@Finalize { } 

task menuOptionsHandler {
	let titScreen = drawTitleScreen;
	let pMenuBg = drawTexture(GetScreenWidth/2,350,minitex,BLEND_SUBTRACT,45,0,0,640,192);
	let menBGM = pieceOptions(96,290,1,255,192,256,256,288);					// BGM
	let menSFX = pieceOptions(96,310,1,255,256,256,320,288);					// SFX
	let menFX = pieceOptions(96,330,1,0,320,256,384,288);						// FX	
	let menLang = pieceOptions(94,360,1,255,128,256,192,288);					// Language
	let menNihongo = pieceOptions(200,360,1,255,64,256,128,288);				// Ninhongo
	let menFlagJP = drawTexture(240,360,imgLang,BLEND_ALPHA,255,0,64,96,128);	// JP flag
	let menEigo = pieceOptions(330,360,1,255,0,256,64,288);						// Eigo
	let menFlagEN = drawTexture(350,360,imgLang,BLEND_ALPHA,255,0,0,96,64);		// EN flag
	let menReturn = pieceOptions(128,420,1,255,384,384,512,416);				// Return
	
	// Anim var
	let menItemsArr = [menBGM,menSFX,menLang,menReturn];
	let menItemsArr2 = [pMenuBg,menFlagJP,menFlagEN,menNihongo,menEigo];
	let r = 255; let g = 255; let colourFrame = 0; 
	let alphaValue2 = 255;
	ObjRender_SetAlpha(menFlagJP,105); ObjRender_SetAlpha(menFlagEN,105);
	
	// Display tasks
	drawBGMNumbers;
	drawSFXNumbers;
	//fxVol;

	// menu enum
	let OPT_BGMVOL = 0;
	let OPT_SFXVOL = 1;
	let OPT_FXSET = 99;				// disabled temp
	let OPT_LANG = 2;
	let OPT_SAVE = 3;
	let menuSelect = 0;				// choice change tracker

	let bgmvol = GetAreaCommonData("system", "bgmvol", 100);
	let sfxvol = GetAreaCommonData("system", "sfxvol", 100);
	let fxset = GetAreaCommonData("system", "FXLevel", 3);
	let language = GetAreaCommonData("system", "gameLang", 0);

	if(GetAreaCommonData("system","gameLang",0) == 0) { 
		ObjRender_SetColor(menNihongo,255,255,255); 
		ObjRender_SetColor(menEigo,128,128,128); 	
	}
	else { 
		ObjRender_SetColor(menNihongo,128,128,128); 
		ObjRender_SetColor(menEigo,255,255,255); 		
	}
	
	loop(5) { yield; }

	loop {
		if(alphaValue2 > 120) {
		    ObjRender_SetAlpha(titScreen, alphaValue2);
		    alphaValue2 -= 5;
        }
		ascent(i in 0..length(menItemsArr)) { 
			ObjRender_SetAlpha(menItemsArr[i], 255);
			
			if(i == menuSelect) { 
				ObjRender_SetColor(menItemsArr[menuSelect], r, g+64, 255);
				r -= sin(colourFrame) * 8;
				g -= sin(colourFrame) * 8;
				colourFrame += 5;
			} else { 
				ObjRender_SetColor(menItemsArr[i], 255, 255, 255);
			}
		}
		
		if(language == 0) { 
			ObjRender_SetAlpha(menFlagJP, 255);
			ObjRender_SetAlpha(menFlagEN, 105);
			ObjRender_SetColor(menNihongo, 255, 255, 255);
			ObjRender_SetColor(menEigo, 128, 128, 128);
		}
		if(language == 1) { 
			ObjRender_SetAlpha(menFlagEN, 255);
			ObjRender_SetAlpha(menFlagJP, 105);
			ObjRender_SetColor(menNihongo, 128, 128, 128);
			ObjRender_SetColor(menEigo, 255, 255, 255);
		}
		
		bgmvol = GetAreaCommonData("system", "bgmvol", 100);
		sfxvol = GetAreaCommonData("system", "sfxvol", 100);
		fxset = GetAreaCommonData("system", "FXLevel", 3);
		language = GetAreaCommonData("system", "gameLang", 0);

		// change options vertical
		if(GetVirtualKeyState(VK_UP) == KEY_PUSH) { 
			PlaySFX(SFX_MENPICK); 
			if(menuSelect > -1) { menuSelect--; }
			if(menuSelect == -1) { menuSelect = 3; }
			menSwitchShake(menItemsArr[menuSelect]);
		}
		if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH) { 
			PlaySFX(SFX_MENPICK); 
			if(menuSelect < 4) { menuSelect++; }
            if(menuSelect == 4) { menuSelect = 0; }
			menSwitchShake(menItemsArr[menuSelect]);
		}		
		
		// change options horizontal to tweak the Volume or FX etc.
		if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || GetVirtualKeyState(VK_LEFT) == KEY_HOLD) { 
			alternative(menuSelect) 
			case(OPT_BGMVOL) {
				if(bgmvol > 0) { bgmvol--; }
				SetAreaCommonData("system", "bgmvol", bgmvol);
				waitTitle(5);
			}
			case(OPT_SFXVOL) {
				PlaySFX(SFX_FEATHER);
				if(sfxvol > 0) { sfxvol--; }
				SetAreaCommonData("system", "sfxvol", sfxvol);
				waitTitle(5);
			}	
			case(OPT_FXSET) {
				if(fxset > 0) { fxset--; }
				SetAreaCommonData("system", "FXLevel", fxset);
				waitTitle(5);
			}	
			case(OPT_LANG) {
				if(language > 0) { PlaySFX(SFX_MENPICK); language--; }
				SetAreaCommonData("system", "gameLang", language);
				waitTitle(5);
			}				
		}

		if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || GetVirtualKeyState(VK_RIGHT) == KEY_HOLD) { 
			alternative(menuSelect) 
			case(OPT_BGMVOL) {
				if(bgmvol < 100) { bgmvol++; }
				SetAreaCommonData("system", "bgmvol", bgmvol);
				waitTitle(5);
			}	
			case(OPT_SFXVOL) {
				PlaySFX(SFX_FEATHER);
				if(sfxvol < 100) { sfxvol++; }
				SetAreaCommonData("system", "sfxvol", sfxvol);
				waitTitle(5);
			}
			case(OPT_FXSET) {
				if(fxset < 2) { fxset++; }
				SetAreaCommonData("system", "FXLevel", fxset);
				waitTitle(5);
			}
			case(OPT_LANG) {
				if(language < 1) { PlaySFX(SFX_MENPICK); language++; }
				SetAreaCommonData("system", "gameLang", language);
				waitTitle(5);
			}			
		}			

		// confirming choices
		if(GetVirtualKeyState(VK_OK) == KEY_PULL && menuSelect == OPT_SAVE) {
			PlaySFX(SFX_OK00);
			StopMusic(BGM_TITLE);
			if(menuSelect == OPT_SAVE) { menSelectAnim(menItemsArr[OPT_SAVE]); saveAndClose; } 
		}
		if(GetVirtualKeyState(VK_CANCEL) == KEY_PULL) { PlaySFX(SFX_OK00); menuSelect = 3; } 
		yield;
	}
	Obj_Delete(titScreen); 
	ascent(i in 0..length(menItemsArr)) { Obj_Delete(menItemsArr[i]); }
	ascent(i in 0..length(menItemsArr2)) { Obj_Delete(menItemsArr2[i]); }
}

// Save and close
function saveAndClose() {
    adjustBGMVol(GetAreaCommonData("sound", "song", 0), GetAreaCommonData("system", "bgmvol", 100));
	SaveCommonDataAreaA1("system");
	SetScriptResult("CANCEL");
	CloseScript(GetOwnScriptID);
}

// Menu highlight shaking anim.
task menSwitchShake(obj) {
	let originalX = ObjRender_GetX(obj);
	let originalY = ObjRender_GetY(obj);
	loop(10) {
		ObjRender_SetPosition(obj, originalX+rand_int(-4, 4), originalY+rand_int(-2,2), 0);
		loop(2) { yield; } 
	}
	ObjRender_SetPosition(obj, originalX, originalY, 0);
}

// Displaying BGM
task drawBGMNumbers() {
	let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	let maxDigit = 3;
	let bgmVol = 0;
	
	ObjPrim_SetTexture(obj,menuitems);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	ObjRender_SetAlpha(obj,255);
	Obj_SetRenderPriorityI(obj,10);
	ObjRender_SetY(obj,274);

	while(true) {
		bgmVol = GetAreaCommonData("system", "bgmvol", 100);
		
		if(bgmVol < 9) { maxDigit = 1; bgmVol = min(bgmVol,9); }
		if(bgmVol > 9 && bgmVol < 99) { maxDigit = 2; bgmVol = min(bgmVol,99); }
		if(bgmVol > 99 && bgmVol < 999) { maxDigit = 3; bgmVol = min(bgmVol,999); }
		
		let digitList = DigitToArray(bgmVol,maxDigit);
		ObjSpriteList2D_ClearVertexCount(obj);
		
		ascent(i in 0..maxDigit) {
			let num = digitList[i];
			if(maxDigit == 1) { ObjRender_SetX(obj,206+i*12); }
			if(maxDigit == 2) { ObjRender_SetX(obj,194+i*12); }
			if(maxDigit == 3) { ObjRender_SetX(obj,182+i*12); }
			ObjSpriteList2D_SetSourceRect(obj,num*20,321,(num + 1)*20,352);
			ObjSpriteList2D_SetDestRect(obj,0,0,20,32);
			ObjSpriteList2D_AddVertex(obj);
		}
		yield;
	}
}

// Displaying SFX 
task drawSFXNumbers {
	let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	let maxDigit = 3;
	let sfxVol = 0;
	
	ObjPrim_SetTexture(obj,menuitems);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	Obj_SetRenderPriorityI(obj,10);
	ObjRender_SetY(obj,294);

	while(true) {
		sfxVol = GetAreaCommonData("system","sfxvol",100);
		
		if(sfxVol < 9) { maxDigit = 1; sfxVol = min(sfxVol,9); } 
		if(sfxVol > 9 && sfxVol < 99) { maxDigit = 2; sfxVol = min(sfxVol,99); } 
		if(sfxVol > 99 && sfxVol < 999) { maxDigit = 3; sfxVol = min(sfxVol,999); }
		
		let digitList = DigitToArray(sfxVol,maxDigit);
		ObjSpriteList2D_ClearVertexCount(obj);
		
		ascent(i in 0..maxDigit) {
			let num = digitList[i];
			if(maxDigit == 1) { ObjRender_SetX(obj,206+i*12); }
			if(maxDigit == 2) { ObjRender_SetX(obj,194+i*12); }
			if(maxDigit == 3) { ObjRender_SetX(obj,182+i*12); }
			ObjSpriteList2D_SetSourceRect(obj,num*20,321,(num + 1)*20,352);
			ObjSpriteList2D_SetDestRect(obj,0,0,20,32);
			ObjSpriteList2D_AddVertex(obj);
		}
		yield;
	}
}

// Displaying FX
task fxVol {
	let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	let maxDigit = 3;
	let fxVol = 0;
	
	ObjPrim_SetTexture(obj,menuitems);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	Obj_SetRenderPriorityI(obj,10);
	ObjRender_SetY(obj,314);

	while(true) {
		fxVol = GetAreaCommonData("system","FXLevel",2);
		
		if(fxVol < 9) { maxDigit = 1; fxVol = min(fxVol,9); } 
		
		let digitList = DigitToArray(fxVol,maxDigit);
		ObjSpriteList2D_ClearVertexCount(obj);
		
		ascent(i in 0..maxDigit) {
			let num = digitList[i];
			if(maxDigit == 1) { ObjRender_SetX(obj,206+i*12); }
			ObjSpriteList2D_SetSourceRect(obj,num*20,321,(num + 1)*20,352);
			ObjSpriteList2D_SetDestRect(obj,0,0,20,32);
			ObjSpriteList2D_AddVertex(obj);
		}
		yield;
	}
}

// function to summon a piece of the HUD.
function pieceOptions(x,y,scale,alpha,left,top,right,bottom) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	ObjPrim_SetTexture(obj,menuitems);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	ObjRender_SetAlpha(obj,alpha);
	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);
	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 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,10);
	ObjSprite2D_SetSourceRect(obj,0,0,640,480);
	ObjSprite2D_SetDestRect(obj,0,0,640,480);
	
	return obj;	
}

// ORIGINAL Ph3 default_system code utility.
function DigitToArray(let digit,let count) {
	let res = [];
	digit = truncate(digit);
	loop {
		let tnum = truncate(digit % 10);
		digit /= 10;
		res = [tnum] ~ res;
		if(truncate(digit) == 0) { break; }
	}
	loop(max(0, count - length(res))) {
		res = [0] ~ res;
	}
	return res;
}