home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / TOP / USR / SRC / wanderer2.t.Z / wanderer2.t / scores.c < prev    next >
C/C++ Source or Header  |  1988-10-24  |  6KB  |  267 lines

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