diff options
author | Alexander Levin <al.le@rockbox.org> | 2009-06-30 20:00:46 +0000 |
---|---|---|
committer | Alexander Levin <al.le@rockbox.org> | 2009-06-30 20:00:46 +0000 |
commit | 6a5245ae08e35bd90436ddb97a8c7fbfea89b1fd (patch) | |
tree | 1238b06f8a88573c3fe0c4a5c31c09892e263306 /apps/plugins/lib/highscore.c | |
parent | e905ca61d4a2d90d9a2fac0ae1b70c55451eaf88 (diff) | |
download | rockbox-6a5245ae08e35bd90436ddb97a8c7fbfea89b1fd.tar.gz rockbox-6a5245ae08e35bd90436ddb97a8c7fbfea89b1fd.zip |
Improve the highscore related functions in plugin lib (FS#10350)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21578 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/lib/highscore.c')
-rw-r--r-- | apps/plugins/lib/highscore.c | 98 |
1 files changed, 44 insertions, 54 deletions
diff --git a/apps/plugins/lib/highscore.c b/apps/plugins/lib/highscore.c index 9d3b19ea48..e8e1c883b0 100644 --- a/apps/plugins/lib/highscore.c +++ b/apps/plugins/lib/highscore.c | |||
@@ -34,8 +34,8 @@ int highscore_save(char *filename, struct highscore *scores, int num_scores) | |||
34 | 34 | ||
35 | for(i = 0;i < num_scores;i++) | 35 | for(i = 0;i < num_scores;i++) |
36 | { | 36 | { |
37 | rb->snprintf(buf, sizeof(buf)-1, "%s:%d:%d\n", | 37 | rb->snprintf(buf, sizeof(buf), "%d:%d:%s\n", |
38 | scores[i].name, scores[i].score, scores[i].level); | 38 | scores[i].score, scores[i].level, scores[i].name); |
39 | rc = rb->write(fd, buf, rb->strlen(buf)); | 39 | rc = rb->write(fd, buf, rb->strlen(buf)); |
40 | if(rc < 0) | 40 | if(rc < 0) |
41 | { | 41 | { |
@@ -52,72 +52,62 @@ int highscore_load(char *filename, struct highscore *scores, int num_scores) | |||
52 | int i; | 52 | int i; |
53 | int fd; | 53 | int fd; |
54 | char buf[80]; | 54 | char buf[80]; |
55 | char *name, *score, *level; | 55 | char *score, *level, *name; |
56 | char *ptr; | ||
57 | 56 | ||
58 | fd = rb->open(filename, O_RDONLY); | 57 | rb->memset(scores, 0, sizeof(struct highscore)*num_scores); |
59 | 58 | ||
60 | rb->memset(scores, 0, sizeof(struct highscore)*(num_scores+1)); | 59 | fd = rb->open(filename, O_RDONLY); |
61 | |||
62 | if(fd < 0) | 60 | if(fd < 0) |
63 | return -1; | 61 | return -1; |
64 | 62 | ||
65 | i = -1; | 63 | i = 0; |
66 | while(rb->read_line(fd, buf, sizeof(buf)-1) && i < num_scores) | 64 | while(rb->read_line(fd, buf, sizeof(buf)) > 0 && i < num_scores) |
67 | { | 65 | { |
68 | i++; | ||
69 | |||
70 | DEBUGF("%s\n", buf); | 66 | DEBUGF("%s\n", buf); |
71 | name = buf; | 67 | |
72 | ptr = rb->strchr(buf, ':'); | 68 | if ( !rb->settings_parseline(buf, &score, &level) ) |
73 | if ( !ptr ) | ||
74 | continue; | 69 | continue; |
75 | *ptr = 0; | 70 | if ( !rb->settings_parseline(level, &level, &name) ) |
76 | ptr++; | ||
77 | |||
78 | rb->strncpy(scores[i].name, name, sizeof(scores[i].name)); | ||
79 | |||
80 | DEBUGF("%s\n", scores[i].name); | ||
81 | score = ptr; | ||
82 | |||
83 | ptr = rb->strchr(ptr, ':'); | ||
84 | if ( !ptr ) | ||
85 | continue; | 71 | continue; |
86 | *ptr = 0; | 72 | |
87 | ptr++; | ||
88 | |||
89 | scores[i].score = rb->atoi(score); | 73 | scores[i].score = rb->atoi(score); |
90 | |||
91 | level = ptr; | ||
92 | scores[i].level = rb->atoi(level); | 74 | scores[i].level = rb->atoi(level); |
93 | } | 75 | rb->strncpy(scores[i].name, name, sizeof(scores[i].name)-1); |
76 | i++; | ||
77 | } | ||
78 | rb->close(fd); | ||
94 | return 0; | 79 | return 0; |
95 | } | 80 | } |
96 | 81 | ||
97 | int highscore_update(int score, int level, struct highscore *scores, int num_scores) | 82 | int highscore_update(int score, int level, const char *name, |
83 | struct highscore *scores, int num_scores) | ||
98 | { | 84 | { |
99 | int i, j; | 85 | int pos; |
100 | int new = 0; | 86 | struct highscore *entry; |
101 | 87 | ||
102 | /* look through the scores and see if this one is in the top ones */ | 88 | if (!highscore_would_update(score, scores, num_scores)) |
103 | for(i = num_scores-1;i >= 0; i--) | 89 | return -1; |
90 | |||
91 | pos = num_scores-1; | ||
92 | while (pos > 0 && score > scores[pos-1].score) | ||
104 | { | 93 | { |
105 | if ((score > scores[i].score)) | 94 | /* move down one */ |
106 | { | 95 | rb->memcpy((void *)&scores[pos], (void *)&scores[pos-1], |
107 | /* Move the rest down one... */ | 96 | sizeof(struct highscore)); |
108 | if (i > 0) | 97 | pos--; |
109 | { | 98 | } |
110 | for (j=1; j<=i; j++) | 99 | |
111 | { | 100 | entry = scores + pos; |
112 | rb->memcpy((void *)&scores[j-1], (void *)&scores[j], sizeof(struct highscore)); | 101 | entry->score = score; |
113 | } | 102 | entry->level = level; |
114 | } | 103 | rb->strncpy(entry->name, name, sizeof(entry->name)); |
115 | scores[i].score = score; | 104 | entry->name[sizeof(entry->name)-1] = '\0'; |
116 | scores[i].level = level; | 105 | |
117 | /* Need to sort out entering a name... maybe old three letter arcade style */ | 106 | return pos; |
118 | new = 1; | 107 | } |
119 | break; | 108 | |
120 | } | 109 | bool highscore_would_update(int score, struct highscore *scores, |
121 | } | 110 | int num_scores) |
122 | return new; | 111 | { |
112 | return (num_scores > 0) && (score > scores[num_scores-1].score); | ||
123 | } | 113 | } |