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.9 by root, Fri Sep 29 11:53:09 2006 UTC vs.
Revision 1.24 by root, Wed Apr 30 06:40:28 2008 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * Deliantra is free software: you can redistribute it and/or modify
8 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
9 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version. 11 * (at your option) any later version.
11 12 *
12 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,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 16 * GNU General Public License for more details.
16 17 *
17 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
18 along with this program; if not, write to the Free Software 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 *
20 21 * The authors can be reached via e-mail to <support@deliantra.net>
21 The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 22 */
23 23
24#include <global.h> 24#include <global.h>
25#ifndef __CEXTRACT__
26# include <sproto.h> 25#include <sproto.h>
27#endif
28 26
29/* 27/*
30 * The score structure is used when treating new high-scores 28 * The score structure is used when treating new high-scores
31 */ 29 */
32
33typedef struct scr 30typedef struct scr
34{ 31{
35 char name[64]; // name */ 32 char name[64]; // name */
36 char title[64]; // Title */ 33 char title[64]; // Title */
37 char killer[64]; // name (+ title) or "quit" */ 34 char killer[64]; // name (+ title) or "quit" */
43 40
44/* 41/*
45 * spool works mostly like strtok(char *, ":"), but it can also 42 * spool works mostly like strtok(char *, ":"), but it can also
46 * log a specified error message if something goes wrong. 43 * log a specified error message if something goes wrong.
47 */ 44 */
48
49char * 45char *
50spool (char *bp, char *error) 46spool (char *bp, const char *error)
51{ 47{
52 static char *prev_pos = NULL; 48 static char *prev_pos = NULL;
53 char *next_pos; 49 char *next_pos;
54 50
55 if (bp == NULL) 51 if (bp == NULL)
78 74
79/* 75/*
80 * Does what it says, copies the contents of the first score structure 76 * Does what it says, copies the contents of the first score structure
81 * to the second one. 77 * to the second one.
82 */ 78 */
83
84static void 79static void
85copy_score (score *sc1, score *sc2) 80copy_score (score *sc1, score *sc2)
86{ 81{
87 assign (sc2->name , sc1->name); 82 assign (sc2->name , sc1->name);
88 assign (sc2->title , sc1->title); 83 assign (sc2->title , sc1->title);
96 91
97/* 92/*
98 * Writes the given score structure to a static buffer, and returns 93 * Writes the given score structure to a static buffer, and returns
99 * a pointer to it. 94 * a pointer to it.
100 */ 95 */
101
102static char * 96static char *
103put_score (score *sc) 97put_score (score *sc)
104{ 98{
105 static char buf[MAX_BUF]; 99 static char buf[MAX_BUF];
106 100
107 sprintf (buf, "%s:%s:%lld:%s:%s:%d:%d:%d", sc->name, sc->title, (long long) sc->exp, sc->killer, sc->maplevel, 101 sprintf (buf, "%s:%s:%" PRId64 ":%s:%s:%d:%d:%d",
102 sc->name, sc->title, (sint64)sc->exp, sc->killer,
108 sc->maxhp, sc->maxsp, sc->maxgrace); 103 sc->maplevel, sc->maxhp, sc->maxsp, sc->maxgrace);
109 return buf; 104 return buf;
110} 105}
111 106
112/* 107/*
113 * The oposite of put_score, get_score reads from the given buffer into 108 * The oposite of put_score, get_score reads from the given buffer into
134 assign (sc.title, cp); 129 assign (sc.title, cp);
135 130
136 if ((cp = spool (0, "score")) == NULL) 131 if ((cp = spool (0, "score")) == NULL)
137 return 0; 132 return 0;
138 133
139 long long exp;
140 sscanf (cp, "%lld", &exp); 134 sscanf (cp, "%" SCNd64, &sc.exp);
141 sc.exp = exp;
142 135
143 if ((cp = spool (0, "killer")) == NULL) 136 if ((cp = spool (0, "killer")) == NULL)
144 return 0; 137 return 0;
145 138
146 assign (sc.killer, cp); 139 assign (sc.killer, cp);
269 score *old_score; 262 score *old_score;
270 263
271 if (op->stats.exp == 0) 264 if (op->stats.exp == 0)
272 return; 265 return;
273 266
274 if (!op->contr->name_changed)
275 {
276 if (op->stats.exp > 0)
277 {
278 new_draw_info (NDI_UNIQUE, 0, op, "As you haven't changed your name, you won't");
279 new_draw_info (NDI_UNIQUE, 0, op, "get into the high-score list.");
280 }
281 return;
282 }
283 if (QUERY_FLAG (op, FLAG_WAS_WIZ))
284 {
285 new_draw_info (NDI_UNIQUE, 0, op, "Since you have been in wizard mode,");
286 new_draw_info (NDI_UNIQUE, 0, op, "you can't enter the high-score list.");
287 return;
288 }
289 if (op->contr->explore)
290 {
291 new_draw_info (NDI_UNIQUE, 0, op, "Since you were in explore mode,");
292 new_draw_info (NDI_UNIQUE, 0, op, "you can't enter the high-score list.");
293 return;
294 }
295
296 assign (new_score.name, op->name); 267 assign (new_score.name, op->name);
297 assign (new_score.title, op->title.length () ? &op->title : op->contr->title); 268 assign (new_score.title, op->title.length () ? &op->title : op->contr->title);
298 assign (new_score.killer, op->contr->killer[0] ? op->contr->killer : "a dungeon collapse"); 269 assign (new_score.killer, op->contr->killer_name ());
299 assign (new_score.maplevel, op->map ? op->map->name ? op->map->name : op->map->path : ""); 270 assign (new_score.maplevel, op->map ? op->map->name ? &op->map->name : &op->map->path : "");
300 271
301 new_score.exp = op->stats.exp; 272 new_score.exp = op->stats.exp;
302 new_score.maxhp = op->stats.maxhp; 273 new_score.maxhp = op->stats.maxhp;
303 new_score.maxsp = op->stats.maxsp; 274 new_score.maxsp = op->stats.maxsp;
304 new_score.maxgrace = op->stats.maxgrace; 275 new_score.maxgrace = op->stats.maxgrace;
351 LOG (llevError, "Cannot open highscore file %s: %s\n", buf, strerror (errno)); 322 LOG (llevError, "Cannot open highscore file %s: %s\n", buf, strerror (errno));
352 if (op != NULL) 323 if (op != NULL)
353 new_draw_info (NDI_UNIQUE, 0, op, "There is no highscore file."); 324 new_draw_info (NDI_UNIQUE, 0, op, "There is no highscore file.");
354 return; 325 return;
355 } 326 }
356 if (op != NULL) 327
357 clear_win_info (op);
358 new_draw_info (NDI_UNIQUE, 0, op, "Nr Score Who [max hp][max sp][max grace]"); 328 new_draw_info (NDI_UNIQUE, 0, op, "Nr Score Who [max hp][max sp][max grace]");
359 329
360 while (fgets (buf, MAX_BUF, fp) != NULL) 330 while (fgets (buf, MAX_BUF, fp) != NULL)
361 { 331 {
362 if (j >= HIGHSCORE_LENGTH || i >= (max - 1)) 332 if (j >= HIGHSCORE_LENGTH || i >= (max - 1))
363 break; 333 break;
334
364 if ((sc = get_score (buf)) == NULL) 335 if ((sc = get_score (buf)) == NULL)
365 break; 336 break;
337
366 sc->position = ++j; 338 sc->position = ++j;
367 if (match == NULL) 339 if (match == NULL)
368 { 340 {
369 scorebuf = draw_one_high_score (sc); 341 scorebuf = draw_one_high_score (sc);
370 i++; 342 i++;
377 i++; 349 i++;
378 } 350 }
379 else 351 else
380 continue; 352 continue;
381 } 353 }
354
382 /* Replaced what seemed to an overly complicated word wrap method 355 /* Replaced what seemed to an overly complicated word wrap method
383 * still word wraps, but assumes at most 2 lines of data. 356 * still word wraps, but assumes at most 2 lines of data.
384 * mw - 2-12-97 357 * mw - 2-12-97
385 */ 358 */
386 assign (buf, scorebuf); 359 assign (buf, scorebuf);
409 new_draw_info (NDI_UNIQUE, 0, op, buf); 382 new_draw_info (NDI_UNIQUE, 0, op, buf);
410 } 383 }
411 384
412 close_and_delete (fp, comp); 385 close_and_delete (fp, comp);
413} 386}
387

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines