/************************************************************************
 *									*
 *	NU64 スターフォックス オプション 処理                		*
 *									*
 ************************************************************************/
#include "fox_all.h"
#include "fox_and_poly.h"
#include "fox_jt_poly.h"
#include "fox_txt_poly.h"
#include "fox_vtx_poly.h"
#include "fox_map_poly.h"
#include "fox_moji_poly.h"
#include "fox_main.h"
#include "fox_std_dma.h"
#include "fox_fade.h"
#include "../audio/audio_game.h"
#include "fox_eeprom.h"

//#define OPT_DEBUG

#define OP_AS  (0) 	/* メテオ */
#define OP_A6  (1) 	/* エリア６ */
#define OP_BO  (2) 	/* ボルス */
#define OP_SZ  (3) 	/* セクターＺ */
#define OP_SX  (4) 	/* セクターＸ */
#define OP_SY  (5) 	/* セクターＹ */
#define OP_KT  (6) 	/* カタリナ */
#define OP_MC  (7) 	/* マクベス */
#define OP_ZO  (8) 	/* ゾネス */
#define OP_CN  (9)	/* コーネリア */
#define OP_TI (10) 	/* タイタニア */
#define OP_AC (11) 	/* アクエリア */
#define OP_FO (12) 	/* フォーチュナ */
#define OP_SN (13) 	/* 太陽 */
#define OP_BM1 (14) 	/* ベノム1 */
#define OP_BM3 (15) 	/* ベノム3 */

#define ROOTS (24)

#define ANY_KEY	(CONT_A|CONT_B|CONT_C|CONT_D|CONT_E|CONT_START)

#define MAIN_MENU	(1000)

#define MAIN_GAME	(0)
#define TRAINING	(1)
#define VS_MENU		(2)
#define SCORE		(3)
#define SOUND_A		(4)
#define BACKUP		(5)
#define SOUND_B		(6)

#define VS_GAME_B	(2000)
#define VS_POINT	(10)
#define VS_BATTLE	(20)
#define VS_TIMET	(30)

#define THE_END		(100)
#define NAME_ENTRY	(200)
#define END_SCORE	(300)
#define END_SEIKYU	(400)

#define IA8		(0)
#define CI4		(1)
#define CI8		(2)
#define RGBA16		(3)

#define NOFLIP		(0)

#define STICK_X		(0)
#define STICK_Y		(1)

#define NUM_LOOP	(0)
#define NUM_NOLOOP	(1)

/*----------------------------------------------------------------------*/
/* 構造体								*/
/*----------------------------------------------------------------------*/
typedef struct {
    int TxtType;
    int flip;
    void *txt;
    unsigned short *tlut;
    int SizX;
    int SizY;
    float posX;
    float posY;
    float sclX;
    float sclY;
    int r;
    int g;
    int b;
    int a;
} TXTR_T;

/* ウインドウを表示するための情報 */
typedef struct {
    float posX;
    float posY;
    float posZ;
    float sclX;
    float sclY;
} WIN_T;

/* カーソルを表示するための情報 */
typedef struct {
    float posX;
    float posY;
    float rngX;
} CUR_T;

typedef struct {
    TXTR_T text;
    WIN_T win;
    CUR_T cur;
    int Tdraw_sw;
    int Wdraw_sw;
} MENU_T;

typedef struct {
    int AdWaitTime;
    int WaitTime;
} STICK_T;

typedef struct {
    int   startP;  	/* 開始惑星 No. */
    int   endP;    	/* 終了惑星 No. */
    int   LineCol; 	/* ラインの色 No. */
} ROOT;

/*----------------------------------------------------------------------*/
/* extern								*/
/*----------------------------------------------------------------------*/
extern unsigned char MAP_kumo_txt[];	    /* 惑星の雲のTexture */

extern unsigned char MAP_CN_txt[];          /* コーネリアのTexture */
extern unsigned short MAP_CN_txttlut[];
extern unsigned char MAP_FO_txt[];          /* フィチナのTexture */
extern unsigned short MAP_FO_txttlut[];
extern unsigned char MAP_AC_txt[];	    /* アクアスのTexture */
extern unsigned short MAP_AC_txttlut[];
extern unsigned char MAP_BM_txt[];	    /* ベノムのTexture */
extern unsigned short MAP_BM_txttlut[];
extern unsigned char MAP_TI_txt[];	    /* タイタニアのTexture */
extern unsigned short MAP_TI_txttlut[];
extern unsigned char MAP_KT_txt[];	    /* カタリナのTexture */
extern unsigned short MAP_KT_txttlut[];
extern unsigned char MAP_MC_txt[];	    /* マクベスのTexture */
extern unsigned short MAP_MC_txttlut[];
extern unsigned char MAP_ZO_txt[];	    /* ゾネスのTexture */
extern unsigned short MAP_ZO_txttlut[];

extern Gfx MAP_plKT[];		/*  6:カタリナ */
extern Gfx MAP_plMC[];		/*  7:マクベス */
extern Gfx MAP_plZO[];		/*  8:ゾネス */
extern Gfx MAP_plCN[];		/*  9:コーネリア */
extern Gfx MAP_plTI[];		/* 10:タイタニア */
extern Gfx MAP_plAC[];		/* 11:アクエリア */
extern Gfx MAP_plFO[];		/* 12:フォーチュナ */
extern Gfx MAP_plBM[];		/* 13:ベノム */
extern Gfx MAP_PLkumo[];	/* 雲 */

extern char MAP_CN1_txt[96*96];
extern char MAP_FO1_txt[96*96];
extern char MAP_AC1_txt[96*96];
extern char MAP_BM1_txt[96*96];
extern char MAP_TI1_txt[96*96];
extern char MAP_KT1_txt[96*96];
extern char MAP_MC1_txt[96*96];
extern char MAP_ZO1_txt[96*96];
extern char MAP_KUMO1_txt[96*96];
extern float PlaLoopPtF[9];

extern void *PlaTxt[9];
extern char *PlaTxtOrg[9];

extern int rank_nakama_total[10][3];
extern int rank_totalhit[10];
extern unsigned char rank_name[10][4];

/** 振動パック **/
extern float vib_power[];
extern int vib_power_tim[];

/* スコア */
extern int total_score;
extern int title_return;
extern int wip_stat;
extern int wip_time;
extern int rank_dispP;

extern void star_initial_set( void );

extern void draw_ZankiSuu( int, int, int );
extern void moji_number( int, int, int );
extern void large_moji_number( int, int, int );
extern int keta_ck( int );
extern void easy_ranking_display( void );
extern void draw_PlayRoot( int );

extern int RankInCheck( void );

extern void draw_back_star2( int, int );

extern void get_rank_data( void );

extern void texture_circle( unsigned char *, unsigned char *, float * );

/*----------------------------------------------------------------------*/
/* static								*/
/*----------------------------------------------------------------------*/
static int menu_phase;
static int process_phase;
static int exit_phase;
static int section_phase;
static int SPdisp_phase;
static int SPdisp2_phase;

static int wait_time;
static int wait_time1;

static STICK_T MainMenu;
static STICK_T OptMenu;
static STICK_T MainGameEx;
static STICK_T SoundEx;

static int stick_wait_time2;

static int mainM_cur_pos;
static int vsM_cur_pos;
static int sndEx_cur_pos;
static int mainGmEx_cur_pos;
static int cur_pos;
static int cur_posX;
static int cur_draw_sw;
static int YesNo_sw;
static int before_menu;

static int Ending_flg;	/** エンディングを観たかどうか **/

static int BackUpClearOk_flg;

static int keySw;
static float score_yp;
static float score_yp2;
static float score_ypw;
static float score_yp2w;

/* 文字点滅用 */
static float SelColor;
static float OkColor;
static float OkFlushCnt;

static int SelSw;

static float CurZp,CurScl,CurXaR,CurXaL;
static float briXp,briYp,briSclX,briSclY;
static int bri_sw;

static float KoWinXp,KoWinYp,KoWinXa;
static float LigXa,LigYa;
static int LigR,LigG,LigB;
static int KanR,KanG,KanB;


/***************** メインメニュー *****************/
static int mainM_mode;
static float mmwinYp[] = {  60.0f,  36.0f,  12.0f, -12.0f, -36.0f, -60.0f };
#if LOCALE==CHINA
static float mmtxtXp[] = { 124.0f, 120.0f, 144.0f, 128.0f, 128.0f, 120.0f };
static float mmtxtXpS[] = { 124.0f, 120.0f, 144.0f, 128.0f, 128.0f, 120.0f };
static float mmtxtYp[] = {  54.0f,  78.0f, 102.0f, 126.0f, 150.0f, 174.0f };
static float mmtxtYpS[] = { 54.0f,  78.0f, 102.0f, 126.0f, 150.0f, 174.0f };
#else
static float mmtxtXp[] = { 124.0f, 118.0f, 145.0f, 125.0f, 133.0f, 118.0f };
static float mmtxtXpS[] = { 124.0f, 118.0f, 145.0f, 125.0f, 133.0f, 118.0f };
static float mmtxtYp[] = {  54.0f,  78.0f, 103.0f, 126.0f, 150.0f, 175.0f };
static float mmtxtYpS[] = {  54.0f,  78.0f, 103.0f, 126.0f, 150.0f, 175.0f };
#endif
static float mgexXp[] = { 124.0f, 125.0f };
static float mgexYp[] = { 54.0f, 55.0f };
#if LOCALE==CHINA
static float sdexXp[] = { 128.0f, 120.0f };
static float sdexYp[] = { 150.0f, 150.0f };
#else
static float sdexXp[] = { 133.0f, 125.0f };
static float sdexYp[] = { 151.0f, 151.0f };
#endif
static float ad_sp[] = { 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f };
static float ad_sp2[] = { 1.9f, 2.4f, 0.9f, 1.9f, 1.8f, 2.4f };

#if LOCALE==CHINA
static MENU_T mainM[] = {
  {
    { IA8,NOFLIP,
      TXT_Z02_txt,NULL,
      72,12, 126.0f,46.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,30.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,27.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_Z03_txt,NULL,
      80,12, 126.0f,184.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,18.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,16.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_Z04_txt,NULL,
      32,12, 126.0f,184.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,6.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,6.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_Z05_txt,NULL,
      64,12, 110.0f,91.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,-6.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,-5.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_Z06_txt,NULL,
      64,12, 110.0f,116.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,-18.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,-16.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_Z07_txt,NULL,
      80,12, 126.0f,184.0f, 1.0f,1.0f,20,0,75,255 }, 
    { 0.0f,-30.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,-27.0f,80.0f },
    ON,
    ON
  },
};
#else
static MENU_T mainM[] = {
  {
    { IA8,NOFLIP,
      TXT_E02_txt,NULL,
      72,12, 126.0f,46.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,30.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,27.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_E03_txt,NULL,
      80,12, 126.0f,184.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,18.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,16.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_E04_txt,NULL,
      32,10, 126.0f,184.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,6.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,6.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_E05_txt,NULL,
      64,12, 110.0f,91.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,-6.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,-5.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_E06_txt,NULL,
      64,10, 110.0f,116.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,-18.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,-16.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_E07_txt,NULL,
      80,10, 126.0f,184.0f, 1.0f,1.0f,20,0,75,255 }, 
    { 0.0f,-30.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,-27.0f,80.0f },
    ON,
    ON
  },
};
#endif

/***************** ＶＳメニュー *****************/
static int vsM_mode;
#if LOCALE==CHINA
static MENU_T vsM[] = {
  {
    { IA8,NOFLIP,
      TXT_Z11_txt,NULL,
      96,13, 110.0f,91.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,11.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,11.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_Z12_txt,NULL,
      96,12, 110.0f,116.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,0.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,0.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_Z13_txt,NULL,
      96,12, 110.0f,138.0f, 1.0f,1.0f,20,0,75,255 }, 
    { 0.0f,-11.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,-11.0f,80.0f },
    ON,
    ON
  },
};
#else
static MENU_T vsM[] = {
  {
    { IA8,NOFLIP,
      TXT_E11_txt,NULL,
      96,13, 110.0f,91.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,11.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,11.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_E12_txt,NULL,
      96,10, 110.0f,116.0f, 1.0f,1.0f, 20,0,75,255 }, 
    { 0.0f,0.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,0.0f,80.0f },
    ON,
    ON
  },
  {
    { IA8,NOFLIP,
      TXT_E13_txt,NULL,
      96,10, 110.0f,138.0f, 1.0f,1.0f,20,0,75,255 }, 
    { 0.0f,-11.0f,-130.0f, 0.2f,0.11f },
    { -40.0f,-11.0f,80.0f },
    ON,
    ON
  },
};
#endif


/***************** サウンド *****************/
static u8 SoundBal;
static u8 SndMode[] = {
    NA_SOUT_STEREO,
    NA_SOUT_MONO,
    NA_SOUT_HEADPHONE
};
static u8 SndHandle[] = {
    NA_VOL_MUSIC,
    NA_VOL_VOICE,
    NA_VOL_SE
}; 

static STICK_T SoundA;
static STICK_T SoundAExit;
static STICK_T SoundA2;
static STICK_T SoundALv;
static float snd_ChgColor[5];
static int SoundTest;
static int SoundSelPos;

static float MsndSP_posX[4] = { 62.0f, 222.0f, 75.0f, 235.0f };
static float MsndSP_posY[4] = { 43.0f,  43.0f, 46.0f,  46.0f };

static TXTR_T MsndSP[4] = {
    { CI8,NOFLIP,
      TXT_speaker_txt,TXT_speaker_txttlut,
      32,32, 56.0f,175.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
    { CI8,NOFLIP,
      TXT_speaker_txt,TXT_speaker_txttlut,
      32,32, 216.0f,175.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
    { CI4,NOFLIP,
      TXT_speaker02_txt,TXT_speaker02_txttlut,
      16,16, 69.0f,178.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
    { CI4,NOFLIP,
      TXT_speaker02_txt,TXT_speaker02_txttlut,
      16,16, 229.0f,178.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
};

static TXTR_T MsndA_bar[3] = {
  { RGBA16,NOFLIP,TXT_sound_line_txt,NULL, 104,10,
    151.0f,135.0f, 1.05f,1.0f, 0xff,0xff,0xff,0xff }, 
  { RGBA16,NOFLIP,TXT_sound_line_txt,NULL, 104,10,
    151.0f,161.0f, 1.05f,1.0f, 0xff,0xff,0xff,0xff }, 
  { RGBA16,NOFLIP,TXT_sound_line_txt,NULL, 104,10,
    151.0f,188.0f, 1.05f,1.0f, 0xff,0xff,0xff,0xff }, 
};
static TXTR_T MsndA_tsumami[3] = {
  { RGBA16,NOFLIP,TXT_sound_tsumami_txt,NULL,
    16,16, 245.0f,132.0f,1.0f,1.0f,0xff,0xff,0xff,0xff }, 
  { RGBA16,NOFLIP,TXT_sound_tsumami_txt,NULL,
    16,16, 245.0f,158.0f,1.0f,1.0f,0xff,0xff,0xff,0xff }, 
  { RGBA16,NOFLIP,TXT_sound_tsumami_txt,NULL,
    16,16, 245.0f,185.0f,1.0f,1.0f,0xff,0xff,0xff,0xff }, 
};

/***************** サウンド (extra) *****************/
static Vtx sndbar_v[] = {
   {  1,  1,  0, 0, 0, 0, 255, 255, 255, 255},
   { -1,  1,  0, 0, 0, 0, 255, 255, 255, 255},
   { -1,  0,  0, 0, 0, 0, 255, 255, 255, 255},
   {  1,  0,  0, 0, 0, 0, 255, 255, 255, 255},
};

Gfx sndbar[] = {
    gsSPVertex( &sndbar_v[0], 4, 0 ),
    gsSP1Quadrangle( 0, 1, 2, 3, 0),
    gsSPEndDisplayList(),
};

static Vtx sndbar2_v[] = {
   {  1,  0,  0, 0, 0, 0, 255, 255, 255, 255},
   { -1,  0,  0, 0, 0, 0, 255, 255, 255, 255},
   { -1,  -1,  0, 0, 0, 0, 255, 255, 255, 255},
   {  1,  -1,  0, 0, 0, 0, 255, 255, 255, 255},
};

Gfx sndbar2[] = {
    gsSPVertex( &sndbar2_v[0], 4, 0 ),
    gsSP1Quadrangle( 0, 1, 2, 3, 0),
    gsSPEndDisplayList(),
};

static Vtx sndbar3_v[] = {
   {  1,  1,  0, 0, 0, 0, 255, 255, 255, 255},
   { -1,  1,  0, 0, 0, 0, 255, 255, 255, 255},
   { -1,  -1,  0, 0, 0, 0, 255, 255, 255, 255},
   {  1,  -1,  0, 0, 0, 0, 255, 255, 255, 255},
};

Gfx sndbar3[] = {
    gsSPVertex( &sndbar3_v[0], 4, 0 ),
    gsSP1Quadrangle( 0, 1, 2, 3, 0),
    gsSPEndDisplayList(),
};

static STICK_T SoundBNm;
static float spanaFsc[32];
static int SpeAnaPatn;
static int SoundTestNum;
static int SoundPlayStat;

static unsigned char *Num[10] = {
    MOJI_s0_txt,
    MOJI_s1_txt,
    MOJI_s2_txt,
    MOJI_s3_txt,
    MOJI_s4_txt,
    MOJI_s5_txt,
    MOJI_s6_txt,
    MOJI_s7_txt,
    MOJI_s8_txt,
    MOJI_s9_txt,
};

/***************** バックアップクリア *****************/
static int BkupFlushCnt[2];
static float yn_ChgColor[2] = { 255.0f, 255.0f };


/***************** ＶＳ *****************/
extern int VS_point;
extern int PlayerMode[];
extern int VsReturn;
extern int SelectStage;

static int ok_disp;
static int TryalTime;

#if 0
static int MachineseWaitList;
static int SelectMachinese;
static int MaxSelectMachinese;
static float vsMachinese_ChgColor;
static int MachineseFlushCnt;
static int MachineseWaitListNum;
static int SelectMachineseNum;
static float vsList_ChgColor;
static int ListFlushCnt;
#endif

static int TmTryTopHit[5] = { 56,67,78,89,91 };

static int FlushCnt[4];
static float vs_ChgColor[4];
static float vsPoint_ChgColor;
static int PointFlushCnt;
static float vsStage_ChgColor;
static int StageFlushCnt;
static float vsTime_ChgColor;
static int TimeFlushCnt;

static STICK_T VsSelST[4];
static STICK_T VsChrSelST[4];
static unsigned char AllSelected;
static int CharaHande[4] = { 0, 0, 0, 0 };
static int NowVsMode;
static int MatchPointNum;
static int SelectStageNum;
static int TryalTimeNum;


/***************** スコア *****************/
static int score_disp_f;
static int EsRankYp;
static int CircleCnt1;
static int CircleCnt2;
static float Ya0ChgCol;
static float Ya1ChgCol;
static float Ya2ChgCol;
static STICK_T EsRankST;
static STICK_T NoEsRankST;

static ROOT Root[ROOTS]={
/*** Level 1 ***/
	/* 1 */
/* 0 */	{ OP_CN, OP_AS, 0 }, /* コーネリア -> アステロイド */
	/* 2 */
/* 1 */	{ OP_AS, OP_FO, 0 }, /* アステロイド -> フィチナ */
	/* 3 */
/* 2 */	{ OP_FO, OP_SX, 0 }, /* フィチナ -> セクターＸ */
	/* 4 */
/* 3 */	{ OP_SX, OP_TI, 0 }, /* セクターＸ -> タイタニア */
	/* 5 */
/* 4 */	{ OP_TI, OP_BO, 0 }, /* タイタニア -> 防衛衛星 */
	/* 6 */
/* 5 */	{ OP_KT, OP_SX, 0 }, /* カタリナ -> セクターＸ */
	/* 7 */
/* 6 */	{ OP_MC, OP_BO, 0 }, /* マクベス -> 防衛衛星 */
	/* 8 */
/* 7 */	{ OP_SZ, OP_BO, 0 }, /* セクターＺ -> 防衛衛星 */
	/* 9 */
/* 8 */	{ OP_BO, OP_BM1, 0 }, /* ボルス -> ベノムＬＶ１ */

/*** Level 2 ***/
	/* 1 */
/* 9 */	{ OP_SY, OP_KT, 1 }, /* セクターＹ -> カタリナ */
	/* 2 */
/* 10*/	{ OP_KT, OP_SN, 1 }, /* カタリナ -> 太陽 */
	/* 3 */
/* 11*/	{ OP_SN, OP_MC, 1 }, /* 太陽 -> マクベス */
	/* 4 */
/* 12*/	{ OP_SX, OP_MC, 1 }, /* セクターＸ -> マクベス */
	/* 5 */
/* 13*/	{ OP_FO, OP_SN, 1 }, /* フィチナ -> 太陽 */
	/* 6 */
/* 14*/	{ OP_ZO, OP_MC, 1 }, /* ゾネス -> マクベス */

/*** Level 3 ***/
	/* 1 */
/* 15*/	{ OP_CN, OP_SY, 2 }, /* コーネリア -> セクターＹ */
	/* 2 */
/* 16*/	{ OP_SY, OP_AC, 2 }, /* セクターＹ -> アクエリア */
	/* 3 */
/* 17*/	{ OP_AC, OP_ZO, 2 }, /* アクエリア -> ゾネス */
	/* 4 */
/* 18*/	{ OP_ZO, OP_SZ, 2 }, /* ゾネス -> セクターＺ */
	/* 5 */
/* 19*/	{ OP_SZ, OP_A6, 2 }, /* セクターＺ -> エリア６ */
        /* 6 */
/* 20*/	{ OP_MC, OP_A6, 2 }, /* マクベス -> エリア６ */
        /* 7 */
/* 21*/	{ OP_A6, OP_BM1, 2 }, /* エリア６ -> ベノムＬＶ３ */

/** ワープ **/
/* 22*/	{ OP_AS, OP_KT, 3 }, /* メテオ -> カタリナ */
/* 23*/	{ OP_SX, OP_SZ, 4 }, /* セクターＸ -> セクターＺ */

};

static Gfx *PlaData[16]={
    MAP_Icon_Rock,	/*  0:アイコン "石" */
    MAP_CL01,		/*  1:エリア６ */
    MAP_BO,		/*  2:防衛衛星 */
    MAP_SectarZ,	/*  3:セクターＺ */
    MAP_SectarX,	/*  4:セクターＸ */
    MAP_SectarY,	/*  5:セクターＹ */
    MAP_plKT,		/*  6:カタリナ */
    MAP_plMC,		/*  7:マクベス */
    MAP_plZO,		/*  8:ゾネス */
    MAP_plCN,		/*  9:コーネリア */
    MAP_plTI,		/* 10:タイタニア */
    MAP_plAC,		/* 11:アクエリア */
    MAP_plFO,		/* 12:フォーチュナ */
    MAP_SN,		/* 13:太陽 */
    MAP_plBM,		/* 14:ベノム */
    MAP_plBM,		/* 15:ベノム */
};

static char *StageName[] = {
    "ME",
    "A6",
    "BO",
    "SZ",
    "SX",
    "SY",
    "KA",
    "MA",
    "ZO",
    "CO",
    "TI",
    "AQ",
    "FO",
    "SO",
    "VE",
    "VE",
};

/*----------------------------------------------------------------------*/
/* マスク用ポリゴンデータ						*/
/*----------------------------------------------------------------------*/
/* 4 vertices */
static Vtx Mask_v[]={
    {  -11, -11, 0,0,   0, 255, 0, 0, 0, 0},   /* v0 p1/V1 used 2 times */ 
    {   11, -11, 0,0, 255, 255, 0, 0, 0, 0},   /* v1 p1/V2 used 1 times */ 
    {   11,  11, 0,0, 255,   0, 0, 0, 0, 0},   /* v2 p1/V3 used 2 times */ 
    {  -11,  11, 0,0,   0,   0, 0, 0, 0, 0},   /* v3 p2/V3 used 1 times */ 
};
static Gfx Mask[]={
    gsSPVertex(&Mask_v[0], 4, 0),
    gsSP1Triangle(0, 1, 2, 0),
    gsSP1Triangle(0, 2, 3, 0),
    gsSPEndDisplayList(),
};
    

static void option_init( void );
static void option_main( void );

static void main_menu_init( void );
static void main_menu( void );
static void main_menu_display( void );

static void biribiri_ctrl( void );
static void biribiri_display( void );

static void NextMenuInit( void );

static void vs_menu_init( void );
static void vs_menu( void );
static void vs_menu_display( void );

static void soundA_init( void );
static void soundA( void );
static void soundA_display( void );
static void SelectSoundOut( void );
static void SelectSoundLevel( void );
static void Speaker_display( void );
static void Awing_display( float, float, float, float, float, float );

static void soundB_init( void );
static void soundB( void );
static void soundB_display( void );

static void go_map( void );
static void go_training( void );

static void vs_chara_select_init( void );
static void vs_chara_select( void );
static void vs_hande_select( void );
static void vs_chara_select_display( void );

static void N64_display( void );
static void PlayerSel_display( int );
static void OK_display( void );

static void vs_gameB_init( void );
static void vs_gameB( void );
static void vs_gameB_display( void );

static void vs_KeyTime_init( void );

static void PointMatch_Main( void );
static void Batolloyal_Main( void );
static void TimeTryal_Main( void );

static void Point_Select( void );
static void Time_Select( void );
#if 0
static void MachineseWaitList_Select( void );
static void Machinese_Select( void );
#endif
static void Stage_Select( void );
static void OK_Select( void );
static void VS_Start( void );

static void PointMatch_display( void );
static void TimeTryal_display( void );
#if 0
static void MachineseWaitListSel_display( void );
static void MachineseWaitList_display( void );
static void MachineseSelect_display( void );
static void TopHits_display( void );
#endif
static void StageSel_display( void );
static void StageSelStage_display( void );
static void StageSelStageTT_display( void );
static void Yajirusi_display( float, float, float, int, int, int );

static void backUpClear_init( void );
static void backUpClear( void );
static void backUpClear_sub( void );
static void backUpClear_display( void );

static void score_init( void );
static void score( void );
static void menu_score_display( void );
static void Score_Mask_Display( void );
static void ranking_display( void );
static void drawRankNum( int,int,int );
static void drawRankName( int,int,int );
static void drawRankTotalHit( int,int,int );
static void drawNakamaTotlal( int,int,int );
static void score_display( void );
static void score_ctrl( void );
static void Root_display( int, float, float );
static void Root_AeraDisplay( int, int, float, float, int );
static void Root_HitCntDisplay( int, int, float, float );
static void Root_NakamaStatDisplay( int, int, float, float );
static void Root_StageNameDisplay( int, int, float, float );
static void Root_StagePlanetDisplay( int, float, int );
static void Root_PlanetKnsyouDisplay( float, float, float );
static void easy_ranking_ctrl( void );
static void noeasy_ranking_ctrl( void );
static int GetRootLineCol( int, int );
int RankInCheck( void );

static void button_info_display( void );
static void menu_title_display( void );
static void vs_menu_title_display( void );
static void AwingCur_display( CUR_T );
static void txt_display( TXTR_T );
static void window_display( WIN_T );

static void planet_data_init( void );
static void planet_scroll( void );

static void ColorFlush( float * );


static void exit_process( int );
static void push_now2( void );
static void ligpos_calc( float xa, float ya, float lr,
			 float *rx, float *ry, float *rz );

static int KeyIn_Move_Cur( int *, int, int, int, int,
			    int, int, int, STICK_T * );
static int KeyIn_Move_Level( float *, float, float, STICK_T * );
static int KeyIn_Select2( int * );


/* ゲームオーバー */
extern u16 next_mode;
extern u16 before_mode;
//static int g_count;
//static float g_size;

static float gv_sp[] = {
    0.0f,
    0.0f,
    0.0f,
};


/*----------------------------------------------------------------------*/
/*									*/
/* エンディングデモ終了後に関する関数および変数				*/
/*									*/
/*----------------------------------------------------------------------*/

/*----------------------------------------------------------------------*/
/*									*/
/* エンディング,ネームエントリー,スコア表示後,最後の最後に表示する	*/
/* 請求書画面に関する関数および変数					*/
/*									*/
/*----------------------------------------------------------------------*/
static int hanko_sw;

static void seikyusyo( void );
static void seikyusyo_display( void );



#ifdef OPT_DEBUG
/*----------------------------------------------------------------------*/
/*									*/
/* エンディングデモ終了後のエンド画面に関する関数および変数		*/
/*									*/
/*----------------------------------------------------------------------*/

static void TheEnd( void );
static void TheEnd_display( void );
#endif

/*----------------------------------------------------------------------*/
/*									*/
/* ネームエントリー画面に関する関数および変数				*/
/*									*/
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* ネームエントリー用文字データ						*/
/*----------------------------------------------------------------------*/
static char pch[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.";

static int ranking_pos;
static int entry_pos;
static int entry_MojiPos[3];
static int moji_sel_f[3];
static float moji_Xa[3];
static float moji_Ya[3];
static float moji_Za[3];
static float moji_XaAdd[3];
static float moji_YaAdd[3];
static float moji_ZaAdd[3];
static float entry_ligXa;
static float entry_ligYa;
static int entry_phase;
static int entry_f;
static int entry_end;
static int EntryFlushCnt[3];
static char entry_area[3][2];
static STICK_T NameEST[3];

static void name_entry( void );
static void name_entry_init( void );
static void EntryName( void );
static void name_entry_display( void );
static int get_moji_pos( int );
static void RankingDataSave( void );
static void poly_moji_putc( int, float, float, float, float,
			    float, float, float );


/*----------------------------------------------------------------------*/
/*									*/
/* エンディングデモ終了後のランキング画面に関する関数および変数		*/
/*									*/
/*----------------------------------------------------------------------*/
static void end_score( void );
static void end_score_ctrl( void );
static void end_score_display( void );


/* TEST用 */
#ifdef OPT_DEBUG
static int debug_sw;
static int debug2_sw;
static int mojiR,mojiG,mojiB,mojiA;
static void debug_display( void );
static void debug2_display( void );
static void KeyIn_Lig( void );
#endif
#if 0
static void controler_init( void );
static void controler( void );
static void StickTypeSelect( void );
static void ActionAwing( void );
static void TagetSelect( void );
static void ContTypeSelect( void );
static void ContRoller_display( void );
static void controler_display( void );
static void Cont_Mask_Display( void );
static void TsAwingInit( void );
static void TsAwing_display( PL * );
static void PlayerTarget_display( void );
#endif
#if 0
static void VsControler( void );
static void VsStickTypeSelect( void );
static void VsContTypeSelect( void );
#endif

#if 0
static void PlayerSelBase_display( int );
static void PikaPika_display( int, PIKA * );
static void PushNext_display( void );
static void VsController( void );
static void VsCaution_display( void );
static void PushNextB_display( void );
#endif

/*======================================================================*
 *	 オプション イニシャル   					*
 *======================================================================*/
static void option_init( void )
{
    register int i;
    int aa;
    int extra_modeWork;

    min_retrace = 2;

#if LOCALE==CHINA
    mainM[MAIN_GAME].text.txt = TXT_Z02_txt;
    mainM[MAIN_GAME].text.SizX = 72;
    mainM[MAIN_GAME].text.SizY = 12;
    mainM[SOUND_A].text.txt = TXT_Z06_txt;
    mainM[SOUND_A].text.SizX = 64;
    mainM[SOUND_A].text.SizY = 12;
#else
    mainM[MAIN_GAME].text.txt = TXT_E02_txt;
    mainM[MAIN_GAME].text.SizX = 72;
    mainM[MAIN_GAME].text.SizY = 12;
    mainM[SOUND_A].text.txt = TXT_E06_txt;
    mainM[SOUND_A].text.SizX = 64;
    mainM[SOUND_A].text.SizY = 10;
#endif

    for( i=0; i<6; i++ ) {
	mmtxtXp[i] = mmtxtXpS[i];
	mmtxtYp[i] = mmtxtYpS[i];
    }
    
#ifdef OPT_DEBUG
    /** 本当は一度エンディングを観たかどうかのチェックをする **/
    Ending_flg =2;
#else
    /** エクストラ出現条件のチェック **/
    aa = 1;
    for( i=0; i<16; i++ ) {
	if( i == OP_BM1 ) continue;
	if( !(fox_save.rom[0].data.pl_stat[i].medal & 0x01) ) {
	    aa = 0;
	    break;
	}
    }
    Ending_flg = aa;
#endif

    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;
    fade_A = 0x00;

    frame_A = 0xff;

    BG_color = 0x00; /** 背景色 **/

    mainM_cur_pos = 0;
    if( before_mode == GAME && mapno == TR ) {
	before_mode = 0;
	mainM_cur_pos = 1;
    }

    vsM_cur_pos = 0;
    sndEx_cur_pos = 0;
    mainGmEx_cur_pos = 0;
    extra_modeWork = extra_mode;
    extra_mode = 0;

    
    frcnt = 0;
    wip_time = 0;
    wait_time = 0;
    wait_time1 = 0;

    menu_phase = MAIN_MENU;

    if( before_mode == OVER || before_mode == ENDING ) {
	
	if( before_mode == ENDING ) {
	    ClearStageNum[StagePtr] = 13; /** ベノム **/
#if 0
	    for( i=0; i<100; i++ )
		PRINTF( "map:%d sw:%d\n",mapno, StageClearSwitch[AND] );
#endif
	    /** Lv1 Clear **/
	    if( StageClearSwitch[AND] == 1 ) {
		fox_save.rom[0].data.pl_stat[14].course_in = 1;
		if( extra_modeWork ) {
		    fox_save.rom[0].data.pl_stat[14].extra_clear = 1;
		} else {
		    fox_save.rom[0].data.pl_stat[14].clear = 1;
		}
		data_save();
	    }
	    /** Lv3 Clear **/
	    else if( StageClearSwitch[AND] == 2 ) {
		ClearKunsyou[StagePtr] = 1;
		fox_save.rom[0].data.pl_stat[15].course_in = 1;

//		PRINTF( "extra_modeWork:%d\n",extra_modeWork );
		
		if( extra_modeWork ) {
		    fox_save.rom[0].data.pl_stat[15].extra_clear = 1;
		    fox_save.rom[0].data.pl_stat[15].extra_medal = 1;
		} else {
		    fox_save.rom[0].data.pl_stat[15].clear = 1;
		    fox_save.rom[0].data.pl_stat[15].medal = 1;
		}
		data_save();
	    }
	}
	
	get_rank_data();
	ranking_pos = RankInCheck();
	if( ranking_pos != -1 )
	    /** ネームエントリーへ **/
	    menu_phase = NAME_ENTRY;
	else
	    /** スコアー表示へ **/
	    menu_phase = END_SCORE;
    } else {
	/** ＶＳからもどってきた **/
	if( VsReturn ) {
	    mainM_cur_pos = VS_MENU;
	    vsM_cur_pos = VS_game_mode;

	    for( i=0; i<6; i++ ) {
		if( i == VS_MENU ) continue;
		mainM[i].win.sclX = 0.01f;
		mainM[i].win.sclY = 0.21f;
		mainM[i].win.posY = mmwinYp[i];
		mainM[i].win.posX = 0.0f;
		mainM[i].win.posZ = 0.0f;
		mainM[i].Wdraw_sw = OFF;

		mainM[i].text.sclX = 0.01f;
		mainM[i].text.sclY = 1.0f;
		mainM[i].text.posX = 158.0f;
		mainM[i].text.posY = mmtxtYp[i];
		mainM[i].Tdraw_sw = OFF;
	    }

	    mainM[VS_MENU].win.posX = 0.0f;
	    mainM[VS_MENU].win.posZ = 0.0f;
	    mainM[VS_MENU].win.posY = 90.0f;
	    mainM[VS_MENU].win.sclX = 0.4f;
	    mainM[VS_MENU].win.sclY = 0.21f;
	    mainM[VS_MENU].Wdraw_sw = ON;
	    mainM[VS_MENU].text.sclX = 1.0f;
	    mainM[VS_MENU].text.sclY = 1.0f;
	    mainM[VS_MENU].text.posX = 145.0f;
	    mainM[VS_MENU].text.posY = 25.0f;
	    mainM[VS_MENU].Tdraw_sw = ON;

	    menu_phase = VS_MENU;
	} else {
	    menu_phase = MAIN_MENU;
	}
    }


    process_phase = 0;
    exit_phase = 0;
    section_phase = 0;

    option_mode = OPTION_MAIN;

    mem_stage_clear();

    starXpos = 320.0f;
    starYpos = 240.0f;
    
    star_initial_set();

    eyeX = 0.0f;
    eyeY = 0.0f;
    eyeZ = 10.0f;
    wayX = 0.0f;
    wayY = 0.0f;
    wayZ = 0.0f;

    LigXa = -80.0f;
    LigYa = 0.0f;
    LigR = 225;
    LigG = 225;
    LigB = 225;
    KanR = 30;
    KanG = 30;
    KanB = 30;

    CurScl = 0.10f;
    CurZp = -130.0f;
    CurXaR = 0.0f;
    CurXaL = 0.0f;

    OkFlushCnt = 0;
    mainM_mode = 0;
    vsM_mode = 0;

    Na_StartBgm( NA_BGM_SELECT );

#ifdef OPT_DEBUG
    debug2_sw = OFF;
    debug_sw = OFF;
    mojiR = 0xff;
    mojiG = 0xff;
    mojiB = 0xff;
    mojiA = 0xff;  
#endif
}


/*======================================================================*
 *	オプション画面制御処理						*
 *======================================================================*/
void option(void)
{
    if( wait_time > 0 ) wait_time--;
    if( wait_time1 > 0 ) wait_time1--;

    switch(option_mode) {
    case OPTION_WAIT:
	if(!system_time) {
	    option_mode = OPTION_INIT;
	    Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_SELECT);
	}
	break;
    case OPTION_INIT:
	display_mode = DISPLAY_NOTH;
	option_init();
	break;
    case OPTION_MAIN:
	display_mode = DISPLAY_OPTION;
	option_main();
	break;
    }

#ifdef OPT_DEBUG
    if(Key_T[3].button & CONT_G) {
	before_mode = ENDING;
	menu_phase = THE_END;
	process_phase = 0;
    }
    
    if(Key[0].button & CONT_R) {
	if(Key_T[0].button & CONT_L) {
	    system_mode = TITLE;
	    system_time = 2;
	    title_mode = TITLE_WAIT;
	    display_mode = DISPLAY_NOTH;
	}
    }
    
    if(Key_T[2].button & CONT_F) {
	debug2_sw ^= 1;
    }
#endif

    frcnt++;
}

/*======================================================================*
 *	 オプション メイン	   					*
 *======================================================================*/
static void option_main( void )
{
    switch( menu_phase ) {
    case MAIN_MENU:
	main_menu();
	break;
    case MAIN_GAME:
	go_map();
	break;
    case TRAINING:
	go_training();
	break;
    case VS_MENU:
	vs_menu();
	break;
    case SCORE:
	score();
	break;
    case SOUND_A:
	soundA();
	break;
    case BACKUP:
	backUpClear();
	break;
    case SOUND_B:
	soundB();
	break;
	
    case VS_GAME_B:
	vs_gameB();
	break;
    case VS_POINT:
    case VS_BATTLE:
    case VS_TIMET:
	vs_chara_select();
	break;
#ifdef OPT_DEBUG
    case THE_END:
	TheEnd();
	break;
#endif
    case NAME_ENTRY:
	name_entry();
	break;
    case END_SCORE:
	end_score();
	break;
    case END_SEIKYU:
	seikyusyo();
	break;
    default:
	break;
    }
	
    if( cur_draw_sw ) {
	CurXaR += 3.8f;
	CurXaL += 4.2f;
    }
    
#ifdef OPT_DBGUG
    if( (Key_T[0].button & CONT_START) && menu_phase == MAIN_MENU ) {
//	Na_StopPlayerEngine(0);
	system_mode = MAP;
	system_time = 2;
	map_mode = MAP_WAIT;
	display_mode = DISPLAY_NOTH;
    }
#endif
}

/*======================================================================*
 *	 オプション画面表示    						*
 *======================================================================*/
void option_display(void)
{
    switch( menu_phase ) {
    case MAIN_MENU:
	main_menu_display();
	break;
    case VS_MENU:
	vs_menu_display();
	break;
    case SCORE:
	menu_score_display();
	break;
    case SOUND_A:
	soundA_display();
	break;
    case SOUND_B:
	soundB_display();
	break;
    case BACKUP:
	backUpClear_display();
	break;
    case VS_GAME_B:
	vs_gameB_display();
	break;
    case VS_POINT:
    case VS_BATTLE:
    case VS_TIMET:
	vs_chara_select_display();
	break;
	
#ifdef OPT_DEBUG
    case THE_END:
	TheEnd_display();
	break;
#endif
    case NAME_ENTRY:
	name_entry_display();
	break;
    case END_SCORE:
	end_score_display();
	break;
    case END_SEIKYU:
	seikyusyo_display();
	break;

    default:
	break;
    }
    
    if( wip_stat ) {
	push_now2();
	fade_out( FADE_TATE, wip_time );
	pull_now();
    }

#ifdef OPT_DEBUG
    if(Key_T[2].button & CONT_E) {
	time_flag = 1 - time_flag;
    }
    time_display();

#if 0
    rectangle_rgba_a_prim();

    COLOR8X8( 0xff,0xff,0xff,0xff );

    LOCATE8X8( 3, 5 );
    Printf( "MAX RED : %d\n",mojiR );

    if(Key[0].button & CONT_UP) {
	mojiR = (mojiR + 1) & 0xff;
    }
    if(Key[0].button & CONT_DOWN) {
	mojiR = (mojiR - 1) & 0xff;
    }


#endif

    if( debug2_sw ) {
	debug2_display();
    }

#if 0
    /* TEST */
    if(Key_T[2].button & CONT_A) {
	debug_sw = ON;
    }
    if( debug_sw ) {
	debug_display();
    }
#endif
#endif
}

/************************************************************************/
/* 次の画面のイニシャル							*/
/************************************************************************/
static void NextMenuInit( void )
{
    frame_A = 0xff;
    process_phase = 0;

    switch( menu_phase ) {
    case MAIN_GAME:
	frame_A = 0xff;
	display_mode = DISPLAY_NOTH;
	break;
    case VS_POINT:
    case VS_BATTLE:
    case VS_TIMET:
	vs_chara_select_init();
	break;
    case VS_GAME_B:
	vs_gameB_init();
	break;
    case SCORE:
	score_init();
	break;
    case SOUND_A:
	soundA_init();
	break;
    case SOUND_B:
	soundB_init();
	break;
    case BACKUP:
	backUpClear_init();
	break;
    default:
	break;
    }
}

/************************************************************************/
/* 通ったステージルート内の惑星の絵の初期化				*/
/************************************************************************/
static void planet_data_init( void )
{
    register int i;

    CircleCnt1 = 0;
    CircleCnt2 = 0;

    for( i=0; i<96*96; i++ ) {
	MAP_CN1_txt[i] = 106;
	MAP_FO1_txt[i] = 84;
	MAP_AC1_txt[i] = 75;
	MAP_BM1_txt[i] = 81;
	MAP_TI1_txt[i] = 55;
	MAP_KT1_txt[i] = 82;
	MAP_MC1_txt[i] = 68;
	MAP_ZO1_txt[i] = 52;
	MAP_KUMO1_txt[i] = 0;
    }

    for( i=0; i<9; i++ ) {
	PlaLoopPtF[i] = 0.0f;
	texture_circle( (unsigned char *)PlaTxt[i],
			(unsigned char *)SEGMENT_TO_KSEG0(PlaTxtOrg[i]),
			&(PlaLoopPtF[i]) );
    }
}

/************************************************************************/
/* 通ったステージルート内の惑星の自転					*/
/************************************************************************/
static void planet_scroll( void )
{
    if( CircleCnt1 == 5 ) {
	texture_circle( (unsigned char *)PlaTxt[8],
			(unsigned char *)SEGMENT_TO_KSEG0(PlaTxtOrg[8]),
			&(PlaLoopPtF[8]) );
	CircleCnt1 = 0;
    } else {
	CircleCnt1++;
    }

    texture_circle( (unsigned char *)PlaTxt[CircleCnt2*2],
		    (unsigned char *)SEGMENT_TO_KSEG0(
			PlaTxtOrg[CircleCnt2*2]),
		    &(PlaLoopPtF[CircleCnt2*2]) );
    texture_circle( (unsigned char *)PlaTxt[(CircleCnt2*2)+1],
		    (unsigned char *)SEGMENT_TO_KSEG0(
			PlaTxtOrg[(CircleCnt2*2)+1]),
		    &(PlaLoopPtF[(CircleCnt2*2)+1]) );
    CircleCnt2++;
    if( CircleCnt2 > 3 ) CircleCnt2 = 0;
}

/************************************************************************/
/* マップへ								*/
/************************************************************************/
static void go_map( void )
{
    if( fade_A == 0xff ) {
	/** マップ画面へ **/
	Back_star_f = 0;
	menu_phase = 100;
	system_mode = MAP;
	system_time = 2;
	map_mode = MAP_WAIT;
	display_mode = DISPLAY_NOTH;
	Key_wait_time = 3;
    } else {
	fade_A += 0x20;
	if( fade_A > 0xff ) fade_A = 0xff;
    }
}

/************************************************************************/
/* トレーニングへ							*/
/************************************************************************/
static void go_training( void )
{
    if( fade_A == 0xff ) {
	mapno = TR;
	system_mode = GAME;
	system_time = 2;
	game_mode = GAME_WAIT;
	display_mode = DISPLAY_NOTH;
	/* ここから下は本当は PLAY の中のイニシャルでやるべきなのだが 。。。*/
	display_initial();
	ednext_S = 0;  /* コースポイントクリアー */
	scrposZ_S = 0.00f;
	Stage_Demo_On = 1;  /* ステージ別デモセット */
	Key_wait_time = 3;
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_TR);
    } else {
	fade_A += 0x20;
	if( fade_A > 0xff ) fade_A = 0xff;
    }
}


/*----------------------------------------------------------------------*/
/*									*/
/* メイン メニュー							*/
/*									*/
/*----------------------------------------------------------------------*/

/************************************************************************/
/* メイン メニュー Initial						*/
/************************************************************************/
static void main_menu_init( void )
{
    register int i;

    VsReturn = 0;
    frame_A = 0xff;
    Key_wait_time = 0;
    Back_star_f = 800;
    vsM_mode = 0;

    if( mainM_mode == 0 ) {
	cur_draw_sw = ON;
	for( i=0; i<6; i++ ) {
	    mainM[i].text.posX = mmtxtXp[i];
	    mainM[i].text.posY = mmtxtYp[i];
	    mainM[i].text.sclX = 1.0f;
	    mainM[i].text.sclY = 1.0f;
	    mainM[i].Tdraw_sw = ON;
	    
	    mainM[i].win.sclX = 0.4f;
	    mainM[i].win.sclY = 0.21f;
	    mainM[i].win.posY = mmwinYp[i];
	    mainM[i].win.posZ = 0.0f;
	    mainM[i].Wdraw_sw = ON;
	}
    } else {
	cur_draw_sw = OFF;
	for( i=0; i<6; i++ ) {
	    mainM[i].text.sclY = 1.0f;
	    mainM[i].win.sclY = 0.21f;
	    mainM[i].win.posZ = 0.0f;
	    mainM[i].Wdraw_sw = ON;
	    mainM[i].Tdraw_sw = ON;
	}
    }

    briXp = -45.0f;
    bri_sw = OFF;

    MainMenu.AdWaitTime = 0;
    MainMenu.WaitTime = 0;
    MainGameEx.AdWaitTime = 0;
    MainGameEx.WaitTime = 0;
    SoundEx.AdWaitTime = 0;
    SoundEx.WaitTime = 0;
}

/************************************************************************/
/* メイン メニュー							*/
/************************************************************************/
static void main_menu( void )
{
    register int i;
    float ty_pos,wy_pos;
    int res,res1;

    switch( process_phase ) {
    case 0:
	main_menu_init();
	if( mainM_mode == 0 ) {
	    process_phase++;
	} else {
	    mmtxtXp[MAIN_GAME] = mgexXp[mainGmEx_cur_pos];
	    mmtxtYp[MAIN_GAME] = mgexYp[mainGmEx_cur_pos];
	    mmtxtXp[SOUND_A] = sdexXp[sndEx_cur_pos];
	    mmtxtYp[SOUND_A] = sdexYp[sndEx_cur_pos];
	    process_phase = 1000;
	}
	break;
    case 1000:
	/** キャンセルで戻ってきたとき **/
	for( i=0; i<6; i++ ) {
	    if( mainM[i].win.sclX < 0.4f ) {
		mainM[i].win.sclX += 0.04f;
		if( mainM[i].win.sclX > 0.4f )
		    mainM[i].win.sclX = 0.4f;
	    }
	    if( mainM[i].text.sclX < 1.0f ) {
		mainM[i].text.sclX += 0.1f;
		if( mainM[i].text.sclX > 1.0f ) {
		    mainM[i].text.sclX = 1.0f;
		}
	    }
	    add_calc( &mainM[i].text.posY,
		      mmtxtYp[i], 0.15f, 100.0f, 0.1f );
	    add_calc( &mainM[i].win.posY,
		      mmwinYp[i], 0.15f, 100.0f, 0.1f );
	    add_calc( &mainM[i].text.posX, mmtxtXp[i],
		      0.2f, ad_sp2[i], 0.1f );
	}
	frame_A += 0x04;

	if( mainM[mainM_cur_pos].win.posY == mmwinYp[mainM_cur_pos] ) {
	    for( i=0; i<6; i++ ) {
		mainM[i].text.sclX = 1.0f;
		mainM[i].text.posX = mmtxtXp[i];
		mainM[i].text.posY = mmtxtYp[i];
	    }
	    cur_draw_sw = ON;
	    frame_A = 0xff;
	    process_phase = 1;
	}
	break;
    case 1:
	res = KeyIn_Move_Cur( &mainM_cur_pos, 5, STICK_Y,
			NUM_LOOP, 20, 5, 4, cont_num, &MainMenu);
	if( res ) Na_StartSystemSe( NA_SE_ARWING_CURSOR ); 

	/** エクストラゲームの選択 **/
	if( mainM_cur_pos == MAIN_GAME && Ending_flg != 0 ) {
	    res1 = KeyIn_Move_Cur( &mainGmEx_cur_pos, 1, STICK_X,
				    NUM_LOOP, 20, 5, 4, cont_num, &MainGameEx);
	    if( res1 ) {
		Na_StartSystemSe( NA_SE_ARWING_CURSOR ); 
		if( mainGmEx_cur_pos ) {
#if LOCALE==CHINA
		    mainM[MAIN_GAME].text.txt = TXT_Z08_txt;
		    mainM[MAIN_GAME].text.SizX = 80;
		    mainM[MAIN_GAME].text.SizY = 12;
		    mainM[MAIN_GAME].text.posX = 120.0f;
		    mainM[MAIN_GAME].text.posY = 55.0f;
#else
		    mainM[MAIN_GAME].text.txt = TXT_E08_txt;
		    mainM[MAIN_GAME].text.SizX = 80;
		    mainM[MAIN_GAME].text.SizY = 12;
		    mainM[MAIN_GAME].text.posX = 125.0f;
		    mainM[MAIN_GAME].text.posY = 55.0f;
#endif
		} else {
#if LOCALE==CHINA
		    mainM[MAIN_GAME].text.txt = TXT_Z02_txt;
		    mainM[MAIN_GAME].text.SizX = 72;
		    mainM[MAIN_GAME].text.SizY = 12;
		    mainM[MAIN_GAME].text.posX = 124.0f;
		    mainM[MAIN_GAME].text.posY = 54.0f;
#else
		    mainM[MAIN_GAME].text.txt = TXT_E02_txt;
		    mainM[MAIN_GAME].text.SizX = 72;
		    mainM[MAIN_GAME].text.SizY = 12;
		    mainM[MAIN_GAME].text.posX = 124.0f;
		    mainM[MAIN_GAME].text.posY = 54.0f;
#endif
		}
		extra_mode = mainGmEx_cur_pos;
	    }
	}
	/** エクストラサウンドの選択 **/
	if( mainM_cur_pos == SOUND_A && Ending_flg != 0 ) {
	    res1 = KeyIn_Move_Cur( &sndEx_cur_pos, 1, STICK_X,
				   NUM_LOOP, 20, 5, 4, cont_num, &SoundEx);
	    if( res1 ) {
		Na_StartSystemSe( NA_SE_ARWING_CURSOR ); 
		if( sndEx_cur_pos ) {
#if LOCALE==CHINA
		    mainM[SOUND_A].text.txt = TXT_Z08_txt;
		    mainM[SOUND_A].text.SizX = 80;
		    mainM[SOUND_A].text.SizY = 12;
		    mainM[SOUND_A].text.posX = 120.0f;
		    mainM[SOUND_A].text.posY = 150.0f;
#else
		    mainM[SOUND_A].text.txt = TXT_E08_txt;
		    mainM[SOUND_A].text.SizX = 80;
		    mainM[SOUND_A].text.SizY = 12;
		    mainM[SOUND_A].text.posX = 125.0f;
		    mainM[SOUND_A].text.posY = 151.0f;
#endif
		} else {
#if LOCALE==CHINA
		    mainM[SOUND_A].text.txt = TXT_Z06_txt;
		    mainM[SOUND_A].text.SizX = 64;
		    mainM[SOUND_A].text.SizY = 12;
		    mainM[SOUND_A].text.posX = 128.0f;
		    mainM[SOUND_A].text.posY = 150.0f;
#else
		    mainM[SOUND_A].text.txt = TXT_E06_txt;
		    mainM[SOUND_A].text.SizX = 64;
		    mainM[SOUND_A].text.SizY = 10;
		    mainM[SOUND_A].text.posX = 133.0f;
		    mainM[SOUND_A].text.posY = 151.0f;
#endif
		}
	    }
	}

	if( Key_T[cont_num].button & (CONT_A | CONT_START) ) {
	    Na_StartSystemSe( NA_SE_ARWING_DECIDE );
	    briYp = mmwinYp[mainM_cur_pos];
	    cur_draw_sw = OFF;
	    process_phase = 11;
	}
	if( Key_T[cont_num].button & CONT_B ) {
	    Na_StartSystemSe( NA_SE_ARWING_CANCEL );
	    wip_time = 0;
	    wip_stat = 1;
	    process_phase=100;
	}
	break;
    /* 選択された項目へ行く前の演出 */
    case 11:
	frame_A = 0x10;
//	wait_time = 6;
	wait_time = 3;
	mainM[mainM_cur_pos].win.sclX -= 0.01f;
	mainM[mainM_cur_pos].win.sclY -= 0.01f;
	mainM[mainM_cur_pos].text.sclX -= 0.1f;
	mainM[mainM_cur_pos].text.sclY -= 0.1f;
	mainM[mainM_cur_pos].text.posX += 4.0f;
//	wait_time1 = 12;
	wait_time1 = 3;
	process_phase++;
	break;
    case 12:
	if( wait_time == 1 ) {
	    mainM[mainM_cur_pos].win.sclX += 0.01f;
	    mainM[mainM_cur_pos].win.sclY += 0.01f;
	    mainM[mainM_cur_pos].text.sclX += 0.1f;
	    mainM[mainM_cur_pos].text.sclY += 0.1f;
	    mainM[mainM_cur_pos].text.posX -= 4.0f;
	    bri_sw = ON;
	}

	for( i=0; i<6; i++ ) {
	    if( i == mainM_cur_pos ) continue;
	    if( mainM[i].win.sclX > 0.01f ) {
		mainM[i].win.sclX -= 0.05f;
		mainM[i].text.sclX -= 0.19f;
		add_calc( &mainM[i].text.posX, 158.0f, 0.2f, ad_sp[i], 0.1f );
	    } else {
		mainM[i].Wdraw_sw = OFF;
		mainM[i].Tdraw_sw = OFF;
	    }
	}

	if( wait_time1 ) break;
	ty_pos = 25.0f;
	wy_pos = 90.0f;
	if( mainM_cur_pos == MAIN_GAME || mainM_cur_pos == TRAINING ) {
	    ty_pos = 0.0f;
	    wy_pos = 120.0f;
	}

	add_calc( &mainM[mainM_cur_pos].text.posY,
		  ty_pos, 0.25f, 100.0f, 0.1f );
	add_calc( &mainM[mainM_cur_pos].win.posY,
		  wy_pos, 0.25f, 100.0f, 0.1f );

	frame_A += 0x04;
	if( mainM[mainM_cur_pos].text.posY == ty_pos &&
	    mainM[mainM_cur_pos].win.posY == wy_pos ) {
	    frame_A += 0xff;
	    menu_phase = mainM_cur_pos;
	    if( mainM_cur_pos == SOUND_A && sndEx_cur_pos )
		menu_phase = SOUND_B;
	    NextMenuInit();
	}
	break;
    case 100:
	/** ワイプ **/
	if( wip_time < 120 ) {
	    wip_time += 18;
	} else {
	    Back_star_f = OFF;
	    system_mode = TITLE;
	    system_time = 2;
	    title_mode = TITLE_WAIT;
	    title_return = 1;
	    display_mode = DISPLAY_NOTH;
	    wip_stat = 0;
	    wip_time = 0;
	    Key_wait_time = 3;
	}
	break;
    }
}


/************************************************************************/
/* メイン メニュー表示							*/
/************************************************************************/
static void main_menu_display( void )
{
    register int i;

    push_now2();
    for( i=0; i<6; i++ ) {
	if( !mainM[i].Wdraw_sw ) continue;
	window_display( mainM[i].win );
    }
    AwingCur_display( mainM[mainM_cur_pos].cur );
    pull_now();

    for( i=0; i<6; i++ ) {
	if( !mainM[i].Tdraw_sw || mainM[i].text.sclX <= 0.0f ) continue;
	if( i == MAIN_GAME && Ending_flg != 0 &&
	    (process_phase==0 || process_phase==1)) {
	    Yajirusi_display( 106.0f,56.0f,98.0f, 20,0,75 );
	}
	if( i == SOUND_A && Ending_flg != 0 &&
	    (process_phase==0 || process_phase==1)) {
	    Yajirusi_display( 106.0f,152.0f,98.0f, 20,0,75 );
	}
	txt_display( mainM[i].text );
    }

    biribiri_ctrl();

   
#if 0
{
    static int pp=0;

    if( Key_T[3].button & CONT_L ) {
	pp--;
	if( pp < 0 ) pp = 5;
    }
    if( Key_T[3].button & CONT_R ) {
	pp++;
	if( pp > 5 ) pp = 0;
    }
    if( Key[3].button & CONT_UP ) {
	mainM[pp].win.posY += 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	mainM[pp].win.posY -= 1.0f;
    }

    PRINTF( "p:%d y:%f\n",pp,mainM[pp].win.posY );
}
#endif
#if 0
    if( Key[3].button & CONT_UP ) {
	mainM[0].cur.posY -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	mainM[0].cur.posY += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	mainM[0].cur.posX -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	mainM[0].cur.posX += 1.0f;
    }
    if( Key[3].button & CONT_C ) {
	mainM[0].cur.rngX -= 1.0f;
    }
    if( Key[3].button & CONT_F ) {
	mainM[0].cur.rngX += 1.0f;
    }

    PRINTF( "x:%f y:%f r:%f\n",mainM[0].cur.posX,
	    mainM[0].cur.posY,mainM[0].cur.rngX );
#endif
#if 0
{
    static int pp=0;

    if( Key_T[3].button & CONT_L ) {
	pp--;
	if( pp < 0 ) pp = 5;
    }
    if( Key_T[3].button & CONT_R ) {
	pp++;
	if( pp > 5 ) pp = 0;
    }
    if( Key[3].button & CONT_UP ) {
	mainM[pp].text.posY -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	mainM[pp].text.posY += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	mainM[pp].text.posX -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	mainM[pp].text.posX += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",pp,mainM[pp].text.posX,mainM[pp].text.posY );
}
#endif
}

/*----------------------------------------------------------------------*/
/*									*/
/* ＶＳ メニュー							*/
/*									*/
/*----------------------------------------------------------------------*/
static float vswinYp[] = { 24.0f, 0.0f, -24.0f };
#if LOCALE==CHINA
static float vstxtXp[] = { 112.0f, 112.0f, 112.0f };
static float vstxtYp[] = { 89.0f, 114.0f, 138.0f };
#else
static float vstxtXp[] = { 111.0f, 112.0f, 121.0f };
static float vstxtYp[] = { 89.0f, 115.0f, 139.0f };
#endif
/************************************************************************/
/* ＶＳ メニュー Initial						*/
/************************************************************************/
static void vs_menu_init( void )
{
    register int i;

    frame_A = 0xff;

    Key_wait_time = 0;

    Back_star_f = 800;

    if( vsM_mode == 0 ) {
	cur_draw_sw = ON;
	for( i=0; i<3; i++ ) {
	    vsM[i].text.posX = vstxtXp[i];
	    vsM[i].text.posY = vstxtYp[i];
	    vsM[i].text.sclX = 1.0f;
	    vsM[i].text.sclY = 1.0f;
	    vsM[i].Tdraw_sw = ON;

	    vsM[i].win.sclX = 0.4f;
	    vsM[i].win.sclY = 0.21f;
	    
	    vsM[i].win.posY = vswinYp[i];
	    vsM[i].win.posZ = 0.0f;
	    vsM[i].Wdraw_sw = ON;
	}
    } else {
	cur_draw_sw = OFF;
	for( i=0; i<3; i++ ) {
	    vsM[i].text.sclY = 1.0f;
	    vsM[i].win.sclY = 0.21f;
	    vsM[i].win.posZ = 0.0f;
	    vsM[i].Tdraw_sw = ON;
	    vsM[i].Wdraw_sw = ON;
	}
    }

    briXp = -45.0f;
    bri_sw = OFF;

    OptMenu.AdWaitTime = 0;
    OptMenu.WaitTime = 0;
}

/************************************************************************/
/* ＶＳ メニュー							*/
/************************************************************************/
static void vs_menu( void )
{
    register int i;
    float ty_pos,wy_pos;
    int res;

    switch( process_phase ) {
    case 0:
	vs_menu_init();
	if( vsM_mode == 0 ) {
	    process_phase++;
	} else {
	    process_phase = 1000;
	}
	break;
    case 1000:
	/** キャンセルで戻ってきたとき **/
	for( i=0; i<3; i++ ) {
	    if( vsM[i].win.sclX < 0.4f ) {
		vsM[i].win.sclX += 0.04f;
		if( vsM[i].win.sclX > 0.4f )
		    vsM[i].win.sclX = 0.4f;
	    }
	    if( vsM[i].text.sclX < 1.0f ) {
		vsM[i].text.sclX += 0.15f;
		if( vsM[i].text.sclX > 1.0f ) {
		    vsM[i].text.sclX = 1.0f;
		}
	    }
	    add_calc( &vsM[i].win.posY,
		      vswinYp[i], 0.15f, 100.0f, 0.1f );
	    add_calc( &vsM[i].text.posX, vstxtXp[i],
		      0.2f, 3.1f, 0.1f );
	    add_calc( &vsM[i].text.posY,
		      vstxtYp[i], 0.15f, 100.0f, 0.1f );
	}

	add_calc( &mainM[mainM_cur_pos].text.posY,
		  25.0f, 0.25f, 100.0f, 0.1f );
	add_calc( &mainM[mainM_cur_pos].win.posY,
		  90.0f, 0.25f, 100.0f, 0.1f );

	frame_A += 0x04;

	if( vsM[vsM_cur_pos].win.posY == vswinYp[vsM_cur_pos] ) {
	    for( i=0; i<3; i++ ) {
		vsM[i].text.sclX = 1.0f;
		vsM[i].text.posY = vstxtYp[i];
		vsM[i].text.posX = vstxtXp[i];
	    }
	    mainM[mainM_cur_pos].text.posY = 25.0f;
	    mainM[mainM_cur_pos].win.posY = 90.0f;
	    cur_draw_sw = ON;
	    frame_A = 0xff;
	    process_phase = 1;
	}
	break;
    case 1:
	res = KeyIn_Move_Cur( &vsM_cur_pos, 2, STICK_Y,
			      NUM_LOOP, 20, 5, 4, cont_num, &OptMenu);
	if( res ) Na_StartSystemSe( NA_SE_ARWING_CURSOR ); 

	if( Key_T[cont_num].button & (CONT_A | CONT_START) ) {
	    Na_StartSystemSe( NA_SE_ARWING_DECIDE );
	    briYp = vswinYp[vsM_cur_pos];
	    cur_draw_sw = OFF;
	    process_phase = 11;
	}
	if( Key_T[cont_num].button & CONT_B ) {
	    Na_StartSystemSe( NA_SE_ARWING_CANCEL );
	    process_phase = 0;
	    menu_phase = MAIN_MENU;
	    display_mode = DISPLAY_NOTH;
	    mainM_mode = 1;
	}
	break;
    /* 選択された項目へ行く前の演出 */
    case 11:
	frame_A = 0x10;
//	wait_time = 6;
	wait_time = 5;
	vsM[vsM_cur_pos].win.sclX -= 0.01f;
	vsM[vsM_cur_pos].win.sclY -= 0.01f;
	vsM[vsM_cur_pos].text.sclX -= 0.1f;
	vsM[vsM_cur_pos].text.sclY -= 0.1f;
	vsM[vsM_cur_pos].text.posX += 4.0f;
//	wait_time1 = 12;
	wait_time1 = 5;
	process_phase++;
	break;
    case 12:
	if( wait_time == 1 ) {
	    vsM[vsM_cur_pos].win.sclX += 0.01f;
	    vsM[vsM_cur_pos].win.sclY += 0.01f;
	    vsM[vsM_cur_pos].text.sclX += 0.1f;
	    vsM[vsM_cur_pos].text.sclY += 0.1f;
	    vsM[vsM_cur_pos].text.posX -= 4.0f;
	    bri_sw = ON;
	}	    

	for( i=0; i<3; i++ ) {
	    if( i == vsM_cur_pos ) continue;
	    if( vsM[i].win.sclX > 0.01f ) {
		vsM[i].win.sclX -= 0.05f;
		vsM[i].text.sclX -= 0.19f;
		add_calc( &vsM[i].text.posX,
			  158.0f, 0.2f, ad_sp[i+1], 0.1f );
	    } else {
		vsM[i].Wdraw_sw = OFF;
		vsM[i].Tdraw_sw = OFF;
	    }
	}

	if( wait_time1 ) break;
	if( vsM_cur_pos == 0 ) ty_pos = 129.0f;
	else                   ty_pos = 131.0f;
	wy_pos = -15.5f;

	add_calc( &vsM[vsM_cur_pos].text.posY,
		  ty_pos, 0.25f, 100.0f, 0.1f );
	add_calc( &vsM[vsM_cur_pos].win.posY,
		  wy_pos, 0.25f, 100.0f, 0.1f );

	add_calc( &mainM[mainM_cur_pos].text.posY,
		  -10.0f, 0.35f, 100.0f, 0.1f );
	add_calc( &mainM[mainM_cur_pos].win.posY,
		  150.0f, 0.35f, 100.0f, 0.1f );

	frame_A += 0x04;
	if( vsM[vsM_cur_pos].text.posY == ty_pos &&
	    vsM[vsM_cur_pos].win.posY == wy_pos ) {
	    frame_A += 0xff;
	    menu_phase = (vsM_cur_pos+1)*10;
	    VS_game_mode = vsM_cur_pos;
	    before_menu = 1;
	    NextMenuInit();
	}
	break;
    }
}

/************************************************************************/
/* ＶＳ メニュー表示							*/
/************************************************************************/
static void vs_menu_display( void )
{
    register int i;

    menu_title_display();

    push_now2();
    for( i=0; i<3; i++ ) {
	if( !vsM[i].Wdraw_sw ) continue;
	window_display( vsM[i].win );
    }
    AwingCur_display( vsM[vsM_cur_pos].cur );
    pull_now();

    for( i=0; i<3; i++ ) {
	if( !vsM[i].Tdraw_sw || vsM[i].text.sclX <= 0.0f ) continue;
	txt_display( vsM[i].text );
    }

    biribiri_ctrl();




#if 0
{
    static int pp=0;

    if( Key_T[3].button & CONT_L ) {
	pp--;
	if( pp < 0 ) pp = 2;
    }
    if( Key_T[3].button & CONT_R ) {
	pp++;
	if( pp > 2 ) pp = 0;
    }
    if( Key[3].button & CONT_UP ) {
	vsM[pp].win.posY += 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	vsM[pp].win.posY -= 1.0f;
    }

    PRINTF( "p:%d y:%f\n",pp,vsM[pp].win.posY );
}
#endif
#if 0
{
    static int pp=0;

    if( Key_T[3].button & CONT_L ) {
	pp--;
	if( pp < 0 ) pp = 2;
    }
    if( Key_T[3].button & CONT_R ) {
	pp++;
	if( pp > 2 ) pp = 0;
    }
    if( Key[3].button & CONT_UP ) {
	vsM[pp].text.posY -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	vsM[pp].text.posY += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	vsM[pp].text.posX -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	vsM[pp].text.posX += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",pp,vsM[pp].text.posX,vsM[pp].text.posY );
}
#endif
}



/*----------------------------------------------------------------------*/
/*									*/
/* サウンド								*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* サウンドＡ Initial							*/
/************************************************************************/
static void soundA_init( void )
{
    register int i;

    Back_star_f = 800;

    cur_pos = 0;
    cur_posX = 0;
    cur_draw_sw = ON;
    stick_wait_time2 = 0;

    /** サウンド出力モード **/
    SoundOutMode = fox_save.rom[0].data.sound_mode;
    Na_SetOutputMode( SndMode[SoundOutMode] );
    /** サウンドの音量の調整 **/
    SoundVol[0] = fox_save.rom[0].data.sound_music;
    SoundVol[1] = fox_save.rom[0].data.sound_voice;
    SoundVol[2] = fox_save.rom[0].data.sound_se;
    if( SoundVol[0] > 99 ) SoundVol[0] = 99;
    if( SoundVol[1] > 99 ) SoundVol[1] = 99;
    if( SoundVol[2] > 99 ) SoundVol[2] = 99;
    Na_SetVolumeBallnce( NA_VOL_MUSIC, (u8)SoundVol[0] );
    Na_SetVolumeBallnce( NA_VOL_VOICE, (u8)SoundVol[1] );
    Na_SetVolumeBallnce( NA_VOL_SE, (u8)SoundVol[2] );
    /** 音量調整ツマミの位置セット **/
    MsndA_tsumami[0].posX = SoundVol[0] + 146.0f;
    MsndA_tsumami[1].posX = SoundVol[1] + 146.0f;
    MsndA_tsumami[2].posX = SoundVol[2] + 146.0f;

    SoundSelPos = 0;
    SoundTest = OFF;

    SPdisp_phase = 0;
    SPdisp2_phase = 0;
    wait_time = 0;
    wait_time1 = 0;

    for( i=0; i<5; i++ ) snd_ChgColor[i] = 255.0f;
    SelColor = 255.0f;

    KoWinXp = 56.0f;
    KoWinYp = -43.0f;
    KoWinXa = 0.0f;

    SoundA.AdWaitTime = 0;
    SoundA.WaitTime = 0;

    SoundAExit.AdWaitTime = 0;
    SoundAExit.WaitTime = 0;

    SoundA2.AdWaitTime = 0;
    SoundA2.WaitTime = 0;

    SoundALv.AdWaitTime = 0;
    SoundALv.WaitTime = 0;
}

/************************************************************************/
/* サウンド								*/
/************************************************************************/
static void soundA( void )
{
    int work;
    int res;

    /** モード,ミュージック,ヴォイス,ＳＥの選択 **/
    work = SoundSelPos;
    res = KeyIn_Move_Cur( &SoundSelPos, 3, STICK_Y, NUM_LOOP,
			  20, 5, 4, cont_num, &SoundA );
    if( res ) {
	snd_ChgColor[work] = 255.0f;
	Na_StartSystemSe( NA_SE_CURSOR );
    }
    
    switch( SoundSelPos ) {
    case 0: /* Sound Output Mode へ */
	SelectSoundOut();
	break;
    default:
	SelectSoundLevel();
	break;
    }

    if( Key_T[cont_num].button & CONT_R ) {
	SoundTest ^= 1;
	Na_TestSoundVolume( (u8)SoundTest );
    }

    /** 次の項目へすすむ **/
    if( Key_T[cont_num].button & CONT_A ) {
	Na_StartSystemSe( NA_SE_DECIDE );
	SoundSelPos = (SoundSelPos+1) & 0x03;
    }
    
    /** オプションメニューへ戻る **/
    if( Key_T[cont_num].button & CONT_B ) {
	Na_StartSystemSe( NA_SE_ARWING_CANCEL );
	if( SoundTest == ON ) {
	    SoundTest = OFF;
	    Na_TestSoundVolume( (u8)SoundTest );
	}
	data_save();	/** バックアップへセーブ **/
	display_mode = DISPLAY_NOTH;
	menu_phase = MAIN_MENU;
	process_phase = 0;
	mainM_mode = 1;
    }
}

/************************************************************************/
/* サウンド出力モードの選択処理						*/
/************************************************************************/
static void SelectSoundOut( void )
{
    int work;
    int res;

    work = SoundOutMode;
    res = KeyIn_Move_Cur( &work, 2, STICK_X, NUM_LOOP,
			  20, 5, 4, cont_num, &SoundA2 );
    if( res ) {
	Na_StartSystemSe( NA_SE_CURSOR );
	SoundOutMode = work;
	/** バックアップデータにセット **/
	if( SoundOutMode > 2 ) SoundOutMode = 0;
	fox_save.rom[0].data.sound_mode = SoundOutMode;
	Na_SetOutputMode( SndMode[SoundOutMode] );
    }
}

/************************************************************************/
/* サウンドの音量の調整							*/
/************************************************************************/
static void SelectSoundLevel( void )
{
    int num;
    int res;
    
    /** 音量の調整 **/
    SoundBal = SndHandle[SoundSelPos-1];
    res = KeyIn_Move_Level( &(MsndA_tsumami[SoundSelPos-1].posX),
			    146.0f, 245.0f, &SoundALv );
    if( res ) {
	num = (int)(MsndA_tsumami[SoundSelPos-1].posX-146.0f);
	SoundVol[SoundSelPos-1] = num;
	/** バックアップデータにセット **/
	if( num > 99 ) num = 99;
	switch( SoundSelPos-1 ) {
	case 0:
	    fox_save.rom[0].data.sound_music = num;
	    break;
	case 1:
	    fox_save.rom[0].data.sound_voice = num;
	    break;
	case 2:
	    fox_save.rom[0].data.sound_se = num;
	    break;
	}
	Na_SetVolumeBallnce( SoundBal, (u8)num );
    }
}

/************************************************************************/
/* サウンド 表示							*/
/************************************************************************/
static void soundA_display( void )
{
    register int i;
    int col;

    static float saX[11]={
	48.0f,103.0f,75.0f,55.0f,71.0f,
	87.0f,143.0f,244.0f,169.0f,170.0f,157.0f
    };
    static float saY[11]={
	79.0f,52.0f,99.0f,131.0f,157.0f,186.0f,
	102.0f,102.0f,98.0f,99.0f,98.0f
    };
    static float xs = 27.5f;

    menu_title_display();

    /** スピーカー **/
    Speaker_display();

    /** 飾り用横棒 **/
    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    texture_rectangleRGBA16( &NOW_DISP, MAP_bou_txt,
			     8, 8, saX[0], saY[0],
			     xs, 0.2f );

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );

    /** Ｒボタンでテスト **/
#if LOCALE==CHINA
    texture_rectangleIA8( &NOW_DISP, TXT_Z26_txt,
			  112, 13,
			  saX[1], saY[1],
			  1.0f, 1.0f );
#else
    texture_rectangleIA8( &NOW_DISP, TXT_E26_txt,
			  112, 13,
			  saX[1], saY[1],
			  1.0f, 1.0f );
#endif

    for( i=0; i<4; i++ ) {
	if( SoundSelPos == i ) {
	    ColorFlush( &snd_ChgColor[i] );
	} else {
	    snd_ChgColor[i] = 255.0f;
	}
    }

    /** モード **/
    col = (int)snd_ChgColor[0];
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, 0xff );
#if LOCALE==CHINA
    texture_rectangleIA8( &NOW_DISP,
			  TXT_Z27_txt,
			  48, 13,
			  saX[2], saY[2],
			  1.0f, 1.0f );
#else
    texture_rectangleIA8( &NOW_DISP,
			  TXT_E27_txt,
			  48, 13,
			  saX[2], saY[2],
			  1.0f, 1.0f );
#endif

    /** ミュージック **/
    col = (int)snd_ChgColor[1];
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, 0xff );
#if LOCALE==CHINA
    texture_rectangleIA8( &NOW_DISP,
			  TXT_Z28_txt,
			  88, 14,
			  saX[3], saY[3],
			  1.0f, 1.0f );
#else
    texture_rectangleIA8( &NOW_DISP,
			  TXT_E28_txt,
			  88, 14,
			  saX[3], saY[3],
			  1.0f, 1.0f );
#endif

    /** ヴォイス **/
    col = (int)snd_ChgColor[2];
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, 0xff );
#if LOCALE==CHINA
    texture_rectangleIA8( &NOW_DISP,
			  TXT_Z29_txt,
			  56, 15,
			  saX[4], saY[4],
			  1.0f, 1.0f );
#else
    texture_rectangleIA8( &NOW_DISP,
			  TXT_E29_txt,
			  56, 15,
			  saX[4], saY[4],
			  1.0f, 1.0f );
#endif

    /** ＳＥ **/
    col = (int)snd_ChgColor[3];
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, 0xff );
#if LOCALE==CHINA
    texture_rectangleIA8( &NOW_DISP,
			  TXT_Z30_txt,
			  40, 15,
			  saX[5]-8, saY[5],
			  1.0f, 1.0f );
#else
    texture_rectangleIA8( &NOW_DISP,
			  TXT_E30_txt,
			  24, 13,
			  saX[5], saY[5],
			  1.0f, 1.0f );
#endif


    if( SoundSelPos == 0 ) {
	/** 矢印カーソル (左)**/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
	texture_rectangleIA8X( &NOW_DISP,
			       TXT_yajirusi_txt,
			       8, 8,
			       saX[6], saY[6],
			       1.0f, 1.0f );
	/** 矢印カーソル (右)**/
	texture_rectangleIA8( &NOW_DISP,
			      TXT_yajirusi_txt,
			      8, 8,
			      saX[7], saY[7],
			      1.0f, 1.0f );
    }

    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    switch( SoundOutMode ) {
    case 0:
	/** ステレオ **/
#if LOCALE==CHINA
	texture_rectangleIA8( &NOW_DISP,
			      TXT_Z98_txt,
			      56, 13,
			      saX[8], saY[8],
			      1.0f, 1.0f );
#else
	texture_rectangleIA8( &NOW_DISP,
			      TXT_E98_txt,
			      56, 13,
			      saX[8], saY[8],
			      1.0f, 1.0f );
#endif
	break;
    case 1:
	/** モノラル **/
#if LOCALE==CHINA
	texture_rectangleIA8( &NOW_DISP,
			      TXT_Z33_txt,
			      56, 14,
			      saX[9], saY[9],
			      1.0f, 1.0f );
#else
	texture_rectangleIA8( &NOW_DISP,
			      TXT_E33_txt,
			      56, 14,
			      saX[9], saY[9],
			      1.0f, 1.0f );
#endif
	break;
    case 2:
	/** ヘッドフォン **/
#if LOCALE==CHINA
	texture_rectangleIA8( &NOW_DISP,
			      TXT_Z32_txt,
			      88, 14,
			      saX[10], saY[10],
			      1.0f, 1.0f );
#else
	texture_rectangleIA8( &NOW_DISP,
			      TXT_E32_txt,
			      88, 14,
			      saX[10], saY[10],
			      1.0f, 1.0f );
#endif
	break;
    }

    /** Ｂボタンでもどる **/
#if LOCALE==CHINA
    texture_rectangleIA8( &NOW_DISP,
			  TXT_Z31_txt,
			  96, 10,
			  166.0f, 213.0f,
			  1.0f, 1.0f );
#else
    texture_rectangleIA8( &NOW_DISP,
			  TXT_E31_txt,
			  96, 10,
			  166.0f, 213.0f,
			  1.0f, 1.0f );
#endif

    /** 音量調節バー **/
    for( i=0; i<3; i++ ) {
	txt_display( MsndA_bar[i] );
	txt_display( MsndA_tsumami[i] );
    }

#if 0
    {
	if ( Key[2].button & CONT_RIGHT ) {
	    MsndA_tsumami[0].posX += 1.0f;
	    MsndA_tsumami[1].posX += 1.0f;
	    MsndA_tsumami[2].posX += 1.0f;
	    MsndA_bar[0].posX += 1.0f;
	    MsndA_bar[1].posX += 1.0f;
	    MsndA_bar[2].posX += 1.0f;
	}
	if ( Key[2].button & CONT_LEFT ) {
	    MsndA_tsumami[0].posX -= 1.0f;
	    MsndA_tsumami[1].posX -= 1.0f;
	    MsndA_tsumami[2].posX -= 1.0f;
	    MsndA_bar[0].posX -= 1.0f;
	    MsndA_bar[1].posX -= 1.0f;
	    MsndA_bar[2].posX -= 1.0f;
	}
	if ( Key[2].button & CONT_UP ) {
	    MsndA_tsumami[0].posY -= 1.0f;
	    MsndA_tsumami[1].posY -= 1.0f;
	    MsndA_tsumami[2].posY -= 1.0f;
	    MsndA_bar[0].posY -= 1.0f;
	    MsndA_bar[1].posY -= 1.0f;
	    MsndA_bar[2].posY -= 1.0f;
	}
	if ( Key[2].button & CONT_DOWN ) {
	    MsndA_tsumami[0].posY += 1.0f;
	    MsndA_tsumami[1].posY += 1.0f;
	    MsndA_tsumami[2].posY += 1.0f;
	    MsndA_bar[0].posY += 1.0f;
	    MsndA_bar[1].posY += 1.0f;
	    MsndA_bar[2].posY += 1.0f;
	}

	PRINTF( " tpx0:%f tpy0:%f\n",MsndA_tsumami[0].posX,
		MsndA_tsumami[0].posY );
	PRINTF( " tpx1:%f tpy1:%f\n",MsndA_tsumami[1].posX,
		MsndA_tsumami[1].posY );
	PRINTF( " tpx2:%f tpy2:%f\n",MsndA_tsumami[2].posX,
		MsndA_tsumami[2].posY );
	PRINTF( " bpx0:%f bpy0:%f\n",MsndA_bar[0].posX,
		MsndA_bar[0].posY );
	PRINTF( " bpx1:%f bpy1:%f\n",MsndA_bar[1].posX,
		MsndA_bar[1].posY );
	PRINTF( " bpx2:%f bpy1:%f\n",MsndA_bar[2].posX,
		MsndA_bar[2].posY );
    }
#endif

#if 0
    {
	static int ppp = 0;
	
	if ( Key_T[3].button & CONT_L ) {
	    ppp++;
	    if( ppp > 10 ) ppp = 0;
	}
	if ( Key_T[3].button & CONT_R ) {
	    ppp--;
	    if( ppp < 0 ) ppp = 10;
	}

	if ( Key[3].button & CONT_RIGHT ) {
	    saX[ppp] += 1.0f;
	}
	if ( Key[3].button & CONT_LEFT ) {
	    saX[ppp] -= 1.0f;
	}
	if ( Key[3].button & CONT_UP ) {
	    saY[ppp] -= 1.0f;
	}
	if ( Key[3].button & CONT_DOWN ) {
	    saY[ppp] += 1.0f;
	}

	if ( Key[3].button & CONT_C ) {
	    xs -= 0.1f;
	}
	if ( Key[3].button & CONT_F ) {
	    xs += 0.1f;
	}
	
	PRINTF( "p:%d x:%f y:%f xs:%f\n",ppp,saX[ppp],saY[ppp],xs );
    }
#endif
}

/************************************************************************/
/* スピーカーの描画							*/
/************************************************************************/
static void Speaker_display( void )
{
     register int i;
     
     if( SoundTest == ON ) {
	 switch( SPdisp_phase ) {
	 case 0:
	     SPdisp_phase++;
	     break;
	 case 1: /* 拡大 */
	 if( wait_time ) break;
	     for( i=2; i<4; i++ ) {
		 MsndSP[i].sclX += 0.02f;
		 MsndSP[i].sclY += 0.02f;
		 MsndSP[i].posX -= 0.1f;
	     }
//	 wait_time = 4;
	     wait_time = 2;
	     SPdisp_phase++;
	     break;
	 case 2: /* もとにもどす */
	     if( wait_time ) break;
	     for( i=2; i<4; i++ ) {
		 MsndSP[i].sclX -= 0.02f;
		 MsndSP[i].sclY -= 0.02f;
		 MsndSP[i].posX += 0.1f;
	     }
	     SPdisp_phase++;
	     break;
	 case 3: /* 非表示 */
//	 wait_time = (int)(rnd()*30.0f);
	     wait_time = (int)(rnd()*15.0f);
	     SPdisp_phase=1;
	     break;
	 }
	 
	 switch( SPdisp2_phase ) {
	 case 0:
	     if( wait_time1 ) break;
	     for( i=0; i<4; i++ ) {
		 MsndSP[i].sclX += 0.08f;
		 MsndSP[i].sclY += 0.08f;
		 MsndSP[i].posX -= 0.4f;
		 MsndSP[i].posY -= 0.4f;
	     }
//       wait_time1 = 3;
	     wait_time1 = 2;
	     SPdisp2_phase++;
	     break;
	 case 1:
	     if( wait_time1 ) break;
	     for( i=0; i<4; i++ ) {
		 MsndSP[i].sclX -= 0.08f;
		 MsndSP[i].sclY -= 0.08f;
		 MsndSP[i].posX += 0.4f;
		 MsndSP[i].posY += 0.4f;
	     }
//       wait_time1 = 3;
	     wait_time1 = 2;
	     SPdisp2_phase++;
	     break;
	 case 2:
	     if( wait_time1 ) break;
	     wait_time1 = (int)(rnd()*30.0f);
	     SPdisp2_phase=0;
	     break;
	 }
	 
     } else {
	 for( i=0; i<4; i++ ) {
	     MsndSP[i].sclX = 1.0f;
	     MsndSP[i].sclY = 1.0f;
	     MsndSP[i].posX = MsndSP_posX[i];
	     MsndSP[i].posY = MsndSP_posY[i];
	 }
     }

     for( i=0; i<2; i++ ) {
	 txt_display( MsndSP[i] );
     }

     for( i=2; i<4; i++ ) {
	if( SPdisp_phase != 3 ) txt_display( MsndSP[i] );
     }

#if 0
    {
	if ( Key[2].button & CONT_RIGHT ) {
	    MsndSP_posX[0] += 1.0f;
	    MsndSP_posX[1] += 1.0f;
	    MsndSP_posX[2] += 1.0f;
	    MsndSP_posX[3] += 1.0f;
	}
	if ( Key[2].button & CONT_LEFT ) {
	    MsndSP_posX[0] -= 1.0f;
	    MsndSP_posX[1] -= 1.0f;
	    MsndSP_posX[2] -= 1.0f;
	    MsndSP_posX[3] -= 1.0f;
	}
	if ( Key[2].button & CONT_UP ) {
	    MsndSP_posY[0] -= 1.0f;
	    MsndSP_posY[1] -= 1.0f;
	    MsndSP_posY[2] -= 1.0f;
	    MsndSP_posY[3] -= 1.0f;
	}
	if ( Key[2].button & CONT_DOWN ) {
	    MsndSP_posY[0] += 1.0f;
	    MsndSP_posY[1] += 1.0f;
	    MsndSP_posY[2] += 1.0f;
	    MsndSP_posY[3] += 1.0f;
	}

	PRINTF( " spx0:%f spy0:%f\n",MsndSP_posX[0],MsndSP_posY[0] );
	PRINTF( " spx1:%f spy1:%f\n",MsndSP_posX[1],MsndSP_posY[1] );
	PRINTF( " spx2:%f spy2:%f\n",MsndSP_posX[2],MsndSP_posY[2] );
	PRINTF( " spx3:%f spy3:%f\n",MsndSP_posX[3],MsndSP_posY[3] );
    }
#endif
}

/*----------------------------------------------------------------------*/
/*									*/
/* サウンド エクストラ							*/
/* (一度エンディングをみると出現)					*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* サウンド エクストラ Initial						*/
/************************************************************************/
static void soundB_init( void )
{
    register int i;

    Back_star_f = 800;

    SoundTestNum = 0;

    SoundBNm.AdWaitTime = 0;
    SoundBNm.WaitTime = 0;

    SpeAnaPatn = 0;
    SoundPlayStat = OFF;

    for( i=0; i<32; i++ ) spanaFsc[i] = 0.0f;
}

/************************************************************************/
/* サウンド エクストラ							*/
/************************************************************************/
static void soundB( void )
{
    int res;
    float num;

    num = (float)SoundTestNum;
    res = KeyIn_Move_Level( &num, 0.0f, 49.0f, &SoundBNm );
    if( res ) {
	Na_StartSystemSe( NA_SE_CURSOR );
	SoundTestNum = (int)num;
    }

    if( Key_T[cont_num].button & CONT_A ) {
//	Na_StartSystemSe( NA_SE_DECIDE );
	/** サウンドトラック **/
	Na_PlayMenuBgm( (u8)SoundTestNum );
	SoundPlayStat = ON;
    }

    /* メインメニュー へ */
    if( Key_T[cont_num].button & CONT_B ) {
	if( !SoundPlayStat ) {
	    Na_StartSystemSe( NA_SE_ARWING_CANCEL );
	    Na_StartBgm( NA_BGM_SELECT );
	    display_mode = DISPLAY_NOTH;
	    menu_phase = MAIN_MENU;
	    process_phase = 0;
	    mainM_mode = 1;
	} else {
	    Na_StartSystemSe( NA_SE_CANCEL );
	    Na_StopBgm( 1 );
	    SoundPlayStat = OFF;
	}
    }

    if( Key_T[cont_num].button & CONT_F ) {
	SpeAnaPatn++;
	if( SpeAnaPatn > 2 ) SpeAnaPatn = 0;
    }
}

/************************************************************************/
/* サウンド エクストラ 表示						*/
/************************************************************************/
static void soundB_display( void )
{
#if 0
    register int i;
    int col;
    static float sbX[4]={132.0f,49.0f,37.0f};
    static float sbY[4]={40.0f,101.0f,130.0f};
#endif

    u8 *spanaF;
    float xx,aa;
    register int i;
    float barR_f,barG_f,barB_f;

    static float barX=-125.0f,barZ=0.0f;
//    static float barYs=60.0f;
    static float barXs=2.0f;
    static float barXss=8.0f;
    static float bouX[4]={30.0f,30.0f,28.0f,288.0f};
    static float bouY[4]={125.0f,197.0f,125.0f,125.0f};
    static float bouXs[4]={32.3f,32.3f,0.2f,0.2f};
    static float bouYs[4]={0.2f,0.2f,9.2f,9.2f};
    static float barR_Sf=255.0f,barG_Sf=100.0f,barB_Sf=255.0f;
    static float barR_Ef=100.0f,barG_Ef=255.0f,barB_Ef=100.0f;
    static Gfx *BarPatn[] = {
	sndbar,
	sndbar2,
	sndbar3,
    };
    static float barY[] = { -73.0f,-13.0f,-43.0f };

    menu_title_display();

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );

    /** サウンドトラック **/
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
#if LOCALE==CHINA
    texture_rectangleIA8( &NOW_DISP,
			  TXT_Z34_txt,
			  128, 14,
			  49.0f, 81.0f,
			  1.0f, 1.0f );
#else
    texture_rectangleIA8( &NOW_DISP,
			  TXT_E34_txt,
			  128, 14,
			  49.0f, 81.0f,
			  1.0f, 1.0f );
#endif
    
    texture_rectangleIA8( &NOW_DISP,
			  Num[SoundTestNum/10],
			  16, 15,
			  230.0f, 82.0f,
			  1.0f, 1.0f );
    
    texture_rectangleIA8( &NOW_DISP,
			  Num[SoundTestNum%10],
			  16, 15,
			  230.0f+14.0f, 82.0f,
			  1.0f, 1.0f );
    

    /** Ａボタンで決定,Ｂボタンでもどる **/
    button_info_display();

    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 50, 50, 200, 255 );

    /** スペアナの枠 **/
    for( i=0; i<4; i++ ) {
	texture_rectangleRGBA16( &NOW_DISP, MAP_bou_txt,
				 8, 8, bouX[i], bouY[i],
				 bouXs[i], bouYs[i] );
    }

    if( SoundPlayStat ) {
	spanaF = Na_GetSpeAnaPara();
	aa = 60.0f;
	if( SpeAnaPatn == 2 ) aa = 30.0f;
	for( i=0; i<32; i++ ) {
	    if( SpeAnaPatn == 0 || SpeAnaPatn == 2 )
		spanaFsc[i] = (aa/255.0f) * (float)spanaF[i];
	    else
		spanaFsc[i] = aa - ((aa/255.0f) * (float)spanaF[i]);
	}
    } else {
	for( i=0; i<32; i++ )
	    add_calc( &spanaFsc[i], 0.0f, 0.2f, 100.0f, 0.1f );
    }

    /** スペアナのバー **/
    projection_ortho( &NOW_DISP );

    rcpsetmode( &NOW_DISP, POLY_Z_PRIM );

    push_now();
    set_lookat_now( 0.0f, 0.0f, 100.0f, 0.0f, 0.0f, 0.0f,
		    0.0f, 1.0f, 0.0f, MULT_MTX );
    set_matrix(&NOW_DISP);
    
    for( xx=barX,i=0; i<32; i++,xx+=barXss ) {
	barR_f = barR_Sf + ((barR_Ef - barR_Sf) / 31.0f) * i;
	barG_f = barG_Sf + ((barG_Ef - barG_Sf) / 31.0f) * i;
	barB_f = barB_Sf + ((barB_Ef - barB_Sf) / 31.0f) * i;

	gDPSetPrimColor( NEXT_DISP, 0, 0,
			 (int)barR_f, (int)barG_f, (int)barB_f, 0xff );
	push_now();
	translate_now( xx, barY[SpeAnaPatn], barZ, MULT_MTX );
	scale_now( barXs, spanaFsc[i], 1.0f, MULT_MTX );
//	scale_now( barXs, barYs, 1.0f, MULT_MTX );
	set_matrix( &NOW_DISP );
	gSPDisplayList( NEXT_DISP, BarPatn[SpeAnaPatn] );
	pull_now();
    }
    pull_now();

    projection_set( &NOW_DISP );


#if 0
    /** キャラクターヴォイス **/
    col = (int)sndex_ChgColor[1];
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, 0xff );
    texture_rectangleIA8( &NOW_DISP,
			  TXT_character_voice_txt,
			  144, 13,
			  sbX[2], sbY[2],
			  1.0f, 1.0f );


    for( i=0; i<2; i++ ) {
	col = (int)sndex_ChgColor[i];
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, 0xff );
	texture_rectangleIA8( &NOW_DISP,
			      Num[SoundTestNum[i]/10],
			      16, 15,
			      230.0f, numY[i],
			      1.0f, 1.0f );

	texture_rectangleIA8( &NOW_DISP,
			      Num[SoundTestNum[i]%10],
			      16, 15,
			      230.0f+14.0f, numY[i],
			      1.0f, 1.0f );
    }
#endif
#if 0
    if ( Key[3].button & CONT_R ) {
	barZ += 1.0f;
    }
    if ( Key[3].button & CONT_L ) {
	barZ -= 1.0f;
    }
    if ( Key[3].button & CONT_RIGHT ) {
	barX += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT ) {
	barX -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	barY -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	barY += 1.0f;
    }
    if ( Key[3].button & CONT_F ) {
	barXs += 1.0f;
    }
    if ( Key[3].button & CONT_C ) {
	barXs -= 1.0f;
    }
    if ( Key[3].button & CONT_E ) {
	barYs -= 1.0f;
    }
    if ( Key[3].button & CONT_D ) {
	barYs += 1.0f;
    }
    if ( Key[0].button & CONT_RIGHT ) {
	    barXss += 1.0f;
    }
    if ( Key[0].button & CONT_LEFT ) {
	barXss -= 1.0f;
    }
    
    PRINTF( "x:%f y:%f z:%f xs:%f ys:%f\n",barX,barY,barZ,barXs,barYs );
    PRINTF( "Xss:%f\n",barXss );
#endif


#if 0
    {
	static int ppp = 0;
	
	if ( Key_T[3].button & CONT_L ) {
	    ppp++;
	    if( ppp > 3 ) ppp = 0;
	}
	if ( Key_T[3].button & CONT_R ) {
	    ppp--;
	    if( ppp < 0 ) ppp = 3;
	}

	if ( Key[3].button & CONT_RIGHT ) {
	    bouX[ppp] += 1.0f;
	}
	if ( Key[3].button & CONT_LEFT ) {
	    bouX[ppp] -= 1.0f;
	}
	if ( Key[3].button & CONT_UP ) {
	    bouY[ppp] -= 1.0f;
	}
	if ( Key[3].button & CONT_DOWN ) {
	    bouY[ppp] += 1.0f;
	}
	if ( Key_T[3].button & CONT_C ) {
	    bouXs[ppp] += 0.1f;
	}
	if ( Key_T[3].button & CONT_F ) {
	    bouXs[ppp] -= 0.1f;
	}
	if ( Key_T[3].button & CONT_D ) {
	    bouYs[ppp] -= 0.1f;
	}
	if ( Key_T[3].button & CONT_E ) {
	    bouYs[ppp] += 0.1f;
	}
	
	PRINTF( "p:%d x:%f y:%f xs:%f ys:%f\n",
		ppp,bouX[ppp],bouY[ppp],bouXs[ppp],bouYs[ppp] );
    }
#endif
}


/*----------------------------------------------------------------------*/
/*									*/
/* バックアップデータクリア処理						*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* バックアップクリア処理 init						*/
/************************************************************************/
static void backUpClear_init( void )
{
    Back_star_f = 800;
    SelColor = 255.0f;
    BkupFlushCnt[0] = 0;
    BkupFlushCnt[1] = 0;
    YesNo_sw = 0;
    BackUpClearOk_flg = 0;
}

/************************************************************************/
/* バックアップクリア処理						*/
/************************************************************************/
static void backUpClear( void )
{
    register int i;
    float res;

    switch( process_phase ) {
    case 0:
	backUpClear_sub();
	break;
    case 2:	/** 戻る **/
	if( BkupFlushCnt[YesNo_sw] ) break;
	BackUpClearOk_flg = 0;
	YesNo_sw = 0;
	process_phase = 0;
	break;
    case 3:	/**  **/
	if( BkupFlushCnt[YesNo_sw] ) break;
	display_mode = DISPLAY_NOTH;
	menu_phase = MAIN_MENU;
	process_phase = 0;
	mainM_mode = 1;
	break;
    case 4:	/* バックアップクリア処理 */
	if( BkupFlushCnt[YesNo_sw] ) break;
	switch( BackUpClearOk_flg ) {
	case 0:
	    BackUpClearOk_flg = 1;
	    YesNo_sw = 0;
	    process_phase = 0;
	    break;
	case 1:
	    /* バックアップクリア処理 */
	    BackUpClearOk_flg = 2;
	    Na_StartSystemSe( NA_SE_BACKUP_CLEAR );
	    vib_power[cont_num] = 50.0f;
	    vib_power_tim[cont_num] = 0;
	    break;
	case 2:
	    vib_power_tim[cont_num] += (int)vib_power[cont_num];
	    res = add_calc( &vib_power[cont_num],
			    100.0f, 0.05f, 100.0f, 0.1f );
	    if(vib_power_tim[cont_num] >= 100) {
		vib_power_tim[cont_num] -= 100;
		ikagawasii[cont_num] = 1;
	    }

	    if( res == 0.0f ) {
		BackUpClearOk_flg = 3;
		fox_save = *(eeprom *)fox_save_initial;
		data_save();
		sndEx_cur_pos = 0;
		mainGmEx_cur_pos = 0;
		Ending_flg = 0;
		extra_mode = 0;
#if LOCALE==CHINA
		mainM[MAIN_GAME].text.txt = TXT_Z02_txt;
		mainM[MAIN_GAME].text.SizX = 72;
		mainM[MAIN_GAME].text.SizY = 12;
		mainM[SOUND_A].text.txt = TXT_Z06_txt;
		mainM[SOUND_A].text.SizX = 64;
		mainM[SOUND_A].text.SizY = 12;
#else
		mainM[MAIN_GAME].text.txt = TXT_E02_txt;
		mainM[MAIN_GAME].text.SizX = 72;
		mainM[MAIN_GAME].text.SizY = 12;
		mainM[SOUND_A].text.txt = TXT_E06_txt;
		mainM[SOUND_A].text.SizX = 64;
		mainM[SOUND_A].text.SizY = 10;
#endif
		
		for( i=0; i<6; i++ ) {
		    mmtxtXp[i] = mmtxtXpS[i];
		    mmtxtYp[i] = mmtxtYpS[i];
		}
		get_rank_data();
	    }
	    break;
	case 3:
	    process_phase = 0;
	    break;
	}
	break;
    }
}

/************************************************************************/
/* バックアップクリア処理						*/
/************************************************************************/
static void backUpClear_sub( void )
{
    int res;

    if( BackUpClearOk_flg == 0 || BackUpClearOk_flg == 1 ) {
	res = KeyIn_Select2( &YesNo_sw );
	if( res != 0 )
	    Na_StartSystemSe( NA_SE_CURSOR );
    }
    
    if( Key_T[cont_num].button & CONT_A ) {
	if( BackUpClearOk_flg == 3 ) {
	    Na_StartSystemSe( NA_SE_ARWING_CANCEL );
	    process_phase = 3;
	} else {
	    BkupFlushCnt[YesNo_sw] = 10;
	    if( YesNo_sw == 0 ) {	/** NO **/
		if( BackUpClearOk_flg == 1 ) {
		    Na_StartSystemSe( NA_SE_DECIDE );
		    process_phase = 2;
		} else {
		    Na_StartSystemSe( NA_SE_ARWING_CANCEL );
		    process_phase = 3;
		}
	    } else {			/** YES **/
		Na_StartSystemSe( NA_SE_DECIDE );
		process_phase = 4;
	    }
	}
	return;
    }

    if( Key_T[cont_num].button & CONT_B ) {
	if( BackUpClearOk_flg == 1 ) {
	    Na_StartSystemSe( NA_SE_CANCEL );
	    process_phase = 2;
	} else {
	    Na_StartSystemSe( NA_SE_ARWING_CANCEL );
	    process_phase = 3;
	}
	return;
    }
}

/************************************************************************/
/* バックアップクリア処理 表示						*/
/************************************************************************/
static void backUpClear_display( void )
{
    register int i;
    int col[2];
    int mask[2];
    static float curX1[2] = {  172.0f, 76.0f };
    static float curX2[2] = {  228.0f, 121.0f };

    static float bkX[6]={72.0f,88.0f,185.0f,80.0f,84.0f,88.0f};
    static float bkY[6]={53.0f,137.0f,137.0f,90.0f,80.0f,97.0f};
    menu_title_display();

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );

    /** セーブデータをクリアします **/
#if LOCALE==CHINA
    for( i=0; i<2; i++ ) {
	texture_rectangleIA8( &NOW_DISP,
			      TXT_Z42_txt+(176*4*i),
			      176, 4,
			      bkX[0], bkY[0]+(4.0f*i),
			      1.0f, 1.0f );
    }
    texture_rectangleIA8( &NOW_DISP, TXT_Z42_txt+(176*8),
			  176, 5, bkX[0], bkY[0]+(4.0f*2.0f), 1.0f, 1.0f );
#else
    for( i=0; i<2; i++ ) {
	texture_rectangleIA8( &NOW_DISP,
			      TXT_E42_txt+(176*4*i),
			      176, 4,
			      bkX[0], bkY[0]+(4.0f*i),
			      1.0f, 1.0f );
    }
    texture_rectangleIA8( &NOW_DISP, TXT_E42_txt+(176*8),
			  176, 5, bkX[0], bkY[0]+(4.0f*2.0f), 1.0f, 1.0f );
#endif


    if( BackUpClearOk_flg < 2 ) {
	/** 矢印カーソル (左)**/
	texture_rectangleIA8X( &NOW_DISP,
			       TXT_yajirusi_txt,
			       8, 8,
			       curX1[YesNo_sw], 140.0f,
			       1.0f, 1.0f );
	/** 矢印カーソル (右)**/
	texture_rectangleIA8( &NOW_DISP,
			      TXT_yajirusi_txt,
			      8, 8,
			      curX2[YesNo_sw], 140.0f,
			      1.0f, 1.0f );

	ColorFlush( &yn_ChgColor[YesNo_sw] );
	yn_ChgColor[!YesNo_sw] = 255.0f;
	
	mask[0] = mask[1] = 0xffffffff;
	for( i=0; i<2; i++ ) {
	    if( BkupFlushCnt[i] ) {
		mask[i] = 0x01;
		col[i] = 255;
		BkupFlushCnt[i]--;
	    }
	}

	if( frcnt & mask[1] ) {
	    /** はい **/
	    col[1] = (int)yn_ChgColor[1];
	    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col[1], col[1], 0xff );
#if LOCALE==CHINA
	    texture_rectangleIA8( &NOW_DISP,
				  TXT_Z44_txt,
				  32, 12,
				  bkX[1], bkY[1],
				  1.0f, 1.0f );
#else
	    texture_rectangleIA8( &NOW_DISP,
				  TXT_E44_txt,
				  32, 12,
				  bkX[1], bkY[1],
				  1.0f, 1.0f );
#endif
	}

	if( frcnt & mask[0] ) {
	    /** いいえ **/
	    col[0] = (int)yn_ChgColor[0];
	    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col[0], col[0], 0xff );
#if LOCALE==CHINA
	    texture_rectangleIA8( &NOW_DISP,
				  TXT_Z45_txt,
				  40, 12,
				  bkX[2], bkY[2],
				  1.0f, 1.0f );
#else
	    texture_rectangleIA8( &NOW_DISP,
				  TXT_E45_txt,
				  40, 12,
				  bkX[2], bkY[2],
				  1.0f, 1.0f );
#endif
	}
    }

    switch( BackUpClearOk_flg ) {
    case 0:
	/** よろしいですか？ **/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
#if LOCALE==CHINA
	for( i=0; i<9; i++ ) {
	    texture_rectangleIA8( &NOW_DISP,
				  TXT_Z43_txt+(160*2*i),
				  160, 2,
				  bkX[3], bkY[3]+(2.0f*i),
				  1.0f, 1.0f );
	}
	texture_rectangleIA8( &NOW_DISP, TXT_Z43_txt+(160*18),
			      160, 1, bkX[3], bkY[3]+18.0f, 1.0f, 1.0f );
#else
	for( i=0; i<9; i++ ) {
	    texture_rectangleIA8( &NOW_DISP,
				  TXT_E43_txt+(160*2*i),
				  160, 2,
				  bkX[3], bkY[3]+(2.0f*i),
				  1.0f, 1.0f );
	}
	texture_rectangleIA8( &NOW_DISP, TXT_E43_txt+(160*18),
			      160, 1, bkX[3], bkY[3]+18.0f, 1.0f, 1.0f );
#endif
	break;
    case 1:
    case 2:
	/** ほんとうに よろしいですか？ **/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
#if LOCALE==CHINA
	for( i=0; i<20; i++ ) {
	    texture_rectangleIA8( &NOW_DISP,
				  TXT_Z46_txt+(160*2*i),
				  160, 2,
				  bkX[4], bkY[4]+(2.0f*i),
				  1.0f, 1.0f );
	}
	texture_rectangleIA8( &NOW_DISP, TXT_Z46_txt+(160*40),
			      160, 1, bkX[4], bkY[4]+40.0f, 1.0f, 1.0f );
#else
	for( i=0; i<20; i++ ) {
	    texture_rectangleIA8( &NOW_DISP,
				  TXT_E46_txt+(160*2*i),
				  160, 2,
				  bkX[4], bkY[4]+(2.0f*i),
				  1.0f, 1.0f );
	}
	texture_rectangleIA8( &NOW_DISP, TXT_E46_txt+(160*40),
			      160, 1, bkX[4], bkY[4]+40.0f, 1.0f, 1.0f );
#endif
	break;
    case 3:
	/** セーブデータを消しました **/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 32, 32, 0xff );
#if LOCALE==CHINA
	texture_rectangleIA8( &NOW_DISP,
			      TXT_Z47_txt,
			      144, 28,
			      bkX[5], bkY[5],
			      1.0f, 1.0f );
	texture_rectangleIA8( &NOW_DISP, TXT_Z47_txt+(144*28),
			      144, 13, bkX[5], bkY[5]+28.0f, 1.0f, 1.0f );
#else
	texture_rectangleIA8( &NOW_DISP,
			      TXT_E47_txt,
			      144, 28,
			      bkX[5], bkY[5],
			      1.0f, 1.0f );
	texture_rectangleIA8( &NOW_DISP, TXT_E47_txt+(144*28),
			      144, 13, bkX[5], bkY[5]+28.0f, 1.0f, 1.0f );
#endif
	break;
    }

    /** Ａボタンで決定,Ｂボタンでもどる **/
    button_info_display();

#if 0
    {
	static int ppp = 0;
	
	if ( Key_T[3].button & CONT_L ) {
	    ppp++;
	    if( ppp > 5 ) ppp = 0;
	}

	if ( Key[3].button & CONT_RIGHT ) {
	    bkX[ppp] += 1.0f;
	}
	if ( Key[3].button & CONT_LEFT ) {
	    bkX[ppp] -= 1.0f;
	}
	if ( Key[3].button & CONT_UP ) {
	    bkY[ppp] -= 1.0f;
	}
	if ( Key[3].button & CONT_DOWN ) {
	    bkY[ppp] += 1.0f;
	}

	PRINTF( "p:%d x:%f y:%f\n",ppp,bkX[ppp],bkY[ppp] );
    }
#endif
}

/*----------------------------------------------------------------------*/
/*									*/
/* スコア								*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* スコア Initial							*/
/************************************************************************/
static void score_init( void )
{
//    Na_StartBgm( NA_BGM_RANKING );

    get_rank_data();

    Back_star_f = 800;

    keySw = ON;
    EsRankYp = 0; 
    score_yp = 114.0f;
    score_ypw = 114.0f;
    score_yp2 = -6.0f;
    score_yp2w = -6.0f;
    score_disp_f = 0;
    rank_dispP = 10;

    EsRankST.AdWaitTime = 0;
    EsRankST.WaitTime = 0;

    NoEsRankST.AdWaitTime = 0;
    NoEsRankST.WaitTime = 0;

    /** 通ったステージルート内の惑星の絵の初期化 **/
    planet_data_init();
}

static char *nakamaMk[]={"P","S","F"};
static int nakama_colR[] = { 255,   0,  30 }; 
static int nakama_colG[] = {  30, 179,  30 }; 
static int nakama_colB[] = {   0,  67, 255 }; 
/************************************************************************/
/* スコア								*/
/************************************************************************/
static void score( void )
{
    score_ctrl();

    if( Key_T[cont_num].button & CONT_B ) {
	Na_StartSystemSe( NA_SE_ARWING_CANCEL );
//	Na_StartBgm( NA_BGM_SELECT );
	display_mode = DISPLAY_NOTH;
	menu_phase = MAIN_MENU;
	process_phase = 0;
	mainM_mode = 1;
    }
}

/************************************************************************/
/* スコア表示								*/
/************************************************************************/
static void menu_score_display( void )
{
    score_display();
    menu_title_display();
}

/************************************************************************/
/* スコア 共通部分							*/
/************************************************************************/
static void score_ctrl( void )
{
    if( Key_T[cont_num].button & CONT_A ) {
	Na_StartSystemSe( NA_SE_DECIDE );
	score_disp_f ^= 1;
    }

    if( score_disp_f ) {
	noeasy_ranking_ctrl();
    } else {
	easy_ranking_ctrl();
    }
}

/************************************************************************/
/* スコア 共通部分 キー操作						*/
/************************************************************************/
static void easy_ranking_ctrl( void )
{
    int res;
    
    /** 簡易 **/
    res = KeyIn_Move_Cur( &EsRankYp, 9, STICK_Y, NUM_LOOP,
			  20, 5, 4, cont_num, &EsRankST );
    if( res ) {
	Na_StartSystemSe( NA_SE_CURSOR ); 
	score_yp = 114.0f - (float)EsRankYp*130.0f;
	score_ypw = 114.0f - (float)EsRankYp*130.0f;
	score_yp2 = -6.0f + (float)EsRankYp*130.0f;
	score_yp2w = -6.0f + (float)EsRankYp*130.0f;
    }
}

/************************************************************************/
/* スコア 共通部分 キー操作						*/
/************************************************************************/
static void noeasy_ranking_ctrl( void )
{
    /** 簡易じゃないほう **/
#if 1
    float res,res1,res2;
    int work,work2;

    if( keySw ) {
	res = KeyIn_Move_Cur( &EsRankYp, 9, STICK_Y, NUM_NOLOOP,
			       20, 2, 9, cont_num, &NoEsRankST );
	if( res ) {
	    Na_StartSystemSe( NA_SE_CURSOR );
	    score_ypw = 114.0f - (float)EsRankYp*130.0f;
	    score_yp2w = -6.0f + (float)EsRankYp*130.0f;
	    keySw = OFF;
	}
    } else {
#if 0
	res1 = add_calc( &score_yp2, score_yp2w, 0.3f, 100.0f, 1.0f );
	res2 = add_calc( &score_yp, score_ypw, 0.3f, 100.0f, 1.0f );
#endif
	res1 = add_calc( &score_yp2, score_yp2w, 0.5f, 100.0f, 1.0f );
	res2 = add_calc( &score_yp, score_ypw, 0.5f, 100.0f, 1.0f );
	if( res1 == 0.0f && res2 == 0.0f ) {
	    keySw = ON;
	}
    }

    work = (int)score_yp;
    work2 = (int)score_yp2;
    score_yp = (float)work;
    score_yp2 = (float)work2;

    if( score_yp >= 114.0f ) {
	score_yp = 114.0f;
    }
    if( score_yp <= -1056.0f ) {
	score_yp = -1056.0f;
    }
    if( score_yp2 <= -6.0f ) {
	score_yp2 = -6.0f;
    }
    if( score_yp2 >= 1164.0f ) {
	score_yp2 = 1164.0f;
    }
#else
    float xp,speed;
    int work;

    xp = (float)Key_T[cont_num].stick_y;
    if( xp < -10.0f || xp > 10.0f ) {
	if( xp < 0.0f ) xp += 10.0f;
	if( xp > 0.0f ) xp -= 10.0f;
    } else {
	xp = 0.0f;
    }
    work = (int)(xp/5.0f);
    speed = (float)work;
    score_yp += speed;
    score_yp2 -= speed;
    EsRankYp = (int)(fabsf((score_yp-114.0f)/130.0f));

    if( score_yp > 114.0f ) score_yp = 114.0f;
    if( score_yp < -1055.0f ) score_yp = -1055.0f;
    if( score_yp2 < -6.0f ) score_yp2 = -6.0f;
    if( score_yp2 > 1164.0f ) score_yp2 = 1164.0f;
#endif
}

/************************************************************************/
/* スコア表示 共通部分							*/
/************************************************************************/
static void score_display( void )
{
    int col;

    if( score_disp_f ) {
	ranking_display();
    } else {
	/** 簡易 **/
	easy_ranking_display();
	/** 矢印 **/
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	ColorFlush( &Ya0ChgCol );
	col = Ya0ChgCol;
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, col, col, 0xff );
	texture_rectangleIA8( &NOW_DISP, VTX_yajirusi_txt,
			      8, 8, 70.0f, 55.0f+(EsRankYp*17.0f),
			      1.0f, 1.0f );
    }

    /** PUSH A **/
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
    small_moji_puts( 242, 215, 1.0f, 1.0f, "PUSH A" );

#if 0
    if( Key[3].button & CONT_LEFT ) {
	zy -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	zy += 1.0f;
    }

    PRINTF( "zy:%f\n",zy );
#endif
}

/************************************************************************/
/* ランキング画面表示							*/
/************************************************************************/
static void ranking_display( void )
{
    register int i;
    int col;
    float y,y2;
//    static float hx=156.0f,hy1=49.0f,hy2=200.0f;
    static float yyy=130.0f;
//    static float yyy2= -67.0f;
    static float Yy[2]={48.0f,175.0f};

    for( y=score_yp,y2=score_yp2,i=0; i<10; i++,y+=yyy,y2-=yyy ) {
	if( y > 69.0f && y < 230.0f ) {
	    /** 順位の数字の描画 **/
	    drawRankNum( i, 25.0f+16.0f, y );
	    /** 名前の描画 **/
	    drawRankName( i, 75.0f, y-25.0f );
	    /** トータルヒット数  **/
	    drawRankTotalHit( i, 130.0f, y-26.0f );
	    /** 残機数の描画 **/
	    draw_ZankiSuu( 210.0f, y-24.0f,
			   fox_save.rom[0].data.rank_zanki[i] );
	    /** 各ステージの仲間の有無の合計 **/
	    drawNakamaTotlal( i, 258.0f, y-25.0f );
	}

	Root_display( i, y, y2 );
    }

    push_now2();
    Score_Mask_Display();  /* マスク */
    pull_now();

    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    texture_rectangleIA8( &NOW_DISP, TXT_grey_txt,
			  8, 16, 0.0f, Yy[0], 40.0f, 1.5f );

    texture_rectangleIA8Y( &NOW_DISP, TXT_grey_txt,
			   8, 16, 0.0f, Yy[1], 40.0f, 1.5f );

    draw_back_star2( 0, 70 );
    draw_back_star2( 170, 239 );

    /** 矢印 **/
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    if( score_yp >= 114.0f ) {
	gDPSetPrimColor( NEXT_DISP, 0, 0, 32, 32, 32, 0xff );
    } else {
	ColorFlush( &Ya1ChgCol );
	col = Ya1ChgCol;
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, col, col, 0xff );
    }
    texture_rectangleIA8( &NOW_DISP,
			   TXT_dai_yajirusi_txt,
			   16, 16,
			   150.0f,44.0f,
			   1.0f, 1.0f );
    
    if( score_yp <= -1055.0f ) {
	gDPSetPrimColor( NEXT_DISP, 0, 0, 32, 32, 32, 0xff );
    } else {
	ColorFlush( &Ya2ChgCol );
	col = Ya2ChgCol;
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, col, col, 0xff );
    }
    texture_rectangleIA8Y( &NOW_DISP,
			    TXT_dai_yajirusi_txt,
			    16, 16,
			    150.0f,200.0f,
			    1.0f, 1.0f );

#if 0
    if( Key[3].button & CONT_UP ) {
	hy1 -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	hy1 += 1.0f;
    }
    if( Key[3].button & CONT_E ) {
	hy2 -= 1.0f;
    }
    if( Key[3].button & CONT_D ) {
	hy2 += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	hx -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	hx += 1.0f;
    }

    PRINTF( "hx:%f hy1:%f hy2:%f\n",hx,hy1,hy2 );
#endif

#if 0
{
    static int Pp=0;

    if( Key_T[2].button & CONT_L ) {
	Pp ^= 1;
    }
    if( Key[2].button & CONT_UP ) {
	Yy[Pp] += 1.0f;
    }
    if( Key[2].button & CONT_DOWN ) {
	Yy[Pp] -= 1.0f;
    }
    if( Key[2].button & CONT_E ) {
	sc += 0.01f;
    }
    if( Key[2].button & CONT_D ) {
	sc -= 0.01f;
    }

    PRINTF( "p:%d y:%ff sc:%f \n", Pp, Yy[Pp], sc );
}
#endif

#if 0
    if( Key[3].button & CONT_UP ) {
	score_yp2 -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	score_yp2 += 1.0f;
    }

    if( Key[3].button & CONT_E ) {
	score_yp += 1.0f;
    }
    if( Key[3].button & CONT_D ) {
	score_yp -= 1.0f;
    }

    PRINTF( "syp0:%f syp2:%f\n",score_yp,score_yp2 );
#endif
}

/************************************************************************/
/* スコア画面マスク表示							*/
/************************************************************************/
static xyz_t ScPs[] = {
    {   0.0f,   167.0f,     0.0f},
    {   0.0f,  -167.0f,     0.0f},
};
static xyz_t ScSz[] = {
    {  25.0f,     3.6f,     0.0f},
    {  25.0f,     3.6f,     0.0f},
};

static void Score_Mask_Display( void )
{
    int i;
    xyz_t *pos,*size;
//    static int Smp=0;
    
#if 1
    rcpsetmode( &NOW_DISP, POLY );
#else
    rcpsetmode( &NOW_DISP, POLY_PRIM );
//    gDPSetPrimColor(NEXT_DISP, 0, 0, 255, 0, 0, 255);
    gDPSetPrimColor(NEXT_DISP, 0, 0, 255, 255, 255, 255);
#endif
    for(i=0,pos=&ScPs[0],size=&ScSz[0];i<2;i++,pos++,size++) {
#if 0
	if( i == Smp ) {
	  gDPSetPrimColor(NEXT_DISP, 0, 0, 255, 0, 0, 255);
	} else {
	  gDPSetPrimColor(NEXT_DISP, 0, 0, 0, 0, 0, 255);
	}
#endif
	push_now();
	translate_now(pos->x, pos->y, -500.0f, MULT_MTX);
	scale_now( size->x, size->y, 1.0f, MULT_MTX);
	set_matrix(&NOW_DISP);
	gSPDisplayList(NEXT_DISP, Mask);
	pull_now();
    }

#if 0
    if(Key_T[3].button & CONT_L) {
	Smp ^= 1;
    }
    
    if(Key[3].button & CONT_LEFT) {
	ScPs[Smp].x += 1.0f;
    }
    if(Key[3].button & CONT_RIGHT) {
	ScPs[Smp].x -= 1.0f;
    }
    if(Key[3].button & CONT_UP) {
	ScPs[Smp].y -= 1.0f;
    }
    if(Key[3].button & CONT_DOWN) {
	ScPs[Smp].y += 1.0f;
    }

    if(Key[3].button & CONT_C) {
	ScSz[Smp].x += 0.1f;
    }
    if(Key[3].button & CONT_F) {
	ScSz[Smp].x -= 0.1f;
    }
    if(Key[3].button & CONT_D) {
	ScSz[Smp].y -= 0.1f;
    }
    if(Key[3].button & CONT_E) {
	ScSz[Smp].y += 0.1f;
    }

    PRINTF( "p:%d x:%f y:%f xs:%f ys:%f\n",
	    Smp,ScPs[Smp].x,ScPs[Smp].y,ScSz[Smp].x,ScSz[Smp].y );
#endif
}

/************************************************************************/
/* 順位の数字の描画							*/
/************************************************************************/
static void drawRankNum( int i, int x, int y )
{
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    if( i != 9 ) {
	texture_rectangleIA8( &NOW_DISP, Num[i+1],
			      16,15,
			      x, y-25.0f, 1.0f, 1.0f );
    } else {
	texture_rectangleIA8( &NOW_DISP, MOJI_s1_txt,
			      16, 15,
			      x-14.0f, y-25.0f, 1.0f, 1.0f );
	texture_rectangleIA8( &NOW_DISP, MOJI_s0_txt,
			      16, 15,
			      x, y-25.0f,
			      1.0f, 1.0f );
	
    }

    rcpsetmode( &NOW_DISP, RECE_RGBA_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    
    switch( i ) {
    case 0:
	texture_rectangleCI4( &NOW_DISP, TXT_st_txt, TXT_st_txttlut,
			      16, 9, x+17.0f, y-19.0f, 1.0f, 1.0f );
	break;
    case 1:
	texture_rectangleCI4( &NOW_DISP, TXT_nd_txt, TXT_nd_txttlut,
			      16, 10, x+17.0f, y-19.0f, 1.0f, 1.0f );
	break;
    case 2:
	texture_rectangleCI4( &NOW_DISP, TXT_rd_txt, TXT_rd_txttlut,
			      16, 11, x+17.0f, y-20.0f, 1.0f, 1.0f );
	break;
    default:
	texture_rectangleCI4( &NOW_DISP, TXT_th_txt, TXT_th_txttlut,
			      16, 9, x+17.0f, y-19.0f, 1.0f, 1.0f );
	break;
    }
}

/************************************************************************/
/* 名前の描画								*/
/************************************************************************/
static void drawRankName( int i, int x, int y )
{
    char name[4];
    
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );

    name[0] = fox_save.rom[0].data.rank_name[i][0] & 0xff;
    name[1] = fox_save.rom[0].data.rank_name[i][1] & 0xff;
    name[2] = fox_save.rom[0].data.rank_name[i][2] & 0xff;
    name[3] = '\0';

   moji_puts( x, y, 1.0f, 1.0f, name );
}

/************************************************************************/
/* トータルヒット数描画							*/
/************************************************************************/
static void drawRankTotalHit( int i, int x, int y )
{
//    static float ws=2.85f;
    
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0,  60,  60, 255, 170 );
#if LOCALE==CHINA
    texture_rectangleIA8( &NOW_DISP, MAP_mess_txt, 24, 17,
 			  x, y-6, 3.17f, 1.42f );
#else
    texture_rectangleIA8( &NOW_DISP, MAP_mess_txt, 24, 17,
 			  x, y, 3.17f, 1.05f );
#endif
    
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
#if LOCALE==CHINA
    small_moji_puts( x-5, y-2, 1.0f, 1.0f, "TOTAL HITS" );
#else
    small_moji_puts( x, y, 1.0f, 1.0f, "TOTAL HITS" );
#endif
    
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    moji_number( x+40.0f-((keta_ck(rank_totalhit[i])-1)*8),
		 y+9.0f, rank_totalhit[i] );

#if 0
    if( Key[3].button & CONT_LEFT ) {
	ws -= 0.01f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	ws += 0.01f;
    }
    PRINTF( "ws:%f\n",ws );
#endif

}

/************************************************************************/
/* 仲間の状態の合計の描画						*/
/************************************************************************/
static void drawNakamaTotlal( int i, int x, int y )
{
    register int j;
    float xx;

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );

    for( xx=0.0f,j=0; j<3; j++,xx+=12.0f ) {
	gDPSetPrimColor( NEXT_DISP, 0, 0,
			 nakama_colR[j],
			 nakama_colG[j],
			 nakama_colB[j], 255 );
	
	small_moji_puts( (int)(xx+x),(int)y,
			 1.0f, 1.0f, nakamaMk[j] );

	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
	moji_number( x+xx-((keta_ck(rank_nakama_total[i][j])-1)*8),
		     y+9.0f, rank_nakama_total[i][j] );
    }
}

/************************************************************************/
/* 自分が進んでいるルートの描画						*/
/************************************************************************/
static void Root_display( int i, float yy, float y2 )
{
    register int j;
    int root_ptr;
    float x;
    float xx=28.0f;
    float xxx=16.0f;

    root_ptr = fox_save.rom[0].data.rank_rootptr[i];

    for( x=0.0f,j=0; j<7; j++,x+=24.0f+xxx ) {
	/** ルート表示エリア **/
	Root_AeraDisplay( i, j, xx+x, yy, root_ptr );
	if( j < root_ptr ) {
	    /** ステージ名 **/
	    Root_StageNameDisplay( i, j, xx+x, yy );
	    /** 各ステージのヒット数 **/
	    Root_HitCntDisplay( i, j, xx+x, yy );
	    /** 仲間の有無 **/
	    Root_NakamaStatDisplay( i, j, xx+x, yy );
	}
    }

    /** 惑星 **/
    if( y2 < 75.0f && y2 > -80.0f ) {
	Root_StagePlanetDisplay( i, y2, root_ptr );
    }

#if 0
    if( Key[3].button & CONT_UP ) {
	ply += 0.1f;
    }
    if( Key[3].button & CONT_DOWN ) {
	ply -= 0.1f;
    }
    PRINTF( "ply:%f\n",ply );
#endif
}
    
/************************************************************************/
/* 進んだルートの枠の描画						*/
/************************************************************************/
static void Root_AeraDisplay( int i, int j, float xx, float yy, int ptr )
{
    int rr,gg,bb;
    int ColNum;
    int nowst,nextst;

    if( yy > 30.0f && yy < 200.0f ) {
	rcpsetmode( &NOW_DISP, RECT_A_PRIM );
	if( j < 6 ) {
	    rr = gg = bb = 255;
	    if( j < ptr-1 ) {
		nowst =
		    fox_save.rom[0].data.rank_stage[i][j].stage_no & 0x0f;
		nextst =
		    fox_save.rom[0].data.rank_stage[i][j+1].stage_no & 0x0f;
		ColNum = GetRootLineCol( nowst,nextst );
		switch( ColNum ) {
		case 0:
		    rr = 0x10;
		    gg = 0x40;
		    bb = 0xff;
		    break;
		case 1:
		case 3:
		    rr = 0xff;
		    gg = 0xaf;
		    bb = 0x00;
		    break;
		case 2:
		case 4:
		    gg = bb = 0;
		    break;
		}
	    }
	    gDPSetPrimColor( NEXT_DISP, 0, 0, rr, gg, bb, 255 );
	    texture_rectangleRGBA16( &NOW_DISP, MAP_bou_txt,
				     8, 8, xx+24.0f, yy+11.0f,
				     2.0f, 0.2f );
	}

	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
	texture_rectangleRGBA16( &NOW_DISP, MAP_hakoA_txt,
				 24, 24, xx, yy, 1.0f, 1.0f );
    }
}
    
/************************************************************************/
/* 各ステージのヒット数の描画						*/
/************************************************************************/
static void Root_HitCntDisplay( int i, int j, float xx, float yy )
{
    int work;

    if( yy > 22.0f && yy < 162.0f ) {
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
	work =
	    (fox_save.rom[0].data.rank_stage[i][j].hitcnt_h & 0x01) << 8;
	work |= fox_save.rom[0].data.rank_stage[i][j].hitcnt;
	moji_number( xx+15.0f-((keta_ck(work)-1)*8),
		     yy+24.0f+1.0f, work );
    }
}

/************************************************************************/
/* 各ステージの仲間の有無の描画						*/
/************************************************************************/
static void Root_NakamaStatDisplay( int i, int j, float xx, float yy )
{
    register int k;
    int nakamaWork[3];
    float x2;

    if( yy > 12.0f && yy < 154.0f ) {
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	x2 = 0.0f;
	nakamaWork[0] =
	    fox_save.rom[0].data.rank_stage[i][j].live_peppy & 0x01;
	nakamaWork[1] =
	    fox_save.rom[0].data.rank_stage[i][j].live_slippy & 0x01;
	nakamaWork[2] =
	    fox_save.rom[0].data.rank_stage[i][j].live_falco & 0x01;
	for( x2=0.0f,k=0; k<3; k++,x2+=9.0f ) {
	    if( !(nakamaWork[k]) ) continue;
	    gDPSetPrimColor( NEXT_DISP, 0, 0,
			     nakama_colR[k],
			     nakama_colG[k],
			     nakama_colB[k], 255 );
	    small_moji_puts( (int)(xx+x2-1.0f),
			     (int)(yy+24.0f+8.0f+1.0f),
			     1.0f, 1.0f, nakamaMk[k] );
	}
    }
}

/************************************************************************/
/* 各ステージ名の描画							*/
/************************************************************************/
static void Root_StageNameDisplay( int i, int j, float xx, float yy )
{
    int nameP;
    char *nameAdd;
    float xof;

    if( yy > 58.0f && yy < 197.0f ) {
	nameP = fox_save.rom[0].data.rank_stage[i][j].stage_no & 0x0f;
	nameAdd = StageName[nameP];
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
	xof = (float)(mojiS_dot( nameAdd )) / 2.0f;
	small_moji_puts( xx+12.0f-xof, yy-8.0f, 1.0f, 1.0f, nameAdd );
    }
}

/************************************************************************/
/* 自分が進んでいるルートのなかの惑星の描画				*/
/************************************************************************/
static void Root_StagePlanetDisplay( int j, float y, int max )
{
    static float sn_za=0.0f;
    static float xx=-121.0f;
    static float zxx=40.1f;
    register int i;
    int stageP;
    int work;
    int work1;
    float x,z,sc;

    z = 0.0f;
    push_now();
    set_lookat_now( 0.0f, 0.0f, 100.0f, 0.0f, 0.0f, 0.0f,
		    0.0f, 1.0f, 0.0f, MULT_MTX );
    set_matrix(&NOW_DISP);

    projection_ortho( &NOW_DISP );

    work = fox_save.rom[0].data.rank_time[j];
    for( x = xx,i=0; i<max; i++,x+=zxx ) {
	stageP = fox_save.rom[0].data.rank_stage[j][i].stage_no & 0x0f;
	switch( stageP ) {
	case OP_SN:	/** ソーラー **/
	    sc=0.3f;
	    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
	    gDPSetPrimColor(NEXT_DISP, 0, 0,
			    0xf0, 0, 0, 0xff );
	    gDPSetEnvColor(NEXT_DISP, 0x1f, 0, 0, 0 );
	    push_now();
	    translate_now( x, y, z, MULT_MTX );
	    rotateZ_now( ANGLE(sn_za), MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, PlaData[stageP] );

	    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0x80 );
	    gDPSetEnvColor(NEXT_DISP, 0x1f, 0, 0, 0 );
	    scale_now( 0.8f,0.8f,0.8f,MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, PlaData[stageP] );
	    pull_now();
	    break;
	case OP_AS:	/** アステロイド **/
	    sc=0.3f;
	    rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
	    gDPSetPrimColor( NEXT_DISP, 0, 0,
			     0xff, 0xff, 0xff, 0xff );
	    push_now();
	    translate_now( x-1.0f, y+4.0f, z, MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, PlaData[stageP] );
	    translate_now( 18.0f, -20.0f, z, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, PlaData[stageP] );
	    pull_now();
	    break;
	case  OP_SX:
	case  OP_SY:
	case  OP_SZ:
	    /** セクターＸ,Ｙ,Ｚ **/
	    sc=0.3f;
	    rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
	    gDPSetPrimColor( NEXT_DISP, 0, 0,
			     0xff, 0xff, 0xff, 0x90 );
	    push_now();
	    translate_now( x, y, z, MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, PlaData[stageP] );
	    pull_now();
	    break;
	case  OP_BO:
	    sc = 0.01f;
	    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
	    light_in( 0, 0, 100,
		      100, 100, 70, 100, 100, 100 );
	    
	    push_now();
	    translate_now( x, y, z, MULT_MTX );
	    rotateX_now( ANGLE(20.0f), MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, PlaData[stageP] );
	    pull_now();
	    break;
	case  OP_A6:
//	    sc = 0.003f;
	    sc = 0.01f;
	    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
	    light_in( 0, 0, 100,
		      100, 100, 70, 100, 100, 100 );
	    
	    push_now();
	    translate_now( x, y, z, MULT_MTX );
	    rotateX_now( ANGLE(20.0f), MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, PlaData[stageP] );
	    pull_now();
	    break;
	default:
	    sc=0.3f;
	    rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
	    gDPSetPrimColor( NEXT_DISP, 0, 0,
			     0xff, 0xff, 0xff, 0xff );
	    push_now();
	    translate_now( x, y, z, MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, PlaData[stageP] );
	    if( stageP != OP_BM1 && stageP != OP_BM3 && stageP != OP_AC ) {
		if( stageP == OP_MC ) {
		    gDPSetPrimColor( NEXT_DISP, 0, 0,
				     0x40, 0x40, 0x40, 0xff );
		} else {
		    gDPSetPrimColor( NEXT_DISP, 0, 0,
				     0xff, 0xff, 0xff, 0xff );
		}
		set_matrix(&NOW_DISP);
		gSPDisplayList( NEXT_DISP, MAP_PLkumo );
	    }
	    /* スモーク */
	    scale_now( 1.6f, 1.6f, 1.6f, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, MAP_hoshikage01 );
	    pull_now();
	    break;
	}

	/** ルート上に表示する勲章の描画 **/
	work1 = (work>>i) & 0x01;
	if( work1 ) Root_PlanetKnsyouDisplay( x, y, z );
    }

    pull_now();

    /** 通ったステージルート内の惑星の自転 **/
    planet_scroll();

    sn_za += 0.1f;

    projection_set( &NOW_DISP );

#if 0
    if( Key[3].button & CONT_RIGHT ) {
	xx += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	xx -= 1.0f;
    }
    if( Key[3].button & CONT_C ) {
	zxx += 0.1f;
    }
    if( Key[3].button & CONT_F ) {
	zxx -= 0.1f;
    }
    
    PRINTF( "x:%f zx:%f\n",xx,zxx );
#endif
}

/************************************************************************/
/* ルート上に表示する勲章の描画						*/
/************************************************************************/
static void Root_PlanetKnsyouDisplay( float x, float y, float z )
{
    static float scl = 0.7f;
    static float xx=11.0f,yy=2.7f;

    rcpsetmode( &NOW_DISP, TEXE_Z );

    push_now();
    translate_now( x-xx, y+yy, z, MULT_MTX );
    scale_now( scl, scl, scl, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_kunsyo02 );
    pull_now();

#if 0
	if( Key[0].button & CONT_UP ) {
	    yy += 0.1f;
	}
	if( Key[0].button & CONT_DOWN ) {
	    yy -= 0.1f;
	}
	if( Key[0].button & CONT_LEFT ) {
	    xx -= 0.1f;
	}
	if( Key[0].button & CONT_RIGHT ) {
	    xx += 0.1f;
	}
	if( Key_T[3].button & CONT_E ) {
	    scl -= 0.01f;
	}
	if( Key_T[3].button & CONT_C ) {
	    scl += 0.01f;
	}

	PRINTF( "xx:%f yy:%f sc:%f\n",xx,yy,scl );
#endif
}

/************************************************************************/
/* ルートカラーデータの取得					 	*/
/************************************************************************/
static int GetRootLineCol( int now, int next )
{
    register int i;

    for( i=0; i<ROOTS; i++ ) {
	if( Root[i].startP == now && Root[i].endP == next ) break;
    }   

    return( Root[i].LineCol );
}






/*----------------------------------------------------------------------*/
/*									*/
/* ＶＳ	キャラクター, ハンデレベル選択					*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* ＶＳ キャラクター, ハンデレベル選択 Initial				*/
/************************************************************************/
static void vs_chara_select_init( void )
{
    register int i;

    if( before_menu ) Na_StartBgm( NA_BGM_VS_SELECT );
    
    NowVsMode = menu_phase;

    if( VsReturn ) {
	mainM[1].text.posY = 129.0f;
	mainM[1].win.posY = -7.5f;
    }

    /* とりあえず */
    VS_point = 3;
    TryalTime = 2;
    SelectStage = 0;

    Back_star_f = OFF;

    AllSelected = 0;
    for( i=0; i<4; i++ ) {
	PlayerMode[i] = 0;
	if( Key_switch[i] == OFF ) {
	    PlayerMode[i] = 1;
	    AllSelected = AllSelected | (0x01<<i);
	}
	vs_ChgColor[i] = 255.0f;
	VsChrSelST[i].AdWaitTime = 0;
	VsChrSelST[i].WaitTime = 0;
    }

    OkColor = 255.0f;
}

/************************************************************************/
/* ＶＳ キャラクター, ハンデレベル選択 メイン				*/
/************************************************************************/
static void vs_chara_select( void )
{
    switch( process_phase ) {
    case 0:
	vs_hande_select();
	break;
    case 1:
	if( OkFlushCnt ) break;
	menu_phase = VS_GAME_B;
	NextMenuInit();
	break;
    }
}

/************************************************************************/
/* ＶＳ キャラクター, ハンデレベル選択					*/
/************************************************************************/
static void vs_hande_select( void )
{
    register int i;
    int res;

    for( i=0; i<4; i++ ) {
	if( !(AllSelected & (1<<i)) )  {
	    ColorFlush( &vs_ChgColor[i] );
	    /** ハンデレベル選択 **/
	    res = KeyIn_Move_Cur( &CharaHande[i], 2, STICK_X,
				  NUM_LOOP, 20, 2, 4, i, &VsChrSelST[i] );
	    if( res ) {
		Na_StartSystemSe( NA_SE_CURSOR );
	    }
	}
	if( Key_T[i].button & CONT_A ) {
	    if( AllSelected == 0x0f ) {
		/** ステージセレクトへ **/
		Na_StartSystemSe( NA_SE_DECIDE );
		OkFlushCnt = 10;
		process_phase++;
		return;
	    } else {
		if( !(AllSelected & (1<<i)) ) {
		    /** 決定 **/
		    Na_StartSystemSe( NA_SE_DECIDE );
		    VS_hande[i] = CharaHande[i];
		    vs_ChgColor[i] = 255.0f;
		    FlushCnt[i] = 10;
		    AllSelected = AllSelected | (0x01<<i);
		}
	    }
	}
	/** キャンセル **/
	if( Key_T[i].button & CONT_B ) {
	    /** 決定されていたら **/
	    if( AllSelected & (1<<i) ) {
		Na_StartSystemSe( NA_SE_CANCEL );
		AllSelected = AllSelected & (0x0f ^ (0x01<<i));
	    } else {
		Na_StartBgm( NA_BGM_SELECT );
		Na_StartSystemSe( NA_SE_ARWING_CANCEL );
		exit_process( VS_MENU );
		vsM_mode = 1;
		return;
	    }
	}
    }
}


static float bsXpos[4] = { 30.0f, 214.0f,  30.0f, 215.0f };
static float bsYpos[4] = { 18.0f,  18.0f, 151.0f, 151.0f };
static int nameXsiz[4] = { 56, 48, 56, 48 };
static int nameYsiz[4] = { 8, 10, 10, 8 };
static float nameXpos[4] = { 12.0f, 16.0f, 12.0f, 18.0f };
static float nameYpos = -1.0f;
static float numXpos[4] = { 46.0f, 41.0f, 41.0f, 41.0f };
static float numYpos = 24.0f;
static float numScl = 1.4f;
static float KaoXpos = 5.0f;
static float KaoYpos = 11.0f;
static float HandeXpos = 8.0f;
static float HandeYpos = 45.0f;
static float LeveXpos = 20.0f;
static float LeveYpos = 55.0f;
static float ContXpos = 37.0f;
static float ContYpos = 11.0f;
static float YaLXpos = 7.0f;
static float YaRXpos = 59.0f;
static float YaYpos = 58.0f;
/************************************************************************/
/* ＶＳ キャラクター, ハンデレベル選択表示				*/
/************************************************************************/
static void vs_chara_select_display( void )
{
    register int i;

    vs_menu_title_display();
    N64_display();

    for( i=0; i<4; i++ ) {
	/** コントローラが接続されてないところは表示しない **/
	if( Key_switch[i] == ON ) PlayerSel_display( i );
    }

    if( AllSelected == 0x0f ) OK_display();

#if 0
{
    static int np = 0;

    if ( Key_T[3].button & CONT_L ) {
	np++;
	if( np > 3 ) np = 0;
    }
    if ( Key[3].button & CONT_RIGHT ) {
	nameXpos[np] += 1.0f;
//	KaoXpos += 1.0f;
//	numXpos[np] += 1.0f;
//	ContXpos += 1.0f;
//	HandeXpos += 1.0f;
//	LeveXpos += 1.0f;
//	YaLXpos += 1.0f;
//	YaRXpos += 1.0f;
//	bsXpos[np] += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT ) {
	nameXpos[np] -= 1.0f;
//	KaoXpos -= 1.0f;
//	numXpos[np] -= 1.0f;
//	ContXpos -= 1.0f;
//	HandeXpos -= 1.0f;
//	LeveXpos -= 1.0f;
//	YaLXpos -= 1.0f;
//	YaRXpos -= 1.0f;
//	bsXpos[np] -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	nameYpos -= 1.0f;
//	KaoYpos -= 1.0f;
//	numYpos -= 1.0f;
//	ContYpos -= 1.0f;
//	HandeYpos -= 1.0f;
//	LeveYpos -= 1.0f;
//	YaYpos -= 1.0f;
//	bsYpos[np] -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	nameYpos += 1.0f;
//	KaoYpos += 1.0f;
//	numYpos += 1.0f;
//	ContYpos += 1.0f;
//	HandeYpos += 1.0f;
//	LeveYpos += 1.0f;
//	YaYpos += 1.0f;
//	bsYpos[np] += 1.0f;
    }
    if ( Key[3].button & CONT_C ) {
	numScl -= 0.1f;
    }
    if ( Key[3].button & CONT_F ) {
	numScl += 0.1f;
    }

    PRINTF( "p:%d nameX:%f nameY:%f\n",np,nameXpos[np],nameYpos );
//    PRINTF( "p:%d KaoX:%f KaoY:%f\n",np,KaoXpos,KaoYpos );
//    PRINTF( "p:%d numX:%f numY:%f Scl:%f\n",np,numXpos[np],numYpos,numScl );
//    PRINTF( "p:%d ContX:%f ContY:%f\n",np,ContXpos,ContYpos );
//    PRINTF( "p:%d HandeX:%f HandeY:%f\n",np,HandeXpos,HandeYpos );
//    PRINTF( "p:%d LeveX:%f LeveY:%f\n",np,LeveXpos,LeveYpos );
//    PRINTF( "p:%d YaLX:%f YaLY:%f\n",np,YaLXpos,YaYpos );
//    PRINTF( "p:%d YaRX:%f YaRY:%f\n",np,YaRXpos,YaYpos );
//    PRINTF( "p:%d bsX:%f bsY:%f\n",np,bsXpos[np],bsYpos[np] );
}
#endif
}

/************************************************************************/
/* プレイヤー設定 描画							*/
/************************************************************************/
static void PlayerSel_display( int i )
{
    register int j;
    int col;
    int mask;
    int numXsiz;

    static unsigned char *LevelTxt[3] = {
#if LOCALE==CHINA
	VTX_Z_Lv1_txt,
	VTX_Z_Lv2_txt,
	VTX_Z_Lv3_txt,
#else
	VTX_Lv1_txt,
	VTX_Lv2_txt,
	VTX_Lv3_txt,
#endif
    };
#if LOCALE==CHINA
    static unsigned char *NameTxt[4] = {
	VTX_Z14_txt,
	VTX_Z15_txt,
	VTX_Z16_txt,
	VTX_Z17_txt,
    };
    static unsigned short *NameTxttlut[4] = {
	VTX_Z14_txttlut,
	VTX_Z15_txttlut,
	VTX_Z16_txttlut,
	VTX_Z17_txttlut,
    };
#else
    static unsigned char *NameTxt[4] = {
	VTX_E14_txt,
	VTX_E15_txt,
	VTX_E16_txt,
	VTX_E17_txt,
    };
    static unsigned short *NameTxttlut[4] = {
	VTX_E14_txttlut,
	VTX_E15_txttlut,
	VTX_E16_txttlut,
	VTX_E17_txttlut,
    };
#endif
    static unsigned short *KaoTxt[4] = {
	VTX_Fox_cokpit_1_txt,
	VTX_Peppy_cokpit_1_txt,
	VTX_Slippy_cokpit_1_txt,
	VTX_Falco_cokpit_1_txt,
    };
    static unsigned char *VsNumTxt[4] = {
	VTX_1_txt,
	VTX_2_txt,
	VTX_3_txt,
	VTX_4_txt,
    };

    static int numR[4] = { 177, 255,   0,  30 };
    static int numG[4] = { 242,  30, 255,  30 };
    static int numB[4] = {  12,   0,  67, 255 };

    rcpsetmode( &NOW_DISP, RECE_RGBA_A_PRIM );
    /** 外枠 **/
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    for( j=0; j<4; j++ ) {
	texture_rectangleCI4( &NOW_DISP,
 			      VTX_player_waku_txt+(80*16*j)/2,
			      VTX_player_waku_txttlut,
			      80, 16,
			      bsXpos[i],bsYpos[i]+(16.0f*j),
			      1.0f, 1.0f );
    }
    texture_rectangleCI4( &NOW_DISP,
			  VTX_player_waku_txt+(80*16*4)/2,
			  VTX_player_waku_txttlut,
			  80, 7,
			  bsXpos[i],bsYpos[i]+(16.0f*4),
			  1.0f, 1.0f );


    /** キャラクターの名前 **/
    gDPSetPrimColor( NEXT_DISP, 0, 0, numR[i],numG[i],numB[i],0xff );
    texture_rectangleCI8( &NOW_DISP, NameTxt[i],NameTxttlut[i],
			  nameXsiz[i], nameYsiz[i],
			  bsXpos[i]+nameXpos[i],bsYpos[i]+nameYpos,
			  1.0f, 1.0f );

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );

    mask = 0xffffffff;
    if( FlushCnt[i] != 0 ) {
	mask = 0x01;
	FlushCnt[i]--;
    }

    if( frcnt & mask ) {
	/** ハンデキャップ **/
	col = vs_ChgColor[i];
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff,col,col,0xff );
#if LOCALE==CHINA
	texture_rectangleIA8( &NOW_DISP, VTX_Z19_txt,
			      64, 9,
			      bsXpos[i]+HandeXpos,bsYpos[i]+HandeYpos,
			      1.0f, 1.0f );
#else
	texture_rectangleIA8( &NOW_DISP, VTX_E19_txt,
			      64, 9,
			      bsXpos[i]+HandeXpos,bsYpos[i]+HandeYpos,
			      1.0f, 1.0f );
#endif
	
	/** ハンデキャップ レベル**/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff,col,col,0xff );
	texture_rectangleIA8( &NOW_DISP, LevelTxt[CharaHande[i]],
			      40, 12,
			      bsXpos[i]+LeveXpos,bsYpos[i]+LeveYpos,
			      1.0f, 1.0f );
    }
    
    /** 矢印カーソル (左)**/
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    texture_rectangleIA8X( &NOW_DISP,
			   TXT_yajirusi_txt,
			   8, 8,
			   bsXpos[i]+YaLXpos,bsYpos[i]+YaYpos,
			   1.0f, 1.0f );
    /** 矢印カーソル (右)**/
    texture_rectangleIA8( &NOW_DISP,
			  TXT_yajirusi_txt,
			  8, 8,
			  bsXpos[i]+YaRXpos,bsYpos[i]+YaYpos,
			  1.0f, 1.0f );

    /** CONT. **/
#if LOCALE==CHINA
    texture_rectangleIA8( &NOW_DISP, VTX_Z_CONT_txt,
			  40, 7,
			  bsXpos[i]+ContXpos,bsYpos[i]+ContYpos,
			  1.0f, 1.0f );
#else
    texture_rectangleIA8( &NOW_DISP, VTX_CONT_txt,
			  40, 7,
			  bsXpos[i]+ContXpos,bsYpos[i]+ContYpos,
			  1.0f, 1.0f );
#endif
    /* 顔 */
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    for( j=0; j<2; j++ ) {
	texture_rectangleRGBA16( &NOW_DISP, KaoTxt[i]+(44*j*20),
				 44, 20,
				 bsXpos[i]+KaoXpos,
				 bsYpos[i]+KaoYpos+(j*20.0f*0.7f),
				 0.7f, 0.7f );
    }
    texture_rectangleRGBA16( &NOW_DISP, KaoTxt[i]+(44*40),
			     44, 4,
			     bsXpos[i]+KaoXpos,
			     bsYpos[i]+KaoYpos+(40.0f*0.7f),
			     0.7f, 0.7f );

    /** コントローラの番号 **/
    numXsiz = 24;
    if( i == 0 ) numXsiz = 16;
    gDPSetPrimColor( NEXT_DISP, 0, 0, numR[i], numG[i], numB[i], 0xff );
    texture_rectangleIA8( &NOW_DISP, VsNumTxt[i],
			  numXsiz, 13,
			  bsXpos[i]+numXpos[i],
			  bsYpos[i]+numYpos,
			  numScl, numScl );
}

/************************************************************************/
/* nintendo64の描画 (RBGA16,144x42)					*/
/************************************************************************/
static void N64_display( void )
{
    register int i;

    rectangle_a_prim();
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );

#if LOCALE==CHINA
    for( i=0; i<3; i++ ) {
	texture_rectangleRGBA16( &NOW_DISP, VTX_Z_nin64_txt+(144*14*i),
				 144, 14,
				 87.0f, 84+(i*14.0f*1.0f),
				 1.0f, 1.0f );
    }
#else
    for( i=0; i<3; i++ ) {
	texture_rectangleRGBA16( &NOW_DISP, VTX_nin64_txt+(144*14*i),
				 144, 14,
				 87.0f, 84+(i*14.0f*1.0f),
				 1.0f, 1.0f );
    }
#endif

#if 0
    static float nx = 104.0f,ny=81.0f;

    if ( Key[1].button & CONT_F ) {
	nx += 1.0f;
    }
    if ( Key[1].button & CONT_C ) {
	nx -= 1.0f;
    }
    if ( Key[1].button & CONT_E ) {
	ny -= 1.0f;
    }
    if ( Key[1].button & CONT_D ) {
	ny += 1.0f;
    }

    PRINTF( "x:%f y:%f\n",nx,ny );
#endif
}


/*----------------------------------------------------------------------*/
/*									*/
/* ＶＳ	ステージ選択							*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* ＶＳ ステージ選択 Initial						*/
/************************************************************************/
static void vs_gameB_init( void )
{
    register int i;

    Back_star_f = OFF;

    ok_disp = OFF;

    OkColor = 255.0f;

    MatchPointNum = VS_point-1;
    SelectStageNum = SelectStage;
    TryalTimeNum = TryalTime;
    VS_battle_time = TryalTimeNum;

#if 0
    MachineseWaitListNum = MachineseWaitList;
    SelectMachineseNum = SelectMachinese;

    switch( Ending_flg ) {
    case 0:
	MaxSelectMachinese = 0;
	break;
    case 1:
	MaxSelectMachinese = 3;
	break;
    case 2:
	MaxSelectMachinese = 4;
	break;
    }
#endif

    for( i=0; i<4; i++ ) vs_ChgColor[i] = 0;
    PointFlushCnt = 0;
    StageFlushCnt = 0;
    TimeFlushCnt = 0;
//    ListFlushCnt = 0;
//    MachineseFlushCnt = 0;
    OkFlushCnt = 0;

    SelSw = OFF;

    vsPoint_ChgColor = 255.0f;
    vsStage_ChgColor = 255.0f;
    vsTime_ChgColor = 255.0f;
//    vsList_ChgColor = 255.0f;
//    vsMachinese_ChgColor = 255.0f;

    vs_KeyTime_init();
}

/************************************************************************/
/* ＶＳ ３Ｄスティック Initial						*/
/************************************************************************/
static void vs_KeyTime_init( void )
{
    register int i;
    
    for( i=0; i<4; i++ ) {
	VsSelST[i].AdWaitTime = 0;
	VsSelST[i].WaitTime = 0;
    }
}

/************************************************************************/
/* ＶＳ 各モードの設定 メイン						*/
/************************************************************************/
static void vs_gameB( void )
{
    switch( NowVsMode ) {
    case VS_POINT:
	PointMatch_Main();
	break;
    case VS_BATTLE:
	Batolloyal_Main();
	break;
    case VS_TIMET:
	TimeTryal_Main();
	break;
    }
}

/************************************************************************/
/* ＶＳ ポイントマッチ設定 メイン					*/
/************************************************************************/
static void PointMatch_Main( void )
{
    switch( process_phase ) {
    case 0:
	Point_Select();
	break;
    case 1:
	Stage_Select();
	break;
#if 0
    case 2:
	MachineseWaitList_Select();
	break;
#endif
    case 2:
	OK_Select();
	break;
    case 3:
	VS_Start();
	break;
    }
}

/************************************************************************/
/* ＶＳ バトルロイヤル設定 メイン					*/
/************************************************************************/
static void Batolloyal_Main( void )
{
    switch( process_phase ) {
    case 0:
	Stage_Select();
	break;
#if 0
    case 1:
	if( Ending_flg != 0 ) {
	    Machinese_Select();
	} else {
	    OK_Select();
	}
	break;
#endif
    case 1:
	OK_Select();
	break;
    case 2:
	VS_Start();
	break;
    }
}

/************************************************************************/
/* ＶＳ タイムトライアル設定 メイン					*/
/************************************************************************/
static void TimeTryal_Main( void )
{
    switch( process_phase ) {
    case 0:
	Time_Select();
	break;
    case 1:
	Stage_Select();
	break;
#if 0
    case 2:
	if( Ending_flg != 0 ) {
	    Machinese_Select();
	} else {
	    OK_Select();
	}
	break;
#endif
    case 2:
	OK_Select();
	break;
    case 3:
	VS_Start();
	break;
    }
}

/************************************************************************/
/* ＶＳ スタート							*/
/************************************************************************/
static void VS_Start( void )
{
    if( OkFlushCnt ) return;

    system_mode = VS;
    system_time = 2;
    option_mode = VS_WAIT;
    display_mode = DISPLAY_NOTH;
}

/************************************************************************/
/* ＶＳ マッチポイント選択						*/
/************************************************************************/
static void Point_Select( void )
{
    register int i;
    int res;

    if( PointFlushCnt ) return;

    if( SelSw ) {
	process_phase++;
	SelSw = OFF;
	return;
    }

    for( i=0; i<4; i++ ) {
	if( Key_switch[i] == OFF ) continue;
	res = KeyIn_Move_Cur( &MatchPointNum, 4, STICK_X,
			      NUM_LOOP, 20, 2, 4, i, &VsSelST[i] );
	if( res ) {
	    Na_StartSystemSe( NA_SE_CURSOR );
	    VS_point = MatchPointNum+1;
	}

	/** 決定 **/
	if( Key_T[i].button & CONT_A ) {
	    Na_StartSystemSe( NA_SE_DECIDE );
	    vs_KeyTime_init();
	    PointFlushCnt = 10;
	    return;
	}

	/** 一つ前の項目へ戻る **/
	if( Key_T[i].button & CONT_B ) {
	    /** キャラクター, ハンデレベル選択へ戻る **/
	    Na_StartSystemSe( NA_SE_CANCEL );
	    menu_phase = NowVsMode;
	    before_menu = 0;
	    NextMenuInit();
	    return;
	}
    }
}

/************************************************************************/
/* ＶＳ トライアルタイム選択						*/
/************************************************************************/
static void Time_Select( void )
{
    register int i;
    int res;

    if( TimeFlushCnt ) return;

    if( SelSw ) {
	process_phase++;
	SelSw = OFF;
	return;
    }

    for( i=0; i<4; i++ ) {
	if( Key_switch[i] == OFF ) continue;
	res = KeyIn_Move_Cur( &TryalTimeNum, 4, STICK_X,
			      NUM_LOOP, 20, 2, 4, i, &VsSelST[i] );
	if( res ) {
	    Na_StartSystemSe( NA_SE_CURSOR );
	    TryalTime = TryalTimeNum;
	    VS_battle_time = TryalTimeNum;
	}

	/** 決定 **/
	if( Key_T[i].button & CONT_A ) {
	    Na_StartSystemSe( NA_SE_DECIDE );
	    vs_KeyTime_init();
	    TimeFlushCnt = 10;
	    return;
	}

	/** 一つ前の項目へ戻る **/
	if( Key_T[i].button & CONT_B ) {
	    /** キャラクター, ハンデレベル選択へ戻る **/
	    Na_StartSystemSe( NA_SE_CANCEL );
	    menu_phase = NowVsMode;
	    before_menu = 0;
	    NextMenuInit();
	    return;
	}
    }
}

#if 0
/************************************************************************/
/* ＶＳ マシンの順番選択						*/
/************************************************************************/
static void MachineseWaitList_Select( void )
{
    register int i;
    int res;

    if( ListFlushCnt ) return;

    if( SelSw ) {
	SelSw = OFF;
	ok_disp = ON;
	process_phase++;
	return;
    }

    for( i=0; i<4; i++ ) {
	if( Key_switch[i] == OFF ) continue;
	res = KeyIn_Move_Cur( &MachineseWaitListNum, 1,  STICK_X,
			      NUM_LOOP, 20, 2, 4, i, &VsSelST[i] );
	if( res ) {
	    Na_StartSystemSe( NA_SE_CURSOR );
	    MachineseWaitList = MachineseWaitListNum;
	}

	/** 決定 **/
	if( Key_T[i].button & CONT_A ) {
	    Na_StartSystemSe( NA_SE_DECIDE );
	    vs_KeyTime_init();
	    ListFlushCnt = 10;
	    return;
	}

	/** 一つ前の項目へ戻る **/
	if( Key_T[i].button & CONT_B ) {
	    Na_StartSystemSe( NA_SE_CANCEL );
	    vs_KeyTime_init();
	    SelSw = OFF;
	    process_phase--;
	    return;
	}
    }
}

/************************************************************************/
/* ＶＳ マシンの選択							*/
/************************************************************************/
static void Machinese_Select( void )
{
    register int i;
    int res;

    if( MachineseFlushCnt ) return;

    if( SelSw ) {
	SelSw = OFF;
	ok_disp = ON;
	process_phase++;
	return;
    }

    for( i=0; i<4; i++ ) {
	if( Key_switch[i] == OFF ) continue;
	res = KeyIn_Move_Cur( &SelectMachineseNum,
			       MaxSelectMachinese, STICK_X,
			       NUM_LOOP, 20, 2, 4, i, &VsSelST[i] );
	if( res ) {
	    Na_StartSystemSe( NA_SE_CURSOR );
	    SelectMachinese = SelectMachineseNum;
	}

	/** 決定 **/
	if( Key_T[i].button & CONT_A ) {
	    Na_StartSystemSe( NA_SE_DECIDE );
	    vs_KeyTime_init();
	    MachineseFlushCnt = 10;
	    return;
	}

	/** 一つ前の項目へ戻る **/
	if( Key_T[i].button & CONT_B ) {
	    Na_StartSystemSe( NA_SE_CANCEL );
	    vs_KeyTime_init();
	    SelSw = OFF;
	    process_phase--;
	    return;
	}
    }
}
#endif

/************************************************************************/
/* ＶＳ ステージの選択							*/
/************************************************************************/
static void Stage_Select( void )
{
    register int i;
    int res;

    if( StageFlushCnt ) return;

    if( SelSw ) {
#if 0
	if( (NowVsMode == VS_BATTLE || NowVsMode == VS_TIMET) &&
	    Ending_flg == 0 ) {
	}
#endif
	ok_disp = ON;
	SelSw = OFF;
	process_phase++;
	return;
    }

    for( i=0; i<4; i++ ) {
	if( Key_switch[i] == OFF ) continue;
	res = KeyIn_Move_Cur( &SelectStageNum, 1, STICK_X,
			      NUM_NOLOOP, 20, 2, 4, i, &VsSelST[i] );
	if( res ) {
	    Na_StartSystemSe( NA_SE_CURSOR );
	    SelectStage = SelectStageNum;
	}

	/** 決定 **/
	if( Key_T[i].button & CONT_A ) {
	    Na_StartSystemSe( NA_SE_DECIDE );
	    if( SelectStage == 0 ) {
		VS_stage = 0;
		if( NowVsMode == VS_TIMET ) {
		    VS_stage = 1;
		}
	    } else {
		VS_stage = 2;
	    }

	    StageFlushCnt = 10;
	    vs_KeyTime_init();
	    return;
	}

	/** 一つ前の項目へ戻る **/
	if( Key_T[i].button & CONT_B ) {
	    Na_StartSystemSe( NA_SE_CANCEL );
	    if( NowVsMode == VS_BATTLE ) {
		/** キャラクター, ハンデレベル選択へ戻る **/
		menu_phase = NowVsMode;
		before_menu = 0;
		NextMenuInit();
	    } else {
		vs_KeyTime_init();
		SelSw = OFF;
		process_phase--;
	    }
	    return;
	}
    }
}

/************************************************************************/
/* ＶＳ ＯＫ選択							*/
/************************************************************************/
static void OK_Select( void )
{
    register int i;

    if( OkFlushCnt ) return;

    if( SelSw ) {
#if 0
	if( NowVsMode == VS_BATTLE && Ending_flg == 0 ) {
	    process_phase += 2;
	} else {
	    process_phase++;
	}
#endif
	SelSw = OFF;
	process_phase++;
	return;
    }

    for( i=0; i<4; i++ ) {
	if( Key_switch[i] == OFF ) continue;
	/* ＶＳゲーム本体画面へ */
	if( Key_T[i].button & CONT_A ) {
	    Na_StartSystemSe( NA_SE_DECIDE );
	    OkFlushCnt = 10;
	    return;
	}
	
	/** 一つ前の項目へ戻る **/
	if( Key_T[i].button & CONT_B ) {
	    Na_StartSystemSe( NA_SE_CANCEL );
	    vs_KeyTime_init();
	    ok_disp = OFF;
	    SelSw = OFF;
	    process_phase--;
	    return;
	}
    }
}

/************************************************************************/
/* ＶＳ ステージ選択表示						*/
/************************************************************************/
static void vs_gameB_display( void )
{
    switch( NowVsMode ) {
    case VS_POINT:
	PointMatch_display();
#if 0
	MachineseWaitListSel_display();
#endif
	break;
    case VS_BATTLE:
#if 0
	MachineseSelect_display();
#endif
	break;
    case VS_TIMET:
	TimeTryal_display();
#if 0
	MachineseSelect_display();
	TopHits_display();
#endif
	break;
    }

    StageSel_display();

    if( ok_disp ) OK_display();
}

/************************************************************************/
/* ＶＳ ステージセレクト ポイントマッチ画面描画 			*/
/************************************************************************/
static void PointMatch_display( void )
{
//    static float wakuX=107.0f,wakuY=23.0f,wakuXs=4.0f,wakuYs = 1.1f;
//    static float bouX=92.0f,bouY=43.0f,bouXs=15.7f;
    float YaX,YaY,YaR;
    float xp,yp;
    int col;
    int number;
    int mask;

    number = VS_point;

    /** 青いヤツ **/
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0,  60,  60, 255, 190 );
    texture_rectangleIA8( &NOW_DISP, MAP_mess_txt, 24, 17,
 			  94.0f, 43.0f, 5.0f, 1.1f );

    if( process_phase == 0 ) {
	YaX = 97.0f;
	YaY = 50.0f;
	YaR = 107.0f;
	Yajirusi_display( YaX,YaY,YaR,255,255,255 );
	ColorFlush( &vsPoint_ChgColor );
    } else {
	vsPoint_ChgColor = 255.0f;
    }
    col = vsPoint_ChgColor;

    mask = 0xffffffff;
    if( PointFlushCnt ) {
	col = 255;
	mask = 0x01;
	PointFlushCnt--;
	if( !PointFlushCnt ) SelSw = ON;
    }


    if( frcnt & mask ) {
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	/** ポイントマッチ数 **/
	yp = 45.0f;
	xp = 109.0f;
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, col, col, 0xff );
	texture_rectangleIA8( &NOW_DISP, Num[number],
			      16, 15,
			      xp,yp,
			      1.0f, 1.0f );
	/** ポイントマッチ **/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, col, col, 0xff );
#if LOCALE==CHINA
	texture_rectangleIA8( &NOW_DISP, VTX_Z_11b_txt,
			      80, 10,
			      122.0f,49.0f,
			      1.0f, 1.0f );
#else
	texture_rectangleIA8( &NOW_DISP, VTX_E_11b_txt,
			      80, 10,
			      122.0f,49.0f,
			      1.0f, 1.0f );
#endif
    }

#if 0
    /** 横棒 **/
    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    texture_rectangleRGBA16( &NOW_DISP, MAP_bou_txt,
			     8, 8, bouX, bouY,
			     bouXs, 0.2f );
#endif

#if 0
    {
	if ( Key[2].button & CONT_RIGHT ) {
	    wakuX += 1.0f;
	}
	if ( Key[2].button & CONT_LEFT ) {
	    wakuX -= 1.0f;
	}
	if ( Key[2].button & CONT_UP ) {
	    wakuY -= 1.0f;
	}
	if ( Key[2].button & CONT_DOWN ) {
	    wakuY += 1.0f;
	}

	if ( Key_T[2].button & CONT_C ) {
	    wakuXs -= 0.1f;
	}
	if ( Key_T[2].button & CONT_F ) {
	    wakuXs += 0.1f;
	}
	if ( Key_T[2].button & CONT_D ) {
	    wakuYs -= 0.1f;
	}
	if ( Key_T[2].button & CONT_E ) {
	    wakuYs += 0.1f;
	}

	PRINTF( "wx:%f wy:%f wxs:%f wys:%f\n",wakuX,wakuY,wakuXs,wakuYs );
    }
#endif
}

#if 0
/************************************************************************/
/* ＶＳ ポイントマッチ マシンの順番指定選択画面の描画			*/
/************************************************************************/
static void MachineseWaitListSel_display( void )
{
    float YaX,YaY,YaR;
    int col;
    int mask;

    static float mmX[3]={116.0f,143.0f,130.0f};
    static float mmY[3]={131.0f,151.0f,151.0f};

    static int List_xsiz[2] = {32,64};
    static unsigned char *List_txt[2] = {
	/** 固定 **/
	VTX_kotei_txt,
	/** 選択する **/
	VTX_sentaku_txt,
    };

    if( process_phase == 2 ) {
	YaX = 111.0f;
	YaY = 154.0f;
	YaR = 84.0f;
	Yajirusi_display( YaX,YaY,YaR,255,255,255 );
	ColorFlush( &vsList_ChgColor );
    } else {
	vsList_ChgColor = 255.0f;
    }
    col = vsList_ChgColor;

    mask = 0xffffffff;
    if( ListFlushCnt ) {
	col = 255;
	mask = 0x01;
	ListFlushCnt--;
	if( !ListFlushCnt ) SelSw = ON;
    }
    
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );

    if( frcnt & mask ) {
    /** マシンの順番 **/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, 0xff );
	texture_rectangleIA8( &NOW_DISP, VTX_jyunban_txt,
			      80, 13,
			      mmX[0],mmY[0],
			      1.0f, 1.0f );
    }

    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    texture_rectangleIA8( &NOW_DISP, List_txt[MachineseWaitList],
			  List_xsiz[MachineseWaitList], 13,
			  mmX[MachineseWaitList+1],mmY[MachineseWaitList+1],
			  1.0f, 1.0f );

    if( MachineseWaitList == 0 && Ending_flg != 0 )
	MachineseWaitList_display();

#if 0
{
    static int p = 0;

    if ( Key_T[3].button & CONT_L ) {
	p++;
	if( p > 2 ) p = 0;
    }
    if ( Key[3].button & CONT_RIGHT ) {
	mmX[p] += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT ) {
	mmX[p] -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	mmY[p] -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	mmY[p] += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",p,mmX[p],mmY[p] );
}
#endif
}

/************************************************************************/
/* ＶＳ ポイントマッチ マシンの順番の描画				*/
/************************************************************************/
static void MachineseWaitList_display( void )
{
    register int i;

    static float eeX=153.0f;
    static float eeY=168.0f;
    static float xx1=20.0f,xx2=20.0f;
    float x1,x2;
    float xp;
    int *lp,*lp2;
	
    static int lis[5]={0,0,0,0,0};
    static int lisLv1[5]={0,0,0,0,1};
    static int lisLv2[5]={0,0,0,1,2};

    static unsigned char *icon_txt[3] = {
	VTX_a_icon_txt,
	VTX_t_icon_txt,
	VTX_f_icon_txt,
    };
    static unsigned char *num_txt[5] = {
	VTX_chibi1_txt,
	VTX_chibi2_txt,
	VTX_chibi3_txt,
	VTX_chibi4_txt,
	VTX_chibi5_txt,
    };

    /** 宇宙はアーウィンだけ **/
    if( SelectStage == 1 || VS_point == 1 || Ending_flg == 0 ) {
	lp2 = lis;
    } else {
	if( Ending_flg == 1 ) lp = lisLv1;
	if( Ending_flg == 2 ) lp = lisLv2;
	lp2 = lp+(5-VS_point);
    }
    
    xp = eeX - (10.0f*(VS_point-1));
    
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    for( x1=xp,x2=xp-4.0f,i=0; i<VS_point; i++,x1+=xx1,x2+=xx2,lp2++ ) {
	/** マシンの順番の番号 **/
	texture_rectangleIA8( &NOW_DISP, num_txt[i],
			      8, 8,
			      x1,eeY,
			      1.0f, 1.0f );
	/** マシンのアイコン **/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
	texture_rectangleIA8( &NOW_DISP, icon_txt[*lp2],
			      16, 16,
			      x2,eeY+11.0f,
			      1.0f, 1.0f );
    }

#if 0
{
    if ( Key[3].button & CONT_RIGHT ) {
	eeX += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT ) {
	eeX -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	eeY -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	eeY += 1.0f;
    }

    if ( Key[2].button & CONT_RIGHT ) {
	xx1 += 1.0f;
    }
    if ( Key[2].button & CONT_LEFT ) {
	xx1 -= 1.0f;
    }
    if ( Key[1].button & CONT_RIGHT ) {
	xx2 += 1.0f;
    }
    if ( Key[1].button & CONT_LEFT ) {
	xx2 -= 1.0f;
    }

    PRINTF( "x:%f y:%f xx1:%f xx2:%f\n",eeX,eeY,xx1,xx2 );
}
#endif
}

/************************************************************************/
/* ＶＳ バトルロイヤル,タイムトライアル	マシンセレクト画面の描画	*/
/************************************************************************/
static void MachineseSelect_display( void )
{
    float YaX,YaY,YaR;
    int col;
    int ysiz;
    int *lp;
    int aa;
    int mask;

    static float aaX[6]={106.0f,124.0f,137.0f,124.0f,130.0f,131.0f};
    static float aaY[6]={131.0f,151.0f,151.0f,151.0f,151.0f,150.0f};

    static int Machinese_xsiz[] = {72,40,72,64,64};
    static int MachineseListLv1[] = { 0,1,3,4 };
    static int MachineseListLv2[] = { 0,1,2,3,4 };
    static unsigned char *Machinese_txt[] = {
	/** アーウィン **/
	VTX_awin_txt,
	/** タンク **/
	VTX_tank_txt,
	/** パイロット **/
	VTX_ningen_txt,
	/** 選択する **/
	VTX_sentaku_txt,
	/** ランダム **/
	VTX_randam_txt,
    };

    if( Ending_flg == 2 ) lp = MachineseListLv2+SelectMachinese;
    else                  lp = MachineseListLv1+SelectMachinese;

    if( (process_phase == 1 && NowVsMode == VS_BATTLE) ||
	(process_phase == 2 && NowVsMode == VS_TIMET)) {
	if( Ending_flg != 0 ) {
	    ColorFlush( &vsMachinese_ChgColor );
	    YaX = 111.0f;
	    YaY = 154.0f;
	    YaR = 84.0f;
	    Yajirusi_display( YaX,YaY,YaR,255,255,255 );
	}
    } else {
	vsMachinese_ChgColor = 255.0f;
    }
    col = vsMachinese_ChgColor;

    mask = 0xffffffff;
    if( MachineseFlushCnt ) {
	col = 255;
	mask = 0x01;
	MachineseFlushCnt--;
	if( !MachineseFlushCnt ) SelSw = ON;
    }
    if( Ending_flg == 0 ) aa = 0x20;
    else                  aa = 0xff;
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );

    if( frcnt & mask ) {
	/** マシンセレクト **/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, aa );
	texture_rectangleIA8( &NOW_DISP, VTX_machineselect_txt,
			      120, 13,
			      aaX[0],aaY[0],
			      1.0f, 1.0f );
    }

    ysiz = 13;
    if( SelectMachinese == 4 ) ysiz = 14;
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    texture_rectangleIA8( &NOW_DISP, Machinese_txt[*lp],
			  Machinese_xsiz[*lp], ysiz,
			  aaX[(*lp)+1],
			  aaY[(*lp)+1],
			  1.0f, 1.0f );
#if 0
{
    static int p = 0;

    if ( Key_T[3].button & CONT_L ) {
	p++;
	if( p > 5 ) p = 0;
    }
    if ( Key[3].button & CONT_RIGHT ) {
	aaX[p] += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT ) {
	aaX[p] -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	aaY[p] -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	aaY[p] += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",p,aaX[p],aaY[p] );
}
#endif
}
#endif

/************************************************************************/
/* ＶＳ ステージセレクト タイムトライアル画面描画 			*/
/************************************************************************/
static void TimeTryal_display( void )
{
//    float wakuX,wakuY,wakuXs,wakuYs;
    static float YaX,YaY,YaR;
    int Time_xsiz;
    int Time_ysiz;
    int col;
    int mask;

    static float bbX[6]={156.0f,112.0f,112.0f,112.0f,112.0f,112.0f};
    static float bbY[6]={ 46.0f,43.0f,43.0f,43.0f,43.0f,43.0f};

#if LOCALE==CHINA
    static unsigned char *Time_txt[] = {
	/** １分間 **/
	VTX_Z_24_1_txt,
	/** ２分間 **/
	VTX_Z_24_2_txt,
	/** ３分間 **/
	VTX_Z_24_3_txt,
	/** ４分間 **/
	VTX_Z_24_4_txt,
	/** ５分間 **/
	VTX_Z_24_5_txt,
    };
#else
    static unsigned char *Time_txt[] = {
	/** １分間 **/
	VTX_E_24_1_txt,
	/** ２分間 **/
	VTX_E_24_2_txt,
	/** ３分間 **/
	VTX_E_24_3_txt,
	/** ４分間 **/
	VTX_E_24_4_txt,
	/** ５分間 **/
	VTX_E_24_5_txt,
    };
#endif

    /** 青いヤツ **/
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0,  60,  60, 255, 190 );
    texture_rectangleIA8( &NOW_DISP, MAP_mess_txt, 24, 17,
			  93.0f,42.0f,5.1f,1.1f );

    if( process_phase == 0 ) {
	YaX = 97.0f;
	YaY = 49.0f;
	YaR = 107.0f;
	Yajirusi_display( YaX,YaY,YaR,255,255,255 );
	ColorFlush( &vsTime_ChgColor );
    } else {
	vsTime_ChgColor = 255.0f;
    }
    col = vsTime_ChgColor;

    mask = 0xffffffff;
    if( TimeFlushCnt ) {
	col = 255;
	mask = 0x01;
	TimeFlushCnt--;
	if( !TimeFlushCnt ) SelSw = ON;
    }

    if( frcnt & mask ) {
	Time_xsiz = 40;
	Time_ysiz = 15;

	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, 0xff );
	texture_rectangleIA8( &NOW_DISP, Time_txt[TryalTime],
			      Time_xsiz, Time_ysiz,
			      bbX[TryalTime+1],bbY[TryalTime+1],
			      1.0f, 1.0f );
	
	/** のバトル **/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, 0xff );
#if LOCALE==CHINA
	texture_rectangleIA8( &NOW_DISP, VTX_Z_24_txt,
			      80, 12,
			      bbX[0],bbY[0],
			      1.0f, 1.0f );
#else
	texture_rectangleIA8( &NOW_DISP, VTX_E_24_txt,
			      80, 12,
			      bbX[0],bbY[0],
			      1.0f, 1.0f );
#endif
    }

#if 0
    {
	if ( Key[2].button & CONT_RIGHT ) {
	    wakuX += 1.0f;
	}
	if ( Key[2].button & CONT_LEFT ) {
	    wakuX -= 1.0f;
	}
	if ( Key[2].button & CONT_UP ) {
	    wakuY -= 1.0f;
	}
	if ( Key[2].button & CONT_DOWN ) {
	    wakuY += 1.0f;
	}

	if ( Key_T[2].button & CONT_C ) {
	    wakuXs -= 0.1f;
	}
	if ( Key_T[2].button & CONT_F ) {
	    wakuXs += 0.1f;
	}
	if ( Key_T[2].button & CONT_D ) {
	    wakuYs -= 0.1f;
	}
	if ( Key_T[2].button & CONT_E ) {
	    wakuYs += 0.1f;
	}

	if ( Key[3].button & CONT_RIGHT ) {
	    YaX += 1.0f;
	}
	if ( Key[3].button & CONT_LEFT ) {
	    YaX -= 1.0f;
	}
	if ( Key[3].button & CONT_UP ) {
	    YaR -= 1.0f;
	}
	if ( Key[3].button & CONT_DOWN ) {
	    YaR += 1.0f;
	}
	PRINTF( "yaX:%f yaR:%f\n",YaX,YaR );
	PRINTF( "wx:%f wy:%f wxs:%f wys:%f\n",wakuX,wakuY,wakuXs,wakuYs );
    }
#endif
#if 0
{
    static int p = 0;

    if ( Key_T[3].button & CONT_L ) {
	p++;
	if( p > 5 ) p = 0;
    }
    if ( Key[3].button & CONT_RIGHT ) {
	bbX[p] += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT ) {
	bbX[p] -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	bbY[p] -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	bbY[p] += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",p,bbX[p],bbY[p] );
}
#endif
}

#if 0
/************************************************************************/
/* ＶＳ ステージセレクト トップヒットスコア描画 			*/
/************************************************************************/
static void TopHits_display( void )
{
//    static float wakuX=130.0f,wakuY=171.0f,wakuXs=2.3f,wakuYs = 2.1f;
    static float ccX[3]={136.0f,165.0f,133.0f};
    static float ccY[3]={174.0f,195.0f,189.0f};
    int hit,hitl,hith;

    /** 青いヤツ **/
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0,  60,  60, 255, 190 );
    texture_rectangleIA8( &NOW_DISP, MAP_mess_txt, 24, 17,
 			  130.0f, 171.0f, 2.3f, 2.1f );

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );

    /** ＴＯＰＨＩＴ **/
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    texture_rectangleIA8( &NOW_DISP, VTX_tophit_txt,
			  40, 7,
			  ccX[0],ccY[0],
			  1.0f, 1.0f );
    /** ＨＩＴ **/
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    texture_rectangleIA8( &NOW_DISP, VTX_hit_txt,
			  16, 7,
			  ccX[1],ccY[1],
			  1.0f, 1.0f );

    hit = TmTryTopHit[TryalTime];
    hith = hit / 10;
    hitl = hit % 10;
    /** ＴＯＰＨＩＴ数 **/
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    texture_rectangleIA8( &NOW_DISP, Num[hith],
			  16,15,
			  ccX[2],ccY[2],
			  1.0f, 1.0f );
    texture_rectangleIA8( &NOW_DISP, Num[hitl],
			  16,15,
			  ccX[2]+14.0f,ccY[2],
			  1.0f, 1.0f );

#if 0
    {
	if ( Key[2].button & CONT_RIGHT ) {
	    wakuX += 1.0f;
	}
	if ( Key[2].button & CONT_LEFT ) {
	    wakuX -= 1.0f;
	}
	if ( Key[2].button & CONT_UP ) {
	    wakuY -= 1.0f;
	}
	if ( Key[2].button & CONT_DOWN ) {
	    wakuY += 1.0f;
	}

	if ( Key_T[2].button & CONT_C ) {
	    wakuXs -= 0.1f;
	}
	if ( Key_T[2].button & CONT_F ) {
	    wakuXs += 0.1f;
	}
	if ( Key_T[2].button & CONT_D ) {
	    wakuYs -= 0.1f;
	}
	if ( Key_T[2].button & CONT_E ) {
	    wakuYs += 0.1f;
	}

	PRINTF( "wx:%f wy:%f wxs:%f wys:%f\n",wakuX,wakuY,wakuXs,wakuYs );
    }
#endif
#if 0
{
    static int p = 0;

    if ( Key_T[3].button & CONT_L ) {
	p++;
	if( p > 2 ) p = 0;
    }
    if ( Key[3].button & CONT_RIGHT ) {
	ccX[p] += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT ) {
	ccX[p] -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	ccY[p] -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	ccY[p] += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",p,ccX[p],ccY[p] );
}
#endif
}
#endif

/************************************************************************/
/* ステージセレクト画面描画						*/
/************************************************************************/
static void StageSel_display( void )
{
    static float ssX=101.0f,ssY=86.0f;
    static float YaX,YaY,YaR;
    int mask;
    int col;

    if( (process_phase == 0 && NowVsMode == VS_BATTLE) ||
	(process_phase == 1 && NowVsMode != VS_BATTLE) ) {
	YaX = 94.0f;
	YaY = 88.0f;
	YaR = 114.0f;
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	Yajirusi_display( YaX,YaY,YaR,255,255,255 );
	ColorFlush( &vsStage_ChgColor );
    } else {
	vsStage_ChgColor = 255.0f;
    }

    col = vsStage_ChgColor;

    mask = 0xffffffff;
    if( StageFlushCnt ) {
	mask = 0x01;
	col = 255;
	StageFlushCnt--;
	if( !StageFlushCnt ) SelSw = ON;
    }

    if( frcnt & mask ) {
	/** ステージセレクト **/
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, col, col, 0xff );
#if LOCALE==CHINA
	texture_rectangleIA8( &NOW_DISP, VTX_Z21_txt,
			      112, 12,
			      ssX,ssY,
			      1.0f, 1.0f );
#else
	texture_rectangleIA8( &NOW_DISP, VTX_E21_txt,
			      112, 12,
			      ssX,ssY,
			      1.0f, 1.0f );
#endif
    }

    if( NowVsMode == VS_TIMET ) {
	StageSelStageTT_display();
    } else {
	StageSelStage_display();
    }

#if 0
{
    if ( Key[1].button & CONT_DOWN ) {
	ssX += 1.0f;
    }
    if ( Key[1].button & CONT_UP ) {
	ssX -= 1.0f;
    }
    PRINTF( "ssx:%f\n",ssX );
}
#endif
#if 0
{
    if ( Key[3].button & CONT_RIGHT ) {
	YaX += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT ) {
	YaX -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	YaY -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	YaY += 1.0f;
    }
    if ( Key[3].button & CONT_F ) {
	YaR += 1.0f;
    }
    if ( Key[3].button & CONT_C ) {
	YaR -= 1.0f;
    }
    
    PRINTF( "x:%f y:%f r:%f\n",YaX,YaY,YaR );
}
#endif
}

/************************************************************************/
/* ステージセレクト画面描画 (タイムトライアル用)			*/
/************************************************************************/
static void StageSelStageTT_display( void )
{
    static float spX=69.0f,spY=110.0f,spS=123.0f;
    static float snX[]={72.0f,189.0f};
    float xx;
    register int i;
    int xsiz;
    int sel_A[2];

#if LOCALE==CHINA
    static unsigned char *stgenameTT_txt[] = {
	VTX_Z25_txt,
	VTX_Z23_txt,
    };
#else
    static unsigned char *stgenameTT_txt[] = {
	VTX_E25_txt,
	VTX_E23_txt,
    };
#endif
    static unsigned char *stgeTT_txt[] = {
	VTX_stage4_txt,
	VTX_stage2_txt,
    };
    static unsigned short *stgeTT_txttlut[] = {
	VTX_stage4_txttlut,
	VTX_stage2_txttlut,
    };

    
    for( xx=spX,i=0; i<2; i++,xx+=spS ) {
	if( i == SelectStage ) sel_A[i] = 0xff;
	else		       sel_A[i] = 0x20;
	
	/** ステージの絵 **/
	rcpsetmode( &NOW_DISP, RECE_RGBA_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, sel_A[i] );
	texture_rectangleCI8( &NOW_DISP, stgeTT_txt[i],stgeTT_txttlut[i],
			      48, 38,
			      xx,spY,
			      1.0f, 1.0f );
	
	/** ステージ名 **/
	xsiz = 48;
	if( i == 1 ) xsiz = 56;
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, sel_A[i] );
	texture_rectangleIA8( &NOW_DISP, stgenameTT_txt[i],
			      xsiz, 10,
			      snX[i],spY+40.0f,
			      1.0f, 1.0f );
    }

#if 0
{
    static int p = 0;

    if ( Key_T[1].button & CONT_L ) {
	p++;
	if( p > 1 ) p = 0;
    }
    if ( Key[1].button & CONT_LEFT ) {
	snX[p] -= 1.0f;
    }
    if ( Key[1].button & CONT_RIGHT ) {
	snX[p] += 1.0f;
    }
    if ( Key[1].button & CONT_C ) {
	spX -= 1.0f;
    }
    if ( Key[1].button & CONT_D ) {
	spX += 1.0f;
    }
    if ( Key[1].button & CONT_E ) {
	spS -= 1.0f;
    }
    if ( Key[1].button & CONT_F ) {
	spS += 1.0f;
    }

    PRINTF( "p:%d x:%f sx:%f s:%f\n",p,snX[p],spX,spS );
}
#endif
}

/************************************************************************/
/* ステージセレクト画面描画						*/
/************************************************************************/
static void StageSelStage_display( void )
{
    static float spX=69.0f,spY=110.0f,spS=123.0f;
    static float snX[]={66.0f,189.0f};

//    static float spX=49.0f,spY=70.0f,spS=83.0f;
//    static float snX[3]={50.0f,145.0f,216.0f};
    float xx;
    register int i;
    int sel_A[3];

#if LOCALE==CHINA
    static unsigned char *stgename_txt[] = {
	VTX_Z22_txt,
	VTX_Z23_txt,
    };
#else
    static unsigned char *stgename_txt[] = {
	VTX_E22_txt,
	VTX_E23_txt,
    };
#endif
    static unsigned char *stge_txt[] = {
	VTX_stage1_txt,
	VTX_stage2_txt,
    };
    static unsigned short *stge_txttlut[] = {
	VTX_stage1_txttlut,
	VTX_stage2_txttlut,
    };

    
    for( xx=spX,i=0; i<2; i++,xx+=spS ) {
	if( i == SelectStage ) sel_A[i] = 0xff;
	else		       sel_A[i] = 0x20;
	
	/** ステージの絵 **/
	rcpsetmode( &NOW_DISP, RECE_RGBA_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, sel_A[i] );
	texture_rectangleCI8( &NOW_DISP, stge_txt[i],stge_txttlut[i],
			      48, 38,
			      xx,spY,
			      1.0f, 1.0f );
	
	/** ステージ名 **/
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, sel_A[i] );
	texture_rectangleIA8( &NOW_DISP, stgename_txt[i],
			      56, 10,
			      snX[i],spY+40.0f,
			      1.0f, 1.0f );
    }

#if 0
    if ( Key[3].button & CONT_UP ) {
	spY -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	spY += 1.0f;
    }

    PRINTF( "sy:%f\n",spY );
#endif

#if 0
{
    static int p = 0;

    if ( Key_T[1].button & CONT_L ) {
	p++;
	if( p > 1 ) p = 0;
    }
    if ( Key[1].button & CONT_LEFT ) {
	snX[p] -= 1.0f;
    }
    if ( Key[1].button & CONT_RIGHT ) {
	snX[p] += 1.0f;
    }
    if ( Key[1].button & CONT_C ) {
	spX -= 1.0f;
    }
    if ( Key[1].button & CONT_D ) {
	spX += 1.0f;
    }
    if ( Key[1].button & CONT_E ) {
	spS -= 1.0f;
    }
    if ( Key[1].button & CONT_F ) {
	spS += 1.0f;
    }

    PRINTF( "p:%d x:%f sx:%f s:%f\n",p,snX[p],spX,spS );
}
#endif
}

/************************************************************************/
/* "ＯＫ？"の描画							*/
/************************************************************************/
static void OK_display( void )
{
//    static float xp=92.0f,yp=204.0f;
    float xp=143.0f,yp=210.0f;
    int col;
    int mask;
    
    ColorFlush( &OkColor );
    col = (int)OkColor;
    mask = 0xffffffff;
    if( OkFlushCnt ) {
	col = 255;
	mask = 0x01;
	OkFlushCnt--;
	if( !OkFlushCnt ) SelSw = ON;
    }

    if( frcnt & mask ) {
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, col, col, 0xff );
#if LOCALE==CHINA
	texture_rectangleIA8( &NOW_DISP, VTX_Z_OK_txt,
			      40, 12,
			      xp,yp,
			      1.0f, 1.0f );
#else
	texture_rectangleIA8( &NOW_DISP, VTX_OK_txt,
			      40, 12,
			      xp,yp,
			      1.0f, 1.0f );
#endif
    }

#if 0
{
    if ( Key[3].button & CONT_RIGHT ) {
	xp += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT  ) {
	xp -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	yp -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	yp += 1.0f;
    }

    PRINTF( "x:%f y:%f\n",xp,yp );
}
#endif
}

/************************************************************************/
/* 矢印の描画								*/
/************************************************************************/
static void Yajirusi_display( float x, float y, float range,
                              int r, int g, int b )
{
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, r, g, b, 0xff );
    texture_rectangleIA8X( &NOW_DISP,
			   VTX_yajirusi_txt,
			   8, 8,
			   x,y,
			   1.0f, 1.0f );
    
    texture_rectangleIA8( &NOW_DISP,
			  VTX_yajirusi_txt,
			  8, 8,
			  x+range,y,
			  1.0f, 1.0f );

#if 0
    if( Key_T[3].button & CONT_L ) {
	yap ^= 1;
    }
    if( Key[3].button & CONT_LEFT ) {
	xp[yap] -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	xp[yap] += 1.0f;
    }
    if( Key[3].button & CONT_UP ) {
	yyp[0] -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	yyp[0] += 1.0f;
    }
    if( Key[3].button & CONT_C ) {
	range -= 1.0f;
    }
    if( Key[3].button & CONT_F ) {
	range += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f r:%f\n",yap,xp[yap],yyp[0],range );
#endif
}

/************************************************************************/
/* Ａ,Ｂボタンをおすと....						*/
/************************************************************************/
static void button_info_display( void )
{
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );

#if LOCALE==CHINA
    /** Ａボタンで決定 **/
    texture_rectangleIA8( &NOW_DISP,
			  TXT_Z35_txt,
			  96, 10,
			  62.0f, 213.0f,
			  1.0f, 1.0f );

    /** Ｂボタンでもどる **/
    texture_rectangleIA8( &NOW_DISP,
			  TXT_Z31_txt,
			  96, 10,
			  166.0f, 213.0f,
			  1.0f, 1.0f );
#else
    /** Ａボタンで決定 **/
    texture_rectangleIA8( &NOW_DISP,
			  TXT_E35_txt,
			  96, 10,
			  62.0f, 213.0f,
			  1.0f, 1.0f );

    /** Ｂボタンでもどる **/
    texture_rectangleIA8( &NOW_DISP,
			  TXT_E31_txt,
			  96, 10,
			  166.0f, 213.0f,
			  1.0f, 1.0f );
#endif
}

/************************************************************************/
/* EXIT処理								*/
/************************************************************************/
static void exit_process( int next_phase )
{
    menu_phase = next_phase;
    display_mode = DISPLAY_NOTH;
    process_phase = 0;
    cur_pos = 0;
}







/************************************************************************/
/* メニュー タイトル 表示 (オプションメニュー)				*/
/************************************************************************/
static void vs_menu_title_display( void )
{
#if 0
{
    if( Key[3].button & CONT_UP ) {
	vsM[vsM_cur_pos].win.posY += 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	vsM[vsM_cur_pos].win.posY -= 1.0f;
    }

    PRINTF( "y:%f\n",vsM[vsM_cur_pos].win.posY );
}
#endif
#if 0
{
    if( Key[3].button & CONT_UP ) {
	vsM[vsM_cur_pos].text.posY -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	vsM[vsM_cur_pos].text.posY += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	vsM[vsM_cur_pos].text.posX -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	vsM[vsM_cur_pos].text.posX += 1.0f;
    }

    PRINTF( "x:%f y:%f\n",
	    vsM[vsM_cur_pos].text.posX,
	    vsM[vsM_cur_pos].text.posY );
}
#endif
    push_now2();
    window_display( vsM[vsM_cur_pos].win );
    pull_now();
    txt_display( vsM[vsM_cur_pos].text );
}

/************************************************************************/
/* メニュー タイトル 表示						*/
/************************************************************************/
static void menu_title_display( void )
{
    push_now2();
    window_display( mainM[mainM_cur_pos].win );
    pull_now();
    txt_display( mainM[mainM_cur_pos].text );
}

/************************************************************************/
/* メニューウインドウの描画						*/
/************************************************************************/
static void window_display( WIN_T data )
{
    rcpsetmode( &NOW_DISP, TEXT );

    projection_ortho( &NOW_DISP );

    push_now();

    translate_now( data.posX, data.posY, data.posZ, MULT_MTX );
    scale_now( data.sclX, data.sclY, 1.0f, MULT_MTX );

    rotateX_now( ANGLE(90.0f), MULT_MTX );

    set_matrix(&NOW_DISP);

    gSPDisplayList(NEXT_DISP, TXT_window);

    pull_now();

    projection_set( &NOW_DISP );
}

/************************************************************************/
/* アーウィンカーソルの描画						*/
/************************************************************************/
static void AwingCur_display( CUR_T curs )
{
    if( !cur_draw_sw ) return;

    Awing_display( curs.posX, curs.posY, CurZp, CurXaL, 90.0f, CurScl );

    Awing_display( curs.posX+curs.rngX,
 		   curs.posY, CurZp, CurXaR, -90.0f, CurScl );
}

/************************************************************************/
/* アーウィンの描画							*/
/************************************************************************/
static void Awing_display( float xp, float yp, float zp,
			   float ya, float za, float scl )
{
    float LigXp,LigYp,LigZp;
    
    ligpos_calc( LigXa, LigYa, 100.0f, &LigXp, &LigYp, &LigZp );

    light_in( (int)LigXp, (int)LigYp, (int)LigZp,
	      LigR, LigG, LigB,
	      KanR, KanG, KanB );

    push_now();

    translate_now( xp, yp, zp, MULT_MTX );
    scale_now( scl, scl, scl, MULT_MTX );
    rotateZ_now( ANGLE(za), MULT_MTX );
    rotateY_now( ANGLE(ya), MULT_MTX );

    set_matrix(&NOW_DISP);

    texture_z_a_light();
//    gSPDisplayList(NEXT_DISP, TXT_kowin);
    gSPDisplayList(NEXT_DISP, MAP_kowin);

    pull_now();
}




/************************************************************************/
/* 									*/
/************************************************************************/
static void push_now2( void )
{
    push_now();

    set_lookat_now(eyeX, eyeY, eyeZ,
		   wayX, wayY, wayZ,
		   0.0f, 1.0f, 0.0f, MULT_MTX);

#if 0
    translate_now( 0.0f, 0.0f, 0.0f, MULT_MTX);
    set_matrix(&NOW_DISP);
#endif
}

/************************************************************************/
/* ライト座標の計算							*/
/************************************************************************/
static void ligpos_calc( float xa, float ya, float lr,
			 float *rx, float *ry, float *rz )
{
    xyz_t ato;
    xyz_t mae;

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = lr;

    rotateY_work( ANGLE(ya), SET_MTX );
    rotateX_work( ANGLE(xa), MULT_MTX );
    
    MtxF_Position_work( &mae,&ato );
    
    *rx = ato.x;
    *ry = ato.y;
    *rz = ato.z;
}




/************************************************************************/
/* メイン,オプション メニュー用 ビリビリの制御				*/
/************************************************************************/
static void biribiri_ctrl( void )
{
    register int i;
    float work;

#if 1
    if( !bri_sw ) return;

    work = briXp;
    push_now2();
    for( i=0; i<3; i++,briXp+=6.0f ) {
	briSclX = rnd()*0.5f;
	briSclY = 0.5f;
	biribiri_display();
    }
    pull_now();
    briXp = work;
    
    if( briXp < 23.0f ) { 
	briXp += 18.0f;
    } else {
	briXp = 23.0f;
	bri_sw = OFF;
    }
#else
    briSclX = 0.5f;
    briSclY = 0.5f;
    briYp = vswinYp[mainM_cur_pos];
    biribiri_display();
    if( Key[3].button & CONT_LEFT ) {
	briXp -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	briXp += 1.0f;
    }
    PRINTF( "x:%f\n",briXp );
#endif
}

/************************************************************************/
/* メイン,オプション メニュー用 ビリビリの描画				*/
/************************************************************************/
static void biribiri_display( void )
{
    rcpsetmode( &NOW_DISP, TEXT_A );

    projection_ortho( &NOW_DISP );

    push_now();
    translate_now( briXp, briYp, 0.0f, MULT_MTX );
    scale_now( briSclX, briSclY, 1.0f, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList(NEXT_DISP, TXT_biribiri);
    pull_now();

    projection_set( &NOW_DISP );
}

/************************************************************************/
/* 文字 表示 サブ							*/
/************************************************************************/
static void txt_display( TXTR_T data )
{
    if( data.sclX <= 0.0f || data.sclY <= 0.0f ) return;

    switch( data.TxtType ) {
    case CI4:
	rcpsetmode( &NOW_DISP, RECT_RGBA_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, data.r, data.g, data.b, data.a );
	texture_rectangleCI4( &NOW_DISP, data.txt, data.tlut,
			      data.SizX, data.SizY,
			      data.posX, data.posY,
			      data.sclX, data.sclY );
	break;
    case CI8:
	rcpsetmode( &NOW_DISP, RECT_RGBA_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, data.r, data.g, data.b, data.a );
	texture_rectangleCI8( &NOW_DISP, data.txt, data.tlut,
			      data.SizX, data.SizY,
			      data.posX, data.posY,
			      data.sclX, data.sclY );
	break;
    case IA8:
	rcpsetmode( &NOW_DISP, RECT_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, data.r, data.g, data.b, data.a );
	texture_rectangleIA8( &NOW_DISP, data.txt,
			      data.SizX, data.SizY,
			      data.posX, data.posY,
			      data.sclX, data.sclY );
	break;
    case RGBA16:
	rcpsetmode( &NOW_DISP, RECT_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, data.r, data.g, data.b, data.a );
	texture_rectangleRGBA16( &NOW_DISP, data.txt,
				 data.SizX, data.SizY,
				 data.posX, data.posY,
				 data.sclX, data.sclY );
	break;
    }
}

/************************************************************************/
/* キー入力 カーソル移動用 (縦,横方向)					*/
/************************************************************************/
static int KeyIn_Move_Cur( int *pos, int pos_max, int xy, int loop,
			   int asobi, int wtime, int adwtime,
			   int cont, STICK_T *stick )
{
    int st,x,y,res,work;
    
    res = 0;

    if( pos_max == 0 ) return( res );

    work = *pos;

    x = Key_T[cont].stick_x;
    y = -Key_T[cont].stick_y;
    
    if( xy == 1 ) {
	st = y;
	if( x > 40 || x < -40 ) return( res );
    } else {
	st = x;
	if( y > 40 || y < -40 ) return( res );
    }

    if( st < asobi && st > -asobi ) {
	st = 0;
    }

    if( !(stick->WaitTime) ) {
	if( st != 0 ) {
	    if( st > 0 ) {
		(*pos)++;
		if( *pos > pos_max ) {
		    if( loop == NUM_LOOP ) *pos = 0;
		    else                   *pos = pos_max;
		}
	    }
	    if( st < 0 ) {
		(*pos)--;
		if( *pos < 0 ) {
		    if( loop == NUM_LOOP ) *pos = pos_max;
		    else                   *pos = 0;
		}
	    }

	    stick->WaitTime = wtime+stick->AdWaitTime;
	    if( stick->AdWaitTime > 0 ) stick->AdWaitTime -= adwtime;
	} else {
	    stick->WaitTime = 0;
	    stick->AdWaitTime = adwtime;
	}
    }

    if( stick->WaitTime > 0 ) stick->WaitTime --;

    if( work != *pos ) {
	res = 1;
    }
    
    return( res );
}
/************************************************************************/
/* キー入力 ２値選択用 (横方向)						*/
/************************************************************************/
static int KeyIn_Select2( int *p )
{
    int x,y,res,work;

    res = 0;
    
    work = *p;

    x = Key_T[cont_num].stick_x;
    y = -Key_T[cont_num].stick_y;

    if( y > 40 || y < -40 ) return( res );

    if( x < 30 && x > -30 ) x = 0;

    if( !stick_wait_time2 ) {
	if( x != 0 ) {
	    if( x > 0 ) {
		*p = 0;
		res = 1;
	    }
	    if( x < 0 ) {
		*p = 1;
		res = -1;
	    }
	    stick_wait_time2 = 6;
	}
    }

    if( stick_wait_time2 > 0 ) stick_wait_time2--;

    if( work == *p ) {
	res = 0;
    }
	
    return( res );
}

/************************************************************************/
/* キー入力 レベル調整用 (横方向)					*/
/************************************************************************/
static int KeyIn_Move_Level( float *pos, float pos_min, float pos_max,
			      STICK_T *stick )
{
    int x,y,res;
    float sp,work,work2;

    res = 0;
    work = *pos;

    x = Key_T[cont_num].stick_x;
    y = -Key_T[cont_num].stick_y;

    if( y > 10 || y < -10 ) return( res );
//    if( y != 0 ) return( res );
    
    if( x < 10 && x > -10 ) {
	x = 0;
    } else {
	if( x < 0 ) x += 10;
	else        x -= 10;
    }

    if( !(stick->WaitTime) ) {
	if( x != 0 ) {
	    sp = (float)x / 20.0f;

	    stick->WaitTime = stick->AdWaitTime;
	    if( stick->AdWaitTime != 0 ) stick->AdWaitTime -= 7;
	    if( stick->WaitTime != 0 ) {
		if( x > 0 ) sp = 1.0f;
		else        sp = -1.0f;
	    }

	    *pos += sp;
	    if( *pos > pos_max ) *pos = pos_max;
	    if( *pos < pos_min ) *pos = pos_min;
	} else {
	    stick->WaitTime = 0;
	    stick->AdWaitTime = 7;
	}
    }

    if( stick->WaitTime > 0 ) stick->WaitTime--;
   
    work2 = *pos;
    if( (int)work2 != (int)work ) {
	Na_StartSystemSe( NA_SE_COUNT_UP );
	res = 1;
    }

    return( res );
}

/************************************************************************/
/* 文字,かこみ点滅							*/
/************************************************************************/
static void ColorFlush( float *chg_col )
{
    int ret;

    ret = add_calc( chg_col, SelColor, 0.5f, 100.0f, 1.0f );
    if( ret==0.0f ) {
	if( *chg_col == 32.0f ) SelColor = 255.0f;
	else		        SelColor = 32.0f;
    }
}



/************************************************************************/
/* ランクインしたかどうか調べる						*/
/************************************************************************/
int RankInCheck( void )
{
    register int i,j,k,m;
    int rank;
    int nakama_total;
    int nakama_total2;
    int zanki[10];

    nakama_total = 0;
    nakama_total2 = 0;

    for( i=0; i<StagePtr+1; i++ ) {
	nakama_total += ((NakamaDied[i]&0x00ff0000)>>16) & 0x01;
	nakama_total += ((NakamaDied[i]&0x0000ff00)>>8) & 0x01;
	nakama_total += (NakamaDied[i]&0x000000ff) & 0x01;
    }

    for( i=0; i<10; i++ ) {
	zanki[i] = fox_save.rom[0].data.rank_zanki[i];
    }

    
    /** ランクインしたかどうか調べる **/
    rank = -1;
    for( i=0; i<10; i++ ) {
	if( rank_totalhit[i] <= total_score ) {
	    /** 同じヒット数 **/
	    if( rank_totalhit[i] == total_score ) {
		/** じゃぁ、残機数は、 **/
		for( j=i; j<10; j++ ) {
		    if( rank_totalhit[j] != total_score ) {
			rank = j;
			break;
		    }
		    if( zanki[j] <= Player_zanki[PL_NO] ) {
			/** ヒット数,残機数同じ **/
			if( zanki[j] == Player_zanki[PL_NO] ) {
			    /** 仲間の合計 **/
			    for( k=j; k<10; k++ ) {
				if( zanki[k] != Player_zanki[PL_NO] ||
				    rank_totalhit[k] != total_score ) {
				    rank = k;
				    break;
				}
				nakama_total2 = 0;
				for( m=0; m<3; m++ ) {
				    nakama_total2 += rank_nakama_total[k][m];
				}
				if( nakama_total > nakama_total2 ) {
				    rank = k;
				    break;
				}
			    }
			} else {
			    rank = j;
			}
			break;
		    }
		}
	    } else {
		rank = i;
	    }
	    break;
	}
    }

    return( rank );
}


#ifdef OPT_DEBUG
/*----------------------------------------------------------------------*/
/*									*/
/* エンディングデモ終了後のエンド画面に関する関数			*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* "THE END"画面							*/
/************************************************************************/
static void TheEnd( void )
{
    register int i;

    /** TEST **/
    total_score = 95;
    StagePtr = 0;
    for( i=0; i<7; i++ ) {
	ClearStageNum[i] = -1;
	NakamaDied[i] = 0xff;
    }
    ClearStageNum[StagePtr] = 9;
    ClearHitCount[0] = 95;
    Player_zanki[PL_NO] = 8;

    Back_star_f = 800;
    BG_color = 0x00; /** 背景色 **/
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;
    fade_A = 0x00;

    ranking_pos = RankInCheck();

    if( Key_T[cont_num].button & ANY_KEY ) {
	Na_StartSystemSe( NA_SE_DECIDE );
	display_mode = DISPLAY_NOTH;
	process_phase = 0;
	if( ranking_pos != -1 )
	    menu_phase = NAME_ENTRY;	/** ネームエントリーへ **/
	else
	    menu_phase = END_SCORE;	/** スコアー表示へ **/
    }
}

/************************************************************************/
/* "THE END"画面の描画							*/
/************************************************************************/
static void TheEnd_display( void )
{
    static float tx[4] = {72.0f, 223.0f, 280.0f, 230.0f};
    static float ty[4] = {103.0f, 188.0f, 198.0f, 210.0f};

    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );

    moji_puts( (int)tx[0], (int)ty[0], 2.0f, 2.0f, "THE" );
    moji_puts( (int)tx[0]+(16*3*2), (int)ty[0], 2.0f, 2.0f, "END" );
    
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );

    small_moji_puts( (int)tx[1], (int)ty[1], 1.0f, 1.0f, "TOTAL HIT" );

    moji_number( tx[2]-((keta_ck(total_score)-1)*8),
		 ty[2], total_score );

    if( (frcnt & 0x10) && ranking_pos != -1 ) {
	small_moji_puts( (int)tx[3], (int)ty[3], 1.0f, 1.0f, "RANK IN!!" );
    }

#if 0
{
    static int pp=0;
    
    if( Key_T[3].button & CONT_R ) {
	pp += 1;
	if( pp > 3 ) pp=0;
    }
    if( Key_T[3].button & CONT_L ) {
	pp -= 1;
	if( pp < 0 ) pp=3;
    }
    if( Key[3].button & CONT_UP ) {
	ty[pp] -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	ty[pp] += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	tx[pp] -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	tx[pp] += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",pp,tx[pp],ty[pp] );
}
#endif
}
#endif


/*----------------------------------------------------------------------*/
/*									*/
/* ネームエントリー画面に関する関数					*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* ネームエントリー画面							*/
/************************************************************************/
static void name_entry( void )
{
    switch( process_phase ) {
    case 0:
	name_entry_init();
	process_phase++;
	break;
    case 1:
	EntryName();
	break;
    case 2:
	/** バックアップへセーブ **/
	RankingDataSave();
	get_rank_data();
	wait_time1 = 15;
	process_phase++;
	break;
    case 3:
	if( wait_time1 ) break;
	frame_A = 0xff;
	display_mode = DISPLAY_NOTH;
	process_phase = 0;
	menu_phase = END_SCORE;
	break;
    }
}

/************************************************************************/
/* ネームエントリー Inital						*/
/************************************************************************/
static void name_entry_init( void )
{
    register int i;
    int num;
    
    Na_StartBgm( NA_BGM_RANKING );

    frame_A = 0xd0;

    Back_star_f = 800;
    entry_f = ON;

    entry_phase = 0;

    entry_ligXa = 0.0f;
    entry_ligYa = 70.0f;

    num = fox_save.rom[0].data.last_rname & 0xff;
    if( num < 10 ) {
	/** 一度,ネームエントリーしていた場合 **/
	entry_pos = 3;
	entry_end = ON;
	entry_area[0][0]
	    = fox_save.rom[0].data.rank_name[num][0] & 0xff;
	entry_area[1][0]
	    = fox_save.rom[0].data.rank_name[num][1] & 0xff;
	entry_area[2][0]
	    = fox_save.rom[0].data.rank_name[num][2] & 0xff;
	for( i=0; i<3; i++ ) {
	    entry_MojiPos[i] = get_moji_pos( entry_area[i][0] );
	    moji_sel_f[i] = ON;
	    entry_area[i][1] = '\0';
	}
    } else {
	/** はじめてネームエントリーする場合 **/
	entry_pos = 0;
	entry_end = OFF;
	for( i=0; i<3; i++ ) {
	    moji_sel_f[i] = OFF;
	    entry_MojiPos[i] = 0;
	    entry_area[i][0] = 'A';
	    entry_area[i][1] = '\0';
	}
    }

    /** 通ったステージルート内の惑星の絵の初期化 **/
    planet_data_init();
}

/************************************************************************/
/* ネームエントリー							*/
/************************************************************************/
static void EntryName( void )
{
    int res;

    switch( entry_phase ) {
    case 0:
	if( !entry_end ) {
	    res = KeyIn_Move_Cur( &entry_MojiPos[entry_pos], 36, STICK_X,
				  NUM_LOOP, 50, 5, 10,
				  cont_num, &NameEST[entry_pos]);
	    if( res ) {
		Na_StartSystemSe( NA_SE_CURSOR );
		moji_Ya[entry_pos] = 360.0f;
		entry_area[entry_pos][0] = pch[entry_MojiPos[entry_pos]];
		moji_Ya[entry_pos] = 0.0f;
		moji_YaAdd[entry_pos] = 0.0f;
	    }
	}
#if 0
	if( !entry_end ) {
	    if( entry_f ) {
		res = KeyIn_Move_Cur( &entry_MojiPos[entry_pos], 36, STICK_X,
				      NUM_LOOP, 20, 4, 7,
				      cont_num, &NameEST[entry_pos]);
		if( res ) {
		    Na_StartSystemSe( NA_SE_CURSOR );
		    entry_f = OFF;
		}
	    } else {
		res1 =  add_calc( &moji_Ya[entry_pos],
				  360.0f, 1.0f, 100.0f, 1.0f );
		if( moji_Ya[entry_pos] > 180.0f ) {
		    entry_area[entry_pos][0] = pch[entry_MojiPos[entry_pos]];
		}
		if( res1 == 0.0f ) {
		    moji_Ya[entry_pos] = 0.0f;
		    moji_YaAdd[entry_pos] = 0.0f;
		    entry_f = ON;
		}
	    }
	}
#endif

	if( Key_T[cont_num].button & CONT_A ) {
	    moji_Ya[entry_pos] = 0.0f;
	    if( entry_end ) {
		Na_StartSystemSe( NA_SE_DECIDE );
		EntryFlushCnt[0] = 10;
		EntryFlushCnt[1] = 10;
		EntryFlushCnt[2] = 10;
		entry_end = -1;
		entry_phase = 2;
		break;
	    } else {
		if( entry_pos < 3 ) {
		    Na_StartSystemSe( NA_SE_DECIDE );
		    moji_Ya[entry_pos] = 0.0f;
		    EntryFlushCnt[entry_pos] = 15;
		    entry_phase = 1;
		    break;
		}
	    }
	}
	
	if( Key_T[cont_num].button & CONT_B && entry_pos ) {
	    Na_StartSystemSe( NA_SE_CANCEL );
	    if( entry_end ) {
		entry_end = OFF;
	    }
	    entry_pos--;
	    EntryFlushCnt[entry_pos] = 15;
	    entry_phase = 10;
	}
	break;
    case 10:
	EntryFlushCnt[entry_pos]--;
	if( EntryFlushCnt[entry_pos] ) break;
	entry_phase = 0;
	break;
    case 1:
	EntryFlushCnt[entry_pos]--;
	if( EntryFlushCnt[entry_pos] ) break;
	if( entry_pos+1 > 2 ) {
	    entry_end = ON;
	}
	entry_pos++;
	entry_phase = 0;
	break;
    case 2:
	EntryFlushCnt[0]--;
	EntryFlushCnt[1]--;
	EntryFlushCnt[2]--;
	if( EntryFlushCnt[0] ) break;
	wait_time1 = 20;
	entry_phase = 3;
	break;
    case 3:
	if( wait_time1 ) break;
	process_phase = 2;
	break;
    }
}

/************************************************************************/
/* ネームエントリー画面の描画						*/
/************************************************************************/
static void name_entry_display( void )
{
    static float mojiXp[] = {-120.0f, 0.0f, 120.0f};
    float ligPosX;
    float ligPosY;
    float ligPosZ;

    int mask[3];

//    float y = -25.4f;
    register int i;

#if LOCALE==CHINA
    static float nx[6] = {128.0f, 139.0f, 118.0f, 166.0f, 138.0f, 267.0f};
    static float ny[6] = {29.0f, 47.0f, 145.0f, 155.0f, 87.0f, 119.0f};
#else
    static float nx[6] = {51.0f, 138.0f, 118.0f, 166.0f, 138.0f, 267.0f};
    static float ny[6] = {29.0f, 49.0f, 145.0f, 155.0f, 87.0f, 127.0f};
#endif

    rcpsetmode( &NOW_DISP, RECT_A_PRIM );

    if( before_mode == ENDING ) {
	/** "CONGRATULATION" **/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
#if LOCALE==CHINA
        texture_rectangleIA8( &NOW_DISP, MOJI_CONGRATULATIONS_txt,
                              64, 15, nx[0], ny[0], 1.0f, 1.0f );
#else
	moji_puts( (int)nx[0], (int)ny[0], 1.0f, 1.0f, "CONGRATULATIONS" );
#endif
    }

    if( wait_time ) return;

    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
    small_moji_puts( (int)nx[1], (int)ny[1], 1.0f, 1.0f, "RANK" );
    small_moji_puts( (int)nx[2], (int)ny[2], 1.0f, 1.0f, "TOTAL HITS" );


    /** ＥＮＤ **/
    if( entry_end == ON ) {
	if( frcnt & 0x10 ) {
	    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
#if LOCALE==CHINA
	    texture_rectangleIA8( &NOW_DISP, MOJI_Z_END_txt,
				  32, 16, nx[5], ny[5], 1.0f, 1.0f );
#else
	    texture_rectangleIA8( &NOW_DISP, MOJI_END_txt,
				  32, 8, nx[5], ny[5], 1.0f, 1.0f );
#endif
	}
    }

    /** 順位の数字の描画 **/
    drawRankNum( ranking_pos, nx[4], ny[4] );

    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    large_moji_number( nx[3]-((keta_ck(total_score)-1)*13),
		       ny[3], total_score );

    draw_PlayRoot( 1 );
    /** 通ったステージルート内の惑星の自転 **/
    planet_scroll();

    for( i=0; i<3; i++ ) {
	if( i == entry_pos ) {
	    moji_YaAdd[i] += 1.0f;
	} else {
	    moji_YaAdd[i] = 0.0f;
	}
	mask[i] = 0xffffffff;
	if( EntryFlushCnt[i] ) {
	    mask[i] = 0x01;
	    moji_YaAdd[i] = 0.0f;
	}	    
    }

    ligpos_calc( entry_ligXa, entry_ligYa, 127.0f,
		 &ligPosX, &ligPosY, &ligPosZ );

    light_in(
	(int)ligPosX,	/* ライトの方向 X */
	(int)ligPosY,	/* ライトの方向 Y */
	(int)ligPosZ,	/* ライトの方向 Z */
	0xff,		/* ライトの色   R */
	0xff,		/* ライトの色   G */
	0xff,		/* ライトの色   B */
	0x41,		/* 環境光の色   R */
	0x46,		/* 環境光の色   G */
	0x30 );		/* 環境光の色   B */
#if 0
    light_in(
	(int)ligPosX,	/* ライトの方向 X */
	(int)ligPosY,	/* ライトの方向 Y */
	(int)ligPosZ,	/* ライトの方向 Z */
	0x1c,		/* ライトの色   R */
	0x3a,		/* ライトの色   G */
	0x69,		/* ライトの色   B */
	0x41,		/* 環境光の色   R */
	0x46,		/* 環境光の色   G */
	0x30 );		/* 環境光の色   B */
#endif

    push_now();
    set_lookat_now( 0.0f, 0.0f, 0.0f,
		    0.0f, 0.0f, -100.0f,
		    0.0f, 1.0f, 0.0f, MULT_MTX );
    set_matrix(&NOW_DISP);
    for( i=0; i<3; i++ ) {
	if( frcnt & mask[i] ) {
	    poly_moji_putc( (int)entry_area[i][0],
			    mojiXp[i], 18.0f, -455.0f, 1.0f,
			    moji_Xa[i]+moji_XaAdd[i],
			    moji_Ya[i]+moji_YaAdd[i],
			    moji_Za[i]+moji_ZaAdd[i] );
	}
    }
    pull_now();

#if 0
    if( Key[3].button & CONT_LEFT ) {
	entry_ligYa -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	entry_ligYa += 1.0f;
    }
    if( Key[3].button & CONT_UP ) {
	entry_ligXa += 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	entry_ligXa -= 1.0f;
    }

    PRINTF( "xa:%f ya:%f\n",entry_ligXa, entry_ligYa );
#endif

#if 0
{
    static int pp=0;
    
    if( Key_T[3].button & CONT_R ) {
	pp += 1;
	if( pp > 5 ) pp=0;
    }
    if( Key_T[3].button & CONT_L ) {
	pp -= 1;
	if( pp < 0 ) pp=5;
    }
    if( Key[3].button & CONT_UP ) {
	ny[pp] -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	ny[pp] += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	nx[pp] -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	nx[pp] += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",pp,nx[pp],ny[pp] );
}
#endif
}

/************************************************************************/
/* ランキングデータのセーブ						*/
/************************************************************************/
static void RankingDataSave( void )
{
    register int i,j;
    int HitWork;
    int work,num;
    int pp;
    unsigned char rank_name_wk[11][3];
    unsigned char rank_rootptr_wk[11];
    unsigned char rank_zanki_wk[11];
    unsigned char rank_time_wk[11];
    satage_t rank_stage_wk[11][7];

    /** 今,登録された名前を１１番目に仮に登録しておく **/
    rank_name_wk[10][0] = entry_area[0][0];
    rank_name_wk[10][1] = entry_area[1][0];
    rank_name_wk[10][2] = entry_area[2][0];
    rank_rootptr_wk[10] = StagePtr+1;
    rank_zanki_wk[10] = Player_zanki[0];
    rank_time_wk[10] = 0;
    for( i=0; i<7; i++ ) {
	rank_time_wk[10] |= (ClearKunsyou[i]<<i);
    }
    for( j=0; j<7; j++ ) {
	/** 各ステージのヒット数 **/
	rank_stage_wk[10][j].hitcnt_h = 0;
	HitWork = ClearHitCount[j];
	if( HitWork > 255 ) {
	    HitWork = HitWork - 256;
	    rank_stage_wk[10][j].hitcnt_h = 1;
	}
	rank_stage_wk[10][j].hitcnt = HitWork;

	/** 各ステージのステージ名番号 **/

	num = ClearStageNum[j];
	if( ClearStageNum[j] == 13 ) num = 14;
	if( ClearStageNum[j] == 14 ) num = 13;
	rank_stage_wk[10][j].stage_no = num;

	/** 各ステージの仲間の状況 **/
	rank_stage_wk[10][j].live_peppy =
	    ((NakamaDied[j]&0x00ff0000)>>16) & 0x01;
	rank_stage_wk[10][j].live_slippy =
	    ((NakamaDied[j]&0x0000ff00)>>8) & 0x01;
	rank_stage_wk[10][j].live_falco =
	    (NakamaDied[j]&0x000000ff) & 0x01;
    }

    /** 一旦すべてワークへ待避 **/
    for( i=0; i<10; i++ ) {
	rank_name_wk[i][0] = fox_save.rom[0].data.rank_name[i][0];
	rank_name_wk[i][1] = fox_save.rom[0].data.rank_name[i][1];
	rank_name_wk[i][2] = fox_save.rom[0].data.rank_name[i][2];
	rank_rootptr_wk[i] = fox_save.rom[0].data.rank_rootptr[i];
	rank_zanki_wk[i] = fox_save.rom[0].data.rank_zanki[i];
	rank_time_wk[i] = fox_save.rom[0].data.rank_time[i];
	for( j=0; j<7; j++ ) {
	    rank_stage_wk[i][j].hitcnt =
		fox_save.rom[0].data.rank_stage[i][j].hitcnt;
	    rank_stage_wk[i][j].stage_no =
		fox_save.rom[0].data.rank_stage[i][j].stage_no;
	    rank_stage_wk[i][j].hitcnt_h =
		fox_save.rom[0].data.rank_stage[i][j].hitcnt_h;
	    rank_stage_wk[i][j].live_peppy =
		fox_save.rom[0].data.rank_stage[i][j].live_peppy;
	    rank_stage_wk[i][j].live_falco =
		fox_save.rom[0].data.rank_stage[i][j].live_falco;
	    rank_stage_wk[i][j].live_slippy =
		fox_save.rom[0].data.rank_stage[i][j].live_slippy;
	}
    }

    /** データの再構成 **/
    for( pp=0,i=0; i<10; i++ ) {
	if( i == ranking_pos ) {
	    work = pp;
	    pp = 10;
	}

	fox_save.rom[0].data.rank_name[i][0] = rank_name_wk[pp][0];
	fox_save.rom[0].data.rank_name[i][1] = rank_name_wk[pp][1];
	fox_save.rom[0].data.rank_name[i][2] = rank_name_wk[pp][2];
	fox_save.rom[0].data.rank_rootptr[i] = rank_rootptr_wk[pp];
	fox_save.rom[0].data.rank_zanki[i] = rank_zanki_wk[pp];
	fox_save.rom[0].data.rank_time[i] = rank_time_wk[pp];
	for( j=0; j<7; j++ ) {
	    fox_save.rom[0].data.rank_stage[i][j].hitcnt =
		rank_stage_wk[pp][j].hitcnt;
	    fox_save.rom[0].data.rank_stage[i][j].stage_no =
		rank_stage_wk[pp][j].stage_no;
	    fox_save.rom[0].data.rank_stage[i][j].hitcnt_h =
		rank_stage_wk[pp][j].hitcnt_h;
	    fox_save.rom[0].data.rank_stage[i][j].live_peppy =
		rank_stage_wk[pp][j].live_peppy;
	    fox_save.rom[0].data.rank_stage[i][j].live_falco =
		rank_stage_wk[pp][j].live_falco;
	    fox_save.rom[0].data.rank_stage[i][j].live_slippy =
		rank_stage_wk[pp][j].live_slippy;
	}

	/** 復帰 **/
	if( i == ranking_pos ) pp = work;
	else		       pp++;
    }

    /** 次回のネームエントリーのときかのデフォルトはこの名前 **/
    fox_save.rom[0].data.last_rname = ranking_pos;
    
    /** そして・・・ バックアップへセーブ **/
    data_save();
}

/************************************************************************/
/* 文字の表示								*/
/************************************************************************/
static void poly_moji_putc(
    int		c,
    float	x,
    float	y,
    float	z,
    float	scl,
    float	xa,
    float	ya,
    float	za
)
{
    static Gfx *ptxt[] = {
	MOJI_pol_A, MOJI_pol_B, MOJI_pol_C, MOJI_pol_D, MOJI_pol_E,
	MOJI_pol_F, MOJI_pol_G, MOJI_pol_H, MOJI_pol_I, MOJI_pol_J,
	MOJI_pol_K, MOJI_pol_L, MOJI_pol_M, MOJI_pol_N, MOJI_pol_O,
	MOJI_pol_P, MOJI_pol_Q, MOJI_pol_R, MOJI_pol_S, MOJI_pol_T,
	MOJI_pol_U, MOJI_pol_V, MOJI_pol_W, MOJI_pol_X, MOJI_pol_Y,
	MOJI_pol_Z,
	MOJI_pol_0, MOJI_pol_1, MOJI_pol_2, MOJI_pol_3, MOJI_pol_4,
	MOJI_pol_5, MOJI_pol_6, MOJI_pol_7, MOJI_pol_8, MOJI_pol_9,
	MOJI_pol_DOT,
    };
    
    register int i;
    int p;

    p = -1;
    i = 0;
    while( pch[i] != NULL ) {
	if( c == pch[i] ) {
	    p = i;
	    break;
	}
	i++;
    }
    if( p == -1 ) return;

    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
    gSPTexture(NEXT_DISP, 2500, 200, 0, G_TX_RENDERTILE, G_ON);
    gSPSetGeometryMode(NEXT_DISP, G_TEXTURE_GEN);
//    gSPSetGeometryMode(NEXT_DISP, G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR);

    push_now();
    translate_now( x, y, z, MULT_MTX );
    rotateZ_now( ANGLE(za), MULT_MTX );
    rotateX_now( ANGLE(xa), MULT_MTX );
    rotateY_now( ANGLE(ya), MULT_MTX );
    scale_now( scl, scl, scl, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, ptxt[p] );
    pull_now();
}

/************************************************************************/
/* ネームエントリー 文字のインデックスナンバーの取得			*/
/************************************************************************/
static int get_moji_pos( int n )
{
    register int i;

    i = 0;
    while( pch[i] != NULL ) {
	if( pch[i] == n ) break;
	i++;
    }

    /** もしも,バックアップデータが壊れていた場合の保険 **/
    if( pch[i] == NULL ) i = 0;
    
    return( i );
}


/*----------------------------------------------------------------------*/
/*									*/
/* エンディングデモ終了後のランキング画面に関する関数			*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* エンディングデモ終了後のランキング					*/
/************************************************************************/
static void end_score( void )
{
    switch( process_phase ) {
    case 0:
	score_init();	/** メニューと共通で使える **/

	EsRankYp = ranking_pos;
	if( ranking_pos < 0 || ranking_pos > 9 ) EsRankYp = 0;
	score_yp = 114.0f - (float)EsRankYp*130.0f;
	score_yp2 = -6.0f + (float)EsRankYp*130.0f;
	mainM[3].text.posX = mmtxtXp[3];
	mainM[3].text.posY = 23.0f;
	mainM[3].text.sclX = 1.0f;
	mainM[3].text.sclY = 1.0f;
	mainM[3].Tdraw_sw = ON;
	mainM[3].win.posY = 90.0f;
	mainM[3].win.sclX = 0.4f;
	mainM[3].win.sclY = 0.21f;
	mainM[3].Wdraw_sw = ON;
	process_phase++;
	break;
    case 1:
	end_score_ctrl();
	break;
    }

}

/************************************************************************/
/* エンディングデモ終了後のランキング					*/
/************************************************************************/
static void end_score_ctrl( void )
{
    noeasy_ranking_ctrl();

    if( Key_T[cont_num].button & ANY_KEY ) {
	Na_StartSystemSe( NA_SE_DECIDE );
	display_mode = DISPLAY_NOTH;
	process_phase = 0;
	if( before_mode == OVER ) {
	    Back_star_f = 0;
	    system_mode = SYSTEM_INIT;
//	    system_time = 2;
//	    title_mode = TITLE_WAIT;
	    display_mode = DISPLAY_NOTH;
	    Player_zanki[0] = 2;
	    total_score = 0;
	} else if( before_mode == ENDING ) {
	    Na_StopBgm( 1 );
	    menu_phase = END_SEIKYU;
	}
    }
}

/************************************************************************/
/* エンディングデモ終了後のランキングの描画				*/
/************************************************************************/
static void end_score_display( void )
{
    ranking_display();

    push_now2();
    window_display( mainM[3].win );
    pull_now();
    txt_display( mainM[3].text );
}


/*----------------------------------------------------------------------*/
/*									*/
/* エンディング,ネームエントリー,スコア表示後,最後の最後に表示する	*/
/* 請求書画面に関する関数						*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* 請求書画面からボタンを押すとタイトルへ行く				*/
/************************************************************************/
static void seikyusyo( void )
{
    switch( process_phase ) {
    case 0:
#if 0
	/** TEST **/
	total_score = 3577;
#endif
	Back_star_f = 0;
	BG_color = 0x00; /** 背景色 **/
	fade_R = 0x00;
	fade_G = 0x00;
	fade_B = 0x00;
	fade_A = 0x00;
	hanko_sw = OFF;
	wait_time = 30;
	process_phase++;
	break;
    case 1:
	if( wait_time ) break;
	if( total_score*64 > 49999 && total_score*64 < 70000 ) {
	    Na_StartSystemSe( NA_SE_VO_PEPPER_CONSENT );
	}
	if( total_score*64 >= 70000 ) {
	    Na_StartSystemSe( NA_SE_VO_PEPPER_SURPRISE );
	}
	wait_time = 20;
	process_phase++;
	break;
    case 2:
	if( wait_time ) break;
	if( Key_T[cont_num].button & ANY_KEY ) {
	    Na_StartSystemSe( NA_SE_STARFOX_SEAL );
	    hanko_sw = ON;
	    wait_time = 60;
	    process_phase++;
	}
	break;
    case 3:
	if( wait_time ) break;
	Back_star_f = 0;
	system_mode = SYSTEM_INIT;
//	system_mode = TITLE;
//	system_time = 2;
//	title_mode = TITLE_WAIT;
	display_mode = DISPLAY_NOTH;
	Player_zanki[0] = 2;
	total_score = 0;
	break;
    }
}

/************************************************************************/
/* 請求書画面の描画							*/
/************************************************************************/
static void seikyusyo_display( void )
{
    register int i;
    int money;
    
    static float xx[8] =
    {96.0f, 31.0f, 32.0f, 80.0f, 86.0f, 213.0f, 275.0f, 276.0f};
    static float yy[8] =
    {24.0f, 57.0f, 92.0f, 162.0f, 163.0f, 171.0f, 103.0f, 131.0f};

    fade(&NOW_DISP, 20+5, 15+3,
	 SCREEN_WD - (20+5), SCREEN_HT - (15+3),
	 255, 255, 255, 255);
    
    rcpsetmode( &NOW_DISP, RECT_RGBA_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );

    /** 請求書 **/
#if LOCALE==CHINA
    texture_rectangleCI4( &NOW_DISP,
			  TXT_Z_88_txt,
			  TXT_Z_88_txttlut,
			  128, 16, xx[0], yy[0], 1.0f, 1.0f );
    texture_rectangleCI4( &NOW_DISP,
			  TXT_Z_88_txt+(128*16)/2,
			  TXT_Z_88_txttlut,
			  128, 10, xx[0], yy[0]+16.0f, 1.0f, 1.0f );
#else
    texture_rectangleCI4( &NOW_DISP,
			  TXT_E_88_txt,
			  TXT_E_88_txttlut,
			  128, 16, xx[0], yy[0], 1.0f, 1.0f );
    texture_rectangleCI4( &NOW_DISP,
			  TXT_E_88_txt+(128*16)/2,
			  TXT_E_88_txttlut,
			  128, 10, xx[0], yy[0]+16.0f, 1.0f, 1.0f );
#endif

    /** 宛名 **/
#if LOCALE==CHINA
    for( i=0; i<2; i++ ) {
	texture_rectangleCI4( &NOW_DISP,
			      TXT_Z_89_90_txt+(256*16*i)/2,
			      TXT_Z_89_90_txttlut,
			      256, 16, xx[1], yy[1]+(16*i), 1.0f, 1.0f );
    }
    texture_rectangleCI4( &NOW_DISP,
			  TXT_Z_89_90_txt+(256*32)/2,
			  TXT_Z_89_90_txttlut,
			  256, 2, xx[1], yy[1]+32.0f, 1.0f, 1.0f );
#else
    for( i=0; i<2; i++ ) {
	texture_rectangleCI4( &NOW_DISP,
			      TXT_E_89_90_txt+(256*16*i)/2,
			      TXT_E_89_90_txttlut,
			      256, 16, xx[1], yy[1]+(16*i), 1.0f, 1.0f );
    }
    texture_rectangleCI4( &NOW_DISP,
			  TXT_E_89_90_txt+(256*32)/2,
			  TXT_E_89_90_txttlut,
			  256, 2, xx[1], yy[1]+32.0f, 1.0f, 1.0f );
#endif

    /** 請求金額欄 **/
#if LOCALE==CHINA
    for( i=0; i<4; i++ ) {
	texture_rectangleCI4( &NOW_DISP,
			      TXT_Z_91_92_txt+(256*16*i)/2,
			      TXT_Z_91_92_txttlut,
			      256, 16, xx[2], yy[2]+(16*i), 1.0f, 1.0f );
    }
    texture_rectangleCI4( &NOW_DISP,
			  TXT_Z_91_92_txt+(256*64)/2,
			  TXT_Z_91_92_txttlut,
			  256, 2, xx[2], yy[2]+64.0f, 1.0f, 1.0f );
#else
    for( i=0; i<4; i++ ) {
	texture_rectangleCI4( &NOW_DISP,
			      TXT_E_91_92_txt+(256*16*i)/2,
			      TXT_E_91_92_txttlut,
			      256, 16, xx[2], yy[2]+(16*i), 1.0f, 1.0f );
    }
    texture_rectangleCI4( &NOW_DISP,
			  TXT_E_91_92_txt+(256*64)/2,
			  TXT_E_91_92_txttlut,
			  256, 2, xx[2], yy[2]+64.0f, 1.0f, 1.0f );
#endif

    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );

    /** 差し出し人 **/
#if LOCALE==CHINA
    for( i=0; i<30; i++ ) {
	texture_rectangleRGBA16( &NOW_DISP,
			      TXT_Z_93_94_95_txt+(188*2*i),
			      188, 2, xx[3], yy[3]+(2.0f*i), 1.0f, 1.0f );
    }
#else
    for( i=0; i<30; i++ ) {
	texture_rectangleRGBA16( &NOW_DISP,
			      TXT_E_93_94_95_txt+(188*2*i),
			      188, 2, xx[3], yy[3]+(2.0f*i), 1.0f, 1.0f );
    }
#endif

    gDPSetPrimColor( NEXT_DISP, 0, 0, 0, 0, 0, 255 );
    
    /** トータルヒット数 **/
    large_moji_number( xx[6]-((keta_ck(total_score)-1)*13),
		       yy[6], total_score );

    /** 請求金額 (１機につき６４ｓｐ＄) **/
    money = total_score * 64;
    large_moji_number( xx[7]-((keta_ck(money)-1)*13), yy[7], money );

    if( hanko_sw ) {
	/** ハンコ **/
	gDPSetPrimColor( NEXT_DISP, 0, 0, 120, 0, 0, 0xc0 );
	for( i=0; i<3; i++ ) {
	    texture_rectangleIA8( &NOW_DISP,
				  TXT_hanko_txt+(80*16*i),
				  80, 16, xx[5], yy[5]+(16.0f*i), 1.0f, 1.0f );
	}
    }

#if 1
{
    static int pp=0;
    
    if( Key_T[3].button & CONT_R ) {
	pp += 1;
	if( pp > 7 ) pp=0;
    }
    if( Key_T[3].button & CONT_L ) {
	pp -= 1;
	if( pp < 0 ) pp=7;
    }
    if( Key[3].button & CONT_UP ) {
	yy[pp] -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	yy[pp] += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	xx[pp] -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	xx[pp] += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",pp,xx[pp],yy[pp] );
}
#endif
}













#if 0
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
typedef struct {
    u16   Boost;
    u16   Brake;
    u16   Shot;
    u16   Bom;
} GAME_BUTTON;

typedef struct {
    int Bunki;
    int Reverse;
    int Time;
    int Ptr;
    float Scl;
    float NowXp;
    float NowYp;
    float NextXp;
    float NextYp;
    float Max;
    float Max2;
    float Min;
    float Stp;
} PIKA;

extern void player( PL * );
extern void player_backfire_display( PL * ); /* 自機 噴射 表示 */
extern void player_kumo_display( PL * ); /* 自機 羽クモ 表示 */
extern void A_Display( A_WING_STAT * );
extern Bomb_Count[];  /*ボム数*/
extern xyz_t Target_pos[4];
#if 0
static float PikaZa;
static PIKA Pika[4];
static PIKA Pika2[4];
static PIKA Pika3[4];
static PIKA Pika4[4];
static int PikaWaitTm[4];
#endif

/***************** コントローラー *****************/
/* ビームターゲット表示ON OFF (４人分) */
extern int Target_flag[];

/* コントローラのキータイプナンバー格納 */
int ContTypeNum[4];	/* 1 - 4 */
/* コントローラの３Ｄスティックの上下動選択用 */
/* 何番のコントローラに対してか情報 */
static int ControllerNum;	/* 1 - 4 */

#if 0
/* 0:リバース 1:ノーマル */
static int StickDownType;
/* アーウィンおためし処理で使うワーク */
static int WkStick_Revise;
static int WkButton_Boost;
static int WkButton_Brake;
static int WkButton_Shot;
static int WkButton_Bom;
static int TargetSelMode;
static int ContTagetFlush[2];
static float StickDownData[]={ 1.0f, -1.0f };

static TXTR_T ContStick[2][4] = {
    {
	/* リバース */
        { CI4,XFLIPEX,
          CF_config_line_txt,CF_config_line_txttlut,
          128,68, 168.0f,20.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
        { CI4,NOFLIP,
          CF_mess33_txt,CF_mess33_txttlut,
          64,9, 249.0f,29.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
	{ CI8,NOFLIP,
  	  CF_3D_txt,CF_3D_txttlut,
          32,30, 210.0f,52.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff },
        { CI8,NOFLIP,
          CF_revers_AW_txt,CF_revers_AW_txttlut,
          40,40, 248.0f,42.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff },
    },
    {
	/* ノーマル */
        { CI4,NOFLIPEX,
          CF_config_line_txt,CF_config_line_txttlut,
          128,68, 23.0f,20.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff },
        { CI4,NOFLIP,
          CF_mess35_txt,CF_mess35_txttlut,
          64,9, 32.0f,29.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff },
        { CI8,NOFLIP,
          CF_3D_txt,CF_3D_txttlut,
          32,30, 77.0f,52.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff },
        { CI8,NOFLIP,
          CF_normal_AW_txt,CF_normal_AW_txttlut,
          40,40, 31.0f,42.0f, 1.0f,1.0f, 0xff,0xff,0xff,0x40 },
    },
};


static TXTR_T ContType[] = {
    /* コントローラータイプ */
    { CI4,NOFLIP,
      CF_mess40_txt,CF_mess40_txttlut,
      80,20, 124.0f,45.0f, 1.0f,1.0f, 0xff,0x00,0x00,0xff },
    { CI4,NOFLIP,
      CF_config_maru_txt,CF_config_maru_txttlut,
      64,35, 138.0f,66.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
    { CI4,NOFLIP,
      CF_C_SANNKAKU02_txt,CF_C_SANNKAKU02_txttlut,
      32,10,124.0f,77.0f,1.0f,1.0f,0xff,0x00,0x00,0xff }, 
    { CI4,XFLIP,
      CF_C_SANNKAKU02_txt,CF_C_SANNKAKU02_txttlut,
      32,10,161.0f,77.0f,1.0f,1.0f,0xff,0x00,0x00,0xff }, 
    { CI4,NOFLIP,
      CF_1_txt,CF_1_txttlut,
      0,0,0.0f,0.0f,1.0f,1.0f,0xff,0xff,0xff,0xff }, 
};

static TXT3_T ContNumTxt[] = {
    { CF_1_txt, CF_1_txttlut, 16, 10, 154.0f, 78.0f },
    { CF_2_txt, CF_2_txttlut, 32, 10, 150.0f, 78.0f },
    { CF_3_txt, CF_3_txttlut, 32, 10, 150.0f, 78.0f },
};

static TXTR_T AwTest[] = {
    { CI4,NOFLIP,
      CF_back_txt,CF_back_txttlut,
      16,16, 27.0f,101.0f, 5.11f,6.3f, 0xff,0xff,0xff,0xff },
    { IA16,NOFLIPEX,
      CF_config_A_win_txt,NULL,
      96,114, 20.0f,95.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff },
    { IA8,NOFLIP,
      CF_mess28b_txt,NULL,
      64,10, 50.0f,146.0f, 1.0f,1.0f, 0xff,0x00,0x00,0xff },
    { IA8,NOFLIP,
      CF_mess42_txt,NULL,
      80,35, 28.0f,166.0f, 1.0f,1.0f, 0xff,0x00,0x00,0xff },
};

static TXTR_T ContTaget[3] = {
    /* ターゲット */
    { CI4,NOFLIP,
      CF_mess59_txt,CF_mess59_txttlut,
      64,11, 137.0f,189.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff },
    /* OFF */
    { CI4,NOFLIP,
      CF_mess57_txt,CF_mess57_txttlut,
      48,10, 251.0f,190.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff },
    /* ON */
    { CI4,NOFLIP,
      CF_mess56_txt,CF_mess56_txttlut,
      32,10, 209.0f,190.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff },
};
static float TargetXPos[2] = { 251.0f, 209.0f };

/* EXIT */
static TXTR_T ContExit = 
    { IA8,NOFLIP,
      CF_mess31_txt,NULL,
      64,10, 137.0f,207.0f, 1.0f,1.0f, 0x00,0x00,0xff,0xff };



static TXTR_T Mcont12[8] = {
    /* Ｒ */
    { CI4,NOFLIP,
      CF_R_txt,CF_R_txttlut,
      32,10, 220.0f,95.0f, 1.0f,1.0f, 0x80,0x80,0x80,0xff }, 
    /* Ｚ */
    { CI4,NOFLIP,
      CF_Z_txt,CF_Z_txttlut,
      32,10, 206.0f,95.0f, 1.0f,1.0f, 0x80,0x80,0x80,0xff }, 
    /* Ｃ */
    { CI4,NOFLIP,
      CF_C_txt,CF_C_txttlut,
      32,10, 208.0f,113.0f, 1.0f,1.0f, 0xff,0xff,0x00,0xff }, 
    /*  */
    { CI4,NOFLIP,
      CF_C_SANNKAKU02_txt,CF_C_SANNKAKU02_txttlut,
      32,10,221.0f,113.0f,1.0f,1.0f,0xff,0xff,0x00,0xff }, 
    /* Ｃ */
    { CI4,NOFLIP,
      CF_C_txt,CF_C_txttlut,
      32,10, 208.0f,131.0f, 1.0f,1.0f, 0xff,0xff,0x00,0xff }, 
    /*  */
    { CI4,YFLIP,
      CF_C_SANNKAKU_txt,CF_C_SANNKAKU_txttlut,
      32,10, 222.0f,132.0f,1.0f,1.0f,0xff,0xff,0x00,0xff }, 
    /* Ｂ */
    { CI4,NOFLIP,
      CF_B_txt,CF_B_txttlut,
      32,10, 208.0f,149.0f, 1.0f,1.0f, 0x00,0xff,0x00,0xff }, 
    /* Ａ */
    { CI4,NOFLIP,
      CF_A_txt,CF_A_txttlut,
      32,10, 208.0f,167.0f, 1.0f,1.0f, 0x00,0x00,0xff,0xff }, 
};

static TXTR_T ContBtnType[5] = {
    /* ローリング */
    { CI4,NOFLIP,
      CF_mess38_txt,CF_mess38_txttlut,
      64,10, 240.0f,95.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
    /* ブースト */
    { CI4,NOFLIP,
      CF_mess36_txt,CF_mess36_txttlut,
      64,10, 247.0f,113.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
    /* ブレーキ */
    { CI4,NOFLIP,
      CF_mess37_txt,CF_mess37_txttlut,
      64,10, 248.0f,131.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
    /* ボム */
    { CI4,NOFLIP,
      CF_mess34_txt,CF_mess34_txttlut,
      32,10, 255.0f,149.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff }, 
    /* ショット */
    { CI4,NOFLIP,
      CF_mess39_txt,CF_mess39_txttlut,
      64,9, 249.0f,167.0f, 1.0f,1.0f, 0xff,0xff,0xff,0xff },
};

static float ContTypeDisp[3][5] = {
    { 95.0f, 113.0f, 131.0f, 149.0f, 167.0f },
    { 95.0f, 113.0f, 131.0f, 167.0f, 149.0f },
    { 95.0f, 149.0f, 131.0f, 113.0f, 167.0f },
};

static GAME_BUTTON game_btn[] = {
   /* ブースト  ブレーキ   ショット   ボム   */
    { CONT_C,   CONT_D,    CONT_A,    CONT_B },
    { CONT_C,   CONT_D,    CONT_B,    CONT_A },
    { CONT_B,   CONT_D,    CONT_A,    CONT_C },
};
#endif

#if 0
static void push2_now2( PL * );
#endif

    if( !VsReturn ) {
	/* 仮 */
	ControllerNum = 0;  /* コントローラ １ */
	for( i=0; i<4; i++ ) ContTypeNum[i] = 1;
    }
#if 0
    PL_NO = 0;
    Pl = (PL *)mem_stage_alloc(sizeof(PL) * 1);
#endif

/************************************************************************/
/* "おためし"用アーウィンの描画						*/
/************************************************************************/
static void TsAwing_display( PL *pl )
{
    xyz_t mae;
    float LigXp,LigYp,LigZp;

    ligpos_calc( LigXa, LigYa, 100.0f, &LigXp, &LigYp, &LigZp );

    light_in( (int)LigXp, (int)LigYp, (int)LigZp,
	      LigR, LigG, LigB,
	      KanR, KanG, KanB );

    texture_z_a_light();

    push_now();

    translate_now(pl->Xpos, pl->Ypos, (pl->ZposS + pl->scrposZ), MULT_MTX);
    rotateY_now(ANGLE(pl->moveYA+pl->CYang+pl->shockY
		      +180.0f), MULT_MTX);
    rotateX_now(-ANGLE( pl->moveXA + pl->CXang + pl->shockY), MULT_MTX);
    rotateZ_now(-ANGLE(pl->CZangD + pl->CZangad + pl->shockY), MULT_MTX);
    translate_now(pl->Xposad, pl->Yposad, 0.0f, MULT_MTX);

    set_matrix(&NOW_DISP);

    mae.x =  0.0f;
    mae.y =  0.0f;
    mae.z =  300.0f;
    MtxF_Position_now(&mae, &Target_pos[0]);
    mae.z =  600.0f;
    MtxF_Position_now(&mae, &Target_pos[1]);

    A_Display(&pl->wing);

    pull_now();

    beamdisplay(); /* 光線表示 */
    player_backfire_display( pl ); /* 自機 噴射 表示 */
    player_kumo_display( pl ); /* 自機 羽クモ 表示 */
}

/************************************************************************/
/* ビームターゲットの描画						*/
/************************************************************************/
static void PlayerTarget_display( void )
{
    int i;
    xyz_t *Tg;
    
    texture_a();
    
    for(i=0;i<2;i++) {
	Tg = &Target_pos[i];
	push_now();
	translate_now(Tg->x,
		      Tg->y,
		      Tg->z,
		      MULT_MTX);
	
	scale_now(2.0f, 2.0f, 2.0f, MULT_MTX);
	set_matrix(&NOW_DISP);
	gSPDisplayList(NEXT_DISP, JT_Target);
	pull_now();
    }
}

/************************************************************************/
/* コントローラーの描画 (RBGA16,112x84)					*/
/************************************************************************/
static void ContRoller_display( void )
{
    register int i;

    rectangle_a_prim();
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );

    for( i=0; i<28; i++ ) {
	texture_rectangleRGBA16( &NOW_DISP, CF_con_txt+(112*i*3),
				 112, 3,
				 104.0f, 100.0f+(i*3*1.0f),
				 1.0f, 1.0f );
    }
}
/************************************************************************/
/* 									*/
/************************************************************************/
static void push2_now2( PL *pl )
{
    if( Target_flag[ControllerNum] ) {
	PlayerTarget_display();
    }
    
    push_now();

    set_lookat_now( pl->eyeX, pl->eyeY, pl->eyeZ,
		    pl->wayX, pl->wayY, pl->wayZ,
		   0.0f, 1.0f, 0.0f, MULT_MTX);
}

/************************************************************************/
/* ＶＳ用コントローラ							*/
/************************************************************************/
static void VsController( void )
{
    int res,work;

    if( KeyWaitTime > 0 ) KeyWaitTime--;

    if ( SelectLock == OFF && !KeyWaitTime ) {
	work = cur_pos;
	res = KeyIn_Move_Cur( &cur_pos, 4, STICK_Y, NUM_LOOP,
			      20, 5, &Controler );
	if( res ) {
	    if( work == 0 ) cur_posX = StickDownType;
	    if( work == 1 ) CurContType = ContTypeNum[ControllerNum]-1;
	    ContFlushMask[work] = OFF;
	    ContFlushMask[cur_pos] = ON;
	}
	process_phase = (cur_pos+1)*10;

	if( PressBT_sw ) {
	    ContPtr--;
	    for( ; ContPtr >= 0; ContPtr-- ) {
		if( PlayerMode[ContTbl[ContPtr]] == 0 ) break;
	    }
	    if( ContPtr < 0 ) {
		SelectLock = ON;
		frame_A = 0x80;
		ContPtr = 0;
		Back_star_f = OFF;
		NextMenuNum = 0;
		menu_phase = VS_GAME;
	    } else {
		ControllerNum = ContTbl[ContPtr];
		controler_init();
		ContFlushMask[cur_pos] = OFF;
		cur_pos = 4;
		ContFlushMask[cur_pos] = ON;
	    }
	}
    }

    switch( process_phase ) {
    case 0:
	break;

    case 10:
	StickTypeSelect();
	break;

    case 20: /* コントローラータイプ選択 */
	ContTypeSelect();
	break;

    case 30: /* アーウィンおためし */
	ActionAwing();
	break;

    case 40: /* 照準表示選択 */
	TagetSelect();
	break;

    case 50: /* EXIT */
	if( PressAT_sw ) {
	    ContPtr++;
	    for( ; ContPtr < ContCnt; ContPtr++ ) {
		if( PlayerMode[ContTbl[ContPtr]] == 0 ) break;
	    }
	    if( ContPtr == ContCnt ) {
		SelectLock = ON;
		frame_A = 0x80;
		ContPtr = 0;
		Back_star_f = OFF;
		NextMenuNum = 1;
		menu_phase = VS_GAME;
	    } else {
		ControllerNum = ContTbl[ContPtr];
		controler_init();
		ContFlushMask[cur_pos] = OFF;
		cur_pos = 4;
		ContFlushMask[cur_pos] = ON;
	    }
	    Na_StopPlayerEngine(0);
	}
	break;
    }

    Bomb_Count[0] = 1;
}
#endif
#if 0
/************************************************************************/
/* コントローラ init							*/
/************************************************************************/
static void controler_init( void )
{
    register int i;

    Back_star_f = 800;

    LigXa = 0.0f;
    LigYa = 131.0f;
    LigR = 90;
    LigG = 75;
    LigB = 90;
    KanR = 45;
    KanG = 34;
    KanB = 56;

    if( Stick_Revise[ControllerNum] == 1.0f )
	StickDownType = 0;
    else
	StickDownType = 1;

    cur_pos = 0;
    cur_posX = StickDownType;
    CurContType = ContTypeNum[ControllerNum]-1;
    stick_wait_time2 = 0;

    AwTestIn = OFF;
    TargetSelMode = OFF;

    for( i=0; i<5; i++ ) {
	ContFlushMask[i] = OFF;
    }
    ContFlushMask[cur_pos] = ON;

    ContTagetFlush[Target_flag[ControllerNum]] = ON;
    ContTagetFlush[!(Target_flag[ControllerNum])] = OFF;

//    TsAwingInit();

    Controler.AdWaitTime = 0;
    Controler.WaitTime = 0;

    Controler2.AdWaitTime = 0;
    Controler2.WaitTime = 0;

    SelColor = 255.0f;
    ChgColor = 255.0f;
}

/************************************************************************/
/* おためしアーウィン Init						*/
/************************************************************************/
static void TsAwingInit( void )
{
    PL *pl;

    player_ram_clear();
    object_clear();

    Pl[PL_NO].mode = PINIT;
    pl= &Pl[PL_NO];
    STAGE = GROUND;
    player(pl);
    STAGE = GROUND;

    GYPOSF = -210.0f;
    Pl[PL_NO].posmaxdY = GYPOSF+10.0f;

    scroll_mode = 0;

#if 1
    Pl[PL_NO].eyeX = 0.0f;
    Pl[PL_NO].eyeY = 0.0f;
    Pl[PL_NO].eyeZ = 720.0f;

    Pl[PL_NO].wayX = 226.0f;
    Pl[PL_NO].wayY = 43.0f;
    Pl[PL_NO].wayZ = 0.0f;
#else
    Pl[PL_NO].eyeX = 0.0f;
    Pl[PL_NO].eyeY = 0.0f;
    Pl[PL_NO].eyeZ = 720.0f;

    Pl[PL_NO].wayX = 0.0f;
    Pl[PL_NO].wayY = 0.0f;
    Pl[PL_NO].wayZ = 0.0f;
#endif
}

/************************************************************************/
/* コントローラ								*/
/************************************************************************/
static void controler( void )
{
    int res,work;

    if( KeyWaitTime > 0 ) KeyWaitTime--;

    if ( SelectLock == OFF && !KeyWaitTime ) {
	work = cur_pos;
	res = KeyIn_Move_Cur( &cur_pos, 4, STICK_Y, NUM_LOOP,
			      20, 5, &Controler );
	if( res ) {
	    if( work == 0 ) cur_posX = StickDownType;
	    if( work == 1 ) CurContType = ContTypeNum[ControllerNum]-1;
	    ContFlushMask[work] = OFF;
	    ContFlushMask[cur_pos] = ON;
	}
	process_phase = (cur_pos+1)*10;

	if( PressBT_sw ) {
	    process_phase = 100;
	}
    }

    switch( process_phase ) {
    case 0:
	break;

    case 10:
	StickTypeSelect();
	break;

    case 20: /* コントローラータイプ選択 */
	ContTypeSelect();
	break;

    case 30: /* アーウィンおためし */
	ActionAwing();
	break;

    case 40: /* 照準表示選択 */
	TagetSelect();
	break;

    case 50: /* EXIT */
	if( PressAT_sw ) {
	    SelectLock = ON;
	    process_phase = 100;
	}
	break;

    case 100: /* EXIT */
	Na_StopPlayerEngine(0);
	SelectLock = ON;
	process_phase = 0;
	menu_phase = MAIN_MENU;
	break;
    }
/*
    Player_bomb_power_1[PL_NO] = 
    Player_bomb_power_1_D[PL_NO] = 100.0f;*/
    Bomb_Count[0] = 1;
}

/************************************************************************/
/* ３Ｄスティックの上下選択処理						*/
/************************************************************************/
static void StickTypeSelect( void )
{
#if 0
    register int i;
#endif

    KeyIn_Select2( &cur_posX );
    if( PressAT_sw ) {
	StickDownType = cur_posX;
	Stick_Revise[ControllerNum] = StickDownData[StickDownType];

#if 0
	for( i=0; i<4; i++ ) {
	    Stick_Revise[i] = StickDownData[StickDownType];
	}
#endif

	ContFlushMask[cur_pos] = OFF;
	cur_pos = 1;
	ContFlushMask[cur_pos] = ON;
    }
}

/************************************************************************/
/* コントローラータイプ選択						*/
/************************************************************************/
static void ContTypeSelect( void )
{
#if 0
    register int i;
#endif

    KeyIn_Move_Cur( &CurContType, 2, STICK_X, NUM_NOLOOP, 20, 2, &Controler2 );

    if( PressAT_sw ) {
	ContTypeNum[ControllerNum] = CurContType+1;
	Button_Boost[ControllerNum] = game_btn[CurContType].Boost;
	Button_Brake[ControllerNum] = game_btn[CurContType].Brake;
	Button_Shot[ControllerNum] = game_btn[CurContType].Shot;
	Button_Bom[ControllerNum]  = game_btn[CurContType].Bom;
#if 0
	for( i=0; i<4; i++ ) {
	    Button_Boost[i] = game_btn[CurContType].Boost;
	    Button_Brake[i] = game_btn[CurContType].Brake;
	    Button_Shot[i] = game_btn[CurContType].Shot;
	    Button_Bom[i]  = game_btn[CurContType].Bom;
	}
#endif
	ContFlushMask[cur_pos] = OFF;
	cur_pos = 2;
	ContFlushMask[cur_pos] = ON;
    }
}

/************************************************************************/
/* アーウィンおためし処理						*/
/************************************************************************/
static void ActionAwing( void )
{
    PL *pl;
//    float x;

    switch( section_phase ) {
    case 0:
	if( PressAT_sw ) {
	    TsAwingInit();
	    ContFlushMask[2] = OFF;
	    AwTestIn = ON;
	    SelectLock = ON;
	    section_phase++;
	    /* ＶＳで１コンで２、３、４コンのキーコンフィグ */
	    /* でアーウィンを動かすための処理               */
	    if( ControllerNum != 0 ) {
		WkStick_Revise = Stick_Revise[0];
		WkButton_Boost = Button_Boost[0];
		WkButton_Brake = Button_Brake[0];
		WkButton_Shot = Button_Shot[0];
		WkButton_Bom = Button_Bom[0];
		Stick_Revise[0] = Stick_Revise[ControllerNum];
		Button_Boost[0] = Button_Boost[ControllerNum];
		Button_Brake[0] = Button_Brake[ControllerNum];
		Button_Shot[0] = Button_Shot[ControllerNum];
		Button_Bom[0] = Button_Bom[ControllerNum];
	    }
	}
	break;
    case 1:
	pl= &Pl[PL_NO];
	player(pl);
	beam();
#if 0
        /*視点角度セット*/    
	pl->eye_Y_ang = -fatan3((pl->eyeX-pl->wayX),(pl->eyeZ-pl->wayZ));
	x = sqrtf((pl->eyeZ-pl->wayZ)*(pl->eyeZ-pl->wayZ)
		  +(pl->eyeX-pl->wayX)* (pl->eyeX-pl->wayX));
	pl->eye_X_ang = -fatan3((pl->eyeY-pl->wayY), x);
#endif
	if( Key_T[cont_num].button & CONT_START ) {
	    Na_StartSystemSe( NA_SE_DECIDE );
	    Na_StopPlayerEngine(0);
	    ContFlushMask[2] = ON;
	    AwTestIn = OFF;
	    SelectLock = OFF;
	    section_phase = 0;
	    /* 元に戻す */
	    if( ControllerNum != 0 ) {
		Stick_Revise[0] = WkStick_Revise;
		Button_Boost[0] = WkButton_Boost;
		Button_Brake[0] = WkButton_Brake;
		Button_Shot[0] = WkButton_Shot;
		Button_Bom[0] = WkButton_Bom;
	    }
	}
	break;
    }

#if 0
    if ( Key[1].button & CONT_E ) {
	GYPOSF += 1.0f;
    }
    if ( Key[1].button & CONT_D ) {
	GYPOSF -= 1.0f;
    }
	
    PRINTF( "gy=%f\n",GYPOSF );
#endif
}

/************************************************************************/
/* 照準表示選択								*/
/************************************************************************/
static void TagetSelect( void )
{
    switch( section_phase ) {
    case 0:
	if( PressAT_sw ) {
	    TargetSelMode = ON;
	    SelectLock = ON;
	    YesNo_sw = Target_flag[ControllerNum];
	    ContFlushMask[3] = OFF;
	    section_phase++;
	}
	break;
    case 1:
	KeyIn_Select2( &YesNo_sw );
	ContTagetFlush[YesNo_sw] = ON;
	ContTagetFlush[!YesNo_sw] = OFF;
	if( PressAT_sw ) {
	    Target_flag[ControllerNum] = YesNo_sw;
	    section_phase++;
	}
	if( PressBT_sw ) {
	    section_phase++;
	}
	break;
    case 2: /*  */
	TargetSelMode = OFF;
	ContFlushMask[3] = ON;
	SelectLock = OFF;
	section_phase = 0;
	break;
    }
}

/************************************************************************/
/* コントローラ表示							*/
/************************************************************************/
static void controler_display( void )
{
    PL *pl;
    register int i,j;
    int p,ret;

    txt_display( AwTest[0] );

    if( ContFlushMask[2] ) {
	ColorFlush( &ChgColor, 0.3f );
	AwTest[1].r = ChgColor;
	AwTest[1].b = ChgColor;
    } else {
	AwTest[1].r = 0xff;
	AwTest[1].b = 0xff;
    }
    if( cur_pos == 2 ) {
	ColorFlush( &ChgColor, 0.3f );
	if( !AwTestIn ) {
	    AwTest[2].a = ChgColor;
	    txt_display( AwTest[2] );
	} else {
	    AwTest[3].a = ChgColor;
	    txt_display( AwTest[3] );

	    pl = &Pl[PL_NO];

	    push2_now2( pl );
	    TsAwing_display( pl );
	    pull_now();
	}
    }

    push_now2();
    Cont_Mask_Display();  /* マスク */
    pull_now();

//    draw_back_star();

    txt_display( AwTest[1] );


    for( i=0; i<5; i++ ) {
	switch( i ) {
	case 0:
	    if( cur_pos == 0 ) p = cur_posX;
	    else               p = StickDownType;

	    if( ContFlushMask[i] ) {
		ColorFlush( &ChgColor, 0.3f );
		ContStick[p][0].r = ChgColor;
		ContStick[p][0].b = ChgColor;
		ContStick[p][1].r = ChgColor;
		ContStick[p][1].b = ChgColor;
	    } else {
		ContStick[p][0].r = 0xff;
		ContStick[p][0].b = 0xff;
		ContStick[p][1].r = 0xff;
		ContStick[p][1].b = 0xff;
	    }
	    ContStick[!p][0].r = 0xff;
	    ContStick[!p][0].b = 0xff;
	    ContStick[!p][1].r = 0xff;
	    ContStick[!p][1].b = 0xff;

	    for( j=0; j<4; j++ ) {
		if( j == 0 ) {
		    ContStick[p][j].a = 0xff;
		    ContStick[!p][j].a = 0x40;
		} else {
		    ContStick[StickDownType][j].a = 0xff;
		    ContStick[!StickDownType][j].a = 0x40;
		}
		txt_display( ContStick[0][j] );
		txt_display( ContStick[1][j] );
	    }
	    break;

	case 1:
	    if( i == cur_pos ) p = CurContType;
	    else               p = ContTypeNum[ControllerNum]-1;

	    if( ContFlushMask[i] ) {
		ColorFlush( &ChgColor, 0.3f );
		ContType[0].r = 0xff;
		ContType[0].g = ChgColor;
		ContType[0].b = ChgColor;
	    } else {
		ContType[0].r = 0xff;
		ContType[0].g = 0x00;
		ContType[0].b = 0x00;
	    }
	    txt_display( ContType[0] );

	    for( j=1; j<4; j++ ) {
		if( i != cur_pos && (j == 2 || j == 3) ) continue;
		if( ContFlushMask[i] ) {
		    ColorFlush( &ChgColor, 0.3f );
		    ContType[j].r = ChgColor;
		    ContType[j].g = 0xff;
		    ContType[j].b = ChgColor;
		} else {
		    ContType[j].r = 0xff;
		    ContType[j].g = 0xff;
		    ContType[j].b = 0xff;
		}
		if( j == 2 && p == 0 ) continue;
		if( j == 3 && p == 2 ) continue;
		txt_display( ContType[j] );
	    }

	    ContType[4].txt = ContNumTxt[p].txt;
	    ContType[4].tlut = ContNumTxt[p].tlut;
	    ContType[4].SizX = ContNumTxt[p].SizX;
	    ContType[4].SizY = ContNumTxt[p].SizY;
	    ContType[4].posX = ContNumTxt[p].posX;
	    ContType[4].posY = ContNumTxt[p].posY;
	    txt_display( ContType[4] );

	    for( j=0; j<5; j++ ) {
		ContBtnType[j].posY = ContTypeDisp[p][j];
		txt_display( ContBtnType[j] );
	    }
	    break;

	case 2:
	    break;

	case 3:
	    if( ContFlushMask[i] ) {
		ColorFlush( &ChgColor, 0.3f );
		ContTaget[0].r = ChgColor;
		ContTaget[0].b = ChgColor;
	    } else {
		ContTaget[0].r = 0xff;
		ContTaget[0].b = 0xff;
	    }
	    txt_display( ContTaget[0] );

	    if( TargetSelMode == OFF ) {
		ContTaget[Target_flag[ControllerNum]+1].r = 0xff;
		ContTaget[Target_flag[ControllerNum]+1].b = 0xff;
		ContTaget[Target_flag[ControllerNum]+1].posX = 226.0f;;
		txt_display( ContTaget[Target_flag[ControllerNum]+1] );
	    } else {
		for( j=1; j<3; j++ ) {
		    if( ContTagetFlush[j-1] ) {
			ColorFlush( &ChgColor, 0.3f );
			ContTaget[j].r = ChgColor;
			ContTaget[j].b = ChgColor;
		    } else {
			ContTaget[j].r = 0xff;
			ContTaget[j].b = 0xff;
		    }
		    ContTaget[j].posX = TargetXPos[j-1];
		    txt_display( ContTaget[j] );
		}
	    }
	    break;

	case 4:
	    if( i == cur_pos ) {
		ColorFlush( &ChgColor, 0.3f );
		ContExit.r = 0xff;
		ContExit.g = ChgColor;
		ContExit.b = ChgColor;
	    } else {
		ContExit.r = 0xff;
		ContExit.g = 0xff;
		ContExit.b = 0xff;
	    }
	    txt_display( ContExit );
	    break;
	}
    }

    menu_title_display();

    ContRoller_display();

    for( i=0; i<8; i++ ) {
	txt_display( Mcont12[i] );
    }

#if 0
    if ( Key_T[1].button & CONT_F ) {
	ContTaget[1].posX += 1.0f;
    }
    if ( Key_T[1].button & CONT_C ) {
	ContTaget[1].posX -= 1.0f;
    }
    if ( Key_T[1].button & CONT_E ) {
	ContTaget[1].posY -= 1.0f;
    }
    if ( Key_T[1].button & CONT_D ) {
	ContTaget[1].posY += 1.0f;
    }
	
    PRINTF( "x=%f y=%f\n",ContTaget[1].posX,ContTaget[1].posY );
#endif
}


/************************************************************************/
/* コントローラ画面マスク表示						*/
/************************************************************************/
static xyz_t Ps[] = {
    {   4.0f,   131.0f,     0.0f},
    { 117.0f,   -58.0f,     0.0f},
    {   3.0f,  -217.0f,     0.0f},
    {-281.0f,   -47.0f,     0.0f},
};
static xyz_t Sz[] = {
    {  25.8f,     8.9f,     0.0f},
    {  18.9f,    10.0f,     0.0f},
    {  30.0f,     6.6f,     0.0f},
    {   4.3f,    13.9f,     0.0f},
};

static void Cont_Mask_Display( void )
{
    int i;
    xyz_t *pos,*size;
//    static int mp=0;
    
#if 1
    rcpsetmode( &NOW_DISP, POLY );
#else
    rcpsetmode( &NOW_DISP, POLY_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 255, 0, 0, 255);
#endif
    for(i=0,pos=&Ps[0],size=&Sz[0];i<4;i++,pos++,size++) {
#if 0
	if( i == mp ) {
	  gDPSetPrimColor(NEXT_DISP, 0, 0, 255, 0, 0, 255);
	} else {
	  gDPSetPrimColor(NEXT_DISP, 0, 0, 0, 0, 0, 255);
	}
#endif
	push_now();
	translate_now(pos->x, pos->y, -500.0f, MULT_MTX);
	scale_now( size->x, size->y, 1.0f, MULT_MTX);
	set_matrix(&NOW_DISP);
	gSPDisplayList(NEXT_DISP, Mask);
	pull_now();
    }

#if 0
    if(Key_T[1].button & CONT_L) {
	mp += 1;
	if( mp > 3 ) mp=0;
    }
    if(Key_T[1].button & CONT_C) {
	Sz[mp].x += 0.1f;
    }
    if(Key_T[1].button & CONT_F) {
	Sz[mp].x -= 0.1f;
    }
    if(Key_T[1].button & CONT_D) {
	Sz[mp].y -= 0.1f;
    }
    if(Key_T[1].button & CONT_E) {
	Sz[mp].y += 0.1f;
    }

    PRINTF( "p:%d xs=%f ys=%f\n",mp,Sz[mp].x,Sz[mp].y );
#endif
}
#endif



#ifdef OPT_DEBUG
/************************************************************************/
/*									*/
/************************************************************************/
static void debug_display( void )
{
    rectangle_rgba_a_prim();

    COLOR8X8( 0xff,0xff,0xff,0xff );

    LOCATE8X8( 13, 3 );
    Printf( "R : %d\n",mojiR );
    LOCATE8X8( 13, 4 );
    Printf( "G : %d\n",mojiG );
    LOCATE8X8( 13, 5 );
    Printf( "B : %d\n",mojiB );
    LOCATE8X8( 13, 6 );
    Printf( "A : %d\n",mojiA );

    if(Key[2].button & CONT_UP) {
	mojiR = (mojiR + 1) & 0xff;
    }
    if(Key[2].button & CONT_DOWN) {
	mojiR = (mojiR - 1) & 0xff;
    }
    if(Key[2].button & CONT_RIGHT) {
	mojiG = (mojiG + 1) & 0xff;
    }
    if(Key[2].button & CONT_LEFT) {
	mojiG = (mojiG - 1) & 0xff;
    }
    if(Key[2].button & CONT_E) {
	mojiB = (mojiB + 1) & 0xff;
    }
    if(Key[2].button & CONT_D) {
	mojiB = (mojiB - 1) & 0xff;
    }
#if 0
    if(Key[2].button & CONT_F) {
	mojiA = (mojiA + 1) & 0xff;
    }
    if(Key[2].button & CONT_C) {
	mojiA = (mojiA - 1) & 0xff;
    }
#endif
}

/************************************************************************/
/*									*/
/************************************************************************/
static void debug2_display( void )
{
    rectangle_rgba_a_prim();

    COLOR8X8( 0xff,32,32,0xff );

    LOCATE8X8( 4, 3 );
    Printf( "Clear Mode:%d\n",Ending_flg );

    if(Key_T[2].button & CONT_E) {
	Ending_flg++;
	if( Ending_flg > 2 ) Ending_flg = 0;
    }
}

/************************************************************************/
/* キー入力 ライト用							*/
/************************************************************************/
static void KeyIn_Lig( void )
{
    float x,y;

    if (Key[1].button & CONT_C) {
	if (Key[1].button & CONT_LEFT) {
	    KanR = (KanR - 1) & 0xff;
	}
	if (Key[1].button & CONT_RIGHT) {
	    KanR = (KanR + 1) & 0xff;
	}
	if (Key[1].button & CONT_UP) {
	    LigR = (LigR + 1) & 0xff;
	}
	if (Key[1].button & CONT_DOWN) {
	    LigR = (LigR - 1) & 0xff;
	}
    }

    if (Key[1].button & CONT_D) {
	if (Key[1].button & CONT_LEFT) {
	    KanG = (KanG - 1) & 0xff;
	}
	if (Key[1].button & CONT_RIGHT) {
	    KanG = (KanG + 1) & 0xff;
	}
	if (Key[1].button & CONT_UP) {
	    LigG = (LigG + 1) & 0xff;
	}
	if (Key[1].button & CONT_DOWN) {
	    LigG = (LigG - 1) & 0xff;
	}
    }
    
    if (Key[1].button & CONT_F) {
	if (Key[1].button & CONT_LEFT) {
	    KanB = (KanB - 1) & 0xff;
	}
	if (Key[1].button & CONT_RIGHT) {
	    KanB = (KanB + 1) & 0xff;
	}
	if (Key[1].button & CONT_UP) {
	    LigB = (LigB + 1) & 0xff;
	}
	if (Key[1].button & CONT_DOWN) {
	    LigB = (LigB - 1) & 0xff;
	}
    }

    x = (float)Key_T[1].stick_x;
    y = (float)Key_T[1].stick_y;

    LigYa += x * 0.04f;
    LigXa -= y * 0.04f;

//    if (Key_T[1].button & CONT_G) {
	PRINTF( "Lig:R=%d G=%d B=%d\n",LigR,LigG,LigB );
	PRINTF( "La :Xa=%f Ya=%f\n",LigXa,LigYa );
	PRINTF( "Kan:R=%d G=%d B=%d\n\n",KanR,KanG,KanB );
//    }
}
#endif




#if 1
/*----------------------------------------------------------------------*/
/*									*/
/* ゲームオーバーに関する関数および変数					*/
/*									*/
/*----------------------------------------------------------------------*/
static void ovre_init( void );



/*----------------------------------------------------------------------*/
/*									*/
/* ゲームオーバー							*/
/*									*/
/*----------------------------------------------------------------------*/
/*======================================================================*
 * ゲームオーバー Initial						*
 *======================================================================*/
static void ovre_init( void )
{
    mem_stage_clear();
    star_initial_set();
    Back_star_f = 0;

    next_mode = MAP;
    before_mode = OVER;

    pause_mode = OVER_MAIN;
    display_mode = DISPLAY_NOTH;
}

/*======================================================================*
 * ゲームオーバーメイン        						*
 *======================================================================*/
void over(void)
{
//    int i;
    
    switch(pause_mode) {
    case OVER_WAIT:
	if(!system_time) {
	    pause_mode = OVER_INIT;
//	    Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_GAME_OVER);
	}
	break;
	
    case OVER_INIT:
	ovre_init();
	break;
	
    case OVER_MAIN:
	break;
    }
}

/*======================================================================*
 *	ゲームオーバー画面表示						*
 *======================================================================*/
void over_display(void)
{
}
#else
/*+=====================================================================+
      ゲームオーバー関係
  +=====================================================================+*/
//static int ss = 0;

int kao_check(
    int		no,
    Gfx		**d,
    xyz_t	*t,
    xyz_t	*r,
    void *i
)
{
    (void)t;
    (void)r;
    (void)i;
    (void)d;
    

    if(no >= 13 && no < 51) {
	polygon_z_light();
    } else {
	texture_z_light();
    }
    
    return 0;
}


/*======================================================================*
 *	ゲームオーバー文字表示						*
 *======================================================================*/
Gfx *game_over_gfx[] = {
    AND_G,
    AND_A,
    AND_M,
    AND_E,
    AND_O,
    AND_V,
    AND_E,
    AND_R,
};
float game_over_trs[] = {
    0.0f + 200.0f,
    50.0f + 200.0f,
    100.0f + 200.0f,
    150.0f + 200.0f,
    250.0f + 200.0f,
    300.0f + 200.0f,
    350.0f + 200.0f,
    400.0f + 200.0f,
};

float gv_ZA[8];

void game_over_draw(void)
{
    int i;
    
    add_calc(&g_size, 1.0f, 1.0f, 0.1f, 0.0f);
    
    texture_a();
    
    translate_now(-400.0f, -200.0f, -200.0f, MULT_MTX);
    scale_now( g_size, 1.0f, 1.0f, MULT_MTX);

    for(i=0;i<8;i++)  {
	add_calc(&gv_ZA[i], 0.0f, 0.5f, 20.0f, 0.0f);
	push_now();
	translate_now(game_over_trs[i], 0.0f, 0.0f, MULT_MTX);
	rotateZ_now(ANGLE(gv_ZA[i]), MULT_MTX);
	set_matrix(&NOW_DISP);
	gSPDisplayList(NEXT_DISP, game_over_gfx[i]);
	pull_now();
    }
}

/*======================================================================*
 *	ゲームオーバー画面表示						*
 *======================================================================*/
void over_display(void)
{
    xyz_t P_ang[100];

/*    if(Key_T[1].button & CONT_R) {
	ss ++;
    }
    if(Key_T[1].button & CONT_G) {
	ss --;
    }

    PRINTF("SSS=%d\n",ss);*/
    
    starZang += 0.01f;
    
    push_now();
    
    set_lookat_now(eyeX, eyeY, eyeZ,
		   wayX, wayY, wayZ,
		   0.0f, 1.0f, 0.0f, MULT_MTX);

    translate_now(0.0f, 60.0f, -400.0f, MULT_MTX);
    set_matrix(&NOW_DISP);

    light_in( 80, 30, 0, 
	      100, 100, 20,
	      5, 5, 40);
    
    g_count += 1;
/*    
    if(anime_frame(&AND_Andruf_Gameover_anm) <= g_count) {
	g_count = 50;
    }
    
    si_get(&AND_Andruf_Gameover_anm, g_count, P_ang);
    si_draw(AND_Andruf_Hahaha_list, P_ang, &kao_check, NULL, NULL);
    */
    game_over_draw();

    pull_now();
    
//    time_display();
}

/*======================================================================*
 *	ゲームオーバー        						*
 *======================================================================*/
void over(void)
{
    int i;
    
    switch(pause_mode) {

    case OVER_WAIT:
	if(!system_time) {
	    pause_mode = OVER_INIT;
//	    Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_GAME_OVER);
	}
	break;
	
    case OVER_INIT:
	mem_stage_clear();
	
	pause_mode = OVER_MAIN;
	display_mode = DISPLAY_OVER;
	
	g_count = 0;
	g_size = 0.0f;

	eyeX = 
	    eyeY = 
	    eyeZ = 
	    wayX = 
	    wayY = 0.0f;
	wayZ = -10.0f;

	for(i=0;i<8;i++) {
	    gv_ZA[i] = 180.0f + 45.0f * (float)(i);
	}

#if 0
	starXBUF = (float *)mem_stage_alloc(sizeof(float) * 1000);
	starYBUF = (float *)mem_stage_alloc(sizeof(float) * 1000);
    
	init_rnd_2(1, 29000, 9876); /* 意味がありそうで実は適当 */
	
	for(i = 0; i < 1000; i ++)  {
	    starXBUF[i] = rnd_2()* 480.0f-80.0f;
	    starYBUF[i] = rnd_2()* 360.0f-60.0f;
	}		
#else
	star_initial_set();
#endif	
	Back_star_f = 1;
	
//	Na_MusicStart(0);
	Na_StartBgm(NA_BGM_GAME_OVER);
	Na_StartEnemySe(gv_sp, NA_SE_ANDORF_OVER_VOICE);
	break;
	
    case OVER_MAIN:
	if(fade_A != 0x00)   {
	    fade_A  -= 0x10;
	    if(fade_A < 0x00)   {
		fade_A  = 0x0;
	    }
	} else {
	    if(Key_T[cont_num].button & CONT_START) {
		pause_mode = OVER_MAIN+1;
		Na_StopAllSound(10);
	    }
	}
	frame_A = 0x20;
	break;
    case OVER_MAIN+1:
	fade_A += 0x10;
	if(fade_A > 255) {
	    fade_A = 255;
	    
	    next_mode = MAP;
	    before_mode = OVER;
/*	
	    before_mode = OVER;
	    system_mode = MAP;
	    system_time = 2;
	    map_mode = MAP_WAIT;
	    BG_color = 0x00;
	    display_mode = DISPLAY_NOTH;*/
	}
	break;
    } 
}
#endif





















#if 0
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/*+=====================================================================+
      ゲームオーバー関係
  +=====================================================================+*/
//static int ss = 0;

int kao_check(
    int		no,
    Gfx		**d,
    xyz_t	*t,
    xyz_t	*r,
    void *i
)
{
    (void)t;
    (void)r;
    (void)i;
    (void)d;
    

    if(no >= 13 && no < 51) {
	polygon_z_light();
    } else {
	texture_z_light();
    }
    
    return 0;
}


/*======================================================================*
 *	ゲームオーバー文字表示						*
 *======================================================================*/
Gfx *game_over_gfx[] = {
    AND_G,
    AND_A,
    AND_M,
    AND_E,
    AND_O,
    AND_V,
    AND_E,
    AND_R,
};
float game_over_trs[] = {
    0.0f + 200.0f,
    50.0f + 200.0f,
    100.0f + 200.0f,
    150.0f + 200.0f,
    250.0f + 200.0f,
    300.0f + 200.0f,
    350.0f + 200.0f,
    400.0f + 200.0f,
};

float gv_ZA[8];

void game_over_draw(void)
{
    int i;
    
    add_calc(&g_size, 1.0f, 1.0f, 0.1f, 0.0f);
    
    texture_a();
    
    translate_now(-400.0f, -200.0f, -200.0f, MULT_MTX);
    scale_now( g_size, 1.0f, 1.0f, MULT_MTX);

    for(i=0;i<8;i++)  {
	add_calc(&gv_ZA[i], 0.0f, 0.5f, 20.0f, 0.0f);
	push_now();
	translate_now(game_over_trs[i], 0.0f, 0.0f, MULT_MTX);
	rotateZ_now(ANGLE(gv_ZA[i]), MULT_MTX);
	set_matrix(&NOW_DISP);
	gSPDisplayList(NEXT_DISP, game_over_gfx[i]);
	pull_now();
    }
}

/*======================================================================*
 *	ゲームオーバー画面表示						*
 *======================================================================*/
void over_display(void)
{
    xyz_t P_ang[100];

/*    if(Key_T[1].button & CONT_R) {
	ss ++;
    }
    if(Key_T[1].button & CONT_G) {
	ss --;
    }

    PRINTF("SSS=%d\n",ss);*/
    
    starZang += 0.01f;
    
    push_now();
    
    set_lookat_now(eyeX, eyeY, eyeZ,
		   wayX, wayY, wayZ,
		   0.0f, 1.0f, 0.0f, MULT_MTX);

    translate_now(0.0f, 60.0f, -400.0f, MULT_MTX);
    set_matrix(&NOW_DISP);

    light_in( 80, 30, 0, 
	      100, 100, 20,
	      5, 5, 40);
    
    g_count += 1;
/*    
    if(anime_frame(&AND_Andruf_Gameover_anm) <= g_count) {
	g_count = 50;
    }
    
    si_get(&AND_Andruf_Gameover_anm, g_count, P_ang);
    si_draw(AND_Andruf_Hahaha_list, P_ang, &kao_check, NULL, NULL);
    */
    game_over_draw();

    pull_now();
    
//    time_display();
}

/*======================================================================*
 *	ゲームオーバー        						*
 *======================================================================*/
void over(void)
{
    int i;
    
    switch(pause_mode) {

    case OVER_WAIT:
	if(!system_time) {
	    pause_mode = OVER_INIT;
//	    Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_GAME_OVER);
	}
	break;
	
    case OVER_INIT:
	mem_stage_clear();
	
	pause_mode = OVER_MAIN;
	display_mode = DISPLAY_OVER;
	
	g_count = 0;
	g_size = 0.0f;

	eyeX = 
	    eyeY = 
	    eyeZ = 
	    wayX = 
	    wayY = 0.0f;
	wayZ = -10.0f;

	for(i=0;i<8;i++) {
	    gv_ZA[i] = 180.0f + 45.0f * (float)(i);
	}

#if 0
	starXBUF = (float *)mem_stage_alloc(sizeof(float) * 1000);
	starYBUF = (float *)mem_stage_alloc(sizeof(float) * 1000);
    
	init_rnd_2(1, 29000, 9876); /* 意味がありそうで実は適当 */
	
	for(i = 0; i < 1000; i ++)  {
	    starXBUF[i] = rnd_2()* 480.0f-80.0f;
	    starYBUF[i] = rnd_2()* 360.0f-60.0f;
	}		
#else
	star_initial_set();
#endif	
	Back_star_f = 1;
	
//	Na_MusicStart(0);
	Na_StartBgm(NA_BGM_GAME_OVER);
	Na_StartEnemySe(gv_sp, NA_SE_ANDORF_OVER_VOICE);
	break;
	
    case OVER_MAIN:
	if(fade_A != 0x00)   {
	    fade_A  -= 0x10;
	    if(fade_A < 0x00)   {
		fade_A  = 0x0;
	    }
	} else {
	    if(Key_T[cont_num].button & CONT_START) {
		pause_mode = OVER_MAIN+1;
		Na_StopAllSound(10);
	    }
	}
	frame_A = 0x20;
	break;
    case OVER_MAIN+1:
	fade_A += 0x10;
	if(fade_A > 255) {
	    fade_A = 255;
	    
	    next_mode = MAP;
	    before_mode = OVER;
/*	
	    before_mode = OVER;
	    system_mode = MAP;
	    system_time = 2;
	    map_mode = MAP_WAIT;
	    BG_color = 0x00;
	    display_mode = DISPLAY_NOTH;*/
	}
	break;
    } 
}


/*+=====================================================================+
  |									|
  |	自機動作 (飛行機）						|
  |									|
  +=====================================================================+*/
void wing_move(PL *pl)
{
    float joy_x,joy_y,joy_yO,a,b;
    float zad,pad;
    float fx,fy;
    xyz_t mae,ato,ato2;

    stad = STAD;
    stfl = STFL;

    if(Key_T[pl->index].stick_x != 0 ||
       Key_T[pl->index].stick_y != 0) {
	stad = STAD;
    }

    joy_x = (float)-Key_T[pl->index].stick_x;
    joy_y = (float)Key_T[pl->index].stick_y * Stick_Revise[pl->index];

    rotateZ_work(ANGLE(-pl->CZangad2), SET_MTX);
	
    mae.x =  joy_x;
    mae.y =  joy_y;
    mae.z =  0.0f;
	
    MtxF_PositionRS_work(&mae, &ato);
    
    fx = ato.x;
    fy = ato.y;

    if(pl->wingL < 360.0f) {
	pl->wingL += (15.0f - pl->wingL) * 0.05f;
    }
    if(pl->wingR < 360.0f) {
	pl->wingR += (15.0f - pl->wingR) * 0.05f;
    }
    if(fx >  0.0f) {
	pl->flapL += ( fx * 0.7f - pl->flapL) * 0.2f;
    }
    else {
	pl->flapL += ((-fy * 0.7f ) - pl->flapL) * 0.2f;
    }
    if(fx <  0.0f) {
	pl->flapR += ( -fx * 0.7f  - pl->flapR) * 0.2f;
    }
    else {
	pl->flapR += ((-fy * 0.7f) - pl->flapR) * 0.2f;
    }

/* Yアングル制御 */
    pad = 0.1f;
/* 横向きターンはクイッキー*/
    if(pl->CZangad2 > 10.0f) {
	if(joy_x > 0) {
	    stad *= 2.0f;
	    pad = 0.2f;
	}
    }

    if(pl->CZangad2 < -10.0f) {
	if(joy_x < 0) {
	    stad *= 2.0f;
	    pad = 0.2f;
	}
    }
    if(pl->quick)  {
	stad = STAD * 3.0f;
	pad = 0.2f;
    }
    
    a = 0.0f;
    if(pl->CYang > 90.0f)
	a = 180.0f;

    
    add_calc(&pl->CYang, (joy_x*stfl + a), pad, stad, 0.03f);

/* Xアングル制御 */
    stad = STAD;
    pad = 0.1f;
    
    joy_yO = (float)-joy_y*stfl;

    if(joy_yO <= 0.0f) {
	if(pl->Ypos < GYPOSF+50.0f) { /* 地面すれすれは下向かない */
	    joy_yO = 0.0f;   
	    stad *= 2.0f; /* しかも速く定位置に戻る */
	    pad = 0.2f;
	}
    }
    add_calc(&pl->CXang, joy_yO, pad, stad, 0.03f);
    
/* Zアングル制御 */
    b = 1.0f;
    if(pl->Ypos < GYPOSF+70.0f) {
	b = 0.8f;
    }
    if((Key[pl->index].button & CONT_R) || (Key[pl->index].button & CONT_G)) {
	b = 0.1f;
    }
    
    zad = 4.0f;
    
    if(joy_x == 0)
	zad = 1.0f;

    add_calc(&pl->CZang, (joy_x*0.6f*b), 0.1f, zad, 0.03f);

/* 移動スピードセット */
    rotateY_work(ANGLE(pl->moveYA + pl->CYang + 180.0f), SET_MTX);
    rotateX_work(-ANGLE(pl->moveXA + pl->CXang), MULT_MTX);
	
    mae.x =  0.0f;
    mae.y =  0.0f;
    mae.z =  pl->Mspd;
	
    MtxF_PositionRS_work(&mae, &ato);
    
    rotateY_work(ANGLE( pl->moveYA ), SET_MTX);
    rotateX_work(ANGLE(pl->moveXA), MULT_MTX);
	
    mae.x =  0.0f;
    mae.y =  0.0f;
    mae.z =  -pl->boostZspd * angleMUL;
	
    MtxF_PositionRS_work(&mae, &ato2);

    pl->Xspd = (ato.x+ato2.x)* pl->quick_SP;
    pl->Zspd = ato.z+ato2.z;
    
    if(pl->ice_flag == 0) {
	pl->Yspd = (ato.y+ato2.y) * pl->quick_SP;
    }

    
    if(pl->ice_flag != 0) { /* アイスビームをくらったか？*/
	pl->Yspd -= 2.0f;

	if(pl->CZangad2 >= 0.0f) {
	    pl->CZangad2 += 4.0f;
	    if(pl->CZangad2 > 90.0f)
		pl->CZangad2 = 90.0f;
	}
	if(pl->CZangad2 < 0.0f) {
	    pl->CZangad2 -= 4.0f;
	    if(pl->CZangad2 < -90.0f)
		pl->CZangad2 = -90.0f;
	}
	
    }


    if(pl->Xpos * angleMUL > pl->centerX + (pl->posmaxX-100)) {
	pl->mvlimit = 1;
    }
    if(pl->Xpos * angleMUL < pl->centerX -(pl->posmaxX-100)) {
	pl->mvlimit = 2;
    }	 
    
    if(pl->Ypos >  pl->centerY + (pl->posmaxuY-100)) {
	pl->mvlimit = 3;
    }	 
    
    if(pl->Ypos <  pl->centerY + -(pl->posmaxuY-100)) {
	pl->mvlimit = 4;
    }	 
    

    pl->Xpos += pl->Xspd;

    
    if(pl->Xpos > pl->posmaxX + pl->centerX) {
	pl->Xpos = pl->posmaxX + pl->centerX;
	pl->Xspd = 0.0f;
    }
    if(pl->Xpos < -pl->posmaxX + pl->centerX) {
	pl->Xpos = -pl->posmaxX + pl->centerX;
	pl->Xspd = 0.0f;
    }

    pl->Ypos += pl->Yspd;
    
    if(pl->Ypos > pl->posmaxuY  + pl->centerY  ) {
	pl->Ypos = pl->posmaxuY + pl->centerY;
	pl->Yspd = 0.0f;
    }	 
    if(pl->Ypos < pl->posmaxdY + pl->centerY)	 {
	pl->Ypos = pl->posmaxdY + pl->centerY;
	pl->Yspd = 0.0f;
    }

    pl->Zpos += pl->Zspd; 
    
    
/*  大気による機体の揺れ */

    pl->Yposad_W  = sinf(ANGLE(pl->CZangcnt * 0.7f))*0.5f;

    pl->Yposadcnt += 10.0f;
    pl->CZangcnt += 8.0f;

    if(STAGE == GROUND) {
    

	pl->Yposad = -sinf(ANGLE(pl->Yposadcnt))*0.5f;


	pl->CZangad = sinf(ANGLE(pl->CZangcnt))*1.5f;

    }
    
}




static xy_t PikaStPos[] = {
    { -6.6f, 3.0f },
    { -4.4f, 2.0f },
    {  3.8f, 4.5f },
    {  5.8f, 3.0f },
};
static xy_t PikaMvPos[4][6] = {
 { /* FOX */
    { -13.8f,  0.0f },
    { -13.8f,  3.4f },
    
    { -4.8f,   3.4f },
    { -4.8f,  11.0f },
    
    { -21.2f,  3.4f },
    { -21.2f, 11.0f }
 },
 { /* PEPPY*/
    {  0.0f, 11.4f },
    { 15.6f, 11.4f },
    
    { 15.6f, 19.0f },
    { 23.8f, 19.0f },
    
    { 15.6f,  4.4f },
    { 23.8f,  4.4f }
 },
 { /* SLIPPY */
    {   0.0,  -14.3f },
    { -15.4f, -14.3f },
    
    { -15.4f, -24.4f },
    { -24.6f, -24.4f },
    
    { -15.4f, -9.8f },
    { -24.6f, -9.8f }
 },
 { /* FALCO */
    { 11.2f,  0.0f },
    { 11.2f, -8.4f },
    
    { 21.4f, -8.4f },
    { 21.4f,-17.2f },
    
    { 5.2f,  -8.4f },
    { 5.2f, -17.2f }
 },
};
static int PikaMvTbl[2][4] = {
    { 0,1,2,3 },
    { 0,1,4,5 },
};

static WIN_T VsContWin = {
    0.0f,44.0f,-130.0f, 0.2f,0.11f
};

static TXTR_T VsContNameTxt[4] = {
    { IA8,NOFLIP,
      CF_fox_txt,NULL,
      80,13, 121.0f,22.0f, 1.0f,1.0f,20,0,75,255 }, 
    { IA8,NOFLIP,
      CF_peppy_txt,NULL,
      72,13, 124.0f,22.0f, 1.0f,1.0f,20,0,75,255 }, 
    { IA8,NOFLIP,
      CF_slipy_txt,NULL,
      80,13, 120.0f,22.0f, 1.0f,1.0f,20,0,75,255 }, 
    { IA8,NOFLIP,
      CF_falco_txt,NULL,
      72,13, 125.0f,22.0f, 1.0f,1.0f,20,0,75,255 }, 
};

/************************************************************************/
/* ＶＳ ゲーム Initial							*/
/************************************************************************/
static void vs_game_init( void )
{
    register int i;
    int p;

    if( VsReturn ) {
	mainM[1].text.posY = 126.0f;
	mainM[1].win.posY = -6.0f;
    }

    /* とりあえず */
    VS_point = 3;
    SelectStage = 1;

    p = 0;
    VsCurPos = 0;
    PlayerModePos = 0;
    ContCnt = 0;
    SelectEnd = 0;
    CamCnt = 0;
    Back_star_f = OFF;

    PikaZa = 0.0f;
    for( i=0; i<4; i++ ) {
	VsGameFlushMask[i] = OFF;
	Pika[i].Bunki = 1;
	Pika[i].Reverse = ON;
	Pika[i].Time = 0;
	Pika[i].Ptr = 0;
	Pika[i].Stp = 0.08f;
	Pika[i].Scl = 0.031f;
	Pika[i].Max = 0.18f;
	Pika[i].Max2 = 0.12f;
	Pika[i].Min = 0.03f;
	Pika[i].NowXp = PikaStPos[i].x;
	Pika[i].NowYp = PikaStPos[i].y;
	Pika[i].NextXp = PikaStPos[i].x + PikaMvPos[i][0].x;
	Pika[i].NextYp = PikaStPos[i].y + PikaMvPos[i][0].y;

	Pika2[i].Bunki = 0;
	Pika2[i].Reverse = OFF;
	Pika2[i].Time = 0;
	Pika2[i].Ptr = 0;
	Pika2[i].Stp = 0.08f;
	Pika2[i].Scl = 0.031f;
	Pika2[i].Max = 0.18f;
	Pika2[i].Max2 = 0.12f;
	Pika2[i].Min = 0.03f;
	Pika2[i].NowXp = PikaStPos[i].x;
	Pika2[i].NowYp = PikaStPos[i].y;
	Pika2[i].NextXp = PikaStPos[i].x + PikaMvPos[i][0].x;
	Pika2[i].NextYp = PikaStPos[i].y + PikaMvPos[i][0].y;

	Pika3[i].Bunki = 1;
	Pika3[i].Reverse = ON;
	Pika3[i].Time = 0;
	Pika3[i].Ptr = 0;
	Pika3[i].Stp = 0.08f;
	Pika3[i].Scl = 0.031f;
	Pika3[i].Max = 0.18f;
	Pika3[i].Max2 = 0.12f;
	Pika3[i].Min = 0.03f;
	Pika3[i].NowXp = PikaStPos[i].x;
	Pika3[i].NowYp = PikaStPos[i].y;
	Pika3[i].NextXp = PikaStPos[i].x + PikaMvPos[i][0].x;
	Pika3[i].NextYp = PikaStPos[i].y + PikaMvPos[i][0].y;

	Pika4[i].Bunki = 0;
	Pika4[i].Reverse = OFF;
	Pika4[i].Time = 0;
	Pika4[i].Ptr = 0;
	Pika4[i].Stp = 0.08f;
	Pika4[i].Scl = 0.031f;
	Pika4[i].Max = 0.18f;
	Pika4[i].Max2 = 0.12f;
	Pika4[i].Min = 0.03f;
	Pika4[i].NowXp = PikaStPos[i].x;
	Pika4[i].NowYp = PikaStPos[i].y;
	Pika4[i].NextXp = PikaStPos[i].x + PikaMvPos[i][0].x;
	Pika4[i].NextYp = PikaStPos[i].y + PikaMvPos[i][0].y;

        /* コントローラが接続されてないところは"カメラ"のみ */
	if( Key_switch[i] == OFF ) {
	    SelectEnd |= (1<<i);
	    PlayerMode[i] = 1;
	    PlayerModeNum[i] = 1;
	} else {
	    ContCnt++;
	    ContTbl[p] = i;
	    p++;
	    PlayerMode[i] = 0;
	    PlayerModeNum[i] = 0;
	}

	PikaWaitTm[i] = 0;

	VsGameST2[i].AdWaitTime = 0;
	VsGameST2[i].WaitTime = 0;
    }
    VsGameFlushMask[0] = ON;

    PlayerModePos = 0;
    stick_wait_time2 = 0;

    VsGameST.AdWaitTime = 0;
    VsGameST.WaitTime = 0;
    VsGameST3.AdWaitTime = 0;
    VsGameST3.WaitTime = 0;

    frame_A = 0x80; 

#if 0
    /* コントローラが１つしか接続されてないとき     */
    /* とりあえずＶＳゲームができないようにしておく */
    if( ContCnt == 1 ) {
	exit_phase = 1;
	exit_process( MAIN_MENU );
    }
#endif
}

/************************************************************************/
/* ＶＳ ゲーム								*/
/************************************************************************/
static void vs_game( void )
{
    register int i;
    int res,res2,work;

    /* カメラが選択されている数のチェック */
    for( i=0,CamCnt=0; i<4; i++ ) {
	if( PlayerModeNum[i] == 1 ) CamCnt++;
    }

    if( SelectEnd != 0x0f ) {
	work = ContTbl[VsCurPos];
	res = KeyIn_Move_Cur2( &VsCurPos, ContCnt-1, STICK_X,NUM_LOOP,
			      20, 5, &VsGameST );
	if( res ) {
	    Na_StartSystemSe( NA_SE_CURSOR );
	    PlayerModePos = ContTbl[VsCurPos];

	    if( !(SelectEnd & (1<<work)) )
		PlayerModeNum[work] = PlayerMode[work];

	    VsGameFlushMask[work] = OFF;
	    VsGameFlushMask[PlayerModePos] = ON;
	}

	work = PlayerModeNum[PlayerModePos];
	res2 = KeyIn_Move_Cur2( &PlayerModeNum[PlayerModePos], 1, STICK_Y,
				NUM_NOLOOP, 20, 2,
				&VsGameST2[PlayerModePos] );

	if( CamCnt + PlayerModeNum[PlayerModePos] > 2 ) {
	    res2 = 0;
	    PlayerModeNum[PlayerModePos] = work;
	}


	if( res2 ) {
	    Na_StartSystemSe( NA_SE_CURSOR );
	}

	if( Key_T[cont_num].button & CONT_A ) {
	    Na_StartSystemSe( NA_SE_DECIDE );

	    PlayerMode[PlayerModePos] = PlayerModeNum[PlayerModePos];
	    SelectEnd |= (1<<PlayerModePos);
	    VsGameFlushMask[PlayerModePos] = OFF;


	    /* カメラが２つになった時点でその他はプレイヤー */
	    /* とゆうことで選択終了にする                   */
	    if( CamCnt == 2 ) {
		for( i=0; i<ContCnt; i++ ) {
		    if( !(SelectEnd & (1<<ContTbl[i])) ) {
			PlayerMode[ContTbl[i]] = PlayerModeNum[ContTbl[i]];
//			PlayerMode[ContTbl[i]] = 0;
			SelectEnd |= (1<<ContTbl[i]);

		    }
		}
	    }

	    if( SelectEnd != 0x0f ) {
		VsCurPos++;
		if( VsCurPos+1 > ContCnt ) VsCurPos = 0;
		PlayerModePos = ContTbl[VsCurPos];
		VsGameFlushMask[PlayerModePos] = ON;
	    }
	}
    } else {
	work = NextMenuNum;
	res = KeyIn_Move_Cur2( &NextMenuNum, 1, STICK_Y,
			       NUM_NOLOOP, 20, 2, &VsGameST3 );
	if( res ) {
	    Na_StartSystemSe( NA_SE_CURSOR );
	}

	if( Key_T[cont_num].button & CONT_A ) {
	    Na_StartSystemSe( NA_SE_DECIDE );
	    if( !NextMenuNum ) {
//		menu_phase = VS_CONTROLER;
		NextMenuInit();
	    } else {
		menu_phase = VS_GAME_B;
		NextMenuInit();
	    }
	}
    }

    if( Key_T[cont_num].button & CONT_B ) {
	Na_StartSystemSe( NA_SE_DECIDE );
	if( SelectEnd != 0x0f && VsCurPos == 0 ) {
	    exit_phase = 1;
	    exit_process( MAIN_MENU );
	} else {
	    VsGameFlushMask[ContTbl[VsCurPos]] = OFF;
	    VsCurPos = 0;
	    for( i=0; i<ContCnt; i++ ) {
		SelectEnd ^= (1<<ContTbl[i]);
	    }
	    VsGameFlushMask[ContTbl[VsCurPos]] = ON;
	    PlayerModePos = ContTbl[VsCurPos];
	}
    }
}

/************************************************************************/
/* ＶＳ ゲーム表示							*/
/************************************************************************/
static void vs_game_display( void )
{
    register int i;
#if 0
    static int wait_tm[4] = { 8,13,13,10 };
    static int wait_tm2[4] = { 0,10,20,30 };

    if( (frcnt & 0x10) )
	VsCaution_display();
#endif

    menu_title_display();
    N64_display();

    if( SelectEnd == 0x0f ) {
	PushNext_display();
    }

    for( i=0; i<4; i++ ) {
	PlayerSelBase_display( i );
	PlayerSel_display( i );
    }

#if 0
    for( i=0; i<4; i++ ) {
	PlayerSelBase_display( i );
	PlayerSel_display( i );
	if( PikaWaitTm[i] > wait_tm2[i] ) {
	    PikaPika_display( i,&(Pika[i]) );
	    if( Pika[i].Time > wait_tm[i] )
		PikaPika_display( i,&(Pika2[i]) );
	    if( Pika2[i].Time > wait_tm[i] ) 
		PikaPika_display( i,&(Pika3[i]) );
	    if( Pika3[i].Time > wait_tm[i] ) 
		PikaPika_display( i,&(Pika4[i]) );
	}
	PikaWaitTm[i]++;
    }
    
    PikaZa += 7.0f;
#endif

#if 0
{
    static int np = 0;

    if ( Key_T[3].button & CONT_L ) {
	np++;
	if( np > 3 ) np = 0;
    }
    if ( Key[3].button & CONT_RIGHT ) {
//	nameXpos[np] += 1.0f;
//	KaoXpos += 1.0f;
//	numXpos[np] += 1.0f;
//	ContXpos += 1.0f;
	HandeXpos += 1.0f;
	LeveXpos += 1.0f;
	YaLXpos += 1.0f;
	YaRXpos += 1.0f;
//	bsXpos[np] += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT ) {
//	nameXpos[np] -= 1.0f;
//	KaoXpos -= 1.0f;
//	numXpos[np] -= 1.0f;
//	ContXpos -= 1.0f;
	HandeXpos -= 1.0f;
	LeveXpos -= 1.0f;
	YaLXpos -= 1.0f;
	YaRXpos -= 1.0f;
//	bsXpos[np] -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
//	nameYpos -= 1.0f;
//	KaoYpos -= 1.0f;
//	numYpos -= 1.0f;
//	ContYpos -= 1.0f;
	HandeYpos -= 1.0f;
	LeveYpos -= 1.0f;
	YaYpos -= 1.0f;
//	bsYpos[np] -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
//	nameYpos += 1.0f;
//	KaoYpos += 1.0f;
//	numYpos += 1.0f;
//	ContYpos += 1.0f;
	HandeYpos += 1.0f;
	LeveYpos += 1.0f;
	YaYpos += 1.0f;
//	bsYpos[np] += 1.0f;
    }

    PRINTF( "p:%d nameX:%f nameY:%f\n",np,nameXpos[np],nameYpos );
//    PRINTF( "p:%d KaoX:%f KaoY:%f\n",np,KaoXpos,KaoYpos );
//    PRINTF( "p:%d numX:%f numY:%f\n",np,numXpos[np],numYpos );
//    PRINTF( "p:%d ContX:%f ContY:%f\n",np,ContXpos,ContYpos );
    PRINTF( "p:%d HandeX:%f HandeY:%f\n",np,HandeXpos,HandeYpos );
    PRINTF( "p:%d LeveX:%f LeveY:%f\n",np,LeveXpos,LeveYpos );
    PRINTF( "p:%d YaLX:%f YaLY:%f\n",np,YaLXpos,YaYpos );
    PRINTF( "p:%d YaRX:%f YaRY:%f\n",np,YaRXpos,YaYpos );
//    PRINTF( "p:%d bsX:%f bsY:%f\n",np,bsXpos[np],bsYpos[np] );
}
#endif
}

/************************************************************************/
/* プレイヤー設定 描画							*/
/************************************************************************/
static void PlayerSel_display( int i )
{
    register int j;
    int p,ysiz;

    static unsigned char *LevelTxt[3] = {
#if LOCALE==CHINA
	VTX_Z_Lv1_txt,
	VTX_Z_Lv2_txt,
	VTX_Z_Lv3_txt,
#else
	VTX_Lv1_txt,
	VTX_Lv2_txt,
	VTX_Lv3_txt,
#endif
    };
    static unsigned char *NameTxt[4] = {
	VTX_koFOX_txt,
	VTX_koPEPPY_txt,
	VTX_koSLIPPY_txt,
	VTX_koFALCO_txt,
    };
    static unsigned short *NameTxttlut[4] = {
	VTX_koFOX_txttlut,
	VTX_koPEPPY_txttlut,
	VTX_koSLIPPY_txttlut,
	VTX_koFALCO_txttlut,
    };

    static unsigned short *KaoTxt[4] = {
	VTX_Fox_cokpit_1_txt,
	VTX_Peppy_cokpit_1_txt,
	VTX_Slippy_cokpit_1_txt,
	VTX_Falco_cokpit_1_txt,
    };

    static float ms45Xpos[4] = { 3.0f, 3.0f, 3.0f, 3.0f };
    static float ms45Ypos[4] = { 36.0f, 36.0f, 3.0f, 3.0f };
    static float ms47Xpos[4] = { 13.0f, 13.0f, 13.0f, 13.0f };
    static float ms47Ypos[4] = { 48.0f, 48.0f, 15.0f, 15.0f };

#if 0
    static int numR[4] = { 177, 255,   0,   0 };
    static int numG[4] = { 242,  30, 255,   0 };
    static int numB[4] = {  12,   0,  67, 100 };
#endif
    static int numR[4] = { 177, 255,   0,  30 };
    static int numG[4] = { 242,  30, 255,  30 };
    static int numB[4] = {  12,   0,  67, 255 };

    int sel_r[2],sel_g[2],sel_b[2],sel_a[2];

    VsNum[i].r = numR[i];
    VsNum[i].g = numG[i];
    VsNum[i].b = numB[i];
    VsNum[i].posX = bsXpos[i]+numXpos[i];
    VsNum[i].posY = bsYpos[i]+numYpos;
    txt_display( VsNum[i] );


    if( Key_switch[i] == OFF ) { /* コントローラ非接続 */
	sel_r[0] = 0xff;
	sel_g[0] = 0xff;
	sel_b[0] = 0xff;
	sel_a[0] = 0x00;
	sel_r[1] = numR[i];
	sel_g[1] = numG[i];
	sel_b[1] = numB[i];
	sel_a[1] = 0xff;
    } else {			 /* コントローラ接続 */
	ColorFlush( &ChgColor, 0.3f );
	if( VsGameFlushMask[i] == ON ) { /* カーソル上 */
	    p = PlayerModeNum[i];
	    sel_a[p] = ChgColor;
	} else {
	    p = PlayerMode[i];
	    sel_a[p] = 0xff;
	}

	sel_r[p] = numR[i];
	sel_g[p] = numG[i];
	sel_b[p] = numB[i];

	sel_r[!p] = 0xff;
	sel_g[!p] = 0xff;
	sel_b[!p] = 0xff;
	if( SelectEnd & (1<<i) ) {
	    sel_a[!p] = 0x00;
	} else {
	    if( p == 0 && CamCnt == 2 ) sel_a[!p] = 0x00;
	    else			sel_a[!p] = 0x40;
	}
    }


    /** キャラクターの名前 **/
    rcpsetmode( &NOW_DISP, RECT_RGBA_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, numR[i],numG[i],numB[i],0xff );
    texture_rectangleCI8( &NOW_DISP, NameTxt[i],NameTxttlut[i],
			  nameXsiz[i], 8,
			  bsXpos[i]+nameXpos[i],bsYpos[i]+nameYpos,
			  1.0f, 1.0f );

    rcpsetmode( &NOW_DISP, RECT_A_PRIM );

    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff,0xff,0xff,0xff );
    /** ハンデキャップ **/
    texture_rectangleIA8( &NOW_DISP, VTX_hande_txt,
			  64, 9,
			  bsXpos[i]+HandeXpos,bsYpos[i]+HandeYpos,
			  1.0f, 1.0f );

    /** ハンデキャップ レベル**/
    ysiz = 12;
    if( CharaHande[i] == 0 ) ysiz = 11;
    texture_rectangleIA8( &NOW_DISP, LevelTxt[CharaHande[i]],
			  40, ysiz,
			  bsXpos[i]+LeveXpos,bsYpos[i]+LeveYpos,
			  1.0f, 1.0f );

    /** 矢印カーソル (左)**/
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    texture_rectangleIA8X( &NOW_DISP,
			   TXT_yajirusi_txt,
			   8, 8,
			   bsXpos[i]+YaLXpos,bsYpos[i]+YaYpos,
			   1.0f, 1.0f );
    /** 矢印カーソル (右)**/
    texture_rectangleIA8( &NOW_DISP,
			  TXT_yajirusi_txt,
			  8, 8,
			  bsXpos[i]+YaRXpos,bsYpos[i]+YaYpos,
			  1.0f, 1.0f );

    /** CONT. **/
    texture_rectangleIA8( &NOW_DISP, VTX_CONT_txt,
			  40, 7,
			  bsXpos[i]+ContXpos,bsYpos[i]+ContYpos,
			  1.0f, 1.0f );
    /* 顔 */
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    for( j=0; j<2; j++ ) {
	texture_rectangleRGBA16( &NOW_DISP, KaoTxt[i]+(44*j*20),
				 44, 20,
				 bsXpos[i]+KaoXpos,
				 bsYpos[i]+KaoYpos+(j*20.0f*0.7f),
				 0.7f, 0.7f );
    }
    texture_rectangleRGBA16( &NOW_DISP, KaoTxt[i]+(44*40),
			     44, 4,
			     bsXpos[i]+KaoXpos,
			     bsYpos[i]+KaoYpos+(40.0f*0.7f),
			     0.7f, 0.7f );
}

/************************************************************************/
/* プレイヤー設定のベース描画						*/
/************************************************************************/
static void PlayerSelBase_display( int i )
{
    register int j;

#if 0
    static float wakuX01[] = { -2.0f, 67.0f };
    static float wakuY00[] = { -2.0f, 61.0f };
    static float wakuY01[] = {  0.0f, 0.0f  };
    
    rcpsetmode( &NOW_DISP, RECT_RGBA_A_PRIM );

    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    texture_rectangleCI8( &NOW_DISP, VTX_mess_txt, VTX_mess_txttlut,
			  32, 32,
			  bsXpos[i],bsYpos[i],
			  2.1f, 1.9f );
#endif

    rcpsetmode( &NOW_DISP, RECT_RGBA_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );

    for( j=0; j<4; j++ ) {
	texture_rectangleCI4( &NOW_DISP,
 			      VTX_player_waku_txt+(80*16*j)/2,
			      VTX_player_waku_txttlut,
			      80, 16,
			      bsXpos[i],bsYpos[i]+(16.0f*j),
			      1.0f, 1.0f );
    }
    texture_rectangleCI4( &NOW_DISP,
			  VTX_player_waku_txt+(80*16*4)/2,
			  VTX_player_waku_txttlut,
			  80, 7,
			  bsXpos[i],bsYpos[i]+(16.0f*4),
			  1.0f, 1.0f );


#if 0
    if( VsGameFlushMask[i] && SelectEnd != 0x0f ) {
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
	for( j=0; j<2; j++ ) {
	    texture_rectangleCI4( &NOW_DISP, VTX_playerback_txt,
				  VTX_playerback_txttlut,
				  16, 1,
				  bsXpos[i]-2.0f,bsYpos[i]+wakuY00[j],
				  4.4f, 2.0f );
	    
	    texture_rectangleCI4( &NOW_DISP, VTX_playerback_txt,
				  VTX_playerback_txttlut,
				  16, 1,
				  bsXpos[i]+wakuX01[j],bsYpos[i],
				  0.1f, 60.3f );
	}
    }
#endif
}

/************************************************************************/
/* コントローラか接続されているしるしの描画				*/
/************************************************************************/
static void PikaPika_display( int i, PIKA *pika )
{
    float res0,res1;

    if( Key_switch[i] == OFF ) return;

    res0 = add_calc( &(pika->NowXp), pika->NextXp, 1.0f, 0.7f, 0.1f );
    res1 = add_calc( &(pika->NowYp), pika->NextYp, 1.0f, 0.7f, 0.1f );

    push_now2();
    rcpsetmode( &NOW_DISP, TEXTURE_A );

    translate_now( pika->NowXp, pika->NowYp, -50.0f, MULT_MTX);

    scale_now( pika->Scl, pika->Scl, 1.0f, MULT_MTX);
    rotateZ_now(ANGLE(PikaZa), MULT_MTX);

    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, VTX_pika );
    pull_now();

    if( res0 == 0.0f && res1 == 0.0f ) {
	pika->Ptr += 1;
	if( pika->Ptr > 3 ) {
	    pika->Ptr = 0;
	    pika->NowXp = PikaStPos[i].x;
	    pika->NowYp = PikaStPos[i].y;
	    pika->NextXp = PikaStPos[i].x + PikaMvPos[i][pika->Ptr].x;
	    pika->NextYp = PikaStPos[i].y + PikaMvPos[i][pika->Ptr].y;
	    pika->Stp = 0.08f;
	    pika->Scl = 0.031f;
	    pika->Max = 0.18f;
	    pika->Max2 = 0.12f;
	    pika->Min = 0.03f;
	} else {
	    if( pika->Ptr > 1 ) {
		pika->Max -= 0.04f;
		pika->Min -= 0.01f;
		pika->Scl = pika->Max2;
	    }
	    pika->NextXp = PikaStPos[i].x +
		PikaMvPos[i][PikaMvTbl[pika->Bunki][pika->Ptr]].x;
	    pika->NextYp = PikaStPos[i].y +
		PikaMvPos[i][PikaMvTbl[pika->Bunki][pika->Ptr]].y;
	}
    }

    if( pika->Scl >= 0.18f ) {
	pika->Max = pika->Max2;
	if( pika->Reverse == ON ) 
	    pika->Scl = pika->Max;
	else
	    pika->Scl = -(pika->Min);
    }

    if( pika->Scl >= pika->Max ) {
	pika->Stp = -(pika->Min);
	pika->Scl = pika->Max;
    } else if( pika->Scl <= (pika->Min) ) {
	pika->Stp = (pika->Min);
    }
    pika->Scl += pika->Stp;

    pika->Time++;

//    PRINTF( "i:%d sc:%f max:%f min:%f\n",i,pika->Scl,pika->Max,pika->Min );

#if 0
{
#if 0
    static float xs=0.15f,ys=0.15f;
    static float px=0.0f,py=0.0f;
    if ( Key_T[0].button & CONT_UP ) {
	xs += 0.01f;
	ys += 0.01f;
    }
    if ( Key_T[0].button & CONT_DOWN ) {
	xs -= 0.01f;
	ys -= 0.01f;
    }
#endif
    if ( Key[1].button & CONT_F ) {
	Pika->NowXp += 0.1f;
    }
    if ( Key[1].button & CONT_C ) {
	Pika->NowXp -= 0.1f;
    }
    if ( Key[1].button & CONT_E ) {
	Pika->NowYp -= 0.1f;
    }
    if ( Key[1].button & CONT_D ) {
	Pika->NowYp += 0.1f;
    }

    PRINTF( "x:%f y:%f\n",Pika->NowXp,Pika->NowYp );
}
#endif
}

/************************************************************************/
/* "スタートボタンでつぎへ"の描画					*/
/************************************************************************/
static void PushNext_display( void )
{
    float flush_g[2],flush_b[2];
    int ret;

    rectangle_rgba_a_prim();

    ColorFlush( &ChgColor, 0.3f );
    flush_g[NextMenuNum] = ChgColor;
    flush_b[NextMenuNum] = ChgColor;
    flush_g[!NextMenuNum] = 0xff;
    flush_b[!NextMenuNum] = 0xff;


    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, flush_g[0], flush_b[0], 0xff );
    texture_rectangleCI4( &NOW_DISP, VTX_mess60_txt,VTX_mess60_txttlut,
			  128, 10,
			  110.0f,188.0f,
			  1.0f, 1.0f );

    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, flush_g[1], flush_b[1], 0xff );
    texture_rectangleCI4( &NOW_DISP, VTX_mess44a_txt,VTX_mess44a_txttlut,
			  128, 14,
			  92.0f,204.0f,
			  1.0f, 1.0f );

#if 0
{
    static int p = 0;
    static float xp[2]={0.0f,0.0f},
	         yp[2]={0.0f,0.0f};

    if ( Key_T[1].button & CONT_L ) {
	p++;
	if( p > 1 ) p = 0;
    }
    if ( Key[1].button & CONT_F ) {
	xp[p] += 1.0f;
    }
    if ( Key[1].button & CONT_C ) {
	xp[p] -= 1.0f;
    }
    if ( Key[1].button & CONT_E ) {
	yp[p] -= 1.0f;
    }
    if ( Key[1].button & CONT_D ) {
	yp[p] += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",p,xp[p],yp[p] );
}
#endif
}
/************************************************************************/
/* ＶＳゲームをやるにあたっての注意の描画				*/
/************************************************************************/
static void VsCaution_display( void )
{
    rectangle_rgba_a_prim();
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
    texture_rectangleCI4( &NOW_DISP, VTX_mess64_txt,VTX_mess64_txttlut,
			  96,13,
			  117.0f,28.0f,
			  1.0f, 1.0f );

#if 0
{
    static float xp=0.0f,
	         yp=0.0f;

    if ( Key[1].button & CONT_F ) {
	xp += 1.0f;
    }
    if ( Key[1].button & CONT_C ) {
	xp -= 1.0f;
    }
    if ( Key[1].button & CONT_E ) {
	yp -= 1.0f;
    }
    if ( Key[1].button & CONT_D ) {
	yp += 1.0f;
    }

    PRINTF( "x:%f y:%f\n",xp,yp );
}
#endif
}
/************************************************************************/
/* "スタートボタンでつぎへ"の描画					*/
/************************************************************************/
static void PushNextB_display( void )
{
    rectangle_rgba_a_prim();
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );

    texture_rectangleCI4( &NOW_DISP, VTX_mess44a_txt,VTX_mess44a_txttlut,
			  128, 14,
			  92.0f,204.0f,
			  1.0f, 1.0f );
#if 0
{
    static int p = 0;
    static float xp[2]={0.0f,0.0f},
	         yp[2]={0.0f,0.0f};


    if ( Key_T[1].button & CONT_L ) {
	p++;
	if( p > 1 ) p = 0;
    }
    if ( Key[1].button & CONT_F ) {
	xp[p] += 1.0f;
    }
    if ( Key[1].button & CONT_C ) {
	xp[p] -= 1.0f;
    }
    if ( Key[1].button & CONT_E ) {
	yp[p] -= 1.0f;
    }
    if ( Key[1].button & CONT_D ) {
	yp[p] += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",p,xp[p],yp[p] );
}
#endif
}


#endif







