home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume6 / ega-wanderer / patch1 / scores.c < prev    next >
C/C++ Source or Header  |  1989-02-24  |  8KB  |  333 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. if (fp)
  249.     numsaved = fwrite( VOIDSTAR table, sizeof(score_entry), numread, fp);
  250. else
  251.     numsaved = 0;
  252. if(numsaved < numread)
  253. #ifdef    EGA
  254.     if(EGAaddr)
  255.     egaprintf(8,300,"ERROR! Only %d items saved from %d!",numsaved,numread);
  256.     else
  257. #endif
  258.     printf("ERROR! Only %d items saved from %d !\n",numsaved,numread);
  259. fclose(fp);
  260. chmod(HISCOREPATH,0660);
  261. UNLOCK;
  262. }
  263.  
  264. void delete_entry(num)
  265. int num;
  266. {
  267. score_entry table[ENTRIES + 22],
  268.         *table_ptr = table;
  269. int  numread,index = 1, numsaved, lock;
  270. FILE *fp;
  271. LOCK;
  272. numread = readtable(table_ptr);
  273. if (numread == 0) {
  274.     printf("Missing or unreadable hiscore table.\n\n");
  275.     UNLOCK;
  276.     exit(1);
  277. }
  278. if (num > numread) {
  279.     printf("Invalid entry, choose again\n");
  280.     UNLOCK;
  281.     return;
  282. }
  283. while(index < num) {
  284.     index++;
  285.     table_ptr++;
  286.     }
  287. while(index < numread) {
  288.     index++;
  289.     *table_ptr = *(table_ptr+1);
  290.     table_ptr++;
  291.     }
  292. numread--;
  293. fp = fopen(HISCOREPATH,W_BIN);
  294. table_ptr = table;
  295. numsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp);
  296. chmod(HISCOREPATH,0660);
  297. if(numsaved < numread)
  298.     printf("ERROR! Only %d items saved from %d !\n",numsaved,numread);
  299. fclose(fp);
  300. UNLOCK;
  301. show_scores(table,numsaved);
  302. }
  303.  
  304. erase_scores()
  305. {
  306. int erasenum,numread,index = 0;
  307. char correct[20],c;
  308. score_entry table[ENTRIES + 2],
  309.         *table_ptr = table;
  310. printf("Please enter password:");
  311. while((c = getchar()) != '\n' && index <19) {
  312.     correct[index++] = c;
  313.     }
  314. correct[index] = 0;
  315. if(strcmp(correct,MASTERPASSWORD)) {
  316.     printf("\nFoo, charlatan!\n");
  317.     return;
  318.     }
  319. numread = readtable(table_ptr);
  320. show_scores(table,numread);
  321. printf("\n");
  322. for(;;) {
  323.     printf("Number to erase (0 to exit): ");
  324.     scanf("%d",&erasenum);
  325.     printf("\n");
  326.     if(erasenum == 0)
  327.     break;
  328.     delete_entry(erasenum);
  329.     printf("\n");
  330.     }
  331. printf("Byee!\n");
  332. }
  333.