/*============================================================================
  NuSYSTEM sample program SNAKE TAIL HACK
  
  gametitle.c
  
  Copyright (C) 1997, NINTENDO Co,Ltd.
  ============================================================================*/

#include <assert.h>
#include <nusys.h>
#include <nualsgi_n.h>

#include "main.h"
#include "graphic.h"
#include "font.h"
#include "para.h"

/*nusys*/
extern u32 nuScRetraceCounter;    /* The retrace counter */

/* gamemain.c */
extern void InitGame( void );

/* main.c */
extern void LoadContPak( void );
extern void ContPakOpenAll( void );
extern void NoteOpenAll( void );
extern int ChkPakStat( void );
extern int ReplayMode;
extern NUContData ContTriger[];
volatile extern int stage;
extern int ContPakError;
extern NUContPakFile pakFile[4];

/* view.c */
extern void SetViewMtx( Dynamic* dynamicp );

/* gamepakrwerr.c */
extern int ReadFlg;

void DrawTitle( void );
/*--------------------------------------------------------------*/
/*  Make the display list and activate the graphic task		*/
/*  IN:	None							*/
/*  RET:None							*/
/*--------------------------------------------------------------*/
void
maketitleDL(void)
{
    Dynamic* dynamicp;

    /* Specify the dynamic buffer */
    dynamicp = &gfx_dynamic[gfx_gtask_no];

    /* Specify the display list buffer */
    glistp = &gfx_glist[gfx_gtask_no][0];

    /*  The initialization of RSP and RDP */
    gfxRCPInit();

    /*Clear the frame and Z-buffer*/
    gfxClearCfb();

    /* Setting the view-matrix */
    SetViewMtx( dynamicp );

    DrawTitle();

    gDPFullSync(glistp++);
    gSPEndDisplayList(glistp++);

    assert((glistp - gfx_glist[gfx_gtask_no]) < GFX_GLIST_LEN);

    /* Activate the RSP task and switch display buffers. */
    nuGfxTaskStart(&gfx_glist[gfx_gtask_no][0],
		   (s32)(glistp - gfx_glist[gfx_gtask_no]) * sizeof (Gfx),
		   NU_GFX_UCODE_F3DEX , NU_SC_SWAPBUFFER);

    /* Indicate next graphic task number */
    gfx_gtask_no++;
    gfx_gtask_no %= GFX_GTASK_NUM;
}

/*----------------------*/
/*  The title progressing process*/
/*  IN:	None		*/
/*  RET:None		*/
/*----------------------*/
void
updateTitle(void)
{

#if 0
    int idx;
    if(ContTriger[0].trigger & L_TRIG){
	for(idx = 0; idx < 4; idx++){
	    nuContPakOpen(&pakFile[idx], idx);
	    switch(pakFile[idx].error){
	      case 0:
		osSyncPrintf("PACK%d\tOK\n",idx);
		break;
	      case PFS_ERR_NOPACK:
		osSyncPrintf("PACK%d\tPFS_ERR_NOPACK\n",idx);
		break;
	      case PFS_ERR_NEW_PACK:
		osSyncPrintf("PACK%d\tPFS_ERR_NEW_PACK\n",idx);
		break;
	      case PFS_ERR_CONTRFAIL:
		osSyncPrintf("PACK%d\tPFS_ERR_CONTRFAIL\n",idx);
		break;
	      case PFS_ERR_ID_FATAL:
		osSyncPrintf("PACK%d\tPFS_ERR_ID_FATAL\n",idx);
		break;
	      case PFS_ERR_DEVICE:
		osSyncPrintf("PACK%d\tPFS_ERR_DEVICE\n",idx);
		break;
	      default:
		break;
	    }
	}
	osSyncPrintf("\n");
    }
#endif
    
    /* A BUTTON */
    if(ContTriger[0].trigger & A_BUTTON){
	ContPakOpenAll();
	if(ChkPakStat() == -1){
	    NoteOpenAll();
	    if(ChkPakStat() != -1){
		/* Remove the call-back function. */
		nuGfxFuncRemove();
		/* To the pack error screen */
		stage = 3;
	    }else{
		/* Remove the call-back function. */
		nuGfxFuncRemove();
		/* Indicate next stage to main */
		stage = 1;
		/* The initialization for this game volume */
		InitGame();
		ReplayMode = 0;
	    }
	}else{
	    /* Remove the call-back function. */
	    nuGfxFuncRemove();
	    /* Indicate next stage to main */
	    stage = 3;
	}
	/* Play effect of OK */
	nuAuSndPlayerPlay(EFF_OK);
	nuAuSndPlayerSetPitch(44100.0/32000);
    }

    if(ContTriger[0].trigger & B_BUTTON){
	ContPakOpenAll();
	if(ChkPakStat() != -1){
	    /* Remove the call-back function.*/
	    nuGfxFuncRemove();
	    /* To the pack error screen */
	    stage = 3;
	}else{
	    NoteOpenAll();
	    /* The initialization for this game volume */
	    InitGame();
	    ReplayMode = 1;
	    /* Play effect of OK */
	    nuAuSndPlayerPlay(EFF_OK);
	    nuAuSndPlayerSetPitch(44100.0/32000);
	    /* Load data of the controller pack */
	    LoadContPak();
	    if(ChkPakStat() == -1){
		/* Remove the call-back function. */
		nuGfxFuncRemove();
		/* Indicate next stage to main */
		stage = 1;
	    }else{
		/* Remove the call-back function.*/
		nuGfxFuncRemove();
		ReadFlg = 1;
		/* Indicate next stage to main */
		stage = 4;
	    }
	}
	/* Play effect of OK */
	nuAuSndPlayerPlay(EFF_OK);
	nuAuSndPlayerSetPitch(44100.0/32000);
    }
}

/*----------------------*/
/*  Draw the title screen*/
/*  IN:	None		*/
/*  RET:None		*/
/*----------------------*/
void
DrawTitle( void )
{
    sprintf(outstring,"SNAKE TAIL HACK");
    Draw8Font(100,70, TEX_COL_WHITE, 0);

    if(0x30 > (nuScRetraceCounter & 0x30)){
	sprintf(outstring,"PUSH A PADDATA SAVE MODE");
	Draw8Font(50,130, TEX_COL_WHITE, 0);
	
	sprintf(outstring,"PUSH B REPLAY MODE");
	Draw8Font(50,150, TEX_COL_WHITE, 0);
    }
}