/* This file is derived from nethack, its copyright is below */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* block some unused #defines to avoid overloading some cpp's */ #include "structs.h" #include "comm.h" #include "utils.h" #include "proto.h" static const char *deaths[] = { /* the array of death */ "smacked around", "carved up", "gouged", "gassed", "poisoned", "turned to stone", "heatstroke", "frozen", "poor diet", "viral problems", "bacteria", "bled", "organ failure", "burned", "electricuted", "drowning", "choked", "quit" }; static const char *ends[] = { /* "when you..." */ "died", "died", "died", "were gassed", "were poisoned", "turned to stone", "fainted", "froze", "starved", "sneezed", "evacuated", "died", "lost it", "burned", "did the electric slide", "drowned", "were choked", "turned chicken" }; #if 0 void dms_show_msg(ch,killer,death) { char *who_str; } char * done_in_by(struct char_data *ch,struct char_data *killer) { static char buf[MAX_STRING_LENGTH]; char *nam; buf[0] = '\0'; if(!killer) return buf; if(GET_NAME(killer)) nam=GET_NAME(killer); else if(bio_index[killer->phys->species].name) nam=bio_index[killer->phys->species].name; else nam="whatever"; sprintf(buf,"the mighty %s",nam); return buf; } void present_end(struct char_data *ch,struct char_data *killer,int how) { struct permonst *upmon; char kilbuf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH]; /* kilbuf: used to copy killer in case it comes from something like * xname(), which would otherwise get overwritten when we call * xname() when listing possessions * buf2: same as player name, except it is capitalized */ /* Avoid killed by "a" burning or "a" starvation */ if (!killer && (how == STARVING || how == BURNING)) killer_format = KILLED_BY; strcpy(kilbuf, (!killer || how >= PANICKED ? deaths[how] : killer)); killer = kilbuf; else if(how == STONED) if (how == ESCAPED || how == PANICKED) killer_format = NO_KILLER_PREFIX; disclose(how,taken); strcpy(buf2, plname); if(!done_stopprint) printf("Goodbye %s the %s...\n\n", buf2, pl_character); if(how == ESCAPED) { register struct monst *mtmp; register struct obj *otmp, *otmp2, *prevobj; struct obj *jewels = (struct obj *)0; long i; register unsigned int worthlessct = 0; /* put items that count into jewels chain * rewriting the fcobj and invent chains here is safe, * as they'll never be used again */ for(otmp = fcobj; otmp; otmp = otmp2) { otmp2 = otmp->nobj; if(carried(otmp->cobj) && ((otmp->olet == GEM_SYM && otmp->otyp < LUCKSTONE) || otmp->olet == AMULET_SYM)) { if(otmp == fcobj) fcobj = otmp->nobj; else prevobj->nobj = otmp->nobj; otmp->nobj = jewels; jewels = otmp; } else prevobj = otmp; } for(otmp = invent; otmp; otmp = otmp2) { otmp2 = otmp->nobj; if((otmp->olet == GEM_SYM && otmp->otyp < LUCKSTONE) || otmp->olet == AMULET_SYM) { if(otmp == invent) invent = otmp->nobj; else prevobj->nobj = otmp->nobj; otmp->nobj = jewels; jewels = otmp; } else prevobj = otmp; } /* add points for jewels */ for(otmp = jewels; otmp; otmp = otmp->nobj) { if(otmp->olet == GEM_SYM) u.urexp += (long) otmp->quan * objects[otmp->otyp].g_val; else /* amulet */ u.urexp += (otmp->spe < 0) ? 2 : otmp->otyp == AMULET_OF_YENDOR ? 5000 : 500; } if(mtmp) { if(!done_stopprint) printf("You"); while(mtmp) { if(!done_stopprint) printf(" and %s", mon_nam(mtmp)); if(mtmp->mtame) u.urexp += mtmp->mhp; mtmp = mtmp->nmon; } } else if(!done_stopprint) printf("You %s with %ld points,\n", how==ASCENDED ? "went to your reward" u.urexp); /* print jewels chain here */ for(otmp = jewels; otmp; otmp = otmp->nobj) { makeknown(otmp->otyp); if(otmp->olet == GEM_SYM && otmp->otyp < LUCKSTONE) { i = (long) otmp->quan * objects[otmp->otyp].g_val; if(i == 0) { worthlessct += otmp->quan; continue; } printf(" %s (worth %ld zorkmids),\n", doname(otmp), i); } else { /* amulet */ otmp->known = 1; i = (otmp->spe < 0) ? 2 : otmp->otyp == AMULET_OF_YENDOR ? 5000 : 500; printf(" %s (worth %ld zorkmids),\n", doname(otmp), i); } } if(worthlessct) printf(" %u worthless piece%s of colored glass,\n", worthlessct, plur((long)worthlessct)); } else if(!done_stopprint) { printf("You %s ", ends[how]); printf("with %ld points,\n", u.urexp); } if(!done_stopprint) printf("and %ld piece%s of gold, after %ld move%s.\n", u.ugold, plur(u.ugold), moves, plur(moves)); if(!done_stopprint) printf("You were level %u with a maximum of %d hit points when you %s.\n", u.ulevel, u.uhpmax, ends[how]); { if (!done_stopprint) { getret(); cls(); } /* "So when I die, the first thing I will see in Heaven is a score list?" */ topten(how); } if(done_stopprint) printf("\n\n"); exit(0); } #endif char *rip_txt[] = { " ----------", " / \\", " / REST \\", " / IN \\", " / PEACE \\", " / \\", " | |", " | |", " | |", " | |", " | |", " | 1001 |", " *| * * * | *", " _________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______\n", 0 }; char **rip; static void center(line, text) int line; char *text; { register char *ip,*op; ip = text; op = &rip_txt[line][28 - ((strlen(text)+1)>>1)]; while(*ip) *op++ = *ip++; } void clean_rip() { int i; for(i=6;i<12;i++) center(i," "); } void outrip(struct char_data *ch) { char buf[MAX_STRING_LENGTH]; register int y; extern struct time_info_data time_info; /* int killed_by_line = 0;*/ /* cls();*/ sprintf(buf, "%s", GET_NAME(ch)); buf[16] = 0; center(6, buf); sprintf(buf, "-- Au"); center(7, buf); #if 0 if (killer_format != NO_KILLER_PREFIX) { killed_by_line = 1; strcpy(buf, "killed by"); if (killer_format == KILLED_BY_AN) strcat(buf, index(vowels, *killer) ? " an" : " a"); center(8, buf); } strcpy(buf, killer); if(strlen(buf) > 16) { register int i,i0,i1; i0 = i1 = 0; for(i = 0; i <= 16; i++) if(buf[i] == ' ') i0 = i, i1 = i+1; if(!i0) i0 = i1 = 16; buf[i1 + 16] = 0; center(9 + killed_by_line, buf+i1); buf[i0] = 0; } center(8 + killed_by_line, buf); #endif sprintf(buf, "%4dC.E.", time_info.year); center(11, buf); for(y=0;rip_txt[y];y++) { sprintf(buf," %s\n",rip_txt[y]); SEND_TO_Q(buf,ch->desc); } clean_rip(); }