home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff216.lzh / Wanderer / src / scores.c < prev    next >
C/C++ Source or Header  |  1989-06-02  |  6KB  |  275 lines

  1. #include "wand_head.h"
  2.  
  3. #if    MSDOS | AMIGA    /* M001    */
  4. #define    LOCK
  5. #define    UNLOCK
  6. #else
  7. #define LOCK while((lock = creat(LOCKPATH,0)) < 0)
  8. #define UNLOCK (void) unlink(LOCKPATH)
  9. #endif
  10.  
  11. #define ENTRIES 15
  12.  
  13. #if    MSDOS | AMIGA    /* M001 */
  14. #define     getuid()    0
  15. #else
  16. extern int getuid();
  17. #endif
  18.  
  19. extern int saved_game;  /* prevent recording of hiscore if  */
  20.             /* NO_RESTORED_GAME_HISCORES is #def'd */
  21.  
  22. typedef struct
  23.     {
  24.     char howdead[25];
  25.     char name[20];
  26.     int  score;
  27.     int  level;
  28.     int  uid;
  29.     } score_entry;
  30.  
  31. #ifdef    LINT_ARGS    /* M001    */
  32. void show_scores(score_entry *,int );
  33. int readtable(score_entry *);
  34. #else
  35. void show_scores();
  36. int readtable();
  37. #endif
  38.  
  39. void show_scores(table,num)
  40. score_entry *table;
  41. int         num;
  42. {
  43. int tot = num;
  44.  
  45. /* only show the top ten */
  46. if (num > 10) num = tot = 10;
  47.  
  48. addstr("\nNo. Score Level           Names                 How they died\n");
  49. addstr("=============================================================================\n");
  50. while(num > 0)
  51.     {
  52.     char buffer[80];
  53.     num--;
  54.     sprintf(buffer,"%2d %5d %3d      %-20s     killed by %-s\n",(tot - num),table->score,table->level,table->name,table->howdead);
  55.     addstr(buffer);
  56.     table++;
  57.     }
  58. addstr("\n");
  59. }
  60.  
  61. int readtable(table_ptr)
  62. score_entry *table_ptr;
  63. {
  64. FILE *fp;
  65. int  numread;
  66. if((fp = fopen(HISCOREPATH,R_BIN)) == NULL)
  67.     {
  68.     numread = 0;
  69.     }
  70. else
  71.     {
  72.     numread = fread( VOIDSTAR table_ptr, sizeof(score_entry), ENTRIES, fp);
  73.     fclose(fp);
  74.     }
  75. return numread;
  76. }
  77.  
  78. int  savescore(howdead,score,level,name)
  79. char *howdead, *name;
  80. int  score,level;
  81. {
  82. score_entry table[ENTRIES + 2],
  83.         *table_ptr = table,new_entry,temp_entry;
  84. int  numread,index = 1, numsaved, lock, already = 0, output_value = 1,
  85.      user_id;
  86. FILE *fp;
  87. #ifdef NO_RESTORED_GAME_HISCORES
  88. if(saved_game) {
  89.     addstr("No hiscores recorded from restored games.\n");
  90.         addstr("\nWanderer (C) 1988  S.Shipway.\n\n");
  91.     return 1;
  92. }
  93. #endif
  94. user_id = getuid();
  95. strncpy(new_entry.howdead,howdead,25);
  96. new_entry.howdead[24] = '\0';    /* M002 strncpy does not null terminate */
  97. strncpy(new_entry.name,name,20);
  98. new_entry.name[19] = '\0';    /* M002 strncpy does not null terminate */
  99. new_entry.score = score;
  100. new_entry.level = level;
  101. new_entry.uid = user_id;
  102. LOCK;
  103. numread = readtable(table_ptr);
  104. if (numread > 0)
  105.     if(table[numread-1].score > 99999)     /* stop system errors messing it up*/
  106.         {
  107.         numread--;
  108.         addstr("Erasing spurious entry in table.\n");
  109.         }
  110. if(score == 0)
  111.     {
  112.     show_scores(table,numread);
  113.     UNLOCK;
  114.     return 0;
  115.     }
  116. if (numread > 0)
  117.     {
  118.     numread++; /* scan through until correct insertion point */
  119.     /* pass table entries with higher scores */
  120.     while((table_ptr->score > score)&&(index < numread))
  121.     {
  122. #ifdef    COMPARE_BY_NAME
  123. #define    SAMEUSER(p)    (strcmp((p)->name, name) == 0)
  124. #else
  125. #define    SAMEUSER(p)    ((p)->uid == user_id)
  126. #endif
  127.     if(SAMEUSER(table_ptr))
  128.         {
  129.         already = 1;
  130.         break;
  131.         }
  132.     table_ptr++;
  133.     index++;
  134.     }
  135.     /* pass table entries with equal score but higher or equal level */
  136.     while((table_ptr->level>=level)&&(index<numread)&&(table_ptr->score==score))
  137.     {
  138.     if(SAMEUSER(table_ptr))
  139.         {
  140.         already = 1;
  141.         break;
  142.         }
  143.     table_ptr++;
  144.     index++;
  145.     }
  146.     /* if already found: done */
  147.     if(already == 1)
  148.     {
  149.     numread--;
  150.     show_scores(table,numread);
  151.     UNLOCK;
  152.     return numread;
  153.     }
  154.     /* shift down score list */
  155.     while(index < numread)
  156.     {
  157.     /* swap *table_ptr and new_entry */
  158.     temp_entry = *table_ptr;
  159.     *table_ptr = new_entry;
  160.     new_entry = temp_entry;
  161.     if(SAMEUSER(&new_entry))
  162.         {
  163.         already = 1;
  164.         numread--; /* an older entry found */
  165.         break;
  166.         }
  167.     table_ptr++;
  168.     index++;
  169.     }
  170.     /* if all shifted without finding an older entry */
  171.     if(already==0)
  172.     *table_ptr = new_entry;
  173.     }
  174. else
  175.     {
  176.     addstr("\nCreating new hiscore table.\n\n");
  177.     *table_ptr = new_entry;
  178.     numread++;
  179.     }
  180. numread = ( (numread > ENTRIES) ? ENTRIES : numread );
  181. if ((fp = fopen(HISCOREPATH,W_BIN)) == NULL)
  182.     {
  183.     UNLOCK;
  184.     return 0;
  185.     }
  186. table_ptr = table;
  187. numsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp);
  188. chmod(HISCOREPATH,0666);
  189. if(numsaved < numread)
  190.     {
  191.     output_value = 0;
  192.     }
  193. fclose(fp);
  194. UNLOCK;
  195. show_scores(table,numsaved);
  196. return output_value;
  197. }
  198.  
  199. void delete_entry(num)
  200. int num;
  201. {
  202. score_entry table[ENTRIES + 22],
  203.         *table_ptr = table;
  204. int  numread,index = 1, numsaved, lock, output_value = 1;
  205. FILE *fp;
  206. LOCK;
  207. numread = readtable(table_ptr);
  208. if (numread == 0) {
  209.     addstr("Missing or unreadable hiscore table.\n\n");
  210.     UNLOCK;
  211.     exit(1);
  212. }
  213. if (num > numread) {
  214.     addstr("Invalid entry, choose again\n");
  215.     UNLOCK;
  216.     return;
  217. }
  218. while(index < num)
  219.     {
  220.     index++;
  221.     table_ptr++;
  222.     }
  223. while(index < numread)
  224.     {
  225.     index++;
  226.     *table_ptr = *(table_ptr+1);
  227.     table_ptr++;
  228.     }
  229. numread--;
  230. fp = fopen(HISCOREPATH,W_BIN);
  231. table_ptr = table;
  232. numsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp);
  233. chmod(HISCOREPATH,0666);
  234. if(numsaved < numread)
  235.     {
  236.     output_value = 0;
  237.     }
  238. fclose(fp);
  239. UNLOCK;
  240. show_scores(table,numsaved);
  241. }
  242.  
  243. erase_scores()
  244. {
  245. int erasenum,numread,index = 0;
  246. char correct[20],c,buffer[20];
  247. score_entry table[ENTRIES + 2],
  248.         *table_ptr = table;
  249. addstr("Please enter password:");
  250. while((c = getchar()) != '\n' && index <19) {
  251.     correct[index++] = c;
  252.     }
  253. correct[index] = 0;
  254. if(strcmp(correct,MASTERPASSWORD))
  255.     {
  256.     addstr("\nFoo, charlatan!\n");
  257.     return 0;
  258.     }
  259. numread = readtable(table_ptr);
  260. show_scores(table,numread);
  261. addstr("\n");
  262. for(;;)
  263. {
  264. addstr("Number to erase (0 to exit): ");
  265. gets(buffer);
  266. erasenum = atoi(buffer);
  267. addstr("\n");
  268. if(erasenum == 0)
  269.     break;
  270. delete_entry(erasenum);
  271. addstr("\n");
  272. }
  273. addstr("Byee!\n");
  274. }
  275.