//**************************************************************
//
//						minisel.c
//
//**************************************************************
#include	<Agb.h>
#include	"../../define.h"
#include	"../../m4aLib.h"

#include	"../mini.h"

#include	"include_datafiles.h"
#include	"../../global.h"
#include	"../../sub.h"
#include	"../../data.h"
#include	"./Ominisel.h"

//--------------------------------------------------------------
//		定義
//--------------------------------------------------------------
// ＭＩＮＩＳＥＬのシーケンス
enum
{
	MINISEL_NO_DEMO, MINISEL_TO_GAME, MINISEL_FROM_GAME, MINISEL_WINDOW_CLOSE, MINISEL_WINDOW_OPEN
};

// ゲームへ飛んでいくデモのシーケンス
enum
{
	MINISEL_TG_WAIT_1, MINISEL_TG_COIN_SET, MINISEL_TG_WAIT_2, MINISEL_TG_FLY
};

// ゲームから飛んでくるデモのシーケンス
enum
{
	MINISEL_FG_FLY, MINISEL_FG_GROUND
};


// カーソルの位置
const int	MINISEL_CUR_X[4] = {12, 92, 172, 12};
const int	MINISEL_CUR_Y[4] = {72, 72, 72, 16};


//各ワールドから移動するルーチン用定数
static const int	MINISEL_IDO[4][4] = 	// [どのポジションで][なにを押したか左上右下]
{
	//左				右					上				下
	{MINI_WARAI_GAME,	MINI_RACE_GAME,		MINI_EXIT,		MINI_NOWHERE},			// 野球
	{MINI_BASEBALL_GAME,MINI_WARAI_GAME,	MINI_EXIT,		MINI_NOWHERE},			// レース
	{MINI_RACE_GAME,	MINI_BASEBALL_GAME,	MINI_EXIT,		MINI_NOWHERE},			// 福笑い
	{MINI_NOWHERE,		MINI_BASEBALL_GAME,	MINI_NOWHERE,	MINI_BASEBALL_GAME},	// ＥＸＩＴ
};


// ゲーム機の初期位置
const int	MINISEL_GAME_X[3] = {44, 124, 204};
#define		MINISEL_GAME_Y	72

// ゲーム機の状態
enum
{
	MINISEL_KUSSHIN, MINISEL_SELECTED, MINISEL_DANCE, MINISEL_FLY, MINISEL_FLYING, MINISEL_GROUND
};

// ゲーム機のアニメーション
const int minisel_game_Anm[3][6] =
{
	{(int)minisel_Anm_0c, (int)minisel_Anm_00, (int)minisel_Anm_03, (int)minisel_Anm_06, 
	(int)minisel_Anm_09, (int)minisel_Anm_12},
	{(int)minisel_Anm_0e, (int)minisel_Anm_02, (int)minisel_Anm_05, (int)minisel_Anm_08, 
	(int)minisel_Anm_0b, (int)minisel_Anm_14},
	{(int)minisel_Anm_0d, (int)minisel_Anm_01, (int)minisel_Anm_04, (int)minisel_Anm_07, 
	(int)minisel_Anm_0a, (int)minisel_Anm_13}
};

#define		MINISEL_GAME_SPEED		2		// ゲーム機の移動スピード

#define		MINISEL_BET_COIN_10		5		// １ゲームの料金の１０００の位
#define		MINISEL_BET_COIN_1		0		// １ゲームの料金の１００の位

// 星の位置
const int MINISEL_STAR_X[3] = {60, 100, 180};
const int MINISEL_STAR_Y[3] = {80, 30, 70};


// メッセージ表示用
static const int	mini_Mes_j[12] = 
{
	(int)mini_Mes_01_j, (int)mini_Mes_02_j, (int)mini_Mes_03_j, (int)mini_Mes_00_j,
	(int)mini_Mes_04_j, (int)mini_Mes_05_j, (int)mini_Mes_06_j, (int)mini_Mes_07_j,
	(int)mini_Mes_08_j, (int)mini_Mes_09_j, (int)mini_Mes_0a_j, (int)mini_Mes_0b_j
};

static const int	mini_Mes_e[12] = 
{
	(int)mini_Mes_01_e, (int)mini_Mes_02_e, (int)mini_Mes_03_e, (int)mini_Mes_00_e,
	(int)mini_Mes_04_e, (int)mini_Mes_05_e, (int)mini_Mes_06_e, (int)mini_Mes_07_e,
	(int)mini_Mes_08_e, (int)mini_Mes_09_e, (int)mini_Mes_0a_e, (int)mini_Mes_0b_e
};

// オンガク
static const int	minisel_music_up[3] =
{
	S_GAME_GB1_UP, S_GAME_GB2_UP, S_GAME_GB3_UP
};

static const int	minisel_music_down[3] =
{
	S_GAME_GB1_DOWN, S_GAME_GB2_DOWN, S_GAME_GB3_DOWN
};


//--------------------------------------------------------------
//		変数
//--------------------------------------------------------------
static MiniObjDef	MiniSelGame[3];			// ゲーム機
static MiniObjDef	MiniSelStar;			// 星

static u8 ucMiniSelMesNo;

static u8 ucMiniSelKakaku;			// １ゲームの料金

//--------------------------------------------------------------
//		データ
//--------------------------------------------------------------

//--------------------------------------------------------------
//		参照関数
//--------------------------------------------------------------


//--------------------------------------------------------------
//		参照される関数
//--------------------------------------------------------------
int		MiniSel(void);
void	MiniSelInit01(void);
void	MiniSelInit02(void);
void	MiniSelOamCreate(void);
void	MiniSelVblk(void);

//--------------------------------------------------------------
//		Local関数
//--------------------------------------------------------------
static void	MiniSelInit(void);			// 共通初期化関数
static int	MiniSelKey(void);

static int MiniSelToGame(void);		// ＧＡＭＥへ飛ぶデモ
static int MiniSelFromGame(void);		// ＧＡＭＥから飛んでくるデモ

//--------------------------------------------------------------
//		メイン関数
//--------------------------------------------------------------
int MiniSel(void)
{
	int	a;
	a = 0;

	switch(ucMiniSeq)
	{
		case MINISEL_NO_DEMO:
			if(usMojiCount<27)	usMojiCount++;
			if(MiniSelKey())
			{
				if(ucMiniStatus == MINI_EXIT)
				{
					m4aMPlayFadeOut(mplay_table[song_table[M_BGM_MINIGAME].ms].ma, M4A_FADEOUT_21);
					ucMiniSeq = MINISEL_WINDOW_CLOSE;
				} else
				{
					ucMiniPlayFlg = ON;		// 遊んだ
					m4aMPlayFadeOut(mplay_table[song_table[M_BGM_MINIGAME].ms].ma, M4A_FADEOUT_12);
					ucMiniSeq++;
				}
			}
			break;
			
		case MINISEL_TO_GAME:
			if(usMojiCount<27)	usMojiCount++;
			if(MiniSelToGame())
			{
				ucMiniSeq = MINISEL_WINDOW_CLOSE;
			}
			break;
			
		case MINISEL_FROM_GAME:
			if(MiniSelFromGame())	ucMiniSeq = MINISEL_NO_DEMO;
			break;
		
		case MINISEL_WINDOW_CLOSE:
			if(usMojiCount<27)	usMojiCount++;
			if(MiniSelGame[ucMiniStatus].ucStatus == MINISEL_FLYING)
				MiniSelGame[ucMiniStatus].sY -= MINISEL_GAME_SPEED;
			
			if(MiniWindowClose())		a = 1;
			break;

		case MINISEL_WINDOW_OPEN:
			if(MiniSelGame[ucMiniStatus].ucStatus == MINISEL_FLYING)
				MiniSelGame[ucMiniStatus].sY += MINISEL_GAME_SPEED;

			if(MiniWindowOpen())
			{
				ucMiniSeq = ucMiniSeqBak;
			}
			break;
	}
	
	return a;
}

//--------------------------------------------------------------
//		初期化関数共通
//--------------------------------------------------------------
void MiniSelInit(void)
{
	int i;
	
//	*(vu16*)REG_IE ^= V_BLANK_INTR_FLAG;		//Vﾌﾞﾗﾝｸ割込不許可
//	*(vu16*)REG_DISPCNT = DISP_LCDC_OFF;		//LCDC OFF
	ClearGraphicRam();

	DmaCopy(3, minisel_bg_Palette, BG_PLTT, 0x200, 16);
	DmaWait(3);
	DmaCopy(3, minisel_obj_Palette, OBJ_PLTT, 0x200, 16);
	DmaWait(3);
	
	/*---------------------BGデータ転送--------------------------*/
	DmaCopy(3, minisel_bg_Char, BG_VRAM, sizeof(minisel_bg_Char), 16);
	DmaWait(3);
	*(vu16*)BG_PLTT = 0;		// 抜きの色を黒にする
	
	/*---------------------OBJデータ転送--------------------------*/
	DmaCopy(3, minisel_obj_Char, OBJ_MODE0_VRAM, sizeof(minisel_obj_Char), 16);
	DmaWait(3);

	/*---------------------スクリーンデータ転送--------------------------*/
	DmaCopy(3, minisel_3_Screen, BG_VRAM+0xc000, 0x800, 16);	// 文字類
	DmaWait(3);
	DmaCopy(3, minisel_2_Screen, BG_VRAM+0xd000, 0x800, 16);	// シェル
	DmaWait(3);
	DmaCopy(3, minisel_1_Screen, BG_VRAM+0xe000, 0x800, 16);	// 背景

	/*---------------------各BGをセット--------------------------*/
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_0	// 文字類
		| (24 << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_1	// シェル
		| (26 << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_2	// 背景
		| (28 << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

// １ゲーム料金表示
	DmaCopy(3, minisel_bg_Char+0x5E60+0x20*MINISEL_BET_COIN_10, BG_VRAM+0x5B00, 0x20, 16);		// 1000の位
	DmaWait(3);
	DmaCopy(3, minisel_bg_Char+0x5E60+0x20*MINISEL_BET_COIN_1, BG_VRAM+0x5B20, 0x20, 16);		// 1000の位
	DmaWait(3);

// １ゲーム料金
	if(!W4ItemStatus[0][4].Kagi)		// チュートリアルのボスを倒していない
	{
		ucMiniSelKakaku = 20;
	} else {
		ucMiniSelKakaku = MINISEL_BET_COIN_10*10 + MINISEL_BET_COIN_1;
	}

// コイン表示
	SelCoinSet(iGmTotalScore, (u32)(minisel_bg_Char)+0x5800, 0x59a0);

// メダル表示
	SelMedalSet(usTotalGoldMedal, (u32)(minisel_bg_Char)+0x5800, 0x50E0);


// ハイスコア表示
	for(i=0; i<3; i++)
	{
		SelMedalSet(usMiniBestScore[i], (u32)(minisel_bg_Char)+0x5140, 0x52a0+0x80*i);
	}


// スクリーンの初期位置
	*(vu16*)REG_BG0VOFS = 0;
	*(vu16*)REG_BG0HOFS = 0;
	*(vu16*)REG_BG1VOFS = 0;
	*(vu16*)REG_BG1HOFS = 0;
	*(vu16*)REG_BG2VOFS = 0;
	*(vu16*)REG_BG2HOFS = 0;

// シーケンス
	ucMiniDemoSeq = 0;
	usMiniDemoCount = 0;


// ウインドウ
	sDmapWindowLeftX = 120;
	sDmapWindowRightX = 120;
	sDmapWindowUpY = 0;
	sDmapWindowDownY = 160;

	*(vu16*)REG_DISPCNT |= DISP_WIN0_ON;		//ウィンドウ０をオン

	*(vu16*)REG_WININ  = WIN_ALL_ON;		//ウインドウ０内側の表示
	*(vu16*)REG_WINOUT = 0;		//ウインドウ外側表示

// 星
	MiniSelStar.usAnmTimer = 0;
	MiniSelStar.usAnmPat = 0;


// カーソル
	MiniCur.sX = MINISEL_CUR_X[ucMiniStatus];
	MiniCur.sY = MINISEL_CUR_Y[ucMiniStatus];
	MiniCur.usAnmTimer = 0;
	MiniCur.usAnmPat = 0;
	(int)MiniCurAnmPtr = (int)minisel_Anm_10;

// ゲーム機
	for(i=0; i<3; i++)
	{
		MiniSelGame[i].usAnmTimer = 0;
		MiniSelGame[i].usAnmPat = 0;
	}

	usMojiCount = 0;

// フェイド初期化
	Select_Fade_Init();
	*(vu16*)REG_BLDY = 0;
	
//サウンド
	m4aSongNumStartOrChange(M_BGM_MINIGAME);


//Ｖブランク割込許可
//	*(vu16*)REG_IE |= V_BLANK_INTR_FLAG;
}

//--------------------------------------------------------------
//		初期化１（ＭＭＡＰから）
//--------------------------------------------------------------
void	MiniSelInit01(void)
{
	int i;

// 選んでいる場所
	ucMiniStatus = MINI_EXIT;
	
// ゲーム機の状態
	for(i=0; i<3; i++)
	{
		MiniSelGame[i].ucStatus = MINISEL_KUSSHIN;
		MiniSelGame[i].sX = MINISEL_GAME_X[i];
		MiniSelGame[i].sY = MINISEL_GAME_Y;
	}

	ucMiniSeqBak = MINISEL_NO_DEMO;
	ucMiniSeq = MINISEL_WINDOW_OPEN;

// まだ遊んでいない
	ucMiniPlayFlg = OFF;

// メッセージナンバー
	ucMiniSelMesNo = ucMiniStatus;

//モード0
	*(vu16*)REG_DISPCNT = DISP_OBJ_ON |DISP_MODE_0 
	| DISP_OBJ_CHAR_2D_MAP | DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON;

	MiniSelInit();
	
}

//--------------------------------------------------------------
//		初期化２（ミニゲームから）
//--------------------------------------------------------------
void	MiniSelInit02(void)
{
	int i;

// 自動セーブ
	MiniSave();

// ゲーム機の状態
	for(i=0; i<3; i++)
	{
		if(i==ucMiniStatus)
		{
			MiniSelGame[i].ucStatus = MINISEL_FLYING;
			MiniSelGame[i].sX = MINISEL_GAME_X[i];
			MiniSelGame[i].sY = -20;
		}
		else
		{
			MiniSelGame[i].ucStatus = MINISEL_KUSSHIN;
			MiniSelGame[i].sX = MINISEL_GAME_X[i];
			MiniSelGame[i].sY = MINISEL_GAME_Y;
		}
	}

	ucMiniSeqBak = MINISEL_FROM_GAME;
	ucMiniSeq = MINISEL_WINDOW_OPEN;



//ＢＧなし
	*(vu16*)REG_DISPCNT = DISP_OBJ_ON |DISP_MODE_0 
	| DISP_OBJ_CHAR_2D_MAP | DISP_BG2_ON;

	MiniSelInit();


	// メッセージナンバー
	if(ucMiniHighScoreFlg)
	{
		ucMiniSelMesNo = 10;
	} else
	{
		ucMiniSelMesNo = 9;
	}

	m4aSongNumStart(minisel_music_down[ucMiniStatus]);

}

//--------------------------------------------------------------
//		追加ＶＢＬＫ
//--------------------------------------------------------------
void MiniSelVblk(void)
{
	u16 code;
	*(vu16*)REG_WIN0H = (sDmapWindowLeftX<<8)|(sDmapWindowRightX);	// ウィンドウ０の左、右座標
	*(vu16*)REG_WIN0V = (sDmapWindowUpY<<8)|(sDmapWindowDownY);	// ウィンドウ０の上、下座標
	
	switch(ucLanguage)
	{
		case ENGLISH_MODE:	// 英語
#if CHINA
			code = usMojiCount;
			usMojiCount = 1000;	
			MojiCreate_ZH((u8*)mini_Mes_e[ucMiniSelMesNo], 0x7800,font_Char, 13);	// Chinese
			usMojiCount = code;
#else
			MojiCreate((u8*)mini_Mes_e[ucMiniSelMesNo], 0x7800, 26);	// English
#endif			
			break;
			
		case JAPANESE_MODE:	// 日本語
			MojiCreate((u8*)mini_Mes_j[ucMiniSelMesNo], 0x7800, 26);	// 日本語
			break;
	}
}

//--------------------------------------------------------------
//		キー入力
//--------------------------------------------------------------
static int	MiniSelKey(void)
{
	int tempkey, i;
	
	tempkey = MINI_NO_PUSH;
	
	if(usTrg & (A_BUTTON))
	{
		if(ucMiniStatus == MINI_EXIT)		// 出口
		{
			m4aSongNumStart(S_BUTTON_B);
			return 1;
		} else if(iGmTotalScore >= ucMiniSelKakaku*10)		// コインがある
		{
			m4aSongNumStart(S_BUTTON_A1);

			(int)MiniCurAnmPtr = (int)minisel_Anm_11;
			MiniCur.usAnmPat = 0;
			MiniCur.usAnmTimer = 0;

			MiniSelGame[ucMiniStatus].ucStatus = MINISEL_KUSSHIN;
			MiniSelGame[ucMiniStatus].usAnmTimer = 0;
			MiniSelGame[ucMiniStatus].usAnmPat = 0;

			ucMiniSelMesNo = 8;
			usMojiCount = 0;
			return 1;
		} else						// コインがたりない
		{
			m4aSongNumStart(S_DAME_1);
			ucMiniSelMesNo = 4;
			usMojiCount = 0;
		}
		return 0;
	}

	if(usTrg & L_KEY)
	{
		tempkey = MINI_LEFT_PUSH;
	}
	else if(usTrg & R_KEY)
	{
		tempkey = MINI_RIGHT_PUSH;
	}
	else if(usTrg & U_KEY)
	{
		tempkey = MINI_UP_PUSH;
	}
	else if(usTrg & D_KEY)
	{
		tempkey = MINI_DOWN_PUSH;
	}

	if(tempkey != MINI_NO_PUSH && MINISEL_IDO[ucMiniStatus][tempkey] != MINI_NOWHERE)
	{
		ucMiniStatus = MINISEL_IDO[ucMiniStatus][tempkey];
		MiniCur.sX = MINISEL_CUR_X[ucMiniStatus];
		MiniCur.sY = MINISEL_CUR_Y[ucMiniStatus];
		m4aSongNumStart(S_CURSOL_1);
		for(i=0; i<3; i++)
		{
			if(ucMiniStatus == MINI_EXIT)		// ＥＸＩＴを選択中
			{
				MiniSelGame[i].ucStatus = MINISEL_KUSSHIN;
				if(iGmTotalScore < ucMiniSelKakaku*10)		// コインが足りない
				{
					ucMiniSelMesNo = 7;
				} else if(ucMiniPlayFlg)					// もう1回遊ばせたい
				{
					ucMiniSelMesNo = 6;
				} else										// 1回も遊んでいない
				{
					ucMiniSelMesNo = 11;
				}
			} else if(ucMiniStatus == i)		// 選択しているゲーム機
			{
				ucMiniSelMesNo = ucMiniStatus;
				MiniSelGame[i].ucStatus = MINISEL_SELECTED;
			} else								// それ以外のゲーム機
			{
				ucMiniSelMesNo = ucMiniStatus;
				MiniSelGame[i].ucStatus = MINISEL_KUSSHIN;
			}
			MiniSelGame[i].usAnmTimer = 0;
			MiniSelGame[i].usAnmPat = 0;
			usMojiCount = 0;
		}
		return 0;
	}


	if (usTrg & (B_BUTTON))
	{
		m4aSongNumStart(S_BUTTON_B);
		ucMiniStatus = MINI_EXIT;
		return 1;
	}

	return 0;
	
}

//--------------------------------------------------------------
//		ＧＡＭＥへ飛ぶデモ
//--------------------------------------------------------------
static int MiniSelToGame()
{
	switch(ucMiniDemoSeq)
	{
		case MINISEL_TG_WAIT_1:
			if(MiniWait(20))	ucMiniDemoSeq++;
			break;
		
		case MINISEL_TG_COIN_SET:
			iGmTotalScore -= 10;
			usMiniDemoCount++;
			if(usMiniDemoCount%5==0)	m4aSongNumStart(S_GAME_SLOT_COIN_1);
		// コイン表示
			SelCoinSet(iGmTotalScore, (u32)(minisel_bg_Char)+0x5800, 0x59a0);

			if(usMiniDemoCount == ucMiniSelKakaku)
			{
				usMiniDemoCount = 0;
				ucMiniDemoSeq++;
			}
			break;
			
		case MINISEL_TG_WAIT_2:
			if(MiniWait(60))
			{
				m4aSongNumStart(minisel_music_up[ucMiniStatus]);
				
				ucMiniDemoSeq++;
				// BGを消す
				*(vu16*)REG_DISPCNT = DISP_OBJ_ON |DISP_MODE_0 
				| DISP_OBJ_CHAR_2D_MAP | DISP_BG2_ON | DISP_WIN0_ON;

				MiniSelGame[ucMiniStatus].ucStatus = MINISEL_FLY;
				MiniSelGame[ucMiniStatus].usAnmTimer = 0;
				MiniSelGame[ucMiniStatus].usAnmPat = 0;
			}
			break;

		case MINISEL_TG_FLY:
			if(MiniSelGame[ucMiniStatus].ucStatus == MINISEL_FLYING)
			{
				MiniSelGame[ucMiniStatus].sY -= MINISEL_GAME_SPEED;
			}
			if(MiniSelGame[ucMiniStatus].sY < 20)	return 1;
			break;
	}

	return 0;
}

//--------------------------------------------------------------
//		ＧＡＭＥから飛んでくるデモ
//--------------------------------------------------------------
static int MiniSelFromGame()
{
	switch(ucMiniDemoSeq)
	{
		case MINISEL_FG_FLY:
			MiniSelGame[ucMiniStatus].sY += MINISEL_GAME_SPEED;
			if(MiniSelGame[ucMiniStatus].sY > MINISEL_GAME_Y-32)
			{
				MiniSelGame[ucMiniStatus].sY = MINISEL_GAME_Y;
				MiniSelGame[ucMiniStatus].ucStatus = MINISEL_GROUND;
				MiniSelGame[ucMiniStatus].usAnmTimer = 0;
				MiniSelGame[ucMiniStatus].usAnmPat = 0;
				ucMiniDemoSeq++;
			}
			break;

		case MINISEL_FG_GROUND:
			if(MiniSelGame[ucMiniStatus].ucStatus == MINISEL_SELECTED)
			{
				if(ucMiniHighScoreFlg)	m4aSongNumStart(S_GAME_NEW_DATA);

				usMojiCount = 0;
				
				//ＢＧ表示
				*(vu16*)REG_DISPCNT = DISP_OBJ_ON |DISP_MODE_0 
				| DISP_OBJ_CHAR_2D_MAP | DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON | DISP_WIN0_ON;
				
				ucMiniDemoSeq = 0;
				return 1;
			}
			break;
	}
	return 0;
}

//--------------------------------------------------------------
//		ＯＡＭ作成
//--------------------------------------------------------------
void MiniSelOamCreate()
{

u16		data;
u16		*oam;
u16		*anm;
s16		pa, pb, pc, pd;
int		h, i, j, n;
int		x, y;
AnmDef	*AnmPtr;

	i = 0;
	n = ucCntObj;		// OAMのカウント

//OamBufの作成
	oam = (u16*)(OamBuf+ucCntObj);





	if(!(MiniSelGame[ucMiniStatus].ucStatus == MINISEL_FLYING || MiniSelGame[ucMiniStatus].ucStatus == MINISEL_GROUND
	|| MiniSelGame[ucMiniStatus].ucStatus == MINISEL_FLY))
	{
	// 特売表記（チュートリアル未クリア時のみ）
		if(!W4ItemStatus[0][4].Kagi)
		{
			anm = (u16*)minisel_Anm_15[0].uiObjAddr;

			//oamの組み立て
			n += *(u16*)anm++;
			if(n > 128)	return;
			for ( ; i < n; i++)
			{
				data = *(u16*)anm++;
				*(u16*)(oam++) = data;
				OamBuf[i].VPos = (data+38)&0xff;

				data = *(u16*)anm++;
				*(u16*)(oam++) = data;
				OamBuf[i].HPos = (data+168)&0x1ff;

				*(u16*)(oam++) = *(u16*)anm++;
				OamBuf[i].Priority = 0;
				oam++;
			}
		}

// カーソル
		MiniCur.usAnmTimer++;
		if((MiniCurAnmPtr+MiniCur.usAnmPat)->ucTimer < MiniCur.usAnmTimer)
		{
			MiniCur.usAnmTimer = 1;
			MiniCur.usAnmPat++;
			if((MiniCurAnmPtr+MiniCur.usAnmPat)->ucTimer == 0)
			{
				MiniCur.usAnmPat = 0;
				if((int)MiniCurAnmPtr == (int)minisel_Anm_11)	MiniCur.usAnmPat = 1;
			}
		}
		anm = (u16*)(MiniCurAnmPtr+MiniCur.usAnmPat)->uiObjAddr;	//オブジェクトのデータ

		//oamの組み立て
		n += *(u16*)anm++;
		if(n > 128)	return;
		for ( ; i < n; i++)
		{
			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].VPos = (data+MiniCur.sY)&0xff;

			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].HPos = (data+MiniCur.sX)&0x1ff;

			*(u16*)(oam++) = *(u16*)anm++;
			OamBuf[i].Priority = 0;
			oam++;
		}
	}


// ゲーム機
	for(j=0; j<3; j++)
	{
		(int)AnmPtr = minisel_game_Anm[j][MiniSelGame[j].ucStatus];

		MiniSelGame[j].usAnmTimer++;
		if((AnmPtr+MiniSelGame[j].usAnmPat)->ucTimer < MiniSelGame[j].usAnmTimer)
		{
			MiniSelGame[j].usAnmTimer = 1;
			MiniSelGame[j].usAnmPat++;
			if((AnmPtr+MiniSelGame[j].usAnmPat)->ucTimer == 0)
			{
				MiniSelGame[j].usAnmPat = 0;
				if(MiniSelGame[j].ucStatus == MINISEL_FLY)
				{
					MiniSelGame[j].ucStatus = MINISEL_FLYING;
					(int)AnmPtr = minisel_game_Anm[j][MiniSelGame[j].ucStatus];
				} else if(MiniSelGame[j].ucStatus == MINISEL_GROUND)
				{
					MiniSelGame[j].ucStatus = MINISEL_SELECTED;
					(int)AnmPtr = minisel_game_Anm[j][MiniSelGame[j].ucStatus];
				}
			}
		}

		anm = (u16*)(AnmPtr+MiniSelGame[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+MiniSelGame[j].sY)&0xff;

			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].HPos = (data+MiniSelGame[j].sX)&0x1ff;

			*(u16*)(oam++) = *(u16*)anm++;
			OamBuf[i].Priority = 2;
			oam++;
		}
	}

// 星
	MiniSelStar.usAnmTimer++;
	if(minisel_Anm_0f[MiniSelStar.usAnmPat].ucTimer < MiniSelStar.usAnmTimer)
	{
		MiniSelStar.usAnmTimer = 1;
		MiniSelStar.usAnmPat++;
		if(minisel_Anm_0f[MiniSelStar.usAnmPat].ucTimer == 0)
		{
			MiniSelStar.usAnmPat = 0;
		}
	}

	for(j=0; j<3; j++)
	{
		anm = (u16*)minisel_Anm_0f[MiniSelStar.usAnmPat].uiObjAddr;	//オブジェクトのデータ

		//oamの組み立て
		n += *(u16*)anm++;
		if(n > 128)	return;
		for ( ; i < n; i++)
		{
			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].VPos = (data+MINISEL_STAR_Y[j])&0xff;

			data = *(u16*)anm++;
			*(u16*)(oam++) = data;
			OamBuf[i].HPos = (data+MINISEL_STAR_X[j])&0x1ff;

			*(u16*)(oam++) = *(u16*)anm++;
			OamBuf[i].Priority = 2;
			oam++;
		}
	}

	ucCntObj = n;
}

//**************************************************************
//end
