#include "./../common.txt"

let dirCurrent = GetCurrentScriptDirectory();

@Initialize
{
//	InitFrame();
	T_HiScore();
	T_Score();
	T_Graze();
	T_BossLife();
	T_BossTimer();
	T_GrazeBonus();
	T_PlayerLife();
	T_PlayerSpell();
}

@MainLoop
{
	yield;
}

@Event
{
	alternative(GetEventType())
//	case(EV_START_BOSS_SPELL){
//	}
	case(EV_GAIN_SPELL)
	{
		T_GainSpell(GetCommonData(SPELL_CARD_BONUS,10));
	}
}

task T_GrazeBonus
{
	let oldGraze = GetGraze;
	loop
	{
		if(oldGraze < GetGraze)
		{
			AddScore(-1*(GetGraze-oldGraze)*100);
			oldGraze = GetGraze;
		}
		yield;
	}
}

/*
task InitFrame()
{
	SetStgFrame(22,6,426,474,20,80);
	
	let path = GetCurrentScriptDirectory() ~ "./../../img/Default_SystemBackground.png";
	let obj = ObjPrim_Create(OBJ_SPRITE_2D);
	ObjPrim_SetTexture(obj, path);
	Obj_SetRenderPriority(obj, 0);
	ObjSprite2D_SetSourceRect(obj, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
	ObjSprite2D_SetDestRect(obj, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
	
	path = GetCurrentScriptDirectory() ~ "./../img/frame.png";
	obj = ObjPrim_Create(OBJ_SPRITE_2D);
	ObjPrim_SetTexture(obj, path);
	Obj_SetRenderPriorityI(obj, 22);
	ObjSprite2D_SetSourceRect(obj, 0, 0, 404, 468);
	ObjSprite2D_SetDestRect(obj, 0, 0, 404, 468);
	
	yield;
}
*/

task T_HiScore()
{
	let objScore = ObjText_Create();
	ObjText_SetText(objScore, "High Score");
	ObjText_SetFontSize(objScore, 12);
	ObjText_SetFontBold(objScore, true);
	ObjText_SetFontColorTop(objScore, 255, 255, 255);
	ObjText_SetFontColorBottom(objScore, 255, 255, 255);
	ObjText_SetFontBorderType(objScore, BORDER_NONE);
	ObjText_SetFontBorderColor(objScore,128, 128, 128);
	ObjText_SetFontBorderWidth(objScore, 0);
	Obj_SetRenderPriority(objScore, 1);
	ObjRender_SetX(objScore, 428);
	ObjRender_SetY(objScore, 4);
	
	let pathDigit = GetCurrentScriptDirectory() ~ "./../../img/Default_SystemDigit.png";
	let count = 10;
	
	let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	ObjPrim_SetTexture(obj, pathDigit);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj, 1);
	ObjRender_SetY(obj, 16);
	
	let score2 = 0;
	if(GetAreaCommonData(CONFIG,CNF_CHARACTER,0) == 0)
	{
		score2 = GetAreaCommonData(SPELL_RECORD,REIMU_A_SCORE,[])[GetCommonData(SPELL_NUMBER,9)];
	}
	else if(GetAreaCommonData(CONFIG,CNF_CHARACTER,0) == 1)
	{
		score2 = GetAreaCommonData(SPELL_RECORD,REIMU_B_SCORE,[])[GetCommonData(SPELL_NUMBER,9)];
	}
	while(true)
	{
		
		let score = GetScore();
		if(score < 0){	score = 0;	}
		score = max(score,score2);
		let listNum = DigitToArray(score, count);
		
		ObjSpriteList2D_ClearVertexCount(obj);
		ascent(iObj in 0 .. count)
		{
			let num = listNum[iObj];
			ObjRender_SetX(obj, 428 + iObj * 8);
			ObjSpriteList2D_SetSourceRect(obj, num * 36, 0, (num + 1) * 36, 32);
			ObjSpriteList2D_SetDestRect(obj, 0, 0, 8, 16);
			if(num!=0 || iObj==9 || score>=10^(10-iObj))
			{
				ObjSpriteList2D_AddVertex(obj);
			}
/*			if(iObj < 1)
			{
				ObjRender_SetColor(obj,150,255,150);
			}
			else if(iObj < 5)
			{
				ObjRender_SetColor(obj,255,255,150);
			}
			else
			{*/
				ObjRender_SetColor(obj,255,255,255);
//			}
		}
		yield;
	}
}

task T_Score()
{
	let objScore = ObjText_Create();
	ObjText_SetText(objScore, "Score");
	ObjText_SetFontSize(objScore, 12);
	ObjText_SetFontBold(objScore, true);
	ObjText_SetFontColorTop(objScore, 255, 255, 255);
	ObjText_SetFontColorBottom(objScore, 255, 255, 255);
	ObjText_SetFontBorderType(objScore, BORDER_NONE);
	ObjText_SetFontBorderColor(objScore,128, 128, 128);
	ObjText_SetFontBorderWidth(objScore, 0);
	Obj_SetRenderPriority(objScore, 1);
	ObjRender_SetX(objScore, 428);
	ObjRender_SetY(objScore, 28);

	let pathDigit = GetCurrentScriptDirectory() ~ "./../../img/Default_SystemDigit.png";
	let count = 10;

	let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	ObjPrim_SetTexture(obj, pathDigit);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj, 1);
	ObjRender_SetY(obj, 40);

	while(true)
	{
		let score = GetScore();
		if(score < 0){	score = 0;	}
		score = min(score, 999999999999);
		let listNum = DigitToArray(score, count);

		ObjSpriteList2D_ClearVertexCount(obj);
		ascent(iObj in 0 .. count)
		{
			let num = listNum[iObj];
			ObjRender_SetX(obj, 428 + iObj * 8);
			ObjSpriteList2D_SetSourceRect(obj, num * 36, 0, (num + 1) * 36, 32);
			ObjSpriteList2D_SetDestRect(obj, 0, 0, 8, 16);
			if(num!=0 || iObj==9 || score>=10^(10-iObj))
			{
				ObjSpriteList2D_AddVertex(obj);
			}
//			if(iObj<1){ObjRender_SetColor(obj,150,255,150);}
//			else if(iObj<5){ObjRender_SetColor(obj,255,255,150);}
//			else{
			ObjRender_SetColor(obj,255,255,255);
//			}
		}
		yield;
	}
}

task T_Graze()
{
	let objGraze = ObjText_Create();
	ObjText_SetText(objGraze, "Graze");
	ObjText_SetFontSize(objGraze, 12);
	ObjText_SetFontBold(objGraze, true);
	ObjText_SetFontColorTop(objGraze, 255, 255, 255);
	ObjText_SetFontColorBottom(objGraze, 255, 255, 255);
	ObjText_SetFontBorderType(objGraze, BORDER_NONE);
	ObjText_SetFontBorderColor(objGraze,128, 128, 128);
	ObjText_SetFontBorderWidth(objGraze, 0);
	Obj_SetRenderPriority(objGraze, 1);
	ObjRender_SetX(objGraze, 544);
	ObjRender_SetY(objGraze, 4);

	let pathDigit = GetCurrentScriptDirectory() ~ "./../../img/Default_SystemDigit.png";
	let count = 10;

	let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	ObjPrim_SetTexture(obj, pathDigit);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj, 1);
	ObjRender_SetY(obj, 16);

	while(true)
	{
		let graze = GetGraze();
		graze = min(graze, 99999);
		let listNum = DigitToArray(graze, count);

		ObjSpriteList2D_ClearVertexCount(obj);
		ascent(iObj in 0 .. count)
		{
			let num = listNum[iObj];
			ObjRender_SetX(obj, 544 + iObj * 8);
			ObjSpriteList2D_SetSourceRect(obj, num * 36, 0, (num + 1) * 36, 32);
			ObjSpriteList2D_SetDestRect(obj, 0, 0, 8, 16);
			if(num!=0 || iObj==9 || graze>=10^(10-iObj))
			{
				ObjSpriteList2D_AddVertex(obj);
			}
//			if(iObj<1){ObjRender_SetColor(obj,150,255,150);}
//			else if(iObj<5){ObjRender_SetColor(obj,255,255,150);}
//			else{
			ObjRender_SetColor(obj,255,255,255);
//			}
		}
		yield;
	}
}

task T_BossLife
{
	let path = GetCurrentScriptDirectory() ~ "./../../img/Default_System.png";
	let path2 = GetCurrentScriptDirectory() ~ "./../../img/Default_SystemDigit.png";
	let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	let objNum = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	ObjPrim_SetTexture(obj, path);
	ObjPrim_SetTexture(objNum, path2);
	Obj_SetRenderPriority(obj, 0.7);
	Obj_SetRenderPriority(objNum, 0.7);
	
	let lastRemStep = -1;
	let lifeRateRender = 0;
	
	let objScene = ID_INVALID;
	loop
	{
		objScene = GetEnemyBossSceneObjectID();
		ObjSpriteList2D_ClearVertexCount(obj);
		ObjSpriteList2D_ClearVertexCount(objNum);
		if(objScene != ID_INVALID)
		{
			RenderLife();
		}
		yield;
	}
	
	function RenderLife()
	{
		//cXebv
		let countRemStep = ObjEnemyBossScene_GetInfo(objScene, INFO_REMAIN_STEP_COUNT);
		if(lastRemStep != countRemStep)
		{
			//Xebvω
			lifeRateRender = 0;
		}
		
		//Ct\
		let lifeTotalMax = ObjEnemyBossScene_GetInfo(objScene, INFO_ACTIVE_STEP_TOTAL_MAX_LIFE);
		let lifeTotal = ObjEnemyBossScene_GetInfo(objScene, INFO_ACTIVE_STEP_TOTAL_LIFE);
		let lifeRate = min(lifeTotal / lifeTotalMax, lifeRateRender);
		RenderLifeNum();
		ObjSpriteList2D_SetSourceRect(obj, 1, 1, 127, 11);
		ObjSpriteList2D_SetDestRect(obj, 72, 32, 72 + 270 * lifeRate, 36);
		ObjSpriteList2D_AddVertex(obj);
		
		//Ct̋؂\
		ObjSpriteList2D_SetSourceRect(obj, 132, 1, 137, 11);
		let listLifeDiv = [0] ~ ObjEnemyBossScene_GetInfo(objScene, INFO_ACTIVE_STEP_LIFE_RATE_LIST);
		ascent(iDiv in 0 .. length(listLifeDiv))
		{
			let rate = listLifeDiv[iDiv];
			let x = 72 + 270 * (1-rate);
			ObjSpriteList2D_SetDestRect(obj, x-1, 28, x + 1, 38);
			ObjSpriteList2D_AddVertex(obj);
		}
		
		//cXebv\
//		ObjSpriteList2D_SetSourceRect(obj, 1, 28, 127, 38);
		ObjSpriteList2D_SetSourceRect(obj, 1, 1, 127, 11);
		ascent(iStep in 0 .. countRemStep)
		{
			let remStepRate = 58 / countRemStep;
			ObjSpriteList2D_SetDestRect(obj, 4 + iStep * remStepRate + 2, 32,
				4 + (iStep + 1) * remStepRate, 36);
			ObjSpriteList2D_AddVertex(obj);
		}
		
		lifeRateRender += 0.01;
		lifeRateRender = min(lifeRateRender, 1);
		lastRemStep = countRemStep;
		
		function RenderLifeNum(){
			let point = max(lifeTotal, 0);
			let count = max(truncate(log10(point))+1, 1);
			let listNum = DigitToArray(point, count);
			let point2 = max(lifeTotalMax, 0);
			let count2 = max(truncate(log10(point2))+1, 1);
			let listNum2 = DigitToArray(point2, count2);
			ObjRender_SetY(objNum, 20);
			ascent(iObj in 0 .. count){
				let num = listNum[iObj];
				ObjRender_SetX(objNum, 106 - count*8 + iObj * 8);
				ObjSpriteList2D_SetSourceRect(objNum, num*36, 0, (1+num)*36, 32);
				ObjSpriteList2D_SetDestRect(objNum, -4, -8, 4, 8);
				ObjSpriteList2D_AddVertex(objNum);
			}
			ObjRender_SetX(objNum, 106);
			ObjSpriteList2D_SetSourceRect(objNum, 360, 0, 396, 32);
			ObjSpriteList2D_SetDestRect(objNum, -4, -8, 4, 8);
			ObjSpriteList2D_AddVertex(objNum);
			ascent(iObj in 0 .. count2){
				let num = listNum2[iObj];
				ObjRender_SetX(objNum, 106 + 8 + iObj * 8);
				ObjSpriteList2D_SetSourceRect(objNum, num*36, 0, (1+num)*36, 32);
				ObjSpriteList2D_SetDestRect(objNum, -4, -8, 4, 8);
				ObjSpriteList2D_AddVertex(objNum);
			}
		}
	}
}

task T_BossTimer
{
	let pathDigit = GetCurrentScriptDirectory() ~ "./../../img/Default_SystemDigit.png";

	let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	ObjPrim_SetTexture(obj, pathDigit);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj, 1);
	ObjRender_SetY(obj, 20);
	let count = 2;

	let objScene = ID_INVALID;
	loop
	{
		objScene = GetEnemyBossSceneObjectID();
		ObjSpriteList2D_ClearVertexCount(obj);
		if(objScene != ID_INVALID)
		{
			RenderTimer();
		}
		yield;
	}

	function RenderTimer()
	{
		let timer = ObjEnemyBossScene_GetInfo(objScene, INFO_TIMER);
		timer = min(timer, 99);
		let listNum = DigitToArray(timer, count);

		ObjSpriteList2D_ClearVertexCount(obj);
		ascent(iObj in 0 .. count)
		{
			let num = listNum[iObj];
			ObjRender_SetX(obj, 377 + iObj * 14);
			ObjSpriteList2D_SetSourceRect(obj, num * 36, 0, (num + 1) * 36, 32);
			ObjSpriteList2D_SetDestRect(obj, 0, 0, 16, 24);
			ObjSpriteList2D_AddVertex(obj);
		}
	}
}

task T_GainSpell(score)
{
	LoadSound(GetCurrentScriptDirectory ~ "../../se/seGetSpellCardBonus.wav");
	PlaySE(GetCurrentScriptDirectory ~ "../../se/seGetSpellCardBonus.wav");
	
	let objText = ObjText_Create();
	ObjText_SetText(objText, "Spell Card Bonus!");
	ObjText_SetFontSize(objText, 32);
	ObjText_SetFontBold(objText, true);
	ObjText_SetFontColorTop(objText, 255, 255, 255);
	ObjText_SetFontColorBottom(objText, 128, 128, 255);
	ObjText_SetFontBorderType(objText, BORDER_FULL);
	ObjText_SetFontBorderColor(objText,255, 255, 255);
	ObjText_SetFontBorderWidth(objText, 1);
	Obj_SetRenderPriority(objText, 2);
	ObjRender_SetX(objText, 200);
	ObjRender_SetY(objText, 98);

	let strScore = "+" ~ IntToString(score);
	let objScore = ObjText_Create();
	ObjText_SetText(objScore, strScore);
	ObjText_SetFontSize(objScore, 32);
	ObjText_SetFontBold(objScore, true);
	ObjText_SetFontColorTop(objScore, 255, 255, 255);
	ObjText_SetFontColorBottom(objScore, 255, 128, 128);
	ObjText_SetFontBorderType(objScore, BORDER_FULL);
	ObjText_SetFontBorderColor(objScore,255, 255, 255);
	ObjText_SetFontBorderWidth(objScore, 1);
	Obj_SetRenderPriority(objScore, 2);
	ObjRender_SetX(objScore, 200);
	ObjRender_SetY(objScore, 140);

	AddScore(score);
	
	loop(120)
	{
		yield;
	}
	Obj_Delete(objText);
	Obj_Delete(objScore);
}

//----------------------------------------------------
//c@\
//----------------------------------------------------
task T_PlayerLife
{
	//life
	let objText = ObjText_Create();
	ObjText_SetText(objText, "Player");
	ObjText_SetFontSize(objText, 12);
	ObjText_SetFontBold(objText, true);
	ObjText_SetFontColorTop(objText, 255, 255, 255);
	ObjText_SetFontColorBottom(objText, 255, 96, 96);
	ObjText_SetFontBorderType(objText, BORDER_NONE);
	ObjText_SetFontBorderColor(objText,255, 96, 96);
	ObjText_SetFontBorderWidth(objText, 2);
	Obj_SetRenderPriority(objText, 1);
	ObjRender_SetX(objText, 12);
	ObjRender_SetY(objText, GetScreenHeight()-32);

	//c@
	let pathDigit = GetCurrentScriptDirectory() ~ "./../../img/Default_SystemDigit.png";
	let count = 2;

	let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	ObjPrim_SetTexture(obj, pathDigit);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj, 1);
	ObjRender_SetY(obj, GetScreenHeight()-20);

	while(true)
	{
		let point = GetPlayerLife();
		point = min(point, 99);
		point = max(point, 0);
		let listNum = DigitToArray(point, count);

		ObjSpriteList2D_ClearVertexCount(obj);
		ascent(iObj in 0 .. count)
		{
			let num = listNum[iObj];
			ObjRender_SetX(obj, 12 + iObj * 8);
			ObjSpriteList2D_SetSourceRect(obj, num * 36, 0, (num + 1) * 36, 32);
			ObjSpriteList2D_SetDestRect(obj, 0, 0, 8, 16);
			ObjSpriteList2D_AddVertex(obj);
		}
		yield;
	}
}

//----------------------------------------------------
//cXy\
//----------------------------------------------------
task T_PlayerSpell
{
	//Spell
	let objText = ObjText_Create();
	ObjText_SetText(objText, "Spell");
	ObjText_SetFontSize(objText, 12);
	ObjText_SetFontBold(objText, true);
	ObjText_SetFontColorTop(objText, 255, 255, 255);
	ObjText_SetFontColorBottom(objText, 96, 255, 96);
	ObjText_SetFontBorderType(objText, BORDER_NONE);
	ObjText_SetFontBorderColor(objText,96, 255, 96);
	ObjText_SetFontBorderWidth(objText, 2);
	Obj_SetRenderPriority(objText, 1);
	ObjRender_SetX(objText, 80);
	ObjRender_SetY(objText, GetScreenHeight()-32);

	//Xy
	let pathDigit = GetCurrentScriptDirectory() ~ "./../../img/Default_SystemDigit.png";
	let count = 2;

	let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
	ObjPrim_SetTexture(obj, pathDigit);
	ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
	Obj_SetRenderPriority(obj, 1);
	ObjRender_SetY(obj, GetScreenHeight()-20);

	while(true)
	{
		let point = GetPlayerSpell();
		point = min(point, 99);
		let listNum = DigitToArray(point, count);

		ObjSpriteList2D_ClearVertexCount(obj);
		ascent(iObj in 0 .. count)
		{
			let num = listNum[iObj];
			ObjRender_SetX(obj, 80 + iObj * 8);
			ObjSpriteList2D_SetSourceRect(obj, num * 36, 0, (num + 1) * 36, 32);
			ObjSpriteList2D_SetDestRect(obj, 0, 0, 8, 16);
			ObjSpriteList2D_AddVertex(obj);
		}
		yield;
	}
}

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