billr@saab.CNA.TEK.COM (Bill Randle) (11/23/89)
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