Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!wasatch!cs.utexas.edu!uunet!zephyr.ens.tek.com!tekgen!tekred!saab!billr
From: billr@saab.CNA.TEK.COM (Bill Randle)
Newsgroups: comp.sources.games
Subject: v08i008: NetHack3 - display oriented dungeons & dragons (Ver. 3.0), Patch2c
Message-ID: <4460@tekred.CNA.TEK.COM>
Date: 18 Aug 89 15:48:35 GMT
Sender: nobody@tekred.CNA.TEK.COM
Lines: 2210
Approved: billr@saab.CNA.TEK.COM
Submitted-by: Izchak Miller
Posting-number: Volume 8, Issue 8
Archive-name: NetHack3/Patch2c
Patch-To: NetHack3: Volume 7, Issue 56-93
#! /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 'patch02c' <<'END_OF_FILE'
X*** src/Old/Makefile.src Wed Aug 16 12:10:18 1989
X--- src/Makefile.src Fri Aug 11 15:13:19 1989
X***************
X*** 5,11 ****
X # Makefile.3B2, Makefile.att, and Makefile.tos.
X # Set SYSTEM to one of:
X # 'Sysunix' -- generic UNIX
X! # 'Sysxenix' -- 286 Xenix (386 Xenix can use Sysunix)
X # 'Sys3B2' -- AT&T 3B2, 3B5, etc.
X # 'Sysatt' -- AT&T UNIXPC, 7300, 3B1
X # 'Systos' -- Atari
X--- 5,11 ----
X # Makefile.3B2, Makefile.att, and Makefile.tos.
X # Set SYSTEM to one of:
X # 'Sysunix' -- generic UNIX
X! # 'Sysxenix' -- 286 Xenix (386 Xenix should use Sysunix)
X # 'Sys3B2' -- AT&T 3B2, 3B5, etc.
X # 'Sysatt' -- AT&T UNIXPC, 7300, 3B1
X # 'Systos' -- Atari
X***************
X*** 60,65 ****
X--- 60,66 ----
X # Spanic.o
X
X # on some systems the termcap library is in -ltermcap or -lcurses
X+ # on 386 Xenix, the -ltermlib tputs() seems not to work; use -lcurses instead
X # Sysatt uses shared library in lieu of this option
X # TERMLIB = -ltermcap
X # TERMLIB = -lcurses
X***************
X*** 100,107 ****
X
X # all .c that are part of the main NetHack program and are not system specific
X
X! CSOURCES = $(HACKCSRC) $(TARG)main.c $(TARG)main.c $(TARG)main.c makedefs.c panic.c
X
X HACKINCL = artifact.h attrib.h config.h coord.h decl.h edog.h epri.h eshk.h\
X extern.h flag.h func_tab.h global.h gold.h hack.h lev.h mfndpos.h\
X mkroom.h monattk.h mondata.h monflag.h monst.h monsym.h msdos.h\
X--- 101,113 ----
X
X # all .c that are part of the main NetHack program and are not system specific
X
X! # now the other .c files, with duplicates commented out
X! MAKESRC = makedefs.c panic.c # monst.c objects.c
X! SPLEVSRC = lev_comp.c lev_lex.c lev_main.c # alloc.c monst.c objects.c panic.c
X! TARGSRC = $(TARG)main.c $(TARG)tty.c $(TARG)unix.c
X
X+ CSOURCES = $(HACKCSRC) $(TARGSRC) $(MAKESRC) $(SPLEVSRC)
X+
X HACKINCL = artifact.h attrib.h config.h coord.h decl.h edog.h epri.h eshk.h\
X extern.h flag.h func_tab.h global.h gold.h hack.h lev.h mfndpos.h\
X mkroom.h monattk.h mondata.h monflag.h monst.h monsym.h msdos.h\
X***************
X*** 110,117 ****
X
X # all .h files except date.h, onames.h, pm.h & trap.h which would cause
X # dependency loops if run through "make depend".
X
X! HSOURCES = $(HACKINCL) date.h onames.h pm.h trap.h
X
X SOURCES = $(CSOURCES) $(HSOURCES)
X
X--- 116,124 ----
X
X # all .h files except date.h, onames.h, pm.h & trap.h which would cause
X # dependency loops if run through "make depend".
X+ # and lev_comp.h, a special level file
X
X! HSOURCES = $(HACKINCL) date.h onames.h pm.h trap.h lev_comp.h
X
X SOURCES = $(CSOURCES) $(HSOURCES)
X
X***************
X*** 265,271 ****
X # files, we kludge around this by making date.h dependent on hack.h,
X # even though it doesn't include this file.
X #
X! ../include/date.h: $(CSOURCES) ../include/hack.h makedefs
X ./makedefs -v
X
X ../include/trap.h: ../include/config.h makedefs
X--- 272,278 ----
X # files, we kludge around this by making date.h dependent on hack.h,
X # even though it doesn't include this file.
X #
X! ../include/date.h: $(HACKCSRC) $(TARGSRC) ../include/hack.h makedefs
X ./makedefs -v
X
X ../include/trap.h: ../include/config.h makedefs
X***************
X*** 300,306 ****
X # doweararm() versus dowearring().
X # _flsbuf comes from , a bug in the system libraries.
X @echo lint -axbh -DLINT ...
X! @lint -axbh -I../include -DLINT $(HACKCSRC) $(TARG)main.c $(TARG)tty.c $(TARG)unix.c | sed '/_flsbuf/d'
X
X
X diff:
X--- 307,313 ----
X # doweararm() versus dowearring().
X # _flsbuf comes from , a bug in the system libraries.
X @echo lint -axbh -DLINT ...
X! @lint -axbh -I../include -DLINT $(HACKCSRC) $(TARGSRC) | sed '/_flsbuf/d'
X
X
X diff:
X*** src/Old/apply.c Wed Aug 16 12:11:01 1989
X--- src/apply.c Tue Aug 15 22:58:25 1989
X***************
X*** 24,31 ****
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--- 24,31 ----
X
X if(sym) {
X Tmp_at2(-1, sym); /* open call */
X! #ifdef TEXTCOLOR
X! Tmp_at2(-3, WHITE);
X #endif
X }
X while(range--) {
X***************
X*** 305,312 ****
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--- 305,311 ----
X pline("This %s is already leashed!", lmonnam(mtmp)+4);
X return;
X }
X! You("slip the leash around your %s.", lmonnam(mtmp)+4);
X mtmp->mleashed = 1;
X obj->leashmon = (int)mtmp->m_id;
X if(mtmp->msleep) mtmp->msleep = 0;
X***************
X*** 490,496 ****
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--- 489,498 ----
X if (break_statue(obj))
X digtxt = "The statue shatters.";
X else
X! /* it was a statue trap; break_statue()
X! * printed a message and updated the screen
X! */
X! digtxt = NULL;
X } else if(!lev->typ || lev->typ == SCORR) {
X lev->typ = CORR;
X digtxt = "You succeeded in cutting away some rock.";
X***************
X*** 518,524 ****
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--- 520,526 ----
X digtxt = "Now what exactly was it that you were digging in?";
X mnewsym(dpx, dpy);
X prl(dpx, dpy);
X! if (digtxt) 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*** 747,761 ****
X use_mirror(obj)
X struct 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--- 749,768 ----
X use_mirror(obj)
X struct 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(obj->cursed && !rn2(2)) {
X+ if (!Blind)
X+ pline("The mirror gets foggy and doesn't reflect!");
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***************
X*** 788,794 ****
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--- 795,801 ----
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***************
X*** 838,898 ****
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--- 845,916 ----
X (u.dz > 0) ? "floor" : "ceiling");
X return;
X }
X! if(!(mtmp = bchit(u.dx, u.dy, COLNO, 0)) || !haseyes(mtmp->data))
X! return;
X!
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! /* some monsters do special things */
X! } else if (mlet == S_VAMPIRE || mlet == S_DEMON || mlet == S_GHOST ||
X! (mtmp->minvis && !perceives(mtmp->data) && !See_invisible)) {
X if (!Blind)
X pline ("%s doesn't seem to reflect anything.", Monnam(mtmp));
X! } else if(!mtmp->mcan && 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->mcan && !mtmp->minvis &&
X! mtmp->data == &mons[PM_FLOATING_EYE]) {
X! /* Note: floating eyes cannot use their abilities while invisible,
X! * but medusas and umber hulks can.
X! */
X! if (!Blind)
X pline("%s is frozen by its reflection.",Monnam(mtmp));
X! mtmp->mfroz = 1;
X! } else if(!mtmp->mcan && mtmp->data == &mons[PM_UMBER_HULK]) {
X! if (!Blind)
X pline ("%s has confused itself!", Monnam(mtmp));
X! mtmp->mconf = 1;
X! } else if(!mtmp->mcan && !mtmp->minvis && (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! } else if (mlet != S_UNICORN && !humanoid(mtmp->data) &&
X! (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
X if (!Blind)
X! pline ("%s is frightened by its reflection%s.",
X! Monnam(mtmp), (mtmp->minvis && !See_invisible
X! && !Telepat) ?
X! ", though you see nothing" : "");
X mtmp->mflee = 1;
X mtmp->mfleetim += d(2,4);
X! } else if (!Blind) {
X! if (mtmp->minvis && !See_invisible)
X! pline("%s doesn't seem to reflect anything.",
X! Monnam(mtmp));
X! else if (mtmp->minvis && !perceives(mtmp->data))
X! pline("%s doesn't seem to be aware of its reflection.",
X! Monnam(mtmp));
X! else
X! pline("%s doesn't seem to mind %s reflection.",
X! Monnam(mtmp), (is_female(mtmp) ? "her" :
X! is_human(mtmp->data) ? "his" : "its"));
X }
X }/* use_mirror */
X
X***************
X*** 1048,1053 ****
X--- 1066,1073 ----
X return 0;
X }
X pline("Where do you want to jump?");
X+ cc.x = u.ux;
X+ cc.y = u.uy;
X getpos(&cc, 1, "the desired position");
X if (dist(cc.x, cc.y) > 9) {
X pline("Too far!");
X***************
X*** 1095,1101 ****
X pline("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--- 1115,1121 ----
X pline("Tinning a cockatrice corpse without gloves was not a very wise move...");
X You("turn to stone...");
X killer = "unwise tinning decision";
X! done(STONING);
X }
X can = mksobj(TIN,FALSE);
X can->corpsenm = corpse->corpsenm;
X*** src/Old/bones.c Wed Aug 16 12:12:22 1989
X--- src/bones.c Tue Aug 15 21:55:10 1989
X***************
X*** 42,47 ****
X--- 42,50 ----
X {
X return (lev == medusa_level ||
X lev == wiz_level
X+ #ifdef REINCARNATION
X+ || lev == rogue_level
X+ #endif
X #ifdef STRONGHOLD
X || lev == stronghold_level ||
X (lev >= tower_level && lev <= tower_level+2)
X***************
X*** 240,246 ****
X--- 243,251 ----
X savefruitchn(fd);
X #endif
X savelev(fd, dlevel, COUNT);
X+ #ifdef ZEROCOMP
X bflush(fd);
X+ #endif
X if (bytes_counted > freediskspace(bones)) { /* not enough room */
X #ifdef WIZARD
X if (wizard)
X*** src/Old/cmd.c Wed Aug 16 12:12:44 1989
X--- src/cmd.c Tue Aug 15 22:58:59 1989
X***************
X*** 90,95 ****
X--- 90,115 ----
X return multi > 0;
X }
X
X+ /* If you have moved since initially setting some occupations, they
X+ * now shouldn't be able to restart.
X+ *
X+ * The basic rule is that if you are carrying it, you can continue
X+ * since it is with you. If you are acting on something at a distance,
X+ * your orientation to it must have changed when you moved.
X+ *
X+ * The exception to this is taking off items, since they can be taken
X+ * off in a number of ways in the intervening time, screwing up ordering.
X+ *
X+ * Currently: Take off all armor.
X+ * Picking Locks / Forcing Chests.
X+ */
X+ void
X+ reset_occupations() {
X+
X+ reset_remarm();
X+ reset_pick();
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 */
X***************
X*** 417,443 ****
X }
X #endif /* WIZARD || EXPLORE_MODE */
X
X const 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--- 437,465 ----
X }
X #endif /* WIZARD || EXPLORE_MODE */
X
X+ #define M(c) (0x80 | (c))
X+ #define C(c) (0x1f & (c))
X const struct func_tab cmdlist[]={
X! {C('d'), dokick}, /* "D" is for door!...? */
X #ifdef WIZARD
X! {C('e'), wiz_detect},
X! {C('f'), wiz_map},
X! {C('g'), wiz_genesis},
X! {C('i'), wiz_identify},
X! {C('o'), wiz_where},
X #endif
X! {C('p'), doredotopl},
X! {C('r'), doredraw},
X! {C('t'), dotele},
X #ifdef WIZARD
X! {C('v'), wiz_level_tele},
X! {C('w'), wiz_wish},
X #endif
X #if defined(WIZARD) || defined(EXPLORE_MODE)
X! {C('x'), wiz_attributes},
X #endif
X #ifdef SUSPEND
X! {C('z'), dosuspend},
X #endif
X {'a', doapply},
X {'A', doddoremarm},
X***************
X*** 444,451 ****
X--- 466,475 ----
X /* 'b', 'B' : go sw */
X {'c', doclose},
X {'C', do_mname},
X+ {M('c'), dotalk},
X {'d', dodrop},
X {'D', doddrop},
X+ {M('d'), dodip},
X {'e', doeat},
X {'E', doengrave},
X /* Soon to be
X***************
X*** 452,457 ****
X--- 476,482 ----
X {'f', dofight, "fighting"},
X {'F', doFight, "fighting"},
X */
X+ {M('f'), doforce},
X /* 'g', 'G' : multiple go */
X /* 'h', 'H' : go west */
X {'h', dohelp}, /* if number_pad is set */
X***************
X*** 459,486 ****
X--- 484,528 ----
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+ {M('j'), dojump},
X {'k', dokick}, /* if number_pad is on */
X {'l', doloot}, /* if number_pad is on */
X+ {M('l'), doloot},
X /* 'n' prefixes a count if number_pad is on */
X+ #ifdef POLYSELF
X+ {M('m'), domonability},
X+ #endif /* POLYSELF */
X {'N', ddocall}, /* if number_pad is on */
X+ {M('N'), ddocall},
X {'o', doopen},
X {'O', doset},
X+ #ifdef THEOLOGY
X+ {M('o'), dosacrifice},
X+ #endif /* THEOLOGY */
X {'p', dopay},
X {'P', doputon},
X+ #ifdef THEOLOGY
X+ {M('p'), dopray},
X+ #endif /* THEOLOGY */
X {'q', dodrink},
X {'Q', done2},
X {'r', doread},
X {'R', doremring},
X+ {M('r'), dorub},
X {'s', dosearch, "searching"},
X {'S', dosave},
X+ {M('s'), dosit},
X {'t', dothrow},
X {'T', dotakeoff},
X+ {M('t'), doturn},
X /* 'u', 'U' : go ne */
X {'u', dountrap}, /* if number_pad is on */
X+ {M('u'), dountrap},
X {'v', doversion},
X {'V', dohistory},
X {'w', dowield},
X {'W', dowear},
X+ {M('w'), dowipe},
X #ifdef SPELLS
X {'x', dovspell}, /* Mike Stephenson */
X #endif
X***************
X*** 516,521 ****
X--- 558,565 ----
X {'#', doextcmd},
X {0,0,0}
X };
X+ #undef M
X+ #undef C
X
X const struct ext_func_tab extcmdlist[] = {
X "chat", "talk to someone", dotalk, /* converse? */
X***************
X*** 618,624 ****
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--- 662,668 ----
X goto rush;
X }
X while(tlist->f_char) {
X! if((*cmd & 0xff) == (tlist->f_char & 0xff)){
X /* Special case of *cmd == ' ' handled here */
X if (*cmd == ' ' && flags.no_rest_on_space)
X break;
X***************
X*** 642,647 ****
X--- 686,696 ----
X while(*cmd && cp-expcmd < sizeof(expcmd)-2) {
X if(*cmd >= 040 && *cmd < 0177)
X *cp++ = *cmd++;
X+ else if (*cmd & 0200) {
X+ *cp++ = 'M';
X+ *cp++ = '-';
X+ *cp++ = *cmd++ &=~ 0200;
X+ }
X else {
X *cp++ = '^';
X *cp++ = *cmd++ ^ 0100;
X*** src/Old/dbridge.c Wed Aug 16 12:13:20 1989
X--- src/dbridge.c Tue Aug 15 20:34:01 1989
X***************
X*** 62,76 ****
X struct rm *lev;
X
X lev = &levl[x][y];
X! if ( lev->typ == VWALL || lev->typ == DOOR) {
X! if (IS_DRAWBRIDGE(levl[x+1][y].typ) &&
X! (levl[x+1][y].drawbridgemask & DB_DIR) == DB_WEST)
X return (DB_WEST);
X if (IS_DRAWBRIDGE(levl[x-1][y].typ) &&
X (levl[x-1][y].drawbridgemask & DB_DIR) == DB_EAST)
X return (DB_EAST);
X! }
X! if ( lev->typ == HWALL || lev->typ == DOOR) {
X if (IS_DRAWBRIDGE(levl[x][y-1].typ) &&
X (levl[x][y-1].drawbridgemask & DB_DIR) == DB_SOUTH)
X return (DB_SOUTH);
X--- 62,80 ----
X struct rm *lev;
X
X lev = &levl[x][y];
X! if (lev->typ != DOOR && !(lev->diggable & W_GATEWAY))
X! return (-1);
X! switch (lev->typ) {
X! case DOOR:
X! case VWALL:
X! if (IS_DRAWBRIDGE(levl[x+1][y].typ) &&
X! (levl[x+1][y].drawbridgemask & DB_DIR) == DB_WEST)
X return (DB_WEST);
X if (IS_DRAWBRIDGE(levl[x-1][y].typ) &&
X (levl[x-1][y].drawbridgemask & DB_DIR) == DB_EAST)
X return (DB_EAST);
X! if (lev->typ == VWALL) break;
X! case HWALL:
X if (IS_DRAWBRIDGE(levl[x][y-1].typ) &&
X (levl[x][y-1].drawbridgemask & DB_DIR) == DB_SOUTH)
X return (DB_SOUTH);
X***************
X*** 252,258 ****
X
X You("are crushed by a falling portcullis.");
X killer = "closing drawbridge";
X! done("died");
X /* So, you didn't die */
X pline("A %s force teleports you away...",
X Hallucination ? "normal" : "strange");
X--- 256,262 ----
X
X You("are crushed by a falling portcullis.");
X killer = "closing drawbridge";
X! done(CRUSHING);
X /* So, you didn't die */
X pline("A %s force teleports you away...",
X Hallucination ? "normal" : "strange");
X***************
X*** 295,301 ****
X newsym(x2,y2);
X You("are hit by the descending drawbridge!");
X killer = "descending drawbridge";
X! done("died");
X }
X redosym(x,y);
X redosym(x2,y2);
X--- 299,305 ----
X newsym(x2,y2);
X You("are hit by the descending drawbridge!");
X killer = "descending drawbridge";
X! done(CRUSHING);
X }
X redosym(x,y);
X redosym(x2,y2);
X***************
X*** 354,360 ****
X
X You("are crushed by a falling portcullis.");
X killer = "collapsing drawbridge";
X! done("died");
X /* So, you didn't die */
X pline("A %s force teleports you away...",
X Hallucination ? "normal" : "strange");
X--- 358,364 ----
X
X You("are crushed by a falling portcullis.");
X killer = "collapsing drawbridge";
X! done(CRUSHING);
X /* So, you didn't die */
X pline("A %s force teleports you away...",
X Hallucination ? "normal" : "strange");
X*** src/Old/decl.c Wed Aug 16 12:13:39 1989
X--- src/decl.c Fri Aug 11 17:05:27 1989
X***************
X*** 71,78 ****
X /* set up in termcap.c */
X int CO = 0, LI = 0; /* set up in termcap.c: usually COLNO and ROWNO+3 */
X
X! #ifdef MSDOSCOLOR
X! char *HI_RED, *HI_YELLOW, *HI_GREEN, *HI_BLUE, *HI_WHITE; /* termcap.c */
X #endif
X
X #ifdef MSDOS
X--- 71,78 ----
X /* set up in termcap.c */
X int CO = 0, LI = 0; /* set up in termcap.c: usually COLNO and ROWNO+3 */
X
X! #ifdef TEXTCOLOR
X! char *HI_COLOR[8]; /* terminal escapes for the various colors */
X #endif
X
X #ifdef MSDOS
X*** src/Old/demon.c Wed Aug 16 12:13:54 1989
X--- src/demon.c Tue Aug 15 22:05:37 1989
X***************
X*** 10,15 ****
X--- 10,16 ----
X {
X register int dtype, cnt = 0;
X
X+ #ifdef HARD
X if(is_dprince(ptr) || (ptr == &mons[PM_WIZARD_OF_YENDOR])) {
X
X dtype = (!rn2(20)) ? dprince() : (!rn2(4)) ? dlord() : ndemon();
X***************
X*** 27,32 ****
X--- 28,37 ----
X }
X
X if(!dtype) return;
X+ #else
X+ dtype = PM_DEMON;
X+ cnt = 1;
X+ #endif
X
X while(cnt > 0) {
X
X***************
X*** 100,110 ****
X }
X #endif
X
X! #if defined(HARD) || (defined(ALTARS) && defined(SOUNDS))
X long
X bribe(mtmp)
X!
X! struct monst *mtmp;
X {
X char buf[80];
X long offer;
X--- 105,114 ----
X }
X #endif
X
X! #if defined(HARD) || (defined(ALTARS) && defined(THEOLOGY))
X long
X bribe(mtmp)
X! struct monst *mtmp;
X {
X char buf[80];
X long offer;
X***************
X*** 118,127 ****
X You("try to shortchange %s, but fumble.",
X x_monnam(mtmp, 0));
X offer = 0L;
X } else if(offer >= u.ugold) {
X You("give %s all your gold.", x_monnam(mtmp, 0));
X offer = u.ugold;
X! } else You("give %s %ld Zorkmids.", x_monnam(mtmp, 0), offer);
X
X u.ugold -= offer;
X return(offer);
X--- 122,134 ----
X You("try to shortchange %s, but fumble.",
X x_monnam(mtmp, 0));
X offer = 0L;
X+ } else if(offer == 0L) {
X+ You("refuse.");
X } else if(offer >= u.ugold) {
X You("give %s all your gold.", x_monnam(mtmp, 0));
X offer = u.ugold;
X! } else You("give %s %ld Zorkmid%s.", x_monnam(mtmp, 0), offer,
X! offer == 1 ? "" : "s");
X
X u.ugold -= offer;
X return(offer);
X***************
X*** 131,166 ****
X int
X dprince() {
X #ifdef HARD
X! int tryct;
X! struct permonst *ptr;
X!
X! for(tryct = 0; tryct < 20; tryct++)
X! if(is_dprince((ptr = mkclass(S_DEMON))))
X! return(monsndx(ptr));
X
X #endif
X- return(dlord());
X }
X
X int
X dlord() {
X #ifdef HARD
X! int tryct;
X! struct permonst *ptr;
X!
X! for(tryct = 0; tryct < 20; tryct++)
X! if(is_dlord((ptr = mkclass(S_DEMON))))
X! return(monsndx(ptr));
X
X #endif
X- return(ndemon());
X }
X
X int
X ndemon() {
X! #ifndef HARD
X! return(PM_DEMON);
X! #else
X int tryct;
X struct permonst *ptr;
X
X--- 138,175 ----
X int
X dprince() {
X #ifdef HARD
X! int tryct, pm;
X
X+ for(tryct = 0; tryct < 20; tryct++) {
X+ pm = rn1(PM_DEMOGORGON + 1 - PM_ORCUS, PM_ORCUS);
X+ if(!(mons[pm].geno & G_GENOD))
X+ return(pm);
X+ }
X+ return(dlord()); /* approximate */
X+ #else
X+ return(PM_DEMON);
X #endif
X }
X
X int
X dlord() {
X #ifdef HARD
X! int tryct, pm;
X
X+ for(tryct = 0; tryct < 20; tryct++) {
X+ pm = rn1(PM_YEENOGHU + 1 - PM_JUIBLEX, PM_JUIBLEX);
X+ if(!(mons[pm].geno & G_GENOD))
X+ return(pm);
X+ }
X+ return(ndemon()); /* approximate */
X+ #else
X+ return(PM_DEMON);
X #endif
X }
X
X int
X ndemon() {
X! #ifdef HARD
X int tryct;
X struct permonst *ptr;
X
X***************
X*** 169,173 ****
X--- 178,184 ----
X return(monsndx(ptr));
X
X return(0);
X+ #else
X+ return(PM_DEMON);
X #endif
X }
X*** src/Old/do.c Fri Jul 28 01:58:01 1989
X--- src/do.c Wed Aug 16 22:13:57 1989
X***************
X*** 285,291
X /* turn water into [(un)holy] water */
X if (obj->otyp == POT_WATER) {
X obj->blessed = !!(levl[u.ux][u.uy].altarmask & A_LAW);
X! obj->cursed = !!(levl[u.ux][u.uy].altarmask & A_CHAOS);
X }
X doaltarobj(obj); /* set bknown */
X } else
X
X--- 285,292 -----
X /* turn water into [(un)holy] water */
X if (obj->otyp == POT_WATER) {
X obj->blessed = !!(levl[u.ux][u.uy].altarmask & A_LAW);
X! obj->cursed =
X! !(levl[u.ux][u.uy].altarmask & (A_LAW | A_NEUTRAL));
X }
X doaltarobj(obj); /* set bknown */
X } else
X***************
X*** 342,347
X dodown()
X {
X struct trap *trap = 0;
X #ifdef STRONGHOLD
X if((u.ux != xdnstair || u.uy != ydnstair) &&
X (!xdnladder || u.ux != xdnladder || u.uy != ydnladder)) {
X
X--- 343,350 -----
X dodown()
X {
X struct trap *trap = 0;
X+
X+ if((u.ux != xdnstair || u.uy != ydnstair)
X #ifdef STRONGHOLD
X && (!xdnladder || u.ux != xdnladder || u.uy != ydnladder)
X #endif
X***************
X*** 343,353
X {
X struct trap *trap = 0;
X #ifdef STRONGHOLD
X! if((u.ux != xdnstair || u.uy != ydnstair) &&
X! (!xdnladder || u.ux != xdnladder || u.uy != ydnladder)) {
X! #else
X! if(u.ux != xdnstair || u.uy != ydnstair) {
X! #endif /* STRONGHOLD /**/
X if (!(trap = t_at(u.ux,u.uy)) || trap->ttyp != TRAPDOOR
X || !trap->tseen) {
X You("can't go down here.");
X
X--- 346,354 -----
X
X if((u.ux != xdnstair || u.uy != ydnstair)
X #ifdef STRONGHOLD
X! && (!xdnladder || u.ux != xdnladder || u.uy != ydnladder)
X! #endif
X! ) {
X if (!(trap = t_at(u.ux,u.uy)) || trap->ttyp != TRAPDOOR
X || !trap->tseen) {
X You("can't go down here.");
X***************
X*** 364,370
X levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
X #else
X pline("You're floating high above the stairs.");
X! #endif /* STRONGHOLD /**/
X return(0);
X }
X
X
X--- 365,371 -----
X levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
X #else
X pline("You're floating high above the stairs.");
X! #endif
X return(0);
X }
X
X***************
X*** 393,398
X int
X doup()
X {
X #ifdef STRONGHOLD
X if((u.ux != xupstair || u.uy != yupstair) &&
X (!xupladder || u.ux != xupladder || u.uy != yupladder)) {
X
X--- 394,400 -----
X int
X doup()
X {
X+ if((u.ux != xupstair || u.uy != yupstair)
X #ifdef STRONGHOLD
X && (!xupladder || u.ux != xupladder || u.uy != yupladder)
X #endif
X***************
X*** 394,404
X doup()
X {
X #ifdef STRONGHOLD
X! if((u.ux != xupstair || u.uy != yupstair) &&
X! (!xupladder || u.ux != xupladder || u.uy != yupladder)) {
X! #else
X! if(u.ux != xupstair || u.uy != yupstair) {
X! #endif /* STRONGHOLD /**/
X You("can't go up here.");
X return(0);
X }
X
X--- 396,404 -----
X {
X if((u.ux != xupstair || u.uy != yupstair)
X #ifdef STRONGHOLD
X! && (!xupladder || u.ux != xupladder || u.uy != yupladder)
X! #endif
X! ) {
X You("can't go up here.");
X return(0);
X }
X***************
X*** 413,419
X levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
X #else
X Your("load is too heavy to climb the stairs.");
X! #endif /* STRONGHOLD /**/
X return(1);
X }
X
X
X--- 413,419 -----
X levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
X #else
X Your("load is too heavy to climb the stairs.");
X! #endif
X return(1);
X }
X
X***************
X*** 464,470
X newlevel = ENDLEVEL; /* Endgame Level !!! */
X else
X #endif
X! done("escaped"); /* in fact < 0 is impossible */
X
X /* If you have the amulet and are trying to get out of Hell, going
X * up a set of stairs sometimes does some very strange things!
X
X--- 464,470 -----
X newlevel = ENDLEVEL; /* Endgame Level !!! */
X else
X #endif
X! done(ESCAPED); /* in fact < 0 is impossible */
X
X /* If you have the amulet and are trying to get out of Hell, going
X * up a set of stairs sometimes does some very strange things!
X***************
X*** 510,516
X You("die...");
X dlevel = maxdlevel = newlevel;
X killer = "visit to hell";
X! done("burned");
X dlevel = newlevel = save_dlevel; /* in case they survive */
X }
X }
X
X--- 510,516 -----
X You("die...");
X dlevel = maxdlevel = newlevel;
X killer = "visit to hell";
X! done(BURNING);
X dlevel = newlevel = save_dlevel; /* in case they survive */
X }
X }
X***************
X*** 615,621
X #endif
X pline("Cannot open %s .", lock);
X pline("Probably someone removed it.");
X! done("tricked");
X }
X #ifdef ZEROCOMP
X minit();
X
X--- 615,621 -----
X #endif
X pline("Cannot open %s .", lock);
X pline("Probably someone removed it.");
X! done(TRICKED);
X }
X #ifdef ZEROCOMP
X minit();
X***************
X*** 734,739
X if (dlevel == 1 && u.uhave_amulet && flags.no_of_wizards == 0)
X resurrect();
X #endif
X }
X
X int
X
X--- 734,740 -----
X if (dlevel == 1 && u.uhave_amulet && flags.no_of_wizards == 0)
X resurrect();
X #endif
X+ is_maze_lev = !xdnstair;
X }
X
X int
X*** src/Old/do_name.c Wed Aug 16 12:14:43 1989
X--- src/do_name.c Fri Aug 11 16:42:20 1989
X***************
X*** 34,41 ****
X register int cx, cy, i, c;
X char *sdp = flags.num_pad ? ndir : sdir;
X if(flags.verbose) pline("(For instructions type a ?)");
X! cx = u.ux;
X! cy = u.uy;
X curs(cx,cy+2);
X while((c = readchar()) != '.'){
X for(i=0; i<8; i++) if(sdp[i] == c){
X--- 34,41 ----
X register int cx, cy, i, c;
X char *sdp = flags.num_pad ? ndir : sdir;
X if(flags.verbose) pline("(For instructions type a ?)");
X! cx = cc->x;
X! cy = cc->y;
X curs(cx,cy+2);
X while((c = readchar()) != '.'){
X for(i=0; i<8; i++) if(sdp[i] == c){
X***************
X*** 46,58 ****
X goto nxtc;
X }
X if(c == '?'){
X- if(flags.verbose) {
X pline("Use [%s] to move the cursor to %s.",
X flags.num_pad ? "2468" : "hjkl", goal);
X pline("Type a . when you are at the right place.");
X- }
X } else {
X! pline("Unknown direction: '%s' (%s).",
X visctrl(c),
X force ?
X flags.num_pad ? "use 2468 or ." :
X--- 46,57 ----
X goto nxtc;
X }
X if(c == '?'){
X pline("Use [%s] to move the cursor to %s.",
X flags.num_pad ? "2468" : "hjkl", goal);
X pline("Type a . when you are at the right place.");
X } else {
X! if (!index(quitchars, c))
X! pline("Unknown direction: '%s' (%s).",
X visctrl(c),
X force ?
X flags.num_pad ? "use 2468 or ." :
X***************
X*** 80,85 ****
X--- 79,86 ----
X register char *curr;
X boolean blank;
X
X+ cc.x = u.ux;
X+ cc.y = u.uy;
X getpos(&cc, 0, "the monster you want to name");
X cx = cc.x;
X cy = cc.y;
X*** src/Old/do_wear.c Wed Aug 16 12:15:06 1989
X--- src/do_wear.c Tue Aug 15 18:49:53 1989
X***************
X*** 520,526 ****
X #endif
X break;
X case RIN_SEE_INVISIBLE:
X! if (Invisible && !Blind) {
X newsym(u.ux,u.uy);
X pline("Suddenly you can see yourself.");
X makeknown(RIN_SEE_INVISIBLE);
X--- 520,530 ----
X #endif
X break;
X case RIN_SEE_INVISIBLE:
X! if (Invis && !oldprop
X! #ifdef POLYSELF
X! && !perceives(uasmon)
X! #endif
X! && !Blind) {
X newsym(u.ux,u.uy);
X pline("Suddenly you can see yourself.");
X makeknown(RIN_SEE_INVISIBLE);
X***************
X*** 739,744 ****
X--- 743,749 ----
X pline("The bear trap prevents you from pulling your foot out.");
X return(0);
X }
X+ reset_remarm(); /* since you may change ordering */
X (void) armoroff(otmp);
X return(1);
X }
X***************
X*** 1386,1391 ****
X--- 1391,1399 ----
X return(1); /* get busy */
X }
X
X+ void
X+ reset_remarm() { taking_off = takeoff_mask =0L; }
X+
X int
X doddoremarm() {
X
X***************
X*** 1399,1404 ****
X--- 1407,1453 ----
X (void) ggetobj("take off", select_off, 0);
X if(takeoff_mask) return(take_off());
X else return(0);
X+ }
X+
X+ int
X+ destroy_arm(atmp)
X+ register struct obj *atmp;
X+ {
X+ register struct obj *otmp;
X+
X+ if((otmp = uarmc) && (!atmp || atmp == uarmc)) {
X+ Your("cloak crumbles and turns to dust!");
X+ (void) Cloak_off();
X+ useup(otmp);
X+ } else if((otmp = uarm) && (!atmp || atmp == uarm)) {
X+ Your("armor turns to dust and falls to the floor!");
X+ (void) Armor_gone();
X+ useup(otmp);
X+ #ifdef SHIRT
X+ } else if((otmp = uarmu) && (!atmp || atmp == uarmu)) {
X+ Your("shirt crumbles into tiny threads and falls apart!");
X+ useup(otmp);
X+ #endif
X+ } else if((otmp = uarmh) && (!atmp || atmp == uarmh)) {
X+ Your("helmet turns to dust and is blown away!");
X+ (void) Helmet_off();
X+ useup(otmp);
X+ } else if((otmp = uarmg) && (!atmp || atmp == uarmg)) {
X+ Your("gloves vanish!");
X+ (void) Gloves_off();
X+ useup(otmp);
X+ selftouch("You");
X+ } else if((otmp = uarmf) && (!atmp || atmp == uarmf)) {
X+ Your("boots disintegrate!");
X+ (void) Boots_off();
X+ useup(otmp);
X+ } else if((otmp =uarms) && (!atmp || atmp == uarms)) {
X+ Your("shield crumbles away!");
X+ (void) Shield_off();
X+ useup(otmp);
X+ } else return(0); /* could not destroy anything */
X+
X+ return(1);
X }
X
X void
X*** src/Old/dog.c Thu Aug 3 08:44:30 1989
X--- src/dog.c Fri Aug 18 08:13:38 1989
X***************
X*** 129,135 ****
X mtmp0->nmon = mtmp->nmon;
X mtmp->nmon = fmon;
X fmon = mtmp;
X! if (mtmp->isshk)
X home_shk(mtmp);
X else
X rloc(mtmp);
X--- 129,143 ----
X mtmp0->nmon = mtmp->nmon;
X mtmp->nmon = fmon;
X fmon = mtmp;
X! if (mtmp->data->geno & G_GENOD) {
X! #ifdef KOPS
X! allow_kops = FALSE;
X! #endif
X! mondead(mtmp); /* must put in fmon list first */
X! #ifdef KOPS
X! allow_kops = TRUE;
X! #endif
X! } else if (mtmp->isshk)
X home_shk(mtmp);
X else
X rloc(mtmp);
X***************
X*** 215,221 ****
X struct monst *mon;
X register struct obj *obj;
X {
X! boolean carn = carnivorous(mon->data);
X
X switch(obj->olet) {
X case FOOD_SYM:
X--- 223,230 ----
X struct monst *mon;
X register struct obj *obj;
X {
X! boolean carni = carnivorous(mon->data);
X! boolean herbi = herbivorous(mon->data);
X
X switch(obj->olet) {
X case FOOD_SYM:
X***************
X*** 223,249 ****
X !resists_ston(mon->data))
X return TABU;
X
X! if (!carn && !herbivorous(mon->data))
X return (obj->cursed ? UNDEF : APPORT);
X
X switch (obj->otyp) {
X case TRIPE_RATION:
X! return (carn ? DOGFOOD : MANFOOD);
X case EGG:
X if (obj->corpsenm == PM_COCKATRICE &&
X !resists_ston(mon->data))
X return POISON;
X! return (carn ? CADAVER : MANFOOD);
X case CORPSE:
X if ((obj->age+50 <= moves && mon->data->mlet != S_FUNGUS) ||
X (poisonous(&mons[obj->corpsenm]) &&
X !resists_poison(mon->data)))
X return POISON;
X! else return (carn ? CADAVER : MANFOOD);
X case DEAD_LIZARD:
X! return (carn ? ACCFOOD : MANFOOD);
X default:
X! return (obj->otyp < CARROT ? ACCFOOD : MANFOOD);
X }
X default:
X if(!obj->cursed) return(APPORT);
X--- 232,272 ----
X !resists_ston(mon->data))
X return TABU;
X
X! if (!carni && !herbi)
X return (obj->cursed ? UNDEF : APPORT);
X
X switch (obj->otyp) {
X case TRIPE_RATION:
X! return (carni ? DOGFOOD : MANFOOD);
X case EGG:
X if (obj->corpsenm == PM_COCKATRICE &&
X !resists_ston(mon->data))
X return POISON;
X! return (carni ? CADAVER : MANFOOD);
X case CORPSE:
X if ((obj->age+50 <= moves && mon->data->mlet != S_FUNGUS) ||
X (poisonous(&mons[obj->corpsenm]) &&
X !resists_poison(mon->data)))
X return POISON;
X! else return (carni ? CADAVER : MANFOOD);
X case DEAD_LIZARD:
X! return (carni ? ACCFOOD : MANFOOD);
X! case CLOVE_OF_GARLIC:
X! return (is_undead(mon->data) ? TABU :
X! (herbi ? ACCFOOD : MANFOOD));
X! case TIN:
X! return MANFOOD;
X! case APPLE:
X! case CARROT:
X! return (herbi ? DOGFOOD : MANFOOD);
X default:
X! #ifdef SLIME_MOLD
X! return (obj->otyp > SLIME_MOLD ?
X! #else
X! return (obj->otyp > CLOVE_OF_GARLIC ?
X! #endif
X! (carni ? ACCFOOD : MANFOOD) :
X! (herbi ? ACCFOOD : MANFOOD));
X }
X default:
X if(!obj->cursed) return(APPORT);
X***************
X*** 302,311 ****
X or get in your way */
X if(obj) {
X if(dogfood(mtmp, obj) >= MANFOOD) return(0);
X! if(cansee(mtmp->mx,mtmp->my)){
X! pline("%s devours the %s.", Monnam(mtmp),
X! objects[obj->otyp].oc_name);
X! }
X obfree(obj, (struct obj *)0);
X }
X mtmp2 = newmonst(sizeof(struct edog) + mtmp->mnamelth);
X--- 325,332 ----
X or get in your way */
X if(obj) {
X if(dogfood(mtmp, obj) >= MANFOOD) return(0);
X! if(cansee(mtmp->mx,mtmp->my))
X! pline("%s devours the %s.", Monnam(mtmp), xname(obj));
X obfree(obj, (struct obj *)0);
X }
X mtmp2 = newmonst(sizeof(struct edog) + mtmp->mnamelth);
X*** src/Old/dogmove.c Wed Aug 16 12:16:10 1989
X--- src/dogmove.c Tue Aug 15 18:49:35 1989
X***************
X*** 173,179 ****
X if(appr == 0){
X obj = invent;
X while(obj){
X! if(obj->otyp == TRIPE_RATION){
X appr = 1;
X break;
X }
X--- 173,179 ----
X if(appr == 0){
X obj = invent;
X while(obj){
X! if(dogfood(mtmp, obj) == DOGFOOD) {
X appr = 1;
X break;
X }
X***************
X*** 216,222 ****
X
X if(mtmp2->m_lev >= mtmp->m_lev+2 ||
X (mtmp2->data->mlet == S_COCKATRICE &&
X! !(mtmp->data->mflags1 & M1_STON_RES)))
X continue;
X if(after) return(0); /* hit only once each move */
X
X--- 216,222 ----
X
X if(mtmp2->m_lev >= mtmp->m_lev+2 ||
X (mtmp2->data->mlet == S_COCKATRICE &&
X! !resists_ston(mtmp->data)))
X continue;
X if(after) return(0); /* hit only once each move */
X
X*** src/Old/dokick.c Wed Aug 16 12:16:29 1989
X--- src/dokick.c Wed Aug 16 10:31:40 1989
X***************
X*** 50,56 ****
X mon->mhp -= (!martial() ? rnd(dmg) :
X rnd(dmg)+rnd(ACURR(A_DEX)/2));
X if(mon->mhp < 1) {
X! (void) passive(mon, TRUE, 0);
X killed(mon);
X return;
X }
X--- 50,56 ----
X mon->mhp -= (!martial() ? rnd(dmg) :
X rnd(dmg)+rnd(ACURR(A_DEX)/2));
X if(mon->mhp < 1) {
X! (void) passive(mon, TRUE, 0, TRUE);
X killed(mon);
X return;
X }
X***************
X*** 68,74 ****
X set_apparxy(mon);
X }
X }
X! (void) passive(mon, FALSE, 1);
X
X /* it is unchivalrous to attack the defenseless or from behind */
X if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL &&
X--- 68,74 ----
X set_apparxy(mon);
X }
X }
X! (void) passive(mon, FALSE, 1, TRUE);
X
X /* it is unchivalrous to attack the defenseless or from behind */
X if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL &&
X***************
X*** 85,90 ****
X--- 85,120 ----
X register struct monst *mon = m_at(x, y);
X register int i, j;
X
X+ if(special_case(mon)) return;
X+ setmangry(mon);
X+ #ifdef POLYSELF
X+ /* Kick attacks by kicking monsters are normal attacks, not special.
X+ * If you have >1 kick attack, you get all of them.
X+ */
X+ if (attacktype(uasmon, AT_KICK)) {
X+ schar tmp = find_roll_to_hit(mon);
X+ for(i=0; imattk[i].aatyp == AT_KICK && multi >= 0) {
X+ /* check multi; maybe they had 2 kicks and the first */
X+ /* was a kick against a floating eye */
X+ j = 1;
X+ if (tmp > rnd(20)) {
X+ kludge("You kick %s.", mon_nam(mon));
X+ sum = damageum(mon, &(uasmon->mattk[i]));
X+ if (sum == 2)
X+ (void)passive(mon, 1, 0, TRUE);
X+ else (void)passive(mon, sum, 1, TRUE);
X+ } else {
X+ missum(mon, &(uasmon->mattk[i]));
X+ (void)passive(mon, 0, 1, TRUE);
X+ }
X+ }
X+ }
X+ return;
X+ }
X+ #endif
X+
X /* no need to check POLYSELF since only ghosts, which you can't turn */
X /* into, are noncorporeal */
X if(noncorporeal(mon->data)) {
X***************
X*** 92,105 ****
X return;
X }
X
X- if(special_case(mon)) return;
X-
X- setmangry(mon);
X-
X if(Levitation && !rn2(3) && verysmall(mon->data) &&
X !is_flyer(mon->data)) {
X pline("Floating in the air, you miss wildly!");
X! (void) passive(mon, FALSE, 1);
X return;
X }
X
X--- 122,131 ----
X return;
X }
X
X if(Levitation && !rn2(3) && verysmall(mon->data) &&
X !is_flyer(mon->data)) {
X pline("Floating in the air, you miss wildly!");
X! (void) passive(mon, FALSE, 1, TRUE);
X return;
X }
X
X***************
X*** 110,116 ****
X if(!rn2((i < j/10) ? 2 : (i < j/5) ? 3 : 4)) {
X if(martial() && !rn2(2)) goto doit;
X Your("clumsy kick does no damage.");
X! (void) passive(mon, FALSE, 1);
X return;
X }
X if(i < j/10) clumsy = TRUE;
X--- 136,142 ----
X if(!rn2((i < j/10) ? 2 : (i < j/5) ? 3 : 4)) {
X if(martial() && !rn2(2)) goto doit;
X Your("clumsy kick does no damage.");
X! (void) passive(mon, FALSE, 1, TRUE);
X return;
X }
X if(i < j/10) clumsy = TRUE;
X***************
X*** 130,136 ****
X if(!nohands(mon->data) && !rn2(martial() ? 5 : 3)) {
X kludge("%s blocks your %skick.", Monnam(mon),
X clumsy ? "clumsy " : "");
X! (void) passive(mon, FALSE, 1);
X return;
X } else {
X mnexto(mon);
X--- 156,162 ----
X if(!nohands(mon->data) && !rn2(martial() ? 5 : 3)) {
X kludge("%s blocks your %skick.", Monnam(mon),
X clumsy ? "clumsy " : "");
X! (void) passive(mon, FALSE, 1, TRUE);
X return;
X } else {
X mnexto(mon);
X***************
X*** 138,150 ****
X pline("%s %s, %s evading your %skick.",
X Blind ? "It" : Monnam(mon),
X (can_teleport(mon->data) ? "teleports" :
X- is_flyer(mon->data) ? "flutters" :
X is_floater(mon->data) ? "floats" :
X nolimbs(mon->data) ? "slides" :
X "jumps"),
X clumsy ? "easily" : "nimbly",
X clumsy ? "clumsy " : "");
X! (void) passive(mon, FALSE, 1);
X return;
X }
X }
X--- 164,176 ----
X pline("%s %s, %s evading your %skick.",
X Blind ? "It" : Monnam(mon),
X (can_teleport(mon->data) ? "teleports" :
X is_floater(mon->data) ? "floats" :
X+ is_flyer(mon->data) ? "flutters" :
X nolimbs(mon->data) ? "slides" :
X "jumps"),
X clumsy ? "easily" : "nimbly",
X clumsy ? "clumsy " : "");
X! (void) passive(mon, FALSE, 1, TRUE);
X return;
X }
X }
X*** src/Old/dothrow.c Wed Aug 16 12:16:53 1989
X--- src/dothrow.c Wed Aug 9 19:21:56 1989
X***************
X*** 251,258 ****
X }
X return(1);
X }
X! if(obj->olet == WEAPON_SYM || obj->otyp == ROCK || obj->olet == GEM_SYM) {
X! if(obj->otyp < DART || obj->otyp == ROCK || obj->olet == GEM_SYM) {
X if (!uwep ||
X objects[obj->otyp].w_propellor !=
X -objects[uwep->otyp].w_propellor)
X--- 251,258 ----
X }
X return(1);
X }
X! if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE || obj->olet == GEM_SYM) {
X! if(obj->otyp < DART || obj->olet == GEM_SYM) {
X if (!uwep ||
X objects[obj->otyp].w_propellor !=
X -objects[uwep->otyp].w_propellor)
X*** src/Old/eat.c Wed Aug 16 12:17:14 1989
X--- src/eat.c Tue Aug 15 20:36:37 1989
X***************
X*** 127,133 ****
X You("turn to stone.");
X Sprintf(killer, "%s meat",
X mons[pm].mname);
X! done("stoned");
X #ifdef POLYSELF
X }
X #endif
X--- 127,133 ----
X You("turn to stone.");
X Sprintf(killer, "%s meat",
X mons[pm].mname);
X! done(STONING);
X #ifdef POLYSELF
X }
X #endif
X***************
X*** 409,422 ****
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*/
X static void
X choke(food)
X! register struct objclass *food;
X {
X /* only happens if you were satiated */
X if(u.uhs != SATIATED) return;
X--- 409,419 ----
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 /*ARGSUSED*/
X static void
X choke(food)
X! register struct obj *food;
X {
X /* only happens if you were satiated */
X if(u.uhs != SATIATED) return;
X***************
X*** 431,441 ****
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--- 428,443 ----
X vomit();
X } else {
X #endif
X! if(food) {
X! int savequan = food->quan;
X! food->quan = 1;
X! killer = xname(food);
X! food->quan = savequan;
X! } else
X! killer = "exuberant appetite";
X You("choke over your food.");
X You("die...");
X! done(CHOKING);
X #ifndef HARD
X }
X #endif
X***************
X*** 508,514 ****
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--- 510,516 ----
X rottenfood();
X lesshungry(ftmp->nutrition >> 2);
X } else {
X! if(u.uhunger >= 1500) choke(otmp);
X
X switch(otmp->otyp){
X case FOOD_RATION:
X***************
X*** 617,623 ****
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--- 619,625 ----
X u.uhp = u.uhpmax;
X } else if(u.uhp <= 0) {
X killer = "rotten jelly lump";
X! done(POISONING);
X }
X if(!otmp->cursed) heal_legs();
X break;
X***************
X*** 701,707 ****
X register 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--- 703,709 ----
X register int num;
X {
X u.uhunger += num;
X! if(u.uhunger >= 2000) choke((struct obj *) 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*** 749,755 ****
X flags.botl = 1;
X bot();
X You("die from starvation.");
X! done("starved");
X }
X }
X
X--- 751,757 ----
X flags.botl = 1;
X bot();
X You("die from starvation.");
X! done(STARVING);
X }
X }
X
X***************
X*** 785,791 ****
X if(u.uhp < 1) {
X You("die from hunger and exhaustion.");
X killer = "exhaustion";
X! done("starved");
X }
X }
X }
X--- 787,793 ----
X if(u.uhp < 1) {
X You("die from hunger and exhaustion.");
X killer = "exhaustion";
X! done(STARVING);
X }
X }
X }
X*** src/Old/fountain.c Wed Aug 16 12:18:56 1989
X--- src/fountain.c Tue Aug 15 18:48:37 1989
X***************
X*** 87,92 ****
X--- 87,93 ----
X levl[mx][my].typ = POOL;
X levl[mx][my].doormask = 0;
X if(!Blind) atl(mx,my,(char) POOL_SYM);
X+ else levl[mx][my].seen = 0;
X madepool = 1;
X }
X
X*** src/Old/hack.c Sat Jul 29 01:11:26 1989
X--- src/hack.c Wed Aug 16 22:18:51 1989
X***************
X*** 114,119
X You("push the boulder into a pit!");
X deltrap(ttmp);
X delobj(otmp);
X if(flags.verbose)
X pline("It completely fills the pit!");
X continue;
X
X--- 114,121 -----
X You("push the boulder into a pit!");
X deltrap(ttmp);
X delobj(otmp);
X+ if(cansee(rx,ry)) newsym(rx,ry);
X+ else levl[rx][ry].seen = 0;
X if(flags.verbose)
X pline("It completely fills the pit!");
X continue;
X***************
X*** 121,126
X pline("The boulder falls into and plugs a hole in the ground!");
X deltrap(ttmp);
X delobj(otmp);
X continue;
X case LEVEL_TELEP:
X case TELEP_TRAP:
X
X--- 123,130 -----
X pline("The boulder falls into and plugs a hole in the ground!");
X deltrap(ttmp);
X delobj(otmp);
X+ if(cansee(rx,ry)) newsym(rx,ry);
X+ else levl[rx][ry].seen = 0;
X continue;
X case LEVEL_TELEP:
X case TELEP_TRAP:
X***************
X*** 300,306
X domove() {
X register struct monst *mtmp = (struct monst *)0;
X register struct rm *tmpr,*ust;
X! register xchar x,y;
X struct trap *trap;
X
X u_wipe_engr(rnd(5));
X
X--- 304,310 -----
X domove() {
X register struct monst *mtmp = (struct monst *)0;
X register struct rm *tmpr,*ust;
X! register xchar x,y,xx,yy;
X struct trap *trap;
X
X u_wipe_engr(rnd(5));
X***************
X*** 312,317
X }
X if(u.uswallow) {
X u.dx = u.dy = 0;
X x = u.ux = u.ustuck->mx;
X y = u.uy = u.ustuck->my;
X } else {
X
X--- 316,323 -----
X }
X if(u.uswallow) {
X u.dx = u.dy = 0;
X+ xx = u.ux;
X+ yy = u.uy;
X x = u.ux = u.ustuck->mx;
X y = u.uy = u.ustuck->my;
X if(xx != u.ustuck->mx || yy != u.ustuck->my) newsym(xx,yy);
X***************
X*** 314,319
X u.dx = u.dy = 0;
X x = u.ux = u.ustuck->mx;
X y = u.uy = u.ustuck->my;
X } else {
X x = u.ux + u.dx;
X y = u.uy + u.dy;
X
X--- 320,326 -----
X yy = u.uy;
X x = u.ux = u.ustuck->mx;
X y = u.uy = u.ustuck->my;
X+ if(xx != u.ustuck->mx || yy != u.ustuck->my) newsym(xx,yy);
X } else {
X x = u.ux + u.dx;
X y = u.uy + u.dy;
X***************
X*** 399,405
X if(u.utrap) {
X if(u.utraptype == TT_PIT) {
X if(flags.verbose)
X! You("are still in a pit.");
X u.utrap--;
X } else if (u.utraptype == TT_WEB) {
X if(flags.verbose)
X
X--- 406,412 -----
X if(u.utrap) {
X if(u.utraptype == TT_PIT) {
X if(flags.verbose)
X! Norep("You are still in a pit.");
X u.utrap--;
X } else if (u.utraptype == TT_WEB) {
X if(flags.verbose)
X***************
X*** 403,409
X u.utrap--;
X } else if (u.utraptype == TT_WEB) {
X if(flags.verbose)
X! You("are stuck to the web.");
X u.utrap--;
X } else {
X if(flags.verbose)
X
X--- 410,416 -----
X u.utrap--;
X } else if (u.utraptype == TT_WEB) {
X if(flags.verbose)
X! Norep("You are stuck to the web.");
X u.utrap--;
X } else {
X if(flags.verbose)
X***************
X*** 407,413
X u.utrap--;
X } else {
X if(flags.verbose)
X! You("are caught in a bear trap.");
X if((u.dx && u.dy) || !rn2(5)) u.utrap--;
X }
X return;
X
X--- 414,420 -----
X u.utrap--;
X } else {
X if(flags.verbose)
X! Norep("You are caught in a bear trap.");
X if((u.dx && u.dy) || !rn2(5)) u.utrap--;
X }
X return;
X***************
X*** 535,540
X #endif
X u.ux += u.dx;
X u.uy += u.dy;
X if(flags.run) {
X if(IS_DOOR(tmpr->typ) ||
X #ifdef POLYSELF
X
X--- 542,548 -----
X #endif
X u.ux += u.dx;
X u.uy += u.dy;
X+ reset_occupations();
X if(flags.run) {
X if(IS_DOOR(tmpr->typ) ||
X #ifdef POLYSELF
X***************
X*** 688,694
X for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++) {
X if(x == u.ux && y == u.uy) continue;
X if(levl[x][y].mmask && (mtmp = m_at(x,y)) && !mtmp->mimic &&
X! (!mtmp->minvis || See_invisible) && !mtmp->mundetected) {
X if((flags.run != 1 && !mtmp->mtame) || (x == u.ux+u.dx && y == u.uy+u.dy))
X goto stop;
X } else mtmp = 0;
X
X--- 696,702 -----
X for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++) {
X if(x == u.ux && y == u.uy) continue;
X if(levl[x][y].mmask && (mtmp = m_at(x,y)) && !mtmp->mimic &&
X! (!mtmp->minvis || See_invisible || Telepat) && !mtmp->mundetected) {
X if((flags.run != 1 && !mtmp->mtame) || (x == u.ux+u.dx && y == u.uy+u.dy))
X goto stop;
X } else mtmp = 0;
X***************
X*** 792,798
X !mtmp->mtame && !mtmp->mpeaceful &&
X !noattacks(mtmp->data) &&
X !mtmp->mfroz && !mtmp->msleep && /* aplvax!jcn */
X! (!mtmp->minvis || See_invisible) &&
X !onscary(u.ux, u.uy, mtmp))
X return(1);
X }
X
X--- 800,806 -----
X !mtmp->mtame && !mtmp->mpeaceful &&
X !noattacks(mtmp->data) &&
X !mtmp->mfroz && !mtmp->msleep && /* aplvax!jcn */
X! (!mtmp->minvis || See_invisible || Telepat) &&
X !onscary(u.ux, u.uy, mtmp))
X return(1);
X }
X***************
X*** 804,810
X xchar x,y;
X {
X if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0);
X- if(dist(x,y) < 3) return(1);
X if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
X !levl[u.ux][u.uy].lit)
X return(0);
X
X--- 812,817 -----
X xchar x,y;
X {
X if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0);
X if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
X !levl[x][y].mmask && !levl[u.ux][u.uy].lit)
X return(0);
X***************
X*** 806,812
X if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0);
X if(dist(x,y) < 3) return(1);
X if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
X! !levl[u.ux][u.uy].lit)
X return(0);
X if(levl[x][y].lit &&
X ((seelx <= x && x <= seehx && seely <= y && y <= seehy) ||
X
X--- 813,819 -----
X {
X if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0);
X if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
X! !levl[x][y].mmask && !levl[u.ux][u.uy].lit)
X return(0);
X if(dist(x,y) < 3) return(1);
X if(levl[x][y].lit &&
X***************
X*** 808,813
X if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
X !levl[u.ux][u.uy].lit)
X return(0);
X if(levl[x][y].lit &&
X ((seelx <= x && x <= seehx && seely <= y && y <= seehy) ||
X (seelx2 <= x && x <= seehx2 && seely2 <= y && y <= seehy2)))
X
X--- 815,821 -----
X if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
X !levl[x][y].mmask && !levl[u.ux][u.uy].lit)
X return(0);
X+ if(dist(x,y) < 3) return(1);
X if(levl[x][y].lit &&
X ((seelx <= x && x <= seehx && seely <= y && y <= seehy) ||
X (seelx2 <= x && x <= seehx2 && seely2 <= y && y <= seehy2)))
X***************
X*** 935,941
X if(u.uhp < 1) {
X killer = knam; /* the thing that killed you */
X You("die...");
X! done("died");
X } else if(u.uhp*10 < u.uhpmax && moves-wailmsg > 50 && n > 0){
X wailmsg = moves;
X if(index("WEV", pl_character[0])) {
X
X--- 943,949 -----
X if(u.uhp < 1) {
X killer = knam; /* the thing that killed you */
X You("die...");
X! done(DIED);
X } else if(u.uhp*10 < u.uhpmax && moves-wailmsg > 50 && n > 0){
X wailmsg = moves;
X if(index("WEV", pl_character[0])) {
X***************
X*** 1030,1035
X otmp = otmp->nobj;
X }
X return(ct);
X }
X
X #ifdef STUPID_CPP /* otherwise these functions are macros in hack.h */
X
X--- 1038,1053 -----
X otmp = otmp->nobj;
X }
X return(ct);
X+ }
X+
X+ int
X+ identify(otmp) /* also called by newmail() */
X+ register struct obj *otmp;
X+ {
X+ makeknown(otmp->otyp);
X+ otmp->known = otmp->dknown = otmp->bknown = 1;
X+ prinv(otmp);
X+ return(1);
X }
X
X #ifdef STUPID_CPP /* otherwise these functions are macros in hack.h */
X*** src/Old/invent.c Wed Aug 16 12:20:27 1989
X--- src/invent.c Tue Aug 15 20:34:29 1989
X***************
X*** 660,666 ****
X olets[0] = 0;
X while(sym = *ip++){
X if(sym == ' ') continue;
X! if(takeoff) {
X if(!index(removeables,sym)) {
X pline("Not applicable.");
X return(0);
X--- 660,666 ----
X olets[0] = 0;
X while(sym = *ip++){
X if(sym == ' ') continue;
X! if(takeoff && !(uwep && sym == uwep->olet)) {
X if(!index(removeables,sym)) {
X pline("Not applicable.");
X return(0);
X***************
X*** 1082,1089 ****
X (otmp->otyp == CORPSE && otmp->corpsenm == PM_COCKATRICE)) {
X pline("Touching the dead cockatrice is a fatal mistake...");
X You("turn to stone...");
X! killer = "dead cockatrice";
X! done("stoned");
X }
X }
X }
X--- 1082,1089 ----
X (otmp->otyp == CORPSE && otmp->corpsenm == PM_COCKATRICE)) {
X pline("Touching the dead cockatrice is a fatal mistake...");
X You("turn to stone...");
X! killer = "cockatrice corpse";
X! done(STONING);
X }
X }
X }
X*** src/Old/ioctl.c Wed Aug 16 12:21:02 1989
X--- src/ioctl.c Sat Aug 5 13:03:55 1989
X***************
X*** 26,31 ****
X--- 26,50 ----
X #else
X (void) ioctl(fileno(stdin), (int) TCGETA, &termio);
X #endif
X+ #ifdef TIOCGWINSZ
X+ {
X+ /*
X+ * ttysize is found on Suns and BSD
X+ * winsize is found on Suns, BSD, and Ultrix
X+ */
X+ struct winsize ttsz;
X+
X+ (void) ioctl(fileno(stdin), (int) TIOCGWINSZ, (char *) &ttsz);
X+ /*
X+ * Use the kernel's values for lines and columns if it has
X+ * any idea.
X+ */
X+ if (ttsz.ws_row)
X+ LI = ttsz.ws_row;
X+ if (ttsz.ws_col)
X+ CO = ttsz.ws_col;
X+ }
X+ #endif
X }
X
X void
END_OF_FILE
if test 56848 -ne `wc -c <'patch02c'`; then
echo shar: \"'patch02c'\" unpacked with wrong size!
fi
# end of 'patch02c'
fi
echo shar: End of archive 3 \(of 7\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 5 6 7 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 7 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0