hack: changes for SVR2 (1 of 3)
gam
gam at amdahl.UUCP
Sun Jan 6 19:16:27 AEST 1985
I have gotten hack to compile successfully under Sys V Rel 2 and
the three shars following are the files with relevant changes.
Hack has not been played extensively here so I don't know how well
I have debugged it.
Among other things, I have used the System V 'drand48(3)' routines
for random number generation. Also some "linting" has been done.
If you have any problems, post them to net.sources.bugs.
------------------- close cover before striking match ------------------
: This is a shar archive. Extract with sh, not csh.
echo x - hack.do.c
sed -e 's/^X//' > hack.do.c << '!Funky!Stuff!'
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
X
X#include <stdio.h>
X#include <signal.h>
X#include "hack.h"
X#include "def.func_tab.h"
X
Xextern char *getenv(),*parse(),*getlogin(),*lowc(),*unctrl();
Xextern int float_down();
Xextern char *nomovemsg, *catmore;
Xextern struct obj *splitobj(), *addinv();
Xextern boolean hmon();
X
X/* Routines to do various user commands */
X
Xint done1();
X
Xdodrink() {
X register struct obj *otmp,*objs;
X register struct monst *mtmp;
X register int unkn = 0, nothing = 0;
X
X otmp = getobj("!", "drink");
X if(!otmp) return(0);
X switch(otmp->otyp){
X case POT_RESTORE_STRENGTH:
X unkn++;
X pline("Wow! This makes you feel great!");
X if(u.ustr < u.ustrmax) {
X u.ustr = u.ustrmax;
X flags.botl = 1;
X }
X break;
X case POT_BOOZE:
X unkn++;
X pline("Ooph! This tastes like liquid fire!");
X Confusion += d(3,8);
X /* the whiskey makes us feel better */
X if(u.uhp < u.uhpmax) losehp(-1, "bottle of whiskey");
X if(!rn2(4)) {
X pline("You pass out.");
X multi = -rnd(15);
X nomovemsg = "You awake with a headache.";
X }
X break;
X case POT_INVISIBILITY:
X if(Invis)
X nothing++;
X else {
X if(!Blind)
X pline("Gee! All of a sudden, you can't see yourself.");
X else
X pline("You feel rather airy."), unkn++;
X newsym(u.ux,u.uy);
X }
X Invis += rn1(15,31);
X break;
X case POT_FRUIT_JUICE:
X pline("This tastes like fruit juice.");
X lesshungry(20);
X break;
X case POT_HEALING:
X pline("You begin to feel better.");
X flags.botl = 1;
X u.uhp += rnd(10);
X if(u.uhp > u.uhpmax)
X u.uhp = ++u.uhpmax;
X if(Blind) Blind = 1; /* see on next move */
X if(Sick) Sick = 0;
X break;
X case POT_PARALYSIS:
X pline("Your feet are frozen to the floor!");
X nomul(-(rn1(10,25)));
X break;
X case POT_MONSTER_DETECTION:
X if(!fmon) {
X strange_feeling(otmp);
X return(1);
X } else {
X cls();
X for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X if(mtmp->mx > 0)
X at(mtmp->mx,mtmp->my,mtmp->data->mlet);
X prme();
X pline("You sense the presence of monsters.");
X more();
X docrt();
X }
X break;
X case POT_OBJECT_DETECTION:
X if(!fobj) {
X strange_feeling(otmp);
X return(1);
X } else {
X for(objs = fobj; objs; objs = objs->nobj)
X if(objs->ox != u.ux || objs->oy != u.uy)
X goto outobjmap;
X pline("You sense the presence of objects close nearby.");
X break;
X outobjmap:
X cls();
X for(objs = fobj; objs; objs = objs->nobj)
X at(objs->ox,objs->oy,objs->olet);
X prme();
X pline("You sense the presence of objects.");
X more();
X docrt();
X }
X break;
X case POT_SICKNESS:
X pline("Yech! This stuff tastes like poison.");
X if(Poison_resistance)
X pline("(But in fact it was biologically contaminated orange juice.)");
X losestr(rn1(4,3));
X losehp(rnd(10), "poison potion");
X break;
X case POT_CONFUSION:
X if(!Confusion)
X pline("Huh, What? Where am I?");
X else
X nothing++;
X Confusion += rn1(7,16);
X break;
X case POT_GAIN_STRENGTH:
X pline("Wow do you feel strong!");
X if(u.ustr == 118) break;
X if(u.ustr > 17) u.ustr += rnd(118-u.ustr);
X else u.ustr++;
X if(u.ustr > u.ustrmax) u.ustrmax = u.ustr;
X flags.botl = 1;
X break;
X case POT_SPEED:
X if(Wounded_legs) {
X if((Wounded_legs & BOTH_SIDES) == BOTH_SIDES)
X pline("Your legs feel somewhat better.");
X else
X pline("Your leg feels somewhat better.");
X Wounded_legs = 0;
X unkn++;
X break;
X }
X if(!(Fast & ~INTRINSIC))
X pline("You are suddenly moving much faster.");
X else
X pline("Your legs get new energy."), unkn++;
X Fast += rn1(10,100);
X break;
X case POT_BLINDNESS:
X if(!Blind)
X pline("A cloud of darkness falls upon you.");
X else
X nothing++;
X Blind += rn1(100,250);
X seeoff(0);
X break;
X case POT_GAIN_LEVEL:
X pluslvl();
X break;
X case POT_EXTRA_HEALING:
X pline("You feel much better.");
X flags.botl = 1;
X u.uhp += d(2,20)+1;
X if(u.uhp > u.uhpmax)
X u.uhp = (u.uhpmax += 2);
X if(Blind) Blind = 1;
X if(Sick) Sick = 0;
X break;
X case POT_LEVITATION:
X if(!Levitation)
X float_up();
X else
X nothing++;
X Levitation += rnd(100);
X u.uprops[PROP(RIN_LEVITATION)].p_tofn = float_down;
X break;
X default:
X pline("What a funny potion! (%d)", otmp->otyp);
X impossible();
X return(0);
X }
X if(nothing) {
X unkn++;
X pline("You have a peculiar feeling for a moment, then it passes.");
X }
X if(otmp->dknown && !objects[otmp->otyp].oc_name_known) {
X if(!unkn) {
X objects[otmp->otyp].oc_name_known = 1;
X u.urexp += 10;
X } else if(!objects[otmp->otyp].oc_uname)
X docall(otmp);
X }
X useup(otmp);
X return(1);
X}
X
Xpluslvl()
X{
X register num;
X
X pline("You feel more experienced.");
X num = rnd(10);
X u.uhpmax += num;
X u.uhp += num;
X u.uexp = (10*pow(u.ulevel-1))+1;
X pline("Welcome to level %d.", ++u.ulevel);
X flags.botl = 1;
X}
X
Xstrange_feeling(obj)
Xregister struct obj *obj;
X{
X pline("You have a strange feeling for a moment, then it passes.");
X if(!objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname)
X docall(obj);
X useup(obj);
X}
X
Xdodrop() {
X register struct obj *obj;
X
X obj = getobj("0$#", "drop");
X if(!obj) return(0);
X if(obj->olet == '$') {
X if(obj->quan == 0)
X pline("You didn't drop any gold pieces.");
X else {
X mkgold((int) obj->quan, u.ux, u.uy);
X pline("You dropped %u gold piece%s.",
X obj->quan, plur(obj->quan));
X if(Invis) newsym(u.ux, u.uy);
X }
X free((char *) obj);
X return(1);
X }
X return(drop(obj));
X}
X
Xdrop(obj) register struct obj *obj; {
X if(obj->owornmask & (W_ARMOR | W_RING)){
X pline("You cannot drop something you are wearing.");
X return(0);
X }
X if(obj == uwep) {
X if(uwep->cursed) {
X pline("Your weapon is welded to your hand!");
X return(0);
X }
X setuwep((struct obj *) 0);
X }
X pline("You dropped %s.", doname(obj));
X dropx(obj);
X return(1);
X}
X
Xdropx(obj) register struct obj *obj; {
X if(obj->otyp == CRYSKNIFE)
X obj->otyp = WORM_TOOTH;
X freeinv(obj);
X obj->ox = u.ux;
X obj->oy = u.uy;
X obj->nobj = fobj;
X fobj = obj;
X if(Invis) newsym(u.ux,u.uy);
X subfrombill(obj);
X stackobj(obj);
X}
X
X/* drop several things */
Xdoddrop() {
X return(ggetobj("drop", drop, 0));
X}
X
Xrhack(cmd)
Xregister char *cmd;
X{
X register struct func_tab *tlist = list;
X boolean firsttime = FALSE;
X register res;
X
X if(!cmd) {
X firsttime = TRUE;
X flags.nopick = 0;
X cmd = parse();
X }
X if(!*cmd || *cmd == 0377)
X return; /* probably we just had an interrupt */
X if(movecm(cmd)) {
X walk:
X if(multi) flags.mv = 1;
X domove();
X return;
X }
X if(movecm(lowc(cmd))) {
X flags.run = 1;
X rush:
X if(firsttime){
X if(!multi) multi = COLNO;
X u.last_str_turn = 0;
X }
X flags.mv = 1;
X#ifdef QUEST
X if(flags.run >= 4) finddir();
X if(firsttime){
X u.ux0 = u.ux + u.dx;
X u.uy0 = u.uy + u.dy;
X }
X#endif QUEST
X domove();
X return;
X }
X if((*cmd == 'f' && movecm(cmd+1)) ||
X movecm(unctrl(cmd))) {
X flags.run = 2;
X goto rush;
X }
X if(*cmd == 'F' && movecm(lowc(cmd+1))) {
X flags.run = 3;
X goto rush;
X }
X if(*cmd == 'm' && movecm(cmd+1)) {
X flags.run = 0;
X flags.nopick = 1;
X goto walk;
X }
X if(*cmd == 'M' && movecm(lowc(cmd+1))) {
X flags.run = 1;
X flags.nopick = 1;
X goto rush;
X }
X#ifdef QUEST
X if(*cmd == cmd[1] && (*cmd == 'f' || *cmd == 'F')) {
X flags.run = 4;
X if(*cmd == 'F') flags.run += 2;
X if(cmd[2] == '-') flags.run += 1;
X goto rush;
X }
X#endif QUEST
X while(tlist->f_char) {
X if(*cmd == tlist->f_char){
X res = (*(tlist->f_funct))(0);
X if(!res) {
X flags.move = 0;
X multi = 0;
X }
X return;
X }
X tlist++;
X }
X pline("Unknown command '%s'",cmd);
X multi = flags.move = 0;
X}
X
Xdoredraw()
X{
X docrt();
X return(0);
X}
X
Xdohelp()
X{
X if(child(1)){
X execl(catmore,"more","help",(char *)0);
X exit(1);
X }
X return(0);
X}
X
X#ifdef SHELL
Xdosh(){
Xregister char *str;
X if(child(0)) {
X (void) chdir(getenv("HOME"));
X if(str = getenv("SHELL")) execl(str,str,(char *) 0);
X if(strcmp("player", getlogin()))
X execl("/bin/sh","sh",(char *) 0);
X pline("sh: cannot execute.");
X exit(1);
X }
X return(0);
X}
X#endif SHELL
X
X#ifdef BSD
X#include <sys/wait.h>
X#endif BSD
X
Xchild(wt) {
Xregister int f = fork();
X if(f == 0){ /* child */
X settty((char *) 0);
X (void) setuid(getuid());
X return(1);
X }
X if(f == -1) { /* cannot fork */
X pline("Fork failed. Try again.");
X return(0);
X }
X /* fork succeeded; wait for child to exit */
X (void) signal(SIGINT,SIG_IGN);
X (void) signal(SIGQUIT,SIG_IGN);
X#ifdef BSD
X (void) wait((union wait *) 0);
X#else
X (void) wait((int *) 0);
X#endif BSD
X setctty();
X (void) signal(SIGINT, (void (*)()) done1);
X#ifdef WIZARD
X if(wizard) (void) signal(SIGQUIT,SIG_DFL);
X#endif WIZARD
X if(wt) getret();
X docrt();
X return(0);
X}
X
Xdodown()
X{
X if(u.ux != xdnstair || u.uy != ydnstair) {
X pline("You can't go down here.");
X return(0);
X }
X if(u.ustuck) {
X pline("You are being held, and cannot go down.");
X return(1);
X }
X if(Levitation) {
X pline("You're floating high above the stairs.");
X return(0);
X }
X
X goto_level(dlevel+1, TRUE);
X return(1);
X}
X
Xdoup()
X{
X if(u.ux != xupstair || u.uy != yupstair) {
X pline("You can't go up here.");
X return(0);
X }
X if(u.ustuck) {
X pline("You are being held, and cannot go up.");
X return(1);
X }
X if(inv_weight() + 5 > 0) {
X pline("Your load is too heavy to climb the stairs.");
X return(1);
X }
X
X goto_level(dlevel-1, TRUE);
X return(1);
X}
X
Xgoto_level(newlevel, at_stairs)
Xregister int newlevel;
Xregister boolean at_stairs;
X{
X register fd;
X register boolean up = (newlevel < dlevel);
X
X if(newlevel <= 0) done("escaped"); /* in fact < 0 is impossible */
X if(newlevel == dlevel) return; /* this cannot happen either */
X
X glo(dlevel);
X fd = creat(lock,FMASK);
X if(fd < 0) {
X /*
X * This is not quite impossible: e.g., we may have
X * exceeded our quota. If that is the case then we
X * cannot leave this level, and cannot save either.
X */
X pline("A mysterious force prevents you from going %d.",
X up ? "up" : "down");
X return;
X }
X
X if(Punished) unplacebc();
X keepdogs();
X seeoff(1);
X flags.nscrinh = 1;
X u.ux = FAR; /* hack */
X (void) inshop(); /* probably was a trapdoor */
X
X savelev(fd);
X (void) close(fd);
X
X dlevel = newlevel;
X if(maxdlevel < dlevel)
X maxdlevel = dlevel;
X glo(dlevel);
X if((fd = open(lock,0)) < 0)
X mklev();
X else {
X (void) getlev(fd);
X (void) close(fd);
X }
X
X if(at_stairs) {
X if(up) {
X u.ux = xdnstair;
X u.uy = ydnstair;
X if(!u.ux) { /* entering a maze from below? */
X u.ux = xupstair; /* this will confuse the player! */
X u.uy = yupstair;
X }
X if(Punished){
X pline("With great effort you climb the stairs");
X placebc(1);
X }
X } else {
X u.ux = xupstair;
X u.uy = yupstair;
X if(inv_weight() + 5 > 0 || Punished){
X pline("You fall down the stairs.");
X losehp(rnd(3), "fall");
X if(Punished) {
X if(uwep != uball && rn2(3)){
X pline("... and are hit by the iron ball");
X losehp(rnd(20), "iron ball");
X }
X placebc(1);
X }
X selftouch("Falling, you");
X }
X }
X } else { /* trapdoor or level_tele */
X do {
X u.ux = rnd(COLNO-1);
X u.uy = rn2(ROWNO);
X } while(levl[u.ux][u.uy].typ != ROOM ||
X m_at(u.ux,u.uy));
X if(Punished){
X if(uwep != uball && !up /* %% */ && rn2(5)){
X pline("The iron ball falls on your head.");
X losehp(rnd(25), "iron ball");
X }
X placebc(1);
X }
X selftouch("Falling, you");
X }
X (void) inshop();
X#ifdef TRACK
X initrack();
X#endif TRACK
X
X losedogs();
X flags.nscrinh = 0;
X setsee();
X docrt();
X pickup();
X read_engr_at(u.ux,u.uy);
X}
X
Xdonull() {
X return(1); /* Do nothing, but let other things happen */
X}
X
Xstruct monst *bhit(), *boomhit();
Xdothrow()
X{
X register struct obj *obj;
X register struct monst *mon;
X register tmp;
X
X obj = getobj("#)", "throw"); /* it is also possible to throw food */
X /* (or jewels, or iron balls ... ) */
X if(!obj || !getdir())
X return(0);
X if(obj->owornmask & (W_ARMOR | W_RING)){
X pline("You can't throw something you are wearing");
X return(0);
X }
X if(obj == uwep){
X if(obj->cursed){
X pline("Your weapon is welded to your hand");
X return(1);
X }
X if(obj->quan > 1)
X setuwep(splitobj(obj, 1));
X else
X setuwep((struct obj *) 0);
X }
X else if(obj->quan > 1)
X (void) splitobj(obj, 1);
X freeinv(obj);
X if(u.uswallow) {
X mon = u.ustuck;
X bhitpos.x = mon->mx;
X bhitpos.y = mon->my;
X } else if(obj->otyp == BOOMERANG) {
X mon = boomhit(u.dx,u.dy);
X /* boomhit delivers -1 if the thing was caught */
X if((int) mon == -1) {
X (void) addinv(obj);
X return(1);
X }
X } else
X mon = bhit(u.dx,u.dy,
X (!Punished || obj != uball) ? 8 :
X !u.ustuck ? 5 : 1,
X obj->olet);
X if(mon) {
X /* awake monster if sleeping */
X wakeup(mon);
X
X if(obj->olet == WEAPON_SYM) {
X tmp = -1+u.ulevel+mon->data->ac+abon();
X if(obj->otyp < ROCK) {
X if(!uwep ||
X uwep->otyp != obj->otyp+(BOW-ARROW))
X tmp -= 4;
X else {
X tmp += uwep->spe;
X }
X } else
X if(obj->otyp == BOOMERANG) tmp += 4;
X tmp += obj->spe;
X if(u.uswallow || tmp >= rnd(20)) {
X if(hmon(mon,obj,1) == TRUE){
X /* mon still alive */
X#ifndef NOWORM
X cutworm(mon,bhitpos.x,bhitpos.y,obj->otyp);
X#endif NOWORM
X } else mon = 0;
X /* weapons thrown disappear sometimes */
X if(obj->otyp < BOOMERANG && rn2(3)) {
X /* check bill; free */
X obfree(obj, (struct obj *) 0);
X return(1);
X }
X } else miss(objects[obj->otyp].oc_name, mon);
X } else if(obj->otyp == HEAVY_IRON_BALL) {
X tmp = -1+u.ulevel+mon->data->ac+abon();
X if(!Punished || obj != uball) tmp += 2;
X if(u.utrap) tmp -= 2;
X if(u.uswallow || tmp >= rnd(20)) {
X if(hmon(mon,obj,1) == FALSE)
X mon = 0; /* he died */
X } else miss("iron ball", mon);
X } else {
X if(cansee(bhitpos.x,bhitpos.y))
X pline("You miss %s.",monnam(mon));
X else pline("You miss it.");
X if(obj->olet == FOOD_SYM && mon->data->mlet == 'd')
X if(tamedog(mon,obj)) return(1);
X if(obj->olet == GEM_SYM && mon->data->mlet == 'u'){
X if(obj->dknown && objects[obj->otyp].oc_name_known){
X if(objects[obj->otyp].g_val > 0){
X u.uluck += 5;
X goto valuable;
X } else {
X pline("%s is not interested in your junk.",
X Monnam(mon));
X }
X } else { /* value unknown to @ */
X u.uluck++;
X valuable:
X pline("%s graciously accepts your gift.",
X Monnam(mon));
X mpickobj(mon, obj);
X rloc(mon);
X return(1);
X }
X }
X }
X }
X obj->ox = bhitpos.x;
X obj->oy = bhitpos.y;
X obj->nobj = fobj;
X fobj = obj;
X /* prevent him from throwing articles to the exit and escaping */
X /* subfrombill(obj); */
X stackobj(obj);
X if(Punished && obj == uball &&
X (bhitpos.x != u.ux || bhitpos.y != u.uy)){
X freeobj(uchain);
X unpobj(uchain);
X if(u.utrap){
X if(u.utraptype == TT_PIT)
X pline("The ball pulls you out of the pit!");
X else {
X register int side =
X rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
X pline("The ball pulls you out of the bear trap.");
X pline("Your %s leg is severely damaged.",
X (side == LEFT_SIDE) ? "left" : "right");
X Wounded_legs |= side + rnd(1000);
X losehp(2, "thrown ball");
X }
X u.utrap = 0;
X }
X unsee();
X uchain->nobj = fobj;
X fobj = uchain;
X u.ux = uchain->ox = bhitpos.x - u.dx;
X u.uy = uchain->oy = bhitpos.y - u.dy;
X setsee();
X (void) inshop();
X }
X if(cansee(bhitpos.x, bhitpos.y)) prl(bhitpos.x,bhitpos.y);
X return(1);
X}
X
Xgetdir()
X{
Xchar buf[2];
X pline("What direction?");
X buf[0] = readchar();
X buf[1] = 0;
X return(movecm(buf));
X}
X
X/* split obj so that it gets size num */
X/* remainder is put in the object structure delivered by this call */
Xstruct obj *
Xsplitobj(obj, num) register struct obj *obj; register int num; {
Xregister struct obj *otmp;
X otmp = newobj(0);
X *otmp = *obj; /* copies whole structure */
X otmp->o_id = flags.ident++;
X otmp->onamelth = 0;
X obj->quan = num;
X obj->owt = weight(obj);
X otmp->quan -= num;
X otmp->owt = weight(otmp); /* -= obj->owt ? */
X obj->nobj = otmp;
X if(obj->unpaid) splitbill(obj,otmp);
X return(otmp);
X}
X
Xchar *
Xlowc(str)
Xregister char *str;
X{
X static char buf[2];
X
X if(*str >= 'A' && *str <= 'Z') *buf = *str+'a'-'A';
X else *buf = *str;
X buf[1] = 0;
X return(buf);
X}
X
Xchar *
Xunctrl(str)
Xregister char *str;
X{
X static char buf[2];
X if(*str >= ('A' & 037) && *str <= ('Z' & 037))
X *buf = *str + 0140;
X else *buf = *str;
X buf[1] = 0;
X return(buf);
X}
!Funky!Stuff!
echo x - hack.h
sed -e 's/^X//' > hack.h << '!Funky!Stuff!'
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
X
X#include "mklev.h"
X#include "hack.onames.h"
X
X#define ON 1
X#define OFF 0
X
X#define index strchr
X
Xextern struct obj *invent, *uwep, *uarm, *uarm2, *uarmh, *uarms, *uarmg,
X *uleft, *uright, *fcobj;
Xextern struct obj *uchain; /* defined iff PUNISHED */
Xextern struct obj *uball; /* defined if PUNISHED */
Xstruct obj *o_at(), *getobj(), *sobj_at();
X
Xstruct flag {
X unsigned ident; /* social security number for each monster */
X unsigned topl:2; /* a top line (message) has been printed */
X /* 0: top line empty; 2: no --More-- reqd. */
X unsigned cbreak:1; /* in cbreak mode, rogue format */
X unsigned oneline:1; /* give inventories 1 line at a time */
X unsigned move:1;
X unsigned mv:1;
X unsigned run:3; /* 0: h (etc), 1: H (etc), 2: fh (etc) */
X /* 3: FH, 4: ff+, 5: ff-, 6: FF+, 7: FF- */
X unsigned nopick:1; /* do not pickup objects */
X unsigned echo:1; /* 1 to echo characters */
X unsigned botl:1; /* partially redo status line */
X unsigned botlx:1; /* print an entirely new bottom line */
X unsigned nscrinh:1; /* inhibit nscr() in pline(); */
X};
Xextern struct flag flags;
X
Xstruct prop {
X#define TIMEOUT 007777 /* mask */
X#define LEFT_RING W_RINGL /* 010000L */
X#define RIGHT_RING W_RINGR /* 020000L */
X#define INTRINSIC 040000L
X#define LEFT_SIDE LEFT_RING
X#define RIGHT_SIDE RIGHT_RING
X#define BOTH_SIDES (LEFT_SIDE | RIGHT_SIDE)
X long p_flgs;
X int (*p_tofn)(); /* called after timeout */
X};
X
Xstruct you {
X xchar ux, uy;
X schar dx, dy; /* direction of fast move */
X#ifdef QUEST
X schar di; /* direction of FF */
X xchar ux0, uy0; /* initial position FF */
X#endif QUEST
X xchar udisx, udisy; /* last display pos */
X char usym; /* usually '@' */
X schar uluck;
X int last_str_turn:3; /* 0: none, 1: half turn, 2: full turn */
X /* +: turn right, -: turn left */
X unsigned udispl:1; /* @ on display */
X unsigned ulevel:5;
X#ifdef QUEST
X unsigned uhorizon:7;
X#endif QUEST
X unsigned utrap:3; /* trap timeout */
X unsigned utraptype:1; /* defined if utrap nonzero */
X#define TT_BEARTRAP 0
X#define TT_PIT 1
X unsigned uinshop:1;
X
X
X/* perhaps these #define's should also be generated by makedefs */
X#define TELEPAT LAST_RING /* not a ring */
X#define Telepat u.uprops[TELEPAT].p_flgs
X#define FAST (LAST_RING+1) /* not a ring */
X#define Fast u.uprops[FAST].p_flgs
X#define CONFUSION (LAST_RING+2) /* not a ring */
X#define Confusion u.uprops[CONFUSION].p_flgs
X#define INVIS (LAST_RING+3) /* not a ring */
X#define Invis u.uprops[INVIS].p_flgs
X#define GLIB (LAST_RING+4) /* not a ring */
X#define Glib u.uprops[GLIB].p_flgs
X#define PUNISHED (LAST_RING+5) /* not a ring */
X#define Punished u.uprops[PUNISHED].p_flgs
X#define SICK (LAST_RING+6) /* not a ring */
X#define Sick u.uprops[SICK].p_flgs
X#define BLIND (LAST_RING+7) /* not a ring */
X#define Blind u.uprops[BLIND].p_flgs
X#define WOUNDED_LEGS (LAST_RING+8) /* not a ring */
X#define Wounded_legs u.uprops[WOUNDED_LEGS].p_flgs
X#define PROP(x) (x-RIN_ADORNMENT) /* convert ring to index in uprops */
X unsigned umconf:1;
X char *usick_cause;
X struct prop uprops[LAST_RING+9];
X
X unsigned uswallow:1; /* set if swallowed by a monster */
X unsigned uswldtim:4; /* time you have been swallowed */
X unsigned uhs:3; /* hunger state - see hack.eat.c */
X schar ustr,ustrmax;
X schar udaminc;
X schar uac;
X int uhp,uhpmax;
X long int ugold,ugold0,uexp,urexp;
X int uhunger; /* refd only in eat.c and shk.c */
X int uinvault;
X struct monst *ustuck;
X int nr_killed[CMNUM+2]; /* used for experience bookkeeping */
X};
X
Xextern struct you u;
X
Xextern char *traps[];
Xextern char *plur(), *monnam(), *Monnam(), *amonnam(), *Amonnam(),
X *doname(), *aobjnam();
Xextern char readchar();
Xextern char vowels[];
X
Xextern xchar curx,cury; /* cursor location on screen */
X
Xextern coord bhitpos; /* place where thrown weapon falls to the ground */
X
Xextern xchar seehx,seelx,seehy,seely; /* where to see*/
Xextern char *save_cm,*killer;
X
Xextern xchar dlevel, maxdlevel; /* dungeon level */
X
Xextern long moves;
X
Xextern int multi;
X
X
Xextern char lock[];
X
X
X#define DIST(x1,y1,x2,y2) (((x1)-(x2))*((x1)-(x2)) + ((y1)-(y2))*((y1)-(y2)))
X
X#define PL_CSIZ 20 /* sizeof pl_character */
X#define MAX_CARR_CAP 120 /* so that boulders can be heavier */
X#define FAR (COLNO+2) /* position outside screen */
X
Xextern void exit(),
X perror(),
X qsort(),
X free();
!Funky!Stuff!
echo x - hack.lev.c
sed -e 's/^X//' > hack.lev.c << '!Funky!Stuff!'
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
X
X#include "hack.h"
X#include <signal.h>
X#include <stdio.h>
Xextern struct monst *restmonchn();
Xextern struct obj *restobjchn();
Xextern struct obj *billobjs;
Xextern char *itoa();
X
Xextern char nul[];
X#ifndef NOWORM
X#include "def.wseg.h"
X
Xextern struct wseg *wsegs[32], *wheads[32];
Xextern long wgrowtime[32];
X#endif NOWORM
X
X#include "savelev.h"
X
Xgetlev(fd)
X{
X register struct gen *gtmp;
X#ifndef NOWORM
X register struct wseg *wtmp;
X#endif NOWORM
X register tmp;
X long omoves;
X
X if(fd<0 || read(fd, (char *) levl, sizeof(levl)) != sizeof(levl))
X return(1);
X fgold = 0;
X ftrap = 0;
X mread(fd, (char *)&omoves, sizeof(omoves)); /* 0 from MKLEV */
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 if(omoves) {
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 mtmp2 = mtmp->nmon;
X if(index(genocided, mtmp->data->mlet)) {
X mondead(mtmp);
X continue;
X }
X if(index("ViT", mtmp->data->mlet))
X mtmp->mhp += tmoves;
X else
X mtmp->mhp += tmoves/20;
X if(mtmp->mhp > mtmp->orig_hp)
X mtmp->mhp = mtmp->orig_hp;
X }
X }
X
X setshk();
X setgd();
X gtmp = newgen();
X mread(fd, (char *)gtmp, sizeof(struct gen));
X while(gtmp->gx) {
X gtmp->ngen = fgold;
X fgold = gtmp;
X gtmp = newgen();
X mread(fd, (char *)gtmp, sizeof(struct gen));
X }
X mread(fd, (char *)gtmp, sizeof(struct gen));
X while(gtmp->gx) {
X gtmp->ngen = ftrap;
X ftrap = gtmp;
X gtmp = newgen();
X mread(fd, (char *)gtmp, sizeof(struct gen));
X }
X free((char *) gtmp);
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 QUEST
X if(!omoves) return(0); /* from MKLEV */
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 NOWORM
X return(0);
X}
X
Xmread(fd, buf, len)
Xregister fd;
Xregister char *buf;
Xregister unsigned len;
X{
Xregister int rlen;
X rlen = read(fd, buf, len);
X if(rlen != len){
X pline("Read %d instead of %d bytes\n", rlen, len);
X panic("Cannot read %d bytes from file #%d\n", len, fd);
X }
X}
X
X#ifdef BSD
X#include <sys/wait.h>
X# define NZ(stat) (stat.w_status != 0) /* non-zero status */
X# define SIG(stat) (stat.w_termsig) /* terminated by signal */
X# define EXIT(stat) (stat.w_retcode) /* non-zero exit code */
X# define CDUMP(stat) (stat.w_coredump) /* dumped core */
X#else
X# define NZ(stat) (stat != 0)
X# define SIG(stat) ( (stat & 0xff00) ? 0 : (stat & 0x0f) )
X# define EXIT(stat) ( (stat & 0x00ff) ? 0 : ((stat >> 8) & 0x0f) )
X# define CDUMP(stat) (stat & 0200)
X#endif BSD
X
X
Xmklev()
X{
X register int fd;
X int fork_val;
X char type[2];
X#ifdef BSD
X union wait status;
X#else
X int status;
X#endif BSD
X extern char fut_geno[];
X
X if(getbones()) return;
X if(dlevel < rn1(3, 26)) type[0] = 'a'; /* normal level */
X else type[0] = 'b'; /* maze */
X type[1] = 0;
X fork_val = fork();
X switch(fork_val){
X case 0:
X (void) signal(SIGINT, SIG_IGN);
X (void) signal(SIGQUIT, SIG_IGN);
X execl("./mklev", "mklev", lock, type, itoa(dlevel), fut_geno,
X#ifdef WIZARD
X wizard ? "w" :
X#endif WIZARD
X "", (char *) 0);
X exit(2);
X case -1:
X settty("Cannot fork!\n");
X exit(1);
X default:
X (void) fflush(stdout); /* You fell into a trap ... */
X (void) wait(&status);
X }
X if(NZ(status)) {
X if(CDUMP(status)) {
X settty("Mklev dumped core. Exiting...\n");
X#ifdef DEBUG
Xfprintf(stderr, "signal was %d\n", SIG(status));
X#endif
X exit(1);
X }
X if(SIG(status)) {
X settty("Mklev killed by a signal. Exiting...\n");
X exit(1);
X }
X if(EXIT(status)) {
X if(EXIT(status) == 2) {
X settty("Cannot execl mklev.\n");
X exit(1);
X }
X pline("Mklev failed. Let's try again.");
X mklev();
X return;
X }
X }
X if((fd = open(lock, 0)) < 0) {
X pline("Can't open %s!", lock);
X mklev();
X return;
X }
X (void) getlev(fd);
X (void) close(fd);
X}
!Funky!Stuff!
exit
--
Gordon A. Moffett ...!{ihnp4,hplabs,sun}!amdahl!gam
"Her name was McGill, and she called herself Lil, but everyone knew
her as Nancy...."
More information about the Comp.sources.unix
mailing list