    /*============================================================================
      NuSYSTEM sample program SNAKE TAIL HACK

      gamepakerr.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"

    int NoSave;
    void DrawErr( void );
    extern int ReplayMode;
    extern void SetViewMtx( Dynamic* dynamicp );
    extern NUContData ContTriger[];
    extern u32 nuScRetraceCounter;    /* The retrace counter */
    extern void InitGame( void );
    volatile extern int stage;
    extern int ContPakError;
    extern NUContPakFile pakFile[];
    extern int ContPakOpen[];

    /*--------------------------------------------------------------*/
    /*  Make the display list and activate the graphic task		*/
    /*  IN:	None							*/
    /*  RET:None							*/
    /*--------------------------------------------------------------*/
    void
    makepakerrDL(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 );

        DrawErr();

        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);

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

    /*------------------------------*/
    /*  The Pak error progressing process	*/
    /*  IN:	None			*/
    /*  RET:None			*/
    /*------------------------------*/
    void
    updatePakErr(void)
    {
        /* A BUTTON */
        if(ContTriger[0].trigger & A_BUTTON){
    	/* Remove the call-back function. */
    	nuGfxFuncRemove();
    	/* Indicate next stage to main */
    	stage = 0;
    	NoSave = 0;
    	/* Play effect of OK */
    	nuAuSndPlayerPlay(EFF_OK);
    	nuAuSndPlayerSetPitch(44100.0/32000);
        }

        /* B BUTTON */
        if(ContTriger[0].trigger & B_BUTTON){
    	/* Remove the call-back function.*/
    	nuGfxFuncRemove();
    	/* Indicate next stage to main */
    	stage = 1;
    	NoSave = 1;
    	ReplayMode = 0;
    	InitGame();
    	/* Play effect of OK */
    	nuAuSndPlayerPlay(EFF_OK);
    	nuAuSndPlayerSetPitch(44100.0/32000);
        }

    }

    /*------------------------------*/
    /*  Draw the Pak error screen	*/
    /*  IN:	None			*/
    /*  RET:None			*/
    /*------------------------------*/
    void
    DrawErr( void )
    {
        int idx;

        sprintf(outstring,"CONTROLLER PACK ERROR!!");
        Draw8Font(60,70, TEX_COL_RED, 0);

        for(idx = 0; idx < 4; idx++){
    	switch(ContPakOpen[idx]){
    	  case 0:
    	    sprintf(outstring,"PACK%d:OK", idx+1);
    	    break;
    	  case PFS_ERR_NOPACK:
    	    sprintf(outstring,"PACK%d:NOPACK", idx+1);
    	    break;
    	  case PFS_ERR_NEW_PACK:
    	    sprintf(outstring,"PACK%d:NEW_PACK", idx+1);
    	    break;
    	  case PFS_ERR_CONTRFAIL:
    	    sprintf(outstring,"PACK%d:CONTROLLER PACK FAIL", idx+1);
    	    break;
    	  case PFS_ERR_ID_FATAL:
    	    sprintf(outstring,"PACK%d:PACK ID FATAL", idx+1);
    	    break;
    	  case PFS_ERR_DEVICE:
    	    sprintf(outstring,"PACK%d:DEVICE ERROR", idx+1);
    	    break;
    	  case NOT_CREAT:
    	    sprintf(outstring,"PACK%d:FILE FULL OR PACK FULL", idx+1);
    	    break;
    	  case RUMBLE_PAK:
    	    sprintf(outstring,"PACK%d:RUMBLE PACK DETECTED", idx+1);
    	    break;
    	  default:
    	    break;
    	}
    	Draw8Font(50,90+idx*10, TEX_COL_WHITE, 0);
        }

        sprintf(outstring,"PLEASE CHECK CONTROLLER PACK");
        Draw8Font(50,160, TEX_COL_WHITE, 0);

        sprintf(outstring,"PUSH A RETURN TITLE");
        Draw8Font(50,180, TEX_COL_WHITE, 0);

        sprintf(outstring,"PUSH B PLAY NOSAVE");
        Draw8Font(50,200, TEX_COL_WHITE, 0);
    }