2 * Copyright (c) 1988, 1993
3 * The Regents of the University of California. All rights reserved.
5 * This code is derived from software contributed to Berkeley by
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * @(#)score.c 8.1 (Berkeley) 5/31/93
37 * $FreeBSD: src/games/rogue/score.c,v 1.4 1999/11/30 03:49:27 billf Exp $
38 * $DragonFly: src/games/rogue/score.c,v 1.4 2006/09/02 19:31:07 pavalos Exp $
44 * This source herein may be modified and/or distributed by anybody who
45 * so desires, with the following restrictions:
46 * 1.) No portion of this notice shall be removed.
47 * 2.) Credit shall not be taken for the creation of this source.
48 * 3.) This code is not to be traded, sold, or used for personal
55 #include "pathnames.h"
57 extern char *m_names
[];
58 extern short max_level
;
59 extern boolean score_only
, no_skull
, msg_cleared
;
60 extern char *byebye_string
, *nick_name
;
62 static void insert_score(char [][82], char [][30], const char *, short, short,
63 const object
*, short);
64 static void sell_pack(void);
65 static int get_value(const object
*);
66 static void id_all(void);
67 static int name_cmp(char *, const char *);
68 static void nickize(char *, const char *, const char *);
69 static void center(short, const char *);
70 static void sf_error(void);
73 killed_by(const object
*monster
, short other
)
80 rogue
.gold
= ((rogue
.gold
* 9) / 10);
86 strcpy(buf
, "died of hypothermia");
89 strcpy(buf
, "died of starvation");
92 strcpy(buf
, "killed by a dart");
98 strcpy(buf
, "killed by fire");
102 strcpy(buf
, "Killed by ");
103 if (is_vowel(m_names
[monster
->m_char
- 'A'][0])) {
108 strcat(buf
, m_names
[monster
->m_char
- 'A']);
110 strcat(buf
, " with ");
111 sprintf(buf
+strlen(buf
), "%ld gold", rogue
.gold
);
112 if ((!other
) && (!no_skull
)) {
114 mvaddstr(4, 32, "__---------__");
115 mvaddstr(5, 30, "_~ ~_");
116 mvaddstr(6, 29, "/ \\");
117 mvaddstr(7, 28, "~ ~");
118 mvaddstr(8, 27, "/ \\");
119 mvaddstr(9, 27, "| XXXX XXXX |");
120 mvaddstr(10, 27, "| XXXX XXXX |");
121 mvaddstr(11, 27, "| XXX XXX |");
122 mvaddstr(12, 28, "\\ @ /");
123 mvaddstr(13, 29, "--\\ @@@ /--");
124 mvaddstr(14, 30, "| | @@@ | |");
125 mvaddstr(15, 30, "| | | |");
126 mvaddstr(16, 30, "| vvVvvvvvvvVvv |");
127 mvaddstr(17, 30, "| ^^^^^^^^^^^ |");
128 mvaddstr(18, 31, "\\_ _/");
129 mvaddstr(19, 33, "~---------~");
130 center(21, nick_name
);
136 put_scores(monster
, other
);
142 unwield(rogue
.weapon
); /* disarm and relax */
144 un_put_on(rogue
.left_ring
);
145 un_put_on(rogue
.right_ring
);
148 mvaddstr(10, 11, "@ @ @@@ @ @ @ @ @ @@@ @ @ @");
149 mvaddstr(11, 11, " @ @ @ @ @ @ @ @ @ @ @ @@ @ @");
150 mvaddstr(12, 11, " @ @ @ @ @ @ @ @ @ @ @ @ @ @");
151 mvaddstr(13, 11, " @ @ @ @ @ @ @ @ @ @ @ @@");
152 mvaddstr(14, 11, " @ @@@ @@@ @@ @@ @@@ @ @ @");
153 mvaddstr(17, 11, "Congratulations, you have been admitted to the");
154 mvaddstr(18, 11, "Fighters' Guild. You return home, sell all your");
155 mvaddstr(19, 11, "treasures at great profit and retire into comfort.");
160 put_scores((object
*) 0, WIN
);
164 quit(boolean from_intrpt
)
170 orow
= ocol
= mc
= 0;
180 for (i
= 0; i
< DCOLS
; i
++) {
181 buf
[i
] = mvinch(0, i
);
185 message("really quit?", 1);
186 if (rgetchar() != 'y') {
190 for (i
= 0; i
< DCOLS
; i
++) {
191 mvaddch(0, i
, buf
[i
]);
200 clean_up(byebye_string
);
203 killed_by((object
*) 0, QUIT
);
207 put_scores(const object
*monster
, short other
)
209 short i
, n
, rank
= 10, x
, ne
= 0, found_player
= -1;
211 char n_names
[10][30];
215 boolean pause
= score_only
;
219 if ((fp
= fopen(_PATH_SCOREFILE
, "r+")) == NULL
&&
220 (fp
= fopen(_PATH_SCOREFILE
, "w+")) == NULL
) {
221 message("cannot read/write/create score file", 0);
227 for (i
= 0; i
< 10; i
++) {
228 if (((n
= fread(scores
[i
], sizeof(char), 80, fp
)) < 80) && (n
!= 0)) {
232 if ((n
= fread(n_names
[i
], sizeof(char), 30, fp
)) < 30) {
235 xxxx(n_names
[i
], 30);
240 if ((!score_only
) && (found_player
== -1)) {
241 if (!name_cmp(scores
[i
]+15, login_name
)) {
243 while (scores
[i
][x
] == ' ') {
246 s
= lget_number(scores
[i
] + x
);
247 if (rogue
.gold
< s
) {
255 if (found_player
!= -1) {
257 for (i
= found_player
; i
< ne
; i
++) {
258 strcpy(scores
[i
], scores
[i
+1]);
259 strcpy(n_names
[i
], n_names
[i
+1]);
263 for (i
= 0; i
< ne
; i
++) {
265 while (scores
[i
][x
] == ' ') {
268 s
= lget_number(scores
[i
] + x
);
270 if (rogue
.gold
>= s
) {
277 } else if ((ne
< 10) && (rank
== 10)) {
281 insert_score(scores
, n_names
, nick_name
, rank
, ne
, monster
,
291 mvaddstr(3, 30, "Top Ten Rogueists");
292 mvaddstr(8, 0, "Rank Score Name");
298 for (i
= 0; i
< ne
; i
++) {
307 scores
[i
][1] = i
+ '1';
309 nickize(buf
, scores
[i
], n_names
[i
]);
310 mvaddstr(i
+10, 0, buf
);
313 fwrite(scores
[i
], sizeof(char), 80, fp
);
314 xxxx(n_names
[i
], 30);
315 fwrite(n_names
[i
], sizeof(char), 30, fp
);
332 insert_score(char scores
[][82], char n_names
[][30], const char *n_name
,
333 short rank
, short n
, const object
*monster
, short other
)
339 for (i
= n
; i
> rank
; i
--) {
340 if ((i
< 10) && (i
> 0)) {
341 strcpy(scores
[i
], scores
[i
-1]);
342 strcpy(n_names
[i
], n_names
[i
-1]);
346 sprintf(buf
, "%2d %6ld %s: ", rank
+1, rogue
.gold
, login_name
);
351 strcat(buf
, "died of hypothermia");
354 strcat(buf
, "died of starvation");
357 strcat(buf
, "killed by a dart");
363 strcat(buf
, "a total winner");
366 strcpy(buf
, "killed by fire");
370 strcat(buf
, "killed by ");
371 if (is_vowel(m_names
[monster
->m_char
- 'A'][0])) {
376 strcat(buf
, m_names
[monster
->m_char
- 'A']);
378 sprintf(buf
+strlen(buf
), " on level %d ", max_level
);
379 if ((other
!= WIN
) && has_amulet()) {
380 strcat(buf
, "with amulet");
382 for (i
= strlen(buf
); i
< 79; i
++) {
386 strcpy(scores
[rank
], buf
);
387 strcpy(n_names
[rank
], n_name
);
393 return( (ch
== 'a') ||
407 obj
= rogue
.pack
.next_object
;
410 mvaddstr(1, 0, "Value Item");
413 if (obj
->what_is
!= FOOD
) {
415 val
= get_value(obj
);
419 sprintf(buf
, "%5d ", val
);
420 get_desc(obj
, buf
+11);
421 mvaddstr(row
++, 0, buf
);
424 obj
= obj
->next_object
;
427 if (rogue
.gold
> MAX_GOLD
) {
428 rogue
.gold
= MAX_GOLD
;
434 get_value(const object
*obj
)
439 wc
= obj
->which_kind
;
441 switch(obj
->what_is
) {
443 val
= id_weapons
[wc
].value
;
444 if ((wc
== ARROW
) || (wc
== DAGGER
) || (wc
== SHURIKEN
) ||
446 val
*= obj
->quantity
;
448 val
+= (obj
->d_enchant
* 85);
449 val
+= (obj
->hit_enchant
* 85);
452 val
= id_armors
[wc
].value
;
453 val
+= (obj
->d_enchant
* 75);
454 if (obj
->is_protected
) {
459 val
= id_wands
[wc
].value
* (obj
->class + 1);
462 val
= id_scrolls
[wc
].value
* obj
->quantity
;
465 val
= id_potions
[wc
].value
* obj
->quantity
;
471 val
= id_rings
[wc
].value
* (obj
->class + 1);
485 for (i
= 0; i
< SCROLS
; i
++) {
486 id_scrolls
[i
].id_status
= IDENTIFIED
;
488 for (i
= 0; i
< WEAPONS
; i
++) {
489 id_weapons
[i
].id_status
= IDENTIFIED
;
491 for (i
= 0; i
< ARMORS
; i
++) {
492 id_armors
[i
].id_status
= IDENTIFIED
;
494 for (i
= 0; i
< WANDS
; i
++) {
495 id_wands
[i
].id_status
= IDENTIFIED
;
497 for (i
= 0; i
< POTIONS
; i
++) {
498 id_potions
[i
].id_status
= IDENTIFIED
;
503 name_cmp(char *s1
, const char *s2
)
508 while(s1
[i
] != ':') {
518 xxxx(char *buf
, short n
)
523 for (i
= 0; i
< n
; i
++) {
525 /* It does not matter if accuracy is lost during this assignment */
526 c
= (unsigned char) xxx(0);
543 r
= ((f
* s
) + 9337) % 8887;
550 nickize(char *buf
, const char *score
, const char *n_name
)
557 strncpy(buf
, score
, 16);
559 while (score
[i
] != ':') {
563 strcpy(buf
+15, n_name
);
567 buf
[j
++] = score
[i
++];
575 center(short row
, const char *buf
)
579 margin
= ((DCOLS
- strlen(buf
)) / 2);
580 mvaddstr(row
, margin
, buf
);
588 clean_up("sorry, score file is out of order");