/*!

	鮫亀ゲーム部分

*/
#if defined GAMEMAIN_INCLUDED___
  #endinput
#endif
#define GAMEMAIN_INCLUDED___

#include "./common/helper_array.inc"
#include "./common/helper_audio.inc"
#include "./common/helper_2d.inc"
#include "./common/helper_texture.inc"
#include "./common/helper_pad.inc"

#include "./types.inc"
#include "./cursor.inc"
#include "./koma.inc"
#include "./scoreboard.inc"
#include "./dialog.inc"

//////////////////////////////////////////////////////////////////////////////////

static obj:g_MapParent;			//全ての親オブジェクト
static obj:g_BGObject;		//背景

static g_GameLevel, g_KomaID;

//////////////////////////////////////////////////////////////////////////////////
/*!
	ゲームの初期化処理
*/
GameInitialize(const game_level, const koma_id) {

	new tmp_path[128];
	g_GameLevel = game_level;
	g_KomaID = koma_id;

	SafeDestroyObject(g_MapParent);
	g_MapParent = CreateNull(Disp2D());
	SetPos(g_MapParent, MAP_LEFT, MAP_TOP, 1.0);

	CursorCreate(game_level, g_MapParent);

	{

		SafeDestroyObject(g_BGObject);
//		new tmp_path[128];

		domGetData(GetChildTag("KOMA", "koma_data", koma_id), "bg_path", tmp_path);

		g_BGObject = CreateCharacterObject(
							320.0, 224.0,
							640.0, 448.0,
							TextureLoad(tmp_path, false), _,
							ZSORT_NORMAL, 3.0);

		ScoreBoardCreate(g_BGObject);
		ScoreClear();
		SetGetScore(0);
		SetLeft(KOMA_LENGTH[game_level] * KOMA_LENGTH[game_level]);

	}
	KomaInitialize(game_level, koma_id, g_MapParent);

}

//////////////////////////////////////////////////////////////////////////////////
/*!
	ゲームの終了処理
*/
GameUnInitialize() {

	KomaUnInitialize();
	SafeDestroyObject(g_MapParent);

//	KomaObjectDestroyAll();
//	KomaTextureDestroyAll();
	CursorDestroy();

	SafeDestroyObject(g_BGObject);
	ScoreBoardDestroy();
}

//////////////////////////////////////////////////////////////////////////////////
/*!
	コマの再配置
*/
GameKomaReload(const bool:retry = false) {

	ScoreClear();
	SetGetScore(0);
	SetLeft(KOMA_LENGTH[g_GameLevel] * KOMA_LENGTH[g_GameLevel]);

	KomaObjectDestroyAll();
	CursorDestroy();

	CursorCreate(g_GameLevel, g_MapParent);
	CursorDraw();
	CursorShow();

	KomaInitialize(g_GameLevel, g_KomaID, g_MapParent, retry);
	KomaDraw();
	KomaShowAll();

	new x,y;
	GetCursorPos(x, y);
	SetGetScore(KomaScoreCalc(x, y));

}

/*!
	ゲーム画面の表示/非表示
*/
stock GameShow() {
	ShowChildren(g_MapParent);
	Show(g_BGObject);
	ShowChildren(g_BGObject);
}
stock GameHide() {
	HideChildren(g_MapParent);
	Hide(g_BGObject);
	HideChildren(g_BGObject);
}
//////////////////////////////////////////////////////////////////////////////////
/*!
	ゲームの曲の読み込み
*/
GameBGMLoad(koma_id) {

	new tmp_path[128];

	domGetData(GetChildTag("KOMA", "koma_data", koma_id), "bgm_id", tmp_path);
	BGMAsyncLoad(atoi(tmp_path));
}
//////////////////////////////////////////////////////////////////////////////////
/*!
	ゲームのメイン処理
*/
GameMain() {

	//初期のコマ表示
	new result = GAMERESULT_CLEAR;

//	GameKomaReload();

//	new tmp_path[128];
//	domGetData(GetChildTag("KOMA", "koma_data", g_KomaID), "bgm_id", tmp_path);
//	BGMLoad(atoi(tmp_path));
	BGMAnsyncWait();
	BGMPlay();

	new x, y;

	for (;;) {
		UpdatePadState();

		//スタートボタンで脱出
		if (GetPressStartButtonState()) {
			SEPlay(SE_OK_ACTION);

			switch (GameMenuDialog()) {
				case 1: GameKomaReload();
				case 2: {
					result = GAMERESULT_EXIT;
					break;
				}
			}
		}

		if (IsDirectionButtonsState()) {
			if (GetUpState()) {
				CursorMoveUp();
			}
			if (GetDownState()) {
				CursorMoveDown();
			}
			if (GetLeftState()) {
				CursorMoveLeft();
			}
			if (GetRightState()) {
				CursorMoveRight();
			}
			//駒の選択をキャンセルする。
			KomaSelectCancel();

			//駒を消したときのスコアを計算する。
			GetCursorPos(x, y);
			SetGetScore(KomaScoreCalc(x, y));

		} else {
			if (GetPressL1ButtonState() || GetPressR1ButtonState()) {
//			if (GetL1ButtonState() || GetR1ButtonState()) {
				GameKomaReload();
			} else {

				if (GetPressDownButtonState()) {
					//駒の選択をキャンセルする
					KomaSelectCancel();
				} else {
					if (GetPressRightButtonState()) {
						//駒を選択する。
						if (IsKomaSelectEnable()) {
							CursorSelectAnimation();
						}

						KomaSelect();

						GetCursorPos(x, y);
						SetGetScore(KomaScoreCalc(x, y));

						new check_result = KomaCheckEnd();
						if (check_result == ENDCHECK_CLEAR) {
							result = GAMERESULT_CLEAR;
							break;
						}
						if (check_result == ENDCHECK_NOGET) {
							result = GAMERESULT_GIVEUP;
							break;
						}
						if (check_result == ENDCHECK_CONTINUE) {
							//なんもしなくていいか…。
						}
					}
				}
			}
		}
		KomaSelectAnimation();

		sleep;
	}
	BGMStop();

	return result;
}