2 * File for the fun ends
5 * @(#)rip.c 3.13 (Berkeley) 6/16/81
7 * Rogue: Exploring the Cavern of Cuties
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 " ________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______",
43 * Do something really fun when he dies
49 register char **dp
= rip
, *killer
;
50 register struct tm
*lt
;
55 lt
= localtime(&date
);
59 printw("%s\n", *dp
++);
60 mvaddstr(14, 28-(((int)strlen(whoami
)+1)/2), whoami
);
62 sprintf(buf
, "%d Au", purse
);
63 mvaddstr(15, 28-(((int)strlen(buf
)+1)/2), buf
);
64 killer
= killname(monst
);
65 mvaddstr(17, 28-(((int)strlen(killer
)+1)/2), killer
);
66 mvaddstr(16, 33, vowelstr(killer
));
67 sprintf(prbuf
, "%4d", 1900+lt
->tm_year
);
68 mvaddstr(18, 26, prbuf
);
71 score(purse
, 0, monst
);
78 * score -- figure score and post it.
82 score(amount
, flags
, monst
)
85 static struct sc_ent
{
93 register struct sc_ent
*scp
;
95 register struct sc_ent
*sc2
;
97 register char *killer
;
98 register int prflags
= 0;
100 static char *reason
[] = {
105 "got the amulet and left"
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("%d\t%d\t%s: %s on level %d", (int)(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
);
212 else if (scp
->sc_flags
>= 3)
215 killer
= killname(scp
->sc_monster
);
216 if (*killer
== 'a' || *killer
== 'e' || *killer
== 'i' ||
217 *killer
== 'o' || *killer
== 'u')
219 printf(" %s", killer
);
223 printf(" (%s)", scp
->sc_login
);
226 else if (prflags
== 2)
229 fgets(prbuf
,80,stdin
);
232 for (sc2
= scp
; sc2
< &top_ten
[9]; sc2
++)
234 top_ten
[9].sc_score
= 0;
235 for (i
= 0; i
< 80; i
++)
236 top_ten
[9].sc_name
[i
] = rnd(255);
237 top_ten
[9].sc_flags
= RN
;
238 top_ten
[9].sc_level
= RN
;
239 top_ten
[9].sc_monster
= RN
;
249 * Update the list file
251 strcpy(scoreline
, "R36 2\n");
252 encwrite(scoreline
, 100, outf
);
253 for(i
= 0; i
< 10; i
++)
255 encwrite((char *) &top_ten
[i
].sc_name
, 80, outf
);
256 encwrite((char *) &top_ten
[i
].sc_login
, 8, outf
);
257 sprintf(scoreline
, " %d %d %d %d \n",
258 top_ten
[i
].sc_score
, top_ten
[i
].sc_flags
,
259 top_ten
[i
].sc_level
, top_ten
[i
].sc_monster
);
260 encwrite((char *) scoreline
, 100, outf
);
270 addstr(" You escaped from the caverns, but alone. \n");
272 addstr("\nYou have joined the elite ranks of those who have escaped the\n");
273 addstr("Cavern of Cuties alive, but failed to meet anyone while there.\n");
274 addstr("You journey home and sell all your loot at a great profit and\n");
275 addstr("continue your life alone.\n");
276 total_something(2, 0);
279 total_winner(monster
)
284 addstr(" You got the amulet and a hot date. \n");
288 total_something(4, monster
);
291 mostly_winner(monster
)
296 addstr(" You got a hot date. \n");
300 total_something(3, monster
);
303 total_something(flags
, monster
)
307 register struct linked_list
*item
;
308 register struct object
*obj
;
311 register int oldpurse
;
313 mvaddstr(LINES
- 1, 0, "--Press space to continue--");
317 mvaddstr(0, 0, " Worth Item");
319 for (c
= 'a', item
= pack
; item
!= NULL
; c
++, item
= next(item
))
321 obj
= (struct object
*) ldata(item
);
325 worth
= 2 * obj
->o_count
;
327 switch (obj
->o_which
)
329 case MACE
: worth
= 8;
330 when SWORD
: worth
= 15;
331 when BOW
: worth
= 75;
332 when ARROW
: worth
= 1;
333 when DAGGER
: worth
= 2;
334 when ROCK
: worth
= 1;
335 when TWOSWORD
: worth
= 30;
336 when SLING
: worth
= 1;
337 when DART
: worth
= 1;
338 when CROSSBOW
: worth
= 15;
339 when BOLT
: worth
= 1;
340 when SPEAR
: worth
= 2;
341 otherwise
: worth
= 0;
343 worth
*= (1 + (10 * obj
->o_hplus
+ 10 * obj
->o_dplus
));
344 worth
*= obj
->o_count
;
345 obj
->o_flags
|= ISKNOW
;
347 switch (obj
->o_which
)
349 case LEATHER
: worth
= 5;
350 when RING_MAIL
: worth
= 30;
351 when STUDDED_LEATHER
: worth
= 15;
352 when SCALE_MAIL
: worth
= 3;
353 when CHAIN_MAIL
: worth
= 75;
354 when SPLINT_MAIL
: worth
= 80;
355 when BANDED_MAIL
: worth
= 90;
356 when PLATE_MAIL
: worth
= 400;
357 otherwise
: worth
= 0;
359 worth
*= (1 + (10 * (a_class
[obj
->o_which
] - obj
->o_ac
)));
360 obj
->o_flags
|= ISKNOW
;
362 s_know
[obj
->o_which
] = TRUE
;
363 worth
= s_magic
[obj
->o_which
].mi_worth
;
364 worth
*= obj
->o_count
;
366 p_know
[obj
->o_which
] = TRUE
;
367 worth
= p_magic
[obj
->o_which
].mi_worth
;
368 worth
*= obj
->o_count
;
370 obj
->o_flags
|= ISKNOW
;
371 r_know
[obj
->o_which
] = TRUE
;
372 worth
= r_magic
[obj
->o_which
].mi_worth
;
373 if (obj
->o_which
== R_ADDSTR
|| obj
->o_which
== R_ADDDAM
||
374 obj
->o_which
== R_PROTECT
|| obj
->o_which
== R_ADDHIT
)
376 worth
+= obj
->o_ac
* 20;
380 obj
->o_flags
|= ISKNOW
;
381 ws_know
[obj
->o_which
] = TRUE
;
382 worth
= ws_magic
[obj
->o_which
].mi_worth
;
383 worth
+= 20 * obj
->o_charges
;
387 mvprintw(c
- 'a' + 1, 0, "%c) %5d %s", c
, worth
, inv_name(obj
, FALSE
));
390 mvprintw(c
- 'a' + 1, 0," %5d Gold Peices ", oldpurse
);
394 purse
+= 10 * monsters
[monster
- 'A'].m_stats
.s_exp
;
395 mvprintw(c
- 'a' + 1, 0, "and one cute %s (priceless)",
396 monsters
[monster
- 'A'].m_name
);
398 score(purse
, flags
, monster
);
409 return monsters
[monst
-'A'].m_name
;