home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume6 / ega-wanderer / part03 / scores.c < prev   
C/C++ Source or Header  |  1989-02-14  |  8KB  |  330 lines

  1. #include "wand_head.h"
  2.  
  3. #ifdef    EGA
  4. extern char *EGAaddr;
  5. #endif
  6.  
  7. #ifdef    MSDOS    /* M001    */
  8. #define    LOCK
  9. #define    UNLOCK
  10. #else
  11. /* MFC- lockfiles fixed: tries 5 times to get lock, with 1 second between
  12.  * tries,  if after 5 seconds, no lock is gained, the lockfile is blown 
  13.  * away.
  14.  */
  15. #define LOCK { int lc=5; \
  16.            while((lock = creat(LOCKPATH,0))<0 && lc) {  \
  17.           sleep(1); lc--; }  \
  18.            close(lock); \
  19.          } 
  20. #define UNLOCK (void) unlink(LOCKPATH)
  21. #endif
  22.  
  23. #define ENTRIES 15
  24.  
  25. #ifndef    MSDOS    /* M001 */
  26. extern int getuid();
  27. #else
  28. #define     getuid()    0
  29. #endif
  30.  
  31. typedef struct
  32.     {
  33.     char howdead[25];
  34.     char name[20];
  35.     long score;
  36.     int  level;
  37.     int  uid;
  38.     } score_entry;
  39.  
  40. #ifdef    LINT_ARGS    /* M001    */
  41. void show_scores(score_entry *,int );
  42. int readtable(score_entry *);
  43. #else
  44. void show_scores();
  45. int readtable();
  46. #endif
  47.  
  48. void show_scores(table,num)
  49. score_entry *table;
  50. int         num;
  51. {
  52. int tot = num;
  53. printf("\n\
  54. No. Score Level           Names                 How they died\n\
  55. ===============================================================================\n"); /*
  56. xx xxxxxx xxxx     xxxxxxxxxxxxxxxxxxxx     killed by xxxxxxxxxxxxxxxxxxxxxxxxx */
  57. while(num > 0)
  58.     {
  59.     num--;
  60.     printf("%2d %6ld %4d     %-20s     ",(tot - num),table->score,table->level,table->name);
  61.     if(*table->howdead)
  62.     printf("killed by %s\n",table->howdead);
  63.     else
  64.     printf("a total winner!\n");
  65.     table++;
  66.     }
  67. printf("\n\n");
  68. }
  69.  
  70. #ifdef    EGA
  71.  
  72. #define    vertical(x,y1,y2)    egaline(x,y1, x,y2)
  73. #define    horizontal(y,x1,x2)    egaline(x1,y, x2,y)
  74.  
  75. void egabox( x1,y1, x2,y2 )
  76. {
  77.     horizontal( y1, x1,x2 );
  78.     vertical( x2, y1,y2 );
  79.     horizontal( y2, x1,x2 );
  80.     vertical( x1, y1,y2 );
  81. }
  82.  
  83. #define    X_MIN    0
  84. #define    X_NO    X_MIN+4+4
  85. #define    X_SCORE    X_NO+3*8+4+4
  86. #define    X_LEVEL    X_SCORE+6*8+4+4
  87. #define    X_NAMES    X_LEVEL+5*8+4+4
  88. #define    X_HOW    X_NAMES+20*8+4+4
  89. #define    X_MAX    639
  90.  
  91. #define    Y_MIN    50
  92. #define    Y_TITLE    Y_MIN+4+4
  93. #define    Y_LINE1    Y_TITLE+1*8+4+1+4
  94. #define    Y_MAX    Y_LINE1+ENTRIES*10+4+4
  95.  
  96. void ega_show_scores(header,table,tot)
  97. char *header;
  98. score_entry *table;
  99. int         tot;
  100. {
  101. int num;
  102.  
  103. clear();
  104.  
  105. egaputs( (640 - 8*strlen(header)) / 2, (50 - 8) / 2, header );
  106.                                           /*
  107. No.  Score Level           Names                 How they died
  108. xx  xxxxxx xxxx     xxxxxxxxxxxxxxxxxxxx     killed by xxxxxxxxxxxxxxxxxxxxxxxxx
  109.                                           */
  110. egabox( X_MIN,   Y_MIN,   X_MAX,   Y_MAX );
  111. egabox( X_MIN+4, Y_MIN+4, X_MAX-4, Y_MAX-4 );
  112.  
  113. egaprintf(X_NO+2, Y_TITLE, "No." );
  114. egaprintf(X_SCORE+(6*8-5*8)/2, Y_TITLE, "Score" );
  115. egaprintf(X_LEVEL+1, Y_TITLE, "Level" );
  116. egaprintf(X_NAMES, Y_TITLE, "     Names                 How they died" );
  117.  
  118. horizontal(Y_LINE1-4, X_MIN+4, X_MAX-4);
  119.  
  120. vertical(X_SCORE-4, Y_MIN+4, Y_MAX-4);
  121. vertical(X_LEVEL-4, Y_MIN+4, Y_MAX-4);
  122. vertical(X_NAMES-4, Y_MIN+4, Y_MAX-4);
  123. vertical(X_HOW-4, Y_MIN+4, Y_MAX-4);
  124.  
  125. for( num = 1; num <= tot; ++num, ++table ) {
  126.     egaprintf(X_NO+(3*8-2*8)/2, Y_LINE1+10*(num-1), "%2d",num);
  127.     egaprintf(X_SCORE, Y_LINE1+10*(num-1), "%6ld", table->score);
  128.     egaprintf(X_LEVEL+(5*8-4*8)/2, Y_LINE1+10*(num-1), "%4d", table->level);
  129.     egaprintf(X_NAMES, Y_LINE1+10*(num-1), "%-20s", table->name);
  130.     if(*table->howdead)
  131.     egaprintf(X_HOW, Y_LINE1+10*(num-1), "killed by %s", table->howdead);
  132.     else
  133.     egaprintf(X_HOW, Y_LINE1+10*(num-1), "a total winner!");
  134.     }
  135. }
  136. #endif
  137.  
  138. int readtable(table_ptr)
  139. score_entry *table_ptr;
  140. {
  141. FILE *fp;
  142. int  numread;
  143. if((fp = fopen(HISCOREPATH,R_BIN)) == NULL)
  144.     {
  145.     numread = 0;
  146.     }
  147. else
  148.     {
  149.     numread = fread( VOIDSTAR table_ptr, sizeof(score_entry), ENTRIES, fp);
  150.     fclose(fp);
  151.     }
  152. return numread;
  153. }
  154.  
  155. savescore(howdead,score,level,name)
  156. char *howdead, *name;
  157. long score;
  158. int  level;
  159. {
  160. score_entry table[ENTRIES + 2],
  161.         *table_ptr = table,new_entry;
  162. int  numread,index = 1, numsaved, lock, already = 0, user_id;
  163. char buffer[80];
  164. FILE *fp;
  165.  
  166. LOCK;
  167. numread = readtable(table);
  168. if(name == NULL)
  169.     {
  170.     show_scores(table,numread);
  171.     UNLOCK;
  172.     return;
  173.     }
  174.  
  175. user_id = getuid();
  176. strncpy(new_entry.howdead,howdead,25);
  177. new_entry.howdead[24] = '\0';    /* M002 strncpy does not null terminate */
  178. strncpy(new_entry.name,name,20);
  179. new_entry.name[19] = '\0';    /* M002 strncpy does not null terminate */
  180. new_entry.score = score;
  181. new_entry.level = level;
  182. new_entry.uid = user_id;
  183.  
  184. if (numread > 0)
  185.     {
  186.     /* insert new_entry at correct point */
  187.     for( table_ptr = &table[numread-1]; table_ptr >= table; --table_ptr ) {
  188.     if(table_ptr->score > score ||
  189.         (table_ptr->score == score && table_ptr->level >= level)) {
  190.         table_ptr[1] = new_entry;
  191.         break;
  192.     }
  193.     table_ptr[1] = table_ptr[0];
  194.     }
  195.     if ( ! (table_ptr >= table) )
  196.     table[0] = new_entry;
  197.  
  198.     /* see if name now appears twice */
  199.     for( already = index = 0, table_ptr = &table[numread]; table_ptr >= table; --table_ptr ) {
  200. #ifdef    COMPARE_BY_NAME
  201. #define    SAMEUSER(p)    (strcmp((p)->name, name) == 0)
  202. #else
  203. #define    SAMEUSER(p)    ((p)->uid == user_id)
  204. #endif
  205.     if(SAMEUSER(table_ptr))
  206.         if(index > 0) {
  207.         already= 1;
  208.         break;
  209.         } else
  210.         index = table_ptr - table;
  211.     }
  212.     if(already)
  213.     /* remove duplicate */
  214.     while( index < numread ) {
  215.         table[index] = table[index + 1];
  216.         ++index;
  217.     }
  218.     else
  219.     ++numread;
  220.     }
  221. else
  222.     {
  223. #ifdef    EGA
  224.     if(!EGAaddr)
  225. #endif
  226.     printf("\nCreating new hiscore table.\n\n");
  227.     table[0] = new_entry;
  228.     numread = 1;
  229.     }
  230. numread = ( (numread > ENTRIES) ? ENTRIES : numread );
  231.  
  232. if(howdead[0])
  233.     sprintf(buffer,"%s killed by %s with a score of %ld on level %d.",name,howdead,score,level);
  234. else
  235.     sprintf(buffer,"%s a total winner with a score of %ld on level %d!",name,score,level);
  236.  
  237. #ifdef    EGA
  238. if(EGAaddr)
  239.     ega_show_scores(buffer,table,numread);
  240. else
  241. #endif
  242.     {
  243.     printf( "\n\n%s\n", buffer );
  244.     show_scores(table,numread);
  245.     }
  246.  
  247. fp = fopen(HISCOREPATH,W_BIN);
  248. numsaved = fwrite( VOIDSTAR table, sizeof(score_entry), numread, fp);
  249. if(numsaved < numread)
  250. #ifdef    EGA
  251.     if(EGAaddr)
  252.     egaprintf(8,300,"ERROR! Only %d items saved from %d!",numsaved,numread);
  253.     else
  254. #endif
  255.     printf("ERROR! Only %d items saved from %d !\n",numsaved,numread);
  256. fclose(fp);
  257. chmod(HISCOREPATH,0660);
  258. UNLOCK;
  259. }
  260.  
  261. void delete_entry(num)
  262. int num;
  263. {
  264. score_entry table[ENTRIES + 22],
  265.         *table_ptr = table;
  266. int  numread,index = 1, numsaved, lock;
  267. FILE *fp;
  268. LOCK;
  269. numread = readtable(table_ptr);
  270. if (numread == 0) {
  271.     printf("Missing or unreadable hiscore table.\n\n");
  272.     UNLOCK;
  273.     exit(1);
  274. }
  275. if (num > numread) {
  276.     printf("Invalid entry, choose again\n");
  277.     UNLOCK;
  278.     return;
  279. }
  280. while(index < num) {
  281.     index++;
  282.     table_ptr++;
  283.     }
  284. while(index < numread) {
  285.     index++;
  286.     *table_ptr = *(table_ptr+1);
  287.     table_ptr++;
  288.     }
  289. numread--;
  290. fp = fopen(HISCOREPATH,W_BIN);
  291. table_ptr = table;
  292. numsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp);
  293. chmod(HISCOREPATH,0660);
  294. if(numsaved < numread)
  295.     printf("ERROR! Only %d items saved from %d !\n",numsaved,numread);
  296. fclose(fp);
  297. UNLOCK;
  298. show_scores(table,numsaved);
  299. }
  300.  
  301. erase_scores()
  302. {
  303. int erasenum,numread,index = 0;
  304. char correct[20],c;
  305. score_entry table[ENTRIES + 2],
  306.         *table_ptr = table;
  307. printf("Please enter password:");
  308. while((c = getchar()) != '\n' && index <19) {
  309.     correct[index++] = c;
  310.     }
  311. correct[index] = 0;
  312. if(strcmp(correct,MASTERPASSWORD)) {
  313.     printf("\nFoo, charlatan!\n");
  314.     return;
  315.     }
  316. numread = readtable(table_ptr);
  317. show_scores(table,numread);
  318. printf("\n");
  319. for(;;) {
  320.     printf("Number to erase (0 to exit): ");
  321.     scanf("%d",&erasenum);
  322.     printf("\n");
  323.     if(erasenum == 0)
  324.     break;
  325.     delete_entry(erasenum);
  326.     printf("\n");
  327.     }
  328. printf("Byee!\n");
  329. }
  330.