Mercurial > hg > early-roguelike
comparison srogue/rip.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
| author | elwin | 
|---|---|
| date | Thu, 25 Nov 2010 12:21:41 +0000 | 
| parents | |
| children | 5ea4a4d8f961 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 35:05018c63a721 | 36:2128c7dc8a40 | 
|---|---|
| 1 /* | |
| 2 * File for the fun, ends in death or a total win | |
| 3 * | |
| 4 * @(#)rip.c 9.0 (rdk) 7/17/84 | |
| 5 * | |
| 6 * Super-Rogue | |
| 7 * Copyright (C) 1984 Robert D. Kindelberger | |
| 8 * All rights reserved. | |
| 9 * | |
| 10 * Based on "Rogue: Exploring the Dungeons of Doom" | |
| 11 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
| 12 * All rights reserved. | |
| 13 * | |
| 14 * See the file LICENSE.TXT for full copyright and licensing information. | |
| 15 */ | |
| 16 | |
| 17 #include <signal.h> | |
| 18 #include <ctype.h> | |
| 19 #include <sys/types.h> | |
| 20 #include <pwd.h> | |
| 21 #include <fcntl.h> | |
| 22 #include "rogue.h" | |
| 23 #include "rogue.ext" | |
| 24 | |
| 25 static char scoreline[100]; | |
| 26 | |
| 27 static char *rip[] = { | |
| 28 " ____________________", | |
| 29 " / \\", | |
| 30 " / Bob Kindelberger's \\", | |
| 31 " / Graveyard \\", | |
| 32 " / \\", | |
| 33 " / REST IN PEACE \\", | |
| 34 " / \\", | |
| 35 " | |", | |
| 36 " | |", | |
| 37 " | Destroyed by a |", | |
| 38 " | |", | |
| 39 " | |", | |
| 40 " | |", | |
| 41 " | |", | |
| 42 " | |", | |
| 43 " | |", | |
| 44 " | |", | |
| 45 " *| * * * * |*", | |
| 46 " ________)\\\\//\\//\\)/\\//\\)/\\//\\)/\\//\\)/\\//\\//(________", | |
| 47 }; | |
| 48 | |
| 49 #define RIP_LINES (sizeof rip / (sizeof (char *))) | |
| 50 | |
| 51 char *killname(); | |
| 52 | |
| 53 /* | |
| 54 * death: | |
| 55 * Do something really fun when he dies | |
| 56 */ | |
| 57 | |
| 58 #include <time.h> | |
| 59 death(monst) | |
| 60 char monst; | |
| 61 { | |
| 62 reg char dp, *killer; | |
| 63 struct tm *lt; | |
| 64 time_t date; | |
| 65 char buf[LINLEN]; | |
| 66 struct tm *localtime(); | |
| 67 | |
| 68 time(&date); | |
| 69 lt = localtime(&date); | |
| 70 clear(); | |
| 71 move(3, 0); | |
| 72 for (dp = 0; dp < RIP_LINES; dp++) | |
| 73 printw("%s\n", rip[dp]); | |
| 74 mvaddstr(10, 36 - ((strlen(whoami) + 1) / 2), whoami); | |
| 75 killer = killname(monst); | |
| 76 mvaddstr(12, 43, vowelstr(killer)); | |
| 77 mvaddstr(14, 36 - ((strlen(killer) + 1) / 2), killer); | |
| 78 purse -= purse/10; | |
| 79 sprintf(buf, "%d Gold Pieces", purse); | |
| 80 mvaddstr(16, 36 - ((strlen(buf) + 1) / 2), buf); | |
| 81 sprintf(prbuf, "%d/%d/%d", lt->tm_mon + 1, lt->tm_mday, 1900+lt->tm_year); | |
| 82 mvaddstr(18, 32, prbuf); | |
| 83 move(LINES-1, 0); | |
| 84 refresh(); | |
| 85 score(purse, KILLED, monst); | |
| 86 byebye(0); | |
| 87 } | |
| 88 | |
| 89 /* | |
| 90 * top ten entry structure | |
| 91 */ | |
| 92 static struct sc_ent { | |
| 93 int sc_score; /* gold */ | |
| 94 char sc_name[LINLEN]; /* players name */ | |
| 95 int sc_flags; /* reason for being here */ | |
| 96 int sc_level; /* dungeon level */ | |
| 97 int sc_uid; /* user ID */ | |
| 98 unsigned char sc_monster; /* killer */ | |
| 99 int sc_explvl; /* experience level */ | |
| 100 long int sc_exppts; /* experience points */ | |
| 101 time_t sc_date; /* time this score was posted */ | |
| 102 } top_ten[10]; | |
| 103 | |
| 104 char *reason[] = { | |
| 105 "Killed", | |
| 106 "Chickened out", | |
| 107 "A Total Winner" | |
| 108 }; | |
| 109 int oldpurse; | |
| 110 | |
| 111 /* | |
| 112 * score: | |
| 113 * Figure score and post it. | |
| 114 */ | |
| 115 score(amount, aflag, monst) | |
| 116 char monst; | |
| 117 int amount, aflag; | |
| 118 { | |
| 119 reg struct sc_ent *scp, *sc2; | |
| 120 reg int i, fd, prflags = 0; | |
| 121 reg FILE *outf; | |
| 122 char *packend; | |
| 123 | |
| 124 signal(SIGINT, byebye); | |
| 125 signal(SIGQUIT, byebye); | |
| 126 if (aflag != WINNER) { | |
| 127 if (aflag == CHICKEN) | |
| 128 packend = "when you chickened out"; | |
| 129 else | |
| 130 packend = "at your untimely demise"; | |
| 131 mvaddstr(LINES - 1, 0, retstr); | |
| 132 refresh(); | |
| 133 wgetnstr(stdscr,prbuf,80); | |
| 134 oldpurse = purse; | |
| 135 showpack(FALSE, packend); | |
| 136 } | |
| 137 /* | |
| 138 * Open file and read list | |
| 139 */ | |
| 140 if ((fd = open(scorefile, O_RDWR | O_CREAT, 0666)) < 0) | |
| 141 return; | |
| 142 outf = (FILE *) fdopen(fd, "w"); | |
| 143 for (scp = top_ten; scp <= &top_ten[9]; scp++) { | |
| 144 scp->sc_score = 0; | |
| 145 for (i = 0; i < 80; i++) | |
| 146 scp->sc_name[i] = rnd(255); | |
| 147 scp->sc_flags = rnd(255); | |
| 148 scp->sc_level = rnd(255); | |
| 149 scp->sc_monster = rnd(255); | |
| 150 scp->sc_uid = rnd(255); | |
| 151 scp->sc_date = rnd(255); | |
| 152 } | |
| 153 mvaddstr(LINES - 1, 0, retstr); | |
| 154 refresh(); | |
| 155 wgetnstr(stdscr,prbuf,80); | |
| 156 if (author() || wizard) | |
| 157 if (strcmp(prbuf, "names") == 0) | |
| 158 prflags = 1; | |
| 159 for(i = 0; i < 10; i++) | |
| 160 { | |
| 161 unsigned int mon; | |
| 162 | |
| 163 encread((char *) &top_ten[i].sc_name, LINLEN, fd); | |
| 164 encread((char *) scoreline, 100, fd); | |
| 165 sscanf(scoreline, " %d %d %d %d %u %d %ld %lx \n", | |
| 166 &top_ten[i].sc_score, &top_ten[i].sc_flags, | |
| 167 &top_ten[i].sc_level, &top_ten[i].sc_uid, | |
| 168 &mon, &top_ten[i].sc_explvl, | |
| 169 &top_ten[i].sc_exppts, &top_ten[i].sc_date); | |
| 170 top_ten[i].sc_monster = mon; | |
| 171 } | |
| 172 /* | |
| 173 * Insert it in list if need be | |
| 174 */ | |
| 175 if (!waswizard) { | |
| 176 for (scp = top_ten; scp <= &top_ten[9]; scp++) | |
| 177 if (amount > scp->sc_score) | |
| 178 break; | |
| 179 if (scp <= &top_ten[9]) { | |
| 180 for (sc2 = &top_ten[9]; sc2 > scp; sc2--) | |
| 181 *sc2 = *(sc2-1); | |
| 182 scp->sc_score = amount; | |
| 183 strcpy(scp->sc_name, whoami); | |
| 184 scp->sc_flags = aflag; | |
| 185 if (aflag == WINNER) | |
| 186 scp->sc_level = max_level; | |
| 187 else | |
| 188 scp->sc_level = level; | |
| 189 scp->sc_monster = monst; | |
| 190 scp->sc_uid = playuid; | |
| 191 scp->sc_explvl = him->s_lvl; | |
| 192 scp->sc_exppts = him->s_exp; | |
| 193 time(&scp->sc_date); | |
| 194 } | |
| 195 } | |
| 196 ignore(); | |
| 197 fseek(outf, 0L, 0); | |
| 198 for(i = 0; i < 10; i++) | |
| 199 { | |
| 200 memset(scoreline,0,100); | |
| 201 encwrite((char *) top_ten[i].sc_name, LINLEN, outf); | |
| 202 sprintf(scoreline, " %d %d %d %d %u %d %ld %lx \n", | |
| 203 top_ten[i].sc_score, top_ten[i].sc_flags, | |
| 204 top_ten[i].sc_level, top_ten[i].sc_uid, | |
| 205 top_ten[i].sc_monster, top_ten[i].sc_explvl, | |
| 206 top_ten[i].sc_exppts, top_ten[i].sc_date); | |
| 207 encwrite((char *) scoreline, 100, outf); | |
| 208 } | |
| 209 fclose(outf); | |
| 210 signal(SIGINT, byebye); | |
| 211 signal(SIGQUIT, byebye); | |
| 212 clear(); | |
| 213 refresh(); | |
| 214 endwin(); | |
| 215 showtop(prflags); /* print top ten list */ | |
| 216 } | |
| 217 | |
| 218 /* | |
| 219 * showtop: | |
| 220 * Display the top ten on the screen | |
| 221 */ | |
| 222 showtop(showname) | |
| 223 int showname; | |
| 224 { | |
| 225 reg int fd, i; | |
| 226 char *killer; | |
| 227 struct sc_ent *scp; | |
| 228 | |
| 229 if ((fd = open(scorefile, O_RDONLY)) < 0) | |
| 230 return FALSE; | |
| 231 | |
| 232 for(i = 0; i < 10; i++) | |
| 233 { | |
| 234 unsigned int mon; | |
| 235 encread((char *) &top_ten[i].sc_name, LINLEN, fd); | |
| 236 encread((char *) scoreline, 100, fd); | |
| 237 sscanf(scoreline, " %d %d %d %d %u %d %ld %lx \n", | |
| 238 &top_ten[i].sc_score, &top_ten[i].sc_flags, | |
| 239 &top_ten[i].sc_level, &top_ten[i].sc_uid, | |
| 240 &mon, &top_ten[i].sc_explvl, | |
| 241 &top_ten[i].sc_exppts, &top_ten[i].sc_date); | |
| 242 top_ten[i].sc_monster = mon; | |
| 243 } | |
| 244 close(fd); | |
| 245 printf("Top Ten Adventurers:\nRank\tScore\tName\n"); | |
| 246 for (scp = top_ten; scp <= &top_ten[9]; scp++) { | |
| 247 if (scp->sc_score > 0) { | |
| 248 printf("%d\t%d\t%s: %s\t\t--> %s on level %d", | |
| 249 scp - top_ten + 1, scp->sc_score, scp->sc_name, | |
| 250 ctime(&scp->sc_date), reason[scp->sc_flags], | |
| 251 scp->sc_level); | |
| 252 if (scp->sc_flags == KILLED) { | |
| 253 killer = killname(scp->sc_monster); | |
| 254 printf(" by a%s %s",vowelstr(killer), killer); | |
| 255 } | |
| 256 printf(" [Exp: %d/%ld]",scp->sc_explvl,scp->sc_exppts); | |
| 257 if (showname) { | |
| 258 struct passwd *pp, *getpwuid(); | |
| 259 | |
| 260 if ((pp = getpwuid(scp->sc_uid)) == NULL) | |
| 261 printf(" (%d)\n", scp->sc_uid); | |
| 262 else | |
| 263 printf(" (%s)\n", pp->pw_name); | |
| 264 } | |
| 265 else | |
| 266 printf("\n"); | |
| 267 } | |
| 268 } | |
| 269 return TRUE; | |
| 270 } | |
| 271 | |
| 272 /* | |
| 273 * total_winner: | |
| 274 * The hero made it back out alive | |
| 275 */ | |
| 276 total_winner() | |
| 277 { | |
| 278 clear(); | |
| 279 addstr(" \n"); | |
| 280 addstr(" @ @ @ @ @ @@@ @ @ \n"); | |
| 281 addstr(" @ @ @@ @@ @ @ @ @ \n"); | |
| 282 addstr(" @ @ @@@ @ @ @ @ @ @@@ @@@@ @@@ @ @@@ @ \n"); | |
| 283 addstr(" @@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ \n"); | |
| 284 addstr(" @ @ @ @ @ @ @ @@@@ @ @ @@@@@ @ @ @ \n"); | |
| 285 addstr(" @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ \n"); | |
| 286 addstr(" @@@ @@@ @@ @ @ @ @@@@ @@@@ @@@ @@@ @@ @ \n"); | |
| 287 addstr(" \n"); | |
| 288 addstr(" Congratulations, you have made it to the light of day! \n"); | |
| 289 addstr("\nYou have joined the elite ranks of those who have escaped the\n"); | |
| 290 addstr("Dungeons of Doom alive. You journey home and sell all your loot at\n"); | |
| 291 addstr("a great profit and are admitted to the fighters guild.\n"); | |
| 292 | |
| 293 mvaddstr(LINES - 1, 0,spacemsg); | |
| 294 refresh(); | |
| 295 wait_for(stdscr, ' '); | |
| 296 clear(); | |
| 297 oldpurse = purse; | |
| 298 showpack(TRUE, NULL); | |
| 299 score(purse, WINNER, 0); | |
| 300 byebye(0); | |
| 301 } | |
| 302 | |
| 303 /* | |
| 304 * showpack: | |
| 305 * Display the contents of the hero's pack | |
| 306 */ | |
| 307 showpack(winner, howso) | |
| 308 bool winner; | |
| 309 char *howso; | |
| 310 { | |
| 311 reg char *iname; | |
| 312 reg int cnt, worth, ch; | |
| 313 reg struct linked_list *item; | |
| 314 reg struct object *obj; | |
| 315 | |
| 316 idenpack(); | |
| 317 cnt = 1; | |
| 318 clear(); | |
| 319 if (winner) | |
| 320 mvaddstr(0, 0, " Worth Item"); | |
| 321 else | |
| 322 mvprintw(0, 0, "Contents of your pack %s:\n",howso); | |
| 323 ch = 'a'; | |
| 324 for (item = pack; item != NULL; item = next(item)) { | |
| 325 obj = OBJPTR(item); | |
| 326 iname = inv_name(obj, FALSE); | |
| 327 if (winner) { | |
| 328 worth = get_worth(obj); | |
| 329 worth *= obj->o_count; | |
| 330 mvprintw(cnt, 0, " %6d %s",worth,iname); | |
| 331 purse += worth; | |
| 332 } | |
| 333 else { | |
| 334 mvprintw(cnt, 0, "%c) %s\n",ch,iname); | |
| 335 ch = npch(ch); | |
| 336 } | |
| 337 if (++cnt >= LINES - 2 && next(item) != NULL) { | |
| 338 cnt = 1; | |
| 339 mvaddstr(LINES - 1, 0, morestr); | |
| 340 refresh(); | |
| 341 wait_for(stdscr, ' '); | |
| 342 clear(); | |
| 343 } | |
| 344 } | |
| 345 mvprintw(cnt + 1,0,"--- %d Gold Pieces ---",oldpurse); | |
| 346 refresh(); | |
| 347 } | |
| 348 | |
| 349 /* | |
| 350 * killname: | |
| 351 * Returns what the hero was killed by. | |
| 352 */ | |
| 353 char * | |
| 354 killname(monst) | |
| 355 unsigned char monst; | |
| 356 { | |
| 357 if (monst < MAXMONS + 1) | |
| 358 return monsters[monst].m_name; | |
| 359 else /* things other than monsters */ | |
| 360 switch (monst) { | |
| 361 case K_ARROW: return "crooked arrow"; | |
| 362 case K_DART: return "sharp dart"; | |
| 363 case K_BOLT: return "jagged bolt"; | |
| 364 case K_POOL: return "magic pool"; | |
| 365 case K_ROD: return "exploding rod"; | |
| 366 case K_SCROLL: return "burning scroll"; | |
| 367 case K_STONE: return "transmogrification to stone"; | |
| 368 case K_STARVE: return "starvation"; | |
| 369 } | |
| 370 return "Bob Kindelberger"; | |
| 371 } | 
