Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

v02i006: nethack - display oriented dungeons and dragons, Part06/16

32 views
Skip to first unread message

games-...@tekred.tek.com

unread,
Jul 28, 1987, 1:48:11 PM7/28/87
to
Submitted by: mi...@genat.UUCP (Mike Stephenson)
Comp.sources.games: Volume 2, Issue 6
Archive-name: nethack/Part06

#! /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 6 (of 16)."
# Contents: fight.c mkmaze.c objects.h read.c
# Wrapped by billr@tekred on Tue Jul 28 09:49:28 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f fight.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"fight.c\"
else
echo shar: Extracting \"fight.c\" \(15365 characters\)
sed "s/^X//" >fight.c <<'END_OF_fight.c'
X/* SCCS Id: @(#)fight.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* fight.c - version 1.0.3 */
X
X#include <stdio.h>
X#include "hack.h"
X
Xextern struct permonst li_dog, dog, la_dog;
Xextern char *exclam(), *hcolor(), *xname();
Xextern struct obj *mkobj_at();
X#ifdef KAA
Xextern boolean stoned;
Xextern boolean unweapon;
Xextern char *nomovemsg, *defmonnam();
Xextern struct monst *mkmon_at();
X#endif
X
Xstatic boolean far_noise;
Xstatic long noisetime;
X
X/* hitmm returns 0 (miss), 1 (hit), or 2 (kill) */
Xhitmm(magr,mdef) register struct monst *magr,*mdef; {
Xregister struct permonst *pa = magr->data, *pd = mdef->data;
Xint hit;
Xschar tmp;
Xboolean vis;
X if(index("Eauy", pa->mlet)) return(0);
X if(magr->mfroz) return(0); /* riv05!a3 */
X tmp = pd->ac + pa->mlevel;
X if(mdef->mconf || mdef->mfroz || mdef->msleep){
X tmp += 4;
X if(mdef->msleep) mdef->msleep = 0;
X }
X hit = (tmp > rnd(20));
X if(hit) mdef->msleep = 0;
X vis = (cansee(magr->mx,magr->my) && cansee(mdef->mx,mdef->my));
X if(vis){
X char buf[BUFSZ];
X if(mdef->mimic) seemimic(mdef);
X if(magr->mimic) seemimic(magr);
X (void) sprintf(buf,"%s %s", Monnam(magr),
X hit ? "hits" : "misses");
X pline("%s %s.", buf, monnam(mdef));
X } else {
X boolean farq = (dist(magr->mx, magr->my) > 15);
X if(farq != far_noise || moves-noisetime > 10) {
X far_noise = farq;
X noisetime = moves;
X pline("You hear some noises%s.",
X farq ? " in the distance" : "");
X }
X }
X if(hit){
X if(magr->data->mlet == 'c' && !magr->cham) {
X magr->mhpmax += 3;
X if(vis) pline("%s is turned to stone!", Monnam(mdef));
X else if(mdef->mtame)
X pline("You have a peculiarly sad feeling for a moment, then it passes.");
X monstone(mdef);
X hit = 2;
X } else
X if((mdef->mhp -= d(pa->damn,pa->damd)) < 1) {
X magr->mhpmax += 1 + rn2(pd->mlevel+1);
X if(magr->mtame && magr->mhpmax > 8*pa->mlevel){
X if(pa == &li_dog) magr->data = pa = &dog;
X else if(pa == &dog) magr->data = pa = &la_dog;
X }
X if(vis) pline("%s is killed!", Monnam(mdef));
X else if(mdef->mtame)
X pline("You have a sad feeling for a moment, then it passes.");
X mondied(mdef);
X hit = 2;
X }
X /* fixes a bug where max monster hp could overflow. */
X if(magr->mhpmax <= 0) magr->mhpmax = 127;
X }
X#ifdef KAA
X if(hit == 1 && magr->data->mlet == 'Q') {
X rloc(mdef);
X if(vis && !cansee(mdef->mx,mdef->my))
X pline("%s suddenly disappears!",Monnam(mdef));
X }
X#endif
X return(hit);
X}
X
X/* drop (perhaps) a cadaver and remove monster */
Xmondied(mdef) register struct monst *mdef; {
Xregister struct permonst *pd = mdef->data;
X#ifdef KOPS
X if(letter(pd->mlet) && rn2(3) && pd->mlet != 'K'){
X#else
X if(letter(pd->mlet) && rn2(3)){
X#endif
X if (pd->mlet == '1') panic("mondied: making obj '1'");
X (void) mkobj_at(pd->mlet,mdef->mx,mdef->my);
X if(cansee(mdef->mx,mdef->my)){
X unpmon(mdef);
X atl(mdef->mx,mdef->my,fobj->olet);
X }
X stackobj(fobj);
X }
X mondead(mdef);
X}
X
X/* drop a rock and remove monster */
Xmonstone(mdef) register struct monst *mdef; {
X extern char mlarge[];
X if(index(mlarge, mdef->data->mlet))
X mksobj_at(ENORMOUS_ROCK, mdef->mx, mdef->my);
X else
X mksobj_at(ROCK, mdef->mx, mdef->my);
X if(cansee(mdef->mx, mdef->my)){
X unpmon(mdef);
X atl(mdef->mx,mdef->my,fobj->olet);
X }
X mondead(mdef);
X}
X
X
Xfightm(mtmp) register struct monst *mtmp; {
Xregister struct monst *mon;
X for(mon = fmon; mon; mon = mon->nmon) if(mon != mtmp) {
X if(DIST(mon->mx,mon->my,mtmp->mx,mtmp->my) < 3)
X if(rn2(4))
X return(hitmm(mtmp,mon));
X }
X return(-1);
X}
X
X/* u is hit by sth, but not a monster */
Xthitu(tlev,dam,name)
Xregister tlev,dam;
Xregister char *name;
X{
Xchar buf[BUFSZ];
X setan(name,buf);
X if(u.uac + tlev <= rnd(20)) {
X if(Blind) pline("It misses.");
X else pline("You are almost hit by %s!", buf);
X return(0);
X } else {
X if(Blind) pline("You are hit!");
X else pline("You are hit by %s!", buf);
X losehp(dam,name);
X return(1);
X }
X}
X
X#ifdef KAA
Xchar mlarge[] = "bCDdegIlmnoPSsTUwY',&9";
X#else
Xchar mlarge[] = "bCDdegIlmnoPSsTUwY',&";
X#endif
X
Xboolean
Xhmon(mon,obj,thrown) /* return TRUE if mon still alive */
Xregister struct monst *mon;
Xregister struct obj *obj;
Xregister thrown;
X{
X register tmp;
X boolean hittxt = FALSE;
X
X#ifdef KAA
X stoned = FALSE; /* this refers to the thing hit, not you */
X#endif
X if(!obj){
X#ifdef KAA
X/* Note that c, y, and F can never wield weapons anyway */
X if (u.usym == 'c' && mon->data->mlet != 'c') {
X pline("You turn %s to stone!", monnam(mon));
X stoned = TRUE;
X xkilled(mon,0);
X return(FALSE);
X } else if (u.usym == 'y' && mon->data->mlet != 'y') {
X pline("%s is blinded by your flash of light!",Monnam(mon));
X if (!mon->mblinded) {
X mon->mblinded += rn2(25);
X mon->mcansee = 0;
X }
X rehumanize();
X return(TRUE);
X } else if (u.usym == 'F') {
X pline("You explode!");
X if (!index("gFY",mon->data->mlet)) {
X pline("%s gets blasted!", Monnam(mon));
X mon->mhp -= d(6,6);
X rehumanize();
X if (mon->mhp <= 0) {
X killed(mon);
X return(FALSE);
X } else return(TRUE);
X } else {
X pline("The blast doesn't seem to affect %s.", monnam(mon));
X rehumanize();
X return(TRUE);
X }
X } else if (index("P,'", u.usym) && u.uhunger < 1500
X && !u.uswallow && mon->data->mlet != 'c') {
X static char msgbuf[BUFSZ];
X pline("You swallow %s whole!", monnam(mon));
X u.uhunger += 20*mon->mhpmax;
X newuhs(FALSE);
X xkilled(mon,2);
X if (tmp = mon->mhpmax/5) {
X nomul(-tmp);
X (void)sprintf(msgbuf, "You finished digesting %s.",
X monnam(mon));
X nomovemsg = msgbuf;
X }
X return(FALSE);
X } else if (u.usym != '@') {
X if (u.usym == '&' && !rn2(5)) {
X struct monst *dtmp;
X pline("Some hell-p has arrived!");
X dtmp = mkmon_at('&',u.ux,u.uy);
X (void)tamedog(dtmp,(struct obj *)0);
X }
X tmp = d(mons[u.umonnum].damn, mons[u.umonnum].damd);
X } else
X#endif
X tmp = rnd(2); /* attack with bare hands */
X#ifdef KAA
X if (mon->data->mlet == 'c' && !uarmg && u.usym != 'c'){
X#else
X if(mon->data->mlet == 'c' && !uarmg){
X#endif
X pline("You hit the cockatrice with your bare hands.");
X pline("You turn to stone ...");
X done_in_by(mon);
X }
X } else if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE) {
X if(obj == uwep && (obj->otyp > SPEAR || obj->otyp < BOOMERANG))
X tmp = rnd(2);
X else {
X if(index(mlarge, mon->data->mlet)) {
X tmp = rnd(objects[obj->otyp].wldam);
X switch (obj->otyp) {
X case SLING_BULLET:
X case CROSSBOW_BOLT:
X case MORNING_STAR:
X case PARTISAN:
X case BROAD_SWORD: tmp += 1; break;
X
X case FLAIL:
X case RANSEUR:
X case VOULGE: tmp += rnd(4); break;
X
X case HALBERD:
X case SPETUM: tmp += rnd(6); break;
X
X case BARDICHE:
X case TRIDENT: tmp += d(2,4); break;
X
X case TWO_HANDED_SWORD:
X case KATANA: tmp += d(2,6); break;
X }
X } else {
X tmp = rnd(objects[obj->otyp].wsdam);
X switch (obj->otyp) {
X case SLING_BULLET:
X case CROSSBOW_BOLT:
X case MACE:
X case FLAIL:
X case SPETUM:
X case TRIDENT: tmp += 1; break;
X
X case BARDICHE:
X case BILL_GUISARME:
X case GUISARME:
X case LUCERN_HAMMER:
X case MORNING_STAR:
X case RANSEUR:
X case BROAD_SWORD:
X case VOULGE: tmp += rnd(4); break;
X }
X }
X tmp += obj->spe;
X#ifdef KAA
X if(obj->olet == WEAPON_SYM && obj->dknown && index("VWZ &",
X mon->data->mlet)) tmp += rn2(4);
X#endif
X if(!thrown && obj == uwep && obj->otyp == BOOMERANG
X && !rn2(3)){
X pline("As you hit %s, the boomerang breaks into splinters.",
X monnam(mon));
X freeinv(obj);
X setworn((struct obj *) 0, obj->owornmask);
X obfree(obj, (struct obj *) 0);
X tmp++;
X }
X }
X if(mon->data->mlet == 'O' && obj->otyp == TWO_HANDED_SWORD &&
X !strcmp(ONAME(obj), "Orcrist"))
X tmp += rnd(10);
X } else switch(obj->otyp) {
X case HEAVY_IRON_BALL:
X tmp = rnd(25); break;
X case ENORMOUS_ROCK:
X tmp = rnd(20); break;
X case EXPENSIVE_CAMERA:
X pline("You succeed in destroying your camera. Congratulations!");
X freeinv(obj);
X if(obj->owornmask)
X setworn((struct obj *) 0, obj->owornmask);
X obfree(obj, (struct obj *) 0);
X return(TRUE);
X case DEAD_COCKATRICE:
X pline("You hit %s with the cockatrice corpse.",
X monnam(mon));
X if(mon->data->mlet == 'c') {
X tmp = 1;
X hittxt = TRUE;
X#ifdef KAA
X stoned = TRUE;
X xkilled(mon,0);
X#endif
X break;
X }
X pline("%s is turned to stone!", Monnam(mon));
X killed(mon);
X return(FALSE);
X case CLOVE_OF_GARLIC: /* no effect against demons */
X if(index(UNDEAD, mon->data->mlet))
X mon->mflee = 1;
X tmp = 1;
X break;
X default:
X /* non-weapons can damage because of their weight */
X /* (but not too much) */
X tmp = obj->owt/10;
X if(tmp < 1) tmp = 1;
X else tmp = rnd(tmp);
X if(tmp > 6) tmp = 6;
X }
X
X /****** NOTE: perhaps obj is undefined!! (if !thrown && BOOMERANG) */
X
X tmp += u.udaminc + dbon();
X if(u.uswallow) {
X if((tmp -= u.uswldtim) <= 0) {
X pline("Your arms are no longer able to hit.");
X return(TRUE);
X }
X }
X if(tmp < 1) tmp = 1;
X mon->mhp -= tmp;
X if(mon->mhp < 1) {
X killed(mon);
X return(FALSE);
X }
X if(mon->mtame && (!mon->mflee || mon->mfleetim)) {
X mon->mflee = 1; /* Rick Richardson */
X mon->mfleetim += 10*rnd(tmp);
X }
X
X if(!hittxt) {
X if(thrown)
X /* this assumes that we cannot throw plural things */
X hit( xname(obj) /* or: objects[obj->otyp].oc_name */,
X mon, exclam(tmp) );
X else if(Blind)
X pline("You hit it.");
X else
X pline("You hit %s%s", monnam(mon), exclam(tmp));
X }
X
X if(u.umconf && !thrown) {
X if(!Blind) {
X pline("Your hands stop glowing %s.",
X Hallucination ? hcolor() : "blue");
X }
X if (!resist(mon, '+', 0, NOTELL)) mon->mconf = 1;
X if(!mon->mfroz && !mon->msleep && !Blind && mon->mconf)
X pline("%s appears confused.",Monnam(mon));
X u.umconf = 0;
X }
X if(!thrown && rn2(2) && index("VW",u.usym) &&
X !index("VW",mon->data->mlet)){
X int tmp=d(2,6);
X pline("%s suddenly seems weaker!",Monnam(mon));
X mon->mhpmax -= tmp;
X if ((mon->mhp -= tmp) <= 0) {
X pline("%s dies!",Monnam(mon));
X xkilled(mon,0);
X return(FALSE);
X }
X }
X return(TRUE); /* mon still alive */
X}
X
X/* try to attack; return FALSE if monster evaded */
X/* u.dx and u.dy must be set */
Xattack(mtmp)
Xregister struct monst *mtmp;
X{
X schar tmp;
X boolean malive = TRUE;
X register struct permonst *mdat;
X mdat = mtmp->data;
X
X#ifdef KAA
X if(unweapon) {
X unweapon=FALSE;
X if(uwep)
X pline("You begin bashing monsters with your %s.",
X aobjnam(uwep,(char *)0));
X }
X#endif
X u_wipe_engr(3); /* andrew@orca: prevent unlimited pick-axe attacks */
X
X if(mdat->mlet == 'L' && !mtmp->mfroz && !mtmp->msleep &&
X !mtmp->mconf && mtmp->mcansee && !rn2(7) &&
X (m_move(mtmp, 0) == 2 /* he died */ || /* he moved: */
X mtmp->mx != u.ux+u.dx || mtmp->my != u.uy+u.dy))
X return(FALSE);
X#ifdef SAFE_ATTACK
X /* This section of code provides protection against accidentally
X * hitting peaceful (like '@') and tame (like 'd') monsters.
X * There is protection only if you're not blind, confused or
X * invisible.
X */
X /* changes by wwp 5/16/85 */
X if (!Blind && !Confusion && !Hallucination
X && mdat->mlet == 'd' && mtmp->mtame) {
X mtmp->mflee = 1;
X mtmp->mfleetim = rnd(6);
X pline("You stop to avoid hitting your dog");
X return(TRUE);
X }
X if (flags.confirm && (mtmp->mpeaceful || mtmp->mtame) && ! Confusion
X && !Hallucination && !Invisible)
X
X if (Blind ? Telepat : (!mtmp->minvis || See_invisible)) {
X pline("Really attack?");
X (void) fflush(stdout);
X if (readchar() != 'y') {
X flags.move = 0;
X return(TRUE);
X }
X }
X#endif /* SAFE_ATTACK /**/
X
X if(mtmp->mimic){
X if(!u.ustuck && !mtmp->mflee) u.ustuck = mtmp;
X#ifdef DGK
X if (levl[u.ux+u.dx][u.uy+u.dy].scrsym == symbol.door)
X if (okdoor(u.ux+u.dx, u.uy+u.dy))
X pline("The door actually was %s.", defmonnam(mtmp));
X else pline("That spellbook was %s.", defmonnam(mtmp));
X else if (levl[u.ux+u.dx][u.uy+u.dy].scrsym == '$')
X pline("The chest was %s!", defmonnam(mtmp));
X else
X pline("Wait! That's %s!",defmonnam(mtmp));
X#else
X switch(levl[u.ux+u.dx][u.uy+u.dy].scrsym){
X case '+':
X if (okdoor(u.ux+u.dx, u.uy+u.dy))
X pline("The door actually was %s.", defmonnam(mtmp));
X else pline("That spellbook was %s.", defmonnam(mtmp));
X break;
X case '$':
X pline("The chest was %s!", defmonnam(mtmp));
X break;
X default:
X pline("Wait! That's %s!",defmonnam(mtmp));
X }
X#endif
X wakeup(mtmp); /* clears mtmp->mimic */
X return(TRUE);
X }
X
X wakeup(mtmp);
X
X if(mtmp->mhide && mtmp->mundetected){
X register struct obj *obj;
X
X mtmp->mundetected = 0;
X if((obj = o_at(mtmp->mx,mtmp->my)) && !Blind)
X pline("Wait! There's %s hiding under %s!",
X defmonnam(mtmp), doname(obj));
X return(TRUE);
X }
X#ifdef KAA
X tmp = u.uluck + (u.mtimedone ? mons[u.umonnum].mlevel : u.ulevel) +
X mdat->ac + abon();
X if (u.usym=='y' || u.usym=='F') tmp=100;
X if (index("uEa",u.usym)) return(TRUE);
X#endif
X if(uwep) {
X#ifdef KAA /* Blessed weapons used against undead or demons */
X if(uwep->olet == WEAPON_SYM && uwep->dknown && index("VWZ &",
X mtmp->data->mlet)) tmp += 2;
X#endif
X if(uwep->olet == WEAPON_SYM || uwep->otyp == PICK_AXE)
X tmp += uwep->spe;
X if(uwep->otyp == TWO_HANDED_SWORD) tmp -= 1;
X else if(uwep->otyp == KATANA) tmp += 1;
X else if(uwep->otyp == DAGGER ||
X uwep->otyp == SHURIKEN) tmp += 2;
X else if(uwep->otyp == CRYSKNIFE) tmp += 3;
X else if(uwep->otyp == SPEAR &&
X index("XDne", mdat->mlet)) tmp += 2;
X }
X if(mtmp->msleep) {
X mtmp->msleep = 0;
X tmp += 2;
X }
X if(mtmp->mfroz) {
X tmp += 4;
X if(!rn2(10)) mtmp->mfroz = 0;
X }
X if(mtmp->mflee) tmp += 2;
X if(u.utrap) tmp -= 3;
X
X /* with a lot of luggage, your agility diminishes */
X tmp -= (inv_weight() + 40)/20;
X
X if(tmp <= rnd(20) && !u.uswallow){
X if(Blind) pline("You miss it.");
X else pline("You miss %s.",monnam(mtmp));
X } else {
X /* we hit the monster; be careful: it might die! */
X
X if((malive = hmon(mtmp,uwep,0)) == TRUE) {
X /* monster still alive */
X if(!rn2(25) && mtmp->mhp < mtmp->mhpmax/2) {
X mtmp->mflee = 1;
X if(!rn2(3)) mtmp->mfleetim = rnd(100);
X if(u.ustuck == mtmp && !u.uswallow)
X u.ustuck = 0;
X }
X#ifndef NOWORM
X if(mtmp->wormno)
X cutworm(mtmp, u.ux+u.dx, u.uy+u.dy,
X uwep ? uwep->otyp : 0);
X#endif
X }
X if(mdat->mlet == 'a') {
X if(rn2(2)) {
X if (Blind) pline("You are splashed!");
X else pline("You are splashed by %s's acid!",monnam(mtmp));
X if (u.usym != 'a') {
X losehp_m(rnd(6), mtmp);
X if(!rn2(30)) corrode_armor();
X }
X }
X if(!rn2(6)) corrode_weapon();
X }
X }
X#ifdef KAA
X if (malive) if (u.usym=='N' && mtmp->minvent) {
X struct obj *otmp, *addinv();
X otmp = mtmp->minvent;
X mtmp->minvent = otmp->nobj;
X otmp = addinv(otmp);
X pline("You steal:");
X prinv(otmp);
X } else if (u.usym=='L' && mtmp->mgold) {
X u.ugold += mtmp->mgold;
X mtmp->mgold = 0;
X pline("Your purse feels heavier.");
X } else if (u.usym=='Q') rloc(mtmp);
X#endif
X if(malive && mdat->mlet == 'E' && canseemon(mtmp)
X && !mtmp->mcan && rn2(3)) {
X if(mtmp->mcansee) {
X pline("You are frozen by %s's gaze!",monnam(mtmp));
X nomul((u.ulevel > 6 || rn2(4)) ? rn1(20,-21) : -200);
X } else {
X pline("%s cannot defend itself.", Amonnam(mtmp,"blinded"));
X if(!rn2(500)) if((int)u.uluck > LUCKMIN) u.uluck--;
X }
X }
X return(TRUE);
X}
END_OF_fight.c
if test 15365 -ne `wc -c <fight.c`; then
echo shar: \"fight.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f mkmaze.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"mkmaze.c\"
else
echo shar: Extracting \"mkmaze.c\" \(4084 characters\)
sed "s/^X//" >mkmaze.c <<'END_OF_mkmaze.c'
X/* SCCS Id: @(#)mkmaze.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* mkmaze.c - version 1.0.2 */
X
X#include "hack.h"
X#include "mkroom.h" /* not really used */
Xextern struct monst *makemon();
Xextern struct permonst pm_wizard;
Xextern struct obj *mkobj_at();
Xextern coord mazexy();
Xstruct permonst hell_hound =
X { "hell hound", 'd', 12, 14, 2, 20, 3, 6, 0 };
X
Xmakemaz()
X{
X int x,y;
X register zx,zy;
X coord mm;
X boolean al = (dlevel >= 30 && !flags.made_amulet);
X
X for(x = 2; x < COLNO-1; x++)
X for(y = 2; y < ROWNO-1; y++)
X levl[x][y].typ = (x%2 && y%2) ? 0 : HWALL;
X if(al) {
X register struct monst *mtmp;
X
X zx = 2*(COLNO/4) - 1;
X zy = 2*(ROWNO/4) - 1;
X for(x = zx-2; x < zx+4; x++) for(y = zy-2; y <= zy+2; y++) {
X levl[x][y].typ =
X (y == zy-2 || y == zy+2 || x == zx-2 || x == zx+3) ? POOL :
X (y == zy-1 || y == zy+1 || x == zx-1 || x == zx+2) ? HWALL:
X ROOM;
X }
X (void) mkobj_at(AMULET_SYM, zx, zy);
X flags.made_amulet = 1;
X walkfrom(zx+4, zy);
X if(mtmp = makemon(&hell_hound, zx, zy))
X mtmp->msleep = 1;
X if(mtmp = makemon(PM_WIZARD, zx+1, zy)) {
X mtmp->msleep = 1;
X flags.no_of_wizards = 1;
X }
X } else {
X mm = mazexy();
X zx = mm.x;
X zy = mm.y;
X walkfrom(zx,zy);
X (void) mksobj_at(WAN_WISHING, zx, zy);
X (void) mkobj_at(ROCK_SYM, zx, zy); /* put a rock on top of it */
X }
X
X for(x = 2; x < COLNO-1; x++)
X for(y = 2; y < ROWNO-1; y++) {
X switch(levl[x][y].typ) {
X#ifdef DGK
X case HWALL:
X levl[x][y].scrsym = symbol.hwall;
X break;
X case ROOM:
X levl[x][y].scrsym = symbol.room;
X break;
X#else
X case HWALL:
X levl[x][y].scrsym = '-';
X break;
X case ROOM:
X levl[x][y].scrsym = '.';
X break;
X#endif /* DGK /**/
X }
X }
X for(x = rn1(8,11); x; x--) {
X mm = mazexy();
X (void) mkobj_at(rn2(2) ? GEM_SYM : 0, mm.x, mm.y);
X }
X for(x = rn1(10,2); x; x--) {
X mm = mazexy();
X (void) mkobj_at(ROCK_SYM, mm.x, mm.y);
X }
X mm = mazexy();
X (void) makemon(PM_MINOTAUR, mm.x, mm.y);
X for(x = rn1(5,7); x; x--) {
X mm = mazexy();
X (void) makemon((struct permonst *) 0, mm.x, mm.y);
X }
X for(x = rn1(6,7); x; x--) {
X mm = mazexy();
X mkgold(0L,mm.x,mm.y);
X }
X for(x = rn1(6,7); x; x--)
X mktrap(0,1,(struct mkroom *) 0);
X mm = mazexy();
X levl[(xupstair = mm.x)][(yupstair = mm.y)].scrsym = '<';
X levl[xupstair][yupstair].typ = STAIRS;
X xdnstair = ydnstair = 0;
X}
X
X#ifdef DGK
X/* Make the mazewalk iterative by faking a stack. This is needed to
X * ensure the mazewalk is successful in the limited stack space of
X * the program. This iterative version uses the mimumum amount of stack
X * that is totally safe.
X */
Xwalkfrom(x,y)
Xint x,y;
X{
X#define CELLS (ROWNO * COLNO) / 4 /* a maze cell is 4 squares */
X char mazex[CELLS + 1], mazey[CELLS + 1]; /* char's are OK */
X int q, a, dir, pos;
X int dirs[4];
X
X pos = 1;
X mazex[pos] = (char) x;
X mazey[pos] = (char) y;
X while (pos) {
X x = (int) mazex[pos];
X y = (int) mazey[pos];
X levl[x][y].typ = ROOM;
X q = 0;
X for (a = 0; a < 4; a++)
X if(okay(x, y, a)) dirs[q++]= a;
X if (!q)
X pos--;
X else {
X dir = dirs[rn2(q)];
X move(&x, &y, dir);
X levl[x][y].typ = ROOM;
X move(&x, &y, dir);
X pos++;
X if (pos > CELLS)
X panic("Overflow in walkfrom");
X mazex[pos] = (char) x;
X mazey[pos] = (char) y;
X }
X }
X}
X#else
X
Xwalkfrom(x,y) int x,y; {
Xregister int q,a,dir;
Xint dirs[4];
X levl[x][y].typ = ROOM;
X while(1) {
X q = 0;
X for(a = 0; a < 4; a++)
X if(okay(x,y,a)) dirs[q++]= a;
X if(!q) return;
X dir = dirs[rn2(q)];
X move(&x,&y,dir);
X levl[x][y].typ = ROOM;
X move(&x,&y,dir);
X walkfrom(x,y);
X }
X}
X#endif /* DGK /**/
X
Xmove(x,y,dir)
Xregister int *x, *y;
Xregister int dir;
X{
X switch(dir){
X case 0: --(*y); break;
X case 1: (*x)++; break;
X case 2: (*y)++; break;
X case 3: --(*x); break;
X }
X}
X
Xokay(x,y,dir)
Xint x,y;
Xregister int dir;
X{
X move(&x,&y,dir);
X move(&x,&y,dir);
X if(x<3 || y<3 || x>COLNO-3 || y>ROWNO-3 || levl[x][y].typ != 0)
X return(0);
X else
X return(1);
X}
X
Xcoord
Xmazexy(){
X coord mm;
X mm.x = 3 + 2*rn2(COLNO/2 - 2);
X mm.y = 3 + 2*rn2(ROWNO/2 - 2);
X return mm;
X}
END_OF_mkmaze.c
if test 4084 -ne `wc -c <mkmaze.c`; then
echo shar: \"mkmaze.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f objects.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"objects.h\"
else
echo shar: Extracting \"objects.h\" \(15108 characters\)
sed "s/^X//" >objects.h <<'END_OF_objects.h'
X/* SCCS Id: @(#)objects.h 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* def.objects.h - version 1.0.3 */
X
X/* objects have letter " % ) ( 0 _ ` [ ! ? / = * + */
X#include "config.h"
X#include "objclass.h"
X#define NULL (char *)0
X
Xstruct objclass objects[] = {
X
X { "strange object", NULL, NULL, 1, 0,
X ILLOBJ_SYM, 0, 0, 0, 0, 0, 0 },
X { "amulet of Yendor", NULL, NULL, 1, 0,
X AMULET_SYM, 100, 0, 2, 0, 0, 0 },
X
X#define FOOD(name,prob,delay,weight,nutrition) { name, NULL, NULL, 1, 1,\
X FOOD_SYM, prob, delay, weight, 0, 0, nutrition }
X
X/* dog eats foods 0-4 but prefers 1 above 0,2,3,4 */
X/* food 4 can be read */
X/* food 5 improves your vision */
X/* food 6 makes you stronger (like Popeye) */
X/* foods CORPSE up to CORPSE+52 are cadavers */
X
X FOOD("food ration", 46, 5, 4, 800),
X FOOD("tripe ration", 16, 1, 2, 200),
X FOOD("pancake", 3, 1, 1, 200),
X FOOD("dead lizard", 3, 0, 1, 40),
X FOOD("fortune cookie", 7, 0, 1, 40),
X FOOD("carrot", 2, 0, 1, 50),
X FOOD("slice of pizza", 5, 0, 1, 250),
X FOOD("cream pie", 3, 0, 1, 100),
X FOOD("tin", 7, 0, 1, 0),
X FOOD("orange", 1, 0, 1, 80),
X FOOD("apple", 1, 0, 1, 50),
X FOOD("pear", 1, 0, 1, 50),
X FOOD("melon", 1, 0, 1, 100),
X FOOD("banana", 1, 0, 1, 80),
X FOOD("candy bar", 1, 0, 1, 100),
X FOOD("egg", 1, 0, 1, 80),
X FOOD("clove of garlic", 1, 0, 1, 40),
X FOOD("lump of royal jelly", 0, 0, 1, 200),
X
X FOOD("dead human", 0, 4, 40, 400),
X FOOD("dead giant ant", 0, 1, 3, 30),
X FOOD("dead giant bat", 0, 1, 3, 30),
X FOOD("dead centaur", 0, 5, 50, 500),
X FOOD("dead dragon", 0, 15, 150, 1500),
X FOOD("dead floating eye", 0, 1, 1, 10),
X FOOD("dead freezing sphere", 0, 1, 1, 10),
X FOOD("dead gnome", 0, 1, 10, 100),
X FOOD("dead hobgoblin", 0, 2, 20, 200),
X FOOD("dead stalker", 0, 4, 40, 400),
X FOOD("dead jackal", 0, 1, 10, 100),
X FOOD("dead kobold", 0, 1, 10, 100),
X FOOD("dead leprechaun", 0, 4, 40, 400),
X FOOD("dead mimic", 0, 4, 40, 400),
X FOOD("dead nymph", 0, 4, 40, 400),
X FOOD("dead orc", 0, 2, 20, 200),
X FOOD("dead purple worm", 0, 7, 70, 700),
X FOOD("dead quantum mechanic", 0, 2, 20, 200),
X FOOD("dead rust monster", 0, 5, 50, 500),
X FOOD("dead snake", 0, 1, 10, 100),
X FOOD("dead troll", 0, 4, 40, 400),
X FOOD("dead umber hulk", 0, 5, 50, 500),
X FOOD("dead vampire", 0, 4, 40, 400),
X FOOD("dead wraith", 0, 1, 1, 10),
X FOOD("dead xorn", 0, 7, 70, 700),
X FOOD("dead yeti", 0, 7, 70, 700),
X FOOD("dead zombie", 0, 1, 3, 30),
X FOOD("dead acid blob", 0, 1, 3, 30),
X FOOD("dead giant beetle", 0, 1, 1, 10),
X FOOD("dead cockatrice", 0, 1, 3, 30),
X FOOD("dead dog", 0, 2, 20, 200),
X FOOD("dead ettin", 0, 1, 3, 30),
X FOOD("dead fog cloud", 0, 1, 1, 10),
X FOOD("dead gelatinous cube", 0, 1, 10, 100),
X FOOD("dead homunculus", 0, 2, 20, 200),
X FOOD("dead imp", 0, 1, 1, 10),
X FOOD("dead jaguar", 0, 3, 30, 300),
X FOOD("dead killer bee", 0, 1, 1, 10),
X FOOD("dead leocrotta", 0, 5, 50, 500),
X FOOD("dead minotaur", 0, 7, 70, 700),
X FOOD("dead nurse", 0, 4, 40, 400),
X FOOD("dead owlbear", 0, 7, 70, 700),
X FOOD("dead piercer", 0, 2, 20, 200),
X FOOD("dead quivering blob", 0, 1, 10, 100),
X FOOD("dead giant rat", 0, 1, 3, 30),
X FOOD("dead giant scorpion", 0, 1, 10, 100),
X FOOD("dead tengu", 0, 3, 30, 300),
X FOOD("dead unicorn", 0, 3, 30, 300),
X FOOD("dead violet fungus", 0, 1, 10, 100),
X FOOD("dead long worm", 0, 5, 50, 500),
X/* %% wt of long worm should be proportional to its length */
X FOOD("dead xan", 0, 3, 30, 300),
X FOOD("dead yellow light", 0, 1, 1, 10),
X FOOD("dead zruty", 0, 6, 60, 600),
X FOOD("dead giant", 0, 7, 70, 700),
X FOOD("dead demon", 0, 8, 80, 800),
X
X/* weapons ... - ROCK come several at a time */
X/* weapons ... - (DART-1) are shot using idem+(BOW-ARROW) */
X/* weapons AXE, SWORD, KATANA, THSWORD are good for worm-cutting */
X/* weapons (PICK-)AXE, DAGGER, CRYSKNIFE are good for tin-opening */
X#define WEAPON(name,prob,wt,sdam,ldam) { name, NULL, NULL, 1, 0 /*%%*/,\
X WEAPON_SYM, prob, 0, wt, sdam, ldam, 0 }
X
X/* Note: for weapons that don't do an even die of damage (i.e. 2-7 or 3-18)
X * the extra damage is added on in fight.c, not here! */
X
X WEAPON("arrow", 6, 0, 6, 6),
X WEAPON("sling bullet", 6, 0, 4, 6),
X WEAPON("crossbow bolt", 6, 0, 4, 6),
X WEAPON("dart", 6, 0, 3, 2),
X WEAPON("shuriken", 3, 0, 8, 6),
X WEAPON("rock", 4, 1, 3, 3),
X WEAPON("boomerang", 1, 3, 9, 9),
X WEAPON("mace", 6, 3, 6, 7), /* +1 small */
X WEAPON("axe", 5, 3, 6, 4),
X WEAPON("flail", 5, 3, 6, 5), /* +1 small, +1d4 large */
X WEAPON("long sword", 5, 3, 8, 12),
X WEAPON("two handed sword", 4, 4, 12, 6), /* +2d6 large */
X WEAPON("dagger", 4, 3, 4, 3),
X WEAPON("worm tooth", 0, 4, 2, 2),
X WEAPON("crysknife", 0, 3, 10, 10),
X WEAPON("aklys", 1, 3, 6, 3),
X WEAPON("bardiche", 1, 3, 4, 4), /* +1d4 small, +2d4 large */
X WEAPON("bec de corbin", 1, 3, 8, 6),
X WEAPON("bill-guisarme", 1, 3, 4, 10), /* +1d4 small */
X WEAPON("club", 1, 3, 6, 3),
X WEAPON("fauchard", 1, 3, 6, 8),
X WEAPON("glaive", 1, 3, 6, 10),
X WEAPON("guisarme", 1, 3, 4, 8), /* +1d4 small */
X WEAPON("halberd", 1, 3, 10, 6), /* +1d6 large */
X WEAPON("lucern hammer", 1, 3, 4, 6), /* +1d4 small */
X WEAPON("javelin", 1, 3, 6, 6),
X WEAPON("katana", 1, 3, 12, 12),
X WEAPON("lance", 1, 3, 6, 8),
X WEAPON("morning star", 1, 3, 4, 6), /* +d4 small, +1 large */
X WEAPON("partisan", 1, 3, 6, 6), /* +1 large */
X WEAPON("ranseur", 1, 3, 4, 4), /* +d4 both */
X WEAPON("scimitar", 1, 3, 8, 8),
X WEAPON("spetum", 1, 3, 6, 6), /* +1 small, +d6 large */
X WEAPON("broad sword", 1, 3, 4, 6), /* +d4 small, +1 large */
X WEAPON("short sword", 1, 3, 6, 8),
X WEAPON("trident", 1, 3, 6, 4), /* +1 small, +2d4 large */
X WEAPON("voulge", 1, 3, 4, 4), /* +d4 both */
X WEAPON("spear", 4, 3, 6, 8),
X WEAPON("bow", 4, 3, 4, 6),
X WEAPON("sling", 4, 3, 6, 6),
X WEAPON("crossbow", 5, 3, 4, 6),
X
X#ifdef WALKIES
X { "whistle", "whistle", NULL, 0, 0, TOOL_SYM, 70, 0, 2, 0, 0, 0 },
X { "leash", NULL, NULL, 1, 0, TOOL_SYM, 20, 0, 20, 0, 0, 0 },
X#else
X { "whistle", "whistle", NULL, 0, 0, TOOL_SYM, 90, 0, 2, 0, 0, 0 },
X { "leash", NULL, NULL, 1, 0, TOOL_SYM, 0, 0, 20, 0, 0, 0 },
X#endif
X { "magic whistle", "whistle", NULL, 0, 0,
X TOOL_SYM, 10, 0, 2, 0, 0, 0 },
X { "expensive camera", NULL, NULL, 1, 1,
X TOOL_SYM, 0, 0, 3, 0, 0, 0 },
X { "ice box", "large box", NULL, 0, 0,
X TOOL_SYM, 0, 0, 40, 0, 0, 0 },
X { "pick-axe", NULL, NULL, 1, 1,
X TOOL_SYM, 0, 0, 5, 6, 3, 0 },
X { "magic marker", NULL, NULL, 1, 0,
X TOOL_SYM, 0, 0, 1, 0, 0, 0 },
X { "stethoscope", NULL, NULL, 1, 0,
X TOOL_SYM, 0, 0, 3, 0, 0, 0 },
X { "can opener", NULL, NULL, 1, 1,
X TOOL_SYM, 0, 0, 1, 0, 0, 0 },
X { "heavy iron ball", NULL, NULL, 1, 0,
X BALL_SYM, 100, 0, 20, 0, 0, 0 },
X { "iron chain", NULL, NULL, 1, 0,
X CHAIN_SYM, 100, 0, 20, 0, 0, 0 },
X#ifdef KAA
X /* Because giants can throw rocks */
X { "enormous rock", NULL, NULL, 1, 0,
X ROCK_SYM, 100, 0, 200 /* > MAX_CARR_CAP */, 0, 20, 20 },
X#else
X { "enormous rock", NULL, NULL, 1, 0,
X ROCK_SYM, 100, 0, 250 /* > MAX_CARR_CAP */, 0, 0, 0 },
X#endif
X
X#define ARMOR(name,prob,delay,weight,ac,can) { name, NULL, NULL, 1, 0,\
X ARMOR_SYM, prob, delay, weight, ac, can, 0 }
X/* Originally, weight was always 8, which is ridiculous. (Plate mail weighs
X the same as a pair of gloves?) */
X ARMOR("helmet", 3, 1, 2, 9, 0),
X ARMOR("plate mail", 5, 5, 9, 3, 2),
X ARMOR("splint mail", 7, 5, 8, 4, 1),
X ARMOR("banded mail", 9, 5, 8, 4, 0),
X ARMOR("chain mail", 10, 5, 6, 5, 1),
X ARMOR("scale mail", 10, 5, 5, 6, 0),
X ARMOR("ring mail", 12, 5, 3, 7, 0),
X /* the armors below do not rust */
X ARMOR("studded leather armor", 12, 3, 3, 7, 1),
X ARMOR("elfin chain mail", 1, 1, 2, 5, 3),
X ARMOR("bronze plate mail", 6, 5, 9, 4, 0),
X ARMOR("crystal plate mail", 1, 5, 9, 3, 2),
X ARMOR("leather armor", 15, 3, 2, 8, 0),
X ARMOR("elven cloak", 5, 0, 2, 9, 3),
X ARMOR("shield", 3, 0, 2, 9, 0),
X ARMOR("pair of gloves", 1, 1, 2, 9, 0),
X
X#define POTION(name,color) { name, color, NULL, 0, 1,\
X POTION_SYM, 0, 0, 2, 0, 0, 0 }
X
X POTION("restore strength", "orange"),
X POTION("gain energy", "cyan"),
X POTION("booze", "bubbly"),
X POTION("invisibility", "glowing"),
X POTION("fruit juice", "smoky"),
X POTION("healing", "pink"),
X POTION("paralysis", "puce"),
X POTION("monster detection", "purple"),
X POTION("object detection", "yellow"),
X POTION("sickness", "white"),
X POTION("confusion", "swirly"),
X POTION("gain strength", "purple-red"),
X POTION("speed", "ruby"),
X POTION("blindness", "dark green"),
X POTION("gain level", "emerald"),
X POTION("extra healing", "sky blue"),
X POTION("levitation", "brown"),
X POTION("hallucination", "brilliant blue"),
X POTION("holy water", "clear"),
X POTION(NULL, "magenta"),
X POTION(NULL, "ebony"),
X
X#define SCROLL(name,text,prob) { name, text, NULL, 0, 1,\
X SCROLL_SYM, prob, 0, 3, 0, 0, 0 }
X SCROLL("mail", "KIRJE", 0),
X SCROLL("enchant armor", "ZELGO MER", 6),
X SCROLL("destroy armor", "JUYED AWK YACC", 5),
X SCROLL("confuse monster", "NR 9", 5),
X SCROLL("scare monster", "XIXAXA XOXAXA XUXAXA", 4),
X SCROLL("blank paper", "READ ME", 3),
X SCROLL("remove curse", "PRATYAVAYAH", 6),
X SCROLL("enchant weapon", "DAIYEN FOOELS", 6),
X SCROLL("damage weapon", "HACKEM MUCHE", 5),
X SCROLL("create monster", "LEP GEX VEN ZEA", 5),
X SCROLL("taming", "PRIRUTSENIE", 1),
X SCROLL("genocide", "ELBIB YLOH",2),
X SCROLL("light", "VERR YED HORRE", 10),
X SCROLL("teleportation", "VENZAR BORGAVVE", 5),
X SCROLL("gold detection", "THARR", 4),
X SCROLL("food detection", "YUM YUM", 1),
X SCROLL("identify", "KERNOD WEL", 18),
X SCROLL("magic mapping", "ELAM EBOW", 5),
X SCROLL("amnesia", "DUAM XNAHT", 3),
X SCROLL("fire", "ANDOVA BEGARIN", 5),
X SCROLL("punishment", "VE FORBRYDERNE", 1),
X SCROLL(NULL, "VELOX NEB", 0),
X SCROLL(NULL, "FOOBIE BLETCH", 0),
X SCROLL(NULL, "TEMOV", 0),
X SCROLL(NULL, "GARVEN DEH", 0),
X
X#define WAND(name,metal,prob,flags) { name, metal, NULL, 0, 0,\
X WAND_SYM, prob, 0, 3, flags, 0, 0 }
X
X WAND("light", "iridium", 10, NODIR),
X WAND("secret door detection", "tin", 5, NODIR),
X WAND("create monster", "platinum", 5, NODIR),
X WAND("wishing", "glass", 1, NODIR),
X#ifdef KAA
X WAND("striking", "zinc", 7, IMMEDIATE),
X WAND("nothing", "uranium", 2, IMMEDIATE),
X#else
X WAND("striking", "zinc", 9, IMMEDIATE),
X WAND("nothing", "uranium", 0, IMMEDIATE),
X#endif
X WAND("slow monster", "balsa", 5, IMMEDIATE),
X WAND("speed monster", "copper", 5, IMMEDIATE),
X WAND("undead turning", "silver", 5, IMMEDIATE),
X WAND("polymorph", "brass", 5, IMMEDIATE),
X WAND("cancellation", "maple", 5, IMMEDIATE),
X WAND("teleportation", "pine", 5, IMMEDIATE),
X#ifdef PROBING
X WAND("make invisible", "marble", 7, IMMEDIATE),
X WAND("probing", "oak", 2, IMMEDIATE),
X#else
X WAND("make invisible", "marble", 9, IMMEDIATE),
X WAND("probing", "oak", 0, IMMEDIATE),
X#endif
X WAND("digging", "iron", 5, RAY),
X WAND("magic missile", "aluminium", 10, RAY),
X WAND("fire", "steel", 5, RAY),
X WAND("sleep", "curved", 5, RAY),
X WAND("cold", "short", 5, RAY),
X WAND("death", "long", 1, RAY),
X WAND(NULL, "ebony", 0, 0),
X WAND(NULL, "runed", 0, 0),
X
X#ifdef SPELLS
X/* books */
X#define SPELL(name,desc,prob,delay,flags,level) { name, desc, NULL, 0, 0, SPBOOK_SYM, prob, delay, 5, flags, 0, level }
X SPELL("magic missile", "parchment", 4, 3, RAY, 2),
X SPELL("fireball", "shining", 2, 6, RAY, 4),
X SPELL("sleep", "glowing", 6, 1, RAY, 1),
X SPELL("cone of cold", "mottled", 1, 8, RAY, 5),
X SPELL("finger of death", "ragged", 1, 10, RAY, 7),
X
X SPELL("healing", "yellow", 6, 2, NODIR, 1),
X SPELL("detect monsters", "light green", 5, 1, NODIR, 1),
X SPELL("force bolt", "dark blue", 4, 2, IMMEDIATE, 1),
X SPELL("light", "copper", 5, 1, NODIR, 1),
X SPELL("confuse monster", "white", 5, 2, IMMEDIATE, 2),
X SPELL("cure blindness", "red", 3, 2, IMMEDIATE, 2),
X SPELL("slow monster", "dark brown", 4, 2, IMMEDIATE, 2),
X SPELL("create monster", "light brown", 4, 3, NODIR, 2),
X SPELL("detect food", "pink", 5, 3, NODIR, 2),
X SPELL("haste self", "light blue", 3, 4, NODIR, 3),
X SPELL("cause fear", "black", 4, 3, NODIR, 3),
X SPELL("cure sickness", "rusty", 3, 3, NODIR, 3),
X SPELL("detect unseen", "dark green", 4, 4, NODIR, 3),
X SPELL("extra healing", "magenta", 3, 5, NODIR, 3),
X SPELL("charm monster", "silver", 3, 3, IMMEDIATE, 3),
X SPELL("levitation", "indigo", 3, 4, NODIR, 4),
X SPELL("restore strength", "plaid", 2, 5, NODIR, 4),
X SPELL("invisibility", "orange", 3, 5, NODIR, 4),
X SPELL("detect treasure", "bronze", 3, 5, NODIR, 4),
X SPELL("dig", "cloth", 2, 6, RAY, 5),
X SPELL("remove curse", "grey", 2, 5, NODIR, 5),
X SPELL("magic mapping", "purple", 2, 7, NODIR, 5),
X SPELL("identify", "violet", 1, 8, NODIR, 5),
X SPELL("turn undead", "turquoise", 1, 8, IMMEDIATE, 6),
X SPELL("polymorph", "cyan", 1, 8, IMMEDIATE, 6),
X SPELL("create familiar", "tan", 1, 7, NODIR, 6),
X SPELL("teleport away", "paper", 2, 6, IMMEDIATE, 6),
X SPELL("cancellation", "leather", 1, 8, IMMEDIATE, 7),
X SPELL("genocide", "gold", 1, 10, NODIR, 7),
X/* randomization */
X SPELL(NULL, "dog eared", 0, 0, 0, 0),
X SPELL(NULL, "thick", 0, 0, 0, 0),
X SPELL(NULL, "thin", 0, 0, 0, 0),
X SPELL(NULL, "stained", 0, 0, 0, 0),
X#endif /* SPELLS /**/
X
X#define RING(name,stone,spec) { name, stone, NULL, 0, 0,\
X RING_SYM, 0, 0, 1, spec, 0, 0 }
X
X RING("adornment", "engagement", 0),
X RING("teleportation", "wooden", 0),
X RING("regeneration", "black onyx", 0),
X RING("searching", "topaz", 0),
X RING("see invisible", "pearl", 0),
X RING("stealth", "sapphire", 0),
X RING("levitation", "moonstone", 0),
X RING("poison resistance", "agate", 0),
X RING("aggravate monster", "tiger eye", 0),
X RING("hunger", "shining", 0),
X RING("fire resistance", "gold", 0),
X RING("cold resistance", "copper", 0),
X RING("protection from shape changers", "diamond", 0),
X RING("conflict", "jade", 0),
X RING("gain strength", "ruby", SPEC),
X RING("increase damage", "silver", SPEC),
X RING("protection", "granite", SPEC),
X RING("warning", "wire", 0),
X RING("teleport control", "iron", 0),
X RING(NULL, "ivory", 0),
X RING(NULL, "blackened", 0),
X
X/* gems ************************************************************/
X#define GEM(name,color,prob,gval) { name, color, NULL, 0, 1,\
X GEM_SYM, prob, 0, 1, 0, 0, gval }
X GEM("dilithium crystal", "lavender", 1, 4500),
X GEM("diamond", "blue", 1, 4000),
X GEM("ruby", "red", 1, 3500),
X GEM("sapphire", "blue", 1, 3000),
X GEM("emerald", "green", 1, 2500),
X GEM("turquoise", "green", 1, 2000),
X GEM("aquamarine", "blue", 1, 1500),
X GEM("tourmaline", "green", 1, 1000),
X GEM("topaz", "yellow", 1, 900),
X GEM("opal", "yellow", 1, 800),
X GEM("garnet", "dark", 1, 700),
X GEM("amethyst", "violet", 1, 650),
X GEM("agate", "green", 2, 600),
X GEM("onyx", "white", 2, 550),
X GEM("jasper", "yellowish brown", 2, 500),
X GEM("jade", "green", 2, 450),
X GEM("worthless piece of blue glass", "blue", 20, 0),
X GEM("worthless piece of red glass", "red", 20, 0),
X GEM("worthless piece of yellow glass", "yellow", 20, 0),
X GEM("worthless piece of green glass", "green", 20, 0),
X { NULL, NULL, NULL, 0, 0, ILLOBJ_SYM, 0, 0, 0, 0, 0, 0 }
X};
X
Xchar obj_symbols[] = {
X ILLOBJ_SYM, AMULET_SYM, FOOD_SYM, WEAPON_SYM, TOOL_SYM,
X BALL_SYM, CHAIN_SYM, ROCK_SYM, ARMOR_SYM,
X POTION_SYM, SCROLL_SYM, WAND_SYM,
X#ifdef SPELLS
X SPBOOK_SYM,
X#endif
X RING_SYM, GEM_SYM, 0 };
Xint bases[sizeof(obj_symbols)];
END_OF_objects.h
if test 15108 -ne `wc -c <objects.h`; then
echo shar: \"objects.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f read.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"read.c\"
else
echo shar: Extracting \"read.c\" \(16877 characters\)
sed "s/^X//" >read.c <<'END_OF_read.c'
X/* SCCS Id: @(#)read.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* hack.read.c - version 1.0.3 */
X
X#include "hack.h"
X
Xextern struct monst *makemon();
Xextern struct permonst pm_eel;
Xextern struct obj *mkobj_at();
Xchar *hcolor();
Xboolean known;
Xint identify();
X
Xdoread() {
X register struct obj *scroll;
X register boolean confused = (Confusion != 0);
X
X known = FALSE;
X scroll = getobj("#-?", "read"); /* "#-" added by GAN 10/22/86 */
X if(!scroll) return(0);
X
X /* below added to allow reading of fortune cookies */
X if(scroll->otyp ==FORTUNE_COOKIE) {
X if(Blind) {
X pline("This cookie has a scrap of paper inside!");
X pline("What a pity, that you cannot read it!");
X } else
X outrumor();
X useup(scroll);
X return(1);
X } else
X if(scroll->olet != SCROLL_SYM) {
X pline("That is a silly thing to read.");
X return(0);
X }
X
X if(!scroll->dknown && Blind) {
X pline("Being blind, you cannot read the formula on the scroll.");
X return(0);
X }
X if(Blind)
X pline("As you pronounce the formula on it, the scroll disappears.");
X else
X pline("As you read the scroll, it disappears.");
X if(confused)
X if (Hallucination)
X pline("Being so trippy, you screw up ... ");
X else
X pline("Being confused, you mispronounce the magic words ... ");
X
X if(!seffects(scroll)) {
X if(!objects[scroll->otyp].oc_name_known) {
X if(known && !confused) {
X objects[scroll->otyp].oc_name_known = 1;
X more_experienced(0,10);
X } else if(!objects[scroll->otyp].oc_uname)
X docall(scroll);
X }
X#ifdef MARKER
X if(!(scroll->otyp == SCR_BLANK_PAPER) || confused)
X#endif
X useup(scroll);
X }
X return(1);
X}
X
Xseffects(sobj)
X register struct obj *sobj;
X{
X register boolean confused = (Confusion != 0);
X
X switch(sobj->otyp) {
X#ifdef MAIL
X case SCR_MAIL:
X readmail(/* scroll */);
X break;
X#endif
X case SCR_ENCHANT_ARMOR:
X { extern struct obj *some_armor();
X register struct obj *otmp = some_armor();
X if(!otmp) {
X strange_feeling(sobj,"Your skin glows then fades.");
X return(1);
X }
X if(confused) {
X pline("Your %s is covered by a shimmering %s %s!",
X objects[otmp->otyp].oc_name, Hallucination ? hcolor() :
X "gold", (otmp->otyp == SHIELD ? "layer" : "shield"));
X otmp->rustfree = 1;
X break;
X }
X#ifdef KAA
X if(otmp->spe > (otmp->otyp == ELFIN_CHAIN_MAIL ? 5 : 3)
X && rn2(otmp->spe)) {
X#else
X if(otmp->spe > 3 && rn2(otmp->spe)) {
X#endif
X pline("Your %s glows violently %s for a while, then evaporates.",
X objects[otmp->otyp].oc_name,
X Hallucination ? hcolor() : "green");
X useup(otmp);
X break;
X }
X pline("Your %s glows %s for a moment.",
X objects[otmp->otyp].oc_name,
X Hallucination ? hcolor() : "green");
X otmp->cursed = 0;
X otmp->spe++;
X break;
X }
X case SCR_DESTROY_ARMOR:
X if(confused) {
X register struct obj *otmp = some_armor();
X if(!otmp) {
X strange_feeling(sobj,"Your bones itch.");
X return(1);
X }
X pline("Your %s glows %s for a moment.",
X objects[otmp->otyp].oc_name,
X Hallucination ? hcolor() : "purple");
X otmp->rustfree = 0;
X break;
X }
X if(!destroy_arm()) {
X strange_feeling(sobj,"Your skin itches.");
X return(1);
X }
X break;
X case SCR_CONFUSE_MONSTER:
X#ifdef SPELLS
X case SPE_CONFUSE_MONSTER:
X#endif
X if(u.usym != '@') {
X pline("You feel confused.");
X HConfusion += rnd(100);
X } else if(confused) {
X pline("Your hands begin to glow %s.",
X Hallucination ? hcolor() : "purple");
X HConfusion += rnd(100);
X } else {
X pline("Your hands begin to glow %s.",
X Hallucination ? hcolor() : "blue");
X u.umconf = 1;
X }
X break;
X case SCR_SCARE_MONSTER:
X#ifdef SPELLS
X case SPE_CAUSE_FEAR:
X#endif
X { register int ct = 0;
X register struct monst *mtmp;
X
X for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X if(cansee(mtmp->mx,mtmp->my)) {
X if(confused)
X mtmp->mflee = mtmp->mfroz = mtmp->msleep = 0;
X else
X if (! resist(mtmp, sobj->olet, 0, NOTELL))
X mtmp->mflee = 1;
X ct++;
X }
X if(!ct)
X pline("You hear %s in the distance.",
X (confused) ? "sad wailing" : "maniacal laughter");
X#ifdef KAA
X else
X pline ("You hear %s close by.",
X (confused) ? "sad wailing" : "maniacal laughter");
X#endif
X break;
X }
X case SCR_BLANK_PAPER:
X if(confused)
X pline("You see strange patterns on this scroll.");
X else {
X pline("This scroll seems to be blank.");
X#ifdef MARKER
X pline("No, wait...");
X known = TRUE;
X#endif
X }
X break;
X case SCR_REMOVE_CURSE:
X#ifdef SPELLS
X case SPE_REMOVE_CURSE:
X#endif
X { register struct obj *obj;
X if(confused)
X if (Hallucination)
X pline("You feel the power of the Force against you!");
X else
X pline("You feel like you need some help.");
X else
X if (Hallucination)
X pline("You feel in touch with the Universal Oneness.");
X else
X pline("You feel like someone is helping you.");
X for(obj = invent; obj ; obj = obj->nobj)
X if(obj->owornmask)
X obj->cursed = confused;
X if(Punished && !confused) {
X Punished = 0;
X freeobj(uchain);
X unpobj(uchain);
X free((char *) uchain);
X uball->spe = 0;
X uball->owornmask &= ~W_BALL;
X uchain = uball = (struct obj *) 0;
X }
X break;
X }
X case SCR_CREATE_MONSTER:
X#ifdef SPELLS
X case SPE_CREATE_MONSTER:
X#endif
X { register int cnt = 1;
X
X if(!rn2(73)) cnt += rnd(4);
X if(confused) cnt += 12;
X while(cnt--)
X#ifdef WIZARD
X if(wizard) {
X char buf[BUFSZ], cmlet;
X struct permonst *crmonst;
X
X do {
X pline("What monster to create? ");
X getlin(buf);
X } while(strlen(buf) != 1);
X cmlet = buf[0];
X for(crmonst = mons; crmonst->mlet != cmlet &&
X crmonst != PM_EEL; crmonst++) ;
X (void) makemon(crmonst, u.ux, u.uy);
X } else
X#endif /* WIZARD /**/
X (void) makemon(confused ? PM_ACID_BLOB :
X (struct permonst *) 0, u.ux, u.uy);
X break;
X }
X case SCR_ENCHANT_WEAPON:
X if(uwep && uwep->olet == WEAPON_SYM && confused) {
X /* olet check added 10/25/86 GAN */
X pline("Your %s covered by a shimmering %s shield!",
X aobjnam(uwep, "are"),
X Hallucination ? hcolor() : "gold");
X uwep->rustfree = 1;
X } else
X if(!chwepon(sobj, 1)) /* tests for !uwep */
X return(1);
X break;
X case SCR_DAMAGE_WEAPON:
X if(uwep && uwep->olet == WEAPON_SYM && confused) {
X /* olet check added 10/25/86 GAN */
X pline("Your %s %s for a moment.",
X aobjnam(uwep,"glow"),
X Hallucination ? hcolor() : "purple");
X uwep->rustfree = 0;
X } else
X if(!chwepon(sobj, -1)) /* tests for !uwep */
X return(1);
X break;
X case SCR_TAMING:
X#ifdef SPELLS
X case SPE_CHARM_MONSTER:
X#endif
X { register int i,j;
X register int bd = confused ? 5 : 1;
X register struct monst *mtmp;
X
X for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++)
X if(mtmp = m_at(u.ux+i, u.uy+j))
X if(!resist(mtmp, sobj->olet, 0, NOTELL))
X (void) tamedog(mtmp, (struct obj *) 0);
X break;
X }
X case SCR_GENOCIDE:
X pline("You have found a scroll of genocide!");
X#ifdef SPELLS
X case SPE_GENOCIDE:
X#endif
X known = TRUE;
X do_genocide();
X break;
X case SCR_LIGHT:
X if(!Blind) known = TRUE;
X litroom(!confused);
X break;
X case SCR_TELEPORTATION:
X if(confused)
X level_tele();
X else {
X#ifdef QUEST
X register int oux = u.ux, ouy = u.uy;
X tele();
X if(dist(oux, ouy) > 100) known = TRUE;
X#else
X register int uroom = inroom(u.ux, u.uy);
X tele();
X if(uroom != inroom(u.ux, u.uy)) known = TRUE;
X#endif
X if(Teleport_control)
X known = TRUE;
X }
X break;
X case SCR_GOLD_DETECTION:
X /* Unfortunately this code has become slightly less elegant,
X now that gold and traps no longer are of the same type. */
X if(confused) {
X register struct trap *ttmp;
X
X if(!ftrap) {
X strange_feeling(sobj, "Your toes stop itching.");
X return(1);
X } else {
X for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
X if(ttmp->tx != u.ux || ttmp->ty != u.uy)
X goto outtrapmap;
X /* only under me - no separate display required */
X pline("Your toes itch!");
X break;
X outtrapmap:
X cls();
X for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
X at(ttmp->tx, ttmp->ty, Hallucination ? rndobjsym() : '$');
X prme();
X pline("You feel very greedy!");
X }
X } else {
X register struct gold *gtmp;
X
X if(!fgold) {
X strange_feeling(sobj, "You feel materially poor.");
X return(1);
X } else {
X known = TRUE;
X for(gtmp = fgold; gtmp; gtmp = gtmp->ngold)
X if(gtmp->gx != u.ux || gtmp->gy != u.uy)
X goto outgoldmap;
X /* only under me - no separate display required */
X pline("You notice some gold between your feet.");
X break;
X outgoldmap:
X cls();
X for(gtmp = fgold; gtmp; gtmp = gtmp->ngold)
X at(gtmp->gx, gtmp->gy, Hallucination ? rndobjsym() : '$');
X prme();
X pline("You feel very greedy, and sense gold!");
X }
X }
X /* common sequel */
X more();
X docrt();
X break;
X case SCR_FOOD_DETECTION:
X#ifdef SPELLS
X case SPE_DETECT_FOOD:
X#endif
X { register ct = 0, ctu = 0;
X register struct obj *obj;
X register char foodsym = confused ? POTION_SYM : FOOD_SYM;
X
X for(obj = fobj; obj; obj = obj->nobj)
X if(obj->olet == foodsym) {
X if(obj->ox == u.ux && obj->oy == u.uy) ctu++;
X else ct++;
X }
X if(!ct && !ctu) {
X strange_feeling(sobj,"Your nose twitches.");
X return(1);
X } else if(!ct) {
X known = TRUE;
X pline("You smell %s close nearby.",
X confused ? "something" : "food");
X
X } else {
X known = TRUE;
X cls();
X for(obj = fobj; obj; obj = obj->nobj)
X if(obj->olet == foodsym)
X at(obj->ox, obj->oy, Hallucination ? rndobjsym() :
X FOOD_SYM);
X prme();
X pline("Your nose tingles and you smell %s!",
X confused ? "something" : "food");
X more();
X docrt();
X }
X break;
X }
X case SCR_IDENTIFY:
X /* known = TRUE; */
X if(confused)
X pline("You identify this as an identify scroll.");
X else
X pline("This is an identify scroll.");
X useup(sobj);
X objects[SCR_IDENTIFY].oc_name_known = 1;
X#ifdef SPELLS
X case SPE_IDENTIFY:
X#endif
X if(!confused)
X while(!ggetobj("identify", identify, rn2(5) ? 1 : rn2(5)) && invent);
X return(1);
X case SCR_MAGIC_MAPPING:
X known = TRUE;
X pline("On this scroll %s a map!", confused ? "was" : "is");
X#ifdef SPELLS
X case SPE_MAGIC_MAPPING:
X#endif
X do_mapping();
X break;
X case SCR_AMNESIA:
X { register int zx, zy;
X
X known = TRUE;
X for(zx = 0; zx < COLNO; zx++) for(zy = 0; zy < ROWNO; zy++)
X if(!confused || rn2(7))
X if(!cansee(zx,zy))
X levl[zx][zy].seen = 0;
X docrt();
X pline("Who was that Maude person anyway?");
X#ifdef SPELLS
X losespells();
X#endif
X break;
X }
X case SCR_FIRE:
X { register int num;
X register struct monst *mtmp;
X
X/*
X * Note: This case was modified 11/4/86 by DKC to eliminate the problem with
X * reading a scroll of fire while confused or resistant to fire. Formerly,
X * the code failed to initialize the variable "num" in these cases, resulting
X * in monsters being hit for a possibly large (and possibly negative) damage.
X * The actions taken now are:
X * If the player is fire resistant, monsters
X * take the normal damage (1-6 except for Y's and F's), and the player is
X * unaffected.
X */
X known = TRUE;
X if(confused) {
X if(Fire_resistance)
X pline("Oh look, what a pretty fire in your hands.");
X else {
X pline("The scroll catches fire and you burn your hands.");
X losehp(1, "scroll of fire");
X }
X break;
X }
X pline("The scroll erupts in a tower of flame!");
X num = rnd(6);
X if(Fire_resistance)
X pline("You are uninjured.");
X else {
X u.uhpmax -= num;
X losehp(num, "scroll of fire");
X }
X num = (2*num + 1)/3;
X for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
X if(dist(mtmp->mx,mtmp->my) < 3) {
X mtmp->mhp -= num; /* No saving throw! */
X if(index("FY", mtmp->data->mlet))
X mtmp->mhp -= 3*num; /* this might well kill 'F's */
X if(mtmp->mhp < 1) {
X killed(mtmp);
X break; /* primitive */
X }
X }
X }
X break;
X }
X case SCR_PUNISHMENT:
X known = TRUE;
X if(confused) {
X pline("You feel guilty.");
X break;
X }
X pline("You are being punished for your misbehaviour!");
X if(Punished){
X pline("Your iron ball gets heavier.");
X uball->owt += 15;
X break;
X }
X Punished = INTRINSIC;
X setworn(mkobj_at(CHAIN_SYM, u.ux, u.uy), W_CHAIN);
X setworn(mkobj_at(BALL_SYM, u.ux, u.uy), W_BALL);
X uball->spe = 1; /* special ball (see save) */
X break;
X default:
X impossible("What weird effect is this? (%u)", sobj->otyp);
X }
X return(0);
X}
X
Xidentify(otmp) /* also called by newmail() */
Xregister struct obj *otmp;
X{
X objects[otmp->otyp].oc_name_known = 1;
X#ifdef KAA
X otmp->known = 1;
X if (otmp->olet != WEAPON_SYM) otmp->dknown = 1;
X/* Now, the dknown field is special for weapons, indicating blessing. */
X#else
X otmp->known = otmp->dknown = 1;
X#endif
X prinv(otmp);
X return(1);
X}
X
Xlitroom(on)
Xregister boolean on;
X{
X register num,zx,zy;
X
X /* first produce the text (provided he is not blind) */
X if(Blind) goto do_it;
X if(!on) {
X if(u.uswallow || !xdnstair || levl[u.ux][u.uy].typ == CORR ||
X !levl[u.ux][u.uy].lit) {
X pline("It seems even darker in here than before.");
X return;
X } else
X pline("It suddenly becomes dark in here.");
X } else {
X if(u.uswallow){
X pline("%s's stomach is lit.", Monnam(u.ustuck));
X return;
X }
X if(!xdnstair){
X pline("Nothing Happens.");
X return;
X }
X#ifdef QUEST
X pline("The cave lights up around you, then fades.");
X return;
X#else
X if(levl[u.ux][u.uy].typ == CORR) {
X pline("The corridor lights up around you, then fades.");
X return;
X } else if(levl[u.ux][u.uy].lit) {
X pline("The light here seems better now.");
X return;
X } else
X pline("The room is lit.");
X#endif
X }
X
Xdo_it:
X#ifdef QUEST
X return;
X#else
X if(levl[u.ux][u.uy].lit == on)
X return;
X if(levl[u.ux][u.uy].typ == DOOR) {
X if(IS_ROOM(levl[u.ux][u.uy+1].typ)) zy = u.uy+1;
X else if(IS_ROOM(levl[u.ux][u.uy-1].typ)) zy = u.uy-1;
X else zy = u.uy;
X if(IS_ROOM(levl[u.ux+1][u.uy].typ)) zx = u.ux+1;
X else if(IS_ROOM(levl[u.ux-1][u.uy].typ)) zx = u.ux-1;
X else zx = u.ux;
X } else {
X zx = u.ux;
X zy = u.uy;
X }
X for(seelx = u.ux; (num = levl[seelx-1][zy].typ) != CORR && num != 0;
X seelx--);
X for(seehx = u.ux; (num = levl[seehx+1][zy].typ) != CORR && num != 0;
X seehx++);
X for(seely = u.uy; (num = levl[zx][seely-1].typ) != CORR && num != 0;
X seely--);
X for(seehy = u.uy; (num = levl[zx][seehy+1].typ) != CORR && num != 0;
X seehy++);
X for(zy = seely; zy <= seehy; zy++)
X for(zx = seelx; zx <= seehx; zx++) {
X levl[zx][zy].lit = on;
X if(!Blind && dist(zx,zy) > 2)
X if(on) prl(zx,zy); else nosee(zx,zy);
X }
X if(!on) seehx = 0;
X#endif
X}
X
X/* Test whether we may genocide all monsters with symbol ch */
Xmonstersym(ch) /* arnold@ucsfcgl */
Xregister char ch;
X{
X register struct permonst *mp;
X
X /*
X * can't genocide certain monsters
X */
X if (index("12 &:", ch)) return FALSE;
X
X if (ch == pm_eel.mlet) return TRUE;
X for (mp = mons; mp < &mons[CMNUM+2]; mp++)
X if (mp->mlet == ch) return TRUE;
X
X return FALSE;
X}
X
Xdo_genocide()
X
X{
X extern char genocided[], fut_geno[];
X char buf[BUFSZ];
X register struct monst *mtmp, *mtmp2;
X
X if(Confusion != 0) *buf = u.usym;
X else do {
X pline("What monster do you want to genocide (Type the letter)? ");
X getlin(buf);
X }
X
X while(strlen(buf) != 1 || !monstersym(*buf));
X
X if(!index(fut_geno, *buf)) charcat(fut_geno, *buf);
X if(!index(genocided, *buf)) charcat(genocided, *buf);
X else {
X pline("Such monsters do not exist in this world.");
X return;
X }
X for(mtmp = fmon; mtmp; mtmp = mtmp2){
X mtmp2 = mtmp->nmon;
X if(mtmp->data->mlet == *buf)
X mondead(mtmp);
X }
X pline("Wiped out all %c's.", Hallucination ? '@' : *buf);
X /* Scare the hallucinating player */
X if(*buf == '@') {
X if(u.usym != '@') pline("You feel dead inside.");
X killer = "scroll of genocide";
X u.uhp = -1;
X }
X#ifdef KAA
X else if (*buf==u.usym) rehumanize();
X#endif
X}
X
Xdo_mapping()
X{
X register struct rm *lev;
X register int num, zx, zy;
X
X for(zy = 0; zy < ROWNO; zy++)
X for(zx = 0; zx < COLNO; zx++) {
X
X if((Confusion != 0) && rn2(7)) continue;
X lev = &(levl[zx][zy]);
X if((num = lev->typ) == 0) continue;
X
X if(num == SCORR) {
X lev->typ = CORR;
X#ifdef DGK
X lev->scrsym = symbol.corr;
X#else
X lev->scrsym = CORR_SYM;
X#endif
X } else if(num == SDOOR) {
X lev->typ = DOOR;
X#ifdef DGK
X lev->scrsym = symbol.door;
X#else
X lev->scrsym = '+';
X#endif
X /* do sth in doors ? */
X } else if(lev->seen) continue;
X#ifndef QUEST
X if(num != ROOM)
X#endif
X {
X lev->seen = lev->new = 1;
X if(lev->scrsym == ' ' || !lev->scrsym) newsym(zx,zy);
X else on_scr(zx,zy);
X }
X }
X}
X
Xdestroy_arm() {
X
X if(uarm) {
X pline("Your armor turns to dust and falls to the floor!");
X useup(uarm);
X } else if(uarmh) {
X pline("Your helmet turns to dust and is blown away!");
X useup(uarmh);
X } else if(uarmg) {
X pline("Your gloves vanish!");
X useup(uarmg);
X selftouch("You");
X } else if(uarms) {
X pline("Your shield crumbles away!");
X useup(uarms);
X } else return(0); /* could not destroy anything */
X
X return(1);
X}
END_OF_read.c
if test 16877 -ne `wc -c <read.c`; then
echo shar: \"read.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 6 \(of 16\).
cp /dev/null ark6isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 16 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

0 new messages