gamepakerr.c 3.9 KB
/*============================================================================
  NuSYSTEM サンプルプログラム「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;    /* リトレースカウンター */
extern void InitGame( void );
volatile extern int stage;
extern int ContPakError;
extern NUContPakFile pakFile[];
extern int ContPakOpen[];

/*--------------------------------------------------------------*/
/*  ディスプレイリストを作り、グラフィックタスクを起動します	*/
/*  IN:	なし							*/
/*  RET:なし							*/
/*--------------------------------------------------------------*/
void
makepakerrDL(void)
{
    Dynamic* dynamicp;

    /* ダイナミックバッファの指定 */
    dynamicp = &gfx_dynamic[gfx_gtask_no];

    /* ディスプレイリストバッファの指定 */
    glistp = &gfx_glist[gfx_gtask_no][0];

    /*  RSP,RDPの初期化 */
    gfxRCPInit();

    /*フレームバッファとZバッファのクリア*/
    gfxClearCfb();

    /* 視点マトリックスの設定 */
    SetViewMtx( dynamicp );

    DrawErr();

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

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

    /* RSPタスクを起動し、
       表示バッファを切り替えます。*/
    nuGfxTaskStart(&gfx_glist[gfx_gtask_no][0],
		   (s32)(glistp - gfx_glist[gfx_gtask_no]) * sizeof (Gfx),
		   NU_GFX_UCODE_F3DEX , NU_SC_SWAPBUFFER);

    /* 次のグラフィックタスク番号の指定 */
    gfx_gtask_no++;
    gfx_gtask_no %= GFX_GTASK_NUM;
}

/*------------------------------*/
/*  パックエラー進行処理	*/
/*  IN:	なし			*/
/*  RET:なし			*/
/*------------------------------*/
void
updatePakErr(void)
{
    /* A BUTTON */
    if(ContTriger[0].trigger & A_BUTTON){
	/* コールバック関数を取り除く。*/
	nuGfxFuncRemove();
	/* 次のステージをメインに指示 */
	stage = 0;
	NoSave = 0;
	/* OKのエフェクトを鳴らす */
	nuAuSndPlayerPlay(EFF_OK);
	nuAuSndPlayerSetPitch(44100.0/32000);
    }
    
    /* B BUTTON */
    if(ContTriger[0].trigger & B_BUTTON){
	/* コールバック関数を取り除く。*/
	nuGfxFuncRemove();
	/* 次のステージをメインに指示 */
	stage = 1;
	NoSave = 1;
	ReplayMode = 0;
	InitGame();
	/* OKのエフェクトを鳴らす */
	nuAuSndPlayerPlay(EFF_OK);
	nuAuSndPlayerSetPitch(44100.0/32000);
    }
    
}

/*------------------------------*/
/*  パックエラー画面描画	*/
/*  IN:	なし			*/
/*  RET:なし			*/
/*------------------------------*/
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);
}