billr@saab.CNA.TEK.COM (Bill Randle) (07/25/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 7, Issue 85
Archive-name: NetHack3/Part30
#! /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 30 (of 38)."
# Contents: include/func_tab.h src/do_name.c src/extralev.c
# src/fountain.c src/makedefs.c src/prisym.c
# Wrapped by billr@saab on Sun Jul 23 21:33:13 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'include/func_tab.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'include/func_tab.h'\"
else
echo shar: Extracting \"'include/func_tab.h'\" \(507 characters\)
sed "s/^X//" >'include/func_tab.h' <<'END_OF_FILE'
X/* SCCS Id: @(#)func_tab.h 3.0 88/10/15
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X/* func_tab.h - version 1.0.2 */
X
X#ifndef FUNC_TAB_H
X#define FUNC_TAB_H
X
Xstruct func_tab {
X char f_char;
X int (*f_funct)();
X char *f_text;
X};
X
Xextern const struct func_tab cmdlist[];
X
Xstruct ext_func_tab {
X char *ef_txt, *ef_desc;
X int (*ef_funct)();
X};
X
Xextern const struct ext_func_tab extcmdlist[];
X
X#endif /* FUNC_TAB_H /**/
END_OF_FILE
if test 507 -ne `wc -c <'include/func_tab.h'`; then
echo shar: \"'include/func_tab.h'\" unpacked with wrong size!
fi
# end of 'include/func_tab.h'
fi
if test -f 'src/do_name.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/do_name.c'\"
else
echo shar: Extracting \"'src/do_name.c'\" \(9873 characters\)
sed "s/^X//" >'src/do_name.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)do_name.c 3.0 88/11/24
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X
X#include "hack.h"
X
Xstatic
Xchar *
Xvisctrl(c)
Xchar c;
X{
X#ifdef LINT /* static char ccc[3]; */
X char ccc[3];
X#else
X static char ccc[3];
X#endif
X
X if(c < 040) {
X ccc[0] = '^';
X ccc[1] = c + 0100;
X ccc[2] = 0;
X } else {
X ccc[0] = c;
X ccc[1] = 0;
X }
X return(ccc);
X}
X
Xvoid
Xgetpos(cc,force,goal)
Xcoord *cc;
Xint force; char *goal;
X{
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 if(1 <= cx + xdir[i] && cx + xdir[i] <= COLNO)
X cx += xdir[i];
X if(0 <= cy + ydir[i] && cy + ydir[i] <= ROWNO-1)
X cy += ydir[i];
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 "use hjkl or ." :
X "aborted");
X if(force) goto nxtc;
X cc->x = -1;
X cc->y = 0;
X return;
X }
X nxtc: ;
X curs(cx,cy+2);
X }
X cc->x = cx;
X cc->y = cy;
X return;
X}
X
Xint
Xdo_mname(){
X char buf[BUFSZ];
X coord cc;
X register int cx,cy,lth,i;
X register struct monst *mtmp, *mtmp2;
X register char *curr;
X boolean blank;
X
X getpos(&cc, 0, "the monster you want to name");
X cx = cc.x;
X cy = cc.y;
X if(cx < 0) return(0);
X if (cx == u.ux && cy == u.uy) {
X pline("This %s creature is called %s and cannot be renamed.",
X ACURR(A_CHA) > 14 ?
X (flags.female ? "beautiful" : "handsome") :
X "ugly",
X plname);
X return(0);
X }
X if (!cansee(cx, cy) || !levl[cx][cy].mmask ||
X (mtmp = m_at(cx, cy))->mimic) {
X pline("I see no monster there.");
X return(0);
X }
X pline("What do you want to call %s? ", lmonnam(mtmp));
X getlin(buf);
X clrlin();
X if(!*buf || *buf == '\033') return(0);
X
X /* unnames monster if all spaces */
X for (curr = buf, blank = 1; *curr; blank = (*curr++ == ' '));
X if(blank) *buf = '\0';
X
X if(type_is_pname(mtmp->data)) {
X pline("%s doesn't like being called names!", Monnam(mtmp));
X if(!mtmp->mtame) {
X pline("%s gets %sangry!", Monnam(mtmp),
X mtmp->mpeaceful ? "" : "very ");
X mtmp->mpeaceful = mtmp->msleep = 0;
X }
X return(0);
X }
X lth = strlen(buf)+1;
X if(lth > 63){
X buf[62] = 0;
X lth = 63;
X }
X mtmp2 = newmonst(mtmp->mxlth + lth);
X *mtmp2 = *mtmp;
X for(i=0; i<mtmp->mxlth; i++)
X ((char *) mtmp2->mextra)[i] = ((char *) mtmp->mextra)[i];
X mtmp2->mnamelth = lth;
X Strcpy(NAME(mtmp2), buf);
X replmon(mtmp,mtmp2);
X return(0);
X}
X
X/*
X * This routine changes the address of obj . Be careful not to call it
X * when there might be pointers around in unknown places. For now: only
X * when obj is in the inventory.
X */
Xstatic
Xvoid
Xdo_oname(obj)
Xregister struct obj *obj;
X{
X char buf[BUFSZ];
X register char *curr;
X boolean blank;
X
X pline("What do you want to name %s? ", doname(obj));
X getlin(buf);
X clrlin();
X if(!*buf || *buf == '\033') return;
X
X /* unnames item if all spaces */
X for (curr = buf, blank = 1; *curr; blank = (*curr++ == ' '));
X if(blank) *buf = '\0';
X
X#ifdef NAMED_ITEMS
X if(is_artifact(obj) || restr_name(obj, buf))
X pline("Somehow you can't seem to engrave that word.");
X else
X#endif
X (void)oname(obj, buf, 1);
X}
X
Xstruct obj *
Xoname(obj, buf, ininv)
Xregister struct obj *obj;
Xchar *buf;
Xregister int ininv;
X{
X register struct obj *otmp, *otmp2;
X register int lth;
X
X lth = *buf ? strlen(buf)+1 : 0;
X if(lth > 63){
X buf[62] = 0;
X lth = 63;
X }
X otmp2 = newobj(lth);
X *otmp2 = *obj;
X otmp2->onamelth = lth;
X#ifdef __GNUC__
X /* Without the following line, the program gives anything an empty
X * name when I try to #name it. Probably a compiler bug, but at the
X * point where I discovered this, there's no time to check to make
X * sure.
X */
X if (buf) (void)donull();
X#endif
X if(lth) Strcpy(ONAME(otmp2), buf);
X
X setworn((struct obj *)0, obj->owornmask);
X setworn(otmp2, otmp2->owornmask);
X
X if (ininv) {
X /* do freeinv(obj); etc. by hand in order to preserve
X the position of this object in the inventory */
X if(obj == invent) invent = otmp2;
X else for(otmp = invent; ; otmp = otmp->nobj){
X if(!otmp)
X panic("oname: cannot find obj.");
X if(otmp->nobj == obj){
X otmp->nobj = otmp2;
X break;
X }
X }
X }
X /* obfree(obj, otmp2); /* now unnecessary: no pointers on bill */
X free((genericptr_t) obj); /* let us hope nobody else saved a pointer */
X return otmp2;
X}
X
Xstatic const char callable[] = {
X SCROLL_SYM, POTION_SYM, WAND_SYM, RING_SYM, AMULET_SYM, GEM_SYM,
X#ifdef SPELLS
X SPBOOK_SYM,
X#endif
X ARMOR_SYM, 0 };
X
Xint
Xddocall()
X{
X register struct obj *obj;
X#ifdef REDO
X char ch;
X
X if (!in_doagain)
X#endif
X pline("Name an individual object? ");
X switch(
X#ifdef REDO
X ch =
X#endif
X ynq()) {
X case 'q':
X break;
X case 'y':
X#ifdef REDO
X savech(ch);
X#endif
X obj = getobj("#", "name");
X if(obj) do_oname(obj);
X break;
X default:
X#ifdef REDO
X savech(ch);
X#endif
X obj = getobj(callable, "call");
X if(obj) docall(obj);
X }
X return 0;
X}
X
Xvoid
Xdocall(obj)
Xregister struct obj *obj;
X{
X char buf[BUFSZ];
X struct obj otemp;
X register char **str1;
X register char *str;
X boolean blank;
X
X otemp = *obj;
X otemp.quan = 1;
X otemp.onamelth = 0;
X if (otemp.corpsenm) { /* kludge, meaning it's sink water */
X pline("Call a stream of %s fluid: ",
X objects[otemp.otyp].oc_descr);
X } else {
X str = xname(&otemp);
X pline("Call %s %s: ", index(vowels,*str) ? "an" : "a", str);
X }
X getlin(buf);
X clrlin();
X if(!*buf || *buf == '\033')
X return;
X
X /* clear old name */
X str1 = &(objects[obj->otyp].oc_uname);
X if(*str1) free(*str1);
X
X /* uncalls item if all spaces */
X for (str = buf, blank = 1; *str; blank = (*str++ == ' '));
X if(blank) *buf = '\0';
X if (!*buf) {
X *str1 = NULL;
X return;
X }
X
X str = (char *) alloc((unsigned)strlen(buf)+1);
X Strcpy(str,buf);
X *str1 = str;
X}
X
Xconst char *ghostnames[] = {
X /* these names should have length < PL_NSIZ */
X /* Capitalize the names for aesthetics -dgk */
X "Adri", "Andries", "Andreas", "Bert", "David", "Dirk", "Emile",
X "Frans", "Fred", "Greg", "Hether", "Jay", "John", "Jon", "Karnov",
X "Kay", "Kenny", "Kevin", "Maud", "Michiel", "Mike", "Peter", "Robert",
X "Ron", "Tom", "Wilmar", "Nick Danger", "Phoenix", "Miracleman",
X "Stephan", "Lance Braccus", "Shadowhawk"
X};
X
Xchar *
Xx_monnam(mtmp, vb)
Xregister struct monst *mtmp;
Xint vb;
X{
X#ifdef LINT /* static char buf[BUFSZ]; */
X char buf[BUFSZ];
X#else
X static char buf[BUFSZ];
X#endif
X boolean isinvis = (mtmp->minvis && mtmp->data != &mons[PM_STALKER]
X && mtmp->data != &mons[PM_GHOST]);
X
X buf[0] = '\0';
X#if defined(ALTARS) && defined(THEOLOGY)
X if(mtmp->ispriest) return(priestname(mtmp));
X#endif
X if(mtmp->isshk) {
X Strcpy(buf, shkname(mtmp));
X if (mtmp->data == &mons[PM_SHOPKEEPER] && !mtmp->minvis)
X return(buf);
X /* For normal shopkeepers, just 'Asidonhopo'.
X * For unusual ones, 'Asidonhopo the invisible shopkeeper'
X * or 'Asidonhopo the blue dragon'.
X */
X Strcat(buf, " ");
X } else if(mtmp->mnamelth && !vb) {
X if(isinvis) {
X Strcpy(buf, "the invisible ");
X Strcat(buf, NAME(mtmp));
X } else
X Strcpy(buf, NAME(mtmp));
X return(buf);
X }
X
X switch(mtmp->data->mlet) {
X case S_GHOST:
X { register char *gn = (char *) mtmp->mextra;
X if(!*gn) { /* might also look in scorefile */
X gn = ghostnames[rn2(SIZE(ghostnames))];
X Strcpy((char *) mtmp->mextra, !rn2(5) ? plname : gn);
X }
X Sprintf(buf, "%s's ghost", gn);
X }
X break;
X default:
X if (mtmp->minvis)
X Strcat(buf, "the invisible ");
X else if (!type_is_pname(mtmp->data) || Hallucination
X || mtmp->data == &mons[PM_WIZARD_OF_YENDOR])
X Strcat(buf, "the ");
X Strcat(buf, Hallucination ? rndmonnam() : mtmp->data->mname);
X }
X if(vb && mtmp->mnamelth) {
X Strcat(buf, " called ");
X Strcat(buf, NAME(mtmp));
X }
X return(buf);
X}
X
Xchar *
Xlmonnam(mtmp)
Xregister struct monst *mtmp;
X{
X return(x_monnam(mtmp, 1));
X}
X
Xchar *
Xmon_nam(mtmp)
Xregister struct monst *mtmp;
X{
X return(x_monnam(mtmp, 0));
X}
X
Xchar *
XMonnam(mtmp)
Xregister struct monst *mtmp;
X{
X register char *bp = mon_nam(mtmp);
X
X if('a' <= *bp && *bp <= 'z') *bp += ('A' - 'a');
X return(bp);
X}
X
Xchar *
Xa_monnam(mtmp,adj)
Xregister struct monst *mtmp;
Xregister char *adj;
X{
X register char *bp = mon_nam(mtmp);
X#ifdef LINT /* static char buf[BUFSZ]; */
X char buf[BUFSZ];
X#else
X static char buf[BUFSZ];
X#endif
X
X if(!strncmp(bp, "the ", 4)) bp += 4;
X Sprintf(buf, "the %s %s", adj, bp);
X return(buf);
X}
X
Xchar *
XAmonnam(mtmp, adj)
Xregister struct monst *mtmp;
Xregister char *adj;
X{
X register char *bp = a_monnam(mtmp,adj);
X
X *bp = 'T';
X return(bp);
X}
X
Xchar *
XXmonnam(mtmp)
Xregister struct monst *mtmp;
X{
X register char *bp = Monnam(mtmp);
X
X if(!strncmp(bp, "The ", 4) && !type_is_pname(mtmp->data)) {
X if(index(vowels,*(bp+4))) {
X *((++bp)+1) = 'n';
X } else
X bp += 2;
X *bp = 'A';
X }
X return(bp);
X}
X
Xchar *
Xdefmonnam(mtmp)
Xregister struct monst *mtmp;
X{
X register char *bp = Xmonnam(mtmp);
X
X if (!strncmp(bp,"A ",2) || !strncmp(bp,"An ",3)) *bp = 'a';
X return(bp);
X}
X
Xchar *
Xrndmonnam() { /* Random name of monster type, if hallucinating */
X int name;
X
X do {
X name = rn2(PM_CHAMELEON);
X /* chameleon: last monster before player classes */
X } while(type_is_pname(&mons[name]) || (mons[name].geno & G_NOGEN));
X return(mons[name].mname);
X}
X
X#ifdef REINCARNATION
Xchar *
Xroguename() /* Name of a Rogue player */
X{
X char *i, *opts;
X
X if(opts = getenv("ROGUEOPTS")) {
X for(i=opts; *i; i++)
X if (!strncmp("name=",i,5)) {
X char *j;
X if (j=index(i+5,','))
X *j = (char)0;
X return i+5;
X }
X }
X return rn2(3) ? (rn2(2) ? "Michael Toy" : "Kenneth Arnold")
X : "Glenn Wichman";
X}
X#endif
X
END_OF_FILE
if test 9873 -ne `wc -c <'src/do_name.c'`; then
echo shar: \"'src/do_name.c'\" unpacked with wrong size!
fi
# end of 'src/do_name.c'
fi
if test -f 'src/extralev.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/extralev.c'\"
else
echo shar: Extracting \"'src/extralev.c'\" \(9819 characters\)
sed "s/^X//" >'src/extralev.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)extralev.c 3.0 88/04/11 */
X/* Copyright 1988, 1989 by Ken Arromdee */
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
X#ifdef REINCARNATION
X
Xstruct rogueroom {
X xchar rlx, rly;
X xchar dx, dy;
X boolean real;
X uchar doortable;
X int nroom; /* Only meaningful for "real" rooms */
X};
X#define UP 1
X#define DOWN 2
X#define LEFT 4
X#define RIGHT 8
X
Xstatic struct rogueroom r[3][3];
X
Xstatic
Xvoid
Xroguejoin(x1,y1,x2,y2, horiz)
Xint x1,y1,x2,y2;
Xint horiz;
X{
X register int x,y,middle;
X#define MAX(a,b) (((a) > (b)) ? (a) : (b))
X#define MIN(a,b) (((a) < (b)) ? (a) : (b))
X if (horiz) {
X middle = x1 + rn2(x2-x1+1);
X for(x=MIN(x1,middle); x<=MAX(x1,middle); x++)
X corr(x, y1);
X for(y=MIN(y1,y2); y<=MAX(y1,y2); y++)
X corr(middle,y);
X for(x=MIN(middle,x2); x<=MAX(middle,x2); x++)
X corr(x, y2);
X } else {
X middle = y1 + rn2(y2-y1+1);
X for(y=MIN(y1,middle); y<=MAX(y1,middle); y++)
X corr(x1, y);
X for(x=MIN(x1,x2); x<=MAX(x1,x2); x++)
X corr(x, middle);
X for(y=MIN(middle,y2); y<=MAX(middle,y2); y++)
X corr(x2,y);
X }
X}
X
Xstatic
Xvoid
Xroguecorr(x, y, dir)
Xint x,y,dir;
X{
X register int fromx, fromy, tox, toy;
X
X if (dir==DOWN) {
X r[x][y].doortable &= ~DOWN;
X if (!r[x][y].real) {
X fromx = r[x][y].rlx; fromy = r[x][y].rly;
X fromx += 1 + 26*x; fromy += 7*y;
X } else {
X fromx = r[x][y].rlx + rn2(r[x][y].dx);
X fromy = r[x][y].rly + r[x][y].dy;
X fromx += 1 + 26*x; fromy += 7*y;
X if (!IS_WALL(levl[fromx][fromy].typ))
X impossible("down: no wall at %d,%d?",fromx,
X fromy);
X dodoor(fromx, fromy, &rooms[r[x][y].nroom]);
X levl[fromx][fromy].doormask = D_NODOOR;
X fromy++;
X }
X if(y >= 2) {
X impossible("down door from %d,%d going nowhere?",x,y);
X return;
X }
X y++;
X r[x][y].doortable &= ~UP;
X if (!r[x][y].real) {
X tox = r[x][y].rlx; toy = r[x][y].rly;
X tox += 1 + 26*x; toy += 7*y;
X } else {
X tox = r[x][y].rlx + rn2(r[x][y].dx);
X toy = r[x][y].rly - 1;
X tox += 1 + 26*x; toy += 7*y;
X if (!IS_WALL(levl[tox][toy].typ))
X impossible("up: no wall at %d,%d?",tox,toy);
X dodoor(tox, toy, &rooms[r[x][y].nroom]);
X levl[tox][toy].doormask = D_NODOOR;
X toy--;
X }
X roguejoin(fromx, fromy, tox, toy, FALSE);
X return;
X } else if (dir == RIGHT) {
X r[x][y].doortable &= ~RIGHT;
X if (!r[x][y].real) {
X fromx = r[x][y].rlx; fromy = r[x][y].rly;
X fromx += 1 + 26*x; fromy += 7*y;
X } else {
X fromx = r[x][y].rlx + r[x][y].dx;
X fromy = r[x][y].rly + rn2(r[x][y].dy);
X fromx += 1 + 26*x; fromy += 7*y;
X if (!IS_WALL(levl[fromx][fromy].typ))
X impossible("down: no wall at %d,%d?",fromx,
X fromy);
X dodoor(fromx, fromy, &rooms[r[x][y].nroom]);
X levl[fromx][fromy].doormask = D_NODOOR;
X fromx++;
X }
X if(x >= 2) {
X impossible("right door from %d,%d going nowhere?",x,y);
X return;
X }
X x++;
X r[x][y].doortable &= ~LEFT;
X if (!r[x][y].real) {
X tox = r[x][y].rlx; toy = r[x][y].rly;
X tox += 1 + 26*x; toy += 7*y;
X } else {
X tox = r[x][y].rlx - 1;
X toy = r[x][y].rly + rn2(r[x][y].dy);
X tox += 1 + 26*x; toy += 7*y;
X if (!IS_WALL(levl[tox][toy].typ))
X impossible("left: no wall at %d,%d?",tox,toy);
X dodoor(tox, toy, &rooms[r[x][y].nroom]);
X levl[tox][toy].doormask = D_NODOOR;
X tox--;
X }
X roguejoin(fromx, fromy, tox, toy, TRUE);
X return;
X } else impossible("corridor in direction %d?",dir);
X}
X
X/* Modified walkfrom() from mkmaze.c */
Xstatic
Xvoid
Xminiwalk(x, y)
Xint x,y;
X{
X register int q, dir;
X int dirs[4];
X
X while(1) {
X q = 0;
X#define doorhere (r[x][y].doortable)
X if (x>0 && (!(doorhere & LEFT)) &&
X (!r[x-1][y].doortable || !rn2(10)))
X dirs[q++] = 0;
X if (x<2 && (!(doorhere & RIGHT)) &&
X (!r[x+1][y].doortable || !rn2(10)))
X dirs[q++] = 1;
X if (y>0 && (!(doorhere & UP)) &&
X (!r[x][y-1].doortable || !rn2(10)))
X dirs[q++] = 2;
X if (y<2 && (!(doorhere & DOWN)) &&
X (!r[x][y+1].doortable || !rn2(10)))
X dirs[q++] = 3;
X /* Rogue levels aren't just 3 by 3 mazes; they have some extra
X * connections, thus that 1/10 chance
X */
X if (!q) return;
X dir = dirs[rn2(q)];
X switch(dir) { /* Move in direction */
X case 0: doorhere |= LEFT;
X x--;
X doorhere |= RIGHT;
X break;
X case 1: doorhere |= RIGHT;
X x++;
X doorhere |= LEFT;
X break;
X case 2: doorhere |= UP;
X y--;
X doorhere |= DOWN;
X break;
X case 3: doorhere |= DOWN;
X y++;
X doorhere |= UP;
X break;
X }
X miniwalk(x,y);
X }
X}
X
Xvoid
Xmakeroguerooms() {
X register struct mkroom *croom;
X register int x,y;
X int x2, y2;
X /* Rogue levels are structured 3 by 3, with each section containing
X * a room or an intersection. The minimum width is 2 each way.
X * One difference between these and "real" Rogue levels: real Rogue
X * uses 24 rows and NetHack only 23. So we cheat a bit by making the
X * second row of rooms not as deep.
X *
X * Each normal space has 6/7 rows and 25 columns in which a room may
X * actually be placed. Walls go from rows 0-5/6 and columns 0-24.
X * Not counting walls, the room may go in
X * rows 1-5 and columns 1-23 (numbering starting at 0). A room
X * coordinate of this type may be converted to a level coordinate
X * by adding 1+28*x to the column, and 7*y to the row. (The 1
X * is because column 0 isn't used [we only use 1-78]).
X * Room height may be 2-4 (2-5 on last row), length 2-23 (not
X * counting walls)
X */
X#define here r[x][y]
X
X nroom = 0;
X for(y=0; y<3; y++) for(x=0; x<3; x++) {
X /* Note: we want to insure at least 1 room. So, if the
X * first 8 are all dummies, force the last to be a room.
X */
X if (!rn2(5) && (nroom || (x<2 && y<2))) {
X /* Arbitrary: dummy rooms may only go where real
X * ones do.
X */
X here.real = FALSE;
X here.rlx = rn1(22, 2);
X here.rly = rn1((y==2)?4:3, 2);
X } else {
X here.real = TRUE;
X here.dx = rn1(22, 2); /* 2-23 long, plus walls */
X here.dy = rn1((y==2)?4:3, 2); /* 2-5 high, plus walls */
X
X /* boundaries of room floor */
X here.rlx = rnd(23 - here.dx + 1);
X here.rly = rnd(((y==2) ? 5 : 4)- here.dy + 1);
X nroom++;
X }
X here.doortable = 0;
X }
X miniwalk(rn2(3), rn2(3));
X nroom = 0;
X for(y=0; y<3; y++) for(x=0; x<3; x++) {
X if (here.real) { /* Make a room */
X r[x][y].nroom = nroom;
X croom = &rooms[nroom];
X /* Illumination. Strictly speaking, it should be lit
X * only if above level 10, but since Rogue rooms are
X * only encountered below level 10...
X */
X if (!rn2(7)) {
X for(x2 = 1+26*x+here.rlx-1;
X x2 <= 1+26*x+here.rlx+here.dx; x2++)
X for(y2 = 7*y+here.rly-1;
X y2 <= 7*y+here.rly+here.dy; y2++)
X levl[x2][y2].lit = 1;
X croom->rlit = 1;
X } else croom->rlit = 0;
X croom->lx = 1 + 26*x + here.rlx;
X croom->ly = 7*y + here.rly;
X croom->hx = 1 + 26*x + here.rlx + here.dx - 1;
X croom->hy = 7*y + here.rly + here.dy - 1;
X /* Walls, doors, and floors. */
X#define lowx croom->lx
X#define lowy croom->ly
X#define hix croom->hx
X#define hiy croom->hy
X for(x2 = lowx-1; x2 <= hix+1; x2++)
X for(y2 = lowy-1; y2 <= hiy+1; y2 += (hiy-lowy+2)) {
X levl[x2][y2].scrsym = HWALL_SYM;
X levl[x2][y2].typ = HWALL;
X }
X for(x2 = lowx-1; x2 <= hix+1; x2 += (hix-lowx+2))
X for(y2 = lowy; y2 <= hiy; y2++) {
X levl[x2][y2].scrsym = VWALL_SYM;
X levl[x2][y2].typ = VWALL;
X }
X for(x2 = lowx; x2 <= hix; x2++)
X for(y2 = lowy; y2 <= hiy; y2++) {
X levl[x2][y2].scrsym = ROOM_SYM;
X levl[x2][y2].typ = ROOM;
X }
X levl[lowx-1][lowy-1].typ = TLCORNER;
X levl[hix+1][lowy-1].typ = TRCORNER;
X levl[lowx-1][hiy+1].typ = BLCORNER;
X levl[hix+1][hiy+1].typ = BRCORNER;
X levl[lowx-1][lowy-1].scrsym = TLCORN_SYM;
X levl[hix+1][lowy-1].scrsym = TRCORN_SYM;
X levl[lowx-1][hiy+1].scrsym = BLCORN_SYM;
X levl[hix+1][hiy+1].scrsym = BRCORN_SYM;
X
X /* Misc. */
X smeq[nroom] = nroom;
X croom->rtype = OROOM;
X croom++;
X croom->hx = -1;
X nroom++;
X }
X }
X
X /* Now, add connecting corridors. */
X for(y=0; y<3; y++) for(x=0; x<3; x++) {
X if (here.doortable & DOWN)
X roguecorr(x, y, DOWN);
X if (here.doortable & RIGHT)
X roguecorr(x, y, RIGHT);
X if (here.doortable & LEFT)
X impossible ("left end of %d, %d never connected?",x,y);
X if (here.doortable & UP)
X impossible ("up end of %d, %d never connected?",x,y);
X }
X}
X
Xvoid
Xcorr(x,y)
X{
X if (rn2(50)) {
X levl[x][y].typ = CORR;
X levl[x][y].scrsym = CORR_SYM;
X } else {
X levl[x][y].typ = SCORR;
X levl[x][y].scrsym = STONE_SYM;
X }
X}
X
Xvoid
Xmakerogueghost()
X{
X register struct monst *ghost;
X struct obj *ghostobj;
X struct mkroom *croom;
X int x,y;
X
X if (!nroom) return; /* Should never happen */
X croom = &rooms[rn2(nroom)];
X x = somex(croom); y = somey(croom);
X if (!(ghost = makemon(&mons[PM_GHOST], x, y)))
X return;
X ghost->msleep = 1;
X Strcpy((char *)ghost->mextra, roguename());
X
X if (rn2(4)) {
X ghostobj = mksobj_at(FOOD_RATION,x,y);
X ghostobj->quan = rnd(7);
X ghostobj->owt = weight(ghostobj);
X }
X if (rn2(2)) {
X ghostobj = mksobj_at(MACE,x,y);
X ghostobj->spe = rnd(3);
X if (rn2(4)) curse(ghostobj);
X } else {
X ghostobj = mksobj_at(TWO_HANDED_SWORD,x,y);
X ghostobj->spe = rnd(5) - 2;
X if (rn2(4)) curse(ghostobj);
X }
X ghostobj = mksobj_at(BOW,x,y);
X ghostobj->spe = 1;
X if (rn2(4)) curse(ghostobj);
X
X ghostobj = mksobj_at(ARROW,x,y);
X ghostobj->spe = 0;
X ghostobj->quan = rn1(10,25);
X ghostobj->owt = weight(ghostobj);
X if (rn2(4)) curse(ghostobj);
X
X if (rn2(2)) {
X ghostobj = mksobj_at(RING_MAIL,x,y);
X ghostobj->spe = rn2(3);
X if (!rn2(3)) ghostobj->rustfree = 1;
X if (rn2(4)) curse(ghostobj);
X } else {
X ghostobj = mksobj_at(PLATE_MAIL,x,y);
X ghostobj->spe = rnd(5) - 2;
X if (!rn2(3)) ghostobj->rustfree = 1;
X if (rn2(4)) curse(ghostobj);
X }
X if (rn2(2)) {
X ghostobj = mksobj_at(AMULET_OF_YENDOR,x,y);
X ghostobj->spe = -1;
X ghostobj->known = TRUE;
X }
X}
X#endif /* REINCARNATION /**/
END_OF_FILE
if test 9819 -ne `wc -c <'src/extralev.c'`; then
echo shar: \"'src/extralev.c'\" unpacked with wrong size!
fi
# end of 'src/extralev.c'
fi
if test -f 'src/fountain.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/fountain.c'\"
else
echo shar: Extracting \"'src/fountain.c'\" \(10150 characters\)
sed "s/^X//" >'src/fountain.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)fountain.c 3.0 88/12/22
X/* Code for drinking from fountains. */
X/* Scott R. Turner, srt@ucla, 10/27/86 */
X/* NetHack may be freely redistributed. See license for details. */
X
X#include "hack.h"
X
X#ifdef FOUNTAINS
X
Xstatic
Xvoid
Xdowatersnakes() /* Fountain of snakes! */ {
X register int num = rnd(6);
X if (!(mons[PM_WATER_MOCCASIN].geno & G_GENOD)) { /* && chgd to &*/
X
X pline("Good Lord! An endless stream of snakes pours forth!");
X while(num-- > 0) (void) makemon(&mons[PM_WATER_MOCCASIN],u.ux,u.uy);
X } else
X pline("The fountain bubbles furiously for a moment, then calms.");
X}
X
Xstatic
Xvoid
Xdowaterdemon() /* Water demon */ {
Xregister struct monst *mtmp;
X
X if((mtmp = makemon(&mons[PM_WATER_DEMON],u.ux,u.uy))) {
X You("have unleashed %s!", defmonnam(mtmp));
X
X /* Give those on low levels a (slightly) better chance of survival */
X if ( rnd(100) > (80 + dlevel)) {
X pline("Grateful for his release, he grants you a wish!");
X makewish();
X mongone(mtmp);
X }
X }
X}
X
Xstatic
Xvoid
Xdowaternymph() /* Water Nymph */ {
X register struct monst *mtmp;
X if((mtmp = makemon(&mons[PM_WATER_NYMPH],u.ux,u.uy))) {
X
X You("have attracted %s!", defmonnam(mtmp));
X mtmp->msleep = 0;
X } else
X pline("A large bubble rises to the surface and pops.");
X}
X
X
Xstatic
Xvoid
Xdogushforth(drinking) /* Gushing forth in this room */
Xint drinking;
X{
Xregister int num = rnd(10);
Xregister xchar mx,my;
Xregister int tryct = 0;
Xregister int uroom = inroom(u.ux, u.uy);
Xregister struct mkroom *croom = &rooms[uroom];
Xregister int madepool = 0;
X
X if(croom->hx < 0 || has_upstairs(croom) ||
X has_dnstairs(croom)) {
X if (drinking) Your("thirst is quenched.");
X else pline("Water sprays all over you.");
X return;
X }
X while(num--) {
X do {
X if(++tryct > 200) {
X if(madepool)
X pline("Water gushes forth from the overflowing fountain!");
X else if (drinking) Your("thirst is quenched.");
X else pline("Water sprays all over you.");
X return;
X }
X mx = somex(croom);
X my = somey(croom);
X } while(nexttodoor(mx,my) || !((mx+my)%2) ||
X (mx == u.ux && my == u.uy) ||
X (IS_POOL(levl[mx][my].typ)));
X
X /* Put a pool at mx, my */
X
X levl[mx][my].typ = POOL;
X levl[mx][my].doormask = 0;
X if(!Blind) atl(mx,my,(char) POOL_SYM);
X madepool = 1;
X }
X
X pline("Water gushes forth from the overflowing fountain!");
X}
X
Xstatic
Xvoid
Xdofindgem() /* Find a gem in the sparkling waters. */ {
X
X if (!Blind) You("spot a gem in the sparkling waters!");
X (void) mkobj_at(GEM_SYM,u.ux,u.uy);
X levl[u.ux][u.uy].doormask = T_LOOTED;
X}
X
Xvoid
Xdryup(){
X if (!rn2(3) && (levl[u.ux][u.uy].typ == FOUNTAIN)) {
X pline("The fountain dries up!");
X levl[u.ux][u.uy].typ = ROOM;
X levl[u.ux][u.uy].doormask = 0;
X if(Invisible) newsym(u.ux, u.uy);
X fountsound--;
X }
X}
X
Xvoid
Xdrinkfountain() {
X
X /* What happens when you drink from a fountain? */
X register int fate = rnd(30);
X
X if(Levitation) {
X You("are floating high above the fountain.");
X return;
X }
X else if (fate < 10) {
X pline("The cool draught refreshes you.");
X lesshungry(rnd(10));
X } else {
X switch (fate) {
X
X case 19: /* Self-knowledge */
X
X You("feel self-knowledgable...");
X more();
X enlightenment();
X pline("The feeling subsides.");
X break;
X
X case 20: /* Foul water */
X
X pline("The water is foul! You gag and vomit.");
X morehungry(rnd(20)+10);
X vomit();
X break;
X
X case 21: /* Poisonous */
X
X pline("The water is contaminated!");
X if (Poison_resistance) {
X pline("Perhaps it is runoff from the nearby %s farm.", pl_fruit);
X losehp(rnd(4),"unrefrigerated sip of juice");
X break;
X }
X losestr(rn1(4,3));
X losehp(rnd(10),"contaminated water");
X break;
X
X case 22: /* Fountain of snakes! */
X
X dowatersnakes();
X break;
X
X case 23: /* Water demon */
X dowaterdemon();
X break;
X
X case 24: /* Curse an item... */ {
X register struct obj *obj;
X
X pline("This water's no good!");
X morehungry(rnd(20)+10);
X for(obj = invent; obj ; obj = obj->nobj)
X if (!rn2(5)) curse(obj);
X break;
X }
X
X case 25: /* See invisible */
X
X You("see an image of someone stalking you.");
X pline("But it disappears.");
X HSee_invisible |= INTRINSIC;
X break;
X
X case 26: /* See Monsters */
X
X (void) monster_detect((struct obj *)0);
X break;
X
X case 27: /* Find a gem in the sparkling waters. */
X
X if (levl[u.ux][u.uy].doormask == 0) {
X dofindgem();
X break;
X }
X
X case 28: /* Water Nymph */
X
X dowaternymph();
X break;
X
X case 29: /* Scare */ {
X register struct monst *mtmp;
X
X pline("This water gives you bad breath!");
X for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X mtmp->mflee = 1;
X }
X break;
X
X case 30: /* Gushing forth in this room */
X
X dogushforth(TRUE);
X break;
X
X default:
X
X pline("This tepid water is tasteless.");
X break;
X }
X }
X dryup();
X}
X
Xvoid
Xdipfountain(obj)
Xregister struct obj *obj;
X{
X register int fate = rnd(30);
X
X if(Levitation) You("are floating high above the fountain.");
X else if(fate<10)
X if(!obj->rustfree && is_sword(obj)) {
X if(obj->spe > -6) {
X Your("sword rusts somewhat.");
X obj->spe--;
X } else Your("sword looks quite rusted.");
X } else pline("Well, it looks wet now.");
X else if(fate<14)
X if(obj->otyp == LONG_SWORD
X#ifndef NAMED_ITEMS
X && !strcmp(ONAME(obj), "Excalibur")
X#endif
X && u.ulevel >= 5
X ) {
X /* The lady of the lake acts! - Eric Backus */
X /* Be *REAL* nice to him */
X pline("A murky hand from the depths reaches up to bless the sword.");
X pline("As the hand retreats, the fountain disappears!");
X
X#ifndef NAMED_ITEMS
X if(obj->spe < 5) obj->spe = 5;
X#else
X /* otherwise +rnd(10) / +5 "Super"sword */
X obj = oname(obj, "Excalibur", 1);
X#endif
X bless(obj);
X obj->rustfree = 1;
X levl[u.ux][u.uy].typ = ROOM;
X if(Invisible) newsym(u.ux, u.uy);
X fountsound--;
X return;
X } else pline ("Well, it looks wet now.");
X else {
X switch (fate) {
X case 16: /* Curse the item */
X pline("Well, it looks wet now.");
X curse(obj);
X break;
X case 17:
X case 18:
X case 19:
X case 20: /* Uncurse the item */
X if(obj->cursed) {
X if (!Blind)
X pline("The water glows for a moment.");
X obj->cursed = 0;
X } else {
X pline("A feeling of loss comes over you.");
X }
X break;
X case 21: /* Water Demon */
X dowaterdemon();
X break;
X case 22: /* Water Nymph */
X dowaternymph();
X break;
X case 23: /* An Endless Stream Of Snakes */
X dowatersnakes();
X break;
X case 24: /* Find a gem */
X dofindgem();
X break;
X case 25: /* Water gushes forth */
X dogushforth(FALSE);
X break;
X case 26: /* Strange feeling */
X pline("A strange tingling runs up your %s.",
X body_part(ARM));
X break;
X case 27: /* Strange feeling */
X You("feel a sudden chill.");
X break;
X case 28: /* Strange feeling */
X pline("An urge to take a bath overwhelms you.");
X if (u.ugold > 10) {
X u.ugold -= somegold()/10;
X You("lost some of your gold in the fountain!");
X levl[u.ux][u.uy].doormask = 0;
X }
X break;
X case 29: /* You see coins */
X
X /* We make fountains have more coins the closer you are to the
X * surface. After all, there will have been more people going
X * by. Just like a shopping mall! Chris Woodbury */
X
X mkgold((long)(rnd((MAXLEVEL-dlevel)*2)+5),u.ux,u.uy);
X pline("Far below you, you see coins glistening in the water.");
X break;
X default:
X break;
X }
X }
X dryup();
X return;
X}
X#endif
X
X#ifdef SINKS
Xvoid
Xdrinksink()
X{
X if (Levitation) {
X You("are floating high above the sink.");
X return;
X }
X switch(rn2(20)) {
X static struct obj *otmp;
X case 0: You("take a sip of very cold water.");
X break;
X case 1: You("take a sip of very warm water.");
X break;
X case 2: You("take a sip of scalding hot water.");
X if (Fire_resistance)
X pline("It seems quite tasty.");
X else losehp(rnd(6), "sip of boiling water");
X break;
X case 3: if (mons[PM_SEWER_RAT].geno & G_GENOD)
X pline("The sink seems quite dirty.");
X else {
X static struct monst *mtmp;
X
X mtmp = makemon(&mons[PM_SEWER_RAT], u.ux, u.uy);
X pline("Eek! There's %s in the sink!",
X Blind ? "something squirmy" :
X defmonnam(mtmp));
X }
X break;
X case 4: do {
X otmp = mkobj(POTION_SYM,FALSE);
X } while(otmp->otyp == POT_WATER);
X otmp->cursed = otmp->blessed = 0;
X if (Blind)
X pline("The sink emits some odd liquid.");
X else
X pline("The sink emits a stream of %s water.",
X Hallucination ? hcolor() :
X objects[otmp->otyp].oc_descr);
X otmp->dknown = !(Blind || Hallucination);
X otmp->quan++; /* Avoid panic upon useup() */
X otmp->corpsenm = 1; /* kludge for docall() */
X (void) dopotion(otmp);
X obfree(otmp, (struct obj *)0);
X break;
X case 5: if (levl[u.ux][u.uy].doormask == 0) {
X You("find a ring in the sink!");
X (void) mkobj_at(RING_SYM, u.ux, u.uy);
X levl[u.ux][u.uy].doormask = T_LOOTED;
X } else pline("Some dirty water backs up in the drain.");
X break;
X case 6: pline("The pipes break! Water spurts out!");
X sinksound--;
X levl[u.ux][u.uy].doormask = 0;
X#ifdef FOUNTAINS
X levl[u.ux][u.uy].typ = FOUNTAIN;
X fountsound++;
X#else
X levl[u.ux][u.uy].typ = ROOM;
X#endif
X if (Invisible) newsym(u.ux,u.uy);
X break;
X case 7: pline("The water moves as though of its own will!");
X if (!makemon(&mons[PM_WATER_ELEMENTAL], u.ux, u.uy))
X pline("But it quiets down.");
X break;
X case 8: pline("Yuk, this water tastes awful.");
X more_experienced(1,0);
X newexplevel();
X break;
X case 9: pline("Gaggg... this tastes like sewage! You vomit.");
X morehungry(rnd(30-ACURR(A_CON))+10);
X vomit();
X break;
X#ifdef POLYSELF
X case 10: pline("This water contains toxic wastes!");
X You("undergo a freakish metamorphosis!");
X polyself();
X break;
X#endif
X /* more odd messages --JJB */
X case 11: You("hear clanking from the pipes....");
X break;
X case 12: You("hear snatches of song from among the sewers...");
X break;
X case 19: if (Hallucination) {
X pline("A murky hand reaches up out of the drain... --oops--");
X break;
X }
X default: You("take a sip of %s water.",
X rn2(3) ? (rn2(2) ? "cold" : "warm") : "hot");
X }
X}
X#endif /* SINKS /**/
END_OF_FILE
if test 10150 -ne `wc -c <'src/fountain.c'`; then
echo shar: \"'src/fountain.c'\" unpacked with wrong size!
fi
# end of 'src/fountain.c'
fi
if test -f 'src/makedefs.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/makedefs.c'\"
else
echo shar: Extracting \"'src/makedefs.c'\" \(9602 characters\)
sed "s/^X//" >'src/makedefs.c' <<'END_OF_FILE'
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X/* makedefs.c - NetHack version 3.0 */
X
X#define MAKEDEFS_C
X
X#define EXTERN_H
X#include "config.h"
X#include "permonst.h"
X#include "objclass.h"
X#ifdef NULL
X#undef NULL
X#endif /* NULL */
X#define NULL ((genericptr_t)0)
X
X#ifndef LINT
Xstatic const char SCCS_Id[] = "@(#)makedefs.c\t3.0\t89/01/10";
X#endif
X
X#ifdef MSDOS
X# define freopen _freopen
X# undef exit
Xextern void exit P((int));
X# define RDMODE "r"
X# define WRMODE "w"
X#else
X# define RDMODE "r+"
X# define WRMODE "w+"
X#endif
X#if defined(SYSV) || defined(GENIX) || defined(UNIXDEBUG)
Xvoid rename();
X#endif
X#ifdef AMIGA
X# undef freopen
X# undef printf
X# undef puts
X# undef fflush
X# define fflush FFLUSH
X# undef fputs
X# undef fprintf
X#endif
X
X/* construct definitions of object constants */
X
X#ifdef AMIGA
X# define MONST_FILE "include:pm.h"
X# define ONAME_FILE "include:onames.h"
X# define TRAP_FILE "include:trap.h"
X# define DATE_FILE "include:date.h"
X# define DATA_FILE "auxil:data"
X# define RUMOR_FILE "auxil:rumors"
X#else
X# define MONST_FILE "../include/pm.h"
X# define ONAME_FILE "../include/onames.h"
X# define TRAP_FILE "../include/trap.h"
X# define DATE_FILE "../include/date.h"
X# define DATA_FILE "../auxil/data"
X# define RUMOR_FILE "../auxil/rumors"
X#endif
X
Xchar in_line[256];
Xextern char *gets P((char *));
Xvoid do_objs(), do_traps(), do_data(), do_date(), do_permonst(), do_rumors();
Xchar *limit P((char *,boolean));
XFILE *_freopen();
X
Xint
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X char *option;
X
X if(argc == 2) {
X option = argv[1];
X switch (option[1]) {
X
X case 'o':
X case 'O': do_objs();
X break;
X case 't':
X case 'T': do_traps();
X break;
X
X case 'd':
X case 'D': do_data();
X break;
X
X case 'v':
X case 'V': do_date();
X break;
X
X case 'p':
X case 'P': do_permonst();
X break;
X
X case 'r':
X case 'R': do_rumors();
X break;
X
X default:
X (void) fprintf(stderr, "Unknown option '%c'.\n", option[1]);
X (void) fflush(stderr);
X exit(1);
X }
X exit(0);
X } else (void) fprintf(stderr, "Bad arg count (%d).\n", argc-1);
X (void) fflush(stderr);
X exit(1);
X/*NOTREACHED*/
X#ifdef MSDOS
X return 0;
X#endif
X}
X
Xvoid
Xdo_traps() {
X int ntrap;
X char tempfile[30];
X
X Sprintf(tempfile, "makedefs.%d", getpid());
X if(freopen(tempfile, WRMODE, stdout) == (FILE *)0) {
X perror(tempfile);
X exit(1);
X }
X
X if(freopen(TRAP_FILE, RDMODE, stdin) == (FILE *)0) {
X perror(TRAP_FILE);
X exit(1);
X }
X
X while(gets(in_line) != NULL) {
X (void) puts(in_line);
X if(!strncmp(in_line, "/* DO NOT REMOVE THIS LINE */", 29)) break;
X }
X ntrap = 10;
X Printf("\n");
X Printf("#define\tMGTRP\t\t%d\n", ntrap++);
X Printf("#define\tSQBRD\t\t%d\n", ntrap++);
X Printf("#define\tWEB\t\t%d\n", ntrap++);
X Printf("#define\tSPIKED_PIT\t%d\n", ntrap++);
X Printf("#define\tLEVEL_TELEP\t%d\n", ntrap++);
X#ifdef SPELLS
X Printf("#define\tANTI_MAGIC\t%d\n", ntrap++);
X#endif
X Printf("#define\tRUST_TRAP\t%d\n", ntrap++);
X#ifdef POLYSELF
X Printf("#define\tPOLY_TRAP\t%d\n", ntrap++);
X#endif
X Printf("#define\tLANDMINE\t%d\n", ntrap++);
X Printf("\n#define\tTRAPNUM\t%d\n", ntrap);
X Printf("\n#endif /* TRAP_H /**/\n");
X (void) fclose(stdin);
X (void) fclose(stdout);
X#ifdef MSDOS
X remove(TRAP_FILE);
X#endif
X rename(tempfile, TRAP_FILE);
X return;
X}
X
X
Xvoid
Xdo_rumors(){
X char infile[30];
X FILE *freopen();
X long true_rumor_size;
X
X if(freopen(RUMOR_FILE, WRMODE, stdout) == (FILE *)0) {
X perror(RUMOR_FILE);
X exit(1);
X }
X
X Sprintf(infile, "%s.tru", RUMOR_FILE);
X if(freopen(infile, RDMODE, stdin) == (FILE *)0) {
X perror(infile);
X exit(1);
X }
X
X /* get size of true rumors file */
X (void) fseek(stdin, 0L, 2);
X true_rumor_size = ftell(stdin);
X (void) fwrite((genericptr_t)&true_rumor_size,sizeof(long),1,stdout);
X (void) fseek(stdin, 0L, 0);
X
X /* copy true rumors */
X while(gets(in_line) != NULL) (void) puts(in_line);
X
X Sprintf(infile, "%s.fal", RUMOR_FILE);
X if(freopen(infile, RDMODE, stdin) == (FILE *)0) {
X perror(infile);
X exit(1);
X }
X
X /* copy false rumors */
X while(gets(in_line) != NULL) (void) puts(in_line);
X
X (void) fclose(stdin);
X (void) fclose(stdout);
X return;
X}
X
X#ifdef SYSV
Xextern long time();
X#endif
X
Xvoid
Xdo_date(){
X long clock;
X char cbuf[30], *c;
X
X if(freopen(DATE_FILE, WRMODE, stdout) == (FILE *)0) {
X perror(DATE_FILE);
X exit(1);
X }
X Printf("/*\tSCCS Id: @(#)date.h\t3.0\t88/11/20 */\n\n");
X
X (void) time(&clock);
X Strcpy(cbuf, ctime(&clock));
X for(c = cbuf; *c != '\n'; c++); *c = 0; /* strip off the '\n' */
X Printf("const char datestring[] = \"%s\";\n", cbuf);
X
X (void) fclose(stdout);
X return;
X}
X
Xvoid
Xdo_data(){
X char tempfile[30];
X
X Sprintf(tempfile, "%s.base", DATA_FILE);
X if(freopen(tempfile, RDMODE, stdin) == (FILE *)0) {
X perror(tempfile);
X exit(1);
X }
X
X if(freopen(DATA_FILE, WRMODE, stdout) == (FILE *)0) {
X perror(DATA_FILE);
X exit(1);
X }
X
X while(gets(in_line) != NULL) {
X#ifdef SINKS
X if(!strcmp(in_line, "#\ta corridor"))
X Printf("#\ta corridor (or a kitchen sink)\n");
X else
X#endif
X#ifdef ALTARS
X if(!strcmp(in_line, "_\tan iron chain"))
X Printf("_\tan iron chain (or an altar)\n");
X else
X#endif
X#ifdef SPELLS
X if(!strcmp(in_line, "+\ta door"))
X Printf("+\ta door (or a spell book)\n");
X else
X#endif
X#ifdef FOUNTAINS
X if(!strcmp(in_line, "}\twater filled area")) {
X (void) puts(in_line);
X Printf("{\ta fountain\n");
X } else
X#endif
X#ifdef THRONES
X if(!strcmp(in_line, "^\ta trap")) {
X (void) puts(in_line);
X Printf("\\\tan opulent throne\n");
X } else
X#endif
X if(!strcmp(in_line, ";\ta giant eel")) {
X (void) puts(in_line);
X#ifdef WORM
X Printf("~\tthe tail of a long worm\n");
X#endif
X#ifdef GOLEMS
XPrintf("'\ta golem\n");
XPrintf("\t\tThese creatures, not quite living but not really nonliving\n");
XPrintf("\t\teither, are created from inanimate materials by powerful\n");
XPrintf("\t\tmages or priests.\n");
X#endif
X } else
X (void) puts(in_line);
X }
X (void) fclose(stdin);
X (void) fclose(stdout);
X return;
X}
X
Xvoid
Xdo_permonst() {
X
X int i;
X char *c;
X
X if(freopen(MONST_FILE, WRMODE, stdout) == (FILE *)0) {
X perror(MONST_FILE);
X exit(1);
X }
X Printf("/*\tSCCS Id: @(#)pm.h\t3.0\t88/11/20 */\n\n");
X Printf("#ifndef PM_H\n#define PM_H\n");
X
X for(i = 0; mons[i].mlet; i++) {
X Printf("\n#define\tPM_");
X for(c = mons[i].mname; *c; c++) {
X if((*c >= 'a') && (*c <= 'z')) *c -= (char)('a' - 'A');
X else if(*c == ' ' || *c == '-') *c = '_';
X }
X Printf("%s\t%d", mons[i].mname, i);
X }
X Printf("\n\n#define\tNUMMONS\t%d\n", i);
X Printf("\n#endif /* PM_H /**/\n");
X (void) fclose(stdout);
X return;
X}
X
Xstatic char temp[32];
X
Xchar *
Xlimit(name,pref) /* limit a name to 30 characters length */
Xchar *name;
Xboolean pref;
X{
X (void) strncpy(temp, name, pref ? 26 : 30);
X temp[pref ? 26 : 30] = 0;
X return temp;
X}
X
Xvoid
Xdo_objs() {
X
X register int i = 0, sum = 0;
X register char *c;
X#ifdef SPELLS
X register int nspell = 0;
X#endif
X register boolean prefix = 0;
X register char let = '\0';
X boolean sumerr = FALSE;
X
X if(freopen(ONAME_FILE, WRMODE, stdout) == (FILE *)0) {
X perror(ONAME_FILE);
X exit(1);
X }
X Printf("/*\tSCCS Id: @(#)onames.h\t3.0\t89/01/10 */\n\n");
X Printf("#ifndef ONAMES_H\n#define ONAMES_H\n\n");
X
X for(i = 0; !i || objects[i].oc_olet != ILLOBJ_SYM; i++) {
X if (!(c = objects[i].oc_name)) continue;
X
X /* make sure probabilities add up to 1000 */
X if(objects[i].oc_olet != let) {
X if (sum && sum != 1000) {
X (void) fprintf(stderr, "prob error for %c (%d%%)", let, sum);
X (void) fflush(stderr);
X sumerr = TRUE;
X }
X let = objects[i].oc_olet;
X sum = 0;
X }
X
X for(; *c; c++) {
X if((*c >= 'a') && (*c <= 'z')) *c -= (char)('a' - 'A');
X else if(*c == ' ' || *c == '-') *c = '_';
X }
X
X switch (let) {
X case WAND_SYM:
X Printf("#define\tWAN_"); prefix = 1; break;
X case RING_SYM:
X Printf("#define\tRIN_"); prefix = 1; break;
X case POTION_SYM:
X Printf("#define\tPOT_"); prefix = 1; break;
X#ifdef SPELLS
X case SPBOOK_SYM:
X Printf("#define\tSPE_"); prefix = 1; nspell++; break;
X#endif
X case SCROLL_SYM:
X Printf("#define\tSCR_"); prefix = 1; break;
X case GEM_SYM:
X /* avoid trouble with stupid C preprocessors */
X if(objects[i].oc_material == GLASS) {
X Printf("/* #define\t%s\t%d */\n", objects[i].oc_name, i);
X continue;
X }
X default:
X Printf("#define\t");
X }
X Printf("%s\t%d\n", limit(objects[i].oc_name, prefix), i);
X prefix = 0;
X
X sum += objects[i].oc_prob;
X }
X Printf("#define\tLAST_GEM\t(JADE+1)\n");
X#ifdef SPELLS
X Printf("#define\tMAXSPELL\t%d\n", nspell+1);
X#endif
X Printf("#define\tNROFOBJECTS\t%d\n", i-1);
X Printf("\n#endif /* ONAMES_H /**/\n");
X (void) fclose(stdout);
X if (sumerr) exit(1);
X return;
X}
X
X#if defined(SYSV) || defined(GENIX) || defined(UNIXDEBUG)
Xvoid
Xrename(oldname, newname)
Xchar *oldname, *newname;
X{
X if (strcmp(oldname, newname)) {
X (void) unlink(newname);
X (void) link(oldname, newname);
X (void) unlink(oldname);
X }
X return;
X}
X#endif
X
X#ifdef MSDOS
X# ifndef AMIGA
X/* Get around bug in freopen when opening for writing */
X/* Supplied by Nathan Glasser (nathan@mit-eddie) */
X#undef freopen
XFILE *
X_freopen(fname, fmode, fp)
Xchar *fname, *fmode;
XFILE *fp;
X{
X if (!strncmp(fmode,"w",1))
X {
X FILE *tmpfp;
X
X if ((tmpfp = fopen(fname,fmode)) == (FILE *)0)
X return (FILE *)0;
X if (dup2(fileno(tmpfp),fileno(fp)) < 0)
X return (FILE *)0;
X (void) fclose(tmpfp);
X return fp;
X }
X else
X return freopen(fname,fmode,fp);
X}
X# endif /* AMIGA */
X
X# if defined(__TURBOC__) || defined(AMIGA)
Xint
Xgetpid()
X{
X return 1;
X}
X# endif
X#endif /* MSDOS */
END_OF_FILE
if test 9602 -ne `wc -c <'src/makedefs.c'`; then
echo shar: \"'src/makedefs.c'\" unpacked with wrong size!
fi
# end of 'src/makedefs.c'
fi
if test -f 'src/prisym.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/prisym.c'\"
else
echo shar: Extracting \"'src/prisym.c'\" \(10421 characters\)
sed "s/^X//" >'src/prisym.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)prisym.c 3.0 88/11/09
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X
X#include "hack.h"
X
X#ifdef WORM
X#include "wseg.h"
X#include "lev.h"
X
Xstatic void pwseg P((struct wseg *));
X#endif
X
Xvoid
Xatl(x,y,ch)
Xregister int x, y;
Xchar ch;
X{
X register struct rm *crm = &levl[x][y];
X
X if(x<0 || x>COLNO-1 || y<0 || y>ROWNO-1){
X impossible("atl(%d,%d,%c)",x,y,ch);
X return;
X }
X if(crm->seen && crm->scrsym == ch) return;
X /* crm->scrsym = (uchar) ch; */
X /* wrong if characters are signed but uchar is larger than char,
X * and ch, when passed, was greater than 127.
X * We probably should _really_ go around changing atl to take a
X * uchar for its third argument...
X */
X crm->scrsym = (uchar)((unsigned char) ch);
X crm->new = 1;
X on_scr(x,y);
X}
X
Xvoid
Xon_scr(x,y)
Xregister int x, y;
X{
X if(x < scrlx) scrlx = x;
X if(x > scrhx) scrhx = x;
X if(y < scrly) scrly = y;
X if(y > scrhy) scrhy = y;
X}
X
X/* call: (x,y) - display
X (-1,0) - close (leave last symbol)
X (-1,-1)- close (undo last symbol)
X (-1,let)-open: initialize symbol
X (-2,let)-change let
X (-3,let)-set color
X*/
X
Xvoid
Xtmp_at(x, y)
Xint x, y;
X{
X#ifdef LINT /* static schar prevx, prevy; static char let; */
Xschar prevx=0, prevy=0;
Xuchar let;
Xuchar col;
X#else
Xstatic schar prevx, prevy;
Xstatic uchar let;
Xstatic uchar col;
X#endif
X
X switch ((int)x) {
X case -2: /* change let call */
X let = y;
X return;
X case -1: /* open or close call */
X if ((int)y >= 0) {
X let = y;
X prevx = -1;
X col = AT_ZAP;
X return;
X }
X break;
X case -3: /* set color call */
X col = y;
X return;
X }
X if(prevx >= 0 && cansee(prevx,prevy)) {
X delay_output();
X prl(prevx, prevy); /* in case there was a monster */
X at(prevx, prevy, levl[prevx][prevy].scrsym, AT_APP);
X }
X if(x >= 0){ /* normal call */
X if(cansee(x,y)) at(x,y,let,col);
X prevx = x;
X prevy = y;
X } else { /* close call */
X let = 0;
X prevx = -1;
X }
X}
X
X/* like the previous, but the symbols are first erased on completion */
Xvoid
XTmp_at2(x, y)
Xint x, y;
X{
X#ifdef LINT /* static char let; static xchar cnt; static coord tc[COLNO]; */
Xuchar let;
Xxchar cnt;
Xcoord tc[COLNO]; /* but watch reflecting beams! */
X# ifdef MSDOSCOLOR
Xuchar col;
X# endif
X#else
Xstatic uchar let;
Xstatic xchar cnt;
Xstatic coord tc[COLNO]; /* but watch reflecting beams! */
X# ifdef MSDOSCOLOR
Xstatic uchar col;
X# endif
X#endif
Xregister int xx,yy;
X switch((int)x) {
X case -1:
X if(y > 0) { /* open call */
X let = y;
X cnt = 0;
X#ifdef MSDOSCOLOR
X col = AT_ZAP;
X#endif
X return;
X }
X /* close call (do not distinguish y==0 and y==-1) */
X while(cnt--) {
X xx = tc[cnt].x;
X yy = tc[cnt].y;
X prl(xx, yy);
X at(xx, yy, levl[xx][yy].scrsym, AT_APP);
X }
X cnt = let = 0; /* superfluous */
X return;
X case -2: /* change let call */
X let = y;
X return;
X#ifdef MSDOSCOLOR
X case -3: /* set color call */
X col = y;
X return;
X#endif
X }
X /* normal call */
X if(cansee(x,y)) {
X if(cnt) delay_output();
X#ifdef MSDOSCOLOR
X at(x,y,let,col);
X#else
X at(x,y,let,AT_ZAP);
X#endif
X tc[cnt].x = x;
X tc[cnt].y = y;
X if(++cnt >= COLNO) panic("Tmp_at2 overflow?");
X levl[x][y].new = 0; /* prevent pline-nscr erasing --- */
X }
X}
X
Xvoid
Xcurs_on_u()
X{
X curs(u.ux, u.uy+2);
X}
X
Xvoid
Xpru()
X{
X if(u.udispl && (Invisible || u.udisx != u.ux || u.udisy != u.uy))
X /* if(! levl[u.udisx][u.udisy].new) */
X if(!vism_at(u.udisx, u.udisy))
X newsym(u.udisx, u.udisy);
X if(Invisible
X#ifdef POLYSELF
X || u.uundetected
X#endif
X ) {
X u.udispl = 0;
X prl(u.ux,u.uy);
X } else
X if(!u.udispl || u.udisx != u.ux || u.udisy != u.uy) {
X atl(u.ux, u.uy, (char) u.usym);
X u.udispl = 1;
X u.udisx = u.ux;
X u.udisy = u.uy;
X }
X levl[u.ux][u.uy].seen = 1;
X}
X
X/* print a position that is visible for @ */
Xvoid
Xprl(x,y)
X{
X register struct rm *room;
X register struct monst *mtmp = (struct monst *)0;
X register struct obj *otmp;
X register struct trap *ttmp;
X
X if(x == u.ux && y == u.uy && !Invisible
X#ifdef POLYSELF
X && !u.uundetected
X#endif
X ) {
X pru();
X return;
X }
X if(!isok(x,y)) return;
X room = &levl[x][y];
X if((!room->typ) ||
X (IS_ROCK(room->typ) && levl[u.ux][u.uy].typ == CORR &&
X !levl[u.ux][u.uy].lit))
X /* the only lit corridor squares should be the entrances to
X * outside castle areas */
X return;
X if(room->mmask) mtmp = m_at(x,y);
X if(mtmp && !mtmp->mhide &&
X (!mtmp->minvis || See_invisible)) {
X#ifdef WORM
X if(m_atseg)
X pwseg(m_atseg);
X else
X#endif
X pmon(mtmp);
X }
X else if(room->omask && !is_pool(x,y)) {
X otmp = o_at(x,y);
X atl(x,y,Hallucination ? rndobjsym() : otmp->olet);
X }
X else if(room->gmask && !is_pool(x,y))
X atl(x,y,Hallucination ? rndobjsym() : GOLD_SYM);
X else if((!mtmp || mtmp->data == &mons[PM_GIANT_SPIDER]) &&
X (ttmp = t_at(x,y)) && ttmp->ttyp == WEB)
X atl(x,y,(char)WEB_SYM);
X else if(mtmp && (!mtmp->minvis || See_invisible)) {
X /* must be a hiding monster, but not hiding right now */
X /* assume for the moment that long worms do not hide */
X pmon(mtmp);
X }
X else if(!room->seen || room->scrsym == STONE_SYM) {
X room->new = room->seen = 1;
X newsym(x,y);
X on_scr(x,y);
X }
X room->seen = 1;
X}
X
Xuchar
Xnews0(x,y)
Xregister xchar x,y;
X{
X register struct obj *otmp;
X register struct trap *ttmp;
X struct rm *room;
X register uchar tmp; /* don't compare char with uchar -- OIS */
X register int croom;
X
X room = &levl[x][y];
X /* note: a zero scrsym means to ignore the presence of objects */
X if(!room->seen) tmp = STONE_SYM;
X else if(room->typ == POOL || room->typ == MOAT) tmp = POOL_SYM;
X else if(room->omask && !Blind && room->scrsym) {
X otmp = o_at(x,y);
X tmp = Hallucination ? rndobjsym() : otmp->olet;
X }
X else if(room->gmask && !Blind && room->scrsym)
X tmp = Hallucination ? rndobjsym() : GOLD_SYM;
X else if(x == xupstair && y == yupstair) tmp = UP_SYM;
X else if(x == xdnstair && y == ydnstair) tmp = DN_SYM;
X#ifdef STRONGHOLD
X else if(x == xupladder && y == yupladder) tmp = UPLADDER_SYM;
X else if(x == xdnladder && y == ydnladder) tmp = DNLADDER_SYM;
X#endif
X else if((ttmp = t_at(x,y)) && ttmp->ttyp == WEB) tmp = WEB_SYM;
X else if(ttmp && ttmp->tseen) tmp = TRAP_SYM;
X else switch(room->typ) {
X case SCORR:
X tmp = STONE_SYM;
X break;
X case SDOOR:
X croom = inroom(x,y);
X if(croom == -1) {
X#ifdef STRONGHOLD
X if(IS_WALL(levl[x-1][y].typ)) tmp = HWALL_SYM;
X else tmp = VWALL_SYM;
X break;
X#else
X impossible("door %d %d not in room",x,y);
X#endif
X }
X if(rooms[croom].lx-1 == x || rooms[croom].hx+1 == x)
X tmp = VWALL_SYM;
X else /* SDOORs aren't created on corners */
X tmp = HWALL_SYM;
X break;
X case HWALL:
X#ifdef STRONGHOLD
X if (is_maze_lev && is_drawbridge_wall(x,y) >= 0) tmp = DB_HWALL_SYM;
X else
X#endif
X tmp = HWALL_SYM;
X break;
X case VWALL:
X#ifdef STRONGHOLD
X if (is_maze_lev && is_drawbridge_wall(x,y) >= 0) tmp = DB_VWALL_SYM;
X else
X#endif
X tmp = VWALL_SYM;
X break;
X case TLCORNER:
X tmp = TLCORN_SYM;
X break;
X case TRCORNER:
X tmp = TRCORN_SYM;
X break;
X case BLCORNER:
X tmp = BLCORN_SYM;
X break;
X case BRCORNER:
X tmp = BRCORN_SYM;
X break;
X case DOOR:
X tmp = DOOR_SYM;
X break;
X case CORR:
X tmp = CORR_SYM;
X break;
X#ifdef STRONGHOLD
X case DRAWBRIDGE_UP:
X if((room->drawbridgemask & DB_UNDER) == DB_MOAT) tmp = POOL_SYM;
X else tmp = ROOM_SYM;
X break;
X case DRAWBRIDGE_DOWN:
X#endif /* STRONGHOLD /**/
X case ROOM:
X if(room->lit || cansee(x,y) || Blind) tmp = ROOM_SYM;
X else tmp = STONE_SYM;
X break;
X#ifdef POLYSELF
X case STONE:
X tmp = STONE_SYM;
X break;
X#endif
X#ifdef FOUNTAINS
X case FOUNTAIN:
X tmp = FOUNTAIN_SYM;
X break;
X#endif
X#ifdef THRONES
X case THRONE:
X tmp = THRONE_SYM;
X break;
X#endif
X#ifdef SINKS
X case SINK:
X tmp = SINK_SYM;
X break;
X#endif
X#ifdef ALTARS
X case ALTAR:
X tmp = ALTAR_SYM;
X break;
X#endif
X case CROSSWALL:
X tmp = CRWALL_SYM;
X break;
X case TUWALL:
X tmp = TUWALL_SYM;
X break;
X case TDWALL:
X tmp = TDWALL_SYM;
X break;
X case TLWALL:
X tmp = TLWALL_SYM;
X break;
X case TRWALL:
X tmp = TRWALL_SYM;
X break;
X/*
X case POOL:
X tmp = POOL_SYM;
X break;
X*/
X default:
X tmp = ERRCHAR;
X }
X return(tmp);
X}
X
Xvoid
Xnewsym(x,y)
Xregister int x, y;
X{
X atl(x,y,(char)news0(x,y));
X}
X
X/* used with wand of digging (or pick-axe): fill scrsym and force display */
X/* also when a POOL evaporates */
Xvoid
Xmnewsym(x, y)
Xregister int x, y;
X{
X register struct rm *room;
X uchar newscrsym; /* OIS */
X
X if(!vism_at(x,y)) {
X room = &levl[x][y];
X newscrsym = news0(x,y);
X if(room->scrsym != newscrsym) {
X room->scrsym = newscrsym;
X room->seen = 0;
X }
X }
X}
X
Xvoid
Xnosee(x,y)
Xregister int x, y;
X{
X register struct rm *room;
X
X if(!isok(x,y)) return;
X room = &levl[x][y];
X if(room->scrsym == ROOM_SYM && !room->lit && !Blind) {
X room->scrsym = STONE_SYM; /* was ' ' -- OIS */
X room->new = 1;
X on_scr(x,y);
X }
X}
X
Xvoid
Xprl1(x,y)
Xregister int x, y;
X{
X if(u.dx) {
X if(u.dy) {
X prl(x-(2*u.dx),y);
X prl(x-u.dx,y);
X prl(x,y);
X prl(x,y-u.dy);
X prl(x,y-(2*u.dy));
X } else {
X prl(x,y-1);
X prl(x,y);
X prl(x,y+1);
X }
X } else {
X prl(x-1,y);
X prl(x,y);
X prl(x+1,y);
X }
X}
X
Xvoid
Xnose1(x,y)
Xregister int x, y;
X{
X if(u.dx) {
X if(u.dy) {
X nosee(x,u.uy);
X nosee(x,u.uy-u.dy);
X nosee(x,y);
X nosee(u.ux-u.dx,y);
X nosee(u.ux,y);
X } else {
X nosee(x,y-1);
X nosee(x,y);
X nosee(x,y+1);
X }
X } else {
X nosee(x-1,y);
X nosee(x,y);
X nosee(x+1,y);
X }
X}
X
Xint
Xvism_at(x,y)
Xregister int x, y;
X{
X if(x == u.ux && y == u.uy && !Invisible) return(1);
X
X if(levl[x][y].mmask)
X if (Blind && Telepat || canseemon(m_at(x,y)))
X return(1);
X else return ((HTelepat & WORN_HELMET) &&
X (dist(x, y) <= (BOLT_LIM * BOLT_LIM)));
X return(0);
X}
X
X#ifdef NEWSCR
Xvoid
Xpobj(obj)
Xregister struct obj *obj;
X{
X register int show = (!obj->oinvis || See_invisible) &&
X cansee(obj->ox,obj->oy);
X if(obj->odispl){
X if(obj->odx != obj->ox || obj->ody != obj->oy || !show)
X if(!vism_at(obj->odx,obj->ody)){
X newsym(obj->odx, obj->ody);
X obj->odispl = 0;
X }
X }
X if(show && !vism_at(obj->ox,obj->oy)){
X atl(obj->ox,obj->oy,obj->olet);
X obj->odispl = 1;
X obj->odx = obj->ox;
X obj->ody = obj->oy;
X }
X}
X#endif /* NEWSCR /**/
X
Xvoid
Xunpobj(obj)
Xregister struct obj *obj;
X{
X/* if(obj->odispl){
X if(!vism_at(obj->odx, obj->ody))
X newsym(obj->odx, obj->ody);
X obj->odispl = 0;
X }
X*/
X if(!vism_at(obj->ox,obj->oy))
X newsym(obj->ox,obj->oy);
X}
X
X#ifdef WORM
Xstatic void
Xpwseg(wtmp)
Xregister struct wseg *wtmp;
X{
X if(!wtmp->wdispl){
X atl(wtmp->wx, wtmp->wy, S_WORM_TAIL);
X wtmp->wdispl = 1;
X }
X}
X#endif
END_OF_FILE
if test 10421 -ne `wc -c <'src/prisym.c'`; then
echo shar: \"'src/prisym.c'\" unpacked with wrong size!
fi
# end of 'src/prisym.c'
fi
echo shar: End of archive 30 \(of 38\).
cp /dev/null ark30isdone
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