#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termcap.h>
#include <time.h>
#include <unistd.h>
#define MAXLEVEL 11
#define MAXVLEVEL 3
#define MAXX 67
#define MAXY 17
#define SCORESIZE 10
#define MAXPLEVEL 100
#define MAXMONST 56
#define SPNUM 38
#define MAXSCROLL 28
#define MAXPOTION 35
#define TIMELIMIT 30000
#define TAXRATE 1/20
#define MAXOBJ 93
struct monst {
const char *name;
char level;
short armorclass;
char damage;
char attack;
char defense;
char genocided;
char intelligence;
short gold;
short hitpoints;
unsigned long experience;
};
struct _itm {
short price;
short obj;
short arg;
short qty;
};
struct cel {
short hitp;
char mitem;
char item;
short iarg;
char know;
};
struct sphere {
struct sphere *p;
char x,y,lev;
char dir;
char lifetime;
};
#define STRENGTH 0
#define INTELLIGENCE 1
#define WISDOM 2
#define CONSTITUTION 3
#define DEXTERITY 4
#define CHARISMA 5
#define HPMAX 6
#define HP 7
#define GOLD 8
#define EXPERIENCE 9
#define LEVEL 10
#define REGEN 11
#define WCLASS 12
#define AC 13
#define BANKACCOUNT 14
#define SPELLMAX 15
#define SPELLS 16
#define ENERGY 17
#define ECOUNTER 18
#define MOREDEFENSES 19
#define WEAR 20
#define PROTECTIONTIME 21
#define WIELD 22
#define AMULET 23
#define REGENCOUNTER 24
#define MOREDAM 25
#define DEXCOUNT 26
#define STRCOUNT 27
#define BLINDCOUNT 28
#define CAVELEVEL 29
#define CONFUSE 30
#define ALTPRO 31
#define HERO 32
#define CHARMCOUNT 33
#define INVISIBILITY 34
#define CANCELLATION 35
#define HASTESELF 36
#define EYEOFLARN 37
#define AGGRAVATE 38
#define GLOBE 39
#define TELEFLAG 40
#define SLAYING 41
#define NEGATESPIRIT 42
#define SCAREMONST 43
#define AWARENESS 44
#define HOLDMONST 45
#define TIMESTOP 46
#define HASTEMONST 47
#define CUBEofUNDEAD 48
#define GIANTSTR 49
#define FIRERESISTANCE 50
#define BESSMANN 51
#define NOTHEFT 52
#define HARDGAME 53
#define CPUTIME 54
#define BYTESIN 55
#define BYTESOUT 56
#define MOVESMADE 57
#define MONSTKILLED 58
#define SPELLSCAST 59
#define LANCEDEATH 60
#define SPIRITPRO 61
#define UNDEADPRO 62
#define SHIELD 63
#define STEALTH 64
#define ITCHING 65
#define LAUGHING 66
#define DRAINSTRENGTH 67
#define CLUMSINESS 68
#define INFEEBLEMENT 69
#define HALFDAM 70
#define SEEINVISIBLE 71
#define FILLROOM 72
#define RANDOMWALK 73
#define SPHCAST 74
#define WTW 75
#define STREXTRA 76
#define TMP 77
#define LIFEPROT 78
#define OALTAR 1
#define OTHRONE 2
#define OORB 3
#define OPIT 4
#define OSTAIRSUP 5
#define OELEVATORUP 6
#define OFOUNTAIN 7
#define OSTATUE 8
#define OTELEPORTER 9
#define OSCHOOL 10
#define OMIRROR 11
#define ODNDSTORE 12
#define OSTAIRSDOWN 13
#define OELEVATORDOWN 14
#define OBANK2 15
#define OBANK 16
#define ODEADFOUNTAIN 17
#define OMAXGOLD 70
#define OGOLDPILE 18
#define OOPENDOOR 19
#define OCLOSEDDOOR 20
#define OWALL 21
#define OTRAPARROW 66
#define OTRAPARROWIV 67
#define OLARNEYE 22
#define OPLATE 23
#define OCHAIN 24
#define OLEATHER 25
#define ORING 60
#define OSTUDLEATHER 61
#define OSPLINT 62
#define OPLATEARMOR 63
#define OSSPLATE 64
#define OSHIELD 68
#define OELVENCHAIN 92
#define OSWORDofSLASHING 26
#define OHAMMER 27
#define OSWORD 28
#define O2SWORD 29
#define OSPEAR 30
#define ODAGGER 31
#define OBATTLEAXE 57
#define OLONGSWORD 58
#define OFLAIL 59
#define OLANCE 65
#define OVORPAL 90
#define OSLAYER 91
#define ORINGOFEXTRA 32
#define OREGENRING 33
#define OPROTRING 34
#define OENERGYRING 35
#define ODEXRING 36
#define OSTRRING 37
#define OCLEVERRING 38
#define ODAMRING 39
#define OBELT 40
#define OSCROLL 41
#define OPOTION 42
#define OBOOK 43
#define OCHEST 44
#define OAMULET 45
#define OORBOFDRAGON 46
#define OSPIRITSCARAB 47
#define OCUBEofUNDEAD 48
#define ONOTHEFT 49
#define ODIAMOND 50
#define ORUBY 51
#define OEMERALD 52
#define OSAPPHIRE 53
#define OENTRANCE 54
#define OVOLDOWN 55
#define OVOLUP 56
#define OHOME 69
#define OKGOLD 71
#define ODGOLD 72
#define OIVDARTRAP 73
#define ODARTRAP 74
#define OTRAPDOOR 75
#define OIVTRAPDOOR 76
#define OTRADEPOST 77
#define OIVTELETRAP 78
#define ODEADTHRONE 79
#define OANNIHILATION 80
#define OTHRONE2 81
#define OLRS 82
#define OCOOKIE 83
#define OURN 84
#define OBRASSLAMP 85
#define OHANDofFEAR 86
#define OSPHTAILSMAN 87
#define OWWAND 88
#define OPSTAFF 89
#define BAT 1
#define GNOME 2
#define HOBGOBLIN 3
#define JACKAL 4
#define KOBOLD 5
#define ORC 6
#define SNAKE 7
#define CENTIPEDE 8
#define JACULI 9
#define TROGLODYTE 10
#define ANT 11
#define EYE 12
#define LEPRECHAUN 13
#define NYMPH 14
#define QUASIT 15
#define RUSTMONSTER 16
#define ZOMBIE 17
#define ASSASSINBUG 18
#define BUGBEAR 19
#define HELLHOUND 20
#define ICELIZARD 21
#define CENTAUR 22
#define TROLL 23
#define YETI 24
#define WHITEDRAGON 25
#define ELF 26
#define CUBE 27
#define METAMORPH 28
#define VORTEX 29
#define ZILLER 30
#define VIOLETFUNGI 31
#define WRAITH 32
#define FORVALAKA 33
#define LAMANOBE 34
#define OSEQUIP 35
#define ROTHE 36
#define XORN 37
#define VAMPIRE 38
#define INVISIBLESTALKER 39
#define POLTERGEIST 40
#define DISENCHANTRESS 41
#define SHAMBLINGMOUND 42
#define YELLOWMOLD 43
#define UMBERHULK 44
#define GNOMEKING 45
#define MIMIC 46
#define WATERLORD 47
#define BRONZEDRAGON 48
#define GREENDRAGON 49
#define PURPLEWORM 50
#define XVART 51
#define SPIRITNAGA 52
#define SILVERDRAGON 53
#define PLATINUMDRAGON 54
#define GREENURCHIN 55
#define REDDRAGON 56
#define DEMONLORD 57
#define DEMONPRINCE 64
#define BUFBIG 4096
#define MAXIBUF 4096
#define LOGNAMESIZE 40
#define PSNAMESIZE 40
#ifndef NODEFS
extern char VERSION, SUBVERSION;
extern char aborted[], alpha[], beenhere[], boldon, cheat, ckpfile[], ckpflag;
extern char *class[], course[], diagfile[], fortfile[], helpfile[];
extern char *inbuffer, is_alpha[], is_digit[];
extern char item[MAXX][MAXY], iven[], know[MAXX][MAXY], larnlevels[], lastmonst[];
extern char level, *levelname[], logfile[], loginname[], logname[], *lpbuf, *lpend;
extern char *lpnt, moved[MAXX][MAXY], mitem[MAXX][MAXY], monstlevel[];
extern char monstnamelist[], nch[], ndgg[], nlpts[], nomove, nosignal, nowelcome;
extern char nplt[], nsw[], *objectname[];
extern char objnamelist[], optsfile[], playerids[], potprob[];
extern char predostuff, psname[], restorflag, savefilename[], scorefile[], scprob[];
extern char screen[MAXX][MAXY], sex, *spelcode[], *speldescript[];
extern char spelknow[], *spelname[], *spelmes[], spelweird[MAXMONST + 8][SPNUM];
extern char splev[], stealth[MAXX][MAXY], to_lower[], to_upper[], wizard;
extern short diroffx[], diroffy[], hitflag, hit2flag, hit3flag, hitp[MAXX][MAXY];
extern short iarg[MAXX][MAXY], ivenarg[], lasthx, lasthy, lastnum, lastpx, lastpy;
extern short nobeep, oldx, oldy, playerx, playery;
extern int dayplay, enable_scroll, srcount, yrepcount, userid, wisid,
io_outfd, io_infd;
extern time_t initialtime;
extern long outstanding_taxes, skill[], gtime, c[], cbak[];
extern struct cel *cell;
extern struct monst monster[];
extern struct sphere *spheres;
extern struct _itm itm_[];
extern const char *potionhide[], *potionname[], *scrollhide[], *scrollname[];
void mailbill(void) __dead2;
void makeplayer(void);
void newcavelevel(int);
void eat(int, int);
int fillmonst(char);
#ifdef EXTRA
int diag(void);
#endif
int savegame(char *);
void restoregame(char *);
void bottomline(void);
void bottomhp(void);
void bottomspell(void);
void bottomdo(void);
void bot_linex(void);
void bottomgold(void);
void draws(int, int, int, int);
void drawscreen(void);
void showcell(int, int);
void show1cell(int, int);
void showplayer(void);
int moveplayer(int);
void seemagic(int);
const char *fortune(void);
void raiselevel(void);
void loselevel(void);
void raiseexperience(long);
void loseexperience(long);
void losehp(int);
void losemhp(int);
void raisehp(int);
void raisemhp(int);
void raisemspells(int);
void losemspells(int);
int makemonst(int);
void positionplayer(void);
void recalc(void);
void quit(void);
void more(void);
int take(int, int);
int drop_object(int);
void enchantarmor(void);
void enchweapon(void);
int pocketfull(void);
int nearbymonst(void);
int stealsomething(void);
int emptyhanded(void);
void creategem(void);
void adjustcvalues(int, int);
int getpassword(void);
int getyn(void);
int packweight(void);
#ifndef MACRORND
int rnd(int);
int rund(int);
#endif
void help(void);
void welcome(void);
void setupvt100(void);
void clearvt100(void);
char getchr(void);
void scbr(void);
void sncbr(void);
void newgame(void);
void lprintf(const char *, ...);
void lprint(long);
void lwrite(char *, int);
long lgetc(void);
long lrint_x(void);
void lrfill(char *, int);
char *lgetw(void);
char *lgetl(void);
int lcreat(char *);
int lopen(char *);
int lappend(char *);
void lrclose(void);
void lwclose(void);
void lprcat(const char *);
void cursor(int, int);
void cursors(void);
#ifndef VT100
void init_term(void);
#endif
void cl_line(int, int);
void cl_up(int, int);
void cl_dn(int, int);
void standout(const char *);
void set_score_output(void);
void lflush(void);
#ifndef VT100
char *tmcapcnv(char *, char *);
#endif
void beep(void);
void qshowstr(void);
void show3(int);
void parse2(void);
unsigned long readnum(long);
void createmonster(int);
void createitem(int, int);
void cast(void);
void godirect(int, int, const char *, int, char);
int vxy(int *, int *);
void hitmonster(int, int);
int hitm(int, int, int);
void hitplayer(int, int);
void dropgold(int);
void something(int);
int newobject(int, int *);
void checkloss(int);
long annihilate(void);
long newsphere(int, int, int, int);
long rmsphere(int, int);
void oaltar(void);
void othrone(int);
void odeadthrone(void);
void ochest(void);
void ofountain(void);
void movemonst(void);
void nap(int);
void lookforobject(void);
void oteleport(int);
void quaffpotion(int);
void larn_adjtime(long);
void read_scroll(int);
void readbook(int);
void iopts(void);
void ignore(void);
void regen(void);
void savelevel(void);
void getlevel(void);
int makeboard(void);
int hashewon(void);
long paytaxes(long);
void showscores(void);
void showallscores(void);
void died(int);
void diedlog(void);
#ifndef UIDSCORE
int getplid(char *);
#endif
void sigsetup(void);
void dndstore(void);
void oschool(void);
void obank(void);
void obank2(void);
void ointerest(void);
void otradepost(void);
void olrs(void);
int yylex(void);
void flushall(void);
void sethard(int);
void readopts(void);
#define newscroll() (scprob[rund(81)])
#define newpotion() (potprob[rund(41)])
#define newleather() (nlpts[rund(c[HARDGAME]?13:15)])
#define newchain() (nch[rund(10)])
#define newplate() (nplt[rund(c[HARDGAME]?4:12)])
#define newdagger() (ndgg[rund(13)])
#define newsword() (nsw[rund(c[HARDGAME]?6:13)])
#define forget() (item[playerx][playery]=know[playerx][playery]=0)
#define disappear(x,y) (mitem[x][y]=know[x][y]=0)
#ifdef VT100
#define setbold() (lprcat(boldon?"\33[1m":"\33[7m"))
#define resetbold() (lprcat("\33[m"))
#define setscroll() (lprcat("\33[20;24r"))
#define resetscroll() (lprcat("\33[;24r"))
#define clear() (lprcat("\33[2J\33[f"), cbak[SPELLS]= -50)
#define cltoeoln() lprcat("\33[K")
#else
#define ST_START 1
#define ST_END 2
#define BOLD 3
#define END_BOLD 4
#define CLEAR 5
#define CL_LINE 6
#define CL_DOWN 14
#define CURSOR 15
#define setbold() (*lpnt++ = ST_START)
#define resetbold() (*lpnt++ = ST_END)
#define setscroll() enable_scroll=1
#define resetscroll() enable_scroll=0
#define clear() (*lpnt++ =CLEAR, cbak[SPELLS]= -50)
#define cltoeoln() (*lpnt++ = CL_LINE)
#endif
#define lprc(ch) ((lpnt>=lpend)?(*lpnt++ =(ch), lflush()):(*lpnt++ = (ch)))
#ifdef MACRORND
extern unsigned long randx;
#define srand(x) (randx=x)
#define rnd(x) ((((randx=randx*1103515245+12345)>>7)%(x))+1)
#define rund(x) ((((randx=randx*1103515245+12345)>>7)%(x)) )
#endif
#define min(x,y) (((x)>(y))?(y):(x))
#define max(x,y) (((x)>(y))?(x):(y))
#define isalpha(x) (is_alpha[x])
#define isdigit(x) (is_digit[x])
#define tolower(x) (to_lower[x])
#define toupper(x) (to_upper[x])
#define lcc(x) (to_lower[x])
#define ucc(x) (to_upper[x])
#endif