//************************************************************************
//	Dialogue function
//	Author: Helepolis
//	Version: 1.0
//	Anything related to the dialogue and such
//
//	Functions & tasks:
//		dialogueMain		-	Main task for the dialogue system.
//		dialogueListener	-	Listener function.
//		endDialogue			-	Function to end dialogue and cleanup.
//		diaglogueText		- 	Outputs texts and holds the next step.
//		dialogueFaceShow	-	Texture changer for portraits.
//		dialogueFaceMove	-	Moves portraits forward/backward
//		makeDialogueFace	- 	function for spawning the portrait objects
//
//************************************************************************

SetCommonData("dialogueScriptID", GetOwnScriptID);			// used for EVENT_USER method

// Globals
let diagObjLeft = ObjPrim_Create(OBJ_SPRITE_2D);			// Dialogue object sprite left side.
let diagObjRight = ObjPrim_Create(OBJ_SPRITE_2D);			// Dialogue object sprite right side.
let fontLeft = ObjText_Create;								// Font install left side (no longer used since .pre6a).
let fontRight = ObjText_Create;								// Font install left side (no longer used since .pre6a).
let alphaValueL = 0;
let alphaValueR = 0;

// Core 
let diagStep = 0;											// Dialogue step.
let isDialogue = false; 									// Tracker whether a dialogue is going on.
let isPressed = false;										// Tracker to check whether the shot button was pressed.
let diagEvent = 0;											// Dialogue event usage (for animating and such).
let gameLang = 0;											// Game language (retrieved with CommonData)
let gamePair = 0;											// Game team (retrieved with CommonData)

// Enums
let moveBack = 0;											// Enum to move the portrait back.
let moveFront = 1;											// Enum to move the portrait front.
let moveHide = 2;											// Enum to instant hide the portrait.
let moveFade = 3;											// Enum to fade out the portrait.
let charLeft = 0;											// Character left.
let charRight = 1;											// Character right.

SetCommonData("isDialogue",false);							// Commondata to check for dialogues. (Called in combination with GetOwnScriptID)
SetCommonData("diagEvent",0);								// Commondata to set dialogue event (Not used?)

#include "script/thdcs/system/dialoguescript.txt"
#include "script/thdcs/functions/function_loaddata.txt"

@Initialize {
	SetAutoDeleteObject(true);	
}

@Event {
	alternative(GetEventType)
	case(EV_USER) {
	    diagEvent = GetEventArgument(0);
		dialogueMain;
	}
}

@MainLoop { yield; } 
@Finalize { } 	
	
// Main dialogue handler. 
task dialogueMain {
	isDialogue = true;
	SetCommonData("isDialogue",true);
	SetForbidPlayerShot(true);
	SetForbidPlayerSpell(true);

	//diagEvent = 11;
	gameLang = GetAreaCommonData("system","gameLang",0);
	gamePair = GetAreaCommonData("game","team",0);
	
	ObjText_SetAutoTransCenter(fontLeft,true);
	ObjText_SetAutoTransCenter(fontRight,true);
	
	// position and render the left text then the right text
	ObjRender_SetPosition(fontLeft,70,400,0);
	ObjText_SetFontColorTop(fontLeft,255,255,64);
	ObjText_SetFontColorBottom(fontLeft,255,255,64);
	if(gameLang == 0) { ObjText_SetFontBorderWidth(fontLeft,1); }
	if(gameLang == 1) { ObjText_SetFontBorderWidth(fontLeft,2); }
	ObjText_SetFontBorderType(fontLeft,BORDER_SHADOW);
	ObjText_SetFontBorderColor(fontLeft,0,0,0);
	Obj_SetRenderPriorityI(fontLeft,91);		
	ObjText_SetFontType(fontLeft,"MeiryoKe_PGothic");	

	ObjRender_SetPosition(fontRight,70,400,0);
	ObjText_SetFontColorTop(fontRight,255,32,155);
	ObjText_SetFontColorBottom(fontRight,255,32,155);
	if(gameLang == 0) { ObjText_SetFontBorderWidth(fontRight,1); }
	if(gameLang == 1) { ObjText_SetFontBorderWidth(fontRight,2); }
	ObjText_SetFontBorderType(fontRight,BORDER_SHADOW);
	ObjText_SetFontBorderColor(fontRight,0,0,0);
	Obj_SetRenderPriorityI(fontRight,91);	
	ObjText_SetFontType(fontRight,"MeiryoKe_PGothic");
		
	if(gameLang == 0) { ObjText_SetFontSize(fontLeft,16); ObjText_SetFontSize(fontRight,16); }
	if(gameLang == 1) { ObjText_SetFontSize(fontLeft,16); ObjText_SetFontSize(fontRight,16); }
	
	// dummy setting required initially
	makeDialogueFace(diagObjLeft,faceMarisaNorm,0);
	makeDialogueFace(diagObjRight,facePieruNorm,1);
	
	// Position the dialogue box.
	diagTextBox(320,420);
	
	loop(60) { yield; }
	
	// Start the dialogue listener.
	dialogueListener;
	
	// Scriptloading statement
	alternative(diagEvent)
	case(0) { talkStg01_01;	}		// post Fifi-chan 
	case(1) { talkStg01_02;	}		// Pierre intro
	case(2) { talkStg01_03;	}		// Hina intro
	case(3) { talkStg01_04;	}		// Duet defeat
	case(4) { talkStg01_05;	}		// Pierre defeat
	// Stage 02
	case(5) { talkStg02_00; }		// Nue/Kogasa intro
	case(6) { talkStg02_01;	}		// Nue/Kogasa defeat
	case(7) { talkStg02_02;	}		// Tenji intro
	case(8) { talkStg02_03;	}		// Iku intro
	case(9) { talkStg02_04;	}		// Duet defeat
	case(10) { talkStg02_05; }		// Tenji defeat
	// Stage 03
	case(11) { talkStg03_00; }		// Rival intro 
	case(12) { talkStg03_01; }		// Rival part 2
	case(13) { talkStg03_02; }		// DJ intro
	case(14) { talkStg03_03; }		// Tewi intro
}

// Listener to handle whether the user has pressed the "next" button. Within 300 frames, it auto activates each step. Using C will fast forward.
task dialogueListener {
	let idleCounter = 0;
	while(isDialogue) { 
		while(!isPressed) { 	
			if(GetVirtualKeyState(VK_SHOT) == KEY_PULL) { 
				isPressed = true;
				idleCounter = 0;
			}			
			if(GetVirtualKeyState(VK_USER1) == KEY_PULL || GetVirtualKeyState(VK_USER1) == KEY_HOLD) {
				isPressed = true;
				idleCounter = 330;
				loop(3) { yield; } 
			}
			if(idleCounter == 360) { isPressed = true; idleCounter = 0; loop(5) { yield; } } 
			idleCounter++;
			yield;
		}	
	}	
}

// function to end the dialogue. Removes font, sets both portraits to 0 alpha and colour.
function endDialogue {
	ObjText_SetText(fontLeft,""); ObjText_SetText(fontRight,"");
	ObjRender_SetAlpha(diagObjLeft,0); ObjRender_SetColor(diagObjLeft,0,0,0); 
	ObjRender_SetAlpha(diagObjLeft,0); ObjRender_SetColor(diagObjLeft,0,0,0); 
	ObjRender_SetAlpha(diagObjRight,0); ObjRender_SetColor(diagObjRight,0,0,0);
	ObjRender_SetAlpha(diagObjRight,0); ObjRender_SetColor(diagObjRight,0,0,0);
	isPressed = false;
	isDialogue = false;
	SetCommonData("isDialogue",false);
	SetForbidPlayerShot(false);
	SetForbidPlayerSpell(false);		
	SetCommonData("diagEvent",0);
	CloseScript(GetOwnScriptID);
} 

// handler to set the font colours for each character
function diaglogueText(side,character,text) {
	if(side == charLeft) { ObjText_SetText(fontLeft,text); ObjRender_SetAlpha(fontLeft,255); ObjRender_SetAlpha(fontRight,0); } 
	if(side == charRight) { ObjText_SetText(fontRight,text); ObjRender_SetAlpha(fontLeft,0); ObjRender_SetAlpha(fontRight,255); } 
	if(character == "reimu") { 
		if(side == charLeft) { 
			ObjText_SetFontColorTop(fontLeft,255,64,64); ObjText_SetFontColorBottom(fontLeft,255,64,64);
		} 
		if(side == charRight) { 
			ObjText_SetFontColorTop(fontRight,255,64,64); ObjText_SetFontColorBottom(fontRight,255,64,64); ObjRender_SetAngleY(diagObjRight,180); 
		} 		
	} 
	if(character == "yukari") { 
		if(side == charLeft) { 
			ObjText_SetFontColorTop(fontLeft,255,64,255); ObjText_SetFontColorBottom(fontLeft,255,64,255);
		}
		if(side == charRight) { 
			ObjText_SetFontColorTop(fontRight,255,64,255); ObjText_SetFontColorBottom(fontRight,255,64,255); ObjRender_SetAngleY(diagObjRight,180); 
		}
	} 		
	if(character == "marisa") { 
		if(side == charLeft) { 
			ObjText_SetFontColorTop(fontLeft,255,255,64); ObjText_SetFontColorBottom(fontLeft,255,255,64);
		}
		if(side == charRight) { 
			ObjText_SetFontColorTop(fontRight,255,255,64); ObjText_SetFontColorBottom(fontRight,255,255,64); 
		}
	} 	
	if(character == "arisu") { 
		if(side == charLeft) { 
			ObjText_SetFontColorTop(fontLeft,32,96,255); ObjText_SetFontColorBottom(fontLeft,32,96,255);
		}
		if(side == charRight) { 
			ObjText_SetFontColorTop(fontRight,32,96,255); ObjText_SetFontColorBottom(fontRight,32,96,255);
		}
	} 
	if(character == "pieru") { ObjText_SetFontColorTop(fontRight,255,128,255); ObjText_SetFontColorBottom(fontRight,255,128,255); }
	if(character == "hina") { ObjText_SetFontColorTop(fontRight,128,255,128); ObjText_SetFontColorBottom(fontRight,128,255,128); }	
	if(character == "kogasa") { ObjText_SetFontColorTop(fontRight,64,128,255); ObjText_SetFontColorBottom(fontRight,64,128,255); }	
	if(character == "nue") { ObjText_SetFontColorTop(fontRight,255,64,64); ObjText_SetFontColorBottom(fontRight,255,64,255); }	
	if(character == "tenji") { ObjText_SetFontColorTop(fontRight,64,64,64); ObjText_SetFontColorBottom(fontRight,64,64,64); }	
	if(character == "iku") { ObjText_SetFontColorTop(fontRight,255,128,64); ObjText_SetFontColorBottom(fontRight,255,128,64); }	
	if(character == "dj") { ObjText_SetFontColorTop(fontRight,64,255,64); ObjText_SetFontColorBottom(fontRight,255,255,255); }	
	if(character == "tewi") { ObjText_SetFontColorTop(fontRight,255,200,200); ObjText_SetFontColorBottom(fontRight,255,200,200); }	
	while(!isPressed) { yield; }	
	isPressed = false;
}

// Simple function for changing the face.
function dialogueFaceShow(side,face) { 
	if(side == charLeft) { ObjPrim_SetTexture(diagObjLeft,face); } 
	if(side == charRight) { ObjPrim_SetTexture(diagObjRight,face); }
} 

// Moves forward or backward the face depending on the parameter given or apply hidden/fade.
// left: 	front: 160,320  	back: 100,360
// right: 	front: 460,320  	back: 500,360
// hide:	0,0,0 and 0
task dialogueFaceMove(side,action) {
	if(side == charLeft) { 
		if(action == moveBack) { 
			ObjRender_SetColor(diagObjLeft,100,100,100);
			ObjRender_SetAlpha(diagObjLeft,205);	
			while(ObjRender_GetX(diagObjLeft) > 100) { 
				ObjRender_SetX(diagObjLeft,ObjRender_GetX(diagObjLeft)-4); 
				ObjRender_SetY(diagObjLeft,ObjRender_GetY(diagObjLeft)+4); 
				yield;
			} 	

		} 	
		if(action == moveFront) { 		
			ObjRender_SetColor(diagObjLeft,255,255,255);
			ObjRender_SetAlpha(diagObjLeft,255);			
			while(ObjRender_GetX(diagObjLeft) < 160) { 
				ObjRender_SetX(diagObjLeft,ObjRender_GetX(diagObjLeft)+4); 
				ObjRender_SetY(diagObjLeft,ObjRender_GetY(diagObjLeft)-4); 
				yield;
			} 	
		}
		if(action == moveHide) { 
			ObjRender_SetColor(diagObjLeft,0,0,0);
			ObjRender_SetAlpha(diagObjLeft,0);					
		} 
		if(action == moveFade) {
			alphaValueL = 250;
			while(alphaValueL > 0) { ObjRender_SetAlpha(diagObjLeft,alphaValueL); alphaValueL-=10; yield; } 
			ObjRender_SetAlpha(diagObjLeft,0);					
		}
	}
	else if(side == charRight) { 
		if(action == moveBack) { 
			ObjRender_SetColor(diagObjRight,100,100,100);
			ObjRender_SetAlpha(diagObjRight,205);			
			while(ObjRender_GetX(diagObjRight) < 500) { 
				ObjRender_SetX(diagObjRight,ObjRender_GetX(diagObjRight)+4); 
				ObjRender_SetY(diagObjRight,ObjRender_GetY(diagObjRight)+4); 
				yield;				
			} 	
		}	
		if(action == moveFront) { 
			ObjRender_SetColor(diagObjRight,255,255,255);
			ObjRender_SetAlpha(diagObjRight,255);				
			while(ObjRender_GetX(diagObjRight) > 440) { 
				ObjRender_SetX(diagObjRight,ObjRender_GetX(diagObjRight)-4); 
				ObjRender_SetY(diagObjRight,ObjRender_GetY(diagObjRight)-4); 		
				yield;				
			} 		
		} 
		if(action == moveHide) { 
			ObjRender_SetColor(diagObjRight,0,0,0);
			ObjRender_SetAlpha(diagObjRight,0);					
		} 
		if(action == moveFade) {
			alphaValueR = 250;
			while(alphaValueR > 0) { ObjRender_SetAlpha(diagObjRight,alphaValueR); alphaValueR-=10; yield; } 
			ObjRender_SetAlpha(diagObjRight,0);					
		}		
	}
}

// Creates the dialogue faces
function makeDialogueFace(obj,tex,side) {
	ObjPrim_SetTexture(obj,tex);
	ObjRender_SetAngleXYZ(obj,0,0,0);
	ObjRender_SetScaleXYZ(obj,0.512,0.512,0);
	Obj_SetRenderPriorityI(obj,90);
	ObjSprite2D_SetSourceRect(obj,0,0,1024,1024);
	ObjSprite2D_SetDestCenter(obj);
	ObjRender_SetColor(obj,0,0,0);
	ObjRender_SetAlpha(obj,0);
	if(side == 0) { ObjRender_SetPosition(obj,100,320,0); }
	if(side == 1) { ObjRender_SetPosition(obj,500,320,0); }
}

// Text box
task diagTextBox(x,y) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let flipX = 90;
	
	ObjPrim_SetTexture(obj,diagtext);
	ObjRender_SetBlendType(obj,BLEND_ADD_ARGB);
	ObjRender_SetAlpha(obj,205);
	ObjRender_SetAngleXYZ(obj,0,0,0);
	ObjRender_SetScaleXYZ(obj,1.024,1,0);
	ObjRender_SetPosition(obj,x,y,0);	
	Obj_SetRenderPriorityI(obj,90);
	ObjSprite2D_SetSourceRect(obj,0,0,512,64);
	ObjSprite2D_SetDestCenter(obj);
	
	while(!Obj_IsDeleted(obj)) { 
		ObjRender_SetAngleXYZ(obj,flipX,0,0);
		if(flipX > 0) { flipX-=2; } 
		if(!isDialogue) { 
			Obj_Delete(obj);
		}
		yield;
	}
}

// Boss name display
task diagName(type) {
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	let nAlpha = 0;

	ObjPrim_SetTexture(obj,nametext);
	ObjRender_SetBlendType(obj,BLEND_ALPHA);
	ObjRender_SetAlpha(obj,nAlpha);
	ObjRender_SetAngleXYZ(obj,0,0,0);
	ObjRender_SetScaleXYZ(obj,1,1,0);
	ObjRender_SetPosition(obj,430,320,0);	
	Obj_SetRenderPriorityI(obj,90);
	if(type == "pierre") { ObjSprite2D_SetSourceRect(obj,0,0,256,128); }
	if(type == "hina") { ObjSprite2D_SetSourceRect(obj,256,0,512,128); }
	if(type == "tenji") { ObjSprite2D_SetSourceRect(obj,0,128,256,256); }
	if(type == "iku") { ObjSprite2D_SetSourceRect(obj,256,128,512,256); }
	if(type == "dj") { ObjSprite2D_SetSourceRect(obj,0,256,256,384); }
	if(type == "tewi") { ObjSprite2D_SetSourceRect(obj,256,256,512,384); }
	if(type == "border") { ObjSprite2D_SetSourceRect(obj,0,384,256,512); }
	if(type == "magic") { ObjSprite2D_SetSourceRect(obj,256,384,512,512); }	
	if(type == "ifg") { ObjSprite2D_SetSourceRect(obj,0,512,256,640); }	
	ObjSprite2D_SetDestCenter(obj);
	
	loop(60) { nAlpha += 250/60; ObjRender_SetAlpha(obj,nAlpha); yield; } 
	loop(180) { yield; }
	loop(60) { nAlpha -= 250/60; ObjRender_SetAlpha(obj,nAlpha); yield; }
	
	Obj_Delete(obj);
}