/*============================================================================
  NuSYSTEM sample program 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;    /* The retrace counter */

/* 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;

/*--------------------------------------------------------------*/
/*  Make the display list and activate the graphic task		*/
/*  IN:	None							*/
/*  RET:None							*/
/*--------------------------------------------------------------*/
void
makegameoverDL(void)
{
    int idx;
    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 */
    SetViewMtxGameOver( dynamicp );

    /* Setting the snake position, etc. */
    SetSnakePara();

    /* Draw 4 heads */
    for(idx = 0; idx < 4; idx++){
	DrawHead( dynamicp, idx );
    }

    /* Draw the text character */
    DrawGameOver();

    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 gameover progressing process	*/
/*  IN:	None			*/
/*  RET:None			*/
/*------------------------------*/
void
updateGameOver(void)
{
    /* START BUTTON */
    if(ContTriger[0].trigger & START_BUTTON ){
	/* Remove the call-back function.*/
	nuGfxFuncRemove();
	/*  Specify next stage to main  */
	stage = 0;
    }

    /* If it is not the NoSave mode */
    if(NoSave == 0){
	/* Save in the controller pack only when it's the replay mode */
	if(ReplayMode == 0 && SavePak == 1){
	    ContPakOpenAll();
	    if(ChkPakStat() != -1){/* The error*/
		/* Remove the call-back function.*/
		nuGfxFuncRemove();
		/* Specify next stage to main */
		stage = 4;
	    }else{
		NoteOpenAll();
		SaveContPak();
		SavePak = 0;
		SavePakEnd = 1;
		if(ChkPakStat() != -1){
		    /* Remove the call-back function.*/
		    nuGfxFuncRemove();
		    /* Specify next stage to main */
		    stage = 4;
		    ReadFlg = 0;
		}
	    }
		
	}
	/*  Save after displaying the screen once*/
	if(SavePak == 0 && SavePakEnd == 0 ){
	    SavePak = 1;
	}
    }
}

/*------------------------------*/
/*  Draw the game-over screen	*/
/*  IN:	None			*/
/*  RET:None			*/
/*------------------------------*/
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);
	}
    }
}

/*------------------------------------------------------*/
/*  Set the model position, etc. of the game-over screen	*/
/*  IN:	None						*/
/*  RET:None						*/
/*------------------------------------------------------*/

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