//****************************************************************************************************
// Ending menu 
//
// Library:
//		menuEndHandler					- Main menu flow.
//		showRText						- Simple function to summon text on screen
//
//****************************************************************************************************

let hasContinues = true;
let hasUsedContinue = false;
let isStagePractiseMode = false;
let isSpellPractiseMode = false;
let hasLostInSpellPractise = GetCommonData("hasLostInSpellPractise", false);

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

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

@MainLoop { yield; }
@Finalize { } 

task menuEndHandler() {

	let END_CONTINUE = 0;
	let END_QUIT = 1;
	let END_REPLAY = 2;
	let END_RETRY = 3;
	let menuSelect = 0;

	let birdy = menuItem(86, 320, 0.8, 255, 0, 704, 160, 1024);		                    // Birdy
	let menuPauseText = menuItem(88, 140, 1, 255, 128, 448, 256, 512);		            // Pause text static
	let menuContinue = menuItem(184, 284, 1, 255, 512, 960, 768, 1024);	                // Continue
	let menuReturnTitle = menuItem(184, 324, 1, 255,256, 704, 512, 768);	            // Return to title
	let menuSaveReplayReturnTitle = menuItem(184, 364, 1, 255, 256, 768, 512, 832);	    // Save replay and return title
	let menuRetry = menuItem(184, 404, 1, 255, 256, 832, 512, 896);		                // Give up and retry

	let menuItemsArray = [menuContinue, menuReturnTitle, menuSaveReplayReturnTitle, menuRetry];

	ObjRender_SetColor(birdy, 128, 255, 192);
	let b = 255; let g = 255; let colourFrame = 0;
	chinchin(birdy);
	birdyAnimation(birdy);

    //---------------------------------------------------------------------------------------------------------------
    // Below a few checks to make the menu_end.txt script flow well. (These should be actually put into methods)

    if(GetAreaCommonData("game","menuFlow",0) == 4) {
        adjustBGMVol(GetAreaCommonData("sound","song",0), 60);
        isSpellPractiseMode = true;
        menuSelect = 3;
    }

    // Check whether it was a practice mode (allows saving replay, prevents continue use)
    if(GetAreaCommonData("game","menuFlow",0) == 3) {
        StopMusic(GetAreaCommonData("sound", "song", 0));
        PlayMusic(BGM_PAUSE);
        isStagePractiseMode = true;
        menuSelect = 3;
    }

    // Check whether the player is out of continues (prevents saving replay and using continue)
	if(GetCommonData("remainingContinues", 0) == 0) {
	    hasContinues = false;
	    menuSelect = 3;
    }

    // Check whether the player has actually used a continue (prevents saving replay, allows continue if any left)
    if(GetCommonData("hasUsedContinue", false)) {
        hasUsedContinue = true;
    }
    // End of checks
    //---------------------------------------------------------------------------------------------------------------

	while(GetVirtualKeyState(VK_PAUSE) != KEY_FREE) { yield; }
	while(GetVirtualKeyState(VK_OK) != KEY_FREE) { yield; }

    //StopMusic(GetAreaCommonData("sound", "song", 0));
    PlaySFX(SFX_ACK3);
    //PlayMusic(BGM_PAUSE);

	loop {
        ascent(i in 0..length(menuItemsArray)) {
            if(i == menuSelect) {
                ObjRender_SetColor(menuItemsArray[menuSelect], 255, g, b);
                b -= sin(colourFrame) * 8;
                g -= sin(colourFrame) * 8;
                colourFrame += 5;
                if(ObjRender_GetX(menuItemsArray[menuSelect]) < 192) { ObjRender_SetX(menuItemsArray[menuSelect], ObjRender_GetX(menuItemsArray[menuSelect]) + 2); }
            } else {
                ObjRender_SetColor(menuItemsArray[i], 255, 255, 255);

                if(!hasContinues && !isStagePractiseMode) {
                    ObjRender_SetColor(menuItemsArray[0], 160, 160, 128);
                    ObjRender_SetAlpha(menuItemsArray[0], 200);
                }
                if(hasUsedContinue && !isStagePractiseMode) {
                    ObjRender_SetColor(menuItemsArray[2], 160, 160, 128);
                    ObjRender_SetAlpha(menuItemsArray[2], 200);
                }
                if(!hasContinues && !isStagePractiseMode && hasLostInSpellPractise) {
                    ObjRender_SetColor(menuItemsArray[0], 160, 160, 128);
                    ObjRender_SetAlpha(menuItemsArray[0], 200);
                    ObjRender_SetColor(menuItemsArray[2], 160, 160, 128);
                    ObjRender_SetAlpha(menuItemsArray[2], 200);
                }
                if(!hasContinues && isStagePractiseMode) {
                    ObjRender_SetColor(menuItemsArray[0], 160, 160, 128);
                    ObjRender_SetAlpha(menuItemsArray[0], 200);
                }
                ObjRender_SetX(menuItemsArray[i],184);
            }
        }

        if(GetVirtualKeyState(VK_UP) == KEY_PUSH) {
            PlaySFX(SFX_MENPICK);
            if(hasContinues) {
                if(menuSelect > -1) { menuSelect--; }
                if(menuSelect == -1) { menuSelect = 3; }
            } else {
                if(menuSelect > 0) { menuSelect--; }
                if(menuSelect == 0) { menuSelect = 3; }
            }
            if((hasUsedContinue && menuSelect == END_REPLAY) || (isSpellPractiseMode && menuSelect == END_REPLAY && hasLostInSpellPractise)) {
                menuSelect--;
            }
        }

        if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH) {
            PlaySFX(SFX_MENPICK);
            if(hasContinues) {
                if(menuSelect < 4) { menuSelect++; }
                if(menuSelect == 4) { menuSelect = 0; }
            } else {
                if(menuSelect < 4) { menuSelect++; }
                if(menuSelect == 4) { menuSelect = 1; }
            }
            if((hasUsedContinue && menuSelect == END_REPLAY) || (isSpellPractiseMode && menuSelect == END_REPLAY && hasLostInSpellPractise)) {
                menuSelect++;
            }
        }

        if(GetVirtualKeyState(VK_OK) == KEY_PUSH) {
            let systemBGMVolumeLevel = GetAreaCommonData("system", "bgmvol", 100);
            adjustBGMVol(GetAreaCommonData("sound","song",0), systemBGMVolumeLevel);
            StopMusic(BGM_PAUSE);
            PlaySFX(SFX_OK00);
            menSelectAnim(menuItemsArray[menuSelect]);
            let choiceMade = [RESULT_CANCEL, RESULT_END, RESULT_SAVE_REPLAY, RESULT_RETRY];
            SetScriptResult(choiceMade[menuSelect]);
            CloseScript(GetOwnScriptID);
            return;
        }
		yield;
    }
	StopMusic(BGM_PAUSE);	
	ascent(i in 0..length(menuItemsArray)) { Obj_Delete(menuItemsArray[i]); }
}