/************************************************************************
 *									*
 *	NU64 スターフォックス	タイトル処理 & デモ処理		        *
 *									*
 ************************************************************************/
#include "fox_all.h"
#include "fox_demo_poly.h"
#include "fox_gf_poly.h"
#include "fox_main.h"
#include "fox_std_dma.h"
#include "fox_fade.h"
#include "../audio/audio_game.h"
#include "fox_eeprom.h"


//#define TITL_DEBUG
//#define SPECIAL


#define Wait	(10)
#define IN	(0)
#define OUT	(1)
#define End	(0xff)

#define LIGHT_VEC		(100.0f)

#define MAX_NOSTICK_TIME	(2)

#define DEMO_TITL		(0)
#define DEMO_CUT1		(1)
#define DEMO_CUT2		(2)
#define DEMO_CUT3		(3)
#define DEMO_CUT4		(4)
#define DEMO_CUT5		(5)
#ifdef TITL_DEBUG
#define DEMO_TEST		(6)
#endif
#define DEMO_RANKING		(7)


static ANIM fox_t[4] = {
	{ &DEMO_Fox_run_anm,   &DEMO_Fox_title_anm,   DEMO_Fox_run_list },
	{ &DEMO_Falco_run_anm, &DEMO_Falco_title_anm, DEMO_Falco_run_list },
	{ &DEMO_Peppey_run_anm,&DEMO_Peppey_title_anm,DEMO_Peppey_run_list },
	{ &DEMO_Slippy_run_anm,&DEMO_Slippy_title_anm,DEMO_Slippy_run_list },
};

static unsigned short *message_ad_data[]= {
    msg_00010,
    msg_00020,
    msg_00030,
    msg_00040,
    msg_00050,
};

/* DEMO_data.c */
extern cam_t Gfox_Cam_data[];
//extern cam_t FoxRunCamData[];
extern cam_t AwinGo1CamData[];
//extern cam_t AwinGo2CamData[];

extern 	void great_fox_display(void);

/*  */
int title_return;
int wip_stat;
int wip_time;

int rank_dispP;

extern int VsReturn;

extern void star_initial_set( void );
void A_Display(A_WING_STAT *);  /* アーウイン描画 */
void title_demo_main( void );

extern int keta_ck( int );
extern void moji_number( int, int, int );

int get_rank_data( void );
void easy_ranking_display( void );

static int Play1ControllerCheck( void );

static void title_rogo_display( void );
static void rogo_SF_display( void );
static void rogo_64_display( void );
static void rogo_TM_display( void );
static void rogo_ST_display( void );
static void rogo_NI_display( void );
static void foxteam_name_display( void );
static void oping_rogo_display( void );

static void oping_fler_display( void );
static void oping_sun_display( void );
static void oping_sunshine_display( void );


static void foxteam_run_display( int );
static void foxteam_display( int );
static void turo_display( void );
static void gfox_display( void );
//static void gfoxFire_display( int );
//static void gfoxLightSign_display( int );
static void awins_display( int );
static void awinFire_display( int );
static void awinFire2_display( int );
static void awinKage_display( int );
static void CN_display( float );
static void gfoxBase_display( void );
static void gfoxKabe_display( void );
static void gfoxKatapalt_display( int );
static void bakuhatu_display( void );
static int parts_check( int, Gfx **, xyz_t *, xyz_t *, void * );

static void demo_title_init( void );
static void GrFox_Move_init( void );
static void Fox_Running_init( void );
static void GrFox_Zoom_init( void );
static void Awin_Go1_init( void );
static void Awin_Go2_init( void );

static void demo_title( void );
static void GrFox_Move( void );
static void Fox_Running( void );
static void GrFox_Zoom( void );
static void Awin_Go1( void );
static void Awin_Go2( void );

static void demo_title_display( void );
static void GrFox_Move_display( void );
static void Fox_Running_display( void );
static void GrFox_Zoom_display( void );
static void Awin_Go1_display( void );
static void Awin_Go2_display( void );

static void title_ranking( void );
static void title_easy_ranking_display( void );

static void demo_fade( void );

static void name2_display( void );

//static void Awin_GotoCN_init( void );
//static void Awin_GotoCN( void );
//static void Awin_GotoCN_display( void );

//static void move_Awin( AW_T *, xyz_t *, int );

static void revo_pos_calc( int,
			   float *, float *, float *,
			   float *, float *, float *,
			   float, float, float );

#if 0
static void revo_pos_calc2( float, float, float,
			    float *, float *, float *, float,
			    float *, float *, float *, float,
			    float,  float );
#endif

static void revo_pos_calc3( float, float, float,
			    float *, float *, float *, float,
			    float *, float *, float *, float,
			    float,  float );

static void revo_ligpos_calc( float, float, float,
			      float *, float *, float * );

static void get_cam_ang( float *, float * );
static void get_cam_vec( float, float );
static void push2_now( void );

static void GoOption( void );
static void GoTitle( void );
static void GoNext( void );
static void KeyIn_Title( void );

static void message_ad_set2( u16 **, int );

//static void waku_NOdisplay( void );


#ifdef TITL_DEBUG
/* カメラ テスト用 */
static void CameraTestInit( void );
static void CameraTest( void );
static void CameraTestDisplay( void );
static void CameraStatusDisplay( void );
static void PutCamPos( void );
static void MoveCamPos( void );
static void PlayCamera( void );
#endif
static void get_splin_pos3( xyz_t *, cam_t *, float, int );
static void PlayData( cam_t *, int, float );
#if 0
static void get_splin_pos( xyz_t *, xyz_t *, float );
static void get_splin_pos2( xyz_t *, cam_t *, float );
#endif


static float vecX,vecY,vecZ;
static int wait_time;
static int wait_time1;
//static int Stick_time;
static int KeyWait_time;
static int time0;
static int SoundTime;

static int NextTime;

static int demo_cut_phase;
static int demo_phase;

static float scroll_sp;
static float cam_sp;
static float cam_sp1;
static float cam_sp2;
static float cam_sp3;
static float cam_sp5;


static float lightX,lightY,lightZ;

static float fligR,fligG,fligB;
static int ft_ligR,ft_ligG,ft_ligB;
static float ft_kanR,ft_kanG,ft_kanB;
static int aw_ligR,aw_ligG,aw_ligB;
static int aw_kanR,aw_kanG,aw_kanB;
static float tu_kanR,tu_kanG,tu_kanB;

static int col_p,lig_sw;
static float ls_scl;

static int run_p;
static int name_sw;
static int gf_disp;
static FOXTM foxt[4];
static float FoxTmZoff;
static float foxtm_scl;
static float FoxSndPos[3];
static AW_T awt[4];
static GF_T gfox;
static CN_T cn;

static int fade_sw;
static int draw_sw;
static int NoStick_time;

static float CamXa,CamYa;
static float CamZrg;
static float CamZrg1,CamZrg2;
static float CentX,CentY,CentZ;

static float LigXa,LigYa;
static float LigXa2,LigYa2;
static float LigXa3,LigYa3;

static xyz_t dt2[4][50];
static int stick_sw;

static float kataZ;
static float hkoY,hkoZ;
static float kageY;

static float titleXp,titleYp;
static float title64Xp,title64Yp,title64Zp;
static float title64Xs,title64Ys;

static float NcXp,NcYp,NcXs,NcYs;
static float sunXp,sunYp,sunXs,sunYs;
static float flerXp,flerYp,flerXs,flerYs;
static float ChgColor,SelColor;
static int sunA;
static int op_rogo_flg;
static int op_fler_flg;
static float Op1RogoA,Op2RogoA;

static int KabeDraw_f;
static float ad_starX;

static int CutTime;

static int name2_stat;

static float BakuZr[10],
             BakuZa[10],
             BakuScl[10],
             BakuScl2[10];
static int BakuCnt,
    	   BakuMaxSw[10],
    	   BakuA1[10],
    	   BakuA2[10],
    	   BakuWait[10];

static float RyushiXp[40],
	     RyushiYp[40],
             RyushiZp[40],
             RyushiSpd[40],
             RyushiScl[40],
             RyushiScl2[40];
static int RyushiCnt,
           RyushiMaxSw[40];


/** ランキングデータ **/
int rank_nakama_total[10][3];
int rank_totalhit[10];
unsigned char rank_name[10][4];

/* メッセージ表示関係 */
extern u16 **msg_TBL_ad;
extern int msg_ptr;
extern int mojiXp,mojiYp;
extern float wakuXp,wakuYp,wakuXs;
extern float faceXp,faceYp;

extern u16 before_mode;

#ifdef TITL_DEBUG
/* TEST用 */
static void KeyIn_Cam2( void );
static void KeyIn_Lig2( void );
static void KeyIn_Lig3( void );
static void KeyIn_Lig4( void );
static void KeyIn_Fler( void );
static void KeyIn_color( void );
static void KeyIn_FoxTeam( void );
static void KeyIn_FoxZp( void );
static void debug_display( void );
static void debug2_display( void );

static int disp_sw = OFF;
static int TitleManDisp;
static int TitleAwinDisp;
static int TitleMojiDisp;
static int locY;
static int key_sw;
static int flush_sw;
static rgb_ft tu2_kan[5];
static int sel_sw;
static int partsNo;
static float partsXa;
static int mojiR,mojiG,mojiB,mojiA;
static int cam_sw = 1;
//static int fox_p;
#endif

float ataXA;
float ataYA;
float ataZA;

/*======================================================================*
 *									*
 *	タイトル イニシャル						*
 *									*
 *======================================================================*/
void title_init(void)
{
    min_retrace = 2;

    frcnt = 0;

    title_mode = TITLE_MAIN;

    before_mode = 0;
    VsReturn = 0;
    
    /* コントローラが接続されているか？ */
    cont_num = Play1ControllerCheck();

    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;
    fade_A = 0x00;

    fogR = 0x00; 	/* フォグ 設定 */
    fogG = 0x00;
    fogB = 0x00;

    BG_color = 0x00;	/* 背景色 */

    wip_time = 0;
    wait_time = 0;
    wait_time1 = 0;

    ls_scl = 0.0f;

    demo_cut_phase = 0;
    wip_stat = 0;

    SelColor = 255.0f;
    ChgColor = 255.0f;

    mem_stage_clear(); /*可変確保メモリークリアー*/

    star_initial_set();
    starXpos = 320.0f;
    starYpos = 240.0f;

    get_rank_data();

#ifdef TITL_DEBUG
    demo_phase = DEMO_TITL;
#else
    /* コントローラが接続されていない */
    if( cont_num == -1 || title_return ) {
	Na_ChangeSoundMode( NA_PLAY_1, NA_MODE_TITLE );
	demo_phase = DEMO_TITL;
	title_return = 0;
    } else {
	Na_ChangeSoundMode( NA_PLAY_1, NA_MODE_OPENIENG );
	demo_phase = DEMO_CUT1;
    }
#endif

    Key_wait_time = 30;


#ifdef TITL_DEBUG
    /** TEST **/
    key_sw = 0;
    locY = 0;

    TitleManDisp = ON;
    TitleAwinDisp = ON;
    TitleMojiDisp = ON;
#endif
}

/*======================================================================*
 *									*
 *	タイトル							*
 *									*
 *======================================================================*/
void title( void )
{
    switch( title_mode ) {
    case TITLE_WAIT:
	if(!system_time) {
	    display_mode = DISPLAY_NOTH;
	    title_mode = TITLE_INIT;
	}
	break;
    case TITLE_INIT:
	display_mode = DISPLAY_NOTH;
	title_init();
	break;
    case TITLE_MAIN:
	display_mode = DISPLAY_TITLE;
	title_demo_main();
	break;
    default:
	break;
    }

#ifdef TITL_DEBUG
    if ( Key_T[0].button & CONT_G || Key_T[1].button & CONT_G ) {
	Back_star_f = OFF;
	display_mode = DISPLAY_NOTH;
	demo_phase ++;
	if( demo_phase > DEMO_RANKING ) {
	    demo_phase = DEMO_TITL;
	}
	demo_cut_phase = 0;
	Na_StopMesVoice();
	Na_StopAllFlagSe( NA_SE_DEMO_SIREN );
	Na_StopSe( FoxSndPos, NA_SE_DENO_RUNNING );

    }
#endif

    frcnt++;
}


/*======================================================================*
 *									*
 *	タイトルデモ メイン 						*
 *									*
 *======================================================================*/
void title_demo_main( void )
{
    if( wait_time > 0 ) wait_time--;
    if( wait_time1 > 0 ) wait_time1--;

    switch( demo_phase ) {
    /* 簡易ランキング画面 */
    case DEMO_RANKING:
	title_ranking();
	break;
    /* タイトル */
    case DEMO_TITL:
	demo_title();
	KeyIn_Title();
#ifdef TITL_DEBUG
	if( Key_T[0].button & CONT_E ) {
	    TitleManDisp ^= 1;
	}	awt[0].time = 3;

	if( Key_T[0].button & CONT_C ) {
	    TitleAwinDisp ^= 1;
	}
	if( Key_T[0].button & CONT_D ) {
	    TitleMojiDisp ^= 1;
	}
//	KeyIn_Lig3();
	KeyIn_FoxTeam();
//	KeyIn_color();
#endif
	break;
    /* カット１ */
    case DEMO_CUT1:
	GrFox_Move();
#ifdef TITL_DEBUG
//	KeyIn_Lig2();
//	KeyIn_Fler();
#endif
	break;
    /* カット２ */
    case DEMO_CUT2:
	Fox_Running();
#ifdef TITL_DEBUG
//	KeyIn_FoxTeam();
//	KeyIn_FoxZp();
//	KeyIn_Lig4();
#endif
	break;
    /* カット３ */
    case DEMO_CUT3:
	GrFox_Zoom();
#ifdef TITL_DEBUG
//	KeyIn_Lig2();
//	KeyIn_Cam2();
#endif
	break;
    /* カット４ */
    case DEMO_CUT4:
	Awin_Go1();
#ifdef TITL_DEBUG
//	KeyIn_Lig2();
//	KeyIn_Cam2();
//	KeyIn7();
#endif
	break;
    /* カット５ */
    case DEMO_CUT5:
	Awin_Go2();
#ifdef TITL_DEBUG
//	KeyIn_Lig2();
#endif
	break;
#ifdef TITL_DEBUG
    /* カメラ テスト用 */
    case DEMO_TEST:
	CameraTest();
	break;
#endif
    default:
	break;
    }

    GoNext();
}

/*======================================================================*
 *									*
 *	タイトルデモ総合表示						*
 *									*
 *======================================================================*/
void title_display( void )
{
    switch( demo_phase ) {
    /* 簡易ランキング画面 */
    case DEMO_RANKING:
	title_easy_ranking_display();
	break;
    /* タイトル */
    case DEMO_TITL:
	push2_now();
	demo_title_display();
	pull_now();

#ifdef TITL_DEBUG
	if( TitleMojiDisp ) {
#endif
	    title_rogo_display();
	    rogo_SF_display();
	    rogo_TM_display();
	    rogo_NI_display();
	    rogo_ST_display();
	    push2_now();
	    rogo_64_display();
	    pull_now();
#ifdef TITL_DEBUG
	}
#endif
	break;
    /* カット１ */
    case DEMO_CUT1:
	if( gf_disp ) {
	    push2_now();
	    GrFox_Move_display();
	    pull_now();
	    /* メッセージエリアまわりの描画 */
	    face_display();
	    name2_display();
	}

	oping_fler_display();
	oping_rogo_display();
	break;
    /* カット２ */
    case DEMO_CUT2:
	push2_now();
	Fox_Running_display();
	pull_now();
	if( name_sw ) foxteam_name_display();
	break;
    /* カット３ */
     case DEMO_CUT3:
	push2_now();
	GrFox_Zoom_display();
	pull_now();
	break;
    /* カット４ */
    case DEMO_CUT4:
	push2_now();
	Awin_Go1_display();
	pull_now();
	name2_display();
	break;
    /* カット５ */
    case DEMO_CUT5:
	push2_now();
	Awin_Go2_display();
	pull_now();
	break;
#ifdef TITL_DEBUG
    /* カメラ テスト用 */
    case DEMO_TEST:
	push2_now();
	CameraTestDisplay();
	pull_now();
	CameraStatusDisplay();
	break;
#endif
    default:
	break;
    }

    if( wip_time ) {
	/** ワイプ中,フェードを無効にする **/
	fade_A = 0x00;
	fade_R = 0x00;
	fade_G = 0x00;
	fade_B = 0x00;
//	push2_now();
	fade_out( FADE_TATE, wip_time );
//	pull_now();
    }

#ifdef TITL_DEBUG
    /** TEST **/
    if( disp_sw ) {
	debug_display();
//	debug2_display();
    }

    if(Key_T[3].button & CONT_A) {
	time_flag = 1 - time_flag;
    }
    time_display();
#endif
}

/************************************************************************/
/* コントローラ接続チェック						*/
/************************************************************************/
static int Play1ControllerCheck( void )
{
    register int i;
    int res;

    res = -1;

    for( i=0; i<4; i++ ) {
	if( Key_switch[i] == ON ) {
	    res = i;
	    break;
	}
    }

    return( res );
}

/************************************************************************/
/* スコアランキング							*/
/************************************************************************/
static void title_ranking( void )
{
    switch( demo_cut_phase ) {
    case 0:
	rank_dispP = 0;
	Back_star_f = 800;
	NextTime = 450;
	demo_cut_phase++;
	wait_time = 20;
	break;
    case 1:
	if( NextTime ) {
	    back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );
	    starXad -= 1.0f;
	    if( NextTime == 60 ) Na_StopBgm( 60 );
	} else {
	    Back_star_f = OFF;
	    face_stat = 0;
	    demo_cut_phase = 0;
	    display_mode = DISPLAY_NOTH;
#ifdef TITL_DEBUG
	    demo_phase = DEMO_TITL;
	    Key_wait_time = 3;
#else
	    Na_ChangeSoundMode( NA_PLAY_1, NA_MODE_OPENIENG );
	    demo_phase = DEMO_CUT1;
#endif
	}
	if( rank_dispP == 10 )
	    NextTime--;
	break;
    }

    if( !wait_time && ((frcnt & 0x07) == 0x07) &&
	(rank_dispP<10) )
	rank_dispP++;
}

/************************************************************************/
/* 簡易ランキング画面の描画						*/
/************************************************************************/
static void title_easy_ranking_display( void )
{
    static char title[]="S T A R F O X     R A N K I N G";
    int x,y;

    /** 見出し **/
    x = 36;
    y = 20;
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
    small_moji_puts( x,y, 1.0f, 1.0f, title );

    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
    texture_rectangleIA8(&NOW_DISP, MOJI_06_txt,
			 16, 8,
			 (float)148, (float)y, 1.0f, 1.0f);
    texture_rectangleIA8(&NOW_DISP, MOJI_04_txt,
			 16, 8,
			 (float)(148+16), (float)y, 1.0f, 1.0f);
    
    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0,  255, 255, 255, 255 );
    texture_rectangleIA8( &NOW_DISP, MOJI_kan_txt+(48*6),
			  16, 2, 36, 32, 15.2f, 1.0f );

    easy_ranking_display();
}

/************************************************************************/
/* 簡易ランキング画面の描画						*/
/************************************************************************/
void easy_ranking_display( void )
{
    register int i;
    int y;

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
    small_moji_puts( 94,38, 1.0f, 1.0f, "RANK" );
    small_moji_puts( 94+32+20,38, 1.0f, 1.0f, "NAME" );
    small_moji_puts( 94+32+20+32+22,38, 1.0f, 1.0f, "HIT" );
    
    y = 38+17;
    for( i=0; i<rank_dispP; i++ ) {
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
	moji_number( 105-((keta_ck(i+1)-1)*8), y, i+1 );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 0, 255 );
	small_moji_puts( 105+8+37,y, 1.0f, 1.0f, &(rank_name[i][0]) );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 255, 255, 255 );
	moji_number( 105+8+37+24+29+8-((keta_ck(rank_totalhit[i])-1)*8),
		     y, rank_totalhit[i] );
	y += 17;
    }

    
   
#if 0
    if( Key[3].button & CONT_UP ) {
	ry -= 1.0f;
    }
    if( Key[3].button & CONT_DOWN ) {
	ry += 1.0f;
    }
    if( Key[3].button & CONT_LEFT ) {
	rx -= 1.0f;
    }
    if( Key[3].button & CONT_RIGHT ) {
	rx += 1.0f;
    }

    PRINTF( "x:%d y:%d\n",rx,ry );
#endif
}

/************************************************************************/
/* ランキングデータの取得						*/
/************************************************************************/
int get_rank_data( void )
{
    register int i,j;
    int top,work,root_p;

    /** トータルエリアの初期化 **/
    for( i=0; i<10; i++ ) {
	rank_totalhit[i] = 0;
	for( j=0; j<3; j++ ) {
	    rank_nakama_total[i][j] = 0;
	}
    }

    for( i=0; i<10; i++ ) {
	rank_name[i][0] =
	    fox_save.rom[0].data.rank_name[i][0] & 0xff;
	rank_name[i][1] =
	    fox_save.rom[0].data.rank_name[i][1] & 0xff;
	rank_name[i][2] =
	    fox_save.rom[0].data.rank_name[i][2] & 0xff;
	rank_name[i][3] = '\0';

	root_p = fox_save.rom[0].data.rank_rootptr[i];
	
	/** 各順位のトータルヒット数の計算 **/
	for( j=0; j<root_p; j++ ) {
	    work = fox_save.rom[0].data.rank_stage[i][j].hitcnt;
	    work |=
		(fox_save.rom[0].data.rank_stage[i][j].hitcnt_h & 0x01 ) << 8;
	    rank_totalhit[i] += work;

	    /** 各ステージ仲間の有無の合計の計算 **/
	    rank_nakama_total[i][0] +=
		(fox_save.rom[0].data.rank_stage[i][j].live_peppy & 0x01);
	    rank_nakama_total[i][1] +=
		(fox_save.rom[0].data.rank_stage[i][j].live_slippy & 0x01);
	    rank_nakama_total[i][2] +=
		(fox_save.rom[0].data.rank_stage[i][j].live_falco & 0x01);
	}
    }

    /** ハイスコアを調べる **/
    top = rank_totalhit[0];
    for( i=1; i<10; i++ ) {
	if( top < rank_totalhit[i] ) top = rank_totalhit[i];
    }
    
    return( top );
}

/*----------------------------------------------------------------------*/
/*									*/
/* タイトル画面								*/
/*									*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* タイトル Init							*/
/************************************************************************/
static void demo_title_init( void )
{
    register int i;
    int anm_f;
    int TitlePosSw;

//    Na_ChangeSoundMode( NA_PLAY_1, NA_MODE_TITLE );

    /** エクストラモードですべての勲章をとるとフォックス達の位置を変える **/
    TitlePosSw = ON;
    for( i=0; i<16; i++ ) {
	if( i == 14 ) continue;
	if( !(fox_save.rom[0].data.pl_stat[i].extra_medal & 0x01) ) {
	    TitlePosSw = OFF;
	    break;
	}
    }
    
    /* タイトル表示時間のセット */
    NextTime = 900;
    
    face_stat = 0;

    fade_sw = End;
    fade_A = 0x00;
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;

    Back_star_f = 800;

    stick_sw = OFF;

    /* FOX Light */
    LigXa = 0.0f;
    LigYa = -180.0f;
    ft_ligR = 124;
    ft_ligG = 108;
    ft_ligB = 75;
    ft_kanR = 0.0f;
    ft_kanG = 0.0f;
    ft_kanB = 0.0f;

    /* AWING Light */
    LigXa2 = -70.0f;
    LigYa2 = 22.0f;
    aw_ligR = 30;
    aw_ligG = 29;
    aw_ligB = 40;
    aw_kanR = 6;
    aw_kanG = 1;
    aw_kanB = 11;

    /* Rogo */
    /* "ＳＴＡＲＦＯＸ" */
    titleXp = 26.0f;
    titleYp = 37.0f;

    /* "６４" */
    title64Xs = 1.5f;
    title64Ys = 3.0f;
//    title64Xp = 105.0f;
    title64Xp = 108.0f;
    title64Yp = 242.0f;
    title64Zp = 100.0f;

    fade_A = 0x00;
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;

    /* カメラ */
    CamXa = 0.0f;
    CamYa = 0.0f;
    CamZrg = 430.0f;

    wayX = 0.0f;
    wayY = 180.0f;
    wayZ = 0.0f;

    vecX = 0.0f;
    vecY = 1.0f;
    vecZ = 0.0f;

    foxtm_scl = 0.5f;

    awt[0].pos.x = -80.0f;
    awt[0].pos.y = 220.0f;
    awt[0].pos.z = -360.0f;
    awt[0].scale = 4.0f;
    awt[0].Xang = 35.0f;
    awt[0].Yang = -90.0f;
    awt[0].Zang = -15.0f;
    awt[0].cang = 0.0f;
    awt[0].twinbmY = 0.0f;
    awt[0].kaoXa = 0.0f;
    awt[0].kaoYa = 0.0f;
    awt[0].kao = 1;
    awt[0].bfire_f = OFF;
    awt[0].bfire2_f = OFF;
    awt[0].kage_f = OFF;

#if 0
Slippey: xp:58.000000 yp:-5.000000 zp:22.000000
 xa:-17.899979 ya:-8.890011 za:0.000000
fox    : xp:-299.000000 yp:-32.000000 zp:90.000000
 xa:-9.660022 ya:60.330208 za:0.000000
falco  : xp:-42.000000 yp:-7.000000
 zp:-12.000000 xa:-2.009996 ya:56.909969 za:0.000000
Peppey : xp:90.000000 yp:1.000000 zp:-143.000000
 xa:-0.500016 ya:-33.319988 za:0.000000
#endif

    /* Fox */
    if( TitlePosSw ) {
	foxt[0].Pos.x = -299.000000f;
	foxt[0].Pos.y = -32.000000f;
	foxt[0].Pos.z = 90.000000f;
	foxt[0].MyXa = -9.660022f;
	foxt[0].MyYa = 60.330208f;
	foxt[0].MyZa = 0.000000f;
    } else {
	foxt[0].Pos.x = 33.000000f;
	foxt[0].Pos.y = 23.000000f;
	foxt[0].Pos.z = 4.000000f;
	foxt[0].MyXa = -7.800007f;
	foxt[0].MyYa = 0.589999f;
	foxt[0].MyZa = 0.000000f;
    }
    foxt[0].Xa = 0.0f;
    foxt[0].Ya = 0.0f;
    foxt[0].kaoXa = 0.0f;
    foxt[0].kaoYa = 0.0f;
    foxt[0].kaoYpos = 150.0f;
    foxt[0].agoZa = 0.0f;
    foxt[0].ZaStp = 1.0f;
    foxt[0].ashiYa = 0.0f;
    foxt[0].ashiYaStp = 0.0f;
    foxt[0].ago_sw = OFF;
    foxt[0].koshiXa = 0.0f;
    foxt[0].koshiYa = 0.0f;
    foxt[0].ksXa = 0.0f;
    foxt[0].ksYa = 0.0f;
    foxt[0].anmcnt = 0;
    foxt[0].addcnt = 0;

    /* Falco */
    if( TitlePosSw ) {
	foxt[1].Pos.x = -42.000000f;
	foxt[1].Pos.y = -7.000000f;
	foxt[1].Pos.z = -12.000000f;
	foxt[1].MyXa = -2.009996f;
	foxt[1].MyYa = 56.909969f;
	foxt[1].MyZa = 0.000000f;
    } else {
	foxt[1].Pos.x = 147.000000f;
	foxt[1].Pos.y = 18.000000f;
	foxt[1].Pos.z = -32.000000f;
	foxt[1].MyXa = -6.009995f;
	foxt[1].MyYa = 22.620012f;
	foxt[1].MyZa = 0.000000f;
    }
    foxt[1].Xa = 0.0f;
    foxt[1].Ya = 0.0f;
    foxt[1].kaoXa = 0.0f;
    foxt[1].kaoYa = 0.0f;
    foxt[1].kaoYpos = 180.0f;
    foxt[1].agoZa = 0.0f;
    foxt[1].ZaStp = 1.0f;
    foxt[1].ashiYa = 0.0f;
    foxt[1].ashiYaStp = -4.0f;
    foxt[1].ago_sw = OFF;
    foxt[1].koshiXa = 0.0f;
    foxt[1].koshiYa = 0.0f;
    foxt[1].ksXa = 0.0f;
    foxt[1].ksYa = 0.0f;
    foxt[1].anmcnt = 0;
    foxt[1].addcnt = 0;

    /* Peppey */
    if( TitlePosSw ) {
	foxt[2].Pos.x = 90.000000f;
	foxt[2].Pos.y = 1.000000f;
	foxt[2].Pos.z = -143.000000f;
	foxt[2].MyXa = -0.500016f;
	foxt[2].MyYa = -33.319988f;
	foxt[2].MyZa = 0.000000f;
    } else {
	foxt[2].Pos.x = -143.000000f;
	foxt[2].Pos.y = 22.000000f;
	foxt[2].Pos.z = -57.000000f;
	foxt[2].MyXa = -5.950006f;
	foxt[2].MyYa = -7.689997f;
	foxt[2].MyZa = 0.000000f;
    }
    foxt[2].Xa = 0.0f;
    foxt[2].Ya = 0.0f;
    foxt[2].kaoXa = 0.0f;
    foxt[2].kaoYa = 0.0f;
    foxt[2].kaoYpos = 130.0f;
    foxt[2].agoZa = 0.0f;
    foxt[2].ZaStp = 1.0f;
    foxt[2].ashiYa = 0.0f;
    foxt[2].ashiYaStp = 0.0f;
    foxt[2].ago_sw = OFF;
    foxt[2].koshiXa = 0.0f;
    foxt[2].koshiYa = 0.0f;
    foxt[2].ksXa = 0.0f;
    foxt[2].ksYa = 0.0f;
    foxt[2].anmcnt = 0;
    foxt[2].addcnt = 0;

    /* Slippey */

    if( TitlePosSw ) {
	foxt[3].Pos.x = 58.000000f;
	foxt[3].Pos.y = -5.000000f;
	foxt[3].Pos.z = 22.000000f;
	foxt[3].MyXa = -17.899979;
	foxt[3].MyYa = -8.890011f;
	foxt[3].MyZa = 0.000000f;
    } else {
	foxt[3].Pos.x = -50.000000f;
	foxt[3].Pos.y = 25.000000f;
	foxt[3].Pos.z = 15.000000f;
	foxt[3].MyXa = -15.870002f;
	foxt[3].MyYa = -17.549995f;
	foxt[3].MyZa = 0.000000f;
    }
    foxt[3].Xa = 0.0f;
    foxt[3].Ya = 0.0f;
    foxt[3].kaoXa = 0.0f;
    foxt[3].kaoYa = 0.0f;
    foxt[3].kaoYpos = 140.0f;
    foxt[3].agoZa = 0.0f;
    foxt[3].ZaStp = 1.0f;
    foxt[3].ashiYa = 0.0f;
    foxt[3].ashiYaStp = 0.0f;
    foxt[3].ago_sw = OFF;
    foxt[3].koshiXa = 0.0f;
    foxt[3].koshiYa = 0.0f;
    foxt[3].ksXa = 0.0f;
    foxt[3].ksYa = 0.0f;
    foxt[3].anmcnt = 254;
    foxt[3].addcnt = 0;

    for( i=0; i<4; i++ ) {
	anm_f = foxt[i].anmcnt % anime_frame(fox_t[i].no_anim);
	si_get( fox_t[i].no_anim, anm_f, dt2[i] );
    }

    NoStick_time = 0;
    KeyWait_time = 100;

    Na_StartBgm( NA_BGM_TITLE );

#ifdef TITL_DEBUG
    /* TEST */
    partsNo = 0;
    partsXa = 0.0f;
    mojiR = 255;
    mojiG = 30;
    mojiB = 0;
    mojiA = 0xff;
#endif
}

/************************************************************************/
/* タイトル								*/
/************************************************************************/
static void demo_title( void )
{
    register int i;
    float work;
    static float agoMax[]={ 10.0f, 20.0f, 20.0f, 20.0f };
    static float agoSp[]={ 2.0f, 5.0f, 4.0f, 4.0f };

    switch( demo_cut_phase ) {
    case 0:
	demo_title_init();
	cam_sp = 0.04f;
//	cam_sp1 = 0.08f;
	cam_sp1 = 0.1f;
	run_p = 0;
	demo_cut_phase++;
	break;
    case 1:
	add_calc( &LigXa, -10.0f, cam_sp, 100.0f, 0.0001f );
	add_calc( &LigYa,  57.0f, cam_sp, 100.0f, 0.0001f );

	add_calc( &ft_kanR, 13.0f, cam_sp, 100.0f, 0.0001f );
	add_calc( &ft_kanG,  2.0f, cam_sp, 100.0f, 0.0001f );
	add_calc( &ft_kanB, 15.0f, cam_sp, 100.0f, 0.0001f );
	cam_sp *= 1.04f;

	if( LigYa == 57.0f ) {
	    demo_cut_phase++;
	}
	break;
    case 2:
	if( KeyWait_time ) break;
	demo_cut_phase++;
	break;

    case 3:
	wait_time = 10 * (int)((rnd() * 5.0f)+1);
	work = run_p;
	foxt[run_p].addcnt = 0;
	foxt[run_p].agoZa  = 0.0f;
	if( run_p == 2 ) foxt[run_p].anmcnt = 0;
	while( run_p == work ) run_p = (int)(rnd() * 4.0f);
	foxt[run_p].addcnt = 5 + (int)(rnd() * 6.0f);
	foxt[run_p].ago_sw = ON;
	cam_sp = 0.07f;
	demo_cut_phase++;
	break;
    case 4:
	if( wait_time ) break;
	foxt[run_p].ago_sw = OFF;
	add_calc( &foxt[run_p].agoZa, 0.0f, cam_sp, 100.0f, 0.001f );
	cam_sp *= 1.07f;

	if( foxt[run_p].agoZa == 0.0f ) {
	    demo_cut_phase = 3;
	}
	break;
    }

    /* 口パク */
    if( foxt[run_p].ago_sw ) {
	if( foxt[run_p].agoZa+foxt[run_p].ZaStp < 0.0f )
	    foxt[run_p].ZaStp = agoSp[run_p];
	if( foxt[run_p].agoZa+foxt[run_p].ZaStp > agoMax[run_p] )
	    foxt[run_p].ZaStp = -agoSp[run_p];

 	foxt[run_p].agoZa += foxt[run_p].ZaStp;
    }

    /* ファルコの足 */
    if( KeyWait_time == 0 ) {
	if( frcnt & 0x80 ) {
	    if( foxt[1].ashiYa+foxt[1].ashiYaStp < -20.0f )
		foxt[1].ashiYaStp = 4.0f;
	    if( foxt[1].ashiYa+foxt[1].ashiYaStp > 0.0f )
		foxt[1].ashiYaStp = -4.0f;
	    foxt[1].ashiYa += foxt[1].ashiYaStp;
	} else {
	    add_calc( &foxt[1].ashiYa, 0.0f, 0.3f, 100.0f, 0.1f );
	}
    }


    /* MAX_NOSTICK_TIMEになると元の状態に戻す */
    if( NoStick_time > MAX_NOSTICK_TIME && stick_sw ) {
	add_calc( &LigXa, -10.0f, cam_sp1, 100.0f, 0.0001f );
	add_calc( &LigYa,  57.0f, cam_sp1, 100.0f, 0.0001f );

	add_calc( &title64Xp, 108.0f, cam_sp1, 100.0f, 0.0001f );
	add_calc( &title64Yp, 242.0f, cam_sp1, 100.0f, 0.0001f );

	for( i=0; i<4; i++ ) {
	    add_calc( &foxt[i].kaoXa, 0.0f, cam_sp1, 100.0f, 0.01f );
	    add_calc( &foxt[i].kaoYa, 0.0f, cam_sp1, 100.0f, 0.01f );
	    add_calc( &foxt[i].Xa, 0.0f, cam_sp1, 100.0f, 0.01f );
	    add_calc( &foxt[i].Ya, 0.0f, cam_sp1, 100.0f, 0.01f );
	    add_calc( &foxt[i].koshiXa, 0.0f, cam_sp1, 100.0f, 0.01f );
	    add_calc( &foxt[i].koshiYa, 0.0f, cam_sp1, 100.0f, 0.01f );
	    add_calc( &foxt[i].ksXa, 0.0f, cam_sp1, 100.0f, 0.01f );
	    add_calc( &foxt[i].ksYa, 0.0f, cam_sp1, 100.0f, 0.01f );
	}
//	cam_sp1 *= 1.08f;
	cam_sp1 *= 1.1f;

	if( title64Xp == 108.0f && title64Yp == 242.0f ) {
	    stick_sw = OFF;
	    cam_sp1 = 0.08f;
	    NoStick_time = 0;
	}

	/* Stick動いたか？ */
	if( Key_T[cont_num].stick_x != 0 || Key_T[cont_num].stick_y != 0 ) {
	    cam_sp1 = 0.08f;
	}
    }

    /* アーウィン回転 */
    awt[0].Xang += 0.6f;

    revo_pos_calc( 1, &eyeX, &eyeY, &eyeZ,
		   &wayX, &wayY, &wayZ, CamXa, CamYa, CamZrg );

    back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );
    starXad -= 0.5f;

    if( KeyWait_time > 0 ) KeyWait_time--;

    if( stick_sw == ON ) NextTime = 450;
    if( NextTime ) {
	NextTime--;
    } else {
	Back_star_f = OFF;
	demo_cut_phase = 0;
	display_mode = DISPLAY_NOTH;
	demo_phase = DEMO_RANKING;
    }
}

/************************************************************************/
/* タイトル 表示							*/
/************************************************************************/
static void demo_title_display( void )
{
    register int i;

    static int p[]={0,1,3,2};

#ifdef TITL_DEBUG
    if( TitleManDisp ) {
#endif
	ligR = ft_ligR;
	ligG = ft_ligG;
	ligB = ft_ligB;
	kanR = (int)ft_kanR;
	kanG = (int)ft_kanG;
	kanB = (int)ft_kanB;
	
	if(  NoStick_time < MAX_NOSTICK_TIME && stick_sw ) {
	    LigXa3 = fatan3( -title64Yp,
			     sqrtf((-title64Xp * -title64Xp)+
				   (-title64Zp * -title64Zp)) )*180.0f/F_PI;
	    LigYa3 = fatan3( title64Xp,title64Zp )*180.0f/F_PI;
	    
	    add_calc( &LigXa, LigXa3, 0.1f, 100.0f, 0.0001f );
	    add_calc( &LigYa, LigYa3, 0.1f, 100.0f, 0.0001f );
	}
	
	revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );
	
	for( i=0; i<4; i++ ) {
	    foxteam_display( p[i] );
	    foxt[p[i]].anmcnt += foxt[p[i]].addcnt;
	}

#ifdef TITL_DEBUG
    }
#endif

#ifdef TITL_DEBUG
    if( TitleAwinDisp ) {
#endif
	ligR = aw_ligR;
	ligG = aw_ligG;
	ligB = aw_ligB;
	
	kanR = aw_kanR;
	kanG = aw_kanG;
	kanB = aw_kanB;
	
	revo_ligpos_calc( LigXa2, LigYa2, LIGHT_VEC,
			  &lightX, &lightY, &lightZ );
	
	awins_display( 0 );
    }
#ifdef TITL_DEBUG
}
#endif


/*----------------------------------------------------------------------*/
/* 									*/
/*----------------------------------------------------------------------*/
static float t;
static float tsp;
static cam_t *DataAdd;


#ifdef TITL_DEBUG
static int EditPoint;
static int NowPoint;
static int PlayCnt;
static int mv_sw;

static int DataCnt = 9;
static int PointNum = 9;
#endif

static int PointNum;

#define GF_CAM_MV_DATA (12)
/************************************************************************/
/* コーネリアをめざすグレートフォックス号 Init				*/
/************************************************************************/
static void GrFox_Move_init( void )
{
    register int i;

//  Na_ChangeSoundMode( NA_PLAY_1, NA_MODE_OPENIENG );

    Back_star_f = 800;

    BakuCnt = 10;
    for( i=0; i<10; i++ ) {
	BakuZr[i] = 10.0f + (rnd()*10.0f);
	BakuZa[i] = -10.0f+(rnd() * -60.0f);
	BakuScl[i] = 0.0f;
	BakuScl2[i] = 0.1f+(rnd()*0.3f);
	BakuWait[i] = 5+(int)(rnd()*5.0f);
	BakuA1[i] = 0xff;
	BakuA2[i] = 0x80;
	BakuMaxSw[i] = OFF;
    }

    fade_sw = End;
    fade_A = 0xff;
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;

    NcXp = 110.0f;
    NcYp = 70.0f;
    NcXs = 1.0f;
    NcYs = 1.0f;

    Op1RogoA = 0.0f;
    Op2RogoA = 0.0f;
    op_rogo_flg = 0;
    op_fler_flg = 0;

    sunXp = 0.0f;
    sunYp = 60.0f;
    sunXs = 1.0f;
    sunYs = 1.0f;
    sunA = 0x00;

    flerXp = -900.0f;
    flerYp = 205.0f;
    flerXs = 10.0f;
    flerYs = 10.0f;
    
    LigXa = 0.0f;
    LigYa = 162.0f;

    ligR = 101;
    ligG = 106;
    ligB = 92;
    kanR = 3;
    kanG = 4;
    kanB = 10;

    cn.pos.x = -80.0f;
    cn.pos.y = 0.0f;
    cn.pos.z = 500.0f;
    cn.scale = 5.0f;
    cn.draw_sw = OFF;

    gf_disp = OFF;
    gfox.pos.x = 20.0f;
    gfox.pos.y = 0.0f;
    gfox.pos.z = 30.0f;
    gfox.Xang = 0.0f;
    gfox.Yang = 0.0f;
    gfox.Zang = 0.0f;
    gfox.scale = 0.1f;

    CentX = 0.0f;
    CentY = 0.0f;
    CentZ = 0.0f;

    CamXa = -10.0f;
    CamYa = 0.0f;
    CamZrg1 = 1500.0f;
    CamZrg2 = -100.0f;

    vecX = 0.0f;
    vecY = 1.0f;
    vecZ = 0.0f;

    revo_pos_calc3( CentX, CentY, CentZ,
		    &eyeX, &eyeY, &eyeZ, CamZrg1,
		    &wayX, &wayY, &wayZ, CamZrg2,
		    CamXa, CamYa );
    
    name2_stat = 0;

    Na_StartBgm( NA_BGM_OPENIENG );
}

/************************************************************************/
/* コーネリアをめざすグレートフォックス号				*/
/************************************************************************/
static void GrFox_Move( void )
{
    float res,res1;

    switch( demo_cut_phase ) {
    case 0:
	GrFox_Move_init();
//	DataAdd = (cam_t *)SEGMENT_TO_KSEG0( Gfox_Cam_data );
	DataAdd = Gfox_Cam_data;
	ad_starX = 1.0f;
#if 1
	cam_sp = 0.002f;
	demo_cut_phase = 100;
	SoundTime = 0;
#else
	fade_A = 0x00;
	gf_disp = ON;
	op_rogo_flg = 1;
	demo_cut_phase = 4;
#endif
	break;
    case 100:
	if( fade_A != 0 ) {
	    fade_A -= 0x05;
	} else {
	    wait_time = 70-51;
	    demo_cut_phase = 1;
	}
	break;
    case 1:
	if( wait_time ) break;
	/* "STARFOX" 表示 */
	res = add_calc( &Op1RogoA,  255.0f, cam_sp, 100.0f, 1.0f );
	cam_sp *= 1.08f;
	
	if( res == 0.0f ) {
	    wait_time = 50;
	    wait_time1 =  85;
	    cam_sp1 = 0.01f;
	    cam_sp = 0.002f;
	    demo_cut_phase++;
	}
	break;
    case 2:
	if( wait_time ) break;
	/* "STARFOX" 消す */
	add_calc( &Op1RogoA, 0.0f, cam_sp1, 100.0f, 0.1f );
	cam_sp1 *= 1.06f;

	if( wait_time1 ) break;
	/* "IN" 表示 */
	res = add_calc( &Op2RogoA,  255.0f, cam_sp, 100.0f, 1.0f );
	cam_sp *= 1.08f;

	if( res == 0.0f ) {
	    wait_time = 30;
	    cam_sp1 = 0.02f;
	    demo_cut_phase++;
	    op_fler_flg = 1;
	    fade_A = 0x00;
	}
	break;

    case 3:
	if( wait_time ) break;
	/* "IN" 消す */
	res = add_calc( &Op2RogoA, 0.0f, cam_sp1, 100.0f, 0.1f );
	cam_sp1 *= 1.07f;

	/* 太陽,太陽レンズフレアー表示 */
	if( flerXp < 1200.0f ) {
	    flerXp += 10.0f;
	    if( flerXp > 50.0f ) {
		/* Nキューブ 表示 */
		op_rogo_flg = 1;
		Op1RogoA += 1.8f;
	    }
	} else {
	    op_fler_flg = 0;
	    demo_cut_phase++;
	}
	break;

    case 4:
	/* Nキューブ 表示 */
	if( Op1RogoA < 255.0f ) {
	    Op1RogoA += 1.0f;
	} else {
	    Op1RogoA = 255.0f;
//	    gf_disp = ON;
	    wait_time = 70;
	    time0 = 0;
	    cam_sp2 = 0.02f;
	    cam_sp3 = 0.00005f;
	    cam_sp5 = 0.02f;

	    PointNum = 0;
	    t = 0.0f;
	    tsp = 0.011f;

	    eyeX = Gfox_Cam_data[0].ex;
	    eyeY = Gfox_Cam_data[0].ey;
	    eyeZ = Gfox_Cam_data[0].ez;
	    wayX = Gfox_Cam_data[0].wx;
	    wayY = Gfox_Cam_data[0].wy;
	    wayZ = Gfox_Cam_data[0].wz;

	    demo_cut_phase = 10;
	}
	break;

    case 10:
	if( time0 == 45 ) name2_stat = 1;
	if( time0 == 145 ) name2_stat = 0;

//	PRINTF( "tm:%d\n",time0 );

	if( SoundTime == 638 ) {
	    Na_StartSceneSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	    Na_StartSceneSe( gfox.SndPos, NA_SE_GREATFOX_BURNER );
	    message_ad_set( msg_00060,FACE_Nus );
	}
	if( SoundTime == 838 ) {
	    message_ad_set2( message_ad_data,FACE_Pepper );
	}
	
	if( wait_time == 1 ) gf_disp = ON;
	if( wait_time ) break;
        /* Nキューブ 拡大 */
	if( NcXs < 1.39f ) {
	    NcXs += 0.01f;
	    NcYs += 0.01f;
	    NcXp -= 0.5f;
	    NcYp -= 0.5f;
	}

        /* Nキューブ 消す */
	res1 = add_calc( &Op1RogoA, 0.0f, cam_sp5, 100.0f, 0.1f );
	cam_sp5 *= 1.06f;
	if( res1 == 0.0f ) {
	    op_rogo_flg = -1;
	}

	/* グレートフォックス号 近づいてくる */
	PlayData( DataAdd, GF_CAM_MV_DATA, tsp );

	get_cam_ang( &CamXa, &CamYa );
	get_cam_vec( CamXa, CamYa );

	if( SoundTime > 960 ) {
	    if( ad_starX > 0.0f ) {
		ad_starX -= 0.0022f;
		if( ad_starX < 0.0f ) ad_starX = 0.0f;
	    }
	}
//	PRINTF( "adX:%f\n",ad_starX );
	
	if( CamYa > -100.0f ) {
	    add_calc( &LigXa, 15.0f, cam_sp2, 100.0f, 0.0001f );
	    add_calc( &LigYa, -35.0f, cam_sp2, 100.0f, 0.0001f );
	    cam_sp2 -= 0.000005f;
	} else {
	    add_calc( &LigXa, -20.0f, cam_sp3, 100.0f, 0.0001f );
	    add_calc( &LigYa, -25.0f, cam_sp3, 100.0f, 0.0001f );
	    if( time0 > 550 ) {
		cam_sp3 += 0.0001f;
	    } else {
		cam_sp3 += 0.000001f;
	    }
	}

	if( time0 == 260 ) {
	    cn.draw_sw = ON;
	}

	if( time0 == 750 ) {
	    fade_A = 0x00;
	    fade_R = 0x00;
	    fade_G = 0x00;
	    fade_B = 0x00;
	    fade_sw = OUT;
	}

	if( fade_A == 0xff ) {
	    Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	    Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_BURNER );
	    demo_cut_phase = 0;
	    display_mode = DISPLAY_NOTH;
	    demo_phase = DEMO_CUT2;
	}

	time0++;
	break;
    }

    demo_fade();

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    if( ad_starX != 0.0f ) {
	back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );
    }
    starXad -= ad_starX;

    SoundTime++;
}

/************************************************************************/
/* コーネリアをめざすグレートフォックス号 表示				*/
/************************************************************************/
static void GrFox_Move_display( void )
{
    if( cn.draw_sw ) {
	CN_display( -700.0f );
    }
    gfox_display();
}




/*----------------------------------------------------------------------*/
/*									*/
/*									*/
/*----------------------------------------------------------------------*/
#define FOX_RUN_DATA (34)

static cam_t FoxRunCamData[50] = {
        { 70.680931f, 95.065613f, -146.525665f, 9.829767f, 121.233597f, -642.118591f },
        { 205.505997f, 142.933197f, -268.009094f, 168.623505f, 176.766708f, -765.497742f },
        { 247.742752f, 218.724487f, -519.022217f, 186.814316f, 211.568878f, -1015.244446f },
        { 154.737122f, 157.726944f, -740.871216f, 222.565720f, 143.068268f, -1236.032227f },
        { 135.525024f, 142.279572f, -793.674927f, 316.118744f, 98.180107f, -1257.831299f },
        { 138.900925f, 142.279572f, -860.379028f, 315.274780f, 98.180107f, -1326.155273f },
        { 136.897125f, 214.430283f, -731.922852f, 283.275726f, 80.142426f, -1190.769287f },
        { 120.869476f, 242.492081f, -629.052368f, 262.282623f, 73.126984f, -1077.736938f },
        { 50.869476f, 242.492081f, -553.052368f, 192.282623f, 73.126984f, -1001.736877f },
        { -16.481400f, 233.256531f, -604.460754f, 187.870346f, 75.435867f, -1032.634766f },
        { -13.395493f, 191.663208f, -629.116699f, 204.598877f, 85.834198f, -1066.470825f },
        { -41.594223f, 184.117279f, -669.044434f, 256.648560f, 100.220680f, -1061.488892f },
        { -87.657349f, 182.949371f, -639.516968f, 274.414337f, 89.262657f, -971.370728f },
        { -215.549805f, 103.668442f, -641.085144f, 160.137451f, 109.082886f, -970.978699f },
        { -185.007721f, 8.353668f, -560.105347f, 28.751930f, 144.161591f, -991.223694f },
        { -91.497696f, 107.965378f, -610.058594f, -332.125580f, 199.258652f, -1038.735352f },
        { -84.526764f, 188.954987f, -642.848450f, -400.118317f, 179.011246f, -1030.537842f },
        { -103.562698f, 179.478851f, -668.874390f, -420.359314f, 197.630295f, -1055.281372f },
        { -109.091797f, 185.478851f, -678.646057f, -440.227051f, 203.630295f, -1052.838501f },
        { -78.158020f, 293.891296f, -640.175659f, -433.168396f, 30.021736f, -1045.564819f },
        { 87.703918f, 358.649353f, -198.218079f, -424.185211f, 182.755508f, -1062.758911f },
        { 68.509338f, 201.025360f, -339.223450f, -376.334564f, 178.329956f, -1063.170166f },
        { 64.247314f, 160.063934f, -446.734497f, -383.976868f, 209.505463f, -1058.494751f },
        { 57.035431f, 138.231476f, -443.501404f, -281.833679f, 268.098022f, -1018.568726f },
        { 0.701339f, 230.276047f, -198.302734f, -0.120920f, 252.228271f, -877.947815f },
        { -313.990204f, 273.137421f, -157.315826f, -0.190525f, 139.841995f, -687.091370f },
        { -436.743774f, 352.976440f, -269.345978f, 53.693100f, 105.913971f, -809.097595f },
        { -501.511505f, 422.986847f, -410.465912f, 61.233551f, 96.697556f, -858.744080f },
        { -597.842896f, 475.272003f, -752.427185f, 76.447487f, 88.401176f, -816.172485f },
        { -536.058655f, 387.847412f, -1155.268188f, 68.516212f, 100.709343f, -774.557007f },
        { -406.259613f, 192.840347f, -1361.467041f, 49.143227f, 129.814880f, -743.781006f },
        { -387.742310f, 192.840347f, -1374.638916f, 46.379448f, 129.814880f, -741.815063f },
        { -368.490479f, 192.840347f, -1387.362305f, 43.506042f, 129.814880f, -739.916077f },
        { -357.608582f, 192.840347f, -1394.140991f, 41.881878f, 129.814880f, -738.904297f },
};

#if 0
static xyz_t PointCentData[50] = {
        { 22.000000f, 116.000000f, -543.000000f },
        { 176.000000f, 170.000000f, -666.000000f },
        { 199.000000f, 213.000000f, -916.000000f },
        { 209.000000f, 146.000000f, -1137.000000f },
        { 280.000000f, 107.000000f, -1165.000000f },
        { 280.000000f, 107.000000f, -1233.000000f },
        { 254.000000f, 107.000000f, -1099.000000f },
        { 234.000000f, 107.000000f, -988.000000f },
        { 164.000000f, 107.000000f, -912.000000f },
        { 147.000000f, 107.000000f, -947.000000f },
        { 161.000000f, 107.000000f, -979.000000f },
        { 197.000000f, 117.000000f, -983.000000f },
        { 202.000000f, 108.000000f, -905.000000f },
        { 85.000000f, 108.000000f, -905.000000f },
        { -14.000000f, 117.000000f, -905.000000f },
        { -284.000000f, 181.000000f, -953.000000f },
        { -337.000000f, 181.000000f, -953.000000f },
        { -357.000000f, 194.000000f, -978.000000f },
        { -374.000000f, 200.000000f, -978.000000f },
        { -374.000000f, 74.000000f, -978.000000f },
        { -374.000000f, 200.000000f, -978.000000f },
        { -324.000000f, 181.000000f, -978.000000f },
        { -325.000000f, 203.000000f, -978.000000f },
        { -232.000000f, 249.000000f, -934.000000f },
        { 0.000000f, 249.000000f, -778.000000f },
        { -50.000000f, 161.000000f, -603.000000f },
        { -10.000000f, 138.000000f, -739.000000f },
        { -10.000000f, 138.000000f, -802.000000f },
        { -10.000000f, 138.000000f, -808.000000f },
        { -10.000000f, 138.000000f, -824.000000f },
        { -10.000000f, 138.000000f, -824.000000f },
        { -10.000000f, 138.000000f, -824.000000f },
        { -10.000000f, 138.000000f, -824.000000f },
        { -10.000000f, 138.000000f, -824.000000f },
};

static float PointXaData[50] = {  3.000000f, 3.879999f, -0.820001f, -1.680002f, -5.060001f, -5.060001f, -15.579531f, -19.799528f, -19.799528f, -18.399536f, -12.219535f, -9.659537f, -10.799541f, 0.620462f, 15.760442f, 10.520456f, -1.139543f, 2.080459f, 2.080459f, -26.090014f, -9.930005f, -1.530007f, 3.729991f, 11.009994f, 1.849983f, -12.214962f, -18.714962f, -24.394966f, -29.734934f, -21.894985f, -4.694984f, -4.694984f, -4.694984f, -4.694984f,  };

static float PointYaData[50] = {  7.000000f, 4.240002f, 7.000000f, -7.799999f, -21.259991f, -20.739996f, -17.693430f, -17.493435f, -17.493435f, -25.513432f, -26.493454f, -37.233448f, -47.493450f, -48.713406f, -26.373405f, 29.306679f, 39.146687f, 39.346687f, 41.506680f, 41.209515f, 30.629507f, 31.569496f, 36.229465f, 30.509508f, 0.069318f, -30.639353f, -42.259365f, -51.459457f, -84.599487f, -122.199326f, -143.599670f, -145.549591f, -147.529739f, -148.629807f,  };

static float PointZr1Data[50] = {  400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 400.000000f, 500.000000f, 920.000000f, 750.000000f, 660.000000f, 580.000000f, 580.000000f, 530.000000f, 670.000000f, 690.000000f, 680.000000f, 670.000000f, 670.000000f, 670.000000f, 670.000000f, 670.000000f,  };

static float PointZr2Data[50] = {  -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f, -100.000000f,  };
#endif


/************************************************************************/
/* 通路を走るフォックスチーム Init					*/
/************************************************************************/
static void Fox_Running_init( void )
{
    Back_star_f = OFF;

    fade_sw = End;
    fade_A = 0xff;
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;

    name_sw = OFF;

    col_p = 0;
    lig_sw = 1;

    tu_kanR = tu_kanG = tu_kanB = 155.0f;   

#ifdef TITL_DEBUG
    /* TEST */
    flush_sw = ON;
    sel_sw = 0;

    tu2_kan[0].r = 155.0f;
    tu2_kan[0].g = 155.0f;
    tu2_kan[0].b = 155.0f;   

    tu2_kan[1].r = 255.0f;
    tu2_kan[1].g = 155.0f;
    tu2_kan[1].b = 155.0f;   

    tu2_kan[2].r = 155.0f;
    tu2_kan[2].g = 255.0f;
    tu2_kan[2].b = 155.0f;

    tu2_kan[3].r = 135.0f;
    tu2_kan[3].g = 206.0f;
    tu2_kan[3].b = 255.0f;   

    tu2_kan[4].r = 255.0f;
    tu2_kan[4].g = 255.0f;
    tu2_kan[4].b = 155.0f;   
#endif

    tu_kanR = 77.0f;
    tu_kanG = 77.0f;
    tu_kanB = 77.0f;
    /*********/

    LigXa = 0.0f;
    LigYa = -90.0f;

    ft_ligR = 76;
    ft_ligG = 45;
    ft_ligB = 66;
    ft_kanR = 11.0f;
    ft_kanG = 1.0f;
    ft_kanB = 1.0f;

    vecX = 0.0f;
    vecY = 1.0f;
    vecZ = 0.0f;

    foxtm_scl = 0.5f;

    /* Fox */
    foxt[0].Pos.x = -20.0f;
    foxt[0].Pos.y = 0.0f;
    foxt[0].Pos.z = -600.0f;
    foxt[0].Jpos = 0.0f;
    foxt[0].KageScl = 3.0f;
    foxt[0].anmcnt = 14;
    foxt[0].addcnt = 5;

    /* Falco */
    foxt[1].Pos.x = -209.0f;
    foxt[1].Pos.y = 0.0f;
    foxt[1].Pos.z = -820.0f;
    foxt[1].Jpos = 0.0f;
    foxt[1].KageScl = 3.0f;
    foxt[1].anmcnt = 0;
    foxt[1].addcnt = 5;

    /* Peppey */
    foxt[2].Pos.x = 62.0f;
    foxt[2].Pos.y = 0.0f;
    foxt[2].Pos.z = -813.0f;
    foxt[2].Jpos = 0.0f;
    foxt[2].KageScl = 3.0f;
    foxt[2].anmcnt = 29;
    foxt[2].addcnt = 6;

    /* Slippey */
    foxt[3].Pos.x = 183.0f;
    foxt[3].Pos.y = 0.0f;
    foxt[3].Pos.z = -990.0f;
    foxt[3].Jpos = 0.0f;
    foxt[3].KageScl = 3.0f;
    foxt[3].anmcnt = 41;
    foxt[3].addcnt = 7;

    FoxTmZoff = -6000.0f;

#if 0
    wayX = 0.0f;
    wayY = 100.0f;
    wayZ = -500.0f;

    CamXa = 0.0f;
    CamYa = 20.0f;
    CamZrg = 500.0f;
#else
    CentX = 22.0f;
    CentY = 116.0f;
    CentZ = -543.0f;

    CamXa = 3.0f;
    CamYa = 7.0f;
    CamZrg1 = 400.0f;
    CamZrg2 = -100.0f;
#endif
    vecX = 0.0f;
    vecY = 1.0f;
    vecZ = 0.0f;

    revo_pos_calc3( CentX, CentY, CentZ,
		    &eyeX, &eyeY, &eyeZ, CamZrg1,
		    &wayX, &wayY, &wayZ, CamZrg2,
		    CamXa, CamYa );
}

/************************************************************************/
/* 通路を走るフォックスチーム						*/
/************************************************************************/
static void Fox_Running( void )
{
//    static int NameTime[] = { 97, 250, 405, 543 }; /* tsp = 0.04f */
    static int NameTime[] = { 63, 170, 268, 368 }; /* tsp = 0.06f */

    switch( demo_cut_phase ) {
    case 0:
	Fox_Running_init();
	Na_StartSystemSe( NA_SE_DEMO_SIREN );
	Na_StartSe( FoxSndPos, NA_SE_DENO_RUNNING );

	time0 = 0;
	scroll_sp = 0.0f;
//	wait_time = 9;

	CutTime = 0;
	demo_cut_phase++;
	break;
    case 1:
//	if( wait_time ) break;
	if( time0 == 20 ) fade_sw = IN;

	if( FoxTmZoff != 0.0f ) {
	    add_calc( &FoxTmZoff, 0.0f, 0.09f, 70.0f, 1.0f );
//	    PRINTF( "z:%f\n",FoxTmZoff );
	}

	if( FoxTmZoff == 0.0f ) {
	    time0 = 0;
	    run_p = 0;
//	    DataAdd = (cam_t *)SEGMENT_TO_KSEG0( FoxRunCamData );
	    DataAdd = FoxRunCamData;
	    PointNum = 0;
	    t = 0.0f;
	    tsp = 0.06f;
	    demo_cut_phase++;
	}
	time0 ++;
	break;

    case 2: /* 各顔にアップ */
//	if( Key_T[3].button & CONT_B ) {
//	if( Key[3].button & CONT_B ) {

	get_cam_ang( &CamXa, &CamYa );
	get_cam_vec( CamXa, CamYa );
	PlayData( DataAdd, FOX_RUN_DATA, tsp );

//	PRINTF( "tm:%d\n",time0 );

	if( time0 == NameTime[run_p] ) {
	    name_sw = ON;
	    wait_time = 40;
	    demo_cut_phase = 3;
	}	    

	if( time0 == 475 ) fade_sw = OUT;

//	if( fade_A == 0xff ) {
	if( CutTime == 795 ) {
	    Na_StopAllFlagSe( NA_SE_DEMO_SIREN );
	    Na_StopSe( FoxSndPos, NA_SE_DENO_RUNNING );
	    demo_cut_phase = 0;
	    display_mode = DISPLAY_NOTH;
	    demo_phase = DEMO_CUT3;

	    /* 持ち時間:795 */
//	    PRINTF( "ctm:%d\n",CutTime );
	}
	time0++;
//	}
	break;
    case 3:
	if( wait_time ) break;
	name_sw = OFF;
	run_p++;
	demo_cut_phase = 2;
	break;
    }

    demo_fade();

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    CutTime++;
}

/************************************************************************/
/* 通路を走るフォックスチーム 表示					*/
/************************************************************************/
static void Fox_Running_display( void )
{
    register int i;
    static rgb_ft col_t[] = {
	{ 255.0f, 155.0f, 155.0f },
	{ 155.0f, 255.0f, 155.0f },
	{ 135.0f, 206.0f, 255.0f },
	{ 255.0f, 255.0f, 155.0f },
    };

#ifdef TITL_DEBUG
    if( flush_sw ) {
#endif
	if( (frcnt&0x07) == 0x07 ) {
	    if( lig_sw ) {
		col_p = (col_p + 1) & 0x03;
#if 1
		tu_kanR = col_t[col_p].r;
		tu_kanG = col_t[col_p].g;
		tu_kanB = col_t[col_p].b;
#else
		tu_kanR = tu2_kan[col_p+1].r;
		tu_kanG = tu2_kan[col_p+1].g;
		tu_kanB = tu2_kan[col_p+1].b;
#endif		
	    } else {
#if 0
		tu_kanR = tu2_kan[0].r;
		tu_kanG = tu2_kan[0].g;
		tu_kanB = tu2_kan[0].b;
#else
		tu_kanR = 155.0f;
		tu_kanG = 155.0f;
		tu_kanB = 155.0f;
#endif
	    }
	    lig_sw ^= 1;
	}

#ifdef TITL_DEBUG
    } else {
	tu_kanR = tu2_kan[0].r;
	tu_kanG = tu2_kan[0].g;
	tu_kanB = tu2_kan[0].b;
    }
#endif

    
    if( frcnt & 0x01 ) {
	LigYa += 30.0f;
	if( LigYa > 90.0f ) LigYa = -90.0f;
    }

    kanR = (int)tu_kanR;
    kanG = (int)tu_kanG;
    kanB = (int)tu_kanB;

    turo_display();

#if 0
    ft_ligR = (int)(tu_kanR/2.0f);
    ft_ligG = (int)(tu_kanG/2.0f);
    ft_ligB = (int)(tu_kanB/2.0f);
#endif

    ligR = ft_ligR;
    ligG = ft_ligG;
    ligB = ft_ligB;
    kanR = (int)ft_kanR;
    kanG = (int)ft_kanG;
    kanB = (int)ft_kanB;
    
    for( i=0; i<4; i++ ) {
	foxteam_run_display( i );
	foxt[i].anmcnt += foxt[i].addcnt;
    }
}






/************************************************************************/
/* グレートフォックス号の発射口にズーム Init				*/
/************************************************************************/
static void GrFox_Zoom_init( void )
{
    Back_star_f = 800;

    fade_sw = End;
    fade_A = 0x00;
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;

    ligR = 101;
    ligG = 106;
    ligB = 92;
    kanR = 3;
    kanG = 4;
    kanB = 10;
    
    CamXa = 10.0f;
    CamYa = -30.0f;
    CamZrg = 450.0f;

    LigXa = 0.0f;
    LigYa = 0.0f;
    
    wayX = -10.0f;
    wayY = 0.0f;
    wayZ = 0.0f;

    vecX = 0.0f;
    vecY = 1.0f;
    vecZ = 0.0f;

    gfox.pos.x = 0.0f;
    gfox.pos.y = 0.0f;
    gfox.pos.z = 0.0f;
    gfox.Xang = 0.0f;
    gfox.Yang = 0.0f;
    gfox.Zang = 0.0f;
}

/************************************************************************/
/* グレートフォックス号の発射口にズーム					*/
/************************************************************************/
static void GrFox_Zoom( void )
{
    switch( demo_cut_phase ) {
    case 0:
	GrFox_Zoom_init();
	Na_StartSceneSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	Na_StartSceneSe( gfox.SndPos, NA_SE_GREATFOX_BURNER );
	cam_sp = 0.01f;
	time0 = 0;
	demo_cut_phase++;
	break;
    case 1:
	add_calc( &CamXa,   30.0f, cam_sp, 100.0f, 0.0001f );
	add_calc( &CamYa,  -15.0f, cam_sp, 100.0f, 0.0001f );
	add_calc( &wayX,     0.0f,  0.05f, 100.0f, 0.0001f );
	add_calc( &wayY,   -40.0f, cam_sp, 100.0f, 0.0001f );
	add_calc( &CamZrg, 100.0f, cam_sp, 100.0f, 0.0001f );
	cam_sp *= 1.04f;

	if( time0 == 50 ) fade_sw = OUT;
	if( fade_A == 0xff ) {
	    Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	    Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_BURNER );
	    display_mode = DISPLAY_NOTH;
	    demo_cut_phase = 0;
	    demo_phase = DEMO_CUT4;
	}
	demo_fade();
	time0++;
	break;
    }

    revo_pos_calc( 1, &eyeX, &eyeY, &eyeZ,
		   &wayX, &wayY, &wayZ, CamXa, CamYa, CamZrg );

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );
    starXad += 2.0f;
    starYad += 2.0f;
}

/************************************************************************/
/* グレートフォックス号の発射口にズーム 表示				*/
/************************************************************************/
static void GrFox_Zoom_display( void )
{
    gfox_display();
}



/*----------------------------------------------------------------------*/
/*									*/
/*									*/
/*----------------------------------------------------------------------*/
#define AWIN_GO1_MV_DATA (10)


/************************************************************************/
/* アーウィン出撃 1 Init						*/
/************************************************************************/
static void Awin_Go1_init( void )
{
    register int i;
    float xp;

    BakuCnt = 10;
    for( i=0; i<10; i++ ) {
	BakuZr[i] = 10.0f + (rnd()*10.0f);
	BakuZa[i] = -10.0f+(rnd() * -60.0f);
	BakuScl[i] = 0.0f;
	BakuScl2[i] = 0.1f+(rnd()*0.3f);
	BakuWait[i] = 5+(int)(rnd()*5.0f);
	BakuA1[i] = 0xff;
	BakuA2[i] = 0x80;
	BakuMaxSw[i] = OFF;
    }

    RyushiCnt = 20;
    for( i=0; i<RyushiCnt; i++ ) {
	RyushiXp[i] = 13.0f + -(rnd()*22.0f);
	RyushiYp[i] = 5.0f + -(rnd()*10.0f);
	RyushiZp[i] = -25.0f + -(rnd()*15.0f);
	RyushiScl[i] = 0.0f;
	RyushiScl2[i] = (rnd()*0.04f);
	RyushiSpd[i] = 0.02f + (rnd()*0.08f);
	RyushiMaxSw[i] = OFF;
    }

    fade_sw = End;
    fade_A = 0x00;
    fade_R = 0xff;
    fade_G = 0xff;
    fade_B = 0xff;

    Back_star_f = OFF;

    col_p = 0;
    lig_sw = 1;
    
    /* Light */
    LigXa = -360.0f;
    LigYa = 131.0f;
    ligR = 90;
    ligG = 75;
    ligB = 90;
    kanR = 45;
    kanG = 34;
    kanB = 56;

    cn.pos.x = 0.0f;
    cn.pos.y = 0.0f;
    cn.pos.z = 1000.0f;
    cn.scale = 2.0f;
    cn.draw_sw = OFF;

    KabeDraw_f = ON;

    xp = -120.0f;
    for( i=0; i<4; i++,xp+=75.0f ) {
	awt[i].pos.x = xp;
	awt[i].pos.y = 0.0f;
	awt[i].pos.z = 0.0f;
	awt[i].scale = 0.5f;
	awt[i].Xang = 0.0f;
	awt[i].Yang = 0.0f;
	awt[i].Zang = 0.0f;
	awt[i].cang = -60.0f;
	awt[i].twinbmY = -10.0f;
	awt[i].kaoXa = 0.0f;
	awt[i].kaoYa = 0.0f;
	awt[i].kao = 4-i;

	awt[i].bfire_f = OFF;
	awt[i].bfire2_f = OFF;
	awt[i].bfire_scl = 0.0f;
	awt[i].speed = 0.05f;

	awt[i].kage_f = ON;
	awt[i].draw_f = ON;
    }

    CentX = 140.0f;
    CentY = -20.0f;
    CentZ = 0.0f;

    CamXa = 0.0f;
    CamYa = 90.0f;
    CamZrg1 = 90.0f;
    CamZrg2 = -50.0f;

    vecX = 0.0f;
    vecY = 1.0f;
    vecZ = 0.0f;
    revo_pos_calc3( CentX, CentY, CentZ,
		    &eyeX, &eyeY, &eyeZ, CamZrg1,
		    &wayX, &wayY, &wayZ, CamZrg2,
		    CamXa, CamYa );


    /** TEST **/
    kataZ = 25.0f;
    hkoY = 84.0f;
    hkoZ = -20.0f;
    kageY = -33.0f;
}

/************************************************************************/
/* アーウィン出撃 1							*/
/************************************************************************/
static void Awin_Go1( void )
{
    register int i;
    float res[4];

    switch( demo_cut_phase ) {
    case 0:
	CutTime = 0;
	Awin_Go1_init();
	Na_SetAllSeEfxOfs( NA_EFX_OPENING0 );
	wait_time = 30;
	awt[3].time = 70;
	awt[2].time = 102;
	awt[1].time = 132;
	awt[0].time = 171;

//	DataAdd = (cam_t *)SEGMENT_TO_KSEG0( AwinGo1CamData );
	DataAdd =  AwinGo1CamData;
	PointNum = 0;
	t = 0.0f;
	tsp = 0.024f;
	demo_cut_phase = 10;
	break;
    case 10:
	if( wait_time ) break;
	Na_StartSystemSe( NA_SE_LIFT_UP );
	time0 = 0;
	demo_cut_phase = 1;
	break;
    case 1:
	get_cam_ang( &CamXa, &CamYa );
	get_cam_vec( CamXa, CamYa );
	PlayData( DataAdd, AWIN_GO1_MV_DATA, tsp );
//	PlayData( DataAdd, DataCnt, tsp );

        /* カタパルトＵＰ */
	if( hkoY > 0.0f ) {
//	    hkoY -= 1.5f;
	    hkoY -= 0.41f;
	    if( hkoY < 0.0f ) {
		hkoY = 0.0f;
		Na_StartSystemSe( NA_SE_LIFT_UP_END );
	    }
	}

	if( time0 == 60 ) name2_stat = 2;

//	PRINTF( "y:%f\n",hkoY );
	
//	PRINTF( "tm:%d\n",time0 );
        /* 各アーウィンのキャノピー閉じる */
	for( i=3; i>=0; i-- ) {
	    if( awt[i].time > 0 ) awt[i].time--;
	    if( awt[i].time == 1 ) {
		Na_StartSe( awt[i].SndPos, NA_SE_ARWING_HATCH );
	    };
	    if( awt[i].time != 0 ) continue;
	    add_calc( &(awt[i].twinbmY), 0.0f,
		      awt[i].speed, 100.0f, 0.01f );
	    res[i] = add_calc( &(awt[i].cang), 0.0f,
		      awt[i].speed, 100.0f, 0.01f );
	    awt[i].speed *= 1.04f;
	    if( res[i] == 0.0f ) {
		Na_StopSe( awt[i].SndPos, NA_SE_ARWING_HATCH );
	    }
	}


	if( time0 == 70 ) {
	    KabeDraw_f = OFF;
	    awt[0].draw_f = OFF;
	}
	if( time0 == 80 ) {
	    awt[1].draw_f = OFF;
	    for( i=0; i<4; i++ ) awt[i].kage_f = OFF;
	}
	if( time0 == 115 ) {
	    awt[0].draw_f = ON;
	    awt[1].draw_f = ON;
	}

//	if( PointNum == -1 ) {
//	if( time0 == 230 ) {
	if( time0 == 226 ) {
	    name2_stat = 0;
	    Na_StartSe( awt[3].SndPos, NA_SE_ENGINE_START );
	    CentX = 105.0f;
	    CentY = 0.0f;
	    CentZ = -12.0f;
	    CamXa = 9.4f;
	    CamYa = 110.0f;
//	    CamYa = 138.0f;
	    CamZrg1 = 36.0f;
//	    CamZrg1 = 26.0f;
	    CamZrg2 = -70.0f;
	    revo_pos_calc3( CentX, CentY, CentZ,
			    &eyeX, &eyeY, &eyeZ, CamZrg1,
			    &wayX, &wayY, &wayZ, CamZrg2,
			    CamXa, CamYa );
	    time0 = 0;
	    awt[3].bfire_scl = 0.0f;
	    LigXa = 60.0f;
	    LigYa = 0.0f;
	    fligR = 60.0f;
	    fligG = 45.0f;
	    fligB = 60.0f;
	    ligR = (int)fligR;
	    ligG = (int)fligG;
	    ligB = (int)fligB;
	    kanR = 35;
	    kanG = 24;
	    kanB = 46;
	    demo_cut_phase++;
	}
	time0++;
	break;
    case 2:
	/* アーウィンのエンジン始動 */
	if( time0 == 30 ) awt[3].bfire2_f = ON;
	if( time0 == 40 ) awt[3].bfire_f = ON;
	if( time0 > 40 ) {
	    awt[3].bfire_scl += 0.002f;
	    if( awt[3].bfire_scl > 0.2f ) awt[3].bfire_scl = 0.2f;
//	    add_calc( &awt[3].bfire_scl, 0.2f, 0.0001f, 100.0f, 0.01f );

	    add_calc( &fligR, 240.0f, 0.06f, 2.0f, 0.01f );
	    add_calc( &fligG, 240.0f, 0.06f, 2.0f, 0.01f );
	    add_calc( &fligB, 255.0f, 0.06f, 2.0f, 0.01f );
	    ligR = (int)fligR;
	    ligG = (int)fligG;
	    ligB = (int)fligB;

//	    PRINTF( "r:%d g:%d b:%d\n",ligR,ligG,ligB );
	}
	if( time0 > 60 && fade_A < 0xff ) {
	    fade_A += 1;
	}
	if( fade_A == 0x80 ) {
//	    wait_time = 10;
	    wait_time = 7;
	    awt[3].bfire_f = OFF;
	    awt[3].bfire2_f = OFF;
	    fade_A = 0xff;
	    demo_cut_phase++;
	}

//	PRINTF( "tm:%d\n",time0 );
	if( time0 == 50 ) {
	    awt[0].draw_f = OFF;
	}
	if( time0 == 60 ) {
	    awt[1].draw_f = OFF;
	}

	add_calc( &CamZrg1, 16.0f, 0.01f, 100.0f, 0.01f );
	add_calc( &CamYa, 138.0f, 0.01f, 100.0f, 0.01f );
	revo_pos_calc3( CentX, CentY, CentZ,
			&eyeX, &eyeY, &eyeZ, CamZrg1,
			&wayX, &wayY, &wayZ, CamZrg2,
			CamXa, CamYa );
	time0++;
	break;
    case 3:
	if( wait_time ) break;
	Na_StopSe( awt[3].SndPos, NA_SE_ENGINE_START );
	Na_StartSe( awt[3].SndPos, NA_SE_ARWING_DASH );
//	wait_time = 6;
	wait_time = 4;
	fade_A = 0x00;
	for( i=0; i<4; i++ ) {
	    awt[i].bfire_f = ON;
	    awt[i].bfire_scl = 0.9f;
	}
	time0 = 0;
//	cn.draw_sw = ON;
	Back_star_f = 800;
	demo_cut_phase++;
	break;
    case 4:
	if( wait_time ) break;
	awt[3].bfire_scl = 1.2f;
	add_calc( &(awt[3].pos.z),
		  900.0f, 0.06f, 100.0f, 0.0001f );

	add_calc( &CamYa, 154.0f, 0.2f, 100.0f, 0.01f );
	add_calc( &CamXa,  -5.0f, 0.2f, 100.0f, 0.01f );
	add_calc( &CentX, 100.0f, 0.2f, 100.0f, 0.01f );
	add_calc( &CamZrg1, 40.0f, 0.2f, 100.0f, 0.01f );

	revo_pos_calc3( CentX, CentY, CentZ,
			&eyeX, &eyeY, &eyeZ, CamZrg1,
			&wayX, &wayY, &wayZ, CamZrg2,
			CamXa, CamYa );

	if( time0 > 8 ) {
	    Na_SetAllSeEfxOfs( NA_EFX_OFF );
	    demo_cut_phase = 0;
//	    display_mode = DISPLAY_NOTH;
	    demo_phase = DEMO_CUT5;
	    /* 470-5 */
//	    PRINTF( "ctm:%d\n",CutTime );
	}
	time0++;
	break;
    }

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    CutTime++;
}

/************************************************************************/
/* アーウィン出撃 1 表示						*/
/************************************************************************/
static void Awin_Go1_display( void )
{
    register int i;

    if( cn.draw_sw ) CN_display( 0.0f );

    gfoxBase_display();

    for( i=3; i>=0; i-- ) {
	if( awt[i].draw_f )
	    gfoxKatapalt_display( i );
    }

    for( i=0; i<4; i++ ) {
	if( awt[i].draw_f )
	    awins_display( i );
    }
}



/*----------------------------------------------------------------------*/
/*									*/
/*									*/
/*----------------------------------------------------------------------*/

#if 1
#define AWIN_GO2_MV_DATA (9)

static cam_t AwinGo2CamData[50] = {
        { -223.577499f, -61.156242f, -26.375984f, -53.867554f, -42.139626f, 44.771069f },
        { -160.055008f, -67.747749f, 85.750084f, -61.486446f, -44.164986f, 29.322315f },
        { -22.228004f, -79.541389f, 121.019028f, -15.555059f, -64.843475f, 85.516312f },
        { 94.762581f, -100.207916f, 96.579681f, 56.850273f, -76.324486f, 62.990417f },
        { 187.570404f, -114.560425f, 12.510195f, 111.428185f, -84.394104f, 8.465982f },
        { 244.839203f, -135.206253f, -212.591721f, 124.296425f, -87.255943f, -43.656223f },
        { 279.389465f, -216.016983f, -401.491180f, 122.861450f, -89.649139f, -105.359215f },
        { 440.835724f, -305.191956f, -598.567627f, 89.574570f, -23.879997f, -4.847023f },
        { 481.638184f, -313.293396f, -628.921326f, 96.210297f, -5.343582f, -4.238850f },
};

#if 0
static xyz_t PointCentData[50] = {
        { -8.000000f, -37.000000f, 64.000000f },
        { -19.000000f, -34.000000f, 5.000000f },
        { -7.000000f, -46.000000f, 40.000000f },
        { 23.000000f, -55.000000f, 33.000000f },
        { 65.000000f, -66.000000f, 6.000000f },
        { 96.000000f, -76.000000f, -4.000000f },
        { 101.000000f, -72.000000f, -64.000000f },
        { 66.000000f, -5.000000f, 35.000000f },
        { 72.000000f, 14.000000f, 35.000000f },
};

static float PointXaData[50] = {  5.899999f, 11.729982f, 22.139910f, 25.244997f, 21.585054f, 13.009867f, 20.669867f, 22.185097f, 22.759983f,  };

static float PointYaData[50] = {  -112.744766f, -60.210056f, -10.644887f, 48.459938f, 86.959656f, 144.490509f, 152.140182f, 149.390289f, 148.325500f,  };

static float PointZr1Data[50] = {  235.000000f, 166.000000f, 89.000000f, 106.000000f, 132.000000f, 263.000000f, 408.000000f, 795.000000f, 846.000000f,  };

static float PointZr2Data[50] = {  50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f,  };
#endif
#else
#define AWIN_GO2_MV_DATA (20)

static cam_t AwinGo2CamData[50] = {
        { -43.925480f, 2.150352f, 71.857857f, -31.375343f, -9.321178f, 61.327042f },
        { -51.795944f, -19.882668f, 78.461960f, -36.997105f, -25.059048f, 66.044258f },
        { -51.795944f, -56.117332f, 78.461960f, -36.997105f, -50.940952f, 66.044258f },
        { -43.925480f, -78.150352f, 71.857857f, -31.375343f, -66.678818f, 61.327042f },
        { -19.999998f, -107.282028f, 69.641014f, -12.499999f, -81.301270f, 56.650635f },
        { 0.000000f, -124.933327f, 58.293716f, 0.000000f, -86.296295f, 47.940952f },
        { 6.945929f, -116.784622f, 47.030701f, 4.341206f, -87.240387f, 42.519188f },
        { 22.662106f, -101.441544f, 54.015762f, 16.187218f, -83.315392f, 48.582687f },
        { 46.512409f, -87.497475f, 51.929134f, 33.223148f, -73.355339f, 47.092239f },
        { 63.441547f, -67.583282f, 34.999996f, 45.315392f, -59.130913f, 34.999996f },
        { 61.576366f, -65.361610f, -8.124161f, 38.485229f, -55.101006f, 8.047400f },
        { 81.626778f, -89.780655f, -130.088089f, 20.406694f, -50.945164f, 1.227978f },
        { 204.108978f, -167.409515f, -387.713013f, 20.410898f, -50.940952f, 6.228699f },
        { 277.408936f, -214.627579f, -535.186462f, 20.397717f, -50.987320f, 16.236286f },
        { 285.752563f, -219.173325f, -552.798218f, 20.410898f, -50.940952f, 16.228699f },
        { 287.793671f, -220.467422f, -557.175354f, 20.410898f, -50.940952f, 16.228699f },
        { 289.834747f, -221.761520f, -561.552490f, 20.410898f, -50.940952f, 16.228699f },
        { 291.875854f, -223.055618f, -565.929626f, 20.410898f, -50.940952f, 16.228699f },
        { 293.100494f, -223.832077f, -568.555908f, 20.410898f, -50.940952f, 16.228699f },
        { 293.916931f, -224.349716f, -570.306763f, 20.410898f, -50.940952f, 16.228699f },
};

static xyz_t PointCentData[50] = {
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 35.000000f },
        { 0.000000f, -38.000000f, 45.000000f },
        { 0.000000f, -38.000000f, 50.000000f },
        { 0.000000f, -38.000000f, 60.000000f },
        { 0.000000f, -38.000000f, 60.000000f },
        { 0.000000f, -38.000000f, 60.000000f },
        { 0.000000f, -38.000000f, 60.000000f },
        { 0.000000f, -38.000000f, 60.000000f },
        { 0.000000f, -38.000000f, 60.000000f },
        { 0.000000f, -38.000000f, 60.000000f },
};

static float PointXaData[50] = {  -35.000000f, -15.000000f, 15.000000f, 35.000000f, 60.000000f, 75.000000f, 80.000000f, 65.000000f, 45.000000f, 25.000000f, 20.000000f, 15.000000f, 15.000000f, 15.000000f, 15.000000f, 15.000000f, 15.000000f, 15.000000f, 15.000000f, 15.000000f,  };

static float PointYaData[50] = {  -50.000000f, -50.000000f, -50.000000f, -50.000000f, -30.000000f, 0.000000f, 30.000000f, 50.000000f, 70.000000f, 90.000000f, 125.004944f, 155.000000f, 155.000000f, 155.000000f, 155.000000f, 155.000000f, 155.000000f, 155.000000f, 155.000000f, 155.000000f,  };

static float PointZr1Data[50] = {  70.000000f, 70.000000f, 70.000000f, 70.000000f, 80.000000f, 90.000000f, 80.000000f, 70.000000f, 70.000000f, 70.000000f, 80.000000f, 200.000000f, 500.000000f, 680.000000f, 700.000000f, 705.000000f, 710.000000f, 715.000000f, 718.000000f, 720.000000f,  };

static float PointZr2Data[50] = {  50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f, 50.000000f,  };
#endif

/************************************************************************/
/* アーウィン出撃 2 Init						*/
/************************************************************************/
static void Awin_Go2_init( void )
{
    register int i;

    Back_star_f = ON;

    BakuCnt = 10;
    for( i=0; i<10; i++ ) {
	BakuZr[i] = 10.0f + (rnd()*10.0f);
	BakuZa[i] = -10.0f+(rnd() * -60.0f);
	BakuScl[i] = 0.0f;
	BakuScl2[i] = 0.1f+(rnd()*0.3f);
	BakuWait[i] = 5+(int)(rnd()*5.0f);
	BakuA1[i] = 0xff;
	BakuA2[i] = 0x80;
	BakuMaxSw[i] = OFF;
    }

    draw_sw = ON;
    CentX = 0.0f;
    CentY = -38.0f;
    CentZ = 35.0f;

    CamXa = -35.0f;
    CamYa = -50.0f;
    CamZrg1 = 105.0f;
    CamZrg2 = 50.0f;

    fade_sw = End;
    fade_A = 0x00;
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;

    cn.pos.x = 130.0f;
    cn.pos.y = -30.0f;
    cn.pos.z = 2000.0f;
    cn.scale = 8.0f;
    cn.draw_sw = OFF;

    gfox.pos.x = 0.0f;
    gfox.pos.y = 0.0f;
    gfox.pos.z = 0.0f;
    gfox.Xang = 0.0f;
    gfox.Yang = 0.0f;
    gfox.Zang = 0.0f;
    gfox.scale = 0.1f;

    LigXa = 0.0f;
    LigYa = 0.0f;
    ligR = 101;
    ligG = 106;
    ligB = 92;
    kanR = 3;
    kanG = 4;
    kanB = 10;

    for( i=0; i<4; i++ ) {
	awt[i].pos.x = 0.0f;
	awt[i].pos.y = -40.0f;
	awt[i].pos.z = -30.0f;
	awt[i].scale = 0.1f;
	awt[i].Xang = 0.0f;
	awt[i].Yang = 0.0f;
	awt[i].Zang = 0.0f;
	awt[i].speed = 0.05f;
	awt[i].cang = 0.0f;
	awt[i].twinbmY = 0.0f;
	awt[i].kaoXa = 0.0f;
	awt[i].kaoYa = 0.0f;
	awt[i].kao = i+1;
	awt[i].bfire_f = ON;
	awt[i].bfire2_f = OFF;
	awt[i].bfire_scl = 1.2f;
	awt[i].kage_f = OFF;
	awt[i].draw_f = OFF;
    }

#if 1
    CentX = -8.000000f;
    CentY = -37.000000f;
    CentZ = 64.000000f;

    CamXa = 5.899999f;
    CamYa = -112.744766f;
    CamZrg1 = 235.000000f;
    CamZrg2 = 50.000000f;
#else
    CentX = 1.0f;
    CentY = -38.0f;
    CentZ = 35.0f;

    CamXa = -35.0f;
    CamYa = -50.0f;
    CamZrg1 = 105.0f;
    CamZrg2 = 50.0f;
#endif
    vecX = 0.0f;
    vecY = 1.0f;
    vecZ = 0.0f;

    revo_pos_calc3( CentX, CentY, CentZ,
		    &eyeX, &eyeY, &eyeZ, CamZrg1,
		    &wayX, &wayY, &wayZ, CamZrg2,
		    CamXa, CamYa );
}

/************************************************************************/
/* アーウィン出撃 2							*/
/************************************************************************/
static void Awin_Go2( void )
{
    register int i;
    float xx,yy,zz;

    static float stop_X[] = {  -15.0f, -5.0f,   5.0f,  10.0f };
    static float stop_Y[] = { -50.0f, -45.0f, -55.0f, -60.0f };
    static float stop_Z[] = { 265.0f,  260.0f, 255.0f, 230.0f };

    switch( demo_cut_phase ) {
    case 0:
	Na_StartSceneSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	Na_StartSceneSe( gfox.SndPos, NA_SE_GREATFOX_BURNER );
	Awin_Go2_init();
	time0 = 0;
	CutTime = 0;

	cn.draw_sw = ON;

	awt[0].time = 3;
	awt[1].time = 23;
	awt[2].time = 43;
	awt[3].time = 63;
#if 0
	awt[0].time = 3;
	awt[1].time = 35;
	awt[2].time = 55;
	awt[3].time = 75;
#endif
	DataAdd = AwinGo2CamData;
	PointNum = 0;
	t = 0.0f;
//	tsp = 0.1f;
	tsp = 0.042f;
	demo_cut_phase++;
	break;
    case 1:
	for( i=0; i<4; i++ ) {
	    if( awt[i].time > 0 ) {
		awt[i].time--;
		continue;
	    }
	    if( awt[i].time == 0 ) {
		Na_StartSe( awt[i].SndPos, NA_SE_ARWIN_GO_OUT );
		awt[i].time = -1;
		awt[i].draw_f = ON;
	    }

	    add_calc( &(awt[i].pos.y), stop_Y[i], awt[i].speed,
		      100.0f, 0.001f );
	    add_calc( &(awt[i].pos.x), stop_X[i], awt[i].speed,
		      100.0f, 0.001f );
	    add_calc( &(awt[i].pos.z), stop_Z[i], awt[i].speed,
		      100.0f, 0.001f );
	    awt[i].speed *= 1.05f;

	    if( awt[i].pos.z == stop_Z[i] ) {
		awt[i].scale -= 0.002f;
		if( awt[i].scale < 0.0f ) {
		    awt[i].scale = 0.0f;
		    awt[i].draw_f = OFF;
		}
	    }

	    xx = stop_X[i] - awt[i].pos.x;
	    yy = stop_Y[i] - awt[i].pos.y;
	    zz = (stop_Z[i]+10.0f) - awt[i].pos.z;
	    awt[i].Xang = -fatan3( yy,sqrtf((xx*xx)+(zz*zz)) )*180.0f/F_PI;
	    awt[i].Yang = fatan3( xx,zz )*180.0f/F_PI;
	}

//	if( time0 == 120 ) fade_sw = OUT;
	if( time0 == 125 ) fade_sw = OUT;

	if( fade_A == 0xff ) {
	    Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	    Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_BURNER );
	    demo_cut_phase++;
	}
	demo_fade();
	time0++;
	break;
    case 2:
	fade_A = 0x00;
	Back_star_f = OFF;
	draw_sw = OFF;
	wait_time = 20;
	demo_cut_phase++;
	break;
    case 3:
	if( wait_time ) break;
	demo_cut_phase = 0;
	display_mode = DISPLAY_NOTH;
	demo_phase = DEMO_TITL;
	Na_ChangeSoundMode( NA_PLAY_1, NA_MODE_TITLE );

	/* 持ち時間:159+5 */
//	PRINTF( "ctm:%d\n",CutTime );
	break;
    }

    get_cam_ang( &CamXa, &CamYa );
    get_cam_vec( CamXa, CamYa );
    PlayData( DataAdd, AWIN_GO2_MV_DATA, tsp );

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );

    CutTime++;
}

/************************************************************************/
/* アーウィン出撃 2 表示						*/
/************************************************************************/
static void Awin_Go2_display( void )
{
    register int i;

    if( draw_sw == OFF ) return;
    
    if( cn.draw_sw ) CN_display( -1000.0f );

    gfox_display();

    for( i=0; i<4; i++ ) {
	if( awt[i].time > 0 ) continue;
	if( awt[i].draw_f )
	    awins_display( i );
    }

#if 0
    if( Key_T[1].button & CONT_UP ) {
	cn.pos.y += 10.0f;
    }
    if( Key_T[1].button & CONT_DOWN ) {
	cn.pos.y -= 10.0f;
    }
    if( Key_T[1].button & CONT_RIGHT ) {
	cn.pos.x += 10.0f;
    }
    if( Key_T[1].button & CONT_LEFT ) {
	cn.pos.x -= 10.0f;
    }
    if( Key_T[1].button & CONT_E ) {
	cn.scale += 1.0f;
    }
    if( Key_T[1].button & CONT_D ) {
	cn.scale -= 1.0f;
    }

    PRINTF( "x:%f y:%f sc:%f\n",cn.pos.x,cn.pos.y,cn.scale );
#endif
}


#ifdef TITL_DEBUG
/*----------------------------------------------------------------------*/
/*									*/
/*									*/
/*----------------------------------------------------------------------*/

/************************************************************************/
/* カメラ テスト							*/
/************************************************************************/
static void CameraTestInit( void )
{
    EditPoint = 0;
    t = 0.0f;
    tsp = 0.011f;
    mv_sw = OFF;
    fade_A = 0x00;
    gf_disp = ON;
    hkoY = 84.0f;
//    hkoY = 0.0f;
    cn.draw_sw = ON;
    FoxTmZoff = 0.0f;

    NowPoint = DataCnt;
//    DataAdd = Gfox_Cam_data;
//    DataAdd = FoxRunCamData;
//    DataAdd = AwinGo1CamData;
    DataAdd = AwinGo2CamData;
}

/************************************************************************/
/* カメラ テスト							*/
/************************************************************************/
static void CameraTest( void )
{
#if 0
    switch( demo_cut_phase ) {
    case 0:
//	GrFox_Move_init();
//	Fox_Running_init();
//	FoxTmZoff = 0.0f;
//	Awin_Go1_init();
	Awin_Go2_init();
	CameraTestInit();
	demo_cut_phase++;
	break;

    case 1:
	PutCamPos();
	if( mv_sw == ON ) {
	    t = 0.0f;
	    PlayCnt = 0;
	    eyeX = DataAdd[PlayCnt].ex;
	    eyeY = DataAdd[PlayCnt].ey;
	    eyeZ = DataAdd[PlayCnt].ez;
	    wayX = DataAdd[PlayCnt].wx;
	    wayY = DataAdd[PlayCnt].wy;
	    wayZ = DataAdd[PlayCnt].wz;

	    CentX = PointCentData[PlayCnt].x;
	    CentY = PointCentData[PlayCnt].y;
	    CentZ = PointCentData[PlayCnt].z;

	    CamXa = PointXaData[PlayCnt];
	    CamYa = PointYaData[PlayCnt];

	    CamZrg1 = PointZr1Data[PlayCnt];
	    CamZrg2 = PointZr2Data[PlayCnt];
	    demo_cut_phase++;
	}
	break;

    case 2:
	PlayCamera();

	get_cam_ang( &CamXa, &CamYa );
	get_cam_vec( CamXa, CamYa );

#if 0
	if( CamYa > -100.0f ) {
	    add_calc( &LigXa, 15.0f, cam_sp2, 100.0f, 0.0001f );
	    add_calc( &LigYa, -35.0f, cam_sp2, 100.0f, 0.0001f );
	    cam_sp2 -= 0.000005f;
	} else {
	    add_calc( &LigXa, -20.0f, cam_sp3, 100.0f, 0.0001f );
	    add_calc( &LigYa, -25.0f, cam_sp3, 100.0f, 0.0001f );
	    if( time0 > 550 ) {
		cam_sp3 += 0.0001f;
	    } else {
		cam_sp3 += 0.000001f;
	    }
	    starXad -= 2.0f;
	}
#endif
	time0++;
	if( mv_sw == OFF ) {
	    demo_cut_phase = 1;
	}
	break;
    }

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );
    starXad -= 1.0f;
#endif
}

/************************************************************************/
/* カメラ テスト							*/
/************************************************************************/
static void CameraTestDisplay( void )
{
//    gfox_display();
//    Fox_Running_display();
//    Awin_Go1_display();
    Awin_Go2_display();
}

/************************************************************************/
/* データ 表示								*/
/************************************************************************/
static void CameraStatusDisplay( void )
{
    rcpsetmode( &NOW_DISP, RECE_RGBA_A_PRIM );

    if( EditPoint == 0 ) {
	COLOR8X8( 0x00,0xff,0x00,0x80 );
    } else {
	COLOR8X8( 0xff,0xff,0xff,0x80 );
    }

    LOCATE8X8( 3, 2 );
    Printf( "EYE\n" );
    LOCATE8X8( 3, 3 );
    Printf( "X:%-10.4f\n",eyeX );
    LOCATE8X8( 3, 4 );
    Printf( "Y:%-10.4f\n",eyeY );
    LOCATE8X8( 3, 5 );
    Printf( "Z:%-10.4f\n",eyeZ );

    LOCATE8X8( 3, 6 );
    Printf( "CENTER\n" );
    LOCATE8X8( 3, 7 );
    Printf( "X:%-10.4f\n",CentX );
    LOCATE8X8( 3, 8 );
    Printf( "Y:%-10.4f\n",CentY );
    LOCATE8X8( 3, 9 );
    Printf( "Z:%-10.4f\n",CentZ );

    LOCATE8X8( 3, 10 );
    Printf( "WAY\n" );
    LOCATE8X8( 3, 11 );
    Printf( "X:%-10.4f\n",wayX );
    LOCATE8X8( 3, 12 );
    Printf( "Y:%-10.4f\n",wayY );
    LOCATE8X8( 3, 13 );
    Printf( "Z:%-10.4f\n",wayZ );

    LOCATE8X8( 3, 14 );
    Printf( "CAM ANG\n" );
    LOCATE8X8( 3, 15 );
    Printf( "X:%-10.4f\n",CamXa );
    LOCATE8X8( 3, 16 );
    Printf( "Y:%-10.4f\n",CamYa );
    
    LOCATE8X8( 3, 17 );
    Printf( "Z RANGE\n" );
    LOCATE8X8( 3, 18 );
    Printf( "EZR:%-10.4f\n",CamZrg1 );
    LOCATE8X8( 3, 19 );
    Printf( "WZR:%-10.4f\n",CamZrg2 );

    if( EditPoint == 1 ) {
	COLOR8X8( 0x00,0xff,0x00,0x80 );
    } else {
	COLOR8X8( 0xff,0xff,0xff,0x80 );
    }
    
    LOCATE8X8( 3, 21 );
    Printf( "SPEED:%5.3f\n",tsp );

    if( EditPoint == 2 ) {
	COLOR8X8( 0x00,0xff,0x00,0x80 );
    } else {
	COLOR8X8( 0xff,0xff,0xff,0x80 );
    }

    LOCATE8X8( 3, 23 );
    if( DataCnt == 0 ) {
	Printf( "NOW POINT:-\n" );
    } else {
	Printf( "NOW POINT:%d\n",NowPoint );
    }

    if( EditPoint == 3 ) {
	COLOR8X8( 0x00,0xff,0x00,0x80 );
    } else {
	COLOR8X8( 0xff,0xff,0xff,0x80 );
    }

    LOCATE8X8( 3, 25 );
    Printf( "POINT EDIT\n" );
}

/************************************************************************/
/* カメラ座標データ入力							*/
/************************************************************************/
static void PutCamPos( void )
{
#if 0
    register int i;

    revo_pos_calc3( CentX, CentY, CentZ,
		    &eyeX, &eyeY, &eyeZ, CamZrg1,
		    &wayX, &wayY, &wayZ, CamZrg2,
		    CamXa, CamYa );


    if (Key_T[1].button & CONT_E) {
	EditPoint = EditPoint - 1;
	if( EditPoint < 0 ) {
	    EditPoint = 3;
	}
    }

    if (Key_T[1].button & CONT_D) {
	EditPoint = EditPoint + 1;
	if( EditPoint > 3 ) {
	    EditPoint = 0;
	}
    }

    switch( EditPoint ) {
    case 0:
	MoveCamPos();

	/* 座標データ登録 */
	if (Key_T[1].button & CONT_B) {
	    if( DataCnt < 50 ) {
		DataAdd[DataCnt].ex = eyeX;
		DataAdd[DataCnt].ey = eyeY;
		DataAdd[DataCnt].ez = eyeZ;
		DataAdd[DataCnt].wx = wayX;
		DataAdd[DataCnt].wy = wayY;
		DataAdd[DataCnt].wz = wayZ;

		PointCentData[DataCnt].x = CentX;
		PointCentData[DataCnt].y = CentY;
		PointCentData[DataCnt].z = CentZ;

		PointXaData[DataCnt] = CamXa;
		PointYaData[DataCnt] = CamYa;

		PointZr1Data[DataCnt] = CamZrg1;
		PointZr2Data[DataCnt] = CamZrg2;
		NowPoint++;
		DataCnt++;
	    }
	}
	break;
    case 1:
	if (Key[1].button & CONT_RIGHT) {
	    tsp += 0.001f;
	    if( tsp > 0.999f ) tsp = 0.0f;
	}
	if (Key[1].button & CONT_LEFT) {
	    tsp -= 0.001f;
	    if( tsp < 0.0f ) tsp = 0.001f;
	}
	break;

    case 2:
	if( DataCnt == 0 ) break;

	if (Key_T[1].button & CONT_RIGHT) {
	    NowPoint += 1;
	    if( NowPoint > DataCnt ) NowPoint = DataCnt;
	}
	if (Key_T[1].button & CONT_LEFT) {
	    NowPoint -= 1;
	    if( NowPoint < 1 ) NowPoint = 1;
	}

	if( DataCnt != 0 ) {
	    CentX = PointCentData[NowPoint-1].x;
	    CentY = PointCentData[NowPoint-1].y;
	    CentZ = PointCentData[NowPoint-1].z;
	    
	    CamXa = PointXaData[NowPoint-1];
	    CamYa = PointYaData[NowPoint-1];
	    
	    CamZrg1 = PointZr1Data[NowPoint-1];
	    CamZrg2 = PointZr2Data[NowPoint-1];
	}

	break;

    case 3:
	MoveCamPos();

	if(Key_T[1].button & CONT_B) {
	    DataAdd[NowPoint-1].ex = eyeX;
	    DataAdd[NowPoint-1].ey = eyeY;
	    DataAdd[NowPoint-1].ez = eyeZ;
	    DataAdd[NowPoint-1].wx = wayX;
	    DataAdd[NowPoint-1].wy = wayY;
	    DataAdd[NowPoint-1].wz = wayZ;
	    
	    PointCentData[NowPoint-1].x = CentX;
	    PointCentData[NowPoint-1].y = CentY;
	    PointCentData[NowPoint-1].z = CentZ;
	    
	    PointXaData[NowPoint-1] = CamXa;
	    PointYaData[NowPoint-1] = CamYa;

	    PointZr1Data[NowPoint-1] = CamZrg1;
	    PointZr2Data[NowPoint-1] = CamZrg2;
	}
	break;
    }

    /* 座標データ再生 */
    if( Key_T[1].button & CONT_START ) {
	if( DataCnt >= 5 ) {
	    PointNum = 0;
	    t = 0.0f;
	    mv_sw = ON;
	}
    }
    

#if 0
    /* 座標データClear */
    if(Key_T[1].button & CONT_C) {
	DataCnt = 0;
    }
#endif


    /* 座標データプリント */
    if (Key_T[1].button & CONT_F) {
	PRINTF( "static int DataCnt = %d;\n",DataCnt );
	PRINTF( "static int PointNum = %d;\n",DataCnt );
	PRINTF( "\n" );
	PRINTF( "static cam_t Gfox_Cam_data[50] = {\n" );
	for( i=0; i<DataCnt; i++ ) {
	    PRINTF( "\t{ %ff, %ff, %ff, %ff, %ff, %ff },\n",
		    DataAdd[i].ex,DataAdd[i].ey,DataAdd[i].ez,
		    DataAdd[i].wx,DataAdd[i].wy,DataAdd[i].wz );
	}
	PRINTF( "};\n" );
	PRINTF( "\n" );
	PRINTF( "static xyz_t PointCentData[50] = {\n" );
	for( i=0; i<DataCnt; i++ ) {
	    PRINTF( "\t{ %ff, %ff, %ff },\n",
		    PointCentData[i].x,
		    PointCentData[i].y,
		    PointCentData[i].z );
	}
	PRINTF( "};\n" );
	PRINTF( "\n" );
	PRINTF( "static float PointXaData[50] = {  " );
	for( i=0; i<DataCnt; i++ ) {
	    PRINTF( "%ff, ",PointXaData[i] );
	}
	PRINTF( " };\n" );
	PRINTF( "\n" );
	PRINTF( "static float PointYaData[50] = {  " );
	for( i=0; i<DataCnt; i++ ) {
	    PRINTF( "%ff, ",PointYaData[i] );
	}
	PRINTF( " };\n" );
	PRINTF( "\n" );
	PRINTF( "static float PointZr1Data[50] = {  " );
	for( i=0; i<DataCnt; i++ ) {
	    PRINTF( "%ff, ",PointZr1Data[i] );
	}
	PRINTF( " };\n" );
	PRINTF( "\n" );
	PRINTF( "static float PointZr2Data[50] = {  " );
	for( i=0; i<DataCnt; i++ ) {
	    PRINTF( "%ff, ",PointZr2Data[i] );
	}
	PRINTF( " };\n" );
    }
#endif
}

/************************************************************************/
/* カメラ座標データ入力							*/
/************************************************************************/
static void MoveCamPos( void )
{
    float x,y;

    if (Key[2].button & CONT_UP) {
	CamZrg1 += 1.0f;
    }
    if (Key[2].button & CONT_DOWN) {
	CamZrg1 -= 1.0f;
    }
    if (Key[2].button & CONT_E) {
	CamZrg2 += 1.0f;
    }
    if (Key[2].button & CONT_D) {
	CamZrg2 -= 1.0f;
    }


    if (Key[2].button & CONT_L) {
	CentZ += 1.0f;
    }
    if (Key[2].button & CONT_R) {
	CentZ -= 1.0f;
    }
    if (Key[1].button & CONT_LEFT) {
	CentX -= 1.0f;
    }
    if (Key[1].button & CONT_RIGHT) {
	CentX += 1.0f;
    }
    if (Key[1].button & CONT_UP) {
	CentY += 1.0f;
    }
    if (Key[1].button & CONT_DOWN) {
	CentY -= 1.0f;
    }
    
    x = (float)Key_T[1].stick_x;
    y = (float)Key_T[1].stick_y;
    
    CamYa += x * 0.005f;
    CamXa -= y * 0.005f;
}

/************************************************************************/
/* TEST									*/
/************************************************************************/
static void PlayCamera( void )
{
#if 0
    int stat;
    xyz_t pos[2];

    if( PlayCnt != -1 ) {
	if( PlayCnt == 0 ) stat = 0;
	else if( PlayCnt == 1 ) stat = 1;
	else if( PlayCnt == DataCnt-5 ) stat = 3;
	else if( PlayCnt == DataCnt-4 ) stat = 4;
	else stat = 2;

	get_splin_pos3( pos, &DataAdd[PlayCnt], t, stat );

	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 += tsp;
	if( t > 1.0f ) {
	    t = 0.0f;
	    PlayCnt++;
	    if( PlayCnt > DataCnt-4 ) PlayCnt = -1;
	}
    } else {
	CentX = PointCentData[DataCnt-1].x;
	CentY = PointCentData[DataCnt-1].y;
	CentZ = PointCentData[DataCnt-1].z;
	
	CamXa = PointXaData[DataCnt-1];
	CamYa = PointYaData[DataCnt-1];
	
	CamZrg1 = PointZr1Data[DataCnt-1];
	CamZrg2 = PointZr2Data[DataCnt-1];
	
	mv_sw = OFF;
    }
#endif
}
#endif

/************************************************************************/
/* 									*/
/************************************************************************/
static void PlayData( cam_t *data, int max, float tt )
{
    int stat;
    xyz_t pos[2];

    if( PointNum != -1 ) {
	if(PointNum == 0 ) {
	    stat = 0;
	} else if( PointNum == 1 ) {
	    stat = 1;
	    if( max == 5 ) stat = 4;
	} else if( PointNum == max-5 ) stat = 3;
	else if( PointNum == max-4 ) stat = 4;
	else stat = 2;


	get_splin_pos3( pos, &data[PointNum], t, stat );
	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 > max-4 ) PointNum = -1;
	}
    }
}

/************************************************************************/
/* 3次スプライン曲線近似						*/
/************************************************************************/
static void get_splin_pos3( xyz_t *p, cam_t *dat, float t, int stat )
{
    float b1,b2,b3,b4;

    switch( stat ) {
    case 0:
	/* 最初 */
	b1 = (1.0f-t)*(1.0f-t)*(1.0f-t);
	b2 = 21.0f*(t*t*t)/12.0f-9.0f*(t*t)/2.0f+3.0f*t;
	b3 = -11.0f*(t*t*t)/12.0f+3.0f*(t*t)/2.0f;
	b4 = (t*t*t)/6.0f;
	break;
    case 1:
	/* ２番目 */
	b1 = ((1.0f-t)*(1.0f-t)*(1.0f-t))/4.0f;
	b2 = 7.0f*(t*t*t)/12.0f-5.0f*(t*t)/4.0f+t/4.0f+7.0f/12.0f;
	b3 = -(t*t*t)/2.0f+(t*t)/2.0f+t/2.0f+1.0f/6.0f;
	b4 = (t*t*t)/6.0f;
	break;
    case 2:
	/* ３番目から最後から３番目 */
	b1 = (1.0f-t)*(1.0f-t)*(1.0f-t)/6.0f;
	b2 = (0.5f*t-1.0f)*(t*t)+2.0f/3.0f;
	b3 = ((-t+1.0f)*t+1.0f)*0.5f*t+1.0f/6.0f;
	b4 = (t*t*t)/6.0f;
	break;
    case 3:
	/* 最後から２番目 */
	b1 = ((1.0f-t)*(1.0f-t)*(1.0f-t))/6.0f;
	b2 = -((1.0f-t)*(1.0f-t)*(1.0f-t))/2.0f+
	     ((1.0f-t)*(1.0f-t))/2.0f+(1.0f-t)/2.0f+1.0f/6.0f;
	b3 = 7.0f*((1.0f-t)*(1.0f-t)*(1.0f-t))/12.0f-
	     5.0f*((1.0f-t)*(1.0f-t))/4.0f+
	     (1.0f-t)/4.0f+7.0f/12.0f;
	b4 = (t*t*t)/4.0f;
	break;
    case 4:
	/* 最後 */
	b1 = ((1.0f-t)*(1.0f-t)*(1.0f-t))/6.0f;
	b2 = -11.0f*((1.0f-t)*(1.0f-t)*(1.0f-t))/12.0f+
	     3.0f*((1.0f-t)*(1.0f-t))/2.0f;
	b3 = 21.0f*((1.0f-t)*(1.0f-t)*(1.0f-t))/12.0f-
	     9.0f*((1.0f-t)*(1.0f-t))/2.0f+3.0f*(1.0f-t);
	b4 = t*t*t;
	break;
    }

    p->x = (b1*((dat+0)->ex))+(b2*((dat+1)->ex))+
	   (b3*((dat+2)->ex))+(b4*((dat+3)->ex));
    p->y = (b1*((dat+0)->ey))+(b2*((dat+1)->ey))+
	   (b3*((dat+2)->ey))+(b4*((dat+3)->ey));
    p->z = (b1*((dat+0)->ez))+(b2*((dat+1)->ez))+
	   (b3*((dat+2)->ez))+(b4*((dat+3)->ez));

    (p+1)->x = (b1*((dat+0)->wx))+(b2*((dat+1)->wx))+
	       (b3*((dat+2)->wx))+(b4*((dat+3)->wx));
    (p+1)->y = (b1*((dat+0)->wy))+(b2*((dat+1)->wy))+
	       (b3*((dat+2)->wy))+(b4*((dat+3)->wy));
    (p+1)->z = (b1*((dat+0)->wz))+(b2*((dat+1)->wz))+
	       (b3*((dat+2)->wz))+(b4*((dat+3)->wz));
}


#if 0
/************************************************************************/
/* 2次スプライン曲線近似						*/
/************************************************************************/
static void get_splin_pos( xyz_t *p, xyz_t *dat, 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*((dat+0)->x))+(b2*((dat+1)->x))+(b3*((dat+2)->x));
    p->y = (b1*((dat+0)->y))+(b2*((dat+1)->y))+(b3*((dat+2)->y));
    p->z = (b1*((dat+0)->z))+(b2*((dat+1)->z))+(b3*((dat+2)->z));
}

/************************************************************************/
/* 2次スプライン曲線近似 2						*/
/************************************************************************/
static void get_splin_pos2( xyz_t *p, cam_t *dat, 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*((dat+0)->ex))+(b2*((dat+1)->ex))+(b3*((dat+2)->ex));
    p->y = (b1*((dat+0)->ey))+(b2*((dat+1)->ey))+(b3*((dat+2)->ey));
    p->z = (b1*((dat+0)->ez))+(b2*((dat+1)->ez))+(b3*((dat+2)->ez));

    (p+1)->x = (b1*((dat+0)->wx))+(b2*((dat+1)->wx))+(b3*((dat+2)->wx));
    (p+1)->y = (b1*((dat+0)->wy))+(b2*((dat+1)->wy))+(b3*((dat+2)->wy));
    (p+1)->z = (b1*((dat+0)->wz))+(b2*((dat+1)->wz))+(b3*((dat+2)->wz));
}
#endif









/************************************************************************/
/* アーウィンの描画							*/
/************************************************************************/
static void awins_display( int i )
{
    A_WING_STAT wing;
    
    light_in( (int)lightX, (int)lightY, (int)lightZ,
	      ligR, ligG, ligB,
	      kanR, kanG, kanB );

    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );

    push_now();
    translate_now( awt[i].pos.x, awt[i].pos.y, awt[i].pos.z, MULT_MTX);

    scale_now( awt[i].scale, awt[i].scale, awt[i].scale, MULT_MTX);

    rotateZ_now( ANGLE(awt[i].Zang), MULT_MTX );
    rotateX_now( ANGLE(awt[i].Xang), MULT_MTX );
    rotateY_now( ANGLE(awt[i].Yang), 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 = awt[i].twinbmY;
    wing.kao = awt[i].kao;
    wing.kao_XA  = awt[i].kaoXa;
    wing.kao_YA  = awt[i].kaoYa;
    wing.canopi_XA = awt[i].cang;
    
    A_Display(&wing);

    sound_pos_set_M( awt[i].SndPos );

    if( awt[i].bfire2_f ) awinFire2_display( i );
    if( awt[i].bfire_f ) awinFire_display( i );
    if( awt[i].kage_f )  awinKage_display( i );

    pull_now();
}


/************************************************************************/
/* アーウィンのバックファイアの描画					*/
/************************************************************************/
static void awinFire_display( int i )
{
    float f,eax,eay,ya;
    float zz,ss;

    rcpsetmode( &NOW_DISP, TEXE_Z_A_BLEND_PRIMA );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 255, 255, 255, 0xff);

    if( awt[i].bfire2_f == ON ) {
	zz = -30.0f;
	ss = 0.02f;
	gDPSetEnvColor(NEXT_DISP, 0x80, 0x80, 0xff, 0xff);
    } else {
	zz = -65.0f;
	ss = 0.2f;
	gDPSetEnvColor(NEXT_DISP, 0x00, 0x00, 0xff, 0xff);
    }

    f = awt[i].bfire_scl;
    if(frcnt & 1)
	f += ss;

    push_now();

    translate_now( 0.0f, 0.0f, zz, MULT_MTX );
    scale_now( f, f*0.7f, f, MULT_MTX );

    rotateZ_now(ANGLE(-awt[i].Zang), MULT_MTX);
    rotateX_now(ANGLE(-awt[i].Xang), MULT_MTX);
    rotateY_now(ANGLE(-awt[i].Yang), MULT_MTX);

    eay = -fatan3( (eyeX-awt[i].pos.x),(eyeZ-awt[i].pos.z) );
    ya = sqrtf( (eyeZ-awt[i].pos.z)*(eyeZ-awt[i].pos.z)
		+(eyeX-awt[i].pos.x)*(eyeX-awt[i].pos.x) );
    eax = fatan3((eyeY-awt[i].pos.y), ya);
    
    rotateY_now(( -eay ), MULT_MTX);
    rotateX_now(( -eax ), MULT_MTX);
    
    /**nowtoMtx(NOW_MTX);
    gSPMatrix(NEXT_DISP, NEXT_MTX,
	      G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH);**/

    set_matrix(&NOW_DISP);

    gSPClearGeometryMode(NEXT_DISP, G_CULL_BACK);
    gSPDisplayList(NEXT_DISP, DEMO_Ball);
    gSPSetGeometryMode(NEXT_DISP, G_CULL_BACK);

    /*gSPPopMatrix(NEXT_DISP, G_MTX_MODELVIEW);*/
    pull_now();
}

/************************************************************************/
/* アーウィンのエンジン後部に集まる光の粒子の描画			*/
/************************************************************************/
static void awinFire2_display( int i )
{
    register int j;
    float eax,eay,ya;

    for( j=0; j<RyushiCnt; j++ ) {
	switch( RyushiMaxSw[j] ) {
	case OFF:
	    add_calc( &RyushiScl[j],RyushiScl2[j],
		      0.05f, 100.0f, 0.01f );
	    if( RyushiScl[j] >= RyushiScl2[j] ) {
		RyushiScl[j] = RyushiScl2[j];
		RyushiMaxSw[j] = ON;
	    }
	    break;
	case ON:
	    add_calc( &RyushiXp[j],  0.0f, RyushiSpd[j], 100.0f, 0.01f );
	    add_calc( &RyushiYp[j],  0.0f, RyushiSpd[j], 100.0f, 0.01f );
	    add_calc( &RyushiZp[j],-25.0f, RyushiSpd[j], 100.0f, 0.01f );
	    RyushiScl[j] -= 0.002f;
	    if( RyushiScl[j] < 0.0f ) {
		RyushiScl[j] = 0.0f;
		RyushiMaxSw[j] = End;
	    }
	    break;
	case End:
//	    RyushiXp[j] = 13.0f + -(rnd()*22.0f);
//	    RyushiYp[j] = 5.0f + -(rnd()*10.0f);
	    RyushiXp[j] = 10.0f + -(rnd()*20.0f);
	    RyushiYp[j] = 3.0f + -(rnd()*7.0f);
//	    RyushiZp[j] = -20.0f + -(rnd()*15.0f);
	    RyushiZp[j] = -30.0f + -(rnd()*15.0f);
	    RyushiScl[j] = 0.0f;
	    RyushiScl2[j] = (rnd()*0.02f);
	    RyushiSpd[j] = 0.02f + (rnd()*0.08f);
	    RyushiMaxSw[j] = OFF;
	    break;
	}
    }

    eay = -fatan3( (eyeX-awt[i].pos.x),(eyeZ-awt[i].pos.z) );
    ya = sqrtf( (eyeZ-awt[i].pos.z)*(eyeZ-awt[i].pos.z)
		+(eyeX-awt[i].pos.x)*(eyeX-awt[i].pos.x) );
    eax = fatan3((eyeY-awt[i].pos.y), ya);



    rcpsetmode( &NOW_DISP, TEXT_Z_A_BLEND_PRIMA );
//    texture_z_a_blend_prima();
    gDPSetPrimColor(NEXT_DISP, 0, 0, 253, 253, 255, 0xff);
    gDPSetEnvColor(NEXT_DISP, 251, 251, 255, 0xff);
	
    for( j=0; j<RyushiCnt; j++ ) {
	if( RyushiScl[j] == 0.0f ) continue;
	push_now();
	
	translate_now( RyushiXp[j],
		       RyushiYp[j],
		       RyushiZp[j], MULT_MTX );
	scale_now( RyushiScl[j],
		   RyushiScl[j],
		   RyushiScl[j], MULT_MTX );
	
	rotateZ_now(ANGLE(-awt[i].Zang), MULT_MTX);
	rotateX_now(ANGLE(-awt[i].Xang), MULT_MTX);
	rotateY_now(ANGLE(-awt[i].Yang), MULT_MTX);
	
	rotateY_now(( -eay ), MULT_MTX);
	rotateX_now(( -eax ), MULT_MTX);
	
	set_matrix(&NOW_DISP);
	
//	gSPClearGeometryMode(NEXT_DISP, G_CULL_BACK);
	gSPDisplayList(NEXT_DISP, DEMO_Ball);
//	gSPSetGeometryMode(NEXT_DISP, G_CULL_BACK);
	
	pull_now();
    }

#if 0
    if( Key[1].button & CONT_UP ) {
	RyushiYp[0] += 1.0f;
    }
    if( Key[1].button & CONT_DOWN ) {
	RyushiYp[0] -= 1.0f;
    }
    if( Key[1].button & CONT_RIGHT ) {
	RyushiXp[0] += 1.0f;
    }
    if( Key[1].button & CONT_LEFT ) {
	RyushiXp[0] -= 1.0f;
    }
    if( Key[1].button & CONT_L ) {
	RyushiZp[0] += 1.0f;
    }
    if( Key[1].button & CONT_R ) {
	RyushiZp[0] -= 1.0f;
    }
    if( Key_T[1].button & CONT_E ) {
	RyushiScl[0] += 0.01f;
    }
    if( Key_T[1].button & CONT_D ) {
	RyushiScl[0] -= 0.01f;
    }

    PRINTF( "x:%f y:%f z:%f sc:%f\n",
	    RyushiXp[0],RyushiYp[0],RyushiZp[0],RyushiScl[0] );
#endif
}

/************************************************************************/
/* アーウィンの影の描画							*/
/************************************************************************/
static void awinKage_display( int i )
{
    push_now();

    translate_now( 0.0f,
		   (kageY-(awt[i].pos.y*2.05f))+((hkoY-84.0f)*1.99f),
		   0.0f, MULT_MTX );
    scale_now( 1.0f, 1.0f, 1.0f, MULT_MTX );

    rotateY_now(ANGLE(180.0f), MULT_MTX);

    set_matrix(&NOW_DISP);

    texture_z_a_prim();
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xf0 );

    gSPDisplayList(NEXT_DISP, DEMO_A_kage );
    
    pull_now();
}

/************************************************************************/
/* コーネリアの描画							*/
/************************************************************************/
static void CN_display( float Zrange )
{
    float xa,ya;

    get_cam_ang( &xa, &ya );

    rcpsetmode( &NOW_DISP, TEXE_Z );

    if( Zrange != 0.0f ) {
	cn.pos.z = eyeZ - Zrange;
    }
    
    push_now();
    
    translate_now( cn.pos.x, cn.pos.y, cn.pos.z, MULT_MTX);

    rotateY_now( ANGLE(ya), MULT_MTX );
    rotateX_now( ANGLE(xa), MULT_MTX );

    scale_now( cn.scale, cn.scale, cn.scale, MULT_MTX);
    
    set_matrix(&NOW_DISP);

    gSPDisplayList( NEXT_DISP, DEMO_Planet );

    bakuhatu_display();

    pull_now();
}
    

/************************************************************************/
/* グレートフォックス号の描画						*/
/************************************************************************/
static void gfox_display( void )
{
//    register int i;

    light_in( (int)lightX, (int)lightY, (int)lightZ,
	      ligR, ligG, ligB,
	      kanR, kanG, kanB );

    push_now();
    
    translate_now( gfox.pos.x, gfox.pos.y, gfox.pos.z, MULT_MTX );

    rotateZ_now( ANGLE(gfox.Zang), MULT_MTX );
    rotateX_now( ANGLE(gfox.Xang), MULT_MTX );
    rotateY_now( ANGLE(gfox.Yang), MULT_MTX );

    scale_now( gfox.scale, gfox.scale, gfox.scale, MULT_MTX);
    
    set_matrix(&NOW_DISP);

    rcpsetmode(&NOW_DISP, TEXT_Z_LIGHT);
    Gfox_Life = 1;
    great_fox_display();
/*    
    texture_z_a_light();
    gSPDisplayList( NEXT_DISP, GF_Greatfox );
    */
    sound_pos_set_M( gfox.SndPos );
#if 0
    if( frcnt & 0x20) {
	if( !(frcnt & 0x18) ) {
	    ls_scl += 0.1f;
	    if( ls_scl > 0.6f ) {
		ls_scl = 0.6f;
	    }
	} else {
	    ls_scl -= 0.3f;
	    if( ls_scl < 0.0f ) {
		ls_scl = 0.0f;
	    }
 	}
    } else {
	ls_scl = 0.0f;
    }

    for( i=0; i<11; i++ )
	gfoxLightSign_display( i );

    for( i=0; i<3; i++ ) {
	gfoxFire_display( i );
    }
#endif
    pull_now();
}
#if 0
/************************************************************************/
/* グレートフォックス号のバックファイアの描画				*/
/************************************************************************/
static void gfoxFire_display( int p )
{
    static xyz_t BfPos[3] = {
	{    0.0f,  80.0f, -2450.0f },
	{  350.0f, -92.0f, -1380.0f },
	{ -350.0f, -92.0f, -1380.0f },
    };
    static float BfScl[3] = { 6.0f, 4.0f, 4.0f };
    
    float f,eax,eay,ya;
    
    f = BfScl[p];
    if(frcnt & 1)
	f += 0.8f;

    rcpsetmode( &NOW_DISP, TEXT_Z_A_BLEND_PRIMA );
//    texture_z_a_blend_prima(); /*texture_z_a_blend();*/
    gDPSetAlphaDither(NEXT_DISP, G_AD_NOISE);
    gDPSetColorDither(NEXT_DISP, G_CD_NOISE);
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xc0, 64 );
    gDPSetEnvColor( NEXT_DISP, 0xff, 0xff, 0x00, 38 );
    
    push_now();
	     
    translate_now( BfPos[p].x, BfPos[p].y, BfPos[p].z, MULT_MTX );
    if( p == 0 ) 
	scale_now( f, f, f, MULT_MTX );
    else
	scale_now( f, f+2.0f, f, MULT_MTX );
    
    rotateZ_now(ANGLE(-gfox.Zang), MULT_MTX);
    rotateX_now(ANGLE(-gfox.Xang), MULT_MTX);
    rotateY_now(ANGLE(-gfox.Yang), MULT_MTX);

    eay = -fatan3( (eyeX-gfox.pos.x),(eyeZ-gfox.pos.z) );
    ya = sqrtf( (eyeZ-gfox.pos.z)*(eyeZ-gfox.pos.z)
		+(eyeX-gfox.pos.x)*(eyeX-gfox.pos.x) );
    eax = fatan3((eyeY-gfox.pos.y), ya);
    
    rotateY_now(( -eay ), MULT_MTX);
    rotateX_now(( -eax ), MULT_MTX);

    set_matrix(&NOW_DISP);
    gSPClearGeometryMode(NEXT_DISP, G_CULL_BACK);

    gSPDisplayList(NEXT_DISP, DEMO_Ball);
    gSPSetGeometryMode(NEXT_DISP, G_CULL_BACK);

    pull_now();
}

/************************************************************************/
/* グレートフォックス号のライトサインの描画				*/
/************************************************************************/
static void gfoxLightSign_display( int p )
{
    float xa,ya;
    static xyz_t ls_pos[] = {
//    	{     0.0f, 700.0f,   60.0f },
    	{     0.0f, 210.0f, 1700.0f },
    	{ -1370.0f, 480.0f, -380.0f },
    	{  1370.0f,-700.0f, -380.0f },
    	{  1370.0f, 480.0f, -380.0f },
    	{ -1370.0f,-700.0f, -380.0f },

        {     0.0f,-610.0f,   70.0f },
        {   110.0f,-455.0f,  130.0f },
        {  -110.0f,-455.0f,  130.0f },

        {     0.0f, 580.0f,  -980.0f },
        {     0.0f, 750.0f, -1030.0f },
        {     0.0f,1040.0f, -1440.0f },
    };

    get_cam_ang( &xa, &ya );

    rcpsetmode( &NOW_DISP, TEXT_Z_A_BLEND_PRIMA );
//    texture_z_a_blend_prima(); /*texture_z_a_blend();*/
    gDPSetPrimColor(NEXT_DISP, 0, 0, 255, 255, 255, 0xff);
    gDPSetEnvColor(NEXT_DISP, 0xff, 0xff, 0xff, 0x80);
    
    push_now();

    translate_now( ls_pos[p].x,ls_pos[p].y,ls_pos[p].z, MULT_MTX);

    rotateY_now( ANGLE(ya), MULT_MTX );
    rotateX_now( ANGLE(xa), MULT_MTX );
    
    scale_now( ls_scl, ls_scl, ls_scl, MULT_MTX);

    set_matrix(&NOW_DISP);

    gSPClearGeometryMode(NEXT_DISP, G_CULL_BACK);

    gSPDisplayList(NEXT_DISP, DEMO_Ball);
    gSPSetGeometryMode(NEXT_DISP, G_CULL_BACK);

    pull_now();
}
#endif
/************************************************************************/
/* 爆発の描画								*/
/************************************************************************/
static void bakuhatu_display( void )
{
    register int i;
    float scl;

    for( i=0; i<BakuCnt; i++ ) {
	switch( BakuMaxSw[i] ) {
	case OFF:
	    BakuScl[i] += 0.15f;
	    if( BakuScl[i] >= BakuScl2[i] ) {
		BakuScl[i] = BakuScl2[i];
		BakuMaxSw[i] = Wait;
	    }
	    break;
	case Wait:
	    BakuWait[i]--;
	    if( BakuWait[i] <= 0 )
		BakuMaxSw[i] = ON;
	    break;
	case ON:
	    BakuA1[i] -= 0x10;
	    if( BakuA1[i] < 0x00 ) BakuA1[i] = 0;
	    BakuA2[i] -= 0x10;
	    if( BakuA2[i] < 0x00 ) BakuA2[i] = 0;
	    if( BakuA1[i] == 0 && BakuA2[i]== 0 )
		BakuMaxSw[i] = End;
	    break;
	case End:
	    BakuZr[i] = 10.0f + (rnd()*10.0f);
	    BakuZa[i] = -10.0f+(rnd() * -60.0f);
	    BakuScl[i] = 0.0f;
	    BakuScl2[i] = 0.1f+(rnd()*0.3f);
	    BakuWait[i] = 5+(int)(rnd()*5.0f);
	    BakuA1[i] = 0xff;
	    BakuA2[i] = 0x80;
	    BakuMaxSw[i] = OFF;
	    break;
	}
    }

    rcpsetmode( &NOW_DISP, TEXT_Z_A_BLEND_PRIMA );

    for( i=0; i<BakuCnt; i++ ) {
	gDPSetPrimColor( NEXT_DISP, 0, 0, 255, 200, 200, BakuA1[i] );
	gDPSetEnvColor( NEXT_DISP, 0xff, 0x00, 0x00, BakuA2[i] );

	scl = BakuScl[i]/cn.scale;
	push_now();
	translate_now( 0.0f, 0.0f, 5.0f, MULT_MTX );
	rotateZ_now( ANGLE(BakuZa[i]), MULT_MTX );
	translate_now( 0.0f, BakuZr[i], 0.0f, MULT_MTX );
	scale_now( scl, scl, scl, MULT_MTX);
	set_matrix(&NOW_DISP);
	gSPDisplayList(NEXT_DISP, DEMO_Ball);
	pull_now();
    }

#if 0
    if( Key_T[3].button & CONT_UP ) {
	BakuYp[0] += 10.0f;
    }
    if( Key_T[3].button & CONT_DOWN ) {
	BakuYp[0] -= 10.0f;
    }
    if( Key_T[3].button & CONT_RIGHT ) {
	BakuXp[0] -= 10.0f;
    }
    if( Key_T[3].button & CONT_LEFT ) {
	BakuXp[0] += 10.0f;
    }
    if( Key_T[3].button & CONT_E ) {
	BakuScl[0] += 0.1f;
    }
    if( Key_T[3].button & CONT_D ) {
	BakuScl[0] -= 0.1f;
    }

    PRINTF( "x:%f y:%f sc:%f\n", BakuXp[0], BakuYp[0], BakuScl[0] );
#endif
}

/************************************************************************/
/* 走るフォックスチームの描画						*/
/************************************************************************/
static void foxteam_run_display( int i )
{
    xyz_t dt[50];
    int anm_f;
    float work;

    light_in( (int)lightX, (int)lightY, (int)lightZ,
	      ligR, ligG, ligB,
	      kanR, kanG, kanB );

    anm_f = foxt[i].anmcnt % anime_frame(fox_t[i].anim);
    
//    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT_FOG );
    texture_z_light_fog( fogR, fogG, fogB, 0xff, 995, 1000 );

    push_now();

    translate_now( foxt[i].Pos.x,
		   foxt[i].Pos.y,
		   foxt[i].Pos.z+FoxTmZoff, MULT_MTX );

    scale_now( foxtm_scl, foxtm_scl, foxtm_scl, MULT_MTX);

    set_matrix(&NOW_DISP);

    if( i == 2 ) gSPClearGeometryMode(NEXT_DISP, G_CULL_BACK);
    si_get(fox_t[i].anim, anm_f, dt);
    si_draw_T(fox_t[i].list, dt, NULL, NULL, NULL);
    if( i == 2 ) gSPSetGeometryMode(NEXT_DISP, G_CULL_BACK);

    if( i == 0 ) {
	sound_pos_set_M( FoxSndPos );
    }
    pull_now();


    push_now();
    translate_now( foxt[i].Pos.x-5.0f,
		   5.0f,
		   foxt[i].Pos.z+10.0f+FoxTmZoff, MULT_MTX );
    scale_now( foxt[i].KageScl, foxt[i].KageScl, foxt[i].KageScl, MULT_MTX);

    set_matrix(&NOW_DISP);

    texture_z_a_prim();
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0x80 );
    gSPDisplayList( NEXT_DISP, DEMO_Kage );

    pull_now();

    work = sinf(ANGLE((float)anm_f*12)) * 15.0f;
    if( work >= 0 ) {
	foxt[i].Jpos = work;
    } else if( work > -2.0f ) {
	foxt[i].Jpos = -work;
    } else {
	foxt[i].Jpos = 0.0f;
    }
    foxt[i].KageScl = 3.0f-foxt[i].Jpos/100.0f;
}

/************************************************************************/
/* 走ってないフォックスチームの描画					*/
/************************************************************************/
static void foxteam_display( int i )
{
    xyz_t dt[50];
    int anm_f,c;

    anm_f = foxt[i].anmcnt % anime_frame(fox_t[i].no_anim);

    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );

    light_in( (int)lightX, (int)lightY, (int)lightZ,
	      ligR, ligG, ligB,
	      kanR, kanG, kanB );

    push_now();

    rotateX_now(ANGLE(foxt[i].MyXa), MULT_MTX);
    rotateY_now(ANGLE(foxt[i].MyYa), MULT_MTX);
    rotateZ_now(ANGLE(foxt[i].MyZa), MULT_MTX);

    translate_now( foxt[i].Pos.x,
		   foxt[i].Pos.y,
		   foxt[i].Pos.z,
		   MULT_MTX );

    scale_now( foxtm_scl, foxtm_scl, foxtm_scl, MULT_MTX);

    set_matrix(&NOW_DISP);

    c = si_get( fox_t[i].no_anim, anm_f, dt );
    anime_calc(dt, dt2[i], 1, c, 0.2f, 100.0f, 0.0001f);
    si_draw( fox_t[i].list, dt2[i], &parts_check, NULL, &i);

    pull_now();
}

/************************************************************************/
/* 人間 部品別表示制御							*/
/************************************************************************/
static int parts_check(
    int		no,
    Gfx		**d,
    xyz_t	*t,
    xyz_t	*r,
    void 	*i
)
{
    float x,y,z;
    int p;

    (void)d;
    (void)t;
    p = *(int *)i;

    if( NoStick_time < MAX_NOSTICK_TIME && stick_sw ) {
	x = title64Xp-foxt[p].Pos.x;
	y = title64Yp-(foxt[p].Pos.y+foxt[p].kaoYpos);
	z = title64Zp-foxt[p].Pos.z;

	foxt[p].kaoXa = fatan3( x,sqrtf((y*y)+(z*z)) ) * (180.0f/F_PI);
	foxt[p].kaoYa = fatan3( y,z ) * (180.0f/F_PI);

	foxt[p].koshiXa = foxt[p].kaoXa;
	foxt[p].koshiYa = foxt[p].kaoYa;

	if( foxt[p].kaoXa < -45.0f ) {
	    foxt[p].kaoXa = -45.0f;
	} else if( foxt[p].kaoXa > 45.0f ) {
	    foxt[p].kaoXa = 45.0f;
	}
	if( foxt[p].kaoYa < -40.0f ) {
	    foxt[p].kaoYa = -40.0f;
	} else if( foxt[p].kaoYa > 55.0f ) {
	    foxt[p].kaoYa = 55.0f;
	}


	if( foxt[p].koshiXa < -20.0f ) {
	    foxt[p].koshiXa = foxt[p].koshiXa - (-20.0f);
	    if( foxt[p].koshiXa < -20.0f ) {
		foxt[p].koshiXa = -20.0f;
	    }
	} else if( foxt[p].koshiXa > 20.0f ) {
	    foxt[p].koshiXa = foxt[p].koshiXa - 20.0f;
	    if( foxt[p].koshiXa > 20.0f ) {
		foxt[p].koshiXa = 20.0f;
	    }
	} else {
	    foxt[p].koshiXa = 0.0f;
	}
	if( foxt[p].koshiYa < -35.0f ) {
	    foxt[p].koshiYa = foxt[p].koshiYa - (-35.0f);
	    if( foxt[p].koshiYa < -10.0f ) {
		foxt[p].koshiYa = -10.0f;
	    }
	} else if( foxt[p].koshiYa > 40.0f ) {
	    foxt[p].koshiYa = foxt[p].koshiYa - 40.0f;
	    if( foxt[p].koshiYa > 10.0f ) {
		foxt[p].koshiYa = 10.0f;
	    }
	} else {
	    foxt[p].koshiYa = 0.0f;
	}

	add_calc( &foxt[p].Xa, foxt[p].kaoXa, 0.01f, 100.0f, 0.0001f );
	add_calc( &foxt[p].Ya, foxt[p].kaoYa, 0.01f, 100.0f, 0.0001f );

	add_calc( &foxt[p].ksXa, foxt[p].koshiXa, 0.005f, 100.0f, 0.0001f );
	add_calc( &foxt[p].ksYa, foxt[p].koshiYa, 0.005f, 100.0f, 0.0001f );
    }

    switch( p ) {
    case 0:	/* Fox */
	if( no == 1 ) { /* あご */
	    r->z += foxt[p].agoZa;
	}
	if( no == 19 ) { /* 頭 */
	    r->x += foxt[p].Xa;
	    r->y += foxt[p].Ya;
	}
	if( no == 20 ) { /* 腰 */
	    r->x += foxt[p].ksXa;
	    r->y += foxt[p].ksYa;
	}
	break;
    case 1:	/* Falco */
	if( no == 1 ) { /* あご */
	    r->z += foxt[p].agoZa;
	}
	if( no == 11 ) { /* 足 */
	    r->z += foxt[p].ashiYa;
	}
	if( no == 19 ) { /* 頭 */
	    r->x += foxt[p].Xa;
	    r->y += foxt[p].Ya;
	}
	if( no == 20 ) { /* 腰 */
	    r->x += foxt[p].ksXa;
	    r->y += foxt[p].ksYa;
	}
	if( no == 21 ) { /* 全体 */
	    r->x += -5.0f;
	}
	break;
    case 2:	/* Peppey */
	if( no == 1 ) { /* あご */
	    r->z += foxt[p].agoZa;
	}
	if( no == 19 ) { /* 頭 */
	    r->x += foxt[p].Xa;
	    r->y += foxt[p].Ya;
	}
	if( no == 20 ) { /* 腰 */
	    r->x += foxt[p].ksXa;
	    r->y += foxt[p].ksYa;
	}
	if( no == 21 ) { /* 全体 */
	    r->x += 10.0f;
	}
	break;
    case 3:	/* Slippey */
	if( no == 1 ) { /* あご */
	    r->z += foxt[p].agoZa;
	}
	if( no == 17 ) { /* 頭 */
	    r->x += foxt[p].Xa;
	    r->y += foxt[p].Ya;
	}
	if( no == 18 ) { /* 腰 */
	    r->x += foxt[p].ksXa;
	    r->y += foxt[p].ksYa;
	}
	if( no == 19 ) { /* 全体 */
	    r->x += 4.0f;
	}
	break;
    }
    

#if 0
    if( partsNo == no ) {
	r->x += (float)frcnt * 3.0f;
    }
#endif

    return 0;
}

/************************************************************************/
/* 通路の描画								*/
/************************************************************************/
static void turo_display( void )
{
    float offset;

    light_in( 0, 0, 0, 0, 0, 0, kanR, kanG, kanB );

    if( eyeZ > wayZ ) offset = 1.0f;
    else              offset = 3.0f;
    
    scroll_sp += 70.0f;
    scroll_sp = fmodf( scroll_sp,(5132.0f+1704.0f)*0.6f );

//    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT_FOG );
    texture_z_light_fog( fogR, fogG, fogB, 0xff, 995, 1000 );

    push_now();
//    translate_now( 0.0f, 0.0f, ((5132.0f*0.6f)*offset)-scroll_sp, MULT_MTX);
    translate_now( 0.0f, 0.0f, ((5132.0f*0.6f)*offset)-scroll_sp, MULT_MTX);

    scale_now( 0.6f, 0.6f, 0.6f, MULT_MTX);
    
    set_matrix(&NOW_DISP);

    gSPDisplayList( NEXT_DISP, DEMO_Tuuro );

    
    translate_now( 0.0f, 0.0f, -5132.0f-1704.0f, MULT_MTX);

    set_matrix(&NOW_DISP);


    gSPDisplayList( NEXT_DISP, DEMO_Tuuro );

    translate_now( 0.0f, 0.0f, -5132.0f-1704.0f, MULT_MTX);

    set_matrix(&NOW_DISP);

    
    gSPDisplayList( NEXT_DISP, DEMO_Tuuro );
    pull_now();
}

/************************************************************************/
/* タイトルロゴの描画							*/
/************************************************************************/
static void title_rogo_display( void )
{
    register int i;

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff);

    for( i=0; i<61; i++ ) {
	texture_rectangleRGBA16( &NOW_DISP, DEMO_Rogo_txt+(252*i),
				 252, 1, titleXp,titleYp+(i*1.0f),
				 1.0f, 1.0f );
    }
}

/************************************************************************/
/* "６４" ロゴの描画							*/
/************************************************************************/
static void rogo_64_display( void )
{
    rcpsetmode( &NOW_DISP, TEXE_Z );

    push_now();

    translate_now( title64Xp, title64Yp, title64Zp, MULT_MTX );
    scale_now( title64Xs, title64Ys, 1.0f, MULT_MTX );

    rotateX_now( ANGLE(90.0f), MULT_MTX );

    set_matrix(&NOW_DISP);

    gSPDisplayList(NEXT_DISP, DEMO_64);

    pull_now();
}

/************************************************************************/
/* "スターフォックス６４"ロゴの描画					*/
/************************************************************************/
static void rogo_SF_display( void )
{
    float Xp,Yp,Xp64,Yp64;

    Xp = 48.0f;
    Yp = 27.0f;
    Xp64 = 155.0f;
    Yp64 = 22.0f;

    rcpsetmode( &NOW_DISP, RECE_RGBA_A_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff);

    texture_rectangleCI4( &NOW_DISP,
			  DEMO_mess04_txt,
			  DEMO_mess04_txttlut,
			  128, 12, Xp, Yp, 1.0f, 1.0f );

    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xf0, 0x00, 0x00, 0xff);

    texture_rectangleCI4( &NOW_DISP,
			  DEMO_mess04b_txt,
			  DEMO_mess04b_txttlut,
			  64, 17, Xp64, Yp64, 1.0f, 1.0f );
}

/************************************************************************/
/* "ＴＭ"ロゴの描画							*/
/************************************************************************/
static void rogo_TM_display( void )
{
    float Xp,Yp;
    
    Xp = 261.0f;
    Yp = 30.0f;

    rcpsetmode( &NOW_DISP, RECE_RGBA_A_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff);

    texture_rectangleCI4( &NOW_DISP,
			  DEMO_mess03_txt,
			  DEMO_mess03_txttlut,
			  32, 10, Xp, Yp, 1.0f, 1.0f );
}

/************************************************************************/
/* "プッシュ スタート"の描画						*/
/* ただし、コントローラが１つもささっていない場合は,			*/
/* " 電源を切ってコントローラをさしてさしこんでください"に変わる	*/
/************************************************************************/
static void rogo_ST_display( void )
{
    float Xp,Yp;
    register int i;
    int ret;
    static float Xpp=68.0f,Ypp=170.0f,Xss=5.55f,Yss=0.9f,Xx=70.0f,Yy=172.0f;

    if( Key_wait_time != 0 ) return;
    
    Xp = 101.0f;
    Yp = 188.0f;

    ret = add_calc( &ChgColor, SelColor, 0.5f, 100.0f, 1.0f );
    if( ret==0.0f ) {
	if(ChgColor==32.0f ) SelColor = 255.0f;
	else		     SelColor = 32.0f;
    }
	

    if( cont_num < 0 ) {
	/* 電源を切ってコントローラをさしてさしこんでください */
	rcpsetmode( &NOW_DISP, RECE_RGBA_A_PRIM );
	gDPSetPrimColor( NEXT_DISP, 0, 0, 60, 60, 255, 200 );
	texture_rectangleCI8( &NOW_DISP, DEMO_mess_txt,DEMO_mess_txttlut,
				 32, 32,
				 Xpp,Ypp,
				 Xss, Yss );
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff,
			    (int)ChgColor, (int)ChgColor, 0xff);
	for( i=0; i<6; i++ ) {
	    texture_rectangleIA8( &NOW_DISP, DEMO_irete_txt+(176*4*i),
				  176, 4, Xx, Yy+(4.0f*i), 1.0f, 1.0f );
	}
    } else {
	/* プッシュ スタート */
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff,
			(int)ChgColor, (int)ChgColor, 0xff);
	for( i=0; i<2; i++ ) {
	    texture_rectangleIA8( &NOW_DISP, DEMO_mess01_txt + ((120*6*i)/2),
				  120, 6, Xp, Yp+(6.0f*i*1.0f), 1.0f, 1.0f );
	}
	texture_rectangleIA8( &NOW_DISP, DEMO_mess01_txt + ((120*12)/2),
			      120, 1, Xp, Yp+(12*1.0f), 1.0f, 1.0f );
	
    }

#if 0
    if( cont_num < 0 ) {
	if( Key[2].button & CONT_UP ) {
	    Yy += 1.0f;
	}
	if( Key[2].button & CONT_DOWN ) {
	    Yy -= 1.0f;
	}
	if( Key[2].button & CONT_LEFT ) {
	    Xx -= 1.0f;
	}
	if( Key[2].button & CONT_RIGHT ) {
	    Xx += 1.0f;
	}
	
	if( Key[3].button & CONT_UP ) {
	    Ypp += 1.0f;
	}
	if( Key[3].button & CONT_DOWN ) {
	    Ypp -= 1.0f;
	}
	if( Key[3].button & CONT_LEFT ) {
	    Xpp -= 1.0f;
	}
	if( Key[3].button & CONT_RIGHT ) {
	    Xpp += 1.0f;
	}
	
	if( Key[3].button & CONT_E ) {
	    Yss += 0.1f;
	}
	if( Key[3].button & CONT_D ) {
	    Yss -= 0.1f;
	}
	if( Key[3].button & CONT_C ) {
	    Xss -= 0.1f;
	}
	if( Key[3].button & CONT_F ) {
	    Xss += 0.1f;
	}
	
	PRINTF( "mx:%f my:%f xx:%f yy:%f xs:%f ys:%f\n",
		Xpp,Ypp,Xx,Yy,Xss,Yss );
    }
#endif
}

/************************************************************************/
/* "Nintendo"ロゴの描画							*/
/************************************************************************/
static void rogo_NI_display( void )
{
    float Xp=102.0f,Yp=209.0f;
    register int i;

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff);

    for( i=0; i<2; i++ ) {
	texture_rectangleIA8( &NOW_DISP, DEMO_1997_txt + (120 * 6 * i),
			       120, 6, Xp, Yp+(6.0f*i), 1.0f, 1.0f );
    }

#if 0
    if ( Key[3].button & CONT_RIGHT ) {
	Xp += 1.0f;
    }
    if ( Key[3].button & CONT_LEFT ) {
	Xp -= 1.0f;
    }
    if ( Key[3].button & CONT_UP ) {
	Yp -= 1.0f;
    }
    if ( Key[3].button & CONT_DOWN ) {
	Yp += 1.0f;
    }

    PRINTF( "x:%f y:%f\n",Xp,Yp );
#endif
}

/************************************************************************/
/* フォックスチームの各名前の描画					*/
/************************************************************************/
static void foxteam_name_display( void )
{
    register int i;
    float NmXp,NmYp;
    static float nmxp[] = { 90.0f, 100.0f, 75.0f, 75.0f};

    NmXp = nmxp[run_p];
    NmYp = 210.0f;

    rcpsetmode( &NOW_DISP, RECE_A_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff);

    switch( run_p ) {
    case 0: /* Slippey */
	texture_rectangleIA8( &NOW_DISP, DEMO_mess08_txt,
			      144, 13, NmXp, NmYp, 1.0f, 1.0f );
	break;
    case 1: /* Peppey */
	texture_rectangleIA8( &NOW_DISP, DEMO_mess07_txt,
			      120, 13, NmXp, NmYp, 1.0f, 1.0f );
	break;
    case 2: /* Falco */
	for( i=0; i<3; i++ ) {
	    texture_rectangleIA8( &NOW_DISP, DEMO_mess06_txt+(176*4*i),
				  176, 4, NmXp, NmYp+(4*i*1.0f), 1.0f, 1.0f );
	}
	texture_rectangleIA8( &NOW_DISP, DEMO_mess06_txt+(176*12),
			      176, 1, NmXp, NmYp+(12*1.0f), 1.0f, 1.0f );
	break;
    case 3: /* Fox */
	for( i=0; i<3; i++ ) {
	    texture_rectangleIA8( &NOW_DISP, DEMO_mess05_txt+(176*4*i),
				  176, 4, NmXp, NmYp+(4*i*1.0f), 1.0f, 1.0f );
	}
	texture_rectangleIA8( &NOW_DISP, DEMO_mess05_txt+(176*12),
			      176, 1, NmXp, NmYp+(12*1.0f), 1.0f, 1.0f );
	break;
    }
}

/*======================================================================*
 *	太陽の輝き焼き付き表示 データ					*
 *======================================================================*/
Gfx *Demo_Sun_gfx[] = {
    DEMO_fler, /*本物の太陽のコロナ 1 */
    DEMO_fler, /*本物の太陽のコロナ 2 */
    DEMO_fler, /*本物の太陽のコロナ 3 */
    DEMO_fler, /*本物の太陽のコロナ 4 */
    DEMO_fler02, /*残光 0.5 輪 */
    DEMO_fler,   /*残光 1   */
    DEMO_fler,   /*残光 2   */
    DEMO_fler,   /*残光 2.5 */
    DEMO_fler,   /*残光 3   */
    DEMO_fler,   /*残光 4   */
    DEMO_fler02, /*残光 5 輪 */
    DEMO_fler,   /*残光 6   */
};

float Demo_Sun_trans[] = {
    0.0f, /*本物の太陽のコロナ 1 */
    0.0f, /*本物の太陽のコロナ 2 */
    0.0f, /*本物の太陽のコロナ 3 */
    0.0f, /*本物の太陽のコロナ 4 */
    10.0f, /*残光 0.5 輪 */
    13.0f, /*残光 1   */
    20.0f, /*残光 2   */
    35.0f, /*残光 2.5 */
    40.0f, /*残光 3   */
    50.0f, /*残光 4   */
    50.0f, /*残光 5 輪 */
    70.0f, /*残光 6   */
};

float Demo_Sun_scale[] = {
    20.0f, /*本物の太陽のコロナ 1 */
    22.0f, /*本物の太陽のコロナ 2 */
    24.0f, /*本物の太陽のコロナ 3 */
    28.0f, /*本物の太陽のコロナ 4 */
    30.0f, /*残光 0.5 輪 */
    14.0f, /*残光 1   */
    16.0f, /*残光 2   */
    18.0f, /*残光 2.5 */
    27.0f, /*残光 3   */
    28.0f, /*残光 4   */
    70.0f, /*残光 5 輪 */
    40.0f, /*残光 6   */
};

u8 Demo_Sun_col[] = {
    0xc0, /*本物の太陽のコロナ 1 */
    0x80, /*本物の太陽のコロナ 2 */
    0x60, /*本物の太陽のコロナ 3 */
    0x40, /*本物の太陽のコロナ 4 */
    0x40, /*残光 0.5 輪 */
    0x40, /*残光 1   */
    0x40, /*残光 2   */
    0x40, /*残光 2.5 */
    0x40, /*残光 3   */
    0x40, /*残光 4   */
    0x40, /*残光 5 輪 */
    0x40, /*残光 6   */
};

int Demo_Sun_A[] = {
    80, /*本物の太陽のコロナ 1 */
    64, /*本物の太陽のコロナ 2 */
    48, /*本物の太陽のコロナ 3 */
    32, /*本物の太陽のコロナ 4 */
    12, /*残光 0.5 輪 */
    32, /*残光 1   */
    44, /*残光 2   */
    32, /*残光 2.5 */
    42, /*残光 3   */
    36, /*残光 4   */
    12, /*残光 5 輪 */
    38, /*残光 6   */
};

#define Demo_sun_A_ad	 (4)
#define Demo_sun_A_max	 (60)
#define Demo_sun_size 	 (0.5f)
#define Demo_sun_A_value (0.5f)

/************************************************************************/
/* OPING 太陽の描画							*/
/************************************************************************/
static void oping_fler_display( void )
{
    if( op_fler_flg == 0 ) return;

    if( flerXp > -870.0f && flerXp < 900.0f && fade_A > 0 ) {
	if( flerXp < 0.0f ) {
	    if( sunA < 0xff ) sunA += 2;
	}
	if( flerXp > 0.0f ) {
	    if( sunA > 0x00 ) sunA -= 2;
	}
	
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetAlphaDither(NEXT_DISP, G_AD_NOISE);
	gDPSetColorDither(NEXT_DISP, G_CD_NOISE);
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, sunA);
	texture_rectangleRGBA16( &NOW_DISP, DEMO_taiyou_txt,
				 32, 32, sunXp, sunYp, sunXs, sunYs );
//	sunXp += 0.83f;
	sunXp += 1.66f;
    }


    push2_now();

    oping_sun_display();
    oping_sunshine_display();

    pull_now();

}

/************************************************************************/
/* OPING 太陽の描画							*/
/************************************************************************/
static void oping_sun_display( void )
{
    register int i;

    if( fade_A > 0)
	fade_A -= Demo_sun_A_ad;

    sun_X = flerXp;
    sun_Y = flerYp;

    if( sun_X < 950.0f && sun_X > -900.0f ) {
	fade_A += Demo_sun_A_ad*2;
	if(fade_A > Demo_sun_A_max)
	    fade_A = Demo_sun_A_max;
#if 0
	fade_R = 0x90;
	fade_G = 0x90;
	fade_B = 0x90;
#else
	fade_R = 0xd0;
	fade_G = 0xd0;
	fade_B = 0xd0;
#endif
    }

    if(fade_A > 0) {
	rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
	gDPSetAlphaDither(NEXT_DISP, G_AD_NOISE);
	gDPSetColorDither(NEXT_DISP, G_CD_NOISE);

	push_now();
	translate_now( sun_X, sun_Y, -200.0f, MULT_MTX );
	
	for( i=0; i<4; i++ ) {
	    push_now();
	    scale_now(Demo_Sun_scale[i]*Demo_sun_size,
		      Demo_Sun_scale[i]*Demo_sun_size,
		      Demo_Sun_scale[i]*Demo_sun_size,
		      MULT_MTX);
	    set_matrix(&NOW_DISP);

	    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff,
			    Demo_Sun_col[i], Demo_Sun_A[i]);
	    gSPDisplayList(NEXT_DISP, Demo_Sun_gfx[i]);
	    pull_now();
	    
	}
	pull_now();
    }
}

/************************************************************************/
/* OPING 太陽レンズフレアーの描画					*/
/************************************************************************/
static void oping_sunshine_display( void )
{
    static int aaa=12;

    float a,a2;
    float sun_xT,sun_yT;
    int i;

    rcpsetmode( &NOW_DISP, TEXE_A_PRIM );
    gDPSetAlphaDither(NEXT_DISP, G_AD_NOISE);
    gDPSetColorDither(NEXT_DISP, G_CD_NOISE);

    if(fade_A > 0) {
	sun_xT = sun_X * -0.03f;
	sun_yT = sun_Y * 0.03f;

	a = 1.0f;
	if(fade_A < 10)  {
	    a = (float)fade_A / 10.0f;
	}

	a *= Demo_sun_A_value;

	push_now();
	translate_now(sun_X, sun_Y, -200.0f, MULT_MTX);
	
	for(i = 4; i < 12; i++)  {
	    push_now();
	    translate_now(Demo_Sun_trans[i]*sun_xT,
			  -Demo_Sun_trans[i]*sun_yT,
			  00.0f, MULT_MTX);
	    scale_now(Demo_Sun_scale[i]*Demo_sun_size,
		      Demo_Sun_scale[i]*Demo_sun_size,
		      Demo_Sun_scale[i]*Demo_sun_size,
		      MULT_MTX);

	    set_matrix(&NOW_DISP);

	    a2 = (float)Demo_Sun_A[i] * a;

	    if( i != 10 ) {
		gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff,
				Demo_Sun_col[i], (int)a2);
	    } else {
		gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff,
				Demo_Sun_col[i], aaa);
	    }
	    gSPDisplayList(NEXT_DISP, Demo_Sun_gfx[i]);
	    pull_now();
	}
	pull_now();
    }
}

/************************************************************************/
/* OPING ロゴの描画							*/
/************************************************************************/
static void oping_rogo_display( void )
{
    register int i;
    float Sf2Xp,Sf2Yp,InXp,InYp;

    if( op_rogo_flg == -1 ) return;

    Sf2Xp = 90.0f;
    Sf2Yp = 110.0f;

    InXp = 150.0f;
    InYp = 110.0f;

    switch( op_rogo_flg ) {
    case 0: /* "STARFOX","IN" */
	rcpsetmode( &NOW_DISP, RECE_RGBA_A_PRIM );
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, (int)Op1RogoA);
	texture_rectangleCI4( &NOW_DISP,
			      DEMO_mess09_txt,
			      DEMO_mess09_txttlut,
			      256, 13, Sf2Xp, Sf2Yp, 1.0f, 1.0f );

	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, (int)Op2RogoA);
	texture_rectangleCI4( &NOW_DISP,
			      DEMO_mess10_txt,
			      DEMO_mess10_txttlut,
			      32, 13, InXp, InYp, 1.0f, 1.0f );
	break;
    case 1: /* N Cube */
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, (int)Op1RogoA);
//	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0x70);
	for( i=0; i<5; i++ ) {
	    texture_rectangleRGBA16( &NOW_DISP, DEMO_N_txt + (128 * 16 * i),
				     128, 16, NcXp, NcYp+(16*i*NcYs),
				     NcXs, NcYs );
	}
    
	texture_rectangleRGBA16( &NOW_DISP, DEMO_N_txt + (128 * 16 * 5),
				 128, 8, NcXp, NcYp+(16*5*NcYs), NcXs, NcYs );
	break;
    }
}

/************************************************************************/
/* グレートフォックス号発射口内部の描画					*/
/************************************************************************/
static void gfoxBase_display( void )
{
    light_in( (int)lightX, (int)lightY, (int)lightZ,
	      0, 0, 0,
	      kanR, kanG, kanB );

    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );

    push_now();

    translate_now( 0.0f, hkoY, hkoZ, MULT_MTX );
    scale_now( 0.4f, 0.4f, 0.4f, MULT_MTX );

    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, DEMO_GFbase );
    
    if( KabeDraw_f )
	gfoxKabe_display();
    pull_now();
}

/************************************************************************/
/* グレートフォックス号発射口内部の壁の描画				*/
/************************************************************************/
static void gfoxKabe_display( void )
{
//    static float xp=401.0f,yp=-249.0f,zp=-22.0f,xs=1.0f,ys=1.0f,zs=1.0f;
    float xp=401.0f,yp=-249.0f,zp=-22.0f,xs=1.0f,ys=1.0f,zs=1.0f;

    translate_now( xp, yp, zp, MULT_MTX );
    scale_now( xs, ys, zs, MULT_MTX );

    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, DEMO_kabe );

#if 0
    if( Key[2].button & CONT_A ) {
	if( Key[2].button & CONT_R ) {
	    zp += 1.0f;
	}
	if( Key[2].button & CONT_L ) {
	    zp -= 1.0f;
	}
	if( Key[2].button & CONT_RIGHT ) {
	    xp += 1.0f;
	}
	if( Key[2].button & CONT_LEFT ) {
	    xp -= 1.0f;
	}
	if( Key[2].button & CONT_UP ) {
	    yp += 1.0f;
	}
	if( Key[2].button & CONT_DOWN ) {
	    yp -= 1.0f;
	}
    }
    
    if( Key[2].button & CONT_B ) {
	if( Key_T[2].button & CONT_R ) {
	    zs += 0.1f;
	}
	if( Key_T[2].button & CONT_L ) {
	    zs -= 0.1f;
	}
	if( Key_T[2].button & CONT_RIGHT ) {
	    xs += 0.1f;
	}
	if( Key_T[2].button & CONT_LEFT ) {
	    xs -= 0.1f;
	}
	if( Key_T[2].button & CONT_UP ) {
	    ys += 0.1f;
	}
	if( Key_T[2].button & CONT_DOWN ) {
	    ys -= 0.1f;
	}
    }

    PRINTF( "xp:%f yp:%f zp:%f xs:%f ys:%f zs:%f\n",xp,yp,zp,xs,ys,zs );
#endif
}

/************************************************************************/
/* グレートフォックス号発射口内部カタパルトの描画			*/
/************************************************************************/
static void gfoxKatapalt_display( int i )
{
    light_in( (int)lightX, (int)lightY, (int)lightZ,
	      ligR, ligG, ligB,
	      kanR, kanG, kanB );

    rcpsetmode( &NOW_DISP, TEXT_Z_LIGHT );

    push_now();

//    translate_now( awt[i].pos.x, -17.0f, kataZ, MULT_MTX );
    translate_now( awt[i].pos.x, -12.8f, kataZ, MULT_MTX );
    scale_now( 0.8f, 0.8f, 0.8f, MULT_MTX );

    set_matrix(&NOW_DISP);
    gSPDisplayList( NEXT_DISP, DEMO_GFkatapalt );

    pull_now();
}

/************************************************************************/
/* アーウィン,グレートフォックス号 名前の描画				*/
/************************************************************************/
static void name2_display( void )
{
    register int i;
    static float xx=89.0f,yy=17.0f;
    static float xx2=101.0f,yy2=197.0f;

    switch( name2_stat ) {
    case 0:
	break;
    case 1:
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
	texture_rectangleIA8( &NOW_DISP, DEMO_GFname_txt,
			      144, 28, xx, yy,
			      1.0f, 1.0f );
	break;
    case 2:
	rcpsetmode( &NOW_DISP, RECE_A_PRIM );
	gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff );
	for( i=0; i<4; i++ ) {
	    texture_rectangleIA8( &NOW_DISP, DEMO_AWname_txt+(112*6*i),
				  112, 6, xx2, yy2+(6.0f*i),
				  1.0f, 1.0f );
	}
	texture_rectangleIA8( &NOW_DISP, DEMO_AWname_txt+(112*6*4),
			      112, 2, xx2, yy2+(6.0f*4),
			      1.0f, 1.0f );
	break;
    }

#if 0
    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 ) {
	yy2 -= 1.0f;
    }
    if( Key[3].button & CONT_D ) {
	yy2 += 1.0f;
    }
    if( Key[3].button & CONT_C ) {
	xx2 -= 1.0f;
    }
    if( Key[3].button & CONT_F ) {
	xx2 += 1.0f;
    }

    PRINTF( "xx:%f yy:%f\n",xx,yy );
    PRINTF( "xx2:%f yy2:%f\n",xx2,yy2 );
#endif
}


/************************************************************************/
/* タイトル画面またはオプション画面へ					*/
/************************************************************************/
static void GoNext( void )
{
    if( demo_phase == DEMO_TITL ) {
	GoOption();
    } else {
	GoTitle();
    }
}

/************************************************************************/
/* タイトル画面へ							*/
/************************************************************************/
static void GoTitle( void )
{
    switch( wip_stat ) {
    case 0:
	if( Key_T[cont_num].button &
	    (CONT_START | CONT_A | CONT_B | CONT_C |
	     CONT_D | CONT_E | CONT_F) ) {
	    Na_StartSystemSe( NA_SE_DECIDE );
	    wip_time = 0;
	    wip_stat = 1;
	    Key_wait_time = 30;
	}
	break;
    case 1:
	if( wip_time < 120 ) {
	    wip_time += 18;
	} else {
	    Na_ChangeSoundMode( NA_PLAY_1, NA_MODE_TITLE );
	    Back_star_f = OFF;
	    face_stat = 0;
	    demo_cut_phase = 0;
	    display_mode = DISPLAY_NOTH;
	    demo_phase = DEMO_TITL;
	    Key_wait_time = 30;
	    wip_time = 0;
	    wip_stat = 0;
	}
	break;
    }
}

/************************************************************************/
/* オプション画面へ							*/
/************************************************************************/
static void GoOption( void )
{
    
    if( Key_wait_time != 0 ) return;

    switch( wip_stat ) {
    case 0:
	if( ((Key_T[cont_num].button & CONT_START) ||
	     (Key_T[cont_num].button & CONT_A) ) &&
	    !wip_stat ) {
	    Na_StartSystemSe( NA_SE_DECIDE );
	    Na_StopBgm( 30 );
//	    Key_wait_time = 10;
	    wip_time = 0;
	    wip_stat = 1;
	}
	break;
    case 1:
	if( wip_time < 120 ) {
	    wip_time += 18;
	} else {
#ifdef SPECIAL
	    Back_star_f = 0;
	    system_mode = MAP;
	    system_time = 2;
	    map_mode = MAP_WAIT;
	    display_mode = DISPLAY_NOTH;
	    wip_stat = 0;
	    wip_time = 0;
	    Key_wait_time = 3;
#else
	    system_mode = OPTION;
	    system_time = 2;
	    option_mode = OPTION_WAIT;
	    display_mode = DISPLAY_NOTH;
	    Back_star_f = OFF;
	    wip_stat = 0;
	    wip_time = 0;
	    Key_wait_time = 3;
#endif
	}
	break;
    }
}

/************************************************************************/
/* キー入力 タイトル用							*/
/************************************************************************/
static void KeyIn_Title( void )
{
    float x,y;

    if( KeyWait_time == 0 && stick_sw == OFF &&
	(Key_T[cont_num].stick_x != 0 || Key_T[cont_num].stick_y != 0 ) ) {
	stick_sw = ON;
	NoStick_time = 0;
    }

    x = (float)Key_T[cont_num].stick_x;
    y = (float)Key_T[cont_num].stick_y;

    if( stick_sw ) {
	if( (title64Xp+(x*0.2f)) > -500.0f &&
	    (title64Xp+(x*0.2f)) < 500.0f )
	    title64Xp += x * 0.2f;
	if( (title64Yp+(y*0.2f)) > -500.0f &&
	    (title64Yp+(y*0.2f)) < 500.0f )
	    title64Yp += y * 0.2f;
    }

    if( stick_sw && Key_T[cont_num].stick_x == 0 &&
	Key_T[cont_num].stick_y == 0 ) {
	NoStick_time++;
    } else {
	NoStick_time = 0;
    }
}








/************************************************************************/
#if 0
/*----------------------------------------------------------------------*/
/* 1997/01/24 ボツになる						*/
/*----------------------------------------------------------------------*/
/************************************************************************/
/* １Ｐにコントローラが接続されていないよ警告の描画			*/
/************************************************************************/
static void title_waring_display( void )
{
    register int i;
    
//    static int p = 0;
//    static float xp[5] = { 51.0f, 54.0f, 35.0f, 189.0f, 238.0f };
//    static float yp[5] = { 31.0f, 107.0f, 189.0f, 195.0f, 148.0f };

    rcpsetmode( &NOW_DISP, RECT_A_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 20,0,75, 0xff);

    /** 出撃前の注意 **/
    for( i=0; i<3; i++ ) {
	texture_rectangleIA8( &NOW_DISP, DEMO_dame01_txt+((216*9*i)/2),
			      216, 9, 51.0f, 31.0f+(i*9.0f), 1.0f, 1.0f );
    }
    texture_rectangleIA8( &NOW_DISP, DEMO_dame01_txt+((216*27)/2),
			  216, 3, 51.0f, 31.0f+27.0f, 1.0f, 1.0f );

    /** １Ｐのコントローラを....... **/
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0x00, 0x00, 0x00, 0xff);
    for( i=0; i<3; i++ ) {
	texture_rectangleIA8( &NOW_DISP, DEMO_dame02_txt+((200*10*i)/2),
			      200, 10, 54.0f, 107.0f+(i*10.0f), 1.0f, 1.0f );
    }

    /** CORNERIA AIAFOCE ..... **/
    texture_rectangleIA8( &NOW_DISP, DEMO_dame03_txt,
			  152, 6, 35.0f, 189.0f, 1.0f, 1.0f );


    /** ペパー将軍のサイン **/
    rcpsetmode( &NOW_DISP, RECT_RGBA_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff);
    for( i=0; i<4; i++ ) {
	texture_rectangleCI4( &NOW_DISP, DEMO_dame04_txt+((96*5*i)/2),
			      DEMO_dame04_txttlut,
			      96, 5, 189.0f, 195.0f+(i*5.0f), 1.0f, 1.0f );
    }
    texture_rectangleCI4( &NOW_DISP, DEMO_dame04_txt+((96*5*4)/2),
			  DEMO_dame04_txttlut,
			  96, 2, 189.0f, 195.0f+(20.0f), 1.0f, 1.0f );


    /** ペパー将軍の顔 **/
    rcpsetmode( &NOW_DISP, RECT_PRIM );
    gDPSetPrimColor(NEXT_DISP, 0, 0, 0xff, 0xff, 0xff, 0xff);
    texture_rectangleRGBA16( &NOW_DISP, DEMO_damekao_txt,
			     32, 42, 238.0f, 148.0f, 1.0f, 1.0f );

#if 0
    if( Key_T[0].button & CONT_L ) {
	p += 1;
	if( p > 4 ) p = 0;
    }
    if( Key_T[0].button & CONT_R ) {
	p -= 1;
	if( p < 0 ) p = 4;
    }
    if( Key[0].button & CONT_LEFT ) {
	xp[p] -= 1.0f;
    }
    if( Key[0].button & CONT_RIGHT ) {
	xp[p] += 1.0f;
    }
    if( Key[0].button & CONT_UP ) {
	yp[p] -= 1.0f;
    }
    if( Key[0].button & CONT_DOWN ) {
	yp[p] += 1.0f;
    }
    PRINTF( "p:%d x:%f y:%f\n",p,xp[p],yp[p] );
#endif

}
#endif
/************************************************************************/



#ifdef TITL_DEBUG
/************************************************************************/
/* キー入力 Fler用							*/
/************************************************************************/
static void KeyIn_Fler( void )
{
    /* "XX" */
    if(Key[1].button & CONT_A) {
	if( Key[1].button & CONT_LEFT ) {
	    sunXp -= 1.0f;
	}
	if( Key[1].button & CONT_RIGHT ) {
	    sunXp += 1.0f;
	}
	if( Key[1].button & CONT_UP ) {
	    sunYp -= 1.0f;
	}
	if( Key[1].button & CONT_DOWN ) {
	    sunYp += 1.0f;
	}

	if(Key[1].button & CONT_E) {
	    sunYs -= 0.01f;
	}
	if(Key[1].button & CONT_D) {
	    sunYs += 0.01f;
	}
	if(Key[1].button & CONT_C) {
	    sunXs += 0.01f;
	}
	if(Key[1].button & CONT_F) {
	    sunXs -= 0.01f;
	}
	PRINTF("FL:Xp=%f,Yp=%f,Xs=%f,Ys=%f\n",
	       sunXp,sunYp,sunXs,sunYs);
    }

    if(Key[1].button & CONT_B) {
	if( Key[1].button & CONT_LEFT ) {
	    flerXp -= 10.0f;
	}
	if( Key[1].button & CONT_RIGHT ) {
	    flerXp += 10.0f;
	}
	if( Key[1].button & CONT_UP ) {
	    flerYp += 10.0f;
	}
	if( Key[1].button & CONT_DOWN ) {
	    flerYp -= 10.0f;
	}

	if(Key[1].button & CONT_E) {
	    flerYs -= 1.0f;
	}
	if(Key[1].button & CONT_D) {
	    flerYs += 1.0f;
	}
	if(Key[1].button & CONT_C) {
	    flerXs += 1.0f;
	}
	if(Key[1].button & CONT_F) {
	    flerXs -= 1.0f;
	}
	PRINTF("FL1:Xp=%f,Yp=%f,Xs=%f,Ys=%f\n",
	       flerXp,flerYp,flerXs,flerYs);
    }
}

/************************************************************************/
/* キー入力 Fox Team用							*/
/************************************************************************/
static void KeyIn_FoxZp( void )
{
    if(Key[3].button & CONT_R) {
	FoxTmZoff += 50.0f;
    }
    if(Key[3].button & CONT_L) {
	FoxTmZoff -= 50.0f;
    }
}

/************************************************************************/
/* キー入力 Fox Team用							*/
/************************************************************************/
static void KeyIn_FoxTeam( void )
{
    float x,y;
    
#if 0
    if(Key[1].button & CONT_R) {
	foxTm_offset += 1.0f;
	PRINTF( "Zoff=%f\n",foxTm_offset );
    }
    if(Key[1].button & CONT_L) {
	foxTm_offset -= 1.0f;
	PRINTF( "Zoff=%f\n",foxTm_offset );
    }


    if(Key_T[1].button & CONT_START) {
	partsNo++;
	PRINTF( "partsNo : %d\n",partsNo );
    }

    if(Key[1].button & CONT_A) {
	if (Key[1].button & CONT_LEFT) {
	    partsXa += 1.0f;
	}
	if (Key[1].button & CONT_RIGHT) {
	    partsXa -= 1.0f;
	}
	PRINTF("Xang : %f\n",partsXa );
    }
#endif

#if 0
    if (Key[3].button & CONT_RIGHT) {
	foxt[3].anmcnt += 1;
    }
    if (Key[3].button & CONT_LEFT) {
	foxt[3].anmcnt -= 1;
    }

    PRINTF( "cnt:%d\n",foxt[3].anmcnt );
#endif


    if(Key[3].button & CONT_B) {
	if (Key[3].button & CONT_UP) {
	    foxtm_scl += 0.001f;
	}
	if (Key[3].button & CONT_DOWN) {
	    foxtm_scl -= 0.001f;
	}
	PRINTF("scl : %f\n",foxtm_scl );
    }

    /* FOX */
    if(Key[2].button & CONT_D) {
	if (Key[2].button & CONT_LEFT) {
	    foxt[0].Pos.x -= 1.0f;
	}
	
	if (Key[2].button & CONT_RIGHT) {
	    foxt[0].Pos.x += 1.0f;
	}
	
	if (Key[2].button & CONT_DOWN) {
	    foxt[0].Pos.y -= 1.0f;
	}
	
	if (Key[2].button & CONT_UP) {
	    foxt[0].Pos.y += 1.0f;
	}

	if (Key[2].button & CONT_L) {
	    foxt[0].Pos.z -= 1.0f;
	}
	
	if (Key[2].button & CONT_R) {
	    foxt[0].Pos.z += 1.0f;
	}

	if (Key[3].button & CONT_L) {
	    foxt[0].MyZa -= 1.0f;
	}
	
	if (Key[3].button & CONT_R) {
	    foxt[0].MyZa += 1.0f;
	}

	x = (float)Key_T[2].stick_y;
	   foxt[0].MyXa += -x * 0.01f;
	y = (float)Key_T[2].stick_x;
	   foxt[0].MyYa += y * 0.01f;

	PRINTF("fox    : xp:%f yp:%f zp:%f\n xa:%f ya:%f za:%f\n",
	       foxt[0].Pos.x,foxt[0].Pos.y,foxt[0].Pos.z,
	       foxt[0].MyXa,foxt[0].MyYa,foxt[0].MyZa );
    }

    /* FALCO */
    if(Key[2].button & CONT_F) {
	if (Key[2].button & CONT_LEFT) {
	    foxt[1].Pos.x -= 1.0f;
	}
	
	if (Key[2].button & CONT_RIGHT) {
	    foxt[1].Pos.x += 1.0f;
	}
	
	if (Key[2].button & CONT_DOWN) {
	    foxt[1].Pos.y -= 1.0f;
	}

	if (Key[2].button & CONT_UP) {
	    foxt[1].Pos.y += 1.0f;
	}

	if (Key[2].button & CONT_L) {
	    foxt[1].Pos.z -= 1.0f;
	}

	if (Key[2].button & CONT_L) {
	    foxt[1].Pos.z -= 1.0f;
	}
	
	if (Key[2].button & CONT_R) {
	    foxt[1].Pos.z += 1.0f;
	}

	if (Key[3].button & CONT_L) {
	    foxt[1].MyZa -= 1.0f;
	}
	
	if (Key[3].button & CONT_R) {
	    foxt[1].MyZa += 1.0f;
	}

	x = (float)Key_T[2].stick_y;
	   foxt[1].MyXa += -x * 0.01f;
	y = (float)Key_T[2].stick_x;
	   foxt[1].MyYa += y * 0.01f;

	PRINTF("falco  : xp:%f yp:%f\n zp:%f xa:%f ya:%f za:%f\n",
	       foxt[1].Pos.x,foxt[1].Pos.y,foxt[1].Pos.z,
	       foxt[1].MyXa,foxt[1].MyYa,foxt[1].MyZa );
    }

    /* Peppey */
    if(Key[2].button & CONT_E) {
	if (Key[2].button & CONT_LEFT) {
	    foxt[2].Pos.x -= 1.0f;
	}
	
	if (Key[2].button & CONT_RIGHT) {
	    foxt[2].Pos.x += 1.0f;
	}
	
	if (Key[2].button & CONT_DOWN) {
	    foxt[2].Pos.y -= 1.0f;
	}

	if (Key[2].button & CONT_UP) {
	    foxt[2].Pos.y += 1.0f;
	}

	if (Key[2].button & CONT_L) {
	    foxt[2].Pos.z -= 1.0f;
	}

	if (Key[2].button & CONT_L) {
	    foxt[2].Pos.z -= 1.0f;
	}
	
	if (Key[2].button & CONT_R) {
	    foxt[2].Pos.z += 1.0f;
	}

	if (Key[3].button & CONT_L) {
	    foxt[2].MyZa -= 1.0f;
	}
	
	if (Key[3].button & CONT_R) {
	    foxt[2].MyZa += 1.0f;
	}

	x = (float)Key_T[2].stick_y;
	foxt[2].MyXa += -x * 0.01f;
	y = (float)Key_T[2].stick_x;
	foxt[2].MyYa += y * 0.01f;

	PRINTF("Peppey : xp:%f yp:%f zp:%f\n xa:%f ya:%f za:%f\n",
	       foxt[2].Pos.x,foxt[2].Pos.y,foxt[2].Pos.z,
	       foxt[2].MyXa,foxt[2].MyYa,foxt[2].MyZa );
    }

    /* Slippey */
    if(Key[2].button & CONT_C) {
	if (Key[2].button & CONT_LEFT) {
	    foxt[3].Pos.x -= 1.0f;
	}
	
	if (Key[2].button & CONT_RIGHT) {
	    foxt[3].Pos.x += 1.0f;
	}
	
	if (Key[2].button & CONT_DOWN) {
	    foxt[3].Pos.y -= 1.0f;
	}

	if (Key[2].button & CONT_UP) {
	    foxt[3].Pos.y += 1.0f;
	}

	if (Key[2].button & CONT_L) {
	    foxt[3].Pos.z -= 1.0f;
	}

	if (Key[2].button & CONT_L) {
	    foxt[3].Pos.z -= 1.0f;
	}
	
	if (Key[2].button & CONT_R) {
	    foxt[3].Pos.z += 1.0f;
	}

	if (Key[3].button & CONT_L) {
	    foxt[3].MyZa -= 1.0f;
	}
	
	if (Key[3].button & CONT_R) {
	    foxt[3].MyZa += 1.0f;
	}

	x = (float)Key_T[2].stick_y;
	   foxt[3].MyXa += -x * 0.01f;
	y = (float)Key_T[2].stick_x;
	   foxt[3].MyYa += y * 0.01f;

	PRINTF("Slippey: xp:%f yp:%f zp:%f\n xa:%f ya:%f za:%f\n",
	       foxt[3].Pos.x,foxt[3].Pos.y,foxt[3].Pos.z,
	       foxt[3].MyXa,foxt[3].MyYa,foxt[3].MyZa );
    }
}

/************************************************************************/
/* キー入力 文字カラー用						*/
/************************************************************************/
static void KeyIn_color( void )
{
    if(Key_T[1].button & CONT_A) {
	disp_sw ^= 1;
    }

    if (Key_T[1].button & CONT_L) {
	locY -= 1;
    }
    
    if (Key_T[1].button & CONT_R) {
	locY += 1;
    }

    if (Key[1].button & CONT_E) {
	if (Key[1].button & CONT_LEFT) {
	    mojiA = (mojiA - 1) & 0xff;
	}
	if (Key[1].button & CONT_RIGHT) {
	    mojiA = (mojiA + 1) & 0xff;
	}
    }

    if (Key[1].button & CONT_C) {
	if (Key[1].button & CONT_LEFT) {
	    mojiR = (mojiR - 1) & 0xff;
	}
	if (Key[1].button & CONT_RIGHT) {
	    mojiR = (mojiR + 1) & 0xff;
	}
    }
    
    if (Key[1].button & CONT_D) {
	if (Key[1].button & CONT_LEFT) {
	    mojiG = (mojiG - 1) & 0xff;
	}
	if (Key[1].button & CONT_RIGHT) {
	    mojiG = (mojiG + 1) & 0xff;
	}
    }
    
    if (Key[1].button & CONT_F) {
	if (Key[1].button & CONT_LEFT) {
	    mojiB = (mojiB - 1) & 0xff;
	}
	if (Key[1].button & CONT_RIGHT) {
	    mojiB = (mojiB + 1) & 0xff;
	}
    }
}

/************************************************************************/
/* キー入力 その7							*/
/************************************************************************/
static void KeyIn7( void )
{
    if (Key[0].button & CONT_UP ) {
	hkoY += 1.0f;
	PRINTF( "hkoY=%f\n",hkoY );
    }
    
    if (Key[0].button & CONT_DOWN) {
	hkoY -= 1.0f;
	PRINTF( "hkoY=%f\n",hkoY );
    }

#if 0
    if (Key[0].button & CONT_UP ) {
	kageY += 1.0f;
	PRINTF( "kageY=%f\n",kageY );
    }
    
    if (Key[0].button & CONT_DOWN) {
	kageY -= 1.0f;
	PRINTF( "kageY=%f\n",kageY );
    }

    if (Key[0].button & CONT_LEFT ) {
	hkoZ -= 10.0f;
	PRINTF( "hkoZ=%f\n",hkoZ );
    }
    
    if (Key[0].button & CONT_RIGHT) {
	hkoZ += 10.0f;
	PRINTF( "hkoZ=%f\n",hkoZ );
    }

    if (Key[0].button & CONT_LEFT ) {
	kataZ += 10.0f;
	PRINTF( "kataZ=%f\n",kataZ );
    }
    
    if (Key[0].button & CONT_RIGHT) {
	kataZ -= 10.0f;
	PRINTF( "kataZ=%f\n",kataZ );
    }
#endif
}

/************************************************************************/
/* キー入力 ライト用 2							*/
/************************************************************************/
static void KeyIn_Lig2( void )
{
    float x,y;

    if(Key_T[3].button & CONT_E) {
	disp_sw ^= 1;
    }

    if (Key_T[3].button & CONT_L) {
	locY -= 1;
    }
    
    if (Key_T[3].button & CONT_R) {
	locY += 1;
    }

    if (Key[3].button & CONT_C) {
	if (Key[3].button & CONT_LEFT) {
	    kanR = (kanR - 1) & 0xff;
	}
	if (Key[3].button & CONT_RIGHT) {
	    kanR = (kanR + 1) & 0xff;
	}
	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) & 0xff;
	}
	if (Key[3].button & CONT_RIGHT) {
	    kanG = (kanG + 1) & 0xff;
	}
	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) & 0xff;
	}
	if (Key[3].button & CONT_RIGHT) {
	    kanB = (kanB + 1) & 0xff;
	}
	if (Key[3].button & CONT_UP) {
	    ligB = (ligB + 1) & 0xff;
	}
	if (Key[3].button & CONT_DOWN) {
	    ligB = (ligB - 1) & 0xff;
	}
    }

    x = (float)Key_T[3].stick_x;
    y = (float)Key_T[3].stick_y;

    LigYa += x * 0.04f;
    LigXa -= y * 0.04f;
}

/************************************************************************/
/* キー入力 ライト用 3							*/
/************************************************************************/
static void KeyIn_Lig3( void )
{
    float x,y;

    if(Key_T[1].button & CONT_E) {
	disp_sw ^= 1;
    }

    if (Key_T[1].button & CONT_L) {
	locY -= 1;
    }
    
    if (Key_T[1].button & CONT_R) {
	locY += 1;
    }

    x = (float)Key_T[1].stick_x;
    y = (float)Key_T[1].stick_y;

    if( !key_sw ) {
	if (Key[1].button & CONT_C) {
	    if (Key[1].button & CONT_LEFT) {
		ft_kanR = (ft_kanR - 1.0f);
		if( ft_kanR < 0.0f ) ft_kanR = 255.0f;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		ft_kanR = (ft_kanR + 1.0f);
		if( ft_kanR > 255.0f ) ft_kanR = 0.0f;
	    }
	    if (Key[1].button & CONT_UP) {
		ft_ligR = (ft_ligR + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_DOWN) {
		ft_ligR = (ft_ligR - 1) & 0xff;
	    }
	}
	
	if (Key[1].button & CONT_D) {
	    if (Key[1].button & CONT_LEFT) {
		ft_kanG = (ft_kanG - 1.0f);
		if( ft_kanG < 0.0f ) ft_kanG = 255.0f;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		ft_kanG = (ft_kanG + 1.0f);
		if( ft_kanG > 255.0f ) ft_kanG = 0.0f;
	    }
	    if (Key[1].button & CONT_UP) {
		ft_ligG = (ft_ligG + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_DOWN) {
		ft_ligG = (ft_ligG - 1) & 0xff;
	    }
	}
	
	if (Key[1].button & CONT_F) {
	    if (Key[1].button & CONT_LEFT) {
		ft_kanB = (ft_kanB - 1.0f);
		if( ft_kanB < 0.0f ) ft_kanB = 255.0f;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		ft_kanB = (ft_kanB + 1.0f);
		if( ft_kanB > 255.0f ) ft_kanB = 0.0f;
	    }
	    if (Key[1].button & CONT_UP) {
		ft_ligB = (ft_ligB + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_DOWN) {
		ft_ligB = (ft_ligB - 1) & 0xff;
	    }
	}
	
	LigYa += x * 0.04f;
	LigXa -= y * 0.04f;
    } else {
	if (Key[1].button & CONT_C) {
	    if (Key[1].button & CONT_LEFT) {
		aw_kanR = (aw_kanR - 1) & 0xff;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		aw_kanR = (aw_kanR + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_UP) {
		aw_ligR = (aw_ligR + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_DOWN) {
		aw_ligR = (aw_ligR - 1) & 0xff;
	    }
	}
	
	if (Key[1].button & CONT_D) {
	    if (Key[1].button & CONT_LEFT) {
		aw_kanG = (aw_kanG - 1) & 0xff;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		aw_kanG = (aw_kanG + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_UP) {
		aw_ligG = (aw_ligG + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_DOWN) {
		aw_ligG = (aw_ligG - 1) & 0xff;
	    }
	}
	
	if (Key[1].button & CONT_F) {
	    if (Key[1].button & CONT_LEFT) {
		aw_kanB = (aw_kanB - 1) & 0xff;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		aw_kanB = (aw_kanB + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_UP) {
		aw_ligB = (aw_ligB + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_DOWN) {
		aw_ligB = (aw_ligB - 1) & 0xff;
	    }
	}

	LigYa2 += x * 0.04f;
	LigXa2 -= y * 0.04f;
    }


    if (Key_T[1].button & CONT_B) {
	key_sw ^= 1;
    }

}

/************************************************************************/
/* キー入力 ライト用 4							*/
/************************************************************************/
static void KeyIn_Lig4( void )
{
    float x,y;

    if(Key_T[1].button & CONT_E) {
	disp_sw ^= 1;
    }

    if (Key_T[1].button & CONT_L) {
	locY -= 1;
    }
    
    if (Key_T[1].button & CONT_R) {
	locY += 1;
    }

    if( !key_sw ) {
	if (Key[1].button & CONT_C) {
	    if (Key[1].button & CONT_LEFT) {
		ft_kanR = (ft_kanR - 1.0f);
		if( ft_kanR < 0.0f ) ft_kanR = 255.0f;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		ft_kanR = (ft_kanR + 1.0f);
		if( ft_kanR > 255.0f ) ft_kanR = 0.0f;
	    }
	    if (Key[1].button & CONT_UP) {
		ft_ligR = (ft_ligR + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_DOWN) {
		ft_ligR = (ft_ligR - 1) & 0xff;
	    }
	}
	
	if (Key[1].button & CONT_D) {
	    if (Key[1].button & CONT_LEFT) {
		ft_kanG = (ft_kanG - 1.0f);
		if( ft_kanG < 0.0f ) ft_kanG = 255.0f;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		ft_kanG = (ft_kanG + 1.0f);
		if( ft_kanG > 255.0f ) ft_kanG = 0.0f;
	    }
	    if (Key[1].button & CONT_UP) {
		ft_ligG = (ft_ligG + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_DOWN) {
		ft_ligG = (ft_ligG - 1) & 0xff;
	    }
	}
	
	if (Key[1].button & CONT_F) {
	    if (Key[1].button & CONT_LEFT) {
		ft_kanB = (ft_kanB - 1.0f);
		if( ft_kanB < 0.0f ) ft_kanB = 255.0f;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		ft_kanB = (ft_kanB + 1.0f);
		if( ft_kanB > 255.0f ) ft_kanB = 0.0f;
	    }
	    if (Key[1].button & CONT_UP) {
		ft_ligB = (ft_ligB + 1) & 0xff;
	    }
	    if (Key[1].button & CONT_DOWN) {
		ft_ligB = (ft_ligB - 1) & 0xff;
	    }
	}
    } else {
	if (Key[1].button & CONT_C) {
	    if (Key[1].button & CONT_LEFT) {
		tu2_kan[sel_sw].r = (tu2_kan[sel_sw].r - 1.0f);
		if( tu2_kan[sel_sw].r < 0.0f ) tu2_kan[sel_sw].r = 255.0f;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		tu2_kan[sel_sw].r = (tu2_kan[sel_sw].r + 1.0f);
		if( tu2_kan[sel_sw].r > 255.0f ) tu2_kan[sel_sw].r = 0.0f;
	    }
	}
	
	if (Key[1].button & CONT_D) {
	    if (Key[1].button & CONT_LEFT) {
		tu2_kan[sel_sw].g = (tu2_kan[sel_sw].g - 1.0f);
		if( tu2_kan[sel_sw].g < 0.0f ) tu2_kan[sel_sw].g = 255.0f;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		tu2_kan[sel_sw].g = (tu2_kan[sel_sw].g + 1.0f);
		if( tu2_kan[sel_sw].g > 255.0f ) tu2_kan[sel_sw].g = 0.0f;
	    }
	}
	
	if (Key[1].button & CONT_F) {
	    if (Key[1].button & CONT_LEFT) {
		tu2_kan[sel_sw].b = (tu2_kan[sel_sw].b - 1.0f);
		if( tu2_kan[sel_sw].b < 0.0f ) tu2_kan[sel_sw].b = 255.0f;
	    }
	    if (Key[1].button & CONT_RIGHT) {
		tu2_kan[sel_sw].b  = (tu2_kan[sel_sw].b  + 1.0f);
		if( tu2_kan[sel_sw].b > 255.0f ) tu2_kan[sel_sw].b  = 0.0f;
	    }
	}
    }

    if (Key_T[1].button & CONT_START) {
	sel_sw ++;
	if( sel_sw > 4 ) sel_sw=0;
    }

    if (Key_T[1].button & CONT_A) {
	flush_sw ^= 1;
    }

    if (Key_T[1].button & CONT_B) {
	key_sw ^= 1;
    }

    x = (float)Key_T[1].stick_x;
    y = (float)Key_T[1].stick_y;

    LigYa += x * 0.04f;
    LigXa -= y * 0.04f;
}

/************************************************************************/
/*									*/
/************************************************************************/
static void debug_display( void )
{
    register int i;

    rectangle_rgba_a_prim();

    COLOR8X8( 0xff,0xff,0xff,0xf0 );

    switch( demo_phase ) {
    /* タイトル */
    case DEMO_TITL:
	if( !key_sw ) {
	    LOCATE8X8( 3, locY+3 );
	    Printf( "F O X\n" );
	    LOCATE8X8( 3, locY+4 );
	    Printf( "lxa :%4d lya :%4d\n",(int)LigXa,(int)LigYa );
	    LOCATE8X8( 3, locY+5 );
	    Printf( "ligR:%d ligG:%d ligB:%d\n",ft_ligR,ft_ligG,ft_ligB );
	    LOCATE8X8( 3, locY+6 );
	    Printf( "kanR:%d kanG:%d kanB:%d\n",
		(int)ft_kanR,(int)ft_kanG,(int)ft_kanB );
	} else {
	    LOCATE8X8( 3,locY+ 3 );
	    Printf( "A W I N\n" );
	    LOCATE8X8( 3,locY+ 4 );
	    Printf( "lxa:%4d lya:%4d\n",(int)LigXa2,(int)LigYa2 );
	    LOCATE8X8( 3, locY+5 );
	    Printf( "ligR:%d ligG:%d ligB:%d\n",aw_ligR,aw_ligG,aw_ligB );
	    LOCATE8X8( 3, locY+6 );
	    Printf( "kanR:%d kanG:%d kanB:%d\n",aw_kanR,aw_kanG,aw_kanB );
	}
	break;
    /* カット２ */
    case DEMO_CUT2:
	if( !key_sw ) {
	    LOCATE8X8( 3, locY+3 );
	    Printf( "F O X\n" );
	    LOCATE8X8( 3, locY+4 );
	    Printf( "lxa :%4d lya :%4d\n",(int)LigXa,(int)LigYa );
	    LOCATE8X8( 3, locY+5 );
	    Printf( "ligR:%d ligG:%d ligB:%d\n",ft_ligR,ft_ligG,ft_ligB );
	    LOCATE8X8( 3, locY+6 );
	    Printf( "kanR:%d kanG:%d kanB:%d\n",
		(int)ft_kanR,(int)ft_kanG,(int)ft_kanB );
	} else {
	    LOCATE8X8( 3,locY+ 3 );
	    Printf( "T U R O\n" );
	    LOCATE8X8( 3,locY+ 4 );
	    Printf( "lxa:%4d lya:%4d\n",(int)LigXa,(int)LigYa );
	    LOCATE8X8( 3, (locY+5)+sel_sw );
	    Printf( "*\n" );
	    for( i=0; i<5; i++ ) {
		LOCATE8X8( 4, (locY+5)+i );
		Printf( "%d kanR:%d kanG:%d kanB:%d\n",
			i,(int)tu2_kan[i].r,
			(int)tu2_kan[i].g,
			(int)tu2_kan[i].b );
	    }
	}
	break;
    /* カット１ */
    case DEMO_CUT1:
    /* カット３ */
    case DEMO_CUT3:
    /* カット４ */
    case DEMO_CUT4:
    /* カット５ */
    case DEMO_CUT5:
	COLOR8X8( 0xff,0xff,0xff,0xf0 );
	LOCATE8X8( 3, locY+3 );
	Printf( "lxa :%4d lya :%4d\n",(int)LigXa,(int)LigYa );
	LOCATE8X8( 3,locY+ 4 );
	Printf( "ligR:%d ligG:%d ligB:%d\n",ligR,ligG,ligB );
	LOCATE8X8( 3, locY+5 );
	Printf( "kanR:%d kanG:%d kanB:%d\n\n",kanR,kanG,kanB );
	break;
    }
}

/************************************************************************/
/* キー入力 カメラ用 2							*/
/************************************************************************/
static void KeyIn_Cam2( void )
{
#if 0
    float x,y;

    if (Key[0].button & CONT_L) {
	CamZrg += 10.0;
    }
    if (Key[0].button & CONT_R) {
	CamZrg -= 10.0;
    }
    
    if (Key[0].button & CONT_LEFT) {
	wayX -= 10.0f;
    }
    if (Key[0].button & CONT_RIGHT) {
	wayX += 10.0f;
    }
    
    if (Key[0].button & CONT_UP) {
	wayY += 10.0f;
    }
    if (Key[0].button & CONT_DOWN) {
	wayY -= 10.0f;
    }
    
    if (Key[0].button & CONT_D) {
	wayZ += 10.0f;
    }
    if (Key[0].button & CONT_E) {
	wayZ -= 10.0f;
    }

    if (Key_T[0].button & CONT_F) {
	cam_sw ^= 1;
    }

    x = (float)Key_T[0].stick_x;
    y = (float)Key_T[0].stick_y;

    CamYa += x * 0.05f;
    CamXa -= y * 0.05f;
#endif
}
#endif

/************************************************************************/
/* フェード								*/
/************************************************************************/
static void demo_fade( void )
{
    switch( fade_sw ) {
    case IN:
	fade_A -= 0x04;
	if( fade_A < 0 ) {
	    fade_A = 0x00;
	    fade_sw = End;
	}
	break;
    case OUT:
	fade_A += 0x0f;
	if( fade_A > 0xff ) {
	    fade_A = 0xff;
	    fade_sw = End;
	}
	break;
    default:
	break;
    }
}


/************************************************************************/
/* カメラの回転座標の計算						*/
/************************************************************************/
static void revo_pos_calc( int sw,
			   float *ex, float *ey, float *ez,
			   float *wx, float *wy, float *wz,
			   float xa,  float ya,  float zr )
{
    xyz_t ato;
    xyz_t mae;
    float *rx,*ry,*rz;
    float *cx,*cy,*cz;

    if( sw ) {
	cx = wx;
	cy = wy;
	cz = wz;
	rx = ex;
	ry = ey;
	rz = ez;
    } else {
	cx = ex;
	cy = ey;
	cz = ez;
	rx = wx;
	ry = wy;
	rz = wz;
	zr = -zr;
    }

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = zr;

    translate_work( *cx, *cy, *cz, SET_MTX );
    rotateY_work( ANGLE(ya), MULT_MTX );
    rotateX_work( ANGLE(xa), MULT_MTX );

    MtxF_Position_work( &mae,&ato );

    *rx = ato.x;
    *ry = ato.y;
    *rz = ato.z;


    /* カメラの上方向の計算 */
    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 );

    vecX = ato.x;
    vecY = ato.y;
    vecZ = ato.z;

#if 0
   {
       float x,y;
       
       if (Key[0].button & CONT_L) {
	   CamZrg += 1.0;
       }
       if (Key[0].button & CONT_R) {
	   CamZrg -= 1.0;
       }
       
       if (Key[0].button & CONT_LEFT) {
	   wayX -= 1.0f;
       }
       if (Key[0].button & CONT_RIGHT) {
	   wayX += 1.0f;
       }
       
       if (Key[0].button & CONT_UP) {
	   wayY += 1.0f;
       }
       if (Key[0].button & CONT_DOWN) {
	   wayY -= 1.0f;
       }
       
       if (Key[0].button & CONT_D) {
	   wayZ += 1.0f;
       }
       if (Key[0].button & CONT_E) {
	   wayZ -= 1.0f;
       }
       
#if 0
       if (Key_T[0].button & CONT_F) {
	   cam_sw ^= 1;
       }
#endif
       
       x = (float)Key_T[0].stick_x;
       y = (float)Key_T[0].stick_y;
       
       CamYa += x * 0.05f;
       CamXa -= y * 0.05f;
       
       PRINTF( "sw=%d\n",cam_sw );
       PRINTF( "cxa=%f cya=%f\n",xa,ya );
       PRINTF( "czr=%f\n",zr );
       PRINTF( "cX=%f cY=%f cZ=%f\n",*cx,*cy,*cz );
       PRINTF( "rX=%f rY=%f rZ=%f\n\n",*rx,*ry,*rz );
       
//    PRINTF( "vX=%f vY=%f vZ=%f\n\n",vecX,vecY,vecZ );
   }
#endif
}

#if 0
/************************************************************************/
/* カメラの回転座標の計算						*/
/************************************************************************/
static void revo_pos_calc2( float cx, float cy, float cz,
			    float *ex, float *ey, float *ez, float ezr,
			    float *wx, float *wy, float *wz, float wzr,
			    float xa,  float ya )
{
    xyz_t ato;
    xyz_t mae;

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = wzr;

    translate_work( cx, cy, cz, 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;


    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = ezr;

    translate_work( cx, cy, cz, SET_MTX );
    rotateY_work( ANGLE(ya), MULT_MTX );
    rotateX_work( ANGLE(xa), MULT_MTX );

    MtxF_Position_work( &mae,&ato );

    *ex = ato.x;
    *ey = ato.y;
    *ez = ato.z;

    
    /* カメラの上方向の計算 */
    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 );

    vecX = ato.x;
    vecY = ato.y;
    vecZ = ato.z;

#if 0
    {
	float x,y;
	if (Key[0].button & CONT_L) {
	    CentZ += 1.0;
	}
	if (Key[0].button & CONT_R) {
	    CentZ -= 1.0;
	}
	
	if (Key[0].button & CONT_LEFT) {
	    CentX -= 1.0f;
	}
	if (Key[0].button & CONT_RIGHT) {
	    CentX += 1.0f;
	}
	
	if (Key[0].button & CONT_UP) {
	    CentY += 1.0f;
	}
	if (Key[0].button & CONT_DOWN) {
	    CentY -= 1.0f;
	}
	
	if (Key[1].button & CONT_UP) {
	    CamZrg1 += 1.0f;
	}
	if (Key[1].button & CONT_DOWN) {
	    CamZrg1 -= 1.0f;
	}
	if (Key[1].button & CONT_E) {
	    CamZrg2 += 1.0f;
	}
	if (Key[1].button & CONT_D) {
	    CamZrg2 -= 1.0f;
	}
	
	x = (float)Key_T[0].stick_x;
	y = (float)Key_T[0].stick_y;
	
	CamYa += x * 0.05f;
	CamXa -= y * 0.05f;

	PRINTF( "cxa=%f cya=%f\n",xa,ya );
	PRINTF( "czr1=%f czr2=%f\n",CamZrg1,CamZrg2 );
	PRINTF( "cX=%f cY=%f cZ=%f\n",cx,cy,cz );
	PRINTF( "eX=%f eY=%f eZ=%f\n",*ex,*ey,*ez );
	PRINTF( "wX=%f wY=%f wZ=%f\n\n",*wx,*wy,*wz );
	
//      PRINTF( "vX=%f vY=%f vZ=%f\n\n",vecX,vecY,vecZ );
    }
#endif
}

/************************************************************************/
/*									*/
/************************************************************************/
static void debug2_display( void )
{
    locY = 20;
    rectangle_rgba_a_prim();
    
    COLOR8X8( 0xff,0xff,0xff,0x10 );

    LOCATE8X8( 3, locY+3 );
    Printf( "R:%d\n",mojiR );
    LOCATE8X8( 3, locY+4 );
    Printf( "G:%d\n",mojiG );
    LOCATE8X8( 3, locY+5 );
    Printf( "B:%d\n",mojiB );
    LOCATE8X8( 3, locY+6 );
    Printf( "A:%d\n",mojiA );
}

#endif

/************************************************************************/
/* カメラの回転座標の計算						*/
/************************************************************************/
static void revo_pos_calc3( float cx, float cy, float cz,
			    float *ex, float *ey, float *ez, float ezr,
			    float *wx, float *wy, float *wz, float wzr,
			    float xa,  float ya )
{
    xyz_t ato;
    xyz_t mae;

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = wzr;

    translate_work( cx, cy, cz, 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;


    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = ezr;

    translate_work( cx, cy, cz, SET_MTX );
    rotateY_work( ANGLE(ya), MULT_MTX );
    rotateX_work( ANGLE(xa), MULT_MTX );

    MtxF_Position_work( &mae,&ato );

    *ex = ato.x;
    *ey = ato.y;
    *ez = ato.z;

    
    /* カメラの上方向の計算 */
    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 );

    vecX = ato.x;
    vecY = ato.y;
    vecZ = ato.z;

#if 0
    {
	float x,y;

	if (Key[1].button & CONT_L) {
	    CentZ += 1.0;
	}
	if (Key[1].button & CONT_R) {
	    CentZ -= 1.0;
	}
	if (Key[1].button & CONT_LEFT) {
	    CentX -= 1.0f;
	}
	if (Key[1].button & CONT_RIGHT) {
	    CentX += 1.0f;
	}
	
	if (Key[1].button & CONT_UP) {
	    CentY += 1.0f;
	}
	if (Key[1].button & CONT_DOWN) {
	    CentY -= 1.0f;
	}
	
	if (Key[2].button & CONT_UP) {
	    CamZrg1 += 1.0f;
	}
	if (Key[2].button & CONT_DOWN) {
	    CamZrg1 -= 1.0f;
	}
	if (Key[2].button & CONT_E) {
	    CamZrg2 += 1.0f;
	}
	if (Key[2].button & CONT_D) {
	    CamZrg2 -= 1.0f;
	}
	
	x = (float)Key_T[0].stick_x;
	y = (float)Key_T[0].stick_y;
	
	CamYa += x * 0.02f;
	CamXa -= y * 0.02f;

	PRINTF( "Zoff:%f\n",FoxTmZoff );
	PRINTF( "cxa:%f cya:%f\n",xa,ya );
	PRINTF( "czr1:%f czr2:%f\n",CamZrg1,CamZrg2 );
	PRINTF( "cX:%f cY:%f cZ:%f\n",cx,cy,cz );
	PRINTF( "eX:%f eY:%f eZ:%f\n",*ex,*ey,*ez );
	PRINTF( "wX:%f wY:%f wZ:%f\n\n",*wx,*wy,*wz );
    }
#endif
}

/************************************************************************/
/* ライトの回転座標の計算						*/
/************************************************************************/
static void revo_ligpos_calc( float xa, float ya, float lr,
			      float *rx, float *ry, float *rz )
{
    float cxa,cya;
    xyz_t ato;
    xyz_t mae;

    mae.x = 0.0f;
    mae.y = 0.0f;
    mae.z = lr;

#ifdef OLD_DEMO
    rotateX_work( ANGLE(-CamXa), SET_MTX );
    rotateY_work( ANGLE(-CamYa), MULT_MTX );
#else
    get_cam_ang( &cxa, &cya );
    rotateX_work( ANGLE(-cxa), SET_MTX );
    rotateY_work( ANGLE(-cya), MULT_MTX );
#endif

    rotateY_work( ANGLE(ya), MULT_MTX );
    rotateX_work( ANGLE(xa), MULT_MTX );
    
    MtxF_Position_work( &mae,&ato );
    
    *rx = ato.x;
    *ry = ato.y;
    *rz = ato.z;

#if 0
    PRINTF( "lxa  =%f lya  =%f\n",LigXa,LigYa );
    PRINTF( "lxa2 =%f lya2 =%f\n",LigXa2,LigYa2 );
    PRINTF( "ligR =%d ligG =%d ligB =%d\n",ligR,ligG,ligB );
    PRINTF( "kanR =%d kanG =%d kanB =%d\n\n",kanR,kanG,kanB );

//    PRINTF( "rX=%f rY=%f rZ=%f\n\n",*rx,*ry,*rz );
//    PRINTF( "CamXa=%f CamYa=%f\n",CamXa,CamYa );
#endif
}

/************************************************************************/
/* カメラの角度の取得							*/
/************************************************************************/
static void get_cam_ang( float *xa, float *ya )
{
    float x,y,z;

    x = eyeX-wayX;
    y = eyeY-wayY;
    z = eyeZ-wayZ;

    *xa = -fatan3( y,sqrtf((x*x)+(z*z)) ) * (180.0f/F_PI);
    *ya =  fatan3( x,z ) * (180.0f/F_PI);
}

/************************************************************************/
/* カメラの上方向の計算							*/
/************************************************************************/
static void get_cam_vec( float xa, float ya )
{
    xyz_t ato;
    xyz_t mae;

    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 );

    vecX = ato.x;
    vecY = ato.y;
    vecZ = ato.z;
}

/************************************************************************/
/*									*/
/************************************************************************/
static void push2_now( void )
{
    push_now();
    set_lookat_now( eyeX, eyeY, eyeZ,
		    wayX, wayY, wayZ,
		    vecX, vecY, vecZ, MULT_MTX );

    translate_now( 0.0f, 0.0f, 0.0f, MULT_MTX);
    set_matrix(&NOW_DISP);
}

/*+=====================================================================+
  |	メッセージセットダイレクトアドレスセット 2		        |
  +=====================================================================+*/
static void message_ad_set2(u16 **a, int c)
{
    msg_TBL_ad = a;
    msg_ptr = 0;
    message_ad = a[msg_ptr];

    face_NO = c;
    face_stat = 100;

    switch( system_mode ) {
    case TITLE:
	mojiYp = 180;
	mojiXp = 80;
	wakuXp = 80.0f;
	wakuYp = 174.0f;
	wakuXs = 6.63f;
	faceXp = 32.0f;
	faceYp = 174.0f;
	break;
    case GAME:
	mojiYp = 184;
	mojiXp = 109;
	wakuXp = 107.0f;
	wakuYp = 178.0f;
	wakuXs = 4.53f;
	faceXp = 61.0f;
	faceYp = 178.0f;
	break;
    }

    /** Voice SET **/
    Na_StartMesVoice( get_msg_num(message_ad) );
}









































#if 0
/************************************************************************/
/************************************************************************/
/************************************************************************/

/************************************************************************/
/* コーネリアをめざすグレートフォックス号				*/
/************************************************************************/
static void GrFox_Move( void )
{
    float res,res1;

    switch( demo_cut_phase ) {
    case 0:
	GrFox_Move_init();
#if 1
	cam_sp = 0.002f;
	demo_cut_phase = 100;
	SoundTime = 0;
#else
	fade_A = 0x00;
	gf_disp = ON;
	op_rogo_flg = 1;
	demo_cut_phase = 4;
#endif
	break;
    case 100:
	if( fade_A != 0 ) {
	    fade_A -= 0x05;
	} else {
	    wait_time = 70-51;
	    demo_cut_phase = 1;
	}
	break;
    case 1:
	if( wait_time ) break;
	/* "STARFOX" 表示 */
	res = add_calc( &Op1RogoA,  255.0f, cam_sp, 100.0f, 1.0f );
	cam_sp *= 1.08f;
	
	if( res == 0.0f ) {
	    wait_time = 50;
	    wait_time1 =  85;
	    cam_sp1 = 0.01f;
	    cam_sp = 0.002f;
	    demo_cut_phase++;
	}
	break;
    case 2:
	if( wait_time ) break;
	/* "STARFOX" 消す */
	add_calc( &Op1RogoA, 0.0f, cam_sp1, 100.0f, 0.1f );
	cam_sp1 *= 1.06f;

	if( wait_time1 ) break;
	/* "IN" 表示 */
	res = add_calc( &Op2RogoA,  255.0f, cam_sp, 100.0f, 1.0f );
	cam_sp *= 1.08f;

	if( res == 0.0f ) {
	    wait_time = 30;
	    cam_sp1 = 0.02f;
	    demo_cut_phase++;
	    op_fler_flg = 1;
	    fade_A = 0x00;
	}
	break;

    case 3:
	if( wait_time ) break;
	/* "IN" 消す */
	res = add_calc( &Op2RogoA, 0.0f, cam_sp1, 100.0f, 0.1f );
	cam_sp1 *= 1.07f;

	/* 太陽,太陽レンズフレアー表示 */
	if( flerXp < 1200.0f ) {
	    flerXp += 10.0f;
	    if( flerXp > 50.0f ) {
		/* Nキューブ 表示 */
		op_rogo_flg = 1;
		Op1RogoA += 1.8f;
	    }
	} else {
	    op_fler_flg = 0;
	    demo_cut_phase++;
	}
	break;

    case 4:
	/* Nキューブ 表示 */
	if( Op1RogoA < 255.0f ) {
	    Op1RogoA += 1.0f;
	} else {
	    Op1RogoA = 255.0f;
	    gf_disp = ON;
	    wait_time = 70;
	    time0 = 0;
	    cam_sp5 = 0.02f;
	    cam_sp1 = 0.00005f;
	    cam_sp2 = 0.02f;
	    cam_sp3 = 0.00005f;
	    cam_sp4 = 0.0001f;
	    cam_sp  = 0.0001f;
	    demo_cut_phase = 10;
	}
	break;

    case 10:
	if( SoundTime == 638 ) {
//	    Na_StartSceneSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	    message_ad_set( msg_00060,FACE_NUS );
	}
	if( SoundTime == 838 ) {
	    message_ad_set2( message_ad_data,FACE_Pepper );
	}
	
	if( wait_time ) break;
        /* Nキューブ 拡大 */
	if( NcXs < 1.39f ) {
	    NcXs += 0.01f;
	    NcYs += 0.01f;
	    NcXp -= 0.5f;
	    NcYp -= 0.5f;
	}

        /* Nキューブ 消す */
	res1 = add_calc( &Op1RogoA, 0.0f, cam_sp5, 100.0f, 0.1f );
	cam_sp5 *= 1.06f;
	if( res1 == 0.0f ) {
	    op_rogo_flg = -1;
	}

	/* グレートフォックス号 近づいてくる */
	if( time0 > 10 ) {
	    add_calc( &CamYa, -165.0f, cam_sp1, 100.0f, 0.0001f );
	    cam_sp1 += 0.00003f;
	}

	if( CamYa > -100.0f ) {
	    add_calc( &LigXa, 15.0f, cam_sp2, 100.0f, 0.0001f );
	    add_calc( &LigYa, -35.0f, cam_sp2, 100.0f, 0.0001f );
	    add_calc( &CamZrg1, 110.0f, cam_sp2, 100.0f, 0.0001f );
	    cam_sp2 -= 0.000005f;
	} else {
	    add_calc( &LigXa, -20.0f, cam_sp3, 100.0f, 0.0001f );
	    add_calc( &LigYa, -25.0f, cam_sp3, 100.0f, 0.0001f );
	    add_calc( &CamZrg1, 500.0f, cam_sp3, 100.0f, 0.0001f );
	    if( time0 > 550 ) {
		cam_sp3 += 0.0001f;
	    } else {
		cam_sp3 += 0.000001f;
	    }
	    starXad -= 2.0f;
	}

	if( time0 > 150 && time0 < 290 ) {
	    add_calc( &CentX,  10.0f, cam_sp4, 100.0f, 0.0001f );
	    add_calc( &CentY,  10.0f, cam_sp4, 100.0f, 0.0001f );
	    add_calc( &CamXa, -50.0f, cam_sp4, 100.0f, 0.0001f );
	    cam_sp4 += 0.0002f;
	}
	if( time0 > 300 ) {
	    add_calc( &CentX,  0.0f, cam_sp, 100.0f, 0.0001f );
	    add_calc( &CentY,  0.0f, cam_sp, 100.0f, 0.0001f );
	    add_calc( &CamXa, -5.0f, cam_sp, 100.0f, 0.0001f );
	    cam_sp += 0.0001f;
	}

	if( time0 == 260 ) cn.draw_sw = ON;

	if( time0 == 750 ) {
	    fade_A = 0x00;
	    fade_R = 0x00;
	    fade_G = 0x00;
	    fade_B = 0x00;
	    fade_sw = OUT;
	}
	if( fade_A == 0xff ) {
	    Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	    Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_BURNER );
	    demo_cut_phase = 0;
	    display_mode = DISPLAY_NOTH;
	    demo_phase = DEMO_CUT2;
	}

	time0++;
	break;
    }

    demo_fade();

    revo_pos_calc3( CentX, CentY, CentZ,
		    &eyeX, &eyeY, &eyeZ, CamZrg1,
		    &wayX, &wayY, &wayZ, CamZrg2,
		    CamXa, CamYa );

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );
    starXad += 1.0f;

    SoundTime++;
}

/************************************************************************/
/* 通路を走るフォックスチーム						*/
/************************************************************************/
static void Fox_Running( void )
{
#if 0
    float res;
#endif
    float xx,yy,zz,vc,ang;

#if 0
    static xyz_t up_wpos[4] = {
    	{  183.0f, 140.0f, -990.0f }, /* Slippey */
    	{   72.0f, 160.0f, -813.0f }, /* Peppey */
    	{ -239.0f, 190.0f, -820.0f }, /* Falco */
        {  -40.0f, 178.0f, -600.0f }, /* Fox */
    };

    static float CamZr[] = { 120.0f,200.0f,190.0f,180.0f };
    static float CamY[] = { -30.0f,-30.0f,50.0f,35.0f };
#else
    static xyz_t up_wpos[4] = {
    	{  150.0f, 150.0f, -1070.0f }, /* Slippey */
    	{  120.0f, 170.0f, -850.0f }, /* Peppey */
    	{ -170.0f, 190.0f, -890.0f }, /* Falco */
        {  -50.0f, 160.0f, -640.0f }, /* Fox */
    };

    static float CamX[] = {  -4.5f,-2.2f, 0.3f, 3.6f };
    static float CamY[] = { -11.6f,13.0f,24.8f,-7.6f };
    static int NameTime[] = { 60,58,48,58 };
#endif

    switch( demo_cut_phase ) {
    case 0:
	Fox_Running_init();
	Na_StartSystemSe( NA_SE_DEMO_SIREN );
	time0 = 0;
	run_p = 0;
	scroll_sp = 0.0f;
	scroll_spad = -70.0f;
	demo_cut_phase = 11;
	break;
    case 11:
	Na_StartSe( FoxSndPos, NA_SE_DENO_RUNNING );
	wait_time = 9;
	demo_cut_phase = 1;
	break;
    case 1:
	if( wait_time ) break;
	if( FoxTmZoff!= 0.0f ) {
	    if( FoxTmZoff < -100.0f ) {
		FoxTmZoff += 50.0f;
	    } else {
		add_calc( &FoxTmZoff, 0.0f, 0.09f, 100.0f, 0.1f );
	    }
	}
	
	if( time0 > 60 ) {
	    add_calc( &scroll_spad, 0.0f, 0.03f, 100.0f, 0.01f );
	}

	if( time0 > 60 && time0 < 100 ) {
	    add_calc( &CentY, 50.0f, 0.04f, 100.0f, 0.1f );
	    add_calc( &CentZ, -1000.0f, 0.04f, 100.0f, 0.1f );
	} else {
	    add_calc( &CentY, 100.0f, 0.04f, 100.0f, 0.1f );
	    add_calc( &CentZ, -330.0f, 0.04f, 100.0f, 0.1f );
	}	    

	if( time0 == 200 ) {
#if 0
	    PRINTF( "tm=%d\n",time0 );
	    PRINTF( "cy=%f\n",CentY );
	    PRINTF( "cz=%f\n",CentZ );
	    PRINTF( "sp=%f\n",scroll_spad );
	    PRINTF( "of=%f\n\n",FoxTmZoff );
#endif	
	    scroll_spad = 0.0f;

	    WorkX = CentX;
	    WorkY = CentY;
	    WorkZ = CentZ;
	    NextCentX = up_wpos[run_p].x;
	    NextCentY = up_wpos[run_p].y;
	    NextCentZ = up_wpos[run_p].z;
	    xx = NextCentX - CentX;
	    yy = NextCentY - CentY;
	    zz = NextCentZ - CentZ;
	    Vec=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );
	    cam_sp = 0.03f;
	    time0 = 0;
	    demo_cut_phase++;
	}
	time0 ++;
	break;

    case 2: /* 各顔にアップ */
#if 0
	add_calc( &CamYa, CamY[run_p], cam_sp, 100.0f, 0.0001f );
	add_calc( &CamZrg, CamZr[run_p], cam_sp, 100.0f, 0.0001f );
	add_calc( &wayX, up_wpos[run_p].x, cam_sp, 100.0f, 0.01f );
	add_calc( &wayY, up_wpos[run_p].y, cam_sp, 100.0f, 0.01f );
	res = add_calc( &wayZ, up_wpos[run_p].z, cam_sp, 100.0f, 0.01f );
	cam_sp *= 1.03f;

	if( fabsf(res) < 0.05f ) name_sw = ON;

	if( wayZ == up_wpos[run_p].z ) {
	    demo_cut_phase++;
	    wait_time = 30;
	}
#else
	add_calc( &CamXa, CamX[run_p], cam_sp, 100.0f, 0.0001f );
	add_calc( &CamYa, CamY[run_p], cam_sp, 100.0f, 0.0001f );

	add_calc( &WorkX, NextCentX, cam_sp, 100.0f, 0.01f );
	add_calc( &WorkY, NextCentY, cam_sp, 100.0f, 0.01f );
	add_calc( &WorkZ, NextCentZ, cam_sp, 100.0f, 0.01f );
	cam_sp *= 1.03f;

	xx = NextCentX - WorkX;
	yy = NextCentY - WorkY;
	zz = NextCentZ - WorkZ;
	vc=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );
	ang=ANGLE((1-(vc/Vec))*180.0f);

	switch( run_p ) {
	case 0:
	    /* スリッピー */
	    CentX = WorkX * (1+sinf(ang)*0.2f);
	    CentY = WorkY * (1+sinf(ang)*0.5f);
	    CentZ = WorkZ * (1-sinf(ang)*0.5f);
	    break;
	case 1:
	    /* ペピー */
	    CentX = WorkX * (1-sinf(ang)*0.2f);
	    CentY = WorkY * (1+sinf(ang)*0.4f);
	    CentZ = WorkZ * (1-sinf(ang)*0.2f);
	    break;
	case 2:
	    /* ファルコ */
	    CentX = WorkX * (1-sinf(ang)*0.5f);
	    CentY = WorkY * (1+sinf(ang)*0.5f);
	    CentZ = WorkZ;
	    break;
	case 3:
	    /* フォックス */
	    CentX = WorkX * (1-sinf(ang)*0.4f);
	    CentY = WorkY * (1+sinf(ang)*0.5f);
	    CentZ = WorkZ * (1-sinf(ang)*0.3f);
	    break;
	}

//	PRINTF( "p:%d r:%f\n",run_p,res );
//	PRINTF( "p:%d tm:%d\n",run_p,time0 );

//	if( fabsf(res) < 0.1f ) name_sw = ON;
	if( time0 == NameTime[run_p] ) name_sw = ON;

	if( CentZ == NextCentZ ) {
	    demo_cut_phase++;
	    wait_time = 30;
	}

	time0++;
#endif
	break;

    case 3:
	if( wait_time ) break;
//	if( Key_T[1].button & CONT_B ) {
	    name_sw = OFF;
	    run_p++;
	    WorkX = CentX;
	    WorkY = CentY;
	    WorkZ = CentZ;
	    if( run_p > 3 ) {
		time0 = 0;
		NextCentX = -100.0f;
		NextCentY =  160.0f;
		NextCentZ = -730.0f;
		demo_cut_phase = 4;
//		demo_cut_phase = 400;
	    } else {
		wait_time = 0;
		NextCentX = up_wpos[run_p].x;
		NextCentY = up_wpos[run_p].y;
		NextCentZ = up_wpos[run_p].z;
		cam_sp = 0.03f;
		demo_cut_phase = 2;
	    }
	    xx = NextCentX - CentX;
	    yy = NextCentY - CentY;
	    zz = NextCentZ - CentZ;
	    Vec=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );
	    time0 = 0;
//	}
	break;

    case 4:
#if 0
	add_calc( &CamXa, -10.0f, 0.02f, 100.0f, 0.0001f );
	add_calc( &CamYa, -100.0f, 0.02f, 100.0f, 0.0001f );
	add_calc( &CamZrg, 700.0f, 0.05f, 100.0f, 0.0001f );
	add_calc( &wayZ, -800.0f, 0.02f, 100.0f, 0.0001f );
#else
	add_calc( &CamXa, -30.8f, 0.04f, 100.0f, 0.0001f );
	add_calc( &CamYa, -108.1f, 0.04f, 100.0f, 0.0001f );
	add_calc( &CamZrg1, 550.0f, 0.04f, 100.0f, 0.0001f );

	add_calc( &WorkX, NextCentX, 0.05f, 100.0f, 0.01f );
	add_calc( &WorkY, NextCentY, 0.05f, 100.0f, 0.01f );
	add_calc( &WorkZ, NextCentZ, 0.05f, 100.0f, 0.01f );

	xx = NextCentX - WorkX;
	yy = NextCentY - WorkY;
	zz = NextCentZ - WorkZ;
	vc=sqrtf( (xx*xx)+(yy*yy)+(zz*zz) );
	ang=ANGLE((1-(vc/Vec))*180.0f);

	CentX = WorkX * (1-sinf(ang)*0.5f);
	CentY = WorkY * (1+sinf(ang)*0.3f);
	CentZ = WorkZ;
#endif
	if( time0 > 130 ) fade_sw = OUT;

	if( fade_A == 0xff ) {
	    Na_StopAllFlagSe( NA_SE_DEMO_SIREN );
	    Na_StopSe( FoxSndPos, NA_SE_DENO_RUNNING );
	    demo_cut_phase = 0;
	    display_mode = DISPLAY_NOTH;
	    demo_phase = DEMO_CUT3;
	}
	demo_fade();
	time0 ++;
	break;
    }

#if 0
    revo_pos_calc( cam_sw, &eyeX, &eyeY, &eyeZ, &wayX, &wayY, &wayZ,
		   CamXa, CamYa, CamZrg );
#else
    revo_pos_calc2( CentX, CentY, CentZ,
		    &eyeX, &eyeY, &eyeZ, CamZrg1,
		    &wayX, &wayY, &wayZ, CamZrg2,
		    CamXa, CamYa );
#endif
    
    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );
}



/************************************************************************/
/* アーウィン出撃 1 Init						*/
/************************************************************************/
static void Awin_Go1_init( void )
{
    register int i;
    float xp;

    fade_sw = End;
    fade_A = 0x00;
    fade_R = 0xff;
    fade_G = 0xff;
    fade_B = 0xff;

    Back_star_f = 800;

    col_p = 0;
    lig_sw = 1;
    
    /* Light */
    LigXa = -360.0f;
    LigYa = 131.0f;
    ligR = 90;
    ligG = 75;
    ligB = 90;
    kanR = 45;
    kanG = 34;
    kanB = 56;

    cn.pos.x = 0.0f;
    cn.pos.y = 0.0f;
    cn.pos.z = 1000.0f;
    cn.scale = 2.0f;
    cn.draw_sw = OFF;

    xp = -120.0f;
    for( i=0; i<4; i++,xp+=75.0f ) {
	awt[i].pos.x = xp;
	awt[i].pos.y = 0.0f;
	awt[i].pos.z = 0.0f;
	awt[i].scale = 0.5f;
	awt[i].Xang = 0.0f;
	awt[i].Yang = 0.0f;
	awt[i].Zang = 0.0f;
	awt[i].cang = -60.0f;
	awt[i].twinbmY = -10.0f;
	awt[i].kaoXa = 0.0f;
	awt[i].kaoYa = 0.0f;
	awt[i].kao = 4-i;

	awt[i].bfire_f = OFF;
	awt[i].bfire2_f = OFF;
	awt[i].bfire_scl = 0.0f;
	awt[i].speed = 0.05f;

	awt[i].kage_f = ON;
	awt[i].draw_f = ON;
    }

    CamZrg = 80.0f;
    CamXa = 10.0f;
    CamYa = 60.0f;

    wayX = 100.0f;
    wayY = 8.0f;
    wayZ = 0.0f;

    vecX = 0.0f;
    vecY = 1.0f;
    vecZ = 0.0f;

    /** TEST **/
    kataZ = 25.0f;
    hkoY = 84.0f;
    hkoZ = -20.0f;
    kageY = -33.0f;
}

/************************************************************************/
/* アーウィン出撃 1							*/
/************************************************************************/
static void Awin_Go1( void )
{
    register int i;
    int res4;
    float res,res1,res2,res3;
    xyz_t after,now;
    static xyz_t point[] = {
       {   -6.0f, 5.0f, 20.0f },
       { -120.0f, 0.0f,-10.0f },
    };
    
    switch( demo_cut_phase ) {
    case 0:
	Awin_Go1_init();
	Na_SetAllSeEfxOfs( NA_EFX_OPENING0 );
	Na_StartSystemSe( NA_SE_LIFT_UP );
	flags[0] = ON;
	cam_sp = 0.01f;
	wait_time1 = 10;
	wait_time = 10;
	awt[3].time = 0;
	awt[2].time = 20;
	awt[1].time = 40;
	awt[0].time = 60;
	demo_cut_phase++;
	break;

    case 1:
	if( wait_time ) break;
	add_calc( &CamYa, 45.0f, cam_sp, 100.0f, 0.001f );
	cam_sp *= 1.02f;

	if( wayX < awt[2].pos.x ) awt[3].draw_f = OFF;
	if( wayX < awt[1].pos.x ) awt[2].draw_f = OFF;
	if( wayX < awt[0].pos.x ) awt[1].draw_f = OFF;

	if( wayX < awt[1].pos.x-50.0f ) {
	    cam_sp1 = 0.03f;
	    demo_cut_phase++;
	}
	break;
    case 2:
	add_calc( &CamZrg, 90.0f, cam_sp1, 100.0f, 0.0001f );
	add_calc( &CamYa, 10.0f, cam_sp1, 100.0f, 0.0001f );
	add_calc( &CamXa, -60.0f, cam_sp1, 100.0f, 0.0001f );
	cam_sp1 -= 0.0001f;

	if( flags[0] == OFF ) {
	    Na_StartSe( awt[0].SndPos, NA_SE_ENGINE_START );
	    for( i=0; i<4; i++ ) {
		awt[i].speed = 0.04f;
		awt[i].speed2 = 0.09f;
		awt[i].bfire_f = ON;
		awt[i].draw_f = ON;
	    }
	    awt[0].time = 0;
	    awt[1].time = 40;
	    awt[2].time = 60;
	    awt[3].time = 80;
	    cam_sp = 0.03f;
	    cam_sp1 = 0.001f;
	    cam_sp2 = 0.0001f;
	    cam_sp3 = 0.0001f;
	    demo_cut_phase++;
	}
	break;
    case 3:
	add_calc( &CamYa, 70.0f, cam_sp1, 100.0f, 0.0001f );
	cam_sp1 += 0.001f;

	if( wayX < -10.0f ) {
	    add_calc( &CamXa, -110.0f, cam_sp2, 100.0f, 0.0001f );
	    add_calc( &CamZrg, 50.0f, cam_sp2, 100.0f, 0.0001f );
	    cam_sp2 += 0.002f;
	    
	} else {
	    add_calc( &CamXa, -60.0f, cam_sp3, 100.0f, 0.0001f );
	    add_calc( &CamZrg, 80.0f, cam_sp3, 100.0f, 0.0001f );
//	    add_calc( &CamZrg, 100.0f, cam_sp3, 100.0f, 0.0001f );
	    cam_sp3 += 0.001f;
	}

	for( i=0; i<4; i++ ) {
	    if( awt[i].time > 0 ) awt[i].time--;
	    if( awt[i].time != 0 ) continue;
	    add_calc( &(awt[i].bfire_scl), 1.2f,
		      awt[i].speed2, 100.0f, 0.0001f );
	    awt[i].speed *= 1.02f;
	    awt[i].speed2 *= 1.07f;
	}

	if( flags[0] == -1 ) {
	    cn.draw_sw = ON;
	    cam_sp = 0.06f;
	    demo_cut_phase++;
	}
	break;

    case 4:
	add_calc( &CamXa, -5.0f, cam_sp, 100.0f, 0.01f );
	add_calc( &CamYa, 152.0f, cam_sp, 100.0f, 0.01f );
	cam_sp *= 1.08f;

	if( CamYa == 152.0f ) {
	    awt[3].time = 0;
	    awt[2].time = 20;
	    awt[1].time = 40;
	    awt[0].time = 60;
	    cam_sp = 0.02f;
	    demo_cut_phase++;
	    for( i=0; i<4; i++ ) {
		awt[i].speed = 0.1f;
	    }
	}
	break;
    case 5:
	res3 = add_calc( &wayX, awt[0].pos.x, cam_sp, 100.0f, 0.0001f );
	add_calc( &CamYa, 165.0f, cam_sp, 100.0f, 0.0001f );
	add_calc( &CamZrg, 70.0f, cam_sp, 100.0f, 0.0001f );
	cam_sp *= 1.02f;

	for( i=3; i>=0; i-- ) {
	    if( awt[i].time > 0 ) awt[i].time--;
	    if( awt[i].time > 0 ) continue;

	    if( awt[i].time == 0 ) {
		Na_StartSe( awt[i].SndPos, NA_SE_ARWING_DASH );
		 awt[i].time = -1;
	    }

	    awt[i].bfire_scl = 2.8f;
	    add_calc( &(awt[i].pos.z),
		      900.0f, awt[i].speed, 100.0f, 0.0001f );
	    add_calc( &(awt[i].pos.y),
		      -20.0f, awt[i].speed, 100.0f, 0.0001f );
	    awt[i].speed *= 1.1f;

	    add_calc( &(awt[i].scale),
		      0.01f, awt[i].speed, 100.0f, 0.0001f );
	}

	if( res3 > -0.5f ) {
	    Na_StopSe( awt[0].SndPos, NA_SE_ENGINE_START );
	    Na_SetAllSeEfxOfs( NA_EFX_OFF );
	    demo_cut_phase = 0;
	    display_mode = DISPLAY_NOTH;
	    demo_phase = DEMO_CUT5;
	}
	break;
    }

    if( demo_cut_phase != 0 && !wait_time1 && flags[0] != -1 ) {
	if( flags[0] ) { 
	    for( i=3; i>=0; i-- ) {
		if( awt[i].time > 0 ) awt[i].time--;
		if( awt[i].time != 0 ) continue;
		
		add_calc( &(awt[i].twinbmY), 0.0f,
			  awt[i].speed, 100.0f, 0.0001f );
		add_calc( &(awt[i].cang), 0.0f,
			  awt[i].speed, 100.0f, 0.0001f );
		awt[i].speed *= 1.04f;
	    }

	    res1 = add_calc( &wayX, awt[0].pos.x-30.0f, 0.04f, 3.0f, 0.01f );
	    if( res1 > -0.1f ) {
		flags[0] = OFF;
	    }
	} else {
	    res = add_calc( &wayX, 105.0f, 0.06f, 2.0f, 0.1f );
	    if( res <= 0.2f ) {
		flags[0] = -1;
	    }
	}

//	add_calc( &hkoY, 0.0f, 0.02f, 100.0f, 0.01f );
	
    }

    if( demo_cut_phase != 0 && hkoY != 0.0f ) {
	hkoY -= 1.0f;
	if( hkoY <= 0.0f ) {
	    hkoY = 0.0f;
	    Na_StartSystemSe( NA_SE_LIFT_UP_END );
	}
    }
    
    revo_pos_calc( 1, &eyeX, &eyeY, &eyeZ,
		   &wayX, &wayY, &wayZ, CamXa, CamYa, CamZrg );

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );
}

/************************************************************************/
/* アーウィン出撃 2 Init						*/
/************************************************************************/
static void Awin_Go2_init( void )
{
    register int i;

    Back_star_f = ON;

    BakuCnt = 10;
    for( i=0; i<10; i++ ) {
	BakuXp[i] = -100.0f + -(rnd()*100.0f);
	BakuYp[i] = 70.0f + (rnd()*80.0f);
	BakuScl[i] = 0.0f;
	BakuScl2[i] = 0.02f+(rnd()*0.3f);
	BakuWait[i] = 5+(int)(rnd()*5.0f);
	BakuMaxSw[i] = OFF;
    }

    draw_sw = ON;
    
    fade_sw = End;
    fade_A = 0x00;
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;

#ifdef OLD_DEMO2
    cn.pos.x = -300.0f;
    cn.pos.y = -50.0f;
    cn.scale = 5.0f;
#else
    cn.pos.x = -100.0f;
    cn.pos.y = 20.0f;
    cn.scale = 8.0f;
#endif
    cn.pos.z = 1000.0f;
    cn.draw_sw = OFF;

    gfox.pos.x = 0.0f;
    gfox.pos.y = 0.0f;
    gfox.pos.z = 0.0f;
    gfox.Xang = 0.0f;
    gfox.Yang = 0.0f;
    gfox.Zang = 0.0f;
    gfox.scale = 0.1f;

    LigXa = 0.0f;
    LigYa = 0.0f;
    ligR = 101;
    ligG = 106;
    ligB = 92;
    kanR = 3;
    kanG = 4;
    kanB = 10;

    for( i=0; i<4; i++ ) {
	awt[i].pos.x = 0.0f;
	awt[i].pos.y = -40.0f;
	awt[i].pos.z = -30.0f;
	awt[i].scale = 0.1f;
	awt[i].Xang = 0.0f;
	awt[i].Yang = 0.0f;
	awt[i].Zang = 0.0f;
	awt[i].speed = 0.05f;
	awt[i].cang = 0.0f;
	awt[i].twinbmY = 0.0f;
	awt[i].kaoXa = 0.0f;
	awt[i].kaoYa = 0.0f;
	awt[i].kao = i+1;
	awt[i].bfire_f = ON;
	awt[i].bfire2_f = OFF;
	awt[i].bfire_scl = 1.2f;
	awt[i].kage_f = OFF;
    }

#ifdef OLD_DEMO2
    wayX = 0.0f;
    wayY = -40.0f;
    wayZ = 30.0f;

    CamZrg = 55.0f;
    CamXa = 15.0f;
    CamYa = 35.0f;
#else
    CentX = 10.0f;
    CentY = -35.0f;
    CentZ = 35.0f;

    CamXa = -25.0f;
    CamYa = -52.5f;
    CamZrg1 = 75.0f;
    CamZrg2 = 50.0f;
#endif

    vecX = 0.0f;
    vecY = 1.0f;
    vecZ = 0.0f;
}

/************************************************************************/
/* アーウィン出撃 2							*/
/************************************************************************/
static void Awin_Go2( void )
{
    register int i;
    int res;
    float xx,yy,zz;

    static float stop_X[] = {  -15.0f, -5.0f,   5.0f,  10.0f };
    static float stop_Y[] = { -50.0f, -45.0f, -55.0f, -60.0f };
#ifdef OLD_DEMO2
    static float stop_Z[] = {  95.0f,  90.0f,  85.0f,  60.0f };
#else
    static float stop_Z[] = { 165.0f,  160.0f, 155.0f, 130.0f };
#endif
    static float camXa[] = {  18.5f,  39.2f,  10.8f };
    static float camYa[] = { -23.8f,  50.7f, 155.8f };
    static float centX[] = {  -3.0f,  -8.0f,  29.0f };


    switch( demo_cut_phase ) {
    case 0:
	Awin_Go2_init();
	time0 = 0;

#ifdef OLD_DEMO2
	cam_sp = 0.06f;
	cam_sp1 = 0.01f;
	awt[0].time = 0 * 15;
	awt[1].time = 1 * 15;
	awt[2].time = 2 * 15;
	awt[3].time = 3 * 15;
	demo_cut_phase = 10;
#else
	awt[0].time = 1;
//	awt[0].time = 3;
	awt[1].time = 22;
	awt[2].time = 47;
	awt[3].time = 105;

	cam_sp = 0.001f;
	cam_sp1 = 0.001f;
	cam_sp2 = 0.0001f;
	demo_cut_phase = 10;
	cn.draw_sw = ON;
#endif
	break;
    case 11:
	if( CamYa < 50.0f ) {
	    add_calc( &CamXa, 61.0f, cam_sp1, 100.0f, 0.0001f );
	    add_calc( &CentX, -6.0f, cam_sp1, 100.0f, 0.0001f );
//	    add_calc( &CentX, -4.0f, cam_sp1, 100.0f, 0.0001f );
//	    cam_sp1 += 0.004f;
	    cam_sp1 += 0.006f;
	} else {
	    add_calc( &CamXa, 10.0f, cam_sp2, 100.0f, 0.0001f );
	    add_calc( &CentX,  20.0f, cam_sp2, 100.0f, 0.0001f );
//	    cam_sp2 += 0.0004f;
	    cam_sp2 += 0.0006f;
	}
	add_calc( &CamYa, 156.0f, cam_sp, 100.0f, 0.0001f );
//	cam_sp += 0.0004f;
	cam_sp += 0.0006f;
	
	for( i=0; i<4; i++ ) {
	    if( awt[i].time > 0 ) awt[i].time--;
	    if( awt[i].time == 0 ) continue;

	    add_calc( &(awt[i].pos.y), stop_Y[i], awt[i].speed,
		      100.0f, 0.00001f );
	    add_calc( &(awt[i].pos.x), stop_X[i], awt[i].speed,
		      100.0f, 0.00001f );
	    add_calc( &(awt[i].pos.z), stop_Z[i], awt[i].speed,
		      100.0f, 0.00001f );
//	    awt[i].speed *= 1.09f;
	    awt[i].speed *= 1.05f;
	    
	    if( awt[i].pos.z == stop_Z[i] ) {
		awt[i].scale -= 0.0005f;
		if( awt[i].scale < 0.0f ) awt[i].scale = 0.0f;
	    }

	    xx = stop_X[i] - awt[i].pos.x;
	    yy = stop_Y[i] - awt[i].pos.y;
	    zz = (stop_Z[i]+10.0f) - awt[i].pos.z;
	    awt[i].Xang = -fatan3( yy,sqrtf((xx*xx)+(zz*zz)) )*180.0f/F_PI;
	    awt[i].Yang = fatan3( xx,zz )*180.0f/F_PI;
	}
	
	if( time0 == 180 ) {
	    time0 = 0;
	    cam_sp = 0.02f;
	    demo_cut_phase++;
	}

//	PRINTF( "tm=%d\n",time0 );
	
	time0++;
	break;

    case 12:
	add_calc( &CamXa, 10.0f, cam_sp, 100.0f, 0.01f );
	add_calc( &CamZrg1, 700.0f, cam_sp, 100.0f, 0.01f );
	cam_sp *= 1.02f;

	if( time0 == 50 ) fade_sw = OUT;

	if( fade_A == 0xff ) {
	    wait_time = 40;
	    demo_cut_phase++;
	}
	demo_fade();
	time0++;
	break;
	
    case 13:
	if( wait_time ) break;
	fade_A = 0x00;
	Back_star_f = OFF;
	draw_sw = OFF;
//	wait_time = 40;
	wait_time = 20;
	demo_cut_phase++;
	break;
    case 14:
	if( wait_time ) break;
	demo_cut_phase = 0;
	display_mode = DISPLAY_NOTH;
	demo_phase = DEMO_TITL;
	break;


    case 10:
	Na_StartSceneSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	demo_cut_phase = 1;
	break;
    case 1:
	for( i=0; i<4; i++ ) {
	    if( awt[i].time > 0 ) awt[i].time--;
	    if( awt[i].time == 0 ) {
		Na_StartSe( awt[i].SndPos, NA_SE_ARWIN_GO_OUT );
		awt[i].time = -1;
	    }

	    add_calc( &(awt[i].pos.y), stop_Y[i], awt[i].speed,
		      100.0f, 0.00001f );
	    add_calc( &(awt[i].pos.x), stop_X[i], awt[i].speed,
		      100.0f, 0.00001f );
	    add_calc( &(awt[i].pos.z), stop_Z[i], awt[i].speed,
		      100.0f, 0.00001f );

	    xx = stop_X[i] - awt[i].pos.x;
	    yy = stop_Y[i] - awt[i].pos.y;
	    zz = (stop_Z[i]+10.0f) - awt[i].pos.z;

	    awt[i].Xang = -fatan3( yy,sqrtf((xx*xx)+(zz*zz)) )*180.0f/F_PI;
	    awt[i].Yang = fatan3( xx,zz )*180.0f/F_PI;

	    awt[i].speed *= 1.07f;

#if 0
	    PRINTF( "AW i:%d spx:%f spy:%f spz:%f\n",i,
		    awt[i].SndPos[0],
		    awt[i].SndPos[1],
		    awt[i].SndPos[2] );
#endif

	}
	if( awt[3].pos.z > 40.0f ) {
	    cn.draw_sw = ON;
	    add_calc( &CamZrg, 105.0f, cam_sp, 100.0f, 0.0001f );
	    add_calc( &CamXa, 10.0f, cam_sp, 100.0f, 0.0001f );
	    res = add_calc( &CamYa, 145.0f, cam_sp, 100.0f, 0.01f );
	    cam_sp *= 1.05f;

	    if( res < 0.1f ) fade_sw = OUT;

	    if( fade_A == 0xff ) {
		Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
		wait_time = 40;
		demo_cut_phase++;
	    }
	    demo_fade();
	}
	break;
    case 2:
	if( wait_time ) break;
	fade_A = 0x00;
	Back_star_f = OFF;
	draw_sw = OFF;
	wait_time = 90;
	demo_cut_phase++;
	break;
    case 3:
	if( wait_time ) break;
	demo_cut_phase = 0;
	display_mode = DISPLAY_NOTH;
	demo_phase = DEMO_TITL;
	Key_wait_time = 3;
	break;
    }

#if 0
    PRINTF( "GF spx:%f spy:%f spz:%f\n",
	    gfox.SndPos[0],
	    gfox.SndPos[1],
	    gfox.SndPos[2] );
#endif

#ifdef OLD_DEMO2
    revo_pos_calc( 1, &eyeX, &eyeY, &eyeZ,
		   &wayX, &wayY, &wayZ, CamXa, CamYa, CamZrg );
#else
    revo_pos_calc3( CentX, CentY, CentZ,
		    &eyeX, &eyeY, &eyeZ, CamZrg1,
		    &wayX, &wayY, &wayZ, CamZrg2,
		    CamXa, CamYa );
#endif

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );
    starXad += 3.0f;
    starYad += 1.0f;
}

/************************************************************************/
/* アーウィン出撃 2 表示						*/
/************************************************************************/
static void Awin_Go2_display( void )
{
    register int i;

    if( draw_sw == OFF ) return;
    
    if( cn.draw_sw ) {
	CN_display( 0.0f );
#ifndef OLD_DEMO2
	bakuhatu_display();
#endif
    }

    gfox_display();

    for( i=0; i<4; i++ ) {
	if( awt[i].time > 0 ) continue;
	awins_display( i );
    }

#if 0
    if( Key_T[1].button & CONT_UP ) {
	cn.pos.y += 10.0f;
    }
    if( Key_T[1].button & CONT_DOWN ) {
	cn.pos.y -= 10.0f;
    }
    if( Key_T[1].button & CONT_RIGHT ) {
	cn.pos.x += 10.0f;
    }
    if( Key_T[1].button & CONT_LEFT ) {
	cn.pos.x -= 10.0f;
    }
    if( Key_T[1].button & CONT_E ) {
	cn.scale += 1.0f;
    }
    if( Key_T[1].button & CONT_D ) {
	cn.scale -= 1.0f;
    }

    PRINTF( "x:%f y:%f sc:%f\n",cn.pos.x,cn.pos.y,cn.scale );
#endif
}

/************************************************************************/
/* テスト用								*/
/************************************************************************/
static void point_display0( void )
{
    float xa,ya;

    get_cam_ang( &xa, &ya );
    
    push_now();
	
    translate_now( px,py,pz, MULT_MTX);
    
    rotateY_now( ANGLE(ya), MULT_MTX );
    rotateX_now( ANGLE(xa), MULT_MTX );
    
    scale_now( 1.0f, 1.0f, 1.0f, MULT_MTX);

    set_matrix(&NOW_DISP);
    
    /**nowtoMtx(NOW_MTX);
    gSPMatrix(NEXT_DISP, NEXT_MTX,
	      G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH);**/
    
    texture_z_a_prim();
    gDPSetPrimColor( NEXT_DISP, 0, 0, 0xff, 0x00, 0x00, 0x80 );
    gSPDisplayList( NEXT_DISP, JT_Lightsign );
    
    /**gSPPopMatrix( NEXT_DISP, G_MTX_MODELVIEW );**/
    pull_now();
}




/************************************************************************/
/* コーネリアに向うアーウィン Init					*/
/************************************************************************/
static void Awin_GotoCN_init( void )
{
    register int i;

    Back_star_f = ON;

    fade_sw = End;
    fade_A = 0x00;
    fade_R = 0x00;
    fade_G = 0x00;
    fade_B = 0x00;

    LigXa = -90.0f;
    LigYa = 0.0f;
    ligR = 101;
    ligG = 106;
    ligB = 92;
    kanR = 3;
    kanG = 4;
    kanB = 10;

    cn.pos.x = 0.0f;
    cn.pos.y = 0.0f;
    cn.pos.z = 0.0f;
    cn.scale = 6.0f;

    for( i=0; i<4; i++ ) {
#ifdef CCC
	awt[i].pos.x = Awin_Mov_data[i][0].x;
	awt[i].pos.y = Awin_Mov_data[i][0].y;
	awt[i].pos.z = Awin_Mov_data[i][0].z;
#endif
	awt[i].scale = 0.6f;
	awt[i].Xang = 0.0f;
	awt[i].Yang = 0.0f;
	awt[i].Zang = 0.0f;
	awt[i].speed = 0.03f;
	awt[i].speed2 = 0.05f;
	awt[i].cang = 0.0f;
	awt[i].twinbmY = 0.0f;
//	awt[i].wingAng = 0.0f;
	awt[i].kaoXa = 0.0f;
	awt[i].kaoYa = 0.0f;
	awt[i].kao = 0;
//	awt[i].kao = i+1;
	awt[i].bfire_f = ON;
	awt[i].bfire_f = OFF;
	awt[i].bfire_scl = 1.0f;
//	awt[i].bfire_scl = 2.8f;
	awt[i].kage_f = OFF;
    }

    awt[0].pos.x = 1000.0f;
    awt[0].pos.y = 300.0f;
    awt[0].pos.z = -1100.0f;

    awt[1].pos.x = -300.0f;
    awt[1].pos.y = 700.0f;
    awt[1].pos.z = -1100.0f;

    awt[2].pos.x = 200.0f;
    awt[2].pos.y = -700.0f;
    awt[2].pos.z = -1100.0f;

    awt[3].pos.x = -1000.0f;
    awt[3].pos.y = -100.0f;
    awt[3].pos.z = -1100.0f;

    awt[0].time = 0;
    awt[1].time = 20;
    awt[2].time = 40;
    awt[3].time = 60;

    CamXa = 0.0f;
    CamYa = 180.0f;
    CamZrg = 400.0f;

    wayX = 0.0f;
    wayY = 0.0f;
    wayZ = 0.0f;

    vecX = 0.0f;
    vecY = 1.0f;
    vecZ = 0.0f;
}

/************************************************************************/
/* コーネリアに向うアーウィン						*/
/************************************************************************/
static void Awin_GotoCN( void )
{
    register int i;

    static xyz_t AwEndPos[]={
        {  50.0f,  30.0f, -160.0f },
    	{ -65.0f,  40.0f, -160.0f },
    	{  70.0f, -40.0f, -160.0f },
    	{ -35.0f, -50.0f, -160.0f },
    };
    static xyz_t AwEndPos2[]={
    	{ -15.0f, -10.0f, -5.0f },
    	{  15.0f, -15.0f, -5.0f },
        { -20.0f,  15.0f, -5.0f },
        {  20.0f,  10.0f, -5.0f },
    };
#ifdef CCC
    static xyz_t AwEndPos2[]={
        {  30.0f,  10.0f, -5.0f },
        { -50.0f,  20.0f, -5.0f },
    	{  50.0f, -20.0f, -5.0f },
    	{ -15.0f, -40.0f, -5.0f },
    };
#endif
//    static float ZaMax[] = { 15.0f, 5.0f, 20.0f, -20.0f };
    static float ZaMax[] = { 30.0f, 20.0f, 35.0f, -35.0f };

    float res;

    switch( demo_cut_phase ) {
    case 0:
	Awin_GotoCN_init();
	for( i=0; i<4; i++ ) flags[i] = 1;
	time0 = 0;
	demo_cut_phase++;
 	break;
    case 1:
	for( i=0; i<4; i++ )  {
	    if( awt[i].time > 0 ) awt[i].time--;
	    if( awt[i].time != 0 ) continue;

	    if( flags[i] ) {
		add_calc( &(awt[i].pos.x), AwEndPos[i].x,
			  awt[i].speed, 100.0f, 0.0001f );
		add_calc( &(awt[i].pos.y), AwEndPos[i].y,
			  awt[i].speed, 100.0f, 0.0001f );
		res = add_calc( &(awt[i].pos.z), AwEndPos[i].z,
				awt[i].speed, 100.0f, 0.0001f );

		awt[i].speed *= 1.04f;

		add_calc( &(awt[i].Zang), ZaMax[i], awt[i].speed2,
			  100.0f, 0.00001f );
		awt[i].speed2 *= 1.03f;

		if( res < 1.0f ) {
		    awt[i].bfire_scl = 1.0f;
		    awt[i].speed = 0.02f;
		    awt[i].speed2 = 0.02f;
		    flags[i] = 0;
		}
	    } else {
#if 1
		add_calc( &(awt[i].pos.x), AwEndPos2[i].x,
			  awt[i].speed, 100.0f, 0.0001f );
		add_calc( &(awt[i].pos.y), AwEndPos2[i].y,
			  awt[i].speed, 100.0f, 0.0001f );
		add_calc( &(awt[i].pos.z), AwEndPos2[i].z,
			  awt[i].speed, 100.0f, 0.0001f );

		awt[i].speed *= 1.03f;

		if( awt[i].scale > 0.05f ) awt[i].scale -= 0.05f;

		add_calc( &(awt[i].Zang), 0.0f, awt[i].speed2,
			  100.0f, 0.00001f );
		awt[i].speed2 *= 1.05f;
#endif
	    }
	}

	if( time0 > 100 ) {
	    fade_sw = OUT;
	    demo_cut_phase++;
	}
	time0++;
	break;
    case 2:
	if( fade_sw == End ) {
	    demo_cut_phase = 0;
	    display_mode = DISPLAY_NOTH;
	    demo_phase = DEMO_TITL;
	}
	break;
    }

    demo_fade();

    revo_pos_calc( 1, &eyeX, &eyeY, &eyeZ,
		   &wayX, &wayY, &wayZ,
		   CamXa, CamYa, CamZrg );

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );
}

/************************************************************************/
/* コーネリアに向うアーウィン 表示					*/
/************************************************************************/
static void Awin_GotoCN_display( void )
{
    register int i;

    CN_display();

    for( i=0; i<4; i++ )
	awins_display( i );
}

/************************************************************************/
/* 通路を走るフォックスチーム						*/
/************************************************************************/
static void Fox_Running( void )
{
    static int DataPoint[] = { 0, 5, 11, 18, 23 };
    static int DataPointCnt[] = { 6, 7, 8, 6, 8 };

    switch( demo_cut_phase ) {
    case 0:
	Fox_Running_init();
	Na_StartSystemSe( NA_SE_DEMO_SIREN );
	Na_StartSe( FoxSndPos, NA_SE_DENO_RUNNING );

	time0 = 0;
	scroll_sp = 0.0f;
//	wait_time = 9;

	CutTime = 0;
#if 0
//	DataAdd = (cam_t *)SEGMENT_TO_KSEG0( FoxRunCamData );
	DataAdd = FoxRunCamData;
	PointNum = 0;
	t = 0.0f;
	tsp = 0.1f;
#endif
	demo_cut_phase++;
	break;
    case 1:
//	if( wait_time ) break;
	if( time0 == 20 ) fade_sw = IN;

	if( FoxTmZoff != 0.0f ) {
	    add_calc( &FoxTmZoff, 0.0f, 0.09f, 70.0f, 1.0f );
//	    PRINTF( "z:%f\n",FoxTmZoff );
#if 0
	    if( FoxTmZoff < -100.0f ) {
		FoxTmZoff += 50.0f;
	    } else {
		add_calc( &FoxTmZoff, 0.0f, 0.09f, 100.0f, 0.001f );
		PRINTF( "z:%f\n",FoxTmZoff );
	    }
#endif
	}

#if 0
//	if( time0 > 117 ) {
	if( time0 > 112 ) {
	    add_calc( &CentZ, -600.0f, 0.09f, 100.0f, 0.01f );
	    revo_pos_calc3( CentX, CentY, CentZ,
			    &eyeX, &eyeY, &eyeZ, CamZrg1,
			    &wayX, &wayY, &wayZ, CamZrg2,
			    CamXa, CamYa );
//	    PRINTF( "tm:%d cz:%f\n",time0,CentZ );
	}

	if( time0 > 60 ) {
	    add_calc( &scroll_spad, 0.0f, 0.03f, 100.0f, 0.01f );

	    get_cam_ang( &CamXa, &CamYa );
	    get_cam_vec( CamXa, CamYa );
	    PlayData( DataAdd, FOX_RUN_DATA1, tsp );
	}
#endif

	if( FoxTmZoff == 0.0f ) {
//	if( time0 == 200 ) {
//	    PRINTF( "tm:%d\n",time0 );
	    time0 = 0;

	    run_p = 0;
//	    DataAdd = (cam_t *)SEGMENT_TO_KSEG0( FoxRunCamData2 );
	    DataAdd = FoxRunCamData2;

	    PointNum = 0;
	    t = 0.0f;
	    tsp = 0.04f;
	    demo_cut_phase++;
	}
	time0 ++;
	break;

    case 2: /* 各顔にアップ */
	get_cam_ang( &CamXa, &CamYa );
	get_cam_vec( CamXa, CamYa );
	PlayData( &DataAdd[DataPoint[run_p]], DataPointCnt[run_p], tsp );

	if( PointNum == -1 ) {
	    name_sw = ON;
//	    wait_time = 45;
	    wait_time = 40;
	    demo_cut_phase = 3;
	}
	break;
    case 3:
	if( !wait_time ) {
	    PointNum = 0;
	    t = 0.0f;
	    name_sw = OFF;
	    run_p++;
	    if( run_p > 3 ) {
		time0 = 0;
		tsp = 0.04f;
		demo_cut_phase = 4;
	    } else {
		demo_cut_phase = 2;
	    }
	}
	break;
    case 4:
	get_cam_ang( &CamXa, &CamYa );
	get_cam_vec( CamXa, CamYa );
	PlayData( &FoxRunCamData2[DataPoint[run_p]],
		  DataPointCnt[run_p], tsp );

	if( time0 > 110 ) fade_sw = OUT;
	
	if( fade_A == 0xff ) {
	    Na_StopAllFlagSe( NA_SE_DEMO_SIREN );
	    Na_StopSe( FoxSndPos, NA_SE_DENO_RUNNING );
	    demo_cut_phase = 0;
	    display_mode = DISPLAY_NOTH;
	    demo_phase = DEMO_CUT3;

//	    PRINTF( "ctm:%d\n",CutTime );
	}
	time0 ++;
	break;
    }

    demo_fade();

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    CutTime++;
}

/************************************************************************/
/* アーウィン出撃 2							*/
/************************************************************************/
static void Awin_Go2( void )
{
    register int i;
    float xx,yy,zz;

    static float stop_X[] = {  -15.0f, -5.0f,   5.0f,  10.0f };
    static float stop_Y[] = { -50.0f, -45.0f, -55.0f, -60.0f };
    static float stop_Z[] = { 265.0f,  260.0f, 255.0f, 230.0f };

    switch( demo_cut_phase ) {
    case 0:
	Na_StartSceneSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	Awin_Go2_init();
	time0 = 0;
	CutTime = 0;

	cn.draw_sw = ON;

	awt[0].time = 3;
	awt[1].time = 25;
	awt[2].time = 45;
	awt[3].time = 65;

//	DataAdd = (cam_t *)SEGMENT_TO_KSEG0( AwinGo2CamData );
	DataAdd = AwinGo2CamData;
	PointNum = 0;
	t = 0.0f;
	tsp = 0.1f;
	demo_cut_phase++;
	break;
    case 1:
#if 0
	get_cam_ang( &CamXa, &CamYa );
	get_cam_vec( CamXa, CamYa );
	PlayData( DataAdd, AWIN_GO2_MV_DATA, tsp );
//	PlayData( DataAdd, DataCnt, tsp );
#endif
	for( i=0; i<4; i++ ) {
	    if( awt[i].time > 0 ) {
		awt[i].time--;
		continue;
	    }
	    if( awt[i].time == 0 ) {
		Na_StartSe( awt[i].SndPos, NA_SE_ARWIN_GO_OUT );
		awt[i].time = -1;
		awt[i].draw_f = ON;
	    }

	    add_calc( &(awt[i].pos.y), stop_Y[i], awt[i].speed,
		      100.0f, 0.001f );
	    add_calc( &(awt[i].pos.x), stop_X[i], awt[i].speed,
		      100.0f, 0.001f );
	    add_calc( &(awt[i].pos.z), stop_Z[i], awt[i].speed,
		      100.0f, 0.001f );
	    awt[i].speed *= 1.05f;

	    if( awt[i].pos.z == stop_Z[i] ) {
		awt[i].scale -= 0.005f;
		if( awt[i].scale < 0.0f ) {
		    awt[i].scale = 0.0f;
		    awt[i].draw_f = OFF;
		}
	    }

	    xx = stop_X[i] - awt[i].pos.x;
	    yy = stop_Y[i] - awt[i].pos.y;
	    zz = (stop_Z[i]+10.0f) - awt[i].pos.z;
	    awt[i].Xang = -fatan3( yy,sqrtf((xx*xx)+(zz*zz)) )*180.0f/F_PI;
	    awt[i].Yang = fatan3( xx,zz )*180.0f/F_PI;
	}

//	if( time0 == 145 ) fade_sw = OUT;
	if( time0 == 120 ) fade_sw = OUT;

	if( fade_A == 0xff ) {
	    Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	    demo_cut_phase = 3;
	}
	demo_fade();

#if 0
//	if( time0 == 90 ) {
	if( PointNum == -1 ) {
	    CentX = 17.0f;
	    CentY = -38.0f;
	    CentZ = 35.0f;

	    CamXa = 15.009953f;
	    CamYa = 165.020004f;
	    CamZrg1 = 75.0f;
	    CamZrg2 = 50.0f;

	    time0 = 0;
	    cam_sp = 0.02f;
	    demo_cut_phase++;
	}
#endif
	time0++;
	break;

#if 0
    case 2:
	add_calc( &CentX, 17.0f, cam_sp, 100.0f, 0.01f );
	add_calc( &CentY, -2.0f, cam_sp, 100.0f, 0.01f );
	add_calc( &CamYa, 142.0f, cam_sp, 100.0f, 0.01f );
	add_calc( &CamXa, 22.0f, cam_sp, 100.0f, 0.01f );
	add_calc( &CamZrg1, 700.0f, cam_sp, 100.0f, 0.01f );
	cam_sp *= 1.02f;

	if( time0 == 50 ) fade_sw = OUT;

	if( fade_A == 0xff ) {
	    Na_StopSe( gfox.SndPos, NA_SE_GREATFOX_ENGINE );
	    demo_cut_phase++;
	}
	demo_fade();
	time0++;
	revo_pos_calc3( CentX, CentY, CentZ,
			&eyeX, &eyeY, &eyeZ, CamZrg1,
			&wayX, &wayY, &wayZ, CamZrg2,
			CamXa, CamYa );
	break;
#endif
    case 3:
	fade_A = 0x00;
	Back_star_f = OFF;
	draw_sw = OFF;
	wait_time = 20;
	demo_cut_phase++;
	break;
    case 4:
	if( wait_time ) break;
	demo_cut_phase = 0;
	display_mode = DISPLAY_NOTH;
	demo_phase = DEMO_TITL;

	/* 持ち時間:159 */
//	PRINTF( "ctm:%d\n",CutTime );
	break;
    }

    get_cam_ang( &CamXa, &CamYa );
    get_cam_vec( CamXa, CamYa );
    PlayData( DataAdd, AWIN_GO2_MV_DATA, tsp );

    revo_ligpos_calc( LigXa, LigYa, LIGHT_VEC, &lightX, &lightY, &lightZ );

    back_star_pos_calc( eyeX, eyeY, eyeZ, wayX, wayY, wayZ );
//    starXad += 3.0f;
//    starYad += 1.0f;

    CutTime++;
}
/************************************************************************/
/************************************************************************/
/************************************************************************/
#endif
