home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
games
/
volume7
/
nethack3
/
patch6o
< prev
next >
Wrap
Internet Message Format
|
1989-11-27
|
62KB
Path: uunet!zephyr.ens.tek.com!tekgen!tekred!saab!billr
From: billr@saab.CNA.TEK.COM (Bill Randle)
Newsgroups: comp.sources.games
Subject: v08i068: NetHack3 - display oriented dungeons & dragons (Ver. 3.0), Patch6o
Message-ID: <4857@tekred.CNA.TEK.COM>
Date: 22 Nov 89 19:57:01 GMT
Sender: nobody@tekred.CNA.TEK.COM
Lines: 2398
Approved: billr@saab.CNA.TEK.COM
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 8, Issue 68
Archive-name: NetHack3/Patch6o
Patch-To: NetHack3: Volume 7, Issue 56-93
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 15 (of 15)."
# Contents: include/extern.h src/dbridge.c
# Wrapped by billr@saab on Wed Nov 22 10:50:23 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'include/extern.h' -a "${1}" != "-c" ; then
echo shar: clobbering existing file \"'include/extern.h'\"
fi
echo shar: Extracting \"'include/extern.h'\" \(37999 characters\)
sed "s/^X//" >'include/extern.h' <<'END_OF_FILE'
X/* SCCS Id: @(#)extern.h 3.0 88/10/18 */
X/* Copyright (c) Steve Creps, 1988. */
X/* NetHack may be freely redistributed. See license for details. */
X
X#ifndef EXTERN_H
X#define EXTERN_H
X
X#if defined(MSDOS) && defined(MSC)
X/* MSC include files do not contain "extern" keyword */
X#define E
X#else
X#define E extern
X#endif
X
X/* ### allmain.c ### */
X
XE int (*occupation)();
XE int (*afternmv)();
XE void moveloop();
XE void stop_occupation();
XE void newgame();
X
X/* ### alloc.c ### */
X
X#ifndef __TURBOC__
XE long *FDECL(alloc, (unsigned int));
X#endif
X
X#if !defined(MAKEDEFS_C) && !defined(LEV_LEX_C)
X
X/* ### apply.c ### */
X
X#ifdef OVERLAY
XE int dig();
X#endif
XE int doapply();
XE int holetime();
XE void dighole();
XE int dorub();
XE int dojump();
X#ifdef WALKIES
XE int number_leashed();
XE void FDECL(o_unleash, (struct obj *));
XE void FDECL(m_unleash, (struct monst *));
XE void unleash_all();
XE boolean next_to_u();
XE struct obj *FDECL(get_mleash, (struct monst *));
XE void FDECL(check_leash, (XCHAR_P,XCHAR_P));
X#endif
XE boolean FDECL(um_dist, (XCHAR_P,XCHAR_P,XCHAR_P));
XE int FDECL(use_unicorn_horn, (struct obj *));
X
X/* ### artifact.c ### */
X
X#ifdef NAMED_ITEMS
XE void FDECL(mkartifact, (struct obj **));
XE boolean FDECL(is_artifact, (struct obj *));
XE boolean FDECL(spec_ability, (struct obj *,unsigned));
XE int FDECL(restr_name, (struct obj *,char *));
X# if defined(THEOLOGY) && defined(ALTARS)
XE struct obj *FDECL(mk_aligned_artifact, (unsigned));
X# endif
XE int FDECL(defends, (int,struct obj *));
XE int FDECL(spec_abon, (struct obj *,struct permonst *));
XE int FDECL(spec_dbon, (struct obj *,struct permonst *,int));
X#endif
X
X/* ### attrib.c ### */
X
XE void FDECL(adjattrib, (int,int,BOOLEAN_P));
XE void FDECL(change_luck, (SCHAR_P));
XE int FDECL(stone_luck, (BOOLEAN_P));
XE void FDECL(gainstr, (struct obj *,int));
XE void FDECL(losestr, (int));
XE void restore_attrib();
XE void FDECL(init_attr, (int));
XE void redist_attr();
XE void FDECL(adjabil, (int));
XE int newhp();
XE schar acurr();
XE void FDECL(adjalign, (int));
X
X/* ### bones.c ### */
X
XE void savebones();
XE int getbones();
XE void FDECL(name_file, (char *,int));
X
X/* ### cmd.c ### */
X
X#ifdef OVERLAY
XE int doextcmd();
X#ifdef POLYSELF
XE int domonability();
X#endif /* POLYSELF */
XE int timed_occupation();
X#if defined(WIZARD) || defined(EXPLORE_MODE)
XE int wiz_attributes();
X#endif /* WIZARD */
X#ifdef WIZARD
XE int wiz_detect();
XE int wiz_genesis();
XE int wiz_identify();
XE int wiz_level_tele();
XE int wiz_map();
XE int wiz_where();
XE int wiz_wish();
X#endif /* WIZARD */
X#endif /* OVERLAY */
XE void reset_occupations();
XE void FDECL(set_occupation, (int(*)(),char *,int));
X#ifdef REDO
XE char pgetchar();
XE void FDECL(pushch, (CHAR_P));
XE void FDECL(savech, (CHAR_P));
X#endif
XE void FDECL(rhack, (char *));
XE char FDECL(lowc, (CHAR_P));
XE void enlightenment();
XE int FDECL(xytod, (SCHAR_P,SCHAR_P));
XE void FDECL(dtoxy, (coord *,int));
XE int FDECL(movecmd, (CHAR_P));
XE int FDECL(getdir, (BOOLEAN_P));
XE void confdir();
XE int FDECL(isok, (int,int));
XE int doextlist();
X
X/* ### dbridge.c ### */
X
XE boolean FDECL(is_pool, (int,int));
X#ifdef STRONGHOLD
XE void FDECL(initsym, (int,int));
XE int FDECL(is_drawbridge_wall, (int, int));
XE boolean FDECL(is_db_wall, (int, int));
XE boolean FDECL(find_drawbridge, (int *, int*));
XE boolean FDECL(create_drawbridge, (int, int, int, BOOLEAN_P));
XE void FDECL(open_drawbridge, (int, int));
XE void FDECL(close_drawbridge, (int, int));
XE void FDECL(destroy_drawbridge, (int, int));
X#endif /* STRONGHOLD /**/
X
X/* ### decl.c ### */
X
X/* ### demon.c ### */
X
XE void FDECL(dsummon, (struct permonst *));
XE int FDECL(demon_talk, (struct monst *));
XE long FDECL(bribe, (struct monst *));
XE int dprince();
XE int dlord();
XE int ndemon();
X
X/* ### do.c ### */
X
X#ifdef OVERLAY
XE int FDECL(drop, (struct obj *));
XE int wipeoff();
X#endif
XE int dodrop();
XE boolean FDECL(flooreffects, (struct obj *,int,int));
XE void FDECL(doaltarobj, (struct obj *));
XE boolean FDECL(canletgo, (struct obj *,char *));
XE void FDECL(dropx, (struct obj *));
XE void FDECL(dropy, (struct obj *));
XE int doddrop();
XE int dodown();
XE int doup();
XE void FDECL(goto_level, (int,BOOLEAN_P,BOOLEAN_P));
XE int donull();
XE int dowipe();
XE struct obj *FDECL(splitobj, (struct obj *,int));
XE void FDECL(set_wounded_legs, (long,int));
XE void heal_legs();
X
X/* ### do_name.c ### */
X
XE void FDECL(getpos, (coord *,int,char *));
XE int do_mname();
XE struct obj *FDECL(oname, (struct obj *,char *,int));
XE int ddocall();
XE void FDECL(docall, (struct obj *));
XE char *FDECL(x_monnam, (struct monst *,int));
XE char *FDECL(lmonnam, (struct monst *));
XE char *FDECL(mon_nam, (struct monst *));
XE char *FDECL(Monnam, (struct monst *));
XE char *FDECL(a_monnam, (struct monst *,char *));
XE char *FDECL(a2_monnam, (struct monst *,char *));
XE char *FDECL(Amonnam, (struct monst *,char *));
XE char *FDECL(Xmonnam, (struct monst *));
XE char *FDECL(defmonnam, (struct monst *));
XE char *rndmonnam();
X#ifdef REINCARNATION
XE char *roguename();
X#endif
X
X/* ### do_wear.c ### */
X
X#ifdef OVERLAY
XE int Armor_on();
XE int Boots_on();
XE int Gloves_on();
XE int Helmet_on();
XE int FDECL(select_off, (struct obj *otmp));
XE int take_off();
X#endif
XE void FDECL(off_msg, (struct obj *));
XE boolean FDECL(is_helmet, (struct obj *));
XE boolean FDECL(is_gloves, (struct obj *));
XE boolean FDECL(is_boots, (struct obj *));
XE boolean FDECL(is_cloak, (struct obj *));
XE boolean FDECL(is_shield, (struct obj *));
XE void set_wear();
XE boolean FDECL(donning, (struct obj *));
XE int Armor_off();
XE int Armor_gone();
XE int Helmet_off();
XE int Gloves_off();
XE int Boots_off();
XE int Cloak_off();
XE int Shield_off();
XE void Amulet_off();
XE void FDECL(Ring_on, (struct obj *));
XE void FDECL(Ring_off, (struct obj *));
XE void FDECL(Ring_gone, (struct obj *));
XE void FDECL(Blindf_on, (struct obj *));
XE void FDECL(Blindf_off, (struct obj *));
XE int dotakeoff();
XE int doremring();
XE int FDECL(cursed, (struct obj *));
XE int FDECL(armoroff, (struct obj *));
XE int dowear();
XE int doputon();
XE void find_ac();
XE void glibr();
XE struct obj *some_armor();
XE void corrode_armor();
XE void reset_remarm();
XE int doddoremarm();
XE int FDECL(destroy_arm, (struct obj *));
XE void FDECL(adj_abon, (struct obj *,SCHAR_P));
X
X/* ### dog.c ### */
X
XE void FDECL(initedog, (struct monst *));
XE void FDECL(make_familiar, (struct obj *));
XE struct monst *makedog();
XE void losedogs();
XE void keepdogs();
XE void FDECL(fall_down, (struct monst *,int));
XE int FDECL(dogfood, (struct monst *,struct obj *));
XE int FDECL(inroom, (XCHAR_P,XCHAR_P));
XE int FDECL(tamedog, (struct monst *,struct obj *));
X
X/* ### dogmove.c ### */
X
XE int FDECL(dog_move, (struct monst *,int));
X
X/* ### dokick.c ### */
X
XE boolean FDECL(ghitm, (struct monst *,long));
XE boolean FDECL(bad_kick_throw_pos, (XCHAR_P,XCHAR_P));
XE struct monst *FDECL(ghit, (int,int,int));
XE int dokick();
X
X/* ### dothrow.c ### */
X
XE int dothrow();
XE int FDECL(throwit, (struct obj *));
XE int FDECL(thitmonst, (struct monst *,struct obj *));
XE int FDECL(breaks, (struct obj *,BOOLEAN_P));
X
X/* ### eat.c ### */
X
X#ifdef OVERLAY
XE int Meatdone();
XE int eatfood();
XE int opentin();
XE int unfaint();
X#endif
XE void init_uhunger();
XE int Hear_again();
XE void reset_eat();
XE int doeat();
XE void gethungry();
XE void FDECL(morehungry, (int));
XE void FDECL(lesshungry, (int));
XE void FDECL(newuhs, (BOOLEAN_P));
XE struct obj *FDECL(floorfood, (char *,BOOLEAN_P));
XE void vomit();
XE int FDECL(eaten_stat, (int, struct obj *));
X
X/* ### end.c ### */
X
XE int done1();
XE int done2();
XE void FDECL(done_in_by, (struct monst *));
XE void VDECL(panic, (char *,...));
XE void FDECL(done, (int));
XE void clearlocks();
X#ifdef NOSAVEONHANGUP
XE void hangup();
X#endif
X
X/* ### engrave.c ### */
X
X#ifdef ELBERETH
XE int FDECL(sengr_at, (char *,XCHAR_P,XCHAR_P));
X#endif
XE void FDECL(u_wipe_engr, (int));
XE void FDECL(wipe_engr_at, (XCHAR_P,XCHAR_P,XCHAR_P));
XE void FDECL(read_engr_at, (int,int));
XE void FDECL(make_engr_at, (int,int,char *));
XE int freehand();
XE int doengrave();
XE void FDECL(save_engravings, (int));
XE void FDECL(rest_engravings, (int));
X
X/* ### exper.c ### */
X
XE long FDECL(newuexp, (unsigned));
XE int FDECL(experience, (struct monst *,int));
XE void FDECL(more_experienced, (int,int));
XE void losexp();
XE void newexplevel();
XE void pluslvl();
XE long rndexp();
X
X/* ### extralev.c ### */
X
X#ifdef REINCARNATION
XE void makeroguerooms();
XE void FDECL(corr, (int,int));
XE void makerogueghost();
X#endif
X
X/* ### fountain.c ### */
X
X#ifdef FOUNTAINS
XE void dryup();
XE void drinkfountain();
XE void FDECL(dipfountain, (struct obj *));
X#endif /* FOUNTAINS */
X#ifdef SINKS
XE void drinksink();
X#endif
X
X/* ### getline.c ### */
X
XE void FDECL(getlin, (char *));
XE void getret();
XE void FDECL(cgetret, (char *));
XE void FDECL(xwaitforspace, (char *));
XE char *parse();
XE char readchar();
X#ifdef COM_COMPL
XE void FDECL(get_ext_cmd, (char *));
X#endif /* COM_COMPL */
X
X/* ### hack.c ### */
X
XE void unsee();
XE void FDECL(seeoff, (int));
XE void FDECL(movobj, (struct obj *,XCHAR_P,XCHAR_P));
XE boolean FDECL(may_dig, (XCHAR_P,XCHAR_P));
XE void domove();
XE void spoteffects();
XE int dopickup();
XE void lookaround();
XE int monster_nearby();
XE int FDECL(cansee, (XCHAR_P,XCHAR_P));
XE int FDECL(sgn, (int));
XE void FDECL(getcorners, (xchar *,xchar *,xchar *,xchar *,xchar *,xchar *,xchar *,xchar *));
XE void setsee();
XE void FDECL(nomul, (int));
XE void FDECL(losehp, (int,const char *));
XE int weight_cap();
XE int inv_weight();
XE int inv_cnt();
XE int FDECL(identify, (struct obj *));
X#ifdef STUPID_CPP /* otherwise these functions are macros in hack.h */
XE char yn();
XE char ynq();
XE char ynaq();
XE char nyaq();
XE char *FDECL(plur, (long));
XE void FDECL(makeknown, (unsigned));
X#endif
X
X/* ### invent.c ### */
X
X#ifdef OVERLAY
XE int FDECL(ckunpaid, (struct obj *));
X#endif
XE struct obj *FDECL(addinv, (struct obj *));
XE void FDECL(useup, (struct obj *));
XE void FDECL(freeinv, (struct obj *));
XE void FDECL(delobj, (struct obj *));
XE void FDECL(freeobj, (struct obj *));
XE void FDECL(freegold, (struct gold *));
XE struct obj *FDECL(sobj_at, (int,int,int));
XE int FDECL(carried, (struct obj *));
XE struct obj *FDECL(carrying, (int));
XE boolean have_lizard();
XE struct obj *FDECL(o_on, (unsigned int,struct obj *));
XE boolean FDECL(obj_here, (struct obj *,int,int));
XE struct gold *FDECL(g_at, (int,int));
XE struct obj *FDECL(getobj, (const char *,const char *));
XE int FDECL(ggetobj, (char *,int(*)(),int));
XE int FDECL(askchain, (struct obj *,int,char *,int,int(*)(),int(*)(),int,char *));
XE void FDECL(prinv, (struct obj *));
XE int ddoinv();
XE void FDECL(doinv, (char *));
XE int dotypeinv();
XE int dolook();
XE void FDECL(stackobj, (struct obj *));
XE int doprgold();
XE int doprwep();
XE int doprarm();
XE int doprring();
XE int dopramulet();
XE int doprtool();
XE int FDECL(digit, (CHAR_P));
XE void FDECL(useupf, (struct obj *));
XE char *FDECL(let_to_name, (CHAR_P));
XE void reassign();
X
X/* ### ioctl.c ### */
X
X#ifdef UNIX
XE void getioctls();
XE void setioctls();
X# ifdef SUSPEND
XE int dosuspend();
X# endif /* SUSPEND */
X#endif /* UNIX */
X
X/* ### lock.c ### */
X
X#ifdef OVERLAY
XE int forcelock();
XE int picklock();
X#endif
XE void reset_pick();
XE int FDECL(pick_lock, (struct obj *));
XE int doforce();
XE int FDECL(boxlock, (struct obj *,struct obj *));
XE int FDECL(doorlock, (struct obj *,int,int));
XE int doopen();
XE int doclose();
X
X/* ### mac.c ### */
X#ifdef MACOS
XE int tgetch();
XE void gethdate();
XE int uptodate();
X# ifndef THINKC4
XE char *getenv();
XE int memcmp();
X# else
XE int kbhit();
X# endif
XE int mcurs();
XE int mputc();
XE int mputs();
XE int mprintf();
XE int about();
X#endif /* MACOS */
X
X/* ### macfile.c ### */
X#ifdef MACOS
XE short findNamedFile();
XE FILE *openFile();
X#endif /* MACOS */
X
X/* ### macinit.c ### */
X#ifdef MACOS
XE int initterm();
XE int freeterm();
X#ifdef SMALLDATA
XE void init_decl();
XE void free_decl();
X#endif /* SMALLDATA */
X#endif /* MACOS */
X
X/* ### mail.c ### */
X
X#ifdef MAIL
X# ifdef UNIX
XE void getmailstatus();
X# endif
XE void ckmailstatus();
XE void readmail();
X#endif /* MAIL */
X
X/* ### makemon.c ### */
X
XE struct monst *FDECL(makemon, (struct permonst *,int,int));
XE void FDECL(enexto, (coord *,XCHAR_P,XCHAR_P,struct permonst *));
XE int FDECL(goodpos, (int,int, struct permonst *));
XE void FDECL(rloc, (struct monst *));
XE void FDECL(vloc, (struct monst *));
XE void init_monstr();
XE struct permonst *rndmonst();
XE struct permonst *FDECL(mkclass, (CHAR_P));
XE int FDECL(adj_lev, (struct permonst *));
XE struct permonst *FDECL(grow_up, (struct monst *));
XE int FDECL(mongets, (struct monst *,int));
X#ifdef REINCARNATION
XE struct permonst *roguemon();
X#endif
X#ifdef GOLEMS
XE int FDECL(golemhp, (int));
X#endif /* GOLEMS */
XE boolean FDECL(peace_minded, (struct permonst *));
XE void FDECL(set_malign, (struct monst *));
XE void FDECL(set_mimic_sym, (struct monst *));
X
X/* ### mcastu.c ### */
X
XE int FDECL(castmu, (struct monst *,struct attack *));
XE int FDECL(buzzmu, (struct monst *,struct attack *));
X
X/* ### mhitm.c ### */
X
XE int FDECL(fightm, (struct monst *));
XE int FDECL(mattackm, (struct monst *,struct monst *));
XE int FDECL(noattacks, (struct permonst *));
X
X/* ### mhitu.c ### */
X
X#ifdef POLYSELF
XE struct monst *cloneu();
X#endif
XE void FDECL(regurgitates, (struct monst *));
XE int FDECL(mattacku, (struct monst *));
XE void FDECL(mdamageu, (struct monst *,int));
XE int FDECL(could_seduce, (struct monst *,struct monst *,struct attack *));
X#ifdef SEDUCE
XE int FDECL(doseduce, (struct monst *));
X#endif
X
X/* ### mklev.c ### */
X
XE int FDECL(somex, (struct mkroom *));
XE int FDECL(somey, (struct mkroom *));
X#ifdef ORACLE
XE boolean FDECL(place_oracle, (struct mkroom *,int *,int *,int *));
X#endif
XE void mklev();
XE int FDECL(okdoor, (XCHAR_P,XCHAR_P));
XE void FDECL(dodoor, (int,int,struct mkroom *));
XE void FDECL(mktrap, (int,int,struct mkroom *));
XE void FDECL(mkfount, (int,struct mkroom *));
X
X/* ### mkmaze.c ### */
X
X#if defined(WALLIFIED_MAZE) || defined(STRONGHOLD)
XE void FDECL(wallification, (int,int,int,int,BOOLEAN_P));
X#endif
XE void FDECL(walkfrom, (int,int));
XE void makemaz();
XE void FDECL(move, (int *,int *,int));
XE void FDECL(mazexy, (coord *));
XE void bound_digging();
X
X/* ### mkobj.c ### */
X
XE struct obj *FDECL(mkobj_at, (CHAR_P,int,int));
XE struct obj *FDECL(mksobj_at, (int,int,int));
XE struct obj *FDECL(mkobj, (CHAR_P,BOOLEAN_P));
XE int rndmonnum();
XE struct obj *FDECL(mksobj, (int,BOOLEAN_P));
XE int FDECL(letter, (int));
XE int FDECL(weight, (struct obj *));
XE void FDECL(mkgold, (long,int,int));
XE struct obj *FDECL(mkcorpstat, (int,struct permonst *,int,int));
XE struct obj *FDECL(mk_tt_object, (int,int,int));
XE struct obj *FDECL(mk_named_object, (int,struct permonst *,int,int,char *,int));
XE void FDECL(bless, (struct obj *));
XE void FDECL(curse, (struct obj *));
XE void FDECL(blessorcurse, (struct obj *,int));
X#ifdef STUPID_CPP
XE boolean FDECL(is_flammable, (struct obj *));
XE boolean FDECL(is_rustprone, (struct obj *));
XE boolean FDECL(is_corrodeable, (struct obj *));
XE boolean FDECL(OBJ_AT, (int, int));
X#endif
XE void FDECL(place_object, (struct obj *,int,int));
XE void FDECL(move_object, (struct obj *,int,int));
XE void FDECL(remove_object, (struct obj *));
X
X/* ### mkroom.c ### */
X
XE void FDECL(mkroom, (int));
XE void FDECL(shrine_pos, (int *, int*, struct mkroom *));
XE boolean FDECL(nexttodoor, (int,int));
XE boolean FDECL(has_dnstairs, (struct mkroom *));
XE boolean FDECL(has_upstairs, (struct mkroom *));
XE int FDECL(dist2, (int,int,int,int));
XE struct permonst *courtmon();
XE int FDECL(bcsign, (struct obj *));
X
X/* ### mon.c ### */
X
XE void movemon();
XE void FDECL(meatgold, (struct monst *));
XE void FDECL(meatobj, (struct monst *));
XE void FDECL(mpickgold, (struct monst *));
XE void FDECL(mpickgems, (struct monst *));
XE int FDECL(curr_mon_load, (struct monst *));
XE int FDECL(max_mon_load, (struct monst *));
XE boolean FDECL(can_carry, (struct monst *,struct obj *));
XE void FDECL(mpickstuff, (struct monst *,char *));
XE int FDECL(mfndpos, (struct monst *,coord *,long *,long));
XE int FDECL(dist, (int,int));
XE boolean FDECL(monnear, (struct monst *,int,int));
XE void FDECL(poisontell, (int));
XE void FDECL(poisoned, (char *,int,char *));
XE void FDECL(mondead, (struct monst *));
XE void FDECL(replmon, (struct monst *,struct monst *));
XE void FDECL(relmon, (struct monst *));
XE void FDECL(monfree, (struct monst *));
XE void FDECL(unstuck, (struct monst *));
XE void FDECL(killed, (struct monst *));
XE void FDECL(xkilled, (struct monst *,int));
XE void rescham();
XE void restartcham();
XE int FDECL(newcham, (struct monst *,struct permonst *));
XE void FDECL(mnexto, (struct monst *));
XE void FDECL(mnearto, (struct monst *, XCHAR_P, XCHAR_P, BOOLEAN_P));
XE void FDECL(setmangry, (struct monst *));
XE int FDECL(disturb, (struct monst *));
XE void FDECL(mondied, (struct monst *));
XE void FDECL(mongone, (struct monst *));
XE void FDECL(monstone, (struct monst *));
X#ifdef GOLEMS
XE void FDECL(golemeffects, (struct monst *, int, int));
X#endif /* GOLEMS */
X
X/* ### mondata.c ### */
X
XE boolean FDECL(attacktype, (struct permonst *,int));
XE boolean FDECL(resists_ston, (struct permonst *));
XE boolean FDECL(resists_drli, (struct permonst *));
XE boolean FDECL(ranged_attk, (struct permonst *));
XE boolean FDECL(can_track, (struct permonst *));
X#ifdef POLYSELF
XE boolean FDECL(breakarm, (struct permonst *));
XE boolean FDECL(sliparm, (struct permonst *));
X#endif
XE boolean FDECL(sticks, (struct permonst *));
XE boolean FDECL(canseemon, (struct monst *));
XE boolean FDECL(dmgtype, (struct permonst *,int));
XE int FDECL(monsndx, (struct permonst *));
XE int FDECL(name_to_mon, (char *));
X#ifdef POLYSELF
XE boolean FDECL(webmaker, (struct permonst *));
X#endif
XE boolean FDECL(is_female, (struct monst *));
XE int FDECL(gender, (struct monst *));
XE boolean FDECL(levl_follower, (struct monst *));
XE struct permonst *player_mon();
XE int FDECL(little_to_big, (int));
XE int FDECL(big_to_little, (int));
X
X/* ### monmove.c ### */
X
XE boolean FDECL(mb_trapped, (struct monst *));
XE int FDECL(dochugw, (struct monst *));
XE boolean FDECL(onscary, (int,int,struct monst *));
XE int FDECL(dochug, (struct monst *));
XE int FDECL(m_move, (struct monst *,int));
XE void FDECL(set_apparxy, (struct monst *));
XE boolean FDECL(mdig_tunnel, (struct monst *));
X#ifdef STUPID_CPP
XE boolean FDECL(MON_AT, (int, int));
XE void FDECL(place_monster, (struct monst *, int, int));
XE void FDECL(place_worm_seg, (struct monst *, int, int));
XE void FDECL(remove_monster, (int, int));
XE struct monst *FDECL(m_at, (int, int));
X#endif
X
X/* ### monst.c ### */
X
X/* ### msdos.c ### */
X
X#ifdef MSDOS
XE void flushout();
XE int tgetch();
XE int dosh();
X# ifdef DGK
XE long FDECL(freediskspace, (char *));
XE long FDECL(filesize, (char *));
XE void FDECL(eraseall, (const char *,const char *));
XE void FDECL(copybones, (int));
XE void playwoRAMdisk();
XE int FDECL(saveDiskPrompt, (int));
XE void gameDiskPrompt();
X# endif
XE void read_config_file();
XE void set_lock_and_bones();
XE void FDECL(append_slash, (char *));
XE void FDECL(getreturn, (const char *));
XE void VDECL(msmsg, (const char *,...));
XE void FDECL(chdrive, (char *));
X# ifndef TOS
XE void disable_ctrlP();
XE void enable_ctrlP();
X# endif
X# ifdef DGK
XE FILE *FDECL(fopenp, (char *,char *));
X# endif
XE void FDECL(msexit, (int));
X# ifdef DGK
XE void get_scr_size();
X# endif
X#endif /* MSDOS */
X#ifdef TOS
XE int FDECL(_copyfile, (char *, char *));
XE int kbhit();
XE void restore_colors();
XE void set_colors();
X#endif /* TOS */
X
X/* ### mthrowu.c ### */
X
XE int FDECL(thitu, (int,int,struct obj *,char *));
XE int FDECL(thrwmu, (struct monst *));
XE int FDECL(spitmu, (struct monst *));
XE int FDECL(breamu, (struct monst *,struct attack *));
XE boolean FDECL(linedup, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P));
XE boolean FDECL(lined_up, (struct monst *));
XE struct obj *FDECL(m_carrying, (struct monst *,int));
XE void FDECL(m_useup, (struct monst *,struct obj *));
X
X/* ### music.c ### */
X
X#ifdef MUSIC
XE int FDECL(do_play_instrument, (struct obj *));
X#endif /* MUSIC /**/
X
X/* ### o_init.c ### */
X
XE int FDECL(letindex, (CHAR_P));
XE void init_objects();
XE void oinit();
XE void FDECL(savenames, (int));
XE void FDECL(restnames, (int));
XE int dodiscovered();
X
X/* ### objnam.c ### */
X
XE char *FDECL(typename, (int));
XE char *FDECL(distant_name, (struct obj *, char *(*)(struct obj *)));
XE char *FDECL(xname, (struct obj *));
XE char *FDECL(doname, (struct obj *));
XE char *FDECL(singular, (struct obj *, char *(*)(struct obj *)));
XE char *FDECL(an, (char *));
XE char *FDECL(An, (char *));
XE char *FDECL(aobjnam, (struct obj *,char *));
XE char *FDECL(Doname2, (struct obj *));
XE void FDECL(lcase, (char *));
XE char *FDECL(makeplural, (char *));
XE struct obj *FDECL(readobjnam, (char *));
X
X/* ### options.c ### */
X
XE void initoptions();
XE void FDECL(assign_graphics, (unsigned int *, int));
XE void FDECL(parseoptions, (char *,BOOLEAN_P));
XE int doset();
XE int dotogglepickup();
XE void option_help();
X#ifdef TUTTI_FRUTTI
XE int FDECL(fruitadd, (char *));
X#endif
X
X/* ### pager.c ### */
X
XE int dowhatis();
XE int dowhatdoes();
XE void set_whole_screen();
X#ifdef NEWS
XE int readnews();
X#endif /* NEWS */
XE void FDECL(set_pager, (int));
XE int FDECL(page_line, (char *));
XE void FDECL(cornline, (int,char *));
XE int dohelp();
XE int dohistory();
XE int FDECL(page_file, (char *,BOOLEAN_P));
X#ifdef UNIX
X# ifdef SHELL
XE int dosh();
X# endif /* SHELL */
X# if defined(SHELL) || defined(DEF_PAGER) || defined(DEF_MAILREADER)
XE int FDECL(child, (int));
X# endif
X#endif /* UNIX */
X
X/* ### pcmain.c ### */
X
X#if defined(MSDOS) || defined(MACOS)
XE void askname();
X# ifdef CHDIR
XE void FDECL(chdirx, (char *,BOOLEAN_P));
X# endif /* CHDIR */
X#endif /* MSDOS || MACOS */
X
X/* ### pctty.c ### */
X
X#if defined(MSDOS) || defined(MACOS)
XE void gettty();
XE void FDECL(settty, (char *));
XE void VDECL(error, (char *,...));
X#endif /* MSDOS || MACOS */
X
X/* ### pcunix.c ### */
X
X#if defined(MSDOS) || defined(MACOS)
X# ifndef OLD_TOS
XE void setrandom();
XE int getyear();
XE char *getdate();
XE int phase_of_the_moon();
XE int night();
XE int midnight();
XE void FDECL(gethdate, (char *));
XE int FDECL(uptodate, (int));
X# endif /* TOS */
XE void FDECL(regularize, (char *));
X#endif /* MSDOS */
X
X/* ### pickup.c ### */
X
X#ifdef OVERLAY
XE int ck_bag();
XE int FDECL(ck_container, (struct obj *));
XE int FDECL(in_container, (struct obj *));
XE int FDECL(out_container, (struct obj *));
X#endif
XE void FDECL(pickup, (int));
XE struct obj *FDECL(pick_obj, (struct obj *));
XE int doloot();
XE void get_all_from_box();
XE void FDECL(use_container, (struct obj *, int));
XE void FDECL(inc_cwt, (struct obj *, struct obj *));
XE void FDECL(delete_contents, (struct obj *));
XE void FDECL(dec_cwt, (struct obj *, struct obj *));
X
X/* ### polyself.c ### */
X
XE void newman();
X#ifdef POLYSELF
XE void polyself();
XE int FDECL(polymon, (int));
XE void rehumanize();
XE int dobreathe();
XE int dospit();
XE int doremove();
XE int dospinweb();
XE int dosummon();
XE int doconfuse();
XE int dohide();
X#endif
XE char *FDECL(body_part, (int));
XE int poly_gender();
X#ifdef POLYSELF
X# ifdef GOLEMS
XE void FDECL(ugolemeffects, (int, int));
X# endif /* GOLEMS */
X#endif
X
X/* ### potion.c ### */
X
XE void FDECL(make_confused, (long,BOOLEAN_P));
XE void FDECL(make_stunned, (long,BOOLEAN_P));
XE void FDECL(make_blinded, (long,BOOLEAN_P));
XE void FDECL(make_sick, (long,BOOLEAN_P));
XE void FDECL(make_vomiting, (long,BOOLEAN_P));
XE void FDECL(make_hallucinated, (long,BOOLEAN_P));
XE int dodrink();
XE int FDECL(dopotion, (struct obj *));
XE int FDECL(peffects, (struct obj *));
XE void FDECL(healup, (int,int,BOOLEAN_P,BOOLEAN_P));
XE void FDECL(strange_feeling, (struct obj *,char *));
XE void FDECL(potionhit, (struct monst *,struct obj *));
XE void FDECL(potionbreathe, (struct obj *));
XE boolean FDECL(get_wet, (struct obj *));
XE int dodip();
XE void FDECL(djinni_from_bottle, (struct obj *));
XE int FDECL(monster_detect, (struct obj *));
XE int FDECL(object_detect, (struct obj *));
XE int FDECL(trap_detect, (struct obj *));
X
X/* ### pray.c ### */
X
X# ifdef THEOLOGY
XE int dosacrifice();
XE int dopray();
XE char *u_gname();
X#endif /* THEOLOGY */
XE int doturn();
X#ifdef ALTARS
XE char *a_gname();
XE char *FDECL(a_gname_at, (XCHAR_P,XCHAR_P));
X# ifdef THEOLOGY
XE void FDECL(altar_wrath, (int,int));
X# endif
X#endif
X
X/* ### pri.c ### */
X
XE void swallowed();
XE void setclipped();
X#ifdef CLIPPING
XE void FDECL(cliparound, (int, int));
X#endif
XE boolean FDECL(showmon, (struct monst *));
XE void FDECL(at, (XCHAR_P,XCHAR_P,UCHAR_P,UCHAR_P));
XE void prme();
XE void FDECL(shieldeff, (XCHAR_P,XCHAR_P));
XE int doredraw();
XE void docrt();
XE void FDECL(docorner, (int,int));
XE void seeglds();
XE void seeobjs();
XE void seemons();
XE void FDECL(pmon, (struct monst *));
XE void FDECL(unpmon, (struct monst *));
XE void nscr();
XE void bot();
XE void FDECL(mstatusline, (struct monst *));
XE void ustatusline();
XE void cls();
XE void max_rank_sz();
XE char rndmonsym();
XE char rndobjsym();
XE const char *hcolor();
X
X/* ### priest.c ### */
X
XE int FDECL(move_special, (struct monst *,SCHAR_P,SCHAR_P,BOOLEAN_P,BOOLEAN_P,
X XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P));
X#if defined(ALTARS) && defined(THEOLOGY)
XE struct mkroom *FDECL(in_temple, (int,int));
XE int FDECL(pri_move, (struct monst *));
XE void FDECL(priestini, (int,int,int,int));
XE char *FDECL(priestname, (struct monst *));
XE boolean FDECL(p_coaligned, (struct monst *));
XE void intemple();
XE void FDECL(priest_talk, (struct monst *));
XE boolean FDECL(u_in_sanctuary, (struct mkroom *));
XE void ghod_hitsu();
XE void angry_priest();
X#endif
X
X/* ### prisym.c ### */
X
XE void FDECL(atl, (int,int,CHAR_P));
XE void FDECL(on_scr, (int,int));
XE void FDECL(tmp_at, (int,int));
XE void FDECL(Tmp_at2, (int,int));
XE void curs_on_u();
XE void pru();
XE void FDECL(prl, (int,int));
XE uchar FDECL(news0, (XCHAR_P,XCHAR_P));
XE void FDECL(newsym, (int,int));
XE void FDECL(mnewsym, (int,int));
XE void FDECL(nosee, (int,int));
XE void FDECL(prl1, (int,int));
XE void FDECL(nose1, (int,int));
XE int FDECL(vism_at, (int,int));
X#ifdef NEWSCR
XE void FDECL(pobj, (struct obj *));
X#endif /* NEWSCR */
XE void FDECL(unpobj, (struct obj *));
X#ifdef STUPID_CPP /* otherwise these functions are macros in rm.h */
XE boolean FDECL(IS_WALL, (unsigned));
XE boolean FDECL(IS_STWALL, (unsigned));
XE boolean FDECL(IS_ROCK, (unsigned));
XE boolean FDECL(IS_DOOR, (unsigned));
XE boolean FDECL(IS_FLOOR, (unsigned));
XE boolean FDECL(ACCESSIBLE, (unsigned));
XE boolean FDECL(IS_ROOM, (unsigned));
XE boolean FDECL(ZAP_POS, (unsigned));
XE boolean FDECL(SPACE_POS, (unsigned));
XE boolean FDECL(IS_POOL, (unsigned));
XE boolean FDECL(IS_THRONE, (unsigned));
XE boolean FDECL(IS_FOUNTAIN, (unsigned));
XE boolean FDECL(IS_SINK, (unsigned));
XE boolean FDECL(IS_ALTAR, (unsigned));
XE boolean FDECL(IS_DRAWBRIDGE, (unsigned));
XE boolean FDECL(IS_FURNITURE, (unsigned));
X#endif /* STUPID_CPP */
X
X/* ### read.c ### */
X
XE int doread();
XE int FDECL(seffects, (struct obj *));
XE void FDECL(litroom, (BOOLEAN_P));
XE void FDECL(do_genocide, (int));
XE void do_mapping();
XE void do_vicinity_map();
XE int FDECL(gold_detect, (struct obj *));
XE int FDECL(food_detect, (struct obj *));
XE void FDECL(punish, (struct obj *));
XE void unpunish();
XE boolean FDECL(cant_create, (int *));
X#if defined(WIZARD) || defined(EXPLORE_MODE)
XE boolean create_particular();
X#endif
X
X/* ### restore.c ### */
X
XE int FDECL(dorecover, (int));
XE void FDECL(getlev, (int,int,XCHAR_P,BOOLEAN_P));
X#ifdef ZEROCOMP
XE void minit();
XE int FDECL(mread, (int,genericptr_t,unsigned int));
X#else
XE void FDECL(mread, (int,genericptr_t,unsigned int));
X#endif
X
X/* ### rip.c ### */
X
XE void outrip();
X
X/* ### rnd.c ### */
X
XE int FDECL(rn1, (int,int));
XE int FDECL(rn2, (int));
XE int FDECL(rnl, (int));
XE int FDECL(rnd, (int));
XE int FDECL(d, (int,int));
XE int FDECL(rne, (int));
X#ifdef THEOLOGY
XE int FDECL(rnz, (int));
X#endif
X
X/* ### rumors.c ### */
X
XE void FDECL(outrumor, (int,BOOLEAN_P));
X#ifdef ORACLE
XE int FDECL(doconsult, (struct monst *));
X#endif
X
X/* ### save.c ### */
X
XE int dosave();
X#ifndef NOSAVEONHANGUP
XE int hangup();
X#endif /* NOSAVEONHANGUP */
XE int dosave0();
X#if defined(DGK) && !defined(OLD_TOS)
XE boolean FDECL(savelev, (int,XCHAR_P,int));
XE boolean FDECL(swapin_file, (int));
X#else /* DGK && !OLD_TOS */
XE void FDECL(savelev, (int, XCHAR_P));
X#endif /* DGK && !OLD_TOS */
X#ifdef ZEROCOMP
XE void FDECL(bflush, (int));
X#endif
XE void FDECL(bwrite, (int,genericptr_t,unsigned int));
X#ifdef TUTTI_FRUTTI
XE void FDECL(savefruitchn, (int));
X#endif
X
X/* ### search.c ### */
X
XE int findit();
XE int dosearch();
XE int FDECL(dosearch0, (int));
XE int doidtrap();
XE void FDECL(wakeup, (struct monst *));
XE void FDECL(seemimic, (struct monst *));
X
X/* ### shk.c ### */
X
XE char *FDECL(shkname, (struct monst *));
XE void FDECL(shkdead, (struct monst *));
XE void FDECL(replshk, (struct monst *,struct monst *));
XE int inshop();
XE int FDECL(inhishop, (struct monst *));
XE boolean FDECL(tended_shop, (struct mkroom *));
XE void FDECL(obfree, (struct obj *,struct obj *));
XE int dopay();
XE void FDECL(home_shk, (struct monst *));
XE void FDECL(make_happy_shk, (struct monst *));
XE boolean paybill();
XE void FDECL(pay_for_door, (int,int,char *));
XE void FDECL(addtobill, (struct obj *,BOOLEAN_P));
XE void FDECL(splitbill, (struct obj *,struct obj *));
XE void FDECL(sellobj, (struct obj *));
XE int FDECL(doinvbill, (int));
XE int FDECL(shkcatch, (struct obj *));
XE int FDECL(shk_move, (struct monst *));
XE int FDECL(online, (XCHAR_P,XCHAR_P));
XE boolean FDECL(is_fshk, (struct monst *));
XE void FDECL(shopdig, (int));
XE boolean FDECL(in_shop, (int,int));
XE boolean FDECL(costly_spot, (int,int));
XE void FDECL(check_unpaid, (struct obj *));
X
X/* ### shknam.c ### */
X
XE void FDECL(stock_room, (struct shclass *,struct mkroom *));
XE int FDECL(saleable, (int,struct obj *));
XE int FDECL(get_shop_item, (int));
X
X/* ### sit.c ### */
X
X#if defined(THRONES) || defined(SPELLS)
XE void take_gold();
X#endif
XE int dosit();
XE void rndcurse();
XE void attrcurse();
X
X/* ### sounds.c ### */
X
XE void FDECL(verbalize, (char *));
X#ifdef SOUNDS
XE void dosounds();
XE void FDECL(growl, (struct monst *));
XE void FDECL(yelp, (struct monst *));
XE void FDECL(whimper, (struct monst *));
X#endif
XE int dotalk();
X
X/* ### sp_lev.c ### */
X
X#ifdef STRONGHOLD
XE boolean FDECL(load_special, (char *));
X#endif /* STRONGHOLD /**/
X
X/* ### spell.c ### */
X#ifdef SPELLS
X#ifdef OVERLAY
XE int learn();
X#endif
XE int FDECL(study_book, (struct obj *));
XE int docast();
XE int FDECL(spelleffects, (int, BOOLEAN_P));
XE void losespells();
XE int dovspell();
X#endif /* SPELLS */
X
X/* ### steal.c ### */
X
X#ifdef OVERLAY
XE int stealarm();
X#endif
XE long somegold();
XE void FDECL(stealgold, (struct monst *));
XE int FDECL(steal, (struct monst *));
XE void FDECL(mpickobj, (struct monst *,struct obj *));
XE void FDECL(stealamulet, (struct monst *));
XE void FDECL(relobj, (struct monst *,int));
X
X/* ### termcap.c ### */
X
XE void startup();
XE void start_screen();
XE void end_screen();
X#ifdef CLIPPING
XE boolean FDECL(win_curs, (int,int));
X#endif
XE void FDECL(curs, (int,int));
XE void FDECL(cmov, (int,int));
XE void FDECL(xputc, (CHAR_P));
XE void FDECL(xputs, (char *));
XE void cl_end();
XE void clear_screen();
XE void home();
XE void standoutbeg();
XE void standoutend();
XE void revbeg();
X#if 0
XE void boldbeg();
XE void blinkbeg();
XE void dimbeg();
X#endif
XE void m_end();
XE void backsp();
XE void bell();
XE void graph_on();
XE void graph_off();
XE void delay_output();
XE void cl_eos();
X
X/* ### timeout.c ### */
X
XE void timeout();
XE void hatch_eggs();
X
X/* ### topl.c ### */
X
XE int doredotopl();
XE void remember_topl();
XE void FDECL(addtopl, (char *));
XE void more();
XE void FDECL(cmore, (char *));
XE void clrlin();
X#ifdef NEED_VARARGS
X# if defined(USE_STDARG) || defined(USE_VARARGS)
XE void FDECL(vpline, (const char *, va_list));
X# endif
X#endif
XE void VDECL(pline, (const char *,...));
XE void VDECL(Norep, (const char *,...));
XE void VDECL(You, (const char *,...));
XE void VDECL(Your, (const char *,...));
XE void VDECL(kludge, (char *,char *,...));
XE void FDECL(putsym, (CHAR_P));
XE void FDECL(putstr, (const char *));
XE char FDECL(yn_function, (const char *,CHAR_P));
XE void VDECL(impossible, (char *,...));
X
X/* ### topten.c ### */
X
XE void topten();
XE char *FDECL(eos, (char *));
XE void FDECL(prscore, (int,char **));
XE struct obj *FDECL(tt_oname, (struct obj *));
X
X/* ### track.c ### */
X
XE void initrack();
XE void settrack();
XE coord *FDECL(gettrack, (int,int));
X
X/* ### trap.c ### */
X
XE boolean FDECL(rust_dmg, (struct obj *,char *,int,BOOLEAN_P));
XE struct trap *FDECL(maketrap, (int,int,int));
XE int FDECL(teleok, (int,int));
XE void FDECL(dotrap, (struct trap *));
XE int FDECL(mintrap, (struct monst *));
XE void FDECL(selftouch, (char *));
XE void float_up();
XE int float_down();
XE void tele();
XE void FDECL(teleds, (int,int));
XE int dotele();
XE void FDECL(placebc, (int));
XE void unplacebc();
XE void level_tele();
XE void drown();
X#ifdef SPELLS
XE void FDECL(drain_en, (int));
X#endif
XE int dountrap();
XE void FDECL(chest_trap, (struct obj *,int));
XE void wake_nearby();
XE void FDECL(deltrap, (struct trap *));
XE struct trap *FDECL(t_at, (int,int));
XE void b_trapped();
XE boolean unconscious();
X
X/* ### u_init.c ### */
X
XE void u_init();
XE void plnamesuffix();
X
X/* ### uhitm.c ### */
X
XE struct monst *FDECL(clone_mon, (struct monst *));
XE boolean FDECL(special_case, (struct monst *));
XE schar FDECL(find_roll_to_hit, (struct monst *));
XE boolean FDECL(attack, (struct monst *));
XE boolean FDECL(hmon, (struct monst *,struct obj *,int));
XE int FDECL(damageum, (struct monst *, struct attack *));
XE void FDECL(missum, (struct monst *, struct attack *));
XE int FDECL(passive, (struct monst *,BOOLEAN_P,int,BOOLEAN_P));
XE void FDECL(stumble_onto_mimic, (struct monst *));
X
X/* ### unixmain.c ### */
X
X#ifdef UNIX
XE void FDECL(glo, (int));
XE void askname();
X#endif /* UNIX */
X
X/* ### unixtty.c ### */
X
X#ifdef UNIX
XE void gettty();
XE void FDECL(settty, (char *));
XE void setftty();
XE void intron();
XE void introff();
XE void VDECL(error, (char *,...));
X#endif /* UNIX */
X
X/* ### unixunix.c ### */
X
X#ifdef UNIX
XE void setrandom();
XE int getyear();
XE char *getdate();
XE int phase_of_the_moon();
XE int night();
XE int midnight();
XE void FDECL(gethdate, (char *));
XE int FDECL(uptodate, (int));
XE void getlock();
XE void FDECL(regularize, (char *));
X#endif /* UNIX */
X
X/* ### vault.c ### */
X
XE void setgd();
XE void invault();
XE int gd_move();
XE void gddead();
XE void FDECL(replgd, (struct monst *,struct monst *));
XE void paygd();
X
X/* ### version.c ### */
X
XE int doversion();
X
X/* ### vmsmain.c ### */
X
X#ifdef VMS
X# ifdef CHDIR
XE void FDECL(chdirx, (char *,char));
X# endif /* CHDIR */
XE void FDECL(glo, (int));
XE void askname();
X#endif /* VMS */
X
X/* ### vmsmisc.c ### */
X
X#ifdef VMS
XE void vms_abort();
XE void vms_exit();
X#endif /* VMS */
X
X/* ### vmstty.c ### */
X
X#ifdef VMS
XE void gettty();
XE void FDECL(settty, (char *));
XE void setftty();
XE void intron();
XE void introff();
XE void VDECL(error, (char *,...));
X#endif /* VMS */
X
X/* ### vmsunix.c ### */
X
X#ifdef VMS
XE void setrandom();
XE int getyear();
XE char *getdate();
XE int phase_of_the_moon();
XE int night();
XE int midnight();
XE void FDECL(gethdate, (char *));
XE int FDECL(uptodate, (int));
XE void getlock();
XE void FDECL(regularize, (char *));
XE int FDECL(vms_creat, (char *,unsigned int));
XE int vms_getuid();
XE void privoff();
XE void privon();
X# ifdef SHELL
XE int dosh();
X# endif
X#endif /* VMS */
X
X/* ### weapon.c ### */
X
XE int FDECL(hitval, (struct obj *,struct permonst *));
XE int FDECL(dmgval, (struct obj *,struct permonst *));
XE void set_uasmon();
XE struct obj *FDECL(select_rwep, (struct monst *));
XE struct obj *FDECL(select_hwep, (struct monst *));
XE int abon();
XE int dbon();
X
X/* ### were.c ### */
X
XE void FDECL(were_change, (struct monst *));
XE void FDECL(new_were, (struct monst *));
XE boolean FDECL(were_summon, (struct permonst *,BOOLEAN_P));
X#ifdef POLYSELF
XE void you_were();
X#endif /* POLYSELF */
X
X/* ### wield.c ### */
X
XE void FDECL(setuwep, (struct obj *));
XE void uwepgone();
XE int dowield();
XE void corrode_weapon();
XE int FDECL(chwepon, (struct obj *,int));
XE int FDECL(welded, (struct obj *));
XE void FDECL(weldmsg, (struct obj *,BOOLEAN_P));
X
X/* ### wizard.c ### */
X
XE void amulet();
XE int FDECL(mon_has_amulet, (struct monst *));
XE int FDECL(wiz_get_amulet, (struct monst *));
XE void aggravate();
XE void clonewiz();
X#ifdef HARD
XE void nasty();
XE void resurrect();
XE void intervene();
XE void FDECL(wizdead, (struct monst *));
X#endif /* HARD */
XE void FDECL(cuss, (struct monst *));
X
X/* ### worm.c ### */
X
X#ifdef WORM
XE int FDECL(getwn, (struct monst *));
XE void FDECL(initworm, (struct monst *));
XE void FDECL(worm_move, (struct monst *));
XE void FDECL(worm_nomove, (struct monst *));
XE void FDECL(wormdead, (struct monst *));
XE void FDECL(wormhit, (struct monst *));
XE void FDECL(wormsee, (unsigned int));
XE void FDECL(cutworm, (struct monst *,XCHAR_P,XCHAR_P,unsigned));
X#endif /* WORM */
X
X/* ### worn.c ### */
X
XE void FDECL(setworn, (struct obj *,long));
XE void FDECL(setnotworn, (struct obj *));
X
X/* ### write.c ### */
X
XE void FDECL(dowrite, (struct obj *));
X
X/* ### zap.c ### */
X
X#ifdef OVERLAY
XE int FDECL(bhito, (struct obj *, struct obj *));
XE int FDECL(bhitm, (struct monst *, struct obj *));
X#endif
XE struct monst *FDECL(revive, (struct obj *,BOOLEAN_P));
XE int FDECL(zappable, (struct obj *));
XE void FDECL(zapnodir, (struct obj *));
XE int dozap();
XE int FDECL(zapyourself, (struct obj *));
XE void FDECL(weffects, (struct obj *));
XE char *FDECL(exclam, (int));
XE void FDECL(hit, (const char *,struct monst *,const char *));
XE void FDECL(miss, (const char *,struct monst *));
XE struct monst *FDECL(bhit, (int,int,int,CHAR_P,int(*)(),int(*)(),struct obj *));
XE struct monst *FDECL(boomhit, (int,int));
XE void FDECL(buzz, (int,int,XCHAR_P,XCHAR_P,int,int));
XE void FDECL(rlocgold, (struct gold *));
XE void FDECL(rloco, (struct obj *));
XE void FDECL(fracture_rock, (struct obj *));
XE boolean FDECL(break_statue, (struct obj *));
XE void FDECL(destroy_item, (int,int));
XE int FDECL(destroy_mitem, (struct monst *,int,int));
XE int FDECL(resist, (struct monst *,CHAR_P,int,int));
XE void makewish();
X
X#endif /* !MAKEDEFS_C && !LEV_LEX_C */
X
X#undef E
X
X#endif /* EXTERN_H /**/
END_OF_FILE
if test 37999 -ne `wc -c <'include/extern.h'`; then
echo shar: \"'include/extern.h'\" unpacked with wrong size!
fi
# end of 'include/extern.h'
if test -f 'src/dbridge.c' -a "${1}" != "-c" ; then
echo shar: clobbering existing file \"'src/dbridge.c'\"
fi
echo shar: Extracting \"'src/dbridge.c'\" \(19606 characters\)
sed "s/^X//" >'src/dbridge.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)dbridge.c 3.0 88/18/12
X/* Copyright (c) 1989 by Jean-Christophe Collet */
X/* NetHack may be freely redistributed. See license for details. */
X
X/*
X * This file contains the drawbridge manipulation (create, open, close,
X * destroy).
X *
X * Added comprehensive monster-handling, and the "entity" structure to
X * deal with players as well. - 11/89
X */
X
X#include "hack.h"
X
Xboolean
Xis_pool(x,y)
Xint x,y;
X{
X if(levl[x][y].typ == POOL || levl[x][y].typ == MOAT) return TRUE;
X#ifdef STRONGHOLD
X if(levl[x][y].typ == DRAWBRIDGE_UP &&
X (levl[x][y].drawbridgemask & DB_UNDER) == DB_MOAT) return TRUE;
X#endif
X return FALSE;
X}
X
X#ifdef STRONGHOLD
Xvoid
Xinitsym(x,y)
Xint x,y;
X{
X char oldseen;
X struct rm *crm = &levl[x][y];
X
X oldseen = crm->seen;
X crm->seen = 1;
X crm->scrsym = news0(x,y);
X crm->seen = oldseen;
X}
X
Xstatic void
Xredosym(x,y)
Xint x,y;
X{
X if(cansee(x,y)) {
X levl[x][y].seen = 0; /* force prl */
X prl(x, y);
X } else {
X initsym(x,y);
X levl[x][y].seen = 0;
X }
X}
X
X/*
X * We want to know whether a wall (or a door) is the portcullis (passageway)
X * of an eventual drawbridge.
X *
X * Return value: the direction of the drawbridge.
X */
X
Xint
Xis_drawbridge_wall(x,y)
Xint x,y;
X{
X struct rm *lev;
X
X lev = &levl[x][y];
X if (lev->typ != DOOR && !(lev->diggable & W_GATEWAY))
X return (-1);
X switch (lev->typ) {
X case DOOR:
X case VWALL:
X if (IS_DRAWBRIDGE(levl[x+1][y].typ) &&
X (levl[x+1][y].drawbridgemask & DB_DIR) == DB_WEST)
X return (DB_WEST);
X if (IS_DRAWBRIDGE(levl[x-1][y].typ) &&
X (levl[x-1][y].drawbridgemask & DB_DIR) == DB_EAST)
X return (DB_EAST);
X if (lev->typ == VWALL) break;
X case HWALL:
X if (IS_DRAWBRIDGE(levl[x][y-1].typ) &&
X (levl[x][y-1].drawbridgemask & DB_DIR) == DB_SOUTH)
X return (DB_SOUTH);
X if (IS_DRAWBRIDGE(levl[x][y+1].typ) &&
X (levl[x][y+1].drawbridgemask & DB_DIR) == DB_NORTH)
X return (DB_NORTH);
X }
X return (-1);
X}
X
X/*
X * Use is_db_wall where you want to verify that a
X * drawbridge "wall" is UP in the location x, y
X * (instead of UP or DOWN, as with is_drawbridge_wall).
X */
Xboolean
Xis_db_wall(x,y)
Xint x,y;
X{
X return( (levl[x][y].typ == VWALL || levl[x][y].typ == HWALL) &&
X levl[x][y].diggable & W_GATEWAY);
X}
X
X/*
X * Return true with x,y pointing to the drawbridge if x,y initially indicate
X * a drawbridge or drawbridge wall.
X */
Xboolean
Xfind_drawbridge(x,y)
Xint *x,*y;
X{
X int dir;
X
X if (IS_DRAWBRIDGE(levl[*x][*y].typ))
X return TRUE;
X dir = is_drawbridge_wall(*x,*y);
X if (dir >= 0) {
X switch(dir) {
X case DB_NORTH: (*y)++; break;
X case DB_SOUTH: (*y)--; break;
X case DB_EAST: (*x)--; break;
X case DB_WEST: (*x)++; break;
X }
X return TRUE;
X }
X return FALSE;
X}
X
X/*
X * Find the drawbridge wall associated with a drawbridge.
X */
Xstatic void
Xget_wall_for_db(x,y)
Xint *x,*y;
X{
X switch (levl[*x][*y].drawbridgemask & DB_DIR) {
X case DB_NORTH: (*y)--; break;
X case DB_SOUTH: (*y)++; break;
X case DB_EAST: (*x)++; break;
X case DB_WEST: (*x)--; break;
X }
X}
X
X/*
X * Creation of a drawbridge at pos x,y.
X * dir is the direction.
X * flag must be put to TRUE if we want the drawbridge to be opened.
X */
X
Xboolean
Xcreate_drawbridge(x,y,dir,flag)
Xint x,y,dir;
Xboolean flag;
X{
X int x2,y2;
X uchar wall;
X
X x2 = x; y2 = y;
X switch(dir) {
X case DB_NORTH:
X wall = HWALL;
X y2--;
X break;
X case DB_SOUTH:
X wall = HWALL;
X y2++;
X break;
X case DB_EAST:
X wall = VWALL;
X x2++;
X break;
X case DB_WEST:
X wall = VWALL;
X x2--;
X break;
X }
X if (!IS_WALL(levl[x2][y2].typ))
X return(FALSE);
X if (flag) { /* We want the bridge open */
X levl[x][y].typ = DRAWBRIDGE_DOWN;
X levl[x2][y2].typ = DOOR;
X levl[x2][y2].doormask = D_NODOOR;
X } else {
X levl[x][y].typ = DRAWBRIDGE_UP;
X levl[x2][y2].typ = wall;
X /* Beware, drawbridges are non-diggable. */
X levl[x2][y2].diggable = (W_NONDIGGABLE | W_GATEWAY);
X }
X levl[x][y].drawbridgemask = dir; /* always have DB_MOAT */
X initsym(x,y);
X initsym(x2,y2);
X return(TRUE);
X}
X
Xstruct entity {
X struct monst *emon; /* youmonst for the player */
X struct permonst *edata; /* must be non-zero for record to be valid */
X int ex, ey;
X};
X
X#define ENTITIES 2
X
Xstatic struct entity occupants[ENTITIES];
X
Xstatic
Xstruct entity *
Xe_at(x, y)
Xint x, y;
X{
X int entitycnt;
X
X for (entitycnt = 0; entitycnt < ENTITIES; entitycnt++)
X if ((occupants[entitycnt].edata) &&
X (occupants[entitycnt].ex == x) &&
X (occupants[entitycnt].ey == y))
X break;
X#ifdef D_DEBUG
X pline("entitycnt = %d", entitycnt);
X fflush(stdout);
X#endif
X return((entitycnt == ENTITIES)?
X (struct entity *)0 : &(occupants[entitycnt]));
X}
X
Xstatic void
Xm_to_e(mtmp, etmp)
Xstruct monst *mtmp;
Xstruct entity *etmp;
X{
X etmp->emon = mtmp;
X if (mtmp) {
X etmp->ex = mtmp->mx;
X etmp->ey = mtmp->my;
X etmp->edata = mtmp->data;
X } else
X etmp->edata = (struct permonst *)0;
X}
X
Xstatic void
Xu_to_e(etmp)
Xstruct entity *etmp;
X{
X etmp->emon = &youmonst;
X etmp->ex = u.ux;
X etmp->ey = u.uy;
X etmp->edata = uasmon;
X}
X
Xstatic void
Xset_entity(x, y, etmp)
Xint x, y;
Xstruct entity *etmp;
X{
X if ((x == u.ux) && (y == u.uy))
X u_to_e(etmp);
X else
X if (MON_AT(x, y))
X m_to_e(m_at(x, y), etmp);
X else
X etmp->edata = (struct permonst *)0;
X}
X
X#ifdef POLYSELF
X#define is_u(etmp) (etmp->emon == &youmonst)
X#else
X#define is_u(x) FALSE
X#endif
X
X/*
X * WARNING! THE FOLLOWING IS ONLY USEFUL FOR CANSEEMON, OR OTHER FUNCS WHICH
X * ALWAYS RETURN TRUE FOR U.
X */
X
X#define e_boolean(etmp, func) (is_u(etmp)? (boolean)TRUE : func(etmp->emon))
X
X/*
X * e_strg is a utility routine which is not actually in use anywhere, since
X * the specialized routines below suffice for all current purposes.
X */
X
X/* #define e_strg(etmp, func) (is_u(etmp)? (char *)0 : func(etmp->emon)) */
X
Xstatic char *
Xe_nam(etmp)
Xstruct entity *etmp;
X{
X return(is_u(etmp)? "you" : mon_nam(etmp->emon));
X}
X
X/*
X * Enam is another unused utility routine: E_phrase is preferable.
X */
X
X/*
Xstatic char *
XEnam(etmp)
Xstruct entity *etmp;
X{
X return(is_u(etmp)? "You" : Monnam(etmp->emon));
X}
X*/
X
X/*
X * Generates capitalized entity name, makes 2nd -> 3rd person conversion on
X * verb, where necessary.
X */
X
Xstatic char *
XE_phrase(etmp, verb)
Xstruct entity *etmp;
Xchar *verb;
X{
X char wholebuf[80], verbbuf[30];
X
X if (is_u(etmp))
X Strcpy(wholebuf, "You");
X else
X Strcpy(wholebuf, Monnam(etmp->emon));
X if (!*verb)
X return(wholebuf);
X Strcat(wholebuf, " ");
X verbbuf[0] = '\0';
X if (is_u(etmp))
X Strcpy(verbbuf, verb);
X else {
X if (!strcmp(verb, "are"))
X Strcpy(verbbuf, "is");
X if (!strcmp(verb, "have"))
X Strcpy(verbbuf, "has");
X if (!verbbuf[0]) {
X Strcpy(verbbuf, verb);
X switch (verbbuf[strlen(verbbuf) - 1]) {
X case 'y':
X verbbuf[strlen(verbbuf) - 1] = '\0';
X Strcat(verbbuf, "ies");
X break;
X case 'h':
X case 'o':
X case 's':
X Strcat(verbbuf, "es");
X break;
X default:
X Strcat(verbbuf, "s");
X break;
X }
X }
X }
X Strcat(wholebuf, verbbuf);
X return(wholebuf);
X}
X
X/*
X * Simple-minded "can it be here?" routine
X */
X
Xstatic boolean
Xe_survives_at(etmp, x, y)
Xstruct entity *etmp;
Xint x, y;
X{
X if (noncorporeal(etmp->edata))
X return(TRUE);
X if (is_pool(x, y))
X return((is_u(etmp) && (Wwalking || Levitation)) ||
X is_swimmer(etmp->edata) || is_flyer(etmp->edata) ||
X is_floater(etmp->edata));
X if (is_db_wall(x, y))
X return(passes_walls(etmp->edata));
X return(TRUE);
X}
X
Xstatic void
Xe_died(etmp, dest, how)
Xstruct entity *etmp;
Xint dest, how;
X{
X if (is_u(etmp)) {
X if (how == DROWNING)
X drown();
X else {
X coord xy;
X
X done(how);
X /* So, you didn't die */
X if (!e_survives_at(etmp, etmp->ex, etmp->ey)) {
X pline("A %s force teleports you away...",
X Hallucination ? "normal" : "strange");
X enexto(&xy, etmp->ex, etmp->ey, etmp->edata);
X teleds(xy.x, xy.y);
X }
X }
X } else {
X xkilled(etmp->emon, dest);
X etmp->edata = (struct permonst *)0;
X }
X}
X
X
X/*
X * These are never directly affected by a bridge or portcullis.
X */
X
Xstatic boolean
Xautomiss(etmp)
Xstruct entity *etmp;
X{
X return(passes_walls(etmp->edata) || noncorporeal(etmp->edata));
X}
X
X/*
X * Does falling drawbridge or portcullis miss etmp?
X */
X
Xstatic boolean
Xe_missed(etmp, chunks)
Xstruct entity *etmp;
Xboolean chunks;
X{
X int misses;
X
X#ifdef D_DEBUG
X if (chunks)
X pline("Do chunks miss?");
X#endif
X if (automiss(etmp))
X return(TRUE);
X
X if (is_flyer(etmp->edata) &&
X (is_u(etmp)? !Sleeping :
X (!etmp->emon->mfroz && !etmp->emon->msleep)))
X /* flying requires mobility */
X misses = 5; /* out of 8 */
X else
X if (is_floater(etmp->edata) ||
X (is_u(etmp) && Levitation)) /* doesn't require mobility */
X misses = 3;
X else
X if (chunks && is_pool(etmp->ex, etmp->ey))
X misses = 2; /* sitting ducks */
X else
X misses = 0;
X
X if (is_db_wall(etmp->ex, etmp->ey))
X misses -= 3; /* less airspace */
X
X#ifdef D_DEBUG
X pline("Miss chance = %d (out of 8)", misses);
X#endif
X
X return((misses >= rnd(8))? TRUE : FALSE);
X}
X
X/*
X * Can etmp jump from death?
X */
X
Xstatic boolean
Xe_jumps(etmp)
Xstruct entity *etmp;
X{
X int tmp = 4; /* out of 10 */
X
X if (is_u(etmp)? (Sleeping || Fumbling) :
X (etmp->emon->mfroz || etmp->emon->msleep ||
X !etmp->edata->mmove))
X return(FALSE);
X
X if (is_u(etmp)? Confusion : etmp->emon->mconf)
X tmp -= 2;
X
X if (is_u(etmp)? Stunned : etmp->emon->mstun)
X tmp -= 3;
X
X if (is_db_wall(etmp->ex, etmp->ey))
X tmp -= 2; /* less room to maneuver */
X
X#ifdef D_DEBUG
X pline("%s to jump (%d chances in 10)", E_phrase(etmp, "try"), tmp);
X#endif
X return((tmp >= rnd(10))? TRUE : FALSE);
X}
X
Xstatic void
Xdo_entity(etmp)
Xstruct entity *etmp;
X{
X int newx, newy, at_portcullis, oldx, oldy;
X boolean must_jump = FALSE, relocates = FALSE, e_inview;
X struct rm *crm;
X
X if (!etmp->edata)
X return;
X
X e_inview = e_boolean(etmp, canseemon);
X
X oldx = etmp->ex;
X oldy = etmp->ey;
X
X at_portcullis = is_db_wall(oldx, oldy);
X
X crm = &levl[oldx][oldy];
X
X if (automiss(etmp) && e_survives_at(etmp, oldx, oldy)) {
X char edifice[20];
X
X if (e_inview) {
X *edifice = '\0';
X if ((crm->typ == DRAWBRIDGE_DOWN) ||
X (crm->typ == DRAWBRIDGE_UP))
X Strcpy(edifice, "drawbridge");
X else
X if (at_portcullis)
X Strcpy(edifice, "portcullis");
X if (*edifice)
X pline("The %s passes through %s!", edifice,
X e_nam(etmp));
X }
X return;
X }
X if (e_missed(etmp, FALSE)) {
X if (at_portcullis)
X pline("The portcullis misses %s!",
X e_nam(etmp));
X#ifdef D_DEBUG
X else
X pline("The drawbridge misses %s!",
X e_nam(etmp));
X#endif
X if (e_survives_at(etmp, oldx, oldy))
X return;
X else {
X#ifdef D_DEBUG
X pline("Mon can't survive here");
X#endif
X if (at_portcullis)
X must_jump = TRUE;
X else
X relocates = TRUE; /* just ride drawbridge in */
X }
X } else {
X if (crm->typ == DRAWBRIDGE_DOWN) {
X pline("%s crushed underneath the drawbridge.",
X E_phrase(etmp, "are")); /* no jump */
X e_died(etmp, e_inview? 2 : 3, CRUSHING); /* no corpse */
X return; /* Note: Beyond this point, we know we're */
X } /* not at an opened drawbridge, since all */
X must_jump = TRUE; /* *missable* creatures survive on the */
X } /* square, and all the unmissed ones die. */
X if (must_jump)
X if (at_portcullis) {
X if (e_jumps(etmp)) {
X relocates = TRUE;
X#ifdef D_DEBUG
X pline("Jump succeeds!");
X#endif
X } else {
X if (e_inview)
X pline("%s crushed by the falling portcullis!",
X E_phrase(etmp, "are"));
X else
X if (flags.soundok)
X You("hear a crushing sound.");
X e_died(etmp, e_inview? 1 : 0, CRUSHING);
X /* corpse */
X return;
X }
X } else { /* tries to jump off bridge to original square */
X relocates = !e_jumps(etmp);
X#ifdef D_DEBUG
X pline("Jump %s!", (relocates)? "fails" : "succeeds");
X#endif
X }
X
X/*
X * Here's where we try to do relocation. Assumes that etmp is not arriving
X * at the portcullis square while the drawbridge is falling, since this square
X * would be inaccessible (i.e. etmp started on drawbridge square) or
X * unnecessary (i.e. etmp started here) in such a situation.
X */
X#ifdef D_DEBUG
X pline("Doing relocation");
X#endif
X newx = oldx;
X newy = oldy;
X (void)find_drawbridge(&newx, &newy);
X if ((newx == oldx) && (newy == oldy))
X get_wall_for_db(&newx, &newy);
X#ifdef D_DEBUG
X pline("Checking new square for occupancy");
X#endif
X if (relocates && (e_at(newx, newy))) {
X
X/*
X * Standoff problem: one or both entities must die, and/or both switch
X * places. Avoid infinite recursion by checking first whether the other
X * entity is staying put. Clean up if we happen to move/die in recursion.
X */
X struct entity *other;
X
X other = e_at(newx, newy);
X#ifdef D_DEBUG
X pline("New square is occupied by %s", e_nam(other));
X#endif
X if (e_survives_at(other, newx, newy) && automiss(other)) {
X relocates = FALSE; /* "other" won't budge */
X#ifdef D_DEBUG
X pline("%s suicide.", E_phrase(etmp, "commit"));
X#endif
X } else {
X
X#ifdef D_DEBUG
X pline("Handling %s", e_nam(other));
X#endif
X while ((e_at(newx, newy)) &&
X (e_at(newx, newy) != etmp))
X do_entity(other);
X#ifdef D_DEBUG
X pline("Checking existence of %s",
X e_nam(etmp));
X fflush(stdout);
X#endif
X if (e_at(oldx, oldy) != etmp) {
X#ifdef D_DEBUG
X pline("%s moved or died in recursion somewhere",
X E_phrase(etmp, "have"));
X fflush(stdout);
X#endif
X return;
X }
X }
X }
X if (relocates) {
X#ifdef D_DEBUG
X pline("Moving %s", e_nam(etmp));
X#endif
X if (!is_u(etmp)) {
X remove_monster(etmp->ex, etmp->ey);
X place_monster(etmp->emon, newx, newy);
X } else {
X u.ux = newx;
X u.uy = newy;
X }
X etmp->ex = newx;
X etmp->ey = newy;
X e_inview = e_boolean(etmp, canseemon);
X }
X#ifdef D_DEBUG
X pline("Final disposition of %s", e_nam(etmp));
X fflush(stdout);
X#endif
X if (is_db_wall(etmp->ex, etmp->ey)) {
X#ifdef D_DEBUG
X pline("%s in portcullis chamber", E_phrase(etmp, "are"));
X fflush(stdout);
X#endif
X if (e_inview)
X if (is_u(etmp)) {
X You("tumble towards the closed portcullis!");
X if (automiss(etmp))
X You("pass through it!");
X else
X pline("The drawbridge closes in...");
X } else
X pline("%s behind the drawbridge.",
X E_phrase(etmp, "disappear"));
X if (!e_survives_at(etmp, etmp->ex, etmp->ey)) {
X killer = "closing drawbridge";
X e_died(etmp, 0, CRUSHING); /* no message */
X return;
X }
X#ifdef D_DEBUG
X pline("%s in here", E_phrase(etmp, "survive"));
X#endif
X } else {
X#ifdef D_DEBUG
X pline("%s on drawbridge square", E_phrase(etmp, "are"));
X#endif
X if (is_pool(etmp->ex, etmp->ey) && !e_inview)
X if (flags.soundok)
X You("hear a splash.");
X if (e_survives_at(etmp, etmp->ex, etmp->ey)) {
X if (e_inview && !is_flyer(etmp->edata) &&
X !is_floater(etmp->edata))
X pline("%s from the bridge.",
X E_phrase(etmp, "fall"));
X return;
X }
X#ifdef D_DEBUG
X pline("%s cannot survive on the drawbridge square", Enam(etmp));
X#endif
X if (is_pool(etmp->ex, etmp->ey))
X if (e_inview &&
X !is_u(etmp)) /* drown() will supply msgs if nec. */
X if (Hallucination)
X pline("%s the moat and disappears.",
X E_phrase(etmp, "drink"));
X else
X pline("%s into the moat.",
X E_phrase(etmp, "fall"));
X killer = "fall from a drawbridge";
X e_died(etmp, e_inview? 1 : 0, /* CRUSHING is arbitrary */
X (is_pool(etmp->ex, etmp->ey))? DROWNING : CRUSHING);
X /* corpse */
X return;
X }
X}
X
X/*
X * Close the drawbridge located at x,y
X */
X
Xvoid
Xclose_drawbridge(x,y)
Xint x,y;
X{
X register struct rm *lev1, *lev2;
X struct obj *otmp, *otmp2;
X int x2, y2;
X
X lev1 = &levl[x][y];
X if (lev1->typ != DRAWBRIDGE_DOWN) return;
X x2 = x; y2 = y;
X get_wall_for_db(&x2,&y2);
X if (cansee(x,y)) /* change msgs if you are a w-walker at portcullis */
X You("see a drawbridge %s up!",
X ((u.ux == x2) && (u.uy == y2))? "coming" : "going");
X lev1->typ = DRAWBRIDGE_UP;
X lev2 = &levl[x2][y2];
X switch (lev1->drawbridgemask & DB_DIR) {
X case DB_NORTH:
X case DB_SOUTH:
X lev2->typ = HWALL;
X break;
X case DB_WEST:
X case DB_EAST:
X lev2->typ = VWALL;
X break;
X }
X lev2->diggable = (W_NONDIGGABLE | W_GATEWAY);
X set_entity(x, y, &(occupants[0]));
X set_entity(x2, y2, &(occupants[1]));
X do_entity(&(occupants[0]));
X do_entity(&(occupants[1]));
X redosym(x, y);
X for (otmp = level.objects[x][y]; otmp; otmp = otmp2) {
X otmp2 = otmp->nexthere;
X delobj(otmp);
X }
X for (otmp = level.objects[x2][y2]; otmp; otmp = otmp2) {
X otmp2 = otmp->nexthere;
X delobj(otmp);
X }
X redosym(x2, y2);
X}
X
X/*
X * Open the drawbridge located at x,y
X */
X
Xvoid
Xopen_drawbridge(x,y)
Xint x,y;
X{
X register struct rm *lev1, *lev2;
X int x2, y2;
X
X lev1 = &levl[x][y];
X if (lev1->typ != DRAWBRIDGE_UP) return;
X x2 = x; y2 = y;
X get_wall_for_db(&x2,&y2);
X if (cansee(x,y)) /* change msgs if you are a w-walker at portcullis */
X You("see a drawbridge %s down!",
X ((x2 == u.ux) && (y2 == u.uy))? "going" : "coming");
X lev1->typ = DRAWBRIDGE_DOWN;
X lev2 = &levl[x2][y2];
X lev2->typ = DOOR;
X lev2->doormask = D_NODOOR;
X set_entity(x, y, &(occupants[0]));
X set_entity(x2, y2, &(occupants[1]));
X do_entity(&(occupants[0]));
X do_entity(&(occupants[1]));
X redosym(x, y);
X redosym(x2, y2);
X}
X
X/*
X * Let's destroy the drawbridge located at x,y
X */
X
Xvoid
Xdestroy_drawbridge(x,y)
Xint x,y;
X{
X register struct rm *lev1, *lev2;
X int x2, y2;
X boolean e_inview;
X struct entity *etmp1 = &(occupants[0]), *etmp2 = &(occupants[1]);
X
X lev1 = &levl[x][y];
X if (!IS_DRAWBRIDGE(lev1->typ))
X return;
X x2 = x; y2 = y;
X get_wall_for_db(&x2,&y2);
X lev2 = &levl[x2][y2];
X if ((lev1->drawbridgemask & DB_UNDER) == DB_MOAT) {
X if (lev1->typ == DRAWBRIDGE_UP) {
X if (cansee(x2,y2))
X pline("The portcullis of the drawbridge falls into the moat!");
X else if (flags.soundok)
X You("hear a loud *SPLASH*!");
X } else {
X if (cansee(x,y))
X pline("The drawbridge collapses into the moat!");
X else if (flags.soundok)
X You("hear a loud *SPLASH*!");
X }
X lev1->typ = MOAT;
X lev1->drawbridgemask = 0;
X } else {
X if (cansee(x,y))
X pline("The drawbridge disintegrates!");
X else
X You("hear a loud *CRASH*!");
X lev1->typ = ROOM;
X lev1->icedpool =
X ((lev1->drawbridgemask & DB_ICE) ? ICED_MOAT : 0);
X }
X set_entity(x2, y2, etmp2); /* currently, only automissers can be here */
X if (etmp2->edata) {
X e_inview = e_boolean(etmp2, canseemon);
X if (!automiss(etmp2)) { /* i.e. no-one yet */
X if (e_inview)
X pline("%s blown apart by flying debris",
X E_phrase(etmp2, "are"));
X killer = "exploding drawbridge";
X e_died(etmp2, e_inview? 2 : 3, CRUSHING);/* no corpse */
X } /* nothing which is vulnerable can survive this */
X }
X lev2->typ = DOOR;
X lev2->doormask = D_NODOOR;
X set_entity(x, y, etmp1);
X e_inview = e_boolean(etmp1, canseemon);
X if (etmp1->edata) {
X if (e_missed(etmp1, TRUE)) {
X#ifdef D_DEBUG
X pline("%s spared!", E_phrase(etmp1, "are"));
X#endif
X } else {
X if (e_inview)
X if (!is_u(etmp1) && Hallucination)
X pline("%s into some heavy metal",
X E_phrase(etmp1, "get"));
X else
X pline("%s hit by a huge chunk of metal!",
X E_phrase(etmp1, "are"));
X else
X if (flags.soundok && !is_u(etmp1) &&
X !is_pool(x, y))
X You("hear a crushing sound");
X#ifdef D_DEBUG
X else
X pline("%s from shrapnel",
X E_phrase(etmp1, "die"));
X#endif
X killer = "collapsing drawbridge";
X e_died(etmp1, e_inview? 0 : 1, CRUSHING); /* corpse */
X }
X }
X redosym(x,y);
X redosym(x2,y2);
X}
X
X#endif /* STRONGHOLD /**/
END_OF_FILE
if test 19606 -ne `wc -c <'src/dbridge.c'`; then
echo shar: \"'src/dbridge.c'\" unpacked with wrong size!
fi
# end of 'src/dbridge.c'
echo shar: End of archive 15 \(of 15\).
cp /dev/null ark15isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 15 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0