//****************************************************************************************************
// Replay save menu
//
// Library:
//		menuReplayPlayHandler			- Main menu flow.
//		showRText						- Simple function to summon text on screen.
//		showRText2						- Simple function to summon text on screen with additional parameters.
//		nameInput						- Replay name input function using direct Keyboard input.
//		drawTexture						- Draws a simple texture.
//		drawPlayerScreen				- 
//****************************************************************************************************

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

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

@MainLoop { yield; }
@Finalize { } 

// Difficulty handler menu
task menuReplayPlayHandler { 
	
	// Draw
	let pSelScreen = drawPlayerScreen(imgPSelBg,BLEND_ALPHA); 
	let topLogoBg = drawTexture(128,32,menulogos,BLEND_ALPHA,155,0,0,512,128);
	let topLogo = drawTexture(128,64,menulogos,BLEND_ALPHA,255,0,768,512,894);	
	
	// Load the replay list and store
	LoadReplayList;
	let replayListIndex = GetValidReplayIndices;
	
	let maxPage = 1;						// max pages for replays
	let maxList = 15;						// max replays per page
	let replayArray = [ID_INVALID];			// Array to hold all the replays loaded
	let pageArray = [ID_INVALID];
	let pageNum = 0;						// current page displayed
	let replayChoice = 1;					// current replay choice
	
	// Calculate how many pages are needed to display
	maxPage = length(replayListIndex)/maxList;
	
	// Count how many replays are found in the folder.
	let countReplay = length(replayListIndex);
	
	// Ascent the replaylist and fill in with blancs.  
	ascent(i in 0..maxList) {
		replayArray = replayArray ~ [showRText(16,72+25*i,"No."~IntToString(i+1)~" "~"-------- --/--/-- --:-- ------- ------- --- ---% ---")];
	}

	loop(5) { yield; }

	PlayMusic(BGM_TITLE);

	loop {
		// Ascent the replaylist and fill it now with the details from each replay in the replay folder.
		ascent(i in 0..length(replayListIndex)) {
		
			// If there is a valid replay found, draw it on the corresponding index row. 
			if(IsValidReplayIndex(replayListIndex[i])) { 	

				let repUser = " "~vtos("-8s",GetReplayInfo(replayListIndex[i],REPLAY_USER_NAME))~" ";						// Get the username 8 char max. 
				let repDate = " "~GetReplayInfo(replayListIndex[i],REPLAY_DATE_TIME)~" ";									// Get the date + time in one go.
				let repChar = " " ~GetReplayInfo(replayListIndex[i],REPLAY_PLAYER_NAME)~" ";								// Get the player character, this/ is influenced by #ReplayName[] in player scripts.
				
				let preString = SplitString(GetReplayInfo(replayListIndex[i],REPLAY_COMMENT),"::");							// Get replay comment and turn it into array splitting :: as index
				let repLevel = " "~preString[0]~" ";																		// Get the difficulty level. 
				let repMode = " "~preString[1]~" ";																			// Get the mode				
				
				let repStg = "";
				if(repMode == "Spl Prac") { repStg = " " ~ "Spell No. " ~preString[2]~ " "; }								// If this is a spell practise replay, display card number
				else { repStg = " "~preString[2]~" "; }																		// Otherwise display stage number.
				let repSlow = " "~vtos("0.1f",(60-round(GetReplayInfo(replayListIndex[i],REPLAY_FPS_AVERAGE)))/100)~"%";	// Get the slowdown																// Get the mode
				
				// Display the full data of the replay file by using the previous set variables
				ObjText_SetText(replayArray[replayListIndex[i]-0],
					"No."
					~IntToString(replayListIndex[i])~" "
					~repUser~" "
					~repDate~" "
					~repChar~" "
					~repLevel~" "
					~repStg~" "
					~repSlow~" "
					~repMode~" "
				);
			}
			// If number of replays exceeds the display limit of 2, draw it on the other page.
			//if(i > maxList) { pageNum++; } 
		}	
	
		// Cycle through the list
		if(GetVirtualKeyState(VK_UP) == KEY_PUSH) { 
			PlaySFX(SFX_MENPICK);	
			if(replayChoice > 1) { replayChoice--; } 
		}
		if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH) { 
			PlaySFX(SFX_MENPICK);	
			if(replayChoice < maxList) { replayChoice++; } 
		}	
	
		// Animating the replay items (selected = bright, otherwise dark/dim)
		ascent(i in 0..length(replayArray)) { 
			if(i == replayChoice) { 
				ObjRender_SetColor(replayArray[replayChoice],128,192,255);			
			}
			else { 
				ObjRender_SetColor(replayArray[i],64,64,64);
			}
		}
		
		// If choice is made
		if(GetVirtualKeyState(VK_OK) == KEY_PUSH) { 
			PlaySFX(SFX_OK00);
			
			// Enter the name of the replay, will prompt with a message in both JP/EN.
			let replayName = nameInput(replayChoice);
			
			PlaySFX(SFX_OK00);
			
			let getDiffInfo = GetAreaCommonData("game","difficulty",0);
			let repDifficulty = "";
			if(getDiffInfo == 0) { repDifficulty = "Normal"; }
			if(getDiffInfo == 1) { repDifficulty = "Hard"; }
			if(getDiffInfo == 2) { repDifficulty = "Lunatic"; }
			
			let getModeInfo = GetAreaCommonData("game","menuFlow",0);
			let repMode = ""; 
			if(getModeInfo == 0) { repMode = "Story"; }
			if(getModeInfo == 3) { repMode = "Stg Prac"; }
			if(getModeInfo == 4) { repMode = "Spl Prac" }
			
			let getStgNum = GetAreaCommonData("game","stageNum",0);
			let repStg = "";
			let repTryStage = "";
			let repTryCard = "";
			let repTryDifficulty = "";
			
			if(GetCommonData("allClear",false)) {
				repStg = "All Clear"
			}
			else { 
				if(getStgNum == 0) { 
					repStg = ToString("Spell No. " ~ IntToString(GetCommonData("cardDatabaseNumber", 0)));
					repTryStage = ToString(GetCommonData("tryStage", 0));
					repTryCard = ToString(GetCommonData("tryCard", 0));
					repTryDifficulty = ToString(GetCommonData("tryDifficulty", 0));
					if(GetCommonData("tryDifficulty",0) == 0) { repDifficulty = "Normal"; } 
					if(GetCommonData("tryDifficulty",0) == 1) { repDifficulty = "Hard"; } 
					if(GetCommonData("tryDifficulty",0) == 2) { repDifficulty = "Lunatic"; } 
				}
				if(getStgNum == 1) { repStg = "Stg1"; }
				if(getStgNum == 2) { repStg = "Stg2"; }
				if(getStgNum == 3) { repStg = "Stg3"; }
			}

			let commentArray = repDifficulty ~ "::" ~ repMode ~ "::" ~ repStg ~ "::" ~ repTryStage ~ "::" ~ repTryCard ~ "::" ~ repTryDifficulty;
			
			SetReplayInfo(REPLAY_COMMENT, commentArray);
			SaveReplay(replayChoice, ToString(replayName));
			loop(30) { yield; } 
			SetScriptResult("CANCEL");
			CloseScript(GetOwnScriptID);
		}
		
		// If cancel button is pressed, return to title screen.
		if(GetVirtualKeyState(VK_CANCEL) == KEY_PULL) { 
			PlaySFX(SFX_MENCANCEL);	
			SetScriptResult("CANCEL"); 
			CloseScript(GetOwnScriptID); 
		} 
		yield;	
	}
	ascent(i in 0..length(replayArray)) { Obj_Delete(replayArray[i]); } 	
	Obj_Delete(pSelScreen);
	Obj_Delete(topLogoBg);
	Obj_Delete(topLogo);
}

// Replay name input with help from forum members and example scripts have made this one.
function nameInput(name) {
	// Anim
	let pLogoBg = drawTexture(GetScreenWidth/2, 192, minitex, BLEND_ALPHA, 160, 0, 0, 640, 192);
	ObjRender_SetColor(pLogoBg, 16, 16, 48);
	
	// Prepare array as obj and enter text with some extra parameters.
	let obj = [
	    showRText2(0, 224, "", 24, 128, 192, 255),
	    showRText2(0, 112, "Replay Name / vC̖OH" , 24, 255, 128, 96),
	    showRText2(0, 144, "L[{[hgĉApł܂B 'Enter'L[ĉB[r]Please use keyboard, alphanumeric only. Press 'Enter' when finished.", 15, 255, 255, 255)
    ];
	
	// Create the replayname string, max character limit = 8.
	let replayName = ""; 
	let maxL = 8;
	
	while(GetVirtualKeyState(VK_OK) != KEY_FREE) { yield; }

	while(GetKeyState(KEY_RETURN) == KEY_FREE) {
		// Show the name so far.
		ObjText_SetText(obj[0], replayName);
		
		// If using backspace or delete key, delete the character one by one.
		if((GetKeyState(KEY_BACK) == KEY_PUSH || GetKeyState(KEY_DELETE) == KEY_PUSH) && length(replayName) > 0) {
			replayName = replayName[0..length(replayName)-1];
			yield;
		}
		
		// As long as the name is within 8 characters length, listen to keyboard input. Alphanumeric only.
		if(length(replayName) < maxL) {		
			if(GetKeyState(KEY_A) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"A"; } else { replayName = replayName~"a"; }
			}	
			if(GetKeyState(KEY_B) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"B"; } else { replayName = replayName~"b"; }
			}	
			if(GetKeyState(KEY_C) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"C"; } else { replayName = replayName~"c"; }
			}
			if(GetKeyState(KEY_D) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"D"; } else { replayName = replayName~"d"; }
			}
			if(GetKeyState(KEY_E) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"E"; } else { replayName = replayName~"e"; }
			}
			if(GetKeyState(KEY_F) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"F"; } else { replayName = replayName~"f"; }
			}
			if(GetKeyState(KEY_G) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"G"; } else { replayName = replayName~"g"; }
			}
			if(GetKeyState(KEY_H) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"H"; } else { replayName = replayName~"h"; }
			}
			if(GetKeyState(KEY_I) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"I"; } else { replayName = replayName~"i"; }
			}	
			if(GetKeyState(KEY_J) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"J"; } else { replayName = replayName~"j"; }
			}	
			if(GetKeyState(KEY_K) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"K"; } else { replayName = replayName~"k"; }
			}	
			if(GetKeyState(KEY_L) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"L"; } else { replayName = replayName~"l"; }
			}	
			if(GetKeyState(KEY_M) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"M"; } else { replayName = replayName~"m"; }
			}	
			if(GetKeyState(KEY_N) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"N"; } else { replayName = replayName~"n"; }
			}	
			if(GetKeyState(KEY_O) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"O"; } else { replayName = replayName~"o"; }
			}	
			if(GetKeyState(KEY_P) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"P"; } else { replayName = replayName~"p"; }
			}
			if(GetKeyState(KEY_Q) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"Q"; } else { replayName = replayName~"q"; }
			}	
			if(GetKeyState(KEY_R) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"R"; } else { replayName = replayName~"r"; }
			}	
			if(GetKeyState(KEY_S) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"S"; } else { replayName = replayName~"s"; }
			}	
			if(GetKeyState(KEY_T) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"T"; } else { replayName = replayName~"t"; }
			}	
			if(GetKeyState(KEY_U) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"U"; } else { replayName = replayName~"u"; }
			}	
			if(GetKeyState(KEY_V) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"V"; } else { replayName = replayName~"v"; }
			}	
			if(GetKeyState(KEY_W) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"W"; } else { replayName = replayName~"w"; }
			}	
			if(GetKeyState(KEY_X) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"X"; } else { replayName = replayName~"x"; }
			}	
			if(GetKeyState(KEY_Y) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"Y"; } else { replayName = replayName~"y"; }
			}	
			if(GetKeyState(KEY_Z) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"Z"; } else { replayName = replayName~"z"; }
			}	
			if(GetKeyState(KEY_0) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"0"; } else { replayName = replayName~"0"; }
			}	
			if(GetKeyState(KEY_1) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"1"; } else { replayName = replayName~"1"; }
			}
			if(GetKeyState(KEY_2) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"2"; } else { replayName = replayName~"2"; }
			}
			if(GetKeyState(KEY_3) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"3"; } else { replayName = replayName~"3"; }
			}
			if(GetKeyState(KEY_4) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"4"; } else { replayName = replayName~"4"; }
			}
			if(GetKeyState(KEY_5) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"5"; } else { replayName = replayName~"5"; }
			}
			if(GetKeyState(KEY_6) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"6"; } else { replayName = replayName~"6"; }
			}
			if(GetKeyState(KEY_7) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"7"; } else { replayName = replayName~"7"; }
			}
			if(GetKeyState(KEY_8) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"8"; } else { replayName = replayName~"8"; }
			}
			if(GetKeyState(KEY_9) == KEY_PUSH) {
				yield;
				if(GetKeyState(KEY_LSHIFT) == KEY_HOLD || GetKeyState(KEY_RSHIFT) == KEY_HOLD) { replayName = replayName~"9"; } else { replayName = replayName~"9"; }
			}			
		}
		yield;
	}
	
	// If nothing is entered, put in a default name
	if(length(replayName) == 0) { replayName = "NoName"; }
	ObjText_SetText(obj[0], replayName);
	loop(15){ yield; }
	
	// Clean up
	Obj_Delete(pLogoBg); 
	ascent(i in 0..length(obj)) { Obj_Delete(obj[i]); }

	return replayName;	
}

// Function to draw text on the screen.
function showRText(x, y, txt) {
	let obj = ObjText_Create;
	
	ObjText_SetText(obj, txt);
	ObjText_SetFontType(obj, "MeiryoKe_PGothic");
	Obj_SetRenderPriorityI(obj, 98);
	ObjText_SetFontSize(obj, 16);
	ObjText_SetSidePitch(obj, -2);
	ObjText_SetMaxWidth(obj, 640);
	ObjText_SetMaxHeight(obj, 480);
	ObjText_SetFontColorTop(obj, 255, 255, 255);
	ObjText_SetFontColorBottom(obj, 255, 255, 255);
	ObjText_SetFontBorderType(obj, BORDER_SHADOW);
	ObjText_SetFontBold(obj, false);
	ObjText_SetFontBorderWidth(obj, 2);
	ObjText_SetFontBorderColor(obj, 0, 0, 0);
	ObjRender_SetColor(obj, 128, 128, 128);
	ObjRender_SetPosition(obj, x, y, 0);

	return obj
}

function showRText2(x, y, txt, size, r, g, b) {
	let obj = ObjText_Create;
	
	ObjText_SetText(obj, txt);
	ObjText_SetFontType(obj, "MeiryoKe_PGothic");
	Obj_SetRenderPriorityI(obj, 100);
	ObjText_SetFontSize(obj, size);
	ObjText_SetSidePitch(obj, -2);
	ObjText_SetMaxWidth(obj, 640);
	ObjText_SetMaxHeight(obj, 480);
	ObjText_SetFontColorTop(obj, 255, 255, 255);
	ObjText_SetFontColorBottom(obj, 255, 255, 255);
	ObjText_SetFontBorderType(obj, BORDER_SHADOW);
	ObjText_SetFontBold(obj, false);
	ObjText_SetFontBorderWidth(obj, 3);
	ObjText_SetFontBorderColor(obj, 0, 0, 0);
	ObjText_SetHorizontalAlignment(obj, ALIGNMENT_CENTER);
	ObjRender_SetColor(obj, r, g, b);
	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, 99);
	ObjSprite2D_SetSourceRect(obj, left, top, right, bottom);
	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, 205);
	Obj_SetRenderPriorityI(obj, 20);
	ObjSprite2D_SetSourceRect(obj, 0, 0, 640, 480);
	ObjSprite2D_SetDestRect(obj, 0, 0, 640, 480);
	
	return obj;	
}