#東方弾幕風[Package]
#Title["EXルーミアパッケージ"]
#Text["EXルーミアトパッケージ"]


@Initialize
{
	TTitleScene();
}


@MainLoop
{
	yield;
}

@Finalize
{
}


//----------------------------------------------------
// タイトルシーン
//----------------------------------------------------
task TTitleScene
{
	//タイトルシーン終了フラグ
	let bEndTitleScene = false;

	//タイトルパス設定
	let dir = GetCurrentScriptDirectory();
	let pathTitle = dir ~ "Title.png";

	let objTitleImage = ObjPrim_Create(OBJ_SPRITE_2D); //2Dスプライトオブジェクト生成
	Obj_SetRenderPriorityI(objTitleImage, 20); //描画優先度を設定
	ObjPrim_SetTexture(objTitleImage, pathTitle); //テクスチャを設定
	ObjSprite2D_SetSourceRect(objTitleImage, 0, 0, 640, 480);
	ObjSprite2D_SetDestRect(objTitleImage, 0, 0, 640, 480);

	//タイトル文字列
	let objTitleText = ObjText_Create();
	ObjText_SetText(objTitleText, "パッケージサンプル");
	ObjText_SetFontSize(objTitleText, 40);
	ObjText_SetFontBold(objTitleText, true);
	ObjText_SetFontColorTop(objTitleText, 128, 128, 255);
	ObjText_SetFontColorBottom(objTitleText, 64, 64, 255);
	ObjText_SetFontBorderType(objTitleText, BORDER_FULL);
	ObjText_SetFontBorderColor(objTitleText,255, 255, 255);
	ObjText_SetFontBorderWidth(objTitleText, 2);
	Obj_SetRenderPriorityI(objTitleText, 30);
	ObjRender_SetX(objTitleText, 48);
	ObjRender_SetY(objTitleText, 48);


	//メニュー
	let INDEX_START = 0;
	let INDEX_REPLAY = 1;
	let INDEX_QUIT = 2;
	let selectIndex = 0;//選択位置
	task TMenuItem(let index, let mx, let my, let text)
	{
		function CreateTextObject(let mx, let my, let text)
		{
			let obj = ObjText_Create();
			ObjText_SetText(obj, text);
			ObjText_SetFontSize(obj, 20);
			ObjText_SetFontBold(obj, true);
			ObjText_SetFontColorTop(obj, 128, 128, 255);
			ObjText_SetFontColorBottom(obj, 64, 64, 255);
			ObjText_SetFontBorderType(obj, BORDER_FULL);
			ObjText_SetFontBorderColor(obj,255, 255, 255);
			ObjText_SetFontBorderWidth(obj, 2);
			Obj_SetRenderPriorityI(obj, 30);
			ObjRender_SetX(obj, mx);
			ObjRender_SetY(obj, my);
			return obj;
		}

		let objText = CreateTextObject(mx, my, text);
		let objSelect = CreateTextObject(mx, my, text);
		ObjRender_SetBlendType(objSelect, BLEND_ADD_RGB);
		while(!bEndTitleScene)
		{
			Obj_SetVisible(objSelect, index == selectIndex);
			yield;
		}
		Obj_Delete(objText);
		Obj_Delete(objSelect);
	}

	//メニュー配置
	let mx = 48;
	let my = 360;
	let texts = ["Start", "Replay", "Quit"];
	var countMenu = length(texts);
	ascent(var iText in 0 .. countMenu)
	{
		TMenuItem(iText, mx, my, texts[iText]);
		my += 32;
	}

	//キー状態がリセットされるまで待機
	while(GetVirtualKeyState(VK_OK) != KEY_FREE){yield;}

	//メニュー選択処理
	let frameKeyHold = 0;//キー押しっぱなしフレーム数
	loop
	{
		//決定
		if(GetVirtualKeyState(VK_OK) == KEY_PUSH)
		{
			if(selectIndex == INDEX_START)
			{
				TStageScene("");
			}
			else if(selectIndex == INDEX_REPLAY)
			{
				TReplaySelectScene();
			}
			else if(selectIndex == INDEX_QUIT)
			{
				ClosePackage();
			}
			break;
		}

		//カーソル移動
		if(GetVirtualKeyState(VK_UP) == KEY_PUSH)
		{
			selectIndex--;
		}
		else if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH)
		{
			selectIndex++;
		}
		else if(GetVirtualKeyState(VK_UP) == KEY_HOLD)
		{
			frameKeyHold++;
			if(frameKeyHold == 30 || (frameKeyHold > 30 && (frameKeyHold % 10 == 0)))
			{
				selectIndex--;
			}
		}
		else if(GetVirtualKeyState(VK_DOWN) == KEY_HOLD)
		{
			frameKeyHold++;
			if(frameKeyHold == 30 || (frameKeyHold > 30 && (frameKeyHold % 10 == 0)))
			{
				selectIndex++;
			}
		}
		else
		{
			frameKeyHold = 0;
		}

		if(selectIndex < 0) 
		{
			selectIndex = countMenu - 1;
		}
		else
		{
			selectIndex %= countMenu;
		}

		yield;
	}

	bEndTitleScene = true;
	Obj_Delete(objTitleImage);
	Obj_Delete(objTitleText);
}


//----------------------------------------------------
// ステージシーン
//----------------------------------------------------
task TStageScene(let pathReplay)
{
	let dirCurrent = GetCurrentScriptDirectory();
	let dirModule = GetModuleDirectory();
	let pathMainScript = dirCurrent ~ "ExRumia_Stage.txt";
	let pathPlayer = dirModule ~ "script/player/default_player/Default_Player_Rumia.txt";

	//--------------------------------
	//画面遷移
	RenderSceneToTransitionTexture();
	TTransition();

	//--------------------------------
	//ステージ初期化
	InitializeStageScene();
	if(length(pathReplay) > 0)
	{
		SetStageReplayFile(pathReplay);
	}

	//--------------------------------
	//初期ステージ設定
	let indexStage = 1; //ステージインデックス
	SetStageIndex(indexStage);
	SetStageMainScript(pathMainScript);
	SetStagePlayerScript(pathPlayer);
	StartStageScene();

	//--------------------------------
	//ステージ操作
	loop
	{
		//--------------------------------
		//一時停止チェック
		if(GetVirtualKeyState(VK_PAUSE) == KEY_PUSH)
		{
			let resPause = RunPauseScene();
			alternative(resPause)
			case(RESULT_RETRY)
			{
				//最初からやり直す
				if(!IsReplay())
				{
					//リトライ
					TerminateStageScene();
					TStageScene("");
					return;
				}
			}
			case(RESULT_END)
			{
				//一時停止中の終了
				TerminateStageScene();
			}
		}

		if(!IsReplay() && GetKeyState(KEY_BACK) == KEY_PUSH)
		{
			//リトライ
			TerminateStageScene();
			TStageScene("");
			return;
		}

		//--------------------------------
		//ステージ完了待ち
		let stgSceneState = GetStageSceneState();
		if(stgSceneState == STAGE_STATE_FINISHED)
		{
			//ステージ終了結果を取得
			let stageResult = GetStageSceneResult();
			alternative(stageResult)
			case(STAGE_RESULT_CLEARED)
			{
				//ステージクリア
				if(indexStage == 2)
				{
					//ステージ2をクリアした場合は終了
					TEndScene();
					break;
				}
				else
				{
					//次のステージへ遷移
					indexStage++;
					SetStageIndex(indexStage);
					SetStageMainScript(pathMainScript); //ひとまず同じステージ...
					SetStagePlayerScript(pathPlayer);
					StartStageScene();
					TTransition();
				}
			}
			case(STAGE_RESULT_PLAYER_DOWN)
			{
				//自機残機0
				TEndScene();
				break;
			}
			case(STAGE_RESULT_BREAK_OFF)
			{
				//ステージ途中終了
				//一時停止中の終了
				TTitleScene();
				break;
			}
		}
		yield;
	}	

	TTransition();
}


//----------------------------------------------------
// 終了シーン
//----------------------------------------------------
task TEndScene()
{
	if(IsReplay())
	{
		TTitleScene();
		return;
	}

	//--------------------------------
	//ステージ終了処理
	FinalizeStageScene();

	//--------------------------------
	//終了シーンスクリプト起動
	let dirModule = GetModuleDirectory();
	let pathScript = dirModule ~ "script/default_system/Default_EndScene.txt";
	let idScript = LoadScript(pathScript);
	StartScript(idScript);

	while(!IsCloseScript(idScript))
	{
		yield;
	}

	//--------------------------------
	//終了シーン結果処理
	let result = GetScriptResult(idScript);
	alternative(result)
	case(RESULT_SAVE_REPLAY)
	{
		//リプレイ保存
		TReplaySaveScene();
	}
	case(RESULT_END)
	{
		//再生終了
		TTitleScene();
	}
	case(RESULT_RETRY)
	{
		//リトライ
		TStageScene("");
	}
}

//----------------------------------------------------
// 一時停止シーン
//----------------------------------------------------
function RunPauseScene()
{
	RenderSceneToTransitionTexture();
	PauseStageScene(true);

	let dirModule = GetModuleDirectory();
	let pathScript = dirModule ~ "script/default_system/Default_Pause.txt";

	//--------------------------------
	//一時停止シーンンスクリプト起動
	let idScript = LoadScript(pathScript);
	StartScript(idScript);

	while(!IsCloseScript(idScript))
	{
		yield;
	}

	PauseStageScene(false);

	let res = GetScriptResult(idScript);
	return res;
}


//----------------------------------------------------
// リプレイ選択シーン
//----------------------------------------------------
task TReplaySelectScene()
{
	let dirCurrent = GetCurrentScriptDirectory();
	let pathScript = dirCurrent ~ "ExRumia_Package_ReplaySelectScene.txt";

	//--------------------------------
	//リプレイ選択シーンスクリプト起動
	let idScript = LoadScript(pathScript);
	StartScript(idScript);

	while(!IsCloseScript(idScript))
	{
		yield;
	}

	//--------------------------------
	//リプレイ選択シーン結果処理
	let result = GetScriptResult(idScript);
	if(length(result) == 0)
	{
		//タイトルシーンへ戻る
		TTitleScene();
	}
 	else
 	{
		//リプレイ再生開始
		TStageScene(result);
	}

}


//----------------------------------------------------
// リプレイ保存シーン
//----------------------------------------------------
task TReplaySaveScene()
{
	let dirModule = GetModuleDirectory();
	let pathScript = dirModule ~ "script/default_system/Default_ReplaySaveScene.txt";

	//--------------------------------
	//リプレイ保存シーンスクリプト起動
	let idScript = LoadScript(pathScript);
	StartScript(idScript);

	while(!IsCloseScript(idScript))
	{
		yield;
	}


	//--------------------------------
	//タイトルシーンへ遷移
	TTitleScene();
}


//----------------------------------------------------
// 画面遷移エフェクト
//----------------------------------------------------
function RenderSceneToTransitionTexture()
{
	//現在のシーン内容を画面遷移用テクスチャに描画
	let textureName = GetTransitionRenderTargetName();
	RenderToTextureA1(textureName, 0, 100, true);
}

task TTransition
{
	let textureName = GetTransitionRenderTargetName();

	let objImage = ObjPrim_Create(OBJ_SPRITE_2D); //2Dスプライトオブジェクト生成
	Obj_SetRenderPriorityI(objImage, 100); //描画優先度を設定
	ObjPrim_SetTexture(objImage, textureName); //テクスチャを設定
	ObjSprite2D_SetSourceRect(objImage, 0, 0, 640, 480);
	ObjSprite2D_SetDestRect(objImage, 0, 0, 640, 480);

	let alpha = 255;
	while(alpha > 0)
	{
		ObjRender_SetAlpha(objImage, alpha);
		alpha -= 16;
		yield;
	}
	Obj_Delete(objImage);
}

