billr@saab.CNA.TEK.COM (Bill Randle) (07/24/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 7, Issue 71
Archive-name: NetHack3/Part16
#! /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 16 (of 38)."
# Contents: auxil/hh src/apply.c src/eat.c
# Wrapped by billr@saab on Sun Jul 23 21:32:59 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'auxil/hh' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'auxil/hh'\"
else
echo shar: Extracting \"'auxil/hh'\" \(2718 characters\)
sed "s/^X//" >'auxil/hh' <<'END_OF_FILE'
Xy k u 7 8 9 Move commands:
X \|/ \|/ yuhjklbn: go one step in specified direction
Xh-.-l 4-.-6 YUHJKLBN: go in specified direction until you
X /|\ /|\ hit a wall or run into something
Xb j n 1 2 3 g<dir>: run in direction <dir> until something
X numberpad interesting is seen
X G<dir>, same, except a branching corridor isn't
X ^<dir>: considered interesting
X m<dir>: move without picking up objects
X If the numberpad option is set, the number keys move instead.
X
XMeta commands:
X? help print one of several informative texts
XQ quit end the game
XS save save the game (to be continued later)
X! sh escape to some SHELL (if allowed)
X^Z suspend suspend the game (independent of your current suspend char)
XO options set options
X/ whatis give name (and sometimes more info) of specified monster
X\ known print list of what's been discovered
Xv version print version number
XV history print game history
X^A again redo the previous command
X^R redraw redraw the screen (^R denotes the symbol CTRL/R)
X^P print repeat last message (subsequent ^P's repeat earlier messages)
X# introduces a long command (# ? for list of long commands)
X
XGame commands:
X^T 'port teleport (if you can)
X^D kick kick a door
Xa apply apply or use a tool (pick-axe, key, camera, etc.)
XA remove take off all armor
Xc close close a door
XC name name an individual monster (e.g., baptize your dog)
Xd drop drop an object. d7a: drop seven items of object 'a'
XD drop drop several things
Xe eat eat something
XE engrave write a message in the dust on the floor (E- use fingers)
Xi invent list the inventory (all objects you are carrying)
XI invent list selected parts of the inventory
X Iu: list unpaid objects
X Ix: list unpaid but used up items
X I$: count your money
Xo open open a door
Xp pay pay your bill
XP wear put on a ring
Xq quaff drink a potion
Xr read read a scroll or spell book
XR remove remove a ring
Xs search search for secret doors, hidden traps and monsters
Xt throw throw or shoot a weapon
XT remove take off some armor
Xw wield wield a weapon (w- wield nothing)
XW wear put on some armor
Xz zap zap a wand
XZ cast cast a spell
X< up go up the stairs
X> down go down the stairs
X^ trap_id identify a previously found trap
X),[,=,",( ask for current items of specified symbol in use
X$ gold count your gold
X+ spells list the spells you know
X. rest wait a moment
X, pickup pick up all you can carry
X@ turn "autopickup" on and off
X: look look at what is here
X
XAnd if the "number_pad" option is on, these additional commands:
X
Xn followed by number of times to repeat the next command
Xj jump jump to a location
Xk kick kick a door
Xl loot loot a box on the floor
XN name name an object or type of object
Xu untrap untrap a trapped object
END_OF_FILE
if test 2718 -ne `wc -c <'auxil/hh'`; then
echo shar: \"'auxil/hh'\" unpacked with wrong size!
fi
# end of 'auxil/hh'
fi
if test -f 'src/apply.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/apply.c'\"
else
echo shar: Extracting \"'src/apply.c'\" \(28934 characters\)
sed "s/^X//" >'src/apply.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)apply.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/* block some unused #defines to avoid overloading some cpp's */
X#define MONATTK_H
X#include "hack.h"
X#include "edog.h"
X
X#ifdef MUSIC
X#define IS_INSTRUMENT(typ) ((typ) >= FLUTE && (typ) <= DRUM_OF_EARTHQUAKE)
X#endif /* MUSIC /**/
X
Xstatic const char tools[] = { TOOL_SYM, 0 };
X
Xstatic boolean did_dig_msg;
X
X/* version of bhit for cameras and mirrors */
Xstatic
Xstruct monst *
Xbchit(ddx,ddy,range,sym) register int ddx,ddy,range; char sym; {
X register struct monst *mtmp = (struct monst *) 0;
X register int bchx = u.ux, bchy = u.uy;
X
X if(sym) {
X Tmp_at2(-1, sym); /* open call */
X#ifdef MSDOSCOLOR
X Tmp_at2(-3, (int)AT_WHITE);
X#endif
X }
X while(range--) {
X bchx += ddx;
X bchy += ddy;
X if(levl[bchx][bchy].mmask) {
X mtmp = m_at(bchx,bchy);
X break;
X }
X if(!ZAP_POS(levl[bchx][bchy].typ) ||
X (IS_DOOR(levl[bchx][bchy].typ) &&
X (levl[bchx][bchy].doormask & (D_CLOSED | D_LOCKED)))
X ) {
X bchx -= ddx;
X bchy -= ddy;
X break;
X }
X if(sym) Tmp_at2(bchx, bchy);
X }
X if(sym) Tmp_at2(-1, -1);
X return(mtmp);
X}
X
Xstatic void
Xuse_camera(obj) /* register */ struct obj *obj; {
Xregister struct monst *mtmp;
X if(!getdir(1)){ /* ask: in what direction? */
X flags.move = multi = 0;
X return;
X }
X if(u.uswallow) {
X You("take a picture of %s's stomach.", mon_nam(u.ustuck));
X return;
X }
X if(obj->cursed && !rn2(2)) goto blindu;
X if(u.dz) {
X You("take a picture of the %s.",
X (u.dz > 0) ? "floor" : "ceiling");
X return;
X }
X if(!u.dx && !u.dy && !u.dz) {
Xblindu:
X if(!Blind) {
X You("are blinded by the flash!");
X make_blinded((long)rnd(25),FALSE);
X }
X return;
X }
X if(mtmp = bchit(u.dx, u.dy, COLNO, '!')) {
X if(mtmp->msleep){
X mtmp->msleep = 0;
X pline("The flash awakens %s.", mon_nam(mtmp)); /* a3 */
X } else
X if(mtmp->data->mlet != S_YLIGHT)
X if(mtmp->mcansee || mtmp->mblinded){
X register int tmp = dist(mtmp->mx,mtmp->my);
X register int tmp2;
X if(cansee(mtmp->mx,mtmp->my))
X pline("%s is blinded by the flash!", Monnam(mtmp));
X if(mtmp->data == &mons[PM_GREMLIN]) {
X /* Rule #1: Keep them out of the light. */
X kludge("%s cries out in pain!", Monnam(mtmp));
X if (mtmp->mhp > 1) mtmp->mhp--;
X }
X setmangry(mtmp);
X if(tmp < 9 && !mtmp->isshk && rn2(4)) {
X mtmp->mflee = 1;
X if(rn2(4)) mtmp->mfleetim = rnd(100);
X }
X if(tmp < 3) mtmp->mcansee = mtmp->mblinded = 0;
X else {
X tmp2 = mtmp->mblinded;
X tmp2 += rnd(1 + 50/tmp);
X if(tmp2 > 127) tmp2 = 127;
X mtmp->mblinded = tmp2;
X mtmp->mcansee = 0;
X }
X }
X }
X}
X
X/* Strictly speaking it makes no sense for usage of a stethoscope to
X not take any time; however, unless it did, the stethoscope would be
X almost useless. */
Xstatic void
Xuse_stethoscope(obj) register struct obj *obj; {
Xregister struct monst *mtmp;
Xregister struct rm *lev;
Xregister int rx, ry;
X if(!freehand()) {
X You("have no free %s!", body_part(HAND));
X return;
X }
X if (!getdir(1)) {
X flags.move=multi=0;
X return;
X }
X if(u.dz < 0 || (u.dz && Levitation)) {
X You("can't reach the %s!", u.dz<0 ? "ceiling" : "floor");
X return;
X }
X if(obj->cursed && !rn2(2)) {
X You("hear your heart beat.");
X return;
X }
X if(u.dz) {
X#ifdef STRONGHOLD
X if (dlevel == stronghold_level)
X You("hear the crackling of hellfire.");
X else
X#endif
X pline("The floor seems healthy enough.");
X return;
X }
X if (Stunned || (Confusion && !rn2(5))) confdir();
X if (!u.dx && !u.dy && !u.dz) {
X ustatusline();
X return;
X }
X rx = u.ux + u.dx; ry = u.uy + u.dy;
X if(u.uswallow) {
X mstatusline(u.ustuck);
X return;
X }
X if (!isok(rx,ry)) {
X You("hear a faint typing noise.");
X return;
X }
X lev = &levl[rx][ry];
X if(lev->mmask) {
X mtmp = m_at(rx,ry);
X mstatusline(mtmp);
X return;
X }
X if(lev->typ == SDOOR) {
X You("hear a hollow sound! This must be a secret door!");
X lev->typ = DOOR;
X lev->seen = 0; /* force prl */
X prl(rx,ry);
X return;
X }
X if(lev->typ == SCORR) {
X You("hear a hollow sound! This must be a secret passage!");
X lev->typ = CORR;
X lev->seen = 0; /* force prl */
X prl(rx,ry);
X return;
X }
X You("hear nothing special.");
X}
X
X/* ARGSUSED */
Xstatic void
Xuse_whistle(obj)
Xstruct obj *obj; {
X You("produce a high whistling sound.");
X wake_nearby();
X}
X
Xstatic void
Xuse_magic_whistle(obj)
Xstruct obj *obj; {
X register struct monst *mtmp = fmon;
X
X if(obj->cursed && !rn2(2)) {
X You("produce a high-pitched humming noise.");
X wake_nearby();
X } else {
X You("produce a %s whistling sound.", Hallucination
X ? "normal" : "strange");
X while(mtmp) {
X if(mtmp->mtame) mnexto(mtmp);
X mtmp = mtmp->nmon;
X }
X }
X}
X
Xboolean
Xum_dist(x,y,n)
Xregister xchar x, y, n;
X{
X return(abs(u.ux - x) > n || abs(u.uy - y) > n);
X}
X
X#ifdef WALKIES
X#define MAXLEASHED 2
X
Xint
Xnumber_leashed()
X{
X register int i = 0;
X register struct obj *obj;
X
X for(obj = invent; obj; obj = obj->nobj)
X if(obj->otyp == LEASH && obj->leashmon != 0) i++;
X return(i);
X}
X
Xvoid
Xo_unleash(otmp) /* otmp is about to be destroyed or stolen */
Xregister struct obj *otmp;
X{
X register struct monst *mtmp;
X
X for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X if(mtmp->m_id == (unsigned)otmp->leashmon)
X mtmp->mleashed = 0;
X otmp->leashmon = 0;
X}
X
Xvoid
Xm_unleash(mtmp) /* mtmp is about to die, or become untame */
Xregister struct monst *mtmp;
X{
X register struct obj *otmp;
X
X for(otmp = invent; otmp; otmp = otmp->nobj)
X if(otmp->otyp == LEASH &&
X otmp->leashmon == (int)mtmp->m_id)
X otmp->leashmon = 0;
X mtmp->mleashed = 0;
X}
X
Xvoid
Xunleash_all() /* player is about to die (for bones) */
X{
X register struct obj *otmp;
X register struct monst *mtmp;
X
X for(otmp = invent; otmp; otmp = otmp->nobj)
X if(otmp->otyp == LEASH) otmp->leashmon = 0;
X for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X if(mtmp->mtame) mtmp->mleashed = 0;
X}
X
X/* ARGSUSED */
Xstatic void
Xuse_leash(obj)
Xstruct obj *obj;
X{
X register int x, y;
X register struct monst *mtmp;
X
X if(!obj->leashmon && number_leashed() >= MAXLEASHED) {
X You("can't leash additional pets.");
X return;
X }
X
X if(!getdir(1)) return;
X
X x = u.ux + u.dx;
X y = u.uy + u.dy;
X
X if((x == u.ux) && (y == u.uy)) {
X pline("Leash yourself? Very funny...");
X return;
X }
X
X if(levl[x][y].mmask == 0) {
X pline("There is no creature here.");
X return;
X }
X
X mtmp = m_at(x, y);
X
X if(!mtmp->mtame) {
X pline("%s is not %s!", Monnam(mtmp), (!obj->leashmon) ?
X "leashable" : "leashed");
X return;
X }
X if(!obj->leashmon) {
X if(mtmp->mleashed) {
X pline("This %s is already leashed!", lmonnam(mtmp)+4);
X return;
X }
X You("slip the leash around your %s.",
X mtmp->data->mname);
X mtmp->mleashed = 1;
X obj->leashmon = (int)mtmp->m_id;
X if(mtmp->msleep) mtmp->msleep = 0;
X return;
X }
X if(obj->leashmon != (int)mtmp->m_id) {
X pline("This leash is not attached to that creature!");
X return;
X } else {
X if(obj->cursed) {
X pline("The leash wouldn't come off!");
X return;
X }
X mtmp->mleashed = 0;
X obj->leashmon = 0;
X You("remove the leash from your %s.",
X /* a hack to include the dogs full name. +4 eliminates */
X /* the 'the' at the start of the name */
X lmonnam(mtmp)+4);
X }
X return;
X}
X
Xboolean
Xnext_to_u()
X{
X register struct monst *mtmp;
X register struct obj *otmp;
X
X for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X if(mtmp->mleashed) {
X if(dist(mtmp->mx,mtmp->my) > 2) mnexto(mtmp);
X if(dist(mtmp->mx,mtmp->my) > 2) {
X for(otmp = invent; otmp; otmp = otmp->nobj)
X if(otmp->otyp == LEASH &&
X otmp->leashmon == (int)mtmp->m_id) {
X if(otmp->cursed) return(FALSE);
X You("feel %s leash go slack.",
X (number_leashed() > 1) ? "a" : "the");
X mtmp->mleashed = 0;
X otmp->leashmon = 0;
X }
X }
X }
X return(TRUE);
X}
X
Xstruct obj *
Xget_mleash(mtmp) /* assuming mtmp->mleashed has been checked */
Xregister struct monst *mtmp;
X{
X register struct obj *otmp;
X
X otmp = invent;
X while(otmp) {
X if(otmp->otyp == LEASH && otmp->leashmon == (int)mtmp->m_id)
X return(otmp);
X otmp = otmp->nobj;
X }
X return((struct obj *)0);
X}
X
Xvoid
Xcheck_leash(x, y)
Xregister xchar x, y;
X{
X register struct obj *otmp;
X register struct monst *mtmp = fmon;
X
X for(otmp = invent; otmp; otmp = otmp->nobj)
X if(otmp->otyp == LEASH && otmp->leashmon != 0) {
X while(mtmp) {
X if((int)mtmp->m_id == otmp->leashmon &&
X (dist2(u.ux,u.uy,mtmp->mx,mtmp->my) >
X dist2(x,y,mtmp->mx,mtmp->my))
X ) {
X if(otmp->cursed) {
X if(um_dist(mtmp->mx, mtmp->my, 5)) {
X pline("%s chokes to death!",Monnam(mtmp));
X mondied(mtmp);
X } else
X if(um_dist(mtmp->mx, mtmp->my, 3))
X pline("%s chokes on the leash!",
X Monnam(mtmp));
X } else {
X if(um_dist(mtmp->mx, mtmp->my, 5)) {
X pline("%s's leash snaps loose!",Monnam(mtmp));
X m_unleash(mtmp);
X } else {
X if(um_dist(mtmp->mx, mtmp->my, 3)) {
X You("pull on the leash.");
X# ifdef SOUNDS
X if (mtmp->data->msound != MS_SILENT)
X switch(rn2(3)) {
X case 0: growl(mtmp); break;
X case 1: yelp(mtmp); break;
X default: whimper(mtmp); break;
X }
X# endif
X }
X }
X }
X }
X mtmp = mtmp->nmon;
X }
X }
X}
X#endif /* WALKIES */
X
X
Xstatic int
Xdig() {
X register struct rm *lev;
X register int dpx = dig_pos.x, dpy = dig_pos.y;
X
X lev = &levl[dpx][dpy];
X /* perhaps a nymph stole his pick-axe while he was busy digging */
X /* or perhaps he teleported away */
X if(u.uswallow || !uwep || uwep->otyp != PICK_AXE ||
X dig_level != dlevel ||
X ((dig_down && (dpx != u.ux || dpy != u.uy)) ||
X (!dig_down && dist(dpx,dpy) > 2)))
X return(0);
X
X if(dig_down && is_maze_lev) {
X pline("The floor here is too hard to dig in.");
X return(0);
X }
X if(!dig_down && IS_ROCK(lev->typ) && !may_dig(dpx,dpy)) {
X pline("This wall is too hard to dig into.");
X return(0);
X }
X if(Fumbling && !rn2(3)) {
X switch(rn2(3)) {
X case 0: if(!welded(uwep)) {
X You("fumble and drop your %s", xname(uwep));
X dropx(uwep);
X } else {
X pline("Ouch! Your %s bounces and hits you!",
X xname(uwep));
X set_wounded_legs(RIGHT_SIDE, 5 + rnd(5));
X }
X break;
X case 1: pline("Bang! You hit with the broad side of the %s!",
X xname(uwep)); break;
X default: Your("swing misses its mark.");
X break;
X }
X return(0);
X }
X dig_effort += 10 + abon() + uwep->spe + rn2(5);
X if(dig_down) {
X if(dig_effort > 250) {
X dighole();
X dig_level = -1;
X return(0); /* done with digging */
X }
X if(dig_effort > 50) {
X register struct trap *ttmp = t_at(dpx,dpy);
X
X if(!ttmp) {
X ttmp = maketrap(dpx,dpy,PIT);
X ttmp->tseen = 1;
X if(Invisible) newsym(ttmp->tx,ttmp->ty);
X You("have dug a pit.");
X u.utrap = rn1(4,2);
X u.utraptype = TT_PIT;
X dig_level = -1;
X return(0);
X }
X }
X } else
X if(dig_effort > 100) {
X register char *digtxt;
X register struct obj *obj;
X
X if(obj = sobj_at(BOULDER, dpx, dpy)) {
X fracture_rock(obj);
X digtxt = "The boulder falls apart.";
X } else if(obj = sobj_at(STATUE, dpx, dpy)) {
X if (break_statue(obj))
X digtxt = "The statue shatters.";
X else
X digtxt = "Instead of shattering, the statue suddenly comes alive!";
X } else if(!lev->typ || lev->typ == SCORR) {
X lev->typ = CORR;
X digtxt = "You succeeded in cutting away some rock.";
X } else if(IS_WALL(lev->typ)) {
X lev->typ = is_maze_lev ? ROOM : DOOR;
X digtxt = "You just made an opening in the wall.";
X } else if(lev->typ == SDOOR) {
X lev->typ = DOOR;
X digtxt = "You just broke through a secret door.";
X if(!(lev->doormask & D_TRAPPED))
X lev->doormask = D_BROKEN;
X } else if (IS_DOOR(lev->typ) &&
X (lev->doormask & (D_CLOSED | D_LOCKED))) {
X digtxt = "You just broke a hole through the door.";
X if(!(lev->doormask & D_TRAPPED))
X lev->doormask = D_BROKEN;
X } else
X digtxt = "Now what exactly was it that you were digging in?";
X mnewsym(dpx, dpy);
X prl(dpx, dpy);
X pline(digtxt); /* after mnewsym & prl */
X if(IS_DOOR(lev->typ) && (lev->doormask & D_TRAPPED)) {
X b_trapped("door");
X lev->doormask = D_NODOOR;
X }
X dig_level = -1;
X return(0);
X } else {
X if(IS_WALL(lev->typ) ||
X (IS_DOOR(lev->typ) && lev->doormask & (D_CLOSED | D_LOCKED))) {
X register int rno = inroom(dpx,dpy);
X
X if(rno >= 0 && rooms[rno].rtype >= SHOPBASE) {
X pline("This %s seems too hard to dig into.",
X IS_DOOR(lev->typ) ? "door" : "wall");
X return(0);
X }
X }
X if(!did_dig_msg) {
X You("hit the %s with all your might.",
X sobj_at(STATUE, dpx, dpy) ? "statue" :
X sobj_at(BOULDER, dpx, dpy) ? "boulder" :
X IS_DOOR(lev->typ) ? "door" : "rock");
X did_dig_msg = TRUE;
X }
X }
X return(1);
X}
X
X/* When will hole be finished? Very rough indication used by shopkeeper. */
Xint
Xholetime() {
X return( (occupation == dig) ? (250 - dig_effort)/20 : -1);
X}
X
Xvoid
Xdighole()
X{
X register struct trap *ttmp = t_at(u.ux, u.uy);
X
X if(is_maze_lev
X#ifdef ENDGAME
X || dlevel == ENDLEVEL
X#endif
X ) {
X pline("The floor here seems too hard to dig in.");
X } else {
X if(IS_FURNITURE(levl[u.ux][u.uy].typ)) {
X#if defined(ALTARS) && defined(THEOLOGY)
X if(IS_ALTAR(levl[u.ux][u.uy].typ)) {
X altar_wrath(u.ux, u.uy);
X if(in_temple(u.ux, u.uy)) angry_priest();
X }
X#endif
X levl[u.ux][u.uy].typ = ROOM;
X levl[u.ux][u.uy].altarmask = 0;
X }
X if(ttmp)
X ttmp->ttyp = TRAPDOOR;
X else
X ttmp = maketrap(u.ux, u.uy, TRAPDOOR);
X ttmp->tseen = 1;
X if(Invisible) newsym(ttmp->tx,ttmp->ty);
X pline("You've made a hole in the floor.");
X if(!u.ustuck && !Levitation) { /* KAA */
X if(inshop())
X shopdig(1);
X#ifdef WALKIES
X if(!next_to_u())
X You("are jerked back by your pet!");
X else {
X#endif
X You("fall through...");
X if(u.utraptype == TT_PIT) {
X u.utrap = 0;
X u.utraptype = 0;
X }
X unsee();
X goto_level(dlevel+1, FALSE);
X#ifdef WALKIES
X }
X#endif
X }
X }
X}
X
Xstatic boolean
Xwield_tool(obj)
Xstruct obj *obj;
X{
X if(uwep && uwep->cursed) {
X /* Andreas Bormann - ihnp4!decvax!mcvax!unido!ab */
X if(flags.verbose) {
X pline("Since your weapon is welded to your %s,",
X bimanual(uwep) ?
X makeplural(body_part(HAND))
X : body_part(HAND));
X pline("you cannot wield that %s.", xname(obj));
X }
X return(FALSE);
X }
X# ifdef POLYSELF
X if(cantwield(uasmon)) {
X You("can't hold it strongly enough.");
X return(FALSE);
X }
X# endif
X unweapon = TRUE;
X You("now wield %s.", doname(obj));
X setuwep(obj);
X if (uwep != obj) return(FALSE); /* rewielded old object after dying */
X return(TRUE);
X}
X
Xstatic int
Xuse_pick_axe(obj)
Xstruct obj *obj;
X{
X char dirsyms[12];
X register char *dsp = dirsyms, *sdp = flags.num_pad ? ndir : sdir;
X register struct rm *lev;
X register int rx, ry, res = 0;
X register boolean isclosedoor = FALSE;
X
X if(obj != uwep)
X if (!wield_tool(obj)) return(0);
X else res = 1;
X
X while(*sdp) {
X (void) movecmd(*sdp); /* sets u.dx and u.dy and u.dz */
X rx = u.ux + u.dx;
X ry = u.uy + u.dy;
X if(u.dz > 0 || (u.dz == 0 && isok(rx, ry) &&
X (IS_ROCK(levl[rx][ry].typ)
X || sobj_at(STATUE, rx, ry)
X || sobj_at(BOULDER, rx, ry))))
X *dsp++ = *sdp;
X sdp++;
X }
X *dsp = 0;
X pline("In what direction do you want to dig? [%s] ", dirsyms);
X if(!getdir(0)) /* no txt */
X return(res);
X if(u.uswallow && attack(u.ustuck)) /* return(1) */;
X else if(u.dz < 0) You("cannot reach the ceiling.");
X else if(!u.dx && !u.dy && !u.dz) {
X int dam;
X
X dam = rnd(2) + dbon();
X if (dam <= 0) dam = 1;
X You("hit yourself with your own pick-axe.");
X losehp(dam, "self-inflicted wound");
X flags.botl=1;
X return(1);
X } else if(u.dz == 0) {
X if(Stunned || (Confusion && !rn2(5))) confdir();
X rx = u.ux + u.dx;
X ry = u.uy + u.dy;
X lev = &levl[rx][ry];
X if(lev->mmask && attack(m_at(rx, ry)))
X return(1);
X if(!isok(rx, ry)) {
X pline("Clash!");
X return(1);
X }
X isclosedoor = (IS_DOOR(lev->typ) &&
X (lev->doormask & (D_CLOSED | D_LOCKED)));
X if(!IS_ROCK(lev->typ)
X && (!IS_DOOR(lev->typ) || (lev->doormask==D_NODOOR
X || lev->doormask & (D_ISOPEN | D_BROKEN)))
X && !sobj_at(STATUE, rx, ry)
X && !sobj_at(BOULDER, rx, ry)) {
X /* ACCESSIBLE or POOL */
X You("swing your %s through thin air.",
X aobjnam(obj, NULL));
X } else {
X if(dig_pos.x != rx || dig_pos.y != ry
X || dig_level != dlevel || dig_down) {
X dig_down = FALSE;
X dig_pos.x = rx;
X dig_pos.y = ry;
X dig_level = dlevel;
X dig_effort = 0;
X You("start %s.",
X isclosedoor ? "chopping at the door" :
X sobj_at(STATUE, rx, ry) ?
X "chipping the statue" :
X sobj_at(BOULDER, rx, ry) ?
X "hitting the boulder" :
X "digging");
X } else
X You("continue %s.",
X isclosedoor ? "chopping at the door" :
X sobj_at(STATUE, rx, ry) ?
X "chipping the statue" :
X sobj_at(BOULDER, rx, ry) ?
X "hitting the boulder" :
X "digging");
X did_dig_msg = FALSE;
X set_occupation(dig, "digging", 0);
X }
X } else if(Levitation) {
X You("cannot reach the floor.");
X } else {
X if(dig_pos.x != u.ux || dig_pos.y != u.uy
X || dig_level != dlevel || !dig_down) {
X dig_down = TRUE;
X dig_pos.x = u.ux;
X dig_pos.y = u.uy;
X dig_level = dlevel;
X dig_effort = 0;
X You("start digging in the floor.");
X if(inshop())
X shopdig(0);
X } else
X You("continue digging in the floor.");
X did_dig_msg = FALSE;
X set_occupation(dig, "digging", 0);
X }
X return(1);
X}
X
X#define WEAK 3 /* from eat.c */
X
X#ifdef MEDUSA
Xstatic void
Xuse_mirror(obj)
Xstruct obj *obj;
X{
X register struct monst *mtmp;
X register char mlet;
X
X if(!getdir(1)){ /* ask: in what direction? */
X flags.move = multi = 0;
X return;
X }
X if(!u.dx && !u.dy && !u.dz) {
X if(!Blind && !Invisible)
X#ifdef POLYSELF
X if(u.umonnum == PM_FLOATING_EYE) {
X pline("Yikes! You've frozen yourself!");
X nomul(-rnd((MAXULEV+6) - (int)u.ulevel));
X } else if (u.usym == S_VAMPIRE || u.usym == S_DEMON)
X You("don't seem to reflect anything.");
X else if(u.umonnum == PM_UMBER_HULK) {
X pline("Huh? That doesn't look like you!");
X make_confused(HConfusion + d(3,4),FALSE);
X } else
X#endif
X if (Hallucination) You("look %s.", hcolor());
X else if (Sick)
X You("look peakish.");
X else if (u.uhs >= WEAK)
X You("look undernourished.");
X#ifdef POLYSELF
X else if (u.usym == S_NYMPH
X#ifdef HARD
X || u.umonnum==PM_SUCCUBUS
X#endif
X )
X You("look beautiful in the mirror.");
X#ifdef HARD
X else if (u.umonnum == PM_INCUBUS)
X You("look handsome in the mirror.");
X#endif
X#endif
X else You("look as %s as ever.",
X ACURR(A_CHA) > 14 ?
X (poly_gender()==1 ? "beautiful" : "handsome") :
X "ugly");
X else {
X if (rn2(4-u.uluck/3) || !HTelepat ||
X (u.ukilled_medusa
X#ifdef HARD
X && u.udemigod
X#endif
X )) {
X You("can't see your %s %s.",
X ACURR(A_CHA) > 14 ?
X (poly_gender()==1 ? "beautiful" : "handsome") :
X "ugly",
X body_part(FACE));
X } else {
X static char buf[35];
X char *tm, *tl; int ll;
X if (!u.ukilled_medusa && rn2(4)) {
X tm = "n ugly snake-headed monster";
X ll = dlevel - medusa_level;
X }
X else {
X tm = " powerful wizard";
X ll = dlevel - wiz_level;
X }
X if (ll < -10) tl = "far below you";
X else if (ll < -1) tl = "below you";
X else if (ll == -1) {
X Sprintf(buf, "under your %s", makeplural(
X body_part(FOOT)));
X tl = buf;
X } else if (ll == 0) tl = "very close to you";
X else if (ll == 1) {
X Sprintf(buf, "above your %s", body_part(HEAD));
X tl = buf;
X } else if (ll > 10) tl = "far above you";
X else tl = "above you";
X You("get an impression that a%s lives %s.",
X tm, tl);
X }
X }
X return;
X }
X if(u.uswallow) {
X You("reflect %s's stomach.", mon_nam(u.ustuck));
X return;
X }
X if(u.dz) {
X You("reflect the %s.",
X (u.dz > 0) ? "floor" : "ceiling");
X return;
X }
X if((mtmp = bchit(u.dx, u.dy, COLNO, 0)) && haseyes(mtmp->data)) {
X mlet = mtmp->data->mlet;
X if(mtmp->msleep) {
X if (!Blind)
X pline ("%s is tired and doesn't look at your mirror.",
X Monnam(mtmp));
X mtmp->msleep = 0;
X } else if (!mtmp->mcansee) {
X if (!Blind)
X pline("%s can't see anything at the moment.", Monnam(mtmp));
X } else if (mtmp->minvis || mlet == S_VAMPIRE ||
X mlet == S_DEMON || mlet == S_GHOST) {
X if (!Blind)
X pline ("%s doesn't seem to reflect anything.", Monnam(mtmp));
X } else if (!mtmp->mcan) {
X /* some monsters do special things */
X if(obj->cursed && !rn2(2)) {
X if (!Blind)
X pline("The mirror gets foggy and doesn't reflect!");
X return;
X } else if(mtmp->data == &mons[PM_MEDUSA]) {
X if (!Blind)
X pline("%s is turned to stone!", Monnam(mtmp));
X stoned = TRUE;
X killed(mtmp);
X } else if(mtmp->data == &mons[PM_FLOATING_EYE]) {
X if (!Blind)
X pline("%s is frozen by its reflection.",Monnam(mtmp));
X mtmp->mfroz = 1;
X } else if(mtmp->data == &mons[PM_UMBER_HULK]) {
X if (!Blind)
X pline ("%s has confused itself!", Monnam(mtmp));
X mtmp->mconf = 1;
X } else if(mlet == S_NYMPH
X#ifdef HARD
X || mtmp->data==&mons[PM_SUCCUBUS]
X#endif
X ) {
X if (!Blind) {
X pline ("%s looks beautiful in your mirror.",Monnam(mtmp));
X pline ("She decides to take it!");
X } else pline ("It steals your mirror!");
X freeinv(obj);
X mpickobj(mtmp,obj);
X rloc(mtmp);
X }
X } else if (mlet != S_UNICORN && !humanoid(mtmp->data) && rn2(5)) {
X if (!Blind)
X pline ("%s is frightened by its reflection.", Monnam(mtmp));
X mtmp->mflee = 1;
X mtmp->mfleetim += d(2,4);
X } else if (!Blind)
X pline("%s doesn't seem to mind %s reflection.", Monnam(mtmp),
X (is_female(mtmp) ? "her" :
X is_human(mtmp->data) ? "his" : "its"));
X }
X}/* use_mirror */
X
X#endif
X
Xstatic void
Xuse_lamp(obj)
Xstruct obj *obj;
X{
X if(obj->spe <= 0 || obj->otyp == MAGIC_LAMP ) {
X pline("This lamp has no oil.");
X return;
X }
X if(obj->cursed && !rn2(2))
X pline("The lamp flickers on for a moment and dies.");
X else litroom(TRUE);
X obj->spe -= 1;
X}
X
Xstatic void
Xuse_crystal_ball(obj)
X struct obj *obj;
X{
X char buf[BUFSZ];
X int oops, ret;
X
X if (Blind) {
X pline("Too bad you can't see the crystal ball.");
X return;
X }
X oops = (rnd(20) > ACURR(A_INT) || obj->cursed);
X if (oops && (obj->spe > 0)) {
X switch(rnd(5)) {
X case 1 : pline("The crystal ball is too much to comprehend!");
X break;
X case 2 : pline("The crystal ball confuses you!");
X make_confused(HConfusion + rnd(100),FALSE);
X break;
X case 3 : pline("The crystal ball damages your vision!");
X make_blinded(Blinded + rnd(100),FALSE);
X break;
X case 4 : pline("The crystal ball zaps your mind!");
X make_hallucinated(Hallucination + rnd(100),FALSE);
X break;
X case 5 : pline("The crystal ball explodes!");
X useup(obj);
X losehp(rnd(30), "exploding crystal ball");
X break;
X }
X obj->spe -= 1;
X return;
X }
X
X pline("What do you want to look for? ");
X getlin(buf);
X clrlin();
X if (!buf[0] || buf[0] == '\033') {
X if(flags.verbose) pline("Never mind.");
X return;
X }
X You("peer into the crystal ball.");
X nomul(-rnd(10));
X nomovemsg = "";
X if(obj->spe <= 0)
X pline("The vision is unclear.");
X else {
X obj->spe -= 1;
X switch(buf[0]) {
X case GOLD_SYM : ret = gold_detect((struct obj *)0);
X break;
X case '^' : ret = trap_detect((struct obj *)0);
X break;
X case FOOD_SYM : ret = food_detect((struct obj *)0);
X break;
X case POTION_SYM :
X case GEM_SYM :
X case TOOL_SYM :
X case WEAPON_SYM :
X case WAND_SYM :
X case SCROLL_SYM :
X#ifdef SPELLS
X case SPBOOK_SYM :
X#endif
X case ARMOR_SYM : ret = object_detect((struct obj *)0);
X break;
X default : lcase(buf);
X if (!strncmp(buf,"gold",4) || !strncmp(buf,"money",5))
X ret = gold_detect((struct obj *)0);
X else if (!strncmp(buf,"trap",4))
X ret = trap_detect((struct obj *)0);
X else if (!strncmp(buf,"food",4) ||
X !strncmp(buf,"dead",4) ||
X !strncmp(buf,"corpse",6))
X ret = food_detect((struct obj *)0);
X else if (!strncmp(buf,"obj",3) ||
X !strncmp(buf,"the",3) ||
X !strncmp(buf,"a ",2) ||
X !strncmp(buf,"an ",3))
X /* || strstr(buf, " of") */
X ret = object_detect((struct obj *)0);
X else ret = monster_detect((struct obj *)0);
X break;
X }
X if (ret)
X if (!rn2(100)) /* make them nervous */
X You("see the Wizard of Yendor gazing out at you.");
X else pline("The vision is unclear.");
X }
X return;
X}
X
Xstatic const char cuddly[] = { TOOL_SYM, 0 };
X
Xint
Xdorub()
X{
X struct obj *obj = getobj(cuddly, "rub");
X
X if(!obj || (obj != uwep && !wield_tool(obj))) return 0;
X
X if (uwep->otyp == MAGIC_LAMP) {
X if (uwep->spe > 0 && !rn2(3)) {
X uwep->spe = 0;
X djinni_from_bottle(uwep);
X } else if (rn2(2) && !Blind)
X You("see a puff of smoke.");
X else pline(nothing_happens);
X } else pline(nothing_happens);
X return 1;
X}
X
Xint
Xdojump()
X{
X coord cc;
X register struct monst *mtmp;
X if (!Jumping) {
X You("can't jump very far.");
X return 0;
X } else if (u.uswallow) {
X pline("You've got to be kidding!");
X return 0;
X } else if (u.ustuck) {
X kludge("You cannot escape from %s!",
X mon_nam(u.ustuck));
X return 0;
X } else if (inv_weight() > -5) {
X You("are carrying too much to jump!");
X return 0;
X } else if (u.uhunger <= 100 || ACURR(A_STR) < 6) {
X You("lack the strength to jump!");
X return 0;
X }
X pline("Where do you want to jump?");
X getpos(&cc, 1, "the desired position");
X if (dist(cc.x, cc.y) > 9) {
X pline("Too far!");
X return 0;
X } else if (!cansee(cc.x, cc.y)) {
X You("cannot see where to land!");
X return 0;
X } else if (levl[cc.x][cc.y].mmask) {
X mtmp = m_at(cc.x, cc.y);
X You("cannot trample %s!", mon_nam(mtmp));
X return 0;
X } else if (!isok(cc.x, cc.y) ||
X#ifdef POLYSELF
X (IS_ROCK(levl[cc.x][cc.y].typ) && !passes_walls(uasmon)) ||
X#else
X IS_ROCK(levl[cc.x][cc.y].typ) ||
X#endif
X sobj_at(BOULDER, cc.x, cc.x) ) {
X You("cannot jump there!");
X return 0;
X } else {
X teleds(cc.x, cc.y);
X nomul(-1);
X nomovemsg = "";
X morehungry(rnd(25));
X return 1;
X }
X}
X
Xstatic void
Xuse_tinning_kit(obj)
Xregister struct obj *obj;
X{
X register struct obj *corpse, *can;
X
X /* This takes only 1 move. If this is to be changed to take many
X * moves, we've got to deal with decaying corpses...
X */
X if (!(corpse = floorfood("can", 1))) return;
X if ((corpse->corpsenm == PM_COCKATRICE)
X#ifdef POLYSELF
X && !resists_ston(uasmon)
X#endif
X && !uarmg) {
Xpline("Tinning a cockatrice corpse without gloves was not a very wise move...");
X You("turn to stone...");
X killer = "unwise tinning decision";
X done("stoned");
X }
X can = mksobj(TIN,FALSE);
X can->corpsenm = corpse->corpsenm;
X can->quan = 1; /* Defeat the occasional creation of pairs of tins */
X can->owt = weight(can);
X can->known = 1;
X can->spe = 0; /* No spinach allowed... */
X can->cursed = obj->cursed;
X can->blessed = obj->blessed;
X can = addinv(can);
X You("now have %s.", doname(can));
X useup(corpse);
X}
X
Xint
Xdoapply() {
X register struct obj *obj;
X register int res = 1;
X
X obj = getobj(tools, "use or apply");
X if(!obj) return 0;
X
X check_unpaid(obj);
X
X#ifdef MUSIC
X if (IS_INSTRUMENT(obj->otyp)) {
X res = do_play_instrument(obj);
X return (res);
X }
X#endif /* MUSIC /**/
X
X switch(obj->otyp){
X case EXPENSIVE_CAMERA:
X use_camera(obj); break;
X case CREDIT_CARD:
X case LOCK_PICK:
X case SKELETON_KEY:
X case KEY:
X (void) pick_lock(obj);
X break;
X case BAG_OF_TRICKS:
X if(obj->spe > 0) {
X register int cnt = 1;
X
X obj->spe -= 1;
X if(!rn2(23)) cnt += rn2(7) + 1;
X while(cnt--)
X (void) makemon((struct permonst *) 0, u.ux, u.uy);
X makeknown(BAG_OF_TRICKS);
X }
X break;
X case LARGE_BOX:
X case CHEST:
X case ICE_BOX:
X case SACK:
X case BAG_OF_HOLDING:
X use_container(obj, 1); break;
X case PICK_AXE:
X res = use_pick_axe(obj);
X break;
X case TINNING_KIT:
X use_tinning_kit(obj);
X break;
X case MAGIC_WHISTLE:
X if(pl_character[0] == 'W' || u.ulevel > (MAXULEV/3)) {
X use_magic_whistle(obj);
X break;
X }
X /* fall into next case */
X case WHISTLE:
X use_whistle(obj);
X break;
X#ifdef MEDUSA
X case MIRROR:
X use_mirror(obj);
X break;
X#endif
X case LAMP:
X case MAGIC_LAMP:
X use_lamp(obj);
X break;
X case CRYSTAL_BALL:
X use_crystal_ball(obj);
X break;
X#ifdef WALKIES
X case LEASH:
X use_leash(obj);
X break;
X#endif
X case MAGIC_MARKER:
X dowrite(obj);
X break;
X case TIN_OPENER:
X if(!carrying(TIN)) {
X You("have no tin to open.");
X goto xit;
X }
X You("cannot open a tin without eating its contents.");
X if(flags.verbose)
X pline("In order to eat, use the 'e' command.");
X if(obj != uwep)
X pline("Opening the tin will be much easier if you wield the tin opener.");
X goto xit;
X
X case STETHOSCOPE:
X res = 0;
X use_stethoscope(obj);
X break;
X case FIGURINE:
X You("set the figurine on the ground and it transforms.");
X make_familiar(obj);
X useup(obj);
X break;
X case BLINDFOLD:
X if (obj == ublindf) {
X if(cursed(obj)) break;
X else Blindf_off(obj);
X }
X else if (!ublindf) Blindf_on(obj);
X else You("are already wearing a blindfold!");
X break;
X default:
X pline("Sorry, I don't know how to use that.");
X xit:
X nomul(0);
X return 0;
X }
X nomul(0);
X return res;
X}
END_OF_FILE
if test 28934 -ne `wc -c <'src/apply.c'`; then
echo shar: \"'src/apply.c'\" unpacked with wrong size!
fi
# end of 'src/apply.c'
fi
if test -f 'src/eat.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/eat.c'\"
else
echo shar: Extracting \"'src/eat.c'\" \(19624 characters\)
sed "s/^X//" >'src/eat.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)eat.c 3.0 88/10/22
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X
X#include "hack.h"
X
Xchar corpsename[60];
X
X/* hunger texts used on bottom line (each 8 chars long) */
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
Xconst char *hu_stat[] = {
X "Satiated",
X " ",
X "Hungry ",
X "Weak ",
X "Fainting",
X "Fainted ",
X "Starved "
X};
X
Xstatic const char comestibles[] = { FOOD_SYM, 0 };
X
Xvoid
Xinit_uhunger(){
X u.uhunger = 900;
X u.uhs = NOT_HUNGRY;
X}
X
Xconst struct { char *txt; int nut; } tintxts[] = {
X "deep fried", 60,
X "pickled", 40,
X "soup made from", 20,
X "pureed", 500,
X "rotten", -50,
X "", 0
X};
X#define TTSZ SIZE(tintxts)
X
Xstatic struct {
X struct obj *tin;
X int usedtime, reqtime;
X} tin;
X
Xstatic int
XMeatdone() {
X u.usym =
X#ifdef POLYSELF
X u.mtimedone ? uasmon->mlet :
X#endif
X S_HUMAN;
X prme();
X return 0;
X}
X
Xstatic int
Xcorpsefx(pm)
Xregister int pm;
X{
X register int tmp = 0, tp = 0;
X
X if ((pl_character[0]=='E') ? is_elf(&mons[pm]) : is_human(&mons[pm])) {
X You("cannibal! You will be sorry for this!");
X Aggravate_monster |= INTRINSIC;
X }
X
X switch(pm) {
X case PM_WRAITH:
X pluslvl();
X break;
X#ifdef POLYSELF
X case PM_WERERAT:
X u.ulycn = PM_RATWERE;
X break;
X case PM_WEREJACKAL:
X u.ulycn = PM_JACKALWERE;
X break;
X case PM_WEREWOLF:
X u.ulycn = PM_WOLFWERE;
X break;
X#endif
X case PM_NURSE:
X u.uhp = u.uhpmax;
X flags.botl = 1;
X break;
X case PM_LITTLE_DOG:
X case PM_DOG:
X case PM_LARGE_DOG:
X case PM_KITTEN:
X case PM_HOUSECAT:
X case PM_LARGE_CAT:
X Aggravate_monster |= INTRINSIC;
X break;
X case PM_STALKER:
X if(!Invis) {
X HInvis = 50+rn2(100);
X if(!See_invisible)
X newsym(u.ux, u.uy);
X } else {
X if (!HInvis) You("feel hidden!");
X HInvis |= INTRINSIC;
X HSee_invisible |= INTRINSIC;
X }
X /* fall into next case */
X case PM_YELLOW_LIGHT:
X /* fall into next case */
X case PM_GIANT_BAT:
X make_stunned(HStun + 30,FALSE);
X /* fall into next case */
X case PM_BAT:
X make_stunned(HStun + 30,FALSE);
X break;
X case PM_COCKATRICE:
X#ifdef MEDUSA
X case PM_MEDUSA:
X#endif
X#ifdef POLYSELF
X if(!resists_ston(uasmon)) {
X#endif
X killer = (char *) alloc(40);
X You("turn to stone.");
X Sprintf(killer, "%s meat",
X mons[pm].mname);
X done("stoned");
X#ifdef POLYSELF
X }
X#endif
X break;
X case PM_GIANT_MIMIC:
X tmp += 10;
X /* fall into next case */
X case PM_LARGE_MIMIC:
X tmp += 20;
X /* fall into next case */
X case PM_SMALL_MIMIC:
X tmp += 20;
X if(u.usym == S_HUMAN) {
X You("cannot resist the temptation to mimic a treasure chest.");
X tp++;
X nomul(tmp);
X afternmv = Meatdone;
X nomovemsg = "You now again prefer mimicking a human.";
X u.usym = GOLD_SYM;
X prme();
X }
X break;
X case PM_FLOATING_EYE:
X if (!(HTelepat & INTRINSIC)) {
X HTelepat |= INTRINSIC;
X You("feel a %s mental acuity.",
X Hallucination ? "normal" : "strange");
X }
X break;
X case PM_QUANTUM_MECHANIC:
X Your("velocity suddenly seems very uncertain!");
X if (Fast & INTRINSIC) {
X Fast &= ~INTRINSIC;
X You("seem slower.");
X } else {
X Fast |= INTRINSIC;
X You("seem faster.");
X }
X break;
X#ifdef POLYSELF
X case PM_CHAMELEON:
X You("feel a change coming over you.");
X polyself();
X break;
X#endif
X default: {
X register struct permonst *ptr = &mons[pm];
X if(dmgtype(ptr, AD_STUN) || ptr==&mons[PM_VIOLET_FUNGUS]) {
X pline ("Oh wow! Great stuff!");
X make_hallucinated(Hallucination + 200,FALSE);
X }
X if(dmgtype(ptr, AD_ACID)) {
X if(Stoned) {
X pline("What a pity - you just destroyed a future piece of art!");
X tp++;
X Stoned = 0;
X }
X }
X if(is_giant(ptr)) gainstr((struct obj *)0, 0);
X
X if(can_teleport(ptr) && ptr->mlevel > rn2(10)) {
X if (!(HTeleportation & INTRINSIC)) {
X You("feel very jumpy.");
X HTeleportation |= INTRINSIC;
X }
X } else if(control_teleport(ptr) && ptr->mlevel > rn2(20)) {
X if (!(HTeleport_control & INTRINSIC)) {
X You("feel in control of yourself.");
X HTeleport_control |= INTRINSIC;
X }
X } else if(resists_fire(ptr) && ptr->mlevel > rn2(20)) {
X if (!(HFire_resistance & INTRINSIC)) {
X You("feel a momentary chill.");
X HFire_resistance |= INTRINSIC;
X }
X } else if(resists_cold(ptr) && ptr->mlevel > rn2(20)) {
X if (!(HCold_resistance & INTRINSIC)) {
X You("feel full of hot air.");
X HCold_resistance |= INTRINSIC;
X }
X } else if((ptr->mflags1 & M1_POIS_RES) && ptr->mlevel>rn2(20)) {
X /* Monsters with only M1_POIS are poison resistant themselves,
X * but do not confer resistance when eaten
X */
X if (!(HPoison_resistance & INTRINSIC)) {
X You("feel healthy.");
X HPoison_resistance |= INTRINSIC;
X }
X } else if(resists_elec(ptr) && ptr->mlevel > rn2(20)) {
X if (!(HShock_resistance & INTRINSIC)) {
X Your("health currently feels amplified!");
X HShock_resistance |= INTRINSIC;
X }
X } else if((ptr->mflags1 & M1_SLEE_RES) && ptr->mlevel > rn2(20)) {
X /* Undead monsters never sleep,
X * but also do not confer resistance when eaten
X */
X if (!(HSleep_resistance & INTRINSIC)) {
X You("feel wide awake.");
X HSleep_resistance |= INTRINSIC;
X }
X } else if(resists_disint(ptr) && ptr->mlevel > rn2(20)) {
X if (!(HDisint_resistance & INTRINSIC)) {
X You("feel very firm.");
X HDisint_resistance |= INTRINSIC;
X }
X }
X }
X break;
X }
X return(tp);
X}
X
Xstatic int
Xopentin(){
X register int r;
X
X if(!carried(tin.tin)) /* perhaps it was stolen? */
X return(0); /* %% probably we should use tinoid */
X if(tin.usedtime++ >= 50) {
X You("give up your attempt to open the tin.");
X return(0);
X }
X if(tin.usedtime < tin.reqtime)
X return(1); /* still busy */
X if(tin.tin->cursed && !rn2(8)) {
X b_trapped("tin");
X useup(tin.tin);
X return(0);
X }
X You("succeed in opening the tin.");
X if(!tin.tin->spe) {
X if(tin.tin->corpsenm == -1) {
X pline("It turns out to be empty.");
X tin.tin->dknown = tin.tin->known = TRUE;
X useup(tin.tin);
X return(0);
X }
X r = tin.tin->cursed ? 4 : rn2(TTSZ-1); /* Always rotten if cursed */
X pline("It smells like %s.", makeplural(
X Hallucination ? rndmonnam() : mons[tin.tin->corpsenm].mname));
X pline("Eat it? ");
X if (yn() == 'n') {
X if (!Hallucination) tin.tin->dknown = tin.tin->known = TRUE;
X useup(tin.tin);
X return 0;
X }
X You("consume %s %s.", tintxts[r].txt,
X mons[tin.tin->corpsenm].mname);
X tin.tin->dknown = tin.tin->known = TRUE;
X (void) corpsefx(tin.tin->corpsenm);
X /* check for vomiting added by GAN 01/16/87 */
X if(tintxts[r].nut < 0) {
X You("vomit.");
X vomit();
X morehungry(-tintxts[r].nut);
X } else lesshungry(tintxts[r].nut);
X if(r == 0) { /* Deep Fried */
X Glib = rnd(15);
X pline("Eating deep fried food made your %s very slippery.",
X makeplural(body_part(FINGER)));
X }
X } else {
X if (tin.tin->cursed)
X pline("It contains some decaying %s substance.",
X Hallucination ? hcolor() : green);
X else
X pline("It contains spinach - this makes you feel like %s!",
X Hallucination ? "Swee'pea" : "Popeye");
X
X lesshungry(600);
X gainstr(tin.tin, 0);
X }
X tin.tin->dknown = tin.tin->known = TRUE;
X useup(tin.tin);
X return(0);
X}
X
Xint
XHear_again()
X{
X flags.soundok = 1;
X return 0;
X}
X
Xstatic void
Xrottenfood() {
X
X pline("Blecch! Rotten food!");
X if(!rn2(4)) {
X if (Hallucination) You("feel rather trippy.");
X else
X You("feel rather %s.",
X body_part(LIGHT_HEADED));
X make_confused(HConfusion + d(2,4),FALSE);
X } else if(!rn2(4) && !Blind) {
X pline("Everything suddenly goes dark.");
X make_blinded((long)d(2,10),FALSE);
X } else if(!rn2(3)) {
X if(Blind)
X pline("The world spins and you slap against the floor.");
X else
X pline("The world spins and goes dark.");
X flags.soundok = 0;
X nomul(-rnd(10));
X nomovemsg = "You are conscious again.";
X afternmv = Hear_again;
X }
X}
X
Xstatic void
Xeatcorpse(otmp) register struct obj *otmp; {
X register char *cname = mons[otmp->corpsenm].mname;
X register int tp, rotted;
X
X tp = 0;
X#ifdef LINT /* problem if more than 320K moves before try to eat */
X rotted = 0;
X#else
X rotted = (moves - otmp->age)/((long)(10 + rn2(20))); /* how decomposed? */
X#endif
X
X if(otmp->cursed) rotted += 2;
X else if (otmp->blessed) rotted -= 2;
X
X if(otmp->corpsenm != PM_ACID_BLOB && (rotted > 5)) {
X tp++;
X pline("Ulch - that %s was tainted!",
X mons[otmp->corpsenm].mlet != S_FUNGUS ?
X "meat" : "fungoid vegetation");
X#ifdef POLYSELF
X if (u.usym == S_FUNGUS)
X pline("It doesn't seem at all sickening, though...");
X else {
X#endif
X make_sick(10L + rn2(10),FALSE);
X Sprintf(corpsename, "rotted %s corpse", cname);
X u.usick_cause = corpsename;
X flags.botl = 1;
X#ifdef POLYSELF
X }
X#endif
X } else if(poisonous(&mons[otmp->corpsenm]) && rn2(5)){
X pline("Ecch - that must have been poisonous!");
X if(!Poison_resistance) {
X losestr(rnd(4));
X losehp(rnd(15), "poisonous corpse");
X } else You("seem unaffected by the poison.");
X (void) corpsefx(otmp->corpsenm);
X tp++;
X /* now any corpse left too long will make you mildly ill */
X } else if(((rotted > 5) || ((rotted > 3) && rn2(5)))
X#ifdef POLYSELF
X && u.usym != S_FUNGUS
X#endif
X ){
X tp++;
X You("feel%s sick.", (Sick) ? " very" : "");
X losehp(rnd(8), "cadaver");
X } else tp = corpsefx(otmp->corpsenm);
X if(!tp && !rn2(7)) {
X
X rottenfood();
X lesshungry((int)mons[otmp->corpsenm].cnutrit >> 2);
X } else {
X#ifdef POLYSELF
X pline("That %s corpse %s!", cname,
X carnivorous(uasmon) ? "was delicious" : "tasted terrible");
X#else
X pline("That %s corpse tasted terrible!", cname);
X#endif
X lesshungry((int)mons[otmp->corpsenm].cnutrit);
X }
X
X /* delay is weight dependant */
X multi = -(3 + (mons[otmp->corpsenm].cwt >> 2));
X}
X
X/* Created by GAN 01/28/87
X * Amended by AKP 09/22/87: if not hard, don't choke, just vomit.
X * Amended by 3. 06/12/89: if not hard, sometimes choke anyway, to keep risk.
X *
X * Note that if you have enough food, you can always stop being Sick!
X * choke() returns if you don't choke, kills you if you do.
X */
X/*ARGSUSED*/
Xstatic void
Xchoke(food)
Xregister struct objclass *food;
X{
X /* only happens if you were satiated */
X if(u.uhs != SATIATED) return;
X
X if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL)
X u.ualign--; /* gluttony is unchivalrous */
X
X#ifndef HARD
X if (rn2(20)) {
X You("stuff yourself and then vomit voluminously.");
X morehungry(1000); /* you just got *very* sick! */
X vomit();
X } else {
X#endif
X if(food) killer = food->oc_name;
X else killer = "exuberant appetite";
X You("choke over your food.");
X You("die...");
X done("choked");
X#ifndef HARD
X }
X#endif
X}
X
Xint
Xdoeat() {
X register struct obj *otmp;
X register struct objclass *ftmp;
X register int tmp;
X
X if (!(otmp = floorfood("eat", 0))) return 0;
X
X if(otmp->otyp == TIN) {
X if (otmp->blessed) {
X pline("The tin opens like magic!");
X tmp = 1;
X } else if(uwep) {
X switch(uwep->otyp) {
X case TIN_OPENER:
X tmp = 1;
X break;
X case DAGGER:
X#ifdef WORM
X case CRYSKNIFE:
X#endif
X tmp = 3;
X break;
X case PICK_AXE:
X case AXE:
X tmp = 6;
X break;
X default:
X goto no_opener;
X }
X pline("Using your %s you try to open the tin.",
X aobjnam(uwep, NULL));
X } else {
X no_opener:
X pline("It is not so easy to open this tin.");
X if(Glib) {
X pline("The tin slips out of your hands.");
X if(otmp->quan > 1) {
X register struct obj *obj;
X obj = splitobj(otmp, 1);
X if(otmp == uwep) setuwep(obj);
X }
X dropx(otmp);
X return(1);
X }
X tmp = 10 + rn2(1 + 500/((int)(ACURR(A_DEX) + ACURR(A_STR))));
X }
X tin.reqtime = tmp;
X tin.usedtime = 0;
X tin.tin = otmp;
X set_occupation(opentin, "opening the tin", 0);
X return(1);
X }
X
X ftmp = &objects[otmp->otyp];
X multi = -ftmp->oc_delay;
X if(otmp->otyp == CORPSE) eatcorpse(otmp);
X else {
X if (otmp->otyp != FORTUNE_COOKIE &&
X otmp->otyp != DEAD_LIZARD &&
X (otmp->cursed ||
X ((moves - otmp->age) > otmp->blessed ? 50 : 30)) &&
X !rn2(7)) {
X
X rottenfood();
X lesshungry(ftmp->nutrition >> 2);
X } else {
X if(u.uhunger >= 1500) choke(ftmp);
X
X switch(otmp->otyp){
X case FOOD_RATION:
X if(u.uhunger <= 200)
X if (Hallucination)
X pline("Oh wow, like, superior, man!");
X else
X pline("That food really hit the spot!");
X else if(u.uhunger <= 700)
X pline("That satiated your stomach!");
X /* Have lesshungry() report when you are nearly full so all eating
X * warns when you are about to choke.
X */
X lesshungry(ftmp->nutrition);
X if(multi < 0) nomovemsg = "You finished your meal.";
X break;
X case TRIPE_RATION:
X#ifdef POLYSELF
X if (carnivorous(uasmon))
X pline("That tripe ration was surprisingly good!");
X else {
X#endif
X pline("Yak - dog food!");
X more_experienced(1,0);
X flags.botl = 1;
X#ifdef POLYSELF
X }
X#endif
X if(rn2(2)
X#ifdef POLYSELF
X && u.usym == S_HUMAN
X#endif
X ){
X You("vomit.");
X morehungry(20);
X vomit();
X } else lesshungry(ftmp->nutrition);
X break;
X#ifdef POLYSELF
X case CLOVE_OF_GARLIC:
X if (is_undead(uasmon)) {
X You("cannot stand eating it. You vomit.");
X vomit();
X break;
X }
X /* Fall through otherwise */
X#endif
X default:
X if (otmp->otyp==SLIME_MOLD && !otmp->cursed &&
X otmp->spe == current_fruit)
X pline(!Hallucination ?
X "Mmm! Your favorite!" :
X "Yum! Your fave fruit!");
X else {
X int oldquan = otmp->quan;
X otmp->quan = 1;
X pline("That %s was %s!", xname(otmp),
X otmp->cursed ?
X (Hallucination ? "grody" : "terrible"):
X Hallucination ? "gnarly" : (
X#ifdef TOLKIEN
X otmp->otyp==CRAM_RATION ? "bland":
X#endif
X "delicious"));
X otmp->quan = oldquan;
X }
X lesshungry(ftmp->nutrition);
X
X switch(otmp->otyp) {
X#ifdef POLYSELF
X case CLOVE_OF_GARLIC:
X if (u.ulycn != -1) {
X You("feel purified.");
X if(uasmon == &mons[u.ulycn] &&
X !Polymorph_control)
X rehumanize();
X u.ulycn = -1;
X }
X break;
X#endif
X case DEAD_LIZARD:
X /* Relief from cockatrices -dgk */
X if (Stoned) {
X Stoned = 0;
X You("feel limber!");
X }
X if (HStun > 2) make_stunned(2L,FALSE);
X if (HConfusion > 2) make_confused(2L,FALSE);
X break;
X case CARROT:
X make_blinded(0L,TRUE);
X break;
X case FORTUNE_COOKIE:
X outrumor(bcsign(otmp), TRUE);
X break;
X case LUMP_OF_ROYAL_JELLY:
X /* This stuff seems to be VERY healthy! */
X gainstr(otmp, 1);
X u.uhp += (otmp->cursed) ? -rnd(20) : rnd(20);
X if(u.uhp > u.uhpmax) {
X if(!rn2(17)) u.uhpmax++;
X u.uhp = u.uhpmax;
X } else if(u.uhp <= 0) {
X killer = "rotten jelly lump";
X done("died");
X }
X if(!otmp->cursed) heal_legs();
X break;
X case EGG:
X if(otmp->corpsenm == PM_COCKATRICE) {
X#ifdef POLYSELF
X if(!resists_ston(uasmon)) {
X#endif
X if (!Stoned) Stoned = 5;
X killer = "cockatrice egg";
X#ifdef POLYSELF
X }
X#endif
X }
X break;
X default: break;
X }
X break;
X }
X }
X }
X
X
X if(multi < 0 && !nomovemsg){
X#ifdef LINT /* JAR static char msgbuf[BUFSZ]; */
X char msgbuf[BUFSZ];
X#else
X static char msgbuf[BUFSZ];
X#endif
X /* note: ftmp->oc_name usually works, the exception being
X * for fruits. If fruits are changed to take more time to
X * eat, this has to be modified.
X */
X if (otmp->otyp != CORPSE)
X Sprintf(msgbuf, "You finish eating the %s.",
X ftmp->oc_name);
X else
X Sprintf(msgbuf, "You finish eating the %s corpse.",
X mons[otmp->corpsenm].mname);
X nomovemsg = msgbuf;
X }
X useup(otmp);
X return(1);
X}
X
X/* called in main.c */
Xvoid
Xgethungry(){
X --u.uhunger;
X if(moves % 2) {
X if(HRegeneration) u.uhunger--;
X if(Hunger) u.uhunger--;
X /* a3: if(Hunger & LEFT_RING) u.uhunger--;
X if(Hunger & RIGHT_RING) u.uhunger--;
X etc. */
X }
X if(moves % 20 == 0) { /* jimt@asgb */
X /* +0 rings don't do anything, so don't affect hunger */
X if(uleft && uleft->otyp && (!objects[uleft->otyp].oc_charged
X || uleft->spe)) u.uhunger--;
X if(uright && uright->otyp && (!objects[uright->otyp].oc_charged
X || uright->spe)) u.uhunger--;
X if(uamul) u.uhunger--;
X if(u.uhave_amulet) u.uhunger--;
X }
X newuhs(TRUE);
X}
X
X/* called after vomiting and after performing feats of magic */
Xvoid
Xmorehungry(num)
Xregister int num;
X{
X u.uhunger -= num;
X newuhs(TRUE);
X}
X
X/* called after eating something (and after drinking fruit juice) */
Xvoid
Xlesshungry(num)
Xregister int num;
X{
X u.uhunger += num;
X if(u.uhunger >= 2000) choke((struct objclass *) 0);
X else {
X /* Have lesshungry() report when you're nearly full so all eating
X * warns when you're about to choke.
X */
X if (u.uhunger >= 1500) {
X pline("You're having a hard time getting all of it down.");
X multi -= 2;
X nomovemsg = "You're finally finished.";
X }
X }
X newuhs(FALSE);
X}
X
Xstatic int
Xunfaint() {
X (void) Hear_again();
X u.uhs = FAINTING;
X flags.botl = 1;
X return 0;
X}
X
Xvoid
Xnewuhs(incr) boolean incr; {
X register int newhs, h = u.uhunger;
X
X newhs = (h > 1000) ? SATIATED :
X (h > 150) ? NOT_HUNGRY :
X (h > 50) ? HUNGRY :
X (h > 0) ? WEAK : FAINTING;
X
X if(newhs == FAINTING) {
X if(u.uhs == FAINTED) newhs = FAINTED;
X if(u.uhs <= WEAK || rn2(20-u.uhunger/10) >= 19) {
X if(u.uhs != FAINTED && multi >= 0 /* %% */) {
X You("faint from lack of food.");
X flags.soundok = 0;
X nomul(-10+(u.uhunger/10));
X nomovemsg = "You regain consciousness.";
X afternmv = unfaint;
X newhs = FAINTED;
X }
X } else
X if(u.uhunger < -(int)(200 + 20*ACURR(A_CON))) {
X u.uhs = STARVED;
X flags.botl = 1;
X bot();
X You("die from starvation.");
X done("starved");
X }
X }
X
X if(newhs != u.uhs) {
X if(newhs >= WEAK && u.uhs < WEAK)
X losestr(1); /* this may kill you -- see below */
X else if(newhs < WEAK && u.uhs >= WEAK)
X losestr(-1);
X switch(newhs){
X case HUNGRY:
X if (Hallucination) {
X pline((!incr) ?
X "You now have a lesser case of the munchies." :
X "You are getting the munchies.");
X } else
X You((!incr) ? "only feel hungry now." :
X (u.uhunger < 145) ? "feel hungry." :
X "are beginning to feel hungry.");
X break;
X case WEAK:
X if (Hallucination)
X pline((!incr) ?
X "You still have the munchies." :
X "The munchies are starting to interfere with your motor capabilities.");
X else
X You((!incr) ? "feel weak now." :
X (u.uhunger < 45) ? "feel weak." :
X "are beginning to feel weak.");
X break;
X }
X u.uhs = newhs;
X flags.botl = 1;
X if(u.uhp < 1) {
X You("die from hunger and exhaustion.");
X killer = "exhaustion";
X done("starved");
X }
X }
X}
X
Xstruct obj *
Xfloorfood(verb,corpseonly)
Xchar *verb;
Xint corpseonly;
X{
X register struct obj *otmp;
X
X /* Is there some food (probably a heavy corpse) here on the ground? */
X if(!Levitation && !u.uswallow) {
X if(levl[u.ux][u.uy].omask)
X for(otmp = fobj; otmp; otmp = otmp->nobj) {
X if(otmp->ox == u.ux && otmp->oy == u.uy &&
X (otmp->otyp==CORPSE ||
X (!corpseonly && otmp->olet == FOOD_SYM))) {
X pline("There %s %s here; %s %s? ",
X (otmp->quan == 1) ? "is" : "are",
X doname(otmp), verb,
X (otmp->quan == 1) ? "it" : "one");
X if(yn() == 'y') {
X if(otmp->quan != 1)
X (void) splitobj(otmp, 1);
X freeobj(otmp);
X otmp = addinv(otmp);
X addtobill(otmp, TRUE);
X if(Invisible) newsym(u.ux, u.uy);
X return otmp;
X }
X }
X }
X }
X return getobj(comestibles, verb);
X}
X
X/* Side effects of vomiting */
X/* TO DO: regurgitate swallowed monsters when poly'd */
Xvoid
Xvomit() { /* A good idea from David Neves */
X make_sick(0L,TRUE);
X}
END_OF_FILE
if test 19624 -ne `wc -c <'src/eat.c'`; then
echo shar: \"'src/eat.c'\" unpacked with wrong size!
fi
# end of 'src/eat.c'
fi
echo shar: End of archive 16 \(of 38\).
cp /dev/null ark16isdone
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