1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include "Scorelist.h"
6 #include "UI.h"
7
8 #define NAMELEN 20
9 #define SCORES 10
10
11 typedef struct Score {
12 char name[NAMELEN + 1];
13 int level;
14 int score;
15 } Score;
16
17 static Score scores[SCORES];
18
19 void
Scorelist_read()20 Scorelist_read() {
21 FILE *scorefile = fopen(SCOREFILE, "r");
22 int i;
23
24 if (scorefile != NULL) {
25 for (i = 0; i < SCORES; i++)
26 fscanf(scorefile, "%20s%d%d\n", scores[i].name,
27 &scores[i].level, &scores[i].score);
28 fclose(scorefile);
29 }
30 else {
31 for (i = 0; i < SCORES; i++) {
32 strcpy(scores[i].name, "Anonymous");
33 scores[i].level = 0;
34 scores[i].score = 0;
35 }
36 }
37 }
38
39 void
Scorelist_write()40 Scorelist_write() {
41 FILE *scorefile = fopen(SCOREFILE, "w");
42 int i;
43 if (scorefile == NULL)
44 return;
45 for (i = 0; i < SCORES; i++)
46 fprintf(scorefile, "%-*s %d %d\n", NAMELEN,
47 scores[i].name, scores[i].level, scores[i].score);
48 fclose(scorefile);
49 }
50
51 /* Add new high score to list */
52 void
Scorelist_recalc(const char * str,int level,int score)53 Scorelist_recalc(const char *str, int level, int score) {
54 int i;
55 char tname[NAMELEN + 1];
56 char *nl;
57
58 if (scores[SCORES - 1].score >= score)
59 return;
60 for (i = SCORES - 1; i > 0; i--) {
61 if (scores[i - 1].score < score) {
62 strcpy (scores[i].name, scores[i - 1].name);
63 scores[i].level = scores[i - 1].level;
64 scores[i].score = scores[i - 1].score;
65 }
66 else
67 break;
68 }
69
70 memset(tname, 0, sizeof(tname));
71 if (str == NULL || str[0] == 0)
72 strcpy(tname, "Anonymous");
73 strncpy(tname, str, sizeof(tname) - 1);
74 nl = strchr(tname,'\n');
75 if (nl != NULL)
76 *nl = 0;
77
78 strcpy(scores[i].name, tname);
79 scores[i].level = level;
80 scores[i].score = score;
81 }
82
83 void
Scorelist_update()84 Scorelist_update() {
85 char str[500];
86 int i;
87 sprintf(str, "%s\n\n", "High Scores:");
88 sprintf(str, "%s%-*s %6s %7s\n", str, NAMELEN,
89 "Name", "Level", "Score");
90 for (i = 0; i < SCORES; i++) {
91 sprintf(str, "%s%-*s %6d %7d\n", str, NAMELEN,
92 scores[i].name, scores[i].level, scores[i].score);
93 }
94 UI_update_dialog(DIALOG_HIGHSCORE, str);
95 }
96
97 int
Scorelist_ishighscore(int val)98 Scorelist_ishighscore(int val) {
99 return (val > scores[SCORES - 1].score);
100 }
101