billr@saab.CNA.TEK.COM (Bill Randle) (07/12/90)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 10, Issue 80 Archive-name: nethack3p9/Part35 Supersedes: 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 35 (of 56)." # Contents: amiga/Makefile.ami src/hack.c src/wield.c # Wrapped by billr@saab on Wed Jul 11 17:11:44 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'amiga/Makefile.ami' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'amiga/Makefile.ami'\" else echo shar: Extracting \"'amiga/Makefile.ami'\" \(21416 characters\) sed "s/^X//" >'amiga/Makefile.ami' <<'END_OF_FILE' X# Hack Makefile. X# SCCS Id: @(#)Makefile.ami 3.0 90/02/13 X X# This makefile is arranged for compiling for the Amiga with Lattice C but X# can be configured for compiling with Manx C 3.6 with simple changes. X# The appropriate changes are identified by #[LATTICE] and #[MANX3.6] in X# this makefile as should be set according to the compiler being used. X X# The following assignments should be made before using this makefile: X# X# HackExe: directory where final executable should go X# NetHack: directory where other runtime support files should go X# Amiga: "amiga" directory X# Auxil: "auxil" directory X# Incl: "include" directory X# Others: "others" directory X# Src1: "src" directory (a* through l*) X# Src2: "src" directory (m* through po*) X# Src3: "src" directory (pr* through z*) X# O_Amiga: destination for object files from Amiga: X# O_Others: destination for object files from Others: X# O_Src1: destination for object files from Src1: X# O_Src2: destination for object files from Src2: X# O_Src3: destination for object files from Src3: X# X# Startup makefile with: X# X#[LATTICE] X# cd NetHack: X# lmk -f Amiga:Makefile.ami X# X#[MANX3.6] X# cd NetHack: X# make -f Amiga:Makefile.ami X# X# May use following targets on lmk/make command line: X# all do it all (default) X# link just create $(GAME) from object files X# obj1 just create O_Src1 object files X# obj2 just create O_Src2 object files X# obj3 just create O_Src3 object files X# obja just create O_Amiga object files X# objo just create O_Others object files X# clean deletes the object files X# spotless deletes the object files, $(GAME), and more X# X X# Precompiled header file: X# $(HDEP) should appear in any dependency list for an object file where X# we would want to make use of the precompiled version of Incl:hack.h, X# while $(CSYM) should appear in the C compiler command line that creates X# any such object file. (Changes made here should agree with the $(HDEP): X# target that appears later in this makefile.) X# X# Notice that since this file would be created on Ram: that we would X# end up recompiling everything if we followed the normal make sequence. X# Thus, we could use: X# X#[LATTICE] X# cd NetHack: X# lmk -f Amiga:Makefile.ami Ram:hack.sym X# setdate Ram:hack.sym {date & time of Incl:hack.h} X# lmk -f Amiga:Makefile.ami X# X#[MANX3.6] X# cd NetHack: X# make -f Amiga:Makefile.ami Ram:hack.sym X# setdate Ram:hack.sym {date & time of Incl:hack.h} X# make -f Amiga:Makefile.ami X X#[LATTICE] X# If we were to use the precompiled header file feature, we would uncomment X# these following two lines. However, there are still problems in the X# behavior of this feature in version 5.04, so these lines are commented X# out for now. X X#HDEP = Ram:hack.sym X#CSYM = -HRam:hack.sym X X#[LATTICE] X# If we were to use the precompiled header file feature in a newer version X# of Lattice, we would comment out these following two lines. X XHDEP = Incl:hack.h XCSYM = X X#[MANX3.6] X# If we were compiling with Aztec 3.6 and wanted to use the symbol table X# pre-loading feature, we would uncomment these following two lines. X X#HDEP = Ram:hack.sym X#CSYM = +IRam:hack.sym X X X# Pathname for (optional) uudecode program: X# If uudecode is available for use by this makefile, give its name below. X# Use a harmless command (like echo) otherwise. X XUUDEC = echo X#UUDEC = uudecode X X X# Pathname for the C compiler being used. X X#[LATTICE] X XCC = lc X X#[MANX3.6] X X#CC = cc X X X# Compilation flags for selected C Compiler: X# $(CFLAGS) should appear before filename arguments of $(CC) command line. X X#[LATTICE] X# Note: do not use -ms with Lattice 5.04 (Others:lev_lex.c fails) X# Note: make sure your CLI stack size is large or lev_comp and makedefs X# may fail terribly - stack checking is disabled. XCFLAGS = -b0 -cfi -d1 -iIncl: -ma -v X X#[MANX3.6] X X#CFLAGS = +c +d -e300 -z8000 +q -iIncl: X X X# Components of varous link command lines: X# $(LINK) should be the pathname of the linker being used (with any options X# that should appear at the beginning of the command line). The name of the X# output file should appear immediately after $(LINK). $(LIN) should appear X# before the list of object files in each link command. $(LLINK) should X# appear as the list of object files in the link command line that creates X# the NetHack executable. $(LLIB) should appear at the end of each link X# command line. X X#[LATTICE] X XLINK = Blink to XLIN = from Lib:catch.o XLLINK = with Amiga:ami.lnk XLLIB = lib Lib:lc.lib BATCH X X#[MANX3.6] X X#LINK = ln +q +ss -o X#LIN = X#LLINK = -f Amiga:ami.lnk X#LLIB = -lcl X X X# Name of the game: X XGAME = HackExe:NetHack X X X# A more reasonable random number generator (recommended for the Amiga): X XRANDOBJ = O_Others:random.o X X X.PRECIOUS: Incl:config.h Incl:decl.h Incl:hack.h Incl:permonst.h Incl:you.h X X X# Almost nothing below this line should have to be changed. X# (Exceptions are marked by [LATTICE] and [MANX3.6].) X# X# Other things that have to be reconfigured are in config.h, X# (amiconf.h, pcconf.h), and possibly system.h, tradstdc.h. X X X# HSRC1 = \ X# Src1:allmain.c Src1:alloc.c Src1:apply.c \ X# Src1:artifact.c Src1:attrib.c Src1:bones.c \ X# Src1:cmd.c Src1:dbridge.c Src1:decl.c \ X# Src1:demon.c Src1:do.c Src1:do_name.c \ X# Src1:do_wear.c Src1:dog.c Src1:dogmove.c \ X# Src1:dokick.c Src1:dothrow.c Src1:eat.c \ X# Src1:end.c Src1:engrave.c Src1:exper.c \ X# Src1:extralev.c Src1:fountain.c Src1:getline.c \ X# Src1:hack.c Src1:invent.c Src1:lock.c X# X# HSRC2 = \ X# Src2:mail.c Src2:makemon.c Src2:mcastu.c \ X# Src2:mhitm.c Src2:mhitu.c Src2:mklev.c \ X# Src2:mkmaze.c Src2:mkobj.c Src2:mkroom.c \ X# Src2:mon.c Src2:mondata.c Src2:monmove.c \ X# Src2:monst.c Src2:mthrowu.c Src2:music.c \ X# Src2:o_init.c Src2:objects.c Src2:objnam.c \ X# Src2:options.c Src2:pager.c Src2:pickup.c \ X# Src2:polyself.c Src2:potion.c X# X# HSRC3 = \ X# Src3:pray.c Src3:pri.c Src3:priest.c \ X# Src3:prisym.c Src3:read.c Src3:restore.c \ X# Src3:rip.c Src3:rnd.c Src3:rumors.c \ X# Src3:save.c Src3:search.c Src3:shk.c \ X# Src3:shknam.c Src3:sit.c Src3:sounds.c \ X# Src3:sp_lev.c Src3:spell.c Src3:steal.c \ X# Src3:timeout.c Src3:topl.c Src3:topten.c \ X# Src3:track.c Src3:trap.c Src3:u_init.c \ X# Src3:uhitm.c Src3:vault.c Src3:version.c \ X# Src3:weapon.c Src3:were.c Src3:wield.c \ X# Src3:wizard.c Src3:worm.c Src3:worn.c \ X# Src3:write.c Src3:zap.c X X X# All .c that are part of the main NetHack program and not system specific: X X# HACKCSRC = $(HSRC1) $(HSRC2) $(HSRC3) X X X# Other .c files (duplicates commented out): X X# MAKESRC = \ X# Src2:makedefs.c # Src2:monst.c Src2:objects.c X# X# SPLEVSRC = \ X# Src1:lev_comp.c Others:lev_lex.c Src1:lev_main.c X# X# AMIGASRC = \ X# Amiga:amidos.c Amiga:amitcap.c Amiga:amitty.c \ X# Amiga:amiunix.c Amiga:amiwbench.c Amiga:amiwind.c X# X# OTHERSRC = \ X# Others:pcmain.c Others:random.c X X X# All .c that are used: X X# CSOURCES = $(HACKCSRC) $(MAKESRC) $(SPLEVSRC) $(AMIGASRC) $(OTHERSRC) X X X# All .h files (except date.h, onames.h, pm.h, and trap.h, which would X# cause dependency loops in run through "make depend"): X X# HACKINCL = \ X# Incl:amiconf.h Incl:anime.h Incl:artifact.h \ X# Incl:attrib.h Incl:color.h Incl:config.h \ X# Incl:coord.h Incl:decl.h Incl:edog.h \ X# Incl:epri.h Incl:eshk.h Incl:extern.h \ X# Incl:flag.h Incl:func_tab.h Incl:global.h \ X# Incl:gold.h Incl:hack.h Incl:lev.h \ X# Incl:mfndpos.h Incl:mkroom.h Incl:monattk.h \ X# Incl:mondata.h Incl:monflag.h Incl:monst.h \ X# Incl:monsym.h Incl:msdos.h Incl:obj.h \ X# Incl:objclass.h Incl:patchlevel.h Incl:pcconf.h \ X# Incl:permonst.h Incl:prop.h Incl:rm.h \ X# Incl:sp_lev.h Incl:spell.h Incl:system.h \ X# Incl:tradstdc.h Incl:vault.h Incl:wseg.h \ X# Incl:you.h Incl:youprop.h X X X# All .h files: X X# HSOURCES = \ X# $(HACKINCL) Incl:date.h Incl:onames.h \ X# Incl:pm.h Incl:trap.h X X X# All source files: X X# SOURCES = $(CSOURCES) $(HSOURCES) X X X# Object files for makedefs: X XMAKEOBJS = \ X O_Src2:makedefs.o O_Src2:monst.o O_Src2:objects.o X X X# Object files for special levels compiler: X XSPLEVOBJS = \ X O_Src1:lev_comp.o O_Others:lev_lex.o O_Src1:lev_main.o \ X O_Src2:monst.o O_Src2:objects.o X X X# Object files for NetHack: X XHOBJ1 = \ X O_Src1:allmain.o O_Src1:alloc.o O_Src1:apply.o \ X O_Src1:artifact.o O_Src1:attrib.o O_Src1:bones.o \ X O_Src1:cmd.o O_Src1:dbridge.o O_Src1:decl.o \ X O_Src1:demon.o O_Src1:do.o O_Src1:do_name.o \ X O_Src1:do_wear.o O_Src1:dog.o O_Src1:dogmove.o \ X O_Src1:dokick.o O_Src1:dothrow.o O_Src1:eat.o \ X O_Src1:end.o O_Src1:engrave.o O_Src1:exper.o \ X O_Src1:extralev.o O_Src1:fountain.o O_Src1:getline.o \ X O_Src1:hack.o O_Src1:invent.o O_Src1:lock.o X XHOBJ2 = \ X O_Src2:mail.o O_Src2:makemon.o O_Src2:mcastu.o \ X O_Src2:mhitm.o O_Src2:mhitu.o O_Src2:mklev.o \ X O_Src2:mkmaze.o O_Src2:mkobj.o O_Src2:mkroom.o \ X O_Src2:mon.o O_Src2:mondata.o O_Src2:monmove.o \ X O_Src2:monst.o O_Src2:mthrowu.o O_Src2:music.o \ X O_Src2:o_init.o O_Src2:objects.o O_Src2:objnam.o \ X O_Src2:options.o O_Src2:pager.o O_Src2:pickup.o \ X O_Src2:polyself.o O_Src2:potion.o X XHOBJ3 = \ X O_Src3:pray.o O_Src3:pri.o O_Src3:priest.o \ X O_Src3:prisym.o O_Src3:read.o O_Src3:restore.o \ X O_Src3:rip.o O_Src3:rnd.o O_Src3:rumors.o \ X O_Src3:save.o O_Src3:search.o O_Src3:shk.o \ X O_Src3:shknam.o O_Src3:sit.o O_Src3:sounds.o \ X O_Src3:sp_lev.o O_Src3:spell.o O_Src3:steal.o \ X O_Src3:timeout.o O_Src3:topl.o O_Src3:topten.o \ X O_Src3:track.o O_Src3:trap.o O_Src3:u_init.o \ X O_Src3:uhitm.o O_Src3:vault.o O_Src3:version.o \ X O_Src3:weapon.o O_Src3:were.o O_Src3:wield.o \ X O_Src3:wizard.o O_Src3:worm.o O_Src3:worn.o \ X O_Src3:write.o O_Src3:zap.o X XAMIGAOBJ = \ X O_Amiga:amidos.o O_Amiga:amitcap.o O_Amiga:amitty.o \ X O_Amiga:amiunix.o O_Amiga:amiwbench.o O_Amiga:amiwind.o X XOTHEROBJ = \ X O_Others:pcmain.o $(RANDOBJ) X X X# All the object files for NetHack: X XHOBJ = $(HOBJ1) $(HOBJ2) $(HOBJ3) $(AMIGAOBJ) $(OTHEROBJ) X X X# The auxiliary runtime files: X XAUXFILES = \ X NetHack:data NetHack:rumors NetHack:castle \ X NetHack:endgame NetHack:tower1 NetHack:cmdhelp \ X NetHack:help NetHack:hh NetHack:history \ X NetHack:license NetHack:opthelp NetHack:oracles \ X NetHack:perm NetHack:record NetHack:NetHack.cnf \ X NetHack:hack.font NetHack:hack NetHack:hack/8 \ X NetHack:default.icon HackExe:NetHack.info NetHack:NewGame.info \ X NetHack:Guidebook.info NetHack:Guidebook NetHack:NetHackScore.info X X X# Getting down to business: X Xall: NetHack:lev_comp $(GAME) auxilstuff X X$(GAME): $(HOBJ) X $(LINK) $(GAME) $(LIN) $(LLINK) $(LLIB) X Xlink: X $(LINK) $(GAME) $(LIN) $(LLINK) $(LLIB) X Xobj1: $(HOBJ1) Xobj2: $(HOBJ2) Xobj3: $(HOBJ3) Xobja: $(AMIGAOBJ) Xobjo: $(OTHEROBJ) X X X# The default method for creating object files: X X#[LATTICE] X X.c.o: X $(CC) $(CFLAGS) $(CSYM) -o$@ $< X X#[MANX3.6] X X#$(HOBJ1): X# $(CC) $(CFLAGS) $(CSYM) -o$@ Src1:$*.c X X#$(HOBJ2): X# $(CC) $(CFLAGS) $(CSYM) -o$@ Src2:$*.c X X#$(HOBJ3): X# $(CC) $(CFLAGS) $(CSYM) -o$@ Src3:$*.c X X#$(AMIGAOBJ): X# $(CC) $(CFLAGS) $(CSYM) -o$@ Amiga:$*.c X X#$(OTHEROBJ): X# $(CC) $(CFLAGS) $(CSYM) -o$@ Others:$*.c X X Xclean: X -delete O_Amiga:\#?.o O_Others:\#?.o X -delete O_Src1:\#?.o O_Src2:\#?.o O_Src3:\#?.o X Xspotless: clean X -delete $(GAME) NetHack:lev_comp NetHack:makedefs X -delete Auxil:data Auxil:rumors X -delete NetHack:data NetHack:rumors X -delete NetHack:castle NetHack:endgame X -delete NetHack:tower1 NetHack:tower2 NetHack:tower3 X -delete Incl:onames.h Incl:pm.h X -echo > Incl:onames.h "" noline X -wait 2 X -echo > Incl:pm.h "" noline X -wait 2 X -setdate Src2:makedefs.c X -wait 2 X# (Make sure files exist and have timestamps in the right order for X# next compile) X X X# Creating precompiled version of Incl:hack.h to save disk I/O. X X#[LATTICE] X# If we were to use the precompiled header file feature of Lattice C, we X# would uncomment the following lines. However, there are still problems X# in the behavior of this feature in version 5.04, so these lines are X# commented out for now. (Also see defines for HDEP and CSYM near the X# beginning of this file, as these should be appropriately defined.) X X#$(HDEP): Incl:hack.h NetHack:makedefs X# echo > Ram:hackincl.c "#include <Incl:hack.h>" X# $(CC) $(CFLAGS) -ph -o$@ Ram:hackincl.c X# -delete Ram:hackincl.c X X#[MANX3.6] X# If we were compiling with Aztec 3.6 and wanted to use the symbol table X# pre-loading feature, we would uncomment these following two lines. X X#$(HDEP): Incl:hack.h NetHack:makedefs X# $(CC) $(CFLAGS) -a -oRam:hack.asm +h$@ Incl:hack.h X# -delete Ram:hack.asm X X X# X# Please note: The dependency lines for the modules here are X# deliberately incorrect. Including "hack.h" in X# the dependency list would cause a dependency X# loop. X# X XNetHack:makedefs: $(MAKEOBJS) X $(LINK) NetHack:makedefs $(LIN) $(MAKEOBJS) $(LLIB) X XO_Src2:makedefs.o: Src2:makedefs.c Incl:config.h Incl:permonst.h Incl:objclass.h X $(CC) -dMAKEDEFS_C $(CFLAGS) -o$@ Src2:makedefs.c X XNetHack:lev_comp: $(SPLEVOBJS) X $(LINK) NetHack:lev_comp $(LIN) $(SPLEVOBJS) $(LLIB) X XO_Src1:lev_comp.o: Src1:lev_comp.c $(HDEP) Incl:sp_lev.h X $(CC) -dLEV_LEX_C $(CFLAGS) -o$@ Src1:lev_comp.c X XO_Others:lev_lex.o: Others:lev_lex.c $(HDEP) Incl:lev_comp.h Incl:sp_lev.h X $(CC) -dLEV_LEX_C $(CFLAGS) -o$@ Others:lev_lex.c X XO_Src1:lev_main.o: Src1:lev_main.c $(HDEP) X $(CC) -dLEV_LEX_C -dAMIGA $(CFLAGS) -o$@ Src1:lev_main.c X X# X# The following include files depend on makedefs to be created. X# As a result, they are not defined in HACKINCL, instead, their X# dependencies are explicitly outlined here. X# X X# X# date.h should be remade any time any of the source or include code X# is modified. Unfortunately, this would make the contents of this X# file far more complex. Since "hack.h" depends on most of the include X# files, we kludge around this by making date.h dependent on hack.h, X# even though it doesn't include this file. X# X XIncl:date.h: $(HDEP) NetHack:makedefs $(AMIGAOBJ) X NetHack:makedefs -v X XIncl:trap.h: NetHack:makedefs X NetHack:makedefs -t X -copy makedefs.1 $@ X XIncl:onames.h: NetHack:makedefs X NetHack:makedefs -o X XIncl:pm.h: NetHack:makedefs X NetHack:makedefs -p X X# X# The following programs vary depending on what OS you are using. X# As a result, they are not defined in HACKSRC and their dependancies X# are explicitly outlined here. X# X XO_Amiga:amidos.o: Amiga:amidos.c $(HDEP) X XO_Amiga:amitcap.o: Amiga:amitcap.c $(HDEP) X XO_Amiga:amitty.o: Amiga:amitty.c $(HDEP) X XO_Amiga:amiunix.o: Amiga:amiunix.c $(HDEP) X XO_Amiga:amiwind.o: Amiga:amiwind.c Amiga:amimenu.c $(HDEP) X XO_Amiga:amiwbench.o: Amiga:amiwbench.c $(HDEP) X XO_Others:random.o: Others:random.c X $(CC) $(CFLAGS) -o$@ Others:random.c X XO_Others:pcmain.o: Others:pcmain.c $(HDEP) X X X# Create/copy other stuff into NetHack: directory: X Xauxilstuff: $(AUXFILES) X XNetHack:data: Auxil:data X copy Auxil:data $@ X XAuxil:data: Auxil:data.base Incl:config.h NetHack:makedefs X NetHack:makedefs -d X XNetHack:rumors: Auxil:rumors X copy Auxil:rumors $@ X XAuxil:rumors: Auxil:rumors.tru Auxil:rumors.fal NetHack:makedefs X NetHack:makedefs -r X XNetHack:castle: Auxil:castle.des NetHack:lev_comp X NetHack:lev_comp Auxil:castle.des X XNetHack:endgame: Auxil:endgame.des NetHack:lev_comp X NetHack:lev_comp Auxil:endgame.des X XNetHack:tower1: Auxil:tower.des NetHack:lev_comp X NetHack:lev_comp Auxil:tower.des X XNetHack:cmdhelp: Auxil:cmdhelp X copy Auxil:cmdhelp $@ X XNetHack:help: Auxil:help X copy Auxil:help $@ X XNetHack:hh: Auxil:hh X copy Auxil:hh $@ X XNetHack:history: Auxil:history X copy Auxil:history $@ X XNetHack:license: Auxil:license X copy Auxil:license $@ X XNetHack:opthelp: Auxil:opthelp X copy Auxil:opthelp $@ X XNetHack:oracles: Auxil:oracles X copy Auxil:oracles $@ X XNetHack:perm: X echo > $@ "" NOLINE X XNetHack:record: X echo > $@ "" NOLINE X XNetHack:NetHack.cnf: Amiga:NetHack.cnf X copy Amiga:NetHack.cnf $@ X XNetHack:hack.font: Amiga:amifont.uu X $(UUDEC) Amiga:amifont.uu X XNetHack:hack: X makedir $@ X XNetHack:hack/8: Amiga:amifont8.uu NetHack:hack X $(UUDEC) Amiga:amifont8.uu X -rename 8 hack/8 X XNetHack:default.icon: Amiga:dflticon.uu X $(UUDEC) Amiga:dflticon.uu X XHackExe:NetHack.info: Amiga:NHinfo.uu X $(UUDEC) Amiga:NHinfo.uu X XNetHack:NewGame.info: Amiga:NewGame.uu X $(UUDEC) Amiga:NewGame.uu X XNetHack:NetHackScore.info: Amiga:NHScore.uu X $(UUDEC) Amiga:NHScore.uu X XNetHack:Guidebook.info: Amiga:GBinfo.uu X $(UUDEC) Amiga:GBinfo.uu X XNetHack:Guidebook: Auxil:Guidebook.mss X copy Auxil:Guidebook.mss $@ X X# DO NOT DELETE THIS LINE X XO_Src1:allmain.o: Src1:allmain.c $(HDEP) XO_Src1:alloc.o: Src1:alloc.c Incl:config.h X $(CC) $(CFLAGS) -o$@ Src1:alloc.c XO_Src1:apply.o: Src1:apply.c $(HDEP) Incl:edog.h XO_Src1:artifact.o: Src1:artifact.c $(HDEP) Incl:artifact.h XO_Src1:attrib.o: Src1:attrib.c $(HDEP) XO_Src1:bones.o: Src1:bones.c $(HDEP) XO_Src1:cmd.o: Src1:cmd.c $(HDEP) Incl:func_tab.h XO_Src1:dbridge.o: Src1:dbridge.c $(HDEP) XO_Src1:decl.o: Src1:decl.c $(HDEP) XO_Src1:demon.o: Src1:demon.c $(HDEP) XO_Src1:do.o: Src1:do.c $(HDEP) XO_Src1:do_name.o: Src1:do_name.c $(HDEP) XO_Src1:do_wear.o: Src1:do_wear.c $(HDEP) XO_Src1:dog.o: Src1:dog.c $(HDEP) Incl:edog.h XO_Src1:dogmove.o: Src1:dogmove.c $(HDEP) Incl:mfndpos.h Incl:edog.h XO_Src1:dokick.o: Src1:dokick.c $(HDEP) Incl:eshk.h XO_Src1:dothrow.o: Src1:dothrow.c $(HDEP) XO_Src1:eat.o: Src1:eat.c $(HDEP) XO_Src1:end.o: Src1:end.c $(HDEP) Incl:eshk.h XO_Src1:engrave.o: Src1:engrave.c $(HDEP) XO_Src1:exper.o: Src1:exper.c $(HDEP) XO_Src1:extralev.o: Src1:extralev.c $(HDEP) XO_Src1:fountain.o: Src1:fountain.c $(HDEP) XO_Src1:getline.o: Src1:getline.c $(HDEP) Incl:func_tab.h XO_Src1:hack.o: Src1:hack.c $(HDEP) XO_Src1:invent.o: Src1:invent.c $(HDEP) Incl:lev.h Incl:wseg.h XO_Src1:lock.o: Src1:lock.c $(HDEP) XO_Src2:mail.o: Src2:mail.c $(HDEP) XO_Src2:makemon.o: Src2:makemon.c $(HDEP) XO_Src2:mcastu.o: Src2:mcastu.c $(HDEP) XO_Src2:mhitm.o: Src2:mhitm.c $(HDEP) Incl:artifact.h XO_Src2:mhitu.o: Src2:mhitu.c $(HDEP) Incl:artifact.h Incl:edog.h XO_Src2:mklev.o: Src2:mklev.c $(HDEP) XO_Src2:mkmaze.o: Src2:mkmaze.c $(HDEP) XO_Src2:mkobj.o: Src2:mkobj.c $(HDEP) XO_Src2:mkroom.o: Src2:mkroom.c $(HDEP) XO_Src2:mon.o: Src2:mon.c $(HDEP) Incl:mfndpos.h Incl:wseg.h XO_Src2:mondata.o: Src2:mondata.c $(HDEP) Incl:eshk.h Incl:epri.h XO_Src2:monmove.o: Src2:monmove.c $(HDEP) Incl:mfndpos.h Incl:artifact.h XO_Src2:monst.o: Src2:monst.c Incl:config.h Incl:permonst.h Incl:monsym.h Incl:eshk.h Incl:vault.h Incl:epri.h Incl:color.h X $(CC) $(CFLAGS) -o$@ Src2:monst.c XO_Src2:mthrowu.o: Src2:mthrowu.c $(HDEP) XO_Src2:music.o: Src2:music.c $(HDEP) XO_Src2:o_init.o: Src2:o_init.c $(HDEP) XO_Src2:objects.o: Src2:objects.c Incl:config.h Incl:obj.h Incl:objclass.h Incl:prop.h Incl:color.h X $(CC) $(CFLAGS) -o$@ Src2:objects.c XO_Src2:objnam.o: Src2:objnam.c $(HDEP) XO_Src2:options.o: Src2:options.c $(HDEP) XO_Src2:pager.o: Src2:pager.c $(HDEP) XO_Src2:pickup.o: Src2:pickup.c $(HDEP) XO_Src2:polyself.o: Src2:polyself.c $(HDEP) XO_Src2:potion.o: Src2:potion.c $(HDEP) XO_Src3:pray.o: Src3:pray.c $(HDEP) XO_Src3:pri.o: Src3:pri.c $(HDEP) Incl:epri.h Incl:termcap.h XO_Src3:priest.o: Src3:priest.c $(HDEP) Incl:mfndpos.h Incl:eshk.h Incl:epri.h XO_Src3:prisym.o: Src3:prisym.c $(HDEP) Incl:wseg.h Incl:lev.h XO_Src3:read.o: Src3:read.c $(HDEP) XO_Src3:restore.o: Src3:restore.c $(HDEP) Incl:lev.h Incl:wseg.h XO_Src3:rip.o: Src3:rip.c $(HDEP) XO_Src3:rnd.o: Src3:rnd.c $(HDEP) XO_Src3:rumors.o: Src3:rumors.c $(HDEP) XO_Src3:save.o: Src3:save.c $(HDEP) Incl:lev.h Incl:wseg.h XO_Src3:search.o: Src3:search.c $(HDEP) Incl:artifact.h XO_Src3:shk.o: Src3:shk.c $(HDEP) Incl:eshk.h XO_Src3:shknam.o: Src3:shknam.c $(HDEP) Incl:eshk.h XO_Src3:sit.o: Src3:sit.c $(HDEP) XO_Src3:sounds.o: Src3:sounds.c $(HDEP) Incl:edog.h Incl:eshk.h XO_Src3:sp_lev.o: Src3:sp_lev.c $(HDEP) Incl:sp_lev.h XO_Src3:spell.o: Src3:spell.c $(HDEP) XO_Src3:steal.o: Src3:steal.c $(HDEP) XO_Src3:timeout.o: Src3:timeout.c $(HDEP) XO_Src3:topl.o: Src3:topl.c $(HDEP) XO_Src3:topten.o: Src3:topten.c $(HDEP) XO_Src3:track.o: Src3:track.c $(HDEP) XO_Src3:trap.o: Src3:trap.c $(HDEP) Incl:edog.h XO_Src3:u_init.o: Src3:u_init.c $(HDEP) XO_Src3:uhitm.o: Src3:uhitm.c $(HDEP) Incl:artifact.h XO_Src3:vault.o: Src3:vault.c $(HDEP) Incl:vault.h XO_Src3:version.o: Src3:version.c $(HDEP) Incl:date.h Incl:patchlevel.h XO_Src3:weapon.o: Src3:weapon.c $(HDEP) XO_Src3:were.o: Src3:were.c $(HDEP) XO_Src3:wield.o: Src3:wield.c $(HDEP) XO_Src3:wizard.o: Src3:wizard.c $(HDEP) XO_Src3:worm.o: Src3:worm.c $(HDEP) Incl:wseg.h XO_Src3:worn.o: Src3:worn.c $(HDEP) XO_Src3:write.o: Src3:write.c $(HDEP) XO_Src3:zap.o: Src3:zap.c $(HDEP) XIncl:config.h: Incl:tradstdc.h Incl:global.h X -setdate Incl:config.h X -wait 2 XIncl:decl.h: Incl:spell.h Incl:color.h Incl:obj.h Incl:you.h Incl:onames.h Incl:pm.h X -setdate Incl:decl.h X -wait 2 XIncl:global.h: Incl:coord.h Incl:vmsconf.h Incl:unixconf.h Incl:pcconf.h Incl:tosconf.h Incl:amiconf.h Incl:macconf.h X -setdate Incl:global.h X -wait 2 XIncl:hack.h: Incl:config.h Incl:decl.h Incl:monsym.h Incl:mkroom.h Incl:objclass.h Incl:gold.h Incl:trap.h Incl:flag.h Incl:rm.h Incl:trampoli.h X -setdate Incl:hack.h X -wait 2 XIncl:permonst.h: Incl:monattk.h Incl:monflag.h X -setdate Incl:permonst.h X -wait 2 XIncl:you.h: Incl:attrib.h Incl:monst.h Incl:youprop.h X -setdate Incl:you.h X -wait 2 XIncl:youprop.h: Incl:prop.h Incl:permonst.h Incl:mondata.h Incl:pm.h X -setdate Incl:youprop.h X -wait 2 X# DEPENDENCIES MUST END AT END OF FILE X# IF YOU PUT STUFF HERE IT WILL GO AWAY X# see make depend above END_OF_FILE if test 21416 -ne `wc -c <'amiga/Makefile.ami'`; then echo shar: \"'amiga/Makefile.ami'\" unpacked with wrong size! fi # end of 'amiga/Makefile.ami' fi if test -f 'src/hack.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/hack.c'\" else echo shar: Extracting \"'src/hack.c'\" \(28166 characters\) sed "s/^X//" >'src/hack.c' <<'END_OF_FILE' X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X/* NetHack may be freely redistributed. See license for details. */ X X#include "hack.h" X X#if defined(UNIX) && !defined(LINT) Xstatic const char SCCS_Id[] = "@(#)hack.c 3.0\t89/11/20"; X#endif X XSTATIC_DCL int NDECL(moverock); X#ifdef SINKS XSTATIC_DCL void NDECL(dosinkfall); X#endif X X#ifdef OVL1 Xstatic boolean FDECL(is_edge,(XCHAR_P,XCHAR_P)); Xstatic boolean FDECL(bad_rock,(XCHAR_P,XCHAR_P)); X#endif /* OVL1 */ X X#ifdef OVLB X X/* called on movement: X 1. when throwing ball+chain far away X 2. when teleporting X 3. when walking out of a lit room X */ Xvoid Xunsee() { X register xchar x,y; X register struct rm *lev; X X if(seehx){ X seehx = 0; X } X /* X * Erase surrounding positions if needed. We don't need to do this X * if we are blind, since we can't see them anyway. This removes the X * pl6 bug that makes monsters disappear if they are next to you if X * you teleport while blind and telepathic. X */ X else if(!Blind) X for(x = u.ux-1; x < u.ux+2; x++) X for(y = u.uy-1; y < u.uy+2; y++) { X if(!isok(x, y)) continue; X lev = &levl[x][y]; X if(!lev->lit && lev->scrsym == ROOM_SYM) { X lev->scrsym = STONE_SYM; X lev->new = 1; X on_scr(x,y); X } X } X} X X/* called: X in apply.c: seeoff(0) - when taking a picture of yourself X - when donning a blindfold X in do.c: seeoff(0) - blind after drinking potion X in do.c: seeoff(1) - go up or down the stairs X in eat.c: seeoff(0) - blind after eating rotten food X in mhitu.c: seeoff(0) - blinded by a glowing eye X in mhitu.c: seeoff(1) - swallowed X in mthrow.c: seeoff(0) - hit by a cream pie. X in potion.c: seeoff(0) - quaffing or sniffing a potion of blindness X in spell.c: seeoff(0) - due to a cursed spell book X in trap.c: seeoff(1) - fall through trap door X */ Xvoid Xseeoff(mode) Xint mode; X{ /* 1 to redo @, 0 to leave them */ X /* 1 means misc movement, 0 means blindness */ X register xchar x,y; X register struct rm *lev; X X if(u.udispl && mode){ X u.udispl = 0; X levl[u.udisx][u.udisy].scrsym = news0(u.udisx,u.udisy); X } X if(seehx) { X seehx = 0; X } else X if(!mode) { X for(x = u.ux-1; x < u.ux+2; x++) X for(y = u.uy-1; y < u.uy+2; y++) { X if(!isok(x, y)) continue; X lev = &levl[x][y]; X if(MON_AT(x, y)) X unpmon(m_at(x,y)); X if(!lev->lit && lev->scrsym == ROOM_SYM) { X lev->seen = 0; X atl(x, y, (char)STONE_SYM); X } X } X } X} X X#endif /* OVLB */ X#ifdef OVL2 X XSTATIC_OVL int Xmoverock() { X register xchar rx, ry; X register struct obj *otmp, *otmp2; X register struct trap *ttmp; X register struct monst *mtmp; X X#ifdef POLYSELF X if (passes_walls(uasmon)) return 0; X#endif X while(otmp = sobj_at(BOULDER, u.ux+u.dx, u.uy+u.dy)) { X rx = u.ux+2*u.dx; X ry = u.uy+2*u.dy; X nomul(0); X#ifdef POLYSELF X if (verysmall(uasmon)) { X pline("You're too small to push that boulder."); X goto cannot_push; X } X#endif X if(isok(rx,ry) && !IS_ROCK(levl[rx][ry].typ) && X (!IS_DOOR(levl[rx][ry].typ) || !(u.dx && u.dy) || ( X#ifdef REINCARNATION X dlevel != rogue_level && X#endif X (levl[rx][ry].doormask & ~D_BROKEN) == D_NODOOR)) && X !sobj_at(BOULDER, rx, ry)) { X if(MON_AT(rx, ry)) { X mtmp = m_at(rx,ry); X if(canseemon(mtmp)) X pline("There's %s on the other side.", X mon_nam(mtmp)); X else X You("hear a monster behind the boulder."); X if(flags.verbose) X pline("Perhaps that's why you cannot move it."); X goto cannot_push; X } X if(ttmp = t_at(rx,ry)) X switch(ttmp->ttyp) { X case SPIKED_PIT: X case PIT: X You("push the boulder into a pit!"); X deltrap(ttmp); X delobj(otmp); X if(cansee(rx,ry)) newsym(rx,ry); X else levl[rx][ry].seen = 0; X if(flags.verbose) X pline("It completely fills the pit!"); X continue; X case TRAPDOOR: X if(is_maze_lev X#ifdef STRONGHOLD X && (dlevel > stronghold_level) X#endif X ) break; X pline("The boulder falls into and plugs a hole in the ground!"); X deltrap(ttmp); X delobj(otmp); X if(cansee(rx,ry)) newsym(rx,ry); X else levl[rx][ry].seen = 0; X continue; X case LEVEL_TELEP: X case TELEP_TRAP: X You("push the boulder and suddenly it disappears!"); X rloco(otmp); X continue; X } X if(closed_door(rx, ry)) X goto nopushmsg; X if(is_pool(rx,ry)) { X#ifdef STRONGHOLD X if(levl[rx][ry].typ == DRAWBRIDGE_UP) X levl[rx][ry].drawbridgemask |= DB_FLOOR; X else X#endif X levl[rx][ry].typ = ROOM; X mnewsym(rx,ry); X if(!Blind) prl(rx,ry); X You("push the boulder into the water."); X if(flags.verbose && !Blind) X pline("Now you can cross the water!"); X delobj(otmp); X continue; X } X /* X * Re-link at top of fobj chain so that X * pile order is preserved when level is X * restored. X */ X if (otmp != fobj) { X otmp2 = fobj; X while (otmp2->nobj && otmp2->nobj != otmp) X otmp2 = otmp2->nobj; X if (!otmp2->nobj) X impossible("moverock: error in fobj chain"); X else { X otmp2->nobj = otmp->nobj; X otmp->nobj = fobj; X fobj = otmp; X } X } X move_object(otmp, rx, ry); X /* pobj(otmp); */ X if(cansee(rx,ry)) atl(rx,ry,otmp->olet); X newsym(u.ux+u.dx, u.uy+u.dy); X X { X#ifdef LINT /* static long lastmovetime; */ X long lastmovetime; X lastmovetime = 0; X#else X static long NEARDATA lastmovetime; X#endif X /* note: this var contains garbage initially and X after a restore */ X if(moves > lastmovetime+2 || moves < lastmovetime) X pline("With great effort you move the boulder."); X lastmovetime = moves; X } X } else { Xnopushmsg: X You("try to move the boulder, but in vain."); X cannot_push: X#ifdef POLYSELF X if (throws_rocks(uasmon)) { X if(!flags.pickup) X pline("However, you easily can push it aside."); X else X pline("However, you easily can pick it up."); X break; X } X#endif X if((!invent || inv_weight()+90 <= 0) && X (!u.dx || !u.dy || (IS_ROCK(levl[u.ux][u.uy+u.dy].typ) X && IS_ROCK(levl[u.ux+u.dx][u.uy].typ))) X#ifdef POLYSELF X || verysmall(uasmon) X#endif X ) X { X pline("However, you can squeeze yourself into a small opening."); X break; X } else X return (-1); X } X } X return (0); X} X X#endif /* OVL2 */ X#ifdef OVLB X Xvoid Xmovobj(obj, ox, oy) Xregister struct obj *obj; Xregister xchar ox, oy; X{ X remove_object(obj); X if (cansee(obj->ox, obj->oy)) { X levl[obj->ox][obj->oy].seen = 0; X prl(obj->ox, obj->oy); X } else X newsym(obj->ox, obj->oy); X place_object(obj, ox, oy); X if (cansee(ox, oy)) { X levl[ox][oy].seen = 0; X prl(ox, oy); X } else X newsym(ox, oy); X} X X#ifdef SINKS XSTATIC_OVL Xvoid Xdosinkfall() { X register struct obj *obj; X X# ifdef POLYSELF X if (is_floater(uasmon)) { X You("wobble unsteadily for a moment."); X } else { X# endif X You("crash to the floor!"); X losehp((rn1(10, 20 - (int)ACURR(A_CON))), X "fell onto a sink", NO_KILLER_PREFIX); X for(obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) X if(obj->olet == WEAPON_SYM) { X You("fell on %s.",doname(obj)); X losehp(rn2(3),"fell onto a sink", NO_KILLER_PREFIX); X } X# ifdef POLYSELF X } X# endif X X HLevitation = (HLevitation & ~TIMEOUT) + 1; X if(uleft && uleft->otyp == RIN_LEVITATION) { X obj = uleft; X Ring_off(obj); X off_msg(obj); X } X if(uright && uright->otyp == RIN_LEVITATION) { X obj = uright; X Ring_off(obj); X off_msg(obj); X } X if(uarmf && uarmf->otyp == LEVITATION_BOOTS) { X obj = uarmf; X (void)Boots_off(); X off_msg(obj); X } X HLevitation--; X} X#endif X X#endif /* OVLB */ X#ifdef OVL1 X Xstatic boolean Xis_edge(x,y) Xregister xchar x,y; X/* return true if (x,y) is on the edge of a room X * we cannot rely on IS_DOOR(levl[x][y].typ) because some of the stronghold X * "rooms" are actually outside areas without doors X */ X{ X register int roomno = inroom(x,y); X X if(roomno < 0) return FALSE; X return((x == rooms[roomno].lx - 1) || (x == rooms[roomno].hx + 1) || X (y == rooms[roomno].ly - 1) || (y == rooms[roomno].hy + 1)); X} X X#endif /* OVL1 */ X#ifdef OVLB X Xboolean Xmay_dig(x,y) Xregister xchar x,y; X/* intended to be called only on ROCKs */ X{ Xreturn (!(IS_STWALL(levl[x][y].typ) && (levl[x][y].diggable & W_NONDIGGABLE))); X} X X#endif /* OVLB */ X#ifdef OVL1 X Xstatic boolean Xbad_rock(x,y) Xregister xchar x,y; X{ X return(IS_ROCK(levl[x][y].typ) X#ifdef POLYSELF X && !passes_walls(uasmon) X && (!tunnels(uasmon) || needspick(uasmon) || !may_dig(x,y)) X#endif X ); X} X Xvoid Xdomove() { X register struct monst *mtmp; X register struct rm *tmpr,*ust; X register xchar x,y; X struct trap *trap; X X u_wipe_engr(rnd(5)); X X if(inv_weight() > 0){ X You("collapse under your load."); X nomul(0); X return; X } X if(u.uswallow) { X register xchar xx,yy; X X u.dx = u.dy = 0; X xx = u.ux; X yy = u.uy; X x = u.ux = u.ustuck->mx; X y = u.uy = u.ustuck->my; X if(xx != x || yy != y) newsym(xx,yy); X mtmp = u.ustuck; X } else { X x = u.ux + u.dx; X y = u.uy + u.dy; X if(Stunned || (Confusion && !rn2(5))) { X register int tries = 0; X X do { X if(tries++ > 50) { X nomul(0); X return; X } X confdir(); X x = u.ux + u.dx; X y = u.uy + u.dy; X } while(!isok(x, y) || bad_rock(x, y)); X } X if(!isok(x, y)) { X nomul(0); X return; X } X if((trap = t_at(x, y)) && trap->tseen) X nomul(0); X if(u.ustuck && (x != u.ustuck->mx || X y != u.ustuck->my)) { X if(dist(u.ustuck->mx, u.ustuck->my) > 2) { X /* perhaps it fled (or was teleported or ... ) */ X u.ustuck = 0; X } else { X#ifdef POLYSELF X /* If polymorphed into a sticking monster, X * u.ustuck means it's stuck to you, not you X * to it. X */ X if (sticks(uasmon)) { X kludge("You release %s.", X mon_nam(u.ustuck)); X u.ustuck = 0; X } else { X#endif X kludge("You cannot escape from %s!", X mon_nam(u.ustuck)); X nomul(0); X return; X#ifdef POLYSELF X } X#endif X } X } X mtmp = m_at(x,y); X if (mtmp) { X /* Don't attack if you're running */ X if (flags.run && !mtmp->mimic && X (Blind ? Telepat : X (!mtmp->minvis || See_invisible))) { X nomul(0); X flags.move = 0; X return; X } X } X } X X u.ux0 = u.ux; X u.uy0 = u.uy; X tmpr = &levl[x][y]; X X /* attack monster */ X if(mtmp) { X nomul(0); X gethungry(); X if(multi < 0) return; /* we just fainted */ X X /* try to attack; note that it might evade */ X if(attack(mtmp)) return; X } X X /* not attacking an animal, so we try to move */ X#ifdef POLYSELF X if(!uasmon->mmove) { X You("are rooted %s.", Levitation ? "in place" X : "to the ground"); X nomul(0); X return; X } X#endif X if(u.utrap) { X if(u.utraptype == TT_PIT) { X if(flags.verbose) X Norep("You are still in a pit."); X u.utrap--; X } else if (u.utraptype == TT_WEB) { X if(flags.verbose) X Norep("You are stuck to the web."); X u.utrap--; X } else { X if(flags.verbose) X Norep("You are caught in a bear trap."); X if((u.dx && u.dy) || !rn2(5)) u.utrap--; X } X return; X } X /* check for physical obstacles */ X#ifdef POLYSELF X if (!passes_walls(uasmon)) { X#endif X#ifdef STRONGHOLD X if(dlevel == stronghold_level && is_db_wall(x,y)) { X pline("The drawbridge is up!"); X nomul(0); X return; X } X#endif X if(closed_door(x, y)) { X#ifdef POLYSELF X if(amorphous(uasmon)) X You("ooze under the door."); X else { X#endif X flags.move = 0; X if(x == u.ux || y == u.uy) { X if (Blind || Stunned || ACURR(A_DEX) < 10 || Fumbling) X pline("Ouch! You bump into a door."); X else pline("That door is closed."); X } X nomul(0); X return; X#ifdef POLYSELF X } X#endif X } X#ifdef POLYSELF X } X#endif X ust = &levl[u.ux][u.uy]; X X if(bad_rock(x,y) || X (u.dx && u.dy X#ifdef POLYSELF X && !passes_walls(uasmon) X#endif X && ( (IS_DOOR(ust->typ) && block_entry(x, y)) || X#ifdef REINCARNATION X (IS_DOOR(tmpr->typ) && X ((tmpr->doormask & ~D_BROKEN) X || dlevel == rogue_level || block_door(x, y)) X ) X || (IS_DOOR(ust->typ) && X ((ust->doormask & ~D_BROKEN) || dlevel == rogue_level) X ) X#else X (IS_DOOR(tmpr->typ) && X ((tmpr->doormask & ~D_BROKEN) || block_door(x, y))) || X (IS_DOOR(ust->typ) && (ust->doormask & ~D_BROKEN)) X#endif X ) X )) { X flags.move = 0; X nomul(0); X return; X } X if(moverock() < 0) return; X if(u.dx && u.dy && bad_rock(u.ux,y) && X bad_rock(x,u.uy)) { X#ifdef POLYSELF X if (bigmonst(uasmon)) { X Your("body is too large to fit through."); X nomul(0); X return; X } X#endif X if (invent && inv_weight()+40 > 0) { X You("are carrying too much to get through."); X nomul(0); X return; X } X } X if(Punished && X dist2(x, y, uchain->ox, uchain->oy) > 2) { X if(carried(uball)) { X movobj(uchain, u.ux, u.uy); X goto nodrag; X } X X if(dist2(x, y, uball->ox, uball->oy) < 3) { X /* leave ball, move chain under/over ball */ X movobj(uchain, uball->ox, uball->oy); X goto nodrag; X } X X if(inv_weight() + (int)(uball->owt >> 1) > 0) { X You("cannot %sdrag the heavy iron ball.", X invent ? "carry all that and also " : ""); X nomul(0); X return; X } X X movobj(uball, uchain->ox, uchain->oy); X movobj(uchain, u.ux, u.uy); X nomul(-2); X nomovemsg = ""; X nodrag: ; X } X#ifdef POLYSELF X if (tunnels(uasmon) && !needspick(uasmon) && IS_ROCK(tmpr->typ)) { X static const char NEARDATA *digtxt; X X if(dig_pos.x != x || dig_pos.y != y X || dig_level != dlevel || dig_down) { X dig_down = FALSE; X dig_pos.x = x; X dig_pos.y = y; X dig_level = dlevel; X dig_effort = 30; X You("start chewing a hole in the rock."); X return; X } else if ((dig_effort += 30) < 100) { X if(flags.verbose) X You("continue chewing the rock up."); X return; X } else { X if (IS_WALL(tmpr->typ)) { X digtxt = "You chew a hole in the wall."; X if(!is_maze_lev) X tmpr->typ = DOOR; X else X tmpr->typ = ROOM; X } else if (tmpr->typ==SDOOR) { X digtxt = "You chew through a secret door."; X tmpr->typ = DOOR; X if(!(tmpr->doormask & D_TRAPPED)) X tmpr->doormask = D_BROKEN; X } else { X digtxt = "You chew a passage through the rock."; X tmpr->typ = CORR; X } X mnewsym(x, y); X prl(x, y); X pline(digtxt); X if(IS_DOOR(tmpr->typ) && (tmpr->doormask & D_TRAPPED)) { X b_trapped("door"); X tmpr->doormask = D_NODOOR; X mnewsym(x, y); X prl(x, y); X } X dig_level = -1; X } X } X#endif X u.ux += u.dx; X u.uy += u.dy; X reset_occupations(); X if(flags.run) { X if(IS_DOOR(tmpr->typ) || X#ifdef POLYSELF X (IS_ROCK(tmpr->typ)) || X#endif X (xupstair == u.ux && yupstair == u.uy) || X (xdnstair == u.ux && ydnstair == u.uy) X#ifdef STRONGHOLD X || (xupladder == u.ux && yupladder == u.uy) X || (xdnladder == u.ux && ydnladder == u.uy) X#endif X#ifdef FOUNTAINS X || IS_FOUNTAIN(tmpr->typ) X#endif X#ifdef THRONES X || IS_THRONE(tmpr->typ) X#endif X#ifdef SINKS X || IS_SINK(tmpr->typ) X#endif X#ifdef ALTARS X || IS_ALTAR(tmpr->typ) X#endif X ) X nomul(0); X } X#ifdef POLYSELF X if (hides_under(uasmon)) X u.uundetected = (OBJ_AT(u.ux, u.uy) || levl[u.ux][u.uy].gmask); X else if (u.dx || u.dy) { /* piercer */ X if (u.usym == S_MIMIC_DEF) X u.usym = S_MIMIC; X u.uundetected = 0; X } X#endif X X/* X if(u.udispl) { X u.udispl = 0; X newsym(u.ux0,u.uy0); X } X*/ X if(!Blind) { X register xchar backx = u.ux0 - u.dx; /* one step beyond old pos */ X register xchar backy = u.uy0 - u.dy; X register xchar frontx = u.ux + u.dx; /* one step beyond new pos */ X register xchar fronty = u.uy + u.dy; X register boolean newedge = is_edge(u.ux,u.uy); X register boolean oldedge = is_edge(u.ux0,u.uy0); X X /* ust is old position, tmpr is new position */ X if(oldedge && newedge && inroom(u.ux0,u.uy0) == inroom(u.ux,u.uy)) { X /* moving along wall */ X nose1(backx,backy); X prl1(frontx,fronty); X X } else if(oldedge || newedge) { X if(isok(backx,backy) && levl[backx][backy].lit) X setsee(); X else X nose1(backx,backy); X X if(isok(frontx,fronty) && levl[frontx][fronty].lit) X setsee(); X else { X prl1(frontx,fronty); X prl1(u.ux,u.uy); /* make sure side walls are seen */ X } X X } else if(!tmpr->lit) { X /* we haven't crossed an edge, so old & new are both light or X * both dark. if both light, we need do nothing. X */ X nose1(backx,backy); X prl1(frontx,fronty); X } X X } else { X pru(); X } X#ifdef WALKIES X check_leash(u.ux0,u.uy0); X#endif X if(u.ux0 != u.ux || u.uy0 != u.uy) u.umoved = TRUE; X spoteffects(); X} X X#endif /* OVL1 */ X#ifdef OVL2 X Xvoid Xspoteffects() X{ X register struct trap *trap; X X if(is_pool(u.ux,u.uy) && !(Levitation || Wwalking X#ifdef POLYSELF X || is_flyer(uasmon) X#endif X )) X drown(); /* not necessarily fatal */ X else { X (void) inshop(); X#ifdef SINKS X if(IS_SINK(levl[u.ux][u.uy].typ) && Levitation) X dosinkfall(); X#endif X if(!flags.nopick && X (OBJ_AT(u.ux, u.uy) || levl[u.ux][u.uy].gmask)) X pickup(1); X else read_engr_at(u.ux,u.uy); X if(trap = t_at(u.ux,u.uy)) X dotrap(trap); /* fall into pit, arrow trap, etc. */ X } X X} X X#endif /* OVL2 */ X#ifdef OVLB X Xint Xdopickup() { X /* uswallow case added by GAN 01/29/87 */ X if(u.uswallow) { X if (is_animal(u.ustuck->data)) { X You("pick up %s's tongue.", mon_nam(u.ustuck)); X pline("But it's kind of slimy, so you drop it."); X } else X You("don't %s anything in here to pick up.", X Blind ? "feel" : "see"); X return(1); X } X if(!OBJ_AT(u.ux, u.uy) && levl[u.ux][u.uy].gmask == 0) { X pline("There is nothing here to pick up."); X return(0); X } X if(Levitation) { X You("cannot reach the floor."); X return(1); X } X pickup(0); X return(1); X} X X#endif /* OVLB */ X#ifdef OVL2 X X/* stop running if we see something interesting */ X/* turn around a corner if that is the only way we can proceed */ X/* do not turn left or right twice */ Xvoid Xlookaround() { X register int x, y, i, x0, y0, m0, i0 = 9, corrct = 0, noturn = 0; X register struct monst *mtmp; X#if defined(LINT) || defined(__GNULINT__) X /* suppress "used before set" message */ X x0 = y0 = m0 = 0; X#endif X if(Blind || flags.run == 0) return; X for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++) { X if(!isok(x,y)) continue; X#ifdef POLYSELF X if(u.umonnum == PM_GRID_BUG && x != u.ux && y != u.uy) continue; X#endif X if(x == u.ux && y == u.uy) continue; X if((mtmp = m_at(x,y)) && !mtmp->mimic && X (!mtmp->minvis || See_invisible) && !mtmp->mundetected) { X if((flags.run != 1 && !mtmp->mtame) X || (x == u.ux+u.dx && y == u.uy+u.dy)) X goto stop; X } X if(levl[x][y].typ == STONE) continue; X if(x == u.ux-u.dx && y == u.uy-u.dy) continue; X { X register uchar sym = levl[x][y].scrsym; X X if (IS_ROCK(levl[x][y].typ) || X (sym == ROOM_SYM && !IS_DOOR(levl[x][y].typ))) X continue; X else if (sym == CLOSED_DOOR_SYM) { X if(x != u.ux && y != u.uy) continue; X if(flags.run != 1) goto stop; X goto bcorr; X } else if (sym == CORR_SYM) { X bcorr: X if(levl[u.ux][u.uy].typ != ROOM) { X if(flags.run == 1 || flags.run == 3) { X i = dist2(x,y,u.ux+u.dx,u.uy+u.dy); X if(i > 2) continue; X if(corrct == 1 && dist2(x,y,x0,y0) != 1) X noturn = 1; X if(i < i0) { X i0 = i; X x0 = x; X y0 = y; X m0 = mtmp ? 1 : 0; X } X } X corrct++; X } X continue; X } else if (sym == TRAP_SYM) { X if(flags.run == 1) goto bcorr; /* if you must */ X if(x == u.ux+u.dx && y == u.uy+u.dy) goto stop; X continue; X } else if (sym == POOL_SYM) { X /* pools only stop you if directly in front, and stop X * you even if you are running X */ X if(!Levitation && X#ifdef POLYSELF X !is_flyer(uasmon) && X#endif X /* No Wwalking check; otherwise they'd be able X * to test boots by trying to SHIFT-direction X * into a pool and seeing if the game allowed it X */ X x == u.ux+u.dx && y == u.uy+u.dy) goto stop; X continue; X } else { /* e.g. objects or trap or stairs */ X if(flags.run == 1) goto bcorr; X if(mtmp) continue; /* d */ X } X stop: X nomul(0); X return; X } X } X if(corrct > 1 && flags.run == 2) goto stop; X if((flags.run == 1 || flags.run == 3) && !noturn && !m0 && i0 && X (corrct == 1 || (corrct == 2 && i0 == 1))) { X /* make sure that we do not turn too far */ X if(i0 == 2) { X if(u.dx == y0-u.uy && u.dy == u.ux-x0) X i = 2; /* straight turn right */ X else X i = -2; /* straight turn left */ X } else if(u.dx && u.dy) { X if((u.dx == u.dy && y0 == u.uy) || X (u.dx != u.dy && y0 != u.uy)) X i = -1; /* half turn left */ X else X i = 1; /* half turn right */ X } else { X if((x0-u.ux == y0-u.uy && !u.dy) || X (x0-u.ux != y0-u.uy && u.dy)) X i = 1; /* half turn right */ X else X i = -1; /* half turn left */ X } X i += u.last_str_turn; X if(i <= 2 && i >= -2) { X u.last_str_turn = i; X u.dx = x0-u.ux, u.dy = y0-u.uy; X } X } X} X X/* something like lookaround, but we are not running */ X/* react only to monsters that might hit us */ Xint Xmonster_nearby() { X register int x,y; X register struct monst *mtmp; X X if(!Blind) X for(x = u.ux-1; x <= u.ux+1; x++) X for(y = u.uy-1; y <= u.uy+1; y++) { X if(!isok(x,y)) continue; X if(x == u.ux && y == u.uy) continue; X if((mtmp = m_at(x,y)) && !mtmp->mimic && X !mtmp->mtame && !mtmp->mpeaceful && X !noattacks(mtmp->data) && X mtmp->mcanmove && !mtmp->msleep && /* aplvax!jcn */ X (!mtmp->minvis || See_invisible) && X !onscary(u.ux, u.uy, mtmp)) X return(1); X } X return(0); X} X X#endif /* OVL2 */ X#ifdef OVL0 X Xint Xcansee(x,y) Xxchar x,y; X{ X if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0); X if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR && X !MON_AT(x, y) && !levl[u.ux][u.uy].lit) X return(0); X if(dist(x,y) < 3) return(1); X if(levl[x][y].lit && X ((seelx <= x && x <= seehx && seely <= y && y <= seehy) || X (seelx2 <= x && x <= seehx2 && seely2 <= y && y <= seehy2))) X return(1); X return(0); X} X X#endif /* OVL0 */ X#ifdef OVL1 X Xint Xsgn(a) X register int a; X{ X return((a > 0) ? 1 : (a == 0) ? 0 : -1); X} X X#endif /* OVL1 */ X#ifdef OVL2 X Xvoid Xgetcorners(lx1,hx1,ly1,hy1,lx2,hx2,ly2,hy2) Xxchar *lx1,*hx1,*ly1,*hy1,*lx2,*hx2,*ly2,*hy2; X/* return corners of one or two rooms player is in, so we can tell what areas X * can be seen, or otherwise affected by room-specific things. (two rooms are X * possible when in a doorway of the stronghold) X * the player is already known to be in at least one room X */ X{ X register int uroom1,uroom2; X register xchar ux,uy; X X uroom1 = inroom(u.ux,u.uy); X *lx1 = rooms[uroom1].lx - 1; X *hx1 = rooms[uroom1].hx + 1; X *ly1 = rooms[uroom1].ly - 1; X *hy1 = rooms[uroom1].hy + 1; X X if(!IS_DOOR(levl[u.ux][u.uy].typ)) { X *lx2 = 1; X *hx2 = 0; X *ly2 = 1; X *hy2 = 0; X } else { X for(ux = u.ux-1; ux <= u.ux+1; ux++) X for(uy = u.uy-1; uy <= u.uy+1; uy++) { X if(!isok(ux,uy)) continue; X if(IS_ROCK(levl[ux][uy].typ) || X IS_DOOR(levl[ux][uy].typ)) continue; X /* might have side-by-side walls, in which case X * should only be able to see one room */ X uroom2 = inroom(ux,uy); X if(uroom2 >= 0 && uroom2 != uroom1 && X rooms[uroom2].rlit) { X *lx2 = rooms[uroom2].lx - 1; X *ly2 = rooms[uroom2].ly - 1; X *hx2 = rooms[uroom2].hx + 1; X *hy2 = rooms[uroom2].hy + 1; X return; X } X } X *lx2 = 1; X *hx2 = 0; X *ly2 = 1; X *hy2 = 0; X } X} X X#endif /* OVL2 */ X#ifdef OVL1 X Xvoid Xsetsee() { X register int x, y; X X if(Blind) { X pru(); X return; X } X if(!levl[u.ux][u.uy].lit) { X seelx = u.ux-1; X seehx = u.ux+1; X seely = u.uy-1; X seehy = u.uy+1; X seelx2 = seely2 = 1; X seehx2 = seehy2 = 0; X } else { X getcorners(&seelx,&seehx,&seely,&seehy, X &seelx2,&seehx2,&seely2,&seehy2); X } X for(y = seely; y <= seehy; y++) X for(x = seelx; x <= seehx; x++) { X prl(x,y); X } X for(y = seely2; y <= seehy2; y++) X for(x = seelx2; x <= seehx2; x++) { X prl(x,y); X } X if(!levl[u.ux][u.uy].lit) seehx = 0; /* seems necessary elsewhere */ X else { X if(seely == u.uy) for(x = u.ux-1; x <= u.ux+1; x++) prl(x,seely-1); X if(seehy == u.uy) for(x = u.ux-1; x <= u.ux+1; x++) prl(x,seehy+1); X if(seelx == u.ux) for(y = u.uy-1; y <= u.uy+1; y++) prl(seelx-1,y); X if(seehx == u.ux) for(y = u.uy-1; y <= u.uy+1; y++) prl(seehx+1,y); X } X} X X#endif /* OVL1 */ X#ifdef OVL2 X Xvoid Xnomul(nval) X register int nval; X{ X if(multi < nval) return; /* This is a bug fix by ab@unido */ X multi = nval; X flags.mv = flags.run = 0; X} X X#endif /* OVL2 */ X#ifdef OVL1 X Xvoid Xlosehp(n, knam, k_format) Xregister int n; Xregister const char *knam; Xboolean k_format; X{ X#ifdef POLYSELF X if (u.mtimedone) { X u.mh -= n; X if (u.mhmax < u.mh) u.mhmax = u.mh; X flags.botl = 1; X if (u.mh < 1) rehumanize(); X return; X } X#endif X u.uhp -= n; X if(u.uhp > u.uhpmax) X u.uhpmax = u.uhp; /* perhaps n was negative */ X flags.botl = 1; X if(u.uhp < 1) { X killer_format = k_format; X killer = knam; /* the thing that killed you */ X You("die..."); X done(DIED); X } else if(u.uhp*10 < u.uhpmax && moves-wailmsg > 50 && n > 0){ X wailmsg = moves; X if(index("WEV", pl_character[0])) { X if (u.uhp == 1) X pline("%s is about to die.", pl_character); X else if (4 <= (!!(HTeleportation & INTRINSIC)) + X (!!(HSee_invisible & INTRINSIC)) + X (!!(HPoison_resistance & INTRINSIC)) + X (!!(HCold_resistance & INTRINSIC)) + X (!!(HShock_resistance & INTRINSIC)) + X (!!(HFire_resistance & INTRINSIC)) + X (!!(HSleep_resistance & INTRINSIC)) + X (!!(HDisint_resistance & INTRINSIC)) + X (!!(HTeleport_control & INTRINSIC)) + X (!!(Stealth & INTRINSIC)) + X (!!(Fast & INTRINSIC)) + X (!!(HInvis & INTRINSIC))) X pline("%s, all your powers will be lost...", X pl_character); X else X pline("%s, your life force is running out.", X pl_character); X } else { X if(u.uhp == 1) X You("hear the wailing of the Banshee..."); X else X You("hear the howling of the CwnAnnwn..."); X } X } X} X Xint Xweight_cap() { X register int carrcap; X X#ifdef HARD X carrcap = 5 * (((ACURR(A_STR) > 18) ? 20 : ACURR(A_STR)) + u.ulevel); X#else X carrcap = 5 * u.ulevel; /* New strength stewr 870807 */ X if (ACURR(A_STR) < 19) carrcap += 5 * ACURR(A_STR); X if (ACURR(A_STR) > 18) carrcap += ACURR(A_STR) - 18 + 90; X if (ACURR(A_STR) > 68) carrcap += ACURR(A_STR) - 68; X if (ACURR(A_STR) > 93) carrcap += ACURR(A_STR) - 93; X if (ACURR(A_STR) > 108) carrcap += 2 * (ACURR(A_STR) - 108); X if (ACURR(A_STR) > 113) carrcap += 5 * (ACURR(A_STR) - 113); X if (ACURR(A_STR) == 118) carrcap += 100; X#endif X#ifdef POLYSELF X if (u.mtimedone) { X /* consistent with can_carry() in mon.c */ X if (u.usym==S_NYMPH) carrcap = MAX_CARR_CAP; X else if (!uasmon->cwt) X carrcap = (carrcap * uasmon->mlevel * 6)/45; X else if (!strongmonst(uasmon) X || (strongmonst(uasmon) && (uasmon->cwt > 45))) X carrcap = (carrcap * uasmon->cwt / 45); X } X#endif X if(Levitation) /* pugh@cornell */ X carrcap = MAX_CARR_CAP; X else { X if(carrcap > MAX_CARR_CAP) carrcap = MAX_CARR_CAP; X if(Wounded_legs & LEFT_SIDE) carrcap -= 10; X if(Wounded_legs & RIGHT_SIDE) carrcap -= 10; X } X return(carrcap); X} X Xint Xinv_weight() { X register struct obj *otmp = invent; X#ifdef LINT /* long to int conversion */ X register int wt = 0; X#else X register int wt = (int)((u.ugold + 500L)/1000L); X#endif /* LINT */ X while(otmp){ X#ifdef POLYSELF X if (otmp->otyp != BOULDER || !throws_rocks(uasmon)) X#endif X wt += otmp->owt; X otmp = otmp->nobj; X } X return(wt - weight_cap()); X} X X#endif /* OVL1 */ X#ifdef OVLB X Xint Xinv_cnt() { X register struct obj *otmp = invent; X register int ct = 0; X X while(otmp){ X ct++; X otmp = otmp->nobj; X } X return(ct); X} X Xint Xidentify(otmp) /* also called by newmail() */ X register struct obj *otmp; X{ X makeknown(otmp->otyp); X otmp->known = otmp->dknown = otmp->bknown = 1; X prinv(otmp); X return(1); X} X X#ifdef STUPID_CPP /* otherwise these functions are macros in hack.h */ Xchar Xyn() { X return(yn_function(ynchars, 'n')); X} X Xchar Xynq() { X return(yn_function(ynqchars, 'q')); X} X Xchar Xynaq() { X return(yn_function(ynaqchars, 'y')); X} X Xchar Xnyaq() { X return(yn_function(nyaqchars, 'n')); X} X Xint Xmax(a,b) int a,b; { X return((a > b) ? a : b); X} X Xint Xmin(a,b) int a,b; { X return((a < b) ? a : b); X} X Xchar * Xplur(x) long x; { X return((x == 1L) ? "" : "s"); X} X Xvoid Xmakeknown(x) unsigned x; { X objects[x].oc_name_known = 1; X} X#endif /* STUPID_CPP */ X X#endif /* OVLB */ END_OF_FILE if test 28166 -ne `wc -c <'src/hack.c'`; then echo shar: \"'src/hack.c'\" unpacked with wrong size! fi # end of 'src/hack.c' fi if test -f 'src/wield.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/wield.c'\" else echo shar: Extracting \"'src/wield.c'\" \(6236 characters\) sed "s/^X//" >'src/wield.c' <<'END_OF_FILE' X/* SCCS Id: @(#)wield.c 3.0 87/05/10 X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X/* NetHack may be freely redistributed. See license for details. */ X X#include "hack.h" X X/* Note: setuwep() with a null obj, and uwepgone(), are NOT the same! Sometimes X * unwielding a weapon can kill you, and lifesaving will then put it back into X * your hand. If lifesaving is permitted to do this, use X * setwuep((struct obj *)0); otherwise use uwepgone(). X * (The second function should probably be #ifdef NAMED_ITEMS since only then X * may unwielding a weapon kill you, but...) X */ Xvoid Xsetuwep(obj) Xregister struct obj *obj; X{ X setworn(obj, W_WEP); X if (!obj) unweapon = TRUE; /* for "bare hands" message */ X} X Xvoid Xuwepgone() X{ X if (uwep) { X setnotworn(uwep); X unweapon = TRUE; X } X} X Xstatic const char NEARDATA wield_objs[] = { '#', '-', WEAPON_SYM, TOOL_SYM, 0 }; X Xint Xdowield() X{ X register struct obj *wep; X register int res = 0; X X multi = 0; X#ifdef POLYSELF X if (cantwield(uasmon)) { X pline("Don't be ridiculous!"); X return(0); X } X#endif X if(!(wep = getobj(wield_objs, "wield"))) /* nothing */; X else if(uwep == wep) X You("are already wielding that!"); X else if(welded(uwep)) X weldmsg(uwep, TRUE); X else if(wep == &zeroobj) { X if(uwep == 0) X You("are already empty %s.", body_part(HANDED)); X else { X You("are empty %s.", body_part(HANDED)); X setuwep((struct obj *) 0); X res++; X } X } else if(!uarmg && X#ifdef POLYSELF X !resists_ston(uasmon) && X#endif X (wep->otyp == CORPSE && wep->corpsenm == PM_COCKATRICE)) { X /* Prevent wielding cockatrice when not wearing gloves --KAA */ X You("wield the cockatrice corpse in your bare %s.", X makeplural(body_part(HAND))); X You("turn to stone..."); X killer_format = KILLED_BY; X killer="touching a cockatrice corpse"; X done(STONING); X } else if(uarms && bimanual(wep)) X You("cannot wield a two-handed %s and hold a shield.", X is_sword(wep) ? "sword" : "weapon"); X else if(wep->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) X You("cannot wield that!"); X else { X res++; X if(wep->cursed && (wep->olet == WEAPON_SYM || X wep->otyp == HEAVY_IRON_BALL || wep->otyp == PICK_AXE || X wep->otyp == UNICORN_HORN || X wep->otyp == TIN_OPENER)) { X pline("The %s %s to your %s!", X aobjnam(wep, "weld"), X (wep->quan == 1) ? "itself" : "themselves", /* a3 */ X body_part(HAND)); X wep->bknown = 1; X } else { X /* The message must be printed before setuwep (since X * you might die and be revived from changing weapons), X * and the message must be before the death message and X * Lifesaved rewielding. Yet we want the message to say X * "weapon in hand", thus this kludge. X */ X long dummy = wep->owornmask; X wep->owornmask |= W_WEP; X prinv(wep); X wep->owornmask = dummy; X } X setuwep(wep); X } X /* Note: Explicitly wielding a pick-axe will not give a "bashing" X * message. Wielding one via 'a'pplying it will. X */ X if(res && uwep) X unweapon = ((uwep->otyp >= BOW || uwep->otyp <= BOOMERANG) && X uwep->otyp != PICK_AXE && uwep->otyp != UNICORN_HORN); X return(res); X} X Xvoid Xcorrode_weapon(){ X if(!uwep || uwep->olet != WEAPON_SYM) return; /* %% */ X if(uwep->rustfree || objects[uwep->otyp].oc_material != METAL) X Your("%s not affected.", aobjnam(uwep, "are")); X else if (uwep->spe > -6) { X Your("%s!", aobjnam(uwep, "corrode")); X uwep->spe--; X } else Your("%s quite rusted now.", aobjnam(uwep, Blind ? "feel" : "look")); X} X Xint Xchwepon(otmp, amount) Xregister struct obj *otmp; Xregister int amount; X{ X register const char *color = Hallucination ? hcolor() : X (amount < 0) ? black : blue; X register const char *xtime; X X if(!uwep || (uwep->olet != WEAPON_SYM && uwep->otyp != PICK_AXE X && uwep->otyp != UNICORN_HORN)) { X char buf[36]; X X Sprintf(buf, "Your %s %s.", makeplural(body_part(HAND)), X (amount > 0) ? "twitch" : "itch"); X strange_feeling(otmp, buf); X return(0); X } X X#ifdef WORM X if(uwep->otyp == WORM_TOOTH && amount > 0) { X uwep->otyp = CRYSKNIFE; X Your("weapon seems sharper now."); X uwep->cursed = 0; X return(1); X } X X if(uwep->otyp == CRYSKNIFE && amount < 0) { X uwep->otyp = WORM_TOOTH; X Your("weapon seems duller now."); X return(1); X } X#endif X#ifdef NAMED_ITEMS X if(is_artifact(uwep) && restr_name(uwep, ONAME(uwep)) && X amount<0) { X if (!Blind) X Your("%s faintly %s.", aobjnam(uwep, "glow"), color); X return(1); X } X#endif X /* there is a (soft) upper and lower limit to uwep->spe */ X if(((uwep->spe > 5 && amount > 0) || (uwep->spe < -5 && amount < 0)) X && rn2(3)) { X if (!Blind) X Your("%s violently %s for a while and then evaporate%s.", X aobjnam(uwep,"glow"), color, uwep->quan == 1 ? "s" : ""); X else X Your("%s.", aobjnam(uwep, "evaporate")); X X while(uwep) /* let all of them disappear */ X /* note: uwep->quan = 1 is nogood if unpaid */ X useup(uwep); X return(1); X } X if (!Blind) { X xtime = (amount*amount == 1) ? "moment" : "while"; X Your("%s %s for a %s.", X aobjnam(uwep, "glow"), color, xtime); X } X uwep->spe += amount; X if(amount > 0) uwep->cursed = 0; X return(1); X} X Xint Xwelded(obj) Xregister struct obj *obj; X{ X if (obj && obj == uwep && obj->cursed && X (obj->olet == WEAPON_SYM || obj->otyp == HEAVY_IRON_BALL || X obj->otyp == TIN_OPENER || obj->otyp == PICK_AXE || X obj->otyp == UNICORN_HORN)) X { X obj->bknown = 1; X return 1; X } X return 0; X} X X/* The reason for "specific" is historical; some parts of the code used X * the object name and others just used "weapon"/"sword". This function X * replaced all of those. Which one we use is really arbitrary. X */ Xvoid Xweldmsg(obj, specific) Xregister struct obj *obj; Xboolean specific; X{ X char buf[BUFSZ]; X X if (specific) { X long savewornmask = obj->owornmask; X obj->owornmask &= ~W_WEP; X Strcpy(buf, Doname2(obj)); X obj->owornmask = savewornmask; X } else X Sprintf(buf, "Your %s%s", X is_sword(obj) ? "sword" : "weapon", X plur((long)obj->quan)); X Strcat(buf, (obj->quan==1) ? " is" : " are"); X#ifdef POLYSELF X Sprintf(eos(buf), " welded to your %s!", X bimanual(obj) ? makeplural(body_part(HAND)) : body_part(HAND)); X#else X Sprintf(eos(buf), " welded to your hand%s!", X bimanual(obj) ? "s" : ""); X#endif X pline(buf); X} END_OF_FILE if test 6236 -ne `wc -c <'src/wield.c'`; then echo shar: \"'src/wield.c'\" unpacked with wrong size! fi # end of 'src/wield.c' fi echo shar: End of archive 35 \(of 56\). cp /dev/null ark35isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 56 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