void death(char monst) { char **dp, *killer; struct tm *lt; static time_t date; struct tm *localtime(); signal(SIGINT, SIG_IGN); purse -= purse / 10; signal(SIGINT, leave); clear(); killer = killname(monst, FALSE); if (!tombstone) { mvprintw(LINES - 2, 0, "Killed by "); killer = killname(monst, FALSE); if (monst != 's' && monst != 'h') printw("a%s ", vowelstr(killer)); printw("%s with %d gold", killer, purse); } else { time(&date); lt = localtime(&date); move(8, 0); dp = rip; while (*dp) addstr(*dp++); mvaddstr(17, center(killer), killer); if (monst == 's' || monst == 'h') mvaddch(16, 32, ' '); else mvaddstr(16, 33, vowelstr(killer)); mvaddstr(14, center(whoami), whoami); sprintf(prbuf, "%d Au", purse); move(15, center(prbuf)); addstr(prbuf); sprintf(prbuf, "%4d", 1900+lt->tm_year); mvaddstr(18, 26, prbuf); } move(LINES - 1, 0); refresh(); score(purse, amulet ? 3 : 0, monst); printf("[Press return to continue]"); fflush(stdout); (void) fgets(prbuf,10,stdin); my_exit(0); }
void score(int amount, int flags, char monst) { SCORE *scp; int i; SCORE *sc2; SCORE *top_ten, *endp; # ifdef MASTER int prflags = 0; # endif void (*fp)(int); unsigned int uid; static char *reason[] = { "killed", "quit", "A total winner", "killed with Amulet" }; start_score(); if (flags >= 0 #ifdef MASTER || wizard #endif ) { mvaddstr(LINES - 1, 0 , "[Press return to continue]"); refresh(); wgetnstr(stdscr,prbuf,80); endwin(); printf("\n"); resetltchars(); /* * free up space to "guarantee" there is space for the top_ten */ delwin(stdscr); delwin(curscr); if (hw != NULL) delwin(hw); } top_ten = (SCORE *) malloc(numscores * sizeof (SCORE)); endp = &top_ten[numscores]; for (scp = top_ten; scp < endp; scp++) { scp->sc_score = 0; for (i = 0; i < MAXSTR; i++) scp->sc_name[i] = (unsigned char) rnd(255); scp->sc_flags = RN; scp->sc_level = RN; scp->sc_monster = (unsigned short) RN; scp->sc_uid = RN; } signal(SIGINT, SIG_DFL); #ifdef MASTER if (wizard) if (strcmp(prbuf, "names") == 0) prflags = 1; else if (strcmp(prbuf, "edit") == 0) prflags = 2; #endif rd_score(top_ten); /* * Insert her in list if need be */ sc2 = NULL; if (!noscore) { uid = md_getuid(); for (scp = top_ten; scp < endp; scp++) if (amount > scp->sc_score) break; else if (!allscore && /* only one score per nowin uid */ flags != 2 && scp->sc_uid == uid && scp->sc_flags != 2) scp = endp; if (scp < endp) { if (flags != 2 && !allscore) { for (sc2 = scp; sc2 < endp; sc2++) { if (sc2->sc_uid == uid && sc2->sc_flags != 2) break; } if (sc2 >= endp) sc2 = endp - 1; } else sc2 = endp - 1; while (sc2 > scp) { *sc2 = sc2[-1]; sc2--; } scp->sc_score = amount; strncpy(scp->sc_name, whoami, MAXSTR); scp->sc_flags = flags; if (flags == 2) scp->sc_level = max_level; else scp->sc_level = level; scp->sc_monster = monst; scp->sc_uid = uid; sc2 = scp; } } /* * Print the list */ if (flags != -1) putchar('\n'); printf("Top %s %s:\n", Numname, allscore ? "Scores" : "Rogueists"); printf(" Score Name\n"); for (scp = top_ten; scp < endp; scp++) { if (scp->sc_score) { if (sc2 == scp) md_raw_standout(); printf("%2d %5d %s: %s on level %d", (int) (scp - top_ten + 1), scp->sc_score, scp->sc_name, reason[scp->sc_flags], scp->sc_level); if (scp->sc_flags == 0 || scp->sc_flags == 3) printf(" by %s", killname((char) scp->sc_monster, TRUE)); #ifdef MASTER if (prflags == 1) { printf(" (%s)", md_getrealname(scp->sc_uid)); } else if (prflags == 2) { fflush(stdout); (void) fgets(prbuf,10,stdin); if (prbuf[0] == 'd') { for (sc2 = scp; sc2 < endp - 1; sc2++) *sc2 = *(sc2 + 1); sc2 = endp - 1; sc2->sc_score = 0; for (i = 0; i < MAXSTR; i++) sc2->sc_name[i] = (char) rnd(255); sc2->sc_flags = RN; sc2->sc_level = RN; sc2->sc_monster = (unsigned short) RN; scp--; } } else #endif /* MASTER */ printf("."); if (sc2 == scp) md_raw_standend(); putchar('\n'); } else break; } /* * Update the list file */ if (sc2 != NULL) { if (lock_sc()) { fp = signal(SIGINT, SIG_IGN); wr_score(top_ten); unlock_sc(); signal(SIGINT, fp); } } }
void death(int monst) { char **dp = (char **) rip, *killer; struct tm *lt; time_t date; char buf[80]; int c; if (is_wearing(R_RESURRECT) || rnd(wizard ? 3 : 67) == 0) { int die = TRUE; if (resurrect-- == 0) msg("You've run out of lives."); else if (!save_resurrect(ring_value(R_RESURRECT))) msg("Your attempt to return from the grave fails."); else { struct linked_list *item; struct linked_list *next_item; struct object *obj; int rm, flags; coord pos; die = FALSE; msg("You feel a sudden warmth and then nothingness."); teleport(); if (ring_value(R_RESURRECT) > 1 && rnd(10)) { pstats.s_hpt = 2 * pstats.s_const; pstats.s_const = max(pstats.s_const - 1, 3); } else { for (item = pack; item != NULL; item = next_item) { obj = OBJPTR(item); if (obj->o_flags & ISOWNED || obj->o_flags & ISPROT) { next_item = next(item); continue; } flags = obj->o_flags; obj->o_flags &= ~ISCURSED; dropcheck(obj); obj->o_flags = flags; next_item = next(item); rem_pack(obj); if (obj->o_type == ARTIFACT) has_artifact &= ~(1 << obj->o_which); do { rm = rnd_room(); rnd_pos(&rooms[rm], &pos); } while(winat(pos.y, pos.x) != FLOOR); obj->o_pos = pos; add_obj(item, obj->o_pos.y, obj->o_pos.x); } pstats.s_hpt = pstats.s_const; pstats.s_const = max(pstats.s_const - roll(2, 2), 3); } chg_str(roll(1, 4), TRUE, FALSE); pstats.s_lvl = max(pstats.s_lvl, 1); no_command += 2 + rnd(4); if (on(player, ISHUH)) lengthen_fuse(FUSE_UNCONFUSE, rnd(8) + HUHDURATION); else light_fuse(FUSE_UNCONFUSE, 0, rnd(8) + HUHDURATION, AFTER); turn_on(player, ISHUH); light(&hero); } if (die) { wmove(cw, mpos, 0); waddstr(cw, morestr); wrefresh(cw); wait_for(' '); } else return; } time(&date); lt = localtime(&date); clear(); wclear(cw); move(8, 0); while (*dp) printw("%s\n", *dp++); mvaddstr(14, 28 - ((int)(strlen(whoami) + 1) / 2), whoami); sprintf(buf, "%d+%ld Points", pstats.s_lvl, pstats.s_exp); mvaddstr(15, 28 - ((int)(strlen(buf) + 1) / 2), buf); killer = killname(monst,buf); mvaddstr(17, 28 - ((int)(strlen(killer) + 1) / 2), killer); mvaddstr(18, 28, (sprintf(prbuf, "%2d", lt->tm_year), prbuf)); move(LINES - 1, 0); mvaddstr(LINES - 1, 0, retstr); while ((c = readcharw(stdscr)) != '\n' && c != '\r') continue; idenpack(); wrefresh(cw); refresh(); score(pstats.s_exp, pstats.s_lvl, KILLED, monst); byebye(); }
void score(long amount, int lvl, int flags, int monst) /*ARGSUSED*/ { struct sc_ent *scp=NULL, *sc2=NULL; int i; char *killer; char buf[1024]; static const char *reason[] = { "killed", "quit", "a winner", "a total winner" }; char *packend; if (flags != WINNER && flags != TOTAL && flags != SCOREIT) { if (flags == CHICKEN) packend = "when you quit"; else packend = "at your untimely demise"; noecho(); nl(); refresh(); showpack(packend); } /* Open file and read list */ if (fd_score == NULL) { printf("No score file opened\n"); return; } for (scp = top_ten; scp < &top_ten[10]; scp++) { scp->sc_lvl = 0L; scp->sc_score = 0L; for (i = 0; i < 76; i++) scp->sc_name[i] = ucrnd(255); scp->sc_gold = 0L; scp->sc_flags = rnd(10); scp->sc_level = rnd(10); scp->sc_monster = srnd(10); scp->sc_artifacts = 0; } if (flags != SCOREIT) { mvaddstr(LINES - 1, 0, retstr); refresh(); fflush(stdout); wait_for('\n'); } fseek(fd_score, 0L, SEEK_SET); fread(top_ten, sizeof(top_ten), 1, fd_score); /* Insert player in list if need be */ if (!waswizard) { for (scp = top_ten; scp < &top_ten[10]; scp++) { if (lvl > scp->sc_lvl) break; if (lvl == scp->sc_lvl && amount > scp->sc_score) break; } if (scp < &top_ten[10]) { if (flags == WINNER) sc2 = &top_ten[9]; /* LAST WINNER ALWAYS MAKES IT */ while (sc2 > scp) { *sc2 = sc2[-1]; sc2--; } scp->sc_lvl = lvl; scp->sc_gold = purse; scp->sc_score = amount; strcpy(scp->sc_name, whoami); strcat(scp->sc_name,", "); strcat(scp->sc_name, which_class(player.t_ctype)); scp->sc_flags = flags; if (flags == WINNER) scp->sc_level = max_level; else scp->sc_level = level; scp->sc_monster = monst; scp->sc_artifacts = has_artifact; sc2 = scp; } } if (flags != SCOREIT) { clear(); refresh(); endwin(); } /* Print the list */ printf("\nTop Ten Adventurers:\n%4s %15s %10s %s\n", "Rank", "Score", "Gold", "Name"); for (scp = top_ten; scp < &top_ten[10]; scp++) { if (scp->sc_score) { char lev[20]; sprintf(lev, "%ld+%ld", scp->sc_lvl, scp->sc_score); printf("%4d %15s %10ld %s:", scp - top_ten + 1, lev, scp->sc_gold, scp->sc_name); if (scp->sc_artifacts) { char thangs[80]; int n; int first = TRUE; thangs[0] = '\0'; for (n = 0; n <= maxartifact; n++) { if (scp->sc_artifacts & (1 << n)) { if (strlen(thangs)) strcat(thangs, ", "); if (first) { strcat(thangs, "retrieved "); first = FALSE; } if (45 - strlen(thangs) < strlen(arts[n].ar_name)) { printf("%s\n%32s", thangs," "); thangs[0] = '\0'; } strcat(thangs, arts[n].ar_name); } } if (strlen(thangs)) printf("%s,", thangs); printf("\n%32s"," "); } printf("%s on level %d",reason[scp->sc_flags],scp->sc_level); if (scp->sc_flags == 0) { printf(" by \n%32s"," "); killer = killname(scp->sc_monster, buf); printf(" %s", killer); } putchar('\n'); } } if (sc2 != NULL) { fseek(fd_score, 0L, SEEK_SET); /* Update the list file */ fwrite(top_ten, sizeof(top_ten), 1, fd_score); } fclose(fd_score); }