gameover.c 5.73 KB
/*============================================================================
  NuSYSTEM サンプルプログラム「SNAKE TAIL HACK」
  
  gameover.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 SavePak;
int SavePakEnd;
void DrawGameOver( void );
void SetSnakePara( void );

/* nusys */
extern u32 nuScRetraceCounter;    /* リトレースカウンター */

/* gamemain.c */
extern void DrawHead( Dynamic*, int );
extern int Winner;

/* main.c */
extern void SaveContPak( void );
extern void ContPakOpenAll( void );
extern void NoteOpenAll( void );
extern NUContData ContTriger[];
extern SnakePara Snake;
extern int TraceIdx;
extern ContTrace ConTrace[100*60][4];
volatile extern int stage;
extern int ReplayMode;
extern int ChkPakStat( void );

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

/* gamepakerr.c */
extern int NoSave;

/* gamepakrwerr.c */
extern int ReadFlg;

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

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

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

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

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

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

    /* スネークのポジション等の設定 */
    SetSnakePara();

    /* 4匹描画します */
    for(idx = 0; idx < 4; idx++){
	DrawHead( dynamicp, idx );
    }

    /* テキスト文字の描画 */
    DrawGameOver();

    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
updateGameOver(void)
{
    /* START BUTTON */
    if(ContTriger[0].trigger & START_BUTTON ){
	/* コールバック関数を取り除く。*/
	nuGfxFuncRemove();
	/* 次のステージをメインに指示 */
	stage = 0;
    }

    /* NoSaveモードでなかったら */
    if(NoSave == 0){
	/* リプレイモードの時だけ、コントローラーパックにセーブします */
	if(ReplayMode == 0 && SavePak == 1){
	    ContPakOpenAll();
	    if(ChkPakStat() != -1){/* エラー */
		/* コールバック関数を取り除く。*/
		nuGfxFuncRemove();
		/* 次のステージをメインに指示 */
		stage = 4;
	    }else{
		NoteOpenAll();
		SaveContPak();
		SavePak = 0;
		SavePakEnd = 1;
		if(ChkPakStat() != -1){
		    /* コールバック関数を取り除く。*/
		    nuGfxFuncRemove();
		    /* 次のステージをメインに指示 */
		    stage = 4;
		    ReadFlg = 0;
		}
	    }
		
	}
	/* 一度画面を表示してからセーブします */
	if(SavePak == 0 && SavePakEnd == 0 ){
	    SavePak = 1;
	}
    }
}

/*------------------------------*/
/*  ゲームオーバー画面描画	*/
/*  IN:	なし			*/
/*  RET:なし			*/
/*------------------------------*/
void
DrawGameOver( void )
{
    int idx;
/*    sprintf(outstring,"TRACE:%d",TraceIdx);
    Draw8Font(20,20, TEX_COL_WHITE, 0);*/

    sprintf(outstring,"GAME OVER");
    Draw8Font(120,40, TEX_COL_WHITE, 0);

    if(Winner != -1){
	sprintf(outstring,"WINNER IS PLAYER NO.%d", Winner + 1);
	Draw8Font(80,80, TEX_COL_YELLOW, 0);
    }else{
	sprintf(outstring,"DRAW GAME");
	Draw8Font(120,80, TEX_COL_YELLOW, 0);
    }

    for(idx = 0; idx < 4; idx++){
	sprintf(outstring,"PLAYER %d : %2d TAIL", idx+1, Snake.tailcnt[idx]);
	if(idx == Winner){
	    Draw8Font(110,120+idx*22, TEX_COL_YELLOW, 0);
	}else{
	    Draw8Font(110,120+idx*22, TEX_COL_WHITE, 0);
	}
    }

    if(SavePak && ReplayMode == 0){
	sprintf(outstring,"NOW SAVING PLAY DATA");
	Draw8Font(80,210, TEX_COL_WHITE, 0);
    }else{
	if(0x30 > (nuScRetraceCounter & 0x30)){
	    sprintf(outstring,"PUSH START RETURN TITLE");
	    Draw8Font(80,210, TEX_COL_WHITE, 0);
	}
    }
}

/*------------------------------------------------------*/
/*  ゲームオーバー画面のモデルのポジション等のセット	*/
/*  IN:	なし						*/
/*  RET:なし						*/
/*------------------------------------------------------*/

void
SetSnakePara( void )
{
    Snake.pos_x[0][0] = -260.0;
    Snake.pos_y[0][0] = 0.0;
    Snake.pos_z[0][0] = 0.0;
    Snake.rot_x[0][0] = 270.0;
    Snake.rot_y[0][0] = 0.0;
    Snake.rot_z[0][0] = 270.0;
    Snake.size_x[0][0] = 2.0;
    Snake.size_y[0][0] = 2.0;
    Snake.size_z[0][0] = 2.0;

    Snake.pos_x[1][0] = -260.0;
    Snake.pos_y[1][0] = -80.0;
    Snake.pos_z[1][0] = 0.0;
    Snake.rot_x[1][0] = 270.0;
    Snake.rot_y[1][0] = 0.0;
    Snake.rot_z[1][0] = 270.0;
    Snake.size_x[1][0] = 2.0;
    Snake.size_y[1][0] = 2.0;
    Snake.size_z[1][0] = 2.0;

    Snake.pos_x[2][0] = -260.0;
    Snake.pos_y[2][0] = -160.0;
    Snake.pos_z[2][0] = 0.0;
    Snake.rot_x[2][0] = 270.0;
    Snake.rot_y[2][0] = 0.0;
    Snake.rot_z[2][0] = 270.0;
    Snake.size_x[2][0] = 2.0;
    Snake.size_y[2][0] = 2.0;
    Snake.size_z[2][0] = 2.0;

    Snake.pos_x[3][0] = -260.0;
    Snake.pos_y[3][0] = -240.0;
    Snake.pos_z[3][0] = 0.0;
    Snake.rot_x[3][0] = 270.0;
    Snake.rot_y[3][0] = 0.0;
    Snake.rot_z[3][0] = 270.0;
    Snake.size_x[3][0] = 2.0;
    Snake.size_y[3][0] = 2.0;
    Snake.size_z[3][0] = 2.0;
}