2 * File for the fun ends
5 * @(#)rip.c 3.13 (Berkeley) 6/16/81
7 * Rogue: Exploring the Dungeons of Doom
8 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
11 * See the file LICENSE.TXT for full copyright and licensing information.
18 #include <sys/types.h>
24 static char *rip
[] = {
37 " ________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______",
45 * Do something really fun when he dies
51 register char **dp
= rip
, *killer
;
52 register struct tm
*lt
;
57 lt
= localtime(&date
);
61 printw("%s\n", *dp
++);
62 mvaddstr(14, 28-(((int)strlen(whoami
)+1)/2), whoami
);
64 sprintf(buf
, "%d Au", purse
);
65 mvaddstr(15, 28-(((int)strlen(buf
)+1)/2), buf
);
66 killer
= killname(monst
);
67 mvaddstr(17, 28-(((int)strlen(killer
)+1)/2), killer
);
68 mvaddstr(16, 33, vowelstr(killer
));
69 sprintf(prbuf
, "%4d", 1900+lt
->tm_year
);
70 mvaddstr(18, 26, prbuf
);
73 score(purse
, 0, monst
);
80 * score -- figure score and post it.
84 score(amount
, flags
, monst
)
87 static struct sc_ent
{
95 register struct sc_ent
*scp
;
97 register struct sc_ent
*sc2
;
99 register char *killer
;
100 register int prflags
= 0;
102 static char *reason
[] = {
108 char score_file
[PATH_MAX
];
109 int rogue_ver
= 0, scorefile_ver
= 0;
112 * Open file and read list
115 /* Get default score file */
116 strcpy(score_file
, md_getroguedir());
119 strcat(score_file
,"\\");
121 strcat(score_file
, "rogue36.scr");
123 if ((fd
= open(score_file
, O_RDWR
| O_CREAT
, 0666 )) < 0)
126 outf
= (FILE *) fdopen(fd
, "w");
128 for (scp
= top_ten
; scp
<= &top_ten
[9]; scp
++)
131 for (i
= 0; i
< 80; i
++)
132 scp
->sc_name
[i
] = rnd(255);
135 scp
->sc_monster
= RN
;
136 scp
->sc_login
[0] = '\0';
139 signal(SIGINT
, SIG_DFL
);
140 if ((flags
!= -1) && (flags
!= 1))
142 mvaddstr(LINES
-1, 0, "[Press return to continue]");
145 get_str(prbuf
, stdscr
);
149 if (strcmp(prbuf
, "names") == 0)
151 else if (strcmp(prbuf
, "edit") == 0)
154 encread((char *) scoreline
, 100, fd
);
155 sscanf(scoreline
, "R%d %d\n", &rogue_ver
, &scorefile_ver
);
157 if ((rogue_ver
== 36) && (scorefile_ver
== 2))
158 for(i
= 0; i
< 10; i
++)
161 encread((char *) &top_ten
[i
].sc_name
, 80, fd
);
162 encread((char *) &top_ten
[i
].sc_login
, 8, fd
);
163 encread((char *) scoreline
, 100, fd
);
164 sscanf(scoreline
, " %d %d %d %d \n",
165 &top_ten
[i
].sc_score
, &top_ten
[i
].sc_flags
,
166 &top_ten
[i
].sc_level
, &monster
);
167 top_ten
[i
].sc_monster
= monster
;
171 * Insert her in list if need be
175 for (scp
= top_ten
; scp
<= &top_ten
[9]; scp
++)
176 if (amount
> scp
->sc_score
)
178 if (scp
<= &top_ten
[9])
180 for (sc2
= &top_ten
[9]; sc2
> scp
; sc2
--)
182 scp
->sc_score
= amount
;
183 strcpy(scp
->sc_name
, whoami
);
184 scp
->sc_flags
= flags
;
186 scp
->sc_level
= max_level
;
188 scp
->sc_level
= level
;
189 scp
->sc_monster
= monst
;
190 strncpy(scp
->sc_login
, md_getusername(), 8);
198 printf("Top Ten Adventurers:\nRank\tScore\tName\n");
199 for (scp
= top_ten
; scp
<= &top_ten
[9]; scp
++) {
201 printf("%ld\t%d\t%s: %s on level %d", scp
- top_ten
+ 1,
202 scp
->sc_score
, scp
->sc_name
, reason
[scp
->sc_flags
],
204 if (scp
->sc_flags
== 0) {
206 killer
= killname(scp
->sc_monster
);
207 if (*killer
== 'a' || *killer
== 'e' || *killer
== 'i' ||
208 *killer
== 'o' || *killer
== 'u')
210 printf(" %s", killer
);
214 printf(" (%s)", scp
->sc_login
);
217 else if (prflags
== 2)
220 fgets(prbuf
,80,stdin
);
223 for (sc2
= scp
; sc2
< &top_ten
[9]; sc2
++)
225 top_ten
[9].sc_score
= 0;
226 for (i
= 0; i
< 80; i
++)
227 top_ten
[9].sc_name
[i
] = rnd(255);
228 top_ten
[9].sc_flags
= RN
;
229 top_ten
[9].sc_level
= RN
;
230 top_ten
[9].sc_monster
= RN
;
240 * Update the list file
242 strcpy(scoreline
, "R36 2\n");
243 encwrite(scoreline
, 100, outf
);
244 for(i
= 0; i
< 10; i
++)
246 encwrite((char *) &top_ten
[i
].sc_name
, 80, outf
);
247 encwrite((char *) &top_ten
[i
].sc_login
, 8, outf
);
248 sprintf(scoreline
, " %d %d %d %d \n",
249 top_ten
[i
].sc_score
, top_ten
[i
].sc_flags
,
250 top_ten
[i
].sc_level
, top_ten
[i
].sc_monster
);
251 encwrite((char *) scoreline
, 100, outf
);
258 register struct linked_list
*item
;
259 register struct object
*obj
;
262 register int oldpurse
;
267 addstr(" @ @ @ @ @ @@@ @ @ \n");
268 addstr(" @ @ @@ @@ @ @ @ @ \n");
269 addstr(" @ @ @@@ @ @ @ @ @ @@@ @@@@ @@@ @ @@@ @ \n");
270 addstr(" @@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ \n");
271 addstr(" @ @ @ @ @ @ @ @@@@ @ @ @@@@@ @ @ @ \n");
272 addstr(" @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ \n");
273 addstr(" @@@ @@@ @@ @ @ @ @@@@ @@@@ @@@ @@@ @@ @ \n");
275 addstr(" Congratulations, you have made it to the light of day! \n");
277 addstr("\nYou have joined the elite ranks of those who have escaped the\n");
278 addstr("Dungeons of Doom alive. You journey home and sell all your loot at\n");
279 addstr("a great profit and are admitted to the fighters guild.\n");
280 mvaddstr(LINES
- 1, 0, "--Press space to continue--");
284 mvaddstr(0, 0, " Worth Item");
286 for (c
= 'a', item
= pack
; item
!= NULL
; c
++, item
= next(item
))
288 obj
= (struct object
*) ldata(item
);
292 worth
= 2 * obj
->o_count
;
294 switch (obj
->o_which
)
296 case MACE
: worth
= 8;
297 when SWORD
: worth
= 15;
298 when BOW
: worth
= 75;
299 when ARROW
: worth
= 1;
300 when DAGGER
: worth
= 2;
301 when ROCK
: worth
= 1;
302 when TWOSWORD
: worth
= 30;
303 when SLING
: worth
= 1;
304 when DART
: worth
= 1;
305 when CROSSBOW
: worth
= 15;
306 when BOLT
: worth
= 1;
307 when SPEAR
: worth
= 2;
308 otherwise
: worth
= 0;
310 worth
*= (1 + (10 * obj
->o_hplus
+ 10 * obj
->o_dplus
));
311 worth
*= obj
->o_count
;
312 obj
->o_flags
|= ISKNOW
;
314 switch (obj
->o_which
)
316 case LEATHER
: worth
= 5;
317 when RING_MAIL
: worth
= 30;
318 when STUDDED_LEATHER
: worth
= 15;
319 when SCALE_MAIL
: worth
= 3;
320 when CHAIN_MAIL
: worth
= 75;
321 when SPLINT_MAIL
: worth
= 80;
322 when BANDED_MAIL
: worth
= 90;
323 when PLATE_MAIL
: worth
= 400;
324 otherwise
: worth
= 0;
326 worth
*= (1 + (10 * (a_class
[obj
->o_which
] - obj
->o_ac
)));
327 obj
->o_flags
|= ISKNOW
;
329 s_know
[obj
->o_which
] = TRUE
;
330 worth
= s_magic
[obj
->o_which
].mi_worth
;
331 worth
*= obj
->o_count
;
333 p_know
[obj
->o_which
] = TRUE
;
334 worth
= p_magic
[obj
->o_which
].mi_worth
;
335 worth
*= obj
->o_count
;
337 obj
->o_flags
|= ISKNOW
;
338 r_know
[obj
->o_which
] = TRUE
;
339 worth
= r_magic
[obj
->o_which
].mi_worth
;
340 if (obj
->o_which
== R_ADDSTR
|| obj
->o_which
== R_ADDDAM
||
341 obj
->o_which
== R_PROTECT
|| obj
->o_which
== R_ADDHIT
)
343 worth
+= obj
->o_ac
* 20;
347 obj
->o_flags
|= ISKNOW
;
348 ws_know
[obj
->o_which
] = TRUE
;
349 worth
= ws_magic
[obj
->o_which
].mi_worth
;
350 worth
+= 20 * obj
->o_charges
;
354 mvprintw(c
- 'a' + 1, 0, "%c) %5d %s", c
, worth
, inv_name(obj
, FALSE
));
357 mvprintw(c
- 'a' + 1, 0," %5d Gold Peices ", oldpurse
);
370 return monsters
[monst
-'A'].m_name
;