home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume13 / xsokoban / part01 / score.c < prev    next >
C/C++ Source or Header  |  1992-01-12  |  5KB  |  208 lines

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include "sokoban.h"
  4.  
  5. extern FILE *fopen();
  6.  
  7. extern char  *username;
  8. extern short scorelevel, scoremoves, scorepushes;
  9.  
  10. static short scoreentries;
  11. static struct {
  12.    char user[MAXUSERNAME];
  13.    short lv, mv, ps;
  14. } scoretable[MAXSCOREENTRIES];
  15.  
  16. static FILE *scorefile;
  17. static long sfdbn;
  18.  
  19. short outputscore() {
  20.  
  21.    short ret;
  22.  
  23.    while( creat( LOCKFILE, 0666) < 0);    /* lock the score file */
  24.    if( (ret = readscore()) == 0)
  25.       showscore();
  26.    unlink( LOCKFILE);
  27.    return( (ret == 0) ? E_ENDGAME : ret);
  28. }
  29.  
  30. short makenewscore() {
  31.  
  32.    short ret = 0;
  33.  
  34.    while( creat( LOCKFILE, 0666) < 0) ;
  35.    scoreentries = 0;
  36.    if( (scorefile = fopen( SCOREFILE, "w")) == NULL)
  37.       ret = E_FOPENSCORE;
  38.    else {
  39.       sfdbn = fileno( scorefile);
  40.       if( write( sfdbn, &scoreentries, 2) != 2) ret = E_WRITESCORE;
  41.       fclose( scorefile);
  42.    }
  43.    unlink( LOCKFILE);
  44.    return( (ret == 0) ? E_ENDGAME : ret);
  45. }
  46.  
  47. short getuserlevel( lv)
  48. short *lv;
  49. {
  50.    short ret = 0, pos;
  51.  
  52.    while( creat( LOCKFILE, 0666) < 0);
  53.    if( (scorefile = fopen( SCOREFILE, "r")) == NULL)
  54.       ret = E_FOPENSCORE;
  55.    else {
  56.       if( (ret = readscore()) == 0)
  57.      *lv = ( (pos = finduser()) > -1) ? scoretable[pos].lv+1 : 1;
  58.    }
  59.    unlink( LOCKFILE);
  60.    return( ret);
  61. }
  62.  
  63. short score() {
  64.    
  65.    short ret;
  66.  
  67.    while( creat( LOCKFILE, 0666) < 0);    /* lock the score file */
  68.    if( (ret = readscore()) == 0)
  69.       if( (ret = makescore()) == 0)
  70.      if( (ret = writescore()) == 0)
  71.         showscore();
  72.    unlink( LOCKFILE);
  73.    return( (ret == 0) ? E_ENDGAME : ret);
  74. }
  75.  
  76. readscore() {
  77.  
  78.    short ret = 0;
  79.    long tmp;
  80.  
  81.    if( (scorefile = fopen( SCOREFILE, "r")) == NULL)
  82.       ret = E_FOPENSCORE;
  83.    else {
  84.       sfdbn = fileno( scorefile);
  85.       if( read( sfdbn, &scoreentries, 2) != 2) ret = E_READSCORE;
  86.       else {
  87.      tmp = scoreentries * sizeof( scoretable[0]);
  88.      if( read( sfdbn, &(scoretable[0]), tmp) != tmp) ret = E_READSCORE;
  89.       }
  90.       fclose( scorefile);
  91.    }
  92.    return( ret);
  93. }
  94.  
  95. makescore() {
  96.  
  97.    short ret = 0, pos, i, build = 1, insert;
  98.  
  99.    if( (pos = finduser()) > -1) {    /* user already in score file */
  100.       insert =    (scorelevel > scoretable[pos].lv)
  101.            || ( (scorelevel == scoretable[pos].lv) &&
  102.                     (scoremoves < scoretable[pos].mv)
  103.           )
  104.            || ( (scorelevel == scoretable[pos].lv) &&
  105.             (scoremoves == scoretable[pos].mv) &&
  106.             (scorepushes < scoretable[pos].ps)
  107.           );
  108.       if( insert) {             /* delete existing entry */
  109.      for( i = pos; i < scoreentries-1; i++)
  110.         cp_entry( i, i+1);
  111.      scoreentries--;
  112.       }
  113.       else build = 0;
  114.    }
  115.    else if( scoreentries == MAXSCOREENTRIES)
  116.       ret = E_TOMUCHSE;
  117.    if( (ret == 0) && build) {
  118.       pos = findpos();            /* find the new score position */
  119.       if( pos > -1) {            /* score table not empty */
  120.      for( i = scoreentries; i > pos; i--)
  121.         cp_entry( i, i-1);
  122.       }
  123.       else pos = scoreentries;
  124.  
  125.       strcpy( scoretable[pos].user, username);
  126.       scoretable[pos].lv = scorelevel;
  127.       scoretable[pos].mv = scoremoves;
  128.       scoretable[pos].ps = scorepushes;
  129.       scoreentries++;
  130.    }
  131.    return( ret);
  132. }
  133.  
  134. finduser() {
  135.  
  136.    short i, found = 0;
  137.  
  138.    for( i = 0; (i < scoreentries) && (! found); i++)
  139.       found = (strcmp( scoretable[i].user, username) == 0);
  140.    return( (found) ? i-1 : -1);
  141. }
  142.  
  143. findpos() {
  144.  
  145.    short i, found = 0;
  146.  
  147.    for( i = 0; (i < scoreentries) && (! found); i++)
  148.       found =    (scorelevel > scoretable[i].lv)
  149.           || ( (scorelevel == scoretable[i].lv) &&
  150.                    (scoremoves < scoretable[i].mv)
  151.          )
  152.           || ( (scorelevel == scoretable[i].lv) &&
  153.            (scoremoves == scoretable[i].mv) &&
  154.            (scorepushes < scoretable[i].ps)
  155.          );
  156.    return( (found) ? i-1 : -1);
  157. }
  158.  
  159. writescore() {
  160.  
  161.    short ret = 0;
  162.    long tmp;
  163.  
  164.    if( (scorefile = fopen( SCOREFILE, "w")) == NULL)
  165.       ret = E_FOPENSCORE;
  166.    else {
  167.       sfdbn = fileno( scorefile);
  168.       if( write( sfdbn, &scoreentries, 2) != 2) ret = E_WRITESCORE;
  169.       else {
  170.      tmp = scoreentries * sizeof( scoretable[0]);
  171.      if( write( sfdbn, &(scoretable[0]), tmp) != tmp) ret = E_WRITESCORE;
  172.       }
  173.       fclose( scorefile);
  174.    }
  175.    return( ret);
  176. }
  177.  
  178. showscore() {
  179.  
  180.    register short lastlv = 0, lastmv = 0, lastps = 0, i;
  181.  
  182.    fprintf( stdout, "Rank        User     Level     Moves    Pushes\n");
  183.    fprintf( stdout, "==============================================\n");
  184.    for( i = 0; i < scoreentries; i++) {
  185.       if( (scoretable[i].lv == lastlv)&& 
  186.       (scoretable[i].mv == lastmv) && 
  187.       (scoretable[i].ps == lastps))
  188.      fprintf( stdout, "      ");
  189.       else {
  190.          lastlv = scoretable[i].lv;
  191.          lastmv = scoretable[i].mv;
  192.          lastps = scoretable[i].ps;
  193.          fprintf( stdout, "%4d  ", i+1);
  194.       }
  195.       fprintf( stdout, "%10s  %8d  %8d  %8d\n", scoretable[i].user, 
  196.         scoretable[i].lv, scoretable[i].mv, scoretable[i].ps);
  197.    }
  198. }
  199.  
  200. cp_entry( i1, i2)
  201. register short i1, i2;
  202. {
  203.    strcpy( scoretable[i1].user, scoretable[i2].user);
  204.    scoretable[i1].lv = scoretable[i2].lv;
  205.    scoretable[i1].mv = scoretable[i2].mv;
  206.    scoretable[i1].ps = scoretable[i2].ps;
  207. }
  208.