billr@saab.CNA.TEK.COM (Bill Randle) (07/24/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 7, Issue 66 Archive-name: NetHack3/Part11 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 11 (of 38)." # Contents: amiga/signal.h src/cmd.c src/pray.c # Wrapped by billr@saab on Sun Jul 23 21:32:54 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'amiga/signal.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'amiga/signal.h'\" else echo shar: Extracting \"'amiga/signal.h'\" \(115 characters\) sed "s/^X//" >'amiga/signal.h' <<'END_OF_FILE' X#ifndef SIGNAL_H X#define SIGNAL_H X X#define SIG_IGN 1 X#define SIG_DFL 0 X#define signal(x,y) SIG_IGN X X#endif END_OF_FILE if test 115 -ne `wc -c <'amiga/signal.h'`; then echo shar: \"'amiga/signal.h'\" unpacked with wrong size! fi # end of 'amiga/signal.h' fi if test -f 'src/cmd.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/cmd.c'\" else echo shar: Extracting \"'src/cmd.c'\" \(17734 characters\) sed "s/^X//" >'src/cmd.c' <<'END_OF_FILE' X/* SCCS Id: @(#)cmd.c 3.0 88/10/24 X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X/* NetHack may be freely redistributed. See license for details. */ X X#include "hack.h" X#include "func_tab.h" X X#ifdef DUMB /* stuff commented out in extern.h, but needed here */ Xextern int doapply(); /**/ Xextern int dorub(); /**/ Xextern int dojump(); /**/ Xextern int doextlist(); /**/ Xextern int dodrop(); /**/ Xextern int doddrop(); /**/ Xextern int dodown(); /**/ Xextern int doup(); /**/ Xextern int donull(); /**/ Xextern int dowipe(); /**/ Xextern int do_mname(); /**/ Xextern int ddocall(); /**/ Xextern int dotakeoff(); /**/ Xextern int doremring(); /**/ Xextern int dowear(); /**/ Xextern int doputon(); /**/ Xextern int doddoremarm(); /**/ Xextern int dokick(); /**/ Xextern int dothrow(); /**/ Xextern int doeat(); /**/ Xextern int done2(); /**/ Xextern int doengrave(); /**/ Xextern int dopickup(); /**/ Xextern int ddoinv(); /**/ Xextern int dotypeinv(); /**/ Xextern int dolook(); /**/ Xextern int doprgold(); /**/ Xextern int doprwep(); /**/ Xextern int doprarm(); /**/ Xextern int doprring(); /**/ Xextern int dopramulet(); /**/ Xextern int doprtool(); /**/ Xextern int dosuspend(); /**/ Xextern int doforce(); /**/ Xextern int doopen(); /**/ Xextern int doclose(); /**/ Xextern int dosh(); /**/ Xextern int dodiscovered(); /**/ Xextern int doset(); /**/ Xextern int dotogglepickup(); /**/ Xextern int dowhatis(); /**/ Xextern int dowhatdoes(); /**/ Xextern int dohelp(); /**/ Xextern int dohistory(); /**/ Xextern int dosh(); /**/ Xextern int doloot(); /**/ Xextern int dodrink(); /**/ Xextern int dodip(); /**/ Xextern int dosacrifice(); /**/ Xextern int dopray(); /**/ Xextern int doturn(); /**/ Xextern int doredraw(); /**/ Xextern int doread(); /**/ Xextern int dosave(); /**/ Xextern int dosave0(); /**/ Xextern int dosearch(); /**/ Xextern int dosearch0 P((int)); /**/ Xextern int doidtrap(); /**/ Xextern int dopay(); /**/ Xextern int dosit(); /**/ Xextern int dotalk(); /**/ Xextern int docast(); /**/ Xextern int dovspell(); /**/ Xextern int doredotopl(); /**/ Xextern int dotele(); /**/ Xextern int dountrap(); /**/ Xextern int doversion(); /**/ Xextern int dowield(); /**/ Xextern int dozap(); /**/ X#endif /* DUMB */ X Xstatic int (*timed_occ_fn)(); X#ifdef POLYSELF Xstatic int domonability(); X#endif X X/* Count down by decrementing multi */ Xstatic int Xtimed_occupation() { X (*timed_occ_fn)(); X if (multi > 0) X multi--; X return multi > 0; X} X X/* If a time is given, use it to timeout this function, otherwise the X * function times out by its own means. X */ Xvoid Xset_occupation(fn, txt, xtime) Xint (*fn)(); Xchar *txt; Xint xtime; X{ X if (xtime) { X occupation = timed_occupation; X timed_occ_fn = fn; X } else X occupation = fn; X occtxt = txt; X occtime = 0; X return; X} X X#ifdef REDO X/* Provide a means to redo the last command. The flag `in_doagain' is set X * to true while redoing the command. This flag is tested in commands that X * require additional input (like `throw' which requires a thing and a X * direction), and the input prompt is not shown. Also, while in_doagain is X * TRUE, no keystrokes can be saved into the saveq. X */ X#define BSIZE 20 Xstatic char pushq[BSIZE], saveq[BSIZE]; Xstatic int phead, ptail, shead, stail; X Xstatic char Xpopch() { X /* If occupied, return 0, letting tgetch know a character should X * be read from the keyboard. If the character read is not the X * ABORT character (as checked in pcmain.c), that character will be X * pushed back on the pushq. X */ X if (occupation) return 0; X if (in_doagain) return (shead != stail) ? saveq[stail++] : 0; X else return (phead != ptail) ? pushq[ptail++] : 0; X} X Xchar Xpgetchar() { /* curtesy of aeb@cwi.nl */ X register int ch; X X if(!(ch = popch())) X ch = tgetch(); X return(ch); X} X X/* A ch == 0 resets the pushq */ Xvoid Xpushch(ch) Xchar ch; X{ X if (!ch) X phead = ptail = 0; X if (phead < BSIZE) X pushq[phead++] = ch; X return; X} X X/* A ch == 0 resets the saveq. Only save keystrokes when not X * replaying a previous command. X */ Xvoid Xsavech(ch) Xchar ch; X{ X if (!in_doagain) { X if (!ch) X phead = ptail = shead = stail = 0; X else if (shead < BSIZE) X saveq[shead++] = ch; X } X return; X} X#endif /* REDO */ X Xstatic int Xdoextcmd() /* here after # - now read a full-word command */ X{ X char buf[BUFSZ]; X register struct ext_func_tab *efp = extcmdlist; Xagain: X pline("# "); X#ifdef COM_COMPL X get_ext_cmd(buf); X#else X getlin(buf); X#endif X clrlin(); X if(buf[0] == '\0' || buf[0] == '\033') X return 0; X if(buf[0] == '?') { X (void) doextlist(); X goto again; X } X while(efp->ef_txt) { X if(!strcmp(efp->ef_txt, buf)) X return (*(efp->ef_funct))(); X efp++; X } X pline("%s: unknown extended command.", buf); X return 0; X} X Xint Xdoextlist() /* here after #? - now list all full-word commands */ X{ X register struct ext_func_tab *efp = extcmdlist; X char buf[BUFSZ]; X X set_pager(0); X if(page_line("") || X page_line(" Extended Commands List") || X page_line("") || X page_line(" Press '#', then type (first letter only):") || X page_line("")) goto quit; X X while(efp->ef_txt) { X X Sprintf(buf, " %-8s - %s.", efp->ef_txt, efp->ef_desc); X if(page_line(buf)) goto quit; X efp++; X } X set_pager(1); X return 0; Xquit: X set_pager(2); X return 0; X} X X#ifdef POLYSELF Xstatic int Xdomonability() X{ X if (can_breathe(uasmon)) return dobreathe(); X else if (attacktype(uasmon, AT_SPIT)) return dospit(); X else if (u.usym == S_NYMPH) return doremove(); X else if (u.usym == S_UMBER) return doconfuse(); X else if (is_were(uasmon)) return dosummon(); X else if (webmaker(uasmon)) return dospinweb(); X else if (is_hider(uasmon)) return dohide(); X else if (u.umonnum >= 0) X pline("Any special ability you may have is purely reflexive."); X else You("don't have a special ability!"); X return 0; X} X#endif X X#ifdef WIZARD Xstatic int Xwiz_wish() /* Unlimited wishes for wizard mode by Paul Polderman */ X{ X if (wizard) makewish(); X else pline("Unavailable command '^W'."); X return 0; X} X Xstatic int Xwiz_identify() X{ X struct obj *obj; X X if (!wizard) X pline("Unavailable command '^I'."); X else { X for (obj = invent; obj; obj = obj->nobj) X if (!objects[obj->otyp].oc_name_known || !obj->known X || !obj->dknown || !obj->bknown) X (void) identify(obj); X } X return 0; X} X Xstatic int Xwiz_map() X{ X if (wizard) do_mapping(); X else pline("Unavailable command '^F'."); X return 0; X} X Xstatic int Xwiz_genesis() X{ X if (wizard) (void) create_particular(); X else pline("Unavailable command '^G'."); X return 0; X} X Xstatic int Xwiz_where() X{ X if (wizard) { X pline("Medusa:%d Wiz:%d Big:%d", medusa_level, wiz_level, bigroom_level); X#ifdef STRONGHOLD X# ifdef MUSIC X pline("Castle:%d (tune %s) Tower:%d-%d", X stronghold_level, tune, tower_level, tower_level+2); X# else X pline("Castle:%d Tower:%d-%d", X stronghold_level, tower_level, tower_level+2); X# endif X#endif X#ifdef REINCARNATION X pline("Rogue:%d", rogue_level); X#endif X#ifdef ORACLE X pline("Oracle:%d", oracle_level); X#endif X } X else pline("Unavailable command '^O'."); X return 0; X} X Xstatic int Xwiz_detect() X{ X if(wizard) (void) findit(); X else pline("Unavailable command '^E'."); X return 0; X} X Xstatic int Xwiz_level_tele() X{ X if (wizard) level_tele(); X else pline("Unavailable command '^V'."); X return 0; X} X X#endif /* WIZARD */ X Xvoid Xenlightenment() { X X cornline(0, "Current Attributes:"); X X if (u.ualign == 0) cornline(1, "You are nominally aligned."); X else if (u.ualign > 3) cornline(1, "You are stridently aligned."); X else if (u.ualign > 0) cornline(1, "You are haltingly aligned."); X else cornline(1, "You have strayed."); X X if (Adornment) cornline(1, "You are adorned."); X if (Teleportation) cornline(1, "You can teleport."); X if (Regeneration) cornline(1, "You regenerate."); X if (Searching) cornline(1, "You have automatic searching."); X if (See_invisible) cornline(1, "You see invisible."); X if (Stealth) cornline(1, "You are stealthy."); X if (Levitation) cornline(1, "You are levitating."); X if (Hunger) cornline(1, "You have hunger."); X if (Aggravate_monster) cornline(1, "You aggravate monsters."); X if (Poison_resistance) cornline(1, "You are poison resistant."); X if (Fire_resistance) cornline(1, "You are fire resistant."); X if (Cold_resistance) cornline(1, "You are cold resistant."); X if (Shock_resistance) cornline(1, "You are shock resistant."); X if (Sleep_resistance) cornline(1, "You are sleep resistant."); X if (Disint_resistance) cornline(1, "You are disintegration-resistant."); X if (Protection_from_shape_changers) X cornline(1, "You are protected from shape changers."); X if (Conflict) cornline(1, "You cause conflict."); X if (Protection) cornline(1, "You are protected."); X if (Warning) cornline(1, "You are warned."); X if (Teleport_control) cornline(1, "You have teleport control."); X if (Polymorph) cornline(1, "You are polymorphing."); X if (Polymorph_control) cornline(1, "You have polymorph control."); X if (Telepat) cornline(1, "You are telepathic."); X if (Fast) cornline(1, "You are fast."); X /* if (Stunned) cornline(1, "You are stunned."); */ X /* if (Confusion) cornline(1, "You are confused."); */ X /* if (Sick) cornline(1, "You are sick."); */ X /* if (Blinded) cornline(1, "You are blinded."); */ X if (Invisible) cornline(1, "You are invisible."); X else if (Invis) cornline(1, "You are invisible to others."); X if (Wounded_legs) { X char buf[41]; X X Sprintf(buf, "You have wounded %s.", X makeplural(body_part(LEG))); X cornline(1, buf); X } X if (Stoned) cornline(1, "You are turning to stone."); X /* if (Hallucination) cornline(1, "You are hallucinating."); */ X if (Glib) { X char buf[41]; X X Sprintf(buf, "You have slippery %s.", X makeplural(body_part(FINGER))); X cornline(1, buf); X } X if (Reflecting) cornline(1, "You have reflection."); X if (Strangled) cornline(1, "You are being strangled."); X if (Lifesaved) cornline(1, "Your life will be saved."); X if (Fumbling) cornline(1, "You fumble."); X if (Jumping) cornline(1, "You can jump."); X if (Wwalking) cornline(1, "You can walk on water."); X if (Antimagic) cornline(1, "You are magic-protected."); X if (Displaced) cornline(1, "You are displaced."); X if (Clairvoyant) cornline(1, "You are clairvoyant."); X if (stone_luck(TRUE) > 0) cornline(1, "You have extra luck."); X if (stone_luck(TRUE) < 0) cornline(1, "You have reduced luck."); X if (carrying(LUCKSTONE)) { X if (stone_luck(FALSE) <= 0) X cornline(1, "Bad luck does not time out for you."); X if (stone_luck(FALSE) >= 0) X cornline(1, "Good luck does not time out for you."); X } X X cornline(2, ""); X return; X} X X#if defined(WIZARD) || defined(EXPLORE_MODE) Xstatic int Xwiz_attributes() X{ X if (wizard || discover) X enlightenment(); X else X pline("Unavailable command '^X'."); X return 0; X} X#endif /* WIZARD || EXPLORE_MODE */ X Xconst struct func_tab cmdlist[]={ X {'\004', /* ^D */ dokick}, /* "D" is for door!...? */ X#ifdef WIZARD X {'\005', /* ^E */ wiz_detect}, X {'\006', /* ^F */ wiz_map}, X {'\007', /* ^G */ wiz_genesis}, X {'\011', /* ^I */ wiz_identify}, X {'\017', /* ^O */ wiz_where}, X#endif X {'\020', /* ^P */ doredotopl}, X {'\022', /* ^R */ doredraw}, X {'\024', /* ^T */ dotele}, X#ifdef WIZARD X {'\026', /* ^V */ wiz_level_tele}, X {'\027', /* ^W */ wiz_wish}, X#endif X#if defined(WIZARD) || defined(EXPLORE_MODE) X {'\030', /* ^X */ wiz_attributes}, X#endif X#ifdef SUSPEND X {'\032', /* ^Z */ dosuspend}, X#endif X {'a', doapply}, X {'A', doddoremarm}, X/* 'b', 'B' : go sw */ X {'c', doclose}, X {'C', do_mname}, X {'d', dodrop}, X {'D', doddrop}, X {'e', doeat}, X {'E', doengrave}, X/* Soon to be X {'f', dofight, "fighting"}, X {'F', doFight, "fighting"}, X */ X/* 'g', 'G' : multiple go */ X/* 'h', 'H' : go west */ X {'h', dohelp}, /* if number_pad is set */ X {'i', ddoinv}, X {'I', dotypeinv}, /* Robert Viduya */ X/* 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N' : move commands */ X {'j', dojump}, /* if number_pad is on */ X {'k', dokick}, /* if number_pad is on */ X {'l', doloot}, /* if number_pad is on */ X/* 'n' prefixes a count if number_pad is on */ X {'N', ddocall}, /* if number_pad is on */ X {'o', doopen}, X {'O', doset}, X {'p', dopay}, X {'P', doputon}, X {'q', dodrink}, X {'Q', done2}, X {'r', doread}, X {'R', doremring}, X {'s', dosearch, "searching"}, X {'S', dosave}, X {'t', dothrow}, X {'T', dotakeoff}, X/* 'u', 'U' : go ne */ X {'u', dountrap}, /* if number_pad is on */ X {'v', doversion}, X {'V', dohistory}, X {'w', dowield}, X {'W', dowear}, X#ifdef SPELLS X {'x', dovspell}, /* Mike Stephenson */ X#endif X/* 'y', 'Y' : go nw */ X {'z', dozap}, X#ifdef SPELLS X {'Z', docast}, X#endif X {'<', doup}, X {'>', dodown}, X {'/', dowhatis}, X {'&', dowhatdoes}, X {'?', dohelp}, X#ifdef SHELL X {'!', dosh}, X#endif X {'.', donull, "waiting"}, X {' ', donull, "waiting"}, X {',', dopickup}, X {':', dolook}, X {'^', doidtrap}, X {'\\', dodiscovered}, /* Robert Viduya */ X {'@', dotogglepickup}, X {WEAPON_SYM, doprwep}, X {ARMOR_SYM, doprarm}, X {RING_SYM, doprring}, X {AMULET_SYM, dopramulet}, X {TOOL_SYM, doprtool}, X {GOLD_SYM, doprgold}, X#ifdef SPELLS X {SPBOOK_SYM, dovspell}, /* Mike Stephenson */ X#endif X {'#', doextcmd}, X {0,0,0} X}; X Xconst struct ext_func_tab extcmdlist[] = { X "chat", "talk to someone", dotalk, /* converse? */ X "dip", "dip an object into something", dodip, X "force", "force the lock on a chest", doforce, X "jump", "jump to a location", dojump, X "loot", "loot a box on the floor", doloot, X#ifdef POLYSELF X "monster", "use a monster's special ability", domonability, X#endif X "name", "name an item or type of object", ddocall, X#ifdef THEOLOGY X "offer", "offer a sacrifice to the gods", dosacrifice, X "pray", "pray to the gods for help", dopray, X#endif X "rub", "rub a lamp", dorub, X "sit", "sit down", dosit, X "turn", "turn undead", doturn, X "untrap", "untrap a trapped object", dountrap, X "wipe", "wipe your face off", dowipe, X "?", "get this list of extended commands", doextlist, X NULL, NULL, donull X}; X Xchar Xunctrl(sym) Xchar sym; X{ X return (sym >= ('A' & 037) && sym <= ('Z' & 037)) ? sym + 0140 : sym; X} X Xvoid Xrhack(cmd) Xregister char *cmd; X{ X register struct func_tab *tlist = cmdlist; X boolean firsttime = FALSE; X register int res; X X if(!cmd) { X firsttime = TRUE; X flags.nopick = 0; X cmd = parse(); X } X if(*cmd == (char)033) { X flags.move = 0; X return; X } X#ifdef REDO X if (*cmd == DOAGAIN && !in_doagain && saveq[0]) { X in_doagain = TRUE; X stail = 0; X rhack(NULL); /* read and execute command */ X in_doagain = FALSE; X return; X } X /* Special case of *cmd == ' ' handled better below */ X if(!*cmd || *cmd == (char)0377) { X#else X if(!*cmd || *cmd == (char)0377 || (flags.no_rest_on_space && *cmd == ' ')){ X#endif X bell(); X flags.move = 0; X return; /* probably we just had an interrupt */ X } X if(movecmd(*cmd)) { X walk: X if(multi) flags.mv = 1; X domove(); X return; X } X if(!flags.num_pad && movecmd(lowc(*cmd))) { X flags.run = 1; X rush: X if(firsttime){ X if(!multi) multi = COLNO; X u.last_str_turn = 0; X } X flags.mv = 1; X domove(); X return; X } X if(*cmd == 'g' && movecmd(cmd[1])) { X flags.run = 2; X goto rush; X } X if(((*cmd == 'G' || (flags.num_pad && *cmd == '5')) && X movecmd(lowc(cmd[1]))) || movecmd(unctrl(*cmd))) { X flags.run = 3; X goto rush; X } X if(*cmd == 'm' && movecmd(cmd[1])) { X flags.run = 0; X flags.nopick = 1; X goto walk; X } X if(*cmd == 'M' && movecmd(lowc(cmd[1]))) { X flags.run = 1; X flags.nopick = 1; X goto rush; X } X while(tlist->f_char) { X if(*cmd == tlist->f_char){ X /* Special case of *cmd == ' ' handled here */ X if (*cmd == ' ' && flags.no_rest_on_space) X break; X X /* Now control-A can stop lengthy commands */ X /* in the PC version only -- use ^C-N otherwise */ X if (tlist->f_text && !occupation && multi) X set_occupation(tlist->f_funct, tlist->f_text, X multi); X res = (*(tlist->f_funct))(); X if(!res) { X flags.move = 0; X multi = 0; X } X return; X } X tlist++; X } X { char expcmd[10]; X register char *cp = expcmd; X while(*cmd && cp-expcmd < sizeof(expcmd)-2) { X if(*cmd >= 040 && *cmd < 0177) X *cp++ = *cmd++; X else { X *cp++ = '^'; X *cp++ = *cmd++ ^ 0100; X } X } X *cp++ = 0; X pline("Unknown command '%s'.", expcmd); X } X multi = flags.move = 0; X return; X} X Xchar Xlowc(sym) Xchar sym; X{ X return (sym >= 'A' && sym <= 'Z') ? sym+'a'-'A' : sym; X} X X/* 'rogue'-like direction commands */ Xconst char sdir[] = "hykulnjb><"; Xconst char ndir[] = "47896321><"; Xconst schar xdir[10] = { -1,-1, 0, 1, 1, 1, 0,-1, 0, 0 }; Xconst schar ydir[10] = { 0,-1,-1,-1, 0, 1, 1, 1, 0, 0 }; Xconst schar zdir[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 1,-1 }; X X#ifdef WALKIES Xint Xxytod(x, y) /* convert an x,y pair into a direction code */ Xschar x, y; X{ X register int dd; X X for(dd = 0; dd < 8; dd++) X if(x == xdir[dd] && y == ydir[dd]) return dd; X X return -1; X} X Xvoid Xdtoxy(cc,dd) /* convert a direction code into an x,y pair */ Xcoord *cc; Xregister int dd; X{ X cc->x = xdir[dd]; X cc->y = ydir[dd]; X return; X} X#endif /* WALKIES */ X Xint Xmovecmd(sym) /* also sets u.dz, but returns false for <> */ Xchar sym; X{ X register char *dp, *sdp = flags.num_pad ? ndir : sdir; X X u.dz = 0; X if(!(dp = index(sdp, sym))) return 0; X u.dx = xdir[dp-sdp]; X u.dy = ydir[dp-sdp]; X u.dz = zdir[dp-sdp]; X return !u.dz; X} X Xint Xgetdir(s) Xboolean s; X{ X char dirsym; X X#ifdef REDO X if (!in_doagain) X#endif X if(s) pline("In what direction? "); X dirsym = readchar(); X#ifdef REDO X savech(dirsym); X#endif X if(dirsym == '.' || dirsym == 's') X u.dx = u.dy = u.dz = 0; X else if(!movecmd(dirsym) && !u.dz) { X if(!index(quitchars, dirsym)) X pline("What a strange direction!"); X return 0; X } X if(!u.dz && (Stunned || (Confusion && !rn2(5)))) confdir(); X return 1; X} X Xvoid Xconfdir() X{ X register int x = rn2(8); X u.dx = xdir[x]; X u.dy = ydir[x]; X return; X} X Xint Xisok(x,y) Xregister int x, y; X{ X /* x corresponds to curx, so x==1 is the first column. Ach. %% */ X return x >= 1 && x <= COLNO-1 && y >= 0 && y <= ROWNO-1; X} END_OF_FILE if test 17734 -ne `wc -c <'src/cmd.c'`; then echo shar: \"'src/cmd.c'\" unpacked with wrong size! fi # end of 'src/cmd.c' fi if test -f 'src/pray.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/pray.c'\" else echo shar: Extracting \"'src/pray.c'\" \(33283 characters\) sed "s/^X//" >'src/pray.c' <<'END_OF_FILE' X/* SCCS Id: @(#)pray.c 3.0 89/01/10 X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X/* NetHack may be freely redistributed. See license for details. */ X X#include "hack.h" X X#ifdef THEOLOGY X X#define ALIGNLIM (5L + (moves/200L)) X Xstruct ghods { X X char classlet; X char *law, *balance, *chaos; X} gods[] = { X X'A', /* Central American */ "Quetzalcotl", "Camaxtli", "Huhetotl", X'B', /* Celtic */ "Nuada", "Dagda", "Morrigan", X'C', /* Babylonian */ "Anu", "Ishtar", "Anshar", X'E', /* Elven */ "Solonor Thelandira", X "Aerdrie Faenya", "Erevan Ilesere", X'H', /* Greek */ "Athena", "Hermes", "Poseidon", X'K', /* Celtic */ "Lugh", "Brigit", "Macannan Mac Lir", X#ifdef NAMED_ITEMS X/* It'd look funny if someone got a sword to steal souls for Arioch but Arioch X * goes with the wrong character class... X */ X'P', /* Hyborian */ "Mitra", "Crom", "Set", X#else X'P', /* Melnibonean */ "Donblas", "Grome", "Arioch", X#endif X'R', /* Nehwon */ "Votishal", "Death", "Rat God", X'S', /* Japanese */ "Amaterasu Omikami", "Raiden", "Susanowo", X'T', /* Chinese */ "Shan Lai Ching", "Chih Sung-tzu", "Huan Ti", X'V', /* Norse */ "Tyr", "Balder", "Loki", X'W', /* Egyptian */ "Ptah", "Thoth", "Anhur", X0,0,0,0 X}; X X#define TROUBLE_STONED 1 X#define TROUBLE_STRANGLED 2 X#define TROUBLE_SICK 3 X#define TROUBLE_STARVING 4 X#define TROUBLE_HIT 5 X#define TROUBLE_STUCK_IN_WALL 6 X X#define TROUBLE_PUNISHED (-1) X#define TROUBLE_LYCANTHROPE (-2) X#define TROUBLE_CURSED_ITEMS (-3) X#define TROUBLE_HUNGRY (-4) X#define TROUBLE_POISONED (-5) X#define TROUBLE_HALLUCINATION (-6) X#define TROUBLE_BLIND (-7) X#define TROUBLE_WOUNDED_LEGS (-8) X#define TROUBLE_STUNNED (-9) X#define TROUBLE_CONFUSED (-10) X X/* We could force rehumanize of polyselfed people, but we can't tell X unintentional shape changes from the other kind. Oh well. */ X X/* Return 0 if nothing particular seems wrong, positive numbers for X serious trouble, and negative numbers for comparative annoyances. This X returns the worst problem. There may be others, and the gods may fix X more than one. X XThis could get as bizarre as noting surrounding opponents, (or hostile dogs), Xbut that's really hard. X */ X X#define ugod_is_angry() (u.ualign < 0) X#ifdef ALTARS X#define on_altar() IS_ALTAR(levl[u.ux][u.uy].typ) X#define on_shrine() ((levl[u.ux][u.uy].altarmask & A_SHRINE) != 0) X#endif X Xstatic int Xin_trouble() X{ X register struct obj *otmp; X int i, j, count=0; X X/* Borrowed from eat.c */ X X#define SATIATED 0 X#define NOT_HUNGRY 1 X#define HUNGRY 2 X#define WEAK 3 X#define FAINTING 4 X#define FAINTED 5 X#define STARVED 6 X X if(Stoned) return(TROUBLE_STONED); X if(Strangled) return(TROUBLE_STRANGLED); X if(Sick) return(TROUBLE_SICK); X if(u.uhs >= WEAK) return(TROUBLE_STARVING); X if(u.uhp < 5 || (u.uhp*7 < u.uhpmax)) return(TROUBLE_HIT); X for (i= -1; i<=1; i++) for(j= -1; j<=1; j++) { X if (!i && !j) continue; X if (!isok(u.ux+i, u.uy+j) || IS_ROCK(levl[u.ux+i][u.uy+j].typ)) X count++; X } X if(count==8 X#ifdef POLYSELF X && !passes_walls(uasmon) X#endif X ) return(TROUBLE_STUCK_IN_WALL); X if(Punished) return(TROUBLE_PUNISHED); X#ifdef POLYSELF X if(u.ulycn >= 0) return(TROUBLE_LYCANTHROPE); X#endif X for(otmp=invent; otmp; otmp=otmp->nobj) X if((otmp->otyp==LOADSTONE || otmp->otyp==LUCKSTONE) && X otmp->cursed) X return(TROUBLE_CURSED_ITEMS); X if((uarmh && uarmh->cursed) || /* helmet */ X (uarms && uarms->cursed) || /* shield */ X (uarmg && uarmg->cursed) || /* gloves */ X (uarm && uarm->cursed) || /* armor */ X (uarmc && uarmc->cursed) || /* cloak */ X (uarmf && uarmf->cursed) || /* boots */ X#ifdef SHIRT X (uarmu && uarmu->cursed) || /* shirt */ X#endif X (uwep && (uwep->olet == WEAPON_SYM || uwep->otyp==PICK_AXE X || uwep->otyp==TIN_OPENER || uwep->otyp==HEAVY_IRON_BALL) && X (uwep->cursed)) || X (uleft && uleft->cursed) || X (uright && uright->cursed) || X (uamul && uamul->cursed) || X (ublindf && ublindf->cursed)) X X return(TROUBLE_CURSED_ITEMS); X X if(u.uhs >= HUNGRY) return(TROUBLE_HUNGRY); X for(i=0; i<A_MAX; i++) X if(ABASE(i) < AMAX(i)) return(TROUBLE_POISONED); X if(Hallucination) return(TROUBLE_HALLUCINATION); X if(Blinded > 1) return(TROUBLE_BLIND); X if(Wounded_legs) return (TROUBLE_WOUNDED_LEGS); X if(HStun) return (TROUBLE_STUNNED); X if(HConfusion) return (TROUBLE_CONFUSED); X X return(0); X} X Xstatic void Xfix_worst_trouble(trouble) Xregister int trouble; X{ X int i; X u.ublesscnt += rnz(100); X switch (trouble) { X case TROUBLE_STONED: X You("feel more limber."); X Stoned = 0; X break; X case TROUBLE_STRANGLED: X You("can breathe again."); X Strangled = 0; X break; X case TROUBLE_HUNGRY: X case TROUBLE_STARVING: X Your("stomach feels content."); X init_uhunger (); X losestr(-1); X flags.botl = 1; X break; X case TROUBLE_SICK: X You("feel better."); X make_sick(0L,FALSE); X break; X case TROUBLE_HIT: X if (!Blind) { X const char *tmp = Hallucination ? hcolor() : golden; X pline("A%s %s glow surrounds you.", X index(vowels,*tmp) ? "n" : "", tmp); X } else You("feel much better."); X u.uhp = u.uhpmax += 5; X flags.botl = 1; X break; X case TROUBLE_STUCK_IN_WALL: X Your("surroundings change."); X tele(); X break; X case TROUBLE_PUNISHED: X Your("chain disappears."); X unpunish(); X break; X#ifdef POLYSELF X case TROUBLE_LYCANTHROPE: X You("feel purified."); X if(uasmon == &mons[u.ulycn] && !Polymorph_control) X rehumanize(); X u.ulycn = -1; /* now remove the curse */ X break; X#endif X case TROUBLE_CURSED_ITEMS: X { struct obj *otmp; X char * what; X otmp = (struct obj *)0; X what = NULL; X if (uarmh && uarmh->cursed) /* helmet */ X otmp = uarmh; X else if (uarms && uarms->cursed) /* shield */ X otmp = uarms; X else if (uarmg && uarmg->cursed) /* gloves */ X otmp = uarmg; X else if (uarm && uarm->cursed) /* armor */ X otmp = uarm; X else if (uarmc && uarmc->cursed) /* cloak */ X otmp = uarmc; X else if (uarmf && uarmf->cursed) /* boots */ X otmp = uarmf; X#ifdef SHIRT X else if (uarmu && uarmu->cursed) /* shirt */ X otmp = uarmu; X#endif X else if (uleft && uleft->cursed) { X otmp = uleft; X what = "left ring softly glows"; X } else if (uright && uright->cursed) { X otmp = uright; X what = "right ring softly glows"; X } else if (uamul && uamul->cursed) /* amulet */ X otmp = uamul; X else if (ublindf && ublindf->cursed) /* blindfold */ X otmp = ublindf; X else if (welded(uwep)) otmp = uwep; X else { X for(otmp=invent; otmp; otmp=otmp->nobj) X if ((otmp->otyp==LOADSTONE || X otmp->otyp==LUCKSTONE) && otmp->cursed) X break; X } X X otmp->cursed = 0; X otmp->bknown = 1; X if (!Blind) X Your("%s %s.", X what ? what : aobjnam (otmp, "softly glow"), X Hallucination ? hcolor() : amber); X break; X } X case TROUBLE_HALLUCINATION: X pline ("Looks like you are back in Kansas."); X make_hallucinated(0L,FALSE); X break; X case TROUBLE_BLIND: X pline ("Your %s feel better.", makeplural(body_part(EYE))); X make_blinded(0L,FALSE); X break; X case TROUBLE_POISONED: X if (Hallucination) X pline("There's a tiger in your tank."); X else X You("feel in good health again."); X for(i=0; i<A_MAX; i++) { X if(ABASE(i) < AMAX(i)) { X ABASE(i) = AMAX(i); X flags.botl = 1; X } X } X break; X case TROUBLE_WOUNDED_LEGS: X heal_legs(); X break; X case TROUBLE_STUNNED: X make_stunned(0L,TRUE); X break; X case TROUBLE_CONFUSED: X make_confused(0L,TRUE); X break; X } X} X Xstatic void Xangrygods() { X register int tmp; X X u.ublessed = 0; X X /* changed from tmp = u.ugangr + abs (u.uluck) -- rph */ X tmp = 3*u.ugangr + X (u.uluck > 0 || u.ualign > 3 ? -u.uluck/3 : -u.uluck); X if (tmp < 0) tmp = 0; /* possible if bad alignment but good luck */ X tmp = (tmp > 15 ? 15 : tmp); /* lets be a little reasonable */ X switch (tmp ? rn2(tmp): 0) { X X case 0: X case 1: if (Hallucination) X You("feel %sholy dread.", X u.ualigntyp == U_CHAOTIC ? "an un" : "a "); X else You("feel that %s is %s.", X# ifdef ALTARS X on_altar() ? a_gname() : u_gname(), X# else X u_gname(), X# endif X u.ualigntyp == U_NEUTRAL ? "offended" : "angry"); X break; X case 2: X case 3: X# ifdef POLYSELF X pline("A voice booms out: \"Thou %s, %s.\"", X ugod_is_angry() ? "hast strayed from the path" : X "art arrogant", X u.usym == S_HUMAN ? "mortal" : "creature"); X# else X pline("A voice booms out: \"Thou %s, mortal.\"", X ugod_is_angry() ? "hast strayed from the path" : X "art arrogant"); X# endif X pline("\"Thou must relearn thy lessons!\""); X adjattrib(A_WIS, -1, FALSE); X if (u.ulevel > 1) { X losexp(); X if(u.uhp < 1) u.uhp = 1; X if(u.uhpmax < 1) u.uhpmax = 1; X } else { X u.uexp = 0; X flags.botl = 1; X } X break; X case 6: if (!Punished) { X punish((struct obj *)0); X break; X } /* else fall thru */ X case 4: X case 5: if (!Blind) { X const char *temp = Hallucination ? hcolor() : black; X pline("A%s %s glow surrounds you.", X index(vowels,*temp) ? "n" : "", temp); X } X rndcurse(); X break; X case 7: X case 8: pline("A voice booms out: \"Thou durst call upon me?\""); X# ifdef POLYSELF X pline("\"Then die, %s!\"", X u.usym == S_HUMAN ? "mortal" : "creature"); X# else X pline("\"Then die, mortal!\""); X# endif X (void) makemon(&mons[ndemon()], u.ux, u.uy); X break; X X default: pline("Suddenly, a bolt of lightning strikes you!"); X if (Reflecting) { X shieldeff(u.ux, u.uy); X if (Blind) X pline("For some reason you're unaffected."); X else { X if (Reflecting & W_AMUL) { X pline("It reflects from your medallion."); X#if defined(EXPLORE_MODE) || defined(WIZARD) X makeknown(AMULET_OF_REFLECTION); X#endif X } else { X pline("It reflects from your shield."); X /* No ifdef here since they could survive with an amulet of X * life saving which wasn't possible above. X */ X makeknown(SHIELD_OF_REFLECTION); X } X } X You("hear a cosmic sigh, and sense a decision being made."); X pline("A wide-angle disintegration beam hits you!"); X goto ohno; X } else if (Shock_resistance) { X shieldeff(u.ux, u.uy); X pline("It seems not to affect you."); X pline("However, the ensuing disintegration beam does."); Xohno: X if (Disint_resistance) { X You("bask in the disintegration beam for a minute..."); X pline("A voice rings out: \"I believe it not!\""); X break; X } X } X You("fry to a crisp."); X killer = "holy wrath"; X done("died"); X break; X } X u.ublesscnt = rnz(300); X return; X} X Xstatic void Xpleased() { X char *tmp; X int trouble = in_trouble (); /* what's your worst difficulty? */ X int pat_on_head = 0; X X if (u.ugangr > 0) u.ugangr--; X You("feel that %s is pleased.", X#ifndef ALTARS X u_gname()); X#else X on_altar() ? a_gname() : u_gname()); X X /* not your deity */ X if (on_altar() && X (levl[u.ux][u.uy].altarmask & ~A_SHRINE) != u.ualigntyp + 1) { X adjalign(-1); X return; X } else if (u.ualign < 2) adjalign(1); X#endif X X X /* depending on your luck, the gods will: X - fix your worst problem if it's major. X - fix all your major problems. X - fix your worst problem if it's minor. X - fix all of your problems. X - do you a gratuitous favor. X X if you make it to the the last category, you roll randomly again X to see what they do for you. X X If your luck is at least 0, then you are guaranteed rescued X from your worst major problem. */ X X if (!trouble) pat_on_head = 1; X else { X#ifdef ALTARS X int action = rn1(on_altar() ? 3 + on_shrine() : 2, u.uluck+1); X X if (!on_altar()) action = max(action,2); X#else X int action = rn1(4,u.uluck+1); X#endif X X switch(min(action,5)) { X case 5: pat_on_head = 1; X case 4: do fix_worst_trouble(trouble); X while(trouble = in_trouble()); X break; X X case 3: fix_worst_trouble(trouble); X case 2: while((trouble = in_trouble()) > 0) X fix_worst_trouble(trouble); X break; X X case 1: if (trouble > 0) fix_worst_trouble(trouble); X } X } X X if(pat_on_head) X switch(rn2((u.uluck + 6)>>1)) { X X case 0: break; X case 1: X if(uwep && (uwep->olet == WEAPON_SYM || uwep->otyp X == PICK_AXE) && (!uwep->blessed)) { X if (uwep->cursed) { X uwep->cursed = 0; X uwep->bknown = 1; X if (!Blind) X Your("%s %s.", X aobjnam(uwep, "softly glow"), X Hallucination ? hcolor() : amber); X } else if(uwep->otyp < BOW) { X uwep->blessed = uwep->bknown = 1; X if (!Blind) { X tmp = Hallucination ? hcolor() : light_blue; X Your("%s with a%s %s aura.", X aobjnam(uwep, "softly glow"), X index(vowels,*tmp) ? "n" : "", tmp); X } X } X } X break; X case 3: X#if defined(STRONGHOLD) && defined(MUSIC) X /* takes 2 hints to get the music to enter the Stronghold */ X if (flags.soundok) { X if(music_heard < 1) { X pline("A voice booms out: \"Hark, mortal!\""); X verbalize("To enter the castle, thou must play the right tune!"); X music_heard++; X break; X } else if (music_heard < 2) { X You("hear a divine music..."); X pline("It sounds like: \"%s\".", tune); X music_heard++; X break; X } X } X /* Otherwise, falls into next case */ X#endif X case 2: if (!Blind) { X tmp = Hallucination ? hcolor() : golden; X You("are surrounded by a%s %s glow.", X index(vowels,*tmp) ? "n" : "", tmp); X } X u.uhp = u.uhpmax += 5; X ABASE(A_STR) = AMAX(A_STR); X if (u.uhunger < 900) init_uhunger(); X if (u.uluck < 0) u.uluck = 0; X make_blinded(0L,TRUE); X flags.botl = 1; X break; X case 4: X { register struct obj *otmp; X X tmp = Hallucination ? hcolor() : light_blue; X if (Blind) X You("feel the power of %s.", u_gname()); X else You("are surrounded by a%s %s aura.", X index(vowels,*tmp) ? "n" : "", tmp); X for(otmp=invent; otmp; otmp=otmp->nobj) { X if (otmp->cursed) { X otmp->cursed = 0; X if (!Blind) X Your("%s %s.", X aobjnam(otmp, "softly glow"), X Hallucination ? hcolor() : amber); X } X } X break; X } X case 5: pline("A voice booms out: \"Thou hast pleased me with thy progress,\""); X pline("\"and thus I grant thee the gift of "); X if (!(HTelepat & INTRINSIC)) { X HTelepat |= INTRINSIC; X addtopl("Telepathy!\""); X } else if (!(Fast & INTRINSIC)) { X Fast |= INTRINSIC; X addtopl("Speed!\""); X } else if (!(Stealth & INTRINSIC)) { X Stealth |= INTRINSIC; X addtopl("Stealth!\""); X } else { X if (!(Protection & INTRINSIC)) { X Protection |= INTRINSIC; X if (!u.ublessed) u.ublessed = rnd(3) + 1; X } else u.ublessed++; X addtopl("our protection!\""); X } X pline ("\"Use it wisely in my name!\""); X break; X X case 7: X#ifdef ELBERETH X if (u.ualign > 3 && !u.uhand_of_elbereth) { X u.uhand_of_elbereth = TRUE; X HSee_invisible |= INTRINSIC; X HFire_resistance |= INTRINSIC; X HCold_resistance |= INTRINSIC; X HPoison_resistance |= INTRINSIC; X if (u.ualigntyp != U_CHAOTIC) { X pline("A voice booms out: \"I crown thee...\""); X pline("\"The Hand of Elbereth!\""); X#ifdef NAMED_ITEMS X if(uwep && (uwep->otyp == LONG_SWORD)) { X bless(uwep); X uwep->bknown = 1; X uwep->rustfree = 1; X (void)oname(uwep, "Excalibur", 1); X } X#endif X } else { X register struct obj *obj; X pline("A voice booms out: \"Thou art chosen to steal souls for Arioch!\""); X /* This does the same damage as Excalibur. X * Disadvantages: doesn't do bonuses to undead; X * doesn't aid searching. X * Advantages: part of that bonus is a level X * drain. X * Disadvantage: player cannot start with a X * +5 weapon and turn it into a Stormbringer. X * Advantage: they don't need to already have a X * sword of the right type to get it... X */ X if (Blind) X pline("Something appears at your %s.", X makeplural(body_part(FOOT))); X else X pline("A %s sword appears at your %s!", X Hallucination ? hcolor() : "black", X makeplural(body_part(FOOT))); X obj = mksobj(BROADSWORD, FALSE); X obj = oname(obj, "Stormbringer", 0); X obj->rustfree = 1; X obj->cursed = 0; X obj->blessed = 1; X /* Why bless it? Why not. After all, chaotic gods X * will bless regular weapons. And blessed really X * means given sanctified to a deity, which is certainly X * sensible even for Stormbringer and a chaotic deity... X */ X obj->spe = 1; X dropy(obj); X } X break; X } X#endif X X case 6: pline ("An object appears at your %s!", X makeplural(body_part(FOOT))); X#ifdef SPELLS X (void) mkobj_at(SPBOOK_SYM, u.ux, u.uy); X#else X (void) mkobj_at(SCROLL_SYM, u.ux, u.uy); X#endif X break; X X default: impossible("Confused deity!"); X break; X } X u.ublesscnt = rnz(350); X#ifdef HARD X# ifndef ELBERETH X u.ublesscnt += (u.udemigod * rnz(1000)); X# else X u.ublesscnt += ((u.udemigod + u.uhand_of_elbereth) * rnz(1000)); X# endif X#endif X return; X} X Xstatic void Xgods_upset() X{ X#ifdef HARD X u.ugangr++; X angrygods(); X#else X if (u.ugangr++) angrygods(); X else { /* exactly one warning */ X#ifdef ALTARS X pline("The voice of %s booms out: \"Thou hast angered me.\"", X a_gname()); X#else X pline("A voice booms out: \"Thou hast angered me.\""); X#endif X pline("\"Disturb me again at thine own risk!\""); X } X#endif X} X X#ifdef ENDGAME Xstatic const char sacrifice_types[] = { FOOD_SYM, AMULET_SYM, 0 }; X#endif X Xstatic void Xconsume_offering(otmp) Xregister struct obj *otmp; X{ X if (Hallucination) X pline ("Your sacrifice sprouts wings and a propeller and roars away!"); X else pline ("Your sacrifice is consumed in a %s!", X u.ualigntyp == U_LAWFUL ? "flash of light" : "burst of flame"); X useup(otmp); X} X Xint Xdosacrifice() X{ X register struct obj *otmp; X int value = 0; X X#ifdef ALTARS X if (!on_altar()) { X You("are not standing on an altar."); X return 0; X } X#endif /* ALTARS /**/ X X#ifdef ENDGAME X if (dlevel == ENDLEVEL) { X if (!(otmp = getobj(sacrifice_types, "sacrifice"))) return 0; X } else X if (!(otmp = floorfood("sacrifice", 0))) return 0; X#else X if (!(otmp = floorfood("sacrifice", 0))) return 0; X#endif X/* X Was based on nutritional value and aging behavior (< 50 moves). X Sacrificing a food ration got you max luck instantly, making the X gods as easy to please as an angry dog! X X Now only accepts corpses, based on their level (presumably, how hard X they were to kill). Human sacrifice, as well as sacrificing unicorns X of your alignment, is strongly discouraged. (We can't tell whether a dog X corpse was tame, so you can still sacrifice it.) X */ X X#define MAXVALUE 17 /* Highest corpse value */ X X if (otmp->otyp == CORPSE) { X register struct permonst *mtmp = &mons[otmp->corpsenm]; X X if (otmp->corpsenm == PM_ACID_BLOB || (moves <= otmp->age + 50)) X value = mtmp->mlevel + 1; /* only fresh kills */ X X if (is_human(mtmp)) { /* Human sacrifice! */ X#ifdef POLYSELF X if (is_demon(uasmon)) X You("find the idea very satisfying."); X else X#endif X if (u.ualigntyp != U_CHAOTIC) X pline("You'll regret this infamous offense!"); X#ifdef ALTARS X if (levl[u.ux][u.uy].altarmask & ~A_SHRINE) { X /* curse the lawful/neutral altar */ X pline("The altar is stained with human blood."); X levl[u.ux][u.uy].altarmask = A_CHAOS; X angry_priest(); X } else { X register struct monst *dmon; X const char *color = Hallucination ? hcolor() : black; X /* Human sacrifice on a chaotic altar is equivalent to demon summoning */ X pline("The blood floods over the altar, which vanishes in a%s %s cloud!", X index(vowels, *color) ? "n" : "", color); X levl[u.ux][u.uy].typ = ROOM; X if(Invisible) newsym(u.ux, u.uy); X if(dmon = makemon(&mons[dlord()], u.ux, u.uy)) { X You("have summoned a demon lord!"); X if (u.ualigntyp == U_CHAOTIC) X dmon->mpeaceful = 1; X You("are terrified, and unable to move."); X nomul(-3); X } else pline("The cloud dissipates."); X } X#endif X if (u.ualigntyp != U_CHAOTIC) { X adjalign(-5); X u.ugangr += 3; X adjattrib(A_WIS, -1, TRUE); X if (!Inhell) angrygods(); X change_luck(-5); X } else adjalign(5); X useup(otmp); X return(1); X } else if (is_undead(mtmp)) { /* Not demons--no demon corpses */ X if (u.ualigntyp != U_CHAOTIC) X value += 1; X } else if (mtmp->mlet == S_UNICORN) { X int unicalign; X X if (mtmp == &mons[PM_BLACK_UNICORN]) unicalign = -1; X else if (mtmp == &mons[PM_GREY_UNICORN]) unicalign = 0; X else if (mtmp == &mons[PM_WHITE_UNICORN]) unicalign = 1; X if (unicalign == u.ualigntyp) { X pline("Such an action is an insult to %s!", (unicalign== -1) X ? "chaos" : unicalign ? "law" : "neutrality"); X adjattrib(A_WIS, -1, TRUE); X value = -5; X } else if ((unicalign == -u.ualigntyp) || X (!u.ualigntyp && unicalign)) { X if (u.ualign < ALIGNLIM) X You("feel stridently %s!", (u.ualigntyp== U_CHAOTIC) ? X "chaotic" : u.ualigntyp ? "lawful" : "neutral"); X else You("feel you are thoroughly on the right path."); X u.ualign = ALIGNLIM; X value += 3; X } X } X } X#ifdef ENDGAME X if (otmp->otyp == AMULET_OF_YENDOR) { X if (dlevel != ENDLEVEL) { X if (otmp->spe == 0) { X if (Hallucination) X You("feel homesick."); X else X You("feel an urge to return to the surface."); X return (1); X } X } else X if (otmp->spe < 0) { /* fake! */ X if (flags.soundok) X You("hear a nearby thunderclap."); X if (!otmp->known) { X You("realize you have made a %s.", X Hallucination ? "boo-boo" : "mistake"); X otmp->known = 1; X return (1); X } else { X /* don't you dare try to fool the gods */ X change_luck(-3); X u.ugangr += 3; X value = -3; X } X } X else { X /* The final Test. Did you win? */ X if(uamul && uamul->otyp == otmp->otyp) Amulet_off(); X useup(otmp); /* well, it's gone now */ X You("offer the Amulet to %s...", a_gname()); X if (u.ualigntyp != X (levl[u.ux][u.uy].altarmask & ~A_SHRINE) - 1) { X /* And the opposing team picks him up and X carries him off on their shoulders */ X pline("%s accepts your gift, and gains dominion over %s...", X a_gname(), u_gname()); X pline("%s is enraged...", u_gname()); X pline("Fortunately, %s permits you to live...", a_gname()); X pline("A cloud of %s smoke surrounds you...", X Hallucination ? hcolor() : "orange"); X done("escaped"); X } else { /* super big win */ X pline("An invisible choir sings, and you are bathed in radiance..."); X pline("\"Congratulations, mortal! In return for thy service,"); X pline("\"I grant thee the gift of Immortality!\""); X You("ascend to the status of Demigod..."); X done("ascended"); X } X } X } X#endif /* ENDGAME */ X X#ifndef ALTARS /* No altars in shops */ X if (otmp->unpaid && u.ualigntyp != U_CHAOTIC) { X You("realize sacrificing what is not yours is a very chaotic act."); X value = -3; X } X#endif X X if (value == 0 X#ifndef ALTARS X || Inhell X#endif X ) { X pline(nothing_happens); X return (1); X } X X if (value < 0) /* I don't think the gods are gonna like this... */ X gods_upset(); X else { X X int saved_anger = u.ugangr; X int saved_cnt = u.ublesscnt; X int saved_luck = u.uluck; X boolean consumed = FALSE; X#ifdef ALTARS X /* Sacrificing at an altar of a different alignment */ X if (u.ualigntyp != (levl[u.ux][u.uy].altarmask & ~A_SHRINE) - 1) { X /* Is this a conversion ? */ X if(ugod_is_angry()) { X if(u.ualignbase[0] == u.ualignbase[1]) { X consume_offering(otmp); X You("have a strong feeling that %s is angry...", X u_gname()); X pline("%s accepts your allegiance.",a_gname()); X You("have a sudden sense of a new direction."); X /* The player wears a helm of opposite alignment? */ X if (uarmh && uarmh->otyp == HELM_OF_OPPOSITE_ALIGNMENT) X u.ualignbase[0] = X (levl[u.ux][u.uy].altarmask & ~A_SHRINE) - 1; X else X u.ualigntyp = u.ualignbase[0] = X (levl[u.ux][u.uy].altarmask & ~A_SHRINE) - 1; X flags.botl = 1; X /* Beware, Conversion is costly */ X change_luck(-3); X u.ublesscnt += 300; X adjalign((int)(u.ualignbase[1] * (ALIGNLIM / 2))); X } else { X pline("%s rejects your sacrifice!",a_gname()); X pline("The voice of %s booms: \"Suffer, infidel!\"", X u_gname()); X adjalign(-5); X u.ugangr += 3; X adjattrib(A_WIS, -2, TRUE); X if (!Inhell) angrygods(); X change_luck(-5); X } X return(1); X } else { X consume_offering(otmp); X consumed = TRUE; X You("sense a conflict between %s and %s.", X u_gname(), a_gname()); X if (rn2(8 + (int)u.ulevel) > 5) { X You("feel the power of %s increase.", X u_gname()); X change_luck(1); X levl[u.ux][u.uy].altarmask &= A_SHRINE; X /* the following accommodates stupid compilers */ X levl[u.ux][u.uy].altarmask = X levl[u.ux][u.uy].altarmask | (u.ualigntyp + 1); X if (!Blind) X pline("The newly consecrated altar glows %s.", X Hallucination ? hcolor() : X u.ualigntyp == U_LAWFUL ? white : X u.ualigntyp ? black : "gray"); X } else { X pline("Unluckily, you feel the power of %s decrease.", X u_gname()); X change_luck(-1); X } X return(1); X } X } X#endif X if(!consumed) consume_offering(otmp); X /* OK, you get brownie points. */ X if(u.ugangr) { X u.ugangr -= ((value * (u.ualigntyp == U_CHAOTIC ? 2 : 3)) / MAXVALUE); X if(u.ugangr < 0) u.ugangr = 0; X if(u.ugangr != saved_anger) { X if (u.ugangr) { X if(Hallucination) X pline("The gods seem %s.", hcolor()); X else pline("The gods seem slightly mollified."); X X if ((int)u.uluck < 0) change_luck(1); X } else { X if (Hallucination) X pline("The gods seem cosmic (not a new fact)."); X else pline ("The gods seem mollified."); X X if ((int)u.uluck < 0) u.uluck = 0; X } X } else { /* not satisfied yet */ X if (Hallucination) X pline("The gods seem tall."); X else You("have a feeling of inadequacy."); X } X } X else if (u.ublesscnt > 0) { X u.ublesscnt -= ((value * (u.ualigntyp == U_CHAOTIC ? 500 : 300)) X / MAXVALUE); X if(u.ublesscnt < 0) u.ublesscnt = 0; X if(u.ublesscnt != saved_cnt) { X X if (u.ublesscnt) { X if (Hallucination) X You("realize that the gods are not like you and I."); X else X You("have a hopeful feeling."); X if ((int)u.uluck < 0) change_luck(1); X } else { X if (Hallucination) X pline("Overall, there is a smell of fried onions."); X else X You("have a feeling of reconciliation."); X if ((int)u.uluck < 0) u.uluck = 0; X } X } X } else { X /* you were already in pretty good standing */ X#if defined(ALTARS) && defined(NAMED_ITEMS) X /* The player can gain an artifact */ X if(!rn2(10)) { X otmp = mk_aligned_artifact((int)(levl[u.ux][u.uy].altarmask & ~A_SHRINE) - 1); X if(otmp) { X dropy(otmp); X pline("An object appears at your %s!", X makeplural(body_part(FOOT))); X return(1); X } X } X#endif X change_luck((value * LUCKMAX) / (MAXVALUE * 2)); X if (u.uluck != saved_luck) { X You(Hallucination ? X "see crabgrass at your %s. A funny thing in a dungeon." : X "glimpse a four-leaf clover at your %s.", X makeplural(body_part(FOOT))); X } X } X } X return(1); X} X Xint Xdopray() { /* M. Stephenson (1.0.3b) */ X int trouble = in_trouble(); X#ifdef ALTARS X int aligntyp = X on_altar() ? X (int)(levl[u.ux][u.uy].altarmask & ~A_SHRINE) - 1 : X u.ualigntyp; X int align; X X if (u.ualigntyp && u.ualigntyp == -aligntyp) align = -u.ualign; X /* Opposite alignment altar */ X else if (u.ualigntyp != aligntyp) align = u.ualign / 2; X /* Different (but non-opposite) alignment altar */ X else align = u.ualign; X#else X int aligntyp = u.ualigntyp; X int align = u.ualign; X#endif X X#ifdef POLYSELF X if (is_undead(uasmon)) { X if (aligntyp == 1 || (aligntyp == 0 && !rn2(10))) { X pline(aligntyp == 1 ? X "\"Vile creature, thou durst call upon me?\"" : X "\"Walk no more, perversion of nature!\""); X You("feel like you are falling apart."); X rehumanize(); X losehp(rnd(20), "residual undead turning effect"); X return(1); X } X } X if (is_demon(uasmon) && (aligntyp != -1)) { X pline("The very idea of praying to a %s god is repugnant to you.", X u.ualigntyp ? "lawful" : "neutral"); X return(0); X } X#endif X if (Inhell && u.ualigntyp != U_CHAOTIC) { X pline("Since you are in hell, %s won't help you.", X# ifdef ALTARS X on_altar() ? a_gname() : X# endif X u_gname()); X aggravate(); X return(0); X } X X#ifdef WIZARD X if (wizard) { X pline("Force the gods to be pleased? "); X if (yn() == 'y') { X u.ublesscnt = 0; X if (u.uluck < 0) u.uluck = 0; X u.ugangr = 0; X if (align < 1) align = 1; X } X } X#endif X if ((!trouble && (u.ublesscnt > 0)) || X ((trouble < 0) && (u.ublesscnt > 100)) /* minor difficulties */ || X ((trouble > 0) && (u.ublesscnt > 200)) /* big trouble */ X ) { X u.ublesscnt += rnz(250); X change_luck(-3); X gods_upset(); X } else if ((int)u.uluck < 0 || u.ugangr || align < 0) X angrygods(); /* naughty */ X else if (align >= 0) pleased(); /* nice */ X nomovemsg = "You finish your prayer."; X nomul(-3); X return(1); X} X#endif /* THEOLOGY */ X Xint Xdoturn() X{ /* Knights & Priest(esse)s only please */ X X register struct monst *mtmp; X register int xlev = 6; X X if((pl_character[0] != 'P') && X (pl_character[0] != 'K')) { X X You("don't know how to turn undead!"); X return(0); X } X#if defined(POLYSELF) || defined(THEOLOGY) X if ( X# ifdef POLYSELF X (u.ualigntyp != U_CHAOTIC && (is_demon(uasmon) || is_undead(uasmon))) X# endif X# if defined(POLYSELF) && defined(THEOLOGY) X || X# endif X# ifdef THEOLOGY X u.ugangr > 6 /* "Die, mortal!" */ X# endif X ) { X X pline("For some reason, the gods seem not to listen to you."); X aggravate(); X return(0); X } X#endif X if (Inhell && u.ualigntyp != U_CHAOTIC) { X#ifdef THEOLOGY X pline("Since you are in hell, %s won't help you.", u_gname()); X#else X pline("Since you are in hell, the gods won't help you."); X#endif X aggravate(); X return(0); X } X#ifdef THEOLOGY X pline("Calling upon %s, you chant an arcane formula.", u_gname()); X#else X pline("Calling upon the gods, you chant an arcane formula."); X#endif X for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) X if(cansee(mtmp->mx,mtmp->my)) { X if(!mtmp->mtame && !mtmp->mpeaceful && (is_undead(mtmp->data) || X (is_demon(mtmp->data) && (u.ulevel > (MAXULEV/2))))) { X X if(Confusion) { X pline("Unfortunately, your voice falters."); X mtmp->mflee = mtmp->mfroz = mtmp->msleep = 0; X } else if (! resist(mtmp, '\0', 0, TELL)) X switch (mtmp->data->mlet) { X /* this is intentional, lichs are tougher X than zombies. */ X case S_LICH: xlev += 2; X case S_GHOST: xlev += 2; X case S_VAMPIRE: xlev += 2; X case S_WRAITH: xlev += 2; X case S_MUMMY: xlev += 2; X case S_ZOMBIE: X mtmp->mflee = 1; /* at least */ X if(u.ulevel >= xlev) { X if(!resist(mtmp, '\0', 0, NOTELL)) { X if(u.ualigntyp == U_CHAOTIC) { X mtmp->mpeaceful = 1; /* make them friendly */ X } else { /* damn them */ X You("destroy %s!", mon_nam(mtmp)); X mondied(mtmp); X } X } X } X break; X default: mtmp->mflee = 1; X break; X } X } X } X nomul(-5); X return(1); X} X X#ifdef ALTARS Xchar * Xa_gname() X{ X return(a_gname_at(u.ux, u.uy)); X} X Xchar * Xa_gname_at(x,y) /* returns the name of an altar's deity */ Xxchar x, y; X{ X register int align; X X if(!IS_ALTAR(levl[x][y].typ)) return((char *)0); X X align = levl[x][y].altarmask & ~A_SHRINE; X# ifdef THEOLOGY X {struct ghods *aghod; X X for(aghod=gods; aghod->classlet; aghod++) X if(aghod->classlet == pl_character[0]) X switch(align) { X case A_CHAOS: return(aghod->chaos); X case A_NEUTRAL: return(aghod->balance); X case A_LAW: return(aghod->law); X default: impossible("unknown altar alignment."); X return("Balance"); X } X impossible("Altar to unknown character's god?"); X return("someone"); X } X# else X switch(align) { X case A_CHAOS: return("Chaos"); X case A_NEUTRAL: return("Balance"); X case A_LAW: return("Law"); X default: impossible("unknown altar alignment."); X return("Balance"); X } X# endif /* THEOLOGY */ X} X X# ifdef THEOLOGY Xvoid Xaltar_wrath(x, y) Xregister int x, y; X{ X if(!strcmp(a_gname_at(x,y), u_gname())) { X pline("%s's voice booms: \"How darest thou desecrate my altar!\"", X a_gname_at(x,y)); X adjattrib(A_WIS, -1, FALSE); X } else { X pline("A voice whispers in your ear: \"Thou shalt pay, infidel!\""); X change_luck(-1); X } X} X# endif /* THEOLOGY */ X#endif /* ALTARS */ X X#ifdef THEOLOGY Xchar * Xu_gname() { /* returns the name of the player's deity */ X register struct ghods *aghod; X X for(aghod=gods; aghod->classlet; aghod++) X if(aghod->classlet == pl_character[0]) X switch(u.ualigntyp) { X case 1: return(aghod->law); X case 0: return(aghod->balance); X case -1: return(aghod->chaos); X default: impossible("unknown character alignment."); X return("Balance"); X } X impossible("atheist player?"); X return("someone"); X} X#endif /* THEOLOGY */ END_OF_FILE if test 33283 -ne `wc -c <'src/pray.c'`; then echo shar: \"'src/pray.c'\" unpacked with wrong size! fi # end of 'src/pray.c' fi echo shar: End of archive 11 \(of 38\). cp /dev/null ark11isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 38 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0