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