Save your previous version of hack until this one has run satisfactorily
for some time. The record files are compatible, the bones & save files
are not. Some people will have to expand tabs to spaces in the data or help
files.
I'll soon be in Denmark, and remain there for 11 months; probably this
means that I won't see netnews for a while, so you'll have to mail me
in case you have problems or suggestions for improvements, and don't
expect an immediate reply.
#---------- cut here -------------------------------------------------------
echo Make sure that you have the original, unmodified 1.0.2 sources here.
echo This ed-script will convert them to Hack version 1.0.3.
echo Editing Makefile ; ed Makefile << '-*-END-*-'
161c
hack.rumors.o: hack.h
.
94a
.
93a
clean:
rm -f *.o
.
92a
# cp hack.6 /usr/man/man6
.
84,85c
# the distribution directory also contains the empty files perm and record.
.
57a
all: $(GAME) lint
@echo "Done."
.
38a
DISTR = $(SOURCES) $(AUX) READ_ME Makefile date.h hack.onames.h
.
w
q
-*-END-*-
echo Editing READ_ME ; ed READ_ME << '-*-END-*-'
55c
1. If it didnt exist already, introduce a loginname `play' .
.
w
q
-*-END-*-
echo Editing config.h ; ed config.h << '-*-END-*-'
35a
#define HLOCK "perm" /* an empty file used for locking purposes */
#define LLOCK "safelock" /* link to previous */
.
26a
/* #define PYRAMID_BUG */ /* avoid a bug on the Pyramid */
/* #define NOWAITINCLUDE */ /* neither <wait.h> nor <sys/wait.h> exists */
.
2c
/* config.h - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing data ; ed data << '-*-END-*-'
223a
~ the tail of a long worm
.
221,222c
w a long worm;
.
28a
; a giant eel
.
14c
%% a piece of food
.
1c
Hack & Quest data file - version 1.0.3
.
w
q
-*-END-*-
echo Editing date.h ; ed date.h << '-*-END-*-'
2c
char datestring[] = "Tue Jul 23 1985";
.
w
q
-*-END-*-
echo Editing def.flag.h ; ed def.flag.h << '-*-END-*-'
18a
unsigned invlet_constant:1; /* let objects keep their
inventory symbol */
.
5a
unsigned debug:1; /* in debugging mode */
#define wizard flags.debug
.
2c
/* def.flag.h - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing def.mkroom.h ; ed def.mkroom.h << '-*-END-*-'
15c
/* various values of rtype */
.
5c
schar lx,hx,ly,hy; /* usually xchar, but hx may be -1 */
.
2c
/* def.mkroom.h - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing def.obj.h ; ed def.obj.h << '-*-END-*-'
16a
char invlet;
.
2c
/* def.obj.h - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing def.objclass.h ; ed def.objclass.h << '-*-END-*-'
19c
#define a_ac oc_oc1 /* for armors - only used in ARM_BONUS */
#define ARM_BONUS(obj) ((10 - objects[obj->otyp].a_ac) + obj->spe)
.
2c
/* def.objclass.h - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing def.objects.h ; ed def.objects.h << '-*-END-*-'
186d
184d
4c
/* objects have letter " % ) ( 0 _ ` [ ! ? / = * */
.
2c
/* def.objects.h - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.Decl.c ; ed hack.Decl.c << '-*-END-*-'
9,12c
boolean in_mklev, restoring;
.
7c
char lock[PL_NSIZ+4] = "1lock"; /* long enough for login name .99 */
.
2c
/* hack.Decl.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.apply.c ; ed hack.apply.c << '-*-END-*-'
396a
if(inshop())
shopdig(0);
.
328a
if(uwep && uwep->cursed) {
/* Andreas Bormann - ihnp4!decvax!mcvax!unido!ab */
pline("Since your weapon is welded to your hand,");
pline("you cannot use that pick-axe.");
return(0);
}
.
306a
if(inshop())
shopdig(1);
.
292a
/* When will hole be finished? Very rough indication used by shopkeeper. */
holetime() {
return( (occupation == dig) ? (250 - dig_effort)/20 : -1);
}
.
72,73c
if(cansee(mtmp->mx,mtmp->my))
pline("%s is blinded by the flash!", Monnam(mtmp));
.
38a
xit:
.
36c
use_whistle(obj);
break;
case CAN_OPENER:
if(!carrying(TIN)) {
pline("You have no can to open.");
goto xit;
}
pline("You cannot open a tin without eating its contents.");
pline("In order to eat, use the 'e' command.");
if(obj != uwep)
pline("Opening the tin will be much easier if you wield the can-opener.");
goto xit;
.
28c
res = use_pick_axe(obj);
break;
.
2c
/* hack.apply.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.bones.c ; ed hack.bones.c << '-*-END-*-'
80,81c
#ifdef WIZARD
if(!wizard) /* duvel!frans: don't remove bones while debugging */
#endif WiZARD
if(unlink(bones) < 0){
pline("Cannot unlink %s .", bones);
.
62a
otmp->known = 0;
otmp->invlet = 0;
if(otmp->olet == AMULET_SYM && !otmp->spe) {
otmp->spe = -1; /* no longer the actual amulet */
otmp->cursed = 1; /* flag as gotten from a ghost */
}
}
.
61c
for(otmp = fobj; otmp; otmp = otmp->nobj) {
otmp->o_id = 0;
/* otmp->o_cnt_id = 0; - superfluous */
.
51a
mtmp->m_id = 0;
.
35,36d
31d
18c
if(dlevel <= 0 || dlevel > MAXLEVEL) return;
.
2c
/* hack.bones.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.c ; ed hack.c << '-*-END-*-'
792a
}
long
newuexp()
{
return(10*(1L << (u.ulevel-1)));
.
774,777c
register int carrcap;
if(Levitation) /* pugh@cornell */
carrcap = MAX_CARR_CAP;
else {
carrcap = 5*(((u.ustr > 18) ? 20 : u.ustr) + u.ulevel);
if(carrcap > MAX_CARR_CAP) carrcap = MAX_CARR_CAP;
if(Wounded_legs & LEFT_SIDE) carrcap -= 10;
if(Wounded_legs & RIGHT_SIDE) carrcap -= 10;
}
.
767c
u.uexp = newuexp();
.
758a
extern long newuexp();
.
632,637d
571a
!mtmp->mfroz && !mtmp->msleep && /* aplvax!jcn */
.
519c
if(x == u.ux+u.dx && y == u.uy+u.dy) goto stop;
.
450c
if(Invisible) newsym(u.ux,u.uy);
.
403,406d
371a
/* do not pick up uchain */
if(Punished && obj == uchain)
continue;
.
360c
if(obj->ox == u.ux && obj->oy == u.uy)
if(!Punished || obj != uchain)
ct++;
.
352c
if(Invisible) newsym(u.ux,u.uy);
.
260,266c
if(tmpr->typ == POOL && !Levitation)
drown(); /* not necessarily fatal */
.
195c
if(Invisible) newsym(u.ux+u.dx, u.uy+u.dy);
.
86,87c
u_wipe_engr(rnd(5));
.
2c
/* hack.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.cmd.c ; ed hack.cmd.c << '-*-END-*-'
180c
pline("Unknown command '%s'.", expcmd);
.
160c
res = (*(tlist->f_funct))();
.
85a
"pray", dopray,
.
12c
doup(), dodown(), done1(), donull(), dothrow(), doextcmd(), dodip(), dopray();
.
2c
/* hack.cmd.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.do.c ; ed hack.do.c << '-*-END-*-'
451a
}
set_wounded_legs(side, timex)
register long side;
register int timex;
{
if(!Wounded_legs || (Wounded_legs & TIMEOUT))
Wounded_legs |= side + timex;
else
Wounded_legs |= side;
}
heal_legs()
{
if(Wounded_legs) {
if((Wounded_legs & BOTH_SIDES) == BOTH_SIDES)
pline("Your legs feel somewhat better.");
else
pline("Your leg feels somewhat better.");
Wounded_legs = 0;
}
.
407c
set_wounded_legs(side, 500+rn2(1000));
.
374a
if(u.uluck > LUCKMAX) /* dan@ut-ngp */
u.uluck = LUCKMAX;
.
257c
pline("Your weapon is welded to your hand.");
.
254a
u_wipe_engr(2);
.
252c
pline("You can't throw something you are wearing.");
.
239a
dopray() {
nomovemsg = "You finished your prayer.";
nomul(-3);
return(1);
}
.
194c
pline("... and are hit by the iron ball.");
.
190c
pline("You fall down the stairs."); /* %% */
.
182,183c
if(Punished && !Levitation){
pline("With great effort you climb the stairs.");
.
166c
pline("Cannot open %s .", lock);
.
123a
if(newlevel > MAXLEVEL) newlevel = MAXLEVEL; /* strange ... */
.
107c
if(!Levitation && inv_weight() + 5 > 0) {
.
68c
if(Invisible) newsym(u.ux,u.uy);
.
30c
if(Invisible) newsym(u.ux, u.uy);
.
12a
extern char *nomovemsg;
.
2c
/* hack.do.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.do_name.c ; ed hack.do_name.c << '-*-END-*-'
181,182c
"adri", "andries", "andreas", "bert", "david", "dirk", "emile",
"frans", "fred", "greg", "hether", "jay", "john", "jon", "kay",
"kenny", "maud", "michiel", "mike", "peter", "robert", "ron",
.
31c
pline("Unknown direction: '%s' (%s).",
.
2c
/* hack.do_name.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.do_wear.c ; ed hack.do_wear.c << '-*-END-*-'
250d
229a
case RIN_FIRE_RESISTANCE:
/* Bad luck if the player is in hell... --jgm */
if (!Fire_resistance && dlevel >= 30) {
pline("The flames of Hell burn you to a crisp.");
killer = "stupidity in hell";
done("burned");
}
break;
.
173a
if(otmp == uwep && uwep->cursed) {
pline("%s is welded to your hand.", Doname(uwep));
return(0);
}
.
141a
if(otmp == uwep && uwep->cursed) {
if(!err++)
pline("%s is welded to your hand.", Doname(uwep));
}
.
54a
case '?':
(void) doprring();
/* might look at morc here %% */
.
45c
pline("What ring, Right or Left? [ rl?]");
.
28a
if( otmp == uarmg && uwep && uwep->cursed ) { /* myers@uwmacc */
pline("You seem not able to take off the gloves while holding your weapon.");
return(0);
}
.
7a
extern char *Doname();
.
2c
/* hack.do_wear.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.dog.c ; ed hack.dog.c << '-*-END-*-'
387c
mtmp->isshk || mtmp->isgd || index(" &@12", mtmp->data->mlet))
.
304,305c
if(edog->hungrytime < moves)
edog->hungrytime = moves;
edog->hungrytime +=
5*obj->quan * objects[obj->otyp].nutrition;
.
152a
edog->dropdist = udist; /* hpscdi!jon */
edog->droptime = moves;
.
145a
/* maybe we tamed him while being swallowed --jgm */
if(!udist) return(0);
.
138c
pline("You have a sad feeling for a moment, then it passes.");
.
136c
pline("%s dies from hunger.", Monnam(mtmp));
.
131c
pline("%s is confused from hunger.", Monnam(mtmp));
.
57c
if(dist(mtmp->mx,mtmp->my) < 3 && follower(mtmp)
&& !mtmp->msleep && !mtmp->mfroz) {
.
36a
/* they will appear on the next level @ goes to, even if he goes up! */
.
2c
/* hack.dog.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.eat.c ; ed hack.eat.c << '-*-END-*-'
419a
/* NOTREACHED */
case 'a':
if(Stoned) {
pline("What a pity - you just destroyed a future piece of art!");
tp++;
Stoned = 0;
}
break;
.
390,392c
if(!Invis) {
Invis = 50+rn2(100);
if(!See_invisible)
newsym(u.ux, u.uy);
} else {
Invis |= INTRINSIC;
See_invisible |= INTRINSIC;
}
.
350c
if(let != 'a' && moves > otmp->age + 50 + rn2(100)) {
.
257,259c
if(moves % 2) {
if(Regeneration) u.uhunger--;
if(Hunger) u.uhunger--;
/* a3: if(Hunger & LEFT_RING) u.uhunger--;
if(Hunger & RIGHT_RING) u.uhunger--;
etc. */
}
if(moves % 20 == 0) { /* jimt@asgb */
if(uleft) u.uhunger--;
if(uright) u.uhunger--;
}
.
237,238c
if(u.uhp > u.uhpmax) {
if(!rn2(17)) u.uhpmax++;
u.uhp = u.uhpmax;
}
heal_legs();
.
206a
if(Sick) {
Sick = 0; /* David Neves */
pline("What a relief!");
}
.
133c
pline("Using your %s you try to open the tin.",
.
107,108c
otmp = addinv(otmp);
addtobill(otmp);
.
10c
extern struct obj *splitobj(), *addinv();
.
2c
/* hack.eat.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.end.c ; ed hack.end.c << '-*-END-*-'
582a
outwithit:
.
575a
#ifdef PERS_IS_UID
if(!playerct && t1->uid == uid)
goto outwithit;
else
#endif PERS_IS_UID
.
567c
printf("Call is: %s -s [playernames]\n", hname);
}
.
564,565c
if(playerct < 1) printf("you.\n");
else {
if(playerct > 1) printf("any of ");
for(i=0; i<playerct; i++)
.
548a
#ifdef PERS_IS_UID
if(!playerct && t1->uid == uid)
flg++;
else
#endif PERS_IS_UID
.
533a
#endif PERS_IS_UID
.
528a
#ifdef PERS_IS_UID
uid = getuid();
playerct = 0;
#else
.
512a
#ifdef PERS_IS_UID
int uid = -1;
#else
char *player0;
#endif PERS_IS_UID
.
498d
463,464d
459c
for(x = maxdlevel; x >= 0; x--) {
.
396,397c
if(!strncmp(t1->death,"quit",4)) {
quit = TRUE;
if(t1->maxhp < 3*t1->hp && t1->maxlvl < 4)
Sprintf(eos(linebuf), "cravenly gave up");
else
Sprintf(eos(linebuf), "quit");
}
.
94,95c
#ifdef WIZARD
if(!wizard)
#endif WIZARD
savebones();
.
69a
if(u.uhpmax < 0) u.uhpmax = 100; /* arbitrary */
.
2c
/* hack.end.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.engrave.c ; ed hack.engrave.c << '-*-END-*-'
197c
case ENGRAVE: /* here otmp != 0 */
.
148a
if(!otmp)
type = DUST;
else
.
145,146c
if(uwep && uwep->cursed) {
/* Andreas Bormann */
pline("Since your weapon is welded to your hand,");
pline("you use the %s.", aobjnam(uwep, (char *) 0));
otmp = uwep;
} else {
if(!otmp)
pline("You are now empty-handed.");
else if(otmp->cursed)
pline("The %s %s to your hand!",
aobjnam(otmp, "weld"),
(otmp->quan == 1) ? "itself" : "themselves");
else
pline("You now wield %s.", doname(otmp));
setuwep(otmp);
}
.
143a
/* first wield otmp */
.
134,140c
if(otmp == &zeroobj)
otmp = 0;
if(otmp->otyp == WAN_FIRE && otmp->spe) {
.
49a
u_wipe_engr(cnt)
register int cnt;
{
if(!u.uswallow && !Levitation)
wipe_engr_at(u.ux, u.uy, cnt);
}
.
2c
/* hack.engrave.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.fight.c ; ed hack.fight.c << '-*-END-*-'
347c
if(!rn2(500)) if((int)u.uluck > LUCKMIN) u.uluck--;
.
340c
if(malive && mdat->mlet == 'E' && canseemon(mtmp)
.
252a
u_wipe_engr(3); /* andrew@orca: prevent unlimited pick-axe attacks */
.
231c
if(u.umconf && !thrown) {
.
228,229d
223,226c
if(!hittxt) {
if(thrown)
/* this assumes that we cannot throw plural things */
hit( xname(obj) /* or: objects[obj->otyp].oc_name */,
mon, exclam(tmp) );
else if(Blind)
pline("You hit it.");
else
pline("You hit %s%s", monnam(mon), exclam(tmp));
.
183a
hittxt = TRUE;
.
180c
pline("You hit %s with the cockatrice corpse.",
.
140c
pline("You hit the cockatrice with your bare hands.");
.
135a
boolean hittxt = FALSE;
.
2c
/* hack.fight.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.h ; ed hack.h << '-*-END-*-'
159a
#define MAXLEVEL 40
.
115c
struct prop uprops[LAST_RING+10];
.
111a
#define STONED (LAST_RING+9) /* not a ring */
#define Stoned u.uprops[STONED].p_flgs
.
101a
#define Invisible (Invis && !See_invisible)
.
82c
unsigned ulevel:4; /* 1 - 14 */
.
78a
#define LUCKMAX 10 /* on moonlit nights 11 */
#define LUCKMIN (-10)
.
42,44d
2c
/* hack.h - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.invent.c ; ed hack.invent.c << '-*-END-*-'
686,687c
(index("%*?!", obj->olet) ||
(obj->known == otmp->known &&
(obj->olet == WEAPON_SYM && obj->otyp < BOOMERANG)))) {
.
682,684c
if(obj->otyp == otmp->otyp &&
obj->unpaid == otmp->unpaid &&
obj->spe == otmp->spe &&
obj->dknown == otmp->dknown &&
.
637d
631a
.
628a
if(Blind) {
pline("You try to feel what is lying here on the floor.");
if(Levitation) { /* ab@unido */
pline("You cannot reach the floor!");
return(1);
}
}
.
607,610c
if(!flags.invlet_constant) if(++ilet > 'z') ilet = 'A';
.
604a
if(flags.invlet_constant) ilet = otmp->invlet;
.
542c
if(!flags.invlet_constant) if(++ilet > 'z') ilet = 'A';
.
539,540c
cornline(1, xprname(otmp, ilet));
any[ct++] = ilet;
.
537a
if(flags.invlet_constant) ilet = otmp->invlet;
.
508c
(void) sprintf(li, "%c - %s.",
flags.invlet_constant ? obj->invlet : let,
doname(obj));
.
492c
return(otmp ? ilet : NOINVSYM);
.
489a
if(flags.invlet_constant)
return(obj->invlet);
ilet = 'a';
.
488c
register char ilet;
.
484c
obj_to_let(obj) /* should of course only be called for things in invent */
.
333,335c
if(flags.invlet_constant) {
for(otmp = invent; otmp; otmp = otmp->nobj)
if(otmp->invlet == ilet) break;
} else {
if(ilet >= 'A' && ilet <= 'Z') ilet += 'z'-'A'+1;
ilet -= 'a';
for(otmp = invent; otmp && ilet;
ilet--, otmp = otmp->nobj) ;
}
.
265c
}
if(ilet == 'z') ilet = 'A'; else ilet++;
.
252,263c
if(!*let || index(let, otmp->olet)) {
bp[foo++] = flags.invlet_constant ? otmp->invlet : ilet;
/* ugly check: remove inappropriate things */
if((!strcmp(word, "take off") &&
!(otmp->owornmask & (W_ARMOR - W_ARM2)))
|| (!strcmp(word, "wear") &&
(otmp->owornmask & (W_ARMOR | W_RING)))
|| (!strcmp(word, "wield") &&
(otmp->owornmask & W_WEP))) {
foo--;
foox++;
.
248c
if(bp > buf && bp[-1] == '-') *bp++ = ' ';
.
220,224c
/*
* getobj returns:
* struct obj *xxx: object to do something with.
* (struct obj *) 0 error return: no object.
* &zeroobj explicitly no object (as in w-).
*/
.
48c
if(obj == invent)
invent = invent->nobj;
.
46c
freeinv(obj)
register struct obj *obj;
{
.
29a
if(flags.invlet_constant) {
assigninvlet(obj);
/*
* The ordering of the chain is nowhere significant
* so in case you prefer some other order than the
* historical one, change the code below.
*/
if(otmp) { /* find proper place in chain */
otmp->nobj = 0;
if((invent->invlet ^ 040) > (obj->invlet ^ 040)) {
obj->nobj = invent;
invent = obj;
} else
for(otmp = invent; ; otmp = otmp->nobj) {
if(!otmp->nobj ||
(otmp->nobj->invlet ^ 040) > (obj->invlet ^ 040)){
obj->nobj = otmp->nobj;
otmp->nobj = obj;
break;
}
}
}
}
.
28d
24,25c
break;
.
20,21c
/* merge or attach to end of chain */
if(!invent) {
invent = obj;
otmp = 0;
} else
for(otmp = invent; /* otmp */; otmp = otmp->nobj) {
if(merged(otmp, obj, 0))
return(otmp);
.
18c
addinv(obj)
register struct obj *obj;
{
.
16a
#define NOINVSYM '#'
static int lastinvnr = 51; /* 0 ... 51 */
static
assigninvlet(otmp)
register struct obj *otmp;
{
boolean inuse[52];
register int i;
register struct obj *obj;
for(i = 0; i < 52; i++) inuse[i] = FALSE;
for(obj = invent; obj; obj = obj->nobj) if(obj != otmp) {
i = obj->invlet;
if('a' <= i && i <= 'z') inuse[i - 'a'] = TRUE; else
if('A' <= i && i <= 'Z') inuse[i - 'A' + 26] = TRUE;
if(i == otmp->invlet) otmp->invlet = 0;
}
if((i = otmp->invlet) &&
(('a' <= i && i <= 'z') || ('A' <= i && i <= 'Z')))
return;
for(i = lastinvnr+1; i != lastinvnr; i++) {
if(i == 52) { i = -1; continue; }
if(!inuse[i]) break;
}
otmp->invlet = (inuse[i] ? NOINVSYM :
(i < 26) ? ('a'+i) : ('A'+i-26));
lastinvnr = i;
}
.
13d
10a
.
2c
/* hack.invent.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.lev.c ; ed hack.lev.c << '-*-END-*-'
265,266c
pline("Read %d instead of %u bytes.\n", rlen, len);
if(restoring) {
(void) unlink(SAVEF);
error("Error restoring old game.");
}
panic("Error reading level file.");
.
262c
register int rlen;
extern boolean restoring;
.
34c
if(lev >= 0 && lev <= MAXLEVEL)
.
21,22c
boolean level_exists[MAXLEVEL+1];
.
10a
extern char SAVEF[];
.
2c
/* hack.lev.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.main.c ; ed hack.main.c << '-*-END-*-'
493c
pline("Program in disorder - perhaps you'd better Quit.");
.
456,460c
while(*tf && *tf != '.') tf++;
(void) sprintf(tf, ".%d", foo);
.
402,448d
240a
regularize(SAVEF+5); /* avoid . or / in name */
.
208c
getlock(); /* sets lock if locknum != 0 */
.
32d
27c
int locknum; /* max num of players */
.
25d
6d
2c
/* hack.main.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.mhitu.c ; ed hack.mhitu.c << '-*-END-*-'
340c
if((Invis && mtmp->data->mlet != 'I') || !mtmp->mcansee) tmp -= 2;
.
317a
nomul(0);
.
291c
set_wounded_legs(side, rnd(50));
.
208c
if(hitu(mtmp,rnd(6)) && tmp && /* hits with both paws */
.
154c
if(ctmp && multi >= 0 && !rn2(3)) {
.
115,116c
Stoned = 5;
/* pline("You get turned to stone!"); */
/* done_in_by(mtmp); */
.
104a
}
.
102a
if(Poison_resistance)
pline("The sting doesn't seem to affect you.");
else {
.
52a
if(mdat->mlet == 'c' && Stoned)
return(0);
.
29c
/* "notreached": not return(1); */
.
2c
/* hack.mhitu.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.mklev.c ; ed hack.mklev.c << '-*-END-*-'
650,651c
mksobj_at(SCR_TELEPORTATION, xx, yy+dy);
if(!rn2(3)) (void) mkobj_at(0, xx, yy+dy);
.
648c
dosdoor(xx, yy, aroom, rn2(5) ? SDOOR : DOOR);
.
643c
dosdoor(xx, yy, aroom, SDOOR);
.
641c
make_engr_at(xx, yy-dy, "ad ae?ar um");
.
601c
register int ct = rnd(nroom/2 + 1);
.
380c
pline("Strange area [%d,%d] in maker().",x,y);
.
346c
levl[x][y].scrsym = '+';
.
343a
if(!IS_WALL(levl[x][y].typ)) /* avoid SDOORs with '+' as scrsym */
type = DOOR;
.
309c
/* see whether it is allowable to create a door at [x,y] */
.
49a
oinit(); /* assign level dependent obj probabilities */
.
2c
/* hack.mklev.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.mkobj.c ; ed hack.mkobj.c << '-*-END-*-'
2c
/* hack.mkobj.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.mkshop.c ; ed hack.mkshop.c << '-*-END-*-'
90c
pline("Room at (%d,%d),(%d,%d).", sroom->lx, sroom->ly,
.
2c
/* hack.mkshop.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.mon.c ; ed hack.mon.c << '-*-END-*-'
726c
if(cansee(x,y))
atl(x,y,obj2->olet);
.
720c
if(!letter(tmp) || (!index("mw", tmp) && !rn2(3))) tmp = 0;
.
695c
while(u.ulevel < 14 && u.uexp >= newuexp()){
.
662a
if((int)u.uluck < LUCKMIN) u.uluck = LUCKMIN;
.
634,635c
register int tmp,tmp2,nk,x,y;
register struct permonst *mdat = mtmp->data;
extern long newuexp();
.
579a
if(u.ustuck == mtmp) u.ustuck = mtmp2;
.
283a
not_special:
.
239a
#ifndef NOWORM
if(mtmp->wormno)
goto not_special;
#endif NOWORM
.
231a
if(mtmp->mfroz || mtmp->msleep)
return(0);
.
207,210c
if(!index("Ea", mdat->mlet) && nearby &&
!mtmp->mpeaceful && u.uhp > 0 && !scared) {
.
198d
195a
(mtmp->minvis && !rn2(3)) ||
.
194c
/* fleeing monsters might regain courage */
if(mtmp->mflee && !mtmp->mfleetim
&& mtmp->mhp == mtmp->mhpmax && !rn2(25))
mtmp->mflee = 0;
nearby = (dist(mtmp->mx, mtmp->my) < 3);
scared = (nearby && (sengr_at("Elbereth", u.ux, u.uy) ||
sobj_at(SCR_SCARE_MONSTER, u.ux, u.uy)));
if(scared && !mtmp->mflee) {
mtmp->mflee = 1;
mtmp->mfleetim = (rn2(7) ? rnd(10) : rnd(100));
}
if(!nearby ||
mtmp->mflee ||
.
154c
register tmp, nearby, scared;
.
130a
/* flags.botlx = 1; /* should we show status line ? */
.
2c
/* hack.mon.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.o_init.c ; ed hack.o_init.c << '-*-END-*-'
80a
}
setgemprobs()
{
register int j,first;
extern xchar dlevel;
first = bases[letindex(GEM_SYM)];
for(j = 0; j < 9-dlevel/3; j++)
objects[first+j].oc_prob = 0;
first += j;
if(first >= LAST_GEM || first >= SIZE(objects) ||
objects[first].oc_olet != GEM_SYM ||
objects[first].oc_name == NULL)
printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n",
first, j, LAST_GEM);
for(j = first; j < LAST_GEM; j++)
objects[j].oc_prob = (20+j-first)/(LAST_GEM-first);
}
oinit() /* level dependent initialization */
{
setgemprobs();
.
47a
if(let == GEM_SYM)
setgemprobs();
check:
.
35,46d
2c
/* hack.o_init.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.options.c ; ed hack.options.c << '-*-END-*-'
75a
return;
}
if(!strncmp(opts,"fixinv",4)) {
if(from_env)
flags.invlet_constant = !negated;
else
pline("The fixinvlet option must be in HACKOPTIONS.");
.
15a
flags.invlet_constant = TRUE;
.
2c
/* hack.options.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.pager.c ; ed hack.pager.c << '-*-END-*-'
351a
#endif NOWAITINCLUDE
.
346a
#ifdef NOWAITINCLUDE
union wait { /* used only for the cast (union wait *) 0 */
int w_status;
struct {
unsigned short w_Termsig:7;
unsigned short w_Coredump:1;
unsigned short w_Retcode:8;
} w_T;
};
#else
.
297c
extern char *catmore;
.
226a
if(flags.toplin == 1) more(); /* ab@unido */
remember_topl();
.
46a
(void) fclose(fp); /* kopper@psuvax1 */
.
45a
return(0);
}
.
44c
if(readchar() == 'y') {
.
41c
pline(buf);
.
2c
/* hack.pager.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.potion.c ; ed hack.potion.c << '-*-END-*-'
364a
}
ghost_from_bottle(){
extern struct permonst pm_ghost;
register struct monst *mtmp;
if(!(mtmp = makemon(PM_GHOST,u.ux,u.uy))){
pline("This bottle turns out to be empty.");
return;
}
mnexto(mtmp);
pline("As you open the bottle, an enormous ghost emerges!");
pline("You are frightened to death, and unable to move.");
nomul(-3);
.
361c
if(obj->spe < 7) obj->spe++; /* %% */
.
233a
/* perhaps 'E' and 'a' have no head? */
.
197,198c
if(u.ulevel < 14) {
extern long newuexp();
u.uexp = newuexp()+1;
pline("Welcome to experience level %u.", ++u.ulevel);
}
.
184a
use_it:
.
128,132c
heal_legs();
.
109c
losehp(rnd(10), "contaminated potion");
.
38c
if(Invis || See_invisible)
.
15a
if(!strcmp(objects[otmp->otyp].oc_descr, "smoky") && !rn2(13)) {
ghost_from_bottle();
goto use_it;
}
.
7a
extern struct monst *makemon();
.
2c
/* hack.potion.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.pri.c ; ed hack.pri.c << '-*-END-*-'
462,468c
vism_at(x,y)
register x,y;
{
register struct monst *mtmp;
return((x == u.ux && y == u.uy && !Invisible)
? 1 :
(mtmp = m_at(x,y))
? ((Blind && Telepat) || canseemon(mtmp)) :
0);
.
389,392c
if(!vism_at(x,y)) {
.
385d
289c
if(x == u.ux && y == u.uy && (!Invisible)) {
.
264c
if(Invisible) {
.
260c
if(u.udispl && (Invisible || u.udisx != u.ux || u.udisy != u.uy))
.
229a
seemons(); /* reset old positions */
for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
if(mtmp->mx >= xmin && mtmp->my < ymax)
mtmp->mdispl = 0;
seemons(); /* force new positions to be shown */
.
225a
register struct monst *mtmp;
.
204,207c
mtmp->mdispl = 0;
seemons(); /* force new positions to be shown */
/* This nonsense should disappear soon --------------------------------- */
.
200,202c
seemons(); /* reset old positions */
.
194c
/* Some ridiculous code to get display of @ and monsters (almost) right */
if(!Invisible) {
.
187a
register struct monst *mtmp;
.
175c
if(!Invisible) at(u.ux,u.uy,u.usym);
.
2c
/* hack.pri.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.read.c ; ed hack.read.c << '-*-END-*-'
517a
}
/* Test whether we may genocide all monsters with symbol ch */
monstersym(ch) /* arnold@ucsfcgl */
register char ch;
{
register struct permonst *mp;
extern struct permonst pm_eel;
/*
* can't genocide certain monsters
*/
if (index("12 &:", ch))
return FALSE;
if (ch == pm_eel.mlet)
return TRUE;
for (mp = mons; mp < &mons[CMNUM+2]; mp++)
if (mp->mlet == ch)
return TRUE;
return FALSE;
.
467c
pline("Nothing Happens.");
.
192c
} while(strlen(buf) != 1 || !monstersym(*buf));
.
2c
/* hack.read.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.rumors.c ; ed hack.rumors.c << '-*-END-*-'
5,6c
#include "hack.h" /* for RUMORFILE and BSD (index) */
#define CHARSZ 8 /* number of bits in a char */
.
2c
/* hack.rumors.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.save.c ; ed hack.save.c << '-*-END-*-'
216a
if(!mtmp->m_id)
mtmp->m_id = flags.ident++;
.
182a
if(!otmp->o_id) otmp->o_id = flags.ident++;
.
161a
restoring = FALSE;
.
106a
restoring = FALSE;
.
94a
restoring = TRUE;
.
93a
extern boolean restoring;
.
80,83c
glo(dlevel);
(void) unlink(lock); /* get rid of current level --jgm */
glo(0);
(void) unlink(lock);
.
42a
if(flags.moonphase == FULL_MOON) /* ut-sally!fletcher */
u.uluck--; /* and unido!ab */
.
40a
(void) unlink(SAVEF); /* ab@unido */
.
2c
/* hack.save.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.search.c ; ed hack.search.c << '-*-END-*-'
96,97c
doidtrap() {
.
56a
if(u.uswallow)
pline("What are you looking for? The exit?");
else
.
2c
/* hack.search.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.shk.c ; ed hack.shk.c << '-*-END-*-'
920a
}
/* He is digging in the shop. */
shopdig(fall)
register int fall;
{
if(!fall) {
if(u.utraptype == TT_PIT)
pline("\"Be careful, sir, or you might fall through the floor.\"");
else
pline("\"Please, do not damage the floor here.\"");
} else if(dist(shopkeeper->mx, shopkeeper->my) < 3) {
register struct obj *obj, *obj2;
pline("%s grabs your backpack!", shkname(shopkeeper));
for(obj = invent; obj; obj = obj2) {
obj2 = obj->nobj;
if(obj->owornmask) continue;
freeinv(obj);
obj->nobj = shopkeeper->minvent;
shopkeeper->minvent = obj;
if(obj->unpaid)
subfrombill(obj);
}
}
.
797c
if(ESHK(shkp)->following || ((z = holetime()) >= 0 && z*z <= udist)){
.
756a
int z;
.
694,695c
ac = ARM_BONUS(obj);
if(ac <= -10) /* probably impossible */
ac = -9;
tmp = 100 + ac*ac*rnd(10+ac);
.
663c
register int tmp, ac;
.
649a
}
.
643a
obj->quan = oquan; /* restore value */
.
642a
obj->quan = uquan; /* cheat doname */
.
635,641c
oquan = obj->quan;
uquan = (bp->useup ? bp->bquan : bp->bquan - oquan);
thisused = bp->price * uquan;
.
631,633c
for(bp = bill; bp - bill < ESHK(shopkeeper)->billct; bp++) {
obj = bp_to_obj(bp);
if(!obj) {
impossible("Bad shopkeeper administration.");
goto quit;
}
if(bp->useup || bp->bquan > obj->quan) {
register int cnt, oquan, uquan;
.
615,616c
for(bp = bill; bp - bill < ESHK(shopkeeper)->billct; bp++)
if(bp->useup ||
((obj = bp_to_obj(bp)) && obj->quan < bp->bquan))
.
606c
register struct bill_x *bp;
.
496c
) return;
.
493,494c
if(!inshop() ||
(u.ux == ESHK(shopkeeper)->shk.x && u.uy == ESHK(shopkeeper)->shk.y) ||
(u.ux == ESHK(shopkeeper)->shd.x && u.uy == ESHK(shopkeeper)->shd.y) ||
.
489a
/* find obj on one of the lists */
struct obj *
bp_to_obj(bp)
register struct bill_x *bp;
{
register struct obj *obj;
register struct monst *mtmp;
register unsigned id = bp->bo_id;
if(bp->useup)
obj = o_on(id, billobjs);
else if(!(obj = o_on(id, invent)) &&
!(obj = o_on(id, fobj)) &&
!(obj = o_on(id, fcobj))) {
for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
if(obj = o_on(id, mtmp->minvent))
break;
for(mtmp = fallen_down; mtmp; mtmp = mtmp->nmon)
if(obj = o_on(id, mtmp->minvent))
break;
}
return(obj);
}
.
473c
if(shlevel == dlevel && shopkeeper && ESHK(shopkeeper)->billct){
.
464c
else pline("Error in shopkeeper administration.");
.
422,434c
obj = bp_to_obj(bp);
.
381c
if(strncmp(ESHK(shkp)->customer, plname, PL_NSIZ)
|| rn2(3)){
.
236c
/* billobjs = 0; -- this is wrong if we save in a shop */
/* (and it is harmless to have too many things in billobjs) */
.
189a
.
186a
} else if(inroom(shopkeeper->mx, shopkeeper->my) != roomno) {
u.uinshop = 0;
.
35c
extern struct obj *o_on(), *bp_to_obj();
.
2c
/* hack.shk.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.steal.c ; ed hack.steal.c << '-*-END-*-'
18c
if(Invisible) newsym(u.ux, u.uy);
.
2c
/* hack.steal.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.termcap.c ; ed hack.termcap.c << '-*-END-*-'
261c
curs(cx, cy);
.
241c
cmov(curx, cury);
.
234a
/* cbosgd!cbcephus!pds for SYS V R2 */
/* is this terminfo, or what? */
/* tputs("$<50>", 1, xputc); */
.
199c
curs(1, 1); /* using UP ... */
.
197c
xputs(tgoto(CM, 0, 0));
.
183c
curs(cx, cy);
.
164c
(void) fputc(c, stdout);
.
158c
xputs(tgoto(CM, x-1, y-1));
.
155,156c
cmov(x, y)
register x, y;
.
142a
if(!ND) cmov(x, y); else /* bah */
/* should instead print what is there already */
.
133c
cmov(x, y);
.
124c
curs(x, y);
.
121c
cmov(x, y);
.
112c
nocmov(x, y)
.
109c
cmov(x, y);
.
107c
nocmov(x, y);
.
105c
nocmov(x, y);
.
101c
nocmov(x, y);
.
99a
if(!ND && (curx != x || x <= 3)) { /* Extremely primitive */
cmov(x, y); /* bunker!wtm */
return;
}
.
93,94c
curs(x, y)
register int x, y; /* not xchar: perhaps xchar is unsigned and
.
72c
CD = tgetstr("cd", &tbufptr);
.
68,69c
SO = tgetstr("so", &tbufptr);
SE = tgetstr("se", &tbufptr);
.
61,62c
XD = tgetstr("xd", &tbufptr);
/* not: XD = tgetstr("do", &tbufptr); */
if(!(CM = tgetstr("cm", &tbufptr))) {
.
51,56c
if(!(CL = tgetstr("cl", &tbufptr)))
error("Hack needs CL.");
ND = tgetstr("nd", &tbufptr);
if(tgetflag("os"))
error("Hack can't have OS.");
CE = tgetstr("ce", &tbufptr);
UP = tgetstr("up", &tbufptr);
.
39c
if(!(BC = tgetstr("bc", &tbufptr))) {
.
37c
if(pc = tgetstr("pc", &tbufptr))
.
35c
if(tgetent(tptr, term) < 1)
.
33c
if(!strncmp(term, "5620", 4))
.
2c
/* hack.termcap.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.timeout.c ; ed hack.timeout.c << '-*-END-*-'
31a
}
/* He is being petrified - dialogue by inmet!tower */
char *stoned_texts[] = {
"You are slowing down.", /* 5 */
"Your limbs are stiffening.", /* 4 */
"Your limbs have turned to stone.", /* 3 */
"You have turned to stone.", /* 2 */
"You are a statue." /* 1 */
};
stoned_dialogue()
{
register long i = (Stoned & TIMEOUT);
if(i > 0 && i <= SIZE(stoned_texts))
pline(stoned_texts[SIZE(stoned_texts) - i]);
if(i == 5)
Fast = 0;
if(i == 3)
nomul(-3);
.
29a
break;
case WOUNDED_LEGS:
heal_legs();
break;
.
24c
pline("You can see again.");
.
21c
pline("You feel less confused now.");
.
18c
pline("You feel yourself slowing down.");
.
16c
break;
.
13c
pline("You die because of food poisoning.");
.
11a
case STONED:
killer = "cockatrice";
done("died");
break;
.
7a
if(Stoned) stoned_dialogue();
.
2c
/* hack.timeout.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.trap.c ; ed hack.trap.c << '-*-END-*-'
418,420c
goto_level(newlevel, FALSE); /* calls done("escaped") if newlevel==0 */
}
drown()
{
pline("You fall into a pool!");
pline("You can't swim!");
if(rn2(3) < u.uluck+2) {
/* most scrolls become unreadable */
register struct obj *obj;
for(obj = invent; obj; obj = obj->nobj)
if(obj->olet == SCROLL_SYM && rn2(12) > u.uluck)
obj->otyp = SCR_BLANK_PAPER;
/* we should perhaps merge these scrolls ? */
pline("You attempt a teleport spell."); /* utcsri!carroll */
(void) dotele();
if(levl[u.ux][u.uy].typ != POOL) return;
}
pline("You drown ...");
killer = "pool of water";
done("drowned");
.
393c
if(newlevel > MAXLEVEL) newlevel = MAXLEVEL;
.
385c
} while(!digit(buf[0]) && (buf[0] != '-' || !digit(buf[1])));
.
375,376d
315a
if(levl[nux][nuy].typ == POOL && !Levitation)
drown();
.
165c
/* there should be a mtmp/data -> floating */
if(!index("EywBfk'& ", mtmp->data->mlet)) { /* ab */
.
82c
losehp(uarmh ? 2 : d(2,10),"falling rock");
mksobj_at(ROCK, u.ux, u.uy);
fobj->quan = 1;
stackobj(fobj);
if(Invisible) newsym(u.ux, u.uy);
.
2c
/* hack.trap.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.tty.c ; ed hack.tty.c << '-*-END-*-'
236d
226c
noteof: ;
}
#else
end_of_input();
#endif NR_OF_EOFS
if(flags.toplin == 1)
flags.toplin = 2;
.
224a
#ifdef NR_OF_EOFS
{ /*
* Some SYSV systems seem to return EOFs for various reasons
* (?like when one hits break or for interrupted systemcalls?),
* and we must see several before we quit.
*/
register int cnt = NR_OF_EOFS;
while (cnt--) {
clearerr(stdin); /* omit if clearerr is undefined */
if((sym = getchar()) != EOF) goto noteof;
}
.
222a
.
203,204d
193,196c
if(!Invisible) curs_on_u(); else home();
while((foo = readchar()) >= '0' && foo <= '9')
multi = 10*multi+foo-'0';
.
181c
bell();
.
172,174c
while((c = readchar()) != '\n') {
.
169d
145,150d
139c
cgetret("");
.
132a
} else if(c == kill_char || c == '\177') { /* Robert Viduya */
/* this test last - @ might be the kill_char */
while(bufp != obufp) {
bufp--;
putstr("\b \b");
}
.
122,127c
} else if(' ' <= c && c < '\177') {
/* avoid isprint() - some people don't have it
' ' is not always a printing char */
.
89a
/* fatal error */
/*VARARGS1*/
error(s,x,y) char *s; {
if(settty_needed)
settty((char *) 0);
printf(s,x,y);
putchar('\n');
exit(1);
}
.
79,81c
if((curttyb.cbrkflgs & CBRKMASK) != cf){
curttyb.cbrkflgs &= ~CBRKMASK;
curttyb.cbrkflgs |= cf;
#ifdef USG
/* be satisfied with one character; no timeout */
curttyb.c_cc[VMIN] = 1; /* was VEOF */
curttyb.c_cc[VTIME] = 0; /* was VEOL */
#endif USG
.
74,76c
if((curttyb.echoflgs & ECHO) != ef){
curttyb.echoflgs &= ~ECHO;
/* curttyb.echoflgs |= ef; */
.
66,72d
63a
register int ef = 0; /* desired value of flags & ECHO */
register int cf = CBRKON(CBRKMASK); /* desired value of flags & CBREAK */
register int change = 0;
.
59c
if(STTY(&curttyb) < 0)
perror("Hack (setctty)");
.
51,54c
if(STTY(&inittyb) < 0)
perror("Hack (settty)");
flags.echo = (inittyb.echoflgs & ECHO) ? ON : OFF;
flags.cbreak = (CBRKON(inittyb.cbrkflgs & CBRKMASK)) ? ON : OFF;
.
35,44d
28,29c
if(curttyb.tabflgs & EXTABS) {
curttyb.tabflgs &= ~EXTABS;
.
20,24c
if(GTTY(&inittyb) < 0)
perror("Hack (gettty)");
curttyb = inittyb;
ospeed = OSPEED(inittyb);
erase_char = inittyb.erase_sym;
kill_char = inittyb.kill_sym;
.
12a
struct termstruct inittyb, curttyb;
.
11c
static char erase_char, kill_char;
.
9c
#endif USG
.
7c
#define termstruct sgttyb
#define kill_sym sg_kill
#define erase_sym sg_erase
#define EXTABS XTABS
#define tabflgs sg_flags
#define echoflgs sg_flags
#define cbrkflgs sg_flags
#define CBRKMASK CBREAK
#define CBRKON /* empty */
#define OSPEED(x) (x).sg_ospeed
#define GTTY(x) (gtty(0, x))
#define STTY(x) (stty(0, x))
.
5a
/*
* The distinctions here are not BSD - rest but rather USG - rest, as
* BSD still has the old sgttyb structure, but SYSV has termio. Thus:
*/
#ifdef BSD
#define V7
#else
#define USG
#endif BSD
/*
* Some systems may have getchar() return EOF for various reasons, and
* we should not quit before seeing at least NR_OF_EOFS consecutive EOFs.
*/
#ifndef BSD
#define NR_OF_EOFS 20
#endif BSD
#ifdef USG
#include <termio.h>
#define termstruct termio
#define kill_sym c_cc[VKILL]
#define erase_sym c_cc[VERASE]
#define EXTABS TAB3
#define tabflgs c_oflag
#define echoflgs c_lflag
#define cbrkflgs c_lflag
#define CBRKMASK ICANON
#define CBRKON ! /* reverse condition */
#define OSPEED(x) ((x).c_cflag & CBAUD)
#define GTTY(x) (ioctl(0, TCGETA, x))
#define STTY(x) (ioctl(0, TCSETA, x)) /* TCSETAF? TCSETAW? */
#else /* V7 */
.
2c
/* hack.tty.c - version 1.0.3 */
/* With thanks to the people who sent code for SYSV - hpscdi!jon,
arnold@ucsf-cgl, wcs@bo95b, cbcephus!pds and others. */
.
w
q
-*-END-*-
echo Editing hack.u_init.c ; ed hack.u_init.c << '-*-END-*-'
294a
#else
if(trop->trquan) { /* check if zero first */
--trop->trquan;
if(trop->trquan)
continue; /* make a similar object */
}
#endif PYRAMID_BUG
.
293a
#ifndef PYRAMID_BUG
.
2c
/* hack.u_init.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.unix.c ; ed hack.unix.c << '-*-END-*-'
306a
regularize(s) /* normalize file name - we don't like ..'s or /'s */
register char *s;
{
register char *lp;
while((lp = index(s, '.')) || (lp = index(s, '/')))
*lp = '_';
}
.
200c
} else if(nmstat.st_mtime > omstat.st_mtime) {
.
198c
nmstat.st_mtime = 0;
.
180c
omstat.st_mtime = 0;
.
134a
getlock()
{
extern int errno, hackpid, locknum;
register int i = 0, fd;
(void) fflush(stdout);
/* we ignore QUIT and INT at this point */
if (link(HLOCK, LLOCK) == -1) {
register int errnosv = errno;
perror(HLOCK);
printf("Cannot link %s to %s\n", LLOCK, HLOCK);
switch(errnosv) {
case ENOENT:
printf("Perhaps there is no (empty) file %s ?\n", HLOCK);
break;
case EACCES:
printf("It seems you don't have write permission here.\n");
break;
case EEXIST:
printf("(Try again or rm %s.)\n", LLOCK);
break;
default:
printf("I don't know what is wrong.");
}
getret();
error("");
/*NOTREACHED*/
}
regularize(lock);
glo(0);
if(locknum > 25) locknum = 25;
do {
if(locknum) lock[0] = 'a' + i++;
if((fd = open(lock, 0)) == -1) {
if(errno == ENOENT) goto gotlock; /* no such file */
perror(lock);
(void) unlink(LLOCK);
error("Cannot open %s", lock);
}
if(veryold(fd)) /* if true, this closes fd and unlinks lock */
goto gotlock;
(void) close(fd);
} while(i < locknum);
(void) unlink(LLOCK);
error(locknum ? "Too many hacks running now."
: "There is a game in progress under your name.");
gotlock:
fd = creat(lock, FMASK);
if(unlink(LLOCK) == -1)
error("Cannot unlink %s.", LLOCK);
if(fd == -1) {
error("cannot creat lock file.");
} else {
if(write(fd, (char *) &hackpid, sizeof(hackpid))
!= sizeof(hackpid)){
error("cannot write lock");
}
if(close(fd) == -1) {
error("cannot close lock");
}
}
}
.
133d
125c
for(i = 1; i <= MAXLEVEL; i++) { /* try to remove all */
.
123c
if(date - buf.st_mtime < 3L*24L*60L*60L) { /* recent */
extern int errno;
int lockedpid; /* should be the same size as hackpid */
if(read(fd, (char *)&lockedpid, sizeof(lockedpid)) !=
sizeof(lockedpid))
/* strange ... */
return(0);
/* From: Rick Adams <seismo!rick>
/* This will work on 4.1cbsd, 4.2bsd and system 3? & 5.
/* It will do nothing on V7 or 4.1bsd. */
if(!(kill(lockedpid, 0) == -1 && errno == ESRCH))
return(0);
}
.
115c
/* see whether we should throw away this xlock file */
.
108c
if(buf.st_mtime < hbuf.st_mtime) {
.
97,100c
/* old version - for people short of space */
/*
/* register char *np;
/* if(stat(name, &hbuf))
/* error("Cannot get status of %s.",
/* (np = rindex(name, '/')) ? np+1 : name);
/*
/* version using PATH from: seismo!gr...@ucsf-cgl.ARPA (Greg Couch) */
/*
* The problem with #include <sys/param.h> is that this include file
* does not exist on all systems, and moreover, that it sometimes includes
* <sys/types.h> again, so that the compiler sees these typedefs twice.
*/
#define MAXPATHLEN 1024
register char *np, *path;
char filename[MAXPATHLEN+1];
if (index(name, '/') != NULL || (path = getenv("PATH")) == NULL)
path = "";
for (;;) {
if ((np = index(path, ':')) == NULL)
np = path + strlen(path); /* point to end str */
if (np - path <= 1) /* %% */
(void) strcpy(filename, name);
else {
(void) strncpy(filename, path, np - path);
filename[np - path] = '/';
(void) strcpy(filename + (np - path) + 1, name);
}
if (stat(filename, &hbuf) == 0)
return;
if (*np == '\0')
break;
path = np + 1;
}
error("Cannot get status of %s.",
(np = rindex(name, '/')) ? np+1 : name);
.
71,73c
diy = lt->tm_yday;
.
61,64d
14a
#include <stdio.h>
#include <errno.h>
.
2c
/* hack.unix.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.version.c ; ed hack.version.c << '-*-END-*-'
7c
pline("%s 1.0.3 - last edit %s.", (
.
2c
/* hack.version.c - version 1.0.3 */
/* $Header: hack.version.c,v 1.5 85/05/09 00:40:41 aeb Exp $ */
.
w
q
-*-END-*-
echo Editing hack.wield.c ; ed hack.wield.c << '-*-END-*-'
85c
while(uwep) /* let all of them disappear */
/* note: uwep->quan = 1 is nogood if unpaid */
useup(uwep);
.
38,39c
if(uwep->cursed)
pline("The %s %s to your hand!",
aobjnam(uwep, "weld"),
(uwep->quan == 1) ? "itself" : "themselves"); /* a3 */
.
2c
/* hack.wield.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.wizard.c ; ed hack.wizard.c << '-*-END-*-'
24c
if(mtmp->data->mlet == '1' && mtmp->msleep && !rn2(40))
.
2c
/* hack.wizard.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing hack.zap.c ; ed hack.zap.c << '-*-END-*-'
614a
}
burn_scrolls()
{
register struct obj *obj, *obj2;
register int cnt = 0;
for(obj = invent; obj; obj = obj2) {
obj2 = obj->nobj;
if(obj->olet == SCROLL_SYM) {
cnt++;
useup(obj);
}
}
if(cnt > 1) {
pline("Your scrolls catch fire!");
losehp(cnt, "burning scrolls");
} else if(cnt) {
pline("Your scroll catches fire!");
losehp(1, "burning scroll");
}
.
485a
if(!rn2(3))
burn_scrolls();
.
203a
mksobj_at(ROCK, u.ux, u.uy);
fobj->quan = 1;
stackobj(fobj);
if(Invisible) newsym(u.ux, u.uy);
.
129c
pline("Nothing Happens.");
.
2c
/* hack.zap.c - version 1.0.3 */
.
w
q
-*-END-*-
echo Editing help ; ed help << '-*-END-*-'
125,126c
(the lower the better), your strength, experience level and the
state of your stomach.
.
114c
Usually one will not want to use the 'O' command, but instead
.
107c
rest_on_space, fixinvlet, beginner, male, female.
.
77a
\ tell what has been discovered.
.
1c
Welcome to HACK! ( description of version 1.0.3 )
.
w
q
-*-END-*-
echo Editing hh ; ed hh << '-*-END-*-'
22a
^T teleport teleport
.
20a
# introduces a long command; not really implemented
.
w
q
-*-END-*-
echo Editing rumors ; ed rumors << '-*-END-*-'
324a
Zapping a wand of undead turning might bring your dog back to life.
.
313a
You have to outwit a Sphynx or pay her.
You may get rich selling letters, but beware of being blackmailed!
.
311a
You die...
.
308a
You can get a genuine Amulet of Yendor by doing the following: -- more --
You can't get rid of a cursed plate mail with a can-opener.
.
303a
Wishing too much may bring you too little.
.
299a
Who should ever have thought one could live from eating fog clouds?
Why a "2" for the postman? Well, how many times does he ring?
Why should one ever throw an egg to a cockatrice?
.
297a
When you have a key, you don't have to wait for the guard.
When you have seen one killer bee, you have seen them all.
When your dog follows you through a trap door, don't hit it!
.
293c
What do you think would be the use of a two handed sword called "Orcrist" ?
.
291a
What a pity, you cannot read it!
.
289a
Want a hint? Zap a wand of make invisible on your weapon!
Want fun? Throw a potion in a pool and go swimming!
Want to conserve your dead corpses? Go to the tin factory!
Wanted: shopkeepers. Send a scroll of mail to: Mage of Yendor/Level 35/Dungeon.
Warning: end of file 'fortunes' reached.
Warning: people who eat dragons can go to hell!!
.
286a
Vault guards never disturb their Lords.
.
283a
Ulch, that meat was painted.
.
278a
To reach heaven, escape the dungeon while wearing a ring of levitation.
.
273a
This dungeon is restroom equipped (for your convenience).
This fortune cookie is property of Fortune Cookies, Inc.
This is not a fortune.
.
270a
They say that you can't take your pick-axe into a shop.
.
265a
They say that the walls in shops are made of extra hard material.
.
245a
They say a gelatinous cube can paralyse you...
They say that Elven cloaks absorb enchantments.
.
244a
There is nothing like eating a Mimic.
.
234a
There are better information sources than fortune cookies.
.
232a
The proof of the quivering blob is in the eating thereof.
.
231a
The moon is not the only heavenly body to influence this game.
.
230a
The key to this game is that there are no keys.
.
224a
The "pray" command is not yet implemented.
.
223a
Taming a postman may cause a system security violation.
Taming is a gradual process of excercising and rewarding.
Telepathy is just a trick: once you know how to do it, it's easy.
.
221a
Surprise your dog with an acid blob!
Tainted meat is even more sickening than poison!
.
217a
Sorry, no fortune this time. Better luck next cookie!
Spare your scrolls of make-edible until it's really necessary!
.
216a
Some potions are quite mind-expanding.
Some questions Sphynxes ask just *don't* have any answers.
Sometimes "mu" is the answer.
.
215a
Some Balrogs don't attack if you offer them a ring.
Some mazes (especially small ones) have no solutions, says man 6 maze.
.
214a
Shopkeepers sometimes die from old age.
Sleeping may increase your strength.
.
213a
Shopkeepers are vegetarians: they only eat Swedes.
Shopkeepers can't read, so what use is engraving in a shop?
Shopkeepers can't swim.
Shopkeepers have incredible patience.
.
212a
Selling and rebuying a wand will recharge it.
.
207a
Reward your doggie with a giant Bat.
Ropes are made from the long, blond hairs of dead Nymphs.
Row (3x) that boat gently down the stream, Charon (4x), death is but a dream.
Running is good for your legs.
Rust monsters love water. There are potions they hate, however.
.
201a
Rays aren't boomerangs, of course, but still...
.
199a
Punishment is a thing you call over yourself. So why complain?
.
193a
Orcs and killer bees share their lifestyle.
.
185a
Only cave-women can catch a unicorn. And then only with a golden rope.
.
183a
Only a Nymph knows how to unlock chains.
Only a dragon will never get a cold from a wand of cold.
Only a real dummy would ever call his sword 'Elbereth'.
.
178a
Nymphs are blondes. Are you a gentleman?
Nymphs are very pleased when you call them by their real name: Lorelei.
Offering a unicorn a worthless piece of glass might prove to be fatal!
Old hackers never die: young ones do.
Old trees sometimes fall without a warning!
Once your little dog will be a big dog, and you will be proud of it.
One can even choke in a fortune cookie!
.
177a
Nurses are accustomed to touch naked persons: they don't harm them.
Nurses prefer undressed hackers.
.
173a
No easy fighting with a heavy load!
No level contains two shops. The maze is no level. So...
No part of this fortune may be reproduced, stored in a retrieval system, ...
.
169a
Never swim with a camera: there's nothing to take pictures of.
.
160a
Never drop a crysknife! No, never even unwield it, until...
.
158a
Need money? Sell your corpses to a tin factory.
.
154a
Most monsters can't swim.
.
150a
Meet yourself! Commit suicide and type "hack"
Meeting your own ghost decreases your luck considerably!
Memory flaw - core dumped.
.
147a
Looking for a monster -- use a staff of monster summoning.
.
146a
Let's face it: this time you're not going to win.
Let's have a party, drink a lot of booze.
.
143a
Leather armour cannot rust.
.
139a
Killer bees keep appearing till you kill their queen.
.
131a
It's easy to overlook a monster in a wood.
.
130a
It's bad luck to drown a postman.
.
129a
It would be peculiarly sad were your dog turned to stone.
.
127a
It is said that purple worms and trappers fill the same niche.
.
124a
It furthers one to see the great man.
.
123a
In total, there are eight sorts of shops.
Increase mindpower: Tame your own ghost!
.
122a
In a way, a scorpion is like a snake.
.
119a
If your ghost kills a player, it increases your score.
.
115a
If you want to genocide nurses, genocide @'s.
.
107a
If you are being punished, it's done with a deadly weapon.
.
106a
If "nothing happens", something *has* happened anyway!!
If a chameleon mimics a mace, it really mimics a Mimic mimicking a mace.
.
103a
I guess you have never hit a postman with an Amulet of Yendor yet...
.
102a
Hungry? Wear an amulet!
.
100a
Humans use walking canes when they grow old.
Hunger is a confusing experience for a dog!
.
99a
Hissing is a sound I hate.
.
97a
Handle your flasks carefully - there might be a ghost inside!
.
93a
Gold is a heavy metal.
.
92a
Ghosts always empty the fridge.
Ghosts are visible because they don't leave a trace.
Giant beetles make giant holes in giant trees!
.
81a
Expensive cameras have penetrating flashlights.
.
80a
Every level contains a shop; only the entrance is often hidden.
.
78a
Ever wondered why one would want to dip something in a potion?
.
76a
Ever fought with an enchanted tooth?
Ever heard hissing outside? I *knew* you hadn't!
Ever seen a leocrotta dancing the tengu?
Ever slept in the arms of a homunculus?
Ever tamed a shopkeeper?
Ever tried digging through a Vault Guard?
Ever tried enchanting a rope?
.
73a
Eels hide under mud. Use a unicorn to clear the water and make them visible.
Elven cloaks cannot rust.
.
72a
Eating a Wraith is a rewarding experience!
Eating a freezing sphere is like eating a yeti.
Eating a killer bee is like eating a scorpion.
Eating a tengu is like eating a Nymph.
.
64a
Don't play hack at your work, your boss might hit you!
Don't swim with weapons or armour: they might rust!
.
63a
Don't eat too much: you might start hiccoughing!
.
61a
Dogs of ghosts aren't angry, just hungry.
.
59a
Dogs are attracted by the smell of tripe.
.
56a
Did you know worms had teeth?
Didn't you forget to pay?
Didn't you forget to pay?
.
52a
Dark gems are just coloured glass.
Dark room? Just flash often with your camera.
Dark room? Your chance to develop your photographs!
Dark rooms are not *completely* dark: just wait and let your eyes adjust...
.
50a
Changing your suit without dropping your sword? You must be kidding!
.
49c
Booksellers never read scrolls; it might carry them too far away.
.
45a
Beware: there's always a chance that your wand explodes as you try to zap it!
.
35a
Be nice to a nurse: put away your weapon and take off your clothes.
Being digested is a painfully slow process.
.
34c
Be careful when the moon is in its last quarter.
.
31a
Attacking an eel when there is none usually is a fatal mistake!
Balrogs only appear on the deeper levels.
.
29a
Are you blind? Catch a floating Eye!
.
28a
An ettin is hard to kill; an imp is hard to hit. See the difference?
.
26a
An Umber hulk can be a confusing sight.
.
25a
Always read the info about a monster before dealing with it.
Always sweep the floor before engraving important messages.
.
24a
Always attack a floating Eye from behind!
.
23a
After being attacked by a Harpy you have a lot of arrows.
.
22c
Afraid of Mimics? Try to wear a ring of true seeing.
.
20a
A winner never quits. A quitter never wins.
A xan is a small animal. It doesn't reach higher than your leg.
Acid blobs should be attacked bare-handed.
.
19a
A wand of deaf is a more dangerous weapon than a wand of sheep.
.
14a
A staff may recharge if you drop it for awhile.
.
11a
A scroll of enchant amulet is only useful on your way back.
.
10a
A ring of conflict is a bad thing if there is a nurse in the room.
A ring of extra ringfinger is useless if not enchanted.
A ring of stealth can be recognised by that it does not teleport you.
A rope may form a trail in a maze.
.
9a
A potion of blindness makes you see invisible things.
A ring is just a wound wand.
.
7a
A magic vomit pump is a necessity for gourmands.
.
6a
A jaguar shouldn't frighten you.
A long worm can be defined recursively. So how should you attack it?
.
2a
A dragon is just a Snake that ate a scroll of fire.
.
1a
"So when I die, the first thing I will see in Heaven is a score list?"
-- more --
...and rings may protect your fingers.
...and sometimes a piercer drops by.
A Quasit is even faster than a jaguar!
A chameleon imitating a postman often delivers scrolls of fire.
A chameleon imitating a postman sometimes delivers scrolls of punishment.
A clove of garlic a day keeps your best friends away.
A cockatrice's corpse is guaranteed to be untainted!
A confused acid blob may attack.
.
w
q
-*-END-*-
echo Done.
echo Now edit config.h and Makefile and say "make".