ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/hiscore.C
(Generate patch)

Comparing deliantra/server/server/hiscore.C (file contents):
Revision 1.4 by root, Sun Sep 3 00:18:42 2006 UTC vs.
Revision 1.18 by pippijn, Mon Jan 15 21:06:20 2007 UTC

1/* 1/*
2 * static char *rcsid_hiscore_c =
3 * "$Id: hiscore.C,v 1.4 2006/09/03 00:18:42 root Exp $";
4 */
5
6/*
7 CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game for X-windows
8 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
9 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
11 7 *
12 This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version. 11 * (at your option) any later version.
16 12 *
17 This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details. 16 * GNU General Public License for more details.
21 17 *
22 You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 21 *
26 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 * The authors can be reached via e-mail at <crossfire@schmorp.de>
27*/ 23 */
28 24
29#include <global.h> 25#include <global.h>
30#ifndef __CEXTRACT__
31#include <sproto.h> 26#include <sproto.h>
32#endif
33 27
34/* 28/*
35 * The score structure is used when treating new high-scores 29 * The score structure is used when treating new high-scores
36 */ 30 */
37
38typedef struct scr { 31typedef struct scr
39 char name[BIG_NAME]; /* name */ 32{
40 char title[BIG_NAME]; /* Title */ 33 char name[64]; // name */
34 char title[64]; // Title */
41 char killer[BIG_NAME]; /* name (+ title) or "quit" */ 35 char killer[64]; // name (+ title) or "quit" */
42 sint64 exp; /* Experience */ 36 sint64 exp; // Experience */
43 char maplevel[BIG_NAME]; /* Killed on what level */ 37 char maplevel[128]; // Killed on what level */
44 int maxhp,maxsp,maxgrace; /* Max hp, sp, grace when killed */ 38 int maxhp, maxsp, maxgrace; // Max hp, sp, grace when killed */
45 int position; /* Position in the highscore list */ 39 int position; // Position in the highscore list */
46} score; 40} score;
47 41
48/* 42/*
49 * spool works mostly like strtok(char *, ":"), but it can also 43 * spool works mostly like strtok(char *, ":"), but it can also
50 * log a specified error message if something goes wrong. 44 * log a specified error message if something goes wrong.
51 */ 45 */
52 46
47char *
53char *spool(char *bp,char *error) { 48spool (char *bp, char *error)
49{
54 static char *prev_pos = NULL; 50 static char *prev_pos = NULL;
55 char *next_pos; 51 char *next_pos;
52
56 if (bp == NULL) { 53 if (bp == NULL)
54 {
57 if (prev_pos == NULL) { 55 if (prev_pos == NULL)
56 {
58 LOG(llevError, "Called spool (%s) with NULL without previous call.\n", 57 LOG (llevError, "Called spool (%s) with NULL without previous call.\n", error);
59 error); 58 return NULL;
59 }
60 bp = prev_pos;
61 }
62 if (*bp == '\0')
63 {
64 LOG (llevError, "spool: End of line at %s\n", error);
60 return NULL; 65 return NULL;
61 } 66 }
62 bp = prev_pos;
63 }
64 if (*bp == '\0') {
65 LOG(llevError, "spool: End of line at %s\n", error);
66 return NULL;
67 }
68 if ((next_pos = strchr(bp, ':')) != NULL) { 67 if ((next_pos = strchr (bp, ':')) != NULL)
68 {
69 *next_pos = '\0'; 69 *next_pos = '\0';
70 prev_pos = next_pos + 1; 70 prev_pos = next_pos + 1;
71 }
71 } else 72 else
72 prev_pos = NULL; 73 prev_pos = NULL;
73 return bp; 74 return bp;
74} 75}
75 76
76/* 77/*
77 * Does what it says, copies the contents of the first score structure 78 * Does what it says, copies the contents of the first score structure
78 * to the second one. 79 * to the second one.
79 */ 80 */
80 81
82static void
81static void copy_score(score *sc1,score *sc2) { 83copy_score (score *sc1, score *sc2)
82 strncpy(sc2->name, sc1->name, BIG_NAME); 84{
83 sc2->name[BIG_NAME - 1] = '\0'; 85 assign (sc2->name , sc1->name);
84 strncpy(sc2->title, sc1->title, BIG_NAME); 86 assign (sc2->title , sc1->title);
85 sc2->title[BIG_NAME - 1] = '\0'; 87 assign (sc2->killer , sc1->killer);
86 strncpy(sc2->killer, sc1->killer, BIG_NAME); 88 assign (sc2->maplevel, sc1->maplevel);
87 sc2->killer[BIG_NAME - 1] = '\0';
88 sc2->exp = sc1->exp; 89 sc2->exp = sc1->exp;
89 strcpy(sc2->maplevel,sc1->maplevel);
90 sc2->maxhp = sc1->maxhp; 90 sc2->maxhp = sc1->maxhp;
91 sc2->maxsp = sc1->maxsp; 91 sc2->maxsp = sc1->maxsp;
92 sc2->maxgrace = sc1->maxgrace; 92 sc2->maxgrace = sc1->maxgrace;
93} 93}
94 94
95/* 95/*
96 * Writes the given score structure to a static buffer, and returns 96 * Writes the given score structure to a static buffer, and returns
97 * a pointer to it. 97 * a pointer to it.
98 */ 98 */
99 99
100static char *put_score(score *sc) { 100static char *
101put_score (score *sc)
102{
101 static char buf[MAX_BUF]; 103 static char buf[MAX_BUF];
102 sprintf(buf,"%s:%s:%lld:%s:%s:%d:%d:%d",sc->name,sc->title, (long long)sc->exp,sc->killer,sc->maplevel, 104
105 sprintf (buf, "%s:%s:%" PRId64 ":%s:%s:%d:%d:%d",
106 sc->name, sc->title, (sint64)sc->exp, sc->killer,
103 sc->maxhp,sc->maxsp,sc->maxgrace); 107 sc->maplevel, sc->maxhp, sc->maxsp, sc->maxgrace);
104 return buf; 108 return buf;
105} 109}
106 110
107/* 111/*
108 * The oposite of put_score, get_score reads from the given buffer into 112 * The oposite of put_score, get_score reads from the given buffer into
109 * a static score structure, and returns a pointer to it. 113 * a static score structure, and returns a pointer to it.
110 */ 114 */
111 115
112static score *get_score(char *bp) { 116static score *
117get_score (char *bp)
118{
113 static score sc; 119 static score sc;
114 char *cp; 120 char *cp;
115 121
116 if((cp=strchr(bp,'\n'))!=NULL) 122 if ((cp = strchr (bp, '\n')) != NULL)
117 *cp='\0'; 123 *cp = '\0';
118 124
119 if ((cp = spool(bp, "name")) == NULL) 125 if ((cp = spool (bp, "name")) == NULL)
120 return NULL; 126 return 0;
121 strncpy(sc.name,cp,BIG_NAME);
122 sc.name[BIG_NAME - 1] = '\0';
123 127
128 assign (sc.name, cp);
129
124 if ((cp = spool(NULL, "title")) == NULL) 130 if ((cp = spool (0, "title")) == NULL)
125 return NULL; 131 return 0;
126 strncpy(sc.title,cp,BIG_NAME);
127 sc.title[BIG_NAME - 1] = '\0';
128 132
133 assign (sc.title, cp);
134
129 if ((cp = spool(NULL, "score")) == NULL) 135 if ((cp = spool (0, "score")) == NULL)
130 return NULL; 136 return 0;
131 long long exp;
132 sscanf(cp,"%lld", &exp); sc.exp = exp;
133 137
138 sscanf (cp, "%" SCNd64, &sc.exp);
139
134 if ((cp = spool(NULL, "killer")) == NULL) 140 if ((cp = spool (0, "killer")) == NULL)
135 return NULL; 141 return 0;
136 strncpy(sc.killer, cp, BIG_NAME);
137 sc.killer[BIG_NAME - 1] = '\0';
138 142
143 assign (sc.killer, cp);
144
139 if ((cp = spool(NULL, "map")) == NULL) 145 if ((cp = spool (0, "map")) == NULL)
140 return NULL; 146 return 0;
141 strncpy(sc.maplevel, cp, BIG_NAME);
142 sc.maplevel[BIG_NAME - 1] = '\0';
143 147
148 assign (sc.maplevel, cp);
149
144 if ((cp = spool(NULL, "maxhp")) == NULL) 150 if ((cp = spool (0, "maxhp")) == NULL)
145 return NULL; 151 return 0;
152
146 sscanf(cp, "%d", &sc.maxhp); 153 sscanf (cp, "%d", &sc.maxhp);
147 154
148 if ((cp = spool(NULL, "maxsp")) == NULL) 155 if ((cp = spool (0, "maxsp")) == NULL)
149 return NULL; 156 return 0;
157
150 sscanf(cp, "%d", &sc.maxsp); 158 sscanf (cp, "%d", &sc.maxsp);
151 159
152 if ((cp = spool(NULL, "maxgrace")) == NULL) 160 if ((cp = spool (0, "maxgrace")) == NULL)
153 return NULL; 161 return 0;
162
154 sscanf(cp, "%d", &sc.maxgrace); 163 sscanf (cp, "%d", &sc.maxgrace);
155 return &sc; 164 return &sc;
156} 165}
157 166
167static char *
158static char * draw_one_high_score(score *sc) { 168draw_one_high_score (score *sc)
169{
159 static char retbuf[MAX_BUF]; 170 static char retbuf[MAX_BUF];
160 171
161 if(!strncmp(sc->killer,"quit",MAX_NAME)) 172 if (!strncmp (sc->killer, "quit", MAX_NAME))
162 sprintf(retbuf,"%3d %10lld %s the %s quit the game on map %s [%d][%d][%d].", 173 sprintf (retbuf, "%3d %10lld %s the %s quit the game on map %s [%d][%d][%d].",
163 sc->position, (long long)sc->exp,sc->name,sc->title,sc->maplevel,sc->maxhp,sc->maxsp, 174 sc->position, (long long) sc->exp, sc->name, sc->title, sc->maplevel, sc->maxhp, sc->maxsp, sc->maxgrace);
164 sc->maxgrace);
165 else if(!strncmp(sc->killer,"left",MAX_NAME)) 175 else if (!strncmp (sc->killer, "left", MAX_NAME))
166 sprintf(retbuf,"%3d %10lld %s the %s left the game on map %s [%d][%d][%d].", 176 sprintf (retbuf, "%3d %10lld %s the %s left the game on map %s [%d][%d][%d].",
167 sc->position, (long long)sc->exp,sc->name,sc->title,sc->maplevel,sc->maxhp,sc->maxsp, 177 sc->position, (long long) sc->exp, sc->name, sc->title, sc->maplevel, sc->maxhp, sc->maxsp, sc->maxgrace);
168 sc->maxgrace);
169 else 178 else
170 sprintf(retbuf,"%3d %10lld %s the %s was killed by %s on map %s [%d][%d][%d].", 179 sprintf (retbuf, "%3d %10lld %s the %s was killed by %s on map %s [%d][%d][%d].",
171 sc->position, (long long)sc->exp,sc->name,sc->title,sc->killer,sc->maplevel, 180 sc->position, (long long) sc->exp, sc->name, sc->title, sc->killer, sc->maplevel, sc->maxhp, sc->maxsp, sc->maxgrace);
172 sc->maxhp,sc->maxsp,sc->maxgrace);
173 return retbuf; 181 return retbuf;
174} 182}
183
175/* 184/*
176 * add_score() adds the given score-structure to the high-score list, but 185 * add_score() adds the given score-structure to the high-score list, but
177 * only if it was good enough to deserve a place. 186 * only if it was good enough to deserve a place.
178 */ 187 */
179 188
189static score *
180static score *add_score(score *new_score) { 190add_score (score *new_score)
191{
181 FILE *fp; 192 FILE *fp;
182 static score old_score; 193 static score old_score;
183 score *tmp_score,pscore[HIGHSCORE_LENGTH]; 194 score *tmp_score, pscore[HIGHSCORE_LENGTH];
184 char buf[MAX_BUF], filename[MAX_BUF], *bp; 195 char buf[MAX_BUF], filename[MAX_BUF], *bp;
185 int nrofscores=0,flag=0,i,comp; 196 int nrofscores = 0, flag = 0, i, comp;
186 197
187 new_score->position=HIGHSCORE_LENGTH+1; 198 new_score->position = HIGHSCORE_LENGTH + 1;
188 old_score.position= -1; 199 old_score.position = -1;
189 sprintf(filename,"%s/%s",settings.localdir,HIGHSCORE); 200 sprintf (filename, "%s/%s", settings.localdir, HIGHSCORE);
190 if((fp=open_and_uncompress(filename,1,&comp))!=NULL) { 201 if ((fp = open_and_uncompress (filename, 1, &comp)) != NULL)
202 {
191 while(fgets(buf,MAX_BUF,fp)!=NULL&&nrofscores<HIGHSCORE_LENGTH) { 203 while (fgets (buf, MAX_BUF, fp) != NULL && nrofscores < HIGHSCORE_LENGTH)
204 {
192 if((tmp_score=get_score(buf))==NULL) break; 205 if ((tmp_score = get_score (buf)) == NULL)
193 if(!flag&&new_score->exp>=tmp_score->exp) {
194 copy_score(new_score,&pscore[nrofscores]);
195 new_score->position=nrofscores;
196 flag=1;
197 if(++nrofscores>=HIGHSCORE_LENGTH)
198 break; 206 break;
199 } 207 if (!flag && new_score->exp >= tmp_score->exp)
208 {
209 copy_score (new_score, &pscore[nrofscores]);
210 new_score->position = nrofscores;
211 flag = 1;
212 if (++nrofscores >= HIGHSCORE_LENGTH)
213 break;
214 }
200 if(!strcmp(new_score->name,tmp_score->name)) { /* Another entry */ 215 if (!strcmp (new_score->name, tmp_score->name))
216 { /* Another entry */
201 copy_score(tmp_score,&old_score); 217 copy_score (tmp_score, &old_score);
202 old_score.position=nrofscores; 218 old_score.position = nrofscores;
203 if(flag) 219 if (flag)
204 continue; 220 continue;
205 } 221 }
206 copy_score(tmp_score,&pscore[nrofscores++]); 222 copy_score (tmp_score, &pscore[nrofscores++]);
207 } 223 }
208 close_and_delete(fp, comp); 224 close_and_delete (fp, comp);
209 } 225 }
210 if(old_score.position!=-1&&old_score.exp>=new_score->exp) 226 if (old_score.position != -1 && old_score.exp >= new_score->exp)
211 return &old_score; /* Did not beat old score */ 227 return &old_score; /* Did not beat old score */
212 if(!flag&&nrofscores<HIGHSCORE_LENGTH) 228 if (!flag && nrofscores < HIGHSCORE_LENGTH)
213 copy_score(new_score,&pscore[nrofscores++]); 229 copy_score (new_score, &pscore[nrofscores++]);
214 if((fp=fopen(filename,"w"))==NULL) { 230 if ((fp = fopen (filename, "w")) == NULL)
231 {
215 LOG(llevError, "Cannot write to highscore file %s: %s\n", filename, strerror(errno)); 232 LOG (llevError, "Cannot write to highscore file %s: %s\n", filename, strerror (errno));
216 return NULL; 233 return NULL;
217 } 234 }
218 for(i=0;i<nrofscores;i++) { 235 for (i = 0; i < nrofscores; i++)
236 {
219 bp=put_score(&pscore[i]); 237 bp = put_score (&pscore[i]);
220 fprintf(fp,"%s\n",bp); 238 fprintf (fp, "%s\n", bp);
221 } 239 }
222 fclose(fp); 240 fclose (fp);
223 if(flag) { 241 if (flag)
242 {
243
224/* Eneq(@csd.uu.se): Patch to fix error in adding a new score to the 244/* Eneq(@csd.uu.se): Patch to fix error in adding a new score to the
225 hiscore-list */ 245 hiscore-list */
226 if(old_score.position==-1) 246 if (old_score.position == -1)
227 return new_score; 247 return new_score;
248 return &old_score;
249 }
250 new_score->position = -1;
251 if (old_score.position != -1)
228 return &old_score; 252 return &old_score;
229 } 253 if (nrofscores)
230 new_score->position= -1; 254 {
231 if(old_score.position!=-1) 255 copy_score (&pscore[nrofscores - 1], &old_score);
232 return &old_score; 256 return &old_score;
233 if(nrofscores) {
234 copy_score(&pscore[nrofscores-1],&old_score);
235 return &old_score;
236 } 257 }
237 LOG(llevError,"Highscore error.\n"); 258 LOG (llevError, "Highscore error.\n");
238 return NULL; 259 return NULL;
239} 260}
240 261
262void
241void check_score(object *op) { 263check_score (object *op)
264{
242 score new_score; 265 score new_score;
243 score *old_score; 266 score *old_score;
244 267
245 if(op->stats.exp==0) 268 if (op->stats.exp == 0)
246 return; 269 return;
247 270
248 if(!op->contr->name_changed) { 271 assign (new_score.name, op->name);
249 if(op->stats.exp>0) { 272 assign (new_score.title, op->title.length () ? &op->title : op->contr->title);
250 new_draw_info(NDI_UNIQUE, 0,op,"As you haven't changed your name, you won't"); 273 assign (new_score.killer, op->contr->killer[0] ? op->contr->killer : "a dungeon collapse");
251 new_draw_info(NDI_UNIQUE, 0,op,"get into the high-score list."); 274 assign (new_score.maplevel, op->map ? op->map->name ? &op->map->name : &op->map->path : "");
252 } 275
253 return;
254 }
255 if(QUERY_FLAG(op,FLAG_WAS_WIZ)) {
256 new_draw_info(NDI_UNIQUE, 0,op,"Since you have been in wizard mode,");
257 new_draw_info(NDI_UNIQUE, 0,op,"you can't enter the high-score list.");
258 return;
259 }
260 if (op->contr->explore) {
261 new_draw_info(NDI_UNIQUE, 0,op,"Since you were in explore mode,");
262 new_draw_info(NDI_UNIQUE, 0,op,"you can't enter the high-score list.");
263 return;
264 }
265 strncpy(new_score.name,op->name,BIG_NAME);
266 new_score.name[BIG_NAME-1] = '\0';
267 strncpy(new_score.title,op->contr->own_title,BIG_NAME);
268 if(new_score.title[0]=='\0')
269 strncpy(new_score.title,op->contr->title,BIG_NAME);
270 new_score.title[BIG_NAME-1] = '\0';
271 strncpy(new_score.killer,op->contr->killer,BIG_NAME);
272 if(new_score.killer[0]=='\0')
273 strcpy(new_score.killer,"a dungeon collapse");
274 new_score.killer[BIG_NAME-1] = '\0';
275 new_score.exp=op->stats.exp; 276 new_score.exp = op->stats.exp;
276 if(op->map == NULL)
277 *new_score.maplevel = '\0';
278 else {
279 strncpy(new_score.maplevel,
280 op->map->name?op->map->name:op->map->path,
281 BIG_NAME-1);
282 new_score.maplevel[BIG_NAME-1] = '\0';
283 }
284 new_score.maxhp=(int) op->stats.maxhp; 277 new_score.maxhp = op->stats.maxhp;
285 new_score.maxsp=(int) op->stats.maxsp; 278 new_score.maxsp = op->stats.maxsp;
286 new_score.maxgrace=(int) op->stats.maxgrace; 279 new_score.maxgrace = op->stats.maxgrace;
280
287 if((old_score=add_score(&new_score))==NULL) { 281 if ((old_score = add_score (&new_score)) == NULL)
282 {
288 new_draw_info(NDI_UNIQUE, 0,op,"Error in the highscore list."); 283 new_draw_info (NDI_UNIQUE, 0, op, "Error in the highscore list.");
289 return; 284 return;
290 } 285 }
286
291 if(new_score.position == -1) { 287 if (new_score.position == -1)
288 {
292 new_score.position = HIGHSCORE_LENGTH+1; /* Not strictly correct... */ 289 new_score.position = HIGHSCORE_LENGTH + 1; /* Not strictly correct... */
293 if(!strcmp(old_score->name,new_score.name)) 290 if (!strcmp (old_score->name, new_score.name))
294 new_draw_info(NDI_UNIQUE, 0,op,"You didn't beat your last highscore:"); 291 new_draw_info (NDI_UNIQUE, 0, op, "You didn't beat your last highscore:");
295 else 292 else
296 new_draw_info(NDI_UNIQUE, 0,op,"You didn't enter the highscore list:"); 293 new_draw_info (NDI_UNIQUE, 0, op, "You didn't enter the highscore list:");
297 new_draw_info(NDI_UNIQUE, 0,op, draw_one_high_score(old_score)); 294 new_draw_info (NDI_UNIQUE, 0, op, draw_one_high_score (old_score));
298 new_draw_info(NDI_UNIQUE, 0,op, draw_one_high_score(&new_score)); 295 new_draw_info (NDI_UNIQUE, 0, op, draw_one_high_score (&new_score));
299 return; 296 return;
300 } 297 }
298
301 if(old_score->exp>=new_score.exp) 299 if (old_score->exp >= new_score.exp)
302 new_draw_info(NDI_UNIQUE, 0,op,"You didn't beat your last score:"); 300 new_draw_info (NDI_UNIQUE, 0, op, "You didn't beat your last score:");
303 else 301 else
304 new_draw_info(NDI_UNIQUE, 0,op,"You beat your last score:"); 302 new_draw_info (NDI_UNIQUE, 0, op, "You beat your last score:");
305 303
306 new_draw_info(NDI_UNIQUE, 0,op, draw_one_high_score(old_score)); 304 new_draw_info (NDI_UNIQUE, 0, op, draw_one_high_score (old_score));
307 new_draw_info(NDI_UNIQUE, 0,op, draw_one_high_score(&new_score)); 305 new_draw_info (NDI_UNIQUE, 0, op, draw_one_high_score (&new_score));
308} 306}
309
310
311 307
312/* displays the high score file. object is the calling object 308/* displays the high score file. object is the calling object
313 * (null if being called via command line.) max is the maximum 309 * (null if being called via command line.) max is the maximum
314 * number of scores to display. match, if set, is the name or class 310 * number of scores to display. match, if set, is the name or class
315 * to match to. 311 * to match to.
316 */ 312 */
317 313
314void
318void display_high_score(object *op,int max, const char *match) { 315display_high_score (object *op, int max, const char *match)
316{
319 const size_t maxchar = 80; 317 const size_t maxchar = 80;
320 FILE *fp; 318 FILE *fp;
321 char buf[MAX_BUF],*scorebuf, *bp, *cp; 319 char buf[MAX_BUF], *scorebuf, *bp, *cp;
322 int i=0,j=0,comp; 320 int i = 0, j = 0, comp;
323 score *sc; 321 score *sc;
324 322
325 sprintf(buf,"%s/%s",settings.localdir,HIGHSCORE); 323 sprintf (buf, "%s/%s", settings.localdir, HIGHSCORE);
326 if((fp=open_and_uncompress(buf,0,&comp))==NULL) { 324 if ((fp = open_and_uncompress (buf, 0, &comp)) == NULL)
325 {
327 LOG(llevError, "Cannot open highscore file %s: %s\n", buf, strerror(errno)); 326 LOG (llevError, "Cannot open highscore file %s: %s\n", buf, strerror (errno));
328 if(op!=NULL) 327 if (op != NULL)
329 new_draw_info(NDI_UNIQUE, 0,op,"There is no highscore file."); 328 new_draw_info (NDI_UNIQUE, 0, op, "There is no highscore file.");
330 return; 329 return;
331 } 330 }
332 if(op != NULL) 331 if (op != NULL)
333 clear_win_info(op); 332 clear_win_info (op);
334 new_draw_info(NDI_UNIQUE, 0,op,"Nr Score Who [max hp][max sp][max grace]"); 333 new_draw_info (NDI_UNIQUE, 0, op, "Nr Score Who [max hp][max sp][max grace]");
335 334
336 while(fgets(buf,MAX_BUF,fp)!=NULL) { 335 while (fgets (buf, MAX_BUF, fp) != NULL)
336 {
337 if(j>=HIGHSCORE_LENGTH||i>=(max-1)) 337 if (j >= HIGHSCORE_LENGTH || i >= (max - 1))
338 break; 338 break;
339 if((sc=get_score(buf))==NULL) 339 if ((sc = get_score (buf)) == NULL)
340 break; 340 break;
341 sc->position=++j; 341 sc->position = ++j;
342 if (match==NULL) { 342 if (match == NULL)
343 {
343 scorebuf=draw_one_high_score(sc); 344 scorebuf = draw_one_high_score (sc);
344 i++; 345 i++;
346 }
345 } else { 347 else
348 {
346 if (!strcasecmp(sc->name, match) || !strcasecmp(sc->title, match)) { 349 if (!strcasecmp (sc->name, match) || !strcasecmp (sc->title, match))
350 {
347 scorebuf=draw_one_high_score(sc); 351 scorebuf = draw_one_high_score (sc);
348 i++; 352 i++;
349 } 353 }
354 else
350 else continue; 355 continue;
351 } 356 }
352 /* Replaced what seemed to an overly complicated word wrap method 357 /* Replaced what seemed to an overly complicated word wrap method
353 * still word wraps, but assumes at most 2 lines of data. 358 * still word wraps, but assumes at most 2 lines of data.
354 * mw - 2-12-97 359 * mw - 2-12-97
355 */ 360 */
356 strncpy(buf,scorebuf,MAX_BUF); 361 assign (buf, scorebuf);
357 buf[MAX_BUF-1] = '\0'; 362
358 cp=buf; 363 cp = buf;
359 while (strlen(cp)> maxchar) { 364 while (strlen (cp) > maxchar)
365 {
360 bp = cp+maxchar-1; 366 bp = cp + maxchar - 1;
361 while (*bp != ' ' && bp>cp) bp--; 367 while (*bp != ' ' && bp > cp)
368 bp--;
362 *bp='\0'; 369 *bp = '\0';
370
363 if (op == NULL) { 371 if (op == NULL)
364 LOG(llevDebug, "%s\n", cp); 372 LOG (llevDebug, "%s\n", cp);
365 }
366 else { 373 else
367 new_draw_info(NDI_UNIQUE, 0,op,cp); 374 new_draw_info (NDI_UNIQUE, 0, op, cp);
368 } 375
369 sprintf(buf, " %s", bp+1); 376 sprintf (buf, " %s", bp + 1);
370 cp = buf; 377 cp = buf;
371 i++; 378 i++;
372 } 379 }
380
373 if(op == NULL) 381 if (op == NULL)
374 LOG(llevDebug, "%s\n", buf); 382 LOG (llevDebug, "%s\n", buf);
375 else 383 else
376 new_draw_info(NDI_UNIQUE, 0,op,buf); 384 new_draw_info (NDI_UNIQUE, 0, op, buf);
377 } 385 }
386
378 close_and_delete(fp, comp); 387 close_and_delete (fp, comp);
379} 388}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines