home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume6 / lander / score.c < prev    next >
C/C++ Source or Header  |  1989-07-06  |  5KB  |  237 lines

  1. #include <stdio.h>
  2. #include <curses.h>
  3. #include "consts.h"
  4. #include "funcs.h"
  5.  
  6. #define HEADER "Scores"
  7. #define NAME_LEN 20
  8. #define HS_ENTRIES 10
  9. #define SC_WIN_LEN 16
  10. #define SPC_LINE (SC_WIN_LEN - 2)
  11.  
  12. typedef struct score_pad_t {
  13.     int y;
  14.     int start_x;
  15.     int end_x;
  16.     } score_pad_t;
  17. typedef struct score_t {
  18.     int score;
  19.     char name[NAME_LEN];
  20.     } score_t;
  21.  
  22. extern double Fuel;
  23. extern int PadScore[];
  24. extern int BSLandings, Landings;
  25. extern char *Template[];
  26. extern int LastLegalY, LastLegalX;
  27.  
  28. score_pad_t ScorePad[MAX_PADS];
  29. int Score;
  30. int BestScore = 0;
  31.  
  32. static char *HSFile = HS_FILE;
  33. static int TotalPads;
  34.  
  35. void ScDisplayErr();
  36. int ScCmp();
  37.  
  38. void ScReadDisplay(back_win)
  39.  
  40. WINDOW *back_win;
  41.  
  42.     {
  43.     int old_y, old_x, items, i;
  44.     WINDOW *score_win;
  45.     FILE *fp;
  46.     score_t score_pad[HS_ENTRIES];
  47.  
  48.     if ((fp = fopen(HSFile, "r")) == NULL)
  49.         {
  50.         ScDisplayErr(back_win, "Unable to display HS file.");
  51.         return;
  52.         }
  53.     getyx(back_win, old_y, old_x);
  54.     wmove(back_win, 0, 0);
  55.     wrefresh(back_win);
  56.     score_win = newwin(SC_WIN_LEN, 25, 2, 5);
  57.     werase(score_win);
  58.     box(score_win, 0, 0);
  59.     items = fread((char *)score_pad, sizeof(score_t), HS_ENTRIES, fp);
  60.     fclose(fp);
  61.     if (items == 0)
  62.         {
  63.         mvwaddstr(score_win, 5, 1, "HS file empty.");
  64.         PressSpace(back_win, old_y, old_x, score_win, SPC_LINE, 1);
  65.         return;
  66.         }
  67.     mvwaddstr(score_win, 1, (25 - sizeof(HEADER)) / 2, HEADER);
  68.     wrefresh(score_win);
  69.     for (i = 0; i < items; ++i)
  70.         {
  71.         wmove(score_win, 3 + i, 1);
  72.         wprintw(score_win, "%4d %s", score_pad[i].score,
  73.             score_pad[i].name);
  74.         }
  75.     PressSpace(back_win, old_y, old_x, score_win, SPC_LINE, 1);
  76.     }
  77.  
  78. void ScWrite(back_win)
  79.  
  80. WINDOW *back_win;
  81.  
  82.     {
  83.     int items;
  84.     FILE *fp;
  85.     char *user;
  86.     score_t score_pad[HS_ENTRIES + 1];
  87.     void qsort();
  88.     char *getenv();
  89.  
  90.     if (Score == 0)
  91.         return;
  92.     if ((fp = fopen(HSFile, "r")) == NULL)
  93.         {
  94.         ScDisplayErr(back_win, "Unable to read HS file.");
  95.         ScDisplayErr(back_win, "Attempting to create HS file.");
  96.         if (creat(HSFile, 0777) == -1)
  97.             {
  98.             ScDisplayErr(back_win,
  99.                 "Unable to create HS file, check pathname.");
  100.             return;
  101.             }
  102.         }
  103.     if ((fp = fopen(HSFile, "r")) == NULL)
  104.         {
  105.         ScDisplayErr(back_win, "Unable to read new HS file.");
  106.         return;
  107.         }
  108.     items = fread((char *)score_pad, sizeof(score_t), HS_ENTRIES, fp);
  109.     fclose(fp);
  110.     if ((user = getenv("LOGNAME")) == NULL)
  111.         {
  112.         ScDisplayErr(back_win, "Environment var LOGNAME must be set");
  113.         return;
  114.         }
  115.     strcpy(score_pad[items].name, user);
  116.     score_pad[items].score = Score;
  117.     ++items;
  118.     qsort((char *)score_pad, items, sizeof(score_t), ScCmp);
  119.     if (items > HS_ENTRIES)
  120.         items = HS_ENTRIES;
  121.     if ((fp = fopen(HSFile, "w")) == NULL)
  122.         {
  123.         ScDisplayErr(back_win, "Unable to write HS file.");
  124.         return;
  125.         }
  126.     if (fwrite((char *)score_pad, sizeof(score_t), items, fp) == 0)
  127.         ScDisplayErr(back_win, "No HS entries written.");
  128.     fclose(fp);
  129.     }
  130.  
  131. static int ScCmp(sc_rec1, sc_rec2)
  132.  
  133. score_t *sc_rec1, *sc_rec2;
  134.  
  135.     {
  136.     if (sc_rec1->score < sc_rec2->score)
  137.         return 1;
  138.     if (sc_rec1->score > sc_rec2->score)
  139.         return -1;
  140.     return 0;
  141.     }
  142.  
  143. void PressSpace(back_win, y, x, cur_win, sy, sx)
  144.  
  145. WINDOW *back_win, *cur_win;
  146. int y, x, sy, sx;
  147.  
  148.     {
  149.     mvwaddstr(cur_win, sy, sx, "--press space--");
  150.     wrefresh(cur_win);
  151.     while (wgetch(cur_win) != ' ');
  152.     delwin(cur_win);
  153.     wmove(back_win, y, x);
  154.     touchwin(back_win);
  155.     wrefresh(back_win);
  156.     }
  157.  
  158. static void ScDisplayErr(back_win, str)
  159.  
  160. WINDOW *back_win;
  161. char *str;
  162.  
  163.     {
  164.     int old_y, old_x, win_len;
  165.     WINDOW *err_win;
  166.  
  167.     getyx(back_win, old_y, old_x);
  168.     wmove(back_win, 0, 0);
  169.     wrefresh(back_win);
  170.     win_len = strlen(str) + 2;
  171.     err_win = newwin(3, win_len, LINES / 2 - 2, (COLS - win_len - 2) / 2);
  172.     box(err_win, 0, 0);
  173.     mvwaddstr(err_win, 1, 1, str);
  174.     wrefresh(err_win);
  175.     sleep(3);
  176.     delwin(err_win);
  177.     wmove(back_win, old_y, old_x);
  178.     touchwin(back_win);
  179.     wrefresh(back_win);
  180.     }
  181.  
  182. void UpdateScore(screen)
  183.  
  184. WINDOW *screen;
  185.  
  186.     {
  187.     int pad_i = 0, found = 0, fuel_bonus, diff_bonus;
  188.     char scr_buf[128];
  189.  
  190.     while (pad_i < SCR_X && ! found)
  191.         {
  192.         found = LastLegalX >= ScorePad[pad_i].start_x &&
  193.             LastLegalX <= ScorePad[pad_i].end_x &&
  194.             ScorePad[pad_i].y == LastLegalY;
  195.         ++pad_i;
  196.         }
  197.     --pad_i;
  198.     fuel_bonus = Fuel / 100.0 + 0.5;
  199.     sprintf(scr_buf, "Fuel bonus: %d", fuel_bonus);
  200.     mvwaddstr(screen, 3, 25, scr_buf);
  201.     wrefresh(screen);
  202.     diff_bonus = (Landings + 1) * 10;
  203.     sprintf(scr_buf, "Consecutive Landings Bonus: %d", diff_bonus);
  204.     mvwaddstr(screen, 4, 9, scr_buf);
  205.     wrefresh(screen);
  206.     Score += PadScore[pad_i] + fuel_bonus + diff_bonus;
  207.     }
  208.  
  209. void InitScore()
  210.  
  211.     {
  212.     int i, j, pad_count = 0;
  213.     char *line;
  214.  
  215.     for (i = 0; i < SCR_Y; ++i)
  216.         {
  217.         j = 0;
  218.         line = Template[i];
  219.         while (j < SCR_X)
  220.             {
  221.             if (line[j] == PAD)
  222.                 {
  223.                 ScorePad[pad_count].y = i;
  224.                 ScorePad[pad_count].start_x = j;
  225.                 while (j < SCR_X && line[j] == PAD)
  226.                     ++j;
  227.                 if (j >= SCR_X)
  228.                     --j;
  229.                 ScorePad[pad_count].end_x = j;
  230.                 ++pad_count;
  231.                 }
  232.             ++j;
  233.             }
  234.         }
  235.     TotalPads = pad_count;
  236.     }
  237.