/************************************************************************
 *									*
 *	NU64 スターフォックス	マップ処理  			        *
 *									*
 ************************************************************************/
#include "fox_all.h"
#include "fox_map_poly.h"
#include "fox_main.h"
#include "fox_std_dma.h"
#include "fox_moji_poly.h"
#include "fox_fade.h"
#include "../audio/audio_game.h"
#include "fox_eeprom.h"

//#define MAP_DEBUG
//#define SPECIAL

#define OBJ_N (14-1)
#define MAP_ITM (16-1)
#define ROCKS_ITM (42)
#define End  (0xff)
#define INIT (2)

#define IN  (0)
#define OUT (1)

#define MAP_PROLOGUE (0)
#define MAP_EYECATCH (1)
#define CAM_ZOOM (2)
#define CAM_NOMV (3)
#define GO_GAME  (4)
#define RET_GAME  (5)
#define SEL_STAGE (6)
#define MAP_GAMEOVER (7)

#define LINES (24)

#define MP_AS  (0) 	/* メテオ */
#define MP_A6  (1) 	/* エリア６ */
#define MP_BO  (2) 	/* ボルス */
#define MP_SZ  (3) 	/* セクターＺ */
#define MP_SX  (4) 	/* セクターＸ */
#define MP_SY  (5) 	/* セクターＹ */
#define MP_KT  (6) 	/* カタリナ */
#define MP_MC  (7) 	/* マクベス */
#define MP_ZO  (8) 	/* ゾネス */
#define MP_CN  (9)	/* コーネリア */
#define MP_TI (10) 	/* タイタニア */
#define MP_AC (11) 	/* アクエリア */
#define MP_FO (12) 	/* フォーチュナ */
#define MP_BM (13) 	/* ベノム */
#define MP_SN (14) 	/* 太陽 */

#define KUMO  (8) 	/* 雲 */

#define MP_FACE_PEPPER	(10)
#define MP_FACE_FOX	(20)

#define STAGE_IN    (0)
#define KUNSYOU_GET (1)
#define STAGE_CLEAR (2)

/*----------------------------------------------------------------------*/
/* 構造体								*/
/*----------------------------------------------------------------------*/
typedef struct {
    int   plno;   /* 惑星データ No. */
    float Xrange; /* 太陽からの距離 X */
    float Yrange; /* 太陽からの距離 Y */
    float Zang;   /* 自転軸の傾き Z */

    float Xpos;   /* 惑星のX座標 */
    float Ypos;   /* 惑星のY座標 */
    float Zpos;   /* 惑星のZ座標 */
    float Yang2;  /* 公転軌道の角度 Y */

    float scale;  /* スケール値 */
    int PrimCol;  /*  */
    int flag;	  /* 0:惑星 1:アイコン */

    int NextPlanetNm;	/* 次の惑星(通常) */
    int NextPlanetSp;	/* 次の惑星(分岐) -1:分岐なし */
    int NextPlanetWp;	/* 次の惑星(ワープ分岐) -1:分岐なし */
} PLANET;

typedef struct {
    int   LineCol; 	/* ラインの色 No. */
    int   startP;  	/* 開始惑星 No. */
    int   endP;    	/* 終了惑星 No. */
    int   dots;
    int   flag;    	/* 0:ライン非表示  1:ライン表示 */
    int   KowinFlag;    /* 0:非表示  1:表示 */
    int   PrimCol;
} LINE;

typedef struct {
    float Yang2;  /* 公転軌道の角度 Y */
    float Xrange; /* 太陽からの距離 X */
    float Yrange;
    float scale;  /* スケール値 */
} POSDATA2;

typedef struct {
    int  Before_st;
    int  Now_st;
    u16 *mess[2];
} MESS;

typedef struct {
    unsigned char *txt;
    int sizX;
    int sizY;
    float posX;
} TEX;

/*----------------------------------------------------------------------*/
/* 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[];

/* 惑星ベノムのあやしいガスのTexture */
extern unsigned char MAP_benom_gass1_txt[];
extern unsigned char MAP_benom_gass1_S_txt[];

/* スコア */
extern int total_score;
extern int game_score;

/* 戻ってくる前がステージクリアからかゲームオーバーか？ */
extern u16 before_mode;

extern int title_return;
extern int wip_stat;
extern int wip_time;

extern void star_initial_set( void );
extern void waku_display( void );
extern int keta_ck( int );
extern void line_ex2_display( int );

extern void draw_back_star2( int, int );

extern u16 **msg_TBL_ad;
extern int msg_ptr;
extern int mojiXp,mojiYp;


/* ボムの残数 */
extern int Bomb_Count[4];

void A_Display(A_WING_STAT *);  /* アーウイン描画 */

void draw_ZankiSuu( int, int, int );
int GetNameDots( char * );
extern void puts_evo(
    Gfx		**,
    unsigned short *,
    int,
    int,
    int,
    int,
    int
);

extern void get_rank_data( void );

int msglen2( unsigned short * );

/*----------------------------------------------------------------------*/
/* static								*/
/*----------------------------------------------------------------------*/
static void map_main( void );
static void map_init( void );

static BackStarInit( void );
static void map_init_fromGame( void );
static void map_init_fromMenu( void );
static void map_init_fromOver( void );
static void NowStage_disp( void );
static void NakamaStatSet( void );
static void NowStageCameraSet( void );
static void ClearRootLineInit( void );
static void BakuSwCtrl( void );

static void draw_awing( void );

static int get_HiScore( void );

static void get_planet_pos( void );
static void map_fade( void );

static void KeyIn( void );
static void KeyMap( void );
static void game_start( void );
static void zoom_start( void );

static void prologue( void );
static void draw_prologue( void );


static void draw_planet_main( int );
static void draw_planet_sub( int );
static void draw_planet( int );
static void draw_kumo( int );
static void draw_sun2( int );
static void draw_planet_kage( int );
static void draw_planet_ring1( int );
static void draw_planet_ring2( int );
static void draw_bm_gass( float *, float, float );
static void draw_knsyou( int );
static void draw_knsyou2( int );
static void draw_knsyou_sub( int );
//static void draw_GetKnsyou( void );

static void draw_cursor( void );
static void get_cursor_Yrange( void );

static void draw_rocks( void );
static void draw_senkan( void );
static void draw_eye_catch( void );
static void draw_wip( void );

static void draw_moji( void );
static void draw_StageName( void );
static void draw_rect( void );
static void draw_Score( void );

static void draw_PlayRootArea( int );
static void draw_PlayRootStageInfo( int, float, float, int );
static void draw_PlayRootStage( int, float, float, int );

void draw_PlayRoot( int );
//void draw_PlayRootPlanet( float );
void draw_PlayRootPlanetKunsyou( float, float, float );

static void draw_kowin_main( int );
static void draw_kowin( int );
static void draw_kirakira( int );

static void draw_bomb( void );
//static void draw_OverBomb( void );

static void draw_BakuhatuL( void );
static void draw_BakuhatuS( int,int );

static void angle_hosei( void );

static void move_camera_init( void );
static void camera_zoom( void );

static void move_camera( float );
static void move_waypoint( float );
static void zoom_camera( void );
static void wip( void );

static void ZoomOutCamera( void );
static void ZoomOutCameraInit( void );
static void CameraZoomOutMain( void );
static void CameraZoomOut( float );

//static void ZoomOutCamera2Init( void );
//static void ZoomOutCamera2( void );
static void draw_gameover( void );

static void map_gameover( void );
static void GameOverDispCtrl( void );
static void StageRootDispCtrl( void );

static void get_cam_rotate_pos( float, float, float,
				float *, float *, float *,
				float, float, float );

static void eye_catch( void );
static void planetZsort( void );

static void StageNoSet( void );
static int misson_pass_check( int );
static float GetCamZoffset( int );
static int GetPlanetNum( int );
static int GetPlanetLine( int,int );

static void map_message_ad_set( void );
static void map_face_display( void );
static void map_face_display_sub( int );

static void draw_line( int );
static void line_pos_calc( int, xyz_t *, xyz_t * );

static int peper_anime( void );
static void peper_display( void );
static void draw_batu( int,int );

static void menu_ctrl( void );
static void MenuKeyIn( void );
static void menu_ctrl_sub( int );

static void EndGame( void );
static void RetryStage( void );
static void ChageCourse( void );
static void menu_display( void );
static int keyin_move_cur( void );

static void SoundModeChange( int );

static int KunsyouDispCheck( int );

static int SaveDataSet( int,int );

void texture_circle( unsigned char *,
		     unsigned char *,
		     float * );

void moji_number( int, int, int );

static void get_splin_pos( xyz_t *, xyz_t *, xyz_t *, float t );

//static void camera_ajust( void );
//static void just_camera( float, float, float, float );
//static void draw_dot( int );
//static void draw_dot2( void );
//static void pos_calc( int, xyz_t *, xyz_t * );

//static void draw_rocks( float,float,float );
//static void draw_prominens( void );
//static void draw_prominens_sub( int,float,float,float,float,int );
//static void bg_scroll( xyz_t,xyz_t );
//static void bg_scroll_2( xyz_t );
//static void lighting( int );
//static void OpenWindow_display( void );

static int KaoList[2] = { MP_FACE_PEPPER, MP_FACE_FOX };
#if 1
static u16 *MessList[MAP_ITM][2] = {
    /* メテオ */
    {msg_01220,msg_01230}, 
    /* エリア６ */
    {msg_01320,msg_01330},
    /* ボルス */
    {msg_01300,msg_01310},
    /* セクターＺ */
    {msg_01420,msg_01430},
    /* セクターＸ */
    {msg_01260,msg_01270},
    /* セクターＹ */
    {msg_01440,msg_01450},
    /* カタリナ */
    {msg_01360,msg_01370},
    /* マクベス */
    {msg_01340,msg_01350},
    /* ゾネス */
    {msg_01400,msg_01410},
    /* コーネリア */ 
    {msg_01200,msg_01210},
    /* タイタニア */
    {msg_01240,msg_01250},
    /* アクアス */
    {msg_01380,msg_01390},
    /* フォーチュナ */
    {msg_01280,msg_01290},
    /* */
    {NULL,NULL},
    /* 太陽 */
    {msg_01460,msg_01470},
};
#else
static MESS MessList[23] = {
    /* メテオ */
    { MP_CN,MP_AS,{msg_01220,msg_01230} }, 
    /* エリア６ (SZから来たとき) */
    { MP_SZ,MP_A6,{msg_01440,msg_01450} },
    /* エリア６ (MCから来たとき) */
    { MP_MC,MP_A6,{msg_01435,msg_01436} },
    /* ボルス (TIから来たとき) */
    { MP_TI,MP_BO,{msg_01380,msg_01390} },
    /* ボルス (MCから来たとき) */
    { MP_MC,MP_BO,{msg_01400,msg_01410} },
    /* ボルス (SZから来たとき) */
    { MP_SZ,MP_BO,{msg_01420,msg_01430} },
    /* セクターＺ (ZOから来たとき) */
    { MP_ZO,MP_SZ,{msg_01340,msg_01350} },
    /* セクターＺ (SXから来たとき) */
    { MP_SX,MP_SZ,{msg_01320,msg_01330} },
    /* セクターＸ(FOから来たとき) */
    { MP_FO,MP_SZ,{msg_01260,msg_01270} },
    /* セクターＸ(KTから来たとき) */
    { MP_KT,MP_SX,{msg_01275,msg_01276} },
    /* セクターＹ */
    { MP_CN,MP_SY,{msg_01280,msg_01290} },
    /* カタリナ (SYから来たとき) */
    { MP_SY,MP_KT,{msg_01493,msg_01494} },
    /* カタリナ (ASから来たとき) */
    { MP_AS,MP_KT,{msg_01491,msg_01492} },
    /* マクベス (SXから来たとき) */
    { MP_SX,MP_MC,{msg_01451,msg_01452} },
    /* マクベス (SNから来たとき) */
    { MP_SN,MP_MC,{msg_01460,msg_01470} },
    /* マクベス (ZOから来たとき) */
    { MP_ZO,MP_MC,{msg_01480,msg_01490} },
    /* ゾネス */
    { MP_AC,MP_ZO,{msg_01497,msg_01498} },
    /* コーネリア */ 
    { -1,   MP_CN,{msg_01200,msg_01210} },
    /* タイタニア */
    { MP_SX,MP_TI,{msg_01240,msg_01250} },
    /* アクアス */
    { MP_SY,MP_AC,{msg_01495,msg_01496} },
    /* フォーチュナ */
    { MP_AS,MP_FO,{msg_01360,msg_01370} },
    /* 太陽 (FOから来たとき) */
    { MP_FO,MP_SN,{msg_01315,msg_01316} },
    /* 太陽 (KTから来たとき) */
    { MP_KT,MP_SN,{msg_01300,msg_01310} },
};
#endif

static PLANET planet[MAP_ITM]={
  /* アステロイド */
  { 0, 1150.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f, -130.0f,  1.0f, 0x00, 0, MP_FO,-1,MP_KT },
  /* エリア６ */
  { 1, 1400.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f, -315.0f,  0.15f, 0x00, 2, -1,-1,-1 },
  /* ボルス */
  { 2, 1400.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f, -345.0f,  0.15f, 0x00, 2, -1,-1,-1 },
  /* セクターＺ */
  { 3, 1125.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f, -285.0f, 2.5f*2.0f, 0x00, 1, MP_BO,MP_A6,-1 },
  /* セクターＸ */
  { 4, 750.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f,  -60.0f, 2.5f*2.0f, 0x00, 1, MP_TI,MP_MC,MP_SZ },
  /* セクターＹ */
  { 5, 1125.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f, -190.0f, 2.5f*2.0f, 0x00, 1, MP_KT,MP_AC,-1 },
  /* カタリナ */
  { 6, 750.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f, -150.0f,  2.5f, 0x00, 4, MP_SX,MP_SN,-1 },
  /* マクベス */
  { 7, 825.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f, -330.0f,  2.5f, 0x00, 4, MP_BO,MP_A6,-1 },
  /* ゾネス */
  { 8, 900.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f, -260.0f,  2.5f, 0x00, 4, MP_MC,MP_SZ,-1 },
  /* コーネリア */
  { 9, 1500.0f, 0.0f, 10.0f,  0.0f, 0.0f, 0.0f, -150.0f,  5.0f, 0x00, 4, MP_AS,MP_SY,-1 },
  /* タイタニア */
  { 10,975.0f, 0.0f, -10.0f,  0.0f, 0.0f, 0.0f, -375.0f,  2.5f, 0x00, 4, MP_BO,-1,-1 },
  /* アクエリア */
  { 11,900.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f,  -220.0f,  2.5f, 0x00, 4, MP_ZO,-1,-1 },
  /* フィチナ */
  { 12,975.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -105.0f,  2.5f, 0x00, 4, MP_SX,MP_SN,-1 },
  /* ベノム */
  { 13,1800.0f, 0.0f, 0.0f,  0.0f, 0.0f, 0.0f, -330.0f, 9.0f, 0x00, 4, -1,-1,-1 },
  /* 太陽 */
  { 14,  0.0f, 0.0f, 0.0f,   0.0f, 0.0f, 0.0f,    0.0f,  10.0f, 0x00, 3, MP_MC,-1,-1 },
};

/* TEST */
/* 惑星手動選択用テーブル */
static int StageList[] = {
    MP_CN,	/* コーネリア */
    MP_AS, 	/* アステロイド */
    MP_TI, 	/* タイタニア */
    MP_SX, 	/* セクターＸ */
    MP_AC, 	/* アクエリア */
    MP_BO, 	/* 防衛衛星 */
    MP_BM, 	/* ベノム */
    MP_FO, 	/* フォーチュナ */
    MP_A6, 	/* ミサイル群 */
    MP_MC, 	/* マクベス */
    MP_SZ, 	/* セクターＺ */
    MP_ZO, 	/* ゾネス */
    MP_KT, 	/* カタリナ */
    MP_SY, 	/* セクターＹ */
    MP_SN, 	/* 太陽 */
};

static Gfx *bombs[4]={
    MAP_ex01,
    MAP_ex02,
    MAP_ex03,
    MAP_ex04,
};

static TEX stage_name[] = {
    { MAP_CNname_txt,128,28, 91.0f },
    { MAP_ASname_txt, 96,28,110.0f },
    { MAP_SYname_txt,120,13, 93.0f },
    { MAP_FOname_txt,168,28, 71.0f },
    { MAP_KTname_txt,168,28, 71.0f },
    { MAP_ACname_txt, 88,28,111.0f },
    { MAP_SXname_txt,120,13, 94.0f },
    { MAP_SNname_txt,112,13,106.0f },
    { MAP_ZOname_txt, 96,28,106.0f },
    { MAP_TIname_txt, 96,28,106.0f },
    { MAP_MCname_txt,144,28, 83.0f },
    { MAP_SZname_txt,120,13, 94.0f },
    { MAP_BOname_txt, 88,28,112.0f },
    { MAP_CLname_txt, 96,28,106.0f },
};
static TEX stage_title[] = {
    { MAP_CNtitle_txt,232,19, 46.0f },
    { MAP_AStitle_txt,208,19, 56.0f },
    { MAP_SYtitle_txt, 88,19,114.0f },
    { MAP_FOtitle_txt,168,19, 75.0f },
    { MAP_KTtitle_txt,128,19, 99.0f },
    { MAP_ACtitle_txt,208,19, 55.0f },
    { MAP_SXtitle_txt,144,19, 86.0f },
    { MAP_SNtitle_txt,112,19,104.0f },
    { MAP_ZOtitle_txt,184,19, 71.0f },
    { MAP_TItitle_txt, 88,18,113.0f },
    { MAP_MCtitle_txt,128,19, 97.0f },
    { MAP_SZtitle_txt,184,19, 72.0f },
    { MAP_BOtitle_txt, 88,19,113.0f },
    { MAP_CLtitle_txt,112,19,104.0f },
};

static char *pl_sname[] = {
    "メテオ",
    "エリア６",
    "ボルス",
    "セクターＺ",
    "セクターＸ",
    "セクターＹ",
    "カタリナ",
    "マクベス",
    "ゾネス",
    "コーネリア",
    "タイタニア",
    "アクアス",
    "フィチナ",
    "ベノム",
    "ソーラ",
};

static int pep_kao_f;
static Gfx *pep_kao[2]={
    MAP_pep02a,
    MAP_pep02b,
};

static POSDATA2 posData2[ROCKS_ITM] = {
{ -491.000000f, 1170.000000f, 20.000000f, 0.710000f },
{ -488.000000f, 1135.000000f, 15.000000f, 0.600000f },
{ -496.000000f, 1090.000000f, 0.000000f, 0.500000f },
{ -489.000000f, 1200.000000f, 0.000000f, 0.600000f },
{ -489.000000f, 1150.000000f, -15.000000f, 0.800000f },
{ -487.000000f, 1143.000000f, -15.000000f, 0.800000f },
{ -493.000000f, 1182.000000f, -20.000000f, 0.900000f },
{ -491.000000f, 1080.000000f, -25.000000f, 0.800000f },
{ -497.000000f, 1114.000000f, -25.000000f, 0.700000f },
{ -497.000000f, 1164.000000f, -20.000000f, 0.900000f },
{ -485.000000f, 1206.000000f, 15.000000f, 1.100000f },
{ -488.000000f, 1213.000000f, -20.000000f, 1.100000f },
{ -485.000000f, 1257.000000f, 0.000000f, 1.100000f },
{ -491.000000f, 1213.000000f, -20.000000f, 0.900000f },
{ -484.000000f, 1295.000000f, 0.000000f, 0.800000f },
{ -487.000000f, 1277.000000f, 20.000000f, 0.800000f },
{ -485.000000f, 1310.000000f, 25.000000f, 0.700000f },
{ -485.000000f, 1331.000000f, 0.000000f, 0.800000f },
{ -493.000000f, 1118.000000f, 15.000000f, 0.800000f },
{ -494.000000f, 1068.000000f, 30.000000f, 0.600000f },
{ -504.000000f, 1018.000000f, -30.000000f, 0.500000f },
{ -492.000000f, 1071.000000f, -10.000000f, 0.600000f },
{ -494.000000f, 1164.000000f, -10.000000f, 0.500000f },
{ -498.000000f, 1091.000000f, 0.000000f, 0.500000f },
{ -493.000000f, 1082.000000f, 0.000000f, 0.600000f },
{ -498.000000f, 1141.000000f, 15.000000f, 0.700000f },
{ -498.000000f, 1034.000000f, 15.000000f, 0.700000f },
{ -504.000000f, 1041.000000f, 20.000000f, 0.800000f },
{ -507.000000f, 1076.000000f, 25.000000f, 0.700000f },
{ -504.000000f, 1092.000000f, 0.000000f, 0.800000f },
{ -499.000000f, 1076.000000f, 20.000000f, 1.000000f },
{ -519.000000f, 1084.000000f, -15.000000f, 1.000000f },
{ -506.000000f, 1133.000000f, 20.000000f, 1.100000f },
{ -502.000000f, 1144.000000f, 0.000000f, 1.000000f },
{ -514.000000f, 1109.000000f, -10.000000f, 0.900000f },
{ -521.000000f, 1136.000000f, -20.000000f, 0.800000f },
{ -511.000000f, 1052.000000f, 20.000000f, 0.800000f },
{ -515.000000f, 1142.000000f, -25.000000f, 0.600000f },
{ -518.000000f, 1138.000000f, -20.000000f, 0.800000f },
{ -512.000000f, 1099.000000f, -15.000000f, 0.500000f },
{ -523.000000f, 1179.000000f, -30.000000f, 0.700000f },
{ -519.000000f, 1176.000000f, -30.000000f, 0.500000f },
};

static POSDATA2 Erea6Data[4] = {
{ 50.000000f, 1410.000000f, 40.000000f, 0.100000f },
{ 35.000000f, 1235.000000f, 40.000000f, 0.030000f },
{ 42.000000f, 1270.000000f, 60.000000f, 0.050000f },
{ 35.000000f, 1280.000000f, 20.000000f, 0.050000f },
};

static LINE Line[LINES]={
/*** Level 1 ***/
	/* 1 */
/* 0 */	{ 0, MP_CN, MP_AS, 5, 0, 0, 0 }, /* コーネリア -> アステロイド */
	/* 2 */
/* 1 */	{ 0, MP_AS, MP_FO, 5, 0, 0, 0 }, /* メテオ -> フィチナ */
	/* 3 */
/* 2 */	{ 0, MP_FO, MP_SX, 5, 0, 0, 0 }, /* フィチナ -> セクターＸ */
	/* 4 */
/* 3 */	{ 0, MP_SX, MP_TI, 5, 0, 0, 0 }, /* セクターＸ -> タイタニア */
	/* 5 */
/* 4 */	{ 0, MP_TI, MP_BO, 5, 0, 0, 0 }, /* タイタニア -> ボルス */
	/* 6 */
/* 5 */	{ 0, MP_KT, MP_SX, 5, 0, 0, 0 }, /* カタリナ -> セクターＸ */
	/* 7 */
/* 6 */	{ 0, MP_MC, MP_BO, 5, 0, 0, 0 }, /* マクベス -> ボルス */
	/* 8 */
/* 7 */	{ 0, MP_SZ, MP_BO, 5, 0, 0, 0 }, /* セクターＺ -> ボルス */
	/* 9 */
/* 8 */	{ 0, MP_BO, MP_BM, 5, 0, 0, 0 }, /* ボルス -> ベノム */

/*** Level 2 ***/
	/* 1 */
/* 9 */	{ 1, MP_SY, MP_KT, 5, 0, 0, 0 }, /* セクターＹ -> カタリナ */
	/* 2 */
/* 10*/	{ 1, MP_KT, MP_SN, 5, 0, 0, 0 }, /* カタリナ -> 太陽 */
	/* 3 */
/* 11*/	{ 1, MP_SN, MP_MC, 5, 0, 0, 0 }, /* 太陽 -> マクベス */
	/* 4 */
/* 12*/	{ 1, MP_SX, MP_MC, 5, 0, 0, 0 }, /* セクターＸ -> マクベス */
	/* 5 */
/* 13*/	{ 1, MP_FO, MP_SN, 5, 0, 0, 0 }, /* フィチナ -> 太陽 */
	/* 6 */
/* 14*/	{ 1, MP_ZO, MP_MC, 5, 0, 0, 0 }, /* ゾネス -> マクベス */

/*** Level 3 ***/
	/* 1 */
/* 15*/	{ 2, MP_CN, MP_SY, 5, 0, 0, 0 }, /* コーネリア -> セクターＹ */
	/* 2 */
/* 16*/	{ 2, MP_SY, MP_AC, 5, 0, 0, 0 }, /* セクターＹ -> アクエリア */
	/* 3 */
/* 17*/	{ 2, MP_AC, MP_ZO, 5, 0, 0, 0 }, /* アクエリア -> ゾネス */
	/* 4 */
/* 18*/	{ 2, MP_ZO, MP_SZ, 5, 0, 0, 0 }, /* ゾネス -> セクターＺ */
	/* 5 */
/* 19*/	{ 2, MP_SZ, MP_A6, 5, 0, 0, 0 }, /* セクターＺ -> エリア６ */
        /* 7 */
/* 20*/	{ 2, MP_MC, MP_A6, 5, 0, 0, 0 }, /* マクベス -> エリア６ */
        /* 8 */
/* 21*/	{ 2, MP_A6, MP_BM, 5, 0, 0, 0 }, /* エリア６ -> ベノム */

/** ワープ **/
/* 22*/	{ 3, MP_AS, MP_KT, 5, 0, 0, 0 }, /* メテオ -> カタリナ */
/* 23*/	{ 4, MP_SX, MP_SZ, 10, 0, 0, 0 }, /* セクターＸ -> セクターＺ */

};

static float YrngBase[MAP_ITM] = {
    90.0f,	/* メテオ */
    170.0f,	/* エリア６ */
    130.0f,	/* ボルス */
    100.0f,	/* セクターＺ */
    100.0f,	/* セクターＸ */
    100.0f,	/* セクターＹ */
    80.0f, 	/* カタリナ */
    80.0f, 	/* マクベス */
    80.0f, 	/* ゾネス */
    150.0f,	/* コーネリア */
    80.0f, 	/* タイタニア */
    80.0f, 	/* アクエリア */
    80.0f, 	/* フォーチュナ */
    270.0f,	/* ベノム */
    250.0f,	/* 太陽 */
};

char MAP_CN1_txt[96*96];
char MAP_FO1_txt[96*96];
char MAP_AC1_txt[96*96];
char MAP_BM1_txt[96*96];
char MAP_TI1_txt[96*96];
char MAP_KT1_txt[96*96];
char MAP_MC1_txt[96*96];
char MAP_ZO1_txt[96*96];
char MAP_KUMO1_txt[96*96];
float PlaLoopPtF[9];

static int hi_score;

static int LineDrawTbl[LINES];
static int drawIdxT[MAP_ITM];
static int OverRootLine[7];
static int KunsyouAcol[MAP_ITM];

static int StageWayWork;

static int messPt;

static int map_phase;
static int process_phase;
static int work_phase;

static int NowStageWk;	/* 現在またはクリアーしたステージ (WORK) */
static int NowStage;    /* 現在またはクリアーしたステージ */
static int NextStage;   /* 次のステージ */

static int flush_cnt;
static int fade_sw;
static int moji_sw;
static int moji_sw2;
static int draw_sw;
static int prim_col;
static int line_sw;
static int rect_sw;
static int cursor_sw;
static int FirstClearSw;
static int FirstClearA;
static int FlushCnt;
static int KunsyouGetSw;
static int KunsyouGetStat;
static int KunsyouGetA;
static int KunsyouGetA2;
static float KunsyouGetXr;
static int msg_sp;
//static int msg_time;
static int moji_end;
static int MissonPass;

//static int KunsyouGetDispSw;
//static int Kunsyou2DispSw;

static int StageCnt;

static float cam_sp;
static float cam_sp1;

static int wait_time;
static int wait_time2;
static int wait_time3;
static int Time;
static int Time2;

static int bomb_stat;
static int bomb_p;
static int over_f;
static int zoom_end_f;

static float ProMesX;
static float ProMesY;
static float ProMesA,ProMesAA;
static float ProMesYSpd;
static int PicPtr;

static float EyeX,EyeY,EyeZ;
static float WayX,WayY,WayZ;
static float CamXa,CamYa,CamZr;
static float CamXaAdd,CamYaAdd;
//static float CamXaAddStep;

static float vX,vY,vZ;
static float WWwayX,WWwayY;
static float WeyeX,WeyeY;
static xyz_t Wway,Weye;

static MtxF planet_Mtx[MAP_ITM];
static MtxF planet2_Mtx[MAP_ITM];
static MtxF knsyou_Mtx[MAP_ITM];
static MtxF knsyou2_Mtx[MAP_ITM];
static xyz_t PlanetPos[MAP_ITM];
static float knsyouZpos[MAP_ITM];

static float stop_ptr;
static float stX,stY,stZ;
static float camsp;
static float rrv;

static float StName_A;
static float StName_Asp;
static int faceAcol;

static float sclX,sclY;
static float scl2X,scl2Y;
static float pepX,pepY,pepZ;
static float pepYa;
static int litA;

static float eyect_A;
static float Prim1,Prim2;

static float curOffsetY;
static float curOffsetY_S;
static float curPosChg;

#if 0
static int KunStat[MAP_ITM][4];
static int KunA[MAP_ITM][4];
static float KunWait[MAP_ITM][4];
static float KunYrng[MAP_ITM][4];
static float KunZang[MAP_ITM][4];
static float KunScl[MAP_ITM][4];

static int KunStatP[7];
static float KunWaitP[7];
static float KunZangP[7];
static float KunSclP[7];
#endif

static float Kun2Zang[MAP_ITM];
static float Kun2Yang[MAP_ITM];

#if 0
static int KunsyouGetStat;
static int KunsyouGetA;
static float KunsyouGetZa1;
static float KunsyouGetZa2;
#endif

static int bakuLStat;
static int bakuLA;
static float bakuLScl;
static float bakuLWait;

static int bakuSSw[3];
static int bakuSStat[3][10];
static int bakuSA[3][10];
static float bakuSScl[3][10];
static float bakuSScl2[3][10];
static float bakuSRng[3][10];
static float bakuSZa[3][10];
static float bakuSWait[3][10];

static int dot_cnt;
static int kowin_stat;
static int kowin_A;
static int kirakiraA;
static xyz_t kowin;

static float BmGassZa1;
static float BmGassZa2;

static float bo_ya = 0.0f;
static float bo_xa = 0.0f;
static float cl_ya = 0.0f;
static float cl_xa = 0.0f;

static int pl_idx;
static int kumo_cnt;

static int line_no;
static int NextlineSP;
static int NextlineNM;

static int PointNum;
static float t,tsp;
static xyz_t eye[9],way[9];

static int MenuOpen_f;	/* メニューウインドウ表示 SW */
static int MenuWin_f;
static int CourseSel_f;	/* コース選択をしたか？ */
static int keyin_count;
static int course_sw;
static int psel;
static float psel_chg_col;
static float psel_col[3];
static float menu_chg_col;
static float menu_col;
static int psel_flush_cnt[3];
static int zanki_flush_cnt;

static int PlanetWmove;
static int PlanetTmove;

static int map_face_stat;

static float overX[8];
static float overY[8];
static float overZ[8];
static float overScl;
static float overXa[8];
static float overYa[8];
static float *overXad,*overYad,*overZad;
static int overTime[8];
static int overEnd[8];
static int overMoveSw;
static int overTurnPtr;
static int overSW;


#if 0
static int prom_time[100],
           ptn[100],
           dat[100];
static float ang1_dat[12],scl1_dat[12];
static float ang2_dat[50],scl2_dat[50];
#endif
//static int kan_col;
//static int lightR,lightG,lightB;
//static float sclX,sclY,sclZ,sclstp;
//static float rrv,rrvw;
//static int stage_clear_sw;
//static int dot_sw;
//static int dot_pcol;
//static float dot_scl;
//static int line_sw;


/*----------------------------------------------------------------------*/
/*									*/
/* 惑星texture球状加工データ						*/
/*									*/
/*----------------------------------------------------------------------*/
static int circle_dataX[] = {
    48- 9,48-13,48-16,48-18,48-21,48-22,48-24,48-26,
    48-27,48-28,48-30,48-31,48-32,48-33,48-34,48-35,
    48-36,48-36,48-37,48-38,48-39,48-39,48-40,48-40,
    48-41,48-42,48-42,48-42,48-43,48-43,48-44,48-44,
    48-44,48-45,48-45,48-45,48-45,48-46,48-46,48-46,
    48-46,48-46,48-46,48-46,48-46,48-46,48-47,
};

static int circle_data3[47][96] = {
{ 0,2,2,3,4,4,5,5,6,6,7,7,8,8,9,9,10,11, },
{ 0,2,3,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,15,16,17, },
{ 0,2,3,4,5,6,6,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,19,20,21, },
{ 0,2,4,5,5,6,7,7,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,21,22,23,24, },
{ 0,3,4,5,6,7,7,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,23,23,24,25,26,27,28, },
{ 0,3,4,5,6,7,7,8,9,9,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29, },
{ 0,3,4,5,6,7,8,9,9,10,10,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,27,27,28,29,30,31,32, },
{ 0,3,4,6,7,7,8,9,10,10,11,11,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,29,29,30,31,32,33,34,35, },
{ 0,3,5,6,7,8,8,9,10,10,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,29,29,30,31,31,32,33,34,35,37, },
{ 0,3,5,6,7,8,8,9,10,11,11,12,12,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,31,31,32,33,34,34,35,37,38, },
{ 0,3,5,6,7,8,9,10,10,11,12,12,13,13,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,33,33,34,35,35,36,37,38,39,41, },
{ 0,3,5,6,7,8,9,10,10,11,12,12,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,32,32,33,33,34,35,35,36,37,38,39,40,41,42, },
{ 0,3,5,6,7,8,9,10,11,11,12,13,13,14,14,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,35,35,36,37,37,38,39,40,41,42,44, },
{ 0,3,5,6,7,8,9,10,11,11,12,13,13,14,15,15,16,16,17,17,18,18,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,34,34,35,35,36,37,37,38,39,40,40,41,42,44,45, },
{ 0,3,5,6,7,8,9,10,11,12,12,13,14,14,15,15,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,37,37,38,39,39,40,41,42,43,44,45,47, },
{ 0,4,5,7,8,9,9,10,11,12,13,13,14,14,15,16,16,17,17,18,18,19,19,20,21,21,22,22,23,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,36,36,37,37,38,39,39,40,41,41,42,43,44,45,47,48, },
{ 0,4,5,7,8,9,10,10,11,12,13,13,14,15,15,16,16,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,39,39,40,41,41,42,43,44,45,46,47,48,50, },
{ 0,4,5,7,8,9,10,10,11,12,13,13,14,15,15,16,16,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,39,39,40,41,41,42,43,44,45,46,47,48,50, },
{ 0,4,5,7,8,9,10,11,11,12,13,14,14,15,15,16,17,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,38,38,39,39,40,41,41,42,43,43,44,45,46,47,48,49,51, },
{ 0,4,5,7,8,9,10,11,12,12,13,14,14,15,16,16,17,17,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,41,41,42,43,43,44,45,46,46,47,48,50,51,53, },
{ 0,4,6,7,8,9,10,11,12,12,13,14,15,15,16,16,17,18,18,19,19,20,20,21,22,22,23,23,24,24,25,25,26,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,40,40,41,41,42,43,43,44,45,45,46,47,48,49,50,51,52,54, },
{ 0,4,6,7,8,9,10,11,12,12,13,14,15,15,16,16,17,18,18,19,19,20,20,21,22,22,23,23,24,24,25,25,26,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,40,40,41,41,42,43,43,44,45,45,46,47,48,49,50,51,52,54, },
{ 0,4,6,7,8,9,10,11,12,13,13,14,15,15,16,17,17,18,18,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,43,43,44,45,45,46,47,47,48,49,50,51,52,54,56, },
{ 0,4,6,7,8,9,10,11,12,13,13,14,15,15,16,17,17,18,18,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,43,43,44,45,45,46,47,47,48,49,50,51,52,54,56, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,20,21,21,22,23,23,24,24,25,25,26,26,27,27,28,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,45,45,46,47,47,48,49,50,51,52,53,54,55,57, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,45,45,46,47,47,48,49,49,50,51,52,53,54,55,57,58, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,45,45,46,47,47,48,49,49,50,51,52,53,54,55,57,58, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,45,45,46,47,47,48,49,49,50,51,52,53,54,55,57,58, },
{ 0,4,6,7,8,10,11,11,12,13,14,15,15,16,17,17,18,19,19,20,20,21,21,22,22,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,44,44,45,45,46,47,47,48,49,49,50,51,52,52,53,54,55,57,58,60, },
{ 0,4,6,7,8,10,11,11,12,13,14,15,15,16,17,17,18,19,19,20,20,21,21,22,22,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,44,44,45,45,46,47,47,48,49,49,50,51,52,52,53,54,55,57,58,60, },
{ 0,4,6,7,9,10,11,12,12,13,14,15,15,16,17,17,18,19,19,20,20,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,49,49,50,51,51,52,53,54,55,56,57,58,59,61, },
{ 0,4,6,7,9,10,11,12,12,13,14,15,15,16,17,17,18,19,19,20,20,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,49,49,50,51,51,52,53,54,55,56,57,58,59,61, },
{ 0,4,6,7,9,10,11,12,12,13,14,15,15,16,17,17,18,19,19,20,20,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,49,49,50,51,51,52,53,54,55,56,57,58,59,61, },
{ 0,4,6,7,9,10,11,12,13,13,14,15,16,16,17,18,18,19,20,20,21,21,22,22,23,23,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,58,59,61,63, },
{ 0,4,6,7,9,10,11,12,13,13,14,15,16,16,17,18,18,19,20,20,21,21,22,22,23,23,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,58,59,61,63, },
{ 0,4,6,7,9,10,11,12,13,13,14,15,16,16,17,18,18,19,20,20,21,21,22,22,23,23,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,58,59,61,63, },
{ 0,4,6,7,9,10,11,12,13,13,14,15,16,16,17,18,18,19,20,20,21,21,22,22,23,23,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,58,59,61,63, },
{ 0,4,6,8,9,10,11,12,13,14,14,15,16,17,17,18,18,19,20,20,21,21,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,57,58,60,61,62,64, },
{ 0,4,6,8,9,10,11,12,13,14,14,15,16,17,17,18,18,19,20,20,21,21,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,57,58,60,61,62,64, },
{ 0,4,6,8,9,10,11,12,13,14,14,15,16,17,17,18,18,19,20,20,21,21,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,57,58,60,61,62,64, },
{ 0,4,6,8,9,10,11,12,13,14,14,15,16,17,17,18,18,19,20,20,21,21,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,57,58,60,61,62,64, },
{ 0,4,6,8,9,10,11,12,13,14,14,15,16,17,17,18,18,19,20,20,21,21,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,57,58,60,61,62,64, },
{ 0,4,6,8,9,10,11,12,13,14,14,15,16,17,17,18,18,19,20,20,21,21,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,57,58,60,61,62,64, },
{ 0,4,6,8,9,10,11,12,13,14,14,15,16,17,17,18,18,19,20,20,21,21,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,57,58,60,61,62,64, },
{ 0,4,6,8,9,10,11,12,13,14,14,15,16,17,17,18,18,19,20,20,21,21,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,57,58,60,61,62,64, },
{ 0,4,6,8,9,10,11,12,13,14,14,15,16,17,17,18,18,19,20,20,21,21,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,49,49,50,51,51,52,53,53,54,55,56,57,57,58,60,61,62,64, },
{ 0,4,6,8,9,10,11,12,13,14,14,15,16,17,17,18,19,19,20,21,21,22,22,23,23,24,24,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,48,48,49,49,50,51,51,52,52,53,54,55,55,56,57,58,59,60,61,62,64,66, },
};

/* 48 vertices */
static Vtx MAP_planet_v[]={
	{ 30, 30,  0,  0, (96<<5),      0,  255, 255, 255, 255},/*  0 */
	{-30, 30,  0,  0,       0,      0,  255, 255, 255, 255},/*  1 */
        {-30, 25,  0,  0,       0, (8<<5),  255, 255, 255, 255},/*  2 */
	{ 30, 25,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/*  3 */
    
	{ 30, 25,  0,  0, (96<<5),      0,  255, 255, 255, 255},/*  4 */
	{-30, 25,  0,  0,       0,      0,  255, 255, 255, 255},/*  5 */
        {-30, 20,  0,  0,       0, (8<<5),  255, 255, 255, 255},/*  6 */
	{ 30, 20,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/*  7 */

	{ 30, 20,  0,  0, (96<<5),      0,  255, 255, 255, 255},/*  8 */
	{-30, 20,  0,  0,       0,      0,  255, 255, 255, 255},/*  9 */
        {-30, 15,  0,  0,       0, (8<<5),  255, 255, 255, 255},/* 10 */
	{ 30, 15,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/* 11 */

        { 30, 15,  0,  0, (96<<5),      0,  255, 255, 255, 255},/* 12 */
        {-30, 15,  0,  0,       0,      0,  255, 255, 255, 255},/* 13 */
        {-30, 10,  0,  0,       0, (8<<5),  255, 255, 255, 255},/* 14 */
	{ 30, 10,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/* 15 */

        { 30, 10,  0,  0, (96<<5),      0,  255, 255, 255, 255},/* 16 */
	{-30, 10,  0,  0,       0,      0,  255, 255, 255, 255},/* 17 */
        {-30,  5,  0,  0,       0, (8<<5),  255, 255, 255, 255},/* 18 */
	{ 30,  5,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/* 19 */

	{ 30,  5,  0,  0, (96<<5),      0,  255, 255, 255, 255},/* 20 */
        {-30,  5,  0,  0,       0,      0,  255, 255, 255, 255},/* 21 */
        {-30,  0,  0,  0,       0, (8<<5),  255, 255, 255, 255},/* 22 */
	{ 30,  0,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/* 23 */

	{ 30,  0,  0,  0, (96<<5),      0,  255, 255, 255, 255},/* 24 */
	{-30,  0,  0,  0,       0,      0,  255, 255, 255, 255},/* 25 */
        {-30, -5,  0,  0,       0, (8<<5),  255, 255, 255, 255},/* 26 */
	{ 30, -5,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/* 27 */

	{ 30, -5,  0,  0, (96<<5),      0,  255, 255, 255, 255},/* 28 */
        {-30, -5,  0,  0,       0,      0,  255, 255, 255, 255},/* 29 */
        {-30,-10,  0,  0,       0, (8<<5),  255, 255, 255, 255},/* 30 */
	{ 30,-10,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/* 31 */

	{ 30,-10,  0,  0, (96<<5),      0,  255, 255, 255, 255},/* 32 */
	{-30,-10,  0,  0,       0,      0,  255, 255, 255, 255},/* 33 */
        {-30,-15,  0,  0,       0, (8<<5),  255, 255, 255, 255},/* 34 */
	{ 30,-15,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/* 35 */

	{ 30,-15,  0,  0, (96<<5),      0,  255, 255, 255, 255},/* 36 */
	{-30,-15,  0,  0,       0,      0,  255, 255, 255, 255},/* 37 */
        {-30,-20,  0,  0,       0, (8<<5),  255, 255, 255, 255},/* 38 */
	{ 30,-20,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/* 39 */

	{ 30,-20,  0,  0, (96<<5),      0,  255, 255, 255, 255},/* 40 */
	{-30,-20,  0,  0,       0,      0,  255, 255, 255, 255},/* 41 */
        {-30,-25,  0,  0,       0, (8<<5),  255, 255, 255, 255},/* 42 */
	{ 30,-25,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/* 43 */

	{ 30,-25,  0,  0, (96<<5),      0,  255, 255, 255, 255},/* 44 */
	{-30,-25,  0,  0,       0,      0,  255, 255, 255, 255},/* 45 */
        {-30,-30,  0,  0,       0, (8<<5),  255, 255, 255, 255},/* 46 */
	{ 30,-30,  0,  0, (96<<5), (8<<5),  255, 255, 255, 255},/* 47 */
};

Gfx MAP_PLkumo[]={
	gsSPVertex(&MAP_planet_v[0],16,0),
	gsDPLoadTextureBlock(MAP_KUMO1_txt,
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*1),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*2),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*3),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[16],16,0),
	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*4),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*5),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*6),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*7),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[32],16,0),
	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*8),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*9),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*10),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_KUMO1_txt+(96*8*11),
			     G_IM_FMT_IA,G_IM_SIZ_8b,96,8,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsDPPipeSync(),
        gsDPSetTextureLUT(G_TT_NONE),
	gsSPEndDisplayList(),
};

Gfx MAP_plCN[]={
        gsDPLoadTLUT_pal256( MAP_CN_txttlut ),

	gsSPVertex(&MAP_planet_v[0],16,0),
	gsDPLoadTextureBlock(MAP_CN1_txt,
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),

	gsDPSetTextureLUT(G_TT_RGBA16),

	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*1),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*2),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*3),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[16],16,0),
	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*4),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*5),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*6),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*7),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[32],16,0),
	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*8),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*9),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*10),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_CN1_txt+(96*8*11),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,8,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsDPPipeSync(),
        gsDPSetTextureLUT(G_TT_NONE),
	gsSPEndDisplayList(),
}; 

Gfx MAP_plFO[]={
        gsDPLoadTLUT_pal256( MAP_FO_txttlut ),

	gsSPVertex(&MAP_planet_v[0],16,0),
	gsDPLoadTextureBlock(MAP_FO1_txt,
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsDPSetTextureLUT(G_TT_RGBA16),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*1),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*2),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*3),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[16],16,0),
	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*4),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*5),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*6),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*7),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[32],16,0),
	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*8),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*9),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*10),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_FO1_txt+(96*8*11),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,8,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsDPPipeSync(),
        gsDPSetTextureLUT(G_TT_NONE),
	gsSPEndDisplayList(),
}; 

Gfx MAP_plAC[]={
        gsDPLoadTLUT_pal256( MAP_AC_txttlut ),

	gsSPVertex(&MAP_planet_v[0],16,0),
	gsDPLoadTextureBlock(MAP_AC1_txt,
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsDPSetTextureLUT(G_TT_RGBA16),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*1),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*2),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*3),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[16],16,0),
	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*4),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*5),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*6),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*7),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[32],16,0),
	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*8),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*9),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*10),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_AC1_txt+(96*8*11),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,8,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsDPPipeSync(),
        gsDPSetTextureLUT(G_TT_NONE),
	gsSPEndDisplayList(),
}; 

Gfx MAP_plBM[]={
        gsDPLoadTLUT_pal256( MAP_BM_txttlut ),

	gsSPVertex(&MAP_planet_v[0],16,0),
	gsDPLoadTextureBlock(MAP_BM1_txt,
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsDPSetTextureLUT(G_TT_RGBA16),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*1),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*2),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*3),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[16],16,0),
	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*4),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*5),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*6),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*7),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[32],16,0),
	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*8),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*9),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*10),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_BM1_txt+(96*8*11),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,8,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsDPPipeSync(),
        gsDPSetTextureLUT(G_TT_NONE),
	gsSPEndDisplayList(),
}; 

Gfx MAP_plTI[]={
        gsDPLoadTLUT_pal256( MAP_TI_txttlut ),

	gsSPVertex(&MAP_planet_v[0],16,0),
	gsDPLoadTextureBlock(MAP_TI1_txt,
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsDPSetTextureLUT(G_TT_RGBA16),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*1),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*2),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*3),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[16],16,0),
	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*4),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*5),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*6),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*7),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[32],16,0),
	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*8),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*9),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*10),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_TI1_txt+(96*8*11),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,8,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsDPPipeSync(),
        gsDPSetTextureLUT(G_TT_NONE),
	gsSPEndDisplayList(),
}; 

Gfx MAP_plKT[]={
        gsDPLoadTLUT_pal256( MAP_KT_txttlut ),

	gsSPVertex(&MAP_planet_v[0],16,0),
	gsDPLoadTextureBlock(MAP_KT1_txt,
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsDPSetTextureLUT(G_TT_RGBA16),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*1),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*2),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*3),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[16],16,0),
	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*4),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*5),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*6),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*7),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[32],16,0),
	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*8),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*9),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*10),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_KT1_txt+(96*8*11),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,8,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsDPPipeSync(),
        gsDPSetTextureLUT(G_TT_NONE),
	gsSPEndDisplayList(),
}; 

Gfx MAP_plMC[]={
        gsDPLoadTLUT_pal256( MAP_MC_txttlut ),

	gsSPVertex(&MAP_planet_v[0],16,0),
	gsDPLoadTextureBlock(MAP_MC1_txt,
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsDPSetTextureLUT(G_TT_RGBA16),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*1),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*2),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*3),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[16],16,0),
	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*4),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*5),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*6),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*7),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[32],16,0),
	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*8),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*9),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*10),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_MC1_txt+(96*8*11),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,8,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsDPPipeSync(),
        gsDPSetTextureLUT(G_TT_NONE),
	gsSPEndDisplayList(),
}; 

Gfx MAP_plZO[]={
        gsDPLoadTLUT_pal256( MAP_ZO_txttlut ),

	gsSPVertex(&MAP_planet_v[0],16,0),
	gsDPLoadTextureBlock(MAP_ZO1_txt,
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsDPSetTextureLUT(G_TT_RGBA16),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*1),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*2),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*3),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[16],16,0),
	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*4),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*5),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*6),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*7),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsSPVertex(&MAP_planet_v[32],16,0),
	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*8),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(0, 1, 2, 3, 0),

	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*9),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(4, 5, 6, 7, 4),

	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*10),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,9,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(8, 9, 10, 11, 8),

	gsDPLoadTextureBlock(MAP_ZO1_txt+(96*8*11),
			     G_IM_FMT_CI,G_IM_SIZ_8b,96,8,0,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_WRAP | G_TX_NOMIRROR,
			     G_TX_NOMASK,G_TX_NOMASK,
			     G_TX_NOLOD,G_TX_NOLOD),
	gsSP1Quadrangle(12, 13, 14, 15, 12),

	gsDPPipeSync(),
        gsDPSetTextureLUT(G_TT_NONE),
	gsSPEndDisplayList(),
}; 

void *PlaTxt[9] = {
    MAP_KT1_txt,	/* カタリナ */
    MAP_MC1_txt,	/* マクベス */
    MAP_ZO1_txt,	/* ゾネス */
    MAP_CN1_txt,	/* コーネリア */
    MAP_TI1_txt,	/* タイタニア */
    MAP_AC1_txt,	/* アクエリア */
    MAP_FO1_txt,	/* フォーチュナ */
    MAP_BM1_txt,	/* ベノム */
    MAP_KUMO1_txt,	/* 雲 */
};

char *PlaTxtOrg[9] = {
    MAP_KT_txt,		/* カタリナ */
    MAP_MC_txt,		/* マクベス */
    MAP_ZO_txt,		/* ゾネス */
    MAP_CN_txt,		/* コーネリア */
    MAP_TI_txt,		/* タイタニア */
    MAP_AC_txt,		/* アクエリア */
    MAP_FO_txt,		/* フォーチュナ */
    MAP_BM_txt,		/* ベノム */
    MAP_kumo_txt,	/* 雲 */
};

static Gfx *pla_data[15]={
    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_plBM,		/* 13:ベノム */
    MAP_SN,		/* 14:太陽 */
};

/*======================================================================*
 *									*
 *	マップ   							*
 *									*
 *======================================================================*/
void map( void )
{
    if( wait_time > 0 )  wait_time--;
    if( wait_time2 > 0 )  wait_time2--;
    if( wait_time3 > 0 )  wait_time3--;

    switch( map_mode ) {
    case MAP_WAIT:
	if(!system_time) {
	    map_mode = MAP_INIT;
	}
	break;
    case MAP_INIT:
#ifdef SPECIAL
	if( before_mode == GAME ) {
	    before_mode = 0;
	    system_mode = TITLE;
	    system_time = 2;
	    title_mode = TITLE_WAIT;
	    display_mode = DISPLAY_NOTH;
	} else {
	    display_mode = DISPLAY_NOTH;
	    map_init();
	}
#else
	display_mode = DISPLAY_NOTH;
	map_init();
#endif
	break;
    case MAP_MAIN:
	display_mode = DISPLAY_MAP;
	map_main();
	break;
    default:
	break;
    }

#ifdef MAP_DEBUG
    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;
	}
    }
#endif
}

/*======================================================================*
 *									*
 *	マップ イニシャル						*
 *									*
 *======================================================================*/
static void map_init( void )
{
    register int i,j;

    Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_MAP);

    min_retrace = 2;
    frcnt = 0;

    get_rank_data();
    hi_score = get_HiScore();

    FirstClearSw = OFF;
    FirstClearA = 0;
    KunsyouGetSw = OFF;
    KunsyouGetStat = 0;
    KunsyouGetA = 0;

    bomb_stat = 0;
    bakuSSw[0] = OFF;
    bakuSSw[1] = OFF;
    bakuSSw[2] = OFF;

    for( i=0; i<10; i++ ) {
	bakuSStat[1][i] = 0;
	bakuSStat[2][i] = 0;
	bakuSA[1][i] = 0xff;
	bakuSA[2][i] = 0xff;
	bakuSScl[1][i] = 0.0f;
	bakuSScl[2][i] = 0.0f;
	bakuSScl2[1][i] = 0.5f+(rnd()*0.3f);
	bakuSScl2[2][i] = 0.5f+(rnd()*0.3f);
	bakuSWait[1][i] = 1+(int)(rnd()*5.0f);
	bakuSWait[2][i] = 1+(int)(rnd()*5.0f);
	bakuSRng[1][i] = 50.0f+(int)(rnd()*30.0f);
	bakuSRng[2][i] = 110.0f+(int)(rnd()*30.0f);
	bakuSZa[1][i] = -10.0f+(rnd() * -60.0f);
	bakuSZa[2][i] = -10.0f+(rnd() * -60.0f);
    }

    rect_sw = OFF;
    cursor_sw = OFF;
    PlanetWmove = OFF;
    PlanetTmove = OFF;

    for( j=0; j<MAP_ITM; j++ ) {
	KunsyouAcol[j] = 0;
	/** ステージクリア勲章用 **/
	Kun2Zang[j] = 0.0f;
	Kun2Yang[j] = -90.0f;
    }


    /** カメラ **/
    vX = 0.0f;
    vY = 1.0f;
    vZ = 0.0f;
    WayX = -150.552155f;
    WayY = -489.679993f;
    WayZ = 0.0f;
    CamXa = -42.750008f;
    CamYa = -9.849999f;
    CamZr= 3375.000000f;
    CamXaAdd = 0.0f;
    CamYaAdd = 0.0f;
    get_cam_rotate_pos( WayX, WayY, WayZ, &EyeX, &EyeY, &EyeZ,
			CamZr, CamXa+CamXaAdd, CamYa+CamYaAdd );


    for( i=0; i<MAP_ITM; i++ ) {
	/** Ｚソートのための準備 **/
	drawIdxT[i] = i;
    }

    /** フェード **/
    fade_sw=IN;
    fade_A = 0xff;
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;

    /** ラインを正しく表示させるために **/
    scrposZ = 0.0f;

    /** メッセージクリア **/
    map_face_stat = 0;

    BG_color = 0x00; /** 背景色 **/

    stX=0.0f;
    stY=0.0f;
    stZ=0.0f;

    /** バックの星 Initial **/
    BackStarInit();

    wip_stat = 0;
    wip_time = 0;
    wait_time = 0;
    wait_time2 = 0;
    wait_time3 = 0;

    moji_sw = OFF;
    moji_sw2 = OFF;
    draw_sw = OFF;

    StName_A = 0.0f;
    StName_Asp = 0.002f;

    Na_StartBgm( NA_BGM_MAP );

    MenuOpen_f = OFF;	/* メニューウインドウ表示 OFF */
    MenuWin_f = OFF;
    CourseSel_f = OFF;	/* コース選択をしたか？ */
    line_sw = OFF;

    for( i=0; i<LINES; i++ ) {
	LineDrawTbl[i] = i;
	Line[i].KowinFlag = 0;
    }

    /** 惑星の座標の取得 **/
    get_planet_pos();

    switch( before_mode ) {
    default:
    case 0:
	/** メニュー画面から来たとき **/
	map_init_fromMenu();
	break;
    case GAME:
	/** ステージクリアから戻ってきた時 **/
	map_init_fromGame();
	break;
    case OVER:
	/** ゲームオーバーから来たとき **/
	map_init_fromOver();
	break;
    }	

    get_cursor_Yrange();

    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]) );
    }

    pep_kao_f = 0;

    map_mode = MAP_MAIN;
    process_phase = 0;

    pl_idx = 0;
    kumo_cnt = 5;

    menu_chg_col = 255.0f;
    menu_col = 255.0f;

    BmGassZa1 = 0.0f;
    BmGassZa2 = 0.0f;

    dot_cnt = 0;
    kowin_stat = 0;
    kowin_A = 255;
    kirakiraA = 255;
      
    bakuLStat = -1;
}

/************************************************************************/
/* Initial(ステージクリアから戻ってきた時)				*/
/************************************************************************/
static void map_init_fromGame( void )
{
    register int i;

    line_sw = ON;

#if 0
    /** TEST **/
    Player_zanki[PL_NO] = 99;
#endif

    /** もしも、残機数が９９をこえてもどってきたときのための保険に・・・  **/
    if( Player_zanki[PL_NO] > 99 ) Player_zanki[PL_NO] = 99;

    /** 仲間状態セーブ **/
    for( i=0; i<6; i++ ) {
	nakama_shield_GTR[i] = nakama_shield[i];
	nakama_shield_SS[i] = nakama_shield_S[i];
	nakama_shield_S[i] = nakama_shield[i];
    }

    /** 次のステージから復活するヤツの(nakama_shield_GTR:0)をに255しておく **/
    for( i=1; i<4; i++ ) {
	if( nakama_shield_GTR[i] == 0 ) nakama_shield_GTR[i] = 255;
    }

    /** 扱いやすいようにいったんセーブ **/
    StageWayWork = Stage_Way;

    NowStage = GetPlanetNum( mapno );
    /* 再度チャレンジするかもしれないので保存 */
    NowStageWk = NowStage;

    /* ステージ入ったデータセット */
    FirstClearSw = SaveDataSet( mapno,STAGE_IN );
    /* ステージクリアーデータセット */
    SaveDataSet( mapno,STAGE_CLEAR );

    /** 今回勲章ＧＥＴしたか **/
//    PRINTF( "map:%d Sw:%d\n",mapno,StageClearSwitch[mapno] );
    if( StageClearSwitch[mapno] == 2 ) {
//	PRINTF( "勲章ＧＥＴ！！\n" );
	KunsyouGetSw = ON;
	ClearKunsyou[StagePtr] = 1;
	SaveDataSet( mapno,KUNSYOU_GET );
    }
    /** データセーブ **/
    data_save();

    /** 現在のステージのカメラ位置のセット **/
    NowStageCameraSet();

    /** クリアルートラインのデータInit **/
    ClearRootLineInit();

    /** 現在のステージのみ表示 **/
    NowStage_disp();
    
    /** 分岐情報 0:なし 1:あり 2:ワープ **/
    switch( StageWayWork ) {
    case 0:		/* なし */
	NextStage = planet[NowStage].NextPlanetNm;
	break;
    case 1:		/* あり */
	NextStage = planet[NowStage].NextPlanetSp;
	break;
    case 2:		/* ワープ */
	NextStage = planet[NowStage].NextPlanetWp;
	break;
    }
    
    StagePtr += 1;

    /** カタリナとセクターＹの爆発のコントロール **/
    BakuSwCtrl();

    /** コースをすすめる,かえる,やりなおすメニューの初期化 **/
    MenuOpen_f = OFF;
    CourseSel_f = OFF;
    psel_chg_col = 32.0f;
    psel_col[0] = 255.0f;
    psel_col[1] = 255.0f;
    psel_col[2] = 255.0f;
    course_sw = 0;
    if( StageWayWork ) course_sw = 1;

    game_score = 0;

    /** カメラズームアウトへ **/
    work_phase = 0;
    map_phase = RET_GAME;

#if 0
    /** 仲間の生存状態のデータセット **/
    NakamaStatSet();
    /** ステージスコアセット **/
    ClearHitCount[StagePtr] = game_score;
#endif
}

/************************************************************************/
/* Initial(ゲームオーバーから来たとき)					*/
/************************************************************************/
static void map_init_fromOver( void )
{
    register int i;

    total_score += game_score;
    Player_zanki[PL_NO] = 0;

    line_sw = ON;

    NowStage = GetPlanetNum( mapno );
    ClearHitCount[StagePtr] = game_score;

    /** 仲間の生存状態のデータセット **/
    NakamaStatSet();

    /** ステージ入ったデータセット **/
    SaveDataSet( mapno,STAGE_IN );
    /** データセーブ **/
    data_save();

    /** クリアルートラインのデータInit **/
    ClearRootLineInit();

    for( i=0; i<7; i++ ) OverRootLine[i] = 0;

    /** ゲームオーバーまでのステージルートのラインデータのセット **/
    if( StagePtr != 0 ) {
	for( i=0; i<StagePtr; i++ ) {
	    OverRootLine[i] =
		GetPlanetLine( ClearStageNum[i],ClearStageNum[i+1] );
	}
    }

    /** クリアルートラインのデータクリア **/
    for( i=0; i<LINES; i++ ) {
	ClearRootLine[i] = 0;
    }

    for( i=0; i<MAP_ITM; i++ ) {
	planet[i].PrimCol = 0x00;
    }

    /** カタリナとセクターＹの爆発のコントロール **/
    BakuSwCtrl();

    StageCnt = 0;

    Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_GAME_OVER);

    process_phase = 0;
    work_phase = 0;
    map_phase = MAP_GAMEOVER;
}

/************************************************************************/
/* Initial(メニュー画面から来たとき)					*/
/************************************************************************/
static void map_init_fromMenu( void )
{
    register int i;
    int lineNm,lineSp;

//    Kunsyou2DispSw = ON;
    
    total_score = 0;
    game_score = 0;
    
    nakama_shield[1] = 255;
    nakama_shield[2] = 255;
    nakama_shield[3] = 255;
    nakama_shield_S[1] = 255;
    nakama_shield_S[2] = 255;
    nakama_shield_S[3] = 255;
    nakama_shield_GTR[1] = 255;
    nakama_shield_GTR[2] = 255;
    nakama_shield_GTR[3] = 255;
    nakama_shield_MAP[1] = 255;
    nakama_shield_MAP[2] = 255;
    nakama_shield_MAP[3] = 255;

    NowStageWk = -1;
    
    for( i=0; i<MAP_ITM; i++ ) {
	planet[i].PrimCol = 0x00;
    }
   
    prim_col = 0x00;
    for( i=0; i<LINES; i++ ) {
	ClearRootLine[i] = 0;
	Line_ex[i].size = 0.0f;
    }

    for( i=0; i<7; i++ ) {
	ClearKunsyou[i] = 0;
	ClearHitCount[i] = 0;
	NakamaDied[i] = 0x00ffffff;
    }
    ClearStageNum[0] = MP_CN;
    ClearStageNum[1] = -1;
    ClearStageNum[2] = -1;
    ClearStageNum[3] = -1;
    ClearStageNum[4] = -1;
    ClearStageNum[5] = -1;
    ClearStageNum[6] = MP_BM;
    
    for( i=0; i<LINES; i++ ) {
	Line[i].PrimCol = 0xff;
    }
    
    StagePtr = 0;
    mapno = CN;
    NowStage = MP_CN;

    eyect_A = 0.0f;
    cam_sp = 0.002f;
    cam_sp1 = 0.01f;
    
    map_phase = MAP_PROLOGUE;
    
    lineNm = GetPlanetLine( NowStage,planet[NowStage].NextPlanetNm );
    lineSp = GetPlanetLine( NowStage,planet[NowStage].NextPlanetSp );
    ClearRootLine[lineNm] = 1;
    ClearRootLine[lineSp] = 1;
}

/************************************************************************/
/* クリアルートラインのデータInit					*/
/************************************************************************/
static void ClearRootLineInit( void )
{
    register int i;

    prim_col = 0x00;
    for( i=0; i<LINES; i++ ) {
	if( ClearRootLine[i] == 4 ||
	    ClearRootLine[i] == 5 ||
	    ClearRootLine[i] == 1 ||
	    ClearRootLine[i] == 11 ) {
	    ClearRootLine[i] = 0;
	}
	if( ClearRootLine[i] == 6 ) Line[i].KowinFlag = 5;
	Line[i].PrimCol = 0x00;
	Line_ex[i].size = 0.0f;
    }
}

/************************************************************************/
/* 仲間の生存状態のデータセット						*/
/************************************************************************/
static void NakamaStatSet( void )
{
    register int i;
    int mask;

    mask = 0x00ff0000;
    for( i=0; i<3; i++ ) {
	if( nakama_shield[3-i] <= 0 ) {
	    NakamaDied[StagePtr] ^= mask;
	} else {
	    NakamaDied[StagePtr] |= mask;
	}
	mask = mask >> 8;
    }
}

/************************************************************************/
/* 現在のステージのカメラ位置のセット					*/
/************************************************************************/
static void NowStageCameraSet( void )
{
    stop_ptr = GetCamZoffset( NowStage );

    EyeX = WayX = planet[NowStage].Xpos;
    EyeY = WayY = planet[NowStage].Ypos;
    WayZ = planet[NowStage].Zpos;
    EyeZ = planet[NowStage].Zpos+stop_ptr;

#if 0
    PRINTF( "ex:%f ey:%f ez:%f\n",EyeX,EyeY,EyeZ );
    PRINTF( "wx:%f wy:%f wz:%f\n",WayX,WayY,WayZ );
    PRINTF( "stpZ:%f\n",stop_ptr );
#endif
}

/************************************************************************/
/* 現在のステージのみ表示						*/
/************************************************************************/
static void NowStage_disp( void )
{
    register int i;

    for( i=0; i<MAP_ITM; i++ ) {
	if( i == NowStage ) {
	    if( i == MP_SZ || i == MP_SX || i == MP_SY ) {
		planet[i].PrimCol = 0x90;
	    } else {
		planet[i].PrimCol = 0xff;
	    }
	} else {
	    planet[i].PrimCol = 0x00;
	}
    }
}

/************************************************************************/
/* カタリナとセクターＹの爆発のコントロール				*/
/************************************************************************/
static void BakuSwCtrl( void )
{
    register int i;

    if( StagePtr != 0 ) {
	bakuSSw[1] = ON;
	bakuSSw[2] = ON;
    }
    for( i=0; i<7; i++ ) {
	if( ClearStageNum[i] == MP_KT ) bakuSSw[1] = OFF;
	if( ClearStageNum[i] == MP_SY ) bakuSSw[2] = OFF;
    }
}

/************************************************************************/
/* ステージ入ったデータセーブ						*/
/************************************************************************/
static int SaveDataSet( int stage, int flag )
{
    int res;
    int data_num;

    switch( stage ) {
    case AS:	/* メテオ */
	data_num = 0;
	break;
    case CL:	/* エリア６ */
	data_num = 1;
	break;
    case BO:	/* ボルス */
	data_num = 2;
	break;
    case SZ:	/* セクターＺ */
	data_num = 3;
	break;
    case SX:	/* セクターＸ */
	data_num = 4;
	break;
    case SW:	/* セクターＹ */
	data_num = 5;
	break;
    case KT:	/* カタリナ */
	data_num = 6;
	break;
    case MC:	/* マクベス */
	data_num = 7;
	break;
    case ZO:	/* ゾネス */
	data_num = 8;
	break;
    case CN:	/* コーネリア */
	data_num = 9;
	break;
    case TI:	/* タイタニア */
	data_num = 10;
	break;
    case AC:	/* アクエリア */
	data_num = 11;
	break;
    case FO:	/* フィチナ */
	data_num = 12;
	break;
    case SN:	/* ソーラ */
	data_num = 13;
	break;
    case BM:	/* ベノム */
	data_num = 14;
	break;
    case BM03:	/* ベノム 3 */
	data_num = 15;
	break;
    case AND:	/* アンドロフ */
	if( mapno_2 == 0 ) {	/** Lv.1 **/
	    data_num = 14;
	} else {		/** Lv.3 **/
	    data_num = 15;
	}
	break;
    }

    res = 0;
    switch( flag ) {
    case STAGE_IN:	/** ステージ入ったデータ  **/
	if( !(fox_save.rom[0].data.pl_stat[data_num].course_in & 0x01) ) {
	    fox_save.rom[0].data.pl_stat[data_num].course_in = 1;
	    res = 1;
	}
	break;
    case KUNSYOU_GET:	/** 勲章ＧＥＴ **/
	if( extra_mode ) {
	    if( !(fox_save.rom[0].data.pl_stat[data_num].extra_medal & 0x01)) {
		fox_save.rom[0].data.pl_stat[data_num].extra_medal = 1;
		res = 1;
	    }
	} else {
	    if( !(fox_save.rom[0].data.pl_stat[data_num].medal & 0x01) ) {
		fox_save.rom[0].data.pl_stat[data_num].medal = 1;
		res = 1;
	    }
	}
	break;
    case STAGE_CLEAR:	/** ステージクリアーデータ **/
	if( extra_mode ) {
	    if( !(fox_save.rom[0].data.pl_stat[data_num].extra_clear & 0x01) ) {
		fox_save.rom[0].data.pl_stat[data_num].extra_clear = 1;
		res = 1;
	    }
	} else {
	    if( !(fox_save.rom[0].data.pl_stat[data_num].clear & 0x01) ) {
		fox_save.rom[0].data.pl_stat[data_num].clear = 1;
		res = 1;
	    }
	}
	break;
    }

    return( res );
}

/*======================================================================*
 *			 						*
 *	マップ メイン 		         				*
 *									*
 *======================================================================*/
static void map_main( void )
{
    register int i;
    int aa;
    
    /* 惑星 , アイコンの座標の取得 */
    get_planet_pos();

    /* 惑星 , アイコンＺソート */
    planetZsort();

    /* フェード */
    map_fade();

    switch( map_phase ) {
    case MAP_PROLOGUE:
	prologue();
	starXad += 0.09f;
	break;
    case MAP_EYECATCH:
	eye_catch();
	CamYaAdd += 0.03f;
	break;
    case CAM_NOMV:
	KeyMap();
	CamYaAdd += 0.03f;
	break;
    case CAM_ZOOM:
	camera_zoom();
	break;
    case GO_GAME:
	wip();
	break;
    case RET_GAME:
	ZoomOutCamera();
	break;
    case SEL_STAGE:
	menu_ctrl();
	break;
    case MAP_GAMEOVER:
	map_gameover();
	break;
    default:
	break;
    }

    if( map_phase == MAP_PROLOGUE ||
	map_phase == MAP_EYECATCH ||
	map_phase == MAP_GAMEOVER ||
	map_phase == CAM_NOMV ) {
	get_cam_rotate_pos( WayX, WayY, WayZ, &EyeX, &EyeY, &EyeZ,
			    CamZr, CamXa+CamXaAdd, CamYa+CamYaAdd );
	back_star_pos_calc( EyeX, EyeY, EyeZ, WayX, WayY, WayZ );
    }
    
    frcnt++;

#if 0
    CamXaAdd += CamXaAddStep;
    if( CamXaAdd > 15.0f ) CamXaAddStep = -0.03f;
    if( CamXaAdd < -15.0f ) CamXaAddStep = 0.03f;
#endif

#if (FOX_DEBUG >= 1)
    /** ステージクリア テスト **/
    if( Key[cont_num].button & CONT_L ) {
	if( Key_T[cont_num].button & CONT_A ) {
	    Stage_Way = 1;
	    if( planet[NowStage].NextPlanetSp == -1 )
		Stage_Way = 0;
	    before_mode = GAME;
	    kowin_A = 255;
	    kirakiraA = 255;
	    map_face_stat = 0;
	    map_mode = MAP_INIT;
	    display_mode = DISPLAY_NOTH;
	    game_score = 300;
	    ClearHitCount[StagePtr] = game_score;
	    total_score += game_score;
	}
	if( Key_T[cont_num].button & CONT_B ) {
	    Stage_Way = 0;
	    before_mode = GAME;
	    kowin_A = 255;
	    kirakiraA = 255;
	    map_face_stat = 0;
	    map_mode = MAP_INIT;
	    display_mode = DISPLAY_NOTH;
	    game_score = 300;
	    ClearHitCount[StagePtr] = game_score;
	    total_score += game_score;
	}
	if( Key_T[cont_num].button & CONT_D ) {
	    if( NowStage == MP_SX || NowStage == MP_AS ) {
		Stage_Way = 2;
		before_mode = GAME;
		kowin_A = 255;
		kirakiraA = 255;
		map_face_stat = 0;
		map_mode = MAP_INIT;
		display_mode = DISPLAY_NOTH;
		game_score = 300;
		ClearHitCount[StagePtr] = game_score;
		total_score += game_score;
	    }
	}
	/** ステージクリア テスト **/
	if( Key_T[cont_num].button & CONT_UP ) {
	    Stage_Way = 1;
	    if( planet[NowStage].NextPlanetSp == -1 )
		Stage_Way = 0;
	    before_mode = GAME;
	    kowin_A = 255;
	    kirakiraA = 255;
	    map_face_stat = 0;
	    map_mode = MAP_INIT;
	    display_mode = DISPLAY_NOTH;
	    aa = NowStage;
	    if( aa == 13 ) {
		aa = 15;
	    }
	    if( aa == 14 ) {
		aa = 13;
	    }
	    StageNoSet();
	    StageClearSwitch[mapno] = 2;
	    game_score = 200;
	    ClearHitCount[StagePtr] = game_score;
	    total_score += game_score;
	}
	if( Key_T[cont_num].button & CONT_LEFT ) {
	    Stage_Way = 0;
	    before_mode = GAME;
	    kowin_A = 255;
	    kirakiraA = 255;
	    map_face_stat = 0;
	    map_mode = MAP_INIT;
	    display_mode = DISPLAY_NOTH;
	    aa = NowStage;
	    if( aa == 13 ) {
		aa = 15;
	    }
	    if( aa == 14 ) {
		aa = 13;
	    }
	    StageNoSet();
	    StageClearSwitch[mapno] = 2;
	    game_score = 200;
	    ClearHitCount[StagePtr] = game_score;
	    total_score += game_score;
	}
	if( Key_T[cont_num].button & CONT_DOWN ) {
	    if( NowStage == MP_SX || NowStage == MP_AS ) {
		Stage_Way = 2;
		before_mode = GAME;
		kowin_A = 255;
		kirakiraA = 255;
		map_face_stat = 0;
		map_mode = MAP_INIT;
		display_mode = DISPLAY_NOTH;
		aa = NowStage;
		if( aa == 13 ) {
		    aa = 15;
		}
		if( aa == 14 ) {
		    aa = 13;
		}
		StageNoSet();
		StageClearSwitch[mapno] = 2;
		game_score = 200;
		ClearHitCount[StagePtr] = game_score;
		total_score += game_score;
	    }
	}
    }
#endif

#ifdef MAP_DEBUG
    if( Key_T[3].button & CONT_F ) {
	before_mode = OVER;
	kowin_A = 255;
	kirakiraA = 255;
	map_face_stat = 0;
	map_mode = MAP_INIT;
	display_mode = DISPLAY_NOTH;
    }

#if 0
    if( Key[2].button & CONT_RIGHT ) {
	Fovy += 1.0f;
	PRINTF( "Fovy:%f\n",Fovy );
    }
    if( Key[2].button & CONT_LEFT ) {
	Fovy -= 1.0f;
	PRINTF( "Fovy:%f\n",Fovy );
    }
#endif

    /* キー入力 */
    if (Key_T[0].button & CONT_E) {
	before_mode = -1;
	map_face_stat = 0;
	map_mode = MAP_INIT;
	display_mode = DISPLAY_NOTH;

	for( i=0; i<MAP_ITM; i++ ) {
	    planet[i].PrimCol = 0x00;
	}
    }
    if( map_phase == CAM_NOMV )
	KeyIn();	/* キー入力 */
#endif
}

/*======================================================================*
 *									*
 *	マップ総合表示							*
 *									*
 *======================================================================*/
void map_display( void )
{
    register int i;
    int *p;

    push_now();
    set_lookat_now( EyeX, EyeY, EyeZ, WayX, WayY, WayZ,
		    vX, vY, vZ, MULT_MTX );
    translate_now( stX, stY, stZ, MULT_MTX );
    set_matrix(&NOW_DISP);
    
    /* 線の描画 */
    if( line_sw && map_phase != MAP_PROLOGUE ) {
	for( i=0; i<LINES; i++ ) {
	    if( ClearRootLine[i] == 0 ) continue;
	    if( Line[i].PrimCol == 0 ) continue;
	    draw_line( i );
	    if( Line[i].KowinFlag ) draw_kowin_main( i );
	    line_ex2_display( i );
	}
    }

    /** カーソルの描画 **/
    draw_cursor();

    /** 残りの石の描画 **/
    draw_rocks();

    /** エリア６艦隊の描画 **/
    draw_senkan();
    
    /** 惑星 , アイコンの描画 **/
    for( p=drawIdxT,i=0; i<MAP_ITM; i++,p++ ) {
	draw_planet_main( *p );
    }

    draw_BakuhatuL();

//    draw_GetKnsyou();

    pull_now();

    /** 指令を出しているペパー将軍  **/
    if( draw_sw ) peper_display();
    /* メッセージの描画 */
    map_face_display();

    if( MenuOpen_f ) menu_display();

    /* 文字の描画 */
    if( moji_sw ) draw_moji();

    draw_wip();
    if( moji_sw2 ) draw_StageName();

    draw_rect();

    /** "コースをやりなおす"選択時の残機数爆発の描画 **/
    draw_bomb();

    if( map_phase == MAP_GAMEOVER && process_phase == 1 ) {
	draw_gameover();
    }
    if( map_phase == MAP_PROLOGUE ) {
	draw_prologue();
    }
    if( map_phase == MAP_EYECATCH ) {
	draw_eye_catch();
    }

    if( kumo_cnt == 0 ) {
	texture_circle( (unsigned char *)PlaTxt[KUMO],
			(unsigned char *)SEGMENT_TO_KSEG0(PlaTxtOrg[KUMO]),
			&(PlaLoopPtF[KUMO]) );
	kumo_cnt = 5;
    } else {
	kumo_cnt--;
    }
	
    texture_circle( (unsigned char *)PlaTxt[pl_idx*2],
		    (unsigned char *)SEGMENT_TO_KSEG0(PlaTxtOrg[pl_idx*2]),
		    &(PlaLoopPtF[pl_idx*2]) );
    texture_circle( (unsigned char *)PlaTxt[(pl_idx*2)+1],
		    (unsigned char *)SEGMENT_TO_KSEG0(PlaTxtOrg[(pl_idx*2)+1]),
		    &(PlaLoopPtF[(pl_idx*2)+1]) );
    pl_idx++;
    if( pl_idx > 3 ) pl_idx = 0;

    texture_raster( (unsigned short *)MAP_benom_gass1_txt,
		    (unsigned short *)MAP_benom_gass1_S_txt, R_64x64IA8 );

#ifdef MAP_DEBUG
    if(Key_T[2].button & CONT_E) {
	time_flag = 1 - time_flag;
    }
    time_display();
#endif
}

/************************************************************************/
/* ハイスコアーの取得(バックアップデータから)				*/
/************************************************************************/
static int get_HiScore( void )
{
    register int i,j;
    int rank_hit[10];
    int top,work,root_ptr;

    for( i=0; i<10; i++ ) rank_hit[i] = 0;

    /** 各順位のトータルヒット数の計算 **/
    for( i=0; i<10; i++ ) {
	root_ptr = fox_save.rom[0].data.rank_rootptr[i];
	for( j=0; j<root_ptr; j++ ) {
	    work = fox_save.rom[0].data.rank_stage[i][j].hitcnt;
	    if( fox_save.rom[0].data.rank_stage[i][j].hitcnt_h ) {
		work += 256;
	    }
	    rank_hit[i] += work;
	}
    }

    top = rank_hit[0];
    for( i=1; i<10; i++ ) {
	if( top < rank_hit[i] ) top = rank_hit[i];
    }
    
    return( top );
}

/************************************************************************/
/* バックの星 Initial							*/
/************************************************************************/
static BackStarInit( void )
{
    Back_star_f = 800; /* 星スクロールするやつセット */

    /*可変確保メモリークリアー*/
    mem_stage_clear();

    /* 星描画用エリア確保*/
    star_initial_set();

    starXpos = 320.0f;
    starYpos = 240.0f;

    starXad = 0.0f;
    starYad = 0.0f;
}

/************************************************************************/
/* textureの変形 (球形)							*/
/************************************************************************/
void texture_circle( unsigned char *txt,
		     unsigned char *txtS,
		     float *lopptF )
{
    register int i,j,k;
    int *dat;
    int xx1;

    dat = circle_dataX;

    for( i=1; i<48; i++,dat++ ) {
	for( k=0,j=(*dat); j<(95-(*dat)); j++,k++ ) {
	    /** Texture Scroll **/
	    xx1 = (circle_data3[i-1][k] + (int)(*lopptF));

	    if( xx1 > 95 ) xx1 -= 95;
	    if( xx1 < 0 ) xx1 += 95;

	    *(txt+((i*96)+j)) = *(txtS+((i*96) + xx1));
	    *(txt+((95-i)*96)+j) = *(txtS+((95-i)*96)+ xx1);
	}
    }

    /** TextureScroll PonitMove **/
    *lopptF = (*lopptF) - 1.0f;

    if( *lopptF <= 0.0f ) *lopptF = 95.0f;
    if( *lopptF > 95.0f ) *lopptF = 0.0f;
}

/************************************************************************/
/* プロローグ								*/
/************************************************************************/
static void prologue( void )
{
    register int j;

    static float PicChgY[] = {
	105.0f-(21.0f*1.0f),
	21.0f-(21.0f*1.0f),
	-105.0f-(21.0f*1.0f),
	-189.0f-(21.0f*1.0f),
	-273.0f-(21.0f*1.0f),
	-399.0f-(21.0f*1.0f)
    };

    switch( process_phase ) {
    case 100:
	break;
    case 0:
	PicPtr = 0;
	ProMesX = 39.0f;
	ProMesY = 230.0f;
	ProMesAA = 0;
	ProMesA = 0;
	ProMesYSpd = 0.3f;
	Back_star_f = 800;
	wait_time3 = 5;
//	process_phase = 100;
//	ProMesAA = 255;
//	BG_color = 0xffffffff;
//	if( Key_T[2].button & CONT_L ) 
	process_phase++;
	break;
    case 1:
	if( wait_time3 ) break;
	if( fade_A ) break;
	if( (int)ProMesY == 148+(21*3) ) {
	    Na_StartMesVoiceBgmMute( 1000 );
	}
	if( ProMesY > -580.0f )
	    ProMesY -= ProMesYSpd;

	if( ProMesY < 148.0f+(21.0f*2.0f) && ProMesAA != 0xff ) {
	    ProMesAA += 0x08;
	    if( ProMesAA > 0xff ) ProMesAA = 0xff;
	}

	if( ProMesY < PicChgY[PicPtr] ) {
	    ProMesA += 0x08;
	    if( ProMesA > 0xff ) ProMesA = 0xff;
	}
	if( ProMesY <= -560.0f ) process_phase++;
	break;
    case 2:
	ProMesAA -= 0x10;
	if( ProMesAA < 0 ) {
	    ProMesAA = 0;
	    process_phase++;
	    wait_time3 = 20;
	}
	break;
    case 3:
	if( wait_time3 ) break;
	process_phase = 0;
	map_phase = MAP_EYECATCH;
//	starXad = 0.0f;
	break;
    }

    if( Key_T[cont_num].button & CONT_START ) {
	Na_StartBgm( NA_BGM_MAP );
	Na_StartSystemSe( NA_SE_MAP_START );
	for( j=0; j<MAP_ITM; j++ ) {
	    if( j == MP_SZ || j == MP_SX || j == MP_SY ) {
		planet[j].PrimCol = 0x90;
	    } else {
		planet[j].PrimCol = 0xff;
	    }
	    KunsyouAcol[j] = 0xff;
	}
	prim_col = 0xff;
	Na_ClearMesVoice();
//	Na_StopAllFlagSe( NA_SE_OPENING_MESSAGE );
	line_sw = ON;
	cursor_sw = ON;
	process_phase = 0;
	map_phase = CAM_NOMV;
    }
}

/************************************************************************/
/* プロローグの描画							*/
/************************************************************************/
static void draw_prologue( void )
{
    register int i;

    static float gy1=71.0f,gy2=205.0f;

    static unsigned short *prol_txt[] = {
	MAP_Pro_07_txt,
	MAP_Pro_02_txt,
	MAP_Pro_01_txt,
	MAP_Pro_04_txt,
	MAP_Pro_06_txt,
	MAP_Pro_03_txt,
	MAP_Pro_05_txt,
    };

    draw_awing();

#if 0
    gDPPipeSync(NEXT_DISP);
    gDPSetCycleType(NEXT_DISP, G_CYC_1CYCLE);
    gDPSetTexturePersp(NEXT_DISP, G_TP_NONE);
    gDPSetCombineMode(NEXT_DISP,
                      G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM);
    gDPSetRenderMode(NEXT_DISP, G_RM_TEX_EDGE, G_RM_TEX_EDGE2);
#endif
    rcpsetmode( &NOW_DISP, RECE_RGBA_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 180, 180, 180, 0xff);
    puts_evo( &NOW_DISP,
	      msg_00001, ProMesX, ProMesY,
	      218, 70, msglen2(msg_00001) );
    gDPSetTexturePersp( NEXT_DISP, G_TP_PERSP );


    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    texture_rectangleIA8( &NOW_DISP, MAP_grey_txt,
			  8, 16, 0.0f, gy1, 40.0f, 1.66f );

    texture_rectangleIA8Y( &NOW_DISP, MAP_grey_txt,
			  8, 16, 0.0f, gy2, 40.0f, 1.68f );

    draw_back_star2( 71, 118 );
    draw_back_star2( 205, 239 );

    
    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, ProMesAA );
    for( i=0; i<13; i++ ) {
	texture_rectangleRGBA16( &NOW_DISP, prol_txt[PicPtr]+(96*4*i),
				 96, 4,
				 109.0f, 24.0f+(4.0f*i),
				 1.0f, 1.0f );
    }

    if( ProMesA != 0 && PicPtr+1 < 7 ) {
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, ProMesA );
	for( i=0; i<13; i++ ) {
	    texture_rectangleRGBA16( &NOW_DISP,
				     prol_txt[PicPtr+1]+(96*4*i),
				     96, 4,
				     109.0f, 24.0f+(4.0f*i),
				     1.0f, 1.0f );
	}
	if( ProMesA == 255 ) {
	    ProMesA = 0;
	    PicPtr++;
	}
    }

#if 0
    if( Key[3].button & CONT_UP ) {
	ProMesY -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	ProMesY += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	ProMesX -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	ProMesX += 1.0f;
    }
    if( Key[1].button & CONT_UP ) {
	gy1 -= 1.0f;
    }
    if( Key[1].button & CONT_DOWN ) {
	gy1 += 1.0f;
    }
    if( Key[1].button & CONT_E ) {
	gy2 -= 1.0f;
    }
    if( Key[1].button & CONT_D ) {
	gy2 += 1.0f;
    }

    PRINTF( "y1:%f y2:%f\n",gy1,gy2 );
    PRINTF( "x:%f y:%f\n",ProMesX,ProMesY );
#endif
}


/************************************************************************/
/* プロローグメッセージのうしろでまわるアーウィン			*/
/************************************************************************/
static void draw_awing( void )
{
    static float awXa = 35.0f;
    A_WING_STAT wing;
    xyz_t ato;
    xyz_t mae;

    int ligR=30,ligG=9,ligB=5;
    int kanR=0,kanG=0,kanB=0;
    float awx = -60.0f,awy = 293.0f;

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = 100.0f;
    rotateY_work( ANGLE(22.0f), SET_MTX );
    rotateX_work( ANGLE(-70.0f), MULT_MTX );
    MtxF_Position_work( &mae,&ato );
    
    if( process_phase >= 2 ) {
	ligR -= 10;
	if( ligR < 0 ) ligR = 0;
	ligG -= 3;
	if( ligG < 0 ) ligG = 0;
	ligB -= 2;
	if( ligB < 0 ) ligB = 0;
	rcpsetmode( &NOW_DISP, TEXT_Z_A_LIGHT_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, ProMesAA );
    } else {
	rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
    }
    
    if( process_phase < 2 || ProMesAA != 0 ) {
    push_now();
    set_lookat_now( 0.0f, 0.0f, 430.0f,
		    0.0f, 180.0f, 0.0f,
		    0.0f, 1.0f, 0.0f, MULT_MTX );
    set_matrix(&NOW_DISP);

    light_in( (int)ato.x, (int)ato.y, (int)ato.z,
	      ligR,ligG,ligB,
	      kanR,kanG,kanB );

    push_now();
    translate_now( awx, awy, -360.0f, MULT_MTX);
    scale_now( 3.0f, 3.0f, 3.0f, MULT_MTX);

    rotateZ_now( ANGLE(-15.0f), MULT_MTX );
    rotateX_now( ANGLE(awXa), MULT_MTX );
    rotateY_now( ANGLE(-90.0f), MULT_MTX );

    set_matrix(&NOW_DISP);

    wing.wing_R = wing.wing_L = 2;
    wing.gun_XP = 
	wing.wing_XA = 
	wing.wing_YA = 
	wing.wing_ZA = 
	wing.flap_R1 = wing.flap_R2 = 
	wing.flap_L1 = wing.flap_L2 = 
	wing.wing_YA2 = 0.0f;

    wing.gun_YP = 0.0f;
    wing.kao = 1;
    wing.kao_XA  = 0.0f;
    wing.kao_YA  = 0.0f;
    wing.canopi_XA = 0.0f;
    
    A_Display(&wing);

    pull_now();

    pull_now();
    }
    awXa += 0.6f;

#if 0
    if (Key[3].button & CONT_UP) {
	awy += 1.0f;
    }
    if (Key[3].button & CONT_DOWN) {
	awy -= 1.0f;
    }
    if (Key[3].button & CONT_LEFT) {
	awx -= 1.0f;
    }
    if (Key[3].button & CONT_RIGHT) {
	awx += 1.0f;
    }
    
    PRINTF( "x:%f y:%f\n",awx,awy );

    if (Key[3].button & CONT_C) {
	if (Key[3].button & CONT_LEFT) {
	    kanR = (kanR - 1);
	    if( kanR < 0 ) kanR = 255;
	}
	if (Key[3].button & CONT_RIGHT) {
	    kanR = (kanR + 1);
	    if( kanR > 255 ) kanR = 0;
	}
	if (Key[3].button & CONT_UP) {
	    ligR = (ligR + 1) & 0xff;
	}
	if (Key[3].button & CONT_DOWN) {
	    ligR = (ligR - 1) & 0xff;
	}
    }
    
    if (Key[3].button & CONT_D) {
	if (Key[3].button & CONT_LEFT) {
	    kanG = (kanG - 1);
	    if( kanG < 0 ) kanG = 255;
	}
	if (Key[3].button & CONT_RIGHT) {
	    kanG = (kanG + 1);
	    if( kanG > 255 ) kanG = 0;
	}
	if (Key[3].button & CONT_UP) {
	    ligG = (ligG + 1) & 0xff;
	}
	if (Key[3].button & CONT_DOWN) {
	    ligG = (ligG - 1) & 0xff;
	}
    }
    
    if (Key[3].button & CONT_F) {
	if (Key[3].button & CONT_LEFT) {
	    kanB = (kanB - 1);
	    if( kanB < 0 ) kanB = 255;
	}
	if (Key[3].button & CONT_RIGHT) {
	    kanB = (kanB + 1);
	    if( kanB > 255 ) kanB = 0;
	}
	if (Key[3].button & CONT_UP) {
	    ligB = (ligB + 1) & 0xff;
	}
	if (Key[3].button & CONT_DOWN) {
	    ligB = (ligB - 1) & 0xff;
	}
    }
    
    PRINTF( "K R:%d G:%d B:%d\n",kanR,kanG,kanB );
    PRINTF( "L R:%d G:%d B:%d\n",ligR,ligG,ligB );
#endif
}

/************************************************************************/
/* アイキャッチ								*/
/************************************************************************/
static void eye_catch( void )
{
    register int i,j;
    float res;
 
    switch( process_phase ) {
    case 0:
	res = add_calc( &eyect_A, 255.0f, cam_sp, 10.0f, 1.0f );
	cam_sp *= 1.06f;
	if( res == 0.0f ) {
	    Prim1 = 0.0f;
	    Prim2 = 0.0f;
	    cam_sp = 0.002f;
	    wait_time = 10;
	    wait_time2 = 45;
	    process_phase++;
	}
	break;
    case 1:
	if( wait_time ) break;
	add_calc( &eyect_A, 0.0f, cam_sp1, 50.0f, 0.1f );
	cam_sp1 *= 1.06f;

	if( wait_time2 ) break;
	add_calc( &Prim1, 144.0f, cam_sp, 50.0f, 0.1f );
	res = add_calc( &Prim2, 255.0f, cam_sp, 50.0f, 0.1f );
	cam_sp *= 1.09f;
//	cam_sp *= 1.06f;
//	cam_sp *= 1.02f;
//	PRINTF( "Prim2F:%f Prim2D:%d\n",Prim2,(int)Prim2 );
	for( i=0; i<MAP_ITM; i++ ) {
	    if( i == MP_SZ || i == MP_SX || i == MP_SY ) {
		planet[i].PrimCol = (int)Prim1;
	    } else {
		planet[i].PrimCol = (int)Prim2;
		prim_col = (int)Prim2;
	    }
	    KunsyouAcol[i] = (int)Prim2;
	}
	
	if( Prim1 > 0x20 ) line_sw = ON;

	if( res == 0.0f ) {
	    Na_StartSystemSe( NA_SE_MAP_START );
	    process_phase = 0;
	    cursor_sw = ON;
	    map_phase = CAM_NOMV;
	}
	break;
    }

    /** TEST **/
    if( Key_T[cont_num].button & CONT_START ) {
	Na_StartSystemSe( NA_SE_MAP_START );
	for( j=0; j<MAP_ITM; j++ ) {
	    if( j == MP_SZ || j == MP_SX || j == MP_SY ) {
		planet[j].PrimCol = 0x90;
	    } else {
		planet[j].PrimCol = 0xff;
	    }
	    KunsyouAcol[j] = 0xff;
	}
	prim_col = 0xff;
	map_phase = CAM_NOMV;
	cursor_sw = ON;
    }
}

/************************************************************************/
/* アイキャッチの描画							*/
/************************************************************************/
static void draw_eye_catch( void )
{
    register int i;

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0,  255, 255, 255, (int)eyect_A );

    for( i=0; i<4; i++ ) {
    texture_rectangleIA8( &NOW_DISP, MAP_9917_txt+(168*4*i),
			  168, 4,
			  77.0f, 104.0f+(4.0f*i), 1.0f, 1.0f );
    }
    texture_rectangleIA8( &NOW_DISP, MAP_9917_txt+(168*16),
			  168, 3,
			  77.0f, 104.0f+16.0f, 1.0f, 1.0f );

#if 0
    static float eex=0.0f,eey=0.0f;

    if( Key[3].button & CONT_UP ) {
	eey -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	eey += 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	eex += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	eex -= 1.0f;
    }

    PRINTF( "x:%f y:%f\n",eex,eey );
#endif
}

/************************************************************************/
/* カメラ移動	Initial							*/
/************************************************************************/
static void move_camera_init( void )
{
    float xx,yy,zz;

//    camsp = 0.024f;
    camsp = 0.04f;

    stop_ptr = GetCamZoffset( NowStage );

    Wway.x=planet[NowStage].Xpos;
    Wway.y=planet[NowStage].Ypos;
    Wway.z=planet[NowStage].Zpos;

    Weye.x=planet[NowStage].Xpos;
    Weye.y=planet[NowStage].Ypos;
    Weye.z=Wway.z+stop_ptr;

    WWwayX=WayX;
    WWwayY=WayY;

    WeyeX=EyeX;
    WeyeY=EyeY;

    xx=(Weye.x-EyeX);
    yy=(Weye.y-EyeY);
    zz=(Weye.z-EyeZ);
    rrv=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );

#if 0
    xx=(WwayX-WayX);
    yy=(WwayY-WayY);
    zz=(WwayZ-WayZ);
    rrvw=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );
#endif
}

/************************************************************************/
/* カメラのズーム							*/
/************************************************************************/
static void camera_zoom( void )
{
    register int i;
    int stat;

    switch( process_phase ) {
    case 0:
	move_camera_init();

	work_phase = 0;
	Time = 0;
	pepX = 0.0f;
	pepY = 0.0f;
	pepZ = -400.0f;

	sclX = 0.05f;
	sclY = 0.05f;
	scl2X = 0.05f;
	scl2Y = 0.05f;
	pepYa = 0.0f;
	litA = 0;
	flush_cnt = 10;
	cursor_sw = OFF;
	if( NowStage == MP_CN ) {
	    flush_cnt = 5;
	}
	zoom_end_f = OFF;
	for( i=0; i<LINES; i++ ) {
	    Line[i].PrimCol = 0x00;
	}
	Back_star_f = 0;

	fade_R = 0xff;
	fade_G = 0xff;
	fade_B = 0xff;
	fade_A = 0x00;

	bakuLScl = 0.0f;
	bakuLA = 0xff;

	process_phase++;
	break;
    case 1:
	if( !flush_cnt ) {
	    if( NowStage == MP_CN ) {
		fade_A = 0x00;
		process_phase = 10;
		Na_StartSystemSe( NA_SE_BACKUP_CLEAR );
	    } else {
		Na_StartSystemSe( NA_SE_MAP_ZOOM_START );
		process_phase++;
	    }
	} else {
	    if( NowStage == MP_CN ) {
		fade_A ^= 0xff;
		if( flush_cnt == 2 ) bakuLStat = 0;
	    }
	    flush_cnt--;
	}
	break;
    case 10:
	/** コーネリアで大爆発 **/
	if( bakuLStat == 4 ) {
	    Na_StartSystemSe( NA_SE_MAP_ZOOM_START );
	    process_phase = 2;
	}
	break;
    case 2:
	zoom_camera();
	if( EyeZ == Weye.z && !zoom_end_f ) {
	    Na_StartSystemSe( NA_SE_MAP_ZOOM_END );
	    zoom_end_f = ON;
	    if( NowStage == MP_CN ) {
		bakuSSw[0] = ON;
		for( i=0; i<10; i++ ) {
		    bakuSStat[0][i] = (int)(rnd()*3.0f);
		    bakuSA[0][i] = 0xff;
		    bakuSScl[0][i] = 0.0f;
		    bakuSScl2[0][i] = 0.5f+(rnd()*0.3f);
		    bakuSWait[0][i] = 1+(int)(rnd()*4.0f);
		    bakuSRng[0][i] = 110.0f+(int)(rnd()*30.0f);
		    bakuSZa[0][i] = -10.0f+(rnd() * -60.0f);
		}
	    }
	}
	if( WeyeX == Weye.x && WeyeY == Weye.y &&
	    EyeZ == Weye.z && WayZ == Wway.z ) {

	    moji_sw = ON;
	    draw_sw = ON;
	    for( i=0; i<MAP_ITM; i++ ) KunsyouAcol[i] = 0;
	    prim_col = 0;
	    stat = peper_anime();

	    if( stat ) {
		process_phase++;
	    }
	}
	break;
    case 3:
	process_phase = 0;
	map_phase = GO_GAME;
	break;
    }

    Time++;
}

/************************************************************************/
/* ペパー将軍出てきてしゃべる						*/
/************************************************************************/
static int peper_anime( void )
{
    int res;
    float res0,res1,res2,res3;

    res = 0;

    switch( work_phase ) {
    case 0:
	Na_StartMesVoice( SE_VO_COM_START );
	sclX += 2.9f;
	scl2X += 2.9f;
	if( sclX > 5.5f ) {
	    sclX = 5.5f;
	    scl2X = 4.6f;
	    work_phase++;
	    wait_time = 13;
	}
	break;
    case 1:
	litA += 10;
	sclX -= 2.5f;
	scl2X -= 2.5f;
	if( sclX < 5.0f ) sclX = 5.0f;
	if( scl2X < 3.9f ) scl2X = 3.9f;

	sclY += 2.5f;
	scl2Y += 2.5f;
	if( sclY > 5.0f ) sclY = 5.0f;
	if( scl2Y > 3.9f ) scl2Y = 3.9f;
	if( !wait_time ) {
	    litA = 255;
	    work_phase = 100;
	}
	break;
    case 100:
	res0 = add_calc( &pepX, -206.0f, 0.4f, 100.0f, 1.0f );
	res1 = add_calc( &pepY, 51.0f, 0.4f, 100.0f, 1.0f );
	res2 = add_calc( &pepZ, -627.0f, 0.4f, 100.0f, 1.0f );
	res3 = add_calc( &pepYa, 42.8f, 0.4f, 100.0f, 1.0f );
	if( res0 == 0.0f && res1 == 0.0f && res2 == 0.0f && res3 == 0.0f )
	    res = 1;
	break;
    }

    return( res );
}

/************************************************************************/
/* 惑星ズーム時のカメラのストップ位置の取得				*/
/************************************************************************/
static float GetCamZoffset( int pla )
{
    float offset;

    switch( pla ) {
    case MP_A6:	/* エリア６ */
	offset = 900.0f;
	break;
    case MP_BO:	/* ボルス */
	offset = 800.0f;
	break;
    case MP_AS:	/* メテオ */
	offset = 650.0f;
	break;
    case MP_TI:	/* タイタニア */
    case MP_AC:	/* アクエリア */
    case MP_KT:	/* カタリナ */
    case MP_FO:	/* フィチナ */
    case MP_MC:	/* マクベス */
    case MP_ZO:	/* ゾネス */
	offset = 550.0f;
	break;
    case MP_CN:	/* コーネリア */
	offset = 1100.0f;
	break;
    case MP_BM:	/* ベノム */
	offset = 2100.0f;
	break;
    case MP_SN:	/* 太陽 */
	offset = 850.0f;
	break;
    case MP_SX:	/* セクターＸ */
    case MP_SY:	/* セクターＹ */
    case MP_SZ:	/* セクターＺ */
	offset = 650.0f;
	break;
    }

    return( offset );
}

/************************************************************************/
/* カメラのズーム							*/
/************************************************************************/
static void zoom_camera( void )
{
    register int i;

    /* カメラ移動 */
    move_camera( camsp );
    /* 視点移動 */ 
    move_waypoint( camsp );
    camsp *= 1.04f;

    /* 目標物以外は消す */
    for( i=0; i<MAP_ITM; i++ ) {
	KunsyouAcol[i] -= 0x10;
	if( KunsyouAcol[i] < 0 ) KunsyouAcol[i] = 0;
	
	if( i == NowStage ) continue;
	planet[i].PrimCol -=  0x10;
	if( planet[i].PrimCol < 0 ) planet[i].PrimCol = 0;
    }
    for( i=0; i<LINES; i++ ) {
	if( ClearRootLine[i] == 0 ) continue;
	Line[i].PrimCol -= 0x10;
	if( Line[i].PrimCol < 0 ) Line[i].PrimCol = 0;
    }

    if( NowStage == MP_BO ) {
	add_calc( &bo_xa, 20.0f, 0.05f, 100.0f, 0.1f );
    }
    if( NowStage == MP_A6 ) {
	add_calc( &cl_xa, 15.0f, 0.05f, 100.0f, 0.1f );
    }

    prim_col -=  0x10;
    if( prim_col < 0 ) prim_col = 0;

    Na_StopBgm( 45 );
}

/************************************************************************/
/* カメラ移動 (引く) Initial						*/
/************************************************************************/
static void ZoomOutCameraInit( void )
{
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;
    fade_A = 0xff;
    FlushCnt = 5;

    /** カメラ移動用データセット **/
    PointNum = 0;
    t = 0.0f;
    tsp = 0.04f;

    eye[0].x = eye[1].x = EyeX;
    eye[0].y = eye[1].y = EyeY;
    eye[0].z = eye[1].z = EyeZ;

    way[0].x = way[1].x = WayX;
    way[0].y = way[1].y = WayY;
    way[0].z = way[1].z = WayZ;
    

    way[5].x =
	way[4].x =
	way[3].x = way[2].x= planet[NextStage].Xpos;
    way[5].y =
	way[4].y =
	way[3].y = way[2].y= planet[NextStage].Ypos;
    way[5].z =
	way[4].z =
	way[3].z = way[2].z= planet[NextStage].Zpos;

    CamXa = -46.5f;
    CamYa = 0.0f;
    CamZr = 500.0f;

    get_cam_rotate_pos( way[2].x, way[2].y, way[2].z,
			&eye[2].x, &eye[2].y, &eye[2].z,
			CamZr, CamXa, CamYa );
    eye[5].x =
	eye[4].x =
	eye[3].x = eye[2].x;
    eye[5].y =
	eye[4].y =
	eye[3].y = eye[2].y;
    eye[5].z =
	eye[4].z =
	eye[3].z = eye[2].z;


    way[7].x = way[6].x = -150.552155f;
    way[7].y = way[6].y = -489.679993f;
    way[7].z = way[6].z = 0.0f;

    CamXa = -42.750008f;
    CamYa = -9.849999f;
    CamZr= 3375.000000f;
    
    get_cam_rotate_pos( way[6].x, way[6].y, way[6].z,
			&eye[6].x, &eye[6].y, &eye[6].z,
			CamZr, CamXa, CamYa );

    eye[7].x = eye[6].x;
    eye[7].y = eye[6].y;
    eye[7].z = eye[6].z;

    /** ラインデータナンバーセット **/
    line_no = GetPlanetLine( NowStage,NextStage );
    if( StageWayWork == 2 ) {
	/** ワープのときはキラキラ **/
	ClearRootLine[line_no] = 5;
	Line[line_no].KowinFlag = 5;
    } else {
	ClearRootLine[line_no] = 2;
	Line[line_no].KowinFlag = 1;
    }
}

/************************************************************************/
/* カメラ移動 (引く)							*/
/************************************************************************/
static void ZoomOutCamera( void )
{
    register int i;

    switch( work_phase ) {
    case 0:
	ZoomOutCameraInit();
	work_phase = 100;
	break;
    case 100:
	if( fade_A ) {
	    fade_A -= 0x40;
	    if( fade_A < 0x00 ) fade_A = 0x00;
	} else {
	    wait_time3 = 30;
	    /** はじめてクリアして,勲章条件を満たしたときは **/
	    /** 勲章条件を満たしたほうが優先		    **/
	    if( KunsyouGetSw == ON || FirstClearSw == ON ) {
		fade_R = 0xff;
		fade_G = 0xff;
		fade_B = 0xff;
		fade_A = 0x00;
		FirstClearA = 0x00;
		work_phase = 10;
		break;
	    }
	    Time = 0;
	    work_phase = 1;
	}
	break;
    case 10:
	if( wait_time3 ) break;
	if( FirstClearA == 0xff && fade_A == 0 ) {
	    FirstClearSw = OFF;
	    wait_time3 = 30;
	    work_phase = 20;
//	    PRINTF( "k:%d F:%d\n",KunsyouGetSw,FirstClearSw );
	} else {
	    if( FlushCnt ) {
		fade_A ^= 0xff;
		FlushCnt--;
	    } else {
		FlushCnt = 0;
		if( fade_A ) {
		    fade_A -= 0x15;
		    if( fade_A < 0 ) fade_A = 0;
		}
		FirstClearA += 0x08;
		if( FirstClearA > 0xff ) {
		    fade_A = 0;
		    FirstClearA = 0xff;
		}
	    }
	}
	break;
    case 20:
	if( wait_time3 ) break;
	if( KunsyouGetSw == ON || FirstClearSw == ON ) break;
	Time = 0;
	wait_time3 = 30;
	work_phase = 1;
	break;

    case 1:
	if( wait_time3 ) break;
	CameraZoomOutMain();
	break;
    case 2:
#if 1
	if( wait_time3 ) break;
	for( i=0; i<MAP_ITM; i++ ) {
	    KunsyouAcol[i] = 0xff;
	}
	
//	wait_time3 = 30;
	wait_time3 = 0;
	work_phase++;
#else
	if( (ClearRootLine[NextlineSP] == 0 && ClearRootLine[NextlineNM] == 4) ||
	    (ClearRootLine[NextlineSP] == 4 && ClearRootLine[NextlineNM] == 4) ||
	    (ClearRootLine[NextlineSP] == 0 && ClearRootLine[NextlineNM] == 0) ) {

	    for( i=0; i<MAP_ITM; i++ ) {
		KunsyouAcol[i] = 0xff;
	    }

	    wait_time3 = 30;
	    work_phase++;
	}
#endif
	break;
    case 3:
	if( wait_time3 ) break;
	MenuWin_f = ON;
	cursor_sw = ON;
	work_phase = 0;
	map_phase = CAM_NOMV;
	break;
    }

    back_star_pos_calc( EyeX, EyeY, EyeZ, WayX, WayY, WayZ );

    Time++;
}

/************************************************************************/
/* カメラ移動 (引く) メイン						*/
/************************************************************************/
static void CameraZoomOutMain( void )
{
    register int i;
    int lineNm,lineSp;

    if( Time == 30 ) {
	if( StageWayWork == 2 ) {	/** ワープ分岐 **/
	    Na_StartSystemSe( NA_SE_MAP_ARWING_WARP_DASH );    
	} else {
	    Na_StartSystemSe( NA_SE_MAP_ARWING_DASH );    
	}
    }
    
    CameraZoomOut( tsp );
    
    if( Time == 80 ) {
	NowStage = NextStage;
	ClearStageNum[StagePtr] = NowStage;
	/* TEST */
	StageNoSet();
    }
    
    if( Time < 80 ) {
	Line[line_no].PrimCol += 0x10;
	if( Line[line_no].PrimCol > 0xff ) Line[line_no].PrimCol = 0xff;
	
	planet[NextStage].PrimCol += 0x10;
	if( NextStage == MP_SZ ||
	    NextStage == MP_SX ||
	    NextStage == MP_SY ) {
	    if( planet[NextStage].PrimCol > 0x90 )
		planet[NextStage].PrimCol = 0x90;
	} else {
	    if( planet[NextStage].PrimCol > 0xff ) 
		planet[NextStage].PrimCol = 0xff;
	}
    } else {
	prim_col += 0x10;
	if( prim_col > 0xff ) prim_col = 0xff;
	
	for( i=0; i<LINES; i++ ) {
	    if( ClearRootLine[i] == 0 ) continue;
	    Line[i].PrimCol += 0x10;
	    if( Line[i].PrimCol > 0xff )
		Line[i].PrimCol = 0xff;
	}
	
	for( i=0; i<MAP_ITM; i++ ) {
	    if( i == NowStage || i == NextStage ) continue;
	    planet[i].PrimCol += 0x10;
	    if( i == MP_SZ || i == MP_SX || i == MP_SY ) {
		if( planet[i].PrimCol > 0x90 )
		    planet[i].PrimCol = 0x90;
	    } else {
		if( planet[i].PrimCol > 0xff )
		    planet[i].PrimCol = 0xff;
	    }
	}
    }
    
    if( PointNum == 4 && t == 0.0f ) {
	Na_StartSystemSe( NA_SE_MAP_ZOOM_OUT );
    }
    
    if( PointNum == 5 && t == 0.0f ) {
	if( StageWayWork != 2 ) {
	    Line[line_no].KowinFlag = 2;
	    dot_cnt = 0;
	    kowin_stat = 100;
	    kowin_A = 255;
	    kirakiraA = 255;
	}
    }
    
    if( PointNum == -1 ) {
	/** つぎのステージの分岐ラインを表示 **/
	NextlineNM = -1;
	if( planet[NextStage].NextPlanetNm != -1 ) {
	    lineNm =
		GetPlanetLine( NextStage,planet[NextStage].NextPlanetNm );
	    ClearRootLine[lineNm] = 1;
	    Line[lineNm].PrimCol = 0xff;
	    NextlineNM = lineNm;
	}
	NextlineSP = -1;
	if( planet[NextStage].NextPlanetSp != -1 ) {
	    lineSp =
		GetPlanetLine( NextStage,planet[NextStage].NextPlanetSp );
	    ClearRootLine[lineSp] = 1;
	    Line[lineSp].PrimCol = 0xff;
	    NextlineSP = lineSp;
	}
	wait_time3 = 50;
	work_phase++;
    }
}

/************************************************************************/
/* カメラ移動 (引く)							*/
/************************************************************************/
static void CameraZoomOut( float tt )
{
    xyz_t pos[2];

    if( PointNum != -1 ) {
	get_splin_pos( pos, &eye[PointNum], &way[PointNum], t );
	EyeX = pos[0].x;
	EyeY = pos[0].y;
	EyeZ = pos[0].z;
	WayX = pos[1].x;
	WayY = pos[1].y;
	WayZ = pos[1].z;

	t += tt;
	if( t > 1.0f ) {
	    t = 0.0f;
	    PointNum++;
	    if( PointNum > 8-3 ) PointNum = -1;
	}
    }
}

/************************************************************************/
/* 2次スプライン曲線近似						*/
/************************************************************************/
static void get_splin_pos( xyz_t *p, xyz_t *edat, xyz_t *wdat, float t )
{
    float b1,b2,b3;

    b1 = 0.5f * ((1.0f-t)*(1.0f-t));
    b2 = (-t+1.0f) * t + 0.5f;
    b3 = (t*t) * 0.5f;

    p->x = (b1*((edat+0)->x))+(b2*((edat+1)->x))+(b3*((edat+2)->x));
    p->y = (b1*((edat+0)->y))+(b2*((edat+1)->y))+(b3*((edat+2)->y));
    p->z = (b1*((edat+0)->z))+(b2*((edat+1)->z))+(b3*((edat+2)->z));

    (p+1)->x = (b1*((wdat+0)->x))+(b2*((wdat+1)->x))+(b3*((wdat+2)->x));
    (p+1)->y = (b1*((wdat+0)->y))+(b2*((wdat+1)->y))+(b3*((wdat+2)->y));
    (p+1)->z = (b1*((wdat+0)->z))+(b2*((wdat+1)->z))+(b3*((wdat+2)->z));
}



/*----------------------------------------------------------------------*/
/*									*/
/* ゲームオーバー							*/
/*									*/
/*----------------------------------------------------------------------*/
static float ovx[8] = {-248.0f,-76.0f,84.0f,248.0f,
		       -242.0f,-79.0f,82.0f,245.0f};
static float ovy[8] = {80.0f,80.0f,80.0f,80.0f,
		       -30.0f,-30.0f,-30.0f,-30.0f};
static float ovz[8] = {-455.0f,-455.0f,-455.0f,-455.0f,
		       -455.0f,-455.0f,-455.0f,-455.0f};

static float ovx2[8] = {-248.0f,-76.0f,84.0f,248.0f,
		       -242.0f,-79.0f,82.0f,245.0f};
static float ovy2[8] = {80.0f,80.0f,80.0f,80.0f,
		       -30.0f,-30.0f,-30.0f,-30.0f};
static float ovz2[8] = {1000.0f,1000.0f,1000.0f,1000.0f,
			1000.0f,1000.0f,1000.0f,1000.0f};

static float *ovadx[2] = {ovx2,ovx};
static float *ovady[2] = {ovy2,ovy};
static float *ovadz[2] = {ovz2,ovz};
static int overMojiCnt;

/************************************************************************/
/* ゲームオーバー処理メイン						*/
/************************************************************************/
static void map_gameover( void )
{
    register int i;
    float res;

    switch( process_phase ) {
    case 0:
	fade_R = 0x00;
	fade_G = 0x00;
	fade_B = 0x00;
	fade_A = 0xff;
	for( i=0; i<8; i++ ) {
	    overX[i] = ovx2[i];
	    overY[i] = ovy2[i];
	    overZ[i] = ovz2[i];
	}
	overXad = ovadx[1];
	overYad = ovady[1];
	overZad = ovadz[1];
	overSW = 0;
	eyect_A = 255.0f;
	overScl = 1.0f;
	process_phase = 10;
	Na_StartBgm( NA_BGM_GAME_OVER );
	break;
    case 10:
	res = add_calc( &eyect_A, 0.0f, 1.0f, 100.0f, 1.0f );
	fade_A = (int)eyect_A;
	if( res == 0.0f ) {
	    fade_A = 0x00;
	    wait_time3 = 0;
	    process_phase = 20;
	}
	break;
    case 20:
	if( wait_time3 ) break;
	work_phase = 0;
	wait_time3 = 0;
	process_phase = 1;
	break;
    case 1:
	if( overSW ) CamYaAdd += 0.03f;
	if( wait_time3 ) break;
	GameOverDispCtrl();
	break;
    case 2:
	StageRootDispCtrl();
	break;
    case 3:
	fade_A += 0x20;
	if( fade_A > 0xff ) {
	    fade_A = 0xff;
	    process_phase++;
	}
	break;
    case 4:
	system_mode = OPTION;
	system_time = 2;
	option_mode = OPTION_WAIT;
	display_mode = DISPLAY_NOTH;
	Back_star_f = OFF;
	break;
    }

    if( Key_T[cont_num].button & (CONT_A|CONT_START) ) {
	Na_StartSystemSe( NA_SE_DECIDE );
	process_phase = 3;
    }
}

/************************************************************************/
/* "ＧＡＭＥ ＯＶＥＲ" 表示コントロール					*/
/************************************************************************/
static void GameOverDispCtrl( void )
{
    register int i;
    int aa;
    float res[8],res1[8],res3[8];
    
    switch( work_phase ) {
    case 0:
	for( i=0; i<8; i++ ) {
	    if( !overSW ) overTime[i] = i*4;
	    else          overTime[i] = i*3;
	    overXa[i] = 0.0f;
	    overYa[i] = 0.0f;
	    overEnd[i] = OFF;
	}
	work_phase++;
	break;
    case 1:	/** 画面にはいってくる **/
	for( i=0; i<8; i++ ) {
	    if( overTime[i] != 0 ) {
		overTime[i]--;
		continue;
	    }
	    res[i] = add_calc( &overX[i],
			       *(overXad+i),0.05f, 100.0f, 10.0f );
	    res1[i] = add_calc( &overY[i],
				*(overYad+i),0.05f, 100.0f, 10.0f );
	    res3[i] = add_calc( &overZ[i],
				*(overZad+i),0.1f, 100.0f, 0.1f );
	    if( res[i] == 0.0f && res1[i] == 0.0f && res3[i] == 0.0f) {
		overXa[i] = 0.0f;
		if( res3[i] == 0.0f ) {
		    overEnd[i] = ON;
		}
	    } else {
		overXa[i] += 10.0f;
	    }
	}

	aa = 1;
	for( i=0; i<8; i++) {
	    if( overEnd[i] == OFF ) {
		aa = 0;
		break;
	    }
	}
	if( aa == 1 ) {
	    overMoveSw = OFF;
	    for( i=0; i<8; i++ ) {
		overXa[i] = 0.0f;
		overTime[i] = i*10;
		overEnd[i] = OFF;
	    }
	    wait_time3 = 60;
	    wait_time2 = 85;
	    work_phase = 11;
	}
	break;
    case 11:
	if( wait_time3 ) break;
	if( wait_time2 ) {
	    for( i=0; i<8; i++ ) {
		add_calc( &overXa[i], 360.0f, 0.3f, 100.0f, 1.0f );
		add_calc( &overYa[i], 360.0f, 0.3f, 100.0f, 1.0f );
	    }
	} else {
	    work_phase = 10;
	}
	break;
    case 10:
	if( !wait_time ) {
	    if( !overSW ) {
		Prim1 = 0.0f;
		wait_time = 25;
		work_phase = 3;
	    } else {
		for( i=0; i<8; i++ ) {
		    overXa[i] = 0.0f;
		    overYa[i] = 0.0f;
		    overEnd[i] = OFF;
		}
		overMojiCnt = 0;
		overTime[0] = 4;
		work_phase = 2;
	    }
	}
	break;
    case 2:
	if( overTime[0] ) {
	    overTime[0]--;
	} else {
	    overMojiCnt++;
	    if( overMojiCnt > 8 ) {
		overMojiCnt = 8;
		aa = 1;
		for( i=0; i<8; i++ ) {
		    if( overEnd[i] == OFF ) {
			aa = 0;
			break;
		    }
		}
		if( aa ) {
		    overMojiCnt = 0;
		    overTurnPtr ^= 1;
		    overXad = ovadx[overTurnPtr];
		    overYad = ovady[overTurnPtr];
		    overZad = ovadz[overTurnPtr];

		    wait_time3 = 15;
		    if( overTurnPtr ) {
			wait_time3 = 240;
		    }
		    work_phase = 0;
		}
	    } else {
		overTime[0] = 4;
	    }
	}

	for( i=0; i<overMojiCnt; i++ ) {
	    if( overEnd[i] == ON ) continue;
	    if( overYa[i] > 360.0f ) {
		overYa[i] = 0.0f;
		overEnd[i] = ON;
	    } else {
		overYa[i] += 10.0f;
	    }
	}
	break;
    case 3:
	if( wait_time ) break;
	for( i=0; i<8; i++) {
	    overXa[i] += 30.0f;
	    overZ[i] += -300.0f;
	    if( overZ[i] <= -120000.0f ) {
		overZ[i] = -12000.0f;
	    }
	}
	if( overZ[0] <= -11000.0f ) {
	    Prim1 += 32.0f;
	    if( Prim1 > 255.0f ) Prim1 = 255.0f;
	    for( i=0; i<MAP_ITM; i++ ) {
		planet[i].PrimCol = (int)Prim1;
		prim_col = (int)Prim1;
		if( i == MP_SZ || i == MP_SX || i == MP_SY ) {
		    if( planet[i].PrimCol > 0x90 ) planet[i].PrimCol = 0x90;
		}
	    }
	}
	
	if( Prim1 == 255.0f ) {
	    overScl = 0.0f;
	    process_phase = 2;
	    work_phase = 0;
	}
	break;
    }
}

/************************************************************************/
/* 進んだルート表示コントロール						*/
/************************************************************************/
static void StageRootDispCtrl( void )
{
    register int i;

    switch( work_phase ) {
    case 0:
	if( StagePtr == 0 ) {
	    wait_time3 = 45;
	    work_phase = 3;
	} else {
	    work_phase++;
	}
	break;
    case 1:
	if( StagePtr == StageCnt ) {
	    work_phase = 3;
	    wait_time3 = 45;
	    break;
	}
	/** ワープ **/
	if( Line[OverRootLine[StageCnt]].LineCol == 3 ||
	    Line[OverRootLine[StageCnt]].LineCol == 4 ) {
	    ClearRootLine[OverRootLine[StageCnt]] = 5;
	    Line[OverRootLine[StageCnt]].KowinFlag = 5;
	} else {
	    ClearRootLine[OverRootLine[StageCnt]] = 2;
	    Line[OverRootLine[StageCnt]].KowinFlag = 0;
	}
	Line[OverRootLine[StageCnt]].PrimCol = 0xff;
	kirakiraA = 255;
	kowin_A = 255;
	work_phase++;
	break;
    case 2:
	if( ClearRootLine[OverRootLine[StageCnt]] == 3 ||
	    ClearRootLine[OverRootLine[StageCnt]] == 6 ) {
	    StageCnt++;
	    work_phase = 1;
	}
	break;
    case 3:
	if( wait_time3 ) break;
	for( i=0; i<8; i++ ) {
	    overX[i] = ovx2[i];
	    overY[i] = ovy2[i];
	    overZ[i] = ovz2[i];
	}
	rect_sw = ON;
	overSW = 1;
	overTurnPtr = 1;
	overXad = ovadx[1];
	overYad = ovady[1];
	overZad = ovadz[1];
	overScl = 1.0f;
	wait_time3 = 450;
	work_phase = 0;
	process_phase = 1;
	break;
    }
}


#if 0
/************************************************************************/
/* ゲームオーバー時の残機数爆発の描画					*/
/************************************************************************/
static void draw_OverBomb( void )
{
    if( !bomb2_stat ) return;

    switch( bomb2_stat ) {
    case 1:
	wait_time3 = 2;
	bomb2_stat = 2;
	break;
    case 2:
	if( wait_time3 ) break;
	if( bomb_p+1 > 3 ) {
	    bomb_p = 0;
	    bomb2_stat = 0;
	} else {
	    bomb_p++;
	    bomb2_stat = 1;
	}
	break;
    }	    

    rcpsetmode( &NOW_DISP, TEXE_Z );

    push_now();
    mult_now( &planet_Mtx[NowStage], MULT_MTX );
    scale_now( 3.0f, 3.0f, 3.0f, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, bombs[bomb_p] );
    pull_now();
}
#endif

/************************************************************************/
/* ゲームオーバーの描画							*/
/************************************************************************/
static void draw_gameover( void )
{
    register int i;

    static Gfx *pmtxt[] = {
	MOJI_pol_G,
	MOJI_pol_A,
	MOJI_pol_M,
	MOJI_pol_E,
	MOJI_pol_O,
	MOJI_pol_V,
	MOJI_pol_E,
	MOJI_pol_R,
    };

    light_in(
	0,		/* ライトの方向 X */
	0,		/* ライトの方向 Y */
	127,		/* ライトの方向 Z */
	0x1c,		/* ライトの色   R */
	0x3a,		/* ライトの色   G */
	0x69,		/* ライトの色   B */
	0x41,		/* 環境光の色   R */
	0x46,		/* 環境光の色   G */
	0x30 );		/* 環境光の色   B */

    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();
    set_lookat_now( 0.0f, 0.0f, 500.0f,
		    0.0f, 0.0f, -500.0f,
		    0.0f, 1.0f, 0.0f, MULT_MTX );

    set_matrix(&NOW_DISP);
    for( i=0; i<8; i++ ) {
	push_now();
	translate_now( overX[i], overY[i], overZ[i], MULT_MTX );
	rotateY_now( ANGLE(overYa[i]), MULT_MTX );
	rotateX_now( ANGLE(overXa[i]), MULT_MTX );
	scale_now( overScl, overScl, overScl, MULT_MTX );
	set_matrix(&NOW_DISP);
	gSPDisplayList( NEXT_DISP, pmtxt[i] );
	pull_now();
    }

//    mxa += 15.0f;
//    mya += 15.0f;
    pull_now();

#if 0
{
    static int pp=0;
    
    if( Key_T[0].button & CONT_R ) {
	pp += 1;
	if( pp > 7 ) pp=0;
    }
    if( Key_T[0].button & CONT_L ) {
	pp -= 1;
	if( pp < 0 ) pp=7;
    }
    if( Key[0].button & CONT_UP ) {
	overY[pp] += 1.0f;
    }
    if( Key[0].button & CONT_DOWN ) {
	overY[pp] -= 1.0f;
    }
    if( Key[0].button & CONT_LEFT ) {
	overX[pp] -= 1.0f;
    }
    if( Key[0].button & CONT_RIGHT ) {
	overX[pp] += 1.0f;
    }
    if( Key[0].button & CONT_E ) {
	overZ -= 1.0f;
    }
    if( Key[0].button & CONT_D ) {
	overZ += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f z:%f\n",
	    pp,overX[pp],overY[pp],overZ );
}
#endif
}

/************************************************************************/
/* カメラ移動								*/
/************************************************************************/
static void move_camera( float speed )
{
    float xx,yy,zz,rr,ang;

    /* 減速接近計算 */
    add_calc( &WeyeX, Weye.x, speed, 100.0f, 0.1f );
    add_calc( &WeyeY, Weye.y, speed, 100.0f, 0.1f );
    add_calc( &EyeZ,  Weye.z, speed, 100.0f, 0.1f );

    xx=(Weye.x-WeyeX);
    yy=(Weye.y-WeyeY);
    zz=(Weye.z-EyeZ);
    rr=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );

    ang=ANGLE((1-(rr/rrv))*180.0f);

    EyeX = WeyeX * (1+sinf(ang)*1.1f);
    EyeY = WeyeY * (1+sinf(ang)*1.3f);

#if 0
    PRINTF( "rr=%f rrv=%f\n",rr,rrv );
    PRINTF( "rr/rrv=%f ang=%f\n\n",rr/rrv,((1-(rr/rrv))*180.0) );
    PRINTF( "eX=%f eY=%f eZ=%f\n",EyeX,EyeY,EyeZ );
#endif
}

/************************************************************************/
/* 視点移動								*/
/************************************************************************/
static void move_waypoint( float speed )
{
    /*float xx,yy,zz,rr,ang;*/

    /* 減速接近計算 */
    add_calc( &WWwayX, Wway.x, speed, 100.0f, 0.1f );
    add_calc( &WWwayY, Wway.y, speed, 100.0f, 0.1f );
    add_calc( &WayZ,   Wway.z, speed, 100.0f, 0.1f );

    WayX = WWwayX;
    WayY = WWwayY;

#ifdef CCC
    xx=(WwayX-WWwayX);
    yy=(WwayY-WWwayY);
    zz=(WwayZ-WayZ);
    rr=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );

    if( rrvw == 0.0f ) rr = 0.0f;
    else               rr = rr/rrvw;

    ang=ANGLE((1-rr)*180.0f);

    WayX = WWwayX * (1+sinf(ang)*1.0f);
    WayY = WWwayY * (1+sinf(ang)*1.1f);
#endif

#if 0
    PRINTF( "rr=%f rrvw=%f\n",rr,rrvw );
    PRINTF( "rr/rrvw=%f ang=%f\n\n",rr/rrvw,((1-(rr/rrvw))*180.0) );
    PRINTF( " X=%f  Y=%f  Z=%f\n",WayX,WayY,WayZ );
    PRINTF( "wX=%f wY=%f wZ=%f\n\n",WwayX,WwayY,WwayZ );
#endif
}

/************************************************************************/
/* ステージクリア後のコース選択						*/
/************************************************************************/
static void menu_ctrl( void )
{
    register int i;
    int work;

    switch( work_phase ) {
    case 0:
	MenuKeyIn();
	break;
    case 1:
	if( psel_flush_cnt[psel] ) break;

//	if( (StageWayWork && psel == 2) || (!StageWayWork && psel == 1) ) {
	if( CourseSel_f ) {
	    /** ゲームをやりなおすを選択した  **/
	    if( Player_zanki[PL_NO] ) {
		Na_PlayLostSound();
		bomb_stat = 1;
		bomb_p = 0;
		wait_time = 120;
	    } else {
		/** 残機０の場合,即ゲームオーバーへ **/
		over_f = ON;
		wait_time = 0;
	    }
	} else {
	    /** それ以外 **/
	    wait_time = 0;
	}
	MenuOpen_f = OFF;
	work_phase = 2;
	break;
    case 2:
	if( bomb_stat && wait_time == 110 ) {
	    /** ゲームをやりなおすを選択したときは  **/
	    /** 爆発アニメーション中に１機減らす    **/
	    Player_zanki[PL_NO] -= 1;
	}
	if( wait_time ) break;
	bomb_stat = 0;
	work = psel;
	if( StageWayWork ) work += 2;
	menu_ctrl_sub( work );
	if( psel == 0 ) {
	    /** ステージ開始前の仲間状態セーブ **/

	    for( i=0; i<6; i++ ) {
		nakama_shield_MAP[i] = nakama_shield[i];
	    }

	    MenuWin_f = OFF;
	    process_phase = 0;
	    map_phase = CAM_ZOOM;
	} else {
	    map_phase = CAM_NOMV;
	}
	work_phase = 0;
	break;
    }
}

/************************************************************************/
/* ステージクリア後のコース選択	SUB					*/
/************************************************************************/
static void menu_ctrl_sub( int num )
{
    switch( num ) {
    case 0:	/* 分岐なし コースを進める */
    case 2:	/* 分岐あり コースを進める */
	/* 現状のまま */
	break;
    case 1:	/* 分岐なし */
    case 4:	/* 分岐あり */
//	if( !Player_zanki[PL_NO] ) { /* ゲームをやりなおす(GAME OVER) */
	if( over_f ) { /* ゲームをやりなおす(GAME OVER) */
	    EndGame();
	} else {		 /* コースをやりなおす(１機失う) */
	    RetryStage();
	}
	break;
    case 3:	/* 分岐あり コースを変える */
	ChageCourse();
	break;
    }
}

/************************************************************************/
/* ステージクリア後のコース選択 キー入力				*/
/************************************************************************/
static void MenuKeyIn( void )
{
    float ret;

    if( keyin_move_cur() ) {
	psel_col[psel] = 255.0f;
	if( StageWayWork ) {
	    if( keyin_count < 0 ) {
		psel++;
		if( psel > 2 ) psel = 0;
	    } else {
		psel--;
		if( psel < 0 ) psel = 2;
	    }
	} else {
	    psel = psel^1;
	}
    }
    ret = add_calc( &psel_col[psel], psel_chg_col, 0.5f, 100.0f, 1.0f );
    if( ret==0.0f ) {
	if( psel_chg_col==32.0f ) psel_chg_col	= 255.0f;
	else			  psel_chg_col	=  32.0f;
    }

    if( Key_T[cont_num].button & (CONT_B | CONT_START) ) {
	Na_CloseMapMenu();
	MenuOpen_f = OFF;
	map_phase = CAM_NOMV;
	return;
    }

    if( Key_T[cont_num].button & CONT_A ) {
	Na_CloseMapMenu();
	Na_StartSystemSe( NA_SE_DECIDE );
	psel_flush_cnt[psel] = 10;
	/** コースをやりなおすを選択 **/
	if( (StageWayWork && psel == 2) || (!StageWayWork && psel == 1) ) {
	    CourseSel_f = ON;
	    zanki_flush_cnt = 10;
	}
	work_phase = 1;
	return;
    }
}

/************************************************************************/
/* ゲームをやりなおす(GAME OVER)				  	*/
/************************************************************************/
static void EndGame( void )
{
    /* ゲームオーバーへ */
    Back_star_f = OFF;
    system_mode = OVER;
    pause_mode = OVER_WAIT;
    system_time = 2;
    display_mode = DISPLAY_NOTH;
}

/************************************************************************/
/* コースをやりなおす(１機失う)					  	*/
/************************************************************************/
static void RetryStage( void )
{
    register int i;
    int lsp,lnm;

    PL_NO = 0;

    /* 仲間ステージ開始前の状態に復帰 */
    for( i=0; i<6; i++ ) {
	nakama_shield_S[i] = nakama_shield_MAP[i];
	nakama_shield[i] = nakama_shield_MAP[i];
	nakama_shield_GTR[i] = nakama_shield_MAP[i];
    }
    /** 次のステージから復活するヤツの(nakama_shield_GTR:0)をに255しておく **/
    for( i=1; i<4; i++ ) {
	if( nakama_shield_GTR[i] == 0 ) nakama_shield_GTR[i] = 255;
    }

    /* １機減らす */
//    Player_zanki[PL_NO] -= 1;
    Player_beam_power[PL_NO] = 0;
    Bomb_Count[PL_NO] = 3;

    if( planet[NowStage].NextPlanetNm != -1 ) {
	lnm = GetPlanetLine( NowStage,planet[NowStage].NextPlanetNm );
	ClearRootLine[lnm] = 0;
	Line[lnm].PrimCol = 0x00;
    }
    if( planet[NowStage].NextPlanetSp != -1 ) {
	lsp = GetPlanetLine( NowStage,planet[NowStage].NextPlanetSp );
	ClearRootLine[lsp] = 0;
	Line[lsp].PrimCol = 0x00;
    }
    if( planet[NowStage].NextPlanetWp != -1 ) {
	lsp = GetPlanetLine( NowStage,planet[NowStage].NextPlanetWp );
	ClearRootLine[lsp] = 0;
	Line[lsp].PrimCol = 0x00;
    }

    Line[line_no].KowinFlag = 0;
    dot_cnt = 0;
    kowin_stat = 0;
    kowin_A = 255;
    kirakiraA = 255;

    total_score -= ClearHitCount[StagePtr-1];
    ClearStageNum[StagePtr] = -1;
    ClearHitCount[StagePtr-1] = 0;
    ClearKunsyou[StagePtr-1] = 0;
    NakamaDied[StagePtr-1] = 0x00ffffff;
    game_score = 0;
    StagePtr -= 1;

    hi_score = get_HiScore();

    NowStage = NowStageWk;
    if( planet[NowStage].NextPlanetNm != -1 ) {
	lnm = GetPlanetLine( NowStage,planet[NowStage].NextPlanetNm );
	ClearRootLine[lnm] = 1;
	Line[lnm].PrimCol = 0xff;
    }
    if( planet[NowStage].NextPlanetSp != -1 ) {
	lsp = GetPlanetLine( NowStage,planet[NowStage].NextPlanetSp );
	ClearRootLine[lsp] = 1;
	Line[lsp].PrimCol = 0xff;
    }
    if( planet[NowStage].NextPlanetWp != -1 ) {
	lsp = GetPlanetLine( NowStage,planet[NowStage].NextPlanetWp );
	ClearRootLine[lsp] = 0;
	Line[lsp].PrimCol = 0x00;
    }

    /* TEST */
    StageNoSet();
}

/************************************************************************/
/* コースを変える						  	*/
/************************************************************************/
static void ChageCourse( void )
{
    int lsp,lnm;

    course_sw ^= 1;

    if( planet[NowStage].NextPlanetNm != -1 ) {
	lnm = GetPlanetLine( NowStage,planet[NowStage].NextPlanetNm );
	ClearRootLine[lnm] = 0;
	Line[lnm].PrimCol = 0x00;
    }
    if( planet[NowStage].NextPlanetSp != -1 ) {
	lsp = GetPlanetLine( NowStage,planet[NowStage].NextPlanetSp );
	ClearRootLine[lsp] = 0;
	Line[lsp].PrimCol = 0x00;
    }

    ClearRootLine[line_no] = 0;
    Line[line_no].PrimCol = 0x00;
    Line[line_no].KowinFlag = 0;
    
    NowStage = NowStageWk;

    /* コース変更 */
    if( !course_sw ) {
	NextStage = planet[NowStage].NextPlanetNm;
    } else {
	if( StageWayWork != 2 ) {	/** 分岐 **/
	    if( planet[NowStage].NextPlanetSp != -1 )
		NextStage = planet[NowStage].NextPlanetSp;
	    else
		NextStage = planet[NowStage].NextPlanetNm;
	} else {		/** ワープ分岐 **/
	    if( planet[NowStage].NextPlanetWp != -1 )
		NextStage = planet[NowStage].NextPlanetWp;
	    else
		NextStage = planet[NowStage].NextPlanetNm;
	}
    }

    line_no = GetPlanetLine( NowStage,NextStage );
    Line[line_no].PrimCol = 0xff;
    ClearRootLine[line_no] = 3;
    Line[line_no].KowinFlag = 2;
    /** 復帰ルートがワープのとき **/
    if( Line[line_no].LineCol == 3 || Line[line_no].LineCol == 4 ) {
	ClearRootLine[line_no] = 5;
	Line[line_no].KowinFlag = 5;
    }

    dot_cnt = 0;
    kowin_stat = 100;
    kowin_A = 255;
    kirakiraA = 255;

    NowStage = NextStage;
    ClearStageNum[StagePtr] = NowStage;
    /* TEST */
    StageNoSet();

    if( planet[NextStage].NextPlanetNm != -1 ) {
	lnm =
	    GetPlanetLine( NextStage,planet[NextStage].NextPlanetNm );
	ClearRootLine[lnm] = 1;
	Line[lnm].PrimCol = 0xff;
    }
    if( planet[NextStage].NextPlanetSp != -1 ) {
	lsp =
	    GetPlanetLine( NextStage,planet[NextStage].NextPlanetSp );
	ClearRootLine[lsp] = 1;
	Line[lsp].PrimCol = 0xff;
    }
}

/************************************************************************/
/* キー入力（縦方向のみ）					  	*/
/************************************************************************/
static int keyin_move_cur( void )
{
    int  ret = 0;
    int  yy;

    yy = Key_T[cont_num].stick_y;
    /* あそび */
    if( yy > -40 && yy < 40  ) 	yy = 0;

    if( yy ) {
	if( !keyin_count ) ret = 1;
	keyin_count = yy;
    } else {
	keyin_count = 0;
    }
    
    if( ret ) Na_StartSystemSe( NA_SE_CURSOR );

    return( ret );
}

/************************************************************************/
/* ステージクリア後の選択ウインドウの描画				*/
/************************************************************************/
static void menu_display( void )
{
//    static float mx = 14.0f,mys = 1.1f;

    register int i;
    float messX,messY,messYY;
    unsigned short *txt;
    int idx,idx2;
    int mask;
    int moji_colR[3];
    int moji_colG[3];
    int moji_colB[3];
    static float messYs[] = { 3.05f, 4.15f };

    messX = 101.0f;
    messY = 92.0f;
    messYY = 0.0f;
    idx = 0;

    for( i=0; i<3; i++ ) {
	moji_colR[i] = 0x40;
	moji_colG[i] = 0x40;
	moji_colB[i] = 0x40;
	if( i == psel ) {
	    moji_colR[i] = 0xff;
	    moji_colG[i] = (int)psel_col[i];
	    moji_colB[i] = (int)psel_col[i];
	}
    }

    
    idx2 = 1;
    if( !StageWayWork ) idx2 = 0;

    if( Player_zanki[PL_NO] ) {
	/* コースをやりなおす */
	txt = MAP_yarinaosi01_txt;
    } else {
	/* ゲームをやりなおす */
	txt = MAP_yarinaosi02_txt;
    }

    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    /* メッセージボード */
    gDPSetPrimColor( NEXT_DISP, 0, 0,  60,  60, 255, 170 );
    texture_rectangleIA8( &NOW_DISP, MAP_mess_txt, 24, 17,
 			  messX, messY, 4.6f, messYs[idx2] );



    /* コースをすすめる */
    mask = 0xffffffff;
    if( psel_flush_cnt[idx] != 0 ) {
	mask = 0x01;
	psel_flush_cnt[idx]--;
    }
    if( frcnt & mask ) {
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0,
			 moji_colR[idx],
			 moji_colG[idx],
			 moji_colB[idx], 255 );
	texture_rectangleIA8( &NOW_DISP, MAP_susumeru_txt,
			      88, 10, messX+14.0f, messY+6.0f,
			      1.0f, 1.0f );
    }
    messYY = 24.0f;
    idx += 1;

    if( StageWayWork ) { /* 分岐した,またはワープした */
	/* コースをかえる */
	mask = 0xffffffff;
	if( psel_flush_cnt[idx] != 0 ) {
	    mask = 0x01;
	    psel_flush_cnt[idx]--;
	}
	if( frcnt & mask ) {
	    gDPSetPrimColor( NEXT_DISP, 0, 0,
			     moji_colR[idx],
			     moji_colG[idx],
			     moji_colB[idx], 255 );
	    texture_rectangleIA8( &NOW_DISP, MAP_kaeru_txt,
				  80, 10, messX+14.0f, messY+messYY,
				  1.0f, 1.0f );
	}
	messYY += 18.0f;
	idx += 1;
    }

    /** コースをやりなおす **/
    mask = 0xffffffff;
    if( psel_flush_cnt[idx] != 0 ) {
	mask = 0x01;
	psel_flush_cnt[idx]--;
    }
    if( frcnt & mask ) {
	gDPSetPrimColor( NEXT_DISP, 0, 0,
			 moji_colR[idx],
			 moji_colG[idx],
			 moji_colB[idx], 255 );
	texture_rectangleIA8( &NOW_DISP, txt,
			      96, 22, messX+9.0f, messY+messYY,
			      1.0f, 1.0f );
    }



#if 0
    if( Key[3].button & CONT_LEFT ) {
	mx -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	mx += 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	mys -= 0.1f;
    }
    if( Key[3].button & CONT_UP ) {
	mys += 0.1f;
    }

    PRINTF( "mx:%f mys:%f\n",mx,mys );
#endif
}

/************************************************************************/
/* "コースをやりなおす"選択時の残機数爆発の描画				*/
/************************************************************************/
static void draw_bomb( void )
{
    float xx,yy,zz;
    float sc;

    if( !bomb_stat ) return;

    xx=45.0f;
    yy=32.0f;
    zz=0.01f;
    
    if( Player_zanki[PL_NO] < 10 ) sc = 0.13f;
    else                           sc = 0.18f;

    switch( bomb_stat ) {
    case 1:
	wait_time3 = 2;
	bomb_stat = 2;
	break;
    case 2:
	if( wait_time3 ) break;
	if( bomb_p+1 > 3 ) {
	    bomb_p = 0;
	    bomb_stat = 0;
	} else {
	    bomb_p++;
	    bomb_stat = 1;
	}
	break;
    }	    

    /** 1997年 2月17日(月曜日) 22時21分31秒 JST るりらるる **/
    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);

    rcpsetmode( &NOW_DISP, TEXE_Z );

    push_now();
    translate_now( xx, yy, zz, MULT_MTX );
    scale_now( sc, sc, sc, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, bombs[bomb_p] );
    pull_now();

#if 0
    if( Key[3].button & CONT_L ) {
	zz -= 10.0f;
    }
     if( Key[3].button & CONT_R ) {
	zz += 10.0f;
    }
    if( Key[3].button & CONT_UP ) {
	yy += 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	yy -= 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	xx += 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	xx -= 1.0f;
    }
    if( Key[3].button & CONT_E ) {
	sc += 0.01f;
    }
    if( Key[3].button & CONT_D ) {
	sc -= 0.01f;
    }

    PRINTF( "x:%f y:%f z:%f s:%f\n",xx,yy,zz,sc );
#endif

}

#if 0
/************************************************************************/
/* "スタートボタン で メニューウインドウ"の描画			  	*/
/************************************************************************/
static void OpenWindow_display( void )
{
#if 1
    float mx = 2.0f,my = 1.1f;
    float messX = 24.0f;
    float messY = 37.0f;
    float mxs = 3.3f;
    float mys = 1.7f;
#else
    static float mx = 2.0f,my = 1.1f;
    static float messX = 24.0f;
    static float messY = 37.0f;
    static float mxs = 3.3f;
    static float mys = 1.7f;
#endif
    int ret;
    int col;
    
    ret = add_calc( &menu_col, menu_chg_col, 0.5f, 100.0f, 1.0f );
    if( ret==0.0f ) {
	if( menu_col==32.0f ) menu_chg_col = 255.0f;
	else		      menu_chg_col =  32.0f;
    }

    col = (int)menu_col;
    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    /* メッセージボード */
    gDPSetPrimColor( NEXT_DISP, 0, 0,  60,  60, 255, 170 );
    texture_rectangleIA8( &NOW_DISP, MAP_mess_txt, 24, 17,
 			  messX, messY, mxs, mys );

    /* スタートボタンでメニューウインドウ */
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, col, col, 255 );
    texture_rectangleIA8( &NOW_DISP, MAP_window_txt,
			  80, 15, messX+mx, messY+my,
			  1.0f, 1.0f );
    texture_rectangleIA8( &NOW_DISP, MAP_window_txt+(80*15),
			  80, 11, messX+mx, messY+my+15.0f,
			  1.0f, 1.0f );

#if 0
    if( Key[2].button & CONT_LEFT ) {
	mx -= 1.0f;
    }
    if( Key[2].button & CONT_RIGHT ) {
	mx += 1.0f;
    }
    if( Key[2].button & CONT_DOWN ) {
	my += 1.0f;
    }
    if( Key[2].button & CONT_UP ) {
	my -= 1.0f;
    }

    if( Key[3].button & CONT_LEFT ) {
	messX -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	messX += 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	messY += 1.0f;
    }
    if( Key[3].button & CONT_UP ) {
	messY -= 1.0f;
    }

    if( Key[3].button & CONT_C ) {
	mxs -= 0.1f;
    }
    if( Key[3].button & CONT_F ) {
	mxs += 0.1f;
    }
    if( Key[3].button & CONT_D ) {
	mys -= 0.1f;
    }
    if( Key[3].button & CONT_E ) {
	mys += 0.1f;
    }

    PRINTF( "mesX:%f mesY:%f mesXs:%f mesYs:%f mx:%f my:%f\n",
	    messX,messY,mxs,mys,mx,my );
#endif
}
#endif

/************************************************************************/
/* ワイプ処理								*/
/************************************************************************/
static void wip( void )
{
    switch( wip_stat ) {
    case 0:
	wip_time = 0;
	msg_sp = 0x03;
	StageNoSet();
	MissonPass = misson_pass_check( NowStage );
	map_message_ad_set();
	wip_stat++;
	break;
    case 1: /* メッセージ表示 */

	if( Key_T[cont_num].button & CONT_START && !MissonPass ) {
	    Na_StopAllFlagSe( NA_SE_COMPUTER_NOISE );
	    Na_ClearMesVoice();
	    map_face_stat = 0;
	    wip_stat = 2;
	    wait_time = 0;
	}

	if( (Key_T[cont_num].button & CONT_A) &&
	    msg_sp == 0x01 && !MissonPass ) {
	    Na_ClearMesVoice();
	    face_time0 = 0;
	}

	if( (Key_T[cont_num].button & CONT_A) &&
	    msg_sp == 0x03 && !MissonPass ) {
	    msg_sp = 0x01;
	}

	if( map_face_stat != 7 ) break;
	wait_time = 10;
#if 0
	if( (Key_T[0].button & CONT_A) )
	    wip_stat++;
#else
	wip_stat++;
#endif
	break;
    case 2:
	if( wait_time ) break;
	if( wip_time < 120 ) {
	    wip_time += 15;
	    if( NowStage == MP_CN ) bakuSSw[0] = OFF;
	} else {
	    wait_time = 5;
	    map_face_stat = 0;
	    wip_stat++;
	}
	break;
    case 3:
	if( wait_time ) break;
	wait_time = 5;
	moji_sw2 = ON;
	wip_stat++;
	break;
    case 4:
	if( wait_time ) break;
	Na_StartSystemSe( NA_SE_GOOD_LUCK );
	wait_time = 75;
	wip_stat++;
	break;
    case 5:
	if( wait_time ) break;
	SoundModeChange( mapno );
#if 0
	if( Key_T[0].button & CONT_A ) {
	    wip_stat = 0;
	    moji_sw2 = OFF;
	    game_start();
	}
#else
	wip_stat = 0;
	moji_sw2 = OFF;
	game_start();
#endif
	break;
    }
}

/************************************************************************/
/* サウンドモードの切り替え						*/
/************************************************************************/
static void SoundModeChange( int stage )
{
    switch( stage ) {
    case CN:	/* コーネリア */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_CN);
	break;
    case AS:	/* アステロイド */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_AS);
	break;
    case TI:	/* タイタニア */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_TI);
	break;
    case AC:	/* アクエリア */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_AC);
	break;
    case BO:	/* 防衛衛星 */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_BO);
	break;
    case KT:	/* カタリナ */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_KT);
	break;
    case CL:	/* グレートフォックス号 */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_CL);
	break;
    case SZ:	/* セクターＺ */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_SZ);
	break;
    case FO:	/* フォーチュナ */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_FO);
	break;
    case SX:	/* セクターＸ */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_SX);
	break;
    case MC:	/* マクベス */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_MC);
	break;
    case ZO:	/* ゾネス */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_ZO);
	break;
    case SW:	/* セクターＹ */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_SW);
	break;
    case SN:	/* 太陽 */
	Na_ChangeSoundMode(NA_PLAY_1, NA_MODE_STAGE_SN);
	break;
    case BM:	/* ベノム */
	break;
    }
}

/************************************************************************/
/* 指令画面パスチェック							*/
/************************************************************************/
static int misson_pass_check( int stage ) 
{
    int num;
    int res;

    res = ON;

    switch( stage ) {
    case MP_CN:	/* コーネリア */
    case MP_AS:	/* アステロイド */
    case MP_TI:	/* タイタニア */
    case MP_AC:	/* アクエリア */
    case MP_BO:	/* 防衛衛星 */
    case MP_KT:	/* カタリナ */
    case MP_A6:	/* グレートフォックス号 */
    case MP_SZ:	/* セクターＺ */
    case MP_FO:	/* フォーチュナ */
    case MP_SX:	/* セクターＸ */
    case MP_MC:	/* マクベス */
    case MP_ZO:	/* ゾネス */
    case MP_SY:	/* セクターＹ */
	num = stage;
	break;
    case MP_SN:	/* 太陽 */
	num = 13;
	break;
    }

    if( (fox_save.rom[0].data.pl_stat[num].course_in & 0x01) ) res = OFF;

    return( res );
}

/************************************************************************/
/* ステージNO.セット							*/
/************************************************************************/
static void StageNoSet( void )
{
    switch( NowStage ) {
    case MP_CN:	/* コーネリア */
	mapno =  CN;
	break;
    case MP_AS:	/* アステロイド */
	mapno =  AS;
	break;
    case MP_TI:	/* タイタニア */
	mapno =  TI;
	break;
    case MP_AC:	/* アクエリア */
	mapno =  AC;
	break;
    case MP_BO:	/* 防衛衛星 */
	mapno =  BO;
	break;
    case MP_KT:	/* カタリナ */
	mapno =  KT;
	break;
    case MP_A6:	/* グレートフォックス号 */
	mapno =  CL;
	break;
    case MP_SZ:	/* セクターＺ */
	mapno =  SZ;
	break;
    case MP_FO:	/* フォーチュナ */
	mapno =  FO;	/* 360度 */
	break;
    case MP_SX:	/* セクターＸ */
	mapno =  SX;
	break;
    case MP_MC:	/* マクベス */
	mapno =  MC;
	break;
    case MP_ZO:	/* ゾネス */
	mapno =  ZO;
	break;
    case MP_SY:	/* セクターＹ */
	mapno =  SW;
	break;
    case MP_BM:	/* ベノム */
	mapno =  BM;
	break;
    case MP_SN:	/* 太陽 */
	mapno =  SN;
	break;
    }
}

/************************************************************************/
/*								 	*/
/************************************************************************/
static int GetPlanetNum( int map_no )
{
    int planet;

    switch( map_no ) {
    case CN:	/* コーネリア */
	planet = MP_CN;
	break;
    case AS:	/* アステロイド */
	planet = MP_AS;
	break;
    case TI:	/* タイタニア */
	planet = MP_TI;
	break;
    case AC:	/* アクエリア */
	planet = MP_AC;
	break;
    case BO:	/* 防衛衛星 */
	planet = MP_BO;
	break;
    case KT:	/* カタリナ */
	planet = MP_KT;
	break;
    case CL:	/* グレートフォックス号 */
	planet = MP_A6;
	break;
    case SZ:	/* セクターＺ */
	planet = MP_SZ;
	break;
    case FO:	/* フォーチュナ */
	planet = MP_FO;
	break;
    case SX:	/* セクターＸ */
	planet = MP_SX;
	break;
    case MC:	/* マクベス */
	planet = MP_MC;
	break;
    case ZO:	/* ゾネス */
	planet = MP_ZO;
	break;
    case SW:	/* セクターＹ */
	planet = MP_SY;
	break;
    case BM:	/* ベノム */
    case BM03:
    case AND:
	planet = MP_BM;
	break;
    case SN:	/* 太陽 */
	planet = MP_SN;
	break;
    }

    return( planet );
}

/************************************************************************/
/* ラインデータの取得						 	*/
/************************************************************************/
static int GetPlanetLine( int now, int next )
{
    register int i;

    for( i=0; i<LINES; i++ ) {
	if( Line[i].startP == now && Line[i].endP == next ) break;
    }   

    return( i );
}

/************************************************************************/
/* カメラズームスタート							*/
/************************************************************************/
static void zoom_start( void )
{
    /** 鳴っていたらこまるので消しておく **/
    Na_StopAllFlagSe( NA_SE_MAP_MOVE );
    Na_StopMapRollSe();
    
    if( NowStage != MP_CN )
	Na_StartSystemSe( NA_SE_DECIDE );
    /** ゲームスタート **/
    MenuWin_f = OFF;
    map_phase = CAM_ZOOM;
    process_phase = 0;
}

/************************************************************************/
/* ゲームスタート							*/
/************************************************************************/
static void game_start( void )
{
    system_mode = GAME;
    system_time = 2;
    game_mode = GAME_WAIT;
    display_mode = DISPLAY_NOTH;

    game_score = 0;
    /* ここから下は本当は PLAY の中のイニシャルでやるべきなのだが 。。。*/
    display_initial();
    
    ednext_S = 0;  /* コースポイントクリアー */
    scrposZ_S = 0.00f;

    Stage_Demo_On = 1;  /* ステージ別デモセット */
}

/************************************************************************/
/* 惑星 , アイコンの座標の取得						*/
/************************************************************************/
static void get_planet_pos( void )
{
    register int i;
    xyz_t ato;
    xyz_t mae;

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = 0.0f;

    for( i=0; i<MAP_ITM; i++ ) {
	push_now();
	rotateY_now( ANGLE(planet[i].Yang2), MULT_MTX );
	translate_now( planet[i].Xrange,
		       planet[i].Yrange, 0.0f, MULT_MTX );
	
	rotateY_now( ANGLE(-(planet[i].Yang2)), MULT_MTX );
	angle_hosei();
	set_matrix( &NOW_DISP );

	copy_MtxF( &planet_Mtx[i],MtxF_now );

	MtxF_Position_now( &mae,&ato );
	planet[i].Xpos=ato.x;
	planet[i].Ypos=ato.y;
	planet[i].Zpos=ato.z;
	pull_now();

	push_now();
	set_lookat_now( EyeX, EyeY, EyeZ, WayX, WayY, WayZ,
			vX, vY, vZ, MULT_MTX );
	translate_now( stX, stY, stZ, MULT_MTX );
	mult_now( &planet_Mtx[i], MULT_MTX );
	set_matrix(&NOW_DISP);

	MtxF_Position_now( &mae,&PlanetPos[i] );
	pull_now();
    }
}

/************************************************************************/
/* 惑星 , アイコンＺソート						*/
/************************************************************************/
static void planetZsort( void )
{
    register int j,k;
    int work;
#if 1
    for( j=0; j<MAP_ITM-1; j++ ) {
	for( k=j; k<MAP_ITM; k++ ) {
	    if( PlanetPos[drawIdxT[j]].z > PlanetPos[drawIdxT[k]].z ) {
		work = drawIdxT[j];
		drawIdxT[j] = drawIdxT[k];
		drawIdxT[k] = work;
	    }
	}
    }
#else
    for( j=0; j<MAP_ITM-1; j++ ) {
	for( k=j; k<MAP_ITM; k++ ) {
	    if( planet[drawIdxT[j]].Zpos > planet[drawIdxT[k]].Zpos ) {
		work = drawIdxT[j];
		drawIdxT[j] = drawIdxT[k];
		drawIdxT[k] = work;
	    }
	}
    }
#endif
    
}

/************************************************************************/
/* フェード								*/
/************************************************************************/
static void map_fade( void )
{
    switch( fade_sw ) {
    case IN:
	if( fade_A != 0 ) {
	    fade_A -= 0x05;
	} else {
	    fade_sw = End;
	}
	break;
    case OUT:
	if( fade_A != 0xff ) {
	    fade_A += 0x0f;
	} else {
	    fade_sw = End;
	}
	break;
    default:
	break;
    }
}

/************************************************************************/
/* 惑星 , アイコンの描画						*/
/************************************************************************/
static void draw_planet_main( int i )
{
    int mask;
    int disp;
    
    if( planet[i].PrimCol == 0 && i != NowStage ) return;

    if( i == NowStage && map_phase == CAM_ZOOM && flush_cnt != 0 )
	mask = 0x01;
    else
	mask = 0xffffffff;
	
    /** 勲章 **/
    disp = KunsyouDispCheck( i );
    
//    PRINTF( "i:%d disp:%d\n",i,disp );
    
    draw_planet_sub( i );
    draw_knsyou_sub( i );

    push_now();
    if( frcnt & mask ) {
	if( i == MP_TI ) draw_planet_ring1( i ); /** 惑星の環 (奥) **/

	if( disp == 1  && PlanetPos[i].z > knsyouZpos[i] &&
	    i != MP_A6 && i != MP_BO) {
	    /** ステージクリアー用勲章 **/
	    draw_knsyou( i );
	}

	draw_planet( i );

	/** ２枚目の太陽 **/
	if( i == MP_SN ) draw_sun2( i );

	/** 惑星 **/
	if( planet[i].flag == 4 ) {
	    if( i != MP_BM ) {
		/** 惑星の雲 **/
		if( i != MP_AC && i != MP_TI ) draw_kumo( i );
		/** 惑星の影 **/
		draw_planet_kage( i );
	    }
	    if( i == MP_BM ) {
		/** ベノムのガス (奥) **/
		draw_bm_gass( &BmGassZa1, 0.1f, 3.1f );
		/** ベノムのガス (手前) **/
		draw_bm_gass( &BmGassZa2, -0.1f, 2.9f );
	    }
	}

	if( i == MP_TI ) draw_planet_ring2( i ); /** 惑星の環 (手前) **/

	if( i == MP_CN && bakuSSw[0] ) draw_BakuhatuS( MP_CN, 0 );
	if( i == MP_KT && bakuSSw[1] ) draw_BakuhatuS( MP_KT, 1 );
	if( i == MP_SY && bakuSSw[2] ) draw_BakuhatuS( MP_SY, 2 );

//	draw_OverBomb();

	if( disp == 1 && PlanetPos[i].z <= knsyouZpos[i] &&
	    i != MP_A6 && i != MP_BO ) {
	    /** ステージクリアー用勲章 **/
	    draw_knsyou( i );
	}
	if( disp == 1 && (i == MP_A6 || i == MP_BO) ) {
	    /** ステージクリアー用勲章 **/
	    draw_knsyou( i );
	}

	if( disp == 2 ) draw_knsyou2( i );
    }
    pull_now();
}

/************************************************************************/
/* 勲章表示チェック							*/
/* res									*/
/* 0:勲章なし								*/
/* 1:ステージクリアー勲章						*/
/* 2:勲章								*/
/************************************************************************/
static int KunsyouDispCheck( int i )
{
    int res;
    int num;
    int medal;
    int clear;

    if( i == 13 ) {
	if( extra_mode ) {
	    medal = fox_save.rom[0].data.pl_stat[15].extra_medal & 0x01;
	    clear = ((fox_save.rom[0].data.pl_stat[14].extra_clear & 0x01) |
		     (fox_save.rom[0].data.pl_stat[15].extra_clear & 0x01));
	} else {
	    medal = fox_save.rom[0].data.pl_stat[15].medal & 0x01;
	    clear = ((fox_save.rom[0].data.pl_stat[14].clear & 0x01) |
		     (fox_save.rom[0].data.pl_stat[15].clear & 0x01));
	}
    } else {
	num = i;
	if( i == 14 ) num = 13;
	if( extra_mode ) {
	    medal = fox_save.rom[0].data.pl_stat[num].extra_medal & 0x01;
	    clear = fox_save.rom[0].data.pl_stat[num].extra_clear & 0x01;
	} else {
	    medal = fox_save.rom[0].data.pl_stat[num].medal & 0x01;
	    clear = fox_save.rom[0].data.pl_stat[num].clear & 0x01;
	}
    }

//    PRINTF( "medal:%d clear:%d\n",medal,clear );

    
    res = 0;
    if( medal ) {
	res = 2;
    } else {
	if( clear ) res = 1;
    }

    return( res );
}

/************************************************************************/
/* 惑星 , アイコンの描画 ＳＵＢ						*/
/************************************************************************/
static void draw_planet_sub( int i )
{
    float ligX,ligY,ligZ;
    xyz_t ato;
    xyz_t mae;
    float xa,ya;
    float xx,yy,zz;

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = 0.0f;

    push_now();
    mult_now( &planet_Mtx[i], MULT_MTX );

    if( planet[i].flag == 2 ) {
	if( i == MP_BO ) {
	    rotateX_now( ANGLE(bo_xa), MULT_MTX );
	    rotateY_now( ANGLE(bo_ya), MULT_MTX );
	} else {
	    rotateX_now( ANGLE(cl_xa), MULT_MTX );
	    rotateY_now( ANGLE(cl_ya), MULT_MTX );
	}
    }

    rotateZ_now( ANGLE(planet[i].Zang), MULT_MTX );

    scale_now( planet[i].scale,planet[i].scale,planet[i].scale,MULT_MTX );
    set_matrix(&NOW_DISP);

    if( planet[i].flag ==2 ) {
	/** ライトの計算 **/
#if 0
	MtxF_Position_now( &mae,&ato );
	xx = PlanetPos[MP_SN].x - ato.x;
	yy = PlanetPos[MP_SN].y - ato.y;
	zz = PlanetPos[MP_SN].z - ato.z;
#endif
	xx = PlanetPos[MP_SN].x - PlanetPos[i].x;
	yy = PlanetPos[MP_SN].y - PlanetPos[i].y;
	zz = PlanetPos[MP_SN].z - PlanetPos[i].z;
	xa = fatan3( yy,sqrtf((xx*xx)+(zz*zz)) );
	ya = -fatan3( xx,zz );
	mae.x = 0.0f;
	mae.y = 0.0f;
	mae.z = 100.0f;
	rotateY_work( ANGLE(-CamYa-ya), SET_MTX );
	rotateX_work( ANGLE(-CamXa-xa), MULT_MTX );
//	rotateY_work( ANGLE(-ya), MULT_MTX );
//	rotateX_work( ANGLE(-xa), MULT_MTX );
	MtxF_Position_work( &mae,&ato );
	ligX = ato.x;
	ligY = ato.y;
	ligZ = ato.z;
	light_in( (int)ligX, (int)ligY, (int)ligZ,
		  80, 80, 60, 10, 10, 8 );
    }

    copy_MtxF( &planet2_Mtx[i],MtxF_now );

    pull_now();

    bo_ya += 0.1f;
    cl_ya -= 0.09f;
}

/************************************************************************/
/* 惑星 , アイコンの描画						*/
/************************************************************************/
static void draw_planet( int i )
{
    switch( planet[i].flag ) {
    case 0: /* メテオ */
	if( (map_phase == CAM_NOMV || i==NowStage || i==NextStage) &&
	    map_phase != MAP_EYECATCH && map_phase != MAP_GAMEOVER ) {
	    rcpsetmode( &NOW_DISP, TEXE_Z );
	} else {	/* ZOOM 時 */
	    rcpsetmode( &NOW_DISP, TEXT_Z_A_PRIM );
	    gDPSetPrimColor( NEXT_DISP, 0, 0,
			     0xff, 0xff, 0xff, planet[i].PrimCol );
	}
	break;
    case 2: /* エリア６,ボルス */
	if( (map_phase == CAM_NOMV || i==NowStage || i==NextStage) &&
	    map_phase != MAP_EYECATCH && map_phase != MAP_GAMEOVER ) {
	    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
	} else {	/* ZOOM 時 */
	    rcpsetmode( &NOW_DISP, TEXT_Z_A_LIGHT_PRIM );
	    gDPSetPrimColor( NEXT_DISP, 0, 0,
			     0xff, 0xff, 0xff, planet[i].PrimCol );
	}
	break;
    case 1: /* セクターＸ,Ｙ,Ｚ */
    case 4: /* 惑星 */
	rcpsetmode( &NOW_DISP, TEXE_Z_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0,
			 0xff, 0xff, 0xff,
			 planet[i].PrimCol );
	break;
    case 3: /* 太陽 */
	rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xf0, 0, 0,
			planet[i].PrimCol );
	gDPSetEnvColor(NEXT_DISP, 0x1f, 0, 0, 0 );
	planet[i].Zang += 0.1f;
	break;
    }

    push_now();
    copy_MtxF( MtxF_now, &planet2_Mtx[i] );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, pla_data[planet[i].plno] );
    pull_now();
}

/************************************************************************/
/* ２枚目の太陽の描画							*/
/************************************************************************/
static void draw_sun2( int i )
{
    static float sn_za = 0.0f;
    int prim;

    prim = planet[MP_BM].PrimCol;
    if( planet[i].PrimCol > 0x80 )
	prim = 0x80;

    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, prim );
    gDPSetEnvColor(NEXT_DISP, 0x1f, 0, 0, 0 );

    push_now();
    copy_MtxF( MtxF_now, &planet2_Mtx[i] );
    rotateZ_now( ANGLE(sn_za), MULT_MTX );
    scale_now( 0.8f,0.8f,0.8f,MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, pla_data[planet[i].plno] );
    pull_now();

    sn_za -= 0.2f;
}

/************************************************************************/
/* 惑星の雲の描画							*/
/************************************************************************/
static void draw_kumo( int i )
{
    int rr,gg,bb;

    rr = gg = bb = 0xff;
    if( i == MP_MC ) rr = gg = bb = 0x40;
    rcpsetmode( &NOW_DISP, TEXE_Z_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, rr, gg, bb,
		     planet[i].PrimCol );
    push_now();
    copy_MtxF( MtxF_now, &planet2_Mtx[i] );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_PLkumo );
    pull_now();
}

/************************************************************************/
/* 惑星の影の描画							*/
/************************************************************************/
static void draw_planet_kage( int i )
{
    rcpsetmode( &NOW_DISP, TEXE_Z_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0,
		     0xff, 0xff, 0xff,
		     planet[i].PrimCol );

    push_now();
    copy_MtxF( MtxF_now, &planet2_Mtx[i] );
    if( i == MP_TI || i == MP_MC || i == MP_ZO ) {
	rotateY_now( ANGLE(180.0f), MULT_MTX );
    }
    rotateZ_now( ANGLE(planet[i].Zang), MULT_MTX );
    scale_now( 1.6f, 1.6f, 1.6f, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_hoshikage01 );
    pull_now();
}

/************************************************************************/
/* 惑星の環の描画 (奥)							*/
/************************************************************************/
static void draw_planet_ring1( int i )
{
    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xaf, 0xaf,
                    planet[i].PrimCol );
    gDPSetEnvColor(NEXT_DISP, 0x49, 0x1f, 0x0f, 0 );

    push_now();
    copy_MtxF( MtxF_now, &planet2_Mtx[i] );
    rotateZ_now( ANGLE(-planet[i].Zang), MULT_MTX );
    rotateX_now( ANGLE(20.0f), MULT_MTX );
    scale_now( 3.0f, 3.0f, 3.0f,MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_dosei02 );
    pull_now();
}

/************************************************************************/
/* 惑星の環の描画 (手前)						*/
/************************************************************************/
static void draw_planet_ring2( int i )
{
    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xaf, 0xaf,
                    planet[i].PrimCol );
    gDPSetEnvColor(NEXT_DISP, 0x49, 0x1f, 0x0f, 0 );

    push_now();
    copy_MtxF( MtxF_now, &planet2_Mtx[i] );
    rotateZ_now( ANGLE(-planet[i].Zang), MULT_MTX );
    rotateX_now( ANGLE(20.0f), MULT_MTX );
    scale_now( 3.0f, 3.0f, 3.0f,MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_dosei01 );
    pull_now();
}

/************************************************************************/
/* 惑星ベノムのあやしいガスの描画					*/
/************************************************************************/
static void draw_bm_gass( float *za, float step, float scl )
{
    int prim;

    prim = planet[MP_BM].PrimCol;
    if( planet[MP_BM].PrimCol > 0x80 )
	prim = 0x80;
    
    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0x3f, 0x5f, 0x1e, prim );
    gDPSetEnvColor(NEXT_DISP, 0x00, 0x00, 0x00, 0 );

    push_now();
    copy_MtxF( MtxF_now, &planet2_Mtx[MP_BM] );
    rotateZ_now( ANGLE(*za), MULT_MTX );
    scale_now( scl, scl, scl, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_benom_gass );
    pull_now();

    *za += step;
}

/************************************************************************/
/* 一度クリアーしたステージに出る勲章の描画 ＳＵＢ			*/
/************************************************************************/
static void draw_knsyou_sub( int i )
{
    xyz_t mae;
    xyz_t ato;
    float scl;
    
    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = 0.0f;

    scl = 7.0f + (rnd()*8.0f);
    
    push_now();
    mult_now( &planet_Mtx[i], MULT_MTX );
    rotateY_now( ANGLE(Kun2Yang[i]), MULT_MTX );
    translate_now( YrngBase[i], 0.0f, 0.0f, MULT_MTX );
    rotateY_now( ANGLE(-Kun2Yang[i]), MULT_MTX );
    set_matrix(&NOW_DISP);
    copy_MtxF( &knsyou2_Mtx[i],MtxF_now );

    rotateZ_now( ANGLE(Kun2Zang[i]), MULT_MTX );
    scale_now( scl, scl, scl, MULT_MTX );
    MtxF_Position_now( &mae,&ato );
    knsyouZpos[i] = ato.z;
    set_matrix(&NOW_DISP);
    copy_MtxF( &knsyou_Mtx[i],MtxF_now );
    pull_now();
}

/************************************************************************/
/* 一度クリアーしたステージに出る勲章の描画				*/
/************************************************************************/
static void draw_knsyou( int i )
{
    int aa;

    if( FirstClearSw != ON ) {
	aa = KunsyouAcol[i];
    } else {
	aa = FirstClearA;
	KunsyouAcol[i] = 0xff;
    }

    if( aa == 0 ) return;

    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, aa );
    gDPSetEnvColor(NEXT_DISP, 0x50, 0x50, 0x00, 0 );
    
    push_now();
    copy_MtxF( MtxF_now, &knsyou_Mtx[i] );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_kunsyo );
    pull_now();
    
    Kun2Zang[i] += 45.0f;
    if( FirstClearSw == OFF ) {
	Kun2Yang[i] += 5.0f;
    }
}

/************************************************************************/
/* ある条件を満たしてクリアーしたときに出る勲章の描画			*/
/************************************************************************/
static void draw_knsyou2( int i )
{
    static float Zang = 0.0f;
    register int j;
    int aa;
    float scl;

    if( KunsyouGetSw != ON ) {
	aa = KunsyouAcol[i];
    } else {
	aa = FirstClearA;
	KunsyouAcol[i] = 0xff;
    }

    if( aa == 0 ) return;

    if( KunsyouGetSw == ON ) {
	switch( KunsyouGetStat ) {
	case 0:
	    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
	    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, aa );
	    gDPSetEnvColor(NEXT_DISP, 0x50, 0x50, 0x00, 0 );
	    push_now();
	    copy_MtxF( MtxF_now, &knsyou_Mtx[i] );
	    translate_now( 0.0f, -30.0f, 0.0f, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, MAP_kunsyo );
	    pull_now();
	    
	    Kun2Zang[i] += 45.0f;
	    if( aa == 255 ) {
		Time2 = 15;
		KunsyouGetA2 = 0;
		KunsyouGetA = 255;
		KunsyouGetXr = 0.0f;
		KunsyouGetStat++;
	    }
	    break;
	case 1:
	    scl = 5.0f + (rnd()*4.0f);
	    add_calc( &KunsyouGetXr, 150.0f, 0.09f, 100.0f, 0.1f );

	    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
	    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, KunsyouGetA );
	    gDPSetEnvColor(NEXT_DISP, 0x50, 0x50, 0x00, 0 );
	    
	    for( j=0; j<8; j++ ) {
		push_now();
		copy_MtxF( MtxF_now,&knsyou2_Mtx[i] );
		translate_now( 0.0f, -30.0f, 0.0f, MULT_MTX );
		rotateZ_now( ANGLE(-45.0f*(float)j), MULT_MTX );
		translate_now( 0.0f, KunsyouGetXr, 0.0f, MULT_MTX );
		rotateZ_now( ANGLE(Zang), MULT_MTX );
		scale_now( scl, scl, scl, MULT_MTX );
		set_matrix(&NOW_DISP);
		gSPDisplayList( NEXT_DISP, MAP_kunsyo );
		pull_now();
	    }
	    Zang += 45.0f;
	    KunsyouGetA -= 0x10;
	    if( KunsyouGetA <= 0 ) KunsyouGetA = 0x00;


	    rcpsetmode( &NOW_DISP, TEXE_Z_A_PRIM );
	    gDPSetTextureFilter(NEXT_DISP, G_TF_POINT);
	    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, KunsyouGetA2 );
	    
	    push_now();
	    copy_MtxF( MtxF_now, &knsyou2_Mtx[i] );
	    translate_now( 0.0f, -30.0f, 0.0f, MULT_MTX );
	    scale_now( 3.0f, 3.0f, 3.0f, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, MAP_kunsyo02 );
	    pull_now();
	    
	    Kun2Yang[i] = -90.0f;

	    KunsyouGetA2 += 0x08;

	    if( KunsyouGetA2 == 0x08 )
		Na_StartSystemSe( NA_SE_GET_EMBLEM );

	    if( KunsyouGetA2 >= 255 ) {
		KunsyouGetA2 = 255;
	    }
	    if( KunsyouGetA2 == 255 ) {
		if( !Time2 ) KunsyouGetSw = OFF;
		else         Time2--;
	    }
	    break;
	}
    } else {
	rcpsetmode( &NOW_DISP, TEXE_Z_A_PRIM );
	gDPSetTextureFilter(NEXT_DISP, G_TF_POINT);
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, aa );
	
	push_now();
	copy_MtxF( MtxF_now, &knsyou2_Mtx[i] );
	translate_now( 0.0f, -30.0f, 0.0f, MULT_MTX );
	scale_now( 3.0f, 3.0f, 3.0f, MULT_MTX );
	set_matrix(&NOW_DISP);
	gSPDisplayList( NEXT_DISP, MAP_kunsyo02 );
	pull_now();
	
	Kun2Yang[i] = -90.0f;
    }
}

#if 0
/************************************************************************/
/* ある条件を満たしてクリアーしたときに出る勲章の描画 ２		*/
/************************************************************************/
static void draw_knsyou2( int j )
{
    register int i;
    int aa;
    
    static float kunsyo_za = 0.0f;

    aa = 255;
    if( j == MP_SX || j == MP_SY || j == MP_SZ ) aa = 0x90;
    if( planet[j].PrimCol != aa || !Kunsyou2DispSw ) return;
    
    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetEnvColor(NEXT_DISP, 0x50, 0x50, 0xff, 0 );

    for( i=0; i<4; i++ ) {
	switch( KunStat[j][i] ) {
	case 0:  /* OFF */
	    KunScl[j][i] += 4.0f;
	    if( KunScl[j][i] >= 10.0f ) {
		KunScl[j][i] = 11.0f;
		KunStat[j][i] = 1;
	    }
	    break;
	case 1: /* Wait */
	    KunWait[j][i]--;
	    if( KunWait[j][i] <= 0 ) {
		KunStat[j][i] = 2;
		KunScl[j][i] = 10.0f;
	    }
	    break;
	case 2: /* ON */
	    KunA[j][i] -= 0x30;
	    if( KunA[j][i] < 0x00 ) KunA[j][i] = 0;
	    if( KunA[j][i] == 0 )
		KunStat[j][i] = 3;
	    break;
	case 3: /* End */
	    KunA[j][i] = 0xff;
	    KunWait[j][i] = 1+(int)(rnd()*3.0f);
	    KunYrng[j][i] = YrngBase[j]+(rnd()*3.0f);
	    KunZang[j][i] = (rnd()*360.0f);    
	    KunScl[j][i] = 0.0f;
	    KunStat[j][i] = (int)(rnd()*3.0f);
	    break;
	}
	
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, KunA[j][i] );

	push_now();
	mult_now( &planet_Mtx[j], MULT_MTX );
	rotateZ_now( ANGLE(KunZang[j][i]), MULT_MTX );
	translate_now( 0.0f, KunYrng[j][i], 0.0f, MULT_MTX );
	rotateZ_now( ANGLE(kunsyo_za), MULT_MTX );
	scale_now( KunScl[j][i], KunScl[j][i], KunScl[j][i], MULT_MTX );
	set_matrix(&NOW_DISP);
	gSPDisplayList( NEXT_DISP, MAP_kunsyo );
	pull_now();
    }

    kunsyo_za += 45.0f;

#if 0
    if( Key[3].button & CONT_F ) {
	za += 10.0f;
    }
    if( Key[3].button & CONT_C ) {
	za -= 10.0f;
    }
    PRINTF( "za:%f\n",za );
#endif
}

/************************************************************************/
/* ある条件を満たしてクリアーしたときに出る勲章の描画			*/
/* 						(ステージクリア用)	*/
/************************************************************************/
static void draw_GetKnsyou( void )
{
    register int i;
    float scl;
    float za;

    if( !KunsyouGetDispSw ) return;

    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetEnvColor(NEXT_DISP, 0x50, 0x50, 0xff, 0 );

    switch( KunsyouGetStat ) {
    case 0:
	KunsyouGetA += 0x10;
	if( KunsyouGetA > 0xff ) {
	    KunsyouGetA = 0xff;
	    KunsyouGetStat = 1;
	}
	break;
    case 1:
	KunsyouGetZa1 += 10.0f;
	
	if( KunsyouGetZa1 > 360.0f ) {
	    KunsyouGetStat = 2;
	}
	break;
    case 2:
	KunsyouGetA -= 0x20;
	if( KunsyouGetA > 0x00 ) {
	    KunsyouGetA = 0x00;
	    KunsyouGetSw = OFF;
	    KunsyouGetDispSw = OFF;
	    KunsyouGetStat = 0;
	}
	break;
    }
    
    for( i=0,za=0.0f; i<4; i++,za+=30.0f ) {
	scl = 2.0f + (rnd()*8.0f);

	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, KunsyouGetA );

	push_now();
	mult_now( &planet_Mtx[NowStage], MULT_MTX );
	rotateZ_now( ANGLE(KunsyouGetZa1+za), MULT_MTX );
	translate_now( 0.0f, YrngBase[NowStage]+10.0f, 0.0f, MULT_MTX );
	rotateZ_now( ANGLE(KunsyouGetZa2), MULT_MTX );
	scale_now( scl, scl, scl, MULT_MTX );
	set_matrix(&NOW_DISP);
	gSPDisplayList( NEXT_DISP, MAP_kunsyo );
	pull_now();

	push_now();
	mult_now( &planet_Mtx[NowStage], MULT_MTX );
	rotateZ_now( ANGLE(-(KunsyouGetZa1+za)), MULT_MTX );
	translate_now( 0.0f, YrngBase[NowStage]+10.0f, 0.0f, MULT_MTX );
	rotateZ_now( ANGLE(-KunsyouGetZa2), MULT_MTX );
	scale_now( scl, scl, scl, MULT_MTX );
	set_matrix(&NOW_DISP);
	gSPDisplayList( NEXT_DISP, MAP_kunsyo );
	pull_now();
    }

    KunsyouGetZa2 += 45.0f;

#if 0
    if( Key[3].button & CONT_F ) {
	za += 10.0f;
    }
    if( Key[3].button & CONT_C ) {
	za -= 10.0f;
    }
    PRINTF( "za:%f\n",za );
#endif
}
#endif

/************************************************************************/
/* コーネリアの爆発(大)の描画						*/
/************************************************************************/
static void draw_BakuhatuL( void )
{
//    static float za = 0.0f;

    if( bakuLStat < 0 ) return;
    
    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetEnvColor(NEXT_DISP, 0xff, 0x00, 0x00, 0 );

    switch( bakuLStat ) {
    case 0:  /* OFF */
	bakuLScl += 0.15f;
	if( bakuLScl >= 0.7f ) {
	    bakuLScl = 0.8f;
	    bakuLStat = 2;
	    bakuLWait = 2;
	}
	break;
    case 2: /* Wait */
	bakuLWait--;
	if( bakuLWait <= 0 ) {
	    bakuLStat = 3;
	    bakuLScl = 0.7f;
	}
	break;
    case 3: /* ON */
	bakuLA -= 0x08;
	bakuLScl -= 0.001f;
	if( bakuLA < 0x00 ) bakuLA = 0;
	if( bakuLA == 0 )
	    bakuLStat = 4;
	break;
    }

    gDPSetPrimColor(NEXT_DISP, 0, 0, 255, 200, 200, bakuLA );

    push_now();
    copy_MtxF( MtxF_now, &planet2_Mtx[MP_CN] );
    rotateZ_now( ANGLE(-50.0f), MULT_MTX );
    translate_now( 0.0f, 25.0f, 0.0f, MULT_MTX );
    scale_now( bakuLScl, bakuLScl, bakuLScl, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_Ball );
    pull_now();


#if 0
    if( Key[3].button & CONT_E ) {
	bakuLScl += 0.1f;
    }
    if( Key[3].button & CONT_D ) {
	bakuLScl -= 0.1f;
    }
    
    if( Key[3].button & CONT_F ) {
	za += 10.0f;
    }
    if( Key[3].button & CONT_C ) {
	za -= 10.0f;
    }
    PRINTF( "za:%f sc:%f\n",za,bakuLScl );
#endif
}

/************************************************************************/
/* コーネリアの爆発(小)の描画						*/
/************************************************************************/
static void draw_BakuhatuS( int pla, int p )
{
    register int i;
    int max;
    float rr;

    if( !planet[pla].PrimCol ) return;
    if( !bakuSSw[p] ) return;

    max = 10;
    if( pla != MP_CN ) max = 5;
    
    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetEnvColor(NEXT_DISP, 0xff, 0x00, 0x00, 0 );

    for( i=0; i<max; i++ ) {
	switch( bakuSStat[p][i] ) {
	case 0:
	    bakuSScl[p][i] += 0.1f;
	    if( bakuSScl[p][i] >= bakuSScl2[p][i] ) {
		bakuSScl[p][i] = bakuSScl2[p][i];
		bakuSStat[p][i] = 1;
	    }
	    break;
	case 1:
	    bakuSWait[p][i]--;
	    if( bakuSWait[p][i] <= 0 )
		bakuSStat[p][i] = 2;
	    break;
	case 2:
	    bakuSA[p][i] -= 0x30;
	    if( bakuSA[p][i] < 0x00 ) {
		bakuSA[p][i] = 0;
		bakuSStat[p][i] = 3;
	    }
	    break;
	case 3:
	    bakuSStat[p][i] = (int)(rnd()*3.0f);
	    bakuSA[p][i] = 0xff;
	    bakuSScl[p][i] = 0.0f;
	    bakuSScl2[p][i] = 0.5f+(rnd()*0.3f);
	    bakuSWait[p][i] = 1+(int)(rnd()*4.0f);
	    rr = 110.0f;
	    if( p == 1 ) rr = 50.0f;
	    bakuSRng[p][i] = rr+(int)(rnd()*30.0f);
	    bakuSZa[p][i] = -10.0f+(rnd() * -60.0f);
	    break;
	}

	if( bakuSScl2[p][i] == 0.0f || bakuSA[p][i] == 0 ) continue;
	
	gDPSetPrimColor(NEXT_DISP, 0, 0, 255, 200, 200, bakuSA[p][i] );

	push_now();
	mult_now( &planet_Mtx[pla], MULT_MTX );
	rotateZ_now( ANGLE(bakuSZa[p][i]), MULT_MTX );
	translate_now( 0.0f, bakuSRng[p][i], 0.0f, MULT_MTX );
	scale_now( bakuSScl[p][i], bakuSScl[p][i], bakuSScl[p][i], MULT_MTX );
	set_matrix(&NOW_DISP);
	gSPDisplayList( NEXT_DISP, MAP_Ball );
	pull_now();
    }
}

/************************************************************************/
/* カーソルの描画							*/
/************************************************************************/
static void draw_cursor( void )
{
    static float curYa = 0.0f;
    int ret;
    
    if( !cursor_sw ) return;

#if 0
    if( prim_col == 0 || cursor_sw == OFF ) return;

    if( map_phase == CAM_NOMV ) {
	rcpsetmode( &NOW_DISP, TEXE_Z );
    } else {	/* ZOOM 時には消す */
	rcpsetmode( &NOW_DISP, TEXE_Z_A_PRIM );
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, prim_col);
    }
#endif

    light_in( 0, 0, 127,
	      80, 80, 60, 50, 50, 50 );

    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );

    

    ret = add_calc( &curOffsetY, curPosChg, 0.1f, 100.0f, 1.0f );
    if( ret==0.0f ) {
	if( curPosChg == curOffsetY_S ) {
	    curOffsetY = curOffsetY_S+50.0f;
	}
    }

    push_now();
    mult_now( &planet_Mtx[NowStage], MULT_MTX );
    translate_now( 0.0f, curOffsetY, 0.0f, MULT_MTX );
    rotateY_now( ANGLE(curYa), MULT_MTX );
    scale_now( 3.0f, 3.0f, 3.0f, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_Ya );
    pull_now();

    curYa += 6.0f;
}

/************************************************************************/
/* カーソルの表示位置の取得						*/
/************************************************************************/
static void get_cursor_Yrange( void )
{
    curOffsetY = 140.0f;
    if( NowStage == MP_CN ) curOffsetY = 230.0f;
    if( NowStage == MP_A6 ) curOffsetY = 210.0f;
    if( NowStage == MP_SN ) curOffsetY = 250.0f;
    if( NowStage == MP_SX ) curOffsetY = 150.0f;
    if( NowStage == MP_SY ) curOffsetY = 150.0f;
    if( NowStage == MP_SZ ) curOffsetY = 150.0f;
    if( NowStage == MP_BM ) curOffsetY = 300.0f;

    curOffsetY_S = curOffsetY;
    curPosChg = curOffsetY;
}

/************************************************************************/
/* 残りの石たちの描画							*/
/************************************************************************/
static void draw_rocks( void )
{
    register int i;
    int mask;
//    static int rp = 0;

    if( planet[MP_AS].PrimCol == 0x00 && NowStage != MP_AS ) return;

    if( NowStage == MP_AS && map_phase == CAM_ZOOM && flush_cnt != 0 )
	mask = 0x01;
    else
	mask = 0xffffffff;

    if( map_phase == CAM_NOMV ||
	(NowStage == MP_AS && map_phase != MAP_GAMEOVER) ) {

#if 1
	rcpsetmode( &NOW_DISP, TEXE_Z );
#else
	rcpsetmode( &NOW_DISP, TEXE_Z_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
#endif
    } else {	/* ZOOM 時には消す */
	rcpsetmode( &NOW_DISP, TEXE_Z_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff,
			 planet[MP_AS].PrimCol );
    }

    if( frcnt & mask ) {
	for( i=0; i<ROCKS_ITM; i++ ) {
#if 0
	    if( i == rp ) {
		gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0x00, 0x00, 0xff );
	    } else {
		gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
	    }
#endif
	    push_now();
	    rotateY_now( ANGLE(posData2[i].Yang2), MULT_MTX );
	    translate_now( posData2[i].Xrange,
			   posData2[i].Yrange, 0.0f, MULT_MTX );
	    rotateY_now( ANGLE(-(posData2[i].Yang2)), MULT_MTX );
	    angle_hosei();
	    scale_now( posData2[i].scale, posData2[i].scale,
		       posData2[i].scale, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, pla_data[MP_AS] );
	    pull_now();
	}
    }


#if 0
    if ( Key_T[1].button & CONT_L) {
	rp ++;
	if( rp > 41 ) rp = 0;
    }
    if ( Key_T[1].button & CONT_R) {
	rp --;
	if( rp < 0 ) rp = 41;
    }

    if ( Key[1].button & CONT_DOWN ) {
	posData2[rp].Yang2 += 1.0f;
    }
    if ( Key[1].button & CONT_UP ) {
	posData2[rp].Yang2 -= 1.0f;
    }

    if ( Key[1].button & CONT_LEFT ) {
	posData2[rp].Xrange -= 10.0f;
    }
    if ( Key[1].button & CONT_RIGHT ) {
	posData2[rp].Xrange += 10.0f;
    }

    if ( Key[1].button & CONT_C ) {
	posData2[rp].scale -= 0.01f;
    }
    if ( Key[1].button & CONT_F ) {
	posData2[rp].scale += 0.01f;
    }

    if ( Key[1].button & CONT_E ) {
	posData2[rp].Yrange -= 10.0f;
    }
    if ( Key[1].button & CONT_D ) {
	posData2[rp].Yrange += 10.0f;
    }

    PRINTF( "rp:%d { %ff, %ff, %ff, %ff },\n",rp,
             posData2[rp].Yang2,posData2[rp].Xrange,
	     posData2[rp].Yrange,posData2[rp].scale );
#endif
}

/************************************************************************/
/* エリア６艦隊の描画							*/
/************************************************************************/
static void draw_senkan( void )
{
    xyz_t ato;
    xyz_t mae;
    float xa,ya;
    float xx,yy,zz;
    register int i;
    int mask;
    static float yya = -22.0f;


    if( planet[MP_A6].PrimCol == 0x00 && NowStage != MP_A6 ) return;

    if( NowStage == MP_A6 && map_phase == CAM_ZOOM && flush_cnt != 0 )
	mask = 0x01;
    else
	mask = 0xffffffff;

    if( map_phase == CAM_NOMV || NowStage == MP_A6 ) {

	rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
    } else {	/* ZOOM 時には消す */
	rcpsetmode( &NOW_DISP, TEXT_Z_A_LIGHT_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff,
			 planet[MP_A6].PrimCol );
    }

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = 0.0f;

    if( frcnt & mask ) {
	for( i=0; i<4; i++ ) {
	    push_now();
	    rotateY_now( ANGLE(Erea6Data[i].Yang2), MULT_MTX );
	    translate_now( Erea6Data[i].Xrange,
			   Erea6Data[i].Yrange, 0.0f, MULT_MTX );
	    rotateY_now( ANGLE(-(Erea6Data[i].Yang2)), MULT_MTX );
	    angle_hosei();
	    rotateY_now( ANGLE(yya), MULT_MTX );
	    scale_now( Erea6Data[i].scale, Erea6Data[i].scale,
		       Erea6Data[i].scale, MULT_MTX );
	    set_matrix(&NOW_DISP);

	    /** ライトの計算 **/
	    MtxF_Position_now( &mae,&ato );
	    xx = PlanetPos[MP_SN].x - ato.x;
	    yy = PlanetPos[MP_SN].y - ato.y;
	    zz = PlanetPos[MP_SN].z - ato.z;
	    xa = fatan3( yy,sqrtf((xx*xx)+(zz*zz)) );
	    ya = -fatan3( xx,zz );
	    mae.x = 0.0f;
	    mae.y = 0.0f;
	    mae.z = 100.0f;
	    rotateY_work( ANGLE(-CamYa-ya), SET_MTX );
	    rotateX_work( ANGLE(-CamXa-xa), MULT_MTX );
//	    rotateY_work( ANGLE(-ya), MULT_MTX );
//	    rotateX_work( ANGLE(-xa), MULT_MTX );
	    MtxF_Position_work( &mae,&ato );
	    light_in( (int)ato.x, (int)ato.y, (int)ato.z,
		  80, 80, 60, 0, 0, 0 );
	    
	    gSPDisplayList( NEXT_DISP, MAP_CL02 );

	    pull_now();
	}
    }

#if 0
{
    static int rp = 0;

    if ( Key_T[1].button & CONT_L) {
	rp ++;
	if( rp > 3 ) rp = 0;
    }
    if ( Key_T[1].button & CONT_R) {
	rp --;
	if( rp < 0 ) rp = 3;
    }

    if ( Key[1].button & CONT_RIGHT ) {
	Erea6Data[rp].Yang2 += 1.0f;
    }
    if ( Key[1].button & CONT_LEFT ) {
	Erea6Data[rp].Yang2 -= 1.0f;
    }

    if ( Key[1].button & CONT_DOWN ) {
	Erea6Data[rp].Xrange -= 10.0f;
    }
    if ( Key[1].button & CONT_UP ) {
	Erea6Data[rp].Xrange += 10.0f;
    }

    if ( Key[3].button & CONT_DOWN ) {
	Erea6Data[rp].Yrange -= 10.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	Erea6Data[rp].Yrange += 10.0f;
    }

    if ( Key[1].button & CONT_C ) {
	ya -= 1.0f;
    }
    if ( Key[1].button & CONT_F ) {
	ya += 1.0f;
    }

    if ( Key[1].button & CONT_E ) {
	Erea6Data[rp].scale -= 0.01f;
    }
    if ( Key[1].button & CONT_D ) {
	Erea6Data[rp].scale += 0.01f;
    }

    PRINTF( "rp:%d { %ff, %ff, %ff, %ff }, ya:%f\n",rp,
             Erea6Data[rp].Yang2,Erea6Data[rp].Xrange,
	     Erea6Data[rp].Yrange,Erea6Data[rp].scale,ya );
}
#endif
}

/************************************************************************/
/* ワイプの描画								*/
/************************************************************************/
static void draw_wip( void )
{
    if( wip_stat == 0 ) return;
    
    push_now();
    set_lookat_now( EyeX, EyeY, EyeZ, WayX, WayY, WayZ,
		    vX, vY, vZ, MULT_MTX );
    translate_now( stX, stY, stZ, MULT_MTX );
    set_matrix(&NOW_DISP);

    fade_out( FADE_TATE, wip_time );

    pull_now();
}

/************************************************************************/
/* ステージ名の描画							*/
/************************************************************************/
static void draw_moji( void )
{
    register int i;
    int st_num;
//    static int yyy = 20.0f;
    static int name_list[] = {1,13,12,11,6,2,4,10,8,0,9,5,3,7,7};

    st_num = name_list[NowStage];

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, (int)StName_A );

    /** ステージ名 **/
    for( i=0; i<stage_name[st_num].sizY; i++ ) {
	texture_rectangleIA8( &NOW_DISP,
			      stage_name[st_num].txt+
			      (stage_name[st_num].sizX*i),
			      stage_name[st_num].sizX, 1,
			      stage_name[st_num].posX, 20.0f+(1.0f*i),
			      1.0f, 1.0f );
    }

    add_calc( &StName_A, 255.0f, StName_Asp, 10.0f, 1.0f );
    StName_Asp *= 1.08;

#if 0
    if( Key_T[3].button & CONT_UP ) {
	yyy += 1;
    }
    if( Key_T[3].button & CONT_DOWN ) {
	yyy -= 1;
    }

    PRINTF( "y=%d\n",yyy );
#endif
}

/************************************************************************/
/* ステージ名,ステージタイトルの描画					*/
/************************************************************************/
static void draw_StageName( void )
{
    register int i;
    int st_num;
    unsigned char *stage_num;

    
    switch( mapno ) {
    case CN:	/* コーネリア */
	stage_num = MOJI_s1_txt;
	st_num = 0;
	break;
    case AS:	/* メテオ */
	stage_num = MOJI_s2_txt;
	st_num = 1;
	break;
    case SW:	/* セクターＹ */
	stage_num = MOJI_s2_txt;
	st_num = 2;
	break;
    case FO:	/* フィチナ */
	stage_num = MOJI_s3_txt;
	st_num = 3;
	break;
    case KT:	/* カタリナ */
	stage_num = MOJI_s3_txt;
	st_num = 4;
	break;
    case AC:	/* アクアス */
	stage_num = MOJI_s3_txt;
	st_num = 5;
	break;
    case SX:	/* セクターＸ */
	stage_num = MOJI_s4_txt;
	st_num = 6;
	break;
    case SN:	/* ソーラー */
	stage_num = MOJI_s4_txt;
	st_num = 7;
	break;
    case ZO:	/* ゾネス */
	stage_num = MOJI_s4_txt;
	st_num = 8;
	break;
    case TI:	/* タイタニア */
	stage_num = MOJI_s5_txt;
	st_num = 9;
	break;
    case MC:	/* マクベス */
	stage_num = MOJI_s5_txt;
	st_num = 10;
	break;
    case SZ:	/* セクターＺ */
	stage_num = MOJI_s5_txt;
	st_num = 11;
	break;
    case BO:	/* ボルス */
	stage_num = MOJI_s6_txt;
	st_num = 12;
	break;
    case CL:	/* エリア６ */
	stage_num = MOJI_s6_txt;
	st_num = 13;
	break;
    }

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );

    /** 作戦No. **/
    texture_rectangleIA8( &NOW_DISP, MOJI_sakusen_txt,
			  88, 19, 112.0f, 61.0f,
			  1.0f, 1.0f );

    /** ステージナンバー **/
    texture_rectangleIA8( &NOW_DISP, stage_num,
			  16, 15, 183.0f, 61.0f,
			  1.0f, 1.0f );


    /** ステージ名 **/
    for( i=0; i<stage_name[st_num].sizY; i++ ) {
	texture_rectangleIA8( &NOW_DISP,
			      stage_name[st_num].txt+
			      (stage_name[st_num].sizX*i),
			      stage_name[st_num].sizX, 1,
			      stage_name[st_num].posX, 94.0f+(1.0f*i),
			      1.0f, 1.0f );
    }

    /** ステージタイトル **/
    for( i=0; i<stage_title[st_num].sizY; i++ ) {
	texture_rectangleIA8( &NOW_DISP,
			      stage_title[st_num].txt+
			      (stage_title[st_num].sizX*i),
			      stage_title[st_num].sizX, 1,
			      stage_title[st_num].posX, 140.0f+(1.0f*i),
			      1.0f, 1.0f );
    }

#if 0
{
    static int pp=0;

    if( Key_T[3].button & CONT_L ) {
	pp ^= 1;
    }

    if( Key[3].button & CONT_LEFT ) {
	saX[pp] -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	saX[pp] += 1.0f;
    }
    if( Key[3].button & CONT_UP ) {
	saY[pp] -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	saY[pp] += 1.0f;
    }

    PRINTF( "p:%d x:%f y:%f\n",pp,saX[pp],saY[pp] );
}
#endif

#if 0
    if( Key[3].button & CONT_LEFT ) {
	stage_name[st_num].posX -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	stage_name[st_num].posX += 1.0f;
    }
    if( Key[3].button & CONT_C ) {
	stage_title[st_num].posX -= 1.0f;
    }
    if( Key[3].button & CONT_F ) {
	stage_title[st_num].posX += 1.0f;
    }

    PRINTF( "name x:%f title x:%f\n",
            stage_name[st_num].posX,
            stage_title[st_num].posX );
#endif





}

/************************************************************************/
/* 描画									*/
/************************************************************************/
static void draw_rect( void )
{
    int mask;
//    float y = -25.4f;

    if( !( rect_sw || map_phase == CAM_NOMV ||
	   map_phase == SEL_STAGE ||
	   (map_phase == MAP_GAMEOVER && process_phase == 2)) ) return;

    mask = 0xffffffff;
    if( zanki_flush_cnt != 0 ) {
	mask = 0x01;
	zanki_flush_cnt--;
    }
    
    if( frcnt & mask )
	draw_ZankiSuu( 254.0f, 16.0f, Player_zanki[PL_NO] );

    if( before_mode == GAME || before_mode == OVER ) {
	if( hi_score < total_score ) {
	    hi_score = total_score;
	}
	draw_Score();
	draw_PlayRoot( 0 );
    }
}

/************************************************************************/
/* 現在のスコア,ハイスコアの描画					*/
/************************************************************************/
static void draw_Score( void )
{
//    static int xxx=47,yyy=24;
//    static int xx=126,yy=24;

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 0xff );

    /* "SCORE" */
    small_moji_puts( 24, 14, 1.0f, 1.0f, "TOTAL HIT" );
    moji_number( 63-((keta_ck(total_score)-1)*8),
		 24, total_score );
    
    /* "HI-SCORE" */
    small_moji_puts( 143, 14, 1.0f, 1.0f, "TOP" );
    moji_number( 159-((keta_ck(hi_score)-1)*8),
		 24, hi_score );

#if 0
    if( Key[3].button & CONT_LEFT ) {
	xxx -= 1;
    }
    if( Key[3].button & CONT_RIGHT ) {
	xxx += 1;
    }
    if( Key[3].button & CONT_UP ) {
	yyy += 1;
    }
    if( Key[3].button & CONT_DOWN ) {
	yyy -= 1;
    }

    if( Key[3].button & CONT_C ) {
	xx -= 1;
    }
    if( Key[3].button & CONT_F ) {
	xx += 1;
    }
    if( Key[3].button & CONT_E ) {
	yy += 1;
    }
    if( Key[3].button & CONT_D ) {
	yy -= 1;
    }

    PRINTF( "xxx:%d yyy:%d xx:%d yy:%d\n",xxx,yyy,xx,yy );
#endif
}

/************************************************************************/
/* 自分が進んでいるルートの中身の描画					*/
/************************************************************************/
void draw_PlayRoot( int mode )
{
    register int i;
    int cnt;
    float x,plx;
    float xx=28.0f,yy=182.0f;
    float xxx=16.0f;

    if( mode ) {
	cnt = StagePtr;
    } else {
	if( before_mode == GAME || before_mode == ENDING ) cnt = StagePtr;
	if( before_mode == OVER ) cnt = StageCnt;
    }
    draw_PlayRootArea( cnt );

    if( before_mode == GAME || before_mode == ENDING ) cnt = 7;
    if( before_mode == OVER ) cnt += 1;

    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( x=0.0f,plx=-41.5f,i=0; i<cnt; i++,x+=24.0f+xxx,plx+=13.8f ) {
	if( ClearStageNum[i] != -1 ) {
	    draw_PlayRootStageInfo( i, xx+x, yy, ClearStageNum[i] );
	    draw_PlayRootStage( i, plx, -25.4f, ClearStageNum[i] );
	}
    }
    pull_now();
}

/************************************************************************/
/* 自分が進んでいるルートの箱の描画					*/
/************************************************************************/
static void draw_PlayRootArea( int cnt )
{
    register int i;
    float x;
    int rr,gg,bb;
    int lnum;
    int *pp;
    float xx=28.0f,yy=182.0f;
    float xxx=16.0f;
    
    pp = &ClearStageNum[0];
    for( x=0.0f,i=0; i<7; i++,x+=24.0f+xxx,pp++ ) {
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	if( i < 6 ) {
	    rr = gg = bb = 255;
	    if( i < cnt ) {
		lnum = GetPlanetLine( *pp,*(pp+1) );
		switch( Line[lnum].LineCol ) {
		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 );
	    } else {
		gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
	    }
	    texture_rectangleRGBA16( &NOW_DISP, MAP_bou_txt,
				     8, 8, xx+x+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+x, yy, 1.0f, 1.0f );
    }
}

/************************************************************************/
/* 自分が進んでいるルートの描画						*/
/************************************************************************/
static void draw_PlayRootStageInfo( int i, float xx, float yy, int pp )
{
    register int j;
    float x2,xof;
    int mask,cnt;
    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 };
    
    /* ステージ名 */
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
    xof = (float)(GetNameDots( pl_sname[pp] )) / 2.0f;
    small_kana_puts( xx+12.0f-xof, yy, 1.0f, 1.0f, pl_sname[pp] );

    /* 各ステージのヒット数 */
    moji_number( xx+15.0f-((keta_ck(ClearHitCount[i])-1)*8),
		 yy+24.0f+1.0f, ClearHitCount[i] );


    
    if( before_mode == GAME ) cnt = StagePtr;
    if( before_mode == OVER || before_mode == ENDING ) cnt = StagePtr+1;

    if( i < cnt ) {
	/* 各仲間の状態 */
	mask = 0x00ff0000;
	x2 = 0.0f;
	for( j=0; j<3; j++,x2+=9.0f ) {
	    if( (NakamaDied[i] & mask) ) {
		rcpsetmode( &NOW_DISP, RECE_A_PRIM );
		gDPSetPrimColor( NEXT_DISP, 0, 0,
				 nakama_colR[j],
				 nakama_colG[j],
				 nakama_colB[j], 255 );
		small_moji_puts( (int)xx+x2-1.0f,
				 (int)yy+24.0f+8.0f+2.0f,
				 1.0f, 1.0f,nakamaMk[j] );
	    }
	    mask = mask >> 8;
	}
    }
}

/************************************************************************/
/* 自分が進んでいるルートのなかの惑星の描画(Polygon)			*/
/************************************************************************/
static void draw_PlayRootStage( int i, float x, float y, int p )
{
    int flush;
    float z,sc;

    z = 0.0f;

#if 0
    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);
#endif
    flush = 0xffffffff;
    if( system_mode == MAP ) {
	if( p == NowStage ) flush = 0x10;
    }

    switch( p ) {
    case MP_SN:	/** ソーラー **/
	if( frcnt & flush ) {
	    sc=0.11f;
	    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(planet[p].Zang), MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, pla_data[planet[p].plno] );
	    
	    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, pla_data[planet[p].plno] );
	    pull_now();
	}
	break;
    case MP_AS:	/** アステロイド **/
	if( frcnt & flush ) {
	    sc=0.1f;
	    rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
	    gDPSetPrimColor( NEXT_DISP, 0, 0,
			     0xff, 0xff, 0xff, 0xff );
	    push_now();
	    translate_now( x-0.4f, y+0.9f, z, MULT_MTX );
	    rotateZ_now( ANGLE(planet[p].Zang), MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, pla_data[planet[p].plno] );
	    translate_now( 18.0f, -20.0f, z, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, pla_data[planet[p].plno] );
	    pull_now();
	}
	break;
    case  MP_SX:
    case  MP_SY:
    case  MP_SZ:
	/** セクターＸ,Ｙ,Ｚ **/
	if( frcnt & flush ) {
	    sc=0.09f;
	    rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
	    gDPSetPrimColor( NEXT_DISP, 0, 0,
			     0xff, 0xff, 0xff, 0x90 );
	    push_now();
	    translate_now( x, y, z, MULT_MTX );
	    rotateZ_now( ANGLE(planet[p].Zang), MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, pla_data[planet[p].plno] );
	    pull_now();
	}
	break;
    case  MP_BO:
	if( frcnt & flush ) {
	    sc = 0.004f;
	    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
	    light_in( 0, 0, 100,
		      50, 50, 40, 100, 100, 100 );
	    
	    push_now();
	    translate_now( x, y, z, MULT_MTX );
	    rotateX_now( ANGLE(20.0f), MULT_MTX );
	    rotateY_now( ANGLE(bo_ya), MULT_MTX );
	    rotateZ_now( ANGLE(planet[p].Zang), MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, pla_data[planet[p].plno] );
	    pull_now();
	}
	break;
    case  MP_A6:
	if( frcnt & flush ) {
	    sc = 0.003f;
	    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
	    light_in( 0, 0, 100,
		      50, 50, 40, 100, 100, 100 );
	    
	    push_now();
	    translate_now( x, y, z, MULT_MTX );
	    rotateX_now( ANGLE(20.0f), MULT_MTX );
	    rotateY_now( ANGLE(cl_ya), MULT_MTX );
	    rotateZ_now( ANGLE(planet[p].Zang), MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, pla_data[planet[p].plno] );
	    pull_now();
	}
	break;
    default:
	if( frcnt & flush ) {
	    sc=0.1f;
	    rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
	    gDPSetPrimColor( NEXT_DISP, 0, 0,
			     0xff, 0xff, 0xff, 0xff );
	    push_now();
	    translate_now( x, y, z, MULT_MTX );
	    rotateZ_now( ANGLE(planet[p].Zang), MULT_MTX );
	    scale_now( sc, sc, sc, MULT_MTX );
	    set_matrix(&NOW_DISP);
	    gSPDisplayList( NEXT_DISP, pla_data[planet[p].plno] );
	    if( planet[p].flag == 4 ) {
		if( p != MP_BM && p != MP_AC ) {
		    set_matrix(&NOW_DISP);
		    if( p == MP_MC ) {
			gDPSetPrimColor( NEXT_DISP, 0, 0,
					 0x40, 0x40, 0x40, 0xff );
		    } else {
			gDPSetPrimColor( NEXT_DISP, 0, 0,
					 0xff, 0xff, 0xff, 0xff );
		    }
		    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;
    }
    
    /** ルート上に表示する勲章の描画 **/
    if( ClearKunsyou[i] )
	draw_PlayRootPlanetKunsyou( x, y, z );

//    pull_now();
}



#if 0
/************************************************************************/
/* 自分が進んでいるルートの描画						*/
/************************************************************************/
void draw_PlayRoot( void )
{
    register int i,j;
    float x,x2,xof;
    int rr,gg,bb;
    int lnum;
    int *pp;
    int mask;
    float xx=28.0f,yy=182.0f;
    float xxx=16.0f;
//    static float xs=2.0f;
    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 }; 
    
    pp = &ClearStageNum[0];
    for( x=0.0f,i=0; i<7; i++,x+=24.0f+xxx,pp++ ) {
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	if( i < 6 ) {
	    rr = gg = bb = 255;
	    if( *(pp+1) != -1 ) {
		lnum = GetPlanetLine( *pp,*(pp+1) );
		switch( Line[lnum].LineCol ) {
		case 0:
		    rr = 0x10;
		    gg = 0x40;
		    bb = 0xff;
		    break;
		case 1:
		    rr = 0xff;
		    gg = 0xaf;
		    bb = 0x00;
		    break;
		case 2:
		    gg = bb = 0;
		    break;
		}
		gDPSetPrimColor( NEXT_DISP, 0, 0, rr, gg, bb, 255 );
	    } else {
		gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
	    }
	    texture_rectangleRGBA16( &NOW_DISP, MAP_bou_txt,
				     8, 8, xx+x+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+x, yy, 1.0f, 1.0f );

        /* ステージ名 */
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
	if( (*pp) != -1 ) {
	    xof = (float)(GetNameDots( pl_sname[(*pp)] )) / 2.0f;
	    small_kana_puts( xx+x+12.0f-xof, yy, 1.0f, 1.0f, pl_sname[(*pp)] );
	}

	/* 各ステージのヒット数 */
	moji_number( xx+x+15.0f-((keta_ck(ClearHitCount[i])-1)*8),
			 yy+24.0f+1.0f, ClearHitCount[i] );

    }

    for( x=0.0f,i=0; i<StagePtr+1; i++,x+=24.0f+xxx ) {
	/* 各仲間の状態 */
	mask = 0x00ff0000;
	x2 = 0.0f;
	for( j=0; j<3; j++,x2+=9.0f ) {
	    if( (NakamaDied[i] & mask) ) {
		
		rcpsetmode( &NOW_DISP, RECE_A_PRIM );
		gDPSetPrimColor( NEXT_DISP, 0, 0,
				 nakama_colR[j],
				 nakama_colG[j],
				 nakama_colB[j], 255 );
		small_moji_puts( (int)xx+x+x2-1.0f,
				 (int)yy+24.0f+8.0f+2.0f,
				 1.0f, 1.0f,nakamaMk[j] );
#if 0
		rcpsetmode( &NOW_DISP, RECT_A_BLEND_RGBA );
		gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
		gDPSetEnvColor( NEXT_DISP,
				nakama_colR[j],
				nakama_colG[j],
				nakama_colB[j], 0 );
		texture_rectangleIA8( &NOW_DISP, MAP_nakama_txt,
				      8, 8, xx+x+x2-1.0f, yy+24.0f+8.0f+2.0f,
				      1.0f, 1.0f );
#endif
	    }
	    mask = mask >> 8;
	}
    }


#if 0
    if( Key[3].button & CONT_LEFT ) {
	xx -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	xx += 1.0f;
    }
    if( Key[3].button & CONT_UP ) {
	yy += 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	yy -= 1.0f;
    }

    if( Key[3].button & CONT_F ) {
	xxx += 1.0f;
    }
    if( Key[3].button & CONT_C ) {
	xxx -= 1.0f;
    }
    
    if( Key_T[3].button & CONT_E ) {
	xs += 0.01f;
    }
    if( Key_T[3].button & CONT_D ) {
	xs -= 0.01f;
    }

    PRINTF( "x:%f y:%f xxx:%f xs:%f\n",xx,yy,xxx,xs );
#endif
}

/************************************************************************/
/* 自分が進んでいるルートのなかの惑星の描画(Polygon)			*/
/************************************************************************/
void draw_PlayRootPlanet( float y )
{
//    static float xx=0.0f,yy=0.0f,zz=0.0f;
//    static float scl=0.5f;
//    static float xxx=40.1f;
    register int i;
    int *p;
    int flush;
    int disp;
    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);

    p = &(ClearStageNum[0]);
    for( x = -41.5f,i=0; i<7; i++,x+=13.8f,p++ ) {
	if( *p == -1 ) continue;
	flush = 0xffffffff;
	if( system_mode == MAP ) {
	    if( *p == NowStage ) flush = 0x10;
	}
	switch( *p ) {
	case MP_SN:	/** ソーラー **/
	    if( frcnt & flush ) {
		sc=0.11f;
		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(planet[*p].Zang), MULT_MTX );
		scale_now( sc, sc, sc, MULT_MTX );
		set_matrix(&NOW_DISP);
		gSPDisplayList( NEXT_DISP, pla_data[planet[*p].plno] );

		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, pla_data[planet[*p].plno] );
		pull_now();
	    }
	    break;
	case MP_AS:	/** アステロイド **/
	    if( frcnt & flush ) {
		sc=0.1f;
		rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
		gDPSetPrimColor( NEXT_DISP, 0, 0,
				 0xff, 0xff, 0xff, 0xff );
		push_now();
		translate_now( x-0.4f, y+0.9f, z, MULT_MTX );
		rotateZ_now( ANGLE(planet[*p].Zang), MULT_MTX );
		scale_now( sc, sc, sc, MULT_MTX );
		set_matrix(&NOW_DISP);
		gSPDisplayList( NEXT_DISP, pla_data[planet[*p].plno] );
		translate_now( 18.0f, -20.0f, z, MULT_MTX );
		set_matrix(&NOW_DISP);
		gSPDisplayList( NEXT_DISP, pla_data[planet[*p].plno] );
		pull_now();
	    }
	    break;
	case  MP_SX:
	case  MP_SY:
	case  MP_SZ:
	    /** セクターＸ,Ｙ,Ｚ **/
	    if( frcnt & flush ) {
		sc=0.09f;
		rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
		gDPSetPrimColor( NEXT_DISP, 0, 0,
				 0xff, 0xff, 0xff, 0x90 );
		push_now();
		translate_now( x, y, z, MULT_MTX );
		rotateZ_now( ANGLE(planet[*p].Zang), MULT_MTX );
		scale_now( sc, sc, sc, MULT_MTX );
		set_matrix(&NOW_DISP);
		gSPDisplayList( NEXT_DISP, pla_data[planet[*p].plno] );
		pull_now();
	    }
	    break;
	case  MP_BO:
	    if( frcnt & flush ) {
		sc = 0.004f;
		rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
		light_in( 0, 0, 100,
			  50, 50, 40, 100, 100, 100 );

		push_now();
		translate_now( x, y, z, MULT_MTX );
		rotateX_now( ANGLE(20.0f), MULT_MTX );
		rotateY_now( ANGLE(bo_ya), MULT_MTX );
		rotateZ_now( ANGLE(planet[*p].Zang), MULT_MTX );
		scale_now( sc, sc, sc, MULT_MTX );
		set_matrix(&NOW_DISP);
		gSPDisplayList( NEXT_DISP, pla_data[planet[*p].plno] );
		pull_now();
	    }
	    break;
	case  MP_A6:
	    if( frcnt & flush ) {
		sc = 0.003f;
		rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
		light_in( 0, 0, 100,
			  50, 50, 40, 100, 100, 100 );
		
		push_now();
		translate_now( x, y, z, MULT_MTX );
		rotateX_now( ANGLE(20.0f), MULT_MTX );
		rotateY_now( ANGLE(cl_ya), MULT_MTX );
		rotateZ_now( ANGLE(planet[*p].Zang), MULT_MTX );
		scale_now( sc, sc, sc, MULT_MTX );
		set_matrix(&NOW_DISP);
		gSPDisplayList( NEXT_DISP, pla_data[planet[*p].plno] );
		pull_now();
	    }
	    break;
	default:
	    if( frcnt & flush ) {
		sc=0.1f;
		rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
		gDPSetPrimColor( NEXT_DISP, 0, 0,
				 0xff, 0xff, 0xff, 0xff );
		push_now();
		translate_now( x, y, z, MULT_MTX );
		rotateZ_now( ANGLE(planet[*p].Zang), MULT_MTX );
		scale_now( sc, sc, sc, MULT_MTX );
		set_matrix(&NOW_DISP);
		gSPDisplayList( NEXT_DISP, pla_data[planet[*p].plno] );
		if( planet[*p].flag == 4 ) {
		    if( *p != MP_BM ) {
			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;
	}

	/** ルート上に表示する勲章の描画 **/
	if( ClearKunsyou[i] )
	    draw_PlayRootPlanetKunsyou( x, y, z );
    }

    pull_now();


#if 0
    if( Key[3].button & CONT_RIGHT ) {
	xx += 0.1f;
    }
    if( Key[3].button & CONT_LEFT ) {
	xx -= 0.1f;
    }
    if( Key[3].button & CONT_UP ) {
	yy += 0.1f;
    }
    if( Key[3].button & CONT_DOWN ) {
	yy -= 0.1f;
    }
    if( Key[3].button & CONT_R ) {
	zz += 10.0f;
    }
    if( Key[3].button & CONT_L ) {
	zz -= 10.0f;
    }
    if( Key[3].button & CONT_C ) {
	scl += 0.001f;
    }
    if( Key[3].button & CONT_F ) {
	scl -= 0.001f;
    }
    
    PRINTF( "x:%f y:%f z:%f scl:%f\n",xx,yy,zz,scl );
#endif
}
#endif

/************************************************************************/
/* ルート上に表示する勲章の描画						*/
/************************************************************************/
void draw_PlayRootPlanetKunsyou( float x, float y, float z )
{
#if 0
    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetEnvColor(NEXT_DISP, 0x50, 0x50, 0xff, 0 );

    switch( KunStatP[i] ) {
    case 0: /* End */
	KunWaitP[i]--;
	if( KunWaitP[i] <= 0 ) {
	    KunWaitP[i] = 1+(int)(rnd()*3.0f);
	    KunZangP[i] = 0.0f;
	    KunSclP[i] = 0.0f;
	    KunStatP[i] = 1;
	}
	break;
    case 1:  /* OFF */
	KunSclP[i] += 0.2f;
	if( KunSclP[i] >= 0.9f ) {
	    KunSclP[i] = 1.0f;
	    KunStatP[i] = 2;
	}
	break;
    case 2: /* Wait */
	KunWaitP[i]--;
	if( KunWaitP[i] <= 0 ) {
	    KunStatP[i] = 3;
	    KunSclP[i] = 0.9f;
	}
	break;
    case 3: /* ON */
	KunSclP[i] -= 0.4f;
	if( KunSclP[i] < 0.0f ) {
	    KunSclP[i] = 0.0f;
	    KunStatP[i] = 0;
	    KunWaitP[i] = 10;
	}
	break;
    }
#endif

    
    static float scl = 0.23f;
    static float xx=4.4f,yy=1.0f;

    rcpsetmode( &NOW_DISP, TEXE_Z );
    gDPSetTextureFilter(NEXT_DISP, G_TF_POINT);

    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( i==0 ) {
    if( Key_T[3].button & CONT_UP ) {
	yy += 0.1f;
    }
    if( Key_T[3].button & CONT_DOWN ) {
	yy -= 0.1f;
    }
    if( Key_T[3].button & CONT_LEFT ) {
	xx -= 0.1f;
    }
    if( Key_T[3].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
}

/************************************************************************/
/* ステージ名のドット数の取得						*/
/************************************************************************/
int GetNameDots( char *s )
{
    int dot;
    unsigned short *ss;
    
    dot = 0;
    while( *s != NULL ) {
	ss = (unsigned short *)s;
	dot += 7;
	if( *ss == 'ー' ) dot -= 1;
	s += 2;
    }

    return( dot );
}

/************************************************************************/
/* メッセージセットダイレクトアドレスセット				*/
/************************************************************************/
static void map_message_ad_set( void )
{
    messPt = 0;

    message_ad = MessList[NowStage][messPt];
    face_NO = KaoList[messPt];
 
    map_face_stat = 100;

    mojiXp = 61;
    mojiYp = 175;
}

/************************************************************************/
/* ペパー将軍とフォックスの会話						*/
/************************************************************************/
void map_face_display(void)
{
//    int aa;

    if(face_time0 > 0) face_time0 -- ;
    if(face_time1 > 0) face_time1 -- ;

    switch(map_face_stat) {
    case 0:
	break;
    case 100:
	faceAcol = 0x00;
	face_chpt = 0 + face_NO;
	map_face_stat = 1;
	waku_size = 0.0f;
	moji_cont1 = 0;
	break;
    case 200:
	map_face_stat = 210;
	face_time0 = 30;
	break;
    case 210:
	if( face_time0 ) break;
	messPt = 1;
	message_ad = MessList[NowStage][messPt];
	Na_StartMesVoice( get_msg_num(message_ad) );
	face_NO = KaoList[messPt];
	face_time0 = msglen2(message_ad) * 5;
	face_chpt = 0 + face_NO;
	map_face_stat = 4;
	msg_sp = 0x03;
	break;
	
    case 1:
	faceAcol += 8;
	if( faceAcol > 0xff ) {
	    faceAcol = 0xff;
	    waku_size = 1.3f;
	    Na_StartSystemSe( NA_SE_COMPUTER_NOISE );
	    /** Voice SET **/
	    Na_StartMesVoice( get_msg_num(message_ad) );
	    face_time0 = msglen2(message_ad) * 5;
	    moji_end = OFF;
	    map_face_stat = 4; 
	}
	break;
    case 4:
	if( !face_time0 && !Na_GetNowMesVoice() ) {
	    Na_ClearMesVoice();
	    if( messPt == 0 ) {
		moji_cont1 = 0;
		face_time0 = 30;
	    } else {
		face_time0 = 20;
	    }
	    map_face_stat = 41;
	    break;
	}
	if( moji_cont1 >= msglen2(message_ad) ) {
	    moji_end = ON;
	    break;
	}

	face_chpt = 0 + face_NO;
	if( face_time1 > 0 )
	    face_chpt = 1 + face_NO;

	if( (frcnt & msg_sp) == msg_sp ) {
//	    Na_StartSystemSe( NA_SE_MESSAGE_MOVE );
	    if( msg_sp == 3 ) moji_cont1 += 1;
	    else              moji_cont1 += 2;

#if 0
	    if( msg_sp ) aa = moji_cont1 & 0x01;
	    else         aa = (moji_cont1/2) & 0x01; 
#endif
	    if( frcnt & 0x01 ) {
		if(message_pt) {
		    face_time1 = 2;
		}
	    }
#if 0
	    if( aa == 1 ) {
		if(message_pt) {
		    face_time1 = 2;
		}
	    }
#endif
	}
	break;
    case 41:
	if( face_time0 ) break;

	if( messPt == 1 ) {
	    map_face_stat = 5;
	    break;
	} else {
	    messPt = 1;
	    message_ad = MessList[NowStage][messPt];
	    Na_StartMesVoice( get_msg_num(message_ad) );
	    face_NO = KaoList[messPt];
	    face_chpt = 0 + face_NO;
	    moji_cont1 = 0;
	    face_time0 = msglen2(message_ad) * 5;
	    msg_sp = 0x03;
	    moji_end = OFF;
	    map_face_stat = 4;
	}
	break;

    case 5:
	face_time0 = 10;
	face_chpt = 0 + face_NO;
	map_face_stat += 1;
	break;

    case 6:
	if(face_time0 == 0) {
	    Na_StopAllFlagSe( NA_SE_COMPUTER_NOISE );
	    Na_StopMesVoice();
	    waku_size = 0.0f;
	    face_time0 = 10;
//	    map_face_stat += 1;
	    map_face_stat = 7;
	}
	break;
    case 7:
#if 0
	if( face_time0 ) break;
	map_face_stat = 0; 
	map_face_stat = 8; 

	faceAcol -= 8;
	if( faceAcol < 0x00 ) {
	    faceAcol = 0x00;
	    map_face_stat = 0; 
	}
#endif
	break;

    case 8:
	face_chpt = 0 + face_NO;
	waku_size = 1.3f;
	faceAcol = 0xff;
	break;
    }

    
    if( map_face_stat > 0 && map_face_stat != 100 ) {
	map_face_display_sub( face_chpt );
	map_face_display_sub( KaoList[!messPt] );
	waku_display();
    }
}

/************************************************************************/
/* パイロットメッセージ表示 サブ				        */
/************************************************************************/
static void map_face_display_sub( int kao_no )
{
    register int i;
    float fcXp,fcYp;
    int nakama_A[3];
    static float fxp[3] = { 205.0f, 237.0f, 269.0f };
    static unsigned short *ftxt[3] = {
	MAP_Peppy_txt,	/* nakama_shield[3] */
	MAP_Slippy_txt,	/* nakama_shield[2] */
	MAP_Falco_txt,	/* nakama_shield[1] */
    };
    
    switch( kao_no ) {
    case  MP_FACE_PEPPER:
    case  MP_FACE_PEPPER+1:
	pep_kao_f = kao_no - MP_FACE_PEPPER;
	break;
    case MP_FACE_FOX:
    case MP_FACE_FOX+1:
	if( faceAcol != 0x00 ) {
	    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
	    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, faceAcol );
	    fcXp = 205.0f;
	    fcYp = 77.0f;
	    
	    /* MP_FACE_FOX */
	    for( i=0; i<12; i++ ) {
		texture_rectangleRGBA16( &NOW_DISP, MAP_fox01t_txt+(92*i*4),
					 92, 4,
					 fcXp,fcYp+((float)i*4.0f),
					 1.0f, 1.0f );
	    }
	    texture_rectangleRGBA16( &NOW_DISP, MAP_fox01t_txt+(92*12*4),
				     92, 3,
				     fcXp,fcYp+(12.0f*4.0f),
				     1.0f, 1.0f );
	    
	    if( kao_no == (MP_FACE_FOX+1) ) {
		texture_rectangleRGBA16( &NOW_DISP, MAP_fox02t_txt,
					 32, 34,
					 fcXp+47.0,fcYp,
					 1.0f, 1.0f );
	    }

	    /* 仲間の顔の描画 */
	    for( i=0; i<3; i++ ) {
		switch( nakama_shield_S[3-i] ) {
		case -1:
		    /** 前のステージで戦線離脱したので一回休み **/
		case -2:
		    /** 行方不明 **/
		    if( faceAcol > 0x20 ) nakama_A[i] = 0x20;
		    else                  nakama_A[i] = faceAcol;
		    break;
		case 0:
		    /** 一回休んだので戦線復帰 **/
		    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
		    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
		    /** OK ! **/
		    if( frcnt & 0x10 )
			small_moji_puts( fxp[i], 131+28, 1.0f, 1.0f, "OK !" );
		    nakama_A[i] = faceAcol;
		    break;
		default:
		    /** 通常 **/
		    nakama_A[i] = faceAcol;
		    break;
		}
		rcpsetmode( &NOW_DISP, RECT_A_PRIM );
		gDPSetPrimColor( NEXT_DISP, 0, 0,
				 0xff, 0xff, 0xff, nakama_A[i] );
		texture_rectangleRGBA16( &NOW_DISP, ftxt[i],
					 28, 28, fxp[i],131.0f,
					 1.0f, 1.0f );
		if( nakama_shield_S[3-i] < 0 && nakama_shield_S[3-i] != -2 ) {
		    draw_batu( i,faceAcol );
		}
	    }
	}
    }
}

/************************************************************************/
/* 出撃不能および行方不明時のバツ印の描画				*/
/************************************************************************/
static void draw_batu( int i, int a )
{
    static bx[] = {81.0f, 125.0f, 170.0f};
    push_now();
    set_lookat_now( 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -400.0f,
		    0.0f, 1.0f, 0.0f, MULT_MTX );
    set_matrix(&NOW_DISP);

    rcpsetmode( &NOW_DISP, TEXT_Z_A_PRIM );
    gDPSetTextureFilter(NEXT_DISP, G_TF_POINT);
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, a );
    push_now();
    translate_now( bx[i], -35.0f, -400.0f, MULT_MTX );
    rotateZ_now( ANGLE(-40.0f), MULT_MTX );
    scale_now( 0.3f, 0.3f, 1.0f, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MOJI_kaopeke );
    pull_now();
    push_now();
    translate_now( bx[i], -35.0f, -400.0f, MULT_MTX );
    rotateZ_now( ANGLE(40.0f), MULT_MTX );
    scale_now( 0.3f, 0.3f, 1.0f, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MOJI_kaopeke );
    pull_now();

    pull_now();

#if 0
    if( i==0 ) {
#if 0
    if( Key[3].button & CONT_UP ) {
	by -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	by += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	bx -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	bx += 1.0f;
    }
    if( Key[3].button & CONT_R ) {
	bz -= 1.0f;
    }
    if( Key[3].button & CONT_L ) {
	bz += 1.0f;
    }
    if( Key[2].button & CONT_E ) {
	bza -= 0.1f;
    }
    if( Key[2].button & CONT_D ) {
	bza += 0.1f;
    }
#endif
    if( Key_T[2].button & CONT_C ) {
	bsc -= 0.01f;
    }
    if( Key_T[2].button & CONT_F ) {
	bsc += 0.01f;
    }

//    PRINTF( "x:%f y:%f z:%f\n",
//	    bx,by,bz );
    PRINTF( "bsc:%f\n\n",bsc );
    }
#endif
}

/************************************************************************/
/* ペパー将軍描画							*/
/************************************************************************/
static void peper_display( void )
{
    float scl2Z = 3.3f;

    push_now();
    set_lookat_now( 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -400.0f,
		    0.0f, 1.0f, 0.0f, MULT_MTX );
    set_matrix(&NOW_DISP);

    rcpsetmode( &NOW_DISP, TEXT_Z );
    push_now();
    translate_now( pepX, pepY, pepZ, MULT_MTX );
    rotateY_now( ANGLE(pepYa), MULT_MTX );
    angle_hosei();
    scale_now( sclX, sclY, 1.0f, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, pep_kao[pep_kao_f] );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_pep02 );
    pull_now();

    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0x20, 0x20, 0xff, litA );
    gDPSetEnvColor(NEXT_DISP, 0xcf, 0xcf, 0xff, 0 );
    push_now();
    translate_now( pepX, pepY-1.5f, pepZ, MULT_MTX );
    rotateY_now( ANGLE(pepYa), MULT_MTX );
    angle_hosei();
    scale_now( scl2X, scl2Y, scl2Z, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPClearGeometryMode(NEXT_DISP, G_CULL_BACK);
    gSPDisplayList( NEXT_DISP, MAP_pep03 );
    gSPSetGeometryMode(NEXT_DISP, G_CULL_BACK);
    pull_now();

    pull_now();

#if 0
    if( Key[3].button & CONT_UP ) {
	pepY -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	pepY += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	pepX -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	pepX += 1.0f;
    }
    if( Key[2].button & CONT_R ) {
	pepZ -= 1.0f;
    }
    if( Key[2].button & CONT_L ) {
	pepZ += 1.0f;
    }
    if( Key[3].button & CONT_E ) {
	pepYa -= 0.1f;
    }
    if( Key[3].button & CONT_D ) {
	pepYa+= 0.1f;
    }

    if( Key_T[3].button & CONT_C ) {
	scl2Z -= 0.1f;
    }
    if( Key_T[3].button & CONT_F ) {
	scl2Z += 0.1f;
    }

    PRINTF( "x:%f y:%f z:%f ya:%f\n",
	    pepX,pepY,pepZ,pepYa );
    PRINTF( "scl2Z:%f sclY:%f\n\n",scl2Z,sclY );
#endif
}



/************************************************************************/
/* ミニアーウィンの描画 メイン						*/
/************************************************************************/
static void draw_kowin_main( int n )
{
    float xx,yy,zz,rr,rrw;
    xyz_t stp;

    xx = Line_ex[n].Xpos2-Line_ex[n].Xpos;
    yy = Line_ex[n].Ypos2-Line_ex[n].Ypos;
    zz = Line_ex[n].Zpos2-Line_ex[n].Zpos;
    rr=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );
    
    if( rr == 0.0f ) rr = 1.0f;

    if( Line[n].KowinFlag == 2 ) {
	stp.x=(xx/rr)*(rr/(Line[n].dots-1));
	stp.y=(yy/rr)*(rr/(Line[n].dots-1));
	stp.z=(zz/rr)*(rr/(Line[n].dots-1));
	
	kowin.x = Line_ex[n].Xpos + (stp.x*dot_cnt);
	kowin.y = Line_ex[n].Ypos + (stp.y*dot_cnt);
	kowin.z = Line_ex[n].Zpos + (stp.z*dot_cnt);

        switch( kowin_stat ) {
	case 0:
	    break;
	case 100:
	    wait_time2 = 5;
	    kowin_stat = 10;
	    break;
	case 10:
	if( wait_time2 ) break;
	    wait_time2 = 5;
	    kowin_stat = 20;
	    break;
	case 20:
	    if( wait_time2 ) break;
	    dot_cnt += 1;
	    if( dot_cnt > Line[n].dots-1 ) {
		dot_cnt = 0;
	    }
	    kowin_stat = 100;
	    break;
	}

	if( kowin_stat != 10 ) return;
    } else {
	stp.x=(xx/rr)*Line_ex[n].size;
	stp.y=(yy/rr)*Line_ex[n].size;
	stp.z=(zz/rr)*Line_ex[n].size;
	
	kowin.x = Line_ex[n].Xpos + stp.x;
	kowin.y = Line_ex[n].Ypos + stp.y;
	kowin.z = Line_ex[n].Zpos + stp.z;

	xx = kowin.x-Line_ex[n].Xpos;
	yy = kowin.y-Line_ex[n].Ypos;
	zz = kowin.z-Line_ex[n].Zpos;
	rrw=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );

	/** ラインの9/8を越えたぐらいから消えはじめる **/
	if( ((rr/9.0f)*8.0f) < rrw ) {
//	    kowin_A -= 0x10;
//	    if( kowin_A < 0 ) kowin_A = 0;
	    kirakiraA -= 0x10;
	    if( kirakiraA < 0 ) kirakiraA = 0;
	}
    }

    if( Line[n].KowinFlag == 5 ) {
//	PRINTF( "n:%d flg:%d\n",n,Line[n].KowinFlag );
	draw_kirakira( Line[n].LineCol );
    } else {
	draw_kowin( n );
    }
}

/************************************************************************/
/* ミニアーウィンの描画							*/
/************************************************************************/
static void draw_kowin( int n )
{
    float ligX,ligY,ligZ;
    xyz_t ato;
    xyz_t mae;
    float xa,ya;
    float xx,yy,zz;

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = 0.0f;

    /** ライトの計算 **/
    if( kowin_A == 255 ) {
	rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
    } else {
	rcpsetmode( &NOW_DISP, TEXT_Z_A_LIGHT_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, kowin_A );
    }
    
    push_now();
    translate_now( kowin.x, kowin.y, kowin.z, MULT_MTX );

    rotateY_now( (Line_ex[n].Yang), MULT_MTX );
    rotateX_now( ANGLE(-90.0f), MULT_MTX );
    rotateX_now( (Line_ex[n].Xang), MULT_MTX );

    scale_now( 0.8f, 0.8f, 0.8f, MULT_MTX );
    set_matrix(&NOW_DISP);

    MtxF_Position_now( &mae,&ato );
    xx = PlanetPos[MP_SN].x-ato.x;
    yy = PlanetPos[MP_SN].y-ato.y;
    zz = PlanetPos[MP_SN].z-ato.z;
    xa = fatan3( yy,sqrtf((xx*xx)+(zz*zz)) );
    ya = -fatan3( xx,zz );
    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = 10.0f;
    rotateY_work( ANGLE(-CamYa-ya), SET_MTX );
    rotateX_work( ANGLE(-CamXa-xa), MULT_MTX );
//    rotateY_work( ANGLE(-ya), MULT_MTX );
//    rotateX_work( ANGLE(-xa), MULT_MTX );
    MtxF_Position_work( &mae,&ato );
    ligX = ato.x;
    ligY = ato.y;
    ligZ = ato.z;

    light_in( (int)ligX, (int)ligY, (int)ligZ,
	      50, 50, 40, 0, 0, 0 );

    gSPDisplayList(NEXT_DISP, MAP_kowin);
    pull_now();
}

/************************************************************************/
/* ワープルートのとき用キラキラの描画					*/
/************************************************************************/
static void draw_kirakira( int col )
{
    static float kiraZa = 0.0f;
    int err,egg,ebb;

    if( col == 3 ) {
	/** AS->KT **/
	err = 0xf0;
	egg = 0xa0;
	ebb = 0x00;
    } else {
	/** SX->SZ **/
	err = 0x80;
	egg = 0x00;
	ebb = 0x00;
    }

    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0x50, kirakiraA );
    gDPSetEnvColor(NEXT_DISP, err, egg, ebb, 0 );

    push_now();
    translate_now( kowin.x, kowin.y, kowin.z, MULT_MTX );
    angle_hosei();
    rotateZ_now( ANGLE(kiraZa), MULT_MTX );
    scale_now( 10.0f, 10.0f, 10.0f, MULT_MTX );
    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, MAP_kunsyo );
    pull_now();

   kiraZa -= 45.0f; 
}

/************************************************************************/
/* 線の描画								*/
/************************************************************************/
static void draw_line( int n )
{
    xyz_t spos,epos;
    float xx,yy,zz,rr;
    float sp;
    
    line_pos_calc( n, &spos, &epos );
    
    xx=(spos.x - epos.x);
    yy=(spos.y - epos.y);
    zz=(spos.z - epos.z);
    rr=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );
    
    Line_ex[n].mode  = 4;  /* マップ専用モード */
    Line_ex[n].Xpos  = spos.x;
    Line_ex[n].Ypos  = spos.y;
    Line_ex[n].Zpos  = spos.z;
    Line_ex[n].Xpos2 = epos.x;
    Line_ex[n].Ypos2 = epos.y;
    Line_ex[n].Zpos2 = epos.z;
    Line_ex[n].Yang = fatan3( xx, zz );
    Line_ex[n].Xang = -fatan3( yy , sqrtf( xx*xx + zz*zz ));

    switch( ClearRootLine[n] ) {
    case 1:
	Na_StartSystemSe( NA_SE_MAP_LINE_DRAW );
	ClearRootLine[n] = 11;
	break;
    case 11:	/** 通ったあとのライン **/
	add_calc( &Line_ex[n].size, rr, 0.1f, 100.0f, 4.0f );
	Line_ex[n].col_A = 0xff;
	if( Line_ex[n].size == rr ) {
	    Na_StopAllFlagSe( NA_SE_MAP_LINE_DRAW );
	    ClearRootLine[n] = 4;
	}
	break;
    case 5:
    case 6:	/** ワープ分岐用  **/
	add_calc( &Line_ex[n].size, rr, 0.1f, 100.0f, 1.0f );
	if( Line_ex[n].size == rr ) {
	    Line_ex[n].size = 0.0f;
	    ClearRootLine[n] = 6;
	    kirakiraA = 255;
	}
	break;
    case 2:	/** 次のステージへのライン **/
	sp = 0.04f;
	if( map_phase == MAP_GAMEOVER ) sp = 0.25f;
	add_calc( &Line_ex[n].size, rr, sp, 100.0f, 4.0f );
	Line_ex[n].col_A = 0xff;
	if( Line_ex[n].size == rr ) {
	    ClearRootLine[n] = 3;
	}
	break;
    case 3:
    case 4:
	Line_ex[n].size = rr;
	Line_ex[n].col_A = Line[n].PrimCol;  /* A */
	break;
    }
    
    if( ClearRootLine[n] == 1 ||
	ClearRootLine[n] == 11 ||
	ClearRootLine[n] == 4 ) {
	Line_ex[n].col_R = 32;  /* 色 */
	Line_ex[n].col_G = 32;  /* 色 */
	Line_ex[n].col_B = 32;  /* 色 */
	Line_ex[n].wide = 4.0f;
    } else {
	switch( Line[n].LineCol ) {
	case 0:
	    Line_ex[n].col_R = 0x10;  /* 色 */
	    Line_ex[n].col_G = 0x40;  /* 色 */
	    Line_ex[n].col_B = 0xff;  /* 色 */
	    Line_ex[n].wide = 8.0f;
	    break;
	case 1:
	    Line_ex[n].col_R = 0xff;  /* 色 */
	    Line_ex[n].col_G = 0xaf;  /* 色 */
	    Line_ex[n].col_B = 0x00;  /* 色 */
	    Line_ex[n].wide = 8.0f;
	    break;
	case 2:
	    Line_ex[n].col_R = 0xff;  /* 色 */
	    Line_ex[n].col_G = 0x00;  /* 色 */
	    Line_ex[n].col_B = 0x00;  /* 色 */
	    Line_ex[n].wide = 8.0f;
	    break;
	case 3:
	case 4:
	    Line_ex[n].col_R = 0x00;  /* 色 */
	    Line_ex[n].col_G = 0x00;  /* 色 */
	    Line_ex[n].col_B = 0x00;  /* 色 */
	    Line_ex[n].col_A = 0x00;  /* 色 */
	    Line_ex[n].wide = 0.1f;
	    break;
	}
    }
}

/************************************************************************/
/* 線の描画のための座標取得						*/
/************************************************************************/
static void line_pos_calc( int l_no, xyz_t *spos, xyz_t *epos )
{
    float sx,sy,sz,ex,ey,ez;
    float xx,yy,zz,rr;
    float st_size,ed_size;

    st_size = 40.0f;
    if( Line[l_no].startP == MP_FO ) st_size = 50.0f;
    if( Line[l_no].startP == MP_TI ) st_size = 60.0f;
    if( Line[l_no].startP == MP_SN ) st_size = 20.0f;
    if( Line[l_no].startP == MP_AS ) st_size = 60.0f;
    if( Line[l_no].startP == MP_SX ) st_size = 20.0f;
    if( Line[l_no].startP == MP_SY ) st_size = 20.0f;
    if( Line[l_no].startP == MP_SZ ) st_size = 20.0f;
    if( Line[l_no].startP == MP_A6 ) st_size = 1200.0f;
    if( Line[l_no].startP == MP_BO ) st_size = 1200.0f;


    ed_size = 40.0f;
    if( Line[l_no].endP == MP_TI ) ed_size = 60.0f;
    if( Line[l_no].endP == MP_FO ) ed_size = 50.0f;
    if( Line[l_no].endP == MP_SN ) ed_size = 20.0f;
    if( Line[l_no].endP == MP_AS ) ed_size = 60.0f;
    if( Line[l_no].endP == MP_SX ) ed_size = 20.0f;
    if( Line[l_no].endP == MP_SY ) ed_size = 20.0f;
    if( Line[l_no].endP == MP_SZ ) ed_size = 20.0f;
    if( Line[l_no].endP == MP_A6 ) ed_size = 1200.0f;
    if( Line[l_no].endP == MP_BO ) ed_size = 1200.0f;
    if( Line[l_no].endP == MP_BM ) ed_size = 30.0f;


    xx=(planet[Line[l_no].endP].Xpos-planet[Line[l_no].startP].Xpos);
    yy=(planet[Line[l_no].endP].Ypos-planet[Line[l_no].startP].Ypos);
    zz=(planet[Line[l_no].endP].Zpos-planet[Line[l_no].startP].Zpos);
    rr=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );

    sx=planet[Line[l_no].startP].Xpos
	+(st_size*planet[Line[l_no].startP].scale*(xx/rr));
    sy=planet[Line[l_no].startP].Ypos
	+(st_size*planet[Line[l_no].startP].scale*(yy/rr));
    sz=planet[Line[l_no].startP].Zpos
	+(st_size*planet[Line[l_no].startP].scale*(zz/rr));

    ex=planet[Line[l_no].endP].Xpos
	+(ed_size*planet[Line[l_no].endP].scale*(-xx/rr));
    ey=planet[Line[l_no].endP].Ypos
	+(ed_size*planet[Line[l_no].endP].scale*(-yy/rr));
    ez=planet[Line[l_no].endP].Zpos
	+(ed_size*planet[Line[l_no].endP].scale*(-zz/rr));

    spos->x=sx;
    spos->y=sy;
    spos->z=sz;

    epos->x=ex;
    epos->y=ey;
    epos->z=ez;
}

/************************************************************************/
/* カメラ移動時のアイコンの向きの補正					*/
/************************************************************************/
static void angle_hosei( void )
{
    float xa,ya;

    xa =   fatan3( (EyeY-WayY),
		   sqrtf(((EyeX-WayX)*(EyeX-WayX))+((EyeZ-WayZ)*(EyeZ-WayZ))) );
    ya = - fatan3( (EyeX-WayX),(EyeZ-WayZ) );

    rotateY_now( -ya, MULT_MTX );
    rotateX_now( -xa, MULT_MTX );
}

/************************************************************************/
/* キー入力								*/
/************************************************************************/
static void KeyMap( void )
{
    register int i;
    int KeyOn;
    int TurnOn;
    u8 speedX,speedY,speed;
    float x,y;
    
    speedX = 0;
    speedY = 0;
    TurnOn = OFF;
    KeyOn = OFF;

    if( Key_T[cont_num].button & CONT_A ) {
	if( before_mode == GAME && StageWayWork != 0 && !CourseSel_f ) {
	    Na_OpenMapMenu();
	    MenuOpen_f = ON;
	    keyin_count = 0;
	    psel = 0;
	    map_phase = SEL_STAGE;
	    work_phase = 0;
	} else {
	    /** ステージ開始前の仲間状態セーブ **/
	    for( i=0; i<6; i++ ) {
		nakama_shield_MAP[i] = nakama_shield[i];
	    }
	    zoom_start();
	}
	return;
    }

    if( Key_T[cont_num].button & CONT_START ) {
	if( map_phase == CAM_NOMV && before_mode == GAME ) {
	    if( CourseSel_f ) {
		Na_StartSystemSe( NA_SE_ERROR );
	    } else {
		Na_OpenMapMenu();
		MenuOpen_f = ON;
		keyin_count = 0;
		psel = 0;
		map_phase = SEL_STAGE;
		work_phase = 0;
	    }
	    return;
	}
    }

    x = (float)Key_T[cont_num].stick_x;
    y = (float)Key_T[cont_num].stick_y;

    if( y != 0.0f ) {
	if( CamXa-(y*0.05f) < -80.0f ) {
	    CamXa = -80.0f;
	    y = 0.0f;
	} else if( CamXa-(y* 0.05f) > 80.0f ) {
	    CamXa = 80.0f;
	    y = 0.0f;
	} else {
	    CamXa -= y * 0.05f;
	    TurnOn = ON;
	    speedX = (int)fabsf(((y * 0.05f)/0.27f));
	}
    }

    if( x != 0.0f ) {
	CamYa += x * 0.05f;
	speedY = (int)fabsf(((x * 0.05f)/0.27f));
	TurnOn = ON;
    }

    /** 回転スピードセット  **/
    if( PlanetTmove == ON ) {
	speed = speedX;
	if( speedX < speedY ) speed = speedY;
	Na_ChangeMapRollSeSpeed( speed );
//	PRINTF( "spX:%d spY:%d sp:%d\n",speedX,speedY,speed );
    }

    /** カメラ左右上下回転音 ON **/
    if( PlanetTmove == OFF && TurnOn == ON ) {
	Na_StartMapRollSe();
	PlanetTmove = ON;
    }

    /** カメラ左右上下回転音 OFF **/
    if( PlanetTmove == ON && TurnOn == OFF &&
	y == 0.0f && x == 0.0f ) {
	speedX = 0;
	speedY = 0;
	Na_StopMapRollSe();
	PlanetTmove = OFF;
    }



    if ( Key[cont_num].button & CONT_R ) {
#ifdef MAP_DEBUG
	if( CamZr-20.0f > 100.0f ) {
#else
	if( CamZr-20.0f > 2475.0f ) {
#endif
	    CamZr-=20.0f;
	    KeyOn = ON;
	}

//	PRINTF( "cz:%f\n",CamZr );
    }
    if ( Key[cont_num].button & CONT_G ) {
	if( CamZr+20.0f < 7695.0f ) {
	    CamZr+=20.0f;
	    KeyOn = ON;
	}
//	PRINTF( "cz+:%f\n",CamZr );
    }

    if ( Key[cont_num].button & CONT_E ) {
	if( WayY-10.0f >= -1200.0f ) {
	    WayY -= 10.0f;
	    KeyOn = ON;
//	    PRINTF( "wy:%f\n",WayY );
	}
    }
    if ( Key[cont_num].button & CONT_D ) {
	if( WayY+10.0f <= 1200.0f ) {
	    WayY += 10.0f;
	    KeyOn = ON;
//	    PRINTF( "wy:%f\n",WayY );
	}
    }
    
    if ( Key[cont_num].button & CONT_C ) {
	if( WayX+10.0f <= 1200.0f ) {
	    WayX += 10.0f;
	    KeyOn = ON;
//	    PRINTF( "wx:%f\n",WayX );
	}
    }
    if ( Key[cont_num].button & CONT_F ) {
	if( WayX-10.0f >= -1200.0f ) {
	    WayX -= 10.0f;
	    KeyOn = ON;
//	    PRINTF( "wx:%f\n",WayX );
	}
    }

    /** カメラ左右上下移動音 ON **/
    if( PlanetWmove == OFF && KeyOn == ON ) {
	Na_StartSystemSe( NA_SE_MAP_MOVE );
	PlanetWmove = ON;
    }

    /** カメラ左右上下移動音 OFF **/
    if( PlanetWmove == ON && KeyOn == OFF ) {
	Na_StopAllFlagSe( NA_SE_MAP_MOVE );
	PlanetWmove = OFF;
    }



#if 0
    x = (float)Key_T[cont_num].stick_x;
    if( x < -10.0f || x > 10.0f ) {
	if( x < 0.0f ) x += 10.0f;
	if( x > 0.0f ) x -= 10.0f;
	turn_ang = x * (2.0f/50.0f);
    } else {
	turn_ang = PLANET_TURN;
    }
#endif

#if 0
    PRINTF( "xa:%f wx:%f wy:%f zr:%f\n",
	    CamXa,WayX,WayY,CamZr );
#endif
}

/************************************************************************/
/* キー入力								*/
/************************************************************************/
static void KeyIn( void )
{
#ifdef MAP_DEBUG
    if ( Key_T[0].button & CONT_RIGHT ) {
	StagePtr -= 1;
	if( StagePtr < 0 ) StagePtr = 14;
	NowStage = StageList[StagePtr];
	StageNoSet();
	get_cursor_Yrange();
    }

    if ( Key_T[0].button & CONT_LEFT ) {
	StagePtr += 1;
	if( StagePtr > 14 ) StagePtr = 0;
	NowStage = StageList[StagePtr];
	StageNoSet();
	get_cursor_Yrange();
    }
#endif
}

/************************************************************************/
/* カメラの回転座標の計算						*/
/************************************************************************/
static void get_cam_rotate_pos( float ex, float ey, float ez,
				float *wx, float *wy, float *wz,
				float vec, float xa, float ya )
{
    xyz_t ato;
    xyz_t mae;

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = vec;

    translate_work( ex, ey, ez, SET_MTX );
    rotateY_work( ANGLE(ya), MULT_MTX );
    rotateX_work( ANGLE(xa), MULT_MTX );

    MtxF_Position_work( &mae,&ato );

    *wx = ato.x;
    *wy = ato.y;
    *wz = ato.z;

#if 0
    /* カメラの上方向の計算 */
    mae.x = 0.0f;
    mae.y = 1.0f;
    mae.z = 0.0f;

    rotateY_work( ANGLE(ya), SET_MTX );
    rotateX_work( ANGLE(xa), MULT_MTX );
    
    MtxF_Position_work( &mae,&ato );

    vX = ato.x;
    vY = ato.y;
    vZ = ato.z;
#endif

#if 0
    PRINTF( "eX:%f eY:%f eZ:%f\n",*wx,*wy,*wz );
    PRINTF( "wX:%f wY:%f wZ:%f\n",ex,ey,ez );
    PRINTF( "Xa:%f Ya:%f Zr:%f\n\n",xa,ya,vec );
#endif
}









/*----------------------------------------------------------------------*/
/*									*/
/* 共用関数(map,option)							*/
/*									*/
/*----------------------------------------------------------------------*/
/*======================================================================*/
/* 残機数の描画								*/
/*======================================================================*/
void draw_ZankiSuu( int xxx, int yyy, int rest )
{
    rcpsetmode( &NOW_DISP, RECE_RGBA_A_PRIM );

    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    texture_rectangleCI4( &NOW_DISP, MAP_AW_txt,MAP_AW_txttlut,
			  16, 16, xxx, yyy, 1.0f, 1.0f );

    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
    texture_rectangleCI4( &NOW_DISP, MAP_x_txt, MAP_x_txttlut,
			  16, 7, xxx+18.0f, yyy+9.0f, 1.0f, 1.0f );

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
    if( rest >= 10 ) {
 	moji_number( (int)xxx+33.0f-((keta_ck(rest)-1)*8)+ 3,
		     (int)yyy+8.0f, rest );
    }
    else {
	moji_number( (int)xxx+33.0f, (int)yyy+8.0f, rest );
    }

#if 0
    if( Key[3].button & CONT_LEFT ) {
	xxx -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	xxx += 1.0f;
    }
    if( Key[3].button & CONT_UP ) {
	yyy += 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	yyy -= 1.0f;
    }

    PRINTF( "x=%f y=%f\n",xxx,yyy );
#endif
}

/*======================================================================*/
/* 数字 を 表示する							*/
/*======================================================================*/
void moji_number(
    int		x,
    int		y,
    int		n
)
{
    static unsigned char *num_text[] = {
	MOJI_00_txt, MOJI_01_txt, MOJI_02_txt, MOJI_03_txt, MOJI_04_txt,
	MOJI_05_txt, MOJI_06_txt, MOJI_07_txt, MOJI_08_txt, MOJI_09_txt,
    };

    int			i, flg;

    flg = OFF;
    i =	10000000;
    n %= i;
    for(i /= 10; i != 1; i /= 10) {
	if(n / i || flg == ON) {
	    texture_rectangleIA8(&NOW_DISP, num_text[n / i],
			       16, 8,
			      (float)x, (float)y, 1.0f, 1.0f);
	    x += 9;
	    n %= i;
	    flg = ON;
	}
    }
    texture_rectangleIA8(&NOW_DISP, num_text[n / i],
			 16, 8,
			 (float)x, (float)y, 1.0f, 1.0f);
}
























#ifdef CCC
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/

#if 0
static Gfx *dot_data[DOT_N]={
    MAP_Point_blue,	/* マップ画面点線 青 */
    MAP_Point_yellow,	/* マップ画面点線 黄 */
    MAP_Point_red,	/* マップ画面点線 赤 */
};
#endif

/************************************************************************/
/* 点線の描画のための座標および増分取得					*/
/************************************************************************/
static void pos_calc( int l_no, xyz_t *pos, xyz_t *stp )
{
    float xx,yy,zz,rr;
    float xs,ys,zs,sp;

    xx=(planet[Line[l_no].endP].Xpos-planet[Line[l_no].startP].Xpos);
    yy=(planet[Line[l_no].endP].Ypos-planet[Line[l_no].startP].Ypos);
    zz=(planet[Line[l_no].endP].Zpos-planet[Line[l_no].startP].Zpos);
    rr=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );

    xs=(xx/rr)*(rr/(Line[l_no].dots+3));
    ys=(yy/rr)*(rr/(Line[l_no].dots+3));
    zs=(zz/rr)*(rr/(Line[l_no].dots+3));
    
    if( planet[Line[l_no].startP].scale >= 4.0f ) {
	sp = 3.0f;
    } else if( planet[Line[l_no].startP].scale >= 2.0f ) {
	sp = 2.0f;
    } else if( planet[Line[l_no].startP].scale >= 1.8f ) {
	sp = 1.3f;
    } else {
	sp = 1.8f;
    }

    pos->x=planet[Line[l_no].startP].Xpos+(xs*sp);
    pos->y=planet[Line[l_no].startP].Ypos+(ys*sp);
    pos->z=planet[Line[l_no].startP].Zpos+(zs*sp);

    stp->x = xs;
    stp->y = ys;
    stp->z = zs;
}

/************************************************************************/
/* 残りの石たちの描画							*/
/************************************************************************/
static void draw_rocks( float sx,float sy,float sz )
{
    register int i;

    static POSDATA posData[21] = {
        {-140.0, 0.0,-300.0, 0.4 },

        {-100.0, 0.0,-280.0, 0.3 },

        {-110.0, 0.0,-240.0, 0.3 },
        { -70.0, 0.0,-240.0, 0.4 },

        { -80.0, 0.0,-200.0, 0.5 },
        { -30.0, 0.0,-200.0, 0.5 },

        { -50.0, 0.0,-160.0, 0.6 },

        { -10.0, 0.0,-120.0, 0.5 },
        { -60.0, 0.0,-120.0, 0.6 },

        { -30.0, 0.0,-80.0, 0.8 },

        {  20.0, 0.0,-40.0, 0.7 },
        { -40.0, 0.0,-40.0, 0.9 },

        { -60.0, 0.0, 0.0, 0.8 },

        {  30.0, 0.0,40.0, 0.8 },
        { -30.0, 0.0,40.0, 0.7 },
        { -70.0, 0.0,40.0, 0.6 },

        {  -5.0, 0.0,80.0, 0.4 },
        { -60.0, 0.0,80.0, 0.5 },
        { -95.0, 0.0,80.0, 0.3 },

        { -90.0, 0.0,120.0, 0.2 },
        { -30.0, 0.0,120.0, 0.3 },
    };

    for( i=0; i<21; i++ ) {
	translate_now( sx-stX+posData[i].ofX,
		       sy-stY+posData[i].ofY,
		       sz-stX+posData[i].ofZ, SET_MTX );

#ifdef CCC
    {
	float ang,range;

	ang=fatan3( (sx+posData[i].ofX),(sz+posData[i].ofZ) );
	range=sqrtf( ((sx-stX+posData[i].ofX)*(sx-stX+posData[i].ofX)) +
		     ((sy-stY+posData[i].ofY)*(sy-stY+posData[i].ofY)) +
		     ((sz-stZ+posData[i].ofZ)*(sz-stZ+posData[i].ofZ)) );

	PRINTF( "\t{ %f, %f, %f },\n"
		    ,range,ang*180.0/F_PI,posData[i].scl );
    }
#endif

	scale_now( posData[i].scl, posData[i].scl, posData[i].scl, MULT_MTX );

	angle_hosei();

	nowtoMtx( NOW_MTX );
	gSPMatrix( NEXT_DISP, NEXT_MTX,
		   G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH );

	if( cam_sw == OFF || NowStage == 1 ) {
	    texture_z_a();
	} else {
	    texture_z_a_prim_edge();
	    /*                   R         G         B         A */
	    gDPSetPrimColor(NEXT_DISP, 0, 0,
			    prim_col, prim_col, prim_col, prim_col);
	}

	gSPDisplayList( NEXT_DISP, pla_data[10] );
	gSPPopMatrix( NEXT_DISP, G_MTX_MODELVIEW );
    }
}

#ifdef CCC
/************************************************************************/
/* 背景を動かす	(カメラ移動時用)					*/
/************************************************************************/
static void bg_scroll( xyz_t eye, xyz_t way )
{
    float xxe,yye,zze,rre;
    float xxw,yyw,zzw,rrw;
    float xve,yve;
    float xvw,yvw;

    /* カメラ */
    xxe=(eye.x-eyeX);
    yye=(eye.y-eyeY);
    zze=(eye.z-eyeZ);
    rre=sqrtf( (xxe*xxe)+(yye*yye)+(zze*zze) );

    if( rre != 0.0f ) {
	xve = (xxe/rre)*0.25f;
	yve = (yye/rre)*0.25f;
	if( xve > 0 ) xve = -xve;
    } else {
	xve = 0.0f;
	yve = 0.0f;
    }

    /* 視点 */
    xxw=(way.x-wayX);
    yyw=(way.y-wayY);
    zzw=(way.z-wayZ);
    rrw=sqrtf( (xxw*xxw)+(yyw*yyw)+(zzw*zzw) );

    if( rrw != 0.0f ) {
	xvw = (xxw/rrw)*0.25f;
	yvw = (yyw/rrw)*0.25f;
	if( xvw > 0 ) xvw = -xvw;
    } else {
	xvw = 0.0f;
	yvw = 0.0f;
    }

    starXpos += (xxe*xve) + (xxw*xvw);
    starYpos += (yye*yve) + (yyw*yvw);

#ifdef CCC
    PRINTF( "xve=%f yve=%f xvw=%f yvw=%f\n",xve,yve,xvw,yvw );
#endif
}

/************************************************************************/
/* 背景を動かす	(惑星公転時用)						*/
/************************************************************************/
static void bg_scroll_2( xyz_t way )
{
    float xxw,yyw,zzw,rrw;
    float xvw,yvw;

    /* 視点 */
    xxw=(way.x-wayX);
    yyw=(way.y-wayY);
    zzw=(way.z-wayZ);
    rrw=sqrtf( (xxw*xxw)+(yyw*yyw)+(zzw*zzw) );


    if( rrw != 0.0f ) {
	xvw = (xxw/rrw)*0.2f;
	yvw = (yyw/rrw)*500.0f;
	if( xvw < 0 ) xvw = -xvw;
	if( yvw < 0 ) yvw = -yvw;
    } else {
	xvw = 0.0f;
	yvw = 0.0f;
    }

    starXpos += (xxw*xvw);
    starYpos += (yyw*yvw);

#ifdef CCC
    PRINTF( "xxw=%f xvw=%f p=%f\n",xxw,xvw,(xxw*xvw) );
    PRINTF( "yyw=%f yvw=%f p=%f\n\n",yyw,yvw,(yyw*yvw) );
#endif
}
#endif

/************************************************************************/
/* 太陽のプロミネンスの描画						*/
/************************************************************************/
static void draw_prominens( void )
{
    int i,j;
    float ang,ang1;

    i=0;
    /* 太陽の周り */
    for( ang=0.0f; ang<360.0f; ang+=30.0f ) {
	draw_prominens_sub( prom_data[dat[i]][ptn[i]].num0,
			    ang-ang1_dat[i],0.0f,90.0f,
			    1.0f-scl1_dat[i],0 );
	draw_prominens_sub( prom_data[dat[i]][ptn[i]].num1,
			    ang-ang1_dat[i],0.0f,90.0f,
			    1.0f-scl1_dat[i],0 );
	prom_time[i]++;
	if( prom_data[dat[i]][ptn[i]].ptime < prom_time[i] ) {
	    ptn[i]++;
	    prom_time[i] = 0;
	}

	if( prom_data[dat[i]][ptn[i]].num0 < 0 &&
	    prom_data[dat[i]][ptn[i]].ptime < 0 ) {
	    ptn[i] = 0;
	    prom_time[i] = 0;
	    dat[i] = (int)(rnd()*6);
	    ang1_dat[i] = (rnd()*10.0f);
	    scl1_dat[i] = (rnd()*0.5f);
	}
	i++;
    }

    /* 太陽の中 */
    j=0;
    for( ang1=20.0f; ang1 > -80.0f; ang1-=20.0f ) {
	for( ang=240.0f; ang<330.0f; ang+=30.0f ) {
	    draw_prominens_sub( prom_data[dat[i]][ptn[i]].num0,
				ang-ang2_dat[j],ang1+ang2_dat[j],90.0f,
				0.5f+scl2_dat[j],1 );
	    draw_prominens_sub( prom_data[dat[i]][ptn[i]].num1,
				ang-ang2_dat[j],ang1+ang2_dat[j],90.0f,
				0.5f+scl2_dat[j],1 );

	    prom_time[i]++;
	    if( prom_data[dat[i]][ptn[i]].ptime < prom_time[i] ) {
		ptn[i]++;
		prom_time[i] = 0;
	    }
	    if( prom_data[dat[i]][ptn[i]].num0 < 0 &&
		prom_data[dat[i]][ptn[i]].ptime < 0 ) {
		ptn[i] = 0;
		prom_time[i] = 0;
		dat[i] = (int)(rnd()*6);
		ang2_dat[j] = (rnd()*10.0f);
		scl2_dat[j] = (rnd()*0.5f);
	    }
	    i++;
	    j++;

	}
    }
}

/************************************************************************/
/* 太陽のプロミネンスの描画 サブ					*/
/************************************************************************/
static void draw_prominens_sub( int num, float ang1, float ang2, float range,
				float scl, int flag )
{
    if( num < 0 ) return;

    push_now();

    if( flag ) {	/* 太陽の中 */
	translate_now( stX, stY, stZ, MULT_MTX );
	rotateX_now( ANGLE(ang2), MULT_MTX );
	rotateY_now( ANGLE(ang1), MULT_MTX );
	translate_now( range, 0.0f, 0.0f, MULT_MTX );
	rotateY_now( ANGLE(-90.0f), MULT_MTX );
	if( ang2 >= 0.0f ) {
	    rotateX_now( ANGLE(ang2+30.0f), MULT_MTX );
	    rotateZ_now( ANGLE(180.0), MULT_MTX );
	} else {
	    rotateX_now( ANGLE(ang2+35.0f), MULT_MTX );
	}
    } else {		/* 太陽の周り */
	translate_now( stX, stY, stZ, MULT_MTX );
	rotateZ_now( ANGLE(ang1), MULT_MTX );
	translate_now( range, 0.0f, 0.0f, MULT_MTX );
	rotateZ_now( ANGLE(-90.0f), MULT_MTX );
    }
    
    angle_hosei();
    
    scale_now( scl, scl, scl, MULT_MTX );

    /**nowtoMtx( NOW_MTX );
    gSPMatrix( NEXT_DISP, NEXT_MTX,
	       G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH );**/

    set_matrix(&NOW_DISP);

    if( cam_sw==OFF || cam_sw==GO_GAME || NowStage == MP_SN ) {
	/*texture_z_a();*/
	texture_z_a_prim();
	gDPSetPrimColor(NEXT_DISP, 0, 0,
		      /*  R     G     B     A  */
			0xff, 0xff, 0xff, 0xa0 );
     } else {	/* ZOOM 時には消す */
	texture_z_a_prim_edge();
	gDPSetPrimColor(NEXT_DISP, 0, 0,
			/*  R         G         B         A  */
			prim_col, prim_col, prim_col, prim_col );
    }

    gSPDisplayList( NEXT_DISP, sun_prom[num] );

    /**gSPPopMatrix( NEXT_DISP, G_MTX_MODELVIEW );**/
    pull_now();
}

#if 0
/************************************************************************/
/* ライト								*/
/************************************************************************/
static void lighting( int i )
{
    xyz_t ato;
    xyz_t mae;
    float xp,yp,zp;
    float xv,yv,zv;
    float xa,ya,ang;
    float xx,yy,zz,rr;
    float sx,sy,sz;

    /*** カメラの角度 ***/
    xx = (eyeX-wayX);
    yy = (eyeY-wayY);
    zz = (eyeZ-wayZ);

    xa = fatan3( yy,sqrtf((xx*xx)+(zz*zz)) ) * (180.0f/F_PI);
    ya = fatan3( xx,zz ) * (180.0f/F_PI);

    /* 太陽の位置の計算 */
    mae.x = planet[NowStage].Xrange;
    mae.y = 0.0f;
    mae.z = 0.0f;

    ang = planet[NowStage].Yang2+(-180.0f)+(-ya);
    
//    push_now();

    translate_work( planet[NowStage].Xpos,
		   planet[NowStage].Ypos,
		   planet[NowStage].Zpos, SET_MTX );
    rotateX_work( ANGLE(xa), MULT_MTX );
    rotateY_work( ANGLE(ang), MULT_MTX );

    MtxF_Position_work( &mae,&ato );

    sx = ato.x;
    sy = ato.y;
    sz = ato.z;

    /* 各惑星の位置の計算 */
    mae.x = planet[i].Xrange;
    mae.y = 0.0f;
    mae.z = 0.0f;

    ang = planet[i].Yang2+(-ya);

    translate_work( sx, sy, sz, SET_MTX );
    rotateX_work( ANGLE(xa), MULT_MTX );
    rotateY_work( ANGLE(ang), MULT_MTX );

    MtxF_Position_work( &mae,&ato );

//    pull_now();

    xp = (sx-ato.x);
    yp = (sy-ato.y);
    zp = (sz-ato.z);

    rr=sqrtf( (xp*xp)+(yp*yp)+(zp*zp) );

    if( rr == 0.0f ) {
	xv=0;
	yv=0;
	zv=100;
    } else {
	xv=((xp/rr)*100);
	yv=((yp/rr)*100);
	zv=((zp/rr)*100);
    }

    light_in(
	(int)xv,	/* ライトの方向 X */
	(int)yv,	/* ライトの方向 Y */
	(int)zv,	/* ライトの方向 Z */
	lightR,		/* ライトの色   R */
	lightG,		/* ライトの色   G */
	lightB,		/* ライトの色   B */
	kan_col,	/* 環境光の色   R */
	kan_col,	/* 環境光の色   G */
	kan_col);	/* 環境光の色   B */

#ifdef CCC
    PRINTF( "sx=%f sy=%f sz=%f\n",sx,sy,sz );
    PRINTF( "xa=%f ya=%f\n\n",xa,ya );
    PRINTF( "ax=%f ay=%f az=%f\n\n",ato.x,ato.y,ato.z );
#endif
}
#endif

#ifdef CCC
static Gfx *pla_data[OBJ_N]={
    MAP_PL_01,     /*  0:コーネリア */
    MAP_PL_02,     /*  1:タイタニア */
    MAP_PL_03,	   /*  2:アクエリア */
    MAP_PL_04,     /*  3:ベノム */
    MAP_PL_05,     /*  4:フォーチュナ */
    MAP_PL_06,     /*  5:太陽 */
    MAP_PL_07,     /*  6:ゾネス */
    MAP_PL_08,     /*  7:マクベス */
    MAP_Icon_01,   /*  8:アイコン01 */
    MAP_Icon_Rock, /*  9:アイコン "石" */
    MAP_SectarX,   /* 10:セクターＸ */
    MAP_SectarY,   /* 11:セクターＹ */
    MAP_SectarZ,   /* 12:セクターＺ */
    MAP_Groundship,/* 13:巨大戦艦(バトルシップ) */
};

static PLANET planet[MAP_ITM]={
  /* 太陽 [0] */
  { 5,    0.0f,  0.0f, 0.0f, 0.0f,  0.0f,     0.0f,  4.0f, 0 },

  /* 難易度2 惑星 [1] フォーチュナ */
  { 4,  250.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -125.0f,  2.2f, 0 }, /* */
  /* 難易度4 惑星(ミサイル基地) [2] マクベス */
  { 7,  350.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -260.0f,  2.4f, 0 }, /* */
  /* 難易度3 惑星 [3] ゾネス */
  { 6,  350.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -190.0f,  1.7f, 0 }, /* */

  /* 出発地点 [4] コーネリア */
  { 0,  450.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -135.0,  2.7f, 0 }, /* */
  /* 難易度1 宇宙 [5] アステロイド */
  { 9,  450.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -112.0f,  1.0f, 1 },
  /* 難易度1 惑星(タンク) [6] タイタニア */
  { 1,  450.0f,  0.0f, 0.0f, 0.0f,  0.0f,   -80.0f,  1.8f, 0 }, /* */
  /* 難易度2 惑星 [7] アクエリア */
  { 2,  450.0f,  0.0f, 0.0f, 0.0f,  0.0f,   -10.0f,  2.1f, 0 }, /* */
  /* 難易度2 コロニー [8] コロニー */
  { 8,  450.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -338.0f,  1.8f, 1 },
  /* 難易度3 衛星都市 [9] スペースアマダ */
  { 8,  450.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -315.0f,  1.8f, 1 },
  /* 難易度4 防衛衛星ミサイル群 [10] グレートフォックス号 */
  { 8,  450.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -292.0f,  1.8f, 1 },
  /* 難易度2 宇宙 [11] バトルシップ */
  { 13, 450.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -158.0f,  1.8f, 3 },

  /* 惑星 ベノム [12] ベノム */
  { 3,  750.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -320.0f,  2.7f, 0 }, /* */

  /* 難易度4 超空間 [13] セクターＺ */
  { 12, 450.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -225.0f,  4.0f, 2 },
  /* 難易度2 宇宙 [14] セクターＸ */
  { 10, 350.0f,  0.0f, 0.0f, 0.0f,  0.0f,   -45.0f,  4.0f, 2 },
  /* 難易度3 宇宙 [15] セクターＹ */
  { 11, 200.0f,  0.0f, 0.0f, 0.0f,  0.0f,  -215.0f,  4.0f, 2 },
};
#endif

#if 0
typedef struct {
    int num0;
    int num1;
    int ptime;
} PROM;

static Gfx *sun_prom[3]={
    MAP_Fire01,		/* マップ太陽プロミネンス 1 */
    MAP_Fire02,		/* マップ太陽プロミネンス 2 */
    MAP_Fire03,		/* マップ太陽プロミネンス 3 */
};

static PROM prom_data[6][7]={
    {{0, -1, 15},{0,  1, 8},{1,  2, 13},{2, -1, 8},{-1,-1, 20},{-1,-1, -1}},

    {{-1,-1,10},{0, -1, 8},{0,  1, 8},{0, -1, 13},{-1,-1,15},{-1,-1, -1}},

    {{2, -1, 30},{2,  1, 8},{1,  0, 12},{0, -1, 8},{-1,-1, 8},{-1,-1, -1}},

    {{-1,-1, 20},{-1,-1, -1}},

    {{2, -1, 13},{2,  1, 13},{2, -1, 8},{-1,-1, 30},{-1,-1, -1}},

    {{-1,-1, 5},{2, -1, 18},{-1,-1, 15},{-1,-1, -1}},
};
#endif

static POSDATA2 posData2[21] = {
        { 330.092102f, -69.197266f, 0.600000f },
        { 301.602814f, -62.934331f, 0.500000f },
        { 330.173187f, -57.534807f, 0.500000f },
        { 297.201111f, -53.391830f, 0.600000f },
        { 330.119049f, -48.849163f, 0.700000f },
        { 294.314941f, -42.430510f, 0.700000f },
        { 337.554169f, -40.354857f, 0.800000f },
        { 346.750061f, -30.996818f, 0.700000f },
        { 374.957214f, -37.560404f, 0.800000f },
        { 391.352966f, -30.490882f, 1.000000f },
        { 405.436127f, -21.496982f, 0.900000f },
        { 431.053619f, -28.938322f, 1.100000f },
        { 475.740204f, -28.715289f, 1.000000f },
        { 477.770050f, -16.860419f, 1.000000f },
        { 498.490692f, -23.474968f, 0.900000f },
        { 515.731323f, -27.554461f, 0.800000f },
        { 526.657349f, -19.242965f, 0.600000f },
        { 547.253113f, -24.687774f, 0.700000f },
        { 562.770935f, -27.927152f, 0.500000f },
        { 596.220581f, -25.701759f, 0.400000f },
        { 572.756714f, -20.285415f, 0.500000f },
};

/*======================================================================*
 *									*
 *	マップ総合表示							*
 *									*
 *======================================================================*/
void map_display( void )
{
    register int i;

    push_now();
    set_lookat_now( eyeX, eyeY, eyeZ, wayX, wayY, wayZ,
		    vX, vY, vZ, MULT_MTX );

    translate_now( stX, stY, stZ, MULT_MTX );

    set_matrix(&NOW_DISP);

    /* 残りの石の描画 */
    if( prim_col != 0 || NowStage == MP_AS ) {
	draw_rocks();
    }

    if( prim_col != 0 ) {
	/* 矢印の描画 */
	draw_cursor();

#if 0
	for( i=0; i<LINES; i++ ) {
	    draw_line( i );
	}
#endif

	/* 点線の描画 */
	for( i=0; i<LINES; i++ ) {
//	    Line[i].flag = 1;
	    if( Line[i].flag ) draw_dot( i );
	}
	draw_dot2();
    }

    for( i=0; i<MAP_ITM; i++ ) {
	if( prim_col != 0 || i == NowStage ) {
	    /* 惑星 , アイコンの描画 */
	    draw_planet( i );
	}
    }

#if 0
    if( prim_col != 0 || NowStage == MP_SN ) {
	/* 太陽のプロミネンスの描画 */
	draw_prominens();
    }
#endif

//    line_ex_display();
    
    pull_now();

    /* 文字の描画 */
    if( moji_sw ) draw_moji();

    draw_wip();
    if( moji_sw2 ) draw_StageName();








    if(Key_T[0].button & CONT_E) {
	time_flag = 1 - time_flag;
    }
    time_display();

    if(Key_T[0].button & CONT_C) {
	message_ad_set( msg_00999,FACE_PEPPER );
    }
    face_display();
    map_face_display( -60 );
    map_face_display( -50 );
    
    /* メッセージエリアまわりの描画 */
}

#if 0
/************************************************************************/
/* 点線の描画 (１点ずつ )						*/
/************************************************************************/
static void draw_dot2( void )
{
    register int i;
    xyz_t rpos,rstp;
    float x,y,z;

    if( stage_clear_sw != 0 ) {
	for( i=0; i<LINES; i++ ) {
	    if( NowStage == Line[i].startP &&
		stage_clear_sw-1 == Line[i].dotno ) {
		NowStage = Line[i].endP;
		line_no = i;
		dot_cnt = Line[i].dots;
		dot_sw = ON;
		break;
	    }
	}
	stage_clear_sw = 0;
    }

    if( line_no >= 0 && dot_cnt != 0 ) {

	pos_calc( line_no, &rpos, &rstp );
	x = rpos.x;
	y = rpos.y;
	z = rpos.z;

	for( i=0; i<Line[line_no].dots-(dot_cnt-1); i++ ) {
	    push_now();

	    translate_now( x-stX, y-stY, z-stZ, MULT_MTX );
	    angle_hosei();

	    scale_now( 0.4f, 0.4f, 0.4f, MULT_MTX );

	    set_matrix(&NOW_DISP);
	    /**nowtoMtx( NOW_MTX );
	    gSPMatrix( NEXT_DISP, NEXT_MTX,
		       G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH );**/


	    if( i+1 == Line[line_no].dots-(dot_cnt-1) ) {
		texture_z_a_prim_edge();
		gDPSetPrimColor( NEXT_DISP, 0, 0,
		/*                 R     G     B       A    */
				 0xff, 0xff, 0xff, dot_pcol );
	    } else {
		texture_z_a();
	    }

	    gSPDisplayList( NEXT_DISP, dot_data[Line[line_no].dotno] );
	    /**gSPPopMatrix( NEXT_DISP, G_MTX_MODELVIEW );**/
	    pull_now();

	    x += rstp.x;
	    y += rstp.y;
	    z += rstp.z;
	}

	dot_pcol+=8;

	if( dot_pcol > 0xff ) {
	    dot_cnt--;
	    dot_pcol = 0;
	}

	if( dot_cnt == 0 ) {
	    dot_pcol = 0;
	    Line[line_no].flag = ON;
//	    NowStage = Line[line_no].endP;
	    line_no = -1;
	    dot_sw = OFF;
	    map_phase = CAM_ZOOM;
	}
    }
}
#endif

#if 0
static PLANET planet[MAP_ITM]={
  /* 太陽 [0] */
  { 5,    0.0f,  0.0f, 0.0f, 0.0f,    0.0f,  2.5f, 0xff, 0 },

  /* 難易度2 惑星 [1] フォーチュナ */
  { 4,  250.0f,  0.0f, 0.0f, 0.0f, -125.0f,  2.5f, 0xff, 0 },
  /* 難易度4 惑星(ミサイル基地) [2] マクベス */
  { 7,  350.0f,  0.0f, 0.0f, 0.0f, -260.0f,  2.5f, 0xff, 0 },
  /* 難易度3 惑星 [3] ゾネス */
  { 6,  350.0f,  0.0f, 0.0f, 0.0f, -190.0f,  2.5f, 0xff, 0 },

  /* 出発地点 [4] コーネリア */
  { 0,  450.0f,  0.0f, 0.0f, 0.0f, -135.0f,  2.5f, 0xff, 0 },
  /* 難易度1 宇宙 [5] アステロイド */
  { 9,  450.0f,  0.0f, 0.0f, 0.0f, -112.0f,  1.6f, 0xff, 0 },
  /* 難易度1 惑星(タンク) [6] タイタニア */
  { 1,  450.0f,  0.0f, 0.0f, 0.0f,  -80.0f,  2.5f, 0xff, 0 },
  /* 難易度2 惑星 [7] アクエリア */
  { 2,  450.0f,  0.0f, 0.0f, 0.0f,  -10.0f,  2.5f, 0xff, 0 },
  /* 難易度2 コロニー [8] コロニー */
  { 8,  450.0f,  0.0f, 0.0f, 0.0f, -338.0f,  1.8f, 0xff, 0 },
  /* 難易度3 衛星都市 [9] スペースアマダ */
  { 8,  450.0f,  0.0f, 0.0f, 0.0f, -315.0f,  1.8f, 0xff, 0 },
  /* 難易度4 防衛衛星ミサイル群 [10] グレートフォックス号 */
  { 8,  450.0f,  0.0f, 0.0f, 0.0f, -292.0f,  1.8f, 0xff, 0 },
  /* 難易度2 宇宙 [11] バトルシップ */
  { 13, 450.0f,  0.0f, 0.0f, 0.0f, -158.0f,  1.8f, 0xff, 2 },

  /* 惑星 ベノム [12] ベノム */
  { 3,  750.0f,  0.0f, 0.0f, 0.0f, -320.0f,  2.5f, 0xff, 0 },

  /* 難易度4 超空間 [13] セクターＺ */
  { 12, 450.0f,  0.0f, 0.0f, 0.0f, -225.0f,  3.5f, 0x90, 1 },
  /* 難易度2 宇宙 [14] セクターＸ */
  { 10, 350.0f,  0.0f, 0.0f, 0.0f,  -45.0f,  3.5f, 0x90, 1 },
  /* 難易度3 宇宙 [15] セクターＹ */
  { 11, 200.0f,  0.0f, 0.0f, 0.0f, -215.0f,  3.5f, 0x90, 1 },
};
#endif

#if 0
static POSDATA2 posData2[21] = {
        { 330.092102f, -69.0f-90.0f,   10.0f, 0.4f },

        { 301.602814f, -62.0f-90.0f,   5.0f, 0.3f },

        { 330.173187f, -57.0f-90.0f,   0.0f, 0.3f },
        { 297.201111f, -53.0f-90.0f,   0.0f, 0.4f },

        { 330.119049f, -48.0f-90.0f,  -5.0f, 0.5f },
        { 294.314941f, -42.0f-90.0f,  -5.0f, 0.5f },

        { 337.554169f, -40.0f-90.0f, -10.0f, 0.6f },

        { 346.750061f, -30.0f-90.0f, -15.0f, 0.5f },
        { 374.957214f, -37.0f-90.0f, -15.0f, 0.6f },

        { 391.352966f, -30.0f-90.0f, -10.0f, 0.8f },

        { 405.436127f, -21.0f-90.0f,   5.0f, 0.8f },
        { 431.053619f, -28.0f-90.0f, -10.0f, 0.9f },

        { 475.740204f, -28.0f-90.0f,   0.0f, 0.8f },

        { 477.770050f, -16.0f-90.0f,  10.0f, 0.7f },
        { 498.490692f, -23.0f-90.0f,  10.0f, 0.6f },
        { 515.731323f, -27.0f-90.0f,  10.0f, 0.6f },

        { 526.657349f, -19.0f-90.0f,  15.0f, 0.4f },
        { 547.253113f, -24.0f-90.0f,  10.0f, 0.5f },
        { 562.770935f, -27.0f-90.0f,   5.0f, 0.3f },

        { 596.220581f, -25.0f-90.0f,  20.0f, 0.2f },
        { 572.756714f, -20.0f-90.0f,  20.0f, 0.3f },
};
#endif

#if 0
    for( i=0; i<100; i++ ) {
	ptn[i] = 0;
	prom_time[i] = 0;
	dat[i] = (int)(rnd()*6);
    }
    for( i=0; i<12; i++ ) {
	ang1_dat[i] = (rnd()*10.0f);
	scl1_dat[i] = (rnd()*0.5f);
    }
    for( i=0; i<50; i++ ) {
	ang2_dat[i] = (rnd()*10.0f);
	scl2_dat[i] = (rnd()*0.6f);
    }
#endif

#if 0
/************************************************************************/
/* 選択されている物に常にカメラを向ける					*/
/************************************************************************/
static void just_camera( float xpos, float ypos,
			 float zpos, float xrange )
{
    xyz_t ato;
    xyz_t mae;
    float xx,yy,zz,rr;
    float yv,ang;
    float Xang,Yang;

    /* カメラの位置より後ろに来る場合はカメラを引く */
    if( xrange >= EYEZ && zpos >= 0.0 ) {

	xx = (xpos*0.8f)-stX;
	zz = (zpos*0.8f)-stZ;
	Yang = -fatan3( xx,zz );
	Yang = (Yang*180.0f/F_PI);

	yv = (xrange-EYEZ)*1.2f;

	ang = -((90.0f-Yang)*2.0f+2.0f);

	mae.x = 0.0f;
	mae.y = 0.0f;
	mae.z = -yv;

	translate_work( EYEX, EYEY, EYEZ+yv, SET_MTX );
	rotateY_work( ANGLE(ang), MULT_MTX );

	MtxF_Position_work( &mae,&ato );
	eyeX = ato.x*0.3f;
	eyeY = ato.y;
	eyeZ = ato.z;
    }

    xx = (eyeX-(stX+xpos*0.8f));
    yy = (eyeY-(stY+ypos*0.8f));
    zz = (eyeZ-(stZ+zpos*0.8f));
    rr = sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );

    Xang = fatan3( yy,sqrtf((xx*xx)+(zz*zz)) );
    Yang = -fatan3( xx,zz );

    Xang = (Xang*180.0f/F_PI);
    Yang = (Yang*180.0f/F_PI);

    get_cam_rotate_pos( eyeX, eyeY, eyeZ, &wayX, &wayY, &wayZ,
			-rr*2.0f, -(Xang*1.1f), -(Yang*0.9f) );

#if 0
    PRINTF( "Yang=%f\n",Yang );
    PRINTF( "px=%f py=%f pz=%f\n",
		planet[NowStage].Xpos,planet[NowStage].Ypos,planet[NowStage].Zpos );
    PRINTF( "eyeX=%f eyeY=%f eyeZ=%f\n",eyeX,eyeY,eyeZ );
    PRINTF( "wx=%f wy=%f wz=%f\n\n",wayX,wayY,wayZ );
#endif
}
#endif

/************************************************************************/
/* 点線の描画								*/
/************************************************************************/
static void draw_dot( int n )
{
#if 0
    register int i;
    xyz_t rpos,rstp;
    float x,y,z;

    pos_calc( n, &rpos, &rstp );

    x = rpos.x;
    y = rpos.y;
    z = rpos.z;

    for( i=0; i<Line[n].dots; i++ ) {
	push_now();

	translate_now( x-stX, y-stY, z-stZ, MULT_MTX );
	angle_hosei();

	scale_now( 0.4f, 0.4f, 0.4f, MULT_MTX );

	set_matrix(&NOW_DISP);

	if( map_phase == CAM_NOMV ) {
	    texture_z_a();
	} else {
	    texture_z_a_prim_edge();
	    gDPSetPrimColor(NEXT_DISP, 0, 0,
	    /*                   R         G         B         A */
			    0xff, 0xff, 0xff, prim_col);
	}

	gSPDisplayList( NEXT_DISP, dot_data[Line[n].dotno] );

	pull_now();

	x += rstp.x;
	y += rstp.y;
	z += rstp.z;
    }
#endif
}

/************************************************************************/
/* 点線の描画 (１点ずつ )						*/
/************************************************************************/
static void draw_dot2( void )
{
#if 0
    register int i;
    xyz_t rpos,rstp;
    float x,y,z;

    if( stage_clear_sw != 0 ) {
	for( i=0; i<LINES; i++ ) {
	    if( NowStage == Line[i].startP &&
		stage_clear_sw-1 == Line[i].dotno ) {
		NowStage = Line[i].endP;
		line_no = i;
		dot_cnt = Line[i].dots;
		dot_sw = ON;
		break;
	    }
	}
	stage_clear_sw = 0;
    }

    if( line_no >= 0 && dot_cnt != 0 ) {

	pos_calc( line_no, &rpos, &rstp );
	x = rpos.x;
	y = rpos.y;
	z = rpos.z;

	for( i=0; i<Line[line_no].dots-(dot_cnt-1); i++ ) {
	    push_now();

	    translate_now( x-stX, y-stY, z-stZ, MULT_MTX );
	    angle_hosei();

	    if( i+1 == Line[line_no].dots-(dot_cnt-1) ) {
		scale_now( dot_scl, dot_scl, dot_scl, MULT_MTX );
	    } else {
		scale_now( 0.4f, 0.4f, 0.4f, MULT_MTX );
	    }

	    set_matrix(&NOW_DISP);

	    texture_z_a();

	    gSPDisplayList( NEXT_DISP, dot_data[Line[line_no].dotno] );
	    /**gSPPopMatrix( NEXT_DISP, G_MTX_MODELVIEW );**/
	    pull_now();

	    x += rstp.x;
	    y += rstp.y;
	    z += rstp.z;
	}

	dot_scl += 0.01f;

	if( dot_scl > 0.4f ) {
	    dot_cnt--;
	    dot_scl = 0.0f;
	}

	if( dot_cnt == 0 ) {
	    dot_pcol = 0;
	    Line[line_no].flag = ON;
//	    NowStage = Line[line_no].endP;
	    line_no = -1;
	    dot_sw = OFF;
	    map_phase = CAM_ZOOM;
	}
    }
#endif
}

/************************************************************************/
/* 点線の描画のための座標および増分取得					*/
/************************************************************************/
static void pos_calc( int l_no, xyz_t *pos, xyz_t *stp )
{
#if 0
    float sx,sy,sz,ex,ey,ez;
    float xx,yy,zz,rr;
    float st_size,ed_size;

    st_size = 30.0f;
    if( Line[l_no].startP == MP_SN ) st_size = 20.0f;
    if( Line[l_no].startP == MP_AS ) st_size = 60.0f;
    if( Line[l_no].startP == MP_BS ) st_size = 60.0f;
    if( Line[l_no].startP == MP_SX ) st_size = 15.0f;
    if( Line[l_no].startP == MP_SY ) st_size = 15.0f;
    if( Line[l_no].startP == MP_SZ ) st_size = 15.0f;


    ed_size = 30.0f;
    if( Line[l_no].endP == MP_SN ) ed_size = 20.0f;
    if( Line[l_no].endP == MP_AS ) ed_size = 60.0f;
    if( Line[l_no].endP == MP_BS ) ed_size = 60.0f;
    if( Line[l_no].endP == MP_SX ) ed_size = 15.0f;
    if( Line[l_no].endP == MP_SY ) ed_size = 15.0f;
    if( Line[l_no].endP == MP_SZ ) ed_size = 15.0f;


    xx=(planet[Line[l_no].endP].Xpos-planet[Line[l_no].startP].Xpos);
    yy=(planet[Line[l_no].endP].Ypos-planet[Line[l_no].startP].Ypos);
    zz=(planet[Line[l_no].endP].Zpos-planet[Line[l_no].startP].Zpos);
    rr=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );

    sx=planet[Line[l_no].startP].Xpos
	+(st_size*planet[Line[l_no].startP].scale*(xx/rr));
    sy=planet[Line[l_no].startP].Ypos
	+(st_size*planet[Line[l_no].startP].scale*(yy/rr));
    sz=planet[Line[l_no].startP].Zpos
	+(st_size*planet[Line[l_no].startP].scale*(zz/rr));

    ex=planet[Line[l_no].endP].Xpos
	+(ed_size*planet[Line[l_no].endP].scale*(-xx/rr));
    ey=planet[Line[l_no].endP].Ypos
	+(ed_size*planet[Line[l_no].endP].scale*(-yy/rr));
    ez=planet[Line[l_no].endP].Zpos
	+(ed_size*planet[Line[l_no].endP].scale*(-zz/rr));

    xx=ex-sx;
    yy=ey-sy;
    zz=ez-sz;
    rr=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );

    if( rr == 0.0f ) rr = 1.0f;

    pos->x=sx;
    pos->y=sy;
    pos->z=sz;

    stp->x=(xx/rr)*(rr/(Line[l_no].dots-1));
    stp->y=(yy/rr)*(rr/(Line[l_no].dots-1));
    stp->z=(zz/rr)*(rr/(Line[l_no].dots-1));
#endif
}


/************************************************************************/
/* 選択されている物に常にカメラを向ける					*/
/************************************************************************/
static void camera_ajust( void )
{
    /* 選択されている物に常にカメラを向ける */
    just_camera( planet[NowStage].Xpos,planet[NowStage].Ypos,
		 planet[NowStage].Zpos,planet[NowStage].Xrange );

    /* 背景スクロール */
    back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );
}

/************************************************************************/
/* 選択されている物に常にカメラを向ける					*/
/************************************************************************/
static void just_camera( float xpos, float ypos,
			 float zpos, float xrange )
{
    xyz_t ato;
    xyz_t mae;
    float xx,yy,zz,rr;
    float yv,ang;
    float Xang,Yang;

    /* カメラの位置より後ろに来る場合はカメラを引く */
    if( xrange >= EYEZ && zpos >= 0.0 ) {
	xx = (xpos*0.8f)-stX;
	zz = (zpos*0.8f)-stZ;
	Yang = -fatan3( xx,zz );
	Yang = (Yang*180.0f/F_PI);

	yv = (xrange-EYEZ)*1.2f;

	ang = -((90.0f-Yang)*2.0f+2.0f);

	mae.x = 0.0f;
	mae.y = 0.0f;
	mae.z = -yv;

//	translate_work( EYEX, EYEY, EYEZ+yv, SET_MTX );
	translate_work( EYEX, EYEY, yv, SET_MTX );
	rotateY_work( ANGLE(ang), MULT_MTX );

	MtxF_Position_work( &mae,&ato );
//	eyeX = ato.x*0.2f;
//	eyeY = ato.y;
	eyeZ = ato.z;
    }

    xx = (eyeX-(stX+xpos*0.8f));
    yy = (eyeY-(stY+ypos*0.8f));
    zz = (eyeZ-(stZ+zpos*0.8f));
    rr = sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );

    Xang = fatan3( yy,sqrtf((xx*xx)+(zz*zz)) );
    Yang = -fatan3( xx,zz );

    Xang = (Xang*180.0f/F_PI);
    Yang = (Yang*180.0f/F_PI);

    get_cam_rotate_pos( eyeX, eyeY, eyeZ, &wayX, &wayY, &wayZ,
			-rr*2.0f, -(Xang*1.1f), -(Yang*0.9f) );

#if 0
    PRINTF( "Yang=%f\n",Yang );
    PRINTF( "px=%f py=%f pz=%f\n",
		planet[NowStage].Xpos,planet[NowStage].Ypos,planet[NowStage].Zpos );
    PRINTF( "eyeX=%f eyeY=%f eyeZ=%f\n",eyeX,eyeY,eyeZ );
    PRINTF( "wx=%f wy=%f wz=%f\n\n",wayX,wayY,wayZ );
#endif
}
#if 0
    if( prim_col != 0 ) {
	PRINTF( "pm:%d\n",prim_col );
	/* 点線の描画 */
	for( i=0; i<LINES; i++ ) {
	    Line[i].flag = 1;
	    if( Line[i].flag ) draw_dot( i );
	}
	draw_dot2();
    }
#endif

typedef struct {
    int   dotno;   /* マップ画面点線 No. */
    int   startP;  /* 開始惑星 No. */
    int   endP;    /* 終了惑星 No. */
    int   dots;    /* 点の数 */
    int   flag;    /* 0:ライン非表示  1:ライン表示 */
} LINE;
static LINE Line[LINES]={
/*** Level 1 ***/
	/* 1 */
/* 0 */	{ 0, MP_CN, MP_AS, 6, 0 }, /* コーネリア -> アステロイド */
	/* 2 */
/* 1 */	{ 0, MP_AS, MP_TI, 8, 0 }, /* アステロイド -> タイタニア */
	/* 3 */
/* 2 */	{ 0, MP_TI, MP_SX, 8, 0 }, /* タイタニア -> セクターＸ */
	/* 4 */
/* 3 */	{ 0, MP_SX, MP_AC, 8, 0 }, /* セクターＸ -> アクエリア */
	/* 5 */
/* 4 */	{ 0, MP_AC, MP_BO, 8, 0 }, /* アクエリア -> コロニー */
	/* 6 */
/* 5 */	{ 0, MP_BO, MP_BM, 8, 0 }, /* コロニー -> ベノム */
	/* 7 */
/* 6 */	{ 0, MP_FO, MP_SX, 10, 0 }, /* フォーチュナ -> セクターＸ */
	/* 8 */
/* 7 */	{ 0, MP_SN, MP_BO, 8, 0 }, /* 太陽 -> コロニー */

/*** Level 2 ***/
	/* 1 */
/* 8 */	{ 1, MP_AS, MP_FO, 6, 0 }, /* アステロイド -> フォーチュナ */
	/* 2 */
/* 9 */	{ 1, MP_KT, MP_BM, 8, 0 }, /* スペースアマダ -> ベノム*/
	/* 3 */
/* 10*/	{ 1, MP_BS, MP_FO, 8, 0 }, /* バトルシップ -> フォーチュナ */
	/* 4 */
/* 11*/	{ 1, MP_FO, MP_SY, 10, 0 }, /* フォーチュナ -> セクターＹ */
	/* 5 */
/* 12*/	{ 1, MP_SX, MP_SN, 8, 0 }, /* セクターＸ -> 太陽 */
	/* 6 */
/* 13*/	{ 1, MP_ZO, MP_SY, 6, 0 }, /* ゾネス -> セクターＹ */
	/* 7 */
/* 14*/	{ 1, MP_SY, MP_SN, 6, 0 }, /* セクターＹ -> 太陽 */
	/* 8 */
/* 15*/	{ 1, MP_SN, MP_KT, 8, 0 }, /* 太陽 -> スペースアマダ */

	/* 9 */
/* 16*/	{ 1, MP_MC, MP_KT, 10, 0 }, /* マクベス -> スペースアマダ */

/*** Level 3 ***/
	/* 1 */
/* 17*/	{ 2, MP_CN, MP_BS, 6, 0 }, /* コーネリア -> バトルシップ */
	/* 2 */
/* 18*/	{ 2, MP_A6, MP_BM, 10, 0 }, /* グレートフォックス号 -> ベノム */
	/* 3 */
/* 19*/	{ 2, MP_SZ, MP_MC, 8, 0 }, /* セクターＺ -> マクベス */
	/* 4 */
/* 20*/	{ 2, MP_BS, MP_ZO, 8, 0 }, /* バトルシップ -> ゾネス */
	/* 5 */
/* 21*/	{ 2, MP_MC, MP_A6, 8, 0 }, /* マクベス -> グレートフォックス号 */
	/* 6 */
/* 22*/	{ 2, MP_ZO, MP_SZ, 8, 0 }, /* ゾネス -> セクターＺ */
	/* 7 */
/* 23*/	{ 2, MP_SY, MP_MC, 8, 0 }, /* セクターＹ -> マクベス */

	/* 8 */
/* 24*/	{ 2, MP_SN, MP_A6, 10, 0 }, /* 太陽 -> グレートフォックス号 */

};
#if 0
    ラインのセット方法の一つの例

	for(j = 0; j < LINE_EX_SIZE; j ++)  {
	    Line_ex[j].mode  = 4;  /* マップ専用モード */
	    Line_ex[j].Xpos  = 頂点1->X;
	    Line_ex[j].Ypos  = 頂点1->Y;
	    Line_ex[j].Zpos  = 頂点1->Z;
	    Line_ex[j].Xpos2 = 頂点2->X;
	    Line_ex[j].Ypos2 = 頂点2->Y;
	    Line_ex[j].Zpos2 = 頂点2->Z;
	    Line_ex[j].col_R = 0xff;  /* 色 */
	    Line_ex[j].col_G = 0xff;  /* 色 */
	    Line_ex[j].col_B = 0xff;  /* 色 */
	    Line_ex[j].col_A = 0xff;  /* A */
	}                 
#endif

/************************************************************************/
/* 惑星 , アイコンの座標の取得						*/
/************************************************************************/
static void get_planet_pos( void )
{
    register int i;
    xyz_t ato;
    xyz_t mae;
    float xa,ya,ya0;

    ya = -fatan3( (EyeX-WayX),(EyeZ-WayZ) );
    ya0= sqrtf( (EyeZ-WayZ)*(EyeZ-WayZ)+(EyeX-WayX)*(EyeX-WayX) );
    xa = fatan3((EyeY-WayY), ya0);


    for( i=0; i<MAP_ITM; i++ ) {
#if 0
	/* 惑星,アイコンの公転(左回転) */
	planet[i].Yang2 -= turn_ang;
#endif

	mae.x = planet[i].Xrange;
	mae.y = planet[i].Yrange;
	mae.z = 0.0f;

	/* 惑星,アイコンの座標の取得 */
	translate_work( stX, stY, stZ, SET_MTX );
	rotateY_work( ANGLE(planet[i].Yang2), MULT_MTX );
	MtxF_Position_work( &mae,&ato );
	planet[i].Xpos=ato.x;
	planet[i].Ypos=ato.y;
	planet[i].Zpos=ato.z;

	rotateX_work( xa, SET_MTX );
	rotateY_work( ya, MULT_MTX );
	MtxF_Position_work( &ato,&PlanetPos[i] );
    }

#if 0
    /** まわりのアステロイド群も公転 **/
    for( i=0; i<ROCKS_ITM; i++ ) {
	/* (左回転) */
	posData2[i].Yang2 -= turn_ang;
    }

    /** エリア６のまわりの艦隊も公転 **/
    for( i=0; i<4; i++ ) {
	/* (左回転) */
	Erea6Data[i].Yang2 -= turn_ang;
    }
#endif
}
/************************************************************************/
/* textureの変形 (円形)							*/
/************************************************************************/
static void texture_circle( void )
{
    unsigned char *txt1S,*txt1;
    unsigned char *txt2S,*txt2;
    register int i,j,k;
//    float ang1;
//    float x1;
    int xx1;
    int xx11;
    static int circle_data[] = {
	 0, 7,11,13,15,17,18,19,
	21,22,23,24,24,25,26,27,
	27,28,28,29,29,30,30,30,
	30,31,31,31,31,31,31,31,
    };

    static int circle_data2[31][64] = {
{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1, },
{ 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3, },
{ 0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4, },
{ 0,0,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,6, },
{ 0,0,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,7,7,7,8, },
{ 0,1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,8,8,9, },
{ 0,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,9,9,10, },
{ 0,1,1,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,11,11,11,12, },
{ 0,1,2,2,2,3,3,3,4,4,4,5,5,5,5,6,6,6,6,6,7,7,7,7,8,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,12,12,13,13, },
{ 0,1,2,2,3,3,3,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,9,10,10,10,10,11,11,11,12,12,12,13,13,13,14,15, },
{ 0,1,2,2,3,3,4,4,4,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,14,14,15,15,16, },
{ 0,1,2,2,3,3,4,4,4,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,14,14,15,15,16, },
{ 0,1,2,3,3,4,4,4,5,5,5,6,6,6,6,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,14,14,14,15,15,16,16,17,17, },
{ 0,1,2,3,3,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,13,13,13,14,14,14,15,15,15,16,16,16,17,17,18,19, },
{ 0,1,2,3,4,4,4,5,5,6,6,6,7,7,7,8,8,8,8,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,13,13,13,14,14,14,15,15,15,16,16,16,17,17,17,18,18,19,20,20, },
{ 0,1,2,3,4,4,4,5,5,6,6,6,7,7,7,8,8,8,8,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,13,13,13,14,14,14,15,15,15,16,16,16,17,17,17,18,18,19,20,20, },
{ 0,2,2,3,4,4,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,20,20,21,22, },
{ 0,2,2,3,4,4,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,20,20,21,22, },
{ 0,2,3,3,4,5,5,5,6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,20,20,20,21,21,22,23,24, },
{ 0,2,3,3,4,5,5,5,6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,20,20,20,21,21,22,23,24, },
{ 0,2,3,4,4,5,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,15,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,23,23,24,24,25, },
{ 0,2,3,4,4,5,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,15,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,23,23,24,24,25, },
{ 0,2,3,4,4,5,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,15,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,23,23,24,24,25, },
{ 0,2,3,4,4,5,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,15,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,23,23,24,24,25, },
{ 0,2,3,4,4,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,27, },
{ 0,2,3,4,4,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,27, },
{ 0,2,3,4,4,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,27, },
{ 0,2,3,4,4,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,27, },
{ 0,2,3,4,4,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,27, },
{ 0,2,3,4,4,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,27, },
{ 0,2,3,4,4,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,27, },
    };

    texture_loop_c( MAP_PLtest1_CI8_txt_S, 64, 32, TEXTURE_LOOP_RIGHT );
    texture_loop_c( MAP_PLtest2_CI8_txt_S, 64, 32, TEXTURE_LOOP_RIGHT );

    txt1S = (unsigned char *)SEGMENT_TO_KSEG0( MAP_PLtest1_CI8_txt_S );
    txt2S = (unsigned char *)SEGMENT_TO_KSEG0( MAP_PLtest2_CI8_txt_S );
    txt1  = (unsigned char *)SEGMENT_TO_KSEG0( MAP_PLtest1_CI8_txt );
    txt2  = (unsigned char *)SEGMENT_TO_KSEG0( MAP_PLtest2_CI8_txt );

    for( i=0; i<64*32; i++ ) {
	txt1[i] = 215;
	txt2[i] = 191;
    }

    for( i=0; i<32; i++ ) {
	xx1 = circle_data[i];
//	PRINTF( "i:%d x1:%d\n",i,(int)x1 );


        if( xx1 == 0 ) continue;
//	PRINTF( "i=%d { ",i );
//	for( k=xx1,j=0; j<xx1*2; j++,k-- ) {
	for( k=0,j=32-xx1; j<(32-xx1)+(xx1*2); j++,k++ ) {
#if 0
	    ang1 = facos( (float)k/(float)xx1 );
	    ang1 = RAD2DEG(ang1);
	    x1 = (2.0f*F_PI*(float)xx1)*(ang1/360.0f);
	    x1 = (float)xx1*(x1/100.0f);

//	    PRINTF( "%d,",(int)x1 );
#else
	    xx11 = circle_data2[i-1][k];
	    xx11 = (int)(32.0f/(float)(xx1)*(float)(xx11));
#endif
	    txt1[(i*64)+j] = txt1S[(i*64)+xx11];
	    txt2[((31-i)*64)+j] = txt2S[((31-i)*64)+xx11];

	}
//	PRINTF( " },\n" );
    }
}

/************************************************************************/
/* textureの変形 (球形)							*/
/************************************************************************/
static void texture_circle( void )
{
    unsigned char *txtS,*txt;
    register int i,j,k;
//    float ang1;
//    float x1;
    int xx1;
    int xx11;

    txtS = (unsigned char *)SEGMENT_TO_KSEG0( MAP_PLtest00_txt_S );
    if( DrawBufSw == 0 ) {
       txt = (unsigned char *)SEGMENT_TO_KSEG0( MAP_PLtest00_txt );
    } else {
       txt = (unsigned char *)SEGMENT_TO_KSEG0( MAP_PLtest00_txt_W );
    }

    for( i=0; i<128*128; i++ ) {
         txt[i] = 255;
    }

    for( i=0; i<64; i++ ) {
#if 1
	xx1 = circle_data[i];
#else
	xx1 = sqrtf( (63.0f*63.0f)-((float)(i*i)) );
//	PRINTF( "i:%d xx1:%d\n",i,(int)xx1 );
#endif

        if( xx1 == 0 ) continue;
//	PRINTF( "i=%d { ",i );
	for( k=0,j=64-xx1; j<(63-xx1)+(xx1*2); j++,k++ ) {
//	for( k=xx1,j=0; j<xx1*2; j++,k-- ) {
#if 0
	    ang1 = facos( (float)k/(float)xx1 );
	    ang1 = RAD2DEG(ang1);
	    x1 = (2.0f*F_PI*(float)xx1)*(ang1/360.0f);
	    x1 = (float)xx1*(x1/100.0f);

//	    PRINTF( "%d,",(int)x1 );
#else
	    xx11 = circle_data2[i-1][k];
	    xx11 = (int)(64.0f/(float)(xx1)*(float)(xx11));
	    /** Texture Scroll **/
	    xx11 = (xx11 +  PlaLoopPt) & 0x7f;
#endif
	    txt[(i*128)+j] = txtS[((i*128)+xx11)];

	    txt[((127-i)*128)+j] = txtS[((127-i)*128)+xx11];
	}
//	PRINTF( " },\n" );
    }

    /** TextureScroll PonitMove **/
//    PlaLoopPt = (PlaLoopPt - 1 ) & 0x7f;
    PlaLoopPtF = (PlaLoopPtF - 1.0f );
    PlaLoopPt = (int)PlaLoopPtF;
    PlaLoopPt = PlaLoopPt & 0x7f;

}

/************************************************************************/
/* textureの変形 (球形)							*/
/************************************************************************/
static void texture_circle( void )
{
    unsigned char *txtS[10],*txt[10],*txtSS,*txt00;
    register int i,j,k,m;
    int xx1;
    int xx11;
    int xx[10];

//    int xx22;
//    float ang1,x1;

#if 1
    for( i=0; i<10; i++ ) {
	if( PlaTxtOrg[i] == NULL ) continue;
	txtS[i] = (unsigned char *)SEGMENT_TO_KSEG0( PlaTxtOrg[i] );
	txt[i] = (unsigned char *)PlaTxt[i+MP_KT][DrawBufSw];
    }

#if 1
    for( i=1; i<48; i++ ) {
	xx1 = circle_dataX[i];
	for( k=0,j=xx1; j<(95-xx1); j++,k++ ) {
	    xx11 = circle_data2[i-1][k];

	    for( m=0; m<10; m++ ) {
		if( PlaTxtOrg[m] == NULL ) continue;
		/** Texture Scroll **/
		xx[m] = (xx11 + PlaLoopPt[m]);

		if( xx[m] > 95 ) xx[m] -= 95;
		if( xx[m] < 0 ) xx[m] += 95;
		
		txtSS = txtS[m];
		txt00 = txt[m];
		txt00[(i*96)+j] = txtSS[((i*96)+xx[m])];
		txt00[((95-i)*96)+j] = txtSS[((95-i)*96)+xx[m]];
	    }
	}
    }
#else
    for( i=0; i<48; i++ ) {
	xx1 = circle_data[i];
        if( xx1 == 0 ) continue;

	for( k=0,j=48-xx1; j<(47-xx1)+(xx1*2); j++,k++ ) {
	    xx11 = circle_data2[i-1][k];
	    xx11 = (int)(48.0f/(float)(xx1)*(float)(xx11));

	    for( m=0; m<10; m++ ) {
		if( PlaTxtOrg[m] == NULL ) continue;
		/** Texture Scroll **/
		xx[m] = (xx11 + PlaLoopPt[m]);
		
		if( xx[m] > 95 ) xx[m] -= 95;
		if( xx[m] < 0 ) xx[m] += 95;
		
		txtSS = txtS[m];
		txt00 = txt[m];
		txt00[(i*96)+j] = txtSS[((i*96)+xx[m])];
		txt00[((95-i)*96)+j] = txtSS[((95-i)*96)+xx[m]];
	    }
	}
    }
#endif
#if 0
    /** TextureScroll PonitMove **/
    for( i=0; i<10; i++ ) {
	if( PlaTxtOrg[i] == NULL ) continue;

	PlaLoopPtF[i] = (PlaLoopPtF[i] - 1.0f );
	if( PlaLoopPtF[i] < 0.0f )
	    PlaLoopPtF[i] = 95.0f;
	else if( PlaLoopPtF[i] > 95.0f )
	    PlaLoopPtF[i] = 0.0f;

	PlaLoopPt[i] = (int)PlaLoopPtF[i];
    }
#endif
#else
    for( i=47; i>=0; i-- ) {
	xx1 = (int)(sqrtf( (47.0f*47.0f)-((float)(i*i)) ));

	PRINTF( "i=%d { ",i );
	for( k=xx1,j=0; j<xx1*2; j++,k-- ) {
	    ang1 = facos( (float)k/(float)xx1 );
	    ang1 = RAD2DEG(ang1);
	    x1 = (2.0f*F_PI*(float)xx1)*(ang1/360.0f);
	    x1 = (float)xx1*(x1/100.0f);
	    xx22 = (int)(48.0f/(float)(xx1)*(float)(x1));
	    PRINTF( "%d,",xx22 );
	}
	PRINTF( " },\n" );
    }
#endif
}

static int circle_data[] = {
    0,9,13,16,18,21,22,24,26,27,28,30,31,32,33,34,35,
    36,36,37,38,39,39,40,40,41,42,42,42,43,43,44,44,44,
    45,45,45,45,46,46,46,46,46,46,46,46,46,47,
};

static int circle_data2[47][96] = {
{ 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2, },
{ 0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4, },
{ 0,0,1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,6,6,6,7, },
{ 0,1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,8,8,9, },
{ 0,1,1,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,11,11,11,12, },
{ 0,1,2,2,2,3,3,3,4,4,4,5,5,5,5,6,6,6,6,6,7,7,7,7,8,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,12,12,13,13, },
{ 0,1,2,2,3,3,4,4,4,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,14,14,15,15,16, },
{ 0,1,2,3,3,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,13,13,13,14,14,14,15,15,15,16,16,16,17,17,18,19, },
{ 0,1,2,3,4,4,4,5,5,6,6,6,7,7,7,8,8,8,8,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,13,13,13,14,14,14,15,15,15,16,16,16,17,17,17,18,18,19,20,20, },
{ 0,2,2,3,4,4,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,20,20,21,22, },
{ 0,2,3,4,4,5,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,15,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,23,23,24,24,25, },
{ 0,2,3,4,4,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,27, },
{ 0,2,3,4,5,5,6,6,7,7,8,8,9,9,9,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,20,21,21,21,22,22,22,23,23,24,24,25,25,26,26,27,28,29, },
{ 0,2,3,4,5,6,6,7,7,8,8,9,9,10,10,10,11,11,11,12,12,13,13,13,14,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,20,21,21,21,22,22,22,23,23,24,24,25,25,25,26,26,27,28,28,29,30,31, },
{ 0,2,3,4,5,6,6,7,8,8,9,9,10,10,10,11,11,12,12,12,13,13,13,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,20,21,21,21,22,22,23,23,23,24,24,25,25,25,26,26,27,27,28,28,29,29,30,31,32,33, },
{ 0,2,4,5,5,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,13,14,14,14,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,20,21,21,22,22,22,23,23,23,24,24,25,25,25,26,26,27,27,28,28,28,29,30,30,31,31,32,33,34,35, },
{ 0,3,4,5,6,6,7,8,8,9,9,10,10,11,11,12,12,13,13,13,14,14,15,15,15,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,22,23,23,24,24,24,25,25,25,26,26,27,27,27,28,28,29,29,30,30,31,31,32,33,33,34,35,36,37, },
{ 0,3,4,5,6,6,7,8,8,9,9,10,10,11,11,12,12,13,13,13,14,14,15,15,15,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,22,23,23,24,24,24,25,25,25,26,26,27,27,27,28,28,29,29,30,30,31,31,32,33,33,34,35,36,37, },
{ 0,3,4,5,6,7,7,8,9,9,10,10,11,11,12,12,13,13,14,14,14,15,15,16,16,16,17,17,18,18,18,19,19,20,20,20,21,21,21,22,22,22,23,23,24,24,24,25,25,26,26,26,27,27,28,28,28,29,29,30,30,31,31,32,32,33,33,34,35,35,36,37,38,39, },
{ 0,3,4,5,6,7,8,8,9,10,10,11,11,12,12,13,13,14,14,15,15,15,16,16,17,17,18,18,18,19,19,20,20,20,21,21,21,22,22,23,23,23,24,24,24,25,25,26,26,26,27,27,28,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,37,37,38,39,40,42, },
{ 0,3,4,6,6,7,8,9,9,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,17,18,18,19,19,19,20,20,21,21,21,22,22,23,23,23,24,24,25,25,25,26,26,27,27,27,28,28,29,29,29,30,30,31,31,32,32,33,33,33,34,34,35,36,36,37,37,38,39,39,40,41,42,44, },
{ 0,3,4,6,6,7,8,9,9,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,17,18,18,19,19,19,20,20,21,21,21,22,22,23,23,23,24,24,25,25,25,26,26,27,27,27,28,28,29,29,29,30,30,31,31,32,32,33,33,33,34,34,35,36,36,37,37,38,39,39,40,41,42,44, },
{ 0,3,5,6,7,8,8,9,10,10,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,18,19,19,20,20,21,21,21,22,22,23,23,23,24,24,25,25,25,26,26,27,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,33,34,34,35,35,36,36,37,38,38,39,39,40,41,42,43,44,45,46, },
{ 0,3,5,6,7,8,8,9,10,10,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,18,19,19,20,20,21,21,21,22,22,23,23,23,24,24,25,25,25,26,26,27,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,33,34,34,35,35,36,36,37,38,38,39,39,40,41,42,43,44,45,46, },
{ 0,3,5,6,7,8,9,9,10,11,11,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,20,21,21,22,22,23,23,23,24,24,25,25,25,26,26,27,27,28,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,34,35,35,36,36,37,37,38,39,39,40,40,41,42,42,43,44,45,46,47,49, },
{ 0,3,5,6,7,8,9,10,11,11,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,23,24,24,25,25,26,26,26,27,27,28,28,28,29,29,30,30,31,31,31,32,32,33,33,34,34,35,35,35,36,36,37,37,38,38,39,40,40,41,41,42,42,43,44,45,45,46,47,48,49,51, },
{ 0,3,5,6,7,8,9,10,11,11,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,23,24,24,25,25,26,26,26,27,27,28,28,28,29,29,30,30,31,31,31,32,32,33,33,34,34,35,35,35,36,36,37,37,38,38,39,40,40,41,41,42,42,43,44,45,45,46,47,48,49,51, },
{ 0,3,5,6,7,8,9,10,11,11,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,23,24,24,25,25,26,26,26,27,27,28,28,28,29,29,30,30,31,31,31,32,32,33,33,34,34,35,35,35,36,36,37,37,38,38,39,40,40,41,41,42,42,43,44,45,45,46,47,48,49,51, },
{ 0,3,5,6,8,9,9,10,11,12,12,13,14,14,15,15,16,17,17,18,18,19,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,26,26,27,27,28,28,29,29,29,30,30,31,31,32,32,32,33,33,34,34,35,35,36,36,37,37,37,38,38,39,39,40,41,41,42,42,43,43,44,45,45,46,47,48,49,50,51,52,54, },
{ 0,3,5,6,8,9,9,10,11,12,12,13,14,14,15,15,16,17,17,18,18,19,19,20,20,21,21,21,22,22,23,23,24,24,25,25,26,26,26,27,27,28,28,29,29,29,30,30,31,31,32,32,32,33,33,34,34,35,35,36,36,37,37,37,38,38,39,39,40,41,41,42,42,43,43,44,45,45,46,47,48,49,50,51,52,54, },
{ 0,4,5,7,8,9,10,11,11,12,13,13,14,15,15,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,25,26,26,27,27,28,28,29,29,29,30,30,31,31,32,32,33,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,46,46,47,48,48,49,50,51,52,53,54,56, },
{ 0,4,5,7,8,9,10,11,11,12,13,13,14,15,15,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,25,26,26,27,27,28,28,29,29,29,30,30,31,31,32,32,33,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,46,46,47,48,48,49,50,51,52,53,54,56, },
{ 0,4,5,7,8,9,10,11,11,12,13,13,14,15,15,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,25,26,26,27,27,28,28,29,29,29,30,30,31,31,32,32,33,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,46,46,47,48,48,49,50,51,52,53,54,56, },
{ 0,4,6,7,8,9,10,11,12,13,13,14,15,15,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,49,49,50,51,52,53,53,55,56,57,59, },
{ 0,4,6,7,8,9,10,11,12,13,13,14,15,15,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,49,49,50,51,52,53,53,55,56,57,59, },
{ 0,4,6,7,8,9,10,11,12,13,13,14,15,15,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,49,49,50,51,52,53,53,55,56,57,59, },
{ 0,4,6,7,8,9,10,11,12,13,13,14,15,15,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,49,49,50,51,52,53,53,55,56,57,59, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,48,49,50,50,51,52,53,53,54,55,56,57,58,60,62, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,48,49,50,50,51,52,53,53,54,55,56,57,58,60,62, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,48,49,50,50,51,52,53,53,54,55,56,57,58,60,62, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,48,49,50,50,51,52,53,53,54,55,56,57,58,60,62, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,48,49,50,50,51,52,53,53,54,55,56,57,58,60,62, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,48,49,50,50,51,52,53,53,54,55,56,57,58,60,62, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,48,49,50,50,51,52,53,53,54,55,56,57,58,60,62, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,48,49,50,50,51,52,53,53,54,55,56,57,58,60,62, },
{ 0,4,6,7,8,9,10,11,12,13,14,14,15,16,16,17,18,18,19,19,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,30,31,31,32,32,33,33,34,34,35,35,36,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,48,49,50,50,51,52,53,53,54,55,56,57,58,60,62, },
{ 0,4,6,7,9,10,11,12,13,13,14,15,16,16,17,18,18,19,20,20,21,21,22,22,23,23,24,24,25,26,26,27,27,28,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,47,47,48,48,49,49,50,51,51,52,53,53,54,55,56,57,58,59,60,61,62,64, },
};
/************************************************************************/
/* カーソルの描画							*/
/************************************************************************/
static void draw_cursor( void )
{
//    static float a = 377.0f;
    static float a = 47.0f;
    float offsetX;
    float lvx=0.0f,lvy=0.0f,lvz=100.0f;
    static float a0=0.0f;

    if( prim_col == 0 ) return;

    offsetX = 110.0f;
    if( NowStage == MP_CN ) offsetX = 210.0f;
    if( NowStage == MP_BM ) offsetX = 210.0f;
    if( NowStage == MP_SN ) offsetX = 170.0f;
    if( NowStage == MP_SX ) offsetX = 150.0f;
    if( NowStage == MP_SY ) offsetX = 150.0f;
    if( NowStage == MP_SZ ) offsetX = 150.0f;

#if 0
{
    xyz_t ato;
    xyz_t mae;
    static float x,y;
    static float LigXa=0.0f,LigYa=0.0f;


    x = (float)Key_T[1].stick_x;
    y = (float)Key_T[1].stick_y;

    LigYa += x * 0.04f;
    LigXa -= y * 0.04f;

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = 100.0f;

    rotateY_work( ANGLE(LigYa), SET_MTX );
    rotateX_work( ANGLE(LigXa), MULT_MTX );
    
    MtxF_Position_work( &mae,&ato );
    
    lvx = ato.x;
    lvy = ato.y;
    lvz = ato.z;

    if( Key[1].button & CONT_C ) a += 10.0f;
    if( Key[1].button & CONT_F ) a -= 10.0f;


    PRINTF( "x:%f y:%f z:%f xa:%f ya:%f a:%f\n",
	    lvx,lvy,lvz,LigXa,LigYa,a );
    
}
#endif

    light_in(
	(int)lvx,	/* ライトの方向 X */
	(int)lvy,	/* ライトの方向 Y */
	(int)lvz,	/* ライトの方向 Z */
	255,	/* ライトの色   R */
	255,	/* ライトの色   G */
	255,	/* ライトの色   B */
	128,	/* 環境光の色   R */
	128,	/* 環境光の色   G */
	128 );	/* 環境光の色   B */

    if( map_phase == CAM_NOMV ) {
	rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );
    } else {	/* ZOOM 時には消す */
	rcpsetmode( &NOW_DISP, TEXT_Z_A_LIGHT_PRIM );
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, prim_col);
    }
    gSPTexture(NEXT_DISP, 64.0f * a, 32.0f * a,
	       0, G_TX_RENDERTILE, G_ON);
//    gSPSetGeometryMode(NEXT_DISP, G_TEXTURE_GEN);
    gSPSetGeometryMode(NEXT_DISP, G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR);

    push_now();

    mult_now( &planet_Mtx[NowStage], MULT_MTX );

    translate_now( offsetX, 0.0f, 0.0f, MULT_MTX );
    rotateX_now( ANGLE(a0), MULT_MTX );
    scale_now( 3.0f, 3.0f, 3.0f, MULT_MTX );
    set_matrix(&NOW_DISP);
    gDPLoadTLUT( NEXT_DISP, 0x100, 0x100, &MAP_PL_070_txt[2048] );
    gDPLoadTextureBlock( NEXT_DISP, MAP_PL_070_txt,
			 G_IM_FMT_CI,G_IM_SIZ_8b,64,32,0,
			 G_TX_NOMIRROR,G_TX_NOMIRROR,
			 G_TX_NOMASK,G_TX_NOMASK,
			 G_TX_NOLOD,G_TX_NOLOD );
    gSPDisplayList( NEXT_DISP, MAP_koko );

    translate_now( -offsetX, 0.0f, 0.0f, MULT_MTX );
    rotateY_now( ANGLE(180.0f), MULT_MTX );
    rotateX_now( ANGLE(-a0), MULT_MTX );
    scale_now( 1.0f, 1.0f, 1.0f, MULT_MTX );

    set_matrix(&NOW_DISP);
    gDPLoadTLUT( NEXT_DISP, 0x100, 0x100, &MAP_PL_070_txt[2048] );
    gDPLoadTextureBlock( NEXT_DISP, MAP_PL_070_txt,
			 G_IM_FMT_CI,G_IM_SIZ_8b,64,32,0,
			 G_TX_NOMIRROR,G_TX_NOMIRROR,
			 G_TX_NOMASK,G_TX_NOMASK,
			 G_TX_NOLOD,G_TX_NOLOD );
    gSPDisplayList( NEXT_DISP, MAP_koko );
    pull_now();

    a0 += 2.6f;
}


/************************************************************************/
/* textureの変形 (球形)							*/
/************************************************************************/
static void texture_circle( int n )
{
    unsigned char *txt,*txtS;
    register int i,j,k;
    int *dat;
    float *lopptF;
    int xx1;
//    int xx11;
//    int xx22;
//    float ang1,x1;

    txt = (unsigned char *)PlaTxt[n];
    txtS = (unsigned char *)SEGMENT_TO_KSEG0( PlaTxtOrg[n] );
    
#if 1
    lopptF = &PlaLoopPtF[n];
    dat = circle_dataX;

    for( i=1; i<48; i++,dat++ ) {
	for( k=0,j=(*dat); j<(95-(*dat)); j++,k++ ) {
	    /** Texture Scroll **/
	    xx1 = (circle_data3[i-1][k] + (int)(*lopptF));

	    if( xx1 > 95 ) xx1 -= 96;
	    if( xx1 < 0 ) xx1 += 96;

	    *(txt+((i*96)+j)) = *(txtS+((i*96) + xx1));
	    *(txt+((95-i)*96)+j) = *(txtS+((95-i)*96)+ xx1);
	}
    }

    /** TextureScroll PonitMove **/
    if( n == KUMO-MP_KT ) {
	*lopptF = (*lopptF) - 1.0f;
    } else {
	*lopptF = (*lopptF) - 1.0f;
    }

    if( *lopptF < 0.0f )
	*lopptF = 95.0f;
    else if( *lopptF > 95.0f )
	*lopptF = 0.0f;

#else
    for( i=47; i>=0; i-- ) {
	xx1 = (int)(sqrtf( (47.0f*47.0f)-((float)(i*i)) ));

	PRINTF( "i=%d { ",i );
	for( k=xx1,j=0; j<xx1*2; j++,k-- ) {
	    ang1 = facos( (float)k/(float)xx1 );
	    ang1 = RAD2DEG(ang1);
	    x1 = (2.0f*F_PI*(float)xx1)*(ang1/360.0f);
	    x1 = (float)xx1*(x1/100.0f);
	    xx22 = (int)(48.0f/(float)(xx1)*(float)(x1));
	    PRINTF( "%d,",xx22 );
	}
	PRINTF( " },\n" );
    }
#endif
}

/************************************************************************/
/* カメラ移動 (引くゲームオーバー用) Initial				*/
/************************************************************************/
static void ZoomOutCamera2Init( void )
{
    way[0].x = -150.552155f;
    way[0].y = -489.679993f;
    way[0].z = 0.0f;

    CamXa = -42.750008f;
    CamYa = -9.849999f;
    CamZr= 3375.000000f;

    get_cam_rotate_pos( way[0].x, way[0].y, way[0].z,
			&eye[0].x, &eye[0].y, &eye[0].z,
			CamZr, CamXa, CamYa );

}

/************************************************************************/
/* カメラ移動 (引くゲームオーバー用)					*/
/************************************************************************/
static void ZoomOutCamera2( void )
{
    register int i;
    float res,res1,res2,res3,res4,res5;

    switch( work_phase ) {
    case 0:
	bomb_p = 0;
	Time = 0;
	wait_time = 30;
	/** カメラ移動データセット  **/
	ZoomOutCamera2Init();
	work_phase++;
	break;
    case 1:
	if( wait_time == 1 ) Na_StartSystemSe( NA_SE_MAP_ZOOM_OUT );
	if( wait_time ) break;

	res = add_calc( &EyeX, eye[0].x, 0.06f, 100.0f, 0.1f );
	res1 = add_calc( &EyeY, eye[0].y, 0.06f, 100.0f, 0.1f );
	res2 = add_calc( &EyeZ, eye[0].z, 0.06f, 100.0f, 0.1f );
	res3 = add_calc( &WayX, way[0].x, 0.06f, 100.0f, 0.1f );
	res4 = add_calc( &WayY, way[0].y, 0.06f, 100.0f, 0.1f );
	res5 = add_calc( &WayZ, way[0].z, 0.06f, 100.0f, 0.1f );

	prim_col += 0x10;
	if( prim_col > 0xff ) prim_col = 0xff;

	for( i=0; i<LINES; i++ ) {
	    if( ClearRootLine[i] == 0 ) continue;
	    Line[i].PrimCol += 0x10;
	    if( Line[i].PrimCol > 0xff )
		Line[i].PrimCol = 0xff;
	}
	
	for( i=0; i<MAP_ITM; i++ ) {
	    if( i == NowStage ) continue;
	    planet[i].PrimCol += 0x10;
	    if( i == MP_SZ || i == MP_SX || i == MP_SY ) {
		if( planet[i].PrimCol > 0x90 )
		    planet[i].PrimCol = 0x90;
	    } else {
		if( planet[i].PrimCol > 0xff )
		    planet[i].PrimCol = 0xff;
	    }
	}

	if( res == 0.0f && res1 == 0.0f && res2 == 0.0f &&
	    res3 == 0.0f && res4 == 0.0f && res5 == 0.0f ) {
//	    wait_time3 = 10;
	    work_phase++; 
	}
	break;
    case 2:
//	if( wait_time3 ) break;
	cursor_sw = ON;
	fade_R = 0x00;
	fade_G = 0x00;
	fade_B = 0x00;
	fade_A = 0x00;
	for( i=0; i<8; i++ ) {
	    overX[i] = ovx2[i];
	    overY[i] = ovy2[i];
	}
	overTurnPtr = 0;
	overXad = ovadx[1];
	overYad = ovady[1];
	process_phase = 1;
	work_phase = 0;
	break;
    }

    back_star_pos_calc( EyeX, EyeY, EyeZ, WayX, WayY, WayZ );

    Time++;
}

/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
#endif








