diff --git a/Files b/Files index 261e8e799..a0df2af6e 100644 --- a/Files +++ b/Files @@ -7,461 +7,464 @@ from or not transferred to your system if you wish. .: (files in top directory) -.clang-format Files Porting README +.clang-format Files Porting README DEVEL: (files for people developing changes to NetHack) -Developer.txt code_features.txt code_style.txt git_recipes.txt -gitinfo.pl nhgitset.pl +Developer.txt code_features.txt code_style.txt git_recipes.txt +gitinfo.pl nhgitset.pl DEVEL/DOTGIT: (file for people developing changes to NetHack) -TARGET +TARGET DEVEL/hooksdir: (files for people developing changes to NetHack) -NHadd NHgithook.pm NHsubst -NHtext TARGET applypatch-msg -commit-msg nhsub post-applypatch -post-checkout post-commit post-merge -post-rewrite pre-applypatch pre-auto-gc -pre-commit pre-push pre-rebase -prepare-commit-msg +NHadd NHgithook.pm NHsubst +NHtext TARGET applypatch-msg +commit-msg nhsub post-applypatch +post-checkout post-commit post-merge +post-rewrite pre-applypatch pre-auto-gc +pre-commit pre-push pre-rebase +prepare-commit-msg dat: (files for all versions) -Arch.des Barb.des Caveman.des Healer.des Knight.des -Monk.des Priest.des Ranger.des Rogue.des Samurai.des -Tourist.des Valkyrie.des Wizard.des bigroom.des bogusmon.txt -castle.des cmdhelp data.base dungeon.def endgame.des -engrave.txt epitaph.txt gehennom.des help hh -history keyhelp knox.des license medusa.des -mines.des opthelp oracle.des oracles.txt quest.txt -rumors.fal rumors.tru sokoban.des symbols tower.des -tribute wizhelp yendor.des +Arch.des Barb.des Caveman.des Healer.des Knight.des +Monk.des Priest.des Ranger.des Rogue.des Samurai.des +Tourist.des Valkyrie.des Wizard.des bigroom.des bogusmon.txt +castle.des cmdhelp data.base dungeon.def endgame.des +engrave.txt epitaph.txt gehennom.des help hh +history keyhelp knox.des license medusa.des +mines.des opthelp oracle.des oracles.txt quest.txt +rumors.fal rumors.tru sokoban.des symbols tower.des +tribute wizhelp yendor.des doc: (files for all versions) -Guidebook.mn Guidebook.tex Guidebook.txt config.nh dgn_comp.6 -dgn_comp.txt dlb.6 dlb.txt fixes10.0 fixes14.f -fixes22.0 fixes23.e fixes30.0 fixes30.pl01 fixes30.pl02 -fixes30.pl03 fixes30.pl04 fixes30.pl05 fixes30.pl06 fixes30.pl07 -fixes30.pl08 fixes30.pl09 fixes30.pl10 fixes31.1 fixes31.2 -fixes31.3 fixes32.0 fixes32.1 fixes32.2 fixes32.3 -fixes33.0 fixes33.1 fixes34.0 fixes34.1 fixes34.2 -fixes34.3 fixes35.0 fixes36.0 fixes36.1 fixes36.2 -lev_comp.6 lev_comp.txt makedefs.6 makedefs.txt nethack.6 -nethack.txt recover.6 recover.txt tmac.n window.doc +Guidebook.mn Guidebook.tex Guidebook.txt config.nh dgn_comp.6 +dgn_comp.txt dlb.6 dlb.txt fixes10.0 fixes14.f +fixes22.0 fixes23.e fixes30.0 fixes30.pl01 fixes30.pl02 +fixes30.pl03 fixes30.pl04 fixes30.pl05 fixes30.pl06 fixes30.pl07 +fixes30.pl08 fixes30.pl09 fixes30.pl10 fixes31.1 fixes31.2 +fixes31.3 fixes32.0 fixes32.1 fixes32.2 fixes32.3 +fixes33.0 fixes33.1 fixes34.0 fixes34.1 fixes34.2 +fixes34.3 fixes35.0 fixes36.0 fixes36.1 fixes36.2 +lev_comp.6 lev_comp.txt makedefs.6 makedefs.txt nethack.6 +nethack.txt recover.6 recover.txt tmac.n window.doc include: (files for GEM versions) -bitmfile.h gem_rsc.h load_img.h wingem.h +bitmfile.h gem_rsc.h load_img.h wingem.h (file for GNOME versions) -winGnome.h +winGnome.h (files for Qt versions) -qt_clust.h qt_kde0.h qt_win.h qt_xpms.h qttableview.h +qt_clust.h qt_kde0.h qt_win.h qt_xpms.h qttableview.h (files for X versions) -tile2x11.h winX.h xwindow.h xwindowp.h +tile2x11.h winX.h xwindow.h xwindowp.h (files for all versions) -align.h amiconf.h artifact.h artilist.h attrib.h -beconf.h botl.h color.h config.h config1.h -context.h coord.h decl.h def_os2.h dgn_file.h -display.h dlb.h dungeon.h engrave.h extern.h -flag.h func_tab.h global.h hack.h integer.h -lev.h lint.h mail.h mextra.h mfndpos.h -micro.h mkroom.h monattk.h mondata.h monflag.h -monst.h monsym.h ntconf.h obj.h objclass.h -os2conf.h patchlevel.h pcconf.h permonst.h prop.h -qtext.h quest.h rect.h region.h rm.h -skills.h sp_lev.h spell.h sys.h system.h -tcap.h tileset.h timeout.h tosconf.h tradstdc.h -trampoli.h trap.h unixconf.h vision.h vmsconf.h -wceconf.h winami.h winprocs.h wintype.h you.h -youprop.h +align.h amiconf.h artifact.h artilist.h attrib.h +beconf.h botl.h color.h config.h config1.h +context.h coord.h decl.h def_os2.h dgn_file.h +display.h dlb.h dungeon.h engrave.h extern.h +flag.h func_tab.h global.h hack.h integer.h +lev.h lint.h mail.h mextra.h mfndpos.h +micro.h mkroom.h monattk.h mondata.h monflag.h +monst.h monsym.h ntconf.h obj.h objclass.h +os2conf.h patchlevel.h pcconf.h permonst.h prop.h +qtext.h quest.h rect.h region.h rm.h +skills.h sp_lev.h spell.h sys.h system.h +tcap.h tileset.h timeout.h tosconf.h tradstdc.h +trampoli.h trap.h unixconf.h vision.h vmsconf.h +wceconf.h winami.h winprocs.h wintype.h you.h +youprop.h (file for tty versions) -wintty.h +wintty.h (files for various Macintosh versions) -mac-carbon.h mac-qt.h mac-term.h macconf.h macpopup.h -mactty.h macwin.h mttypriv.h +mac-carbon.h mac-qt.h mac-term.h macconf.h macpopup.h +mactty.h macwin.h mttypriv.h src: (files for all versions) -allmain.c alloc.c apply.c artifact.c attrib.c ball.c -bones.c botl.c cmd.c dbridge.c decl.c detect.c -dig.c display.c dlb.c do.c do_name.c do_wear.c -dog.c dogmove.c dokick.c dothrow.c drawing.c dungeon.c -eat.c end.c engrave.c exper.c explode.c extralev.c -files.c fountain.c hack.c hacklib.c invent.c light.c -lock.c mail.c makemon.c mapglyph.c mcastu.c mhitm.c -mhitu.c minion.c mklev.c mkmap.c mkmaze.c mkobj.c -mkroom.c mon.c mondata.c monmove.c monst.c mplayer.c -mthrowu.c muse.c music.c o_init.c objects.c objnam.c -options.c pager.c pickup.c pline.c polyself.c potion.c -pray.c priest.c quest.c questpgr.c read.c rect.c -region.c restore.c rip.c rnd.c role.c rumors.c -save.c shk.c shknam.c sit.c sounds.c sp_lev.c -spell.c steal.c steed.c sys.c teleport.c timeout.c -topten.c track.c trap.c u_init.c uhitm.c vault.c -version.c vision.c weapon.c were.c wield.c windows.c -wizard.c worm.c worn.c write.c zap.c +allmain.c alloc.c apply.c artifact.c attrib.c ball.c +bones.c botl.c cmd.c dbridge.c decl.c detect.c +dig.c display.c dlb.c do.c do_name.c do_wear.c +dog.c dogmove.c dokick.c dothrow.c drawing.c dungeon.c +eat.c end.c engrave.c exper.c explode.c extralev.c +files.c fountain.c hack.c hacklib.c invent.c light.c +lock.c mail.c makemon.c mapglyph.c mcastu.c mhitm.c +mhitu.c minion.c mklev.c mkmap.c mkmaze.c mkobj.c +mkroom.c mon.c mondata.c monmove.c monst.c mplayer.c +mthrowu.c muse.c music.c o_init.c objects.c objnam.c +options.c pager.c pickup.c pline.c polyself.c potion.c +pray.c priest.c quest.c questpgr.c read.c rect.c +region.c restore.c rip.c rnd.c role.c rumors.c +save.c shk.c shknam.c sit.c sounds.c sp_lev.c +spell.c steal.c steed.c sys.c teleport.c timeout.c +topten.c track.c trap.c u_init.c uhitm.c vault.c +version.c vision.c weapon.c were.c wield.c windows.c +wizard.c worm.c worn.c write.c zap.c sys/amiga: (files for Amiga versions - untested for 3.6.2) -Build.ami Install.ami Makefile.agc Makefile.ami NetHack.cnf -amidos.c amidos.p amifont.uu amifont8.uu amigst.c -amii.hlp amimenu.c amirip.c amisnd.c amistack.c -amitty.c amiwind.c amiwind.p clipwin.c colorwin.c -cvtsnd.c grave16.xpm ifchange mkdmake txt2iff.c -winami.c winami.p winchar.c windefs.h winext.h -winfuncs.c winkey.c winmenu.c winproto.h winreq.c -winstr.c xpm2iff.c +Build.ami Install.ami Makefile.agc Makefile.ami NetHack.cnf +amidos.c amidos.p amifont.uu amifont8.uu amigst.c +amii.hlp amimenu.c amirip.c amisnd.c amistack.c +amitty.c amiwind.c amiwind.p clipwin.c colorwin.c +cvtsnd.c grave16.xpm ifchange mkdmake txt2iff.c +winami.c winami.p winchar.c windefs.h winext.h +winfuncs.c winkey.c winmenu.c winproto.h winreq.c +winstr.c xpm2iff.c sys/atari: (files for Atari version - untested for 3.6.2) -Install.tos atarifnt.uue nethack.mnu setup.g tos.c -unx2atar.sed +Install.tos atarifnt.uue nethack.mnu setup.g tos.c +unx2atar.sed sys/be: (files for BeOS version - untested for 3.6.2) -README bemain.c +README bemain.c sys/mac: (files for 68K Macintosh versions) -Files.r Install.mw MacHelp NHDeflts NHrsrc.hqx -NHsound.hqx News README carbon.plist dprintf.c -maccurs.c macerrs.c macfile.c machelp.hqx macmain.c -macmenu.c macsnd.c mactopl.c mactty.c macunix.c -macwin.c mgetline.c mmodal.c mrecover.c mrecover.hqx -mttymain.c +Files.r Install.mw MacHelp NHDeflts NHrsrc.hqx +NHsound.hqx News README carbon.plist dprintf.c +maccurs.c macerrs.c macfile.c machelp.hqx macmain.c +macmenu.c macsnd.c mactopl.c mactty.c macunix.c +macwin.c mgetline.c mmodal.c mrecover.c mrecover.hqx +mttymain.c sys/msdos: (files for MSDOS version - untested for 3.6.2) -Install.dos Makefile.BC Makefile.GCC Makefile.MSC SCHEMA35.MSC -moveinit.pat msdos.c msdoshlp.txt ovlinit.c pckeys.c -pctiles.c pctiles.h pcvideo.h portio.h schema1.BC -schema2.BC schema3.MSC setup.bat sound.c tile2bin.c -vesa.h video.c vidtxt.c vidvesa.c vidvga.c +Install.dos Makefile.BC Makefile.GCC Makefile.MSC SCHEMA35.MSC +moveinit.pat msdos.c msdoshlp.txt ovlinit.c pckeys.c +pctiles.c pctiles.h pcvideo.h portio.h schema1.BC +schema2.BC schema3.MSC setup.bat sound.c tile2bin.c +vesa.h video.c vidtxt.c vidvesa.c vidvga.c (files for running MSDOS binary under Windows) -nhico.uu nhpif.uu +nhico.uu nhpif.uu sys/os2: (files for OS/2 version - untested for 3.6.2) -Install.os2 Makefile.os2 nhpmico.uu os2.c +Install.os2 Makefile.os2 nhpmico.uu os2.c sys/share: (Berkeley random number file, which may be included in any version) -random.c +random.c (Berkeley uudecode file, which may be used in build process of any version) -uudecode.c +uudecode.c (file for MSDOS, OS/2, NT, Amiga, and Atari versions - untested for 3.6.2) -pcmain.c +pcmain.c (file for MSDOS, OS/2, and Atari versions - untested for 3.6.2) -NetHack.cnf pctty.c +NetHack.cnf pctty.c (file for MSDOS, OS/2, and VMS versions) -termcap +termcap (file for NT version) -nhlan.c +nhlan.c (file for VMS version) -tclib.c +tclib.c (files for MSDOS and OS/2 versions - untested for 3.6.2) -Makefile.lib termcap.uu +Makefile.lib termcap.uu (files for MSDOS, OS/2, NT, and Atari versions - untested for 3.6.2) -pcsys.c pcunix.c +pcsys.c pcunix.c (files for UNIX and Be versions) -ioctl.c unixtty.c +ioctl.c unixtty.c (lex/yacc output for special level and dungeon compilers) -dgn_comp.h dgn_lex.c dgn_yacc.c lev_comp.h lev_lex.c lev_yacc.c +dgn_comp.h dgn_lex.c dgn_yacc.c lev_comp.h lev_lex.c lev_yacc.c (posix regex for versions that include regex in their C library) -posixregex.c +posixregex.c (c++ regex code for versions that can build a C++ module and link it in) -cppregex.cpp +cppregex.cpp (pmatch regex for other versions) -pmatchregex.c +pmatchregex.c sys/share/sounds: (files for Amiga and Macintosh versions) -README bell.uu bugle.uu erthdrum.uu firehorn.uu frsthorn.uu -lethdrum.uu mgcflute.uu mgcharp.uu toolhorn.uu wdnflute.uu wdnharp.uu +README bell.uu bugle.uu erthdrum.uu firehorn.uu frsthorn.uu +lethdrum.uu mgcflute.uu mgcharp.uu toolhorn.uu wdnflute.uu wdnharp.uu sys/unix: (files for UNIX versions) -Install.unx Makefile.dat Makefile.doc Makefile.src -Makefile.top Makefile.utl NewInstall.unx README.linux -depend.awk gitinfo.sh mkmkfile.sh nethack.sh -setup.sh sysconf unixmain.c unixres.c -unixunix.c +Install.unx Makefile.dat Makefile.doc Makefile.src +Makefile.top Makefile.utl NewInstall.unx README.linux +depend.awk gitinfo.sh mkmkfile.sh nethack.sh +setup.sh sysconf unixmain.c unixres.c +unixunix.c (files for replacement cpp, only needed by some ancient UNIX systems) -cpp1.shr cpp2.shr cpp3.shr +cpp1.shr cpp2.shr cpp3.shr (file for sound driver for 386 UNIX) -snd86unx.shr +snd86unx.shr sys/unix/hints: (files for configuring UNIX NetHack versions) -linux linux-chroot linux-qt4 linux-qt5 -linux-x11 macosx macosx.sh macosx10.5 -macosx10.7 macosx10.8 macosx10.10 macosx10.10-qt -unix +linux linux-chroot linux-qt4 linux-qt5 +linux-x11 macosx macosx.sh macosx10.5 +macosx10.7 macosx10.8 macosx10.10 macosx10.10-qt +unix sys/vms: (files for VMS version) -Install.vms Makefile.dat Makefile.doc Makefile.src Makefile.top -Makefile.utl install.com lev_lex.h nethack.com oldcrtl.c -spec_lev.com sysconf vmsbuild.com vmsfiles.c vmsmail.c -vmsmain.c vmsmisc.c vmstty.c vmsunix.c +Install.vms Makefile.dat Makefile.doc Makefile.src Makefile.top +Makefile.utl install.com lev_lex.h nethack.com oldcrtl.c +spec_lev.com sysconf vmsbuild.com vmsfiles.c vmsmail.c +vmsmain.c vmsmisc.c vmstty.c vmsunix.c sys/wince: (files for Windows CE and PocketPC - untested for 3.6.2) -Install.ce bootstrp.mak celib.c cesetup.bat cesound.c -defaults.nh keypad.uu menubar.uu mhaskyn.c mhaskyn.h -mhcmd.c mhcmd.h mhcolor.c mhcolor.h mhdlg.c -mhdlg.h mhfont.c mhfont.h mhinput.c mhinput.h -mhmain.c mhmain.h mhmap.c mhmap.h mhmenu.c -mhmenu.h mhmsg.h mhmsgwnd.c mhmsgwnd.h mhrip.c -mhrip.h mhstatus.c mhstatus.h mhtext.c mhtext.h -mhtxtbuf.c mhtxtbuf.h mswproc.c newres.h nhico.uu -resource.h winMS.h winhack.c winhack.rc winhcksp.rc -winmain.c +Install.ce bootstrp.mak celib.c cesetup.bat cesound.c +defaults.nh keypad.uu menubar.uu mhaskyn.c mhaskyn.h +mhcmd.c mhcmd.h mhcolor.c mhcolor.h mhdlg.c +mhdlg.h mhfont.c mhfont.h mhinput.c mhinput.h +mhmain.c mhmain.h mhmap.c mhmap.h mhmenu.c +mhmenu.h mhmsg.h mhmsgwnd.c mhmsgwnd.h mhrip.c +mhrip.h mhstatus.c mhstatus.h mhtext.c mhtext.h +mhtxtbuf.c mhtxtbuf.h mswproc.c newres.h nhico.uu +resource.h winMS.h winhack.c winhack.rc winhcksp.rc +winmain.c sys/wince/ceinc: (header files for Windows CE and PocketPC - untested for 3.6.2) -assert.h errno.h fcntl.h +assert.h errno.h fcntl.h sys/wince/ceinc/sys: (sys/stat.h for Windows CE and PocketPC - untested for 3.6.2) -stat.h +stat.h sys/winnt: (files for Windows 7/8.x/10 version) -Install.nt Makefile.gcc Makefile.msc console.rc defaults.nh -nethack.def nh340key.c nhdefkey.c nhico.uu nhraykey.c -nhsetup.bat ntsound.c nttty.c porthelp stubs.c -sysconf win32api.h winnt.c +Install.nt Makefile.gcc Makefile.msc console.rc defaults.nh +nethack.def nh340key.c nhdefkey.c nhico.uu nhraykey.c +nhsetup.bat ntsound.c nttty.c porthelp stubs.c +sysconf win32api.h winnt.c util: (files for all versions) -dgn_main.c dlb_main.c lev_main.c makedefs.c mdgrep.h mdgrep.pl -panic.c recover.c +dgn_main.c dlb_main.c lev_main.c makedefs.c mdgrep.h mdgrep.pl +panic.c recover.c (lex/yacc input for special level and dungeon compilers) -dgn_comp.l dgn_comp.y lev_comp.l lev_comp.y +dgn_comp.l dgn_comp.y lev_comp.l lev_comp.y win/Qt: (files for the Qt 3 widget library - X11, Windows, Mac OS X, or Qtopia) -Info.plist Install.Qt knethack.lnk -knh-mini.xpm knh.xpm nhicns.uu -nhsplash.xpm qpe-nethack.control qt_clust.cpp -qt_win.cpp qttableview.cpp tileedit.cpp -tileedit.h +Info.plist Install.Qt knethack.lnk +knh-mini.xpm knh.xpm nhicns.uu +nhsplash.xpm qpe-nethack.control qt_clust.cpp +qt_win.cpp qttableview.cpp tileedit.cpp +tileedit.h win/Qt4: (files for the Qt 4 widget library - X11, Windows, Mac OS X) -qt4bind.cpp qt4bind.h qt4click.cpp qt4click.h qt4clust.cpp -qt4clust.h qt4delay.cpp qt4delay.h qt4glyph.cpp qt4glyph.h -qt4icon.cpp qt4icon.h qt4inv.cpp qt4inv.h qt4kde0.h -qt4key.cpp qt4key.h qt4line.cpp qt4line.h qt4main.cpp -qt4main.h qt4map.cpp qt4map.h qt4menu.cpp qt4menu.h -qt4msg.cpp qt4msg.h qt4plsel.cpp qt4plsel.h qt4rip.cpp -qt4rip.h qt4set.cpp qt4set.h qt4stat.cpp qt4stat.h -qt4str.cpp qt4str.h qt4streq.cpp qt4streq.h qt4svsel.cpp -qt4svsel.h qt4win.cpp qt4win.h qt4xcmd.cpp qt4xcmd.h -qt4yndlg.cpp qt4yndlg.h +qt4bind.cpp qt4bind.h qt4click.cpp qt4click.h qt4clust.cpp +qt4clust.h qt4delay.cpp qt4delay.h qt4glyph.cpp qt4glyph.h +qt4icon.cpp qt4icon.h qt4inv.cpp qt4inv.h qt4kde0.h +qt4key.cpp qt4key.h qt4line.cpp qt4line.h qt4main.cpp +qt4main.h qt4map.cpp qt4map.h qt4menu.cpp qt4menu.h +qt4msg.cpp qt4msg.h qt4plsel.cpp qt4plsel.h qt4rip.cpp +qt4rip.h qt4set.cpp qt4set.h qt4stat.cpp qt4stat.h +qt4str.cpp qt4str.h qt4streq.cpp qt4streq.h qt4svsel.cpp +qt4svsel.h qt4win.cpp qt4win.h qt4xcmd.cpp qt4xcmd.h +qt4yndlg.cpp qt4yndlg.h win/X11: (files for X versions) -Install.X11 NetHack.ad Window.c dialogs.c ibm.bdf -nethack.rc nh10.bdf nh32icon nh56icon nh72icon -nh_icon.xpm pet_mark.xbm pilemark.xbm rip.xpm tile2x11.c -winX.c winmap.c winmenu.c winmesg.c winmisc.c -winstat.c wintext.c winval.c +Install.X11 NetHack.ad Window.c dialogs.c ibm.bdf +nethack.rc nh10.bdf nh32icon nh56icon nh72icon +nh_icon.xpm pet_mark.xbm pilemark.xbm rip.xpm tile2x11.c +winX.c winmap.c winmenu.c winmesg.c winmisc.c +winstat.c wintext.c winval.c win/chain: (files for stacking window systems) -wc_chainin.c wc_chainout.c wc_trace.c +wc_chainin.c wc_chainout.c wc_trace.c win/gem: (files for GEM versions - untested for 3.6.2) -Install.gem bitmfile.c gem_rsc.uu gem_rso.uu gr_rect.c gr_rect.h -load_img.c tile2img.c title.uu wingem.c wingem1.c xpm2img.c +Install.gem bitmfile.c gem_rsc.uu gem_rso.uu gr_rect.c gr_rect.h +load_img.c tile2img.c title.uu wingem.c wingem1.c xpm2img.c win/gnome: (files for GNOME versions - untested for 3.6.2) -README gn_xpms.h gnaskstr.c gnaskstr.h gnbind.c gnbind.h -gnglyph.c gnglyph.h gnmain.c gnmain.h gnmap.c gnmap.h -gnmenu.c gnmenu.h gnmesg.c gnmesg.h gnomeprv.h gnopts.c -gnopts.h gnplayer.c gnplayer.h gnsignal.c gnsignal.h gnstatus.c -gnstatus.h gntext.c gntext.h gnworn.c gnworn.h gnyesno.c -gnyesno.h mapbg.xpm +README gn_xpms.h gnaskstr.c gnaskstr.h gnbind.c gnbind.h +gnglyph.c gnglyph.h gnmain.c gnmain.h gnmap.c gnmap.h +gnmenu.c gnmenu.h gnmesg.c gnmesg.h gnomeprv.h gnopts.c +gnopts.h gnplayer.c gnplayer.h gnsignal.c gnsignal.h gnstatus.c +gnstatus.h gntext.c gntext.h gnworn.c gnworn.h gnyesno.c +gnyesno.h mapbg.xpm win/macosx: (files for macosx versions) -NetHackGuidebook.applescript NetHackRecover.applescript -NetHackTerm.applescript recover.pl +NetHackGuidebook.applescript NetHackRecover.applescript +NetHackTerm.applescript recover.pl win/share: (files for versions using optional tiles) -bmptiles.c gifread.c giftiles.c monsters.txt objects.txt -other.txt ppmwrite.c renumtiles.pl thintile.c tile.doc -tile.h tile2bmp.c tilemap.c tileset.c tiletext.c +bmptiles.c gifread.c giftiles.c monsters.txt objects.txt +other.txt ppmwrite.c renumtiles.pl thintile.c tile.doc +tile.h tile2bmp.c tilemap.c tileset.c tiletext.c win/tty: (files for tty versions) -getline.c termcap.c topl.c wintty.c +getline.c termcap.c topl.c wintty.c win/win32: (files for Windows versions - tested up to Windows 10) -dgnstuff.mak levstuff.mak mhaskyn.c mhaskyn.h mhdlg.c -mhdlg.h mhfont.c mhfont.h mhinput.c mhinput.h -mhmain.c mhmain.h mhmap.c mhmap.h mhmenu.c -mhmenu.h mhmsg.h mhmsgwnd.c mhmsgwnd.h mhrip.c -mhrip.h mhsplash.c mhsplash.h mhstatus.c mhstatus.h -mhtext.c mhtext.h mnsel.uu mnselcnt.uu mnunsel.uu -mswproc.c nethack.rc nhresource.h petmark.uu pilemark.uu -record.uu resource.h rip.uu splash.uu tiles.mak -winMS.h winhack.c winhack.rc +dgnstuff.mak levstuff.mak mhaskyn.c mhaskyn.h mhdlg.c +mhdlg.h mhfont.c mhfont.h mhinput.c mhinput.h +mhmain.c mhmain.h mhmap.c mhmap.h mhmenu.c +mhmenu.h mhmsg.h mhmsgwnd.c mhmsgwnd.h mhrip.c +mhrip.h mhsplash.c mhsplash.h mhstatus.c mhstatus.h +mhtext.c mhtext.h mnsel.uu mnselcnt.uu mnunsel.uu +mswproc.c nethack.rc nhresource.h petmark.uu pilemark.uu +record.uu resource.h rip.uu splash.uu tiles.mak +winMS.h winhack.c winhack.rc win/win32/vs2015: (files for Windows versions - tested up to Windows 10) -NetHack.sln NetHack.vcxproj NetHackW.vcxproj -afterdgncomp.proj afterdlb.proj afterlevcomp.proj -aftermakedefs.proj afternethack.proj afterrecover.proj -aftertile2bmp.proj aftertilemap.proj afteruudecode.proj -build.bat common.props config.props -console.props default.props default_dll.props -dgncomp.vcxproj dirs.props dlb.vcxproj -dll.props files.props levcomp.vcxproj -makedefs.vcxproj nh340key.def nh340key.vcxproj -nhdefkey.def nhdefkey.vcxproj nhraykey.def -nhraykey.vcxproj notes.txt recover.vcxproj -tile2bmp.vcxproj tilemap.vcxproj tiles.vcxproj -uudecode.vcxproj +NetHack.sln NetHack.vcxproj NetHackW.vcxproj +afterdgncomp.proj afterdlb.proj afterlevcomp.proj +aftermakedefs.proj afternethack.proj afterrecover.proj +aftertile2bmp.proj aftertilemap.proj afteruudecode.proj +build.bat common.props config.props +console.props default.props default_dll.props +dgncomp.vcxproj dirs.props dlb.vcxproj +dll.props files.props levcomp.vcxproj +makedefs.vcxproj nh340key.def nh340key.vcxproj +nhdefkey.def nhdefkey.vcxproj nhraykey.def +nhraykey.vcxproj notes.txt recover.vcxproj +tile2bmp.vcxproj tilemap.vcxproj tiles.vcxproj +uudecode.vcxproj win/win32/vs2017: (files for Visual Studio 2017 Community Edition builds) -NetHack.sln NetHack.vcxproj NetHackW.vcxproj -afterdgncomp.proj afterdlb.proj afterlevcomp.proj -aftermakedefs.proj afternethack.proj afterrecover.proj -aftertile2bmp.proj aftertilemap.proj afteruudecode.proj -build.bat common.props config.props -console.props default.props default_dll.props -dgncomp.vcxproj dirs.props dlb.vcxproj -dll.props files.props levcomp.vcxproj -makedefs.vcxproj nh340key.def nh340key.vcxproj -nhdefkey.def nhdefkey.vcxproj nhraykey.def -nhraykey.vcxproj recover.vcxproj tile2bmp.vcxproj -tilemap.vcxproj tiles.vcxproj uudecode.vcxproj +NetHack.sln NetHack.vcxproj NetHackW.vcxproj +afterdgncomp.proj afterdlb.proj afterlevcomp.proj +aftermakedefs.proj afternethack.proj afterrecover.proj +aftertile2bmp.proj aftertilemap.proj afteruudecode.proj +build.bat common.props config.props +console.props default.props default_dll.props +dgncomp.vcxproj dirs.props dlb.vcxproj +dll.props files.props levcomp.vcxproj +makedefs.vcxproj nh340key.def nh340key.vcxproj +nhdefkey.def nhdefkey.vcxproj nhraykey.def +nhraykey.vcxproj recover.vcxproj tile2bmp.vcxproj +tilemap.vcxproj tiles.vcxproj uudecode.vcxproj This is a list of files produced by auxiliary programs. They can all be regenerated from the files in the distribution. dat: (file generated by dgn_comp at playground creation time) -dungeon +dungeon (files generated by lev_comp at playground creation time) -Arc-fila.lev Arc-filb.lev Arc-goal.lev Arc-loca.lev Arc-strt.lev -Bar-fila.lev Bar-filb.lev Bar-goal.lev Bar-loca.lev Bar-strt.lev -Cav-fila.lev Cav-filb.lev Cav-goal.lev Cav-loca.lev Cav-strt.lev -Hea-fila.lev Hea-filb.lev Hea-goal.lev Hea-loca.lev Hea-strt.lev -Kni-fila.lev Kni-filb.lev Kni-goal.lev Kni-loca.lev Kni-strt.lev -Mon-fila.lev Mon-filb.lev Mon-goal.lev Mon-loca.lev Mon-strt.lev -Pri-fila.lev Pri-filb.lev Pri-goal.lev Pri-loca.lev Pri-strt.lev -Ran-fila.lev Ran-filb.lev Ran-goal.lev Ran-loca.lev Ran-strt.lev -Rog-fila.lev Rog-filb.lev Rog-goal.lev Rog-loca.lev Rog-strt.lev -Sam-fila.lev Sam-filb.lev Sam-goal.lev Sam-loca.lev Sam-strt.lev -Tou-fila.lev Tou-filb.lev Tou-goal.lev Tou-loca.lev Tou-strt.lev -Val-fila.lev Val-filb.lev Val-goal.lev Val-loca.lev Val-strt.lev -Wiz-fila.lev Wiz-filb.lev Wiz-goal.lev Wiz-loca.lev Wiz-strt.lev -air.lev asmodeus.lev astral.lev baalz.lev bigrm-1.lev -bigrm-2.lev bigrm-3.lev bigrm-4.lev bigrm-5.lev bigrm-6.lev -bigrm-7.lev bigrm-8.lev bigrm-9.lev bigrm-10.lev castle.lev -earth.lev fakewiz1.lev fakewiz2.lev fire.lev juiblex.lev -knox.lev medusa-1.lev medusa-2.lev medusa-3.lev medusa-4.lev -minefill.lev minend-1.lev minend-2.lev minend-3.lev minetn-1.lev -minetn-2.lev minetn-3.lev minetn-4.lev minetn-5.lev minetn-6.lev -minetn-7.lev oracle.lev orcus.lev sanctum.lev soko1-1.lev -soko1-2.lev soko2-1.lev soko2-2.lev soko3-1.lev soko3-2.lev -soko4-1.lev soko4-2.lev tower1.lev tower2.lev tower3.lev -valley.lev water.lev wizard1.lev wizard2.lev wizard3.lev +Arc-fila.lev Arc-filb.lev Arc-goal.lev Arc-loca.lev Arc-strt.lev +Bar-fila.lev Bar-filb.lev Bar-goal.lev Bar-loca.lev Bar-strt.lev +Cav-fila.lev Cav-filb.lev Cav-goal.lev Cav-loca.lev Cav-strt.lev +Hea-fila.lev Hea-filb.lev Hea-goal.lev Hea-loca.lev Hea-strt.lev +Kni-fila.lev Kni-filb.lev Kni-goal.lev Kni-loca.lev Kni-strt.lev +Mon-fila.lev Mon-filb.lev Mon-goal.lev Mon-loca.lev Mon-strt.lev +Pri-fila.lev Pri-filb.lev Pri-goal.lev Pri-loca.lev Pri-strt.lev +Ran-fila.lev Ran-filb.lev Ran-goal.lev Ran-loca.lev Ran-strt.lev +Rog-fila.lev Rog-filb.lev Rog-goal.lev Rog-loca.lev Rog-strt.lev +Sam-fila.lev Sam-filb.lev Sam-goal.lev Sam-loca.lev Sam-strt.lev +Tou-fila.lev Tou-filb.lev Tou-goal.lev Tou-loca.lev Tou-strt.lev +Val-fila.lev Val-filb.lev Val-goal.lev Val-loca.lev Val-strt.lev +Wiz-fila.lev Wiz-filb.lev Wiz-goal.lev Wiz-loca.lev Wiz-strt.lev +air.lev asmodeus.lev astral.lev baalz.lev bigrm-1.lev +bigrm-2.lev bigrm-3.lev bigrm-4.lev bigrm-5.lev bigrm-6.lev +bigrm-7.lev bigrm-8.lev bigrm-9.lev bigrm-10.lev castle.lev +earth.lev fakewiz1.lev fakewiz2.lev fire.lev juiblex.lev +knox.lev medusa-1.lev medusa-2.lev medusa-3.lev medusa-4.lev +minefill.lev minend-1.lev minend-2.lev minend-3.lev minetn-1.lev +minetn-2.lev minetn-3.lev minetn-4.lev minetn-5.lev minetn-6.lev +minetn-7.lev oracle.lev orcus.lev sanctum.lev soko1-1.lev +soko1-2.lev soko2-1.lev soko2-2.lev soko3-1.lev soko3-2.lev +soko4-1.lev soko4-2.lev tower1.lev tower2.lev tower3.lev +valley.lev water.lev wizard1.lev wizard2.lev wizard3.lev (files generated by makedefs at playground creation time) -data dungeon.pdf options oracles quest.dat rumors +data dungeon.pdf options oracles quest.dat rumors (files generated for Qt interface on Mac OS X) -Info.plist nethack.icns +Info.plist nethack.icns (files generated for win32 at compile time) -dlb.lst porthelp +dlb.lst porthelp (files generated for win32 gui at compile time) -guioptions +guioptions (files generated for win32 tty at compile time) -ttyoptions +ttyoptions (tile files optionally generated for X ports at playground creation time) -pet_mark.xbm rip.xpm x11tiles +pet_mark.xbm rip.xpm x11tiles include: (file for tiles support copied from win/share at compile time) -tile.h +tile.h (file for win32 that are moved into include at compile time) -win32api.h +win32api.h (files generated by makedefs at compile time) -date.h onames.h pm.h vis_tab.h +date.h onames.h pm.h vis_tab.h (files generated by yacc (or copied from sys/share) at compile time) -dgn_comp.h lev_comp.h +dgn_comp.h lev_comp.h src: (files for win32 that are moved into src at compile time) -Makefile Makefile.bcc Makefile.gcc +Makefile Makefile.bcc Makefile.gcc (files generated by 'moc' for Qt interface at compile time) -qt_kde0.moc qt_win.moc qttableview.moc +qt_kde0.moc qt_win.moc qttableview.moc -(files generated by makedefs at compile time) -monstr.c vis_tab.c +(file generated by makedefs at compile time by some ports) +monstr.c + +(file generated by makedefs at compile time) +vis_tab.c (file optionally generated by tilemap at compile time) -tile.c +tile.c sys/winnt: (file generated by uudecode at compile time) -nethack.ico +nethack.ico util: (files generated by lex and yacc (or copied from sys/share) at compile time) -dgn_lex.c dgn_yacc.c lev_lex.c lev_yacc.c +dgn_lex.c dgn_yacc.c lev_lex.c lev_yacc.c (file generated for unix at compile time if various tiles utilities are built) -tiletxt.c +tiletxt.c (file generated for win32 at compile time) -uudecode.exe +uudecode.exe NOTE: If your binaries were compiled with the data librarian (DLB) option, your playground will not contain all of the files listed here. All diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index 8c3f49200..460433aa3 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -1047,7 +1047,15 @@ used up all the letters, so this is a way to introduce the less frequently used commands. What extended commands are available depends on what features the game was compiled with. -.lp #adjust +.\" +.\" Pad short entries out to 1+8 characters. This will make sure that +.\" the text description starts on its own line like long named entries +.\" instead of sometimes being on the same line for short name ones. +.\" The document will be longer, but mixing the two is harder to read. +.\" (For plain text output, the old 1+4 was sufficient. For Postscript, +.\" several need at least 1+7 due to narrow letters or ligatures.) +.\" +.lp "#adjust " Adjust inventory letters (most useful when the .op fixinv option is \(lqon\(rq). @@ -1089,7 +1097,7 @@ Autocompletes. Default key is \(oqM-A\(cq, and also \(oq\(haN\(cq if .op number_pad is on. -.lp #apply +.lp "#apply " Apply (use) a tool such as a pick-axe, a key, or a lamp. Default key is \(oqa\(cq. .lp "" @@ -1107,70 +1115,70 @@ Toggle the .op autopickup option on/off. Default key is \(oq@\(cq. -.lp #call +.lp "#call " Call (name) a monster, or an object in inventory, on the floor, or in the discoveries list, or add an annotation for the current level (same as \(lq#annotate\(rq). Default key is \(oqC\(cq. -.lp #cast +.lp "#cast " Cast a spell. Default key is \(oqZ\(cq. -.lp #chat +.lp "#chat " Talk to someone. Default key is \(oqM-c\)cq. -.lp #close +.lp "#close " Close a door. Default key is \(oqc\(cq. -.lp #conduct +.lp "#conduct " List voluntary challenges you have maintained. Autocompletes. Default key is \(oqM-C\(cq. .lp "" See the section below entitled \(lqConduct\(rq for details. -.lp "#dip " +.lp "#dip " Dip an object into something. Autocompletes. Default key is \(oqM-d\(cq. -.lp #down +.lp "#down " Go down a staircase. Default key is \(oq>\(cq. -.lp #drop +.lp "#drop " Drop an item. Default key is \(oqd\(cq. .lp #droptype Drop specific item types. Default key is \(oqD\(cq. -.lp "#eat " +.lp "#eat " Eat something. Default key is \(oqe\(cq. The \(oqm\(cq prefix skips eating items on the floor. -.lp #engrave +.lp "#engrave " Engrave writing on the floor. Default key is \(oqE\(cq. -.lp #enhance +.lp "#enhance " Advance or check weapon and spell skills. Autocompletes. Default key is \(oqM-e\(cq. .lp #exploremode Enter the explore mode. -.lp #fire +.lp "#fire " Fire ammunition from quiver. Default key is \(oqf\(cq. -.lp #force +.lp "#force " Force a lock. Autocompletes. Default key is \(oqM-f\(cq. -.lp #glance +.lp "#glance " Show what type of thing a map symbol corresponds to. Default key is \(oq;\(cq. -.lp #help +.lp "#help " Show the help menu. Default key is \(oq?\(cq, and also \(oqh\(cq if .op number_pad is on. .lp #herecmdmenu Show a menu of possible actions in your current location. -.lp #history +.lp "#history " Show long version and game history. Default key is \(oqV\(cq. .lp #inventory @@ -1179,22 +1187,22 @@ Default key is \(oqi\(cq. .lp #inventtype Inventory specific item types. Default key is \(oqI\(cq. -.lp #invoke +.lp "#invoke " Invoke an object's special powers. Autocompletes. Default key is \(oqM-i\(cq. -.lp #jump +.lp "#jump " Jump to another location. Autocompletes. Default key is \(oqM-j\(cq, and also \(oqj\(cq if .op number_pad is on. -.lp #kick +.lp "#kick " Kick something. Default key is \(oq\(haD\(cq, and \(oqk\(cq if .op number_pad is on. -.lp #known +.lp "#known " Show what object types have been discovered. Default key is \(oq\\\(cq. .lp #knownclass @@ -1208,10 +1216,10 @@ Debug mode only. Show mobile light sources. Autocompletes. Debug mode only. -.lp #look +.lp "#look " Look at what is here, under you. Default key is \(oq:\(cq. -.lp #loot +.lp "#loot " Loot a box or bag on the floor beneath you, or the saddle from a steed standing next to you. Autocompletes. @@ -1220,18 +1228,16 @@ and go directly to removing a saddle. Default key is \(oqM-l\(cq, and also \(oql\(cq if .op number_pad is on. -.lp #monster +.lp "#monster " Use a monster's special ability (when polymorphed into monster form). Autocompletes. Default key is \(oqM-m\(cq. -.lp #name +.lp "#name " Name a monster, an individual object, or a type of object. Same as \(lq#call\(rq. Autocompletes. Default keys are \(oqN\(cq, \(oqM-n\(cq, and \(oqM-N\(cq. -.\".lp #offer \" `ff' ligature is narrow enough that text fits on same line -.\" \" as #offer but that looks bad because it is too close to 'r' -.lp "#offer " +.lp "#offer " \" `ff' ligature is narrow Offer a sacrifice to the gods. Autocompletes. Default key is \(oqM-o\(cq. @@ -1240,11 +1246,10 @@ You'll need to find an altar to have any chance at success. Corpses of recently killed monsters are the fodder of choice. .lp "" The \(oqm\(cq prefix skips offering any items which are on the altar. -.\".lp #open \" there's no ligature here, but text ends up too close to #open -.lp "#open " +.lp "#open " Open a door. Default key is \(oqo\(cq. -.lp #options +.lp "#options " Show and change option settings. Default key is \(oqO\(cq. .lp #overview @@ -1258,15 +1263,15 @@ level will be included regardless of annotations. Autocompletes. Default keys are \(oq\(haO\(cq, and \(oqM-O\(cq. .\" DON'T PANIC! -.lp #panic +.lp "#panic " Test the panic routine. Terminates the current game. Autocompletes. Debug mode only. -.lp "#pay " +.lp "#pay " Pay your shopping bill. Default key is \(oqp\(cq. -.lp #pickup +.lp "#pickup " Pick up things at the current location. Default key is \(oq,\(cq. The \(oqm\(cq prefix forces use of a menu. @@ -1274,7 +1279,7 @@ The \(oqm\(cq prefix forces use of a menu. Polymorph self. Autocompletes. Debug mode only. -.lp #pray +.lp "#pray " Pray to the gods for help. Autocompletes. Default key is \(oqM-p\(cq. @@ -1287,16 +1292,16 @@ option to make you confirm your intent before praying. It is enabled by default, and you can reset the .op paranoid_confirmation option to disable it. -.lp #prevmsg +.lp "#prevmsg " Show previously displayed game messages. Default key is \(oq\(haP\(cq. -.lp #puton +.lp "#puton " Put on an accessory (ring, amulet, etc). Default key is \(oqP\(cq. -.lp #quaff +.lp "#quaff " Quaff (drink) something. Default key is \(oqq\(cq. -.lp #quit +.lp "#quit " Quit the program without saving your game. Autocompletes. Default key is \(oqM-q\(cq. @@ -1307,35 +1312,35 @@ By default a response of \(oqy\(cq acknowledges that intent. You can set the .op paranoid_confirmation option to require a response of \(lqyes\(rq instead. -.lp #quiver +.lp "#quiver " Select ammunition for quiver. Default key is \(oqQ\(cq. -.lp #read +.lp "#read " Read a scroll, a spellbook, or something else. Default key is \(oqr\(cq. -.lp #redraw +.lp "#redraw " Redraw the screen. Default key is \(oq\(haR\(cq, and also \(oq\(haL\(cq if .op number_pad is on. -.lp #remove +.lp "#remove " Remove an accessory (ring, amulet, etc). Default key is \(oqR\(cq. -.lp #ride +.lp "#ride " Ride (or stop riding) a saddled creature. Autocompletes. Default key is \(oqM-R\(cq. -.lp "#rub " +.lp "#rub " Rub a lamp or a stone. Autocompletes. Default key is \(oqM-r\(cq. -.lp #save +.lp "#save " Save the game and exit the program. Default key is \(oqS\(cq. -.lp #search +.lp "#search " Search for traps and secret doors around you. Default key is \(oqs\(cq. -.lp #seeall +.lp "#seeall " Show all equipment in use. Default key is \(oq*\(cq. .lp #seeamulet @@ -1344,10 +1349,10 @@ Default key is \(oq\(dq\(cq. \" double quote .lp #seearmor Show the armor currently worn. Default key is \(oq[\(cq. -.lp #seegold +.lp "#seegold " Count your gold. Default key is \(oq$\(cq. -.lp #seenv +.lp "#seenv " Show seen vectors. Autocompletes. Debug mode only. @@ -1360,30 +1365,30 @@ Default key is \(oq+\(cq. .lp #seetools Show the tools currently in use. Default key is \(oq(\(cq. -.lp #seetrap +.lp "#seetrap " Show the type of an adjacent trap. Default key is \(oq\(ha\(cq. \" 'hat' (circumflex character) .lp #seeweapon Show the weapon currently wielded. Default key is \(oq)\(cq. -.lp #shell +.lp "#shell " Do a shell escape. Default key is \(oq!\(cq. -.lp "#sit " +.lp "#sit " Sit down. Autocompletes. Default key is \(oqM-s\(cq. -.lp #stats +.lp "#stats " Show memory usage statistics. Autocompletes. Debug mode only. -.lp #suspend +.lp "#suspend " Suspend the game. Default key is \(oq\(haZ\(cq. -.lp #swap +.lp "#swap " Swap wielded and secondary weapons. Default key is \(oqx\(cq. -.lp #takeoff +.lp "#takeoff " Take off one piece of armor. Default key is \(oqT\(cq. .lp #takeoffall @@ -1392,24 +1397,24 @@ Default key is \(oqA\(cq. .lp #teleport Teleport around the level. Default key is \(oq\(haT\(cq. -.lp #terrain +.lp "#terrain " Show bare map without displaying monsters, objects, or traps. Autocompletes. .lp #therecmdmenu Show a menu of possible actions in a location next to you. -.lp #throw +.lp "#throw " Throw something. Default key is \(oqt\(cq. -.lp #timeout +.lp "#timeout " Look at the timeout queue. Autocompletes. Debug mode only. -.lp "#tip " +.lp "#tip " Tip over a container (bag or box) to pour out its contents. Autocompletes. Default key is \(oqM-T\(cq. The \(oqm\(cq prefix makes the command use a menu. -.lp #travel +.lp "#travel " Travel to a specific location on the map. Default key is \(oq_\(cq. \" underscore Using the \(lqrequest menu\(rq prefix shows a menu of interesting targets @@ -1418,7 +1423,7 @@ When picking a target with cursor and the .op autodescribe option is on, the top line will show \(lq(no travel path)\(rq if your character does not know of a path to that location. -.lp #turn +.lp "#turn " Turn undead away. Autocompletes. Default key is \(oqM-t\(cq. @@ -1432,53 +1437,53 @@ is off. Note that you must use suitable weapons for this type of combat, or it will be automatically turned off. -.lp #untrap +.lp "#untrap " Untrap something (trap, door, or chest). Default key is \(oqM-u\(cq, and \(oqu\(cq if .op number_pad is on. .lp "" In some circumstances it can also be used to rescue trapped monsters. -.lp "#up " +.lp "#up " Go up a staircase. Default key is \(oq<\(cq. .lp #vanquished List vanquished monsters. Autocompletes. Debug mode only. -.lp #version +.lp "#version " Print compile time options for this version of NetHack. Autocompletes. Default key is \(oqM-v\(cq. .lp #versionshort Show version string. Default key is \(oqv\(cq. -.lp #vision +.lp "#vision " Show vision array. Autocompletes. Debug mode only. -.lp #wait +.lp "#wait " Rest one move while doing nothing. Default key is \(oq.\(cq, and also \(oq\ \(cq if .op rest_on_space is on. -.lp #wear +.lp "#wear " Wear a piece of armor. Default key is \(oqW\(cq. .lp #whatdoes Tell what a key does. Default key is \(oq&\(cq. -.lp #whatis +.lp "#whatis " Show what type of thing a symbol corresponds to. Default key is \(oq/\(cq. -.lp #wield +.lp "#wield " Wield a weapon. Default key is \(oqw\(cq. -.lp #wipe +.lp "#wipe " Wipe off your face. Autocompletes. Default key is \(oqM-w\(cq. -.lp #wizbury +.lp "#wizbury " Bury objects under and around you. Autocompletes. Debug mode only. @@ -1508,7 +1513,7 @@ Teleport to another level. Autocompletes. Debug mode only. Default key is \(oq\(haV\(cq. -.lp #wizmap +.lp "#wizmap " Map the level. Autocompletes. Debug mode only. @@ -1525,19 +1530,19 @@ Debug mode only. Show locations of special levels. Autocompletes. Debug mode only. -.lp #wizwish +.lp "#wizwish " Wish for something. Autocompletes. Debug mode only. Default key is \(oq\(haW\(cq. -.lp #wmode +.lp "#wmode " Show wall modes. Autocompletes. Debug mode only. -.lp "#zap " +.lp "#zap " Zap a wand. Default key is \(oqz\(cq. -.lp "#? " +.lp "#? " Help menu: get the list of available extended commands. .lp "" .pg diff --git a/doc/Guidebook.txt b/doc/Guidebook.txt index f80b3d260..2b44d9beb 100644 --- a/doc/Guidebook.txt +++ b/doc/Guidebook.txt @@ -1335,12 +1335,15 @@ #offer Offer a sacrifice to the gods. Autocompletes. Default key - is `M-o'. The `m' prefix skips offering items on the altar. + is `M-o'. - You'll need to find an altar to have any chance at success. - Corpses of recently killed monsters are the fodder of + You'll need to find an altar to have any chance at success. + Corpses of recently killed monsters are the fodder of choice. + The `m' prefix skips offering any items which are on the al- + tar. + #open Open a door. Default key is `o'. @@ -1375,9 +1378,6 @@ Pray to the gods for help. Autocompletes. Default key is `M-p'. - Praying too soon after receiving prior help is a bad idea. - (Hint: entering the dungeon alive is treated as having re- - ceived help. You probably shouldn't start off a new game by NetHack 3.6 October 16, 2018 @@ -1390,6 +1390,9 @@ + Praying too soon after receiving prior help is a bad idea. + (Hint: entering the dungeon alive is treated as having re- + ceived help. You probably shouldn't start off a new game by praying right away.) Since using this command by accident can cause trouble, there is an option to make you confirm your intent before praying. It is enabled by default, and @@ -1440,9 +1443,6 @@ Rub a lamp or a stone. Autocompletes. Default key is `M- r'. - #save - Save the game and exit the program. Default key is `S'. - @@ -1456,6 +1456,9 @@ + #save + Save the game and exit the program. Default key is `S'. + #search Search for traps and secret doors around you. Default key is `s'. @@ -1506,9 +1509,6 @@ #swap Swap wielded and secondary weapons. Default key is `x'. - #takeoff - Take off one piece of armor. Default key is `T'. - @@ -1522,6 +1522,9 @@ + #takeoff + Take off one piece of armor. Default key is `T'. + #takeoffall Remove all armor. Default key is `A'. @@ -1574,9 +1577,6 @@ #up Go up a staircase. Default key is `<'. - #vanquished - List vanquished monsters. Autocompletes. Debug mode only. - NetHack 3.6 October 16, 2018 @@ -1588,6 +1588,9 @@ + #vanquished + List vanquished monsters. Autocompletes. Debug mode only. + #version Print compile time options for this version of NetHack. Au- tocompletes. Default key is `M-v'. @@ -1640,9 +1643,6 @@ Set one or more intrinsic attributes. Autocompletes. Debug mode only. - #wizlevelport - Teleport to another level. Autocompletes. Debug mode only. - NetHack 3.6 October 16, 2018 @@ -1654,6 +1654,8 @@ + #wizlevelport + Teleport to another level. Autocompletes. Debug mode only. Default key is `^V'. #wizmap @@ -1705,8 +1707,6 @@ M-A #annotate - M-c #chat - @@ -1720,6 +1720,8 @@ + M-c #chat + M-C #conduct M-d #dip @@ -1771,8 +1773,6 @@ j #jump - k #kick - @@ -1786,6 +1786,8 @@ + k #kick + l #loot N #name @@ -1838,8 +1840,6 @@ There is a special pre-mapped branch of the dungeon based on the classic computer game "Sokoban." The goal is to push the - boulders into the pits or holes. With careful foresight, it is - possible to complete all of the levels according to the NetHack 3.6 October 16, 2018 @@ -1852,8 +1852,10 @@ - traditional rules of Sokoban. Some allowances are permitted in - case the player gets stuck; however, they will lower your luck. + boulders into the pits or holes. With careful foresight, it is + possible to complete all of the levels according to the tradi- + tional rules of Sokoban. Some allowances are permitted in case + the player gets stuck; however, they will lower your luck. 5.3. Stairs and ladders (`<', `>') @@ -1904,8 +1906,6 @@ floor while inside a shop. You will either be offered an amount of gold and asked whether you're willing to sell, or you'll be told that the shopkeeper isn't interested (generally, your item - needs to be compatible with the type of merchandise carried by - the shop). NetHack 3.6 October 16, 2018 @@ -1918,6 +1918,9 @@ + needs to be compatible with the type of merchandise carried by + the shop). + If you drop something in a shop by accident, the shopkeeper will usually claim ownership without offering any compensation. You'll have to buy it back if you want to reclaim it. @@ -1970,9 +1973,6 @@ from another when multiple monsters are present. Assigning a name which is just a space will remove any prior name. - The extended command "#chat" can be used to interact with an - adjacent monster. There is no actual dialog (in other words, you - NetHack 3.6 October 16, 2018 @@ -1984,6 +1984,8 @@ + The extended command "#chat" can be used to interact with an + adjacent monster. There is no actual dialog (in other words, you don't get to choose what you'll say), but chatting with some mon- sters such as a shopkeeper or the Oracle of Delphi can produce useful results. @@ -2038,8 +2040,6 @@ with it even if adjacent at the time. - - NetHack 3.6 October 16, 2018 @@ -4852,8 +4852,7 @@ and ride, and "all" for every condition. Allowed behaviors are "always", "up", "down", "changed", a per- - centage or absolute number threshold, or a text to match - against. + centage or absolute number threshold, or text to match against. * "always" will set the default attributes for that field. @@ -4878,6 +4877,7 @@ points" fields. + NetHack 3.6 October 16, 2018 diff --git a/doc/fixes36.2 b/doc/fixes36.2 index 527c68ab9..5b5f058ce 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -171,6 +171,7 @@ overview information for former hero was not being set properly when bones in Guidebook.mn and Guidebook.txt, the 'I' command mis-described `IX' as displaying inventory items whose bless/curse state is "known" (Guidebook.tex correctly had "unknown") +poison gas (stinking cloud) wasn't shown at drawbridge-up spot Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository diff --git a/include/extern.h b/include/extern.h index 6d6089fa2..cad3170ec 100644 --- a/include/extern.h +++ b/include/extern.h @@ -145,6 +145,7 @@ E int NDECL(getbones); /* ### botl.c ### */ +E const char *FDECL(bl_idx_to_fldname, (int)); E char *NDECL(do_statusline1); E void NDECL(check_gold_symbol); E char *NDECL(do_statusline2); diff --git a/include/permonst.h b/include/permonst.h index cd1c73fff..b22269e68 100644 --- a/include/permonst.h +++ b/include/permonst.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 permonst.h $NHDT-Date: 1432512778 2015/05/25 00:12:58 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */ +/* NetHack 3.6 permonst.h $NHDT-Date: 1539804913 2018/10/17 19:35:13 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.12 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -58,6 +58,7 @@ struct permonst { unsigned long mflags1, /* boolean bitflags */ mflags2; /* more boolean bitflags */ unsigned short mflags3; /* yet more boolean bitflags */ + uchar difficulty; /* toughness (formerly from makedefs -m) */ #ifdef TEXTCOLOR uchar mcolor; /* color to use */ #endif diff --git a/include/winX.h b/include/winX.h index 32af1364b..b5fcfd34e 100644 --- a/include/winX.h +++ b/include/winX.h @@ -153,12 +153,7 @@ struct menu_info_t { struct menu curr_menu; /* Menu being displayed. */ struct menu new_menu; /* New menu being built. */ - boolean nh_colors_inited; - XColor nh_colors[CLR_MAX]; - XFontStruct *fs; /* Font for the window. */ - XFontStruct *boldfs; /* Bold font */ - Display *boldfs_dpy; long menu_count; /* number entered by user */ Dimension line_height; /* Total height of a line of text. */ Dimension internal_height; /* Internal height between widget & border */ @@ -203,6 +198,11 @@ struct xwindow { int prevx, cursx; /* Cursor position, only used by */ int prevy, cursy; /* map and "plain" status windows.*/ + boolean nh_colors_inited; + XColor nh_colors[CLR_MAX]; + XFontStruct *boldfs; /* Bold font */ + Display *boldfs_dpy; /* Bold font display */ + union { struct map_info_t *Map_info; /* map window info */ struct mesg_info_t *Mesg_info; /* message window info */ @@ -254,6 +254,7 @@ E boolean plsel_ask_name; typedef struct { Boolean slow; /* issue prompts between map and message wins */ + Boolean fancy_status; /* use "fancy" status vs. TTY-style status */ Boolean autofocus; /* grab pointer focus for popup windows */ Boolean message_line; /* separate current turn mesgs from prev ones */ Boolean highlight_prompt; /* if 'slow', highlight yn prompts */ @@ -297,6 +298,9 @@ E void FDECL(positionpopup, (Widget, BOOLEAN_P)); /* ### winX.c ### */ E struct xwindow *FDECL(find_widget, (Widget)); +E XColor FDECL(get_nhcolor, (struct xwindow *, int)); +E void FDECL(init_menu_nhcolors, (struct xwindow *)); +E void FDECL(load_boldfont, (struct xwindow *, Widget)); E Boolean FDECL(nhApproxColor, (Screen *, Colormap, char *, XColor *)); E void FDECL(get_widget_window_geometry, (Widget, int *, int *, int *, int *)); E char *FDECL(fontname_boldify, (const char *)); @@ -394,6 +398,8 @@ E void FDECL(hilight_value, (Widget)); E void FDECL(swap_fg_bg, (Widget)); /* external declarations */ +E char *FDECL(X11_getmsghistory, (BOOLEAN_P)); +E void FDECL(X11_putmsghistory, (const char *, BOOLEAN_P)); E void FDECL(X11_init_nhwindows, (int *, char **)); E void NDECL(X11_player_selection); E void NDECL(X11_askname); @@ -431,6 +437,10 @@ E void FDECL(X11_getlin, (const char *, char *)); E int NDECL(X11_get_ext_cmd); E void FDECL(X11_number_pad, (int)); E void NDECL(X11_delay_output); +E void NDECL(X11_status_init); +E void NDECL(X11_status_finish); +E void FDECL(X11_status_enablefield, (int, const char *, const char *, BOOLEAN_P)); +E void FDECL(X11_status_update, (int, genericptr_t, int, int, int, unsigned long *)); /* other defs that really should go away (they're tty specific) */ E void NDECL(X11_start_screen); diff --git a/src/.gitattributes b/src/.gitattributes index 793c4bdb8..4c2e83753 100644 --- a/src/.gitattributes +++ b/src/.gitattributes @@ -9,6 +9,6 @@ qt_win.moc NH_filesgentag=>qt_kde0.moc qttableview.moc NH_filesgentag=>qt_kde0.moc tile.c NH_filesgentag=(file%s_optionally_generated_by_tilemap_at_compile_time) +monstr.c NH_filesgentag=(file%s_generated_by_makedefs_at_compile_time_by_some_ports) -monstr.c NH_filesgentag=(file%s_generated_by_makedefs_at_compile_time) -vis_tab.c NH_filesgentag=>monstr.c +vis_tab.c NH_filesgentag=(file%s_generated_by_makedefs_at_compile_time) diff --git a/src/allmain.c b/src/allmain.c index 6fef09bf1..be99150be 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 allmain.c $NHDT-Date: 1518193644 2018/02/09 16:27:24 $ $NHDT-Branch: githash $:$NHDT-Revision: 1.86 $ */ +/* NetHack 3.6 allmain.c $NHDT-Date: 1539804859 2018/10/17 19:34:19 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.89 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -35,7 +35,6 @@ boolean resuming; */ decl_init(); monst_init(); - monstr_init(); /* monster strengths */ objects_init(); /* if a save file created in normal mode is now being restored in diff --git a/src/botl.c b/src/botl.c index fde46e2fb..5d1fe2bcb 100644 --- a/src/botl.c +++ b/src/botl.c @@ -1248,6 +1248,16 @@ static struct fieldid_t { static const char threshold_value[] = "hilite_status threshold ", is_out_of_range[] = " is out of range"; + +const char * +bl_idx_to_fldname(idx) +int idx; +{ + if (idx >= 0 && idx < MAXBLSTATS) + return initblstats[idx].fldname; + return (const char *) 0; +} + /* field name to bottom line index */ STATIC_OVL enum statusfields fldname_to_bl_indx(name) diff --git a/src/display.c b/src/display.c index a142eab91..9aca21fa4 100644 --- a/src/display.c +++ b/src/display.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 display.c $NHDT-Date: 1525056598 2018/04/30 02:49:58 $ $NHDT-Branch: master $:$NHDT-Revision: 1.92 $ */ +/* NetHack 3.6 display.c $NHDT-Date: 1540502147 2018/10/25 21:15:47 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.94 $ */ /* Copyright (c) Dean Luick, with acknowledgements to Kevin Darcy */ /* and Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ @@ -512,6 +512,7 @@ warning_of(mon) struct monst *mon; { int wl = 0, tmp = 0; + if (mon_warning(mon)) { tmp = (int) (mon->m_lev / 4); /* match display.h */ wl = (tmp > WARNCOUNT - 1) ? WARNCOUNT - 1 : tmp; @@ -755,38 +756,36 @@ register int x, y; /* normal region shown only on accessible positions, but poison clouds * also shown above lava, pools and moats. */ - if (reg != NULL && (ACCESSIBLE(lev->typ) - || (reg->glyph == cmap_to_glyph(S_poisoncloud) - && (lev->typ == LAVAPOOL || lev->typ == POOL - || lev->typ == MOAT)))) { + if (reg && (ACCESSIBLE(lev->typ) + || (reg->glyph == cmap_to_glyph(S_poisoncloud) + && is_pool_or_lava(x, y)))) { show_region(reg, x, y); return; } + if (x == u.ux && y == u.uy) { - if (canspotself()) { - _map_location(x, y, 0); /* map *under* self */ + int see_self = canspotself(); + + /* update map information for (remembered topology + and object/known trap/terrain glyph) but only display it if + hero can't see him/herself, then show self if appropriate */ + _map_location(x, y, !see_self); + if (see_self) display_self(); - } else - /* we can see what is there */ - _map_location(x, y, 1); } else { mon = m_at(x, y); worm_tail = is_worm_tail(mon); - see_it = - mon && (worm_tail ? (!mon->minvis || See_invisible) - : (mon_visible(mon)) || tp_sensemon(mon) - || MATCH_WARN_OF_MON(mon)); + see_it = mon && (mon_visible(mon) + || (!worm_tail && (tp_sensemon(mon) + || MATCH_WARN_OF_MON(mon)))); if (mon && (see_it || (!worm_tail && Detect_monsters))) { if (mon->mtrapped) { struct trap *trap = t_at(x, y); int tt = trap ? trap->ttyp : NO_TRAP; - /* if monster is in a physical trap, you see the trap too - */ - if (tt == BEAR_TRAP || is_pit(tt) - || tt == WEB) { - trap->tseen = TRUE; - } + /* if monster is in a physical trap, you see trap too */ + if (tt == BEAR_TRAP || is_pit(tt) || tt == WEB) + trap->tseen = 1; } _map_location(x, y, 0); /* map under the monster */ /* also gets rid of any invisibility glyph */ @@ -795,7 +794,7 @@ register int x, y; worm_tail); } else if (mon && mon_warning(mon) && !is_worm_tail(mon)) { display_warning(mon); - } else if (glyph_is_invisible(levl[x][y].glyph)) { + } else if (glyph_is_invisible(lev->glyph)) { map_invisible(x, y); } else _map_location(x, y, 1); /* map the location */\ @@ -808,19 +807,17 @@ register int x, y; if (canspotself()) display_self(); - } else if ((mon = m_at(x, y)) + } else if ((mon = m_at(x, y)) != 0 && ((see_it = (tp_sensemon(mon) || MATCH_WARN_OF_MON(mon) || (see_with_infrared(mon) - && mon_visible(mon)))) + && mon_visible(mon)))) != 0 || Detect_monsters)) { - /* Monsters are printed every time. */ - /* This also gets rid of any invisibility glyph */ + /* Seen or sensed monsters are printed every time. + This also gets rid of any invisibility glyph. */ display_monster(x, y, mon, see_it ? 0 : DETECTED, is_worm_tail(mon) ? TRUE : FALSE); - } else if ((mon = m_at(x, y)) && mon_warning(mon) - && !is_worm_tail(mon)) { + } else if (mon && mon_warning(mon) && !is_worm_tail(mon)) { display_warning(mon); - } /* * If the location is remembered as being both dark (waslit is false) @@ -828,7 +825,6 @@ register int x, y; * * (1) A dark location that the hero could see through night * vision. - * * (2) Darkened while out of the hero's sight. This can happen * when cursed scroll of light is read. * @@ -844,7 +840,7 @@ register int x, y; * These checks and changes must be here and not in back_to_glyph(). * They are dependent on the position being out of sight. */ - else if (Is_rogue_level(&u.uz)) { + } else if (Is_rogue_level(&u.uz)) { if (lev->glyph == cmap_to_glyph(S_litcorr) && lev->typ == CORR) show_glyph(x, y, lev->glyph = cmap_to_glyph(S_corr)); else if (lev->glyph == cmap_to_glyph(S_room) && lev->typ == ROOM @@ -852,8 +848,7 @@ register int x, y; show_glyph(x, y, lev->glyph = cmap_to_glyph(S_stone)); else goto show_mem; - } - else if (!lev->waslit || (flags.dark_room && iflags.use_color)) { + } else if (!lev->waslit || (flags.dark_room && iflags.use_color)) { if (lev->glyph == cmap_to_glyph(S_litcorr) && lev->typ == CORR) show_glyph(x, y, lev->glyph = cmap_to_glyph(S_corr)); else if (lev->glyph == cmap_to_glyph(S_room) && lev->typ == ROOM) diff --git a/src/end.c b/src/end.c index 7b10d2c0e..93216c76c 100644 --- a/src/end.c +++ b/src/end.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 end.c $NHDT-Date: 1528332335 2018/06/07 00:45:35 $ $NHDT-Branch: NetHack-3.6.2 $:$NHDT-Revision: 1.141 $ */ +/* NetHack 3.6 end.c $NHDT-Date: 1539804880 2018/10/17 19:34:40 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.146 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1574,8 +1574,6 @@ int status; nethack_exit(status); } -extern const int monstr[]; - enum vanq_order_modes { VANQ_MLVL_MNDX = 0, VANQ_MSTR_MNDX, @@ -1620,7 +1618,7 @@ const genericptr vptr2; break; case VANQ_MSTR_MNDX: /* sort by monster toughness */ - mstr1 = monstr[indx1], mstr2 = monstr[indx2]; + mstr1 = mons[indx1].difficulty, mstr2 = mons[indx2].difficulty; res = mstr2 - mstr1; /* monstr high to low */ break; case VANQ_ALPHA_SEP: diff --git a/src/makemon.c b/src/makemon.c index cbc57a0e0..479255eee 100644 --- a/src/makemon.c +++ b/src/makemon.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 makemon.c $NHDT-Date: 1537477761 2018/09/20 21:09:21 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.124 $ */ +/* NetHack 3.6 makemon.c $NHDT-Date: 1539804904 2018/10/17 19:35:04 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.127 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -25,12 +25,10 @@ STATIC_DCL void FDECL(m_initinv, (struct monst *)); STATIC_DCL boolean FDECL(makemon_rnd_goodpos, (struct monst *, unsigned, coord *)); -extern const int monstr[]; - #define m_initsgrp(mtmp, x, y) m_initgrp(mtmp, x, y, 3) #define m_initlgrp(mtmp, x, y) m_initgrp(mtmp, x, y, 10) -#define toostrong(monindx, lev) (monstr[monindx] > lev) -#define tooweak(monindx, lev) (monstr[monindx] < lev) +#define toostrong(monindx, lev) (mons[monindx].difficulty > lev) +#define tooweak(monindx, lev) (mons[monindx].difficulty < lev) boolean is_home_elemental(ptr) @@ -1652,7 +1650,7 @@ int spc; if (mk_gen_ok(last, G_GONE, mask)) { /* consider it */ if (num && toostrong(last, maxmlev) - && monstr[last] != monstr[last - 1] && rn2(2)) + && mons[last].difficulty != mons[last - 1].difficulty && rn2(2)) break; num += mons[last].geno & G_FREQ; } diff --git a/src/monst.c b/src/monst.c index 1ce52c97d..13ea883f5 100644 --- a/src/monst.c +++ b/src/monst.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 monst.c $NHDT-Date: 1510531569 2017/11/13 00:06:09 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.59 $ */ +/* NetHack 3.6 monst.c $NHDT-Date: 1539804880 2018/10/17 19:34:40 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.61 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2006. */ /* NetHack may be freely redistributed. See license for details. */ @@ -32,21 +32,21 @@ void NDECL(monst_init); * Entry Format: (from permonst.h) * * name, symbol (S_* defines), - * difficulty level, move rate, armor class, magic resistance, + * base monster level, move rate, armor class, magic resistance, * alignment, creation/geno flags (G_* defines), * 6 * attack structs ( type , damage-type, # dice, # sides ), * weight (WT_* defines), nutritional value, extension length, * sounds made (MS_* defines), physical size (MZ_* defines), * resistances, resistances conferred (both MR_* defines), - * 3 * flag bitmaps (M1_*, M2_*, and M3_* defines respectively) - * symbol color (C(x) macro) + * 3 * flag bitmaps (M1_*, M2_*, and M3_* defines respectively), + * difficulty, symbol color (C(x) macro) * * For AT_BREA attacks, '# sides' is ignored; 6 is used for most * damage types, 25 for sleep, not applicable for death or poison. */ -#define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, col) \ +#define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, col) \ { \ - nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, C(col) \ + nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col) \ } /* LVL() and SIZ() collect several fields to cut down on # of args for MON() */ @@ -110,37 +110,37 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(10, 10, MS_SILENT, MZ_TINY), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE, 0, - CLR_BROWN), + 4, CLR_BROWN), MON("killer bee", S_ANT, LVL(1, 18, -1, 0, 0), (G_GENO | G_LGROUP | 2), A(ATTK(AT_STNG, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1, 5, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, M1_ANIMAL | M1_FLY | M1_NOHANDS | M1_POIS, M2_HOSTILE | M2_FEMALE, 0, - CLR_YELLOW), + 5, CLR_YELLOW), MON("soldier ant", S_ANT, LVL(3, 18, 3, 0, 0), (G_GENO | G_SGROUP | 2), A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_DRST, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 5, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE, - M2_HOSTILE, 0, CLR_BLUE), + M2_HOSTILE, 0, 6, CLR_BLUE), MON("fire ant", S_ANT, LVL(3, 18, 3, 10, 0), (G_GENO | G_SGROUP | 1), A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_FIRE, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 10, MS_SILENT, MZ_TINY), MR_FIRE, MR_FIRE, M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE, 6, CLR_RED), MON("giant beetle", S_ANT, LVL(5, 6, 4, 0, 0), (G_GENO | 3), A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_CARNIVORE, M2_HOSTILE, 0, - CLR_BLACK), + 6, CLR_BLACK), MON("queen bee", S_ANT, LVL(9, 24, -4, 0, 0), (G_GENO | G_NOGEN), A(ATTK(AT_STNG, AD_DRST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1, 5, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, M1_ANIMAL | M1_FLY | M1_NOHANDS | M1_OVIPAROUS | M1_POIS, - M2_HOSTILE | M2_FEMALE | M2_PRINCE, 0, HI_LORD), + M2_HOSTILE | M2_FEMALE | M2_PRINCE, 0, 12, HI_LORD), /* * blobs */ @@ -151,13 +151,13 @@ NEARDATA struct permonst mons[] = { MR_SLEEP | MR_POISON | MR_ACID | MR_STONE, MR_STONE, M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_ACID, - M2_WANDER | M2_NEUTER, 0, CLR_GREEN), + M2_WANDER | M2_NEUTER, 0, 2, CLR_GREEN), MON("quivering blob", S_BLOB, LVL(5, 1, 8, 0, 0), (G_GENO | 2), A(ATTK(AT_TUCH, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 100, MS_SILENT, MZ_SMALL), MR_SLEEP | MR_POISON, MR_POISON, M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, - M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, CLR_WHITE), + M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, 6, CLR_WHITE), MON("gelatinous cube", S_BLOB, LVL(6, 6, 8, 0, 0), (G_GENO | 2), A(ATTK(AT_TUCH, AD_PLYS, 2, 4), ATTK(AT_NONE, AD_PLYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -167,7 +167,7 @@ NEARDATA struct permonst mons[] = { MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP, M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_OMNIVORE | M1_ACID, - M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, CLR_CYAN), + M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, 8, CLR_CYAN), /* * cockatrice */ @@ -177,21 +177,21 @@ NEARDATA struct permonst mons[] = { ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, MS_HISS, MZ_TINY), MR_POISON | MR_STONE, MR_POISON | MR_STONE, M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, - M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), + M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BROWN), MON("cockatrice", S_COCKATRICE, LVL(5, 6, 6, 30, 0), (G_GENO | 5), A(ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_TUCH, AD_STON, 0, 0), ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, MS_HISS, MZ_SMALL), MR_POISON | MR_STONE, MR_POISON | MR_STONE, M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE | M1_OVIPAROUS, M2_HOSTILE, - M3_INFRAVISIBLE, CLR_YELLOW), + M3_INFRAVISIBLE, 8, CLR_YELLOW), MON("pyrolisk", S_COCKATRICE, LVL(6, 6, 6, 30, 0), (G_GENO | 1), A(ATTK(AT_GAZE, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, MS_HISS, MZ_SMALL), MR_POISON | MR_FIRE, MR_POISON | MR_FIRE, M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE | M1_OVIPAROUS, M2_HOSTILE, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE, 8, CLR_RED), /* * dogs & other canines */ @@ -200,92 +200,92 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_BROWN), + 1, CLR_BROWN), MON("fox", S_DOG, LVL(0, 15, 7, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_RED), + 1, CLR_RED), MON("coyote", S_DOG, LVL(1, 12, 7, 0, 0), (G_GENO | G_SGROUP | 1), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_BROWN), + 2, CLR_BROWN), MON("werejackal", S_DOG, LVL(2, 12, 7, 10, -7), (G_NOGEN | G_NOCORPSE), A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 250, MS_BARK, MZ_SMALL), MR_POISON, 0, M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE, - M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), + M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN), MON("little dog", S_DOG, LVL(2, 18, 6, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 150, MS_BARK, MZ_SMALL), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, - HI_DOMESTIC), + 3, HI_DOMESTIC), MON("dingo", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 200, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_YELLOW), + 5, CLR_YELLOW), MON("dog", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 200, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, - HI_DOMESTIC), + 5, HI_DOMESTIC), MON("large dog", S_DOG, LVL(6, 15, 4, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 250, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_STRONG | M2_DOMESTIC, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("wolf", S_DOG, LVL(5, 12, 4, 0, 0), (G_GENO | G_SGROUP | 2), A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 250, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_BROWN), + 6, CLR_BROWN), MON("werewolf", S_DOG, LVL(5, 12, 4, 20, -7), (G_NOGEN | G_NOCORPSE), A(ATTK(AT_BITE, AD_WERE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 250, MS_BARK, MZ_MEDIUM), MR_POISON, 0, M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE, - M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), + M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BROWN), MON("winter wolf cub", S_DOG, LVL(5, 12, 4, 0, -5), (G_NOHELL | G_GENO | G_SGROUP | 2), A(ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_BREA, AD_COLD, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 200, MS_BARK, MZ_SMALL), MR_COLD, MR_COLD, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, CLR_CYAN), + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 7, CLR_CYAN), MON("warg", S_DOG, LVL(7, 12, 4, 0, -5), (G_GENO | G_SGROUP | 2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 350, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_BROWN), + 8, CLR_BROWN), MON("winter wolf", S_DOG, LVL(7, 12, 4, 20, 0), (G_NOHELL | G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_COLD, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 300, MS_BARK, MZ_LARGE), MR_COLD, MR_COLD, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, 0, - CLR_CYAN), + 9, CLR_CYAN), MON("hell hound pup", S_DOG, LVL(7, 12, 4, 20, -5), (G_HELL | G_GENO | G_SGROUP | 1), A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 200, MS_BARK, MZ_SMALL), MR_FIRE, MR_FIRE, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_RED), + 9, CLR_RED), MON("hell hound", S_DOG, LVL(12, 14, 2, 20, 0), (G_HELL | G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BREA, AD_FIRE, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, MS_BARK, MZ_MEDIUM), MR_FIRE, MR_FIRE, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE, 14, CLR_RED), #ifdef CHARON MON("Cerberus", S_DOG, LVL(12, 10, 2, 20, -7), (G_NOGEN | G_UNIQ | G_HELL), @@ -294,7 +294,7 @@ NEARDATA struct permonst mons[] = { SIZ(1000, 350, MS_BARK, MZ_LARGE), MR_FIRE, MR_FIRE, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_MALE, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE, 14, CLR_RED), #endif /* * eyes @@ -304,13 +304,13 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(10, 10, MS_SILENT, MZ_SMALL), 0, 0, M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, - M2_HOSTILE | M2_NEUTER, 0, CLR_GRAY), + M2_HOSTILE | M2_NEUTER, 0, 2, CLR_GRAY), MON("floating eye", S_EYE, LVL(2, 1, 9, 10, 0), (G_GENO | 5), A(ATTK(AT_NONE, AD_PLYS, 0, 70), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, MS_SILENT, MZ_SMALL), 0, 0, M1_FLY | M1_AMPHIBIOUS | M1_NOLIMBS | M1_NOHEAD | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_BLUE), + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 3, CLR_BLUE), MON("freezing sphere", S_EYE, LVL(6, 13, 4, 0, 0), (G_NOCORPSE | G_NOHELL | G_GENO | 2), A(ATTK(AT_EXPL, AD_COLD, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -318,21 +318,21 @@ NEARDATA struct permonst mons[] = { SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, MR_COLD, M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_WHITE), + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 8, CLR_WHITE), MON("flaming sphere", S_EYE, LVL(6, 13, 4, 0, 0), (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_FIRE, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_FIRE, MR_FIRE, M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_RED), + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 8, CLR_RED), MON("shocking sphere", S_EYE, LVL(6, 13, 4, 0, 0), (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_ELEC, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_ELEC, MR_ELEC, M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, HI_ZAP), + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 8, HI_ZAP), #if 0 /* not yet implemented */ MON("beholder", S_EYE, LVL(6, 3, 4, 0, -10), (G_GENO | 2), @@ -341,7 +341,7 @@ NEARDATA struct permonst mons[] = { ATTK(AT_GAZE, AD_CNCL, 2, 4), ATTK(AT_BITE, AD_PHYS, 2, 4)), SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, 0, M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, - M2_NOPOLY | M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_BROWN), + M2_NOPOLY | M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 13, CLR_BROWN), #endif /* * felines @@ -351,43 +351,43 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(150, 150, MS_MEW, MZ_SMALL), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_WANDER | M2_DOMESTIC, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 3, HI_DOMESTIC), MON("housecat", S_FELINE, LVL(4, 16, 5, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 200, MS_MEW, MZ_SMALL), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, - HI_DOMESTIC), + 5, HI_DOMESTIC), MON("jaguar", S_FELINE, LVL(4, 15, 6, 0, 0), (G_GENO | 2), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_BROWN), + 6, CLR_BROWN), MON("lynx", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, MS_GROWL, MZ_SMALL), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_CYAN), + 7, CLR_CYAN), MON("panther", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_BLACK), + 7, CLR_BLACK), MON("large cat", S_FELINE, LVL(6, 15, 4, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 250, MS_MEW, MZ_SMALL), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_STRONG | M2_DOMESTIC, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("tiger", S_FELINE, LVL(6, 12, 6, 0, 0), (G_GENO | 2), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_YELLOW), + 8, CLR_YELLOW), /* * gremlins and gargoyles */ @@ -397,19 +397,19 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(100, 20, MS_LAUGH, MZ_SMALL), MR_POISON, MR_POISON, M1_SWIM | M1_HUMANOID | M1_POIS, M2_STALK, M3_INFRAVISIBLE, - CLR_GREEN), + 8, CLR_GREEN), MON("gargoyle", S_GREMLIN, LVL(6, 10, -4, 0, -9), (G_GENO | 2), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 200, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE, M1_HUMANOID | M1_THICK_HIDE | M1_BREATHLESS, M2_HOSTILE | M2_STRONG, - 0, CLR_BROWN), + 0, 8, CLR_BROWN), MON("winged gargoyle", S_GREMLIN, LVL(9, 15, -2, 0, -12), (G_GENO | 1), A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 300, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE, M1_FLY | M1_HUMANOID | M1_THICK_HIDE | M1_BREATHLESS | M1_OVIPAROUS, - M2_LORD | M2_HOSTILE | M2_STRONG | M2_MAGIC, 0, HI_LORD), + M2_LORD | M2_HOSTILE | M2_STRONG | M2_MAGIC, 0, 11, HI_LORD), /* * humanoids */ @@ -417,19 +417,19 @@ NEARDATA struct permonst mons[] = { A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 200, MS_HUMANOID, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GREEN), + M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_GREEN), MON("dwarf", S_HUMANOID, LVL(2, 6, 10, 10, 4), (G_GENO | 3), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_DWARF | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_RED), MON("bugbear", S_HUMANOID, LVL(3, 9, 5, 0, -6), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1250, 250, MS_GROWL, MZ_LARGE), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BROWN), + M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN), MON("dwarf lord", S_HUMANOID, LVL(4, 6, 10, 10, 5), (G_GENO | 2), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -437,7 +437,7 @@ NEARDATA struct permonst mons[] = { M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, M2_DWARF | M2_STRONG | M2_LORD | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BLUE), + M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BLUE), MON("dwarf king", S_HUMANOID, LVL(6, 6, 10, 20, 6), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -445,7 +445,7 @@ NEARDATA struct permonst mons[] = { M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, M2_DWARF | M2_STRONG | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION, 8, HI_LORD), MON("mind flayer", S_HUMANOID, LVL(9, 12, 5, 90, -8), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), NO_ATTK, @@ -453,7 +453,7 @@ NEARDATA struct permonst mons[] = { SIZ(1450, 400, MS_HISS, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_FLY | M1_SEE_INVIS | M1_OMNIVORE, M2_HOSTILE | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_MAGENTA), + M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_MAGENTA), MON("master mind flayer", S_HUMANOID, LVL(13, 12, 0, 90, -8), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TENT, AD_DRIN, 2, 1), @@ -462,7 +462,7 @@ NEARDATA struct permonst mons[] = { SIZ(1450, 400, MS_HISS, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_FLY | M1_SEE_INVIS | M1_OMNIVORE, M2_HOSTILE | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_MAGENTA), + M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_MAGENTA), /* * imps & other minor demons/devils */ @@ -471,36 +471,36 @@ NEARDATA struct permonst mons[] = { A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, MS_SILENT, MZ_SMALL), MR_SLEEP | MR_POISON, 0, M1_POIS, - M2_HOSTILE | M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M2_HOSTILE | M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_RED), MON("homunculus", S_IMP, LVL(2, 12, 6, 10, -7), (G_GENO | 2), A(ATTK(AT_BITE, AD_SLEE, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(60, 100, MS_SILENT, MZ_TINY), MR_SLEEP | MR_POISON, MR_SLEEP | MR_POISON, M1_FLY | M1_POIS, M2_STALK, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GREEN), + M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_GREEN), MON("imp", S_IMP, LVL(3, 12, 2, 20, -7), (G_GENO | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 10, MS_CUSS, MZ_TINY), 0, 0, M1_REGEN, M2_WANDER | M2_STALK, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_RED), MON("lemure", S_IMP, LVL(3, 3, 7, 0, -7), (G_HELL | G_GENO | G_LGROUP | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 100, MS_SILENT, MZ_MEDIUM), MR_SLEEP | MR_POISON, MR_SLEEP, M1_POIS | M1_REGEN, M2_HOSTILE | M2_WANDER | M2_STALK | M2_NEUTER, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BROWN), + M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN), MON("quasit", S_IMP, LVL(3, 15, 2, 20, -7), (G_GENO | 2), A(ATTK(AT_CLAW, AD_DRDX, 1, 2), ATTK(AT_CLAW, AD_DRDX, 1, 2), ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 200, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_REGEN, - M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BLUE), + M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BLUE), MON("tengu", S_IMP, LVL(6, 13, 5, 30, 7), (G_GENO | 3), A(ATTK(AT_BITE, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 200, MS_SQAWK, MZ_SMALL), MR_POISON, MR_POISON, M1_TPORT | M1_TPORT_CNTRL, M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, - CLR_CYAN), + 7, CLR_CYAN), /* * jellies */ @@ -511,21 +511,21 @@ NEARDATA struct permonst mons[] = { MR_COLD | MR_POISON, M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, CLR_BLUE), + M2_HOSTILE | M2_NEUTER, 0, 5, CLR_BLUE), MON("spotted jelly", S_JELLY, LVL(5, 0, 8, 10, 0), (G_GENO | 1), A(ATTK(AT_NONE, AD_ACID, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_ACID | MR_STONE, 0, M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_ACID | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, CLR_GREEN), + M2_HOSTILE | M2_NEUTER, 0, 6, CLR_GREEN), MON("ochre jelly", S_JELLY, LVL(6, 3, 8, 20, 0), (G_GENO | 2), A(ATTK(AT_ENGL, AD_ACID, 3, 6), ATTK(AT_NONE, AD_ACID, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_ACID | MR_STONE, 0, M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_ACID | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, CLR_BROWN), + M2_HOSTILE | M2_NEUTER, 0, 8, CLR_BROWN), /* * kobolds */ @@ -534,26 +534,26 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(400, 100, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BROWN), + M3_INFRAVISIBLE | M3_INFRAVISION, 1, CLR_BROWN), MON("large kobold", S_KOBOLD, LVL(1, 6, 10, 0, -3), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_RED), MON("kobold lord", S_KOBOLD, LVL(2, 6, 10, 0, -4), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 200, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_LORD | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_LORD), MON("kobold shaman", S_KOBOLD, LVL(2, 6, 6, 10, -4), (G_GENO | 1), A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_MAGIC, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_ZAP), + M3_INFRAVISIBLE | M3_INFRAVISION, 4, HI_ZAP), /* * leprechauns */ @@ -561,7 +561,7 @@ NEARDATA struct permonst mons[] = { A(ATTK(AT_CLAW, AD_SGLD, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(60, 30, MS_LAUGH, MZ_TINY), 0, 0, M1_HUMANOID | M1_TPORT, - M2_HOSTILE | M2_GREEDY, M3_INFRAVISIBLE, CLR_GREEN), + M2_HOSTILE | M2_GREEDY, M3_INFRAVISIBLE, 4, CLR_GREEN), /* * mimics */ @@ -571,7 +571,7 @@ NEARDATA struct permonst mons[] = { SIZ(300, 200, MS_SILENT, MZ_MEDIUM), MR_ACID, 0, M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE | M1_CARNIVORE, - M2_HOSTILE, 0, CLR_BROWN), + M2_HOSTILE, 0, 8, CLR_BROWN), MON("large mimic", S_MIMIC, LVL(8, 3, 7, 10, 0), (G_GENO | 1), A(ATTK(AT_CLAW, AD_STCK, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -579,7 +579,7 @@ NEARDATA struct permonst mons[] = { M1_CLING | M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG, 0, CLR_RED), + M2_HOSTILE | M2_STRONG, 0, 9, CLR_RED), MON("giant mimic", S_MIMIC, LVL(9, 3, 7, 20, 0), (G_GENO | 1), A(ATTK(AT_CLAW, AD_STCK, 3, 6), ATTK(AT_CLAW, AD_STCK, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -587,7 +587,7 @@ NEARDATA struct permonst mons[] = { M1_CLING | M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG, 0, HI_LORD), + M2_HOSTILE | M2_STRONG, 0, 11, HI_LORD), /* * nymphs */ @@ -595,18 +595,18 @@ NEARDATA struct permonst mons[] = { A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT, - M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, CLR_GREEN), + M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, 5, CLR_GREEN), MON("water nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2), A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT | M1_SWIM, M2_HOSTILE | M2_FEMALE | M2_COLLECT, - M3_INFRAVISIBLE, CLR_BLUE), + M3_INFRAVISIBLE, 5, CLR_BLUE), MON("mountain nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2), A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT, - M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, CLR_BROWN), + M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, 5, CLR_BROWN), /* * orcs */ @@ -614,13 +614,13 @@ NEARDATA struct permonst mons[] = { A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_ORC | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GRAY), + M2_ORC | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 1, CLR_GRAY), MON("hobgoblin", S_ORC, LVL(1, 9, 10, 0, -4), (G_GENO | 2), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_ORC | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, - CLR_BROWN), + 3, CLR_BROWN), /* plain "orc" for zombie corpses only; not created at random */ MON("orc", S_ORC, LVL(1, 9, 10, 0, -3), (G_GENO | G_NOGEN | G_LGROUP), @@ -628,37 +628,37 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(850, 150, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_RED), MON("hill orc", S_ORC, LVL(2, 9, 10, 0, -4), (G_GENO | G_LGROUP | 2), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_YELLOW), + M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_YELLOW), MON("Mordor orc", S_ORC, LVL(3, 5, 10, 0, -5), (G_GENO | G_LGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BLUE), + M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BLUE), MON("Uruk-hai", S_ORC, LVL(3, 7, 10, 0, -4), (G_GENO | G_LGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BLACK), + M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BLACK), MON("orc shaman", S_ORC, LVL(3, 9, 5, 10, -5), (G_GENO | 1), A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 300, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_MAGIC, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_ZAP), + M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP), MON("orc-captain", S_ORC, LVL(5, 5, 10, 0, -5), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1350, 350, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION, 7, HI_LORD), /* * piercers */ @@ -668,21 +668,21 @@ NEARDATA struct permonst mons[] = { SIZ(200, 200, MS_SILENT, MZ_SMALL), 0, 0, M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE | M1_NOTAKE, - M2_HOSTILE, 0, CLR_GRAY), + M2_HOSTILE, 0, 4, CLR_GRAY), MON("iron piercer", S_PIERCER, LVL(5, 1, 0, 0, 0), (G_GENO | 2), A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 300, MS_SILENT, MZ_MEDIUM), 0, 0, M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE | M1_NOTAKE, - M2_HOSTILE, 0, CLR_CYAN), + M2_HOSTILE, 0, 6, CLR_CYAN), MON("glass piercer", S_PIERCER, LVL(7, 1, 0, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 300, MS_SILENT, MZ_MEDIUM), MR_ACID, 0, M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE | M1_NOTAKE, - M2_HOSTILE, 0, CLR_WHITE), + M2_HOSTILE, 0, 9, CLR_WHITE), /* * quadrupeds */ @@ -691,43 +691,43 @@ NEARDATA struct permonst mons[] = { ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 100, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_BROWN), + 4, CLR_BROWN), MON("mumak", S_QUADRUPED, LVL(5, 9, 0, 0, -2), (G_GENO | 1), A(ATTK(AT_BUTT, AD_PHYS, 4, 12), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 500, MS_ROAR, MZ_LARGE), 0, 0, M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, CLR_GRAY), + M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 7, CLR_GRAY), MON("leocrotta", S_QUADRUPED, LVL(6, 18, 4, 10, 0), (G_GENO | 2), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 500, MS_IMITATE, MZ_LARGE), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE | M2_STRONG, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE, 8, CLR_RED), MON("wumpus", S_QUADRUPED, LVL(8, 3, 2, 10, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 500, MS_BURBLE, MZ_LARGE), 0, 0, M1_CLING | M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, CLR_CYAN), + M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 9, CLR_CYAN), MON("titanothere", S_QUADRUPED, LVL(12, 12, 6, 0, 0), (G_GENO | 2), A(ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2650, 650, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, CLR_GRAY), + M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 13, CLR_GRAY), MON("baluchitherium", S_QUADRUPED, LVL(14, 12, 5, 0, 0), (G_GENO | 2), A(ATTK(AT_CLAW, AD_PHYS, 5, 4), ATTK(AT_CLAW, AD_PHYS, 5, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(3800, 800, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, CLR_GRAY), + M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 15, CLR_GRAY), MON("mastodon", S_QUADRUPED, LVL(20, 12, 5, 0, 0), (G_GENO | 1), A(ATTK(AT_BUTT, AD_PHYS, 4, 8), ATTK(AT_BUTT, AD_PHYS, 4, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(3800, 800, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, CLR_BLACK), + M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_BLACK), /* * rodents */ @@ -736,32 +736,32 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(20, 12, MS_SQEEK, MZ_TINY), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_BROWN), + 1, CLR_BROWN), MON("giant rat", S_RODENT, LVL(1, 10, 7, 0, 0), (G_GENO | G_SGROUP | 2), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, MS_SQEEK, MZ_TINY), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_BROWN), + 2, CLR_BROWN), MON("rabid rat", S_RODENT, LVL(2, 12, 6, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_DRCO, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 5, MS_SQEEK, MZ_TINY), MR_POISON, 0, M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_CARNIVORE, M2_HOSTILE, - M3_INFRAVISIBLE, CLR_BROWN), + M3_INFRAVISIBLE, 4, CLR_BROWN), MON("wererat", S_RODENT, LVL(2, 12, 6, 10, -7), (G_NOGEN | G_NOCORPSE), A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(40, 30, MS_SQEEK, MZ_TINY), MR_POISON, 0, M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE, - M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), + M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN), MON("rock mole", S_RODENT, LVL(3, 3, 0, 20, 0), (G_GENO | 2), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, MS_SILENT, MZ_SMALL), 0, 0, M1_TUNNEL | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE, M2_HOSTILE | M2_GREEDY | M2_JEWELS | M2_COLLECT, M3_INFRAVISIBLE, - CLR_GRAY), + 4, CLR_GRAY), MON("woodchuck", S_RODENT, LVL(3, 3, 0, 20, 0), (G_NOGEN | G_GENO), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -769,7 +769,7 @@ NEARDATA struct permonst mons[] = { M1_TUNNEL /*LOGGING*/ | M1_ANIMAL | M1_NOHANDS | M1_SWIM | M1_HERBIVORE, /* In reality, they tunnel instead of cutting lumber. Oh, well. */ - M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), + M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN), /* * spiders & scorpions (keep webmaker() in sync if new critters are added) */ @@ -778,26 +778,26 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(50, 50, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, - M2_HOSTILE, 0, CLR_GRAY), + M2_HOSTILE, 0, 3, CLR_GRAY), MON("centipede", S_SPIDER, LVL(2, 4, 3, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 50, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, - M2_HOSTILE, 0, CLR_YELLOW), + M2_HOSTILE, 0, 4, CLR_YELLOW), MON("giant spider", S_SPIDER, LVL(5, 15, 4, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG, 0, CLR_MAGENTA), + M2_HOSTILE | M2_STRONG, 0, 7, CLR_MAGENTA), MON("scorpion", S_SPIDER, LVL(5, 15, 3, 0, 0), (G_GENO | 2), A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_STNG, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 100, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE, - M2_HOSTILE, 0, CLR_RED), + M2_HOSTILE, 0, 8, CLR_RED), /* * trappers, lurkers, &c */ @@ -807,14 +807,14 @@ NEARDATA struct permonst mons[] = { SIZ(800, 350, MS_SILENT, MZ_HUGE), 0, 0, M1_HIDE | M1_FLY | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_CARNIVORE, - M2_HOSTILE | M2_STALK | M2_STRONG, 0, CLR_GRAY), + M2_HOSTILE | M2_STALK | M2_STRONG, 0, 12, CLR_GRAY), MON("trapper", S_TRAPPER, LVL(12, 3, 3, 0, 0), (G_GENO | 2), A(ATTK(AT_ENGL, AD_DGST, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 350, MS_SILENT, MZ_HUGE), 0, 0, M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_CARNIVORE, - M2_HOSTILE | M2_STALK | M2_STRONG, 0, CLR_GREEN), + M2_HOSTILE | M2_STALK | M2_STRONG, 0, 14, CLR_GREEN), /* * unicorns and horses */ @@ -823,37 +823,37 @@ NEARDATA struct permonst mons[] = { NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 250, MS_NEIGH, MZ_MEDIUM), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE, - M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BROWN), + M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 4, CLR_BROWN), MON("white unicorn", S_UNICORN, LVL(4, 24, 2, 70, 7), (G_GENO | 2), A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON, M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS, - M3_INFRAVISIBLE, CLR_WHITE), + M3_INFRAVISIBLE, 6, CLR_WHITE), MON("gray unicorn", S_UNICORN, LVL(4, 24, 2, 70, 0), (G_GENO | 1), A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON, M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS, - M3_INFRAVISIBLE, CLR_GRAY), + M3_INFRAVISIBLE, 6, CLR_GRAY), MON("black unicorn", S_UNICORN, LVL(4, 24, 2, 70, -7), (G_GENO | 1), A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON, M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS, - M3_INFRAVISIBLE, CLR_BLACK), + M3_INFRAVISIBLE, 6, CLR_BLACK), MON("horse", S_UNICORN, LVL(5, 20, 5, 0, 0), (G_GENO | 2), A(ATTK(AT_KICK, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 300, MS_NEIGH, MZ_LARGE), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE, - M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BROWN), + M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 7, CLR_BROWN), MON("warhorse", S_UNICORN, LVL(7, 24, 4, 0, 0), (G_GENO | 2), A(ATTK(AT_KICK, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1800, 350, MS_NEIGH, MZ_LARGE), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE, - M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BROWN), + M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 9, CLR_BROWN), /* * vortices */ @@ -863,14 +863,14 @@ NEARDATA struct permonst mons[] = { SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP | MR_POISON | MR_STONE, 0, M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_AMORPHOUS | M1_UNSOLID, - M2_HOSTILE | M2_NEUTER, 0, CLR_GRAY), + M2_HOSTILE | M2_NEUTER, 0, 4, CLR_GRAY), MON("dust vortex", S_VORTEX, LVL(4, 20, 2, 30, 0), (G_GENO | G_NOCORPSE | 2), A(ATTK(AT_ENGL, AD_BLND, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP | MR_POISON | MR_STONE, 0, M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, - M2_HOSTILE | M2_NEUTER, 0, CLR_BROWN), + M2_HOSTILE | M2_NEUTER, 0, 6, CLR_BROWN), MON("ice vortex", S_VORTEX, LVL(5, 20, 2, 30, 0), (G_NOHELL | G_GENO | G_NOCORPSE | 1), A(ATTK(AT_ENGL, AD_COLD, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -879,7 +879,7 @@ NEARDATA struct permonst mons[] = { MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0, M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_CYAN), + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 7, CLR_CYAN), MON("energy vortex", S_VORTEX, LVL(6, 20, 2, 30, 0), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_ENGL, AD_ELEC, 1, 6), ATTK(AT_ENGL, AD_DREN, 2, 6), @@ -888,7 +888,7 @@ NEARDATA struct permonst mons[] = { MR_ELEC | MR_SLEEP | MR_DISINT | MR_POISON | MR_STONE, 0, M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID, - M2_HOSTILE | M2_NEUTER, 0, HI_ZAP), + M2_HOSTILE | M2_NEUTER, 0, 9, HI_ZAP), MON("steam vortex", S_VORTEX, LVL(7, 22, 2, 30, 0), (G_HELL | G_GENO | G_NOCORPSE | 2), A(ATTK(AT_ENGL, AD_FIRE, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -897,7 +897,7 @@ NEARDATA struct permonst mons[] = { MR_FIRE | MR_SLEEP | MR_POISON | MR_STONE, 0, M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_BLUE), + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_BLUE), MON("fire vortex", S_VORTEX, LVL(8, 22, 2, 30, 0), (G_HELL | G_GENO | G_NOCORPSE | 1), A(ATTK(AT_ENGL, AD_FIRE, 1, 10), ATTK(AT_NONE, AD_FIRE, 0, 4), @@ -906,7 +906,7 @@ NEARDATA struct permonst mons[] = { MR_FIRE | MR_SLEEP | MR_POISON | MR_STONE, 0, M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_YELLOW), + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 10, CLR_YELLOW), /* * worms */ @@ -915,26 +915,26 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(600, 250, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE | M1_NOTAKE, - M2_HOSTILE, 0, CLR_BROWN), + M2_HOSTILE, 0, 6, CLR_BROWN), MON("baby purple worm", S_WORM, LVL(8, 3, 5, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 250, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE, M2_HOSTILE, 0, - CLR_MAGENTA), + 9, CLR_MAGENTA), MON("long worm", S_WORM, LVL(9, 3, 5, 10, 0), (G_GENO | 2), A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, MS_SILENT, MZ_GIGANTIC), 0, 0, M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE, - M2_HOSTILE | M2_STRONG | M2_NASTY, 0, CLR_BROWN), + M2_HOSTILE | M2_STRONG | M2_NASTY, 0, 10, CLR_BROWN), MON("purple worm", S_WORM, LVL(15, 9, 6, 20, 0), (G_GENO | 2), A(ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_ENGL, AD_DGST, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2700, 700, MS_SILENT, MZ_GIGANTIC), 0, 0, M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_OVIPAROUS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY, 0, CLR_MAGENTA), + M2_HOSTILE | M2_STRONG | M2_NASTY, 0, 17, CLR_MAGENTA), /* * xan, &c */ @@ -943,13 +943,13 @@ NEARDATA struct permonst mons[] = { A(ATTK(AT_BITE, AD_ELEC, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(15, 10, MS_BUZZ, MZ_TINY), MR_ELEC | MR_POISON, 0, M1_ANIMAL, - M2_HOSTILE, M3_INFRAVISIBLE, CLR_MAGENTA), + M2_HOSTILE, M3_INFRAVISIBLE, 1, CLR_MAGENTA), MON("xan", S_XAN, LVL(7, 18, -4, 0, 0), (G_GENO | 3), A(ATTK(AT_STNG, AD_LEGS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 300, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS, M2_HOSTILE, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE, 9, CLR_RED), /* * lights */ @@ -961,7 +961,7 @@ NEARDATA struct permonst mons[] = { | MR_ACID | MR_STONE, 0, M1_FLY | M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_YELLOW), + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 5, CLR_YELLOW), MON("black light", S_LIGHT, LVL(5, 15, 0, 0, 0), (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_HALU, 10, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -971,7 +971,7 @@ NEARDATA struct permonst mons[] = { 0, M1_FLY | M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID | M1_SEE_INVIS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, CLR_BLACK), + M2_HOSTILE | M2_NEUTER, 0, 7, CLR_BLACK), /* * zruty */ @@ -980,7 +980,7 @@ NEARDATA struct permonst mons[] = { ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 600, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, - M3_INFRAVISIBLE, CLR_BROWN), + M3_INFRAVISIBLE, 11, CLR_BROWN), /* * Angels and other lawful minions */ @@ -991,7 +991,7 @@ NEARDATA struct permonst mons[] = { SIZ(900, 400, MS_HISS, MZ_LARGE), MR_POISON, 0, M1_FLY | M1_NOHANDS | M1_SLITHY | M1_POIS, M2_MINION | M2_STALK | M2_STRONG | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GREEN), + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_GREEN), MON("Aleax", S_ANGEL, LVL(10, 8, 0, 30, 7), (G_NOHELL | G_NOCORPSE | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), @@ -999,7 +999,7 @@ NEARDATA struct permonst mons[] = { MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, M1_HUMANOID | M1_SEE_INVIS, M2_MINION | M2_STALK | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_YELLOW), + M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_YELLOW), /* Angels start with the emin extension attached, and usually have the isminion flag set; however, non-minion Angels can be tamed and will switch to edog (guardian Angel is handled specially and @@ -1013,7 +1013,7 @@ NEARDATA struct permonst mons[] = { MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, M1_FLY | M1_HUMANOID | M1_SEE_INVIS, M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_WHITE), + M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_WHITE), MON("ki-rin", S_ANGEL, LVL(16, 18, -5, 90, 15), (G_NOHELL | G_NOCORPSE | 1), A(ATTK(AT_KICK, AD_PHYS, 2, 4), ATTK(AT_KICK, AD_PHYS, 2, 4), @@ -1022,7 +1022,7 @@ NEARDATA struct permonst mons[] = { SIZ(WT_HUMAN, 400, MS_NEIGH, MZ_LARGE), 0, 0, M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_SEE_INVIS, M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_LORD, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_GOLD), + M3_INFRAVISIBLE | M3_INFRAVISION, 21, HI_GOLD), MON("Archon", S_ANGEL, LVL(19, 16, -6, 80, 15), (G_NOHELL | G_NOCORPSE | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), @@ -1033,7 +1033,7 @@ NEARDATA struct permonst mons[] = { M1_FLY | M1_HUMANOID | M1_SEE_INVIS | M1_REGEN, M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_LORD | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION, 26, HI_LORD), /* * Bats */ @@ -1042,25 +1042,25 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(20, 20, MS_SQEEK, MZ_TINY), 0, 0, M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_WANDER, - M3_INFRAVISIBLE, CLR_BROWN), + M3_INFRAVISIBLE, 2, CLR_BROWN), MON("giant bat", S_BAT, LVL(2, 22, 7, 0, 0), (G_GENO | 2), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, MS_SQEEK, MZ_SMALL), 0, 0, M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, CLR_RED), + M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 3, CLR_RED), MON("raven", S_BAT, LVL(4, 20, 6, 0, 0), (G_GENO | 2), A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_BLND, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(40, 20, MS_SQAWK, MZ_SMALL), 0, 0, M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), + M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 6, CLR_BLACK), MON("vampire bat", S_BAT, LVL(5, 20, 6, 0, 0), (G_GENO | 2), A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRST, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 20, MS_SQEEK, MZ_SMALL), MR_SLEEP | MR_POISON, 0, M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_REGEN | M1_OMNIVORE, - M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), + M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BLACK), /* * Centaurs */ @@ -1069,19 +1069,19 @@ NEARDATA struct permonst mons[] = { NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 500, MS_HUMANOID, MZ_LARGE), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT, - M3_INFRAVISIBLE, CLR_BROWN), + M3_INFRAVISIBLE, 6, CLR_BROWN), MON("forest centaur", S_CENTAUR, LVL(5, 18, 3, 10, -1), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2550, 600, MS_HUMANOID, MZ_LARGE), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT, - M3_INFRAVISIBLE, CLR_GREEN), + M3_INFRAVISIBLE, 8, CLR_GREEN), MON("mountain centaur", S_CENTAUR, LVL(6, 20, 2, 10, -3), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 10), ATTK(AT_KICK, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2550, 500, MS_HUMANOID, MZ_LARGE), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT, - M3_INFRAVISIBLE, CLR_CYAN), + M3_INFRAVISIBLE, 9, CLR_CYAN), /* * Dragons */ @@ -1099,13 +1099,13 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, CLR_GRAY), + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_GRAY), MON("baby silver dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, DRAGON_SILVER), + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, DRAGON_SILVER), #if 0 /* DEFERRED */ MON("baby shimmering dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, @@ -1113,7 +1113,7 @@ NEARDATA struct permonst mons[] = { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, CLR_CYAN), + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_CYAN), #endif MON("baby red dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -1121,43 +1121,43 @@ NEARDATA struct permonst mons[] = { SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_FIRE, 0, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, M3_INFRAVISIBLE, - CLR_RED), + 13, CLR_RED), MON("baby white dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_COLD, 0, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, CLR_WHITE), + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_WHITE), MON("baby orange dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_SLEEP, 0, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, CLR_ORANGE), + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_ORANGE), MON("baby black dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_DISINT, 0, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, CLR_BLACK), + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_BLACK), MON("baby blue dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_ELEC, 0, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, CLR_BLUE), + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_BLUE), MON("baby green dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_POISON, 0, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_POIS, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, CLR_GREEN), + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_GREEN), MON("baby yellow dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_ACID | MR_STONE, 0, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_ACID, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, CLR_YELLOW), + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_YELLOW), MON("gray dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1), A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, @@ -1166,7 +1166,7 @@ NEARDATA struct permonst mons[] = { M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, CLR_GRAY), + 0, 20, CLR_GRAY), MON("silver dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1), A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, @@ -1175,7 +1175,7 @@ NEARDATA struct permonst mons[] = { M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, DRAGON_SILVER), + 0, 20, DRAGON_SILVER), #if 0 /* DEFERRED */ MON("shimmering dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1), @@ -1186,7 +1186,7 @@ NEARDATA struct permonst mons[] = { M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, CLR_CYAN), + 0, 20, CLR_CYAN), #endif MON("red dragon", S_DRAGON, LVL(15, 9, -1, 20, -4), (G_GENO | 1), A(ATTK(AT_BREA, AD_FIRE, 6, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), @@ -1196,7 +1196,7 @@ NEARDATA struct permonst mons[] = { M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE, 20, CLR_RED), MON("white dragon", S_DRAGON, LVL(15, 9, -1, 20, -5), (G_GENO | 1), A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, @@ -1205,7 +1205,7 @@ NEARDATA struct permonst mons[] = { M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, CLR_WHITE), + 0, 20, CLR_WHITE), MON("orange dragon", S_DRAGON, LVL(15, 9, -1, 20, 5), (G_GENO | 1), A(ATTK(AT_BREA, AD_SLEE, 4, 25), ATTK(AT_BITE, AD_PHYS, 3, 8), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, @@ -1214,7 +1214,7 @@ NEARDATA struct permonst mons[] = { M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, CLR_ORANGE), + 0, 20, CLR_ORANGE), /* disintegration breath is actually all or nothing, not 1d255 */ MON("black dragon", S_DRAGON, LVL(15, 9, -1, 20, -6), (G_GENO | 1), A(ATTK(AT_BREA, AD_DISN, 1, 255), ATTK(AT_BITE, AD_PHYS, 3, 8), @@ -1224,7 +1224,7 @@ NEARDATA struct permonst mons[] = { M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, CLR_BLACK), + 0, 20, CLR_BLACK), MON("blue dragon", S_DRAGON, LVL(15, 9, -1, 20, -7), (G_GENO | 1), A(ATTK(AT_BREA, AD_ELEC, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, @@ -1233,7 +1233,7 @@ NEARDATA struct permonst mons[] = { M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, CLR_BLUE), + 0, 20, CLR_BLUE), MON("green dragon", S_DRAGON, LVL(15, 9, -1, 20, 6), (G_GENO | 1), A(ATTK(AT_BREA, AD_DRST, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, @@ -1242,7 +1242,7 @@ NEARDATA struct permonst mons[] = { M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS | M1_CARNIVORE | M1_POIS, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, CLR_GREEN), + 0, 20, CLR_GREEN), MON("yellow dragon", S_DRAGON, LVL(15, 9, -1, 20, 7), (G_GENO | 1), A(ATTK(AT_BREA, AD_ACID, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, @@ -1251,7 +1251,7 @@ NEARDATA struct permonst mons[] = { MR_STONE, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS | M1_CARNIVORE | M1_ACID, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, CLR_YELLOW), + 0, 20, CLR_YELLOW), /* * Elementals */ @@ -1261,21 +1261,21 @@ NEARDATA struct permonst mons[] = { SIZ(900, 400, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL | M1_FLY | M1_SEE_INVIS, M2_WANDER | M2_STALK | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, - CLR_WHITE), + 9, CLR_WHITE), MON("air elemental", S_ELEMENTAL, LVL(8, 36, 2, 30, 0), (G_NOCORPSE | 1), A(ATTK(AT_ENGL, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_POISON | MR_STONE, 0, M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS | M1_UNSOLID | M1_FLY, - M2_STRONG | M2_NEUTER, 0, CLR_CYAN), + M2_STRONG | M2_NEUTER, 0, 10, CLR_CYAN), MON("fire elemental", S_ELEMENTAL, LVL(8, 12, 2, 30, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_FIRE, 3, 6), ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_FIRE | MR_POISON | MR_STONE, 0, M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS | M1_UNSOLID | M1_FLY | M1_NOTAKE, - M2_STRONG | M2_NEUTER, M3_INFRAVISIBLE, CLR_YELLOW), + M2_STRONG | M2_NEUTER, M3_INFRAVISIBLE, 10, CLR_YELLOW), MON("earth elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -1283,14 +1283,14 @@ NEARDATA struct permonst mons[] = { MR_FIRE | MR_COLD | MR_POISON | MR_STONE, 0, M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS | M1_WALLWALK | M1_THICK_HIDE, - M2_STRONG | M2_NEUTER, 0, CLR_BROWN), + M2_STRONG | M2_NEUTER, 0, 10, CLR_BROWN), MON("water elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 0, MS_SILENT, MZ_HUGE), MR_POISON | MR_STONE, 0, M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS | M1_UNSOLID | M1_AMPHIBIOUS | M1_SWIM, - M2_STRONG | M2_NEUTER, 0, CLR_BLUE), + M2_STRONG | M2_NEUTER, 0, 10, CLR_BLUE), /* * Fungi */ @@ -1300,7 +1300,7 @@ NEARDATA struct permonst mons[] = { SIZ(20, 200, MS_SILENT, MZ_SMALL), 0, 0, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, CLR_BRIGHT_GREEN), + M2_HOSTILE | M2_NEUTER, 0, 1, CLR_BRIGHT_GREEN), /* mildew: M1_NOEYES - should be blind but doesn't play well */ MON("mildew", S_FUNGUS, LVL(2, 1, 9, 0, 0), (G_NOGEN|G_NOCORPSE), @@ -1315,41 +1315,41 @@ NEARDATA struct permonst mons[] = { SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_COLD | MR_POISON, MR_COLD | MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, CLR_BROWN), + M2_HOSTILE | M2_NEUTER, 0, 2, CLR_BROWN), MON("yellow mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 2), A(ATTK(AT_NONE, AD_STUN, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_POIS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, CLR_YELLOW), + M2_HOSTILE | M2_NEUTER, 0, 2, CLR_YELLOW), MON("green mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1), A(ATTK(AT_NONE, AD_ACID, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_ACID | MR_STONE, MR_STONE, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_ACID | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, CLR_GREEN), + M2_HOSTILE | M2_NEUTER, 0, 2, CLR_GREEN), MON("red mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1), A(ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_FIRE | MR_POISON, MR_FIRE | MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_RED), + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 2, CLR_RED), MON("shrieker", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_GENO | 1), A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, MS_SHRIEK, MZ_SMALL), MR_POISON, MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, CLR_MAGENTA), + M2_HOSTILE | M2_NEUTER, 0, 2, CLR_MAGENTA), MON("violet fungus", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_GENO | 2), A(ATTK(AT_TUCH, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, CLR_MAGENTA), + M2_HOSTILE | M2_NEUTER, 0, 5, CLR_MAGENTA), /* * Gnomes */ @@ -1358,24 +1358,24 @@ NEARDATA struct permonst mons[] = { NO_ATTK), SIZ(650, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_GNOME | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, - CLR_BROWN), + 3, CLR_BROWN), MON("gnome lord", S_GNOME, LVL(3, 8, 10, 4, 0), (G_GENO | 2), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_GNOME | M2_LORD | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BLUE), + M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_BLUE), MON("gnomish wizard", S_GNOME, LVL(3, 10, 4, 10, 0), (G_GENO | 1), A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_GNOME | M2_MAGIC, M3_INFRAVISIBLE | M3_INFRAVISION, HI_ZAP), + M2_GNOME | M2_MAGIC, M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP), MON("gnome king", S_GNOME, LVL(5, 10, 10, 20, 0), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 150, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_GNOME | M2_PRINCE | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION, 6, HI_LORD), #ifdef SPLITMON_1 }; #endif @@ -1404,28 +1404,28 @@ struct permonst _mons2[] = { SIZ(2250, 750, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_RED), MON("stone giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_GENO | G_SGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2250, 750, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GRAY), + M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY), MON("hill giant", S_GIANT, LVL(8, 10, 6, 0, -2), (G_GENO | G_SGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2200, 700, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_CYAN), + M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_CYAN), MON("fire giant", S_GIANT, LVL(9, 12, 4, 5, 2), (G_GENO | G_SGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_FIRE, MR_FIRE, M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_YELLOW), + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_YELLOW), MON("frost giant", S_GIANT, LVL(10, 12, 3, 10, -3), (G_NOHELL | G_GENO | G_SGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -1433,35 +1433,35 @@ struct permonst _mons2[] = { SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_COLD, MR_COLD, M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_WHITE), + M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_WHITE), MON("ettin", S_GIANT, LVL(10, 12, 3, 0, 0), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 500, MS_GRUNT, MZ_HUGE), 0, 0, M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BROWN), + M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_BROWN), MON("storm giant", S_GIANT, LVL(16, 12, 3, 10, -3), (G_GENO | G_SGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_ELEC, MR_ELEC, M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BLUE), + M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_BLUE), MON("titan", S_GIANT, LVL(16, 18, -3, 70, 9), (1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2300, 900, MS_SPELL, MZ_HUGE), 0, 0, M1_FLY | M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_MAGENTA), + M3_INFRAVISIBLE | M3_INFRAVISION, 20, CLR_MAGENTA), MON("minotaur", S_GIANT, LVL(15, 15, 6, 0, 0), (G_GENO | G_NOGEN), A(ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_BUTT, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 700, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE | M3_INFRAVISION, - CLR_BROWN), + 17, CLR_BROWN), /* 'I' is a visual marker for all invisible monsters and must be unused */ /* * Jabberwock @@ -1475,7 +1475,7 @@ struct permonst _mons2[] = { SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0, M1_ANIMAL | M1_FLY | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE, - CLR_ORANGE), + 18, CLR_ORANGE), #if 0 /* DEFERRED */ MON("vorpal jabberwock", S_JABBERWOCK, LVL(20, 12, -2, 50, 0), (G_GENO | 1), @@ -1485,7 +1485,7 @@ struct permonst _mons2[] = { SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0, M1_ANIMAL | M1_FLY | M1_CARNIVORE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE, - HI_LORD), + 25, HI_LORD), #endif /* * Kops @@ -1496,26 +1496,26 @@ struct permonst _mons2[] = { NO_ATTK), SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, CLR_BLUE), + M3_INFRAVISIBLE, 3, CLR_BLUE), MON("Kop Sergeant", S_KOP, LVL(2, 8, 10, 10, 10), (G_GENO | G_SGROUP | G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, CLR_BLUE), + M3_INFRAVISIBLE, 4, CLR_BLUE), MON("Kop Lieutenant", S_KOP, LVL(3, 10, 10, 20, 11), (G_GENO | G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, CLR_CYAN), + M3_INFRAVISIBLE, 5, CLR_CYAN), MON("Kop Kaptain", S_KOP, LVL(4, 12, 10, 20, 12), (G_GENO | G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, HI_LORD), + M3_INFRAVISIBLE, 6, HI_LORD), /* * Liches */ @@ -1524,14 +1524,14 @@ struct permonst _mons2[] = { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, - M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, CLR_BROWN), + M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, 14, CLR_BROWN), MON("demilich", S_LICH, LVL(14, 9, -2, 60, -12), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_TUCH, AD_COLD, 3, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, - M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, CLR_RED), + M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, 18, CLR_RED), MON("master lich", S_LICH, LVL(17, 9, -4, 90, -15), (G_HELL | G_GENO | G_NOCORPSE | 1), A(ATTK(AT_TUCH, AD_COLD, 3, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, @@ -1540,7 +1540,7 @@ struct permonst _mons2[] = { MR_FIRE | MR_COLD | MR_SLEEP | MR_POISON, MR_FIRE | MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION, - HI_LORD), + 21, HI_LORD), MON("arch-lich", S_LICH, LVL(25, 9, -6, 90, -15), (G_HELL | G_GENO | G_NOCORPSE | 1), A(ATTK(AT_TUCH, AD_COLD, 5, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, @@ -1549,7 +1549,7 @@ struct permonst _mons2[] = { MR_FIRE | MR_COLD | MR_SLEEP | MR_ELEC | MR_POISON, MR_FIRE | MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION, - HI_LORD), + 29, HI_LORD), /* * Mummies */ @@ -1558,33 +1558,33 @@ struct permonst _mons2[] = { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, CLR_BROWN), + M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, 4, CLR_BROWN), MON("gnome mummy", S_MUMMY, LVL(4, 10, 6, 20, -3), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(650, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE | M2_GNOME, M3_INFRAVISION, CLR_RED), + M2_UNDEAD | M2_HOSTILE | M2_GNOME, M3_INFRAVISION, 5, CLR_RED), MON("orc mummy", S_MUMMY, LVL(5, 10, 5, 20, -4), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 75, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, M2_UNDEAD | M2_HOSTILE | M2_ORC | M2_GREEDY | M2_JEWELS, - M3_INFRAVISION, CLR_GRAY), + M3_INFRAVISION, 6, CLR_GRAY), MON("dwarf mummy", S_MUMMY, LVL(5, 10, 5, 20, -4), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 150, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, M2_UNDEAD | M2_HOSTILE | M2_DWARF | M2_GREEDY | M2_JEWELS, - M3_INFRAVISION, CLR_RED), + M3_INFRAVISION, 6, CLR_RED), MON("elf mummy", S_MUMMY, LVL(6, 12, 4, 30, -5), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 175, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE | M2_ELF, M3_INFRAVISION, CLR_GREEN), + M2_UNDEAD | M2_HOSTILE | M2_ELF, M3_INFRAVISION, 7, CLR_GREEN), MON("human mummy", S_MUMMY, LVL(6, 12, 4, 30, -5), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK, @@ -1592,14 +1592,14 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 200, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, CLR_GRAY), + M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, 7, CLR_GRAY), MON("ettin mummy", S_MUMMY, LVL(7, 12, 4, 30, -6), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 250, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, CLR_BLUE), + M2_UNDEAD | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, 8, CLR_BLUE), MON("giant mummy", S_MUMMY, LVL(8, 14, 3, 30, -7), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, @@ -1607,7 +1607,7 @@ struct permonst _mons2[] = { SIZ(2050, 375, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, M2_UNDEAD | M2_HOSTILE | M2_GIANT | M2_STRONG | M2_JEWELS, - M3_INFRAVISION, CLR_CYAN), + M3_INFRAVISION, 10, CLR_CYAN), /* * Nagas */ @@ -1617,33 +1617,33 @@ struct permonst _mons2[] = { SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_FIRE | MR_POISON, MR_FIRE | MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, M3_INFRAVISIBLE, CLR_RED), + M2_STRONG, M3_INFRAVISIBLE, 4, CLR_RED), MON("black naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON | MR_ACID | MR_STONE, MR_POISON | MR_STONE, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_ACID | M1_NOTAKE | M1_CARNIVORE, - M2_STRONG, 0, CLR_BLACK), + M2_STRONG, 0, 4, CLR_BLACK), MON("golden naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, 0, HI_GOLD), + M2_STRONG, 0, 4, HI_GOLD), MON("guardian naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, 0, CLR_GREEN), + M2_STRONG, 0, 4, CLR_GREEN), MON("red naga", S_NAGA, LVL(6, 12, 4, 0, -4), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_FIRE | MR_POISON, MR_FIRE | MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, M3_INFRAVISIBLE, CLR_RED), + M2_STRONG, M3_INFRAVISIBLE, 8, CLR_RED), MON("black naga", S_NAGA, LVL(8, 14, 2, 10, 4), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_SPIT, AD_ACID, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -1651,21 +1651,21 @@ struct permonst _mons2[] = { MR_POISON | MR_STONE, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_ACID | M1_NOTAKE | M1_CARNIVORE, - M2_STRONG, 0, CLR_BLACK), + M2_STRONG, 0, 10, CLR_BLACK), MON("golden naga", S_NAGA, LVL(10, 14, 2, 70, 5), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, 0, HI_GOLD), + M2_STRONG, 0, 13, HI_GOLD), MON("guardian naga", S_NAGA, LVL(12, 16, 0, 50, 7), (G_GENO | 1), A(ATTK(AT_BITE, AD_PLYS, 1, 6), ATTK(AT_SPIT, AD_DRST, 1, 6), ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_POIS | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, 0, CLR_GREEN), + M2_STRONG, 0, 16, CLR_GREEN), /* * Ogres */ @@ -1674,19 +1674,19 @@ struct permonst _mons2[] = { NO_ATTK), SIZ(1600, 500, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BROWN), + M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BROWN), MON("ogre lord", S_OGRE, LVL(7, 12, 3, 30, -5), (G_GENO | 2), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 700, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, M2_STRONG | M2_LORD | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_RED), MON("ogre king", S_OGRE, LVL(9, 14, 4, 60, -7), (G_GENO | 2), A(ATTK(AT_WEAP, AD_PHYS, 3, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 750, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, M2_STRONG | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD), /* * Puddings * @@ -1700,7 +1700,7 @@ struct permonst _mons2[] = { MR_FIRE | MR_COLD | MR_POISON, M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_OMNIVORE | M1_ACID, - M2_HOSTILE | M2_NEUTER, 0, CLR_GRAY), + M2_HOSTILE | M2_NEUTER, 0, 4, CLR_GRAY), MON("brown pudding", S_PUDDING, LVL(5, 3, 8, 0, 0), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_BITE, AD_DCAY, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -1709,7 +1709,7 @@ struct permonst _mons2[] = { MR_COLD | MR_ELEC | MR_POISON, M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_OMNIVORE | M1_ACID, - M2_HOSTILE | M2_NEUTER, 0, CLR_BROWN), + M2_HOSTILE | M2_NEUTER, 0, 6, CLR_BROWN), MON("green slime", S_PUDDING, LVL(6, 6, 6, 0, 0), (G_HELL | G_GENO | G_NOCORPSE | 1), A(ATTK(AT_TUCH, AD_SLIM, 1, 4), ATTK(AT_NONE, AD_SLIM, 0, 0), NO_ATTK, @@ -1718,7 +1718,7 @@ struct permonst _mons2[] = { MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE, 0, M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_OMNIVORE | M1_ACID | M1_POIS, - M2_HOSTILE | M2_NEUTER, 0, CLR_GREEN), + M2_HOSTILE | M2_NEUTER, 0, 8, CLR_GREEN), MON("black pudding", S_PUDDING, LVL(10, 6, 6, 0, 0), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0), NO_ATTK, @@ -1728,7 +1728,7 @@ struct permonst _mons2[] = { MR_COLD | MR_ELEC | MR_POISON, M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_OMNIVORE | M1_ACID, - M2_HOSTILE | M2_NEUTER, 0, CLR_BLACK), + M2_HOSTILE | M2_NEUTER, 0, 12, CLR_BLACK), /* * Quantum mechanics */ @@ -1737,7 +1737,7 @@ struct permonst _mons2[] = { NO_ATTK), SIZ(WT_HUMAN, 20, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID | M1_OMNIVORE | M1_POIS | M1_TPORT, M2_HOSTILE, - M3_INFRAVISIBLE, CLR_CYAN), + M3_INFRAVISIBLE, 9, CLR_CYAN), /* * Rust monster or disenchanter */ @@ -1746,13 +1746,13 @@ struct permonst _mons2[] = { ATTK(AT_NONE, AD_RUST, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 250, MS_SILENT, MZ_MEDIUM), 0, 0, M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE, M2_HOSTILE, - M3_INFRAVISIBLE, CLR_BROWN), + M3_INFRAVISIBLE, 8, CLR_BROWN), MON("disenchanter", S_RUSTMONST, LVL(12, 12, -10, 0, -3), (G_HELL | G_GENO | 2), A(ATTK(AT_CLAW, AD_ENCH, 4, 4), ATTK(AT_NONE, AD_ENCH, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 200, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_CARNIVORE, - M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLUE), + M2_HOSTILE, M3_INFRAVISIBLE, 14, CLR_BLUE), /* * Snakes */ @@ -1762,14 +1762,14 @@ struct permonst _mons2[] = { SIZ(50, 60, MS_HISS, MZ_TINY), 0, 0, M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE, - 0, 0, CLR_GREEN), + 0, 0, 3, CLR_GREEN), MON("snake", S_SNAKE, LVL(4, 15, 3, 0, 0), (G_GENO | 2), A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 80, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON, M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE, - M2_HOSTILE, 0, CLR_BROWN), + M2_HOSTILE, 0, 6, CLR_BROWN), MON("water moccasin", S_SNAKE, LVL(4, 15, 3, 0, 0), (G_GENO | G_NOGEN | G_LGROUP), A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -1777,7 +1777,7 @@ struct permonst _mons2[] = { SIZ(150, 80, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON, M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, 0, CLR_RED), + M2_HOSTILE, 0, 7, CLR_RED), MON("python", S_SNAKE, LVL(6, 3, 5, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_PHYS, 0, 0), ATTK(AT_HUGS, AD_WRAP, 1, 4), ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, @@ -1785,21 +1785,21 @@ struct permonst _mons2[] = { SIZ(250, 100, MS_HISS, MZ_LARGE), 0, 0, M1_SWIM | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISION, CLR_MAGENTA), + M2_HOSTILE | M2_STRONG, M3_INFRAVISION, 8, CLR_MAGENTA), MON("pit viper", S_SNAKE, LVL(6, 15, 2, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_DRST, 1, 4), ATTK(AT_BITE, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 60, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON, M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, M3_INFRAVISION, CLR_BLUE), + M2_HOSTILE, M3_INFRAVISION, 9, CLR_BLUE), MON("cobra", S_SNAKE, LVL(6, 18, 2, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_SPIT, AD_BLND, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 100, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON, M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, 0, CLR_BLUE), + M2_HOSTILE, 0, 10, CLR_BLUE), /* * Trolls */ @@ -1809,35 +1809,35 @@ struct permonst _mons2[] = { SIZ(800, 350, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_REGEN | M1_CARNIVORE, M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION, - CLR_BROWN), + 9, CLR_BROWN), MON("ice troll", S_TROLL, LVL(9, 10, 2, 20, -3), (G_NOHELL | G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_COLD, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 300, MS_GRUNT, MZ_LARGE), MR_COLD, MR_COLD, M1_HUMANOID | M1_REGEN | M1_CARNIVORE, M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION, - CLR_WHITE), + 12, CLR_WHITE), MON("rock troll", S_TROLL, LVL(9, 12, 0, 0, -3), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 300, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_REGEN | M1_CARNIVORE, M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_CYAN), + M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_CYAN), MON("water troll", S_TROLL, LVL(11, 14, 4, 40, -3), (G_NOGEN | G_GENO), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 350, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_REGEN | M1_CARNIVORE | M1_SWIM, M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION, - CLR_BLUE), + 13, CLR_BLUE), MON("Olog-hai", S_TROLL, LVL(13, 12, -4, 0, -7), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_REGEN | M1_CARNIVORE, M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION, 16, HI_LORD), /* * Umber hulk */ @@ -1846,7 +1846,7 @@ struct permonst _mons2[] = { ATTK(AT_BITE, AD_PHYS, 2, 5), ATTK(AT_GAZE, AD_CONF, 0, 0), NO_ATTK, NO_ATTK), SIZ(1200, 500, MS_SILENT, MZ_LARGE), 0, 0, M1_TUNNEL | M1_CARNIVORE, - M2_STRONG, M3_INFRAVISIBLE, CLR_BROWN), + M2_STRONG, M3_INFRAVISIBLE, 12, CLR_BROWN), /* * Vampires */ @@ -1858,7 +1858,7 @@ struct permonst _mons2[] = { M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_SHAPESHIFTER, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE, 12, CLR_RED), MON("vampire lord", S_VAMPIRE, LVL(12, 14, 0, 50, -9), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), NO_ATTK, @@ -1867,7 +1867,7 @@ struct permonst _mons2[] = { M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD | M2_MALE | M2_SHAPESHIFTER, - M3_INFRAVISIBLE, CLR_BLUE), + M3_INFRAVISIBLE, 14, CLR_BLUE), #if 0 /* DEFERRED */ MON("vampire mage", S_VAMPIRE, LVL(20, 14, -4, 50, -9), (G_GENO | G_NOCORPSE | 1), @@ -1877,7 +1877,7 @@ struct permonst _mons2[] = { M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD | M2_MALE | M2_MAGIC | M2_SHAPESHIFTER, - M3_INFRAVISIBLE, HI_ZAP), + M3_INFRAVISIBLE, 26, HI_ZAP), #endif MON("Vlad the Impaler", S_VAMPIRE, LVL(28, 26, -6, 80, -10), (G_NOGEN | G_NOCORPSE | G_UNIQ), @@ -1887,7 +1887,7 @@ struct permonst _mons2[] = { M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY | M2_PRINCE | M2_MALE | M2_SHAPESHIFTER, - M3_WAITFORU | M3_WANTSCAND | M3_INFRAVISIBLE, HI_LORD), + M3_WAITFORU | M3_WANTSCAND | M3_INFRAVISIBLE, 32, HI_LORD), /* * Wraiths */ @@ -1897,14 +1897,14 @@ struct permonst _mons2[] = { ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 0, MS_SPELL, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_HUMANOID, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_COLLECT, 0, CLR_GRAY), + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_COLLECT, 0, 7, CLR_GRAY), MON("wraith", S_WRAITH, LVL(6, 12, 4, 15, -6), (G_GENO | 2), A(ATTK(AT_TUCH, AD_DRLI, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0, M1_BREATHLESS | M1_FLY | M1_HUMANOID | M1_UNSOLID, - M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, CLR_BLACK), + M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, 8, CLR_BLACK), MON("Nazgul", S_WRAITH, LVL(13, 12, 0, 25, -17), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_WEAP, AD_DRLI, 1, 4), ATTK(AT_BREA, AD_SLEE, 2, 25), @@ -1913,7 +1913,7 @@ struct permonst _mons2[] = { 0, M1_BREATHLESS | M1_HUMANOID, M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_STRONG | M2_HOSTILE | M2_MALE | M2_COLLECT, - 0, HI_LORD), + 0, 17, HI_LORD), /* * Xorn */ @@ -1924,7 +1924,7 @@ struct permonst _mons2[] = { SIZ(1200, 700, MS_ROAR, MZ_MEDIUM), MR_FIRE | MR_COLD | MR_STONE, MR_STONE, M1_BREATHLESS | M1_WALLWALK | M1_THICK_HIDE | M1_METALLIVORE, - M2_HOSTILE | M2_STRONG, 0, CLR_BROWN), + M2_HOSTILE | M2_STRONG, 0, 11, CLR_BROWN), /* * Apelike beasts */ @@ -1934,37 +1934,37 @@ struct permonst _mons2[] = { A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 50, MS_GROWL, MZ_SMALL), 0, 0, - M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, 0, M3_INFRAVISIBLE, CLR_GRAY), + M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, 0, M3_INFRAVISIBLE, 4, CLR_GRAY), MON("ape", S_YETI, LVL(4, 12, 6, 0, 0), (G_GENO | G_SGROUP | 2), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1100, 500, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, M2_STRONG, M3_INFRAVISIBLE, - CLR_BROWN), + 6, CLR_BROWN), MON("owlbear", S_YETI, LVL(5, 12, 5, 0, 0), (G_GENO | 3), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_HUGS, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 700, MS_ROAR, MZ_LARGE), 0, 0, M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE, CLR_BROWN), + M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE, 7, CLR_BROWN), MON("yeti", S_YETI, LVL(5, 15, 6, 0, 0), (G_GENO | 2), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1600, 700, MS_GROWL, MZ_LARGE), MR_COLD, MR_COLD, M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, - M3_INFRAVISIBLE, CLR_WHITE), + M3_INFRAVISIBLE, 7, CLR_WHITE), MON("carnivorous ape", S_YETI, LVL(6, 12, 6, 0, 0), (G_GENO | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_HUGS, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1250, 550, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, - M3_INFRAVISIBLE, CLR_BLACK), + M3_INFRAVISIBLE, 8, CLR_BLACK), MON("sasquatch", S_YETI, LVL(7, 15, 6, 0, 2), (G_GENO | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1550, 750, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_STRONG, - M3_INFRAVISIBLE, CLR_GRAY), + M3_INFRAVISIBLE, 9, CLR_GRAY), /* * Zombies */ @@ -1973,21 +1973,22 @@ struct permonst _mons2[] = { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, CLR_BROWN), + M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, 1, CLR_BROWN), MON("gnome zombie", S_ZOMBIE, LVL(1, 6, 10, 0, -2), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(650, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GNOME, M3_INFRAVISION, - CLR_BROWN), + 2, CLR_BROWN), MON("orc zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3), (G_GENO | G_SGROUP | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 75, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ORC, M3_INFRAVISION, CLR_GRAY), + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ORC, M3_INFRAVISION, 3, + CLR_GRAY), MON("dwarf zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3), (G_GENO | G_SGROUP | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -1995,7 +1996,7 @@ struct permonst _mons2[] = { SIZ(900, 150, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_DWARF, M3_INFRAVISION, - CLR_RED), + 3, CLR_RED), MON("elf zombie", S_ZOMBIE, LVL(3, 6, 9, 0, -3), (G_GENO | G_SGROUP | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -2003,7 +2004,7 @@ struct permonst _mons2[] = { SIZ(WT_ELF, 175, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ELF, M3_INFRAVISION, - CLR_GREEN), + 4, CLR_GREEN), MON("human zombie", S_ZOMBIE, LVL(4, 6, 8, 0, -3), (G_GENO | G_SGROUP | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -2011,7 +2012,7 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 200, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, - M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, HI_DOMESTIC), + M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, 5, HI_DOMESTIC), MON("ettin zombie", S_ZOMBIE, LVL(6, 8, 6, 0, -4), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 10), ATTK(AT_CLAW, AD_PHYS, 1, 10), @@ -2019,13 +2020,13 @@ struct permonst _mons2[] = { SIZ(1700, 250, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, - CLR_BLUE), + 7, CLR_BLUE), MON("ghoul", S_ZOMBIE, LVL(3, 6, 10, 0, -2), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PLYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS | M1_OMNIVORE, - M2_UNDEAD | M2_WANDER | M2_HOSTILE, M3_INFRAVISION, CLR_BLACK), + M2_UNDEAD | M2_WANDER | M2_HOSTILE, M3_INFRAVISION, 5, CLR_BLACK), MON("giant zombie", S_ZOMBIE, LVL(8, 8, 6, 0, -4), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, @@ -2033,7 +2034,7 @@ struct permonst _mons2[] = { SIZ(2050, 375, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GIANT | M2_STRONG, - M3_INFRAVISION, CLR_CYAN), + M3_INFRAVISION, 9, CLR_CYAN), MON("skeleton", S_ZOMBIE, LVL(12, 8, 4, 0, 0), (G_NOCORPSE | G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2042,7 +2043,7 @@ struct permonst _mons2[] = { M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, M2_UNDEAD | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_COLLECT | M2_NASTY, - M3_INFRAVISION, CLR_WHITE), + M3_INFRAVISION, 14, CLR_WHITE), /* * golems */ @@ -2051,37 +2052,37 @@ struct permonst _mons2[] = { NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, - CLR_YELLOW), + 4, CLR_YELLOW), MON("paper golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, - HI_PAPER), + 4, HI_PAPER), MON("rope golem", S_GOLEM, LVL(4, 9, 8, 0, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_HUGS, AD_PHYS, 6, 1), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, - CLR_BROWN), + 6, CLR_BROWN), MON("gold golem", S_GOLEM, LVL(5, 9, 6, 0, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 2, 3), ATTK(AT_CLAW, AD_PHYS, 2, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_ACID, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_HOSTILE | M2_NEUTER, 0, HI_GOLD), + M2_HOSTILE | M2_NEUTER, 0, 6, HI_GOLD), MON("leather golem", S_GOLEM, LVL(6, 6, 6, 0, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, - HI_LEATHER), + 7, HI_LEATHER), MON("wood golem", S_GOLEM, LVL(7, 3, 4, 0, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_HOSTILE | M2_NEUTER, 0, HI_WOOD), + M2_HOSTILE | M2_NEUTER, 0, 8, HI_WOOD), MON("flesh golem", S_GOLEM, LVL(9, 8, 9, 30, 0), (1), A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2089,32 +2090,32 @@ struct permonst _mons2[] = { MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_STRONG, 0, - CLR_RED), + 10, CLR_RED), MON("clay golem", S_GOLEM, LVL(11, 7, 7, 40, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 3, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1550, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_HOSTILE | M2_STRONG, 0, CLR_BROWN), + M2_HOSTILE | M2_STRONG, 0, 12, CLR_BROWN), MON("stone golem", S_GOLEM, LVL(14, 6, 5, 50, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1900, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_STONE, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_HOSTILE | M2_STRONG, 0, CLR_GRAY), + M2_HOSTILE | M2_STRONG, 0, 15, CLR_GRAY), MON("glass golem", S_GOLEM, LVL(16, 6, 1, 50, 0), (G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1800, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_ACID, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_HOSTILE | M2_STRONG, 0, CLR_CYAN), + M2_HOSTILE | M2_STRONG, 0, 18, CLR_CYAN), MON("iron golem", S_GOLEM, LVL(18, 6, 3, 60, 0), (G_NOCORPSE | 1), A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_BREA, AD_DRST, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2000, 0, MS_SILENT, MZ_LARGE), MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE | M1_POIS, - M2_HOSTILE | M2_STRONG | M2_COLLECT, 0, HI_METAL), + M2_HOSTILE | M2_STRONG | M2_COLLECT, 0, 22, HI_METAL), /* * humans, including elves and were-critters */ @@ -2124,67 +2125,67 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - HI_DOMESTIC), + 2, HI_DOMESTIC), MON("wererat", S_HUMAN, LVL(2, 12, 10, 10, -7), (1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE, M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, - M3_INFRAVISIBLE, CLR_BROWN), + M3_INFRAVISIBLE, 3, CLR_BROWN), MON("werejackal", S_HUMAN, LVL(2, 12, 10, 10, -7), (1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE, M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE, 3, CLR_RED), MON("werewolf", S_HUMAN, LVL(5, 12, 10, 20, -7), (1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE, M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, - M3_INFRAVISIBLE, CLR_ORANGE), + M3_INFRAVISIBLE, 6, CLR_ORANGE), MON("elf", S_HUMAN, LVL(10, 12, 10, 2, -3), G_NOGEN, /* for corpses */ A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_NOPOLY | M2_ELF | M2_STRONG | M2_COLLECT, - M3_INFRAVISION | M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISION | M3_INFRAVISIBLE, 12, HI_DOMESTIC), MON("Woodland-elf", S_HUMAN, LVL(4, 12, 10, 10, -5), (G_GENO | G_SGROUP | 2), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GREEN), + M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_GREEN), MON("Green-elf", S_HUMAN, LVL(5, 12, 10, 10, -6), (G_GENO | G_SGROUP | 2), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BRIGHT_GREEN), + M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BRIGHT_GREEN), MON("Grey-elf", S_HUMAN, LVL(6, 12, 10, 10, -7), (G_GENO | G_SGROUP | 2), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GRAY), + M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY), MON("elf-lord", S_HUMAN, LVL(8, 12, 10, 20, -9), (G_GENO | G_SGROUP | 2), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_STRONG | M2_LORD | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BRIGHT_BLUE), + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BRIGHT_BLUE), MON("Elvenking", S_HUMAN, LVL(9, 12, 10, 25, -10), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_STRONG | M2_PRINCE | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD), MON("doppelganger", S_HUMAN, LVL(9, 12, 5, 20, 0), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2192,21 +2193,21 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT | M2_SHAPESHIFTER, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 11, HI_DOMESTIC), MON("shopkeeper", S_HUMAN, LVL(12, 18, 0, 50, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_SELL, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 15, HI_DOMESTIC), MON("guard", S_HUMAN, LVL(12, 12, 10, 40, 10), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARD, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, CLR_BLUE), + M3_INFRAVISIBLE, 14, CLR_BLUE), MON("prisoner", S_HUMAN, LVL(12, 12, 10, 0, 0), G_NOGEN, /* for special levels */ A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -2214,14 +2215,14 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_DJINNI, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE | M3_CLOSE, HI_DOMESTIC), + M3_INFRAVISIBLE | M3_CLOSE, 14, HI_DOMESTIC), MON("Oracle", S_HUMAN, LVL(12, 0, 0, 50, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_NONE, AD_MAGM, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_ORACLE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_FEMALE, M3_INFRAVISIBLE, - HI_ZAP), + 13, HI_ZAP), /* aligned priests always have the epri extension attached; individual instantiations should always have either ispriest or isminion set */ @@ -2231,7 +2232,7 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN), MR_ELEC, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_LORD | M2_PEACEFUL | M2_COLLECT, - M3_INFRAVISIBLE, CLR_WHITE), + M3_INFRAVISIBLE, 15, CLR_WHITE), /* high priests always have epri and always have ispriest set */ MON("high priest", S_HUMAN, LVL(25, 15, 7, 70, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), @@ -2242,41 +2243,41 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MINION | M2_PRINCE | M2_NASTY | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, CLR_WHITE), + M3_INFRAVISIBLE, 30, CLR_WHITE), MON("soldier", S_HUMAN, LVL(6, 10, 10, 0, -2), (G_SGROUP | G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_HOSTILE | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, CLR_GRAY), + M3_INFRAVISIBLE, 8, CLR_GRAY), MON("sergeant", S_HUMAN, LVL(8, 10, 10, 5, -3), (G_SGROUP | G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_HOSTILE | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE, 10, CLR_RED), MON("nurse", S_HUMAN, LVL(11, 6, 0, 0, 0), (G_GENO | 3), A(ATTK(AT_CLAW, AD_HEAL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_NURSE, MZ_HUMAN), MR_POISON, MR_POISON, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_HOSTILE, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 13, HI_DOMESTIC), MON("lieutenant", S_HUMAN, LVL(10, 10, 10, 15, -4), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_HOSTILE | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, CLR_GREEN), + M3_INFRAVISIBLE, 12, CLR_GREEN), MON("captain", S_HUMAN, LVL(12, 10, 10, 15, -5), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_HOSTILE | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, CLR_BLUE), + M3_INFRAVISIBLE, 14, CLR_BLUE), /* Keep these separate - some of the mkroom code assumes that * all the soldiers are contiguous. */ @@ -2287,7 +2288,7 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, CLR_GRAY), + M3_INFRAVISIBLE, 8, CLR_GRAY), MON("watch captain", S_HUMAN, LVL(10, 10, 10, 15, -4), (G_NOGEN | G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, @@ -2295,7 +2296,7 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, CLR_GREEN), + M3_INFRAVISIBLE, 12, CLR_GREEN), /* Unique humans not tied to quests. */ MON("Medusa", S_HUMAN, LVL(20, 12, 2, 50, -15), (G_NOGEN | G_UNIQ), @@ -2306,7 +2307,7 @@ struct permonst _mons2[] = { MR_POISON | MR_STONE, M1_FLY | M1_SWIM | M1_AMPHIBIOUS | M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_FEMALE, - M3_WAITFORU | M3_INFRAVISIBLE, CLR_BRIGHT_GREEN), + M3_WAITFORU | M3_INFRAVISIBLE, 25, CLR_BRIGHT_GREEN), MON("Wizard of Yendor", S_HUMAN, LVL(30, 12, -8, 100, A_NONE), (G_NOGEN | G_UNIQ), A(ATTK(AT_CLAW, AD_SAMU, 2, 12), ATTK(AT_MAGC, AD_SPEL, 0, 0), @@ -2317,7 +2318,7 @@ struct permonst _mons2[] = { | M1_TPORT | M1_TPORT_CNTRL | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_PRINCE | M2_MALE | M2_MAGIC, - M3_COVETOUS | M3_WAITFORU | M3_INFRAVISIBLE, HI_LORD), + M3_COVETOUS | M3_WAITFORU | M3_INFRAVISIBLE, 34, HI_LORD), MON("Croesus", S_HUMAN, LVL(20, 15, 0, 40, 15), (G_UNIQ | G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2326,7 +2327,7 @@ struct permonst _mons2[] = { M2_NOPOLY | M2_HUMAN | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_PNAME | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, HI_LORD), + M3_INFRAVISIBLE, 22, HI_LORD), #ifdef CHARON MON("Charon", S_HUMAN, LVL(76, 18, -5, 120, 0), (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), @@ -2337,7 +2338,7 @@ struct permonst _mons2[] = { M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_PNAME | M2_MALE | M2_GREEDY | M2_COLLECT, - M3_INFRAVISIBLE, CLR_WHITE), + M3_INFRAVISIBLE, 38, CLR_WHITE), #endif /* * ghosts @@ -2349,7 +2350,7 @@ struct permonst _mons2[] = { MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0, M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID, M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, - CLR_GRAY), + 12, CLR_GRAY), MON("shade", S_GHOST, LVL(12, 10, 10, 0, 0), (G_NOCORPSE | G_NOGEN), A(ATTK(AT_TUCH, AD_PLYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2358,7 +2359,7 @@ struct permonst _mons2[] = { M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID | M1_SEE_INVIS, M2_NOPOLY | M2_UNDEAD | M2_WANDER | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISION, CLR_BLACK), + M3_INFRAVISION, 14, CLR_BLACK), /* * (major) demons */ @@ -2369,7 +2370,7 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_DJINNI, MZ_HUMAN), MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_SWIM, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BLUE), + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BLUE), /* standard demons & devils */ #define SEDUCTION_ATTACKS_YES \ @@ -2382,7 +2383,7 @@ struct permonst _mons2[] = { SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN), MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GRAY), + M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY), MON("horned devil", S_DEMON, LVL(6, 9, -5, 50, 11), (G_HELL | G_NOCORPSE | 2), A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), @@ -2390,12 +2391,12 @@ struct permonst _mons2[] = { NO_ATTK), SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0, M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BROWN), + M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_BROWN), MON("incubus", S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1), SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN), MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GRAY), + M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY), /* Used by AD&D for a type of demon, originally one of the Furies and spelled this way */ MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10), @@ -2406,14 +2407,14 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_POIS, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_FEMALE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_RED), MON("barbed devil", S_DEMON, LVL(8, 12, 0, 35, 8), (G_HELL | G_NOCORPSE | G_SGROUP | 2), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0, M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_RED), MON("marilith", S_DEMON, LVL(7, 12, -6, 80, -12), (G_HELL | G_NOCORPSE | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), @@ -2422,7 +2423,7 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_CUSS, MZ_LARGE), MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_SLITHY | M1_SEE_INVIS | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_RED), MON("vrock", S_DEMON, LVL(8, 12, 0, 50, -9), (G_HELL | G_NOCORPSE | G_SGROUP | 2), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), @@ -2430,21 +2431,21 @@ struct permonst _mons2[] = { ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK), SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_RED), MON("hezrou", S_DEMON, LVL(9, 6, -2, 55, -10), (G_HELL | G_NOCORPSE | G_SGROUP | 2), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_RED), MON("bone devil", S_DEMON, LVL(9, 15, -1, 40, -9), (G_HELL | G_NOCORPSE | G_SGROUP | 2), A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GRAY), + M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_GRAY), MON("ice devil", S_DEMON, LVL(11, 6, -4, 55, -12), (G_HELL | G_NOCORPSE | 2), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), @@ -2453,7 +2454,7 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_COLD | MR_POISON, 0, M1_SEE_INVIS | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_WHITE), + M3_INFRAVISIBLE | M3_INFRAVISION, 14, CLR_WHITE), MON("nalfeshnee", S_DEMON, LVL(11, 9, -1, 65, -11), (G_HELL | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), @@ -2461,7 +2462,7 @@ struct permonst _mons2[] = { NO_ATTK), SIZ(WT_HUMAN, 400, MS_SPELL, MZ_LARGE), MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 15, CLR_RED), MON("pit fiend", S_DEMON, LVL(13, 6, -3, 65, -13), (G_HELL | G_NOCORPSE | 2), A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_WEAP, AD_PHYS, 4, 2), @@ -2469,21 +2470,21 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_GROWL, MZ_LARGE), MR_FIRE | MR_POISON, 0, M1_SEE_INVIS | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 16, CLR_RED), MON("sandestin", S_DEMON, LVL(13, 12, 4, 60, -5), (G_HELL | G_NOCORPSE | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, MS_CUSS, MZ_HUMAN), MR_STONE, 0, M1_HUMANOID, M2_NOPOLY | M2_STALK | M2_STRONG | M2_COLLECT | M2_SHAPESHIFTER, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GRAY), + M3_INFRAVISIBLE | M3_INFRAVISION, 15, CLR_GRAY), MON("balrog", S_DEMON, LVL(16, 5, -2, 75, -14), (G_HELL | G_NOCORPSE | 1), A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, M1_FLY | M1_SEE_INVIS | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, CLR_RED), + M3_INFRAVISIBLE | M3_INFRAVISION, 20, CLR_RED), /* Named demon lords & princes plus Arch-Devils. * (their order matters; see minion.c) */ @@ -2497,7 +2498,7 @@ struct permonst _mons2[] = { | M1_ACID | M1_POIS, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_LORD | M2_MALE, - M3_WAITFORU | M3_WANTSAMUL | M3_INFRAVISION, CLR_BRIGHT_GREEN), + M3_WAITFORU | M3_WANTSAMUL | M3_INFRAVISION, 26, CLR_BRIGHT_GREEN), MON("Yeenoghu", S_DEMON, LVL(56, 18, -5, 80, -15), (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_WEAP, AD_CONF, 2, 8), @@ -2507,7 +2508,7 @@ struct permonst _mons2[] = { M1_FLY | M1_SEE_INVIS | M1_POIS, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_LORD | M2_MALE | M2_COLLECT, - M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 31, HI_LORD), MON("Orcus", S_DEMON, LVL(66, 9, -6, 85, -20), (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 4), @@ -2519,7 +2520,7 @@ struct permonst _mons2[] = { | M2_PRINCE | M2_MALE | M2_COLLECT, M3_WAITFORU | M3_WANTSBOOK | M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, - HI_LORD), + 36, HI_LORD), MON("Geryon", S_DEMON, LVL(72, 3, -3, 75, 15), (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6), @@ -2528,7 +2529,7 @@ struct permonst _mons2[] = { M1_FLY | M1_SEE_INVIS | M1_POIS | M1_SLITHY, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE, - M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 36, HI_LORD), MON("Dispater", S_DEMON, LVL(78, 15, -2, 80, 15), (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_MAGC, AD_SPEL, 6, 6), NO_ATTK, @@ -2537,7 +2538,7 @@ struct permonst _mons2[] = { M1_FLY | M1_SEE_INVIS | M1_POIS | M1_HUMANOID, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE | M2_COLLECT, - M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 40, HI_LORD), MON("Baalzebub", S_DEMON, LVL(89, 9, -5, 85, 20), (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), A(ATTK(AT_BITE, AD_DRST, 2, 6), ATTK(AT_GAZE, AD_STUN, 2, 6), NO_ATTK, @@ -2547,7 +2548,7 @@ struct permonst _mons2[] = { M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE, M3_WANTSAMUL | M3_WAITFORU | M3_INFRAVISIBLE | M3_INFRAVISION, - HI_LORD), + 45, HI_LORD), MON("Asmodeus", S_DEMON, LVL(105, 12, -7, 90, 20), (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_MAGC, AD_COLD, 6, 6), NO_ATTK, @@ -2557,7 +2558,7 @@ struct permonst _mons2[] = { M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY | M2_PRINCE | M2_MALE, M3_WANTSAMUL | M3_WAITFORU | M3_INFRAVISIBLE | M3_INFRAVISION, - HI_LORD), + 53, HI_LORD), MON("Demogorgon", S_DEMON, LVL(106, 15, -8, 95, -20), (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), A(ATTK(AT_MAGC, AD_SPEL, 8, 6), ATTK(AT_STNG, AD_DRLI, 1, 4), @@ -2567,7 +2568,7 @@ struct permonst _mons2[] = { M1_FLY | M1_SEE_INVIS | M1_NOHANDS | M1_POIS, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE, - M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), + M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 57, HI_LORD), /* Riders -- the Four Horsemen of the Apocalypse ("War" == player); * depicted with '&' but do not have M2_DEMON set. */ @@ -2578,7 +2579,7 @@ struct permonst _mons2[] = { MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL, M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD), MON("Pestilence", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN), A(ATTK(AT_TUCH, AD_PEST, 8, 8), ATTK(AT_TUCH, AD_PEST, 8, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2586,7 +2587,7 @@ struct permonst _mons2[] = { MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL, M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD), MON("Famine", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN), A(ATTK(AT_TUCH, AD_FAMN, 8, 8), ATTK(AT_TUCH, AD_FAMN, 8, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2594,7 +2595,7 @@ struct permonst _mons2[] = { MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL, M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, HI_LORD), + M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD), /* other demons */ #ifdef MAIL @@ -2606,14 +2607,14 @@ struct permonst _mons2[] = { M1_FLY | M1_SWIM | M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID | M1_POIS, M2_NOPOLY | M2_STALK | M2_PEACEFUL, M3_INFRAVISIBLE | M3_INFRAVISION, - CLR_BRIGHT_BLUE), + 26, CLR_BRIGHT_BLUE), #endif MON("djinni", S_DEMON, LVL(7, 12, 4, 30, 0), (G_NOGEN | G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, MS_DJINNI, MZ_HUMAN), MR_POISON | MR_STONE, 0, M1_HUMANOID | M1_FLY | M1_POIS, M2_NOPOLY | M2_STALK | M2_COLLECT, - M3_INFRAVISIBLE, CLR_YELLOW), + M3_INFRAVISIBLE, 8, CLR_YELLOW), /* * sea monsters */ @@ -2623,42 +2624,42 @@ struct permonst _mons2[] = { SIZ(80, 20, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_SWIM | M1_AMPHIBIOUS | M1_SLITHY | M1_NOLIMBS | M1_NOHEAD | M1_NOTAKE | M1_POIS, - M2_HOSTILE, 0, CLR_BLUE), + M2_HOSTILE, 0, 5, CLR_BLUE), MON("piranha", S_EEL, LVL(5, 12, 4, 0, 0), (G_GENO | G_NOGEN | G_SGROUP), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(60, 30, MS_SILENT, MZ_SMALL), 0, 0, M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, 0, CLR_RED), + M2_HOSTILE, 0, 6, CLR_RED), MON("shark", S_EEL, LVL(7, 12, 2, 0, 0), (G_GENO | G_NOGEN), A(ATTK(AT_BITE, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 350, MS_SILENT, MZ_LARGE), 0, 0, M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE | M1_OVIPAROUS | M1_THICK_HIDE | M1_NOTAKE, - M2_HOSTILE, 0, CLR_GRAY), + M2_HOSTILE, 0, 9, CLR_GRAY), MON("giant eel", S_EEL, LVL(5, 9, -1, 0, 0), (G_GENO | G_NOGEN), A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 250, MS_SILENT, MZ_HUGE), 0, 0, M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, M3_INFRAVISIBLE, CLR_CYAN), + M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_CYAN), MON("electric eel", S_EEL, LVL(7, 10, -3, 0, 0), (G_GENO | G_NOGEN), A(ATTK(AT_BITE, AD_ELEC, 4, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 250, MS_SILENT, MZ_HUGE), MR_ELEC, MR_ELEC, M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, M3_INFRAVISIBLE, CLR_BRIGHT_BLUE), + M2_HOSTILE, M3_INFRAVISIBLE, 10, CLR_BRIGHT_BLUE), MON("kraken", S_EEL, LVL(20, 3, 6, 0, -3), (G_GENO | G_NOGEN), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_HUGS, AD_WRAP, 2, 6), ATTK(AT_BITE, AD_PHYS, 5, 4), NO_ATTK, NO_ATTK), SIZ(1800, 1000, MS_SILENT, MZ_HUGE), 0, 0, M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_NOPOLY | M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, CLR_RED), + M2_NOPOLY | M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_RED), /* * lizards, &c */ @@ -2667,41 +2668,41 @@ struct permonst _mons2[] = { NO_ATTK), SIZ(10, 20, MS_SILENT, MZ_TINY), 0, 0, M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE, 0, CLR_YELLOW), + M2_HOSTILE, 0, 1, CLR_YELLOW), MON("gecko", S_LIZARD, LVL(1, 6, 8, 0, 0), (G_GENO | 5), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 20, MS_SQEEK, MZ_TINY), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, CLR_GREEN), + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 2, CLR_GREEN), MON("iguana", S_LIZARD, LVL(2, 6, 7, 0, 0), (G_GENO | 5), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, MS_SILENT, MZ_TINY), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, CLR_BROWN), + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 3, CLR_BROWN), MON("baby crocodile", S_LIZARD, LVL(3, 6, 7, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 200, MS_SILENT, MZ_MEDIUM), 0, 0, M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE, 0, CLR_BROWN), + M2_HOSTILE, 0, 4, CLR_BROWN), MON("lizard", S_LIZARD, LVL(5, 6, 6, 10, 0), (G_GENO | 5), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 40, MS_SILENT, MZ_TINY), MR_STONE, MR_STONE, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, CLR_GREEN), + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 6, CLR_GREEN), MON("chameleon", S_LIZARD, LVL(6, 5, 6, 10, 0), (G_GENO | 2), A(ATTK(AT_BITE, AD_PHYS, 4, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, MS_SILENT, MZ_TINY), 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_NOPOLY | M2_HOSTILE | M2_SHAPESHIFTER, 0, CLR_BROWN), + M2_NOPOLY | M2_HOSTILE | M2_SHAPESHIFTER, 0, 7, CLR_BROWN), MON("crocodile", S_LIZARD, LVL(6, 9, 5, 0, 0), (G_GENO | 1), A(ATTK(AT_BITE, AD_PHYS, 4, 2), ATTK(AT_CLAW, AD_PHYS, 1, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), 0, 0, M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, - M2_STRONG | M2_HOSTILE, 0, CLR_BROWN), + M2_STRONG | M2_HOSTILE, 0, 7, CLR_BROWN), MON("salamander", S_LIZARD, LVL(8, 12, -1, 0, -9), (G_HELL | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_TUCH, AD_FIRE, 1, 6), ATTK(AT_HUGS, AD_PHYS, 2, 6), ATTK(AT_HUGS, AD_FIRE, 3, 6), NO_ATTK, @@ -2709,7 +2710,7 @@ struct permonst _mons2[] = { SIZ(1500, 400, MS_MUMBLE, MZ_HUMAN), MR_SLEEP | MR_FIRE, MR_FIRE, M1_HUMANOID | M1_SLITHY | M1_THICK_HIDE | M1_POIS, M2_STALK | M2_HOSTILE | M2_COLLECT | M2_MAGIC, M3_INFRAVISIBLE, - CLR_ORANGE), + 12, CLR_ORANGE), /* * dummy monster needed for visual interface @@ -2718,7 +2719,7 @@ struct permonst _mons2[] = { MON("long worm tail", S_WORM_TAIL, LVL(0, 0, 0, 0, 0), (G_NOGEN | G_NOCORPSE | G_UNIQ), A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(0, 0, 0, 0), 0, 0, 0L, M2_NOPOLY, 0, CLR_BROWN), + SIZ(0, 0, 0, 0), 0, 0, 0L, M2_NOPOLY, 0, 1, CLR_BROWN), /* Note: * Worm tail must be between the normal monsters and the special * quest & pseudo-character ones because an optimization in the @@ -2735,105 +2736,105 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TUNNEL | M1_NEEDPICK | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - HI_DOMESTIC), + 12, HI_DOMESTIC), MON("barbarian", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - HI_DOMESTIC), + 12, HI_DOMESTIC), MON("caveman", S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 12, HI_DOMESTIC), MON("cavewoman", S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 12, HI_DOMESTIC), MON("healer", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - HI_DOMESTIC), + 12, HI_DOMESTIC), MON("knight", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - HI_DOMESTIC), + 12, HI_DOMESTIC), MON("monk", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_HERBIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT | M2_MALE, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 11, HI_DOMESTIC), MON("priest", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 12, HI_DOMESTIC), MON("priestess", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 12, HI_DOMESTIC), MON("ranger", S_HUMAN, LVL(10, 12, 10, 2, -3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - HI_DOMESTIC), + 12, HI_DOMESTIC), MON("rogue", S_HUMAN, LVL(10, 12, 10, 1, -3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 12, HI_DOMESTIC), MON("samurai", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - HI_DOMESTIC), + 12, HI_DOMESTIC), MON("tourist", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - HI_DOMESTIC), + 12, HI_DOMESTIC), MON("valkyrie", S_HUMAN, LVL(10, 12, 10, 1, -1), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_COLD, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 12, HI_DOMESTIC), MON("wizard", S_HUMAN, LVL(10, 12, 10, 3, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 12, HI_DOMESTIC), /* * quest leaders */ @@ -2844,7 +2845,7 @@ struct permonst _mons2[] = { M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD), MON("Pelias", S_HUMAN, LVL(20, 12, 0, 30, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2852,7 +2853,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD), MON("Shaman Karnov", S_HUMAN, LVL(20, 12, 0, 30, 20), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2860,7 +2861,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD), #if 0 /* OBSOLETE */ /* Two for elves - one of each sex. */ @@ -2872,7 +2873,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD), MON("Elwing", S_HUMAN, LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), @@ -2881,7 +2882,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_FEMALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD), #endif MON("Hippocrates", S_HUMAN, LVL(20, 12, 0, 40, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -2890,7 +2891,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD), MON("King Arthur", S_HUMAN, LVL(20, 12, 0, 40, 20), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2898,7 +2899,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD), MON("Grand Master", S_HUMAN, LVL(25, 12, 0, 70, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, @@ -2908,7 +2909,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_SEE_INVIS | M1_HERBIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_NASTY | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, CLR_BLACK), + M3_CLOSE | M3_INFRAVISIBLE, 30, CLR_BLACK), MON("Arch Priest", S_HUMAN, LVL(25, 12, 7, 70, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, @@ -2918,7 +2919,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, CLR_WHITE), + M3_CLOSE | M3_INFRAVISIBLE, 30, CLR_WHITE), MON("Orion", S_HUMAN, LVL(20, 12, 0, 30, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2926,7 +2927,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS | M1_SWIM | M1_AMPHIBIOUS, M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD), /* Note: Master of Thieves is also the Tourist's nemesis. */ MON("Master of Thieves", S_HUMAN, LVL(20, 12, 0, 30, -20), @@ -2937,7 +2938,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISIBLE, 24, HI_LORD), MON("Lord Sato", S_HUMAN, LVL(20, 12, 0, 30, 20), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2945,7 +2946,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD), MON("Twoflower", S_HUMAN, LVL(20, 12, 10, 20, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2953,7 +2954,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, HI_DOMESTIC), + M3_CLOSE | M3_INFRAVISIBLE, 22, HI_DOMESTIC), MON("Norn", S_HUMAN, LVL(20, 12, 0, 80, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), @@ -2961,7 +2962,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_FEMALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), + M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD), MON("Neferet the Green", S_HUMAN, LVL(20, 12, 0, 60, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 2, 8), NO_ATTK, @@ -2970,7 +2971,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_FEMALE | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, CLR_GREEN), + M3_CLOSE | M3_INFRAVISIBLE, 23, CLR_GREEN), /* * quest nemeses */ @@ -2984,7 +2985,7 @@ struct permonst _mons2[] = { M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, - CLR_RED), + 23, CLR_RED), MON("Thoth Amon", S_HUMAN, LVL(16, 12, 0, 10, -14), (G_NOGEN | G_UNIQ | G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), @@ -2994,7 +2995,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_STRONG | M2_MALE | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, HI_LORD), + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 22, HI_LORD), /* Multi-headed, possessing the breath attacks of all the other dragons * (selected at random when attacking). */ @@ -3011,7 +3012,7 @@ struct permonst _mons2[] = { M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS | M1_POIS, M2_NOPOLY | M2_HOSTILE | M2_FEMALE | M2_STALK | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, HI_LORD), + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 23, HI_LORD), #if 0 /* OBSOLETE */ MON("Goblin King", S_ORC, LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ), @@ -3022,7 +3023,7 @@ struct permonst _mons2[] = { M2_NOPOLY | M2_ORC | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC, M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, - HI_LORD), + 18, HI_LORD), #endif MON("Cyclops", S_GIANT, LVL(18, 12, 0, 0, -15), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4, 8), ATTK(AT_WEAP, AD_PHYS, 4, 8), @@ -3032,7 +3033,7 @@ struct permonst _mons2[] = { M2_NOPOLY | M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE | M2_JEWELS | M2_COLLECT, M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, - CLR_GRAY), + 23, CLR_GRAY), MON("Ixoth", S_DRAGON, LVL(15, 12, -1, 20, -14), (G_NOGEN | G_UNIQ), A(ATTK(AT_BREA, AD_FIRE, 8, 6), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_PHYS, 2, 4), @@ -3042,7 +3043,7 @@ struct permonst _mons2[] = { M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS, M2_NOPOLY | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_STALK | M2_GREEDY | M2_JEWELS | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, CLR_RED), + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 22, CLR_RED), MON("Master Kaen", S_HUMAN, LVL(25, 12, -10, 10, -20), (G_NOGEN | G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 16, 2), ATTK(AT_CLAW, AD_PHYS, 16, 2), ATTK(AT_MAGC, AD_CLRC, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK, @@ -3051,7 +3052,7 @@ struct permonst _mons2[] = { MR_POISON, M1_HUMANOID | M1_HERBIVORE | M1_SEE_INVIS, M2_NOPOLY | M2_HUMAN | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_STALK | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, HI_LORD), + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 31, HI_LORD), MON("Nalzok", S_DEMON, LVL(16, 12, -2, 85, -127), (G_NOGEN | G_UNIQ | G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), @@ -3062,7 +3063,7 @@ struct permonst _mons2[] = { M2_NOPOLY | M2_DEMON | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY | M2_COLLECT, M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, - CLR_RED), + 23, CLR_RED), MON("Scorpius", S_SPIDER, LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_SAMU, 2, 6), ATTK(AT_STNG, AD_DISE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), @@ -3070,7 +3071,7 @@ struct permonst _mons2[] = { M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE, M2_NOPOLY | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU, HI_LORD), + M3_WANTSARTI | M3_WAITFORU, 17, HI_LORD), MON("Master Assassin", S_HUMAN, LVL(15, 12, 0, 30, 18), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_DRST, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 8), @@ -3079,7 +3080,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_HOSTILE | M2_STALK | M2_NASTY | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, HI_LORD), + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 20, HI_LORD), /* A renegade daimyo who led a 13 year civil war against the shogun * of his time. */ @@ -3091,7 +3092,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, HI_LORD), + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 19, HI_LORD), /* * Note: the Master of Thieves was defined above. */ @@ -3103,7 +3104,7 @@ struct permonst _mons2[] = { M2_NOPOLY | M2_GIANT | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STALK | M2_STRONG | M2_NASTY | M2_ROCKTHROW | M2_JEWELS | M2_COLLECT, M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, - HI_LORD), + 19, HI_LORD), MON("Dark One", S_HUMAN, LVL(15, 12, 0, 80, -10), (G_NOGEN | G_UNIQ | G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), @@ -3113,7 +3114,7 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_HOSTILE | M2_STALK | M2_NASTY | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, CLR_BLACK), + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 20, CLR_BLACK), /* * quest "guardians" */ @@ -3123,21 +3124,21 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("chieftain", S_HUMAN, LVL(5, 12, 10, 10, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("neanderthal", S_HUMAN, LVL(5, 12, 10, 10, 1), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), #if 0 /* OBSOLETE */ MON("High-elf", S_HUMAN, LVL(5, 12, 10, 10, -7), G_NOGEN, @@ -3146,7 +3147,7 @@ struct permonst _mons2[] = { SIZ(WT_ELF, 350, MS_GUARDIAN, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_NOPOLY | M2_ELF | M2_PEACEFUL | M2_COLLECT, - M3_INFRAVISION | M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISION | M3_INFRAVISIBLE, 7, HI_DOMESTIC), #endif MON("attendant", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -3154,83 +3155,83 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("page", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("abbot", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, A(ATTK(AT_CLAW, AD_PHYS, 8, 2), ATTK(AT_KICK, AD_STUN, 3, 2), ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_HERBIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 8, HI_DOMESTIC), MON("acolyte", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 8, HI_DOMESTIC), MON("hunter", S_HUMAN, LVL(5, 12, 10, 10, -7), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISION | M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISION | M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("thug", S_HUMAN, LVL(5, 12, 10, 10, -3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_GREEDY | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("ninja", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("roshi", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("guide", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 8, HI_DOMESTIC), MON("warrior", S_HUMAN, LVL(5, 12, 10, 10, -1), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT | M2_FEMALE, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 7, HI_DOMESTIC), MON("apprentice", S_HUMAN, LVL(5, 12, 10, 30, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, HI_DOMESTIC), + M3_INFRAVISIBLE, 8, HI_DOMESTIC), /* * array terminator */ MON("", 0, LVL(0, 0, 0, 0, 0), (0), A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(0, 0, 0, 0), 0, 0, 0L, 0L, 0, 0) + SIZ(0, 0, 0, 0), 0, 0, 0L, 0L, 0, 0, 0) }; #endif /* !SPLITMON_1 */ diff --git a/src/muse.c b/src/muse.c index 600bdd903..94b0350ad 100644 --- a/src/muse.c +++ b/src/muse.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 muse.c $NHDT-Date: 1505181522 2017/09/12 01:58:42 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.80 $ */ +/* NetHack 3.6 muse.c $NHDT-Date: 1539804880 2018/10/17 19:34:40 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.85 $ */ /* Copyright (C) 1990 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ @@ -8,8 +8,6 @@ #include "hack.h" -extern const int monstr[]; - boolean m_using = FALSE; /* Let monsters use magic items. Arbitrary assumptions: Monsters only use @@ -991,7 +989,7 @@ rnd_defensive_item(mtmp) struct monst *mtmp; { struct permonst *pm = mtmp->data; - int difficulty = monstr[(monsndx(pm))]; + int difficulty = mons[(monsndx(pm))].difficulty; int trycnt = 0; if (is_animal(pm) || attacktype(pm, AT_EXPL) || mindless(mtmp->data) @@ -1556,7 +1554,7 @@ rnd_offensive_item(mtmp) struct monst *mtmp; { struct permonst *pm = mtmp->data; - int difficulty = monstr[(monsndx(pm))]; + int difficulty = mons[(monsndx(pm))].difficulty; if (is_animal(pm) || attacktype(pm, AT_EXPL) || mindless(mtmp->data) || pm->mlet == S_GHOST || pm->mlet == S_KOP) @@ -1636,7 +1634,7 @@ struct monst *mtmp; return FALSE; if (!stuck && !immobile && (mtmp->cham == NON_PM) - && monstr[(pmidx = monsndx(mdat))] < 6) { + && mons[(pmidx = monsndx(mdat))].difficulty < 6) { boolean ignore_boulders = (verysmall(mdat) || throws_rocks(mdat) || passes_walls(mdat)), diag_ok = !NODIAG(pmidx); @@ -1722,13 +1720,13 @@ struct monst *mtmp; } nomore(MUSE_WAN_POLYMORPH); if (obj->otyp == WAN_POLYMORPH && obj->spe > 0 - && (mtmp->cham == NON_PM) && monstr[monsndx(mdat)] < 6) { + && (mtmp->cham == NON_PM) && mons[monsndx(mdat)].difficulty < 6) { m.misc = obj; m.has_misc = MUSE_WAN_POLYMORPH; } nomore(MUSE_POT_POLYMORPH); if (obj->otyp == POT_POLYMORPH && (mtmp->cham == NON_PM) - && monstr[monsndx(mdat)] < 6) { + && mons[monsndx(mdat)].difficulty < 6) { m.misc = obj; m.has_misc = MUSE_POT_POLYMORPH; } @@ -1997,7 +1995,7 @@ rnd_misc_item(mtmp) struct monst *mtmp; { struct permonst *pm = mtmp->data; - int difficulty = monstr[(monsndx(pm))]; + int difficulty = mons[(monsndx(pm))].difficulty; if (is_animal(pm) || attacktype(pm, AT_EXPL) || mindless(mtmp->data) || pm->mlet == S_GHOST || pm->mlet == S_KOP) @@ -2052,7 +2050,7 @@ struct obj *obj; if (typ == WAN_DIGGING) return (boolean) !is_floater(mon->data); if (typ == WAN_POLYMORPH) - return (boolean) (monstr[monsndx(mon->data)] < 6); + return (boolean) (mons[monsndx(mon->data)].difficulty < 6); if (objects[typ].oc_dir == RAY || typ == WAN_STRIKING || typ == WAN_TELEPORTATION || typ == WAN_CREATE_MONSTER) return TRUE; diff --git a/src/pray.c b/src/pray.c index bd8a3604e..015f9633b 100644 --- a/src/pray.c +++ b/src/pray.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 pray.c $NHDT-Date: 1519662898 2018/02/26 16:34:58 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.96 $ */ +/* NetHack 3.6 pray.c $NHDT-Date: 1539804904 2018/10/17 19:35:04 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.103 $ */ /* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1325,7 +1325,6 @@ dosacrifice() if (otmp->otyp == CORPSE) { register struct permonst *ptr = &mons[otmp->corpsenm]; struct monst *mtmp; - extern const int monstr[]; /* KMH, conduct */ u.uconduct.gnostic++; @@ -1338,7 +1337,7 @@ dosacrifice() if (otmp->corpsenm == PM_ACID_BLOB || (monstermoves <= peek_at_iced_corpse_age(otmp) + 50)) { - value = monstr[otmp->corpsenm] + 1; + value = mons[otmp->corpsenm].difficulty + 1; if (otmp->oeaten) value = eaten_stat(value, otmp); } diff --git a/src/uhitm.c b/src/uhitm.c index 5dd5b8623..b69fa8720 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -354,12 +354,14 @@ register struct monst *mtmp; Strcpy(buf, y_monnam(mtmp)); buf[0] = highc(buf[0]); You("stop. %s is in the way!", buf); - context.travel = context.travel1 = context.mv = context.run = 0; + context.travel = context.travel1 = context.mv = context.run + = 0; return TRUE; } else if ((mtmp->mfrozen || (!mtmp->mcanmove) || (mtmp->data->mmove == 0)) && rn2(6)) { pline("%s doesn't seem to move!", Monnam(mtmp)); - context.travel = context.travel1 = context.mv = context.run = 0; + context.travel = context.travel1 = context.mv = context.run + = 0; return TRUE; } else return FALSE; @@ -423,7 +425,7 @@ register struct monst *mtmp; (void) hitum(mtmp, youmonst.data->mattk); mtmp->mstrategy &= ~STRAT_WAITMASK; -atk_done: + atk_done: /* see comment in attack_checks() */ /* we only need to check for this if we did an attack_checks() * and it returned 0 (it's okay to attack), and the monster didn't @@ -807,7 +809,8 @@ int dieroll; silvermsg = TRUE; silverobj = TRUE; } - if (artifact_light(obj) && obj->lamplit && mon_hates_light(mon)) + if (artifact_light(obj) && obj->lamplit + && mon_hates_light(mon)) lightobj = TRUE; if (u.usteed && !thrown && tmp > 0 && weapon_type(obj) == P_LANCE && mon != u.ustuck) { @@ -1550,6 +1553,7 @@ register struct attack *mattk; register struct permonst *pd = mdef->data; int armpro, tmp = d((int) mattk->damn, (int) mattk->damd); boolean negated; + struct obj *mongold; armpro = magic_negation(mdef); /* since hero can't be cancelled, only defender's armor applies */ @@ -1689,18 +1693,16 @@ register struct attack *mattk; case AD_SGLD: /* This you as a leprechaun, so steal real gold only, no lesser coins */ - { - struct obj *mongold = findgold(mdef->minvent); - if (mongold) { - obj_extract_self(mongold); - if (merge_choice(invent, mongold) || inv_cnt(FALSE) < 52) { - addinv(mongold); - Your("purse feels heavier."); - } else { - You("grab %s's gold, but find no room in your knapsack.", - mon_nam(mdef)); - dropy(mongold); - } + mongold = findgold(mdef->minvent); + if (mongold) { + obj_extract_self(mongold); + if (merge_choice(invent, mongold) || inv_cnt(FALSE) < 52) { + addinv(mongold); + Your("purse feels heavier."); + } else { + You("grab %s's gold, but find no room in your knapsack.", + mon_nam(mdef)); + dropy(mongold); } } exercise(A_DEX, TRUE); @@ -1711,8 +1713,9 @@ register struct attack *mattk; tmp = 1; if (!negated && tmp < mdef->mhp) { char nambuf[BUFSZ]; - boolean u_saw_mon = - canseemon(mdef) || (u.uswallow && u.ustuck == mdef); + boolean u_saw_mon = (canseemon(mdef) + || (u.uswallow && u.ustuck == mdef)); + /* record the name before losing sight of monster */ Strcpy(nambuf, Monnam(mdef)); if (u_teleport_mon(mdef, FALSE) && u_saw_mon @@ -1794,9 +1797,9 @@ register struct attack *mattk; case AD_DRCO: if (!negated && !rn2(8)) { Your("%s was poisoned!", mpoisons_subj(&youmonst, mattk)); - if (resists_poison(mdef)) + if (resists_poison(mdef)) { pline_The("poison doesn't seem to affect %s.", mon_nam(mdef)); - else { + } else { if (!rn2(10)) { Your("poison was deadly..."); tmp = mdef->mhp; @@ -1941,12 +1944,11 @@ explum(mdef, mattk) register struct monst *mdef; register struct attack *mattk; { + boolean resistance; /* only for cold/fire/elec */ register int tmp = d((int) mattk->damn, (int) mattk->damd); You("explode!"); switch (mattk->adtyp) { - boolean resistance; /* only for cold/fire/elec */ - case AD_BLND: if (!resists_blnd(mdef)) { pline("%s is blinded by your flash of light!", Monnam(mdef)); diff --git a/src/windows.c b/src/windows.c index c87e4ca43..3a9471224 100644 --- a/src/windows.c +++ b/src/windows.c @@ -64,7 +64,8 @@ STATIC_DCL void FDECL(dump_clear_nhwindow, (winid)); STATIC_DCL void FDECL(dump_display_nhwindow, (winid, BOOLEAN_P)); STATIC_DCL void FDECL(dump_destroy_nhwindow, (winid)); STATIC_DCL void FDECL(dump_start_menu, (winid)); -STATIC_DCL void FDECL(dump_add_menu, (winid, int, const ANY_P *, CHAR_P, CHAR_P, int, const char *, BOOLEAN_P)); +STATIC_DCL void FDECL(dump_add_menu, (winid, int, const ANY_P *, CHAR_P, + CHAR_P, int, const char *, BOOLEAN_P)); STATIC_DCL void FDECL(dump_end_menu, (winid, const char *)); STATIC_DCL int FDECL(dump_select_menu, (winid, int, MENU_ITEM_P **)); STATIC_DCL void FDECL(dump_putstr, (winid, int, const char *)); @@ -145,14 +146,22 @@ static struct winlink *chain = 0; static struct winlink * wl_new() { - return calloc(1, sizeof(struct winlink)); + struct winlink *wl = (struct winlink *) alloc(sizeof *wl); + + wl->nextlink = 0; + wl->wincp = 0; + wl->linkdata = 0; + + return wl; } + static void wl_addhead(struct winlink *wl) { wl->nextlink = chain; chain = wl; } + static void wl_addtail(struct winlink *wl) { @@ -255,24 +264,28 @@ const char *s; if (!winchoices[0].procs) { raw_printf("No window types?"); - exit(EXIT_FAILURE); + nh_terminate(EXIT_FAILURE); } if (!winchoices[1].procs) { - config_error_add("Window type %s not recognized. The only choice is: %s", - s, winchoices[0].procs->name); + config_error_add( + "Window type %s not recognized. The only choice is: %s", + s, winchoices[0].procs->name); } else { char buf[BUFSZ]; boolean first = TRUE; + buf[0] = '\0'; for (i = 0; winchoices[i].procs; i++) { if ('+' == winchoices[i].procs->name[0]) continue; if ('-' == winchoices[i].procs->name[0]) continue; - Sprintf(eos(buf), "%s%s", first ? "" : ",", winchoices[i].procs->name); + Sprintf(eos(buf), "%s%s", + first ? "" : ", ", winchoices[i].procs->name); first = FALSE; } - config_error_add("Window type %s not recognized. Choices are: %s", s, buf); + config_error_add("Window type %s not recognized. Choices are: %s", + s, buf); } if (windowprocs.win_raw_print == def_raw_print) @@ -291,6 +304,7 @@ const char *s; continue; if (!strcmpi(s, winchoices[i].procs->name)) { struct winlink *p = wl_new(); + p->wincp = &winchoices[i]; wl_addtail(p); /* NB: The ini_routine() will be called during commit. */ @@ -307,7 +321,7 @@ const char *s; raw_printf(" %s", winchoices[i].procs->name); } - exit(EXIT_FAILURE); + nh_terminate(EXIT_FAILURE); } void @@ -494,7 +508,8 @@ static short FDECL(hup_set_font_name, (winid, char *)); #endif static char *NDECL(hup_get_color_string); #endif /* CHANGE_COLOR */ -static void FDECL(hup_status_update, (int, genericptr_t, int, int, int, unsigned long *)); +static void FDECL(hup_status_update, (int, genericptr_t, int, int, int, + unsigned long *)); static int NDECL(hup_int_ndecl); static void NDECL(hup_void_ndecl); diff --git a/src/wizard.c b/src/wizard.c index 87e229ebc..b3a19e887 100644 --- a/src/wizard.c +++ b/src/wizard.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 wizard.c $NHDT-Date: 1456618999 2016/02/28 00:23:19 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.48 $ */ +/* NetHack 3.6 wizard.c $NHDT-Date: 1539804905 2018/10/17 19:35:05 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.53 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2016. */ /* NetHack may be freely redistributed. See license for details. */ @@ -11,8 +11,6 @@ #include "hack.h" #include "qtext.h" -extern const int monstr[]; - STATIC_DCL short FDECL(which_arti, (int)); STATIC_DCL boolean FDECL(mon_has_arti, (struct monst *, SHORT_P)); STATIC_DCL struct monst *FDECL(other_mon_has_arti, (struct monst *, SHORT_P)); @@ -588,7 +586,8 @@ struct monst *summoner; m_cls = mons[makeindex].mlet; } while (summoner && ((attacktype(&mons[makeindex], AT_MAGC) - && monstr[makeindex] >= monstr[summoner->mnum]) + && mons[makeindex].difficulty + >= mons[summoner->mnum].difficulty) || (s_cls == S_DEMON && m_cls == S_ANGEL) || (s_cls == S_ANGEL && m_cls == S_DEMON))); /* do this after picking the monster to place */ diff --git a/sys/unix/Makefile.src b/sys/unix/Makefile.src index 4f9fa874e..4fac84eec 100644 --- a/sys/unix/Makefile.src +++ b/sys/unix/Makefile.src @@ -1,5 +1,5 @@ # NetHack Makefile. -# NetHack 3.6 Makefile.src $NHDT-Date: 1526687360 2018/05/18 23:49:20 $ $NHDT-Branch: NetHack-3.6.2 $:$NHDT-Revision: 1.55 $ +# NetHack 3.6 Makefile.src $NHDT-Date: 1539968067 2018/10/19 16:54:27 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.58 $ # Copyright (c) 2018 by Pasi Kallinen # NetHack may be freely redistributed. See license for details. @@ -427,7 +427,7 @@ SYSCSRC = ../sys/atari/tos.c ../sys/share/pcmain.c ../sys/share/pcsys.c \ SYSCXXSRC = ../sys/share/cppregex.cpp # generated source files (tile.c is handled separately via WINxxxSRC) -GENCSRC = monstr.c vis_tab.c #tile.c +GENCSRC = vis_tab.c #tile.c # all windowing-system-dependent .c (for dependencies and such) WINCSRC = $(WINTTYSRC) $(WINX11SRC) $(WINGNOMESRC) $(WINGEMSRC) @@ -474,7 +474,7 @@ HOBJ = $(FIRSTOBJ) allmain.o alloc.o apply.o artifact.o attrib.o ball.o \ extralev.o files.o fountain.o hack.o hacklib.o invent.o light.o \ lock.o mail.o makemon.o mapglyph.o mcastu.o mhitm.o mhitu.o \ minion.o mklev.o mkmap.o \ - mkmaze.o mkobj.o mkroom.o mon.o mondata.o monmove.o monstr.o \ + mkmaze.o mkobj.o mkroom.o mon.o mondata.o monmove.o \ mplayer.o mthrowu.o muse.o music.o o_init.o objnam.o options.o \ pager.o pickup.o pline.o polyself.o potion.o pray.o priest.o \ quest.o questpgr.o read.o rect.o region.o restore.o rip.o rnd.o \ @@ -609,9 +609,7 @@ $(MAKEDEFS): $(FIRSTOBJ) \ @( cd ../util ; $(MAKE) ../include/onames.h ) ../include/pm.h: $(MAKEDEFS) ../include/onames.h @( cd ../util ; $(MAKE) ../include/pm.h ) -monstr.c: $(MAKEDEFS) ../include/pm.h - @( cd ../util ; $(MAKE) ../src/monstr.c ) -../include/vis_tab.h: $(MAKEDEFS) monstr.c +../include/vis_tab.h: $(MAKEDEFS) ../include/pm.h @( cd ../util ; $(MAKE) ../include/vis_tab.h ) # makedefs -z makes both vis_tab.h and vis_tab.c, but writes the .h first vis_tab.c: ../include/vis_tab.h @@ -659,7 +657,7 @@ clean: spotless: clean -rm -f a.out core $(GAME) Sys* -rm -f ../include/date.h ../include/onames.h ../include/pm.h - -rm -f monstr.c ../include/vis_tab.h vis_tab.c tile.c *.moc + -rm -f ../include/vis_tab.h vis_tab.c tile.c *.moc -rm -f ../win/gnome/gn_rip.h @@ -886,7 +884,6 @@ wc_chainout.o: ../win/chain/wc_chainout.c $(HACK_H) $(CC) $(CFLAGS) -c ../win/chain/wc_chainout.c wc_trace.o: ../win/chain/wc_trace.c $(HACK_H) ../include/func_tab.h $(CC) $(CFLAGS) -c ../win/chain/wc_trace.c -monstr.o: monstr.c $(CONFIG_H) vis_tab.o: vis_tab.c $(CONFIG_H) ../include/vis_tab.h allmain.o: allmain.c $(HACK_H) alloc.o: alloc.c $(CONFIG_H) diff --git a/sys/unix/Makefile.utl b/sys/unix/Makefile.utl index 78deeb23e..33316ed56 100644 --- a/sys/unix/Makefile.utl +++ b/sys/unix/Makefile.utl @@ -1,5 +1,5 @@ # Makefile for NetHack's utility programs. -# NetHack 3.6 Makefile.utl $NHDT-Date: 1526687364 2018/05/18 23:49:24 $ $NHDT-Branch: NetHack-3.6.2 $:$NHDT-Revision: 1.36 $ +# NetHack 3.6 Makefile.utl $NHDT-Date: 1539968067 2018/10/19 16:54:27 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.38 $ # Copyright (c) 2018 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. @@ -242,8 +242,6 @@ mdgreph: mdgrep.pl ./makedefs -o ../include/pm.h: makedefs ./makedefs -p -../src/monstr.c: makedefs - ./makedefs -m ../include/vis_tab.h: makedefs ./makedefs -z # makedefs -z makes both vis_tab.h and vis_tab.c, but writes the .h first @@ -447,7 +445,7 @@ tileedit: tileedit.cpp $(TEXT_IO) # ../src/foo:: # @( cd ../src ; $(MAKE) foo ) # would always force foo to be up-to-date according to the src Makefile -# when it's needed here. unfortunately, some makes believe this syntax +# when it's needed here. Unfortunately, some makes believe this syntax # means foo always changes, instead of foo should always be checked. # therefore, approximate via config.h dependencies, and hope that anybody # changing anything other than basic configuration also knows when not diff --git a/sys/winnt/Makefile.gcc b/sys/winnt/Makefile.gcc index 849724e55..f272bfcf7 100644 --- a/sys/winnt/Makefile.gcc +++ b/sys/winnt/Makefile.gcc @@ -352,7 +352,7 @@ VOBJ10 = $(O)mail.o $(O)makemon.o $(O)mapglyph.o $(O)mcastu.o VOBJ11 = $(O)mhitm.o $(O)mhitu.o $(O)minion.o $(O)mklev.o VOBJ12 = $(O)mkmap.o $(O)mkmaze.o $(O)mkobj.o $(O)mkroom.o VOBJ13 = $(O)mon.o $(O)mondata.o $(O)monmove.o $(O)monst.o -VOBJ14 = $(O)monstr.o $(O)mplayer.o $(O)mthrowu.o $(O)muse.o +VOBJ14 = $(O)mplayer.o $(O)mthrowu.o $(O)muse.o VOBJ15 = $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o VOBJ16 = $(O)options.o $(O)pager.o $(O)pickup.o $(O)pline.o VOBJ17 = $(O)polyself.o $(O)potion.o $(O)pray.o $(O)priest.o @@ -637,7 +637,7 @@ $(O)sp_lev.tag: $(O)utility.tag $(DAT)/bigroom.des $(DAT)/castle.des \ $(subst /,\,echo sp_levs done > $(O)sp_lev.tag) $(O)utility.tag: $(INCL)/date.h $(INCL)/onames.h $(INCL)/pm.h \ - $(SRC)/monstr.c $(SRC)/vis_tab.c $(U)levcomp.exe $(INCL)/vis_tab.h \ + $(SRC)/vis_tab.c $(U)levcomp.exe $(INCL)/vis_tab.h \ $(U)dgncomp.exe $(TILEUTIL16) $(subst /,\,@echo utilities made >$@) @echo utilities made. @@ -743,12 +743,6 @@ $(INCL)/onames.h : $(U)makedefs.exe $(INCL)/pm.h : $(U)makedefs.exe $(subst /,\,$(U)makedefs -p) -#$(INCL)/trap.h : $(U)makedefs.exe -# $(U)makedefs -t - -$(SRC)/monstr.c: $(U)makedefs.exe - $(subst /,\,$(U)makedefs -m) - $(INCL)/vis_tab.h: $(U)makedefs.exe $(subst /,\,$(U)makedefs -z) @@ -1129,7 +1123,6 @@ spotless: clean $(subst /,\,if exist $(DAT)/water.lev del $(DAT)/water.lev) $(subst /,\,if exist $(DAT)/wizard?.lev del $(DAT)/wizard?.lev) $(subst /,\,if exist $(O)sp_lev.tag del $(O)sp_lev.tag) - $(subst /,\,if exist $(SRC)/monstr.c del $(SRC)/monstr.c) $(subst /,\,if exist $(SRC)/vis_tab.c del $(SRC)/vis_tab.c) $(subst /,\,if exist $(U)recover.exe del $(U)recover.exe) $(subst /,\,if exist $(DAT)/dlb.lst del $(DAT)/dlb.lst) @@ -1400,7 +1393,6 @@ $(O)qt_clust.o: ../win/Qt/qt_clust.cpp $(INCL)/qt_clust.h $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_clust.cpp $(O)qttableview.o: ../win/Qt/qttableview.cpp $(INCL)/qttableview.h $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qttableview.cpp -$(O)monstr.o: monstr.c $(CONFIG_H) $(O)vis_tab.o: vis_tab.c $(CONFIG_H) $(INCL)/vis_tab.h $(O)allmain.o: allmain.c $(HACK_H) $(O)alloc.o: alloc.c $(CONFIG_H) diff --git a/sys/winnt/Makefile.msc b/sys/winnt/Makefile.msc index 8ab19ea36..b1f1e3fc0 100644 --- a/sys/winnt/Makefile.msc +++ b/sys/winnt/Makefile.msc @@ -384,7 +384,7 @@ VOBJ10 = $(O)mail.o $(O)pcmain.o $(O)makemon.o $(O)mapglyph.o $(O)mcastu. VOBJ11 = $(O)mhitm.o $(O)mhitu.o $(O)minion.o $(O)mklev.o VOBJ12 = $(O)mkmap.o $(O)mkmaze.o $(O)mkobj.o $(O)mkroom.o VOBJ13 = $(O)mon.o $(O)mondata.o $(O)monmove.o $(O)monst.o -VOBJ14 = $(O)monstr.o $(O)mplayer.o $(O)mthrowu.o $(O)muse.o +VOBJ14 = $(O)mplayer.o $(O)mthrowu.o $(O)muse.o VOBJ15 = $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o VOBJ16 = $(O)options.o $(O)pager.o $(O)pickup.o $(O)pline.o VOBJ17 = $(O)polyself.o $(O)potion.o $(O)pray.o $(O)priest.o @@ -638,7 +638,7 @@ $(O)sp_lev.tag: $(O)utility.tag $(DAT)\bigroom.des $(DAT)\castle.des \ echo sp_levs done > $(O)sp_lev.tag $(O)utility.tag: $(INCL)\date.h $(INCL)\onames.h $(INCL)\pm.h \ - $(SRC)\monstr.c $(SRC)\vis_tab.c \ + $(SRC)\vis_tab.c \ $(U)levcomp.exe $(INCL)\vis_tab.h \ $(U)dgncomp.exe $(TILEUTIL16) @echo utilities made >$@ @@ -839,12 +839,6 @@ $(INCL)\onames.h : $(U)makedefs.exe $(INCL)\pm.h : $(U)makedefs.exe $(U)makedefs -p -#$(INCL)\trap.h : $(U)makedefs.exe -# $(U)makedefs -t - -$(SRC)\monstr.c: $(U)makedefs.exe - $(U)makedefs -m - $(INCL)\vis_tab.h: $(U)makedefs.exe $(U)makedefs -z @@ -1234,7 +1228,6 @@ spotless: clean if exist $(DAT)\dlb.lst del $(DAT)\dlb.lst if exist $(DAT)\porthelp del $(DAT)\porthelp if exist $(O)sp_lev.tag del $(O)sp_lev.tag - if exist $(SRC)\monstr.c del $(SRC)\monstr.c if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c if exist nhdat. del nhdat. if exist $(O)obj.tag del $(O)obj.tag @@ -1520,7 +1513,6 @@ $(O)wc_chainout.o: ..\win\chain\wc_chainout.c $(HACK_H) @$(cc) $(cflagsBuild) -Fo$@ ..\win\chain\wc_chainout.c $(O)wc_trace.o: ..\win\chain\wc_trace.c $(HACK_H) $(INCL)\func_tab.h @$(cc) $(cflagsBuild) -Fo$@ ..\win\chain\wc_trace.c -$(O)monstr.o: monstr.c $(CONFIG_H) $(O)vis_tab.o: vis_tab.c $(CONFIG_H) $(INCL)\vis_tab.h $(O)allmain.o: allmain.c $(HACK_H) $(O)alloc.o: alloc.c $(CONFIG_H) diff --git a/util/makedefs.c b/util/makedefs.c index 11ce64d12..19227c3aa 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 makedefs.c $NHDT-Date: 1520022901 2018/03/02 20:35:01 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.121 $ */ +/* NetHack 3.6 makedefs.c $NHDT-Date: 1539804926 2018/10/17 19:35:26 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.126 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. */ /* Copyright (c) M. Stephenson, 1990, 1991. */ @@ -183,8 +183,6 @@ static boolean FDECL(get_gitinfo, (char *, char *)); static void FDECL(do_rnd_access_file, (const char *)); static boolean FDECL(d_filter, (char *)); static boolean FDECL(h_filter, (char *)); -static boolean FDECL(ranged_attk, (struct permonst *)); -static int FDECL(mstrength, (struct permonst *)); static void NDECL(build_savebones_compat_string); static void NDECL(windowing_sanity); @@ -2197,89 +2195,18 @@ do_dungeon() return; } -static boolean -ranged_attk(ptr) /* returns TRUE if monster can attack at range */ -register struct permonst *ptr; -{ - register int i, j; - register int atk_mask = (1 << AT_BREA) | (1 << AT_SPIT) | (1 << AT_GAZE); - - for (i = 0; i < NATTK; i++) { - if ((j = ptr->mattk[i].aatyp) >= AT_WEAP || (atk_mask & (1 << j))) - return TRUE; - } - - return FALSE; -} - -/* This routine is designed to return an integer value which represents - * an approximation of monster strength. It uses a similar method of - * determination as "experience()" to arrive at the strength. - */ -static int -mstrength(ptr) -struct permonst *ptr; -{ - int i, tmp2, n, tmp = ptr->mlevel; - - if (tmp > 49) /* special fixed hp monster */ - tmp = 2 * (tmp - 6) / 4; - - /* For creation in groups */ - n = (!!(ptr->geno & G_SGROUP)); - n += (!!(ptr->geno & G_LGROUP)) << 1; - - /* For ranged attacks */ - if (ranged_attk(ptr)) - n++; - - /* For higher ac values */ - n += (ptr->ac < 4); - n += (ptr->ac < 0); - - /* For very fast monsters */ - n += (ptr->mmove >= 18); - - /* For each attack and "special" attack */ - for (i = 0; i < NATTK; i++) { - tmp2 = ptr->mattk[i].aatyp; - n += (tmp2 > 0); - n += (tmp2 == AT_MAGC); - n += (tmp2 == AT_WEAP && (ptr->mflags2 & M2_STRONG)); - } - - /* For each "special" damage type */ - for (i = 0; i < NATTK; i++) { - tmp2 = ptr->mattk[i].adtyp; - if ((tmp2 == AD_DRLI) || (tmp2 == AD_STON) || (tmp2 == AD_DRST) - || (tmp2 == AD_DRDX) || (tmp2 == AD_DRCO) || (tmp2 == AD_WERE)) - n += 2; - else if (strcmp(ptr->mname, "grid bug")) - n += (tmp2 != AD_PHYS); - n += ((int) (ptr->mattk[i].damd * ptr->mattk[i].damn) > 23); - } - - /* Leprechauns are special cases. They have many hit dice so they can - hit and are hard to kill, but they don't really do much damage. */ - if (!strcmp(ptr->mname, "leprechaun")) - n -= 2; - - /* Finally, adjust the monster level 0 <= n <= 24 (approx.) */ - if (n == 0) - tmp--; - else if (n >= 6) - tmp += (n / 2); - else - tmp += (n / 3 + 1); - - return (tmp >= 0) ? tmp : 0; -} - void do_monstr() { - register struct permonst *ptr; - register int i, j; + /* Don't break anything for ports that haven't been updated. */ + printf("DEPRECATION WARNINGS:\n"); + printf("'makedefs -m' is deprecated. Remove all references\n"); + printf(" to it from the build process.\n"); + printf("'monstr.c' is deprecated. Remove all references to\n"); + printf(" it from the build process.\n"); + printf("monstr[] is deprecated. Replace monstr[x] with\n"); + printf(" mons[x].difficulty\n"); + printf("monstr_init() is deprecated. Remove all references to it.\n"); /* * create the source file, "monstr.c" @@ -2295,15 +2222,18 @@ do_monstr() } Fprintf(ofp, "%s", Dont_Edit_Code); Fprintf(ofp, "#include \"config.h\"\n"); - Fprintf(ofp, "\nconst int monstr[] = {\n"); - for (ptr = &mons[0], j = 0; ptr->mlet; ptr++) { - SpinCursor(3); - - i = mstrength(ptr); - Fprintf(ofp, "%2d,%c", i, (++j & 15) ? ' ' : '\n'); - } - /* might want to insert a final 0 entry here instead of just newline */ - Fprintf(ofp, "%s};\n", (j & 15) ? "\n" : ""); + Fprintf(ofp, "\nconst int monstrXXX[] = {\n"); + Fprintf(ofp, "0};\n"); + Fprintf(ofp, "/*\n"); + Fprintf(ofp, "DEPRECATION WARNINGS:\n"); + Fprintf(ofp, "'makedefs -m' is deprecated. Remove all references\n"); + Fprintf(ofp, " to it from the build process.\n"); + Fprintf(ofp, "'monstr.c' is deprecated. Remove all references to\n"); + Fprintf(ofp, " it from the build process.\n"); + Fprintf(ofp, "monstr[] is deprecated. Replace monstr[x] with\n"); + Fprintf(ofp, " mons[x].difficulty\n"); + Fprintf(ofp, "monstr_init() is deprecated. Remove all references to it.\n"); + Fprintf(ofp, "*/\n"); Fprintf(ofp, "\nvoid NDECL(monstr_init);\n"); Fprintf(ofp, "\nvoid\n"); diff --git a/win/X11/NetHack.ad b/win/X11/NetHack.ad index f7ec10613..0e5ca8b1f 100644 --- a/win/X11/NetHack.ad +++ b/win/X11/NetHack.ad @@ -100,6 +100,10 @@ NetHack*highlight_prompt: False ! has a lot of popups and is almost unplayable without some kind of autofocus. !NetHack*autofocus: True ! + +! True, use a "fancy" style status area vs. TTY-style status lines +!NetHack*fancy_status: False + ! Specify the number of rows and columns of the map window. The default ! is the standard 80x21 window. Note: this _does_not_ change nethack's ! level size, only what you see of it. @@ -170,80 +174,80 @@ NetHack*player_selection_dialog*play.cornerRoundPercent: NETHACK_BTN_ROUND ! role selection window (OPTIONS=player_selection:prompts) -NetHack*player_selection*random.foreground: NETHACK_CLR_RANDOM -NetHack*player_selection*random.background: black -NetHack*player_selection*random.borderColor: NETHACK_CLR_RANDOM -NetHack*player_selection*random.borderWidth: 1 -NetHack*player_selection*random.shapeStyle: NETHACK_BTN_SHAPE -NetHack*player_selection*random.cornerRoundPercent: NETHACK_BTN_ROUND -NetHack*player_selection*quit.foreground: NETHACK_CLR_QUIT -NetHack*player_selection*quit.borderColor: NETHACK_CLR_QUIT -NetHack*player_selection*quit.borderWidth: 1 -NetHack*player_selection*quit.shapeStyle: NETHACK_BTN_SHAPE -NetHack*player_selection*quit.cornerRoundPercent: NETHACK_BTN_ROUND +NetHack*player_selection*btn_random.foreground: NETHACK_CLR_RANDOM +NetHack*player_selection*btn_random.background: black +NetHack*player_selection*btn_random.borderColor: NETHACK_CLR_RANDOM +NetHack*player_selection*btn_random.borderWidth: 1 +NetHack*player_selection*btn_random.shapeStyle: NETHACK_BTN_SHAPE +NetHack*player_selection*btn_random.cornerRoundPercent: NETHACK_BTN_ROUND +NetHack*player_selection*btn_quit.foreground: NETHACK_CLR_QUIT +NetHack*player_selection*btn_quit.borderColor: NETHACK_CLR_QUIT +NetHack*player_selection*btn_quit.borderWidth: 1 +NetHack*player_selection*btn_quit.shapeStyle: NETHACK_BTN_SHAPE +NetHack*player_selection*btn_quit.cornerRoundPercent: NETHACK_BTN_ROUND NetHack*player_selection*Command.foreground: NETHACK_CLR_FG NetHack*player_selection*Command.borderColor: NETHACK_CLR_FG NetHack*player_selection*Command.borderWidth: NETHACK_CMD_BORDER ! race selection window -NetHack*race_selection*random.foreground: NETHACK_CLR_RANDOM -NetHack*race_selection*random.background: black -NetHack*race_selection*random.borderColor: NETHACK_CLR_RANDOM -NetHack*race_selection*random.borderWidth: 1 -NetHack*race_selection*random.shapeStyle: NETHACK_BTN_SHAPE -NetHack*race_selection*random.cornerRoundPercent: NETHACK_BTN_ROUND -NetHack*race_selection*quit.foreground: NETHACK_CLR_QUIT -NetHack*race_selection*quit.borderColor: NETHACK_CLR_QUIT -NetHack*race_selection*quit.borderWidth: 1 -NetHack*race_selection*quit.shapeStyle: NETHACK_BTN_SHAPE -NetHack*race_selection*quit.cornerRoundPercent: NETHACK_BTN_ROUND +NetHack*race_selection*btn_random.foreground: NETHACK_CLR_RANDOM +NetHack*race_selection*btn_random.background: black +NetHack*race_selection*btn_random.borderColor: NETHACK_CLR_RANDOM +NetHack*race_selection*btn_random.borderWidth: 1 +NetHack*race_selection*btn_random.shapeStyle: NETHACK_BTN_SHAPE +NetHack*race_selection*btn_random.cornerRoundPercent: NETHACK_BTN_ROUND +NetHack*race_selection*btn_quit.foreground: NETHACK_CLR_QUIT +NetHack*race_selection*btn_quit.borderColor: NETHACK_CLR_QUIT +NetHack*race_selection*btn_quit.borderWidth: 1 +NetHack*race_selection*btn_quit.shapeStyle: NETHACK_BTN_SHAPE +NetHack*race_selection*btn_quit.cornerRoundPercent: NETHACK_BTN_ROUND NetHack*race_selection*Command.foreground: NETHACK_CLR_FG NetHack*race_selection*Command.borderColor: NETHACK_CLR_FG NetHack*race_selection*Command.borderWidth: NETHACK_CMD_BORDER ! gender selection window -NetHack*gender_selection*random.foreground: NETHACK_CLR_RANDOM -NetHack*gender_selection*random.background: black -NetHack*gender_selection*random.borderColor: NETHACK_CLR_RANDOM -NetHack*gender_selection*random.borderWidth: 1 -NetHack*gender_selection*random.shapeStyle: NETHACK_BTN_SHAPE -NetHack*gender_selection*random.cornerRoundPercent: NETHACK_BTN_ROUND -NetHack*gender_selection*quit.foreground: NETHACK_CLR_QUIT -NetHack*gender_selection*quit.borderColor: NETHACK_CLR_QUIT -NetHack*gender_selection*quit.borderWidth: 1 -NetHack*gender_selection*quit.shapeStyle: NETHACK_BTN_SHAPE -NetHack*gender_selection*quit.cornerRoundPercent: NETHACK_BTN_ROUND +NetHack*gender_selection*btn_random.foreground: NETHACK_CLR_RANDOM +NetHack*gender_selection*btn_random.background: black +NetHack*gender_selection*btn_random.borderColor: NETHACK_CLR_RANDOM +NetHack*gender_selection*btn_random.borderWidth: 1 +NetHack*gender_selection*btn_random.shapeStyle: NETHACK_BTN_SHAPE +NetHack*gender_selection*btn_random.cornerRoundPercent: NETHACK_BTN_ROUND +NetHack*gender_selection*btn_quit.foreground: NETHACK_CLR_QUIT +NetHack*gender_selection*btn_quit.borderColor: NETHACK_CLR_QUIT +NetHack*gender_selection*btn_quit.borderWidth: 1 +NetHack*gender_selection*btn_quit.shapeStyle: NETHACK_BTN_SHAPE +NetHack*gender_selection*btn_quit.cornerRoundPercent: NETHACK_BTN_ROUND NetHack*gender_selection*Command.foreground: NETHACK_CLR_FG NetHack*gender_selection*Command.borderColor: NETHACK_CLR_FG NetHack*gender_selection*Command.borderWidth: NETHACK_CMD_BORDER ! alignment selection window -NetHack*alignment_selection*random.foreground: NETHACK_CLR_RANDOM -NetHack*alignment_selection*random.background: black -NetHack*alignment_selection*random.borderColor: NETHACK_CLR_RANDOM -NetHack*alignment_selection*random.borderWidth: 1 -NetHack*alignment_selection*random.shapeStyle: NETHACK_BTN_SHAPE -NetHack*alignment_selection*random.cornerRoundPercent: NETHACK_BTN_ROUND -NetHack*alignment_selection*quit.foreground: NETHACK_CLR_QUIT -NetHack*alignment_selection*quit.borderColor: NETHACK_CLR_QUIT -NetHack*alignment_selection*quit.borderWidth: 1 -NetHack*alignment_selection*quit.shapeStyle: NETHACK_BTN_SHAPE -NetHack*alignment_selection*quit.cornerRoundPercent: NETHACK_BTN_ROUND +NetHack*alignment_selection*btn_random.foreground: NETHACK_CLR_RANDOM +NetHack*alignment_selection*btn_random.background: black +NetHack*alignment_selection*btn_random.borderColor: NETHACK_CLR_RANDOM +NetHack*alignment_selection*btn_random.borderWidth: 1 +NetHack*alignment_selection*btn_random.shapeStyle: NETHACK_BTN_SHAPE +NetHack*alignment_selection*btn_random.cornerRoundPercent: NETHACK_BTN_ROUND +NetHack*alignment_selection*btn_quit.foreground: NETHACK_CLR_QUIT +NetHack*alignment_selection*btn_quit.borderColor: NETHACK_CLR_QUIT +NetHack*alignment_selection*btn_quit.borderWidth: 1 +NetHack*alignment_selection*btn_quit.shapeStyle: NETHACK_BTN_SHAPE +NetHack*alignment_selection*btn_quit.cornerRoundPercent: NETHACK_BTN_ROUND NetHack*alignment_selection*Command.foreground: NETHACK_CLR_FG NetHack*alignment_selection*Command.borderColor: NETHACK_CLR_FG NetHack*alignment_selection*Command.borderWidth: NETHACK_CMD_BORDER ! extended commands window -NetHack*extended_commands*dismiss.foreground: NETHACK_CLR_QUIT -NetHack*extended_commands*dismiss.borderColor: NETHACK_CLR_QUIT -NetHack*extended_commands*dismiss.borderWidth: 1 -NetHack*extended_commands*dismiss.shapeStyle: NETHACK_BTN_SHAPE -NetHack*extended_commands*dismiss.cornerRoundPercent: NETHACK_BTN_ROUND -NetHack*extended_commands*help.foreground: NETHACK_CLR_HELP -NetHack*extended_commands*help.borderColor: NETHACK_CLR_HELP -NetHack*extended_commands*help.borderWidth: 1 -NetHack*extended_commands*help.shapeStyle: NETHACK_BTN_SHAPE -NetHack*extended_commands*help.cornerRoundPercent: NETHACK_BTN_ROUND +NetHack*extended_commands*btn_dismiss.foreground: NETHACK_CLR_QUIT +NetHack*extended_commands*btn_dismiss.borderColor: NETHACK_CLR_QUIT +NetHack*extended_commands*btn_dismiss.borderWidth: 1 +NetHack*extended_commands*btn_dismiss.shapeStyle: NETHACK_BTN_SHAPE +NetHack*extended_commands*btn_dismiss.cornerRoundPercent: NETHACK_BTN_ROUND +NetHack*extended_commands*btn_help.foreground: NETHACK_CLR_HELP +NetHack*extended_commands*btn_help.borderColor: NETHACK_CLR_HELP +NetHack*extended_commands*btn_help.borderWidth: 1 +NetHack*extended_commands*btn_help.shapeStyle: NETHACK_BTN_SHAPE +NetHack*extended_commands*btn_help.cornerRoundPercent: NETHACK_BTN_ROUND NetHack*extended_commands*Command.foreground: NETHACK_CLR_FG NetHack*extended_commands*Command.borderColor: NETHACK_CLR_FG NetHack*extended_commands*Command.borderWidth: NETHACK_CMD_BORDER @@ -302,13 +306,13 @@ NetHack*map*green: green3 NetHack*map*brown: DarkOrange3 NetHack*map*blue: blue3 NetHack*map*magenta: magenta3 -NetHack*map*cyan: cyan3 +NetHack*map*cyan: Dark cyan NetHack*map*gray: gray50 -NetHack*map*orange: yellow +NetHack*map*orange: orange NetHack*map*bright_green: green NetHack*map*yellow: yellow -NetHack*map*bright_blue: blue -NetHack*map*bright_magenta: magenta +NetHack*map*bright_blue: Royal blue +NetHack*map*bright_magenta: Fuchsia NetHack*map*bright_cyan: cyan NetHack*map*white: white ! diff --git a/win/X11/winX.c b/win/X11/winX.c index 009f4e6ab..f914521f0 100644 --- a/win/X11/winX.c +++ b/win/X11/winX.c @@ -49,6 +49,7 @@ #include "hack.h" #include "winX.h" #include "dlb.h" +#include "xwindow.h" #ifndef NO_SIGNAL #include @@ -103,7 +104,7 @@ struct window_procs X11_procs = { (WC_COLOR | WC_HILITE_PET | WC_ASCII_MAP | WC_TILED_MAP | WC_PLAYER_SELECTION | WC_PERM_INVENT | WC_MOUSE_SUPPORT), #if defined(STATUS_HILITES) - WC2_FLUSH_STATUS | WC2_RESET_STATUS | + WC2_FLUSH_STATUS | WC2_RESET_STATUS | WC2_HILITE_STATUS | #endif 0L, X11_init_nhwindows, @@ -133,9 +134,9 @@ struct window_procs X11_procs = { #else genl_outrip, #endif - X11_preference_update, genl_getmsghistory, genl_putmsghistory, - genl_status_init, genl_status_finish, genl_status_enablefield, - genl_status_update, + X11_preference_update, X11_getmsghistory, X11_putmsghistory, + X11_status_init, X11_status_finish, X11_status_enablefield, + X11_status_update, genl_can_suspend_no, /* XXX may not always be correct */ }; @@ -181,6 +182,43 @@ static winid message_win = WIN_ERR, /* These are the winids of the message, */ status_win = WIN_ERR; /* are created in init_windows(). */ static Pixmap icon_pixmap = None; /* Pixmap for icon. */ +void +X11_putmsghistory(msg, is_restoring) +const char *msg; +boolean is_restoring; +{ + if (WIN_MESSAGE != WIN_ERR) { + struct xwindow *wp = &window_list[WIN_MESSAGE]; + debugpline2("X11_putmsghistory('%s',%i)", msg, is_restoring); + if (msg) + append_message(wp, msg); + } +} + +char * +X11_getmsghistory(init) +boolean init; +{ + if (WIN_MESSAGE != WIN_ERR) { + static struct line_element *curr = (struct line_element *) 0; + static int numlines = 0; + struct xwindow *wp = &window_list[WIN_MESSAGE]; + + if (!curr) { + curr = wp->mesg_information->head; + numlines = 0; + } + + if (numlines < wp->mesg_information->num_lines) { + curr = curr->next; + numlines++; + debugpline2("X11_getmsghistory(%i)='%s'", init, curr->line); + return curr->line; + } + } + return (char *) 0; +} + /* * Find the window structure that corresponds to the given widget. Note * that this is not the popup widget, nor the viewport, but the child. @@ -226,6 +264,102 @@ find_free_window() return (winid) windex; } + +XColor +get_nhcolor(wp, clr) +struct xwindow *wp; +int clr; +{ + init_menu_nhcolors(wp); + /* FIXME: init_menu_nhcolors may fail */ + + if (clr >= 0 && clr < CLR_MAX) + return wp->nh_colors[clr]; + + return wp->nh_colors[0]; +} + +void +init_menu_nhcolors(wp) +struct xwindow *wp; +{ + static const char *mapCLR_to_res[CLR_MAX] = { + XtNblack, + XtNred, + XtNgreen, + XtNbrown, + XtNblue, + XtNmagenta, + XtNcyan, + XtNgray, + XtNforeground, + XtNorange, + XtNbright_green, + XtNyellow, + XtNbright_blue, + XtNbright_magenta, + XtNbright_cyan, + XtNwhite, + }; + Display *dpy; + Colormap screen_colormap; + XrmDatabase rDB; + XrmValue value; + Status rc; + int color; + char *ret_type[32]; + char clr_name[BUFSZ]; + char clrclass[BUFSZ]; + const char *wintypenames[NHW_TEXT] = { + "message", "status", "map", "menu", "text" + }; + const char *wtn; + char wtn_up[BUFSZ]; + + if (wp->nh_colors_inited || !wp->type) + return; + + wtn = wintypenames[wp->type - 1]; + Strcpy(wtn_up, wtn); + (void) upstart(wtn_up); + + dpy = XtDisplay(wp->w); + screen_colormap = DefaultColormap(dpy, DefaultScreen(dpy)); + rDB = XrmGetDatabase(dpy); + + for (color = 0; color < CLR_MAX; color++) { + Sprintf(clr_name, "nethack.%s.%s", wtn, mapCLR_to_res[color]); + Sprintf(clrclass, "NetHack.%s.%s", wtn_up, mapCLR_to_res[color]); + + if (!XrmGetResource(rDB, clr_name, clrclass, ret_type, &value)) { + Sprintf(clr_name, "nethack.map.%s", mapCLR_to_res[color]); + Sprintf(clrclass, "NetHack.Map.%s", mapCLR_to_res[color]); + } + + if (!XrmGetResource(rDB, clr_name, clrclass, ret_type, &value)) { + impossible("XrmGetResource error (%s)", clr_name); + } else if (!strcmp(ret_type[0], "String")) { + char tmpbuf[256]; + + if (value.size >= sizeof tmpbuf) + value.size = sizeof tmpbuf - 1; + (void) strncpy(tmpbuf, (char *) value.addr, (int) value.size); + tmpbuf[value.size] = '\0'; + /* tmpbuf now contains the color name from the named resource */ + + rc = XAllocNamedColor(dpy, screen_colormap, tmpbuf, + &wp->nh_colors[color], + &wp->nh_colors[color]); + if (rc == 0) { + impossible("XAllocNamedColor failed for color %i (%s)", + color, clr_name); + } + } + } + + wp->nh_colors_inited = TRUE; +} + /* * Color conversion. The default X11 color converters don't try very * hard to find matching colors in PseudoColor visuals. If they can't @@ -515,6 +649,31 @@ const char *fontname; return buf; } +void +load_boldfont(wp, w) +struct xwindow *wp; +Widget w; +{ + Arg args[1]; + XFontStruct *fs; + unsigned long ret; + char *fontname; + Display *dpy; + + if (wp->boldfs) + return; + + XtSetArg(args[0], nhStr(XtNfont), &fs); + XtGetValues(w, args, 1); + + if (!XGetFontProperty(fs, XA_FONT, &ret)) + return; + + wp->boldfs_dpy = dpy = XtDisplay(w); + fontname = fontname_boldify(XGetAtomName(dpy, (Atom)ret)); + wp->boldfs = XLoadQueryFont(dpy, fontname); +} + #ifdef TEXTCOLOR /* ARGSUSED */ static void @@ -790,9 +949,11 @@ const char *str; toplines[TBUFSZ - 1] = 0; append_message(wp, str); break; +#ifndef STATUS_HILITES case NHW_STATUS: adjust_status(wp, str); break; +#endif case NHW_MAP: impossible("putstr: called on map window \"%s\"", str); break; @@ -913,6 +1074,9 @@ int type; wp->prevx = wp->prevy = wp->cursx = wp->cursy = wp->pixel_width = wp->pixel_height = 0; wp->keep_window = FALSE; + wp->nh_colors_inited = FALSE; + wp->boldfs = (XFontStruct *) 0; + wp->boldfs_dpy = (Display *) 0; switch (type) { case NHW_MAP: @@ -1057,6 +1221,12 @@ winid window; WIN_INVEN = WIN_ERR; } + if (wp->boldfs) { + XFreeFont(wp->boldfs_dpy, wp->boldfs); + wp->boldfs = (XFontStruct *) 0; + wp->boldfs_dpy = (Display *) 0; + } + switch (wp->type) { case NHW_MAP: destroy_map_window(wp); @@ -1230,6 +1400,8 @@ static XtActionsRec actions[] = { static XtResource resources[] = { { nhStr("slow"), nhStr("Slow"), XtRBoolean, sizeof(Boolean), XtOffset(AppResources *, slow), XtRString, nhStr("True") }, + { nhStr("fancy_status"), nhStr("Fancy_status"), XtRBoolean, sizeof(Boolean), + XtOffset(AppResources *, fancy_status), XtRString, nhStr("True") }, { nhStr("autofocus"), nhStr("AutoFocus"), XtRBoolean, sizeof(Boolean), XtOffset(AppResources *, autofocus), XtRString, nhStr("False") }, { nhStr("message_line"), nhStr("Message_line"), XtRBoolean, @@ -2214,7 +2386,7 @@ static int input_event(exit_condition) int exit_condition; { - if (WIN_STATUS != WIN_ERR) /* hilighting on the fancy status window */ + if (appResources.fancy_status && WIN_STATUS != WIN_ERR) /* hilighting on the fancy status window */ check_turn_events(); if (WIN_MAP != WIN_ERR) /* make sure cursor is not clipped */ check_cursor_visibility(&window_list[WIN_MAP]); @@ -2484,7 +2656,8 @@ init_standard_windows() * after the fancy status widget is realized (above, with the game popup), * but before it is popped up. */ - null_out_status(); + if (appResources.fancy_status) + null_out_status(); /* * Set the map size to its standard size. As with the message window * above, the map window needs to be set to its constrained size until diff --git a/win/X11/winmenu.c b/win/X11/winmenu.c index 49cd79162..e10adcab4 100644 --- a/win/X11/winmenu.c +++ b/win/X11/winmenu.c @@ -32,12 +32,9 @@ #undef PRESERVE_NO_SYSV #endif -#include "xwindow.h" #include "hack.h" #include "winX.h" -XColor FDECL(get_nhcolor, (struct xwindow *, int)); -static void FDECL(init_menu_nhcolors, (struct xwindow *)); static void FDECL(menu_size_change_handler, (Widget, XtPointer, XEvent *, Boolean *)); static void FDECL(menu_select, (Widget, XtPointer, XtPointer)); @@ -55,7 +52,6 @@ static void FDECL(invert_all, (struct xwindow *)); static void FDECL(invert_match, (struct xwindow *, char *)); static void FDECL(menu_popdown, (struct xwindow *)); static Widget FDECL(menu_create_buttons, (struct xwindow *, Widget, Widget)); -static void FDECL(load_boldfont, (struct xwindow *, Widget)); static void FDECL(menu_create_entries, (struct xwindow *, struct menu *)); static void FDECL(destroy_menu_entry_widgets, (struct xwindow *)); static void NDECL(create_menu_translation_tables); @@ -1121,31 +1117,6 @@ Widget form,under; return all; } -static void -load_boldfont(wp, w) -struct xwindow *wp; -Widget w; -{ - Arg args[1]; - XFontStruct *fs; - unsigned long ret; - char *fontname; - Display *dpy; - - if (wp->menu_information->boldfs) - return; - - XtSetArg(args[0], nhStr(XtNfont), &fs); - XtGetValues(w, args, 1); - - if (!XGetFontProperty(fs, XA_FONT, &ret)) - return; - - wp->menu_information->boldfs_dpy = dpy = XtDisplay(w); - fontname = fontname_boldify(XGetAtomName(dpy, (Atom)ret)); - wp->menu_information->boldfs = XLoadQueryFont(dpy, fontname); -} - static void menu_create_entries(wp, curr_menu) struct xwindow *wp; @@ -1185,7 +1156,7 @@ struct menu *curr_menu; get_nhcolor(wp, color).pixel); num_args++; } - /* TODO: ATR_BOLD, ATR_DIM, ATR_ULINE, ATR_BLINK */ + /* TODO: ATR_DIM, ATR_ULINE, ATR_BLINK */ if (attr == ATR_INVERSE) { XtSetArg(args[num_args], nhStr(XtNforeground), @@ -1215,7 +1186,7 @@ struct menu *curr_menu; load_boldfont(wp, curr->w); num_args = 0; XtSetArg(args[num_args], nhStr(XtNfont), - wp->menu_information->boldfs); num_args++; + wp->boldfs); num_args++; XtSetValues(curr->w, args, num_args); } @@ -1315,91 +1286,6 @@ struct xwindow *wp; } } -XColor -get_nhcolor(wp, clr) -struct xwindow *wp; -int clr; -{ - init_menu_nhcolors(wp); - - if (clr >= 0 && clr < CLR_MAX) - return wp->menu_information->nh_colors[clr]; - - return wp->menu_information->nh_colors[0]; -} - -static void -init_menu_nhcolors(wp) -struct xwindow *wp; -{ - static const char *mapCLR_to_res[CLR_MAX] = { - XtNblack, - XtNred, - XtNgreen, - XtNbrown, - XtNblue, - XtNmagenta, - XtNcyan, - XtNgray, - XtNforeground, - XtNorange, - XtNbright_green, - XtNyellow, - XtNbright_blue, - XtNbright_magenta, - XtNbright_cyan, - XtNwhite, - }; - Display *dpy; - Colormap screen_colormap; - XrmDatabase rDB; - XrmValue value; - Status rc; - int color; - char *ret_type[32]; - char clr_name[BUFSZ]; - char clrclass[BUFSZ]; - - if (wp->menu_information->nh_colors_inited) - return; - - dpy = XtDisplay(wp->w); - screen_colormap = DefaultColormap(dpy, DefaultScreen(dpy)); - rDB = XrmGetDatabase(dpy); - - for (color = 0; color < CLR_MAX; color++) { - Sprintf(clr_name, "nethack.menu.%s", mapCLR_to_res[color]); - Sprintf(clrclass, "NetHack.Menu.%s", mapCLR_to_res[color]); - - if (!XrmGetResource(rDB, clr_name, clrclass, ret_type, &value)) { - Sprintf(clr_name, "nethack.map.%s", mapCLR_to_res[color]); - Sprintf(clrclass, "NetHack.Map.%s", mapCLR_to_res[color]); - } - - if (!XrmGetResource(rDB, clr_name, clrclass, ret_type, &value)) { - impossible("XrmGetResource error (%s)", clr_name); - } else if (!strcmp(ret_type[0], "String")) { - char tmpbuf[256]; - - if (value.size >= sizeof tmpbuf) - value.size = sizeof tmpbuf - 1; - (void) strncpy(tmpbuf, (char *) value.addr, (int) value.size); - tmpbuf[value.size] = '\0'; - /* tmpbuf now contains the color name from the named resource */ - - rc = XAllocNamedColor(dpy, screen_colormap, tmpbuf, - &wp->menu_information->nh_colors[color], - &wp->menu_information->nh_colors[color]); - if (rc == 0) { - impossible("XAllocNamedColor failed for color %i (%s)", - color, clr_name); - } - } - } - - wp->menu_information->nh_colors_inited = TRUE; -} - void create_menu_window(wp) struct xwindow *wp; @@ -1413,7 +1299,6 @@ struct xwindow *wp; reset_menu_to_default(&wp->menu_information->new_menu); reset_menu_count(wp->menu_information); wp->w = wp->popup = (Widget) 0; - wp->menu_information->nh_colors_inited = FALSE; wp->menu_information->permi_x = -1; wp->menu_information->permi_y = -1; wp->menu_information->permi_w = -1; @@ -1425,9 +1310,6 @@ destroy_menu_window(wp) struct xwindow *wp; { clear_old_menu(wp); /* this will also destroy the widgets */ - if (wp->menu_information->boldfs) - XFreeFont(wp->menu_information->boldfs_dpy, - wp->menu_information->boldfs); free((genericptr_t) wp->menu_information); wp->menu_information = (struct menu_info_t *) 0; wp->type = NHW_NONE; /* allow re-use */ diff --git a/win/X11/winmesg.c b/win/X11/winmesg.c index 5a019ee2c..32f3909b2 100644 --- a/win/X11/winmesg.c +++ b/win/X11/winmesg.c @@ -50,6 +50,8 @@ static char mesg_translations[] = "#override\n\ Right: scroll(6)\n\ Up: scroll(8)\n\ Down: scroll(2)\n\ + : scroll(8)\n\ + : scroll(2)\n\ : input()"; /* Move the message window's vertical scrollbar's slider to the bottom. */ diff --git a/win/X11/winmisc.c b/win/X11/winmisc.c index 02ca117b6..567f2ba84 100644 --- a/win/X11/winmisc.c +++ b/win/X11/winmisc.c @@ -1247,11 +1247,10 @@ X11_player_selection_dialog() } else { ps_selected = -1; nh_XtPopup(popup, (int) XtGrabExclusive, form); + /* The callback will enable the event loop exit. */ + (void) x_event(EXIT_ON_EXIT); } - /* The callback will enable the event loop exit. */ - (void) x_event(flags.randomall ? EXIT_ON_SENT_EVENT : EXIT_ON_EXIT); - nh_XtPopdown(popup); XtDestroyWidget(popup); @@ -1994,11 +1993,12 @@ Widget *formp; /* return */ Widget popup, popform, form, label, above, left, right, view; Widget *commands, *curr; int i; - Arg args[8]; + Arg args[12]; Cardinal num_args; Dimension width, other_width, max_width, border_width, height, cumulative_height, screen_height; int distance, skip; + char btnname[BUFSZ]; commands = (Widget *) alloc((unsigned) num_names * sizeof (Widget)); @@ -2073,11 +2073,13 @@ Widget *formp; /* return */ */ num_args = 0; XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; + XtSetArg(args[num_args], nhStr(XtNlabel), left_name); num_args++; #if 0 XtSetArg(args[num_args], nhStr(XtNshapeStyle), XmuShapeRoundedRectangle); num_args++; #endif - left = XtCreateManagedWidget(left_name, commandWidgetClass, form, args, + Sprintf(btnname, "btn_%s", left_name); + left = XtCreateManagedWidget(btnname, commandWidgetClass, form, args, num_args); XtAddCallback(left, XtNcallback, left_callback, (XtPointer) 0); skip = (distance < 4) ? 8 : 2 * distance; @@ -2094,11 +2096,13 @@ Widget *formp; /* return */ XtSetArg(args[num_args], nhStr(XtNfromHoriz), left); num_args++; XtSetArg(args[num_args], nhStr(XtNhorizDistance), skip); num_args++; XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; + XtSetArg(args[num_args], nhStr(XtNlabel), right_name); num_args++; #if 0 XtSetArg(args[num_args], nhStr(XtNshapeStyle), XmuShapeRoundedRectangle); num_args++; #endif - right = XtCreateManagedWidget(right_name, commandWidgetClass, form, args, + Sprintf(btnname, "btn_%s", right_name); + right = XtCreateManagedWidget(btnname, commandWidgetClass, form, args, num_args); XtAddCallback(right, XtNcallback, right_callback, (XtPointer) 0); diff --git a/win/X11/winstat.c b/win/X11/winstat.c index 8eb9469bb..18a40901b 100644 --- a/win/X11/winstat.c +++ b/win/X11/winstat.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 winstat.c $NHDT-Date: 1452920162 2016/01/16 04:56:02 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.16 $ */ +/* NetHack 3.6 winstat.c $NHDT-Date: 1540247293 2018/10/22 22:28:13 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.18 $ */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ @@ -15,6 +15,7 @@ #endif #include +#include #include #include #include @@ -22,6 +23,7 @@ #include #include #include +#include #include #ifdef PRESERVE_NO_SYSV @@ -31,18 +33,754 @@ #undef PRESERVE_NO_SYSV #endif +#include "xwindow.h" + #include "hack.h" #include "winX.h" +/* + * Fancy status form entry storage indices. + */ +#define F_DUMMY 0 +#define F_STR 1 +#define F_DEX 2 +#define F_CON 3 +#define F_INT 4 +#define F_WIS 5 +#define F_CHA 6 + +#define F_NAME 7 +#define F_DLEVEL 8 +#define F_GOLD 9 +#define F_HP 10 +#define F_MAXHP 11 +#define F_POWER 12 +#define F_MAXPOWER 13 +#define F_AC 14 +#define F_LEVEL 15 +#define F_EXP 16 +#define F_ALIGN 17 +#define F_TIME 18 +#define F_SCORE 19 + +/* status conditions grouped by columns; tty orders these differently */ +#define F_STONE 20 +#define F_SLIME 21 +#define F_STRNGL 22 +#define F_FOODPOIS 23 +#define F_TERMILL 24 + +#define F_HUNGER 25 +#define F_ENCUMBER 26 +#define F_LEV 27 +#define F_FLY 28 +#define F_RIDE 29 + +#define F_BLIND 30 +#define F_DEAF 31 +#define F_STUN 32 +#define F_CONF 33 +#define F_HALLU 34 + +#define NUM_STATS 35 + +static void FDECL(update_fancy_status, (struct xwindow *)); +static void FDECL(update_fancy_status_field, (int)); +static Widget FDECL(create_fancy_status, (Widget, Widget)); +static void FDECL(destroy_fancy_status, (struct xwindow *)); +static void FDECL(create_status_window_fancy, (struct xwindow *, BOOLEAN_P, Widget)); +static void FDECL(create_status_window_tty, (struct xwindow *, BOOLEAN_P, Widget)); +static void FDECL(destroy_status_window_fancy, (struct xwindow *)); +static void FDECL(destroy_status_window_tty, (struct xwindow *)); +static void FDECL(adjust_status_fancy, (struct xwindow *, const char *)); +static void FDECL(adjust_status_tty, (struct xwindow *, const char *)); + +extern const char *status_fieldfmt[MAXBLSTATS]; +extern char *status_vals[MAXBLSTATS]; +extern boolean status_activefields[MAXBLSTATS]; +static long X11_condition_bits; +static int X11_status_colors[MAXBLSTATS]; +static int hpbar_percent, hpbar_color; + +#define X11_NUM_STATUS_LINES 2 +#define X11_NUM_STATUS_FIELD 15 + +static enum statusfields X11_fieldorder[X11_NUM_STATUS_LINES][X11_NUM_STATUS_FIELD] = { + { BL_TITLE, BL_STR, BL_DX, BL_CO, BL_IN, BL_WI, BL_CH, BL_ALIGN, + BL_SCORE, BL_FLUSH, BL_FLUSH, BL_FLUSH, BL_FLUSH, BL_FLUSH, + BL_FLUSH }, + { BL_LEVELDESC, BL_GOLD, BL_HP, BL_HPMAX, BL_ENE, BL_ENEMAX, + BL_AC, BL_XP, BL_EXP, BL_HD, BL_TIME, BL_HUNGER, + BL_CAP, BL_CONDITION, BL_FLUSH } +}; + +static Widget X11_status_widget; +static Widget X11_status_labels[MAXBLSTATS]; +static Widget X11_cond_labels[32]; /* Ugh */ + +struct xwindow *xw_status_win; +static Pixel X11_status_widget_fg, X11_status_widget_bg; + + +int +condcolor(bm, bmarray) +long bm; +unsigned long *bmarray; +{ + int i; + + if (bm && bmarray) + for (i = 0; i < CLR_MAX; ++i) { + if (bmarray[i] && (bm & bmarray[i])) + return i; + } + return NO_COLOR; +} + +int +condattr(bm, bmarray) +long bm; +unsigned long *bmarray; +{ + int attr = 0; + int i; + + if (bm && bmarray) { + for (i = HL_ATTCLR_DIM; i < BL_ATTCLR_MAX; ++i) { + if (bmarray[i] && (bm & bmarray[i])) { + switch(i) { + case HL_ATTCLR_DIM: + attr |= HL_DIM; + break; + case HL_ATTCLR_BLINK: + attr |= HL_BLINK; + break; + case HL_ATTCLR_ULINE: + attr |= HL_ULINE; + break; + case HL_ATTCLR_INVERSE: + attr |= HL_INVERSE; + break; + case HL_ATTCLR_BOLD: + attr |= HL_BOLD; + break; + } + } + } + } + return attr; +} + +void +X11_status_init() +{ +#ifdef STATUS_HILITES + int i; + + for (i = 0; i < MAXBLSTATS; ++i) + X11_status_colors[i] = NO_COLOR; /* no color */ + X11_condition_bits = 0L; + hpbar_percent = 0, hpbar_color = NO_COLOR; +#endif /* STATUS_HILITES */ + /* let genl_status_init do most of the initialization */ + genl_status_init(); +} + +void +X11_status_finish() +{ + /* nothing */ +} + +void +X11_status_enablefield(fieldidx, nm, fmt, enable) +int fieldidx; +const char *nm; +const char *fmt; +boolean enable; +{ + genl_status_enablefield(fieldidx, nm, fmt, enable); +} + + +int +cond_bm2idx(bm) +unsigned long bm; +{ + int i; + for (i = 0; i < 32; i++) + if ((1 << i) == bm) + return i; + return -1; +} + +void +MaybeDisplayCond(bm, colormasks, text) +unsigned long bm; +unsigned long *colormasks; +const char *text; +{ + int idx = cond_bm2idx(bm); + Widget label; + Arg args[10]; + Cardinal num_args; + Pixel fg = X11_status_widget_fg, bg = X11_status_widget_bg; + Dimension lbl_wid; + Dimension lbl_hei; + Dimension lbl_border_wid; + Dimension lbl_iwidth; + + if (idx < 0) + return; + + label = X11_cond_labels[idx]; + if ((X11_condition_bits & bm) != 0) { + int attrmask, coloridx; + XFontStruct *font; + Position lbl_x; + Position lbl_y; + +#ifdef TEXTCOLOR + coloridx = condcolor(bm, colormasks); +#else + coloridx = NO_COLOR; +#endif + attrmask = condattr(bm, colormasks); + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNfont), &font); num_args++; + XtSetArg(args[num_args], nhStr(XtNx), &lbl_x); num_args++; + XtSetArg(args[num_args], nhStr(XtNy), &lbl_y); num_args++; + XtSetArg(args[num_args], nhStr(XtNwidth), &lbl_wid); num_args++; + XtSetArg(args[num_args], nhStr(XtNheight), &lbl_hei); num_args++; + XtSetArg(args[num_args], nhStr(XtNinternalWidth), &lbl_iwidth); num_args++; + XtSetArg(args[num_args], nhStr(XtNborderWidth), &lbl_border_wid); num_args++; + XtGetValues(label, args, num_args); + + if (text && *text) + lbl_wid = lbl_iwidth + font->max_bounds.width * strlen(text); + else + lbl_wid = 1; + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNlabel), (text && *text) ? text : ""); num_args++; + XtSetArg(args[num_args], nhStr(XtNwidth), lbl_wid); num_args++; + + fg = (coloridx != NO_COLOR) ? get_nhcolor(xw_status_win, coloridx).pixel + : X11_status_widget_fg; + if (attrmask & HL_INVERSE) { + Pixel tmppx = fg; + fg = bg; + bg = tmppx; + } + + if (attrmask & HL_BOLD) { + load_boldfont(xw_status_win, label); + XtSetArg(args[num_args], nhStr(XtNfont), + xw_status_win->boldfs); num_args++; + } + + if (fg == bg) + fg = get_nhcolor(xw_status_win, CLR_GRAY).pixel; + + XtSetArg(args[num_args], nhStr(XtNforeground), fg); num_args++; + XtSetArg(args[num_args], nhStr(XtNbackground), bg); num_args++; + XtSetValues(label, args, num_args); + XtResizeWidget(label, lbl_wid, lbl_hei, lbl_border_wid); + } else { + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNwidth), &lbl_wid); num_args++; + XtSetArg(args[num_args], nhStr(XtNheight), &lbl_hei); num_args++; + XtSetArg(args[num_args], nhStr(XtNinternalWidth), &lbl_iwidth); num_args++; + XtSetArg(args[num_args], nhStr(XtNborderWidth), &lbl_border_wid); num_args++; + XtGetValues(label, args, num_args); + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNlabel), ""); num_args++; + XtSetArg(args[num_args], nhStr(XtNwidth), 1); num_args++; + XtSetArg(args[num_args], nhStr(XtNforeground), fg); num_args++; + XtSetArg(args[num_args], nhStr(XtNbackground), bg); num_args++; + XtSetValues(label, args, num_args); + + XtResizeWidget(label, lbl_wid, lbl_hei, lbl_border_wid); + } +} + + +void +X11_status_update_tty(fld, ptr, chg, percent, color, colormasks) +int fld, chg UNUSED, percent, color; +genericptr_t ptr; +unsigned long *colormasks; +{ + static boolean oncearound = FALSE; /* prevent premature partial display */ + long *condptr = (long *) ptr; + int coloridx = NO_COLOR; + const char *text = (char *) ptr; + char tmpbuf[BUFSZ]; + int attridx = 0; + + XFontStruct *font; + Arg args[10]; + Cardinal num_args; + Position lbl_x; + Position lbl_y; + Dimension lbl_wid; + Dimension lbl_hei; + Dimension lbl_border_wid; + Dimension lbl_iwidth; + Widget label; + Pixel fg = X11_status_widget_fg, bg = X11_status_widget_bg; + +#ifndef TEXTCOLOR + color = NO_COLOR; +#endif + + if (fld < BL_RESET || fld >= MAXBLSTATS) + return; + + if ((fld >= 0 && fld < MAXBLSTATS) && !status_activefields[fld]) + return; + + if (fld != BL_FLUSH && fld != BL_RESET) { + if (!status_activefields[fld]) + return; + switch (fld) { + case BL_CONDITION: + X11_condition_bits = *condptr; + oncearound = TRUE; + break; + default: + Sprintf(status_vals[fld], + (fld == BL_TITLE && iflags.wc2_hitpointbar) ? "%-30s" : + status_fieldfmt[fld] ? status_fieldfmt[fld] : "%s", + text); + X11_status_colors[fld] = color; + if (iflags.wc2_hitpointbar && fld == BL_HP) { + hpbar_percent = percent; + hpbar_color = color; + } + break; + } + if (fld == BL_CONDITION) { + MaybeDisplayCond(BL_MASK_STONE, colormasks, "Stone"); + MaybeDisplayCond(BL_MASK_SLIME, colormasks, "Slime"); + MaybeDisplayCond(BL_MASK_STRNGL, colormasks, "Strngl"); + MaybeDisplayCond(BL_MASK_FOODPOIS, colormasks, "FoodPois"); + MaybeDisplayCond(BL_MASK_TERMILL, colormasks, "TermIll"); + MaybeDisplayCond(BL_MASK_BLIND, colormasks, "Blind"); + MaybeDisplayCond(BL_MASK_DEAF, colormasks, "Deaf"); + MaybeDisplayCond(BL_MASK_STUN, colormasks, "Stun"); + MaybeDisplayCond(BL_MASK_CONF, colormasks, "Conf"); + MaybeDisplayCond(BL_MASK_HALLU, colormasks, "Hallu"); + MaybeDisplayCond(BL_MASK_LEV, colormasks, "Lev"); + MaybeDisplayCond(BL_MASK_FLY, colormasks, "Fly"); + MaybeDisplayCond(BL_MASK_RIDE, colormasks, "Ride"); + } else { + label = X11_status_labels[fld]; + text = status_vals[fld]; + if (fld == BL_GOLD) + text = decode_mixed(tmpbuf, text); +#ifdef TEXTCOLOR + coloridx = X11_status_colors[fld] & 0x00FF; +#endif + attridx = (X11_status_colors[fld] & 0xFF00) >> 8; + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNfont), &font); num_args++; + XtSetArg(args[num_args], nhStr(XtNx), &lbl_x); num_args++; + XtSetArg(args[num_args], nhStr(XtNy), &lbl_y); num_args++; + XtSetArg(args[num_args], nhStr(XtNwidth), &lbl_wid); num_args++; + XtSetArg(args[num_args], nhStr(XtNheight), &lbl_hei); num_args++; + XtSetArg(args[num_args], nhStr(XtNinternalWidth), &lbl_iwidth); num_args++; + XtSetArg(args[num_args], nhStr(XtNborderWidth), &lbl_border_wid); num_args++; + XtGetValues(label, args, num_args); + + /*raw_printf("font: %i-%i", + font->min_bounds.width, font->max_bounds.width);*/ + + if (text && *text) + lbl_wid = lbl_iwidth + font->max_bounds.width * strlen(text); + else + lbl_wid = 1; + + /*raw_printf("1:lbl_wid=%i('%s')", lbl_wid, text);*/ + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNlabel), + (text && *text) ? text : ""); num_args++; + XtSetArg(args[num_args], nhStr(XtNwidth), lbl_wid); num_args++; + + fg = (coloridx != NO_COLOR) ? get_nhcolor(xw_status_win, coloridx).pixel + : X11_status_widget_fg; + if (attridx & HL_INVERSE) { + Pixel tmppx = fg; + + fg = bg; + bg = tmppx; + } + + if (attridx & HL_BOLD) { + load_boldfont(xw_status_win, label); + XtSetArg(args[num_args], nhStr(XtNfont), + xw_status_win->boldfs); num_args++; + } + + if (fg == bg) + fg = get_nhcolor(xw_status_win, CLR_GRAY).pixel; + + XtSetArg(args[num_args], nhStr(XtNforeground), fg); num_args++; + XtSetArg(args[num_args], nhStr(XtNbackground), bg); num_args++; + XtSetValues(label, args, num_args); + XtResizeWidget(label, lbl_wid, lbl_hei, lbl_border_wid); + } + } else { + int x, y; + + for (y = 0; y < X11_NUM_STATUS_LINES; y++) { + Cardinal dx = 0; + + for (x = 0; x < X11_NUM_STATUS_FIELD; x++) { + int f = X11_fieldorder[y][x]; + + if (f <= BL_FLUSH) + continue; + if (!status_activefields[f]) + continue; + + if (f == BL_CONDITION) { + int i; + + for (i = 0; i < 32; i++) { + label = X11_cond_labels[i]; + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNx), &lbl_x); num_args++; + XtSetArg(args[num_args], nhStr(XtNy), &lbl_y); num_args++; + XtSetArg(args[num_args], nhStr(XtNwidth), &lbl_wid); num_args++; + XtSetArg(args[num_args], nhStr(XtNheight), &lbl_hei); num_args++; + XtSetArg(args[num_args], nhStr(XtNborderWidth), + &lbl_border_wid); num_args++; + XtGetValues(label, args, num_args); + + lbl_x = dx; + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNx), lbl_x); num_args++; + XtSetValues(label, args, num_args); + XtConfigureWidget(label, lbl_x, lbl_y, + lbl_wid, lbl_hei, lbl_border_wid); + + if (lbl_wid > 1) + dx += lbl_wid; + } + continue; + } + label = X11_status_labels[f]; + + text = status_vals[f]; + if (f == BL_GOLD) + text = decode_mixed(tmpbuf, text); + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNx), &lbl_x); num_args++; + XtSetArg(args[num_args], nhStr(XtNy), &lbl_y); num_args++; + XtSetArg(args[num_args], nhStr(XtNwidth), &lbl_wid); num_args++; + XtSetArg(args[num_args], nhStr(XtNheight), &lbl_hei); num_args++; + XtSetArg(args[num_args], nhStr(XtNborderWidth), + &lbl_border_wid); num_args++; + XtGetValues(label, args, num_args); + + lbl_x = dx; + /*raw_printf("2:lbl_wid=%i('%s')", lbl_wid, text);*/ + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNx), lbl_x); num_args++; + XtSetArg(args[num_args], nhStr(XtNlabel), text); num_args++; + XtSetValues(label, args, num_args); + XtConfigureWidget(label, lbl_x, lbl_y, + lbl_wid, lbl_hei, lbl_border_wid); + + dx += lbl_wid; + } + } + } +} + +/*ARGSUSED*/ +void +X11_status_update_fancy(fld, ptr, chg, percent, color, colormasks) +int fld, chg UNUSED, percent UNUSED, color UNUSED; +genericptr_t ptr; +unsigned long *colormasks UNUSED; +{ + static const struct { + int bl, ff; + } bl_to_fancyfield[] = { + { BL_TITLE, F_NAME }, + { BL_STR, F_STR }, + { BL_DX, F_DEX }, + { BL_CO, F_CON }, + { BL_IN, F_INT }, + { BL_WI, F_WIS }, + { BL_CH, F_CHA }, + { BL_ALIGN, F_ALIGN }, + { BL_SCORE, F_SCORE }, + { BL_CAP, F_ENCUMBER }, + { BL_GOLD, F_GOLD }, + { BL_ENE, F_POWER }, + { BL_ENEMAX, F_MAXPOWER }, + { BL_XP, F_LEVEL }, + { BL_AC, F_AC }, + /*{ BL_HD, F_ },*/ + { BL_TIME, F_TIME }, + { BL_HUNGER, F_HUNGER }, + { BL_HP, F_HP }, + { BL_HPMAX, F_MAXHP }, + { BL_LEVELDESC, F_DLEVEL }, + { BL_EXP, F_EXP } + }; + static const struct { + unsigned long mask; + int ff; + } mask_to_fancyfield[] = { + { BL_MASK_STONE, F_STONE }, + { BL_MASK_SLIME, F_SLIME }, + { BL_MASK_STRNGL, F_STRNGL }, + { BL_MASK_FOODPOIS, F_FOODPOIS }, + { BL_MASK_TERMILL, F_TERMILL }, + { BL_MASK_BLIND, F_BLIND }, + { BL_MASK_DEAF, F_DEAF }, + { BL_MASK_STUN, F_STUN }, + { BL_MASK_CONF, F_CONF }, + { BL_MASK_HALLU, F_HALLU }, + { BL_MASK_LEV, F_LEV }, + { BL_MASK_FLY, F_FLY }, + { BL_MASK_RIDE, F_RIDE } + }; + int i; + + if (fld == BL_RESET || fld == BL_FLUSH) { + if (WIN_STATUS != WIN_ERR) { + struct xwindow *wp = &window_list[WIN_STATUS]; + + update_fancy_status(wp); + } + return; + } + + if (fld == BL_CONDITION) { + unsigned long mask = (unsigned long) ptr; + + for (i = 0; i < SIZE(mask_to_fancyfield); i++) + if (mask_to_fancyfield[i].mask == mask) + update_fancy_status_field(mask_to_fancyfield[i].ff); + } else { + for (i = 0; i < SIZE(bl_to_fancyfield); i++) + if (bl_to_fancyfield[i].bl == fld) + update_fancy_status_field(bl_to_fancyfield[i].ff); + } +} + +void +X11_status_update(fld, ptr, chg, percent, color, colormasks) +int fld, chg UNUSED, percent UNUSED, color; +genericptr_t ptr; +unsigned long *colormasks; +{ + if (appResources.fancy_status) + X11_status_update_fancy(fld, ptr, chg, percent, color, colormasks); + else + X11_status_update_tty(fld, ptr, chg, percent, color, colormasks); +} + +Widget +create_tty_status(parent, top) +Widget parent, top; +{ + Widget form; /* The form that surrounds everything. */ + Widget w; + Arg args[16]; + Cardinal num_args; + int i, x, y; + + num_args = 0; + if (top != (Widget) 0) { + XtSetArg(args[num_args], nhStr(XtNfromVert), top); + num_args++; + } + XtSetArg(args[num_args], nhStr(XtNdefaultDistance), 0); + num_args++; + XtSetArg(args[num_args], XtNborderWidth, 0); + num_args++; + XtSetArg(args[num_args], XtNwidth, 400); num_args++; + XtSetArg(args[num_args], XtNheight, 100); num_args++; + form = XtCreateManagedWidget("status_viewport", viewportWidgetClass, + parent, args, num_args); + + num_args = 0; + XtSetArg(args[num_args], XtNwidth, 400); num_args++; + XtSetArg(args[num_args], XtNheight, 100); num_args++; + w = XtCreateManagedWidget("status_form", formWidgetClass, + form, args, num_args); + for (y = 0; y < X11_NUM_STATUS_LINES; y++) { + for (x = 0; x < X11_NUM_STATUS_FIELD; x++) { + int fld = X11_fieldorder[y][x]; + char labelname[BUFSZ]; + int prevfld; + + if (fld <= BL_FLUSH) + continue; + Sprintf(labelname, "label_%s", bl_idx_to_fldname(fld)); + num_args = 0; + if (y > 0) { + prevfld = X11_fieldorder[y-1][0]; + XtSetArg(args[num_args], nhStr(XtNfromVert), + X11_status_labels[prevfld]); num_args++; + } + if (x > 0) { + prevfld = X11_fieldorder[y][x-1]; + XtSetArg(args[num_args], nhStr(XtNfromHoriz), + X11_status_labels[prevfld]); num_args++; + } + + XtSetArg(args[num_args], nhStr(XtNhorizDistance), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNvertDistance), 0); num_args++; + + XtSetArg(args[num_args], nhStr(XtNtopMargin), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNbottomMargin), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNleftMargin), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNrightMargin), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNjustify), XtJustifyLeft); num_args++; + XtSetArg(args[num_args], nhStr(XtNborderWidth), 0); num_args++; + /* + XtSetArg(args[num_args], nhStr(XtNlabel), + bl_idx_to_fldname(fld)); num_args++; + */ + XtSetArg(args[num_args], nhStr(XtNlabel), ""); num_args++; + X11_status_labels[fld] = XtCreateManagedWidget(labelname, + labelWidgetClass, w, + args, num_args); + } + } + + for (i = 0; i < 32; i++) { + char condname[BUFSZ]; + int prevfld; + + Sprintf(condname, "cond_%i", i); + num_args = 0; + + prevfld = X11_fieldorder[0][0]; + XtSetArg(args[num_args], nhStr(XtNfromVert), + X11_status_labels[prevfld]); num_args++; + + XtSetArg(args[num_args], nhStr(XtNfromHoriz), + (i == 0) ? X11_status_labels[BL_CONDITION] + : X11_cond_labels[i-1]); num_args++; + + XtSetArg(args[num_args], nhStr(XtNhorizDistance), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNvertDistance), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNtopMargin), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNbottomMargin), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNleftMargin), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNrightMargin), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNjustify), XtJustifyLeft); num_args++; + XtSetArg(args[num_args], nhStr(XtNborderWidth), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNlabel), ""); num_args++; + X11_cond_labels[i] = XtCreateManagedWidget(condname, + labelWidgetClass, w, + args, num_args); + } + + return w; +} + +/*ARGSUSED*/ +void +create_status_window_tty(wp, create_popup, parent) +struct xwindow *wp; /* window pointer */ +boolean create_popup UNUSED; +Widget parent; +{ + Arg args[10]; + Cardinal num_args; + + wp->type = NHW_STATUS; + X11_status_widget = wp->w = create_tty_status(parent, (Widget) 0); + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNforeground), &X11_status_widget_fg); num_args++; + XtSetArg(args[num_args], nhStr(XtNbackground), &X11_status_widget_bg); num_args++; + XtGetValues(X11_status_widget, args, num_args); +} + +void +destroy_status_window_tty(wp) +struct xwindow *wp; +{ + /* If status_information is defined, then it a "text" status window. */ + if (wp->status_information) { + if (wp->popup) { + nh_XtPopdown(wp->popup); + if (!wp->keep_window) + XtDestroyWidget(wp->popup), wp->popup = (Widget) 0; + } + free((genericptr_t) wp->status_information); + wp->status_information = 0; + } else { + } + if (!wp->keep_window) + wp->type = NHW_NONE; +} + +/*ARGSUSED*/ +void +adjust_status_tty(wp, str) +struct xwindow *wp UNUSED; +const char *str UNUSED; +{ + /* nothing */ +} + +void +create_status_window(wp, create_popup, parent) +struct xwindow *wp; /* window pointer */ +boolean create_popup; +Widget parent; +{ + xw_status_win = wp; + if (appResources.fancy_status) + create_status_window_fancy(wp, create_popup, parent); + else + create_status_window_tty(wp, create_popup, parent); +} + +void +destroy_status_window(wp) +struct xwindow *wp; +{ + if (appResources.fancy_status) + destroy_status_window_fancy(wp); + else + destroy_status_window_tty(wp); +} + +void +adjust_status(wp, str) +struct xwindow *wp; +const char *str; +{ + if (appResources.fancy_status) + adjust_status_fancy(wp, str); + else + adjust_status_tty(wp, str); +} + extern const char *hu_stat[]; /* from eat.c */ extern const char *enc_stat[]; /* from botl.c */ -static void FDECL(update_fancy_status, (struct xwindow *)); -static Widget FDECL(create_fancy_status, (Widget, Widget)); -static void FDECL(destroy_fancy_status, (struct xwindow *)); - void -create_status_window(wp, create_popup, parent) +create_status_window_fancy(wp, create_popup, parent) struct xwindow *wp; /* window pointer */ boolean create_popup; Widget parent; @@ -60,7 +798,7 @@ Widget parent; * window. */ if (!parent) - panic("create_status_window: no parent for fancy status"); + panic("create_status_window_fancy: no parent for fancy status"); wp->status_information = 0; wp->w = create_fancy_status(parent, (Widget) 0); return; @@ -133,7 +871,7 @@ Widget parent; } void -destroy_status_window(wp) +destroy_status_window_fancy(wp) struct xwindow *wp; { /* If status_information is defined, then it a "text" status window. */ @@ -159,7 +897,7 @@ struct xwindow *wp; * + We didn't set stringInPlace on the widget. */ void -adjust_status(wp, str) +adjust_status_fancy(wp, str) struct xwindow *wp; const char *str; { @@ -216,52 +954,6 @@ static Widget FDECL(init_column, (const char *, Widget, Widget, Widget, static void NDECL(fixup_cond_widths); static Widget FDECL(init_info_form, (Widget, Widget, Widget)); -/* - * Form entry storage indices. - */ -#define F_DUMMY 0 -#define F_STR 1 -#define F_DEX 2 -#define F_CON 3 -#define F_INT 4 -#define F_WIS 5 -#define F_CHA 6 - -#define F_NAME 7 -#define F_DLEVEL 8 -#define F_GOLD 9 -#define F_HP 10 -#define F_MAXHP 11 -#define F_POWER 12 -#define F_MAXPOWER 13 -#define F_AC 14 -#define F_LEVEL 15 -#define F_EXP 16 -#define F_ALIGN 17 -#define F_TIME 18 -#define F_SCORE 19 - -/* status conditions grouped by columns; tty orders these differently */ -#define F_STONE 20 -#define F_SLIME 21 -#define F_STRNGL 22 -#define F_FOODPOIS 23 -#define F_TERMILL 24 - -#define F_HUNGER 25 -#define F_ENCUMBER 26 -#define F_LEV 27 -#define F_FLY 28 -#define F_RIDE 29 - -#define F_BLIND 30 -#define F_DEAF 31 -#define F_STUN 32 -#define F_CONF 33 -#define F_HALLU 34 - -#define NUM_STATS 35 - /* * Notes: * + Alignment needs a different init value, because -1 is an alignment. @@ -583,18 +1275,13 @@ long new_value; * [**] HD is shown instead of level and exp if Upolyd. */ static void -update_fancy_status(wp) -struct xwindow *wp; +update_fancy_status_field(i) +int i; { - struct X_status_value *sv; + struct X_status_value *sv = &shown_stats[i]; long val; - int i; - if (wp->cursy != 0) - return; /* do a complete update when line 0 is done */ - - for (i = 0, sv = shown_stats; i < NUM_STATS; i++, sv++) { - switch (i) { + switch (i) { case F_DUMMY: val = 0L; break; @@ -734,11 +1421,25 @@ struct xwindow *wp; val = 0L; break; } /* default */ - } /* switch */ - update_val(sv, val); - } + } /* switch */ + update_val(sv, val); } +/*ARGUSED*/ +static void +update_fancy_status(wp) +struct xwindow *wp UNUSED; +{ + int i; + + /*if (wp->cursy != 0) + return;*/ /* do a complete update when line 0 is done */ + + for (i = 0; i < NUM_STATS; i++) + update_fancy_status_field(i); +} + + /* * Turn off hilighted status values after a certain amount of turns. */ diff --git a/win/chain/wc_chainin.c b/win/chain/wc_chainin.c index bd0a11827..00cd7e75f 100644 --- a/win/chain/wc_chainin.c +++ b/win/chain/wc_chainin.c @@ -27,23 +27,26 @@ void *me; void *nextprocs; void *nextdata; { + struct chainin_data *tdp = 0; + switch (cmd) { - case WINCHAIN_ALLOC: { - struct chainin_data *tdp = calloc(1, sizeof(struct chainin_data)); + case WINCHAIN_ALLOC: + tdp = (struct chainin_data *) alloc(sizeof *tdp); + tdp->nprocs = 0; + tdp->ndata = 0; tdp->linknum = n; - cibase = tdp; - return tdp; - } - case WINCHAIN_INIT: { - struct chainin_data *tdp = me; + cibase = 0; + break; + case WINCHAIN_INIT: + tdp = me; tdp->nprocs = nextprocs; tdp->ndata = nextdata; - return tdp; - } + break; default: - raw_printf("chainin_procs_chain: bad cmd\n"); - exit(EXIT_FAILURE); + panic("chainin_procs_chain: bad cmd\n"); + /*NOTREACHED*/ } + return tdp; } /* XXX if we don't need this, take it out of the table */ diff --git a/win/chain/wc_chainout.c b/win/chain/wc_chainout.c index af964438c..18af49e17 100644 --- a/win/chain/wc_chainout.c +++ b/win/chain/wc_chainout.c @@ -10,7 +10,7 @@ struct chainout_data { struct window_procs *nprocs; #if 0 - void *ndata; + void *ndata; #endif int linknum; @@ -24,21 +24,23 @@ void *me; void *nextprocs; void *nextdata UNUSED; { + struct chainout_data *tdp = 0; + switch (cmd) { - case WINCHAIN_ALLOC: { - struct chainout_data *tdp = calloc(1, sizeof(struct chainout_data)); + case WINCHAIN_ALLOC: + tdp = (struct chainout_data *) alloc(sizeof *tdp); + tdp->nprocs = 0; tdp->linknum = n; - return tdp; - } - case WINCHAIN_INIT: { - struct chainout_data *tdp = me; + break; + case WINCHAIN_INIT: + tdp = me; tdp->nprocs = nextprocs; - return tdp; - } + break; default: - raw_printf("chainout_procs_chain: bad cmd\n"); - exit(EXIT_FAILURE); + panic("chainout_procs_chain: bad cmd\n"); + /*NOTREACHED*/ } + return tdp; } /* XXX if we don't need this, take it out of the table */ diff --git a/win/chain/wc_trace.c b/win/chain/wc_trace.c index ec81f0a8b..6da9a9b83 100644 --- a/win/chain/wc_trace.c +++ b/win/chain/wc_trace.c @@ -48,22 +48,25 @@ void *me; void *nextprocs; void *nextdata; { + struct trace_data *tdp = 0; + switch (cmd) { - case WINCHAIN_ALLOC: { - struct trace_data *tdp = calloc(1, sizeof(struct trace_data)); + case WINCHAIN_ALLOC: + tdp = (struct trace_data *) alloc(sizeof *tdp); + tdp->nprocs = 0; + tdp->ndata = 0; tdp->linknum = n; - return tdp; - } - case WINCHAIN_INIT: { - struct trace_data *tdp = me; + break; + case WINCHAIN_INIT: + tdp = me; tdp->nprocs = nextprocs; tdp->ndata = nextdata; - return tdp; - } + break; default: - raw_printf("trace_procs_chain: bad cmd\n"); - exit(EXIT_FAILURE); + panic("trace_procs_chain: bad cmd\n"); + /*NOTREACHED*/ } + return tdp; } void @@ -71,20 +74,22 @@ trace_procs_init(dir) int dir; { char fname[200]; + long pid; /* processors shouldn't need this test, but just in case */ if (dir != WININIT) return; - sprintf(fname, "%s/tlog.%d", HACKDIR, getpid()); + pid = (long) getpid(); + Sprintf(fname, "%s/tlog.%ld", HACKDIR, pid); wc_tracelogf = fopen(fname, "w"); - if (wc_tracelogf == NULL) { + if (!wc_tracelogf) { fprintf(stderr, "Can't open trace log file %s: %s\n", fname, strerror(errno)); - exit(EXIT_FAILURE); + nh_terminate(EXIT_FAILURE); } - setvbuf(wc_tracelogf, (char *) NULL, _IONBF, 0); - fprintf(wc_tracelogf, "Trace log started for pid %d\n", getpid()); + setvbuf(wc_tracelogf, (char *) 0, _IONBF, 0); + fprintf(wc_tracelogf, "Trace log started for pid %ld\n", pid); indent_level = 0; } @@ -769,7 +774,7 @@ char *bufp; } if (bufp) { - fprintf(wc_tracelogf, "%p)\n", bufp); + fprintf(wc_tracelogf, "%s)\n", fmt_ptr((genericptr_t) bufp)); } else { fprintf(wc_tracelogf, "NULL)\n"); } @@ -785,7 +790,7 @@ void *vp; { struct trace_data *tdp = vp; int rv; - int ecl_size; + int ecl_size = 0; /* this is ugly, but the size isn't exposed */ const struct ext_func_tab *efp; @@ -1095,7 +1100,8 @@ unsigned long *colormasks; ptr, chg, percent); PRE; - (*tdp->nprocs->win_status_update)(tdp->ndata, idx, ptr, chg, percent, color, colormasks); + (*tdp->nprocs->win_status_update)(tdp->ndata, idx, ptr, chg, percent, + color, colormasks); POST; } diff --git a/win/win32/vs2015/NetHack.vcxproj b/win/win32/vs2015/NetHack.vcxproj index 3c0ce9911..8d9335f95 100755 --- a/win/win32/vs2015/NetHack.vcxproj +++ b/win/win32/vs2015/NetHack.vcxproj @@ -1,233 +1,232 @@  - + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751} Win32Proj NetHack - - + + - - - - - - $(BinDir) - - + + + + + + $(BinDir) + + - /Gs /Oi- %(AdditionalOptions) + /Gs /Oi- %(AdditionalOptions) Disabled Default Speed true - $(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);%(AdditionalIncludeDirectories) - TILES;WIN32CON;DLB;MSWIN_GRAPHICS;_LIB;%(PreprocessorDefinitions) + $(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);%(AdditionalIncludeDirectories) + TILES;WIN32CON;DLB;MSWIN_GRAPHICS;_LIB;%(PreprocessorDefinitions) kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;winmm.lib;Winmm.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GUISTUB;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GUISTUB;%(PreprocessorDefinitions) - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + diff --git a/win/win32/vs2015/NetHackW.vcxproj b/win/win32/vs2015/NetHackW.vcxproj index 52403bbf6..bd33da76f 100755 --- a/win/win32/vs2015/NetHackW.vcxproj +++ b/win/win32/vs2015/NetHackW.vcxproj @@ -1,192 +1,191 @@  - - + + {CEC5D360-8804-454F-8591-002184C23499} NetHackW - + - + - - - - - - $(BinDir) - - - + + + + + + $(BinDir) + + + - /Gs /Oi- %(AdditionalOptions) + /Gs /Oi- %(AdditionalOptions) Disabled true - $(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);%(AdditionalIncludeDirectories) - TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;WIN32CONNDEBUG;%(PreprocessorDefinitions) + $(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);%(AdditionalIncludeDirectories) + TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;WIN32CONNDEBUG;%(PreprocessorDefinitions) NDEBUG;%(PreprocessorDefinitions) 0x0409 - + Windows comctl32.lib;winmm.lib;%(AdditionalDependencies) - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TTYSTUB; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TTYSTUB; - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + diff --git a/win/win32/vs2015/aftermakedefs.proj b/win/win32/vs2015/aftermakedefs.proj index 20adf1b15..a48e685a7 100644 --- a/win/win32/vs2015/aftermakedefs.proj +++ b/win/win32/vs2015/aftermakedefs.proj @@ -7,7 +7,6 @@ - diff --git a/win/win32/vs2015/files.props b/win/win32/vs2015/files.props index e40a34cb9..483ec1eb1 100644 --- a/win/win32/vs2015/files.props +++ b/win/win32/vs2015/files.props @@ -8,8 +8,6 @@ - - diff --git a/win/win32/vs2017/NetHack.vcxproj b/win/win32/vs2017/NetHack.vcxproj index dfa15c391..66ad09e34 100644 --- a/win/win32/vs2017/NetHack.vcxproj +++ b/win/win32/vs2017/NetHack.vcxproj @@ -1,233 +1,232 @@ - - - - - {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751} - Win32Proj - NetHack - - - - - - - - - - $(BinDir) - - - - /Gs /Oi- %(AdditionalOptions) - Disabled - Default - Speed - true - $(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);%(AdditionalIncludeDirectories) - TILES;WIN32CON;DLB;MSWIN_GRAPHICS;_LIB;%(PreprocessorDefinitions) - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;winmm.lib;Winmm.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GUISTUB;%(PreprocessorDefinitions) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751} + Win32Proj + NetHack + + + + + + + + + + $(BinDir) + + + + /Gs /Oi- %(AdditionalOptions) + Disabled + Default + Speed + true + $(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);%(AdditionalIncludeDirectories) + TILES;WIN32CON;DLB;MSWIN_GRAPHICS;_LIB;%(PreprocessorDefinitions) + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;winmm.lib;Winmm.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GUISTUB;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win/win32/vs2017/NetHackW.vcxproj b/win/win32/vs2017/NetHackW.vcxproj index d1cd0bb91..450210b81 100644 --- a/win/win32/vs2017/NetHackW.vcxproj +++ b/win/win32/vs2017/NetHackW.vcxproj @@ -1,184 +1,183 @@ - - - - - {CEC5D360-8804-454F-8591-002184C23499} - NetHackW - - - - - - - - - $(BinDir) - - - - /Gs /Oi- %(AdditionalOptions) - Disabled - true - $(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);%(AdditionalIncludeDirectories) - TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;WIN32CONNDEBUG;%(PreprocessorDefinitions) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - Windows - comctl32.lib;winmm.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TTYSTUB; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + {CEC5D360-8804-454F-8591-002184C23499} + NetHackW + + + + + + + + + $(BinDir) + + + + /Gs /Oi- %(AdditionalOptions) + Disabled + true + $(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);%(AdditionalIncludeDirectories) + TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;WIN32CONNDEBUG;%(PreprocessorDefinitions) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + Windows + comctl32.lib;winmm.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TTYSTUB; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win/win32/vs2017/aftermakedefs.proj b/win/win32/vs2017/aftermakedefs.proj index 744806639..4ebea25a4 100644 --- a/win/win32/vs2017/aftermakedefs.proj +++ b/win/win32/vs2017/aftermakedefs.proj @@ -7,7 +7,6 @@ - diff --git a/win/win32/vs2017/files.props b/win/win32/vs2017/files.props index e40a34cb9..483ec1eb1 100644 --- a/win/win32/vs2017/files.props +++ b/win/win32/vs2017/files.props @@ -8,8 +8,6 @@ - -