#include <fcntl.h>
#include <stdarg.h>
#include <string.h>
#define Null(type) ((struct type *) 0)
#include "config.h"
#include "def.objclass.h"
typedef struct {
xchar x,y;
} coord;
#include "def.mkroom.h"
#include "def.monst.h"
#include "def.gold.h"
#include "def.trap.h"
#include "def.obj.h"
#include "def.flag.h"
#include "def.wseg.h"
#define plur(x) (((x) == 1) ? "" : "s")
#define BUFSZ 256
#define PL_NSIZ 32
#include "def.rm.h"
#include "def.permonst.h"
extern xchar xdnstair, ydnstair, xupstair, yupstair;
extern xchar dlevel;
#define newstring(x) (char *) alloc((unsigned)(x))
#include "hack.onames.h"
#define ON 1
#define OFF 0
extern struct obj *invent, *uwep, *uarm, *uarm2, *uarmh, *uarms, *uarmg,
*uleft, *uright, *fcobj;
extern struct obj *uchain;
extern struct obj *uball;
struct prop {
#define TIMEOUT 007777
#define LEFT_RING W_RINGL
#define RIGHT_RING W_RINGR
#define INTRINSIC 040000L
#define LEFT_SIDE LEFT_RING
#define RIGHT_SIDE RIGHT_RING
#define BOTH_SIDES (LEFT_SIDE | RIGHT_SIDE)
long p_flgs;
int (*p_tofn)();
};
struct you {
xchar ux, uy;
schar dx, dy, dz;
#ifdef QUEST
schar di;
xchar ux0, uy0;
#endif
xchar udisx, udisy;
char usym;
schar uluck;
#define LUCKMAX 10
#define LUCKMIN (-10)
int last_str_turn:3;
unsigned udispl:1;
unsigned ulevel:4;
#ifdef QUEST
unsigned uhorizon:7;
#endif
unsigned utrap:3;
unsigned utraptype:1;
#define TT_BEARTRAP 0
#define TT_PIT 1
unsigned uinshop:6;
#define TELEPAT LAST_RING
#define Telepat u.uprops[TELEPAT].p_flgs
#define FAST (LAST_RING+1)
#define Fast u.uprops[FAST].p_flgs
#define CONFUSION (LAST_RING+2)
#define Confusion u.uprops[CONFUSION].p_flgs
#define INVIS (LAST_RING+3)
#define Invis u.uprops[INVIS].p_flgs
#define Invisible (Invis && !See_invisible)
#define GLIB (LAST_RING+4)
#define Glib u.uprops[GLIB].p_flgs
#define PUNISHED (LAST_RING+5)
#define Punished u.uprops[PUNISHED].p_flgs
#define SICK (LAST_RING+6)
#define Sick u.uprops[SICK].p_flgs
#define BLIND (LAST_RING+7)
#define Blind u.uprops[BLIND].p_flgs
#define WOUNDED_LEGS (LAST_RING+8)
#define Wounded_legs u.uprops[WOUNDED_LEGS].p_flgs
#define STONED (LAST_RING+9)
#define Stoned u.uprops[STONED].p_flgs
#define PROP(x) (x-RIN_ADORNMENT)
unsigned umconf:1;
char *usick_cause;
struct prop uprops[LAST_RING+10];
unsigned uswallow:1;
unsigned uswldtim:4;
unsigned uhs:3;
schar ustr,ustrmax;
schar udaminc;
schar uac;
int uhp,uhpmax;
long int ugold,ugold0,uexp,urexp;
int uhunger;
int uinvault;
struct monst *ustuck;
int nr_killed[CMNUM+2];
};
extern struct you u;
extern char *traps[];
extern char vowels[];
extern xchar curx,cury;
extern coord bhitpos;
extern xchar seehx,seelx,seehy,seely;
extern char *save_cm,*killer;
extern xchar dlevel, maxdlevel;
extern long moves;
extern int multi;
extern char lock[PL_NSIZ+4];
#define DIST(x1,y1,x2,y2) (((x1)-(x2))*((x1)-(x2)) + ((y1)-(y2))*((y1)-(y2)))
#define PL_CSIZ 20
#define MAX_CARR_CAP 120
#define MAXLEVEL 40
#define FAR (COLNO+2)
void *alloc(unsigned int);
int doapply(void);
int holetime(void);
void dighole(void);
void savebones(void);
int getbones(void);
void unsee(void);
void seeoff(int);
void domove(void);
int dopickup(void);
void pickup(int);
void lookaround(void);
int monster_nearby(void);
int cansee(xchar, xchar);
int sgn(int);
void setsee(void);
void nomul(int);
int abon(void);
int dbon(void);
void losestr(int);
void losehp(int, char *);
void losehp_m(int, struct monst *);
void losexp(void);
int inv_weight(void);
long newuexp(void);
void rhack(char *);
int doextcmd(void);
int movecmd(char);
int getdir(boolean);
void confdir(void);
#ifdef QUEST
void finddir(void);
int isroom(int, int);
#endif
int isok(int, int);
int dodrop(void);
void dropx(struct obj *);
void dropy(struct obj *);
int doddrop(void);
int dodown(void);
int doup(void);
void goto_level(int, boolean);
int donull(void);
int dopray(void);
int dothrow(void);
struct obj *splitobj(struct obj *, int);
void more_experienced(int, int);
void set_wounded_legs(long, int);
void heal_legs(void);
coord getpos(int, char *);
int do_mname(void);
int ddocall(void);
void docall(struct obj *);
char *xmonnam(struct monst *, int);
char *monnam(struct monst *);
char *Monnam(struct monst *);
char *amonnam(struct monst *, char *);
char *Amonnam(struct monst *, char *);
char *Xmonnam(struct monst *);
int doremarm(void);
int doremring(void);
int armoroff(struct obj *);
int doweararm(void);
int dowearring(void);
void ringoff(struct obj *);
void find_ac(void);
void glibr(void);
struct obj *some_armor(void);
void corrode_armor(void);
void makedog(void);
void losedogs(void);
void keepdogs(void);
void fall_down(struct monst *);
int dog_move(struct monst *, int);
int inroom(xchar, xchar);
int tamedog(struct monst *, struct obj *);
void init_uhunger(void);
int opentin(void);
void Meatdone(void);
int doeat(void);
void gethungry(void);
void morehungry(int);
void lesshungry(int);
void unfaint(void);
int poisonous(struct obj *);
void done1(int);
int done2(void);
void done_intr(int);
void done_hangup(int);
void done_in_by(struct monst *);
void done(char *);
void clearlocks(void);
char *eos(char *);
void charcat(char *, char);
void prscore(int, char **);
struct engr *engr_at(xchar, xchar);
int sengr_at(char *, xchar, xchar);
void u_wipe_engr(int);
void wipe_engr_at(xchar, xchar, xchar);
void read_engr_at(int, int);
void make_engr_at(int, int, char *);
int doengrave(void);
void save_engravings(int);
void rest_engravings(int);
int hitmm(struct monst *, struct monst *);
void mondied(struct monst *);
int fightm(struct monst *);
int thitu(int, int, char *);
boolean hmon(struct monst *, struct obj *, int);
boolean attack(struct monst *);
struct obj *addinv(struct obj *);
void useup(struct obj *);
void freeinv(struct obj *);
void delobj(struct obj *);
void freeobj(struct obj *);
void freegold(struct gold *);
void deltrap(struct trap *);
struct monst *m_at(int, int);
struct obj *o_at(int, int);
struct obj *sobj_at(int, int, int);
int carried(struct obj *);
boolean carrying(int);
struct obj *o_on(unsigned int, struct obj *);
struct trap *t_at(int, int);
struct gold *g_at(int, int);
struct obj *mkgoldobj(long);
struct obj *getobj(char *, char *);
int ckunpaid(struct obj *);
int ggetobj(char *, int (*fn)(struct obj *), int);
int askchain(struct obj *, char *, int, int (*fn)(struct obj *),
int (*ckfn)(struct obj *), int);
void prinv(struct obj *);
int ddoinv(void);
int dotypeinv(void);
int dolook(void);
void stackobj(struct obj *);
int countgold(void);
int doprgold(void);
int doprwep(void);
int doprarm(void);
int doprring(void);
void getioctls(void);
void setioctls(void);
#ifdef SUSPEND
int dosuspend(void);
#endif
void savelev(int, xchar);
void bwrite(int, const void *, ssize_t);
void saveobjchn(int, struct obj *);
void savemonchn(int, struct monst *);
void savegoldchn(int, struct gold *);
void savetrapchn(int, struct trap *);
void getlev(int, int, xchar);
void mread(int, char *, unsigned);
void mklev(void);
void glo(int);
void askname(void);
void impossible(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
void stop_occupation(void);
struct monst *makemon(struct permonst *, int, int);
coord enexto(xchar, xchar);
int goodpos(int, int);
void rloc(struct monst *);
struct monst *mkmon_at(char, int, int);
int mhitu(struct monst *);
int hitu(struct monst *, int);
void makelevel(void);
int makerooms(void);
void mktrap(int, int, struct mkroom *);
void makemaz(void);
coord mazexy(void);
struct obj * mkobj_at(int, int, int);
void mksobj_at(int, int, int);
struct obj *mkobj(int);
struct obj *mksobj(int);
int letter(int);
int weight(struct obj *);
void mkgold(long, int, int);
#ifndef QUEST
void mkshop(void);
void mkzoo(int);
struct permonst *morguemon(void);
void mkswamp(void);
#endif
void movemon(void);
void justswld(struct monst *, char *);
void youswld(struct monst *, int, int, char *);
int dochug(struct monst *);
int m_move(struct monst *, int);
int mfndpos(struct monst *, coord pos[9], int info[9], int);
int dist(int, int);
void poisoned(char *, char *);
void mondead(struct monst *);
void replmon(struct monst *, struct monst *);
void relmon(struct monst *);
void monfree(struct monst *);
void unstuck(struct monst *);
void killed(struct monst *);
void kludge(char *, char *);
void rescham(void);
int newcham(struct monst *, struct permonst *);
void mnexto(struct monst *);
void setmangry(struct monst *);
int canseemon(struct monst *);
int letindex(char);
void init_objects(void);
int probtype(char);
void oinit(void);
void savenames(int);
void restnames(int);
int dodiscovered(void);
char *strprepend(char *, char *);
char *typename(int);
char *xname(struct obj *);
char *doname(struct obj *);
void setan(char *, char *, size_t);
char *aobjnam(struct obj *, char *);
char *Doname(struct obj *);
struct obj *readobjnam(char *, size_t);
void initoptions(void);
int doset(void);
int dowhatis(void);
void intruph(int);
void set_whole_screen(void);
#ifdef NEWS
int readnews(void);
#endif
void set_pager(int);
int page_line(char *);
void cornline(int, char *);
int dohelp(void);
int page_file(char *, boolean);
#ifdef UNIX
#ifdef SHELL
int dosh(void);
#endif
int child(int);
#endif
int dodrink(void);
void pluslvl(void);
void strange_feeling(struct obj *, char *);
void potionhit(struct monst *, struct obj *);
void potionbreathe(struct obj *);
int dodip(void);
void swallowed(void);
void panic(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
void atl(int, int, int);
void on_scr(int, int);
void tmp_at(schar, schar);
void Tmp_at(schar, schar);
void setclipped(void);
void at(xchar, xchar, char);
void prme(void);
int doredraw(void);
void docrt(void);
void docorner(int, int);
void curs_on_u(void);
void pru(void);
void prl(int, int);
char news0(xchar, xchar);
void newsym(int, int);
void mnewsym(int, int);
void nosee(int, int);
#ifndef QUEST
void prl1(int, int);
void nose1(int, int);
#endif
int vism_at(int, int);
void unpobj(struct obj *);
void seeobjs(void);
void seemons(void);
void pmon(struct monst *);
void unpmon(struct monst *);
void nscr(void);
void bot(void);
void cls(void);
int doread(void);
int identify(struct obj *);
void litroom(boolean);
void outrip(void);
void outrumor(void);
int dosave(void);
__dead void hackhangup(int);
int dorecover(int);
struct obj *restobjchn(int);
struct monst *restmonchn(int);
int findit(void);
int dosearch(void);
int doidtrap(void);
void wakeup(struct monst *);
void seemimic(struct monst *);
char *shkname(struct monst *);
void shkdead(struct monst *);
void replshk(struct monst *, struct monst *);
int inshop(void);
void obfree(struct obj *, struct obj *);
int dopay(void);
void paybill(void);
void addtobill(struct obj *);
void splitbill(struct obj *, struct obj *);
void subfrombill(struct obj *);
int doinvbill(int);
int shkcatch(struct obj *);
int shk_move(struct monst *);
void shopdig(int);
int online(int, int);
int follower(struct monst *);
void findname(char *, size_t, char);
long somegold(void);
void stealgold(struct monst *);
void stealarm(void);
int steal(struct monst *);
void mpickobj(struct monst *, struct obj *);
int stealamulet(struct monst *);
void relobj(struct monst *, int);
void startup(void);
void start_screen(void);
void end_screen(void);
void start_screen(void);
void curs(int, int);
void cl_end(void);
void clr_screen(void);
void home(void);
void standoutbeg(void);
void standoutend(void);
void backsp(void);
void hackbell(void);
void cl_eos(void);
void hacktimeout(void);
int doredotopl(void);
void remember_topl(void);
void addtopl(char *);
void more(void);
void cmore(char *);
void clrlin(void);
void pline(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
void vpline(const char *, va_list) __attribute__((__format__ (printf, 1, 0)));
void putsym(char);
void putstr(char *);
void initrack(void);
void settrack(void);
coord *gettrack(int, int);
struct trap *maketrap(int, int, int);
void dotrap(struct trap *);
int mintrap(struct monst *);
void selftouch(char *);
void float_up(void);
int float_down(void);
void tele(void);
int dotele(void);
void placebc(int);
void unplacebc(void);
void level_tele(void);
void drown(void);
void gettty(void);
void settty(char *);
void setftty(void);
__dead void error(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
void getlin(char *);
void getret(void);
void cgetret(char *);
void xwaitforspace(char *);
char *parse(void);
char readchar(void);
void end_of_input(void);
void u_init(void);
void plnamesuffix(void);
int getyear(void);
char *getdate(void);
int phase_of_the_moon(void);
int night(void);
int midnight(void);
void getlock(void);
#ifdef MAIL
void getmailstatus(void);
void ckmailstatus(void);
void readmail(void);
#endif
void regularize(char *);
void setgd(void);
void invault(void);
int gd_move(void);
void gddead(void);
void replgd(struct monst *, struct monst *);
int doversion(void);
void setuwep(struct obj *);
int dowield(void);
void corrode_weapon(void);
int chwepon(struct obj *, int);
void amulet(void);
int wiz_hit(struct monst *);
void inrange(struct monst *);
void aggravate(void);
#ifndef NOWORM
int getwn(struct monst *);
void initworm(struct monst *);
void worm_move(struct monst *);
void worm_nomove(struct monst *);
void wormdead(struct monst *);
void wormhit(struct monst *);
void wormsee(unsigned);
void pwseg(struct wseg *);
void cutworm(struct monst *, xchar, xchar, uchar);
#endif
void setworn(struct obj *, long);
void setnotworn(struct obj *);
void bhitm(struct monst *, struct obj *);
boolean bhito(struct obj *, struct obj *);
int dozap(void);
char *exclam(int);
void hit(char *, struct monst *, char *);
void miss(char *, struct monst *);
struct monst *bhit(int, int, int, char,
void (*fhitm)(struct monst *, struct obj *),
boolean (*fhito)(struct obj *, struct obj *), struct obj *);
struct monst *boomhit(int, int);
void buzz(int, xchar, xchar, int, int);
void fracture_rock(struct obj *);
int rn1(int, int);
int rn2(int);
int rnd(int);
int d(int, int);