//**************************************************************
//
//						pause.c
//
//**************************************************************
#include	<Agb.h>
#include	"../define.h"
#include	"../m4aLib.h"

#define		GLOBAL_VALUE_DEFINE
#include	"pause.h"
#undef		GLOBAL_VALUE_DEFINE

#include	"../global.h"
#include	"../sub.h"
#include	"../data.h"

#include	"Opause.h"


//--------------------------------------------------------------
//		データ
//--------------------------------------------------------------
// 各パーツの位置データ

const int PAUSE_CUR_POS_X[5] = {8, 88, 168, 68, 132};	// ボタンの位置
const int PAUSE_CUR_POS_Y[5] = {20, 20, 20, 121, 121};

const int PAUSE_HOSEKI_X[2] = {40, 104};
#define	PAUSE_HOSEKI_Y		88

const int PAUSE_KAGI_X[2] = {104, 168};
#define	PAUSE_KAGI_Y		96

#define	PAUSE_DISK_X		200
#define	PAUSE_DISK_Y		88

#define	PAUSE_WAIT_TIME		30

#define	PAUSE_WINDOW_SPEED	17

enum
{
	PAUSE_INIT, PAUSE_FIN, PAUSE_WINDOW_OPEN, PAUSE_MAIN, PAUSE_WAIT, PAUSE_WINDOW_CLOSE, PAUSE_FOUT, PAUSE_KAKUNIN
	//初期化1、フェイドイン、メイン
};

// カーソルの状態
enum
{
	PAUSE_RETURN, PAUSE_SAVE, PAUSE_RETIRE, PAUSE_NO, PAUSE_YES
};

// カケラ
static const int pause_Kakera_Anm[2][4] = {
		{(int)pause_Anm_03, (int)pause_Anm_04, (int)pause_Anm_05, (int)pause_Anm_02},		// この面でとったばかり
		{(int)pause_Anm_07, (int)pause_Anm_08, (int)pause_Anm_09, (int)pause_Anm_06},		// 確定済み
};

// 確定済みの上でキラリと光る
static const int pause_Get_Hikari[4] = {
	(int)pause_Anm_0c, (int)pause_Anm_0d, (int)pause_Anm_0e, (int)pause_Anm_0b
};

// 確認メッセージ
static const int pause_kakunin_Anm[2][2] = {
	{(int)pause_Anm_15, (int)pause_Anm_16},		// 英語
	{(int)pause_Anm_13, (int)pause_Anm_14}		// 日本語
};


// メッセージ表示用
extern const int	smap_Mes_j[6][6];
extern const int	smap_Mes_e[6][6];


// セットするレコード(ゲーム中に流す曲）
const int SET_RECORD_IN_GAME[17] ={
	M_BGM_CD_00, 
	M_BGM_CD_11, M_BGM_CD_12, M_BGM_CD_13, M_BGM_CD_14,
	M_BGM_CD_21, M_BGM_CD_22, M_BGM_CD_23, M_BGM_CD_24,
	M_BGM_CD_31, M_BGM_CD_32, M_BGM_CD_33, M_BGM_CD_34,
	M_BGM_CD_41, M_BGM_CD_42, M_BGM_CD_43, M_BGM_CD_44,
};	


//--------------------------------------------------------------
//		変数
//--------------------------------------------------------------

static AnmDef	*PauseCurAnmPtr;

typedef struct
{
	u16	usAnmTimer;
	u16	usAnmPat;
	u8	ucStatus;	// どのボタンか
	u8	ucStatusBak;
}PauseCurDef;

static PauseCurDef	PauseCur;


typedef struct
{
	u16	usAnmTimer;
	u16	usAnmPat;
}PauseObjDef;

static PauseObjDef	PauseHikari[4];
static PauseObjDef	PauseDisk;
static PauseObjDef	PauseKagi;

static u8	ucPauseKakeraStatus[4];		// 0は未ゲット、1はこの面でとったばかり、2は確定済み
static u8	ucPauseHosekiFlg;			// 1なら宝石がそろっている


//--------------------------------------------------------------
//		外部関数
//--------------------------------------------------------------
// カラーフェイド関連
extern void FadeColor_InitSet_All(void);
extern int GateFade_Color(u8 io , u8 who);
extern void FadeColor_DMA(void);				//SW=Fade.ucDMAf

// 文字表示用(shop.cにある)
#if CHINA
extern void MojiCreate_ZH(u8 *ptr, u32 VramAddr,u8* bgChar, u8 MojiNum);	// 使用する文章データ、転送先のアドレス、表示する文字数
extern const u8 font_Char[];
#else
extern void MojiCreate(u8 *ptr, u32 VramAddr, u8 MojiNum);	// 使用する文章データ、転送先のアドレス、表示する文字数
#endif
extern u16	usMojiCount;

extern u8	ucSelWorldKind;

// スコアセット
extern void SelCoinSet(int score, u32 CharAddr, u32 VramAddr);
extern void SelCoinSet2(int score, u32 CharAddr, u32 VramAddr);

// シーケンス用
extern u8	ucSeldemoSeq;
extern u16	usSeldemoCount;

// ウインドウ用
extern s16	sDmapWindowUpY;
extern s16	sDmapWindowDownY;


//--------------------------------------------------------------
//		Local関数
//--------------------------------------------------------------
static void	PauseVblkSet(void);
static void	PauseVblkIntr0(void);
static void	PauseInit(void);
static void	PauseOamCreate(void);
static int	PauseKey(void);
static void PauseMove(void);
static int PauseKakunin(void);

static int PauseWindowOpen(void);
static int PauseWindowClose(void);

//==============================================================
//		メインルーチン
//==============================================================
int GamePause()
{
	int a, c;

//VBLKのセット
	PauseVblkSet();

	ucCntObj = 0;
	a = 0;
	c = 0;

	switch(sSelSeq)
	{
		//初期化
		case PAUSE_INIT:
			PauseInit();
			sSelSeq++;
			break;

		case PAUSE_FIN:
			FadeColor_DMA();			//SW=Fade.ucDMAf
			if(GateFade_Color(0,1))
			{
				sSelSeq++;
			}
			break;

		case PAUSE_WINDOW_OPEN:
			if(PauseWindowOpen())
			{
				sSelSeq++;
			}
			break;

		case PAUSE_MAIN:
			if(PauseKey())
			{
				sSelSeq++;
			}
			break;

		case PAUSE_WAIT:
			usSeldemoCount++;
			if(usSeldemoCount>PAUSE_WAIT_TIME)
			{
				usSeldemoCount++;
				sSelSeq++;
			}
			break;

		case PAUSE_WINDOW_CLOSE:
			if(PauseWindowClose())
			{
				sSelSeq++;
			}
			break;

		case PAUSE_FOUT:
			FadeColor_DMA();			//SW=Fade.ucDMAf
			if(GateFade_Color(1,1))
			{
				*(vu16*)REG_WINOUT = WIN_ALL_ON;//ウインドウ外側表示
			//	m4aMPlayAllStop();
				sSelSeq = 0;
				// サウンド再開
				if(PauseCur.ucStatusBak == PAUSE_RETURN)
				{
					m4aMPlayContinue(mplay_table[3].ma);
					m4aMPlayContinue(mplay_table[4].ma);
					m4aMPlayContinue(mplay_table[5].ma);
					m4aMPlayContinue(mplay_table[6].ma);
				}

				a = 1;
			}
			break;
		
		case PAUSE_KAKUNIN:
			c = PauseKakunin();
			if(c==1)		// 実行する
			{
				sSelSeq = PAUSE_WAIT;
//			 	Fade.ucKind = GFADE_BLACK_COL;	// 黒フェイドアウト
				(int)PauseCurAnmPtr = (int)pause_Anm_10;
				PauseCur.usAnmPat = 0;
				PauseCur.usAnmTimer = 0;
				if(PauseCur.ucStatusBak == PAUSE_SAVE)
				{
					cPauseFlag = 3;		// セーブ
					sMainSeq++;			// 選択決定後、中断をSAVEしてからポーズへ自動復帰(尾崎)
				}
				if(PauseCur.ucStatusBak == PAUSE_RETIRE)	cPauseFlag = 2;		// リタイア
			} else if(c==2)		// もどる
			{
				PauseCur.ucStatus = PauseCur.ucStatusBak;
				sSelSeq = PAUSE_MAIN;
			}
			break;
	}

	PauseOamCreate();
	ClearOamBuf();
	
	return a;
}


//==============================================================
//		Ｖブランク関数
//==============================================================
static void PauseVblkSet(void)
{
	switch(sSelSeq)
	{
		default:
			SetVblkFunc(PauseVblkIntr0);
			break;
	}
}


//--------------------------------------------------------------
//				Ｖブランク
//--------------------------------------------------------------
static void PauseVblkIntr0(void)
{
	m4aSoundVSync();
//OAMを転送
	DmaCopy(3, OamBuf, OAM, 8*128, 32);

	*(vu16*)REG_WIN0V = (sDmapWindowUpY<<8)|(sDmapWindowDownY);	// ウィンドウ０の上、下座標
	*(vu16*)REG_WIN0H = (0<<8)|(240);	// ウィンドウ０の左、右座標
	
	switch(ucLanguage)
	{
		case ENGLISH_MODE:	// 英語
#if CHINA
			MojiCreate_ZH((u8*)smap_Mes_e[ucWorldNum][ucStageNum], 0x7800,font_Char, 13);	// English
#else
			MojiCreate((u8*)smap_Mes_e[ucWorldNum][ucStageNum], 0x7800, 26);	// English
#endif
			break;
			
		case JAPANESE_MODE:	// 日本語
			MojiCreate((u8*)smap_Mes_j[ucWorldNum][ucStageNum], 0x7800, 26);	// 日本語
			break;
	}
}

//==============================================================
//		初期設定
//==============================================================
static void PauseInit(void)
{
	int i,j;
	
	*(vu16*)REG_IE ^= V_BLANK_INTR_FLAG;		//Vﾌﾞﾗﾝｸ割込不許可
//	*(vu16*)REG_DISPCNT = DISP_LCDC_OFF;		//LCDC OFF

	Hblk_STAT_IE_Off;

//	*(vu16*)REG_BLDY = 15;

//	*(vu16*)REG_BLDCNT = BLD_DOWN_MODE	//輝度DOWN
//		| BLD_2ND_ALL | BLD_1ST_ALL;

//	ClearGraphicRam();


// ワールドの種類
	if(ucWorldNum == TUTORIAL || ucWorldNum == WORLD_BOSS)
	{
		ucSelWorldKind = 1;
	} else
	{
		ucSelWorldKind = 0;
	}

	// 待避したパレットを復元
	DmaCopy(3, EXOBJCOL_BUF, OBJ_PLTT, 512, 16);
	DmaWait(3);
	DmaCopy(3, EXOBJCOL_BUF, BG_PLTT, 512, 16);
	DmaWait(3);
	
	DmaCopy(3, pause_Palette, BG_PLTT, sizeof(pause_Palette), 16);
	DmaWait(3);
	DmaCopy(3, pause_Palette+0x80, OBJ_PLTT+0x100, 0x100, 16);
	DmaWait(3);
	
	/*---------------------BGデータ転送--------------------------*/
	DmaCopy(3, pause_bg_Char, BG_VRAM, sizeof(pause_bg_Char), 16);
	DmaWait(3);

	/*---------------------OBJデータ転送--------------------------*/
	DmaCopy(3, pause_obj_Char, OBJ_MODE0_VRAM+0x2400, sizeof(pause_obj_Char), 16);
	DmaWait(3);

	/*---------------------スクリーンデータ転送--------------------------*/
	if(ucLanguage == ENGLISH_MODE)
	{
		DmaCopy(3, pause00_Screen, BG_VRAM+0xc000, 0x800, 16);	// テキスト
	} else
	{
		DmaCopy(3, pause00j_Screen, BG_VRAM+0xc000, 0x800, 16);	// テキスト
	}
	DmaWait(3);
	DmaCopy(3, pause01_Screen, BG_VRAM+0xd000, 0x800, 16);	// 囲み
	DmaWait(3);
	if(ucSelWorldKind)
	{
		DmaCopy(3, pause02_Screen, BG_VRAM+0xe000, 0x800, 16);	// 壁
	} else
	{
		DmaCopy(3, pause03_Screen, BG_VRAM+0xe000, 0x800, 16);	// 壁
	}
	DmaWait(3);

	/*---------------------パレット追加転送--------------------------*/
	if(!ucSelWorldKind)
	{
		// CDのパレット
		DmaCopy(3, pause_cd_Palette+0x20*(ucWorldNum-1), OBJ_PLTT, 0x40, 16);
	}
	// 宝石のパレット
	DmaCopy(3, pause_jewel_Palette+0x20*ucWorldNum, OBJ_PLTT+0x40, 0x40, 16);
	DmaWait(3);
	// 壁のパレット
	DmaCopy(3, pause_wall_Palette+0x10*ucWorldNum, BG_PLTT+0x160, 0x20, 16);

	*(vu16*)BG_PLTT = 0;		// 抜きの色を黒にする


	/*---------------------各BGをセット--------------------------*/
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0	// テキストなど
		| (24 << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_1	// 囲み
		| (26 << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_2	// 壁
		| (28 << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);


// 文字表示用
	usMojiCount = 1000;		// テキストを表示

// フェイド設定
 	Fade.ucKind = GFADE_BLACK_COL;

//FADE-COLOR準備
	Fade.ucDMAf = 3;		// OBJとBG
	FadeColor_InitSet_All();

// カーソルデータのセット
	(int)PauseCurAnmPtr = (int)pause_Anm_0f;
	PauseCur.usAnmTimer = 0;
	PauseCur.usAnmPat = 0;
	PauseCur.ucStatus = PAUSE_RETURN;

// 宝石・カケラ
	if(W4ItemStatus[ucWorldNum][ucStageNum].Kakera1 && W4ItemStatus[ucWorldNum][ucStageNum].Kakera2
	 && W4ItemStatus[ucWorldNum][ucStageNum].Kakera3 && W4ItemStatus[ucWorldNum][ucStageNum].Kakera4)
	{
		ucPauseHosekiFlg = ON;
	} else {
		ucPauseHosekiFlg = OFF;
	}

	for(i=0; i<4; i++)
	{
		ucPauseKakeraStatus[i] = 0;
	}

	if(ucKakera1GetFlg==2 || ucKakera1GetFlg==1)
	{
		ucPauseKakeraStatus[0]= 1;
	} else if(W4ItemStatus[ucWorldNum][ucStageNum].Kakera1)
	{
		ucPauseKakeraStatus[0]= 2;
	}
	if(ucKakera2GetFlg==2 || ucKakera2GetFlg==1)
	{
		ucPauseKakeraStatus[1]= 1;
	} else if(W4ItemStatus[ucWorldNum][ucStageNum].Kakera2)
	{
		ucPauseKakeraStatus[1]= 2;
	}
	if(ucKakera3GetFlg==2 || ucKakera3GetFlg==1)
	{
		ucPauseKakeraStatus[2]= 1;
	} else if(W4ItemStatus[ucWorldNum][ucStageNum].Kakera3)
	{
		ucPauseKakeraStatus[2]= 2;
	}
	if(ucKakera4GetFlg==2 || ucKakera4GetFlg==1)
	{
		ucPauseKakeraStatus[3]= 1;
	} else if(W4ItemStatus[ucWorldNum][ucStageNum].Kakera4)
	{
		ucPauseKakeraStatus[3]= 2;
	}

// デモ
	usSeldemoCount = 0;
	ucSeldemoSeq = 0;

// 光
	for(i=0; i<4; i++)
	{
		PauseHikari[i].usAnmTimer = 0;
		PauseHikari[i].usAnmPat = 0;
	}
	
// ＣＤ
	PauseDisk.usAnmTimer = 0;
	PauseDisk.usAnmPat = 0;

// カギ
	PauseKagi.usAnmTimer = 0;
	PauseKagi.usAnmPat = 0;

// ベストスコア
	SelCoinSet2(iGmStageHighScore[ucWorldNum][ucStageNum], (u32)(pause_bg_Char)+0x2E40, 0x2A80);
	DmaWait(3);

// トータルコイン表示
	SelCoinSet(iGmTotalScore, (u32)(pause_bg_Char)+0x2800, 0x2980);


// ウインドウのパラメータ
	sDmapWindowUpY = 160;
	sDmapWindowDownY = 160;

// BGの位置
	*(vu16*)REG_BG0VOFS = 0;
	*(vu16*)REG_BG0HOFS = 0;
	*(vu16*)REG_BG1VOFS = 0;
	*(vu16*)REG_BG1HOFS = 0;
	*(vu16*)REG_BG2VOFS = 0;
	*(vu16*)REG_BG2HOFS = 0;


//モード0
	*(vu16*)REG_DISPCNT = DISP_OBJ_ON |DISP_MODE_0
	| DISP_OBJ_CHAR_2D_MAP | DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON;

	*(vu16*)REG_DISPCNT |= DISP_WIN0_ON;		//ウィンドウ０をオン
	
	*(vu16*)REG_WININ  = WIN_ALL_ON;	//ウインドウ０内側の表示
	*(vu16*)REG_WINOUT = 0;		//ウインドウ外側表示


//αブレンディング
	*(vu16*)REG_BLDCNT = BLD_NORMAL_MODE;	//ノーマルモード

// 効果音１時停止
	m4aMPlayStop(mplay_table[3].ma);
	m4aMPlayStop(mplay_table[4].ma);
	m4aMPlayStop(mplay_table[5].ma);
	m4aMPlayStop(mplay_table[6].ma);

//サウンド
//	m4aSongNumStartOrChange(M_BGM_PAUSE);
//	m4aSongNumStart(S_PAUSE_ON);		// ポーズスタート


//Ｖブランク割込許可
	*(vu16*)REG_IE |= V_BLANK_INTR_FLAG;
}


//==============================================================
//		コントローラ処理
//==============================================================
static int PauseKey(void)
{

	switch(PauseCur.ucStatus)
	{
		case PAUSE_RETURN:
			if(usTrg & (A_BUTTON))
			{
				(int)PauseCurAnmPtr = (int)pause_Anm_10;
				PauseCur.usAnmPat = 0;
				PauseCur.usAnmTimer = 0;
				cPauseFlag = 1;
				m4aSongNumStart(S_PAUSE_OFF);
				return 1;
			}
			else if(usTrg & R_KEY)
			{
				PauseCur.ucStatus = PAUSE_SAVE;
				m4aSongNumStart(S_CURSOL_1);
			}
			else if(usTrg & L_KEY)
			{
				PauseCur.ucStatus = PAUSE_RETIRE;
				m4aSongNumStart(S_CURSOL_1);
			}
			break;
		case PAUSE_SAVE:
			if(usTrg & (A_BUTTON))
			{
				DmaCopy(3, pause_save_Char, OBJ_MODE0_VRAM+0x4800, 0x3800, 16);
				sSelSeq = PAUSE_KAKUNIN;		// カクニンスル
				PauseCur.ucStatusBak = PauseCur.ucStatus;
				PauseCur.ucStatus = PAUSE_NO;
				m4aSongNumStart(S_BUTTON_A);
				return 0;
			}
			else if(usTrg & R_KEY)
			{
				PauseCur.ucStatus = PAUSE_RETIRE;
				m4aSongNumStart(S_CURSOL_1);
			}
			else if(usTrg & L_KEY)
			{
				PauseCur.ucStatus = PAUSE_RETURN;
				m4aSongNumStart(S_CURSOL_1);
			}
			break;
		case PAUSE_RETIRE:
			if(usTrg & (A_BUTTON))
			{
				DmaCopy(3, pause_obj_Char+0x2400, OBJ_MODE0_VRAM+0x4800, 0x3800, 16);
				sSelSeq = PAUSE_KAKUNIN;		// 確認する
				PauseCur.ucStatusBak = PauseCur.ucStatus;
				PauseCur.ucStatus = PAUSE_NO;
				m4aSongNumStart(S_BUTTON_A);
				return 0;
			}
			else if(usTrg & R_KEY)
			{
				PauseCur.ucStatus = PAUSE_RETURN;
				m4aSongNumStart(S_CURSOL_1);
			}
			else if(usTrg & L_KEY)
			{
				PauseCur.ucStatus = PAUSE_SAVE;
				m4aSongNumStart(S_CURSOL_1);
			}
			break;
		default:
			break;
	}



	if (usTrg & (B_BUTTON))
	{
		cPauseFlag = 1;
		m4aSongNumStart(S_PAUSE_OFF);
		return 1;
	}

	return 0;
}

//==============================================================
//		確認作業
//==============================================================
static int PauseKakunin(void)
{
	switch(PauseCur.ucStatus)
	{
		case PAUSE_NO:
			if(usTrg & (A_BUTTON))
			{
				m4aSongNumStart(S_BUTTON_B);
				return 2;
			}
			else if(usTrg & R_KEY)
			{
				PauseCur.ucStatus = PAUSE_YES;
				m4aSongNumStart(S_CURSOL_1);
			}
			break;
		case PAUSE_YES:		//実行する
			if(usTrg & (A_BUTTON))
			{
				m4aSongNumStart(S_BUTTON_A1);
				return 1;
			}
			else if(usTrg & L_KEY)
			{
				PauseCur.ucStatus = PAUSE_NO;
				m4aSongNumStart(S_CURSOL_1);
			}
			break;
		default:
			break;
	}


	if (usTrg & (B_BUTTON))
	{
		m4aSongNumStart(S_BUTTON_B);
		return 2;
	}

	return 0;
}


//--------------------------------------------------------------
//		ウインドウオープン
//--------------------------------------------------------------
int PauseWindowOpen()
{
// ウインドウが開く

	sDmapWindowUpY -= PAUSE_WINDOW_SPEED;
//	sDmapWindowDownY += PAUSE_WINDOW_SPEED;

	if(sDmapWindowUpY < 0)
	{
		sDmapWindowUpY = 0;
//		sDmapWindowDownY = 160;
		return 1;
	}

	return 0;
}

//--------------------------------------------------------------
//		ウインドウクローズ
//--------------------------------------------------------------
int PauseWindowClose()
{
// ウインドウがとじる
	sDmapWindowUpY += PAUSE_WINDOW_SPEED;
//	sDmapWindowDownY -= PAUSE_WINDOW_SPEED;
	
	if(sDmapWindowUpY > 160)
	{
		sDmapWindowUpY = 160;
//		sDmapWindowDownY = 160;
		return 1;
	}

	return 0;
}

//==============================================================
//		ＯＡＭ作成ルーチン
//==============================================================

static void PauseOamCreate(void)
{
u16		data;
u16		*oam;
u16		*anm;
s16		pa, pb, pc, pd;
int		h, i, j, n;
AnmDef	*AnmPtr;

	i = 0;
	n = ucCntObj;		// OAMのカウント


//OamBufの作成
	oam = (u16*)(OamBuf+ucCntObj);

/*カーソル*/
	PauseCur.usAnmTimer++;
	if((PauseCurAnmPtr+PauseCur.usAnmPat)->ucTimer < PauseCur.usAnmTimer)
	{
		PauseCur.usAnmTimer = 1;
		PauseCur.usAnmPat++;
		if((PauseCurAnmPtr+PauseCur.usAnmPat)->ucTimer == 0)
		{
			PauseCur.usAnmPat = 0;
			if((int)PauseCurAnmPtr == (int)pause_Anm_10)	PauseCur.usAnmPat = 1;
		}
	}
	anm = (u16*)(PauseCurAnmPtr+PauseCur.usAnmPat)->uiObjAddr;	//オブジェクトのデータ

	//oamの組み立て
	n += *(u16*)anm++;
	if(n > 128)	return;
	for ( ; i < n; i++)
	{
		data = *(u16*)anm++;
		*(u16*)(oam++) = data;
		OamBuf[i].VPos = (data+PAUSE_CUR_POS_Y[PauseCur.ucStatus])&0xff;

		data = *(u16*)anm++;
		*(u16*)(oam++) = data;
		OamBuf[i].HPos = (data+PAUSE_CUR_POS_X[PauseCur.ucStatus])&0x1ff;

		*(u16*)(oam++) = *(u16*)anm++;
		OamBuf[i].Priority = 0;
		oam++;
	}


// 確認メッセージ
	if(PauseCur.ucStatus == PAUSE_YES || PauseCur.ucStatus == PAUSE_NO)
	{
		if(ucLanguage == ENGLISH_MODE)
		{
			(int)AnmPtr = pause_kakunin_Anm[0][PauseCur.ucStatus-3];
		} else
		{
			(int)AnmPtr = pause_kakunin_Anm[1][PauseCur.ucStatus-3];
		}
		
		anm = (u16*)(AnmPtr+0)->uiObjAddr;	//オブジェクトのデータ
		//oamの組み立て
		n += *(u16*)anm++;
		if(n > 128)	return;
		for ( ; i < n; i++)
		{
			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].VPos = (data+80)&0xff;

			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].HPos = (data+120)&0x1ff;

			*(u16*)(oam++) = *(u16*)anm++;
			OamBuf[i].Priority = 0;
			oam++;
		}
	}



//--------------------------- コインアイコン
	n++;
	*(u16*)(oam++) = 0;
	OamBuf[i].VPos = 32;
	*(u16*)(oam++) = 0;
	OamBuf[i].HPos = 176;
	*(u16*)(oam++) = 0;
	OamBuf[i].CharNo = 0xCB;
	OamBuf[i].Pltt = 6;
	i++;
	oam++;
//---------------------------- 合計コイン金額
	n++;
	*(u16*)(oam++) = 0;
	OamBuf[i].VPos = 32;
	OamBuf[i].Shape = 1;
	*(u16*)(oam++) = 0;
	OamBuf[i].HPos = 184;
	OamBuf[i].Size = 0;
	*(u16*)(oam++) = 0;
	OamBuf[i].CharNo = 0x84;
	OamBuf[i].Pltt = 4;
	i++;
	oam++;

	n++;
	*(u16*)(oam++) = 0;
	OamBuf[i].VPos = 32;
	OamBuf[i].Shape = 1;
	*(u16*)(oam++) = 0;
	OamBuf[i].HPos = 200;
	OamBuf[i].Size = 1;
	*(u16*)(oam++) = 0;
	OamBuf[i].CharNo = 0x86;
	OamBuf[i].Pltt = 4;
	i++;
	oam++;

// 体力ゲージ
	n++;
	*(u16*)(oam++) = 0;
	OamBuf[i].VPos = 32;
	OamBuf[i].Shape =1;
	*(u16*)(oam++) = 0;
	OamBuf[i].HPos = 8;
	OamBuf[i].Size = 2;
	*(u16*)(oam++) = 0;
	OamBuf[i].CharNo = 0x90;
	OamBuf[i].Pltt = 7;
	i++;
	oam++;

	n++;
	*(u16*)(oam++) = 0;
	OamBuf[i].VPos = 32;
	OamBuf[i].Shape =1;
	*(u16*)(oam++) = 0;
	OamBuf[i].HPos = 40;
	OamBuf[i].Size = 2;
	*(u16*)(oam++) = 0;
	OamBuf[i].CharNo = 0x94;
	OamBuf[i].Pltt = 7;
	i++;
	oam++;


	for(j=0; j<4; j++)
	{
		
		if(ucPauseKakeraStatus[j]==2)		// 確定済みのとき
		{
			// 光
			(int)AnmPtr = pause_Get_Hikari[j];
			PauseHikari[j].usAnmTimer++;
			if((AnmPtr+PauseHikari[j].usAnmPat)->ucTimer < PauseHikari[j].usAnmTimer)
			{
				PauseHikari[j].usAnmTimer = 1;
				PauseHikari[j].usAnmPat++;
				if((AnmPtr+PauseHikari[j].usAnmPat)->ucTimer == 0)
				{
					PauseHikari[j].usAnmPat = 0;
				}
			}
			anm = (u16*)(AnmPtr+PauseHikari[j].usAnmPat)->uiObjAddr;	//オブジェクトのデータ
			//oamの組み立て
			n += *(u16*)anm++;
			if(n > 128)	return;
			for ( ; i < n; i++)
			{
				data = *(u16*)anm++;
				*(u16*)(oam++) = data;
				OamBuf[i].VPos = (data+PAUSE_HOSEKI_Y)&0xff;

				data = *(u16*)anm++;
				*(u16*)(oam++) = data;
				OamBuf[i].HPos = (data+PAUSE_HOSEKI_X[ucSelWorldKind])&0x1ff;

				*(u16*)(oam++) = *(u16*)anm++;
				OamBuf[i].Priority = 0;
				oam++;
			}
		}
		
		if(!ucPauseHosekiFlg)
		{
			// 宝石のカケラ
			if(ucPauseKakeraStatus[j])
			{
				(int)AnmPtr = pause_Kakera_Anm[ucPauseKakeraStatus[j]-1][j];
				anm = (u16*)(AnmPtr+0)->uiObjAddr;	//オブジェクトのデータ
				//oamの組み立て
				n += *(u16*)anm++;
				if(n > 128)	return;
				for ( ; i < n; i++)
				{
					data = *(u16*)anm++;
					*(u16*)(oam++) = data;
					OamBuf[i].VPos = (data+PAUSE_HOSEKI_Y)&0xff;

					data = *(u16*)anm++;
					*(u16*)(oam++) = data;
					OamBuf[i].HPos = (data+PAUSE_HOSEKI_X[ucSelWorldKind])&0x1ff;

					*(u16*)(oam++) = *(u16*)anm++;
					OamBuf[i].Priority = 0;
					oam++;
				}
			}
		}
	}

	// 宝石
	if(ucPauseHosekiFlg)
	{
		anm = (u16*)pause_Anm_0a[0].uiObjAddr;	//オブジェクトのデータ
		n += *(u16*)anm++;
		for( ; i < n; i++)
		{
			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].VPos = (data+PAUSE_HOSEKI_Y)&0xff;
			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].HPos = (data+PAUSE_HOSEKI_X[ucSelWorldKind])&0x1ff;
			*(u16*)(oam++) = *(u16*)anm++;
			OamBuf[i].Priority = 0;
			oam++;
		}
	}

	// カギ
	if(ucKagiGetFlg==1 || W4ItemStatus[ucWorldNum][ucStageNum].Kagi)	// カギがある場合
	{
		if(ucKagiGetFlg == 1)		// この面でとったばかり
		{
			(int)AnmPtr = (int)pause_Anm_00;
		} else						// 確定済み
		{
			(int)AnmPtr = (int)pause_Anm_01;
		}
		PauseKagi.usAnmTimer++;
		if((AnmPtr+PauseKagi.usAnmPat)->ucTimer < PauseKagi.usAnmTimer)
		{
			PauseKagi.usAnmTimer = 1;
			PauseKagi.usAnmPat++;
			if((AnmPtr+PauseKagi.usAnmPat)->ucTimer == 0)
			{
				PauseKagi.usAnmPat = 0;
			}
		}
		anm = (u16*)(AnmPtr+PauseKagi.usAnmPat)->uiObjAddr;	//オブジェクトのデータ
		//oamの組み立て
		n += *(u16*)anm++;
		if(n > 128)	return;
		for ( ; i < n; i++)
		{
			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].VPos = (data+PAUSE_KAGI_Y)&0xff;

			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].HPos = (data+PAUSE_KAGI_X[ucSelWorldKind])&0x1ff;

			*(u16*)(oam++) = *(u16*)anm++;
			OamBuf[i].Priority = 0;
			oam++;
		}
	}

	// ディスク
	if((ucCardGetFlg==2 || ucCardGetFlg ==1 || W4ItemStatus[ucWorldNum][ucStageNum].Card) && !ucSelWorldKind)
	// ディスクがある場合
	{
		if(ucCardGetFlg == 2 || ucCardGetFlg == 1)		// この面でとったばかり
		{
			(int)AnmPtr = (int)pause_Anm_12;
		} else						// 確定済み
		{
			(int)AnmPtr = (int)pause_Anm_17;
		}
		PauseDisk.usAnmTimer++;
		if((AnmPtr+PauseDisk.usAnmPat)->ucTimer < PauseDisk.usAnmTimer)
		{
			PauseDisk.usAnmTimer = 1;
			PauseDisk.usAnmPat++;
			if((AnmPtr+PauseDisk.usAnmPat)->ucTimer == 0)
			{
				PauseDisk.usAnmPat = 0;
			}
		}
		anm = (u16*)(AnmPtr+PauseDisk.usAnmPat)->uiObjAddr;	//オブジェクトのデータ
		//oamの組み立て
		n += *(u16*)anm++;
		if(n > 128)	return;
		for ( ; i < n; i++)
		{
			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].VPos = (data+PAUSE_DISK_Y)&0xff;

			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].HPos = (data+PAUSE_DISK_X)&0x1ff;

			*(u16*)(oam++) = *(u16*)anm++;
			OamBuf[i].Priority = 0;
			oam++;
		}
	}

// 王冠
	if(iGmStageHighScore[ucWorldNum][ucStageNum]>=BRONZE_CROWN_SCORE)
	{
		if(iGmStageHighScore[ucWorldNum][ucStageNum]>=GOLD_CROWN_SCORE)
		{
			anm = (u16*)pause_Anm_18[0].uiObjAddr;	//オブジェクトのデータ
		} else if(iGmStageHighScore[ucWorldNum][ucStageNum]>=SILVER_CROWN_SCORE)
		{
			anm = (u16*)pause_Anm_19[0].uiObjAddr;
		} else
		{
			anm = (u16*)pause_Anm_1a[0].uiObjAddr;
		}

		//oamの組み立て
		n += *(u16*)anm++;
		if(n > 128)	return;
		for ( ; i < n; i++)
		{
			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].VPos = (data+48)&0xff;

			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].HPos = (data+168)&0x1ff;

			*(u16*)(oam++) = *(u16*)anm++;
			OamBuf[i].Priority = 0;
			oam++;
		}
	}


	ucCntObj = n;
}

