games-request@tekred.TEK.COM (07/28/87)
Submitted by: mike@genat.UUCP (Mike Stephenson)
Comp.sources.games: Volume 2, Issue 8
Archive-name: nethack/Part08
#! /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 8 (of 16)."
# Contents: eat.c lev.c mhitu.c u_init.c undo.sh
# Wrapped by billr@tekred on Tue Jul 28 09:49:34 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f eat.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"eat.c\"
else
echo shar: Extracting \"eat.c\" \(13123 characters\)
sed "s/^X//" >eat.c <<'END_OF_eat.c'
X/* SCCS Id: @(#)eat.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* eat.c - version 1.0.3 */
X
X#include "hack.h"
X#ifdef KAA
Xchar POISONOUS[] = "ADKSVabhks&";
X#else
Xchar POISONOUS[] = "ADKSVabhks";
X#endif
Xextern char *nomovemsg;
Xextern int (*afternmv)();
Xextern int (*occupation)();
Xextern char *occtxt;
Xextern struct obj *splitobj(), *addinv();
X
X/* hunger texts used on bottom line (each 8 chars long) */
X#define SATIATED 0
X#define NOT_HUNGRY 1
X#define HUNGRY 2
X#define WEAK 3
X#define FAINTING 4
X#define FAINTED 5
X#define STARVED 6
X
Xchar *hu_stat[] = {
X "Satiated",
X " ",
X "Hungry ",
X "Weak ",
X "Fainting",
X "Fainted ",
X "Starved "
X};
X
Xinit_uhunger(){
X u.uhunger = 900;
X u.uhs = NOT_HUNGRY;
X}
X
Xstruct { char *txt; int nut; } tintxts[] = {
X "It contains salmon - not bad!", 60,
X "It contains first quality peaches - what a surprise!", 40,
X "It contains apple juice - perhaps not what you hoped for.", 20,
X "It contains some nondescript substance, tasting awfully.", 500,
X "It contains rotten meat. You vomit.", -50,
X "It turns out to be empty.", 0
X};
X#define TTSZ SIZE(tintxts)
X
Xstatic struct {
X struct obj *tin;
X int usedtime, reqtime;
X} tin;
X
Xopentin(){
X register int r;
X
X if(!carried(tin.tin)) /* perhaps it was stolen? */
X return(0); /* %% probably we should use tinoid */
X if(tin.usedtime++ >= 50) {
X pline("You give up your attempt to open the tin.");
X return(0);
X }
X if(tin.usedtime < tin.reqtime)
X return(1); /* still busy */
X
X pline("You succeed in opening the tin.");
X useup(tin.tin);
X r = rn2(2*TTSZ);
X if(r < TTSZ) {
X pline(tintxts[r].txt);
X lesshungry(tintxts[r].nut);
X /* check for vomiting added by GAN 01/16/87 */
X if(tintxts[r].nut < 0 && Sick) {
X Sick = 0;
X pline("What a relief!");
X }
X if(r == 0) { /* Salmon */
X Glib = rnd(15);
X pline("Eating salmon made your fingers very slippery.");
X }
X } else {
X pline("It contains spinach - this makes you feel like %s!",
X Hallucination ? "Swee'pea" : "Popeye");
X
X lesshungry(600);
X gainstr(0);
X }
X return(0);
X}
X
XMeatdone(){
X u.usym = '@';
X prme();
X}
X
Xdoeat(){
X register struct obj *otmp;
X register struct objclass *ftmp;
X register tmp;
X
X /* Is there some food (probably a heavy corpse) here on the ground? */
X if(!Levitation)
X for(otmp = fobj; otmp; otmp = otmp->nobj) {
X if(otmp->ox == u.ux && otmp->oy == u.uy &&
X otmp->olet == FOOD_SYM) {
X pline("There %s %s here; eat %s? [ny] ",
X (otmp->quan == 1) ? "is" : "are",
X doname(otmp),
X (otmp->quan == 1) ? "it" : "one");
X if(readchar() == 'y') {
X if(otmp->quan != 1)
X (void) splitobj(otmp, 1);
X freeobj(otmp);
X otmp = addinv(otmp);
X addtobill(otmp);
X if(Invisible) newsym(u.ux, u.uy);
X goto gotit;
X }
X }
X }
X otmp = getobj("%", "eat");
X if(!otmp) return(0);
Xgotit:
X if(otmp->otyp == TIN) {
X if(uwep) {
X switch(uwep->otyp) {
X case CAN_OPENER:
X tmp = 1;
X break;
X case DAGGER:
X case CRYSKNIFE:
X tmp = 3;
X break;
X case PICK_AXE:
X case AXE:
X tmp = 6;
X break;
X default:
X goto no_opener;
X }
X pline("Using your %s you try to open the tin.",
X aobjnam(uwep, (char *) 0));
X } else {
X no_opener:
X pline("It is not so easy to open this tin.");
X if(Glib) {
X pline("The tin slips out of your hands.");
X if(otmp->quan > 1) {
X register struct obj *obj;
X extern struct obj *splitobj();
X
X obj = splitobj(otmp, 1);
X if(otmp == uwep) setuwep(obj);
X }
X dropx(otmp);
X return(1);
X }
X tmp = 10 + rn2(1 + 500/((int)(u.ulevel + u.ustr)));
X }
X tin.reqtime = tmp;
X tin.usedtime = 0;
X tin.tin = otmp;
X#ifdef DGK
X set_occupation(opentin, "opening the tin", 0);
X#else
X occupation = opentin;
X occtxt = "opening the tin";
X#endif
X return(1);
X }
X ftmp = &objects[otmp->otyp];
X multi = -ftmp->oc_delay;
X if(otmp->otyp >= CORPSE && eatcorpse(otmp)) goto eatx;
X#ifdef DGKMOD
X if(!rn2(7) && otmp->otyp != FORTUNE_COOKIE && otmp->otyp != DEAD_LIZARD) {
X#else
X if(!rn2(7) && otmp->otyp != FORTUNE_COOKIE) {
X#endif
X#ifdef KAA
X if (otmp->otyp == DEAD_VIOLET_FUNGUS)
X pline("Seems rather stale though...");
X else
X#endif
X pline("Blecch! Rotten food!");
X if(!rn2(4)) {
X if (Hallucination) pline("You feel rather trippy.");
X else
X pline("You feel rather light headed.");
X HConfusion += d(2,4);
X } else if(!rn2(4) && !Blind) {
X pline("Everything suddenly goes dark.");
X Blind = d(2,10);
X seeoff(0);
X } else if(!rn2(3)) {
X if(Blind)
X pline("The world spins and you slap against the floor.");
X else
X pline("The world spins and goes dark.");
X nomul(-rnd(10));
X nomovemsg = "You are conscious again.";
X }
X lesshungry(ftmp->nutrition / 4);
X } else {
X if(u.uhunger >= 1500) choke(ftmp);
X
X switch(otmp->otyp){
X case FOOD_RATION:
X if(u.uhunger <= 200)
X if (Hallucination)
X pline("Oh wow, like superior man!");
X else
X pline("That food really hit the spot!");
X else if(u.uhunger <= 700)
X pline("That satiated your stomach!");
X#ifdef DGKMOD
X /* Have lesshungry() report when you're nearly full so all eating
X * warns when you're about to choke.
X */
X lesshungry(ftmp->nutrition);
X#else
X else {
X pline("You're having a hard time getting all that food down.");
X multi -= 2;
X }
X lesshungry(ftmp->nutrition);
X if(multi < 0) nomovemsg = "You finished your meal.";
X#endif /* DGKMOD /**/
X break;
X case TRIPE_RATION:
X if (u.usym != '@')
X pline("That tripe ration was surprisingly good!");
X else {
X pline("Yak - dog food!");
X more_experienced(1,0);
X flags.botl = 1;
X }
X if(rn2(2) && u.usym == '@'){
X pline("You vomit.");
X morehungry(20);
X if(Sick) {
X Sick = 0; /* David Neves */
X pline("What a relief!");
X }
X } else lesshungry(ftmp->nutrition);
X break;
X default:
X if(u.usym == '@' && otmp->otyp >= CORPSE) {
X#ifdef KAA
X if(otmp->otyp != DEAD_VIOLET_FUNGUS)
X#endif
X pline("That %s tasted terrible!",ftmp->oc_name);
X } else
X pline("That %s was delicious!",ftmp->oc_name);
X lesshungry(ftmp->nutrition);
X#ifdef DGKMOD
X /* Relief from cockatrices -dgk */
X if (otmp->otyp == DEAD_LIZARD) {
X if (Stoned) {
X Stoned = 0;
X pline("You feel more limber!");
X }
X if (HConfusion > 2)
X HConfusion = 2;
X }
X#else
X if(otmp->otyp == DEAD_LIZARD && (HConfusion > 2))
X HConfusion = 2;
X#endif /* DGKMOD /**/
X else
X#ifdef QUEST
X if(otmp->otyp == CARROT && !Blind){
X u.uhorizon++;
X setsee();
X pline("Your vision improves.");
X } else
X#endif
X#ifdef KAA
X if(otmp->otyp == CARROT && Blind) Blind=1;
X else
X#endif
X if(otmp->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 } else
X if(otmp->otyp == LUMP_OF_ROYAL_JELLY) {
X /* This stuff seems to be VERY healthy! */
X gainstr(1);
X u.uhp += rnd(20);
X if(u.uhp > u.uhpmax) {
X if(!rn2(17)) u.uhpmax++;
X u.uhp = u.uhpmax;
X }
X heal_legs();
X }
X break;
X }
X }
Xeatx:
X if(multi<0 && !nomovemsg){
X static char msgbuf[BUFSZ];
X (void) sprintf(msgbuf, "You finished eating the %s.",
X ftmp->oc_name);
X nomovemsg = msgbuf;
X }
X useup(otmp);
X return(1);
X}
X
X/* called in main.c */
Xgethungry(){
X --u.uhunger;
X if(moves % 2) {
X if(HRegeneration) u.uhunger--;
X if(Hunger) u.uhunger--;
X /* a3: if(Hunger & LEFT_RING) u.uhunger--;
X if(Hunger & RIGHT_RING) u.uhunger--;
X etc. */
X }
X if(moves % 20 == 0) { /* jimt@asgb */
X if(uleft) u.uhunger--;
X if(uright) u.uhunger--;
X }
X newuhs(TRUE);
X}
X
X/* called after vomiting and after performing feats of magic */
Xmorehungry(num) register num; {
X u.uhunger -= num;
X newuhs(TRUE);
X}
X
X/* called after eating something (and after drinking fruit juice) */
Xlesshungry(num) register num; {
X u.uhunger += num;
X if(u.uhunger >= 2000) choke(FALSE);
X#ifdef DGKMOD
X else {
X /* Have lesshungry() report when you're nearly full so all eating
X * warns when you're about to choke.
X */
X if (u.uhunger >= 1500) {
X pline("You're having a hard time getting all of it down.");
X multi -= 2;
X nomovemsg = "You're finally finished.";
X }
X }
X#endif /* DGKMOD /**/
X newuhs(FALSE);
X}
X
Xunfaint(){
X u.uhs = FAINTING;
X flags.botl = 1;
X}
X
Xnewuhs(incr) boolean incr; {
X register int newhs, h = u.uhunger;
X
X newhs = (h > 1000) ? SATIATED :
X (h > 150) ? NOT_HUNGRY :
X (h > 50) ? HUNGRY :
X (h > 0) ? WEAK : FAINTING;
X
X if(newhs == FAINTING) {
X if(u.uhs == FAINTED) newhs = FAINTED;
X if(u.uhs <= WEAK || rn2(20-u.uhunger/10) >= 19) {
X if(u.uhs != FAINTED && multi >= 0 /* %% */) {
X pline("You faint from lack of food.");
X nomul(-10+(u.uhunger/10));
X nomovemsg = "You regain consciousness.";
X afternmv = unfaint;
X newhs = FAINTED;
X }
X } else
X if(u.uhunger < -(int)(200 + 25*u.ulevel)) {
X u.uhs = STARVED;
X flags.botl = 1;
X bot();
X pline("You die from starvation.");
X done("starved");
X }
X }
X
X if(newhs != u.uhs) {
X if(newhs >= WEAK && u.uhs < WEAK)
X losestr(1); /* this may kill you -- see below */
X else
X if(newhs < WEAK && u.uhs >= WEAK && u.ustr < u.ustrmax)
X losestr(-1);
X switch(newhs){
X case HUNGRY:
X if (Hallucination) {
X pline((!incr) ?
X "You now have a lesser case of the munchies." :
X "You are getting the munchies.");
X } else
X pline((!incr) ? "You only feel hungry now." :
X (u.uhunger < 145) ? "You feel hungry." :
X "You are beginning to feel hungry.");
X break;
X case WEAK:
X if (Hallucination)
X pline((!incr) ?
X "You still have the munchies." :
X "The munchies are starting to interfere with your motor capabilities.");
X else
X pline((!incr) ? "You feel weak now." :
X (u.uhunger < 45) ? "You feel weak." :
X "You are beginning to feel weak.");
X break;
X }
X u.uhs = newhs;
X flags.botl = 1;
X if(u.uhp < 1) {
X pline("You die from hunger and exhaustion.");
X killer = "exhaustion";
X done("starved");
X }
X }
X}
X
X#define CORPSE_I_TO_C(otyp) (char) ((otyp >= DEAD_ACID_BLOB)\
X ? 'a' + (otyp - DEAD_ACID_BLOB)\
X : '@' + (otyp - DEAD_HUMAN))
Xpoisonous(otmp)
Xregister struct obj *otmp;
X{
X#ifdef KAA
X if(otmp->otyp == DEAD_DEMON) return(1);
X#endif
X return(index(POISONOUS, CORPSE_I_TO_C(otmp->otyp)) != 0);
X}
X
X/* returns 1 if some text was printed */
Xeatcorpse(otmp) register struct obj *otmp; {
X#ifdef KAA
Xregister char let;
X#else
Xregister char let = CORPSE_I_TO_C(otmp->otyp);
X#endif
Xregister tp = 0;
X#ifdef KAA
X if(otmp->otyp == DEAD_DEMON) let='&';
X else if (otmp->otyp == DEAD_GIANT) let='9';
X else let = CORPSE_I_TO_C(otmp->otyp);
X#endif
X if(let != 'a' && moves > otmp->age + 50 + rn2(100)) {
X tp++;
X pline("Ulch -- that meat was tainted!");
X pline("You get very sick.");
X Sick = 10 + rn2(10);
X u.usick_cause = objects[otmp->otyp].oc_name;
X } else if(index(POISONOUS, let) && rn2(5)){
X tp++;
X pline("Ecch -- that must have been poisonous!");
X if(!Poison_resistance){
X losestr(rnd(4));
X losehp(rnd(15), "poisonous corpse");
X } else
X pline("You don't seem affected by the poison.");
X } else if(index("ELNOPQRUuxz", let) && rn2(5)){
X tp++;
X pline("You feel sick.");
X losehp(rnd(8), "cadaver");
X }
X switch(let) {
X case 'L':
X case 'N':
X case 't':
X#ifdef KAA
X case 'Q':
X#endif
X HTeleportation |= INTRINSIC;
X break;
X case 'W':
X pluslvl();
X break;
X case 'n':
X u.uhp = u.uhpmax;
X flags.botl = 1;
X /* fall into next case */
X case '@':
X pline("You cannibal! You will be sorry for this!");
X /* not tp++; */
X /* fall into next case */
X case 'd':
X Aggravate_monster |= INTRINSIC;
X break;
X case 'I':
X if(!Invis) {
X HInvis = 50+rn2(100);
X if(!See_invisible)
X newsym(u.ux, u.uy);
X } else {
X HInvis |= INTRINSIC;
X HSee_invisible |= INTRINSIC;
X }
X /* fall into next case */
X case 'y':
X#ifdef QUEST
X u.uhorizon++;
X#endif
X /* fall into next case */
X case 'B':
X HConfusion += 50;
X break;
X case 'D':
X HFire_resistance |= INTRINSIC;
X break;
X case 'E':
X HTelepat |= INTRINSIC;
X break;
X case 'F':
X case 'Y':
X HCold_resistance |= INTRINSIC;
X break;
X#ifdef KAA
X case '9':
X gainstr(1);
X break;
X#endif
X case 'k':
X case 's':
X HPoison_resistance |= INTRINSIC;
X break;
X case 'c':
X if (u.usym != 'c') {
X
X pline("You turn to stone.");
X killer = "dead cockatrice";
X done("died");
X }
X break;
X case 'a':
X if(Stoned) {
X pline("What a pity - you just destroyed a future piece of art!");
X tp++;
X Stoned = 0;
X }
X break;
X#ifdef KAA
X case 'v':
X pline ("Oh wow! Great stuff!");
X Hallucination += 200;
X setsee();
X break;
X#endif
X case 'M':
X if(u.usym == '@') {
X pline("You cannot resist the temptation to mimic a treasure chest.");
X tp++;
X nomul(-30);
X afternmv = Meatdone;
X nomovemsg = "You now again prefer mimicking a human.";
X u.usym = '$';
X prme();
X }
X break;
X }
X return(tp);
X}
X
X/* added by GAN 01/28/87 */
Xchoke(food)
Xregister struct objclass *food;
X{
X /* only happens if you were satiated */
X if(u.uhs != SATIATED) return;
X
X if(food) killer = food->oc_name;
X else killer = "exuberant appetite";
X pline("You choke over your food.");
X pline("You die...");
X done("choked");
X}
END_OF_eat.c
if test 13123 -ne `wc -c <eat.c`; then
echo shar: \"eat.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f lev.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"lev.c\"
else
echo shar: Extracting \"lev.c\" \(12696 characters\)
sed "s/^X//" >lev.c <<'END_OF_lev.c'
X/* SCCS Id: @(#)lev.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* lev.c - version 1.0.3 */
X
X#include <stdio.h>
X#include "hack.h"
X#include "mkroom.h"
Xextern struct monst *restmonchn();
Xextern struct obj *restobjchn();
Xextern struct obj *billobjs;
Xextern char *itoa();
Xextern char SAVEF[];
Xextern int hackpid;
Xextern xchar dlevel;
Xextern char nul[];
X
X#ifndef NOWORM
X#include "wseg.h"
Xextern struct wseg *wsegs[32], *wheads[32];
Xextern long wgrowtime[32];
X#endif
X
X#ifdef DGK
Xstruct finfo fileinfo[MAXLEVEL+1];
Xlong bytes_counted;
Xint count_only;
X#else
Xboolean level_exists[MAXLEVEL+1];
X#endif
X
X#ifdef DGK
Xsavelev(fd, lev, mode)
Xint fd, mode;
Xxchar lev;
X{
X if (mode & COUNT) {
X count_only = TRUE;
X bytes_counted = 0;
X savelev0(fd, lev);
X while (bytes_counted > freediskspace(levels))
X if (!swapout_oldest())
X return FALSE;
X }
X if (mode & WRITE) {
X count_only = FALSE;
X bytes_counted = 0;
X savelev0(fd, lev);
X }
X fileinfo[lev].where = ACTIVE;
X fileinfo[lev].time = moves;
X fileinfo[lev].size = bytes_counted;
X return TRUE;
X}
X
Xsavelev0(fd,lev)
X#else
Xsavelev(fd,lev)
X#endif
Xint fd;
Xxchar lev;
X{
X#ifndef NOWORM
X register struct wseg *wtmp, *wtmp2;
X register tmp;
X#endif
X
X if(fd < 0) panic("Save on bad file!"); /* impossible */
X#ifndef DGK
X if(lev >= 0 && lev <= MAXLEVEL)
X level_exists[lev] = TRUE;
X#endif
X bwrite(fd,(char *) &hackpid,sizeof(hackpid));
X bwrite(fd,(char *) &lev,sizeof(lev));
X bwrite(fd,(char *) levl,sizeof(levl));
X#ifdef DGK
X bwrite(fd, (char *) &symbol, sizeof(symbol));
X#endif
X bwrite(fd,(char *) &moves,sizeof(long));
X bwrite(fd,(char *) &xupstair,sizeof(xupstair));
X bwrite(fd,(char *) &yupstair,sizeof(yupstair));
X bwrite(fd,(char *) &xdnstair,sizeof(xdnstair));
X bwrite(fd,(char *) &ydnstair,sizeof(ydnstair));
X savemonchn(fd, fmon);
X savegoldchn(fd, fgold);
X savetrapchn(fd, ftrap);
X saveobjchn(fd, fobj);
X saveobjchn(fd, billobjs);
X billobjs = 0;
X save_engravings(fd);
X#ifndef QUEST
X bwrite(fd,(char *) rooms,sizeof(rooms));
X bwrite(fd,(char *) doors,sizeof(doors));
X#endif
X fgold = 0;
X ftrap = 0;
X fmon = 0;
X fobj = 0;
X#ifndef NOWORM
X bwrite(fd,(char *) wsegs,sizeof(wsegs));
X for(tmp=1; tmp<32; tmp++){
X for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){
X wtmp2 = wtmp->nseg;
X bwrite(fd,(char *) wtmp,sizeof(struct wseg));
X }
X#ifdef DGK
X if (!count_only)
X#endif
X wsegs[tmp] = 0;
X }
X bwrite(fd,(char *) wgrowtime,sizeof(wgrowtime));
X#endif /* NOWORM /**/
X#ifdef DGK
X if (count_only) return(0);
X#endif
X billobjs = 0;
X fgold = 0;
X ftrap = 0;
X fmon = 0;
X fobj = 0;
X}
X
Xbwrite(fd,loc,num)
Xregister fd;
Xregister char *loc;
Xregister unsigned num;
X{
X#ifdef DGK
X bytes_counted += num;
X if (!count_only)
X#endif
X/* lint wants the 3rd arg of write to be an int; lint -p an unsigned */
X if(write(fd, loc, (int) num) != num)
X panic("cannot write %u bytes to file #%d", num, fd);
X}
X
Xsaveobjchn(fd,otmp)
Xregister fd;
Xregister struct obj *otmp;
X{
X register struct obj *otmp2;
X unsigned xl;
X int minusone = -1;
X
X while(otmp) {
X otmp2 = otmp->nobj;
X xl = otmp->onamelth;
X bwrite(fd, (char *) &xl, sizeof(int));
X bwrite(fd, (char *) otmp, xl + sizeof(struct obj));
X#ifdef DGK
X if (!count_only)
X#endif
X free((char *) otmp);
X otmp = otmp2;
X }
X bwrite(fd, (char *) &minusone, sizeof(int));
X}
X
X#ifdef MSDOS
X/* We don't want to save any pointers in any files, so convert
X * the pointers to indices before writing the monsters to disk -dgk
X */
Xsavemonchn(fd,mtmp)
Xregister fd;
Xregister struct monst *mtmp;
X{
X register struct monst *mtmp2;
X unsigned xl;
X int minusone = -1;
X struct permonst *permonstp;
X int monsindex;
X extern struct permonst li_dog, dog, la_dog;
X#ifdef KAA
X extern struct permonst hell_hound;
X# ifdef HARD
X extern struct permonst d_lord, d_prince;
X# endif
X#endif
X
X while(mtmp) {
X mtmp2 = mtmp->nmon;
X xl = mtmp->mxlth + mtmp->mnamelth;
X bwrite(fd, (char *) &xl, sizeof(int));
X /* store an index where the pointer used to be */
X permonstp = mtmp->data;
X if (permonstp == &li_dog)
X monsindex = -1; /* fake index */
X else if (permonstp == &dog)
X monsindex = -2; /* fake index */
X else if (permonstp == &la_dog)
X monsindex = -3; /* fake index */
X#ifdef KAA
X else if (permonstp == &hell_hound)
X monsindex = -4;
X# ifdef HARD
X else if (permonstp == &d_lord)
X monsindex = -5;
X
X else if (permonstp == &d_prince)
X monsindex = -6;
X# endif
X#endif
X else
X monsindex = permonstp - &mons[0];
X *((int *)&mtmp->data) = monsindex;
X bwrite(fd, (char *) mtmp, xl + sizeof(struct monst));
X mtmp->data = permonstp; /* restore the pointer */
X if(mtmp->minvent) saveobjchn(fd,mtmp->minvent);
X#ifdef DGK
X if (!count_only)
X#endif
X free((char *) mtmp);
X mtmp = mtmp2;
X }
X bwrite(fd, (char *) &minusone, sizeof(int));
X}
X#else
X
Xsavemonchn(fd,mtmp)
Xregister fd;
Xregister struct monst *mtmp;
X{
X register struct monst *mtmp2;
X unsigned xl;
X int minusone = -1;
X struct permonst *monbegin = &mons[0];
X
X bwrite(fd, (char *) &monbegin, sizeof(monbegin));
X
X while(mtmp) {
X mtmp2 = mtmp->nmon;
X xl = mtmp->mxlth + mtmp->mnamelth;
X bwrite(fd, (char *) &xl, sizeof(int));
X bwrite(fd, (char *) mtmp, xl + sizeof(struct monst));
X if(mtmp->minvent) saveobjchn(fd,mtmp->minvent);
X free((char *) mtmp);
X mtmp = mtmp2;
X }
X bwrite(fd, (char *) &minusone, sizeof(int));
X}
X#endif
X
Xsavegoldchn(fd,gold)
Xregister fd;
Xregister struct gold *gold;
X{
X register struct gold *gold2;
X while(gold) {
X gold2 = gold->ngold;
X bwrite(fd, (char *) gold, sizeof(struct gold));
X#ifdef DGK
X if (!count_only)
X#endif
X free((char *) gold);
X gold = gold2;
X }
X bwrite(fd, nul, sizeof(struct gold));
X}
X
Xsavetrapchn(fd,trap)
Xregister fd;
Xregister struct trap *trap;
X{
X register struct trap *trap2;
X while(trap) {
X trap2 = trap->ntrap;
X bwrite(fd, (char *) trap, sizeof(struct trap));
X#ifdef DGK
X if (!count_only)
X#endif
X free((char *) trap);
X trap = trap2;
X }
X bwrite(fd, nul, sizeof(struct trap));
X}
X
Xgetlev(fd,pid,lev)
Xint fd,pid;
Xxchar lev;
X{
X register struct gold *gold;
X register struct trap *trap;
X#ifndef NOWORM
X register struct wseg *wtmp;
X#endif
X register tmp;
X long omoves;
X int hpid;
X xchar dlvl;
X#ifdef DGK
X struct symbols osymbol;
X int x, y, up, dn, lt, rt;
X uchar osym, nsym;
X#endif
X
X#ifdef MSDOS
X setmode(fd,O_BINARY);
X#endif
X /* First some sanity checks */
X mread(fd, (char *) &hpid, sizeof(hpid));
X mread(fd, (char *) &dlvl, sizeof(dlvl));
X if((pid && pid != hpid) || (lev && dlvl != lev)) {
X pline("Strange, this map is not as I remember it.");
X pline("Somebody is trying some trickery here ...");
X pline("This game is void ...");
X done("tricked");
X }
X
X fgold = 0;
X ftrap = 0;
X mread(fd, (char *) levl, sizeof(levl));
X#ifdef DGK
X /* Corners are poorly implemented. They only exist in the
X * scrsym field of each dungeon element. So we have to go
X * through the previous level, looking for scrsym with the
X * old corner values, checking to make sure that they are
X * where corners should be, then replace them with the scrsym
X * of the new GRAPHICS character set. Ugly.
X */
X mread(fd, (char *) &osymbol, sizeof(osymbol));
X if (memcmp((char *) &osymbol, (char *) &symbol, sizeof (symbol))) {
X for (x = 0; x < COLNO; x++)
X for (y = 0; y < ROWNO; y++) {
X osym = levl[x][y].scrsym;
X nsym = 0;
X switch (levl[x][y].typ) {
X case 0:
X case SCORR:
X break;
X case ROOM:
X if (osym == osymbol.room)
X nsym = symbol.room;
X break;
X case DOOR:
X if (osym == osymbol.door)
X nsym = symbol.door;
X break;
X case CORR:
X if (osym == osymbol.corr)
X nsym = symbol.corr;
X break;
X case VWALL:
X if (osym == osymbol.vwall)
X nsym = symbol.vwall;
X break;
X case SDOOR:
X if (osym == osymbol.vwall)
X nsym = symbol.vwall;
X else if (osym == osymbol.hwall)
X nsym = symbol.hwall;
X break;
X /* Now the ugly stuff */
X case HWALL:
X up = (y > 0) ? levl[x][y-1].typ : 0;
X dn = (y < ROWNO-1) ?levl[x][y+1].typ : 0;
X lt = (x > 0) ? levl[x-1][y].typ : 0;
X rt = (x < COLNO-1) ?levl[x+1][y].typ : 0;
X up = up && (up == VWALL || up == DOOR
X || up == SDOOR);
X dn = dn && (dn == VWALL || dn == DOOR
X || dn == SDOOR);
X lt = lt && (lt == HWALL || lt == DOOR
X || lt == SDOOR);
X rt = rt && (rt == HWALL || rt == DOOR
X || rt == SDOOR);
X if (rt && dn && osym == osymbol.tlcorn)
X nsym = symbol.tlcorn;
X else if (lt && dn && osym == osymbol.trcorn)
X nsym = symbol.trcorn;
X else if (rt && up && osym == osymbol.blcorn)
X nsym = symbol.blcorn;
X else if (lt && up && osym == osymbol.brcorn)
X nsym = symbol.brcorn;
X else if (osym == osymbol.hwall)
X nsym = symbol.hwall;
X break;
X default:
X break;
X }
X if (nsym)
X levl[x][y].scrsym = nsym;
X }
X }
X#endif
X mread(fd, (char *)&omoves, sizeof(omoves));
X mread(fd, (char *)&xupstair, sizeof(xupstair));
X mread(fd, (char *)&yupstair, sizeof(yupstair));
X mread(fd, (char *)&xdnstair, sizeof(xdnstair));
X mread(fd, (char *)&ydnstair, sizeof(ydnstair));
X
X fmon = restmonchn(fd);
X
X /* regenerate animals while on another level */
X { long tmoves = (moves > omoves) ? moves-omoves : 0;
X register struct monst *mtmp, *mtmp2;
X extern char genocided[];
X
X for(mtmp = fmon; mtmp; mtmp = mtmp2) {
X long newhp; /* tmoves may be very large */
X
X mtmp2 = mtmp->nmon;
X if(index(genocided, mtmp->data->mlet)) {
X mondead(mtmp);
X continue;
X }
X
X if(mtmp->mtame && tmoves > 250) {
X mtmp->mtame = 0;
X mtmp->mpeaceful = 0;
X }
X
X newhp = mtmp->mhp +
X (index(MREGEN, mtmp->data->mlet) ? tmoves : tmoves/20);
X if(newhp > mtmp->mhpmax)
X mtmp->mhp = mtmp->mhpmax;
X else
X mtmp->mhp = newhp;
X }
X }
X
X setgd();
X gold = newgold();
X mread(fd, (char *)gold, sizeof(struct gold));
X while(gold->gx) {
X gold->ngold = fgold;
X fgold = gold;
X gold = newgold();
X mread(fd, (char *)gold, sizeof(struct gold));
X }
X free((char *) gold);
X trap = newtrap();
X mread(fd, (char *)trap, sizeof(struct trap));
X while(trap->tx) {
X trap->ntrap = ftrap;
X ftrap = trap;
X trap = newtrap();
X mread(fd, (char *)trap, sizeof(struct trap));
X }
X free((char *) trap);
X fobj = restobjchn(fd);
X billobjs = restobjchn(fd);
X rest_engravings(fd);
X#ifndef QUEST
X mread(fd, (char *)rooms, sizeof(rooms));
X mread(fd, (char *)doors, sizeof(doors));
X#endif
X#ifndef NOWORM
X mread(fd, (char *)wsegs, sizeof(wsegs));
X for(tmp = 1; tmp < 32; tmp++) if(wsegs[tmp]){
X wheads[tmp] = wsegs[tmp] = wtmp = newseg();
X while(1) {
X mread(fd, (char *)wtmp, sizeof(struct wseg));
X if(!wtmp->nseg) break;
X wheads[tmp]->nseg = wtmp = newseg();
X wheads[tmp] = wtmp;
X }
X }
X mread(fd, (char *)wgrowtime, sizeof(wgrowtime));
X#endif
X}
X
Xmread(fd, buf, len)
Xregister fd;
Xregister char *buf;
Xregister unsigned len;
X{
X register int rlen;
X extern boolean restoring;
X
X rlen = read(fd, buf, (int) len);
X if(rlen != len){
X pline("Read %d instead of %u bytes.\n", rlen, len);
X if(restoring) {
X (void) unlink(SAVEF);
X error("Error restoring old game.");
X }
X panic("Error reading level file.");
X }
X}
X
Xmklev()
X{
X extern boolean in_mklev;
X
X if(getbones()) return;
X
X in_mklev = TRUE;
X makelevel();
X in_mklev = FALSE;
X}
X
X#ifdef DGK
Xswapin_file(lev) {
X char to[PATHLEN], from[PATHLEN];
X
X sprintf(from, "%s%s", permbones, alllevels);
X sprintf(to, "%s%s", levels, alllevels);
X name_file(from, lev);
X name_file(to, lev);
X while (fileinfo[lev].size > freediskspace(to))
X if (!swapout_oldest())
X return FALSE;
X#ifdef WIZARD
X if (wizard) {
X pline("Swapping in `%s'", from);
X fflush(stdout);
X }
X#endif
X copyfile(from, to);
X (void) unlink(from);
X fileinfo[lev].where = ACTIVE;
X return TRUE;
X}
X
X
Xswapout_oldest() {
X char to[PATHLEN], from[PATHLEN];
X int i, oldest;
X long oldtime;
X
X if (!ramdisk)
X return FALSE;
X for (i = 1, oldtime = 0, oldest = 0; i <= maxdlevel; i++)
X if (fileinfo[i].where == ACTIVE
X && (!oldtime || fileinfo[i].time < oldtime)) {
X oldest = i;
X oldtime = fileinfo[i].time;
X }
X if (!oldest)
X return FALSE;
X sprintf(from, "%s%s", levels, alllevels);
X sprintf(to, "%s%s", permbones, alllevels);
X name_file(from, oldest);
X name_file(to, oldest);
X#ifdef WIZARD
X if (wizard) {
X pline("Swapping out `%s'.", from);
X fflush(stdout);
X }
X#endif
X copyfile(from, to);
X unlink(from);
X fileinfo[oldest].where = SWAPPED;
X return TRUE;
X}
X
Xcopyfile(from, to)
Xchar *from, *to;
X{
X char buf[BUFSIZ];
X int nfrom, nto, fdfrom, fdto;
X
X if ((fdfrom = open(from, O_RDONLY | O_BINARY | O_CREAT, FMASK)) < 0)
X panic("Can't copy from %s !?", from);
X if ((fdto = open(to, O_WRONLY | O_BINARY | O_CREAT, FMASK)) < 0)
X panic("Can't copy to %s", to);
X do {
X nfrom = read(fdfrom, buf, BUFSIZ);
X nto = write(fdto, buf, nfrom);
X if (nto != nfrom)
X panic("Copyfile failed!");
X } while (nfrom == BUFSIZ);
X close(fdfrom);
X close(fdto);
X}
X#endif
END_OF_lev.c
if test 12696 -ne `wc -c <lev.c`; then
echo shar: \"lev.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f mhitu.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"mhitu.c\"
else
echo shar: Extracting \"mhitu.c\" \(12925 characters\)
sed "s/^X//" >mhitu.c <<'END_OF_mhitu.c'
X/* SCCS Id: @(#)mhitu.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* mhitu.c - version 1.0.3 */
X
X#include "hack.h"
Xextern struct monst *makemon();
X#ifdef KAA
Xextern char pl_character[];
X#endif
X
X/*
X * mhitu: monster hits you
X * returns 1 if monster dies (e.g. 'y', 'F'), 0 otherwise
X */
Xmhitu(mtmp)
Xregister struct monst *mtmp;
X{
X register struct permonst *mdat = mtmp->data;
X register int tmp, ctmp;
X
X nomul(0);
X
X /* If swallowed, can only be affected by hissers and by u.ustuck */
X if(u.uswallow) {
X if(mtmp != u.ustuck) {
X if(mdat->mlet == 'c' && !rn2(13)) {
X pline("Outside, you hear %s's hissing!",
X monnam(mtmp));
X pline("%s gets turned to stone!",
X Monnam(u.ustuck));
X pline("And the same fate befalls you.");
X done_in_by(mtmp);
X /* "notreached": not return(1); */
X }
X return(0);
X }
X switch(mdat->mlet) { /* now mtmp == u.ustuck */
X case ',':
X youswld(mtmp, (u.uac > 0) ? u.uac+4 : 4,
X 5, Monnam(mtmp));
X break;
X case '\'':
X youswld(mtmp,rnd(6),7,Monnam(mtmp));
X break;
X case 'P':
X youswld(mtmp,d(2,4),12,Monnam(mtmp));
X break;
X default:
X /* This is not impossible! */
X#ifdef DGKMOD
X /* If the swallowing monster changes into a monster
X * that is not capable of swallowing you, you get
X * regurgitated - dgk
X */
X pline("You get regurgitated!");
X u.ux = mtmp->mx;
X u.uy = mtmp->my;
X u.uswallow = 0;
X u.ustuck = 0;
X mnexto(mtmp);
X setsee();
X docrt();
X break;
X#else
X pline("The mysterious monster totally digests you.");
X u.uhp = 0;
X#endif /* DGKMOD /**/
X }
X if(u.uhp < 1) done_in_by(mtmp);
X return(0);
X }
X
X if(mdat->mlet == 'c' && Stoned)
X return(0);
X
X /* make eels visible the moment they hit/miss us */
X if(mdat->mlet == ';' && mtmp->minvis && cansee(mtmp->mx,mtmp->my)){
X mtmp->minvis = 0;
X pmon(mtmp);
X }
X if(!index("1&DuxynNF",mdat->mlet))
X tmp = hitu(mtmp,d(mdat->damn,mdat->damd));
X else
X tmp = 0;
X if(index(UNDEAD, mdat->mlet) && midnight())
X tmp += hitu(mtmp,d(mdat->damn,mdat->damd));
X
X ctmp = tmp && !mtmp->mcan &&
X (!uarm || objects[uarm->otyp].a_can < rnd(3) || !rn2(50));
X switch(mdat->mlet) {
X case '1':
X if(wiz_hit(mtmp)) return(1); /* he disappeared */
X break;
X case '&':
X demon_hit(mtmp);
X break;
X case ',':
X if(tmp) justswld(mtmp,Monnam(mtmp));
X break;
X case '\'':
X if (tmp) justswld(mtmp,Monnam(mtmp));
X break;
X case ';':
X if(ctmp) {
X if(!u.ustuck && !rn2(10)) {
X pline("%s swings itself around you!",
X Monnam(mtmp));
X u.ustuck = mtmp;
X } else if(u.ustuck == mtmp &&
X levl[mtmp->mx][mtmp->my].typ == POOL) {
X pline("%s drowns you ...", Monnam(mtmp));
X done("drowned");
X }
X }
X break;
X case 'A':
X if(ctmp && rn2(2)) {
X if(Poison_resistance)
X pline("The sting doesn't seem to affect you.");
X else {
X pline("You feel weaker!");
X losestr(1);
X }
X }
X break;
X case 'C':
X (void) hitu(mtmp,rnd(6));
X break;
X case 'c':
X if(!rn2(5)) {
X if (mtmp->mcan)
X pline("You hear a cough from %s!", monnam(mtmp));
X else {
X pline("You hear %s's hissing!", monnam(mtmp));
X if(!rn2(20) || (flags.moonphase == NEW_MOON
X && !carrying(DEAD_LIZARD) && u.usym != 'c')) {
X Stoned = 5;
X /* pline("You get turned to stone!"); */
X /* done_in_by(mtmp); */
X }
X }
X }
X break;
X case 'D':
X if(rn2(6) || mtmp->mcan) {
X (void) hitu(mtmp,d(3,10));
X (void) hitu(mtmp,rnd(8));
X (void) hitu(mtmp,rnd(8));
X break;
X }
X kludge("%s breathes fire!",Monnam(mtmp));
X buzz(-1,mtmp->mx,mtmp->my,u.ux-mtmp->mx,u.uy-mtmp->my);
X break;
X case 'd':
X (void) hitu(mtmp,d(2, (flags.moonphase == FULL_MOON) ? 3 : 4));
X break;
X case 'e':
X (void) hitu(mtmp,d(3,6));
X break;
X case 'F':
X if(mtmp->mcan) break;
X kludge("%s explodes!", Monnam(mtmp));
X if(Cold_resistance) pline("You don't seem affected by it.");
X else {
X xchar dn;
X if(17-(u.ulevel/2) > rnd(20)) {
X pline("You get blasted!");
X dn = 6;
X } else {
X pline("You duck the blast...");
X dn = 3;
X }
X losehp_m(d(dn,6), mtmp);
X }
X mondead(mtmp);
X return(1);
X case 'g':
X if(ctmp && multi >= 0 && !rn2(3)) {
X /* fix so we don't know what hit us when blind KAA */
X if (Blind)
X pline("You are frozen by its juices!");
X else
X pline("You are frozen by %s's juices!",monnam(mtmp));
X nomul(-rnd(10));
X }
X break;
X case 'h':
X if(ctmp && multi >= 0 && !rn2(5)) {
X nomul(-rnd(10));
X if (Blind)
X pline("You are put to sleep by its bite!");
X else
X pline("You are put to sleep by %s's bite!",monnam(mtmp));
X }
X break;
X case 'j':
X tmp = hitu(mtmp,rnd(3));
X tmp &= hitu(mtmp,rnd(3));
X if(tmp){
X (void) hitu(mtmp,rnd(4));
X (void) hitu(mtmp,rnd(4));
X }
X break;
X case 'k':
X if((hitu(mtmp,rnd(4)) || !rn2(3)) && ctmp){
X poisoned("bee's sting",mdat->mname);
X }
X break;
X case 'L':
X#ifdef KAA
X if (u.usym=='L') break;
X#endif
X if(!mtmp->mcan && tmp) stealgold(mtmp);
X break;
X case 'N':
X#ifdef KAA
X if (u.usym=='N') {
X if (mtmp->minvent)
X pline("%s brags about the goods some dungeon explorer provided.",
X Monnam(mtmp));
X else
X pline("%s makes some remarks about how difficult theft is lately.",
X Monnam(mtmp));
X rloc(mtmp);
X } else
X#endif
X if(mtmp->mcan && !Blind) {
X pline("%s tries to seduce you, but you seem not interested.",
X Amonnam(mtmp, "plain"));
X if(rn2(3)) rloc(mtmp);
X } else if(steal(mtmp)) {
X rloc(mtmp);
X mtmp->mflee = 1;
X }
X break;
X case 'n':
X if(!uwep
X#ifdef KAA
X && u.usym == '@'
X#endif
X && !uarm && !uarmh && !uarms && !uarmg) {
X pline("%s hits! (I hope you don't mind)",
X Monnam(mtmp));
X u.uhp += rnd(7);
X if(!rn2(7)) u.uhpmax++;
X if(u.uhp > u.uhpmax) u.uhp = u.uhpmax;
X flags.botl = 1;
X if(!rn2(50)) rloc(mtmp);
X } else {
X#ifdef KAA
X if (pl_character[0] == 'P' && u.usym == '@') {
X if (!(moves % 5))
X pline("Doc, I can't help you unless you cooperate.");
X } else {
X#endif
X (void) hitu(mtmp,d(2,6));
X (void) hitu(mtmp,d(2,6));
X#ifdef KAA
X }
X#endif
X }
X break;
X case 'o':
X tmp = hitu(mtmp,rnd(6));
X if(hitu(mtmp,rnd(6)) && tmp && /* hits with both paws */
X !u.ustuck && rn2(2)) {
X u.ustuck = mtmp;
X kludge("%s has grabbed you!", Monnam(mtmp));
X losehp_m(d(2,8), mtmp);
X } else if(u.ustuck == mtmp) {
X losehp_m(d(2,8), mtmp);
X pline("You are being crushed.");
X }
X break;
X case 'P':
X if(ctmp && !rn2(4))
X justswld(mtmp,Monnam(mtmp));
X else
X (void) hitu(mtmp,d(2,4));
X break;
X case 'Q':
X#ifdef KAA
X if(ctmp) {
X pline("Your position suddenly seems very uncertain!");
X tele();
X }
X#else
X (void) hitu(mtmp,rnd(2));
X (void) hitu(mtmp,rnd(2));
X#endif
X break;
X case 'R':
X if(ctmp && uarmh && !uarmh->rustfree &&
X (int) uarmh->spe >= -1) {
X pline("Your helmet rusts!");
X uarmh->spe--;
X } else
X if(ctmp && uarm && !uarm->rustfree && /* Mike Newton */
X uarm->otyp < STUDDED_LEATHER_ARMOR &&
X (int) uarm->spe >= -1) {
X pline("Your armor rusts!");
X uarm->spe--;
X }
X break;
X case 'S':
X if(ctmp && !rn2(8)) {
X poisoned("snake's bite",mdat->mname);
X }
X break;
X case 's':
X if(ctmp && !rn2(8)) {
X poisoned("scorpion's sting",mdat->mname);
X }
X (void) hitu(mtmp,rnd(8));
X (void) hitu(mtmp,rnd(8));
X break;
X case 'T':
X (void) hitu(mtmp,rnd(6));
X (void) hitu(mtmp,rnd(6));
X break;
X case 't':
X if(!rn2(5)) rloc(mtmp);
X break;
X case 'u':
X mtmp->mflee = 1;
X break;
X case 'U':
X (void) hitu(mtmp,d(3,4));
X (void) hitu(mtmp,d(3,4));
X break;
X case 'v':
X if(ctmp && !u.ustuck) u.ustuck = mtmp;
X break;
X case 'V':
X if(tmp) losehp_m(4, mtmp);
X if(ctmp) losexp();
X break;
X case 'W':
X if(ctmp) losexp();
X break;
X#ifndef NOWORM
X case 'w':
X if(tmp) wormhit(mtmp);
X#endif
X break;
X case 'X':
X (void) hitu(mtmp,rnd(5));
X (void) hitu(mtmp,rnd(5));
X (void) hitu(mtmp,rnd(5));
X break;
X case 'x':
X { register long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE;
X#ifdef KAA
X if (mtmp->mcan)
X pline("%s nuzzles against your %s leg!",
X Monnam(mtmp), (side==RIGHT_SIDE)?"right":"left");
X else {
X#endif
X pline("%s pricks your %s leg!",
X Monnam(mtmp), (side==RIGHT_SIDE)?"right":"left");
X set_wounded_legs(side, rnd(50));
X losehp_m(2, mtmp);
X#ifdef KAA
X }
X#endif
X break;
X }
X case 'y':
X if(mtmp->mcan) break;
X mondead(mtmp);
X if(!Blind && (u.usym != 'y')) {
X pline("You are blinded by a blast of light!");
X Blind = d(4,12);
X seeoff(0);
X }
X return(1);
X case 'Y':
X (void) hitu(mtmp,rnd(6));
X break;
X }
X if(u.uhp < 1) done_in_by(mtmp);
X return(0);
X}
X
Xhitu(mtmp,dam)
Xregister struct monst *mtmp;
Xregister dam;
X{
X register tmp, res;
X
X nomul(0);
X if (mtmp->mfroz || mtmp->mhp <= 0) return(0);
X /* If you are a 'a' or 'E' the monster might not get a second hit */
X if(u.uswallow) return(0);
X
X if(mtmp->mhide && mtmp->mundetected) {
X mtmp->mundetected = 0;
X if(!Blind) {
X register struct obj *obj;
X extern char * Xmonnam();
X if(obj = o_at(mtmp->mx,mtmp->my))
X pline("%s was hidden under %s!",
X Xmonnam(mtmp), doname(obj));
X }
X }
X
X tmp = u.uac;
X /* give people with Ac = -10 at least some vulnerability */
X if(tmp < 0) {
X dam += tmp; /* decrease damage */
X if(dam <= 0) dam = 1;
X tmp = -rn2(-tmp);
X }
X tmp += mtmp->data->mlevel;
X if(multi < 0) tmp += 4;
X if((Invis && mtmp->data->mlet != 'I') || !mtmp->mcansee) tmp -= 2;
X if(mtmp->mtrapped) tmp -= 2;
X if(tmp <= rnd(20)) {
X if(Blind) pline("It misses.");
X else pline("%s misses.",Monnam(mtmp));
X res = 0;
X } else {
X if(Blind) pline("It hits!");
X else pline("%s hits!",Monnam(mtmp));
X if (u.usym == 'a' && !rn2(4)) {
X pline("%s is splashed by your acid!",Monnam(mtmp));
X mtmp->mhp -= rnd(10);
X if(mtmp->mhp <= 0) {
X pline("%s dies!",Monnam(mtmp));
X xkilled(mtmp,0);
X }
X }
X losehp_m(dam, mtmp);
X res = 1;
X }
X stop_occupation();
X if(u.usym=='E' && mtmp->mcansee && rn2(2)) {
X pline("%s is frozen by your gaze!",Monnam(mtmp));
X mtmp->mfroz = 1;
X }
X return(res);
X}
X
X#define Athome (Inhell && !mtmp->cham)
X
X#ifdef HARD
Xdemon_talk(mtmp) /* returns 1 if we pay him off. */
Xregister struct monst *mtmp;
X{
X char *xmonnam(), *Xmonnam();
X int demand, offer;
X
X if(!strcmp(mtmp->data->mname, "demon")) { /* not for regular '&'s */
X
X pline("%s mutters something about awful working conditions.",
X Xmonnam(mtmp));
X return(0);
X }
X
X if(u.usym == '&') { /* Won't blackmail their own. */
X
X pline("%s says, 'Good hunting %s.' and vanishes",
X Xmonnam(mtmp), flags.female ? "Sister" : "Brother");
X mondead(mtmp);
X return(1);
X }
X
X demand = (u.ugold * (rnd(80) + 20 * Athome)) / 100;
X if(!demand) { /* you have no gold */
X mtmp->mpeaceful = 0;
X return(0);
X } else {
X char buf[80];
X
X pline("%s demands %d Zorkmids for safe passage.",
X Xmonnam(mtmp), demand);
X pline("how many will you offer him?");
X getlin(buf);
X sscanf(buf, "%d", &offer);
X
X if(offer >= u.ugold) {
X pline("You give %s all your gold.", xmonnam(mtmp));
X offer = u.ugold;
X } else pline("You give %s %d Zorkmids.", xmonnam(mtmp), offer);
X u.ugold -= offer;
X
X if(offer >= demand) {
X pline("%s vanishes laughing about cowardly mortals.",
X Xmonnam(mtmp));
X } else {
X if(rnd(40) > (demand - offer)) {
X pline("%s scowls at you menacingly, then vanishes.",
X Xmonnam(mtmp));
X } else {
X pline("%s gets angry...", Xmonnam(mtmp));
X mtmp->mpeaceful = 0;
X return(0);
X }
X }
X }
X mondead(mtmp);
X return(1);
X}
X#endif
X
Xdemon_hit(mtmp)
Xregister struct monst *mtmp;
X{
X register struct obj *otmp;
X int onum, nobj = 0,
X ml = mtmp->data->mlevel;
X
X if(!mtmp->cham && !mtmp->mcan && !rn2(13)) {
X (void) makemon(PM_DEMON,u.ux,u.uy);
X } else {
X switch((!mtmp->mcan) ? rn2(ml - 5 - !Athome) : 0) {
X#ifdef HARD
X case 12:
X case 11:
X case 10:
X case 9: /* the wiz */
X (void) hitu(mtmp, 1);
X pline("Oh no, he's using the touch of death!");
X if (rn2(ml) > 12) {
X
X if(Confusion)
X pline("You have an out of body experience.");
X else {
X killer = "touch of death";
X done("died");
X }
X } else pline("Lucky for you, it didn't work!");
X break;
X case 8: /* demon princes */
X (void) hitu(mtmp, 1);
X if(!destroy_arm()) pline("Your skin itches.");
X break;
X case 7:
X (void) hitu(mtmp, 1);
X for (otmp = invent; otmp; otmp = otmp->nobj) nobj++;
X onum = rn2(nobj);
X for(otmp = invent; onum != 0; onum--) otmp = otmp->nobj;
X otmp->cursed++;
X break;
X case 6: /* demon lords */
X (void) hitu(mtmp, 1);
X pline("You suddenly feel weaker!");
X losestr(rnd(ml - 6));
X break;
X case 5:
X (void) hitu(mtmp, 1);
X if (Confusion) pline("Hey, that tickles!");
X else pline("Huh, What? Where am I?");
X HConfusion += rn1(7, 16);
X break;
X#endif /* HARD /**/
X default: /* demons and chamelons as demons */
X (void) hitu(mtmp,d(2,5 + Athome));
X (void) hitu(mtmp,d(2,5 + Athome));
X (void) hitu(mtmp,rnd(2 + Athome));
X (void) hitu(mtmp,rnd(2 + Athome));
X (void) hitu(mtmp,rn1(4,1 + Athome));
X break;
X }
X }
X return(0);
X}
END_OF_mhitu.c
if test 12925 -ne `wc -c <mhitu.c`; then
echo shar: \"mhitu.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f u_init.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"u_init.c\"
else
echo shar: Extracting \"u_init.c\" \(11925 characters\)
sed "s/^X//" >u_init.c <<'END_OF_u_init.c'
X/* SCCS Id: @(#)u_init.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* u_init.c - version 1.0.3 */
X
X#include <stdio.h>
X#include <signal.h>
X#include "hack.h"
X#define Strcpy (void) strcpy
X#define Strcat (void) strcat
X#define UNDEF_TYP 0
X#define UNDEF_SPE '\177'
Xextern struct obj *addinv();
Xextern char *eos();
Xextern char plname[];
X
Xstruct you zerou;
Xchar pl_character[PL_CSIZ];
Xchar *(roles[]) = { /* must all have distinct first letter */
X /* roles[4] & [7] may be changed for females */
X "Archeologist", "Tourist", "Fighter", "Knight", "Cave-man",
X#ifdef NEWCLASS
X "Samurai", "Ninja", "Priest",
X#endif
X#ifdef KAA
X "Valkyrie", "Elf", "Healer",
X#endif
X "Wizard"
X};
X#define NR_OF_ROLES SIZE(roles)
Xchar rolesyms[NR_OF_ROLES + 1]; /* filled by u_init() */
X
Xstruct trobj {
X uchar trotyp;
X schar trspe;
X char trolet;
X Bitfield(trquan,6);
X Bitfield(trknown,1);
X};
X
X#ifdef WIZARD
Xstruct trobj Extra_objs[] = {
X { 0, 0, 0, 0, 0 },
X { 0, 0, 0, 0, 0 }
X};
X#endif
X
Xstruct trobj Cave_man[] = {
X#ifdef KAA
X { CLUB, 1, WEAPON_SYM, 1, 1 },
X#else
X { MACE, 1, WEAPON_SYM, 1, 1 },
X#endif
X { BOW, 1, WEAPON_SYM, 1, 1 },
X { ARROW, 0, WEAPON_SYM, 25, 1 }, /* quan is variable */
X { LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 },
X { 0, 0, 0, 0, 0}
X};
X
Xstruct trobj Fighter[] = {
X { TWO_HANDED_SWORD, 0, WEAPON_SYM, 1, 1 },
X { RING_MAIL, 0, ARMOR_SYM, 1, 1 },
X { 0, 0, 0, 0, 0 }
X};
X
Xstruct trobj Knight[] = {
X { LONG_SWORD, 0, WEAPON_SYM, 1, 1 },
X { SPEAR, 2, WEAPON_SYM, 1, 1 },
X { RING_MAIL, 1, ARMOR_SYM, 1, 1 },
X { HELMET, 0, ARMOR_SYM, 1, 1 },
X { SHIELD, 0, ARMOR_SYM, 1, 1 },
X { PAIR_OF_GLOVES, 0, ARMOR_SYM, 1, 1 },
X { 0, 0, 0, 0, 0 }
X};
X
X#ifdef KAA
Xstruct trobj Elf[] = {
X { SHORT_SWORD, 0, WEAPON_SYM, 1, 1 },
X { BOW, 0, WEAPON_SYM, 1, 1 },
X { ARROW, 0, WEAPON_SYM, 25, 1 },
X { UNDEF_TYP, 0, ARMOR_SYM, 1, 1 },
X { 0, 0, 0, 0, 0 }
X};
X
Xstruct trobj Valkyrie[] = {
X { LONG_SWORD, 1, WEAPON_SYM, 1, 1 },
X { SHIELD, 3, ARMOR_SYM, 1, 1 },
X { FOOD_RATION, 0, FOOD_SYM, 1, 1 },
X { 0, 0, 0, 0, 0 }
X};
X
Xstruct trobj Healer[] = {
X { STETHOSCOPE, 0, TOOL_SYM, 1, 0 },
X { POT_HEALING, 0, POTION_SYM, 4, 0 },
X { POT_EXTRA_HEALING, 0, POTION_SYM, 4, 0 },
X { APPLE, 0, FOOD_SYM, 5, 0 },
X { 0, 0, 0, 0, 0}
X};
X#endif /* KAA /**/
X
Xstruct trobj Archeologist[] = {
X { STUDDED_LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 },
X { UNDEF_TYP, 0, POTION_SYM, 2, 0 },
X { FOOD_RATION, 0, FOOD_SYM, 3, 1 },
X { PICK_AXE, UNDEF_SPE, TOOL_SYM, 1, 0 },
X { ICE_BOX, 0, TOOL_SYM, 1, 0 },
X { 0, 0, 0, 0, 0}
X};
X
Xstruct trobj Tinopener[] = {
X { CAN_OPENER, 0, TOOL_SYM, 1, 1 },
X { 0, 0, 0, 0, 0 }
X};
X
X#ifdef MARKER
Xstruct trobj Magicmarker[] = {
X { MAGIC_MARKER, 50, TOOL_SYM, 1, 0 },
X { 0, 0, 0, 0, 0 }
X};
X#endif
X
X#ifdef WALKIES
Xstruct trobj Leash[] = {
X { LEASH, 0, CHAIN_SYM, 1, 0 },
X { 0, 0, 0, 0, 0 }
X};
X#endif
X
Xstruct trobj Tourist[] = {
X { UNDEF_TYP, 0, FOOD_SYM, 10, 1 },
X { POT_EXTRA_HEALING, 0, POTION_SYM, 2, 0 },
X { EXPENSIVE_CAMERA, 0, TOOL_SYM, 1, 1 },
X { DART, 2, WEAPON_SYM, 25, 1 }, /* quan is variable */
X { 0, 0, 0, 0, 0 }
X};
X
Xstruct trobj Wizard[] = {
X { ELVEN_CLOAK, 0, ARMOR_SYM, 1, 1 },
X { UNDEF_TYP, UNDEF_SPE, WAND_SYM, 2, 0 },
X { UNDEF_TYP, UNDEF_SPE, RING_SYM, 2, 0 },
X { UNDEF_TYP, UNDEF_SPE, POTION_SYM, 2, 0 },
X { UNDEF_TYP, UNDEF_SPE, SCROLL_SYM, 3, 0 },
X#ifdef SPELLS
X { UNDEF_TYP, UNDEF_SPE, SPBOOK_SYM, 1, 0 },
X#endif
X { 0, 0, 0, 0, 0 }
X};
X
X#ifdef NEWCLASS
Xstruct trobj Samurai[] = {
X { KATANA, 0, WEAPON_SYM, 1, 1 },
X { BOW, 1, WEAPON_SYM, 1, 1 },
X { ARROW, 0, WEAPON_SYM, 25, 1 }, /* quan is variable */
X { SPLINT_MAIL, 0, ARMOR_SYM, 1, 1},
X { 0, 0, 0, 0, 0 }
X};
X
Xstruct trobj Ninja[] = {
X { KATANA, 0, WEAPON_SYM, 1, 1 },
X { SHURIKEN, 0, WEAPON_SYM, 25, 1 }, /* quan is variable */
X { LEATHER_ARMOR, 1, ARMOR_SYM, 1, 1},
X { 0, 0, 0, 0, 0 }
X};
X
Xstruct trobj Priest[] = {
X { CHAIN_MAIL, 0, ARMOR_SYM, 1, 1 },
X { SHIELD, 0, ARMOR_SYM, 1, 1 },
X { MACE, 1, WEAPON_SYM, 1, 1 },
X#ifdef SPELLS
X { UNDEF_TYP, UNDEF_SPE, SPBOOK_SYM, 2, 0 },
X#endif
X { 0, 0, 0, 0, 0 }
X};
X#endif /* NEWCLASS /**/
X
Xu_init(){
Xregister int i;
Xchar exper = 'y', pc;
Xextern char readchar();
X if(flags.female) { /* should have been set in HACKOPTIONS */
X roles[4] = "Cave-woman";
X#ifdef NEWCLASS
X roles[7] = "Priestess";
X#endif
X }
X for(i = 0; i < NR_OF_ROLES; i++)
X rolesyms[i] = roles[i][0];
X rolesyms[i] = 0;
X
X if(pc = pl_character[0]) {
X if('a' <= pc && pc <= 'z') pc += 'A'-'a';
X if((i = role_index(pc)) >= 0)
X goto got_suffix; /* implies experienced */
X printf("\nUnknown role: %c\n", pc);
X pl_character[0] = pc = 0;
X }
X
X printf("\nShall I pick a character for you (yes, no, or quit) ? [ynq] ");
X
X while(!index("yYnNqQ", (exper = readchar()))) bell();
X
X printf("%c\n", exper); /* echo */
X
X if (index("qQ", exper)) exit(0);
X
X if(index("Yy", exper)) {
X exper = 0;
X goto beginner;
X }
X
X printf("\n Tell me what kind of character you are:\n");
X printf(" Are you");
X for(i = 0; i < NR_OF_ROLES; i++) {
X printf(" %s %s", index("AEIOU",roles[i][0]) ? "an" : "a", roles[i]);
X if((((i + 1) % 4) == 0) && (i != NR_OF_ROLES -1)) printf(",\n\t");
X else if(i < NR_OF_ROLES - 2) printf(",");
X if(i == NR_OF_ROLES - 2) printf(" or");
X }
X printf("? [%s or q(quit)] ", rolesyms);
X
X while(pc = readchar()) {
X if (pc == 'q' || pc == 'Q') exit(0);
X if('a' <= pc && pc <= 'z') pc += 'A'-'a';
X if((i = role_index(pc)) >= 0) {
X printf("%c\n", pc); /* echo */
X (void) fflush(stdout); /* should be seen */
X break;
X }
X if(pc == '\n') break;
X bell();
X }
X if(pc == '\n') pc = 0;
X
Xbeginner:
X if(!pc) {
X i = rn2(NR_OF_ROLES);
X pc = rolesyms[i];
X printf("\nThis game you will be %s %s%s.\n",
X (exper || index("AEIOU", roles[i][0])) ? "an" : "a",
X exper ? "experienced " : "", roles[i]);
X getret();
X /* give him some feedback in case mklev takes much time */
X (void) putchar('\n');
X (void) fflush(stdout);
X }
X if(exper) {
X roles[i][0] = pc;
X }
X
Xgot_suffix:
X
X (void) strncpy(pl_character, roles[i], PL_CSIZ-1);
X pl_character[PL_CSIZ-1] = 0;
X flags.beginner = 1;
X u = zerou;
X u.usym = '@';
X u.ulevel = 1;
X#ifdef SPELLS
X u.uen = u.uenmax = 1;
X#endif
X#ifdef PRAYERS
X u.ublesscnt = 300; /* no prayers just yet */
X u.ublessed = 0; /* not worthy yet */
X u.ugangr = 0; /* gods not angry */
X#endif
X#ifdef KAA
X u.mh = u.mhmax = u.umonnum = u.mtimedone = 0;
X#endif
X init_uhunger();
X#ifdef QUEST
X u.uhorizon = 6;
X#endif
X uarm = uarm2 = uarmh = uarms = uarmg = uwep = uball = uchain =
X uleft = uright = 0;
X#ifdef SPELLS
X for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
X#endif
X switch(pc) {
X case 'c':
X case 'C':
X Cave_man[2].trquan = 12 + rnd(9)*rnd(9);
X u.uhp = u.uhpmax = 16;
X u.ustr = u.ustrmax = 18;
X ini_inv(Cave_man);
X break;
X case 't':
X case 'T':
X#ifdef KAA
X objects[POT_EXTRA_HEALING].oc_name_known=1;
X#endif
X Tourist[3].trquan = 20 + rnd(20);
X u.ugold = u.ugold0 = rnd(1000);
X u.uhp = u.uhpmax = 10;
X u.ustr = u.ustrmax = 8;
X ini_inv(Tourist);
X if(!rn2(25)) ini_inv(Tinopener);
X#ifdef MARKER
X else if(!rn2(25)) ini_inv(Magicmarker);
X#endif
X#ifdef WALKIES
X else if(!rn2(25)) ini_inv(Leash);
X#endif
X break;
X case 'w':
X case 'W':
X for(i=1; i<=4; i++) if(!rn2(5))
X Wizard[i].trquan += rn2(3) - 1;
X u.uhp = u.uhpmax = 15;
X u.ustr = u.ustrmax = 16;
X#ifdef SPELLS
X u.uen = u.uenmax += rn2(4);
X#endif
X ini_inv(Wizard);
X#ifdef MARKER
X if(!rn2(5)) ini_inv(Magicmarker);
X#endif
X break;
X case 'a':
X case 'A':
X Fast = INTRINSIC;
X Stealth = INTRINSIC;
X u.uhp = u.uhpmax = 12;
X u.ustr = u.ustrmax = 10;
X ini_inv(Archeologist);
X if(!rn2(10)) ini_inv(Tinopener);
X#ifdef MARKER
X else if(!rn2(10)) ini_inv(Magicmarker);
X#endif
X break;
X#ifdef KAA
X case 'e':
X case 'E':
X Elf[2].trquan = 15+rnd(20);
X Elf[3].trotyp = (rn2(2) ? ELFIN_CHAIN_MAIL : ELVEN_CLOAK);
X Fast = INTRINSIC;
X HSee_invisible = INTRINSIC;
X u.uhp = u.uhpmax = 16;
X u.ustr = u.ustrmax = 16;
X ini_inv(Elf);
X break;
X case 'v':
X case 'V':
X Stealth = INTRINSIC;
X HCold_resistance = INTRINSIC;
X flags.female = TRUE;
X u.uhp = u.uhpmax = 16;
X u.ustr = u.ustrmax = 17;
X ini_inv(Valkyrie);
X break;
X case 'h':
X case 'H':
X objects[POT_HEALING].oc_name_known=1;
X objects[POT_EXTRA_HEALING].oc_name_known=1;
X HPoison_resistance = INTRINSIC;
X u.uhp = u.uhpmax = 16;
X u.ustr = u.ustrmax = 15;
X ini_inv(Healer);
X break;
X#endif
X case 'k':
X case 'K':
X u.uhp = u.uhpmax = 12;
X u.ustr = u.ustrmax = 10;
X ini_inv(Knight);
X break;
X case 'f':
X case 'F':
X u.uhp = u.uhpmax = 14;
X u.ustr = u.ustrmax = 17;
X ini_inv(Fighter);
X break;
X#ifdef NEWCLASS
X case 's':
X case 'S':
X Fast = INTRINSIC;
X u.uhp = u.uhpmax = 16;
X u.ustr = u.ustrmax = 16;
X Samurai[2].trquan = 12 + rnd(9)*rnd(9);
X ini_inv(Samurai);
X break;
X case 'n':
X case 'N':
X Fast = INTRINSIC;
X Stealth = INTRINSIC;
X u.uhp = u.uhpmax = 15;
X u.ustr = u.ustrmax = 10;
X Ninja[1].trquan = 12 + rnd(9)*rnd(9);
X ini_inv(Ninja);
X break;
X case 'p':
X case 'P':
X u.uhp = u.uhpmax = 13;
X u.ustr = u.ustrmax = 15;
X# ifdef SPELLS
X u.uen = u.uenmax += rn2(4);
X# endif
X ini_inv(Priest);
X# ifdef MARKER
X if(!rn2(10)) ini_inv(Magicmarker);
X# endif
X break;
X#endif /* NEWCLASS /**/
X default: /* impossible */
X u.uhp = u.uhpmax = 12;
X u.ustr = u.ustrmax = 16;
X }
X find_ac();
X if(!rn2(20)) {
X register int d = rn2(7) - 2; /* biased variation */
X u.ustr += d;
X u.ustrmax += d;
X }
X
X#ifdef WIZARD
X if(wizard) wiz_inv();
X#endif
X
X /* make sure he can carry all he has - especially for T's */
X while(inv_weight() > 0 && u.ustr < 118)
X u.ustr++, u.ustrmax++;
X}
X
Xini_inv(trop) register struct trobj *trop; {
Xregister struct obj *obj;
Xextern struct obj *mkobj();
X while(trop->trolet) {
X obj = mkobj(trop->trolet);
X obj->known = trop->trknown;
X /* not obj->dknown = 1; - let him look at it at least once */
X obj->cursed = 0;
X if(obj->olet == WEAPON_SYM){
X obj->quan = trop->trquan;
X trop->trquan = 1;
X }
X if(trop->trspe != UNDEF_SPE)
X obj->spe = trop->trspe;
X if(trop->trotyp != UNDEF_TYP)
X obj->otyp = trop->trotyp;
X else
X if(obj->otyp == WAN_WISHING) /* gitpyr!robert */
X obj->otyp = WAN_DEATH;
X obj->owt = weight(obj); /* defined after setting otyp+quan */
X obj = addinv(obj);
X if(obj->olet == ARMOR_SYM){
X switch(obj->otyp){
X case SHIELD:
X if(!uarms) setworn(obj, W_ARMS);
X break;
X case HELMET:
X if(!uarmh) setworn(obj, W_ARMH);
X break;
X case PAIR_OF_GLOVES:
X if(!uarmg) setworn(obj, W_ARMG);
X break;
X case ELVEN_CLOAK:
X if(!uarm2)
X setworn(obj, W_ARM);
X break;
X default:
X if(!uarm) setworn(obj, W_ARM);
X }
X }
X /* below changed by GAN 01/09/87 to allow wielding of
X * pick-axe or can-opener if there is no weapon
X */
X if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE ||
X obj->otyp == CAN_OPENER)
X if(!uwep) setuwep(obj);
X#ifndef PYRAMID_BUG
X if(--trop->trquan) continue; /* make a similar object */
X#else
X if(trop->trquan) { /* check if zero first */
X --trop->trquan;
X if(trop->trquan)
X continue; /* make a similar object */
X }
X#endif
X trop++;
X }
X}
X
X#ifdef WIZARD
Xwiz_inv(){
Xregister struct trobj *trop = &Extra_objs[0];
Xextern char *getenv();
Xregister char *ep = getenv("INVENT");
Xregister int type;
X while(ep && *ep) {
X type = atoi(ep);
X ep = index(ep, ',');
X if(ep) while(*ep == ',' || *ep == ' ') ep++;
X if(type <= 0 || type > NROFOBJECTS) continue;
X trop->trotyp = type;
X trop->trolet = objects[type].oc_olet;
X trop->trspe = 4;
X trop->trknown = 1;
X trop->trquan = 1;
X ini_inv(trop);
X }
X /* give him a wand of wishing by default */
X trop->trotyp = WAN_WISHING;
X trop->trolet = WAND_SYM;
X trop->trspe = 20;
X trop->trknown = 1;
X trop->trquan = 1;
X ini_inv(trop);
X}
X#endif /* WIZARD /**/
X
Xplnamesuffix() {
Xregister char *p;
X if(p = rindex(plname, '-')) {
X *p = 0;
X pl_character[0] = p[1];
X pl_character[1] = 0;
X if(!plname[0]) {
X askname();
X plnamesuffix();
X }
X }
X}
X
Xrole_index(pc)
Xchar pc;
X{ /* must be called only from u_init() */
X /* so that rolesyms[] is defined */
X register char *cp;
X
X if(cp = index(rolesyms, pc))
X return(cp - rolesyms);
X return(-1);
X}
END_OF_u_init.c
if test 11925 -ne `wc -c <u_init.c`; then
echo shar: \"u_init.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f undo.sh -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"undo.sh\"
else
echo shar: Extracting \"undo.sh\" \(52 characters\)
sed "s/^X//" >undo.sh <<'END_OF_undo.sh'
X#! /bin/csh -f
Xforeach i (NetHack.??)
Xunshar $i
Xend
END_OF_undo.sh
if test 52 -ne `wc -c <undo.sh`; then
echo shar: \"undo.sh\" unpacked with wrong size!
fi
chmod +x undo.sh
# end of overwriting check
fi
echo shar: End of archive 8 \(of 16\).
cp /dev/null ark8isdone
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